From f8a8d5192b1e5013d9e2f699be54b072ef39d5f0 Mon Sep 17 00:00:00 2001 From: talasila Date: Wed, 8 Feb 2017 10:13:29 -0500 Subject: [PATCH] Initial OpenECOMP UI/DMaapBC commit Change-Id: Ia492e1b88311b9bed4c31f593b28deaaad73b7e4 Signed-off-by: talasila --- .gitreview | 4 + .idea/dmaapbc.iml | 9 + .idea/misc.xml | 19 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .idea/workspace.xml | 198 + LICENSE.txt | 19 + dcae_dmaapbc_client/.gitignore | 2 + dcae_dmaapbc_client/README.md | 17 + dcae_dmaapbc_client/pom.xml | 199 + .../dcae/dmaap/bcapi/client/DmaapBcRestClient.java | 1480 + .../dmaap/bcapi/client/HttpStatusAndResponse.java | 66 + .../dmaap/bcapi/client/IRestClientConstants.java | 35 + .../dmaap/bcapi/client/SimpleRestClientBase.java | 273 + dcae_dmaapbc_client/src/main/resources/logback.xml | 24 + .../dcae/dmaapbc/TestDmaapBcRestClient.java | 159 + dcae_dmaapbc_model/.gitignore | 2 + dcae_dmaapbc_model/README.md | 19 + dcae_dmaapbc_model/pom.xml | 121 + .../org/openecomp/dcae/dmaapbc/model/DR_Node.java | 87 + .../org/openecomp/dcae/dmaapbc/model/DR_Pub.java | 96 + .../org/openecomp/dcae/dmaapbc/model/DR_Sub.java | 152 + .../openecomp/dcae/dmaapbc/model/DcaeLocation.java | 97 + .../org/openecomp/dcae/dmaapbc/model/Dmaap.java | 141 + .../openecomp/dcae/dmaapbc/model/DmaapObject.java | 70 + .../dcae/dmaapbc/model/ErrorResponse.java | 65 + .../org/openecomp/dcae/dmaapbc/model/Feed.java | 193 + .../openecomp/dcae/dmaapbc/model/MR_Client.java | 110 + .../openecomp/dcae/dmaapbc/model/MR_Cluster.java | 102 + .../org/openecomp/dcae/dmaapbc/model/Topic.java | 122 + dcae_dmaapbc_webapp/.gitignore | 2 + dcae_dmaapbc_webapp/README.md | 26 + .../build-scripts/build-deploy-app.sh | 78 + .../EcompSdkDDLMySql_1610_Complete_OS.sql | 1622 + .../EcompSdkDMLMySql_1610_Complete_OS.sql | 3826 ++ dcae_dmaapbc_webapp/db-scripts/dbca-user-mysql.sql | 5 + dcae_dmaapbc_webapp/db-scripts/mysqldump-notes.txt | 7 + dcae_dmaapbc_webapp/dbc-app-deployment-guide.txt | 363 + dcae_dmaapbc_webapp/ecomp_dcae_logo_170x130.png | Bin 0 -> 21818 bytes dcae_dmaapbc_webapp/ecomp_dcae_logo_360x218.png | Bin 0 -> 46197 bytes dcae_dmaapbc_webapp/ecomp_dcae_logo_680x520.png | Bin 0 -> 151314 bytes dcae_dmaapbc_webapp/pom.xml | 369 + .../dbcapp/controller/DataBusHomeController.java | 57 + .../dbcapp/controller/DataRouterController.java | 315 + .../controller/DbcappRestrictedBaseController.java | 974 + .../dbcapp/controller/DmaapAccessController.java | 374 + .../dbcapp/controller/HealthCheckController.java | 157 + .../dbcapp/controller/ManifestController.java | 113 + .../dbcapp/controller/MessageRouterController.java | 226 + .../dmaapbc/dbcapp/domain/DmaapAccess.java | 167 + .../dmaapbc/dbcapp/rest/DbcUsvcRestClient.java | 184 + .../dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java | 61 + ...omponentsClientHttpRequestFactoryBasicAuth.java | 65 + .../dmaapbc/dbcapp/service/DmaapAccessService.java | 72 + .../dbcapp/service/DmaapAccessServiceImpl.java | 86 + .../dmaapbc/dbcapp/util/DbcappProperties.java | 88 + .../fusionapp/conf/ExternalAppConfig.java | 203 + .../fusionapp/conf/ExternalAppInitializer.java | 60 + .../fusionapp/conf/HibernateMappingLocations.java | 45 + .../controller/AngularSinglePageController.java | 48 + .../fusionapp/controller/CallflowController.java | 44 + .../controller/ElasticSearchController.java | 128 + .../fusionapp/controller/LeafletMapContoller.java | 43 + .../fusionapp/controller/NetMapController.java | 57 + .../fusionapp/controller/PostDroolsController.java | 138 + .../controller/UserProfileController.java | 73 + .../fusionapp/controller/WelcomeController.java | 44 + .../java/org/openecomp/fusionapp/model/Result.java | 37 + .../fusionapp/service/AdminAuthExtension.java | 34 + .../fusionapp/uebhandler/InitUebHandler.java | 73 + .../fusionapp/uebhandler/MainUebHandler.java | 104 + .../uebhandler/WidgetNotificationHandler.java | 46 + .../fusionapp/util/CustomLoggingFilter.java | 54 + .../org/openecomp/fusionapp/util/LoggerDemo.java | 48 + .../fusionapp/util/ValidateEncodingApp.java | 203 + .../src/main/resources/att-rules.drl | 16 + dcae_dmaapbc_webapp/src/main/resources/cache.ccf | 30 + dcae_dmaapbc_webapp/src/main/resources/logback.xml | 350 + .../src/main/resources/mchange-log.properties | 4 + .../src/main/resources/portal.properties | 50 + .../src/main/resources/state-rules.drl | 38 + .../src/main/webapp/WEB-INF/conf/quartz.properties | 30 + .../src/main/webapp/WEB-INF/conf/raptor.properties | 168 + .../WEB-INF/conf/raptor_app_fusion.properties | 20 + .../WEB-INF/conf/raptor_db_fusion.properties | 0 .../main/webapp/WEB-INF/conf/raptor_pdf.properties | 30 + .../src/main/webapp/WEB-INF/conf/sql.properties | 303 + .../src/main/webapp/WEB-INF/conf/system.properties | 61 + .../webapp/WEB-INF/dbcapp/dbcapp-definitions.xml | 30 + .../src/main/webapp/WEB-INF/dbcapp/dbcapp.hbm.xml | 47 + .../main/webapp/WEB-INF/dbcapp/dbcapp.properties | 36 + .../src/main/webapp/WEB-INF/defs/definitions.xml | 42 + .../webapp/WEB-INF/fusion/conf/fusion.properties | 61 + .../webapp/WEB-INF/fusion/defs/definitions.xml | 260 + .../src/main/webapp/WEB-INF/fusion/jsp/.gitignore | 0 .../main/webapp/WEB-INF/fusion/jsp/broadcast.jsp | 137 + .../webapp/WEB-INF/fusion/jsp/broadcast_list.jsp | 201 + .../webapp/WEB-INF/fusion/jsp/collaborateList.jsp | 146 + .../main/webapp/WEB-INF/fusion/jsp/data_out.jsp | 20 + .../webapp/WEB-INF/fusion/jsp/ebz/ebz_footer.jsp | 46 + .../webapp/WEB-INF/fusion/jsp/ebz/ebz_header.jsp | 799 + .../WEB-INF/fusion/jsp/ebz/loginSnippet.html | 120 + .../webapp/WEB-INF/fusion/jsp/ebz_template.jsp | 45 + .../fusion/jsp/ebz_template_noheader_nofooter.jsp | 35 + .../fusion/jsp/ebz_template_report_embedded.jsp | 48 + .../webapp/WEB-INF/fusion/jsp/es_search_demo.jsp | 97 + .../webapp/WEB-INF/fusion/jsp/es_suggest_demo.jsp | 97 + .../webapp/WEB-INF/fusion/jsp/frame_insert.jsp | 44 + .../src/main/webapp/WEB-INF/fusion/jsp/include.jsp | 30 + .../main/webapp/WEB-INF/fusion/jsp/jcs_admin.jsp | 144 + .../src/main/webapp/WEB-INF/fusion/jsp/meta.jsp | 36 + .../webapp/WEB-INF/fusion/jsp/popup_modal.html | 324 + .../WEB-INF/fusion/jsp/popup_modal_role.html | 274 + .../fusion/jsp/popup_modal_rolefunction.html | 87 + .../main/webapp/WEB-INF/fusion/jsp/post_search.jsp | 356 + .../src/main/webapp/WEB-INF/fusion/jsp/profile.jsp | 441 + .../webapp/WEB-INF/fusion/jsp/profile_search.jsp | 104 + .../src/main/webapp/WEB-INF/fusion/jsp/role.jsp | 286 + .../WEB-INF/fusion/jsp/role_function_list.jsp | 213 + .../main/webapp/WEB-INF/fusion/jsp/role_list.jsp | 139 + .../main/webapp/WEB-INF/fusion/jsp/usage_list.jsp | 87 + .../WEB-INF/fusion/jsp/webrtc/collaboration.jsp | 492 + .../main/webapp/WEB-INF/fusion/orm/Fusion.hbm.xml | 352 + .../fusion/orm/RNoteBookIntegration.hbm.xml | 44 + .../webapp/WEB-INF/fusion/orm/Workflow.hbm.xml | 48 + .../src/main/webapp/WEB-INF/jsp/error.jsp | 20 + .../src/main/webapp/WEB-INF/jsp/leafletMap.jsp | 288 + .../src/main/webapp/WEB-INF/jsp/login_external.jsp | 154 + .../src/main/webapp/WEB-INF/jsp/net_map.jsp | 38 + .../src/main/webapp/WEB-INF/jsp/user_profile.jsp | 84 + .../src/main/webapp/WEB-INF/jsp/welcome.jsp | 629 + .../src/main/webapp/WEB-INF/web.xml | 38 + .../src/main/webapp/app/dbcapp/att-globe-16x16.ico | Bin 0 -> 1150 bytes .../dbcapp/datarouter/dr-feed-list-controller.js | 286 + .../dbcapp/datarouter/dr-feed-popup-controller.js | 125 + .../dr-feed-pub-sub-list-popup-controller.js | 38 + .../app/dbcapp/datarouter/dr-feed-service.js | 105 + .../dbcapp/datarouter/dr-pub-list-controller.js | 149 + .../dbcapp/datarouter/dr-pub-popup-controller.js | 82 + .../webapp/app/dbcapp/datarouter/dr-pub-service.js | 106 + .../dbcapp/datarouter/dr-sub-list-controller.js | 149 + .../dbcapp/datarouter/dr-sub-popup-controller.js | 89 + .../webapp/app/dbcapp/datarouter/dr-sub-service.js | 105 + .../datarouter/dr_feed_add_popup_template.html | 104 + .../datarouter/dr_feed_edit_popup_template.html | 75 + .../webapp/app/dbcapp/datarouter/dr_feed_list.html | 177 + .../dr_feed_pub_sub_list_popup_template.html | 122 + .../webapp/app/dbcapp/datarouter/dr_pub_list.html | 130 + .../dbcapp/datarouter/dr_pub_popup_template.html | 60 + .../webapp/app/dbcapp/datarouter/dr_sub_list.html | 156 + .../dbcapp/datarouter/dr_sub_popup_template.html | 72 + .../dmaapaccess/dmaap-access-list-controller.js | 194 + .../dmaapaccess/dmaap-access-popup-controller.js | 125 + .../app/dbcapp/dmaapaccess/dmaap-access-service.js | 160 + .../app/dbcapp/dmaapaccess/dmaap_access_list.html | 108 + .../dmaapaccess/dmaap_access_popup_template.html | 73 + .../dbcapp/dmaapaccess/modal-popup-controller.js | 26 + .../webapp/app/dbcapp/home/dbc-home-controller.js | 66 + .../webapp/app/dbcapp/home/dbc-spa-controller.js | 50 + .../src/main/webapp/app/dbcapp/home/dbc-style.css | 77 + .../main/webapp/app/dbcapp/home/dbc-yn-filter.js | 26 + .../main/webapp/app/dbcapp/home/dbc_home_body.html | 51 + .../app/dbcapp/home/dbc_popup_templates.html | 73 + .../src/main/webapp/app/dbcapp/home/dbc_spa.html | 139 + .../webapp/app/dbcapp/home/manifest-service.js | 43 + .../messagerouter/mr-client-list-controller.js | 154 + .../messagerouter/mr-client-popup-controller.js | 127 + .../app/dbcapp/messagerouter/mr-client-service.js | 105 + .../mr-topic-client-list-popup-controller.js | 36 + .../messagerouter/mr-topic-list-controller.js | 248 + .../messagerouter/mr-topic-popup-controller.js | 83 + .../app/dbcapp/messagerouter/mr-topic-service.js | 105 + .../app/dbcapp/messagerouter/mr_client_list.html | 142 + .../messagerouter/mr_client_popup_template.html | 68 + .../mr_topic_client_list_popup_template.html | 74 + .../app/dbcapp/messagerouter/mr_topic_list.html | 154 + .../messagerouter/mr_topic_popup_template.html | 62 + .../webapp/app/fusion/ase/images/bg-top-bar.png | Bin 0 -> 215 bytes .../webapp/app/fusion/ase/images/checkmark_yes.gif | Bin 0 -> 145 bytes .../webapp/app/fusion/ase/images/downCaret.gif | Bin 0 -> 2951 bytes .../webapp/app/fusion/ase/images/home-icon.png | Bin 0 -> 3483 bytes .../webapp/app/fusion/ase/images/menus/cut.gif | Bin 0 -> 532 bytes .../webapp/app/fusion/ase/images/menus/door.gif | Bin 0 -> 580 bytes .../webapp/app/fusion/ase/images/menus/export.gif | Bin 0 -> 613 bytes .../webapp/app/fusion/ase/images/menus/import.gif | Bin 0 -> 605 bytes .../app/fusion/ase/images/menus/page_white_add.gif | Bin 0 -> 163 bytes .../fusion/ase/images/menus/page_white_copy.gif | Bin 0 -> 361 bytes .../fusion/ase/images/menus/page_white_delete.gif | Bin 0 -> 568 bytes .../fusion/ase/images/menus/page_white_edit.gif | Bin 0 -> 576 bytes .../fusion/ase/images/menus/page_white_paste.gif | Bin 0 -> 607 bytes .../webapp/app/fusion/ase/images/menus/trash.gif | Bin 0 -> 617 bytes .../images/menus/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 212 bytes .../images/menus/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 208 bytes .../images/menus/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 335 bytes .../images/menus/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 207 bytes .../images/menus/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 262 bytes .../images/menus/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 262 bytes .../images/menus/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 332 bytes .../menus/ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 280 bytes .../ase/images/menus/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../ase/images/menus/ui-icons_2e83ff_256x240.png | Bin 0 -> 4549 bytes .../ase/images/menus/ui-icons_454545_256x240.png | Bin 0 -> 6992 bytes .../ase/images/menus/ui-icons_888888_256x240.png | Bin 0 -> 6999 bytes .../ase/images/menus/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4549 bytes .../src/main/webapp/app/fusion/ase/images/pipe.png | Bin 0 -> 153 bytes .../webapp/app/fusion/ase/images/selfArrow.png | Bin 0 -> 3658 bytes .../webapp/app/fusion/ase/images/smallPostit.png | Bin 0 -> 17715 bytes .../main/webapp/app/fusion/ase/images/trashCan.gif | Bin 0 -> 54898 bytes .../webapp/app/fusion/ase/images/trashCanFull.gif | Bin 0 -> 85500 bytes .../main/webapp/app/fusion/ase/images/triangle.png | Bin 0 -> 289757 bytes .../src/main/webapp/app/fusion/ase/index.html | 14 + .../app/fusion/ase/mocks/networkElements.yml | 95 + .../app/fusion/ase/scripts/BPMNconversion.js | 208 + .../src/main/webapp/app/fusion/ase/scripts/app.js | 55 + .../app/fusion/ase/scripts/arrayManipulation.js | 356 + .../main/webapp/app/fusion/ase/scripts/arrows.js | 213 + .../src/main/webapp/app/fusion/ase/scripts/ase.js | 112 + .../main/webapp/app/fusion/ase/scripts/backend.js | 827 + .../scripts/bower_components/Snap.svg/.bower.json | 35 + .../scripts/bower_components/Snap.svg/CONTRIBUTING | 3 + .../scripts/bower_components/Snap.svg/Gruntfile.js | 62 + .../ase/scripts/bower_components/Snap.svg/LICENSE | 202 + .../ase/scripts/bower_components/Snap.svg/NOTICE | 190 + .../scripts/bower_components/Snap.svg/README.md | 68 + .../scripts/bower_components/Snap.svg/bower.json | 25 + .../bower_components/Snap.svg/component.json | 13 + .../bower_components/Snap.svg/dist/snap.svg-min.js | 21 + .../bower_components/Snap.svg/dist/snap.svg.js | 8170 ++++ .../bower_components/Snap.svg/doc/css/dr.css | 144 + .../bower_components/Snap.svg/doc/css/main.css | 508 + .../bower_components/Snap.svg/doc/css/prism.css | 168 + .../Snap.svg/doc/css/topcoat-desktop-light.css | 3700 ++ .../doc/fonts/sourcecodepro-regular-webfont.eot | Bin 0 -> 23949 bytes .../doc/fonts/sourcecodepro-regular-webfont.svg | 242 + .../doc/fonts/sourcecodepro-regular-webfont.ttf | Bin 0 -> 52660 bytes .../doc/fonts/sourcecodepro-regular-webfont.woff | Bin 0 -> 27068 bytes .../doc/fonts/sourcesanspro-light-webfont.eot | Bin 0 -> 23716 bytes .../doc/fonts/sourcesanspro-light-webfont.svg | 243 + .../doc/fonts/sourcesanspro-light-webfont.ttf | Bin 0 -> 51876 bytes .../doc/fonts/sourcesanspro-light-webfont.woff | Bin 0 -> 26716 bytes .../doc/fonts/sourcesanspro-regular-webfont.eot | Bin 0 -> 23970 bytes .../doc/fonts/sourcesanspro-regular-webfont.svg | 243 + .../doc/fonts/sourcesanspro-regular-webfont.ttf | Bin 0 -> 52456 bytes .../doc/fonts/sourcesanspro-regular-webfont.woff | Bin 0 -> 27076 bytes .../doc/fonts/sourcesanspro-semibold-webfont.eot | Bin 0 -> 23974 bytes .../doc/fonts/sourcesanspro-semibold-webfont.svg | 243 + .../doc/fonts/sourcesanspro-semibold-webfont.ttf | Bin 0 -> 51960 bytes .../doc/fonts/sourcesanspro-semibold-webfont.woff | Bin 0 -> 27048 bytes .../Snap.svg/doc/fonts/stylesheet.css | 57 + .../bower_components/Snap.svg/doc/img/search.svg | 11 + .../Snap.svg/doc/img/search_dark.svg | 16 + .../bower_components/Snap.svg/doc/js/prism.js | 9 + .../bower_components/Snap.svg/doc/reference.html | 14816 +++++++ .../ase/scripts/bower_components/Snap.svg/dr.json | 39 + .../scripts/bower_components/Snap.svg/history.md | 49 + .../scripts/bower_components/Snap.svg/package.json | 24 + .../scripts/bower_components/Snap.svg/template.dot | 157 + .../scripts/bower_components/Snap.svg/test.html | 17 + .../scripts/bower_components/bpmn-js/.bower.json | 30 + .../scripts/bower_components/bpmn-js/.gitignore | 1 + .../ase/scripts/bower_components/bpmn-js/LICENSE | 22 + .../ase/scripts/bower_components/bpmn-js/README.md | 46 + .../scripts/bower_components/bpmn-js/bower.json | 20 + .../dist/assets/bpmn-font/css/bpmn-embedded.css | 150 + .../bpmn-js/dist/assets/bpmn-font/css/bpmn.css | 152 + .../bpmn-js/dist/assets/bpmn-font/font/bpmn.eot | Bin 0 -> 40720 bytes .../bpmn-js/dist/assets/bpmn-font/font/bpmn.svg | 107 + .../bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf | Bin 0 -> 40568 bytes .../bpmn-js/dist/assets/bpmn-font/font/bpmn.woff | Bin 0 -> 13784 bytes .../bpmn-js/dist/assets/diagram-js.css | 457 + .../bower_components/bpmn-js/dist/bpmn-modeler.js | 43358 +++++++++++++++++++ .../bpmn-js/dist/bpmn-modeler.js.map | 1 + .../bpmn-js/dist/bpmn-modeler.min.js | 14 + .../bpmn-js/dist/bpmn-navigated-viewer.js | 27371 ++++++++++++ .../bpmn-js/dist/bpmn-navigated-viewer.js.map | 1 + .../bpmn-js/dist/bpmn-navigated-viewer.min.js | 9 + .../bower_components/bpmn-js/dist/bpmn-viewer.js | 27080 ++++++++++++ .../bpmn-js/dist/bpmn-viewer.js.map | 1 + .../bpmn-js/dist/bpmn-viewer.min.js | 9 + .../bower_components/jquery-mousewheel/.bower.json | 28 + .../jquery-mousewheel/ChangeLog.md | 147 + .../bower_components/jquery-mousewheel/LICENSE.txt | 37 + .../bower_components/jquery-mousewheel/README.md | 76 + .../bower_components/jquery-mousewheel/bower.json | 17 + .../jquery-mousewheel/jquery.mousewheel.js | 221 + .../jquery-mousewheel/jquery.mousewheel.min.js | 8 + .../scripts/bower_components/lodash/.bower.json | 31 + .../ase/scripts/bower_components/lodash/LICENSE | 22 + .../ase/scripts/bower_components/lodash/bower.json | 19 + .../ase/scripts/bower_components/lodash/lodash.js | 12351 ++++++ .../scripts/bower_components/lodash/lodash.min.js | 99 + .../ase/scripts/bower_components/sax/lib/sax.js | 1430 + .../main/webapp/app/fusion/ase/scripts/buttons.js | 382 + .../webapp/app/fusion/ase/scripts/convertToYaml.js | 73 + .../app/fusion/ase/scripts/customContextMenus.js | 1489 + .../app/fusion/ase/scripts/dependencies/Blob.js | 211 + .../app/fusion/ase/scripts/dependencies/base64.js | 143 + .../fusion/ase/scripts/dependencies/interact.js | 5963 +++ .../ase/scripts/dependencies/jquery-2.1.4.min.js | 4 + .../app/fusion/ase/scripts/dependencies/js-yaml.js | 3960 ++ .../ase/scripts/dependencies/saveSvgAsPng.js | 170 + .../webapp/app/fusion/ase/scripts/dictionary.js | 614 + .../app/fusion/ase/scripts/dragMoveListener.js | 55 + .../fusion/ase/scripts/dragMoveListenerArrow.js | 44 + .../webapp/app/fusion/ase/scripts/dropzones.js | 704 + .../webapp/app/fusion/ase/scripts/elements_ase.js | 76 + .../webapp/app/fusion/ase/scripts/menus/bootbox.js | 986 + .../app/fusion/ase/scripts/menus/bootstrap.min.js | 7 + .../app/fusion/ase/scripts/menus/contextMenu.js | 1692 + .../app/fusion/ase/scripts/menus/jquery-ui.min.js | 13 + .../fusion/ase/scripts/menus/jquery.tooltipster.js | 1327 + .../main/webapp/app/fusion/ase/scripts/nodes.js | 1290 + .../main/webapp/app/fusion/ase/scripts/notes.js | 152 + .../main/webapp/app/fusion/ase/scripts/printpdf.js | 519 + .../webapp/app/fusion/ase/scripts/resizable.js | 159 + .../main/webapp/app/fusion/ase/scripts/scroll.js | 77 + .../main/webapp/app/fusion/ase/scripts/services.js | 86 + .../main/webapp/app/fusion/ase/styles/menus/bs.css | 677 + .../app/fusion/ase/styles/menus/jquery-ui.css | 1227 + .../app/fusion/ase/styles/menus/tooltipster.css | 294 + .../main/webapp/app/fusion/ase/styles/style.css | 1028 + .../app/fusion/ase/view-models/ase_view.html | 0 .../app/fusion/ase/view-models/grid_view.html | 0 .../webapp/app/fusion/ase/view-models/index.html | 159 + .../app/fusion/ase/view-models/sidebar_view.html | 0 .../app/fusion/ase/view-models/topbar_view.html | 6 + .../fusion/external/angular-1.5/angular-animate.js | 4121 ++ .../external/angular-1.5/angular-animate.min.js | 56 + .../angular-1.5/angular-animate.min.js.map | 8 + .../fusion/external/angular-1.5/angular-aria.js | 398 + .../external/angular-1.5/angular-aria.min.js | 14 + .../external/angular-1.5/angular-aria.min.js.map | 8 + .../fusion/external/angular-1.5/angular-cookies.js | 322 + .../external/angular-1.5/angular-cookies.min.js | 9 + .../angular-1.5/angular-cookies.min.js.map | 8 + .../fusion/external/angular-1.5/angular-csp.css | 20 + .../fusion/external/angular-1.5/angular-loader.js | 484 + .../external/angular-1.5/angular-loader.min.js | 10 + .../external/angular-1.5/angular-loader.min.js.map | 8 + .../external/angular-1.5/angular-message-format.js | 980 + .../angular-1.5/angular-message-format.min.js | 26 + .../angular-1.5/angular-message-format.min.js.map | 8 + .../external/angular-1.5/angular-messages.js | 687 + .../external/angular-1.5/angular-messages.min.js | 12 + .../angular-1.5/angular-messages.min.js.map | 8 + .../fusion/external/angular-1.5/angular-mocks.js | 2842 ++ .../external/angular-1.5/angular-resource.js | 768 + .../external/angular-1.5/angular-resource.min.js | 15 + .../angular-1.5/angular-resource.min.js.map | 8 + .../fusion/external/angular-1.5/angular-route.js | 1016 + .../external/angular-1.5/angular-route.min.js | 15 + .../external/angular-1.5/angular-route.min.js.map | 8 + .../external/angular-1.5/angular-sanitize.js | 717 + .../external/angular-1.5/angular-sanitize.min.js | 15 + .../angular-1.5/angular-sanitize.min.js.map | 8 + .../external/angular-1.5/angular-scenario.js | 41849 ++++++++++++++++++ .../fusion/external/angular-1.5/angular-touch.js | 729 + .../external/angular-1.5/angular-touch.min.js | 14 + .../external/angular-1.5/angular-touch.min.js.map | 8 + .../app/fusion/external/angular-1.5/angular.js | 30428 +++++++++++++ .../app/fusion/external/angular-1.5/angular.min.js | 307 + .../fusion/external/angular-1.5/angular.min.js.map | 8 + .../app/fusion/external/angular-1.5/errors.json | 1 + .../app/fusion/external/angular-1.5/version.json | 1 + .../app/fusion/external/angular-1.5/version.txt | 1 + .../angular-ui/ui-bootstrap-tpls-1.1.2.min.js | 10 + .../angular-ui/ui-bootstrap-tpls-1.2.4.min.js | 10 + .../webapp/app/fusion/external/bootstrap/bs.css | 678 + .../webapp/app/fusion/external/d3/css/nv.d3.css | 656 + .../main/webapp/app/fusion/external/d3/js/cie.js | 155 + .../app/fusion/external/d3/js/colorbrewer.js | 302 + .../main/webapp/app/fusion/external/d3/js/core.js | 122 + .../app/fusion/external/d3/js/crossfilter.js | 1180 + .../app/fusion/external/d3/js/crossfilter.min.js | 1 + .../webapp/app/fusion/external/d3/js/d3.geom.js | 816 + .../main/webapp/app/fusion/external/d3/js/d3.js | 5 + .../app/fusion/external/d3/js/d3.layout.cloud.js | 433 + .../webapp/app/fusion/external/d3/js/d3.layout.js | 908 + .../main/webapp/app/fusion/external/d3/js/d3.v2.js | 7037 +++ .../webapp/app/fusion/external/d3/js/d3.v2.min.js | 4 + .../webapp/app/fusion/external/d3/js/d3.v3.min.js | 1 + .../webapp/app/fusion/external/d3/js/fisheye.js | 86 + .../main/webapp/app/fusion/external/d3/js/hive.js | 80 + .../webapp/app/fusion/external/d3/js/horizon.js | 192 + .../app/fusion/external/d3/js/interactiveLayer.js | 251 + .../main/webapp/app/fusion/external/d3/js/intro.js | 1 + .../app/fusion/external/d3/js/models/axis-min.js | 1 + .../app/fusion/external/d3/js/models/axis.js | 470 + .../app/fusion/external/d3/js/models/axis.min.js | 1 + .../fusion/external/d3/js/models/backup/bullet.js | 250 + .../external/d3/js/models/backup/bulletChart.js | 349 + .../fusion/external/d3/js/models/boilerplate.js | 104 + .../app/fusion/external/d3/js/models/bullet.js | 385 + .../fusion/external/d3/js/models/bulletChart.js | 343 + .../external/d3/js/models/cumulativeLineChart.js | 782 + .../fusion/external/d3/js/models/discreteBar.js | 349 + .../external/d3/js/models/discreteBarChart.js | 333 + .../fusion/external/d3/js/models/distribution.js | 148 + .../fusion/external/d3/js/models/historicalBar.js | 331 + .../external/d3/js/models/historicalBarChart.js | 419 + .../fusion/external/d3/js/models/indentedTree.js | 337 + .../app/fusion/external/d3/js/models/legend.js | 270 + .../app/fusion/external/d3/js/models/line.js | 284 + .../app/fusion/external/d3/js/models/lineChart.js | 465 + .../external/d3/js/models/linePlusBarChart.js | 433 + .../d3/js/models/linePlusBarWithFocusChart.js | 658 + .../external/d3/js/models/lineWithFisheye.js | 200 + .../external/d3/js/models/lineWithFisheyeChart.js | 297 + .../external/d3/js/models/lineWithFocusChart.js | 574 + .../app/fusion/external/d3/js/models/multiBar.js | 461 + .../fusion/external/d3/js/models/multiBarChart.js | 524 + .../external/d3/js/models/multiBarHorizontal.js | 424 + .../d3/js/models/multiBarHorizontalChart.js | 434 + .../external/d3/js/models/multiBarTimeSeries.js | 384 + .../d3/js/models/multiBarTimeSeriesChart.js | 405 + .../app/fusion/external/d3/js/models/multiChart.js | 452 + .../app/fusion/external/d3/js/models/ohlcBar.js | 380 + .../external/d3/js/models/parallelCoordinates.js | 239 + .../webapp/app/fusion/external/d3/js/models/pie.js | 400 + .../app/fusion/external/d3/js/models/pieChart.js | 292 + .../app/fusion/external/d3/js/models/scatter.js | 674 + .../fusion/external/d3/js/models/scatterChart.js | 628 + .../external/d3/js/models/scatterPlusLineChart.js | 620 + .../app/fusion/external/d3/js/models/sparkline.js | 194 + .../fusion/external/d3/js/models/sparklinePlus.js | 295 + .../fusion/external/d3/js/models/stackedArea.js | 368 + .../external/d3/js/models/stackedAreaChart.js | 629 + .../main/webapp/app/fusion/external/d3/js/nv.d3.js | 13097 ++++++ .../webapp/app/fusion/external/d3/js/nv.d3.min.js | 1 + .../main/webapp/app/fusion/external/d3/js/outro.js | 1 + .../webapp/app/fusion/external/d3/js/sankey.js | 292 + .../webapp/app/fusion/external/d3/js/tooltip.js | 490 + .../main/webapp/app/fusion/external/d3/js/utils.js | 152 + .../external/ebz/angular_js/angular-animate.js | 3721 ++ .../external/ebz/angular_js/angular-cookies.js | 206 + .../external/ebz/angular_js/angular-route.js | 911 + .../external/ebz/angular_js/angular-route.min.js | 14 + .../external/ebz/angular_js/angular-sanitize.js | 647 + .../external/ebz/angular_js/angular-touch.js | 628 + .../app/fusion/external/ebz/angular_js/angular.js | 22024 ++++++++++ .../app/fusion/external/ebz/angular_js/app.js | 6 + .../external/ebz/angular_js/checklist-model.js | 99 + .../external/ebz/angular_js/checklist-model.min.js | 1 + .../app/fusion/external/ebz/angular_js/gestures.js | 1495 + .../app/fusion/external/ebz/angular_js/ng_base.js | 4 + .../external/ebz/angular_js/ui-charts-tpls.js | 3909 ++ .../app/fusion/external/ebz/ebz_header/footer.css | 311 + .../app/fusion/external/ebz/ebz_header/header.css | 1866 + .../external/ebz/ebz_header/portal_ebz_header.css | 63 + .../main/webapp/app/fusion/external/ebz/fn-ebz.css | 1614 + .../fusion/external/ebz/images/headerChatIcon.png | Bin 0 -> 465 bytes .../external/ebz/images/no_favorites_star.png | Bin 0 -> 2794 bytes .../app/fusion/external/ebz/js/attHeaderSnippet.js | 210 + .../webapp/app/fusion/external/ebz/js/footer.js | 110 + .../fusion/external/ebz/sandbox/att-abs-tpls.js | 20451 +++++++++ .../external/ebz/sandbox/att-abs-tpls.min.js | 22 + .../fusion/external/ebz/sandbox/styles/base.css | 1 + .../app/fusion/external/ebz/sandbox/styles/btn.css | 1 + .../fusion/external/ebz/sandbox/styles/demo.css | 2 + .../fusion/external/ebz/sandbox/styles/dtpk.css | 9 + .../fusion/external/ebz/sandbox/styles/frms.css | 1 + .../ebz/sandbox/styles/ie/backgroundsize.min.htc | 12 + .../ebz/sandbox/styles/images/calendar-icon.png | Bin 0 -> 515635 bytes .../ebz/sandbox/styles/images/checkbox.png | Bin 0 -> 1170 bytes .../external/ebz/sandbox/styles/images/down.png | Bin 0 -> 1059 bytes .../ebz/sandbox/styles/images/icon-close-modal.png | Bin 0 -> 1634 bytes .../styles/images/icon-informative-modal.png | Bin 0 -> 5018 bytes .../sandbox/styles/images/icon-warning-modal.png | Bin 0 -> 3831 bytes .../external/ebz/sandbox/styles/images/loader.gif | Bin 0 -> 5732 bytes .../styles/images/loading-spinner-medium.png | Bin 0 -> 2021 bytes .../styles/images/loading-spinner-orange.png | Bin 0 -> 2087 bytes .../styles/images/loading_balls_black-small.gif | Bin 0 -> 3209 bytes .../sandbox/styles/images/loading_balls_black.gif | Bin 0 -> 2636 bytes .../styles/images/loading_balls_blue-small.gif | Bin 0 -> 3210 bytes .../sandbox/styles/images/loading_balls_blue.gif | Bin 0 -> 2636 bytes .../styles/images/loading_balls_white-small.gif | Bin 0 -> 2060 bytes .../sandbox/styles/images/loading_balls_white.gif | Bin 0 -> 1924 bytes .../ebz/sandbox/styles/images/loading_dots.gif | Bin 0 -> 3736 bytes .../ebz/sandbox/styles/images/magnify_glass.png | Bin 0 -> 556 bytes .../ebz/sandbox/styles/images/oops-exclamation.png | Bin 0 -> 836 bytes .../external/ebz/sandbox/styles/images/radio.jpg | Bin 0 -> 1352 bytes .../ebz/sandbox/styles/images/select-arrows.png | Bin 0 -> 1373 bytes .../ebz/sandbox/styles/images/treearrow.png | Bin 0 -> 17821 bytes .../external/ebz/sandbox/styles/images/up.png | Bin 0 -> 1064 bytes .../ebz/sandbox/styles/images/upanddown.png | Bin 0 -> 1033 bytes .../ebz/sandbox/styles/pages/iconography.css | 2 + .../fusion/external/ebz/sandbox/styles/sldr.css | 1 + .../fusion/external/ebz/sandbox/styles/style.css | 1 + .../app/fusion/external/ebz/sandbox/styles/tbs.css | 1 + .../app/fusion/external/ionicons-2.0.1/.gitignore | 4 + .../app/fusion/external/ionicons-2.0.1/LICENSE | 21 + .../app/fusion/external/ionicons-2.0.1/bower.json | 31 + .../fusion/external/ionicons-2.0.1/component.json | 19 + .../fusion/external/ionicons-2.0.1/composer.json | 36 + .../external/ionicons-2.0.1/css/ionicons.css | 1480 + .../external/ionicons-2.0.1/css/ionicons.min.css | 11 + .../external/ionicons-2.0.1/fonts/ionicons.eot | Bin 0 -> 120724 bytes .../external/ionicons-2.0.1/fonts/ionicons.svg | 2230 + .../external/ionicons-2.0.1/fonts/ionicons.ttf | Bin 0 -> 188508 bytes .../external/ionicons-2.0.1/fonts/ionicons.woff | Bin 0 -> 67904 bytes .../ionicons-2.0.1/less/_ionicons-font.less | 27 + .../ionicons-2.0.1/less/_ionicons-icons.less | 1473 + .../ionicons-2.0.1/less/_ionicons-variables.less | 747 + .../external/ionicons-2.0.1/less/ionicons.less | 3 + .../ionicons-2.0.1/png/512/alert-circled.png | Bin 0 -> 2551 bytes .../external/ionicons-2.0.1/png/512/alert.png | Bin 0 -> 766 bytes .../ionicons-2.0.1/png/512/android-add-contact.png | Bin 0 -> 3279 bytes .../ionicons-2.0.1/png/512/android-add.png | Bin 0 -> 240 bytes .../ionicons-2.0.1/png/512/android-alarm.png | Bin 0 -> 6428 bytes .../ionicons-2.0.1/png/512/android-archive.png | Bin 0 -> 1628 bytes .../ionicons-2.0.1/png/512/android-arrow-back.png | Bin 0 -> 1218 bytes .../png/512/android-arrow-down-left.png | Bin 0 -> 1451 bytes .../png/512/android-arrow-down-right.png | Bin 0 -> 1462 bytes .../png/512/android-arrow-forward.png | Bin 0 -> 1191 bytes .../png/512/android-arrow-up-left.png | Bin 0 -> 1499 bytes .../png/512/android-arrow-up-right.png | Bin 0 -> 1482 bytes .../ionicons-2.0.1/png/512/android-battery.png | Bin 0 -> 238 bytes .../ionicons-2.0.1/png/512/android-book.png | Bin 0 -> 3746 bytes .../ionicons-2.0.1/png/512/android-calendar.png | Bin 0 -> 849 bytes .../ionicons-2.0.1/png/512/android-call.png | Bin 0 -> 4766 bytes .../ionicons-2.0.1/png/512/android-camera.png | Bin 0 -> 3871 bytes .../ionicons-2.0.1/png/512/android-chat.png | Bin 0 -> 3577 bytes .../ionicons-2.0.1/png/512/android-checkmark.png | Bin 0 -> 1846 bytes .../ionicons-2.0.1/png/512/android-clock.png | Bin 0 -> 5268 bytes .../ionicons-2.0.1/png/512/android-close.png | Bin 0 -> 2156 bytes .../ionicons-2.0.1/png/512/android-contact.png | Bin 0 -> 3658 bytes .../ionicons-2.0.1/png/512/android-contacts.png | Bin 0 -> 4299 bytes .../ionicons-2.0.1/png/512/android-data.png | Bin 0 -> 4808 bytes .../ionicons-2.0.1/png/512/android-developer.png | Bin 0 -> 4115 bytes .../ionicons-2.0.1/png/512/android-display.png | Bin 0 -> 4909 bytes .../ionicons-2.0.1/png/512/android-download.png | Bin 0 -> 4890 bytes .../ionicons-2.0.1/png/512/android-drawer.png | Bin 0 -> 190 bytes .../ionicons-2.0.1/png/512/android-dropdown.png | Bin 0 -> 777 bytes .../ionicons-2.0.1/png/512/android-earth.png | Bin 0 -> 6517 bytes .../ionicons-2.0.1/png/512/android-folder.png | Bin 0 -> 1688 bytes .../ionicons-2.0.1/png/512/android-forums.png | Bin 0 -> 1739 bytes .../ionicons-2.0.1/png/512/android-friends.png | Bin 0 -> 4868 bytes .../ionicons-2.0.1/png/512/android-hand.png | Bin 0 -> 4650 bytes .../ionicons-2.0.1/png/512/android-image.png | Bin 0 -> 1433 bytes .../ionicons-2.0.1/png/512/android-inbox.png | Bin 0 -> 3018 bytes .../ionicons-2.0.1/png/512/android-information.png | Bin 0 -> 3370 bytes .../ionicons-2.0.1/png/512/android-keypad.png | Bin 0 -> 1055 bytes .../ionicons-2.0.1/png/512/android-lightbulb.png | Bin 0 -> 3515 bytes .../ionicons-2.0.1/png/512/android-locate.png | Bin 0 -> 5003 bytes .../ionicons-2.0.1/png/512/android-location.png | Bin 0 -> 3067 bytes .../ionicons-2.0.1/png/512/android-mail.png | Bin 0 -> 3455 bytes .../ionicons-2.0.1/png/512/android-microphone.png | Bin 0 -> 3267 bytes .../ionicons-2.0.1/png/512/android-mixer.png | Bin 0 -> 2727 bytes .../ionicons-2.0.1/png/512/android-more.png | Bin 0 -> 224 bytes .../ionicons-2.0.1/png/512/android-note.png | Bin 0 -> 249 bytes .../ionicons-2.0.1/png/512/android-playstore.png | Bin 0 -> 3165 bytes .../ionicons-2.0.1/png/512/android-printer.png | Bin 0 -> 1721 bytes .../ionicons-2.0.1/png/512/android-promotion.png | Bin 0 -> 2374 bytes .../ionicons-2.0.1/png/512/android-reminder.png | Bin 0 -> 2890 bytes .../ionicons-2.0.1/png/512/android-remove.png | Bin 0 -> 160 bytes .../ionicons-2.0.1/png/512/android-search.png | Bin 0 -> 4232 bytes .../ionicons-2.0.1/png/512/android-send.png | Bin 0 -> 2079 bytes .../ionicons-2.0.1/png/512/android-settings.png | Bin 0 -> 3883 bytes .../ionicons-2.0.1/png/512/android-share.png | Bin 0 -> 3212 bytes .../ionicons-2.0.1/png/512/android-social-user.png | Bin 0 -> 3644 bytes .../ionicons-2.0.1/png/512/android-social.png | Bin 0 -> 3849 bytes .../ionicons-2.0.1/png/512/android-sort.png | Bin 0 -> 197 bytes .../png/512/android-stair-drawer.png | Bin 0 -> 209 bytes .../ionicons-2.0.1/png/512/android-star.png | Bin 0 -> 2926 bytes .../ionicons-2.0.1/png/512/android-stopwatch.png | Bin 0 -> 5225 bytes .../ionicons-2.0.1/png/512/android-storage.png | Bin 0 -> 233 bytes .../ionicons-2.0.1/png/512/android-system-back.png | Bin 0 -> 1796 bytes .../ionicons-2.0.1/png/512/android-system-home.png | Bin 0 -> 1107 bytes .../png/512/android-system-windows.png | Bin 0 -> 202 bytes .../ionicons-2.0.1/png/512/android-timer.png | Bin 0 -> 3904 bytes .../ionicons-2.0.1/png/512/android-trash.png | Bin 0 -> 2865 bytes .../ionicons-2.0.1/png/512/android-user-menu.png | Bin 0 -> 3568 bytes .../ionicons-2.0.1/png/512/android-volume.png | Bin 0 -> 6022 bytes .../ionicons-2.0.1/png/512/android-wifi.png | Bin 0 -> 4868 bytes .../external/ionicons-2.0.1/png/512/aperture.png | Bin 0 -> 9500 bytes .../external/ionicons-2.0.1/png/512/archive.png | Bin 0 -> 2445 bytes .../ionicons-2.0.1/png/512/arrow-down-a.png | Bin 0 -> 1173 bytes .../ionicons-2.0.1/png/512/arrow-down-b.png | Bin 0 -> 1307 bytes .../ionicons-2.0.1/png/512/arrow-down-c.png | Bin 0 -> 1966 bytes .../ionicons-2.0.1/png/512/arrow-expand.png | Bin 0 -> 2498 bytes .../png/512/arrow-graph-down-left.png | Bin 0 -> 2478 bytes .../png/512/arrow-graph-down-right.png | Bin 0 -> 2545 bytes .../ionicons-2.0.1/png/512/arrow-graph-up-left.png | Bin 0 -> 2440 bytes .../png/512/arrow-graph-up-right.png | Bin 0 -> 2440 bytes .../ionicons-2.0.1/png/512/arrow-left-a.png | Bin 0 -> 1260 bytes .../ionicons-2.0.1/png/512/arrow-left-b.png | Bin 0 -> 1608 bytes .../ionicons-2.0.1/png/512/arrow-left-c.png | Bin 0 -> 1662 bytes .../external/ionicons-2.0.1/png/512/arrow-move.png | Bin 0 -> 1948 bytes .../ionicons-2.0.1/png/512/arrow-resize.png | Bin 0 -> 1266 bytes .../ionicons-2.0.1/png/512/arrow-return-left.png | Bin 0 -> 1082 bytes .../ionicons-2.0.1/png/512/arrow-return-right.png | Bin 0 -> 1124 bytes .../ionicons-2.0.1/png/512/arrow-right-a.png | Bin 0 -> 1317 bytes .../ionicons-2.0.1/png/512/arrow-right-b.png | Bin 0 -> 1671 bytes .../ionicons-2.0.1/png/512/arrow-right-c.png | Bin 0 -> 1657 bytes .../ionicons-2.0.1/png/512/arrow-shrink.png | Bin 0 -> 2594 bytes .../external/ionicons-2.0.1/png/512/arrow-swap.png | Bin 0 -> 1521 bytes .../external/ionicons-2.0.1/png/512/arrow-up-a.png | Bin 0 -> 1115 bytes .../external/ionicons-2.0.1/png/512/arrow-up-b.png | Bin 0 -> 1343 bytes .../external/ionicons-2.0.1/png/512/arrow-up-c.png | Bin 0 -> 2002 bytes .../external/ionicons-2.0.1/png/512/asterisk.png | Bin 0 -> 4023 bytes .../fusion/external/ionicons-2.0.1/png/512/at.png | Bin 0 -> 5852 bytes .../fusion/external/ionicons-2.0.1/png/512/bag.png | Bin 0 -> 3665 bytes .../ionicons-2.0.1/png/512/battery-charging.png | Bin 0 -> 1897 bytes .../ionicons-2.0.1/png/512/battery-empty.png | Bin 0 -> 1019 bytes .../ionicons-2.0.1/png/512/battery-full.png | Bin 0 -> 982 bytes .../ionicons-2.0.1/png/512/battery-half.png | Bin 0 -> 1320 bytes .../ionicons-2.0.1/png/512/battery-low.png | Bin 0 -> 1342 bytes .../external/ionicons-2.0.1/png/512/beaker.png | Bin 0 -> 3931 bytes .../external/ionicons-2.0.1/png/512/beer.png | Bin 0 -> 4559 bytes .../external/ionicons-2.0.1/png/512/bluetooth.png | Bin 0 -> 2909 bytes .../external/ionicons-2.0.1/png/512/bonfire.png | Bin 0 -> 4852 bytes .../external/ionicons-2.0.1/png/512/bookmark.png | Bin 0 -> 1102 bytes .../external/ionicons-2.0.1/png/512/briefcase.png | Bin 0 -> 1475 bytes .../fusion/external/ionicons-2.0.1/png/512/bug.png | Bin 0 -> 4736 bytes .../external/ionicons-2.0.1/png/512/calculator.png | Bin 0 -> 1315 bytes .../external/ionicons-2.0.1/png/512/calendar.png | Bin 0 -> 2577 bytes .../external/ionicons-2.0.1/png/512/camera.png | Bin 0 -> 4190 bytes .../external/ionicons-2.0.1/png/512/card.png | Bin 0 -> 1494 bytes .../external/ionicons-2.0.1/png/512/cash.png | Bin 0 -> 3435 bytes .../ionicons-2.0.1/png/512/chatbox-working.png | Bin 0 -> 2301 bytes .../external/ionicons-2.0.1/png/512/chatbox.png | Bin 0 -> 1870 bytes .../external/ionicons-2.0.1/png/512/chatboxes.png | Bin 0 -> 2562 bytes .../ionicons-2.0.1/png/512/chatbubble-working.png | Bin 0 -> 3028 bytes .../external/ionicons-2.0.1/png/512/chatbubble.png | Bin 0 -> 2579 bytes .../ionicons-2.0.1/png/512/chatbubbles.png | Bin 0 -> 3751 bytes .../ionicons-2.0.1/png/512/checkmark-circled.png | Bin 0 -> 3687 bytes .../ionicons-2.0.1/png/512/checkmark-round.png | Bin 0 -> 2367 bytes .../external/ionicons-2.0.1/png/512/checkmark.png | Bin 0 -> 2134 bytes .../ionicons-2.0.1/png/512/chevron-down.png | Bin 0 -> 1689 bytes .../ionicons-2.0.1/png/512/chevron-left.png | Bin 0 -> 1769 bytes .../ionicons-2.0.1/png/512/chevron-right.png | Bin 0 -> 1831 bytes .../external/ionicons-2.0.1/png/512/chevron-up.png | Bin 0 -> 1677 bytes .../external/ionicons-2.0.1/png/512/clipboard.png | Bin 0 -> 2593 bytes .../external/ionicons-2.0.1/png/512/clock.png | Bin 0 -> 5866 bytes .../ionicons-2.0.1/png/512/close-circled.png | Bin 0 -> 3809 bytes .../ionicons-2.0.1/png/512/close-round.png | Bin 0 -> 2177 bytes .../external/ionicons-2.0.1/png/512/close.png | Bin 0 -> 2244 bytes .../ionicons-2.0.1/png/512/closed-captioning.png | Bin 0 -> 3665 bytes .../external/ionicons-2.0.1/png/512/cloud.png | Bin 0 -> 2067 bytes .../ionicons-2.0.1/png/512/code-download.png | Bin 0 -> 2423 bytes .../ionicons-2.0.1/png/512/code-working.png | Bin 0 -> 2433 bytes .../external/ionicons-2.0.1/png/512/code.png | Bin 0 -> 1720 bytes .../external/ionicons-2.0.1/png/512/coffee.png | Bin 0 -> 3205 bytes .../external/ionicons-2.0.1/png/512/compass.png | Bin 0 -> 7318 bytes .../external/ionicons-2.0.1/png/512/compose.png | Bin 0 -> 4296 bytes .../ionicons-2.0.1/png/512/connection-bars.png | Bin 0 -> 214 bytes .../external/ionicons-2.0.1/png/512/contrast.png | Bin 0 -> 4087 bytes .../external/ionicons-2.0.1/png/512/cube.png | Bin 0 -> 3265 bytes .../external/ionicons-2.0.1/png/512/disc.png | Bin 0 -> 4935 bytes .../ionicons-2.0.1/png/512/document-text.png | Bin 0 -> 1918 bytes .../external/ionicons-2.0.1/png/512/document.png | Bin 0 -> 1914 bytes .../external/ionicons-2.0.1/png/512/drag.png | Bin 0 -> 178 bytes .../external/ionicons-2.0.1/png/512/earth.png | Bin 0 -> 6476 bytes .../external/ionicons-2.0.1/png/512/edit.png | Bin 0 -> 2741 bytes .../fusion/external/ionicons-2.0.1/png/512/egg.png | Bin 0 -> 4234 bytes .../external/ionicons-2.0.1/png/512/eject.png | Bin 0 -> 3209 bytes .../external/ionicons-2.0.1/png/512/email.png | Bin 0 -> 3125 bytes .../ionicons-2.0.1/png/512/eye-disabled.png | Bin 0 -> 3558 bytes .../fusion/external/ionicons-2.0.1/png/512/eye.png | Bin 0 -> 3297 bytes .../external/ionicons-2.0.1/png/512/female.png | Bin 0 -> 2779 bytes .../external/ionicons-2.0.1/png/512/filing.png | Bin 0 -> 2349 bytes .../ionicons-2.0.1/png/512/film-marker.png | Bin 0 -> 2645 bytes .../external/ionicons-2.0.1/png/512/fireball.png | Bin 0 -> 3325 bytes .../external/ionicons-2.0.1/png/512/flag.png | Bin 0 -> 2337 bytes .../external/ionicons-2.0.1/png/512/flame.png | Bin 0 -> 3012 bytes .../external/ionicons-2.0.1/png/512/flash-off.png | Bin 0 -> 5437 bytes .../external/ionicons-2.0.1/png/512/flash.png | Bin 0 -> 1965 bytes .../external/ionicons-2.0.1/png/512/flask.png | Bin 0 -> 2939 bytes .../external/ionicons-2.0.1/png/512/folder.png | Bin 0 -> 1689 bytes .../external/ionicons-2.0.1/png/512/fork-repo.png | Bin 0 -> 3236 bytes .../external/ionicons-2.0.1/png/512/fork.png | Bin 0 -> 3007 bytes .../external/ionicons-2.0.1/png/512/forward.png | Bin 0 -> 2142 bytes .../external/ionicons-2.0.1/png/512/funnel.png | Bin 0 -> 3354 bytes .../ionicons-2.0.1/png/512/game-controller-a.png | Bin 0 -> 2548 bytes .../ionicons-2.0.1/png/512/game-controller-b.png | Bin 0 -> 3623 bytes .../external/ionicons-2.0.1/png/512/gear-a.png | Bin 0 -> 3806 bytes .../external/ionicons-2.0.1/png/512/gear-b.png | Bin 0 -> 2756 bytes .../external/ionicons-2.0.1/png/512/grid.png | Bin 0 -> 1066 bytes .../external/ionicons-2.0.1/png/512/hammer.png | Bin 0 -> 2493 bytes .../external/ionicons-2.0.1/png/512/happy.png | Bin 0 -> 5732 bytes .../external/ionicons-2.0.1/png/512/headphone.png | Bin 0 -> 4082 bytes .../ionicons-2.0.1/png/512/heart-broken.png | Bin 0 -> 4007 bytes .../external/ionicons-2.0.1/png/512/heart.png | Bin 0 -> 2322 bytes .../external/ionicons-2.0.1/png/512/help-buoy.png | Bin 0 -> 5824 bytes .../ionicons-2.0.1/png/512/help-circled.png | Bin 0 -> 3940 bytes .../external/ionicons-2.0.1/png/512/help.png | Bin 0 -> 2678 bytes .../external/ionicons-2.0.1/png/512/home.png | Bin 0 -> 1275 bytes .../external/ionicons-2.0.1/png/512/icecream.png | Bin 0 -> 2317 bytes .../png/512/icon-social-google-plus-outline.png | Bin 0 -> 4071 bytes .../png/512/icon-social-google-plus.png | Bin 0 -> 3888 bytes .../external/ionicons-2.0.1/png/512/image.png | Bin 0 -> 2952 bytes .../external/ionicons-2.0.1/png/512/images.png | Bin 0 -> 5073 bytes .../ionicons-2.0.1/png/512/information-circled.png | Bin 0 -> 3300 bytes .../ionicons-2.0.1/png/512/information.png | Bin 0 -> 2236 bytes .../external/ionicons-2.0.1/png/512/ionic.png | Bin 0 -> 5541 bytes .../ionicons-2.0.1/png/512/ios7-alarm-outline.png | Bin 0 -> 5769 bytes .../external/ionicons-2.0.1/png/512/ios7-alarm.png | Bin 0 -> 3922 bytes .../ionicons-2.0.1/png/512/ios7-albums-outline.png | Bin 0 -> 231 bytes .../ionicons-2.0.1/png/512/ios7-albums.png | Bin 0 -> 226 bytes .../png/512/ios7-americanfootball-outline.png | Bin 0 -> 5767 bytes .../png/512/ios7-americanfootball.png | Bin 0 -> 5675 bytes .../png/512/ios7-analytics-outline.png | Bin 0 -> 5847 bytes .../ionicons-2.0.1/png/512/ios7-analytics.png | Bin 0 -> 4406 bytes .../ionicons-2.0.1/png/512/ios7-arrow-back.png | Bin 0 -> 881 bytes .../ionicons-2.0.1/png/512/ios7-arrow-down.png | Bin 0 -> 1451 bytes .../ionicons-2.0.1/png/512/ios7-arrow-forward.png | Bin 0 -> 898 bytes .../ionicons-2.0.1/png/512/ios7-arrow-left.png | Bin 0 -> 1550 bytes .../ionicons-2.0.1/png/512/ios7-arrow-right.png | Bin 0 -> 1537 bytes .../png/512/ios7-arrow-thin-down.png | Bin 0 -> 1632 bytes .../png/512/ios7-arrow-thin-left.png | Bin 0 -> 1258 bytes .../png/512/ios7-arrow-thin-right.png | Bin 0 -> 1235 bytes .../ionicons-2.0.1/png/512/ios7-arrow-thin-up.png | Bin 0 -> 1647 bytes .../ionicons-2.0.1/png/512/ios7-arrow-up.png | Bin 0 -> 1482 bytes .../ionicons-2.0.1/png/512/ios7-at-outline.png | Bin 0 -> 4303 bytes .../external/ionicons-2.0.1/png/512/ios7-at.png | Bin 0 -> 4153 bytes .../png/512/ios7-barcode-outline.png | Bin 0 -> 233 bytes .../ionicons-2.0.1/png/512/ios7-barcode.png | Bin 0 -> 219 bytes .../png/512/ios7-baseball-outline.png | Bin 0 -> 6676 bytes .../ionicons-2.0.1/png/512/ios7-baseball.png | Bin 0 -> 5565 bytes .../png/512/ios7-basketball-outline.png | Bin 0 -> 6200 bytes .../ionicons-2.0.1/png/512/ios7-basketball.png | Bin 0 -> 6525 bytes .../ionicons-2.0.1/png/512/ios7-bell-outline.png | Bin 0 -> 3615 bytes .../external/ionicons-2.0.1/png/512/ios7-bell.png | Bin 0 -> 2769 bytes .../ionicons-2.0.1/png/512/ios7-bolt-outline.png | Bin 0 -> 2384 bytes .../external/ionicons-2.0.1/png/512/ios7-bolt.png | Bin 0 -> 1892 bytes .../png/512/ios7-bookmarks-outline.png | Bin 0 -> 2454 bytes .../ionicons-2.0.1/png/512/ios7-bookmarks.png | Bin 0 -> 2172 bytes .../ionicons-2.0.1/png/512/ios7-box-outline.png | Bin 0 -> 1602 bytes .../external/ionicons-2.0.1/png/512/ios7-box.png | Bin 0 -> 1032 bytes .../png/512/ios7-briefcase-outline.png | Bin 0 -> 1359 bytes .../ionicons-2.0.1/png/512/ios7-briefcase.png | Bin 0 -> 1316 bytes .../png/512/ios7-browsers-outline.png | Bin 0 -> 372 bytes .../ionicons-2.0.1/png/512/ios7-browsers.png | Bin 0 -> 357 bytes .../png/512/ios7-calculator-outline.png | Bin 0 -> 1785 bytes .../ionicons-2.0.1/png/512/ios7-calculator.png | Bin 0 -> 1500 bytes .../png/512/ios7-calendar-outline.png | Bin 0 -> 236 bytes .../ionicons-2.0.1/png/512/ios7-calendar.png | Bin 0 -> 230 bytes .../ionicons-2.0.1/png/512/ios7-camera-outline.png | Bin 0 -> 3582 bytes .../ionicons-2.0.1/png/512/ios7-camera.png | Bin 0 -> 3099 bytes .../ionicons-2.0.1/png/512/ios7-cart-outline.png | Bin 0 -> 2861 bytes .../external/ionicons-2.0.1/png/512/ios7-cart.png | Bin 0 -> 2200 bytes .../png/512/ios7-chatboxes-outline.png | Bin 0 -> 901 bytes .../ionicons-2.0.1/png/512/ios7-chatboxes.png | Bin 0 -> 512 bytes .../png/512/ios7-chatbubble-outline.png | Bin 0 -> 3640 bytes .../ionicons-2.0.1/png/512/ios7-chatbubble.png | Bin 0 -> 2259 bytes .../png/512/ios7-checkmark-empty.png | Bin 0 -> 920 bytes .../png/512/ios7-checkmark-outline.png | Bin 0 -> 4706 bytes .../ionicons-2.0.1/png/512/ios7-checkmark.png | Bin 0 -> 3080 bytes .../ionicons-2.0.1/png/512/ios7-circle-filled.png | Bin 0 -> 6478 bytes .../ionicons-2.0.1/png/512/ios7-circle-outline.png | Bin 0 -> 4120 bytes .../ionicons-2.0.1/png/512/ios7-clock-outline.png | Bin 0 -> 4320 bytes .../external/ionicons-2.0.1/png/512/ios7-clock.png | Bin 0 -> 2762 bytes .../ionicons-2.0.1/png/512/ios7-close-empty.png | Bin 0 -> 1204 bytes .../ionicons-2.0.1/png/512/ios7-close-outline.png | Bin 0 -> 4999 bytes .../external/ionicons-2.0.1/png/512/ios7-close.png | Bin 0 -> 3426 bytes .../png/512/ios7-cloud-download-outline.png | Bin 0 -> 3953 bytes .../ionicons-2.0.1/png/512/ios7-cloud-download.png | Bin 0 -> 2782 bytes .../ionicons-2.0.1/png/512/ios7-cloud-outline.png | Bin 0 -> 3339 bytes .../png/512/ios7-cloud-upload-outline.png | Bin 0 -> 3927 bytes .../ionicons-2.0.1/png/512/ios7-cloud-upload.png | Bin 0 -> 2815 bytes .../external/ionicons-2.0.1/png/512/ios7-cloud.png | Bin 0 -> 2082 bytes .../png/512/ios7-cloudy-night-outline.png | Bin 0 -> 3814 bytes .../ionicons-2.0.1/png/512/ios7-cloudy-night.png | Bin 0 -> 2870 bytes .../ionicons-2.0.1/png/512/ios7-cloudy-outline.png | Bin 0 -> 2280 bytes .../ionicons-2.0.1/png/512/ios7-cloudy.png | Bin 0 -> 1572 bytes .../ionicons-2.0.1/png/512/ios7-cog-outline.png | Bin 0 -> 8008 bytes .../external/ionicons-2.0.1/png/512/ios7-cog.png | Bin 0 -> 6029 bytes .../png/512/ios7-compose-outline.png | Bin 0 -> 1584 bytes .../ionicons-2.0.1/png/512/ios7-compose.png | Bin 0 -> 2061 bytes .../png/512/ios7-contact-outline.png | Bin 0 -> 4846 bytes .../ionicons-2.0.1/png/512/ios7-contact.png | Bin 0 -> 4218 bytes .../ionicons-2.0.1/png/512/ios7-copy-outline.png | Bin 0 -> 927 bytes .../external/ionicons-2.0.1/png/512/ios7-copy.png | Bin 0 -> 782 bytes .../png/512/ios7-download-outline.png | Bin 0 -> 1163 bytes .../ionicons-2.0.1/png/512/ios7-download.png | Bin 0 -> 1135 bytes .../external/ionicons-2.0.1/png/512/ios7-drag.png | Bin 0 -> 165 bytes .../ionicons-2.0.1/png/512/ios7-email-outline.png | Bin 0 -> 2592 bytes .../external/ionicons-2.0.1/png/512/ios7-email.png | Bin 0 -> 4167 bytes .../ionicons-2.0.1/png/512/ios7-expand.png | Bin 0 -> 485 bytes .../ionicons-2.0.1/png/512/ios7-eye-outline.png | Bin 0 -> 4381 bytes .../external/ionicons-2.0.1/png/512/ios7-eye.png | Bin 0 -> 2973 bytes .../png/512/ios7-fastforward-outline.png | Bin 0 -> 2726 bytes .../ionicons-2.0.1/png/512/ios7-fastforward.png | Bin 0 -> 2158 bytes .../ionicons-2.0.1/png/512/ios7-filing-outline.png | Bin 0 -> 2041 bytes .../ionicons-2.0.1/png/512/ios7-filing.png | Bin 0 -> 1933 bytes .../ionicons-2.0.1/png/512/ios7-film-outline.png | Bin 0 -> 772 bytes .../external/ionicons-2.0.1/png/512/ios7-film.png | Bin 0 -> 722 bytes .../ionicons-2.0.1/png/512/ios7-flag-outline.png | Bin 0 -> 1928 bytes .../external/ionicons-2.0.1/png/512/ios7-flag.png | Bin 0 -> 1483 bytes .../ionicons-2.0.1/png/512/ios7-folder-outline.png | Bin 0 -> 1606 bytes .../ionicons-2.0.1/png/512/ios7-folder.png | Bin 0 -> 1640 bytes .../png/512/ios7-football-outline.png | Bin 0 -> 6266 bytes .../ionicons-2.0.1/png/512/ios7-football.png | Bin 0 -> 5391 bytes .../ionicons-2.0.1/png/512/ios7-gear-outline.png | Bin 0 -> 5721 bytes .../external/ionicons-2.0.1/png/512/ios7-gear.png | Bin 0 -> 3445 bytes .../png/512/ios7-glasses-outline.png | Bin 0 -> 3597 bytes .../ionicons-2.0.1/png/512/ios7-glasses.png | Bin 0 -> 2350 bytes .../ionicons-2.0.1/png/512/ios7-heart-outline.png | Bin 0 -> 3097 bytes .../external/ionicons-2.0.1/png/512/ios7-heart.png | Bin 0 -> 2078 bytes .../ionicons-2.0.1/png/512/ios7-help-empty.png | Bin 0 -> 1669 bytes .../ionicons-2.0.1/png/512/ios7-help-outline.png | Bin 0 -> 5608 bytes .../external/ionicons-2.0.1/png/512/ios7-help.png | Bin 0 -> 3587 bytes .../ionicons-2.0.1/png/512/ios7-home-outline.png | Bin 0 -> 1710 bytes .../external/ionicons-2.0.1/png/512/ios7-home.png | Bin 0 -> 1518 bytes .../png/512/ios7-infinite-outline.png | Bin 0 -> 3028 bytes .../ionicons-2.0.1/png/512/ios7-infinite.png | Bin 0 -> 2989 bytes .../png/512/ios7-information-empty.png | Bin 0 -> 837 bytes .../png/512/ios7-information-outline.png | Bin 0 -> 4563 bytes .../ionicons-2.0.1/png/512/ios7-information.png | Bin 0 -> 2959 bytes .../ionicons-2.0.1/png/512/ios7-ionic-outline.png | Bin 0 -> 5780 bytes .../ionicons-2.0.1/png/512/ios7-keypad-outline.png | Bin 0 -> 7485 bytes .../ionicons-2.0.1/png/512/ios7-keypad.png | Bin 0 -> 7505 bytes .../png/512/ios7-lightbulb-outline.png | Bin 0 -> 3791 bytes .../ionicons-2.0.1/png/512/ios7-lightbulb.png | Bin 0 -> 2696 bytes .../png/512/ios7-location-outline.png | Bin 0 -> 4116 bytes .../ionicons-2.0.1/png/512/ios7-location.png | Bin 0 -> 2767 bytes .../ionicons-2.0.1/png/512/ios7-locked-outline.png | Bin 0 -> 2640 bytes .../ionicons-2.0.1/png/512/ios7-locked.png | Bin 0 -> 2674 bytes .../ionicons-2.0.1/png/512/ios7-loop-strong.png | Bin 0 -> 4101 bytes .../external/ionicons-2.0.1/png/512/ios7-loop.png | Bin 0 -> 4270 bytes .../ionicons-2.0.1/png/512/ios7-medkit-outline.png | Bin 0 -> 1386 bytes .../ionicons-2.0.1/png/512/ios7-medkit.png | Bin 0 -> 1373 bytes .../ionicons-2.0.1/png/512/ios7-mic-off.png | Bin 0 -> 7597 bytes .../ionicons-2.0.1/png/512/ios7-mic-outline.png | Bin 0 -> 3550 bytes .../external/ionicons-2.0.1/png/512/ios7-mic.png | Bin 0 -> 3878 bytes .../ionicons-2.0.1/png/512/ios7-minus-empty.png | Bin 0 -> 153 bytes .../ionicons-2.0.1/png/512/ios7-minus-outline.png | Bin 0 -> 4137 bytes .../external/ionicons-2.0.1/png/512/ios7-minus.png | Bin 0 -> 2520 bytes .../png/512/ios7-monitor-outline.png | Bin 0 -> 225 bytes .../ionicons-2.0.1/png/512/ios7-monitor.png | Bin 0 -> 230 bytes .../ionicons-2.0.1/png/512/ios7-moon-outline.png | Bin 0 -> 2566 bytes .../external/ionicons-2.0.1/png/512/ios7-moon.png | Bin 0 -> 1784 bytes .../ionicons-2.0.1/png/512/ios7-more-outline.png | Bin 0 -> 1598 bytes .../external/ionicons-2.0.1/png/512/ios7-more.png | Bin 0 -> 1700 bytes .../ionicons-2.0.1/png/512/ios7-musical-note.png | Bin 0 -> 1521 bytes .../ionicons-2.0.1/png/512/ios7-musical-notes.png | Bin 0 -> 2124 bytes .../png/512/ios7-navigate-outline.png | Bin 0 -> 4901 bytes .../ionicons-2.0.1/png/512/ios7-navigate.png | Bin 0 -> 3333 bytes .../ionicons-2.0.1/png/512/ios7-paper-outline.png | Bin 0 -> 1361 bytes .../external/ionicons-2.0.1/png/512/ios7-paper.png | Bin 0 -> 1197 bytes .../png/512/ios7-paperplane-outline.png | Bin 0 -> 2952 bytes .../ionicons-2.0.1/png/512/ios7-paperplane.png | Bin 0 -> 4805 bytes .../png/512/ios7-partlysunny-outline.png | Bin 0 -> 4823 bytes .../ionicons-2.0.1/png/512/ios7-partlysunny.png | Bin 0 -> 4052 bytes .../ionicons-2.0.1/png/512/ios7-pause-outline.png | Bin 0 -> 227 bytes .../external/ionicons-2.0.1/png/512/ios7-pause.png | Bin 0 -> 213 bytes .../ionicons-2.0.1/png/512/ios7-paw-outline.png | Bin 0 -> 6318 bytes .../external/ionicons-2.0.1/png/512/ios7-paw.png | Bin 0 -> 4119 bytes .../ionicons-2.0.1/png/512/ios7-people-outline.png | Bin 0 -> 5295 bytes .../ionicons-2.0.1/png/512/ios7-people.png | Bin 0 -> 3439 bytes .../ionicons-2.0.1/png/512/ios7-person-outline.png | Bin 0 -> 3189 bytes .../ionicons-2.0.1/png/512/ios7-person.png | Bin 0 -> 2046 bytes .../png/512/ios7-personadd-outline.png | Bin 0 -> 3246 bytes .../ionicons-2.0.1/png/512/ios7-personadd.png | Bin 0 -> 2110 bytes .../ionicons-2.0.1/png/512/ios7-photos-outline.png | Bin 0 -> 234 bytes .../ionicons-2.0.1/png/512/ios7-photos.png | Bin 0 -> 226 bytes .../ionicons-2.0.1/png/512/ios7-pie-outline.png | Bin 0 -> 4549 bytes .../external/ionicons-2.0.1/png/512/ios7-pie.png | Bin 0 -> 3646 bytes .../ionicons-2.0.1/png/512/ios7-play-outline.png | Bin 0 -> 1474 bytes .../external/ionicons-2.0.1/png/512/ios7-play.png | Bin 0 -> 1216 bytes .../ionicons-2.0.1/png/512/ios7-plus-empty.png | Bin 0 -> 204 bytes .../ionicons-2.0.1/png/512/ios7-plus-outline.png | Bin 0 -> 4415 bytes .../external/ionicons-2.0.1/png/512/ios7-plus.png | Bin 0 -> 2970 bytes .../png/512/ios7-pricetag-outline.png | Bin 0 -> 3007 bytes .../ionicons-2.0.1/png/512/ios7-pricetag.png | Bin 0 -> 2593 bytes .../png/512/ios7-pricetags-outline.png | Bin 0 -> 3563 bytes .../ionicons-2.0.1/png/512/ios7-pricetags.png | Bin 0 -> 3219 bytes .../png/512/ios7-printer-outline.png | Bin 0 -> 1764 bytes .../ionicons-2.0.1/png/512/ios7-printer.png | Bin 0 -> 1456 bytes .../ionicons-2.0.1/png/512/ios7-pulse-strong.png | Bin 0 -> 3326 bytes .../external/ionicons-2.0.1/png/512/ios7-pulse.png | Bin 0 -> 2955 bytes .../ionicons-2.0.1/png/512/ios7-rainy-outline.png | Bin 0 -> 3346 bytes .../external/ionicons-2.0.1/png/512/ios7-rainy.png | Bin 0 -> 2567 bytes .../png/512/ios7-recording-outline.png | Bin 0 -> 4926 bytes .../ionicons-2.0.1/png/512/ios7-recording.png | Bin 0 -> 3762 bytes .../ionicons-2.0.1/png/512/ios7-redo-outline.png | Bin 0 -> 3094 bytes .../external/ionicons-2.0.1/png/512/ios7-redo.png | Bin 0 -> 2054 bytes .../ionicons-2.0.1/png/512/ios7-refresh-empty.png | Bin 0 -> 2685 bytes .../png/512/ios7-refresh-outline.png | Bin 0 -> 6021 bytes .../ionicons-2.0.1/png/512/ios7-refresh.png | Bin 0 -> 4579 bytes .../ionicons-2.0.1/png/512/ios7-reload.png | Bin 0 -> 4195 bytes .../png/512/ios7-reverse-camera-outline.png | Bin 0 -> 3404 bytes .../ionicons-2.0.1/png/512/ios7-reverse-camera.png | Bin 0 -> 3019 bytes .../ionicons-2.0.1/png/512/ios7-rewind-outline.png | Bin 0 -> 2898 bytes .../ionicons-2.0.1/png/512/ios7-rewind.png | Bin 0 -> 2362 bytes .../ionicons-2.0.1/png/512/ios7-search-strong.png | Bin 0 -> 3329 bytes .../ionicons-2.0.1/png/512/ios7-search.png | Bin 0 -> 3361 bytes .../png/512/ios7-settings-strong.png | Bin 0 -> 1714 bytes .../ionicons-2.0.1/png/512/ios7-settings.png | Bin 0 -> 2160 bytes .../ionicons-2.0.1/png/512/ios7-shrink.png | Bin 0 -> 490 bytes .../png/512/ios7-skipbackward-outline.png | Bin 0 -> 1890 bytes .../ionicons-2.0.1/png/512/ios7-skipbackward.png | Bin 0 -> 1533 bytes .../png/512/ios7-skipforward-outline.png | Bin 0 -> 1827 bytes .../ionicons-2.0.1/png/512/ios7-skipforward.png | Bin 0 -> 1556 bytes .../external/ionicons-2.0.1/png/512/ios7-snowy.png | Bin 0 -> 3775 bytes .../png/512/ios7-speedometer-outline.png | Bin 0 -> 4678 bytes .../ionicons-2.0.1/png/512/ios7-speedometer.png | Bin 0 -> 5748 bytes .../ionicons-2.0.1/png/512/ios7-star-half.png | Bin 0 -> 3431 bytes .../ionicons-2.0.1/png/512/ios7-star-outline.png | Bin 0 -> 3572 bytes .../external/ionicons-2.0.1/png/512/ios7-star.png | Bin 0 -> 2463 bytes .../png/512/ios7-stopwatch-outline.png | Bin 0 -> 4823 bytes .../ionicons-2.0.1/png/512/ios7-stopwatch.png | Bin 0 -> 3451 bytes .../ionicons-2.0.1/png/512/ios7-sunny-outline.png | Bin 0 -> 2669 bytes .../external/ionicons-2.0.1/png/512/ios7-sunny.png | Bin 0 -> 2506 bytes .../png/512/ios7-telephone-outline.png | Bin 0 -> 3779 bytes .../ionicons-2.0.1/png/512/ios7-telephone.png | Bin 0 -> 2352 bytes .../png/512/ios7-tennisball-outline.png | Bin 0 -> 5535 bytes .../ionicons-2.0.1/png/512/ios7-tennisball.png | Bin 0 -> 6356 bytes .../png/512/ios7-thunderstorm-outline.png | Bin 0 -> 3053 bytes .../ionicons-2.0.1/png/512/ios7-thunderstorm.png | Bin 0 -> 2492 bytes .../ionicons-2.0.1/png/512/ios7-time-outline.png | Bin 0 -> 5875 bytes .../external/ionicons-2.0.1/png/512/ios7-time.png | Bin 0 -> 4136 bytes .../ionicons-2.0.1/png/512/ios7-timer-outline.png | Bin 0 -> 4578 bytes .../external/ionicons-2.0.1/png/512/ios7-timer.png | Bin 0 -> 6013 bytes .../ionicons-2.0.1/png/512/ios7-toggle-outline.png | Bin 0 -> 5660 bytes .../ionicons-2.0.1/png/512/ios7-toggle.png | Bin 0 -> 4825 bytes .../ionicons-2.0.1/png/512/ios7-trash-outline.png | Bin 0 -> 4497 bytes .../external/ionicons-2.0.1/png/512/ios7-trash.png | Bin 0 -> 2760 bytes .../ionicons-2.0.1/png/512/ios7-undo-outline.png | Bin 0 -> 3114 bytes .../external/ionicons-2.0.1/png/512/ios7-undo.png | Bin 0 -> 1954 bytes .../png/512/ios7-unlocked-outline.png | Bin 0 -> 2580 bytes .../ionicons-2.0.1/png/512/ios7-unlocked.png | Bin 0 -> 2605 bytes .../ionicons-2.0.1/png/512/ios7-upload-outline.png | Bin 0 -> 1128 bytes .../ionicons-2.0.1/png/512/ios7-upload.png | Bin 0 -> 1085 bytes .../png/512/ios7-videocam-outline.png | Bin 0 -> 2038 bytes .../ionicons-2.0.1/png/512/ios7-videocam.png | Bin 0 -> 2715 bytes .../ionicons-2.0.1/png/512/ios7-volume-high.png | Bin 0 -> 2977 bytes .../ionicons-2.0.1/png/512/ios7-volume-low.png | Bin 0 -> 956 bytes .../png/512/ios7-wineglass-outline.png | Bin 0 -> 2527 bytes .../ionicons-2.0.1/png/512/ios7-wineglass.png | Bin 0 -> 2013 bytes .../ionicons-2.0.1/png/512/ios7-world-outline.png | Bin 0 -> 7420 bytes .../external/ionicons-2.0.1/png/512/ios7-world.png | Bin 0 -> 10031 bytes .../external/ionicons-2.0.1/png/512/ipad.png | Bin 0 -> 1356 bytes .../external/ionicons-2.0.1/png/512/iphone.png | Bin 0 -> 1651 bytes .../external/ionicons-2.0.1/png/512/ipod.png | Bin 0 -> 3207 bytes .../fusion/external/ionicons-2.0.1/png/512/jet.png | Bin 0 -> 2856 bytes .../fusion/external/ionicons-2.0.1/png/512/key.png | Bin 0 -> 2722 bytes .../external/ionicons-2.0.1/png/512/knife.png | Bin 0 -> 1822 bytes .../external/ionicons-2.0.1/png/512/laptop.png | Bin 0 -> 2474 bytes .../external/ionicons-2.0.1/png/512/leaf.png | Bin 0 -> 3440 bytes .../external/ionicons-2.0.1/png/512/levels.png | Bin 0 -> 2431 bytes .../external/ionicons-2.0.1/png/512/lightbulb.png | Bin 0 -> 2474 bytes .../external/ionicons-2.0.1/png/512/link.png | Bin 0 -> 2306 bytes .../external/ionicons-2.0.1/png/512/load-a.png | Bin 0 -> 3941 bytes .../external/ionicons-2.0.1/png/512/load-b.png | Bin 0 -> 5473 bytes .../external/ionicons-2.0.1/png/512/load-c.png | Bin 0 -> 4337 bytes .../external/ionicons-2.0.1/png/512/load-d.png | Bin 0 -> 6618 bytes .../external/ionicons-2.0.1/png/512/location.png | Bin 0 -> 2739 bytes .../external/ionicons-2.0.1/png/512/locked.png | Bin 0 -> 2494 bytes .../external/ionicons-2.0.1/png/512/log-in.png | Bin 0 -> 1460 bytes .../external/ionicons-2.0.1/png/512/log-out.png | Bin 0 -> 1637 bytes .../external/ionicons-2.0.1/png/512/loop.png | Bin 0 -> 3794 bytes .../external/ionicons-2.0.1/png/512/magnet.png | Bin 0 -> 4495 bytes .../external/ionicons-2.0.1/png/512/male.png | Bin 0 -> 3788 bytes .../fusion/external/ionicons-2.0.1/png/512/man.png | Bin 0 -> 2126 bytes .../fusion/external/ionicons-2.0.1/png/512/map.png | Bin 0 -> 4906 bytes .../external/ionicons-2.0.1/png/512/medkit.png | Bin 0 -> 1605 bytes .../external/ionicons-2.0.1/png/512/merge.png | Bin 0 -> 3879 bytes .../external/ionicons-2.0.1/png/512/mic-a.png | Bin 0 -> 4098 bytes .../external/ionicons-2.0.1/png/512/mic-b.png | Bin 0 -> 2576 bytes .../external/ionicons-2.0.1/png/512/mic-c.png | Bin 0 -> 1726 bytes .../ionicons-2.0.1/png/512/minus-circled.png | Bin 0 -> 2655 bytes .../ionicons-2.0.1/png/512/minus-round.png | Bin 0 -> 937 bytes .../external/ionicons-2.0.1/png/512/minus.png | Bin 0 -> 160 bytes .../external/ionicons-2.0.1/png/512/model-s.png | Bin 0 -> 4262 bytes .../external/ionicons-2.0.1/png/512/monitor.png | Bin 0 -> 1469 bytes .../external/ionicons-2.0.1/png/512/more.png | Bin 0 -> 3357 bytes .../external/ionicons-2.0.1/png/512/mouse.png | Bin 0 -> 2891 bytes .../external/ionicons-2.0.1/png/512/music-note.png | Bin 0 -> 2519 bytes .../ionicons-2.0.1/png/512/navicon-round.png | Bin 0 -> 1628 bytes .../external/ionicons-2.0.1/png/512/navicon.png | Bin 0 -> 175 bytes .../external/ionicons-2.0.1/png/512/navigate.png | Bin 0 -> 1693 bytes .../external/ionicons-2.0.1/png/512/network.png | Bin 0 -> 3041 bytes .../external/ionicons-2.0.1/png/512/no-smoking.png | Bin 0 -> 5816 bytes .../external/ionicons-2.0.1/png/512/nuclear.png | Bin 0 -> 3618 bytes .../external/ionicons-2.0.1/png/512/outlet.png | Bin 0 -> 2882 bytes .../ionicons-2.0.1/png/512/paper-airplane.png | Bin 0 -> 3678 bytes .../external/ionicons-2.0.1/png/512/paperclip.png | Bin 0 -> 2710 bytes .../external/ionicons-2.0.1/png/512/pause.png | Bin 0 -> 1340 bytes .../external/ionicons-2.0.1/png/512/person-add.png | Bin 0 -> 2410 bytes .../ionicons-2.0.1/png/512/person-stalker.png | Bin 0 -> 3272 bytes .../external/ionicons-2.0.1/png/512/person.png | Bin 0 -> 2258 bytes .../external/ionicons-2.0.1/png/512/pie-graph.png | Bin 0 -> 3608 bytes .../fusion/external/ionicons-2.0.1/png/512/pin.png | Bin 0 -> 2270 bytes .../external/ionicons-2.0.1/png/512/pinpoint.png | Bin 0 -> 4799 bytes .../external/ionicons-2.0.1/png/512/pizza.png | Bin 0 -> 4548 bytes .../external/ionicons-2.0.1/png/512/plane.png | Bin 0 -> 3218 bytes .../external/ionicons-2.0.1/png/512/planet.png | Bin 0 -> 4319 bytes .../external/ionicons-2.0.1/png/512/play.png | Bin 0 -> 1787 bytes .../ionicons-2.0.1/png/512/playstation.png | Bin 0 -> 3275 bytes .../ionicons-2.0.1/png/512/plus-circled.png | Bin 0 -> 3114 bytes .../external/ionicons-2.0.1/png/512/plus-round.png | Bin 0 -> 1567 bytes .../external/ionicons-2.0.1/png/512/plus.png | Bin 0 -> 223 bytes .../external/ionicons-2.0.1/png/512/podium.png | Bin 0 -> 209 bytes .../external/ionicons-2.0.1/png/512/pound.png | Bin 0 -> 2383 bytes .../external/ionicons-2.0.1/png/512/power.png | Bin 0 -> 4727 bytes .../external/ionicons-2.0.1/png/512/pricetag.png | Bin 0 -> 2457 bytes .../external/ionicons-2.0.1/png/512/pricetags.png | Bin 0 -> 2906 bytes .../external/ionicons-2.0.1/png/512/printer.png | Bin 0 -> 1869 bytes .../ionicons-2.0.1/png/512/pull-request.png | Bin 0 -> 3613 bytes .../external/ionicons-2.0.1/png/512/qr-scanner.png | Bin 0 -> 1842 bytes .../external/ionicons-2.0.1/png/512/quote.png | Bin 0 -> 1743 bytes .../ionicons-2.0.1/png/512/radio-waves.png | Bin 0 -> 4978 bytes .../external/ionicons-2.0.1/png/512/record.png | Bin 0 -> 3779 bytes .../external/ionicons-2.0.1/png/512/refresh.png | Bin 0 -> 3582 bytes .../external/ionicons-2.0.1/png/512/reply-all.png | Bin 0 -> 3033 bytes .../external/ionicons-2.0.1/png/512/reply.png | Bin 0 -> 2131 bytes .../external/ionicons-2.0.1/png/512/ribbon-a.png | Bin 0 -> 6449 bytes .../external/ionicons-2.0.1/png/512/ribbon-b.png | Bin 0 -> 5913 bytes .../fusion/external/ionicons-2.0.1/png/512/sad.png | Bin 0 -> 5517 bytes .../external/ionicons-2.0.1/png/512/scissors.png | Bin 0 -> 5061 bytes .../external/ionicons-2.0.1/png/512/search.png | Bin 0 -> 3229 bytes .../external/ionicons-2.0.1/png/512/settings.png | Bin 0 -> 4141 bytes .../external/ionicons-2.0.1/png/512/share.png | Bin 0 -> 2616 bytes .../external/ionicons-2.0.1/png/512/shuffle.png | Bin 0 -> 3420 bytes .../ionicons-2.0.1/png/512/skip-backward.png | Bin 0 -> 2421 bytes .../ionicons-2.0.1/png/512/skip-forward.png | Bin 0 -> 2402 bytes .../png/512/social-android-outline.png | Bin 0 -> 3772 bytes .../ionicons-2.0.1/png/512/social-android.png | Bin 0 -> 2784 bytes .../png/512/social-apple-outline.png | Bin 0 -> 4104 bytes .../ionicons-2.0.1/png/512/social-apple.png | Bin 0 -> 2647 bytes .../png/512/social-bitcoin-outline.png | Bin 0 -> 3790 bytes .../ionicons-2.0.1/png/512/social-bitcoin.png | Bin 0 -> 2424 bytes .../png/512/social-buffer-outline.png | Bin 0 -> 3913 bytes .../ionicons-2.0.1/png/512/social-buffer.png | Bin 0 -> 4687 bytes .../png/512/social-designernews-outline.png | Bin 0 -> 4754 bytes .../ionicons-2.0.1/png/512/social-designernews.png | Bin 0 -> 4242 bytes .../png/512/social-dribbble-outline.png | Bin 0 -> 5588 bytes .../ionicons-2.0.1/png/512/social-dribbble.png | Bin 0 -> 6983 bytes .../png/512/social-dropbox-outline.png | Bin 0 -> 5113 bytes .../ionicons-2.0.1/png/512/social-dropbox.png | Bin 0 -> 6161 bytes .../png/512/social-facebook-outline.png | Bin 0 -> 1788 bytes .../ionicons-2.0.1/png/512/social-facebook.png | Bin 0 -> 1402 bytes .../png/512/social-foursquare-outline.png | Bin 0 -> 3364 bytes .../ionicons-2.0.1/png/512/social-foursquare.png | Bin 0 -> 3021 bytes .../png/512/social-freebsd-devil.png | Bin 0 -> 5300 bytes .../png/512/social-github-outline.png | Bin 0 -> 7475 bytes .../ionicons-2.0.1/png/512/social-github.png | Bin 0 -> 4561 bytes .../png/512/social-google-outline.png | Bin 0 -> 3890 bytes .../ionicons-2.0.1/png/512/social-google.png | Bin 0 -> 3682 bytes .../png/512/social-googleplus-outline.png | Bin 0 -> 4071 bytes .../ionicons-2.0.1/png/512/social-googleplus.png | Bin 0 -> 3888 bytes .../png/512/social-hackernews-outline.png | Bin 0 -> 1994 bytes .../ionicons-2.0.1/png/512/social-hackernews.png | Bin 0 -> 1905 bytes .../png/512/social-instagram-outline.png | Bin 0 -> 3317 bytes .../ionicons-2.0.1/png/512/social-instagram.png | Bin 0 -> 4403 bytes .../png/512/social-linkedin-outline.png | Bin 0 -> 2370 bytes .../ionicons-2.0.1/png/512/social-linkedin.png | Bin 0 -> 2275 bytes .../png/512/social-pinterest-outline.png | Bin 0 -> 6933 bytes .../ionicons-2.0.1/png/512/social-pinterest.png | Bin 0 -> 5532 bytes .../png/512/social-reddit-outline.png | Bin 0 -> 6414 bytes .../ionicons-2.0.1/png/512/social-reddit.png | Bin 0 -> 4498 bytes .../ionicons-2.0.1/png/512/social-rss-outline.png | Bin 0 -> 5945 bytes .../external/ionicons-2.0.1/png/512/social-rss.png | Bin 0 -> 4789 bytes .../png/512/social-skype-outline.png | Bin 0 -> 5608 bytes .../ionicons-2.0.1/png/512/social-skype.png | Bin 0 -> 4269 bytes .../png/512/social-tumblr-outline.png | Bin 0 -> 2725 bytes .../ionicons-2.0.1/png/512/social-tumblr.png | Bin 0 -> 1946 bytes .../external/ionicons-2.0.1/png/512/social-tux.png | Bin 0 -> 7103 bytes .../png/512/social-twitter-outline.png | Bin 0 -> 5569 bytes .../ionicons-2.0.1/png/512/social-twitter.png | Bin 0 -> 3405 bytes .../ionicons-2.0.1/png/512/social-usd-outline.png | Bin 0 -> 5744 bytes .../external/ionicons-2.0.1/png/512/social-usd.png | Bin 0 -> 3446 bytes .../png/512/social-vimeo-outline.png | Bin 0 -> 5525 bytes .../ionicons-2.0.1/png/512/social-vimeo.png | Bin 0 -> 3456 bytes .../png/512/social-windows-outline.png | Bin 0 -> 1775 bytes .../ionicons-2.0.1/png/512/social-windows.png | Bin 0 -> 2550 bytes .../png/512/social-wordpress-outline.png | Bin 0 -> 6418 bytes .../ionicons-2.0.1/png/512/social-wordpress.png | Bin 0 -> 5465 bytes .../png/512/social-yahoo-outline.png | Bin 0 -> 2119 bytes .../ionicons-2.0.1/png/512/social-yahoo.png | Bin 0 -> 1729 bytes .../png/512/social-youtube-outline.png | Bin 0 -> 4655 bytes .../ionicons-2.0.1/png/512/social-youtube.png | Bin 0 -> 2511 bytes .../ionicons-2.0.1/png/512/speakerphone.png | Bin 0 -> 4310 bytes .../ionicons-2.0.1/png/512/speedometer.png | Bin 0 -> 4238 bytes .../external/ionicons-2.0.1/png/512/spoon.png | Bin 0 -> 2306 bytes .../external/ionicons-2.0.1/png/512/star.png | Bin 0 -> 2195 bytes .../external/ionicons-2.0.1/png/512/stats-bars.png | Bin 0 -> 218 bytes .../external/ionicons-2.0.1/png/512/steam.png | Bin 0 -> 3875 bytes .../external/ionicons-2.0.1/png/512/stop.png | Bin 0 -> 1090 bytes .../ionicons-2.0.1/png/512/thermometer.png | Bin 0 -> 1980 bytes .../external/ionicons-2.0.1/png/512/thumbsdown.png | Bin 0 -> 2288 bytes .../external/ionicons-2.0.1/png/512/thumbsup.png | Bin 0 -> 2356 bytes .../ionicons-2.0.1/png/512/toggle-filled.png | Bin 0 -> 3194 bytes .../external/ionicons-2.0.1/png/512/toggle.png | Bin 0 -> 3599 bytes .../external/ionicons-2.0.1/png/512/trash-a.png | Bin 0 -> 2752 bytes .../external/ionicons-2.0.1/png/512/trash-b.png | Bin 0 -> 1882 bytes .../external/ionicons-2.0.1/png/512/trophy.png | Bin 0 -> 3579 bytes .../external/ionicons-2.0.1/png/512/umbrella.png | Bin 0 -> 3416 bytes .../external/ionicons-2.0.1/png/512/university.png | Bin 0 -> 3167 bytes .../external/ionicons-2.0.1/png/512/unlocked.png | Bin 0 -> 2412 bytes .../external/ionicons-2.0.1/png/512/upload.png | Bin 0 -> 2480 bytes .../fusion/external/ionicons-2.0.1/png/512/usb.png | Bin 0 -> 3950 bytes .../ionicons-2.0.1/png/512/videocamera.png | Bin 0 -> 2381 bytes .../ionicons-2.0.1/png/512/volume-high.png | Bin 0 -> 4334 bytes .../external/ionicons-2.0.1/png/512/volume-low.png | Bin 0 -> 2136 bytes .../ionicons-2.0.1/png/512/volume-medium.png | Bin 0 -> 3174 bytes .../ionicons-2.0.1/png/512/volume-mute.png | Bin 0 -> 4803 bytes .../external/ionicons-2.0.1/png/512/wand.png | Bin 0 -> 1933 bytes .../external/ionicons-2.0.1/png/512/waterdrop.png | Bin 0 -> 3169 bytes .../external/ionicons-2.0.1/png/512/wifi.png | Bin 0 -> 3037 bytes .../external/ionicons-2.0.1/png/512/wineglass.png | Bin 0 -> 3734 bytes .../external/ionicons-2.0.1/png/512/woman.png | Bin 0 -> 3592 bytes .../external/ionicons-2.0.1/png/512/wrench.png | Bin 0 -> 2866 bytes .../external/ionicons-2.0.1/png/512/xbox.png | Bin 0 -> 4958 bytes .../app/fusion/external/ionicons-2.0.1/readme.md | 60 + .../ionicons-2.0.1/scss/_ionicons-font.scss | 27 + .../ionicons-2.0.1/scss/_ionicons-icons.scss | 1473 + .../ionicons-2.0.1/scss/_ionicons-variables.scss | 741 + .../external/ionicons-2.0.1/scss/ionicons.scss | 15 + .../external/ionicons-2.0.1/src/alert-circled.svg | 11 + .../fusion/external/ionicons-2.0.1/src/alert.svg | 9 + .../ionicons-2.0.1/src/android-add-circle.svg | 12 + .../external/ionicons-2.0.1/src/android-add.svg | 11 + .../ionicons-2.0.1/src/android-alarm-clock.svg | 15 + .../external/ionicons-2.0.1/src/android-alert.svg | 12 + .../external/ionicons-2.0.1/src/android-apps.svg | 12 + .../ionicons-2.0.1/src/android-archive.svg | 12 + .../ionicons-2.0.1/src/android-arrow-back.svg | 11 + .../ionicons-2.0.1/src/android-arrow-down.svg | 11 + .../src/android-arrow-dropdown-circle.svg | 10 + .../ionicons-2.0.1/src/android-arrow-dropdown.svg | 9 + .../src/android-arrow-dropleft-circle.svg | 10 + .../ionicons-2.0.1/src/android-arrow-dropleft.svg | 9 + .../src/android-arrow-dropright-circle.svg | 10 + .../ionicons-2.0.1/src/android-arrow-dropright.svg | 9 + .../src/android-arrow-dropup-circle.svg | 10 + .../ionicons-2.0.1/src/android-arrow-dropup.svg | 9 + .../ionicons-2.0.1/src/android-arrow-forward.svg | 11 + .../ionicons-2.0.1/src/android-arrow-up.svg | 11 + .../external/ionicons-2.0.1/src/android-attach.svg | 15 + .../external/ionicons-2.0.1/src/android-bar.svg | 12 + .../ionicons-2.0.1/src/android-bicycle.svg | 19 + .../external/ionicons-2.0.1/src/android-boat.svg | 16 + .../ionicons-2.0.1/src/android-bookmark.svg | 7 + .../external/ionicons-2.0.1/src/android-bulb.svg | 18 + .../external/ionicons-2.0.1/src/android-bus.svg | 18 + .../ionicons-2.0.1/src/android-calendar.svg | 11 + .../external/ionicons-2.0.1/src/android-call.svg | 10 + .../external/ionicons-2.0.1/src/android-camera.svg | 12 + .../external/ionicons-2.0.1/src/android-cancel.svg | 11 + .../external/ionicons-2.0.1/src/android-car.svg | 15 + .../external/ionicons-2.0.1/src/android-cart.svg | 14 + .../external/ionicons-2.0.1/src/android-chat.svg | 12 + .../ionicons-2.0.1/src/android-checkbox-blank.svg | 12 + .../src/android-checkbox-outline-blank.svg | 13 + .../src/android-checkbox-outline.svg | 13 + .../ionicons-2.0.1/src/android-checkbox.svg | 13 + .../src/android-checkmark-circle.svg | 9 + .../ionicons-2.0.1/src/android-clipboard.svg | 10 + .../external/ionicons-2.0.1/src/android-close.svg | 12 + .../ionicons-2.0.1/src/android-cloud-circle.svg | 16 + .../ionicons-2.0.1/src/android-cloud-done.svg | 12 + .../ionicons-2.0.1/src/android-cloud-outline.svg | 16 + .../external/ionicons-2.0.1/src/android-cloud.svg | 9 + .../ionicons-2.0.1/src/android-color-palette.svg | 17 + .../ionicons-2.0.1/src/android-compass.svg | 9 + .../ionicons-2.0.1/src/android-contact.svg | 15 + .../ionicons-2.0.1/src/android-contacts.svg | 26 + .../ionicons-2.0.1/src/android-contract.svg | 12 + .../external/ionicons-2.0.1/src/android-create.svg | 13 + .../external/ionicons-2.0.1/src/android-delete.svg | 10 + .../ionicons-2.0.1/src/android-desktop.svg | 13 + .../ionicons-2.0.1/src/android-document.svg | 10 + .../ionicons-2.0.1/src/android-done-all.svg | 13 + .../external/ionicons-2.0.1/src/android-done.svg | 13 + .../ionicons-2.0.1/src/android-download.svg | 9 + .../external/ionicons-2.0.1/src/android-drafts.svg | 15 + .../external/ionicons-2.0.1/src/android-exit.svg | 9 + .../external/ionicons-2.0.1/src/android-expand.svg | 12 + .../src/android-favorite-outline.svg | 13 + .../ionicons-2.0.1/src/android-favorite.svg | 11 + .../external/ionicons-2.0.1/src/android-film.svg | 9 + .../ionicons-2.0.1/src/android-folder-open.svg | 10 + .../external/ionicons-2.0.1/src/android-folder.svg | 14 + .../external/ionicons-2.0.1/src/android-funnel.svg | 7 + .../external/ionicons-2.0.1/src/android-globe.svg | 24 + .../external/ionicons-2.0.1/src/android-hand.svg | 15 + .../ionicons-2.0.1/src/android-hangout.svg | 9 + .../external/ionicons-2.0.1/src/android-happy.svg | 12 + .../external/ionicons-2.0.1/src/android-home.svg | 9 + .../external/ionicons-2.0.1/src/android-image.svg | 13 + .../external/ionicons-2.0.1/src/android-laptop.svg | 14 + .../external/ionicons-2.0.1/src/android-list.svg | 10 + .../external/ionicons-2.0.1/src/android-locate.svg | 16 + .../external/ionicons-2.0.1/src/android-lock.svg | 14 + .../external/ionicons-2.0.1/src/android-mail.svg | 13 + .../external/ionicons-2.0.1/src/android-map.svg | 16 + .../external/ionicons-2.0.1/src/android-menu.svg | 11 + .../ionicons-2.0.1/src/android-microphone-off.svg | 17 + .../ionicons-2.0.1/src/android-microphone.svg | 12 + .../ionicons-2.0.1/src/android-more-horizontal.svg | 9 + .../ionicons-2.0.1/src/android-more-vertical.svg | 9 + .../ionicons-2.0.1/src/android-navigate.svg | 11 + .../src/android-notifications-none.svg | 11 + .../src/android-notifications-off.svg | 13 + .../ionicons-2.0.1/src/android-notifications.svg | 9 + .../external/ionicons-2.0.1/src/android-open.svg | 9 + .../ionicons-2.0.1/src/android-options.svg | 26 + .../external/ionicons-2.0.1/src/android-people.svg | 11 + .../ionicons-2.0.1/src/android-person-add.svg | 17 + .../external/ionicons-2.0.1/src/android-person.svg | 10 + .../ionicons-2.0.1/src/android-phone-landscape.svg | 12 + .../ionicons-2.0.1/src/android-phone-portrait.svg | 12 + .../external/ionicons-2.0.1/src/android-pin.svg | 11 + .../external/ionicons-2.0.1/src/android-plane.svg | 12 + .../ionicons-2.0.1/src/android-playstore.svg | 11 + .../external/ionicons-2.0.1/src/android-print.svg | 10 + .../src/android-radio-button-off.svg | 12 + .../ionicons-2.0.1/src/android-radio-button-on.svg | 13 + .../ionicons-2.0.1/src/android-refresh.svg | 11 + .../ionicons-2.0.1/src/android-remove-circle.svg | 10 + .../external/ionicons-2.0.1/src/android-remove.svg | 7 + .../ionicons-2.0.1/src/android-restaurant.svg | 17 + .../external/ionicons-2.0.1/src/android-sad.svg | 16 + .../external/ionicons-2.0.1/src/android-search.svg | 19 + .../external/ionicons-2.0.1/src/android-send.svg | 7 + .../ionicons-2.0.1/src/android-settings.svg | 19 + .../ionicons-2.0.1/src/android-share-alt.svg | 16 + .../external/ionicons-2.0.1/src/android-share.svg | 12 + .../ionicons-2.0.1/src/android-star-half.svg | 9 + .../ionicons-2.0.1/src/android-star-outline.svg | 10 + .../external/ionicons-2.0.1/src/android-star.svg | 10 + .../ionicons-2.0.1/src/android-stopwatch.svg | 21 + .../external/ionicons-2.0.1/src/android-subway.svg | 13 + .../external/ionicons-2.0.1/src/android-sunny.svg | 18 + .../external/ionicons-2.0.1/src/android-sync.svg | 10 + .../ionicons-2.0.1/src/android-textsms.svg | 10 + .../external/ionicons-2.0.1/src/android-time.svg | 15 + .../external/ionicons-2.0.1/src/android-train.svg | 15 + .../external/ionicons-2.0.1/src/android-unlock.svg | 10 + .../external/ionicons-2.0.1/src/android-upload.svg | 9 + .../ionicons-2.0.1/src/android-volume-down.svg | 8 + .../ionicons-2.0.1/src/android-volume-mute.svg | 7 + .../ionicons-2.0.1/src/android-volume-off.svg | 15 + .../ionicons-2.0.1/src/android-volume-up.svg | 9 + .../external/ionicons-2.0.1/src/android-walk.svg | 12 + .../ionicons-2.0.1/src/android-warning.svg | 11 + .../external/ionicons-2.0.1/src/android-watch.svg | 15 + .../external/ionicons-2.0.1/src/android-wifi.svg | 14 + .../external/ionicons-2.0.1/src/aperture.svg | 20 + .../fusion/external/ionicons-2.0.1/src/archive.svg | 12 + .../external/ionicons-2.0.1/src/arrow-down-a.svg | 7 + .../external/ionicons-2.0.1/src/arrow-down-b.svg | 8 + .../external/ionicons-2.0.1/src/arrow-down-c.svg | 9 + .../external/ionicons-2.0.1/src/arrow-expand.svg | 12 + .../ionicons-2.0.1/src/arrow-graph-down-left.svg | 7 + .../ionicons-2.0.1/src/arrow-graph-down-right.svg | 7 + .../ionicons-2.0.1/src/arrow-graph-up-left.svg | 7 + .../ionicons-2.0.1/src/arrow-graph-up-right.svg | 7 + .../external/ionicons-2.0.1/src/arrow-left-a.svg | 7 + .../external/ionicons-2.0.1/src/arrow-left-b.svg | 8 + .../external/ionicons-2.0.1/src/arrow-left-c.svg | 9 + .../external/ionicons-2.0.1/src/arrow-move.svg | 8 + .../external/ionicons-2.0.1/src/arrow-resize.svg | 8 + .../ionicons-2.0.1/src/arrow-return-left.svg | 8 + .../ionicons-2.0.1/src/arrow-return-right.svg | 8 + .../external/ionicons-2.0.1/src/arrow-right-a.svg | 7 + .../external/ionicons-2.0.1/src/arrow-right-b.svg | 8 + .../external/ionicons-2.0.1/src/arrow-right-c.svg | 9 + .../external/ionicons-2.0.1/src/arrow-shrink.svg | 12 + .../external/ionicons-2.0.1/src/arrow-swap.svg | 10 + .../external/ionicons-2.0.1/src/arrow-up-a.svg | 7 + .../external/ionicons-2.0.1/src/arrow-up-b.svg | 8 + .../external/ionicons-2.0.1/src/arrow-up-c.svg | 9 + .../external/ionicons-2.0.1/src/asterisk.svg | 8 + .../app/fusion/external/ionicons-2.0.1/src/at.svg | 25 + .../ionicons-2.0.1/src/backspace-outline.svg | 21 + .../external/ionicons-2.0.1/src/backspace.svg | 17 + .../app/fusion/external/ionicons-2.0.1/src/bag.svg | 10 + .../ionicons-2.0.1/src/battery-charging.svg | 9 + .../external/ionicons-2.0.1/src/battery-empty.svg | 8 + .../external/ionicons-2.0.1/src/battery-full.svg | 8 + .../external/ionicons-2.0.1/src/battery-half.svg | 9 + .../external/ionicons-2.0.1/src/battery-low.svg | 9 + .../fusion/external/ionicons-2.0.1/src/beaker.svg | 20 + .../fusion/external/ionicons-2.0.1/src/beer.svg | 28 + .../external/ionicons-2.0.1/src/bluetooth.svg | 18 + .../fusion/external/ionicons-2.0.1/src/bonfire.svg | 32 + .../external/ionicons-2.0.1/src/bookmark.svg | 10 + .../fusion/external/ionicons-2.0.1/src/bowtie.svg | 22 + .../external/ionicons-2.0.1/src/briefcase.svg | 12 + .../app/fusion/external/ionicons-2.0.1/src/bug.svg | 30 + .../external/ionicons-2.0.1/src/calculator.svg | 10 + .../external/ionicons-2.0.1/src/calendar.svg | 12 + .../fusion/external/ionicons-2.0.1/src/camera.svg | 15 + .../fusion/external/ionicons-2.0.1/src/card.svg | 14 + .../fusion/external/ionicons-2.0.1/src/cash.svg | 31 + .../ionicons-2.0.1/src/chatbox-working.svg | 11 + .../fusion/external/ionicons-2.0.1/src/chatbox.svg | 8 + .../external/ionicons-2.0.1/src/chatboxes.svg | 12 + .../ionicons-2.0.1/src/chatbubble-working.svg | 12 + .../external/ionicons-2.0.1/src/chatbubble.svg | 9 + .../external/ionicons-2.0.1/src/chatbubbles.svg | 16 + .../ionicons-2.0.1/src/checkmark-circled.svg | 13 + .../ionicons-2.0.1/src/checkmark-round.svg | 9 + .../external/ionicons-2.0.1/src/checkmark.svg | 10 + .../external/ionicons-2.0.1/src/chevron-down.svg | 9 + .../external/ionicons-2.0.1/src/chevron-left.svg | 9 + .../external/ionicons-2.0.1/src/chevron-right.svg | 9 + .../external/ionicons-2.0.1/src/chevron-up.svg | 9 + .../external/ionicons-2.0.1/src/clipboard.svg | 22 + .../fusion/external/ionicons-2.0.1/src/clock.svg | 21 + .../external/ionicons-2.0.1/src/close-circled.svg | 13 + .../external/ionicons-2.0.1/src/close-round.svg | 9 + .../fusion/external/ionicons-2.0.1/src/close.svg | 10 + .../ionicons-2.0.1/src/closed-captioning.svg | 31 + .../fusion/external/ionicons-2.0.1/src/cloud.svg | 9 + .../external/ionicons-2.0.1/src/code-download.svg | 31 + .../external/ionicons-2.0.1/src/code-working.svg | 21 + .../fusion/external/ionicons-2.0.1/src/code.svg | 14 + .../fusion/external/ionicons-2.0.1/src/coffee.svg | 13 + .../fusion/external/ionicons-2.0.1/src/compass.svg | 16 + .../fusion/external/ionicons-2.0.1/src/compose.svg | 14 + .../ionicons-2.0.1/src/connection-bars.svg | 12 + .../external/ionicons-2.0.1/src/contrast.svg | 9 + .../fusion/external/ionicons-2.0.1/src/crop.svg | 11 + .../fusion/external/ionicons-2.0.1/src/cube.svg | 19 + .../fusion/external/ionicons-2.0.1/src/disc.svg | 13 + .../external/ionicons-2.0.1/src/document-text.svg | 15 + .../external/ionicons-2.0.1/src/document.svg | 10 + .../fusion/external/ionicons-2.0.1/src/drag.svg | 11 + .../fusion/external/ionicons-2.0.1/src/earth.svg | 44 + .../fusion/external/ionicons-2.0.1/src/easel.svg | 15 + .../fusion/external/ionicons-2.0.1/src/edit.svg | 13 + .../app/fusion/external/ionicons-2.0.1/src/egg.svg | 7 + .../fusion/external/ionicons-2.0.1/src/eject.svg | 12 + .../external/ionicons-2.0.1/src/email-unread.svg | 19 + .../fusion/external/ionicons-2.0.1/src/email.svg | 15 + .../src/erlenmeyer-flask-bubbles.svg | 15 + .../ionicons-2.0.1/src/erlenmeyer-flask.svg | 21 + .../external/ionicons-2.0.1/src/eye-disabled.svg | 18 + .../app/fusion/external/ionicons-2.0.1/src/eye.svg | 15 + .../fusion/external/ionicons-2.0.1/src/female.svg | 8 + .../fusion/external/ionicons-2.0.1/src/filing.svg | 12 + .../external/ionicons-2.0.1/src/film-marker.svg | 10 + .../external/ionicons-2.0.1/src/fireball.svg | 16 + .../fusion/external/ionicons-2.0.1/src/flag.svg | 12 + .../fusion/external/ionicons-2.0.1/src/flame.svg | 11 + .../external/ionicons-2.0.1/src/flash-off.svg | 16 + .../fusion/external/ionicons-2.0.1/src/flash.svg | 7 + .../fusion/external/ionicons-2.0.1/src/folder.svg | 14 + .../external/ionicons-2.0.1/src/fork-repo.svg | 20 + .../fusion/external/ionicons-2.0.1/src/fork.svg | 14 + .../fusion/external/ionicons-2.0.1/src/forward.svg | 9 + .../fusion/external/ionicons-2.0.1/src/funnel.svg | 13 + .../fusion/external/ionicons-2.0.1/src/gear-a.svg | 15 + .../fusion/external/ionicons-2.0.1/src/gear-b.svg | 11 + .../fusion/external/ionicons-2.0.1/src/grid.svg | 32 + .../fusion/external/ionicons-2.0.1/src/hammer.svg | 11 + .../external/ionicons-2.0.1/src/happy-outline.svg | 23 + .../fusion/external/ionicons-2.0.1/src/happy.svg | 20 + .../external/ionicons-2.0.1/src/headphone.svg | 15 + .../external/ionicons-2.0.1/src/heart-broken.svg | 17 + .../fusion/external/ionicons-2.0.1/src/heart.svg | 10 + .../external/ionicons-2.0.1/src/help-buoy.svg | 13 + .../external/ionicons-2.0.1/src/help-circled.svg | 15 + .../fusion/external/ionicons-2.0.1/src/help.svg | 14 + .../fusion/external/ionicons-2.0.1/src/home.svg | 9 + .../external/ionicons-2.0.1/src/icecream.svg | 15 + .../fusion/external/ionicons-2.0.1/src/image.svg | 13 + .../fusion/external/ionicons-2.0.1/src/images.svg | 20 + .../ionicons-2.0.1/src/information-circled.svg | 11 + .../external/ionicons-2.0.1/src/information.svg | 10 + .../fusion/external/ionicons-2.0.1/src/ionic.svg | 18 + .../ionicons-2.0.1/src/ios-alarm-outline.svg | 21 + .../external/ionicons-2.0.1/src/ios-alarm.svg | 14 + .../ionicons-2.0.1/src/ios-albums-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-albums.svg | 11 + .../src/ios-americanfootball-outline.svg | 24 + .../ionicons-2.0.1/src/ios-americanfootball.svg | 21 + .../ionicons-2.0.1/src/ios-analytics-outline.svg | 24 + .../external/ionicons-2.0.1/src/ios-analytics.svg | 17 + .../external/ionicons-2.0.1/src/ios-arrow-back.svg | 7 + .../external/ionicons-2.0.1/src/ios-arrow-down.svg | 7 + .../ionicons-2.0.1/src/ios-arrow-forward.svg | 7 + .../external/ionicons-2.0.1/src/ios-arrow-left.svg | 7 + .../ionicons-2.0.1/src/ios-arrow-right.svg | 7 + .../ionicons-2.0.1/src/ios-arrow-thin-down.svg | 9 + .../ionicons-2.0.1/src/ios-arrow-thin-left.svg | 9 + .../ionicons-2.0.1/src/ios-arrow-thin-right.svg | 9 + .../ionicons-2.0.1/src/ios-arrow-thin-up.svg | 9 + .../external/ionicons-2.0.1/src/ios-arrow-up.svg | 7 + .../external/ionicons-2.0.1/src/ios-at-outline.svg | 26 + .../fusion/external/ionicons-2.0.1/src/ios-at.svg | 24 + .../ionicons-2.0.1/src/ios-barcode-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-barcode.svg | 10 + .../ionicons-2.0.1/src/ios-baseball-outline.svg | 35 + .../external/ionicons-2.0.1/src/ios-baseball.svg | 27 + .../ionicons-2.0.1/src/ios-basketball-outline.svg | 25 + .../external/ionicons-2.0.1/src/ios-basketball.svg | 21 + .../ionicons-2.0.1/src/ios-bell-outline.svg | 13 + .../external/ionicons-2.0.1/src/ios-bell.svg | 11 + .../ionicons-2.0.1/src/ios-body-outline.svg | 27 + .../external/ionicons-2.0.1/src/ios-body.svg | 17 + .../ionicons-2.0.1/src/ios-bolt-outline.svg | 8 + .../external/ionicons-2.0.1/src/ios-bolt.svg | 7 + .../ionicons-2.0.1/src/ios-book-outline.svg | 13 + .../external/ionicons-2.0.1/src/ios-book.svg | 12 + .../ionicons-2.0.1/src/ios-bookmarks-outline.svg | 13 + .../external/ionicons-2.0.1/src/ios-bookmarks.svg | 13 + .../ionicons-2.0.1/src/ios-box-outline.svg | 13 + .../fusion/external/ionicons-2.0.1/src/ios-box.svg | 10 + .../ionicons-2.0.1/src/ios-briefcase-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-briefcase.svg | 13 + .../ionicons-2.0.1/src/ios-browsers-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-browsers.svg | 10 + .../ionicons-2.0.1/src/ios-calculator-outline.svg | 19 + .../external/ionicons-2.0.1/src/ios-calculator.svg | 9 + .../ionicons-2.0.1/src/ios-calendar-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-calendar.svg | 12 + .../ionicons-2.0.1/src/ios-camera-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-camera.svg | 13 + .../ionicons-2.0.1/src/ios-cart-outline.svg | 16 + .../external/ionicons-2.0.1/src/ios-cart.svg | 14 + .../ionicons-2.0.1/src/ios-chatboxes-outline.svg | 10 + .../external/ionicons-2.0.1/src/ios-chatboxes.svg | 10 + .../ionicons-2.0.1/src/ios-chatbubble-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-chatbubble.svg | 11 + .../ionicons-2.0.1/src/ios-checkmark-empty.svg | 10 + .../ionicons-2.0.1/src/ios-checkmark-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-checkmark.svg | 10 + .../ionicons-2.0.1/src/ios-circle-filled.svg | 18 + .../ionicons-2.0.1/src/ios-circle-outline.svg | 13 + .../ionicons-2.0.1/src/ios-clock-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-clock.svg | 10 + .../ionicons-2.0.1/src/ios-close-empty.svg | 13 + .../ionicons-2.0.1/src/ios-close-outline.svg | 20 + .../external/ionicons-2.0.1/src/ios-close.svg | 16 + .../src/ios-cloud-download-outline.svg | 19 + .../ionicons-2.0.1/src/ios-cloud-download.svg | 12 + .../ionicons-2.0.1/src/ios-cloud-outline.svg | 12 + .../src/ios-cloud-upload-outline.svg | 20 + .../ionicons-2.0.1/src/ios-cloud-upload.svg | 13 + .../external/ionicons-2.0.1/src/ios-cloud.svg | 9 + .../src/ios-cloudy-night-outline.svg | 24 + .../ionicons-2.0.1/src/ios-cloudy-night.svg | 21 + .../ionicons-2.0.1/src/ios-cloudy-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-cloudy.svg | 14 + .../ionicons-2.0.1/src/ios-cog-outline.svg | 29 + .../fusion/external/ionicons-2.0.1/src/ios-cog.svg | 23 + .../src/ios-color-filter-outline.svg | 25 + .../ionicons-2.0.1/src/ios-color-filter.svg | 29 + .../ionicons-2.0.1/src/ios-color-wand-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-color-wand.svg | 16 + .../ionicons-2.0.1/src/ios-compose-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-compose.svg | 13 + .../ionicons-2.0.1/src/ios-contact-outline.svg | 13 + .../external/ionicons-2.0.1/src/ios-contact.svg | 13 + .../ionicons-2.0.1/src/ios-copy-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-copy.svg | 12 + .../ionicons-2.0.1/src/ios-crop-strong.svg | 12 + .../external/ionicons-2.0.1/src/ios-crop.svg | 12 + .../ionicons-2.0.1/src/ios-download-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-download.svg | 11 + .../external/ionicons-2.0.1/src/ios-drag.svg | 11 + .../ionicons-2.0.1/src/ios-email-outline.svg | 8 + .../external/ionicons-2.0.1/src/ios-email.svg | 11 + .../ionicons-2.0.1/src/ios-eye-outline.svg | 18 + .../fusion/external/ionicons-2.0.1/src/ios-eye.svg | 13 + .../ionicons-2.0.1/src/ios-fastforward-outline.svg | 8 + .../ionicons-2.0.1/src/ios-fastforward.svg | 7 + .../ionicons-2.0.1/src/ios-filing-outline.svg | 9 + .../external/ionicons-2.0.1/src/ios-filing.svg | 11 + .../ionicons-2.0.1/src/ios-film-outline.svg | 9 + .../external/ionicons-2.0.1/src/ios-film.svg | 11 + .../ionicons-2.0.1/src/ios-flag-outline.svg | 13 + .../external/ionicons-2.0.1/src/ios-flag.svg | 11 + .../ionicons-2.0.1/src/ios-flame-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-flame.svg | 11 + .../ionicons-2.0.1/src/ios-flask-outline.svg | 19 + .../external/ionicons-2.0.1/src/ios-flask.svg | 17 + .../ionicons-2.0.1/src/ios-flower-outline.svg | 75 + .../external/ionicons-2.0.1/src/ios-flower.svg | 38 + .../ionicons-2.0.1/src/ios-folder-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-folder.svg | 13 + .../ionicons-2.0.1/src/ios-football-outline.svg | 20 + .../external/ionicons-2.0.1/src/ios-football.svg | 14 + .../src/ios-game-controller-a-outline.svg | 26 + .../ionicons-2.0.1/src/ios-game-controller-a.svg | 19 + .../src/ios-game-controller-b-outline.svg | 35 + .../ionicons-2.0.1/src/ios-game-controller-b.svg | 23 + .../ionicons-2.0.1/src/ios-gear-outline.svg | 40 + .../external/ionicons-2.0.1/src/ios-gear.svg | 17 + .../ionicons-2.0.1/src/ios-glasses-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-glasses.svg | 11 + .../ionicons-2.0.1/src/ios-grid-view-outline.svg | 8 + .../external/ionicons-2.0.1/src/ios-grid-view.svg | 11 + .../ionicons-2.0.1/src/ios-heart-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-heart.svg | 9 + .../external/ionicons-2.0.1/src/ios-help-empty.svg | 12 + .../ionicons-2.0.1/src/ios-help-outline.svg | 22 + .../external/ionicons-2.0.1/src/ios-help.svg | 12 + .../ionicons-2.0.1/src/ios-home-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-home.svg | 10 + .../ionicons-2.0.1/src/ios-infinite-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-infinite.svg | 16 + .../ionicons-2.0.1/src/ios-information-empty.svg | 12 + .../ionicons-2.0.1/src/ios-information-outline.svg | 17 + .../ionicons-2.0.1/src/ios-information.svg | 11 + .../ionicons-2.0.1/src/ios-ionic-outline.svg | 18 + .../ionicons-2.0.1/src/ios-keypad-outline.svg | 28 + .../external/ionicons-2.0.1/src/ios-keypad.svg | 20 + .../ionicons-2.0.1/src/ios-lightbulb-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-lightbulb.svg | 16 + .../ionicons-2.0.1/src/ios-list-outline.svg | 23 + .../external/ionicons-2.0.1/src/ios-list.svg | 11 + .../ionicons-2.0.1/src/ios-location-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-location.svg | 8 + .../ionicons-2.0.1/src/ios-locked-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-locked.svg | 12 + .../ionicons-2.0.1/src/ios-loop-strong.svg | 18 + .../external/ionicons-2.0.1/src/ios-loop.svg | 22 + .../ionicons-2.0.1/src/ios-medical-outline.svg | 10 + .../external/ionicons-2.0.1/src/ios-medical.svg | 8 + .../ionicons-2.0.1/src/ios-medkit-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-medkit.svg | 13 + .../external/ionicons-2.0.1/src/ios-mic-off.svg | 14 + .../ionicons-2.0.1/src/ios-mic-outline.svg | 12 + .../fusion/external/ionicons-2.0.1/src/ios-mic.svg | 12 + .../ionicons-2.0.1/src/ios-minus-empty.svg | 9 + .../ionicons-2.0.1/src/ios-minus-outline.svg | 16 + .../external/ionicons-2.0.1/src/ios-minus.svg | 10 + .../ionicons-2.0.1/src/ios-monitor-outline.svg | 7 + .../external/ionicons-2.0.1/src/ios-monitor.svg | 10 + .../ionicons-2.0.1/src/ios-moon-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-moon.svg | 13 + .../ionicons-2.0.1/src/ios-more-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-more.svg | 11 + .../ionicons-2.0.1/src/ios-musical-note.svg | 9 + .../ionicons-2.0.1/src/ios-musical-notes.svg | 9 + .../ionicons-2.0.1/src/ios-navigate-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-navigate.svg | 10 + .../ionicons-2.0.1/src/ios-nutrition-outline.svg | 29 + .../external/ionicons-2.0.1/src/ios-nutrition.svg | 17 + .../ionicons-2.0.1/src/ios-paper-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-paper.svg | 8 + .../ionicons-2.0.1/src/ios-paperplane-outline.svg | 8 + .../external/ionicons-2.0.1/src/ios-paperplane.svg | 10 + .../ionicons-2.0.1/src/ios-partlysunny-outline.svg | 33 + .../ionicons-2.0.1/src/ios-partlysunny.svg | 28 + .../ionicons-2.0.1/src/ios-pause-outline.svg | 10 + .../external/ionicons-2.0.1/src/ios-pause.svg | 10 + .../ionicons-2.0.1/src/ios-paw-outline.svg | 43 + .../fusion/external/ionicons-2.0.1/src/ios-paw.svg | 26 + .../ionicons-2.0.1/src/ios-people-outline.svg | 44 + .../external/ionicons-2.0.1/src/ios-people.svg | 29 + .../ionicons-2.0.1/src/ios-person-outline.svg | 22 + .../external/ionicons-2.0.1/src/ios-person.svg | 13 + .../ionicons-2.0.1/src/ios-personadd-outline.svg | 25 + .../external/ionicons-2.0.1/src/ios-personadd.svg | 16 + .../ionicons-2.0.1/src/ios-photos-outline.svg | 10 + .../external/ionicons-2.0.1/src/ios-photos.svg | 10 + .../ionicons-2.0.1/src/ios-pie-outline.svg | 16 + .../fusion/external/ionicons-2.0.1/src/ios-pie.svg | 11 + .../ionicons-2.0.1/src/ios-pint-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-pint.svg | 12 + .../ionicons-2.0.1/src/ios-play-outline.svg | 9 + .../external/ionicons-2.0.1/src/ios-play.svg | 9 + .../external/ionicons-2.0.1/src/ios-plus-empty.svg | 9 + .../ionicons-2.0.1/src/ios-plus-outline.svg | 18 + .../external/ionicons-2.0.1/src/ios-plus.svg | 10 + .../ionicons-2.0.1/src/ios-pricetag-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-pricetag.svg | 11 + .../ionicons-2.0.1/src/ios-pricetags-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-pricetags.svg | 16 + .../ionicons-2.0.1/src/ios-printer-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-printer.svg | 17 + .../ionicons-2.0.1/src/ios-pulse-strong.svg | 12 + .../external/ionicons-2.0.1/src/ios-pulse.svg | 12 + .../ionicons-2.0.1/src/ios-rainy-outline.svg | 20 + .../external/ionicons-2.0.1/src/ios-rainy.svg | 17 + .../ionicons-2.0.1/src/ios-recording-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-recording.svg | 14 + .../ionicons-2.0.1/src/ios-redo-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-redo.svg | 10 + .../ionicons-2.0.1/src/ios-refresh-empty.svg | 10 + .../ionicons-2.0.1/src/ios-refresh-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-refresh.svg | 11 + .../external/ionicons-2.0.1/src/ios-reload.svg | 11 + .../src/ios-reverse-camera-outline.svg | 20 + .../ionicons-2.0.1/src/ios-reverse-camera.svg | 15 + .../ionicons-2.0.1/src/ios-rewind-outline.svg | 8 + .../external/ionicons-2.0.1/src/ios-rewind.svg | 7 + .../ionicons-2.0.1/src/ios-rose-outline.svg | 29 + .../external/ionicons-2.0.1/src/ios-rose.svg | 18 + .../ionicons-2.0.1/src/ios-search-strong.svg | 10 + .../external/ionicons-2.0.1/src/ios-search.svg | 10 + .../ionicons-2.0.1/src/ios-settings-strong.svg | 14 + .../external/ionicons-2.0.1/src/ios-settings.svg | 24 + .../ionicons-2.0.1/src/ios-shuffle-strong.svg | 18 + .../external/ionicons-2.0.1/src/ios-shuffle.svg | 20 + .../src/ios-skipbackward-outline.svg | 8 + .../ionicons-2.0.1/src/ios-skipbackward.svg | 7 + .../ionicons-2.0.1/src/ios-skipforward-outline.svg | 8 + .../ionicons-2.0.1/src/ios-skipforward.svg | 7 + .../external/ionicons-2.0.1/src/ios-snowy.svg | 26 + .../ionicons-2.0.1/src/ios-speedometer-outline.svg | 24 + .../ionicons-2.0.1/src/ios-speedometer.svg | 28 + .../external/ionicons-2.0.1/src/ios-star-half.svg | 8 + .../ionicons-2.0.1/src/ios-star-outline.svg | 8 + .../external/ionicons-2.0.1/src/ios-star.svg | 7 + .../ionicons-2.0.1/src/ios-stopwatch-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-stopwatch.svg | 13 + .../ionicons-2.0.1/src/ios-sunny-outline.svg | 27 + .../external/ionicons-2.0.1/src/ios-sunny.svg | 26 + .../ionicons-2.0.1/src/ios-telephone-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-telephone.svg | 12 + .../ionicons-2.0.1/src/ios-tennisball-outline.svg | 19 + .../external/ionicons-2.0.1/src/ios-tennisball.svg | 25 + .../src/ios-thunderstorm-outline.svg | 22 + .../ionicons-2.0.1/src/ios-thunderstorm.svg | 17 + .../ionicons-2.0.1/src/ios-time-outline.svg | 36 + .../external/ionicons-2.0.1/src/ios-time.svg | 27 + .../ionicons-2.0.1/src/ios-timer-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-timer.svg | 12 + .../ionicons-2.0.1/src/ios-toggle-outline.svg | 22 + .../external/ionicons-2.0.1/src/ios-toggle.svg | 16 + .../ionicons-2.0.1/src/ios-trash-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-trash.svg | 12 + .../ionicons-2.0.1/src/ios-undo-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-undo.svg | 10 + .../ionicons-2.0.1/src/ios-unlocked-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-unlocked.svg | 12 + .../ionicons-2.0.1/src/ios-upload-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-upload.svg | 10 + .../ionicons-2.0.1/src/ios-videocam-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-videocam.svg | 11 + .../ionicons-2.0.1/src/ios-volume-high.svg | 19 + .../external/ionicons-2.0.1/src/ios-volume-low.svg | 7 + .../ionicons-2.0.1/src/ios-wineglass-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-wineglass.svg | 11 + .../ionicons-2.0.1/src/ios-world-outline.svg | 22 + .../external/ionicons-2.0.1/src/ios-world.svg | 29 + .../fusion/external/ionicons-2.0.1/src/ipad.svg | 10 + .../fusion/external/ionicons-2.0.1/src/iphone.svg | 13 + .../fusion/external/ionicons-2.0.1/src/ipod.svg | 13 + .../app/fusion/external/ionicons-2.0.1/src/jet.svg | 14 + .../app/fusion/external/ionicons-2.0.1/src/key.svg | 14 + .../fusion/external/ionicons-2.0.1/src/knife.svg | 9 + .../fusion/external/ionicons-2.0.1/src/laptop.svg | 10 + .../fusion/external/ionicons-2.0.1/src/leaf.svg | 12 + .../fusion/external/ionicons-2.0.1/src/levels.svg | 16 + .../external/ionicons-2.0.1/src/lightbulb.svg | 21 + .../fusion/external/ionicons-2.0.1/src/link.svg | 15 + .../fusion/external/ionicons-2.0.1/src/load-a.svg | 17 + .../fusion/external/ionicons-2.0.1/src/load-b.svg | 20 + .../fusion/external/ionicons-2.0.1/src/load-c.svg | 21 + .../fusion/external/ionicons-2.0.1/src/load-d.svg | 28 + .../external/ionicons-2.0.1/src/location.svg | 11 + .../ionicons-2.0.1/src/lock-combination.svg | 28 + .../fusion/external/ionicons-2.0.1/src/locked.svg | 11 + .../fusion/external/ionicons-2.0.1/src/log-in.svg | 14 + .../fusion/external/ionicons-2.0.1/src/log-out.svg | 17 + .../fusion/external/ionicons-2.0.1/src/loop.svg | 14 + .../fusion/external/ionicons-2.0.1/src/magnet.svg | 14 + .../fusion/external/ionicons-2.0.1/src/male.svg | 10 + .../app/fusion/external/ionicons-2.0.1/src/man.svg | 12 + .../app/fusion/external/ionicons-2.0.1/src/map.svg | 30 + .../fusion/external/ionicons-2.0.1/src/medkit.svg | 12 + .../fusion/external/ionicons-2.0.1/src/merge.svg | 13 + .../fusion/external/ionicons-2.0.1/src/mic-a.svg | 15 + .../fusion/external/ionicons-2.0.1/src/mic-b.svg | 17 + .../fusion/external/ionicons-2.0.1/src/mic-c.svg | 8 + .../external/ionicons-2.0.1/src/minus-circled.svg | 9 + .../external/ionicons-2.0.1/src/minus-round.svg | 8 + .../fusion/external/ionicons-2.0.1/src/minus.svg | 7 + .../fusion/external/ionicons-2.0.1/src/model-s.svg | 33 + .../fusion/external/ionicons-2.0.1/src/monitor.svg | 12 + .../fusion/external/ionicons-2.0.1/src/more.svg | 12 + .../fusion/external/ionicons-2.0.1/src/mouse.svg | 24 + .../external/ionicons-2.0.1/src/music-note.svg | 10 + .../external/ionicons-2.0.1/src/navicon-round.svg | 14 + .../fusion/external/ionicons-2.0.1/src/navicon.svg | 11 + .../external/ionicons-2.0.1/src/navigate.svg | 7 + .../fusion/external/ionicons-2.0.1/src/network.svg | 12 + .../external/ionicons-2.0.1/src/no-smoking.svg | 33 + .../fusion/external/ionicons-2.0.1/src/nuclear.svg | 18 + .../fusion/external/ionicons-2.0.1/src/outlet.svg | 16 + .../external/ionicons-2.0.1/src/paintbrush.svg | 18 + .../external/ionicons-2.0.1/src/paintbucket.svg | 12 + .../external/ionicons-2.0.1/src/paper-airplane.svg | 13 + .../external/ionicons-2.0.1/src/paperclip.svg | 13 + .../fusion/external/ionicons-2.0.1/src/pause.svg | 12 + .../external/ionicons-2.0.1/src/person-add.svg | 13 + .../external/ionicons-2.0.1/src/person-stalker.svg | 18 + .../fusion/external/ionicons-2.0.1/src/person.svg | 10 + .../external/ionicons-2.0.1/src/pie-graph.svg | 11 + .../app/fusion/external/ionicons-2.0.1/src/pin.svg | 11 + .../external/ionicons-2.0.1/src/pinpoint.svg | 11 + .../fusion/external/ionicons-2.0.1/src/pizza.svg | 20 + .../fusion/external/ionicons-2.0.1/src/plane.svg | 10 + .../fusion/external/ionicons-2.0.1/src/planet.svg | 21 + .../fusion/external/ionicons-2.0.1/src/play.svg | 8 + .../external/ionicons-2.0.1/src/playstation.svg | 27 + .../external/ionicons-2.0.1/src/plus-circled.svg | 10 + .../external/ionicons-2.0.1/src/plus-round.svg | 9 + .../fusion/external/ionicons-2.0.1/src/plus.svg | 7 + .../fusion/external/ionicons-2.0.1/src/podium.svg | 11 + .../fusion/external/ionicons-2.0.1/src/pound.svg | 11 + .../fusion/external/ionicons-2.0.1/src/power.svg | 15 + .../external/ionicons-2.0.1/src/pricetag.svg | 13 + .../external/ionicons-2.0.1/src/pricetags.svg | 18 + .../fusion/external/ionicons-2.0.1/src/printer.svg | 14 + .../external/ionicons-2.0.1/src/pull-request.svg | 16 + .../external/ionicons-2.0.1/src/qr-scanner.svg | 12 + .../fusion/external/ionicons-2.0.1/src/quote.svg | 16 + .../external/ionicons-2.0.1/src/radio-waves.svg | 25 + .../fusion/external/ionicons-2.0.1/src/record.svg | 7 + .../fusion/external/ionicons-2.0.1/src/refresh.svg | 15 + .../external/ionicons-2.0.1/src/reply-all.svg | 12 + .../fusion/external/ionicons-2.0.1/src/reply.svg | 9 + .../external/ionicons-2.0.1/src/ribbon-a.svg | 14 + .../external/ionicons-2.0.1/src/ribbon-b.svg | 18 + .../external/ionicons-2.0.1/src/sad-outline.svg | 28 + .../app/fusion/external/ionicons-2.0.1/src/sad.svg | 20 + .../external/ionicons-2.0.1/src/scissors.svg | 23 + .../fusion/external/ionicons-2.0.1/src/search.svg | 10 + .../external/ionicons-2.0.1/src/settings.svg | 18 + .../fusion/external/ionicons-2.0.1/src/share.svg | 11 + .../fusion/external/ionicons-2.0.1/src/shuffle.svg | 11 + .../external/ionicons-2.0.1/src/skip-backward.svg | 15 + .../external/ionicons-2.0.1/src/skip-forward.svg | 15 + .../ionicons-2.0.1/src/social-android-outline.svg | 29 + .../external/ionicons-2.0.1/src/social-android.svg | 22 + .../ionicons-2.0.1/src/social-angular-outline.svg | 11 + .../external/ionicons-2.0.1/src/social-angular.svg | 11 + .../ionicons-2.0.1/src/social-apple-outline.svg | 20 + .../external/ionicons-2.0.1/src/social-apple.svg | 14 + .../ionicons-2.0.1/src/social-bitcoin-outline.svg | 27 + .../external/ionicons-2.0.1/src/social-bitcoin.svg | 14 + .../ionicons-2.0.1/src/social-buffer-outline.svg | 24 + .../external/ionicons-2.0.1/src/social-buffer.svg | 18 + .../ionicons-2.0.1/src/social-chrome-outline.svg | 17 + .../external/ionicons-2.0.1/src/social-chrome.svg | 22 + .../ionicons-2.0.1/src/social-codepen-outline.svg | 26 + .../external/ionicons-2.0.1/src/social-codepen.svg | 26 + .../ionicons-2.0.1/src/social-css3-outline.svg | 12 + .../external/ionicons-2.0.1/src/social-css3.svg | 14 + .../src/social-designernews-outline.svg | 18 + .../ionicons-2.0.1/src/social-designernews.svg | 18 + .../ionicons-2.0.1/src/social-dribbble-outline.svg | 15 + .../ionicons-2.0.1/src/social-dribbble.svg | 26 + .../ionicons-2.0.1/src/social-dropbox-outline.svg | 13 + .../external/ionicons-2.0.1/src/social-dropbox.svg | 13 + .../ionicons-2.0.1/src/social-euro-outline.svg | 19 + .../external/ionicons-2.0.1/src/social-euro.svg | 12 + .../ionicons-2.0.1/src/social-facebook-outline.svg | 9 + .../ionicons-2.0.1/src/social-facebook.svg | 8 + .../src/social-foursquare-outline.svg | 22 + .../ionicons-2.0.1/src/social-foursquare.svg | 20 + .../ionicons-2.0.1/src/social-freebsd-devil.svg | 22 + .../ionicons-2.0.1/src/social-github-outline.svg | 24 + .../external/ionicons-2.0.1/src/social-github.svg | 14 + .../ionicons-2.0.1/src/social-google-outline.svg | 19 + .../external/ionicons-2.0.1/src/social-google.svg | 20 + .../src/social-googleplus-outline.svg | 18 + .../ionicons-2.0.1/src/social-googleplus.svg | 17 + .../src/social-hackernews-outline.svg | 12 + .../ionicons-2.0.1/src/social-hackernews.svg | 9 + .../ionicons-2.0.1/src/social-html5-outline.svg | 13 + .../external/ionicons-2.0.1/src/social-html5.svg | 9 + .../src/social-instagram-outline.svg | 12 + .../ionicons-2.0.1/src/social-instagram.svg | 18 + .../src/social-javascript-outline.svg | 27 + .../ionicons-2.0.1/src/social-javascript.svg | 17 + .../ionicons-2.0.1/src/social-linkedin-outline.svg | 22 + .../ionicons-2.0.1/src/social-linkedin.svg | 13 + .../ionicons-2.0.1/src/social-markdown.svg | 14 + .../external/ionicons-2.0.1/src/social-nodejs.svg | 26 + .../external/ionicons-2.0.1/src/social-octocat.svg | 28 + .../src/social-pinterest-outline.svg | 14 + .../ionicons-2.0.1/src/social-pinterest.svg | 15 + .../external/ionicons-2.0.1/src/social-python.svg | 21 + .../ionicons-2.0.1/src/social-reddit-outline.svg | 26 + .../external/ionicons-2.0.1/src/social-reddit.svg | 18 + .../ionicons-2.0.1/src/social-rss-outline.svg | 16 + .../external/ionicons-2.0.1/src/social-rss.svg | 12 + .../external/ionicons-2.0.1/src/social-sass.svg | 35 + .../ionicons-2.0.1/src/social-skype-outline.svg | 26 + .../external/ionicons-2.0.1/src/social-skype.svg | 20 + .../ionicons-2.0.1/src/social-snapchat-outline.svg | 42 + .../ionicons-2.0.1/src/social-snapchat.svg | 31 + .../ionicons-2.0.1/src/social-tumblr-outline.svg | 13 + .../external/ionicons-2.0.1/src/social-tumblr.svg | 10 + .../external/ionicons-2.0.1/src/social-tux.svg | 53 + .../ionicons-2.0.1/src/social-twitch-outline.svg | 13 + .../external/ionicons-2.0.1/src/social-twitch.svg | 9 + .../ionicons-2.0.1/src/social-twitter-outline.svg | 19 + .../external/ionicons-2.0.1/src/social-twitter.svg | 12 + .../ionicons-2.0.1/src/social-usd-outline.svg | 44 + .../external/ionicons-2.0.1/src/social-usd.svg | 24 + .../ionicons-2.0.1/src/social-vimeo-outline.svg | 23 + .../external/ionicons-2.0.1/src/social-vimeo.svg | 18 + .../ionicons-2.0.1/src/social-whatsapp-outline.svg | 25 + .../ionicons-2.0.1/src/social-whatsapp.svg | 18 + .../ionicons-2.0.1/src/social-windows-outline.svg | 17 + .../external/ionicons-2.0.1/src/social-windows.svg | 17 + .../src/social-wordpress-outline.svg | 16 + .../ionicons-2.0.1/src/social-wordpress.svg | 20 + .../ionicons-2.0.1/src/social-yahoo-outline.svg | 10 + .../external/ionicons-2.0.1/src/social-yahoo.svg | 8 + .../ionicons-2.0.1/src/social-yen-outline.svg | 9 + .../external/ionicons-2.0.1/src/social-yen.svg | 8 + .../ionicons-2.0.1/src/social-youtube-outline.svg | 22 + .../external/ionicons-2.0.1/src/social-youtube.svg | 12 + .../ionicons-2.0.1/src/soup-can-outline.svg | 28 + .../external/ionicons-2.0.1/src/soup-can.svg | 16 + .../external/ionicons-2.0.1/src/speakerphone.svg | 19 + .../external/ionicons-2.0.1/src/speedometer.svg | 15 + .../fusion/external/ionicons-2.0.1/src/spoon.svg | 10 + .../fusion/external/ionicons-2.0.1/src/star.svg | 7 + .../external/ionicons-2.0.1/src/stats-bars.svg | 12 + .../fusion/external/ionicons-2.0.1/src/steam.svg | 20 + .../fusion/external/ionicons-2.0.1/src/stop.svg | 8 + .../external/ionicons-2.0.1/src/thermometer.svg | 11 + .../external/ionicons-2.0.1/src/thumbsdown.svg | 13 + .../external/ionicons-2.0.1/src/thumbsup.svg | 13 + .../external/ionicons-2.0.1/src/toggle-filled.svg | 11 + .../fusion/external/ionicons-2.0.1/src/toggle.svg | 12 + .../external/ionicons-2.0.1/src/transgender.svg | 12 + .../fusion/external/ionicons-2.0.1/src/trash-a.svg | 10 + .../fusion/external/ionicons-2.0.1/src/trash-b.svg | 13 + .../fusion/external/ionicons-2.0.1/src/trophy.svg | 16 + .../external/ionicons-2.0.1/src/tshirt-outline.svg | 11 + .../fusion/external/ionicons-2.0.1/src/tshirt.svg | 8 + .../external/ionicons-2.0.1/src/umbrella.svg | 18 + .../external/ionicons-2.0.1/src/university.svg | 11 + .../external/ionicons-2.0.1/src/unlocked.svg | 10 + .../fusion/external/ionicons-2.0.1/src/upload.svg | 9 + .../app/fusion/external/ionicons-2.0.1/src/usb.svg | 22 + .../external/ionicons-2.0.1/src/videocamera.svg | 11 + .../external/ionicons-2.0.1/src/volume-high.svg | 15 + .../external/ionicons-2.0.1/src/volume-low.svg | 11 + .../external/ionicons-2.0.1/src/volume-medium.svg | 13 + .../external/ionicons-2.0.1/src/volume-mute.svg | 14 + .../fusion/external/ionicons-2.0.1/src/wand.svg | 17 + .../external/ionicons-2.0.1/src/waterdrop.svg | 11 + .../fusion/external/ionicons-2.0.1/src/wifi.svg | 16 + .../external/ionicons-2.0.1/src/wineglass.svg | 21 + .../fusion/external/ionicons-2.0.1/src/woman.svg | 13 + .../fusion/external/ionicons-2.0.1/src/wrench.svg | 11 + .../fusion/external/ionicons-2.0.1/src/xbox.svg | 21 + .../fusion/external/samples/css/images/blank.gif | Bin 0 -> 49 bytes .../app/fusion/external/samples/css/scribble.css | 40 + .../app/fusion/external/samples/css/slider.css | 142 + .../fusion/external/samples/css/spacegallery.css | 18 + .../fusion/external/samples/html/area_chart.html | 49 + .../fusion/external/samples/html/bar_chart.html | 95 + .../external/samples/html/d3_gauges_demo.html | 39 + .../external/samples/html/data/speedometer2.csv | 16 + .../external/samples/html/data/speedometer3.csv | 2 + .../fusion/external/samples/html/data/worddata.csv | 22 + .../app/fusion/external/samples/html/donut_d3.html | 43 + .../external/samples/html/js/area_chart.min.js | 1 + .../fusion/external/samples/html/js/donut.min.js | 1 + .../fusion/external/samples/html/js/gauges.min.js | 1 + .../external/samples/html/js/line_chart.min.js | 1 + .../external/samples/html/js/pie_chart.min.js | 1 + .../external/samples/html/js/worddata.min.js | 1 + .../fusion/external/samples/html/line_chart.html | 49 + .../fusion/external/samples/html/pie_chart.html | 38 + .../fusion/external/samples/html/wordcloud.html | 37 + .../external/samples/images/Calendar-16x16.png | Bin 0 -> 552 bytes .../fusion/external/samples/images/arrow-next.png | Bin 0 -> 1561 bytes .../fusion/external/samples/images/arrow-prev.png | Bin 0 -> 1557 bytes .../images/carousel/slide_b_drive_test_map.png | Bin 0 -> 202465 bytes .../images/carousel/slide_b_eppt_county.png | Bin 0 -> 21222 bytes .../images/carousel/slide_b_eppt_regression.png | Bin 0 -> 11536 bytes .../images/carousel/slide_b_ios_throughput.png | Bin 0 -> 26131 bytes .../samples/images/carousel/slide_b_lata_map.png | Bin 0 -> 192031 bytes .../images/carousel/slide_b_lata_map_legend.png | Bin 0 -> 3021 bytes .../images/carousel/slide_b_nova_sdn_map.png | Bin 0 -> 179361 bytes .../fusion/external/samples/images/copyicon.png | Bin 0 -> 235 bytes .../fusion/external/samples/images/deleteicon.gif | Bin 0 -> 579 bytes .../external/samples/images/example-frame.png | Bin 0 -> 33699 bytes .../app/fusion/external/samples/images/loading.gif | Bin 0 -> 6820 bytes .../external/samples/images/tunnels/1_mon.png | Bin 0 -> 22762 bytes .../external/samples/images/tunnels/2_tue.png | Bin 0 -> 22772 bytes .../external/samples/images/tunnels/3_wed.png | Bin 0 -> 24012 bytes .../external/samples/images/tunnels/4_thu.png | Bin 0 -> 23902 bytes .../external/samples/images/tunnels/5_fri.png | Bin 0 -> 22349 bytes .../external/samples/images/tunnels/6_sat.png | Bin 0 -> 23674 bytes .../external/samples/images/tunnels/7_sun.png | Bin 0 -> 22845 bytes .../samples/images/tunnels/BH_DLSTX_IN.png | Bin 0 -> 10575 bytes .../samples/images/tunnels/BH_DLSTX_OUT.png | Bin 0 -> 10460 bytes .../external/samples/images/tunnels/BH_Nat.png | Bin 0 -> 10420 bytes .../external/samples/images/tunnels/BH_Nat_Def.png | Bin 0 -> 8941 bytes .../samples/images/tunnels/BH_Nat_Priority.png | Bin 0 -> 10590 bytes .../app/fusion/external/samples/js/FusionCharts.js | 361 + .../app/fusion/external/samples/js/charts.js | 132 + .../webapp/app/fusion/external/samples/js/eye.js | 34 + .../app/fusion/external/samples/js/scribble.js | 19 + .../external/samples/js/slides.min.jquery.js | 20 + .../app/fusion/external/samples/js/spacegallery.js | 235 + .../webapp/app/fusion/external/samples/js/utils.js | 252 + .../samples/org_chart/css/bootstrap.min.css | 351 + .../external/samples/org_chart/css/custom.css | 97 + .../samples/org_chart/css/jquery.jOrgChart.css | 51 + .../external/samples/org_chart/css/prettify.css | 1 + .../fusion/external/samples/org_chart/example.html | 85 + .../external/samples/org_chart/example_vsp.html | 88 + .../external/samples/org_chart/images/bkgd.png | Bin 0 -> 133 bytes .../samples/org_chart/images/raspberry.jpg | Bin 0 -> 5755 bytes .../external/samples/org_chart/jquery.jOrgChart.js | 267 + .../fusion/external/samples/org_chart/prettify.js | 28 + .../app/fusion/external/utils/js/browserCheck.js | 24 + .../src/main/webapp/app/fusion/fonts/dummy.txt | 0 .../webapp/app/fusion/images/ATT_Labs_Logo.png | Bin 0 -> 45492 bytes .../webapp/app/fusion/images/Logo_att_labs.png | Bin 0 -> 2011 bytes .../src/main/webapp/app/fusion/images/Rlogo.jpg | Bin 0 -> 3173 bytes .../src/main/webapp/app/fusion/images/Thumbs.db | Bin 0 -> 102912 bytes .../main/webapp/app/fusion/images/action_icon.png | Bin 0 -> 2388 bytes .../app/fusion/images/action_list_spacer.gif | Bin 0 -> 73 bytes .../src/main/webapp/app/fusion/images/active.png | Bin 0 -> 682 bytes .../src/main/webapp/app/fusion/images/add.png | Bin 0 -> 352 bytes .../webapp/app/fusion/images/add_tool_button.png | Bin 0 -> 31105 bytes .../src/main/webapp/app/fusion/images/addicon.png | Bin 0 -> 463 bytes .../app/fusion/images/application_window_bg.jpg | Bin 0 -> 914 bytes .../main/webapp/app/fusion/images/arrow-next.png | Bin 0 -> 1561 bytes .../main/webapp/app/fusion/images/arrow-prev.png | Bin 0 -> 1557 bytes .../fusion/images/att_angular_gridster/grips.png | Bin 0 -> 951 bytes .../src/main/webapp/app/fusion/images/att_logo.png | Bin 0 -> 2827 bytes .../main/webapp/app/fusion/images/backButton.png | Bin 0 -> 816 bytes .../src/main/webapp/app/fusion/images/blank.gif | Bin 0 -> 49 bytes .../main/webapp/app/fusion/images/blueButton.png | Bin 0 -> 1468 bytes .../main/webapp/app/fusion/images/body_graphic.jpg | Bin 0 -> 20667 bytes .../src/main/webapp/app/fusion/images/bubble.png | Bin 0 -> 662 bytes .../src/main/webapp/app/fusion/images/cache.png | Bin 0 -> 1081 bytes .../src/main/webapp/app/fusion/images/calendar.gif | Bin 0 -> 929 bytes .../src/main/webapp/app/fusion/images/chevron.png | Bin 0 -> 252 bytes .../webapp/app/fusion/images/close_container.gif | Bin 0 -> 85 bytes .../webapp/app/fusion/images/collapsed-icon.png | Bin 0 -> 1379 bytes .../main/webapp/app/fusion/images/column-bg.png | Bin 0 -> 165 bytes .../app/fusion/images/copyicon-highlighted.png | Bin 0 -> 264 bytes .../src/main/webapp/app/fusion/images/copyicon.png | Bin 0 -> 235 bytes .../src/main/webapp/app/fusion/images/csv_icon.jpg | Bin 0 -> 632 bytes .../src/main/webapp/app/fusion/images/csv_icon.png | Bin 0 -> 938 bytes .../webapp/app/fusion/images/customers-add.png | Bin 0 -> 755 bytes .../webapp/app/fusion/images/customers-search.png | Bin 0 -> 976 bytes .../main/webapp/app/fusion/images/customers.png | Bin 0 -> 749 bytes .../main/webapp/app/fusion/images/decrypted.png | Bin 0 -> 628 bytes .../app/fusion/images/deleteicon-highlighted.gif | Bin 0 -> 592 bytes .../app/fusion/images/deleteicon-highlighted.png | Bin 0 -> 566 bytes .../main/webapp/app/fusion/images/deleteicon.gif | Bin 0 -> 579 bytes .../src/main/webapp/app/fusion/images/editicon.gif | Bin 0 -> 360 bytes .../main/webapp/app/fusion/images/error_type.gif | Bin 0 -> 398 bytes .../webapp/app/fusion/images/example-frame.png | Bin 0 -> 33699 bytes .../webapp/app/fusion/images/excelicon_multi.gif | Bin 0 -> 1028 bytes .../main/webapp/app/fusion/images/executeicon.png | Bin 0 -> 1076 bytes .../webapp/app/fusion/images/expanded-icon.png | Bin 0 -> 1372 bytes .../src/main/webapp/app/fusion/images/file-add.png | Bin 0 -> 675 bytes .../main/webapp/app/fusion/images/file_import.png | Bin 0 -> 653 bytes .../webapp/app/fusion/images/file_save-all.png | Bin 0 -> 610 bytes .../main/webapp/app/fusion/images/filter_icon.png | Bin 0 -> 29069 bytes .../main/webapp/app/fusion/images/folder_add.png | Bin 0 -> 772 bytes .../webapp/app/fusion/images/folder_closed.png | Bin 0 -> 559 bytes .../webapp/app/fusion/images/folder_delete.png | Bin 0 -> 767 bytes .../main/webapp/app/fusion/images/folder_edit.png | Bin 0 -> 829 bytes .../main/webapp/app/fusion/images/folder_open.png | Bin 0 -> 632 bytes .../main/webapp/app/fusion/images/folder_user.png | Bin 0 -> 887 bytes .../src/main/webapp/app/fusion/images/funnel.png | Bin 0 -> 543 bytes .../src/main/webapp/app/fusion/images/fusion.gif | Bin 0 -> 8821 bytes .../main/webapp/app/fusion/images/grayButton.png | Bin 0 -> 1361 bytes .../app/fusion/images/gray_add_tool_button.png | Bin 0 -> 30883 bytes .../webapp/app/fusion/images/headerChatIcon.png | Bin 0 -> 465 bytes .../webapp/app/fusion/images/icon_remove_all.gif | Bin 0 -> 982 bytes .../src/main/webapp/app/fusion/images/inactive.png | Bin 0 -> 842 bytes .../main/webapp/app/fusion/images/info_type.gif | Bin 0 -> 291 bytes .../app/fusion/images/layout/panel-e-w-toggle.png | Bin 0 -> 459 bytes .../app/fusion/images/layout/panel-n-s-toggle.png | Bin 0 -> 335 bytes .../main/webapp/app/fusion/images/leftButton.png | Bin 0 -> 681 bytes .../src/main/webapp/app/fusion/images/loading.gif | Bin 0 -> 6820 bytes .../main/webapp/app/fusion/images/loading_bar.gif | Bin 0 -> 28954 bytes .../main/webapp/app/fusion/images/login_button.gif | Bin 0 -> 1222 bytes .../src/main/webapp/app/fusion/images/logo_att.jpg | Bin 0 -> 3145 bytes .../webapp/app/fusion/images/logo_att_header.jpg | Bin 0 -> 3145 bytes .../webapp/app/fusion/images/logo_att_header.png | Bin 0 -> 43961 bytes .../main/webapp/app/fusion/images/logo_header.png | Bin 0 -> 37087 bytes .../src/main/webapp/app/fusion/images/m1.gif | Bin 0 -> 636 bytes .../src/main/webapp/app/fusion/images/mail.png | Bin 0 -> 449 bytes .../src/main/webapp/app/fusion/images/map.png | Bin 0 -> 611 bytes .../main/webapp/app/fusion/images/menu/bubble.png | Bin 0 -> 662 bytes .../webapp/app/fusion/images/menu/file_import.png | Bin 0 -> 653 bytes .../app/fusion/images/menu/file_save-all.png | Bin 0 -> 610 bytes .../main/webapp/app/fusion/images/menu/mail.png | Bin 0 -> 449 bytes .../main/webapp/app/fusion/images/menu/profile.png | Bin 0 -> 462 bytes .../webapp/app/fusion/images/menu/speechbubble.png | Bin 0 -> 458 bytes .../main/webapp/app/fusion/images/menu/users.png | Bin 0 -> 938 bytes .../src/main/webapp/app/fusion/images/minus.gif | Bin 0 -> 75 bytes .../fusion/images/mobile_logo_att_header_black.png | Bin 0 -> 34762 bytes .../fusion/images/mobile_logo_att_header_grey.png | Bin 0 -> 34636 bytes .../images/mobile_logo_att_header_horizontal.png | Bin 0 -> 5202 bytes .../fusion/images/mobile_logo_att_header_white.png | Bin 0 -> 34475 bytes .../main/webapp/app/fusion/images/modify_icon.gif | Bin 0 -> 246 bytes .../src/main/webapp/app/fusion/images/note-add.png | Bin 0 -> 589 bytes .../main/webapp/app/fusion/images/note-search.png | Bin 0 -> 876 bytes .../src/main/webapp/app/fusion/images/note.png | Bin 0 -> 583 bytes .../src/main/webapp/app/fusion/images/notes.png | Bin 0 -> 673 bytes .../src/main/webapp/app/fusion/images/offline.png | Bin 0 -> 3483 bytes .../main/webapp/app/fusion/images/offlineMsg.gif | Bin 0 -> 1004 bytes .../src/main/webapp/app/fusion/images/online.png | Bin 0 -> 888 bytes .../src/main/webapp/app/fusion/images/page.gif | Bin 0 -> 131 bytes .../main/webapp/app/fusion/images/pagination.png | Bin 0 -> 724 bytes .../webapp/app/fusion/images/panel-e-w-toggle.png | Bin 0 -> 459 bytes .../webapp/app/fusion/images/panel-n-s-toggle.png | Bin 0 -> 335 bytes .../src/main/webapp/app/fusion/images/pix.gif | Bin 0 -> 49 bytes .../src/main/webapp/app/fusion/images/plus.gif | Bin 0 -> 78 bytes .../src/main/webapp/app/fusion/images/printer.gif | Bin 0 -> 1036 bytes .../src/main/webapp/app/fusion/images/profile.png | Bin 0 -> 462 bytes .../main/webapp/app/fusion/images/report-add.png | Bin 0 -> 724 bytes .../webapp/app/fusion/images/report-favorite.png | Bin 0 -> 693 bytes .../main/webapp/app/fusion/images/report-my.png | Bin 0 -> 739 bytes .../webapp/app/fusion/images/report-public.png | Bin 0 -> 776 bytes .../src/main/webapp/app/fusion/images/report.png | Bin 0 -> 563 bytes .../src/main/webapp/app/fusion/images/reports.png | Bin 0 -> 769 bytes .../app/fusion/images/results-first-active.png | Bin 0 -> 545 bytes .../app/fusion/images/results-first-disabled.png | Bin 0 -> 421 bytes .../app/fusion/images/results-last-active.png | Bin 0 -> 541 bytes .../app/fusion/images/results-last-disabled.png | Bin 0 -> 421 bytes .../app/fusion/images/results-next-active.png | Bin 0 -> 416 bytes .../app/fusion/images/results-next-disabled.png | Bin 0 -> 326 bytes .../app/fusion/images/results-prev-active.png | Bin 0 -> 421 bytes .../app/fusion/images/results-prev-disabled.png | Bin 0 -> 322 bytes .../webapp/app/fusion/images/resultset_last.png | Bin 0 -> 506 bytes .../app/fusion/images/resultset_previous.png | Bin 0 -> 381 bytes .../webapp/app/fusion/images/return_to_top.gif | Bin 0 -> 846 bytes .../main/webapp/app/fusion/images/rightButton.png | Bin 0 -> 731 bytes .../src/main/webapp/app/fusion/images/search.png | Bin 0 -> 3501 bytes .../webapp/app/fusion/images/search_profile.png | Bin 0 -> 880 bytes .../src/main/webapp/app/fusion/images/sort_asc.gif | Bin 0 -> 57 bytes .../main/webapp/app/fusion/images/sort_desc.gif | Bin 0 -> 58 bytes .../src/main/webapp/app/fusion/images/spacer.gif | Bin 0 -> 43 bytes .../main/webapp/app/fusion/images/success_type.gif | Bin 0 -> 260 bytes .../src/main/webapp/app/fusion/images/swoosh.gif | Bin 0 -> 14250 bytes .../src/main/webapp/app/fusion/images/tab-hm.png | Bin 0 -> 249 bytes .../src/main/webapp/app/fusion/images/tab-v-hm.png | Bin 0 -> 317 bytes .../src/main/webapp/app/fusion/images/tab.png | Bin 0 -> 343 bytes .../main/webapp/app/fusion/images/table-add.png | Bin 0 -> 3314 bytes .../main/webapp/app/fusion/images/table-delete.png | Bin 0 -> 3342 bytes .../main/webapp/app/fusion/images/table-edit.png | Bin 0 -> 3348 bytes .../src/main/webapp/app/fusion/images/table.png | Bin 0 -> 496 bytes .../src/main/webapp/app/fusion/images/tabs-bg.png | Bin 0 -> 147 bytes .../main/webapp/app/fusion/images/toolButton.gif | Bin 0 -> 414 bytes .../main/webapp/app/fusion/images/toolButton.png | Bin 0 -> 531 bytes .../src/main/webapp/app/fusion/images/toolbar.png | Bin 0 -> 171 bytes .../src/main/webapp/app/fusion/images/users.png | Bin 0 -> 938 bytes .../main/webapp/app/fusion/images/warning_type.gif | Bin 0 -> 1055 bytes .../src/main/webapp/app/fusion/images/webphone.ico | Bin 0 -> 241 bytes .../main/webapp/app/fusion/images/whiteButton.png | Bin 0 -> 1430 bytes .../att_angular_gridster/angular-gridster.js | 2244 + .../att_angular_gridster/ui-gridster-tpls.js | 168 + .../fusion/scripts/controllers/adminController.js | 65 + .../fusion/scripts/controllers/admin_menu_edit.js | 230 + .../fusion/scripts/controllers/ase-controller.js | 22 + .../scripts/controllers/broadcast-controller.js | 79 + .../controllers/broadcast-list-controller.js | 120 + .../controllers/collaborate-list-controller.js | 63 + .../app/fusion/scripts/controllers/dummy.txt | 0 .../controllers/fn_menu_add_popup_controller.js | 281 + .../scripts/controllers/jcs-admin-controller.js | 83 + .../scripts/controllers/modelpopupController.js | 40 + .../scripts/controllers/post-search-controller.js | 202 + .../scripts/controllers/profile-controller.js | 286 + .../controllers/profile-search-controller.js | 80 + .../scripts/controllers/profileController.js | 38 + .../fusion/scripts/controllers/role-controller.js | 226 + .../controllers/role-function-list-controller.js | 157 + .../scripts/controllers/role-list-controller.js | 102 + .../controllers/rolefunctionpopupController.js | 84 + .../controllers/rolepopupmodelController.js | 205 + .../scripts/controllers/self-profile-controller.js | 284 + .../scripts/controllers/usage-list-controller.js | 41 + .../scripts/controllers/workflows/workflowApp.js | 24 + .../controllers/workflows/workflowController.js | 509 + .../controllers/workflows/workflowRouting.js | 26 + .../webapp/app/fusion/scripts/directives/dummy.txt | 0 .../webapp/app/fusion/scripts/directives/footer.js | 30 + .../webapp/app/fusion/scripts/directives/header.js | 504 + .../app/fusion/scripts/directives/leftMenu.js | 203 + .../webapp/app/fusion/scripts/jquery.resize.js | 158 + .../main/webapp/app/fusion/scripts/layout/debug.js | 348 + .../app/fusion/scripts/layout/jquery-latest.js | 9574 ++++ .../app/fusion/scripts/layout/jquery-ui-latest.js | 14898 +++++++ .../fusion/scripts/layout/jquery.layout-latest.js | 6105 +++ .../main/webapp/app/fusion/scripts/modalService.js | 204 + .../main/webapp/app/fusion/scripts/moment.min.js | 25 + .../webapp/app/fusion/scripts/network/net_map.js | 966 + .../app/fusion/scripts/services/adminService.js | 160 + .../app/fusion/scripts/services/headerService.js | 89 + .../app/fusion/scripts/services/leftMenuService.js | 54 + .../app/fusion/scripts/services/profileService.js | 98 + .../app/fusion/scripts/services/userInfoService.js | 51 + .../app/fusion/scripts/socket/peerBroadcast.js | 122 + .../main/webapp/app/fusion/scripts/utils/dummy.txt | 0 .../app/fusion/scripts/utils/page-resource.js | 114 + .../fusion/scripts/utils/sandbox-resources.html | 28 + .../scripts/view-models/admin-page/admin.html | 114 + .../scripts/view-models/admin-page/profile.html | 49 + .../app/fusion/scripts/view-models/dummy.txt | 0 .../app/fusion/scripts/view-models/footer.html | 42 + .../app/fusion/scripts/view-models/header.html | 186 + .../app/fusion/scripts/view-models/left_menu.html | 41 + .../profile-page/admin_closed_loop.html | 46 + .../view-models/profile-page/admin_menu_edit.html | 175 + .../view-models/profile-page/broadcast.html | 61 + .../view-models/profile-page/broadcast_list.html | 71 + .../view-models/profile-page/collaborate_list.html | 57 + .../view-models/profile-page/jcs_admin.html | 87 + .../view-models/profile-page/popup_modal.html | 282 + .../profile-page/popup_modal_fn_menu_add.html | 155 + .../profile-page/popup_modal_fn_menu_edit.html | 148 + .../view-models/profile-page/popup_modal_role.html | 82 + .../profile-page/popup_modal_rolefunction.html | 46 + .../view-models/profile-page/post_search.html | 139 + .../view-models/profile-page/profile_detail.html | 187 + .../view-models/profile-page/profile_search.html | 72 + .../scripts/view-models/profile-page/role.html | 118 + .../profile-page/role_function_list.html | 88 + .../view-models/profile-page/role_list.html | 61 + .../view-models/profile-page/self_profile.html | 182 + .../view-models/profile-page/usage_list.html | 63 + .../view-models/workflows/workflow-landing.html | 131 + .../view-models/workflows/workflow-listing.html | 85 + .../workflows/workflow-listing.html.bak | 85 + .../view-models/workflows/workflow-new.html | 108 + .../view-models/workflows/workflow-preview.html | 36 + .../view-models/workflows/workflow-remove.html | 38 + .../view-models/workflows/workflow-schedule.html | 116 + .../fusion/scripts/webrtc/RTCMultiConnection.js | 6788 +++ .../app/fusion/scripts/webrtc/getSourceId.html | 78 + .../att_angular_gridster/sandbox-gridster.css | 173 + .../styles/att_angular_gridster/ui-gridster.css | 116 + .../main/webapp/app/fusion/styles/fusion-sunny.css | 381 + .../main/webapp/app/fusion/styles/jquery-ui.css | 1244 + .../fusion/styles/layout/layout-default-latest.css | 243 + .../app/fusion/styles/workflows/workflows.css | 50 + .../drools/controller/drools-list-controller.js | 62 + .../drools/controller/drools-view-controller.js | 64 + .../drools/controller/droolsController.js | 30 + .../app/fusionapp/drools/controller/dummy.txt | 0 .../app/fusionapp/drools/directives/dummy.txt | 0 .../app/fusionapp/drools/services/droolsService.js | 76 + .../webapp/app/fusionapp/drools/utils/dummy.txt | 0 .../fusionapp/drools/view-models/droolsList.html | 47 + .../drools/view-models/droolsSinglePage.html | 92 + .../fusionapp/drools/view-models/droolsView.html | 61 + .../app/fusionapp/drools/view-models/dummy.txt | 0 .../main/webapp/app/fusionapp/external/dummy.txt | 0 .../src/main/webapp/app/fusionapp/fonts/dummy.txt | 0 .../main/webapp/app/fusionapp/icons/7450-icon.png | Bin 0 -> 465 bytes .../main/webapp/app/fusionapp/icons/7450-text.png | Bin 0 -> 295 bytes .../main/webapp/app/fusionapp/icons/7750-icon.png | Bin 0 -> 565 bytes .../main/webapp/app/fusionapp/icons/7750-text.png | Bin 0 -> 632 bytes .../webapp/app/fusionapp/icons/apn-dns-icon.png | Bin 0 -> 1065 bytes .../webapp/app/fusionapp/icons/apn-dns-text.png | Bin 0 -> 901 bytes .../main/webapp/app/fusionapp/icons/atcf-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/atcf-text.png | Bin 0 -> 650 bytes .../main/webapp/app/fusionapp/icons/atgw-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/atgw-text.png | Bin 0 -> 780 bytes .../main/webapp/app/fusionapp/icons/bgcf-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/bgcf-text.png | Bin 0 -> 645 bytes .../main/webapp/app/fusionapp/icons/com-icon.png | Bin 0 -> 437 bytes .../main/webapp/app/fusionapp/icons/cpm-icon.png | Bin 0 -> 201 bytes .../main/webapp/app/fusionapp/icons/cpm-text.png | Bin 0 -> 572 bytes .../webapp/app/fusionapp/icons/default-icon.png | Bin 0 -> 329 bytes .../webapp/app/fusionapp/icons/dra-epc-icon.png | Bin 0 -> 700 bytes .../webapp/app/fusionapp/icons/dra-epc-text.png | Bin 0 -> 820 bytes .../webapp/app/fusionapp/icons/dra-ims-icon.png | Bin 0 -> 700 bytes .../webapp/app/fusionapp/icons/dra-ims-text.png | Bin 0 -> 851 bytes .../main/webapp/app/fusionapp/icons/dslam-icon.png | Bin 0 -> 774 bytes .../main/webapp/app/fusionapp/icons/dslam-text.png | Bin 0 -> 739 bytes .../main/webapp/app/fusionapp/icons/eatf-icon.png | Bin 0 -> 437 bytes .../main/webapp/app/fusionapp/icons/eatf-text.png | Bin 0 -> 439 bytes .../main/webapp/app/fusionapp/icons/ecscf-icon.png | Bin 0 -> 855 bytes .../main/webapp/app/fusionapp/icons/ecscf-text.png | Bin 0 -> 604 bytes .../main/webapp/app/fusionapp/icons/emsc-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/enb-icon.png | Bin 0 -> 1127 bytes .../main/webapp/app/fusionapp/icons/enb-text.png | Bin 0 -> 627 bytes .../main/webapp/app/fusionapp/icons/enum-icon.png | Bin 0 -> 646 bytes .../main/webapp/app/fusionapp/icons/enum-text.png | Bin 0 -> 551 bytes .../main/webapp/app/fusionapp/icons/esmlc-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/esmlc-text.png | Bin 0 -> 701 bytes .../main/webapp/app/fusionapp/icons/ettcs-icon.png | Bin 0 -> 95 bytes .../main/webapp/app/fusionapp/icons/ettcs-text.png | Bin 0 -> 95 bytes .../main/webapp/app/fusionapp/icons/gmlc-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/gmlc-text.png | Bin 0 -> 755 bytes .../main/webapp/app/fusionapp/icons/hlr-icon.png | Bin 0 -> 646 bytes .../main/webapp/app/fusionapp/icons/hlr-text.png | Bin 0 -> 376 bytes .../webapp/app/fusionapp/icons/hss-epc-icon.png | Bin 0 -> 646 bytes .../webapp/app/fusionapp/icons/hss-epc-text.png | Bin 0 -> 726 bytes .../webapp/app/fusionapp/icons/hss-ims-icon.png | Bin 0 -> 646 bytes .../webapp/app/fusionapp/icons/hss-ims-text.png | Bin 0 -> 757 bytes .../main/webapp/app/fusionapp/icons/icscf-icon.png | Bin 0 -> 855 bytes .../main/webapp/app/fusionapp/icons/icscf-text.png | Bin 0 -> 657 bytes .../main/webapp/app/fusionapp/icons/ipag-icon.png | Bin 0 -> 95 bytes .../main/webapp/app/fusionapp/icons/ipag-text.png | Bin 0 -> 95 bytes .../main/webapp/app/fusionapp/icons/isbc-icon.png | Bin 0 -> 855 bytes .../main/webapp/app/fusionapp/icons/isbc-text.png | Bin 0 -> 649 bytes .../main/webapp/app/fusionapp/icons/iwf-icon.png | Bin 0 -> 696 bytes .../main/webapp/app/fusionapp/icons/iwf-text.png | Bin 0 -> 595 bytes .../webapp/app/fusionapp/icons/lrf-rdf-icon.png | Bin 0 -> 953 bytes .../webapp/app/fusionapp/icons/lrf-rdf-text.png | Bin 0 -> 638 bytes .../webapp/app/fusionapp/icons/lrg-rdf-text.png | Bin 0 -> 769 bytes .../main/webapp/app/fusionapp/icons/mgc8-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/mgc8-text.png | Bin 0 -> 771 bytes .../webapp/app/fusionapp/icons/mgcf-emsc-icon.png | Bin 0 -> 388 bytes .../webapp/app/fusionapp/icons/mgcf-emsc-text.png | Bin 0 -> 1140 bytes .../main/webapp/app/fusionapp/icons/mgw-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/mgw-text.png | Bin 0 -> 823 bytes .../main/webapp/app/fusionapp/icons/mind-icon.png | Bin 0 -> 646 bytes .../main/webapp/app/fusionapp/icons/mind-text.png | Bin 0 -> 550 bytes .../main/webapp/app/fusionapp/icons/mme-icon.png | Bin 0 -> 232 bytes .../main/webapp/app/fusionapp/icons/mme-text.png | Bin 0 -> 252 bytes .../main/webapp/app/fusionapp/icons/mrf-icon.png | Bin 0 -> 437 bytes .../main/webapp/app/fusionapp/icons/mrf-text.png | Bin 0 -> 504 bytes .../main/webapp/app/fusionapp/icons/msc-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/msn-icon.png | Bin 0 -> 465 bytes .../main/webapp/app/fusionapp/icons/msn-text.png | Bin 0 -> 318 bytes .../main/webapp/app/fusionapp/icons/multi-icon.png | Bin 0 -> 329 bytes .../main/webapp/app/fusionapp/icons/n7450-icon.png | Bin 0 -> 464 bytes .../main/webapp/app/fusionapp/icons/n7450-text.png | Bin 0 -> 295 bytes .../webapp/app/fusionapp/icons/n7750a-icon.png | Bin 0 -> 393 bytes .../webapp/app/fusionapp/icons/n7750a-text.png | Bin 0 -> 258 bytes .../webapp/app/fusionapp/icons/n7750b-icon.png | Bin 0 -> 393 bytes .../webapp/app/fusionapp/icons/n7750b-text.png | Bin 0 -> 258 bytes .../webapp/app/fusionapp/icons/n7750c-icon.png | Bin 0 -> 391 bytes .../webapp/app/fusionapp/icons/n7750c-text.png | Bin 0 -> 258 bytes .../webapp/app/fusionapp/icons/n7750d-icon.png | Bin 0 -> 391 bytes .../webapp/app/fusionapp/icons/n7750d-text.png | Bin 0 -> 258 bytes .../main/webapp/app/fusionapp/icons/nb-icon.png | Bin 0 -> 1127 bytes .../main/webapp/app/fusionapp/icons/nb-text.png | Bin 0 -> 499 bytes .../main/webapp/app/fusionapp/icons/pas-icon.png | Bin 0 -> 700 bytes .../main/webapp/app/fusionapp/icons/pas-text.png | Bin 0 -> 596 bytes .../main/webapp/app/fusionapp/icons/pcef-icon.png | Bin 0 -> 785 bytes .../main/webapp/app/fusionapp/icons/pcef-text.png | Bin 0 -> 539 bytes .../main/webapp/app/fusionapp/icons/pcrf-icon.png | Bin 0 -> 785 bytes .../main/webapp/app/fusionapp/icons/pcrf-text.png | Bin 0 -> 594 bytes .../main/webapp/app/fusionapp/icons/pcscf-icon.png | Bin 0 -> 855 bytes .../main/webapp/app/fusionapp/icons/pcscf-text.png | Bin 0 -> 744 bytes .../main/webapp/app/fusionapp/icons/pgw-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/pgw-text.png | Bin 0 -> 807 bytes .../main/webapp/app/fusionapp/icons/plrf-icon.png | Bin 0 -> 953 bytes .../main/webapp/app/fusionapp/icons/plrf-text.png | Bin 0 -> 735 bytes .../main/webapp/app/fusionapp/icons/psap-icon.png | Bin 0 -> 322 bytes .../webapp/app/fusionapp/icons/pstn-tdm-icon.png | Bin 0 -> 95 bytes .../webapp/app/fusionapp/icons/pstn-tdm-text.png | Bin 0 -> 95 bytes .../main/webapp/app/fusionapp/icons/rg-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/rg-text.png | Bin 0 -> 540 bytes .../main/webapp/app/fusionapp/icons/rnc-icon.png | Bin 0 -> 591 bytes .../main/webapp/app/fusionapp/icons/rnc-text.png | Bin 0 -> 646 bytes .../main/webapp/app/fusionapp/icons/sbc-icon.png | Bin 0 -> 855 bytes .../main/webapp/app/fusionapp/icons/sbc-text.png | Bin 0 -> 632 bytes .../main/webapp/app/fusionapp/icons/sccas-icon.png | Bin 0 -> 437 bytes .../main/webapp/app/fusionapp/icons/sccas-text.png | Bin 0 -> 861 bytes .../main/webapp/app/fusionapp/icons/scscf-icon.png | Bin 0 -> 855 bytes .../main/webapp/app/fusionapp/icons/scscf-text.png | Bin 0 -> 704 bytes .../main/webapp/app/fusionapp/icons/sdg-icon.png | Bin 0 -> 491 bytes .../main/webapp/app/fusionapp/icons/sdg-text.png | Bin 0 -> 696 bytes .../webapp/app/fusionapp/icons/sgsns4-icon.png | Bin 0 -> 230 bytes .../webapp/app/fusionapp/icons/sgsns4-text.png | Bin 0 -> 469 bytes .../main/webapp/app/fusionapp/icons/sgw-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/sgw-text.png | Bin 0 -> 884 bytes .../main/webapp/app/fusionapp/icons/siad-icon.png | Bin 0 -> 774 bytes .../main/webapp/app/fusionapp/icons/siad-text.png | Bin 0 -> 753 bytes .../webapp/app/fusionapp/icons/ss7-gport-icon.png | Bin 0 -> 286 bytes .../webapp/app/fusionapp/icons/ss7-gport-text.png | Bin 0 -> 418 bytes .../webapp/app/fusionapp/icons/ss7gport-icon.png | Bin 0 -> 646 bytes .../webapp/app/fusionapp/icons/ss7gport-text.png | Bin 0 -> 1011 bytes .../webapp/app/fusionapp/icons/switch-icon.png | Bin 0 -> 877 bytes .../main/webapp/app/fusionapp/icons/tas-icon.png | Bin 0 -> 437 bytes .../main/webapp/app/fusionapp/icons/tas-text.png | Bin 0 -> 858 bytes .../webapp/app/fusionapp/icons/transcoder-icon.png | Bin 0 -> 774 bytes .../webapp/app/fusionapp/icons/transcoder-text.png | Bin 0 -> 1242 bytes .../main/webapp/app/fusionapp/icons/ue-icon.png | Bin 0 -> 577 bytes .../webapp/app/fusionapp/icons/uephone-icon.png | Bin 0 -> 1190 bytes .../webapp/app/fusionapp/icons/usp-dns-icon.png | Bin 0 -> 1065 bytes .../webapp/app/fusionapp/icons/usp-dns-text.png | Bin 0 -> 826 bytes .../src/main/webapp/app/fusionapp/images/dummy.txt | 0 .../app/fusionapp/scripts/controller/dummy.txt | 0 .../scripts/controller/sample-page-controller.js | 80 + .../controller/sample-page-iframe-controller.js | 23 + .../scripts/controller/sampleController.js | 30 + .../app/fusionapp/scripts/directives/dummy.txt | 0 .../webapp/app/fusionapp/scripts/utils/dummy.txt | 0 .../app/fusionapp/scripts/view-models/dummy.txt | 0 .../app/fusionapp/scripts/view-models/sample.html | 60 + .../scripts/view-models/sampleWithIframe.html | 22 + .../scripts/view-models/singlePageSample.html | 89 + .../src/main/webapp/app/fusionapp/styles/dummy.txt | 0 dcae_dmaapbc_webapp/src/main/webapp/index.jsp | 24 + dcae_dmaapbc_webapp/src/main/webapp/manifest.jsp | 47 + .../css/att_angular_gridster/sandbox-gridster.css | 173 + .../css/att_angular_gridster/ui-gridster.css | 116 + .../main/webapp/static/fusion/css/fusion-sunny.css | 362 + .../main/webapp/static/fusion/css/jquery-ui.css | 1225 + .../fusion/css/layout/layout-default-latest.css | 224 + .../src/main/webapp/static/fusion/d3/css/nv.d3.css | 656 + .../src/main/webapp/static/fusion/d3/js/cie.js | 155 + .../main/webapp/static/fusion/d3/js/colorbrewer.js | 302 + .../src/main/webapp/static/fusion/d3/js/core.js | 122 + .../main/webapp/static/fusion/d3/js/crossfilter.js | 1180 + .../webapp/static/fusion/d3/js/crossfilter.min.js | 1 + .../src/main/webapp/static/fusion/d3/js/d3.geom.js | 816 + .../src/main/webapp/static/fusion/d3/js/d3.js | 5 + .../webapp/static/fusion/d3/js/d3.layout.cloud.js | 433 + .../main/webapp/static/fusion/d3/js/d3.layout.js | 908 + .../src/main/webapp/static/fusion/d3/js/d3.v2.js | 7037 +++ .../main/webapp/static/fusion/d3/js/d3.v2.min.js | 4 + .../main/webapp/static/fusion/d3/js/d3.v3.min.js | 1 + .../src/main/webapp/static/fusion/d3/js/fisheye.js | 86 + .../src/main/webapp/static/fusion/d3/js/hive.js | 80 + .../src/main/webapp/static/fusion/d3/js/horizon.js | 192 + .../webapp/static/fusion/d3/js/interactiveLayer.js | 251 + .../src/main/webapp/static/fusion/d3/js/intro.js | 1 + .../webapp/static/fusion/d3/js/models/axis-min.js | 1 + .../main/webapp/static/fusion/d3/js/models/axis.js | 470 + .../webapp/static/fusion/d3/js/models/axis.min.js | 1 + .../static/fusion/d3/js/models/backup/bullet.js | 250 + .../fusion/d3/js/models/backup/bulletChart.js | 349 + .../static/fusion/d3/js/models/boilerplate.js | 104 + .../webapp/static/fusion/d3/js/models/bullet.js | 385 + .../static/fusion/d3/js/models/bulletChart.js | 343 + .../fusion/d3/js/models/cumulativeLineChart.js | 782 + .../static/fusion/d3/js/models/discreteBar.js | 349 + .../static/fusion/d3/js/models/discreteBarChart.js | 333 + .../static/fusion/d3/js/models/distribution.js | 148 + .../static/fusion/d3/js/models/historicalBar.js | 331 + .../fusion/d3/js/models/historicalBarChart.js | 419 + .../static/fusion/d3/js/models/indentedTree.js | 337 + .../webapp/static/fusion/d3/js/models/legend.js | 270 + .../main/webapp/static/fusion/d3/js/models/line.js | 284 + .../webapp/static/fusion/d3/js/models/lineChart.js | 465 + .../static/fusion/d3/js/models/linePlusBarChart.js | 433 + .../d3/js/models/linePlusBarWithFocusChart.js | 658 + .../static/fusion/d3/js/models/lineWithFisheye.js | 200 + .../fusion/d3/js/models/lineWithFisheyeChart.js | 297 + .../fusion/d3/js/models/lineWithFocusChart.js | 574 + .../webapp/static/fusion/d3/js/models/multiBar.js | 461 + .../static/fusion/d3/js/models/multiBarChart.js | 524 + .../fusion/d3/js/models/multiBarHorizontal.js | 424 + .../fusion/d3/js/models/multiBarHorizontalChart.js | 434 + .../fusion/d3/js/models/multiBarTimeSeries.js | 384 + .../fusion/d3/js/models/multiBarTimeSeriesChart.js | 405 + .../static/fusion/d3/js/models/multiChart.js | 452 + .../webapp/static/fusion/d3/js/models/ohlcBar.js | 380 + .../fusion/d3/js/models/parallelCoordinates.js | 239 + .../main/webapp/static/fusion/d3/js/models/pie.js | 400 + .../webapp/static/fusion/d3/js/models/pieChart.js | 292 + .../webapp/static/fusion/d3/js/models/scatter.js | 674 + .../static/fusion/d3/js/models/scatterChart.js | 628 + .../fusion/d3/js/models/scatterPlusLineChart.js | 620 + .../webapp/static/fusion/d3/js/models/sparkline.js | 194 + .../static/fusion/d3/js/models/sparklinePlus.js | 295 + .../static/fusion/d3/js/models/stackedArea.js | 368 + .../static/fusion/d3/js/models/stackedAreaChart.js | 629 + .../src/main/webapp/static/fusion/d3/js/nv.d3.js | 13097 ++++++ .../main/webapp/static/fusion/d3/js/nv.d3.min.js | 1 + .../src/main/webapp/static/fusion/d3/js/outro.js | 1 + .../src/main/webapp/static/fusion/d3/js/sankey.js | 292 + .../src/main/webapp/static/fusion/d3/js/tooltip.js | 490 + .../src/main/webapp/static/fusion/d3/js/utils.js | 152 + .../webapp/static/fusion/images/Logo_att_labs.png | Bin 0 -> 2011 bytes .../src/main/webapp/static/fusion/images/Rlogo.jpg | Bin 0 -> 3173 bytes .../src/main/webapp/static/fusion/images/Thumbs.db | Bin 0 -> 102912 bytes .../webapp/static/fusion/images/action_icon.png | Bin 0 -> 2388 bytes .../static/fusion/images/action_list_spacer.gif | Bin 0 -> 73 bytes .../main/webapp/static/fusion/images/active.png | Bin 0 -> 682 bytes .../src/main/webapp/static/fusion/images/add.png | Bin 0 -> 352 bytes .../static/fusion/images/add_tool_button.png | Bin 0 -> 31105 bytes .../main/webapp/static/fusion/images/addicon.png | Bin 0 -> 463 bytes .../static/fusion/images/application_window_bg.jpg | Bin 0 -> 914 bytes .../webapp/static/fusion/images/arrow-next.png | Bin 0 -> 1561 bytes .../webapp/static/fusion/images/arrow-prev.png | Bin 0 -> 1557 bytes .../fusion/images/att_angular_gridster/grips.png | Bin 0 -> 951 bytes .../webapp/static/fusion/images/backButton.png | Bin 0 -> 816 bytes .../src/main/webapp/static/fusion/images/blank.gif | Bin 0 -> 49 bytes .../webapp/static/fusion/images/blueButton.png | Bin 0 -> 1468 bytes .../main/webapp/static/fusion/images/bubble.png | Bin 0 -> 662 bytes .../src/main/webapp/static/fusion/images/cache.png | Bin 0 -> 1081 bytes .../main/webapp/static/fusion/images/calendar.gif | Bin 0 -> 929 bytes .../main/webapp/static/fusion/images/chevron.png | Bin 0 -> 252 bytes .../static/fusion/images/close_container.gif | Bin 0 -> 85 bytes .../webapp/static/fusion/images/collapsed-icon.png | Bin 0 -> 1379 bytes .../main/webapp/static/fusion/images/column-bg.png | Bin 0 -> 165 bytes .../static/fusion/images/copyicon-highlighted.png | Bin 0 -> 264 bytes .../main/webapp/static/fusion/images/copyicon.png | Bin 0 -> 235 bytes .../main/webapp/static/fusion/images/csv_icon.jpg | Bin 0 -> 632 bytes .../main/webapp/static/fusion/images/csv_icon.png | Bin 0 -> 938 bytes .../webapp/static/fusion/images/customers-add.png | Bin 0 -> 755 bytes .../static/fusion/images/customers-search.png | Bin 0 -> 976 bytes .../main/webapp/static/fusion/images/customers.png | Bin 0 -> 749 bytes .../main/webapp/static/fusion/images/decrypted.png | Bin 0 -> 628 bytes .../fusion/images/deleteicon-highlighted.gif | Bin 0 -> 592 bytes .../fusion/images/deleteicon-highlighted.png | Bin 0 -> 566 bytes .../webapp/static/fusion/images/deleteicon.gif | Bin 0 -> 579 bytes .../src/main/webapp/static/fusion/images/ecomp.png | Bin 0 -> 107597 bytes .../webapp/static/fusion/images/ecomp_trans.png | Bin 0 -> 109926 bytes .../main/webapp/static/fusion/images/editicon.gif | Bin 0 -> 360 bytes .../webapp/static/fusion/images/error_type.gif | Bin 0 -> 398 bytes .../webapp/static/fusion/images/example-frame.png | Bin 0 -> 33699 bytes .../static/fusion/images/excelicon_multi.gif | Bin 0 -> 1028 bytes .../webapp/static/fusion/images/executeicon.png | Bin 0 -> 1076 bytes .../webapp/static/fusion/images/expanded-icon.png | Bin 0 -> 1372 bytes .../main/webapp/static/fusion/images/file-add.png | Bin 0 -> 675 bytes .../webapp/static/fusion/images/file_import.png | Bin 0 -> 653 bytes .../webapp/static/fusion/images/file_save-all.png | Bin 0 -> 610 bytes .../webapp/static/fusion/images/filter_icon.png | Bin 0 -> 29069 bytes .../webapp/static/fusion/images/folder_add.png | Bin 0 -> 772 bytes .../webapp/static/fusion/images/folder_closed.png | Bin 0 -> 559 bytes .../webapp/static/fusion/images/folder_delete.png | Bin 0 -> 767 bytes .../webapp/static/fusion/images/folder_edit.png | Bin 0 -> 829 bytes .../webapp/static/fusion/images/folder_open.png | Bin 0 -> 632 bytes .../webapp/static/fusion/images/folder_user.png | Bin 0 -> 887 bytes .../main/webapp/static/fusion/images/funnel.png | Bin 0 -> 543 bytes .../main/webapp/static/fusion/images/fusion.gif | Bin 0 -> 8821 bytes .../webapp/static/fusion/images/grayButton.png | Bin 0 -> 1361 bytes .../static/fusion/images/gray_add_tool_button.png | Bin 0 -> 30883 bytes .../webapp/static/fusion/images/headerChatIcon.png | Bin 0 -> 465 bytes .../static/fusion/images/icon_remove_all.gif | Bin 0 -> 982 bytes .../main/webapp/static/fusion/images/inactive.png | Bin 0 -> 842 bytes .../main/webapp/static/fusion/images/info_type.gif | Bin 0 -> 291 bytes .../fusion/images/layout/panel-e-w-toggle.png | Bin 0 -> 459 bytes .../fusion/images/layout/panel-n-s-toggle.png | Bin 0 -> 335 bytes .../webapp/static/fusion/images/leftButton.png | Bin 0 -> 681 bytes .../main/webapp/static/fusion/images/loading.gif | Bin 0 -> 6820 bytes .../webapp/static/fusion/images/loading_bar.gif | Bin 0 -> 28954 bytes .../webapp/static/fusion/images/login_button.gif | Bin 0 -> 1222 bytes .../main/webapp/static/fusion/images/logo_att.jpg | Bin 0 -> 3145 bytes .../static/fusion/images/logo_att_header.jpg | Bin 0 -> 3145 bytes .../static/fusion/images/logo_att_header.png | Bin 0 -> 43961 bytes .../webapp/static/fusion/images/logo_header.png | Bin 0 -> 37087 bytes .../src/main/webapp/static/fusion/images/m1.gif | Bin 0 -> 636 bytes .../src/main/webapp/static/fusion/images/mail.png | Bin 0 -> 449 bytes .../src/main/webapp/static/fusion/images/map.png | Bin 0 -> 611 bytes .../webapp/static/fusion/images/menu/bubble.png | Bin 0 -> 662 bytes .../static/fusion/images/menu/file_import.png | Bin 0 -> 653 bytes .../static/fusion/images/menu/file_save-all.png | Bin 0 -> 610 bytes .../main/webapp/static/fusion/images/menu/mail.png | Bin 0 -> 449 bytes .../webapp/static/fusion/images/menu/profile.png | Bin 0 -> 462 bytes .../static/fusion/images/menu/speechbubble.png | Bin 0 -> 458 bytes .../webapp/static/fusion/images/menu/users.png | Bin 0 -> 938 bytes .../src/main/webapp/static/fusion/images/minus.gif | Bin 0 -> 75 bytes .../fusion/images/mobile_logo_att_header_black.png | Bin 0 -> 34762 bytes .../fusion/images/mobile_logo_att_header_grey.png | Bin 0 -> 34636 bytes .../images/mobile_logo_att_header_horizontal.png | Bin 0 -> 5202 bytes .../fusion/images/mobile_logo_att_header_white.png | Bin 0 -> 34475 bytes .../webapp/static/fusion/images/modify_icon.gif | Bin 0 -> 246 bytes .../static/fusion/images/no_favorites_star.png | Bin 0 -> 2794 bytes .../main/webapp/static/fusion/images/note-add.png | Bin 0 -> 589 bytes .../webapp/static/fusion/images/note-search.png | Bin 0 -> 876 bytes .../src/main/webapp/static/fusion/images/note.png | Bin 0 -> 583 bytes .../src/main/webapp/static/fusion/images/notes.png | Bin 0 -> 673 bytes .../main/webapp/static/fusion/images/offline.png | Bin 0 -> 3483 bytes .../webapp/static/fusion/images/offlineMsg.gif | Bin 0 -> 1004 bytes .../main/webapp/static/fusion/images/online.png | Bin 0 -> 888 bytes .../src/main/webapp/static/fusion/images/page.gif | Bin 0 -> 131 bytes .../webapp/static/fusion/images/pagination.png | Bin 0 -> 724 bytes .../static/fusion/images/panel-e-w-toggle.png | Bin 0 -> 459 bytes .../static/fusion/images/panel-n-s-toggle.png | Bin 0 -> 335 bytes .../src/main/webapp/static/fusion/images/pix.gif | Bin 0 -> 49 bytes .../src/main/webapp/static/fusion/images/plus.gif | Bin 0 -> 78 bytes .../main/webapp/static/fusion/images/printer.gif | Bin 0 -> 1036 bytes .../main/webapp/static/fusion/images/profile.png | Bin 0 -> 462 bytes .../webapp/static/fusion/images/report-add.png | Bin 0 -> 724 bytes .../static/fusion/images/report-favorite.png | Bin 0 -> 693 bytes .../main/webapp/static/fusion/images/report-my.png | Bin 0 -> 739 bytes .../webapp/static/fusion/images/report-public.png | Bin 0 -> 776 bytes .../main/webapp/static/fusion/images/report.png | Bin 0 -> 563 bytes .../main/webapp/static/fusion/images/reports.png | Bin 0 -> 769 bytes .../static/fusion/images/results-first-active.png | Bin 0 -> 545 bytes .../fusion/images/results-first-disabled.png | Bin 0 -> 421 bytes .../static/fusion/images/results-last-active.png | Bin 0 -> 541 bytes .../static/fusion/images/results-last-disabled.png | Bin 0 -> 421 bytes .../static/fusion/images/results-next-active.png | Bin 0 -> 416 bytes .../static/fusion/images/results-next-disabled.png | Bin 0 -> 326 bytes .../static/fusion/images/results-prev-active.png | Bin 0 -> 421 bytes .../static/fusion/images/results-prev-disabled.png | Bin 0 -> 322 bytes .../webapp/static/fusion/images/resultset_last.png | Bin 0 -> 506 bytes .../static/fusion/images/resultset_previous.png | Bin 0 -> 381 bytes .../webapp/static/fusion/images/return_to_top.gif | Bin 0 -> 846 bytes .../webapp/static/fusion/images/rightButton.png | Bin 0 -> 731 bytes .../main/webapp/static/fusion/images/search.png | Bin 0 -> 3501 bytes .../webapp/static/fusion/images/search_profile.png | Bin 0 -> 880 bytes .../main/webapp/static/fusion/images/sort_asc.gif | Bin 0 -> 57 bytes .../main/webapp/static/fusion/images/sort_desc.gif | Bin 0 -> 58 bytes .../main/webapp/static/fusion/images/spacer.gif | Bin 0 -> 43 bytes .../webapp/static/fusion/images/success_type.gif | Bin 0 -> 260 bytes .../main/webapp/static/fusion/images/swoosh.gif | Bin 0 -> 14250 bytes .../main/webapp/static/fusion/images/tab-hm.png | Bin 0 -> 249 bytes .../main/webapp/static/fusion/images/tab-v-hm.png | Bin 0 -> 317 bytes .../src/main/webapp/static/fusion/images/tab.png | Bin 0 -> 343 bytes .../main/webapp/static/fusion/images/table-add.png | Bin 0 -> 3314 bytes .../webapp/static/fusion/images/table-delete.png | Bin 0 -> 3342 bytes .../webapp/static/fusion/images/table-edit.png | Bin 0 -> 3348 bytes .../src/main/webapp/static/fusion/images/table.png | Bin 0 -> 496 bytes .../main/webapp/static/fusion/images/tabs-bg.png | Bin 0 -> 147 bytes .../webapp/static/fusion/images/toolButton.gif | Bin 0 -> 414 bytes .../webapp/static/fusion/images/toolButton.png | Bin 0 -> 531 bytes .../main/webapp/static/fusion/images/toolbar.png | Bin 0 -> 171 bytes .../src/main/webapp/static/fusion/images/users.png | Bin 0 -> 938 bytes .../webapp/static/fusion/images/warning_type.gif | Bin 0 -> 1055 bytes .../main/webapp/static/fusion/images/webphone.ico | Bin 0 -> 241 bytes .../webapp/static/fusion/images/whiteButton.png | Bin 0 -> 1430 bytes .../js/att_angular_gridster/angular-gridster.js | 2244 + .../js/att_angular_gridster/ui-gridster-tpls.js | 168 + .../main/webapp/static/fusion/js/jquery.resize.js | 139 + .../main/webapp/static/fusion/js/layout/debug.js | 329 + .../static/fusion/js/layout/jquery-latest.js | 9555 ++++ .../static/fusion/js/layout/jquery-ui-latest.js | 14879 +++++++ .../fusion/js/layout/jquery.layout-latest.js | 6086 +++ .../src/main/webapp/static/fusion/js/moment.min.js | 6 + .../main/webapp/static/fusion/raptor/css/Style.css | 77 + .../static/fusion/raptor/css/bd_quantum_raptor.css | 305 + .../webapp/static/fusion/raptor/css/calendar.css | 97 + .../webapp/static/fusion/raptor/css/dashboard.css | 36 + .../webapp/static/fusion/raptor/css/drupal.css | 83 + .../fusion/raptor/css/form-field-tooltip.css | 12 + .../static/fusion/raptor/css/mobile_raptor.css | 73 + .../webapp/static/fusion/raptor/css/novamap.css | 25 + .../webapp/static/fusion/raptor/css/picker.css | 40 + .../main/webapp/static/fusion/raptor/css/ral.css | 1437 + .../webapp/static/fusion/raptor/css/raptor.css | 62 + .../static/fusion/raptor/css/tree/context-menu.css | 57 + .../raptor/css/tree/drag-drop-folder-tree.css | 64 + .../webapp/static/fusion/raptor/d3/css/nv.d3.css | 656 + .../main/webapp/static/fusion/raptor/d3/js/cie.js | 155 + .../static/fusion/raptor/d3/js/colorbrewer.js | 302 + .../main/webapp/static/fusion/raptor/d3/js/core.js | 122 + .../static/fusion/raptor/d3/js/crossfilter.js | 1180 + .../static/fusion/raptor/d3/js/crossfilter.min.js | 1 + .../webapp/static/fusion/raptor/d3/js/d3.geom.js | 816 + .../main/webapp/static/fusion/raptor/d3/js/d3.js | 3015 ++ .../webapp/static/fusion/raptor/d3/js/d3.layout.js | 908 + .../webapp/static/fusion/raptor/d3/js/d3.v2.js | 7033 +++ .../webapp/static/fusion/raptor/d3/js/d3.v2.min.js | 4 + .../webapp/static/fusion/raptor/d3/js/d3.v3.js | 8444 ++++ .../webapp/static/fusion/raptor/d3/js/d3.v3.min.js | 1 + .../webapp/static/fusion/raptor/d3/js/fisheye.js | 86 + .../main/webapp/static/fusion/raptor/d3/js/hive.js | 80 + .../webapp/static/fusion/raptor/d3/js/horizon.js | 192 + .../static/fusion/raptor/d3/js/interactiveLayer.js | 251 + .../webapp/static/fusion/raptor/d3/js/intro.js | 1 + .../static/fusion/raptor/d3/js/models/axis-min.js | 1 + .../static/fusion/raptor/d3/js/models/axis.js | 470 + .../static/fusion/raptor/d3/js/models/axis.min.js | 1 + .../fusion/raptor/d3/js/models/boilerplate.js | 104 + .../static/fusion/raptor/d3/js/models/bullet.js | 385 + .../fusion/raptor/d3/js/models/bulletChart.js | 343 + .../raptor/d3/js/models/cumulativeLineChart.js | 782 + .../fusion/raptor/d3/js/models/discreteBar.js | 349 + .../fusion/raptor/d3/js/models/discreteBarChart.js | 333 + .../fusion/raptor/d3/js/models/distribution.js | 148 + .../fusion/raptor/d3/js/models/historicalBar.js | 331 + .../raptor/d3/js/models/historicalBarChart.js | 419 + .../fusion/raptor/d3/js/models/indentedTree.js | 337 + .../static/fusion/raptor/d3/js/models/legend.js | 270 + .../static/fusion/raptor/d3/js/models/line.js | 284 + .../static/fusion/raptor/d3/js/models/lineChart.js | 465 + .../fusion/raptor/d3/js/models/linePlusBarChart.js | 433 + .../d3/js/models/linePlusBarWithFocusChart.js | 658 + .../fusion/raptor/d3/js/models/lineWithFisheye.js | 200 + .../raptor/d3/js/models/lineWithFisheyeChart.js | 297 + .../raptor/d3/js/models/lineWithFocusChart.js | 574 + .../static/fusion/raptor/d3/js/models/multiBar.js | 461 + .../fusion/raptor/d3/js/models/multiBarChart.js | 524 + .../raptor/d3/js/models/multiBarHorizontal.js | 424 + .../raptor/d3/js/models/multiBarHorizontalChart.js | 434 + .../raptor/d3/js/models/multiBarTimeSeries.js | 384 + .../raptor/d3/js/models/multiBarTimeSeriesChart.js | 405 + .../fusion/raptor/d3/js/models/multiChart.js | 452 + .../static/fusion/raptor/d3/js/models/ohlcBar.js | 380 + .../raptor/d3/js/models/parallelCoordinates.js | 239 + .../static/fusion/raptor/d3/js/models/pie.js | 400 + .../static/fusion/raptor/d3/js/models/pie.js.bak | 400 + .../static/fusion/raptor/d3/js/models/pieChart.js | 292 + .../static/fusion/raptor/d3/js/models/scatter.js | 674 + .../fusion/raptor/d3/js/models/scatterChart.js | 628 + .../raptor/d3/js/models/scatterPlusLineChart.js | 620 + .../static/fusion/raptor/d3/js/models/sparkline.js | 194 + .../fusion/raptor/d3/js/models/sparklinePlus.js | 295 + .../fusion/raptor/d3/js/models/stackedArea.js | 368 + .../fusion/raptor/d3/js/models/stackedAreaChart.js | 629 + .../webapp/static/fusion/raptor/d3/js/nv.d3.min.js | 1 + .../webapp/static/fusion/raptor/d3/js/outro.js | 1 + .../webapp/static/fusion/raptor/d3/js/sankey.js | 292 + .../webapp/static/fusion/raptor/d3/js/tooltip.js | 490 + .../webapp/static/fusion/raptor/d3/js/utils.js | 152 + .../static/fusion/raptor/dy3/js/dashed-canvas.js | 176 + .../webapp/static/fusion/raptor/dy3/js/data.js | 63 + .../static/fusion/raptor/dy3/js/dygraph-canvas.js | 816 + .../fusion/raptor/dy3/js/dygraph-combined.js | 2 + .../raptor/dy3/js/dygraph-combined_bak_color.js | 2 + .../static/fusion/raptor/dy3/js/dygraph-dev.js | 45 + .../static/fusion/raptor/dy3/js/dygraph-externs.js | 93 + .../static/fusion/raptor/dy3/js/dygraph-gviz.js | 82 + .../raptor/dy3/js/dygraph-interaction-model.js | 676 + .../static/fusion/raptor/dy3/js/dygraph-layout.js | 349 + .../raptor/dy3/js/dygraph-options-reference.js | 867 + .../static/fusion/raptor/dy3/js/dygraph-options.js | 384 + .../fusion/raptor/dy3/js/dygraph-plugin-base.js | 4 + .../fusion/raptor/dy3/js/dygraph-plugin-install.js | 19 + .../static/fusion/raptor/dy3/js/dygraph-tickers.js | 487 + .../static/fusion/raptor/dy3/js/dygraph-utils.js | 1305 + .../webapp/static/fusion/raptor/dy3/js/dygraph.js | 3857 ++ .../webapp/static/fusion/raptor/dy3/js/excanvas.js | 924 + .../static/fusion/raptor/dy3/js/interaction.js | 333 + .../static/fusion/raptor/dy3/js/interaction.min.js | 1 + .../static/fusion/raptor/dy3/js/interaction_sun.js | 303 + .../static/fusion/raptor/dy3/js/moment.min.js | 6 + .../static/fusion/raptor/dy3/js/phantom-driver.js | 206 + .../static/fusion/raptor/dy3/js/phantom-perf.js | 94 + .../static/fusion/raptor/dy3/js/plugins/README | 113 + .../fusion/raptor/dy3/js/plugins/annotations.js | 182 + .../static/fusion/raptor/dy3/js/plugins/axes.js | 315 + .../fusion/raptor/dy3/js/plugins/chart-labels.js | 202 + .../static/fusion/raptor/dy3/js/plugins/grid.js | 124 + .../static/fusion/raptor/dy3/js/plugins/legend.js | 332 + .../fusion/raptor/dy3/js/plugins/range-selector.js | 852 + .../fusion/raptor/dy3/js/rgbcolor/rgbcolor.js | 257 + .../static/fusion/raptor/dy3/js/stacktrace.js | 411 + .../static/fusion/raptor/dy3/js/strftime/Doxyfile | 243 + .../fusion/raptor/dy3/js/strftime/strftime-min.js | 1 + .../fusion/raptor/dy3/js/strftime/strftime.js | 731 + .../static/fusion/raptor/ebz/date_time_picker.css | 557 + .../static/fusion/raptor/ebz/date_time_picker.js | 277 + .../webapp/static/fusion/raptor/ebz/dynamicform.js | 112 + .../main/webapp/static/fusion/raptor/ebz/moment.js | 3688 ++ .../webapp/static/fusion/raptor/ebz/multiselect.js | 62 + .../webapp/static/fusion/raptor/ebz/quick_links.js | 33 + .../fusion/raptor/ebz/report_chart_wizard.html | 313 + .../fusion/raptor/ebz/report_chart_wizard.js | 671 + .../static/fusion/raptor/ebz/report_run.html | 67 + .../webapp/static/fusion/raptor/ebz/report_run.js | 293 + .../static/fusion/raptor/ebz/report_search.html | 34 + .../static/fusion/raptor/ebz/report_search.js | 136 + .../fusion/raptor/images/ATT_Business_logo.gif | Bin 0 -> 8203 bytes .../static/fusion/raptor/images/RAPTOR_BANNER.jpg | Bin 0 -> 6249 bytes .../static/fusion/raptor/images/accessicon.gif | Bin 0 -> 329 bytes .../webapp/static/fusion/raptor/images/active.gif | Bin 0 -> 338 bytes .../webapp/static/fusion/raptor/images/addbtn.png | Bin 0 -> 662 bytes .../static/fusion/raptor/images/ajax-loader.gif | Bin 0 -> 673 bytes .../static/fusion/raptor/images/arrow_add.gif | Bin 0 -> 469 bytes .../static/fusion/raptor/images/arrow_add_edge.gif | Bin 0 -> 564 bytes .../fusion/raptor/images/arrow_add_multiple.gif | Bin 0 -> 748 bytes .../static/fusion/raptor/images/arrow_add_one.gif | Bin 0 -> 631 bytes .../static/fusion/raptor/images/arrow_back.gif | Bin 0 -> 621 bytes .../static/fusion/raptor/images/arrow_cancel.gif | Bin 0 -> 652 bytes .../static/fusion/raptor/images/arrow_left.gif | Bin 0 -> 382 bytes .../static/fusion/raptor/images/arrow_left2.gif | Bin 0 -> 399 bytes .../static/fusion/raptor/images/arrow_next.gif | Bin 0 -> 609 bytes .../static/fusion/raptor/images/arrow_plus.gif | Bin 0 -> 67 bytes .../fusion/raptor/images/arrow_reorder_all.gif | Bin 0 -> 686 bytes .../fusion/raptor/images/arrow_reorder_all.png | Bin 0 -> 29837 bytes .../static/fusion/raptor/images/arrow_right.gif | Bin 0 -> 381 bytes .../static/fusion/raptor/images/arrow_right2.gif | Bin 0 -> 399 bytes .../static/fusion/raptor/images/arrow_save.gif | Bin 0 -> 606 bytes .../static/fusion/raptor/images/att-globe1.jpg | Bin 0 -> 5855 bytes .../static/fusion/raptor/images/button_import.png | Bin 0 -> 546 bytes .../static/fusion/raptor/images/calendar_icon.gif | Bin 0 -> 552 bytes .../fusion/raptor/images/calendar_icon_nav.gif | Bin 0 -> 538 bytes .../fusion/raptor/images/calendar_icon_nav1.gif | Bin 0 -> 1065 bytes .../static/fusion/raptor/images/calender_icon.gif | Bin 0 -> 552 bytes .../fusion/raptor/images/columnblankdown.gif | Bin 0 -> 192 bytes .../static/fusion/raptor/images/columnblankup.gif | Bin 0 -> 193 bytes .../static/fusion/raptor/images/columndown.gif | Bin 0 -> 124 bytes .../static/fusion/raptor/images/columnup.gif | Bin 0 -> 126 bytes .../static/fusion/raptor/images/crosshairs.png | Bin 0 -> 218 bytes .../static/fusion/raptor/images/csv_icon.gif | Bin 0 -> 447 bytes .../static/fusion/raptor/images/deleteicon.gif | Bin 0 -> 80 bytes .../static/fusion/raptor/images/downloadicon.gif | Bin 0 -> 74 bytes .../static/fusion/raptor/images/excel2007.jpg | Bin 0 -> 761 bytes .../static/fusion/raptor/images/excel2007.png | Bin 0 -> 3186 bytes .../static/fusion/raptor/images/excelicon.gif | Bin 0 -> 1055 bytes .../fusion/raptor/images/excelicon_multi.gif | Bin 0 -> 1026 bytes .../fusion/raptor/images/green-arrow-right.gif | Bin 0 -> 201 bytes .../static/fusion/raptor/images/green-arrow.gif | Bin 0 -> 195 bytes .../static/fusion/raptor/images/grnarrowdn.gif | Bin 0 -> 74 bytes .../static/fusion/raptor/images/grnarrowup.gif | Bin 0 -> 106 bytes .../main/webapp/static/fusion/raptor/images/h.png | Bin 0 -> 380 bytes .../static/fusion/raptor/images/inactive.gif | Bin 0 -> 352 bytes .../webapp/static/fusion/raptor/images/loader.gif | Bin 0 -> 958 bytes .../webapp/static/fusion/raptor/images/loading.gif | Bin 0 -> 4176 bytes .../static/fusion/raptor/images/lookup_arrow.gif | Bin 0 -> 645 bytes .../static/fusion/raptor/images/maps/blue.png | Bin 0 -> 1309 bytes .../static/fusion/raptor/images/maps/green.png | Bin 0 -> 1190 bytes .../static/fusion/raptor/images/maps/lightblue.png | Bin 0 -> 1269 bytes .../fusion/raptor/images/maps/map_iphone.jpg | Bin 0 -> 712 bytes .../static/fusion/raptor/images/maps/orange.png | Bin 0 -> 3413 bytes .../static/fusion/raptor/images/maps/pink.png | Bin 0 -> 1321 bytes .../static/fusion/raptor/images/maps/purple.png | Bin 0 -> 1324 bytes .../static/fusion/raptor/images/maps/red.png | Bin 0 -> 1305 bytes .../static/fusion/raptor/images/maps/yellow.png | Bin 0 -> 1309 bytes .../webapp/static/fusion/raptor/images/minus.gif | Bin 0 -> 75 bytes .../static/fusion/raptor/images/modify_icon.gif | Bin 0 -> 246 bytes .../webapp/static/fusion/raptor/images/page.gif | Bin 0 -> 554 bytes .../static/fusion/raptor/images/pdficon_large.gif | Bin 0 -> 434 bytes .../static/fusion/raptor/images/pdficon_small.gif | Bin 0 -> 361 bytes .../static/fusion/raptor/images/pen_paper.gif | Bin 0 -> 618 bytes .../webapp/static/fusion/raptor/images/plus.gif | Bin 0 -> 78 bytes .../static/fusion/raptor/images/popupicon.gif | Bin 0 -> 79 bytes .../static/fusion/raptor/images/position.png | Bin 0 -> 267 bytes .../webapp/static/fusion/raptor/images/printer.gif | Bin 0 -> 1019 bytes .../static/fusion/raptor/images/progress.gif | Bin 0 -> 734 bytes .../static/fusion/raptor/images/question_mark.jpg | Bin 0 -> 426 bytes .../static/fusion/raptor/images/quickhelp_dk.gif | Bin 0 -> 155 bytes .../static/fusion/raptor/images/quickhelp_lt.gif | Bin 0 -> 897 bytes .../webapp/static/fusion/raptor/images/r_back.gif | Bin 0 -> 918 bytes .../webapp/static/fusion/raptor/images/raptor.jpg | Bin 0 -> 889 bytes .../static/fusion/raptor/images/raptor_logo.gif | Bin 0 -> 3150 bytes .../static/fusion/raptor/images/raptor_logo.jpg | Bin 0 -> 1827 bytes .../static/fusion/raptor/images/required.gif | Bin 0 -> 854 bytes .../static/fusion/raptor/images/shareicon.gif | Bin 0 -> 542 bytes .../main/webapp/static/fusion/raptor/images/sv.png | Bin 0 -> 11373 bytes .../static/fusion/raptor/images/tab_left.gif | Bin 0 -> 137 bytes .../static/fusion/raptor/images/tab_left_sel.gif | Bin 0 -> 106 bytes .../static/fusion/raptor/images/tab_right.gif | Bin 0 -> 138 bytes .../static/fusion/raptor/images/tab_right_sel.gif | Bin 0 -> 104 bytes .../static/fusion/raptor/images/test_run.gif | Bin 0 -> 330 bytes .../webapp/static/fusion/raptor/images/text.gif | Bin 0 -> 141 bytes .../raptor/images/tree/context-menu-gradient.gif | Bin 0 -> 807 bytes .../raptor/images/tree/dhtmlgoodies_folder.gif | Bin 0 -> 1120 bytes .../raptor/images/tree/dhtmlgoodies_minus.gif | Bin 0 -> 197 bytes .../raptor/images/tree/dhtmlgoodies_plus.gif | Bin 0 -> 200 bytes .../raptor/images/tree/dhtmlgoodies_sheet.gif | Bin 0 -> 906 bytes .../images/tree/dhtmlgoodies_sheet_crosstab.gif | Bin 0 -> 1144 bytes .../images/tree/dhtmlgoodies_sheet_dashboard.gif | Bin 0 -> 1164 bytes .../images/tree/dhtmlgoodies_sheet_graph.gif | Bin 0 -> 983 bytes .../fusion/raptor/images/tree/dragDrop_ind1.gif | Bin 0 -> 53 bytes .../fusion/raptor/images/tree/dragDrop_ind2.gif | Bin 0 -> 56 bytes .../fusion/raptor/images/tree/folder_close.gif | Bin 0 -> 283 bytes .../fusion/raptor/images/tree/folder_dots.gif | Bin 0 -> 68 bytes .../fusion/raptor/images/tree/folder_folder.gif | Bin 0 -> 980 bytes .../fusion/raptor/images/tree/folder_lastsub.gif | Bin 0 -> 78 bytes .../fusion/raptor/images/tree/folder_open.gif | Bin 0 -> 286 bytes .../fusion/raptor/images/tree/folder_sub.gif | Bin 0 -> 265 bytes .../fusion/raptor/images/tree/grnarrowleft.gif | Bin 0 -> 854 bytes .../fusion/raptor/images/tree/grnarrowright.gif | Bin 0 -> 845 bytes .../static/fusion/raptor/images/txt_icon.gif | Bin 0 -> 154 bytes .../webapp/static/fusion/raptor/images/uF033.png | Bin 0 -> 520 bytes .../webapp/static/fusion/raptor/images/uF034.png | Bin 0 -> 536 bytes .../webapp/static/fusion/raptor/images/uF035.png | Bin 0 -> 487 bytes .../webapp/static/fusion/raptor/images/uF036.png | Bin 0 -> 482 bytes .../fusion/raptor/img/BorderLayout-24x24.png | Bin 0 -> 1369 bytes .../static/fusion/raptor/img/Calendar-16x16.png | Bin 0 -> 552 bytes .../static/fusion/raptor/img/DeleteCross-16x16.png | Bin 0 -> 750 bytes .../webapp/static/fusion/raptor/img/addbtn.png | Bin 0 -> 662 bytes .../static/fusion/raptor/img/button_import.png | Bin 0 -> 546 bytes .../fusion/raptor/img/copyicon-highlighted.png | Bin 0 -> 264 bytes .../webapp/static/fusion/raptor/img/copyicon.png | Bin 0 -> 235 bytes .../static/fusion/raptor/img/cross-small.png | Bin 0 -> 291 bytes .../webapp/static/fusion/raptor/img/csv_icon.gif | Bin 0 -> 447 bytes .../webapp/static/fusion/raptor/img/csv_icon.jpg | Bin 0 -> 632 bytes .../webapp/static/fusion/raptor/img/csv_icon.png | Bin 0 -> 938 bytes .../fusion/raptor/img/deleteicon-highlighted.gif | Bin 0 -> 592 bytes .../fusion/raptor/img/deleteicon-highlighted.png | Bin 0 -> 566 bytes .../webapp/static/fusion/raptor/img/deleteicon.gif | Bin 0 -> 579 bytes .../static/fusion/raptor/img/downloadicon.gif | Bin 0 -> 74 bytes .../webapp/static/fusion/raptor/img/editicon.gif | Bin 0 -> 360 bytes .../webapp/static/fusion/raptor/img/excel2007.jpg | Bin 0 -> 761 bytes .../webapp/static/fusion/raptor/img/excelicon.gif | Bin 0 -> 1055 bytes .../static/fusion/raptor/img/excelicon_multi.gif | Bin 0 -> 1026 bytes .../static/fusion/raptor/img/executeicon.png | Bin 0 -> 1076 bytes .../static/fusion/raptor/img/file_import.png | Bin 0 -> 653 bytes .../static/fusion/raptor/img/pdficon_small.gif | Bin 0 -> 361 bytes .../webapp/static/fusion/raptor/img/pen_paper.gif | Bin 0 -> 618 bytes .../static/fusion/raptor/img/pencil-small.png | Bin 0 -> 309 bytes .../webapp/static/fusion/raptor/img/report-add.png | Bin 0 -> 724 bytes .../static/fusion/raptor/img/report-favorite.png | Bin 0 -> 693 bytes .../webapp/static/fusion/raptor/img/report-my.png | Bin 0 -> 739 bytes .../static/fusion/raptor/img/report-public.png | Bin 0 -> 776 bytes .../webapp/static/fusion/raptor/img/report.png | Bin 0 -> 563 bytes .../webapp/static/fusion/raptor/img/reports.png | Bin 0 -> 769 bytes .../webapp/static/fusion/raptor/img/search.gif | Bin 0 -> 223 bytes .../webapp/static/fusion/raptor/img/search.png | Bin 0 -> 3501 bytes .../webapp/static/fusion/raptor/img/tick-small.png | Bin 0 -> 283 bytes .../static/fusion/raptor/js/CalendarPopup.js | 1486 + .../main/webapp/static/fusion/raptor/js/ajax.js | 214 + .../fusion/raptor/js/ajax_dynamic_content.js | 97 + .../static/fusion/raptor/js/cingular_button.js | 217 + .../main/webapp/static/fusion/raptor/js/drupal.js | 1018 + .../static/fusion/raptor/js/editabledropdown.js | 363 + .../static/fusion/raptor/js/form-field-tooltip.js | 715 + .../main/webapp/static/fusion/raptor/js/gmap.js | 634 + .../main/webapp/static/fusion/raptor/js/jquery.js | 4376 ++ .../webapp/static/fusion/raptor/js/jquery.min.js | 154 + .../static/fusion/raptor/js/label_quantum.js | 5 + .../webapp/static/fusion/raptor/js/nova_button.js | 1184 + .../static/fusion/raptor/js/other_scripts.js | 331 + .../fusion/raptor/js/persist_table_header.js | 47 + .../static/fusion/raptor/js/prototype-1.6.0.3.js | 4320 ++ .../main/webapp/static/fusion/raptor/js/raptor.js | 314 + .../static/fusion/raptor/js/rounded-corners.js | 353 + .../main/webapp/static/fusion/raptor/js/script.js | 482 + .../webapp/static/fusion/raptor/js/tree/ajax.js | 194 + .../static/fusion/raptor/js/tree/context-menu.js | 444 + .../fusion/raptor/js/tree/drag-drop-folder-tree.js | 1059 + .../webapp/static/fusion/raptor/uigrid/ui-grid.css | 1971 + .../webapp/static/fusion/raptor/uigrid/ui-grid.eot | Bin 0 -> 8728 bytes .../webapp/static/fusion/raptor/uigrid/ui-grid.js | 26735 ++++++++++++ .../webapp/static/fusion/raptor/uigrid/ui-grid.svg | 34 + .../webapp/static/fusion/raptor/uigrid/ui-grid.ttf | Bin 0 -> 8564 bytes .../static/fusion/raptor/uigrid/ui-grid.woff | Bin 0 -> 4792 bytes .../static/fusion/raptor/uigrid/vfs_fonts.js | 1 + .../static/fusion/sample/css/images/blank.gif | Bin 0 -> 49 bytes .../webapp/static/fusion/sample/css/scribble.css | 40 + .../webapp/static/fusion/sample/css/slider.css | 142 + .../static/fusion/sample/css/spacegallery.css | 18 + .../webapp/static/fusion/sample/css/welcome.css | 169 + .../static/fusion/sample/html/area_chart.html | 49 + .../static/fusion/sample/html/bar_chart.html | 95 + .../static/fusion/sample/html/d3_gauges_demo.html | 39 + .../fusion/sample/html/data/speedometer2.csv | 16 + .../fusion/sample/html/data/speedometer3.csv | 2 + .../static/fusion/sample/html/data/worddata.csv | 22 + .../webapp/static/fusion/sample/html/donut_d3.html | 43 + .../static/fusion/sample/html/js/area_chart.min.js | 1 + .../static/fusion/sample/html/js/donut.min.js | 1 + .../static/fusion/sample/html/js/gauges.min.js | 1 + .../static/fusion/sample/html/js/line_chart.min.js | 1 + .../static/fusion/sample/html/js/pie_chart.min.js | 1 + .../static/fusion/sample/html/js/worddata.min.js | 1 + .../static/fusion/sample/html/line_chart.html | 49 + .../static/fusion/sample/html/pie_chart.html | 38 + .../static/fusion/sample/html/wordcloud.html | 37 + .../static/fusion/sample/images/Calendar-16x16.png | Bin 0 -> 552 bytes .../static/fusion/sample/images/arrow-next.png | Bin 0 -> 1561 bytes .../static/fusion/sample/images/arrow-prev.png | Bin 0 -> 1557 bytes .../images/carousel/slide_b_drive_test_map.png | Bin 0 -> 202465 bytes .../sample/images/carousel/slide_b_eppt_county.png | Bin 0 -> 21222 bytes .../images/carousel/slide_b_eppt_regression.png | Bin 0 -> 11536 bytes .../images/carousel/slide_b_ios_throughput.png | Bin 0 -> 26131 bytes .../sample/images/carousel/slide_b_lata_map.png | Bin 0 -> 192031 bytes .../images/carousel/slide_b_lata_map_legend.png | Bin 0 -> 3021 bytes .../images/carousel/slide_b_nova_sdn_map.png | Bin 0 -> 179361 bytes .../static/fusion/sample/images/copyicon.png | Bin 0 -> 235 bytes .../static/fusion/sample/images/deleteicon.gif | Bin 0 -> 579 bytes .../static/fusion/sample/images/example-frame.png | Bin 0 -> 33699 bytes .../webapp/static/fusion/sample/images/loading.gif | Bin 0 -> 6820 bytes .../static/fusion/sample/images/tunnels/1_mon.png | Bin 0 -> 22762 bytes .../static/fusion/sample/images/tunnels/2_tue.png | Bin 0 -> 22772 bytes .../static/fusion/sample/images/tunnels/3_wed.png | Bin 0 -> 24012 bytes .../static/fusion/sample/images/tunnels/4_thu.png | Bin 0 -> 23902 bytes .../static/fusion/sample/images/tunnels/5_fri.png | Bin 0 -> 22349 bytes .../static/fusion/sample/images/tunnels/6_sat.png | Bin 0 -> 23674 bytes .../static/fusion/sample/images/tunnels/7_sun.png | Bin 0 -> 22845 bytes .../fusion/sample/images/tunnels/BH_DLSTX_IN.png | Bin 0 -> 10575 bytes .../fusion/sample/images/tunnels/BH_DLSTX_OUT.png | Bin 0 -> 10460 bytes .../static/fusion/sample/images/tunnels/BH_Nat.png | Bin 0 -> 10420 bytes .../fusion/sample/images/tunnels/BH_Nat_Def.png | Bin 0 -> 8941 bytes .../sample/images/tunnels/BH_Nat_Priority.png | Bin 0 -> 10590 bytes .../webapp/static/fusion/sample/js/FusionCharts.js | 361 + .../main/webapp/static/fusion/sample/js/charts.js | 132 + .../src/main/webapp/static/fusion/sample/js/eye.js | 34 + .../fusion/sample/js/jquery.flexslider-min.js | 5 + .../webapp/static/fusion/sample/js/scribble.js | 19 + .../static/fusion/sample/js/slides.min.jquery.js | 20 + .../webapp/static/fusion/sample/js/spacegallery.js | 235 + .../main/webapp/static/fusion/sample/js/utils.js | 252 + .../fusion/sample/org_chart/css/bootstrap.min.css | 351 + .../static/fusion/sample/org_chart/css/custom.css | 97 + .../sample/org_chart/css/jquery.jOrgChart.css | 51 + .../fusion/sample/org_chart/css/prettify.css | 1 + .../static/fusion/sample/org_chart/example.html | 85 + .../fusion/sample/org_chart/example_vsp.html | 88 + .../static/fusion/sample/org_chart/images/bkgd.png | Bin 0 -> 133 bytes .../fusion/sample/org_chart/images/raspberry.jpg | Bin 0 -> 5755 bytes .../fusion/sample/org_chart/jquery.jOrgChart.js | 267 + .../static/fusion/sample/org_chart/prettify.js | 28 + .../src/main/webapp/static/js/jquery-1.10.2.js | 9789 +++++ .../src/main/webapp/static/js/jquery-ui.js | 16617 +++++++ .../src/main/webapp/static/js/jquery.mask.min.js | 12 + .../src/main/webapp/static/js/modalService.js | 169 + .../src/main/webapp/static/js/search.js | 829 + .../core/MockApplicationContextTestSuite.java | 128 + .../java/org/openecomp/fusionapp/SanityTest.java | 20 + .../controller/CollaborationControllerTest.java | 27 + .../openecomp/fusionapp/controller/NetMapTest.java | 19 + .../fusionapp/service/ProfileServiceTest.java | 37 + dcae_dmaapbc_webapp/upgrade-sdk-notes.txt | 31 + 2880 files changed, 674418 insertions(+) create mode 100644 .gitreview create mode 100644 .idea/dmaapbc.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 LICENSE.txt create mode 100644 dcae_dmaapbc_client/.gitignore create mode 100644 dcae_dmaapbc_client/README.md create mode 100644 dcae_dmaapbc_client/pom.xml create mode 100644 dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/DmaapBcRestClient.java create mode 100644 dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/HttpStatusAndResponse.java create mode 100644 dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/IRestClientConstants.java create mode 100644 dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/SimpleRestClientBase.java create mode 100644 dcae_dmaapbc_client/src/main/resources/logback.xml create mode 100644 dcae_dmaapbc_client/src/test/java/org/openecomp/dcae/dmaapbc/TestDmaapBcRestClient.java create mode 100644 dcae_dmaapbc_model/.gitignore create mode 100644 dcae_dmaapbc_model/README.md create mode 100644 dcae_dmaapbc_model/pom.xml create mode 100644 dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Node.java create mode 100644 dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Pub.java create mode 100644 dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Sub.java create mode 100644 dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DcaeLocation.java create mode 100644 dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/Dmaap.java create mode 100644 dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DmaapObject.java create mode 100644 dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/ErrorResponse.java create mode 100644 dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/Feed.java create mode 100644 dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Client.java create mode 100644 dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Cluster.java create mode 100644 dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/Topic.java create mode 100644 dcae_dmaapbc_webapp/.gitignore create mode 100644 dcae_dmaapbc_webapp/README.md create mode 100644 dcae_dmaapbc_webapp/build-scripts/build-deploy-app.sh create mode 100644 dcae_dmaapbc_webapp/db-scripts/EcompSdkDDLMySql_1610_Complete_OS.sql create mode 100644 dcae_dmaapbc_webapp/db-scripts/EcompSdkDMLMySql_1610_Complete_OS.sql create mode 100644 dcae_dmaapbc_webapp/db-scripts/dbca-user-mysql.sql create mode 100644 dcae_dmaapbc_webapp/db-scripts/mysqldump-notes.txt create mode 100644 dcae_dmaapbc_webapp/dbc-app-deployment-guide.txt create mode 100644 dcae_dmaapbc_webapp/ecomp_dcae_logo_170x130.png create mode 100644 dcae_dmaapbc_webapp/ecomp_dcae_logo_360x218.png create mode 100644 dcae_dmaapbc_webapp/ecomp_dcae_logo_680x520.png create mode 100644 dcae_dmaapbc_webapp/pom.xml create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataBusHomeController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataRouterController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DbcappRestrictedBaseController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DmaapAccessController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/HealthCheckController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/ManifestController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/MessageRouterController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/domain/DmaapAccess.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestClient.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/HttpComponentsClientHttpRequestFactoryBasicAuth.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessService.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessServiceImpl.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/util/DbcappProperties.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppConfig.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppInitializer.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/HibernateMappingLocations.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/AngularSinglePageController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/CallflowController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/ElasticSearchController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/LeafletMapContoller.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/NetMapController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/PostDroolsController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/UserProfileController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/WelcomeController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/model/Result.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/service/AdminAuthExtension.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/InitUebHandler.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/MainUebHandler.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/WidgetNotificationHandler.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/CustomLoggingFilter.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/LoggerDemo.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/ValidateEncodingApp.java create mode 100644 dcae_dmaapbc_webapp/src/main/resources/att-rules.drl create mode 100644 dcae_dmaapbc_webapp/src/main/resources/cache.ccf create mode 100644 dcae_dmaapbc_webapp/src/main/resources/logback.xml create mode 100644 dcae_dmaapbc_webapp/src/main/resources/mchange-log.properties create mode 100644 dcae_dmaapbc_webapp/src/main/resources/portal.properties create mode 100644 dcae_dmaapbc_webapp/src/main/resources/state-rules.drl create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/quartz.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_app_fusion.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_db_fusion.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_pdf.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/sql.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/system.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp-definitions.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.hbm.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/defs/definitions.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/conf/fusion.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/defs/definitions.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/.gitignore create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast_list.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/collaborateList.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/data_out.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_footer.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_header.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/loginSnippet.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_noheader_nofooter.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_report_embedded.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_search_demo.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_suggest_demo.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/frame_insert.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/include.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/jcs_admin.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/meta.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_role.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_rolefunction.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/post_search.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile_search.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_function_list.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_list.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/usage_list.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/webrtc/collaboration.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Fusion.hbm.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Workflow.hbm.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/error.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/leafletMap.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/login_external.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/net_map.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/user_profile.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/welcome.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/att-globe-16x16.ico create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-pub-sub-list-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_add_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_edit_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_pub_sub_list_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/modal-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-home-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-spa-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-style.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-yn-filter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_home_body.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_popup_templates.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_spa.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/manifest-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-client-list-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_client_list_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/bg-top-bar.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/checkmark_yes.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/downCaret.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/home-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/cut.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/door.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/export.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/import.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_add.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_copy.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_delete.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_edit.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_paste.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/trash.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_flat_75_ffffff_40x100.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_65_ffffff_1x400.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_75_dadada_1x400.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_222222_256x240.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_2e83ff_256x240.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_454545_256x240.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_888888_256x240.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_cd0a0a_256x240.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/pipe.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/selfArrow.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/smallPostit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/trashCan.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/trashCanFull.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/triangle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/index.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/mocks/networkElements.yml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/BPMNconversion.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/app.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/arrayManipulation.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/arrows.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/ase.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/backend.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/.bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/CONTRIBUTING create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/Gruntfile.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/LICENSE create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/NOTICE create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/README.md create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/component.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg-min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/dr.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/main.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/prism.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/topcoat-desktop-light.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/stylesheet.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search_dark.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/js/prism.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/reference.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dr.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/history.md create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/package.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/template.dot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/test.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.gitignore create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/LICENSE create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/README.md create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/diagram-js.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-modeler.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-modeler.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-modeler.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-navigated-viewer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-navigated-viewer.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-navigated-viewer.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-viewer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-viewer.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-viewer.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/.bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/ChangeLog.md create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/LICENSE.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/README.md create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/jquery.mousewheel.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/jquery.mousewheel.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/lodash/.bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/lodash/LICENSE create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/lodash/bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/lodash/lodash.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/lodash/lodash.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/sax/lib/sax.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/buttons.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/convertToYaml.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/customContextMenus.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dependencies/Blob.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dependencies/base64.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dependencies/interact.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dependencies/jquery-2.1.4.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dependencies/js-yaml.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dependencies/saveSvgAsPng.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dictionary.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dragMoveListener.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dragMoveListenerArrow.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dropzones.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/elements_ase.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootbox.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootstrap.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/contextMenu.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/jquery-ui.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/jquery.tooltipster.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/nodes.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/notes.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/printpdf.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/resizable.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/scroll.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/services.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/styles/menus/bs.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/styles/menus/jquery-ui.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/styles/menus/tooltipster.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/styles/style.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/view-models/ase_view.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/view-models/grid_view.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/view-models/index.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/view-models/sidebar_view.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/view-models/topbar_view.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-animate.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-animate.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-animate.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-aria.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-aria.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-aria.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-cookies.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-cookies.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-cookies.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-csp.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-loader.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-loader.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-loader.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-message-format.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-message-format.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-message-format.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-messages.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-messages.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-messages.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-mocks.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-resource.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-resource.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-resource.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-route.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-route.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-route.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-sanitize.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-sanitize.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-sanitize.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-scenario.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-touch.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-touch.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-touch.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/errors.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/version.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/version.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-ui/ui-bootstrap-tpls-1.1.2.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-ui/ui-bootstrap-tpls-1.2.4.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/bootstrap/bs.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/css/nv.d3.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/cie.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/colorbrewer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/core.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/crossfilter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/crossfilter.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.geom.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.layout.cloud.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.layout.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.v2.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.v2.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.v3.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/fisheye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/hive.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/horizon.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/interactiveLayer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/intro.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/axis-min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/axis.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/axis.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/backup/bullet.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/backup/bulletChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/boilerplate.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/bullet.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/bulletChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/cumulativeLineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/discreteBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/discreteBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/distribution.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/historicalBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/historicalBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/indentedTree.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/legend.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/line.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/lineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/linePlusBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/linePlusBarWithFocusChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/lineWithFisheye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/lineWithFisheyeChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/lineWithFocusChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiBarHorizontal.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiBarHorizontalChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiBarTimeSeries.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiBarTimeSeriesChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/ohlcBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/parallelCoordinates.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/pie.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/pieChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/scatter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/scatterChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/scatterPlusLineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/sparkline.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/sparklinePlus.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/stackedArea.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/stackedAreaChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/nv.d3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/nv.d3.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/outro.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/sankey.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/tooltip.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/utils.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular-animate.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular-cookies.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular-route.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular-route.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular-sanitize.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular-touch.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/app.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/checklist-model.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/checklist-model.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/gestures.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/ng_base.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/ui-charts-tpls.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/ebz_header/footer.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/ebz_header/header.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/ebz_header/portal_ebz_header.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/fn-ebz.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/images/headerChatIcon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/images/no_favorites_star.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/js/attHeaderSnippet.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/js/footer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/att-abs-tpls.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/att-abs-tpls.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/base.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/btn.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/demo.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/dtpk.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/frms.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/ie/backgroundsize.min.htc create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/calendar-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/checkbox.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/down.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/icon-close-modal.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/icon-informative-modal.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/icon-warning-modal.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loader.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading-spinner-medium.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading-spinner-orange.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_balls_black-small.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_balls_black.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_balls_blue-small.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_balls_blue.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_balls_white-small.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_balls_white.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_dots.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/magnify_glass.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/oops-exclamation.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/radio.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/select-arrows.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/treearrow.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/up.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/upanddown.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/pages/iconography.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/sldr.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/style.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/tbs.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/.gitignore create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/LICENSE create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/component.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/composer.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/css/ionicons.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/css/ionicons.min.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/fonts/ionicons.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/fonts/ionicons.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/fonts/ionicons.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/fonts/ionicons.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/less/_ionicons-font.less create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/less/_ionicons-icons.less create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/less/_ionicons-variables.less create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/less/ionicons.less create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/alert-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/alert.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-add-contact.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-alarm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-archive.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-arrow-back.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-arrow-down-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-arrow-down-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-arrow-forward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-arrow-up-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-arrow-up-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-battery.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-book.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-calendar.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-call.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-camera.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-chat.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-checkmark.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-clock.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-close.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-contact.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-contacts.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-data.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-developer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-display.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-download.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-drawer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-dropdown.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-earth.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-folder.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-forums.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-friends.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-hand.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-image.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-inbox.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-information.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-keypad.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-lightbulb.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-locate.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-location.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-mail.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-microphone.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-mixer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-more.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-note.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-playstore.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-printer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-promotion.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-reminder.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-remove.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-send.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-settings.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-share.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-social-user.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-social.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-sort.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-stair-drawer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-star.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-stopwatch.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-storage.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-system-back.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-system-home.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-system-windows.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-timer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-trash.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-user-menu.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-volume.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-wifi.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/aperture.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/archive.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-down-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-down-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-down-c.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-expand.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-graph-down-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-graph-down-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-graph-up-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-graph-up-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-left-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-left-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-left-c.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-move.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-resize.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-return-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-return-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-right-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-right-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-right-c.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-shrink.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-swap.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-up-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-up-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-up-c.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/asterisk.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/at.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/bag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/battery-charging.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/battery-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/battery-full.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/battery-half.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/battery-low.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/beaker.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/beer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/bluetooth.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/bonfire.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/bookmark.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/briefcase.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/bug.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/calculator.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/calendar.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/camera.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/card.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/cash.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chatbox-working.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chatbox.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chatboxes.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chatbubble-working.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chatbubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chatbubbles.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/checkmark-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/checkmark-round.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/checkmark.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chevron-down.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chevron-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chevron-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chevron-up.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/clipboard.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/clock.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/close-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/close-round.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/close.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/closed-captioning.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/cloud.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/code-download.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/code-working.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/code.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/coffee.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/compass.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/compose.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/connection-bars.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/contrast.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/cube.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/disc.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/document-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/document.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/drag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/earth.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/edit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/egg.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/eject.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/email.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/eye-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/eye.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/female.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/filing.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/film-marker.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/fireball.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/flag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/flame.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/flash-off.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/flash.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/flask.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/folder.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/fork-repo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/fork.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/forward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/funnel.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/game-controller-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/game-controller-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/gear-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/gear-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/grid.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/hammer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/happy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/headphone.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/heart-broken.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/heart.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/help-buoy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/help-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/help.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/home.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/icecream.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/icon-social-google-plus-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/icon-social-google-plus.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/image.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/images.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/information-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/information.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ionic.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-alarm-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-alarm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-albums-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-albums.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-americanfootball-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-americanfootball.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-analytics-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-analytics.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-back.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-down.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-forward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-thin-down.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-thin-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-thin-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-thin-up.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-up.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-at-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-at.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-barcode-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-barcode.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-baseball-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-baseball.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-basketball-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-basketball.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-bell-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-bell.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-bolt-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-bolt.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-bookmarks-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-bookmarks.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-box-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-box.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-briefcase-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-briefcase.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-browsers-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-browsers.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-calculator-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-calculator.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-calendar-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-calendar.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-camera-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-camera.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cart-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cart.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-chatboxes-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-chatboxes.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-chatbubble-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-chatbubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-checkmark-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-checkmark-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-checkmark.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-circle-filled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-circle-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-clock-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-clock.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-close-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-close-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-close.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloud-download-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloud-download.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloud-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloud-upload-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloud-upload.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloud.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloudy-night-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloudy-night.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloudy-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloudy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cog-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cog.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-compose-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-compose.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-contact-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-contact.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-copy-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-copy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-download-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-download.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-drag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-email-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-email.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-expand.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-eye-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-eye.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-fastforward-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-fastforward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-filing-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-filing.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-film-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-film.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-flag-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-flag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-folder-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-folder.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-football-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-football.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-gear-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-gear.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-glasses-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-glasses.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-heart-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-heart.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-help-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-help-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-help.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-home-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-home.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-infinite-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-infinite.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-information-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-information-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-information.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-ionic-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-keypad-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-keypad.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-lightbulb-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-lightbulb.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-location-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-location.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-locked-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-locked.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-loop-strong.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-loop.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-medkit-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-medkit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-mic-off.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-mic-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-mic.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-minus-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-minus-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-minus.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-monitor-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-monitor.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-moon-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-moon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-more-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-more.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-musical-note.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-musical-notes.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-navigate-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-navigate.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-paper-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-paper.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-paperplane-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-paperplane.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-partlysunny-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-partlysunny.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pause-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pause.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-paw-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-paw.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-people-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-people.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-person-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-person.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-personadd-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-personadd.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-photos-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-photos.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pie-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pie.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-play-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-play.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-plus-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-plus-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-plus.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pricetag-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pricetag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pricetags-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pricetags.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-printer-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-printer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pulse-strong.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pulse.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-rainy-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-rainy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-recording-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-recording.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-redo-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-redo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-refresh-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-refresh-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-refresh.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-reload.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-reverse-camera-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-reverse-camera.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-rewind-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-rewind.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-search-strong.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-settings-strong.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-settings.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-shrink.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-skipbackward-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-skipbackward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-skipforward-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-skipforward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-snowy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-speedometer-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-speedometer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-star-half.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-star-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-star.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-stopwatch-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-stopwatch.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-sunny-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-sunny.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-telephone-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-telephone.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-tennisball-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-tennisball.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-thunderstorm-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-thunderstorm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-time-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-time.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-timer-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-timer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-toggle-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-trash-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-trash.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-undo-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-undo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-unlocked-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-unlocked.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-upload-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-upload.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-videocam-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-videocam.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-volume-high.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-volume-low.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-wineglass-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-wineglass.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-world-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-world.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ipad.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/iphone.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ipod.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/jet.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/key.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/knife.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/laptop.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/leaf.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/levels.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/lightbulb.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/link.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/load-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/load-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/load-c.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/load-d.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/location.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/locked.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/log-in.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/log-out.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/loop.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/magnet.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/male.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/man.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/medkit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/merge.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/mic-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/mic-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/mic-c.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/minus-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/minus-round.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/minus.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/model-s.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/monitor.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/more.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/mouse.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/music-note.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/navicon-round.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/navicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/navigate.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/network.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/no-smoking.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/nuclear.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/outlet.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/paper-airplane.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/paperclip.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pause.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/person-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/person-stalker.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/person.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pie-graph.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pin.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pinpoint.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pizza.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/plane.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/planet.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/play.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/playstation.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/plus-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/plus-round.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/plus.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/podium.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pound.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/power.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pricetag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pricetags.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/printer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pull-request.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/qr-scanner.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/quote.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/radio-waves.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/record.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/refresh.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/reply-all.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/reply.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ribbon-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ribbon-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/sad.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/scissors.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/settings.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/share.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/shuffle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/skip-backward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/skip-forward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-android-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-android.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-apple-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-apple.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-bitcoin-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-bitcoin.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-buffer-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-buffer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-designernews-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-designernews.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-dribbble-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-dribbble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-dropbox-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-dropbox.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-facebook-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-facebook.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-foursquare-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-foursquare.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-freebsd-devil.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-github-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-github.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-google-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-google.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-googleplus-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-googleplus.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-hackernews-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-hackernews.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-instagram-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-instagram.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-linkedin-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-linkedin.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-pinterest-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-pinterest.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-reddit-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-reddit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-rss-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-rss.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-skype-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-skype.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-tumblr-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-tumblr.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-tux.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-twitter-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-twitter.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-usd-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-usd.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-vimeo-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-vimeo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-windows-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-windows.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-wordpress-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-wordpress.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-yahoo-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-yahoo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-youtube-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-youtube.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/speakerphone.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/speedometer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/spoon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/star.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/stats-bars.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/steam.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/stop.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/thermometer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/thumbsdown.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/thumbsup.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/toggle-filled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/trash-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/trash-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/trophy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/umbrella.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/university.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/unlocked.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/upload.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/usb.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/videocamera.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/volume-high.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/volume-low.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/volume-medium.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/volume-mute.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/wand.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/waterdrop.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/wifi.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/wineglass.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/woman.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/wrench.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/xbox.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/readme.md create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/scss/_ionicons-font.scss create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/scss/_ionicons-icons.scss create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/scss/_ionicons-variables.scss create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/scss/ionicons.scss create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/alert-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/alert.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-add-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-add.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-alarm-clock.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-alert.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-apps.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-archive.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-back.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-down.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropdown-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropdown.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropleft-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropleft.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropright-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropright.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropup-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropup.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-forward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-up.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-attach.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-bar.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-bicycle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-boat.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-bookmark.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-bulb.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-bus.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-calendar.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-call.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-camera.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-cancel.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-car.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-cart.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-chat.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-checkbox-blank.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-checkbox-outline-blank.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-checkbox-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-checkbox.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-checkmark-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-clipboard.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-close.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-cloud-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-cloud-done.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-cloud-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-cloud.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-color-palette.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-compass.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-contact.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-contacts.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-contract.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-create.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-delete.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-desktop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-document.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-done-all.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-done.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-download.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-drafts.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-exit.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-expand.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-favorite-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-favorite.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-film.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-folder-open.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-folder.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-funnel.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-globe.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-hand.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-hangout.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-happy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-home.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-image.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-laptop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-list.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-locate.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-lock.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-mail.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-map.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-menu.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-microphone-off.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-microphone.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-more-horizontal.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-more-vertical.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-navigate.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-notifications-none.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-notifications-off.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-notifications.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-open.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-options.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-people.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-person-add.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-person.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-phone-landscape.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-phone-portrait.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-pin.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-plane.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-playstore.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-print.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-radio-button-off.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-radio-button-on.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-refresh.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-remove-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-remove.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-restaurant.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-sad.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-search.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-send.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-settings.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-share-alt.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-share.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-star-half.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-star-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-star.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-stopwatch.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-subway.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-sunny.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-sync.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-textsms.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-time.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-train.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-unlock.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-upload.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-volume-down.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-volume-mute.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-volume-off.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-volume-up.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-walk.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-warning.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-watch.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-wifi.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/aperture.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/archive.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-down-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-down-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-down-c.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-expand.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-graph-down-left.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-graph-down-right.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-graph-up-left.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-graph-up-right.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-left-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-left-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-left-c.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-move.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-resize.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-return-left.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-return-right.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-right-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-right-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-right-c.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-shrink.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-swap.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-up-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-up-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-up-c.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/asterisk.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/at.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/backspace-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/backspace.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/bag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/battery-charging.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/battery-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/battery-full.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/battery-half.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/battery-low.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/beaker.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/beer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/bluetooth.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/bonfire.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/bookmark.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/bowtie.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/briefcase.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/bug.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/calculator.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/calendar.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/camera.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/card.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/cash.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chatbox-working.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chatbox.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chatboxes.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chatbubble-working.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chatbubble.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chatbubbles.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/checkmark-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/checkmark-round.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/checkmark.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chevron-down.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chevron-left.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chevron-right.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chevron-up.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/clipboard.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/clock.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/close-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/close-round.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/close.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/closed-captioning.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/cloud.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/code-download.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/code-working.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/code.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/coffee.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/compass.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/compose.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/connection-bars.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/contrast.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/crop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/cube.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/disc.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/document-text.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/document.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/drag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/earth.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/easel.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/edit.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/egg.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/eject.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/email-unread.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/email.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/erlenmeyer-flask-bubbles.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/erlenmeyer-flask.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/eye-disabled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/eye.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/female.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/filing.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/film-marker.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/fireball.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/flag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/flame.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/flash-off.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/flash.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/folder.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/fork-repo.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/fork.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/forward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/funnel.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/gear-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/gear-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/grid.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/hammer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/happy-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/happy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/headphone.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/heart-broken.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/heart.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/help-buoy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/help-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/help.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/home.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/icecream.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/image.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/images.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/information-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/information.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ionic.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-alarm-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-alarm.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-albums-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-albums.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-americanfootball-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-americanfootball.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-analytics-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-analytics.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-back.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-down.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-forward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-left.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-right.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-thin-down.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-thin-left.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-thin-right.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-thin-up.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-up.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-at-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-at.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-barcode-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-barcode.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-baseball-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-baseball.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-basketball-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-basketball.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-bell-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-bell.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-body-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-body.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-bolt-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-bolt.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-book-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-book.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-bookmarks-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-bookmarks.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-box-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-box.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-briefcase-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-briefcase.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-browsers-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-browsers.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-calculator-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-calculator.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-calendar-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-calendar.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-camera-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-camera.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cart-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cart.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-chatboxes-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-chatboxes.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-chatbubble-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-chatbubble.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-checkmark-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-checkmark-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-checkmark.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-circle-filled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-circle-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-clock-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-clock.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-close-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-close-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-close.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloud-download-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloud-download.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloud-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloud-upload-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloud-upload.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloud.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloudy-night-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloudy-night.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloudy-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloudy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cog-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cog.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-color-filter-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-color-filter.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-color-wand-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-color-wand.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-compose-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-compose.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-contact-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-contact.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-copy-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-copy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-crop-strong.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-crop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-download-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-download.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-drag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-email-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-email.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-eye-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-eye.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-fastforward-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-fastforward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-filing-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-filing.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-film-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-film.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flag-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flame-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flame.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flask-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flask.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flower-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flower.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-folder-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-folder.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-football-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-football.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-game-controller-a-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-game-controller-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-game-controller-b-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-game-controller-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-gear-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-gear.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-glasses-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-glasses.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-grid-view-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-grid-view.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-heart-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-heart.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-help-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-help-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-help.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-home-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-home.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-infinite-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-infinite.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-information-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-information-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-information.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-ionic-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-keypad-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-keypad.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-lightbulb-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-lightbulb.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-list-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-list.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-location-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-location.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-locked-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-locked.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-loop-strong.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-loop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-medical-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-medical.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-medkit-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-medkit.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-mic-off.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-mic-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-mic.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-minus-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-minus-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-minus.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-monitor-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-monitor.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-moon-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-moon.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-more-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-more.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-musical-note.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-musical-notes.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-navigate-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-navigate.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-nutrition-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-nutrition.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-paper-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-paper.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-paperplane-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-paperplane.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-partlysunny-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-partlysunny.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pause-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pause.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-paw-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-paw.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-people-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-people.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-person-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-person.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-personadd-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-personadd.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-photos-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-photos.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pie-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pie.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pint-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pint.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-play-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-play.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-plus-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-plus-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-plus.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pricetag-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pricetag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pricetags-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pricetags.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-printer-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-printer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pulse-strong.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pulse.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-rainy-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-rainy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-recording-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-recording.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-redo-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-redo.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-refresh-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-refresh-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-refresh.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-reload.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-reverse-camera-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-reverse-camera.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-rewind-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-rewind.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-rose-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-rose.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-search-strong.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-search.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-settings-strong.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-settings.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-shuffle-strong.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-shuffle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-skipbackward-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-skipbackward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-skipforward-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-skipforward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-snowy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-speedometer-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-speedometer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-star-half.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-star-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-star.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-stopwatch-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-stopwatch.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-sunny-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-sunny.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-telephone-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-telephone.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-tennisball-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-tennisball.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-thunderstorm-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-thunderstorm.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-time-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-time.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-timer-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-timer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-toggle-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-toggle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-trash-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-trash.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-undo-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-undo.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-unlocked-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-unlocked.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-upload-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-upload.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-videocam-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-videocam.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-volume-high.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-volume-low.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-wineglass-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-wineglass.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-world-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-world.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ipad.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/iphone.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ipod.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/jet.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/key.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/knife.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/laptop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/leaf.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/levels.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/lightbulb.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/link.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/load-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/load-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/load-c.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/load-d.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/location.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/lock-combination.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/locked.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/log-in.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/log-out.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/loop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/magnet.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/male.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/man.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/map.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/medkit.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/merge.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/mic-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/mic-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/mic-c.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/minus-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/minus-round.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/minus.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/model-s.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/monitor.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/more.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/mouse.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/music-note.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/navicon-round.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/navicon.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/navigate.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/network.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/no-smoking.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/nuclear.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/outlet.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/paintbrush.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/paintbucket.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/paper-airplane.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/paperclip.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pause.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/person-add.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/person-stalker.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/person.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pie-graph.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pin.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pinpoint.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pizza.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/plane.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/planet.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/play.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/playstation.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/plus-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/plus-round.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/plus.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/podium.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pound.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/power.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pricetag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pricetags.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/printer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pull-request.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/qr-scanner.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/quote.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/radio-waves.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/record.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/refresh.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/reply-all.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/reply.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ribbon-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ribbon-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/sad-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/sad.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/scissors.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/search.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/settings.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/share.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/shuffle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/skip-backward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/skip-forward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-android-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-android.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-angular-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-angular.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-apple-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-apple.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-bitcoin-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-bitcoin.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-buffer-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-buffer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-chrome-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-chrome.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-codepen-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-codepen.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-css3-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-css3.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-designernews-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-designernews.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-dribbble-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-dribbble.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-dropbox-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-dropbox.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-euro-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-euro.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-facebook-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-facebook.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-foursquare-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-foursquare.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-freebsd-devil.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-github-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-github.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-google-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-google.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-googleplus-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-googleplus.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-hackernews-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-hackernews.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-html5-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-html5.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-instagram-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-instagram.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-javascript-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-javascript.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-linkedin-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-linkedin.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-markdown.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-nodejs.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-octocat.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-pinterest-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-pinterest.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-python.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-reddit-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-reddit.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-rss-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-rss.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-sass.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-skype-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-skype.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-snapchat-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-snapchat.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-tumblr-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-tumblr.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-tux.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-twitch-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-twitch.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-twitter-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-twitter.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-usd-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-usd.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-vimeo-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-vimeo.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-whatsapp-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-whatsapp.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-windows-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-windows.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-wordpress-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-wordpress.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-yahoo-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-yahoo.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-yen-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-yen.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-youtube-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-youtube.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/soup-can-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/soup-can.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/speakerphone.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/speedometer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/spoon.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/star.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/stats-bars.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/steam.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/stop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/thermometer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/thumbsdown.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/thumbsup.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/toggle-filled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/toggle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/transgender.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/trash-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/trash-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/trophy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/tshirt-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/tshirt.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/umbrella.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/university.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/unlocked.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/upload.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/usb.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/videocamera.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/volume-high.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/volume-low.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/volume-medium.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/volume-mute.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/wand.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/waterdrop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/wifi.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/wineglass.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/woman.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/wrench.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/xbox.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/css/images/blank.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/css/scribble.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/css/slider.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/css/spacegallery.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/area_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/bar_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/d3_gauges_demo.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/data/speedometer2.csv create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/data/speedometer3.csv create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/data/worddata.csv create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/donut_d3.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/js/area_chart.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/js/donut.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/js/gauges.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/js/line_chart.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/js/pie_chart.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/js/worddata.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/line_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/pie_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/wordcloud.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/Calendar-16x16.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/arrow-next.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/arrow-prev.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_drive_test_map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_eppt_county.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_eppt_regression.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_ios_throughput.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_lata_map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_lata_map_legend.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_nova_sdn_map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/copyicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/deleteicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/example-frame.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/loading.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/1_mon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/2_tue.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/3_wed.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/4_thu.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/5_fri.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/6_sat.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/7_sun.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/BH_DLSTX_IN.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/BH_DLSTX_OUT.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/BH_Nat.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/BH_Nat_Def.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/BH_Nat_Priority.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/FusionCharts.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/charts.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/eye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/scribble.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/slides.min.jquery.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/spacegallery.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/utils.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/css/bootstrap.min.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/css/custom.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/css/jquery.jOrgChart.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/css/prettify.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/example.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/example_vsp.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/images/bkgd.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/images/raspberry.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/jquery.jOrgChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/prettify.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/utils/js/browserCheck.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/fonts/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/ATT_Labs_Logo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/Logo_att_labs.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/Rlogo.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/Thumbs.db create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/action_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/action_list_spacer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/add_tool_button.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/addicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/application_window_bg.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/arrow-next.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/arrow-prev.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/att_angular_gridster/grips.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/att_logo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/backButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/blank.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/blueButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/body_graphic.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/bubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/cache.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/calendar.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/chevron.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/close_container.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/collapsed-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/column-bg.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/copyicon-highlighted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/copyicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/csv_icon.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/csv_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/customers-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/customers-search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/customers.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/decrypted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/deleteicon-highlighted.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/deleteicon-highlighted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/deleteicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/editicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/error_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/example-frame.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/excelicon_multi.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/executeicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/expanded-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/file-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/file_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/file_save-all.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/filter_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/folder_add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/folder_closed.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/folder_delete.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/folder_edit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/folder_open.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/folder_user.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/funnel.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/fusion.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/grayButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/gray_add_tool_button.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/headerChatIcon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/icon_remove_all.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/inactive.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/info_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/layout/panel-e-w-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/layout/panel-n-s-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/leftButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/loading.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/loading_bar.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/login_button.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/logo_att.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/logo_att_header.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/logo_att_header.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/logo_header.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/m1.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/mail.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/bubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/file_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/file_save-all.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/mail.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/profile.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/speechbubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/users.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/minus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/mobile_logo_att_header_black.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/mobile_logo_att_header_grey.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/mobile_logo_att_header_horizontal.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/mobile_logo_att_header_white.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/modify_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/note-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/note-search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/note.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/notes.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/offline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/offlineMsg.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/online.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/page.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/pagination.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/panel-e-w-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/panel-n-s-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/pix.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/plus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/printer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/profile.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/report-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/report-favorite.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/report-my.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/report-public.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/report.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/reports.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-first-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-first-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-last-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-last-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-next-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-next-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-prev-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-prev-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/resultset_last.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/resultset_previous.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/return_to_top.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/rightButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/search_profile.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/sort_asc.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/sort_desc.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/spacer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/success_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/swoosh.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/tab-hm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/tab-v-hm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/tab.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/table-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/table-delete.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/table-edit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/table.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/tabs-bg.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/toolButton.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/toolButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/toolbar.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/users.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/warning_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/webphone.ico create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/whiteButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/att_angular_gridster/angular-gridster.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/att_angular_gridster/ui-gridster-tpls.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/adminController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/admin_menu_edit.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/ase-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/broadcast-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/broadcast-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/collaborate-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/fn_menu_add_popup_controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/jcs-admin-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/modelpopupController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/post-search-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/profile-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/profile-search-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/profileController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/role-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/role-function-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/role-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/rolefunctionpopupController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/rolepopupmodelController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/self-profile-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/usage-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/workflows/workflowApp.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/workflows/workflowController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/workflows/workflowRouting.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/directives/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/directives/footer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/directives/header.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/directives/leftMenu.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/jquery.resize.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/layout/debug.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/layout/jquery-latest.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/layout/jquery-ui-latest.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/layout/jquery.layout-latest.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/modalService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/moment.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/network/net_map.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/services/adminService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/services/headerService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/services/leftMenuService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/services/profileService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/services/userInfoService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/socket/peerBroadcast.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/utils/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/utils/page-resource.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/utils/sandbox-resources.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/admin-page/admin.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/admin-page/profile.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/footer.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/header.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/left_menu.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/admin_closed_loop.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/admin_menu_edit.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/broadcast.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/broadcast_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/collaborate_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/jcs_admin.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/popup_modal.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/popup_modal_fn_menu_add.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/popup_modal_fn_menu_edit.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/popup_modal_role.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/popup_modal_rolefunction.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/post_search.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/profile_detail.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/profile_search.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/role.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/role_function_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/role_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/self_profile.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/usage_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-landing.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-listing.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-listing.html.bak create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-new.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-preview.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-remove.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-schedule.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/webrtc/RTCMultiConnection.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/webrtc/getSourceId.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/styles/att_angular_gridster/sandbox-gridster.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/styles/att_angular_gridster/ui-gridster.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/styles/fusion-sunny.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/styles/jquery-ui.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/styles/layout/layout-default-latest.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/styles/workflows/workflows.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/controller/drools-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/controller/drools-view-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/controller/droolsController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/controller/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/directives/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/services/droolsService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/utils/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/view-models/droolsList.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/view-models/droolsSinglePage.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/view-models/droolsView.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/view-models/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/external/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/fonts/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/7450-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/7450-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/7750-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/7750-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/apn-dns-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/apn-dns-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/atcf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/atcf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/atgw-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/atgw-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/bgcf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/bgcf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/com-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/cpm-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/cpm-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/default-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/dra-epc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/dra-epc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/dra-ims-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/dra-ims-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/dslam-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/dslam-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/eatf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/eatf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ecscf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ecscf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/emsc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/enb-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/enb-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/enum-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/enum-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/esmlc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/esmlc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ettcs-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ettcs-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/gmlc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/gmlc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/hlr-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/hlr-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/hss-epc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/hss-epc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/hss-ims-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/hss-ims-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/icscf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/icscf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ipag-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ipag-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/isbc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/isbc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/iwf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/iwf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/lrf-rdf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/lrf-rdf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/lrg-rdf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mgc8-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mgc8-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mgcf-emsc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mgcf-emsc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mgw-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mgw-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mind-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mind-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mme-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mme-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mrf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mrf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/msc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/msn-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/msn-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/multi-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7450-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7450-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750a-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750a-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750b-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750b-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750c-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750c-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750d-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750d-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/nb-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/nb-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pas-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pas-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pcef-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pcef-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pcrf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pcrf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pcscf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pcscf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pgw-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pgw-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/plrf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/plrf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/psap-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pstn-tdm-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pstn-tdm-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/rg-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/rg-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/rnc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/rnc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sbc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sbc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sccas-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sccas-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/scscf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/scscf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sdg-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sdg-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sgsns4-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sgsns4-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sgw-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sgw-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/siad-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/siad-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ss7-gport-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ss7-gport-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ss7gport-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ss7gport-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/switch-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/tas-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/tas-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/transcoder-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/transcoder-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ue-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/uephone-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/usp-dns-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/usp-dns-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/images/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/controller/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/controller/sample-page-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/controller/sample-page-iframe-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/controller/sampleController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/directives/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/utils/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/view-models/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/view-models/sample.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/view-models/sampleWithIframe.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/view-models/singlePageSample.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/styles/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/index.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/manifest.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/css/att_angular_gridster/sandbox-gridster.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/css/att_angular_gridster/ui-gridster.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/css/fusion-sunny.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/css/jquery-ui.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/css/layout/layout-default-latest.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/css/nv.d3.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/cie.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/colorbrewer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/core.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/crossfilter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/crossfilter.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.geom.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.layout.cloud.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.layout.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.v2.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.v2.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.v3.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/fisheye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/hive.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/horizon.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/interactiveLayer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/intro.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/axis-min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/axis.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/axis.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/backup/bullet.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/backup/bulletChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/boilerplate.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/bullet.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/bulletChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/cumulativeLineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/discreteBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/discreteBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/distribution.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/historicalBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/historicalBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/indentedTree.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/legend.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/line.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/lineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/linePlusBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/linePlusBarWithFocusChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/lineWithFisheye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/lineWithFisheyeChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/lineWithFocusChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiBarHorizontal.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiBarHorizontalChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiBarTimeSeries.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiBarTimeSeriesChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/ohlcBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/parallelCoordinates.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/pie.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/pieChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/scatter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/scatterChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/scatterPlusLineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/sparkline.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/sparklinePlus.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/stackedArea.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/stackedAreaChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/nv.d3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/nv.d3.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/outro.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/sankey.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/tooltip.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/utils.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/Logo_att_labs.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/Rlogo.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/Thumbs.db create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/action_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/action_list_spacer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/add_tool_button.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/addicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/application_window_bg.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/arrow-next.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/arrow-prev.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/att_angular_gridster/grips.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/backButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/blank.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/blueButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/bubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/cache.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/calendar.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/chevron.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/close_container.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/collapsed-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/column-bg.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/copyicon-highlighted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/copyicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/csv_icon.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/csv_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/customers-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/customers-search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/customers.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/decrypted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/deleteicon-highlighted.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/deleteicon-highlighted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/deleteicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/ecomp.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/ecomp_trans.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/editicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/error_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/example-frame.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/excelicon_multi.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/executeicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/expanded-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/file-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/file_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/file_save-all.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/filter_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/folder_add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/folder_closed.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/folder_delete.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/folder_edit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/folder_open.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/folder_user.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/funnel.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/fusion.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/grayButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/gray_add_tool_button.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/headerChatIcon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/icon_remove_all.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/inactive.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/info_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/layout/panel-e-w-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/layout/panel-n-s-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/leftButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/loading.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/loading_bar.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/login_button.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/logo_att.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/logo_att_header.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/logo_att_header.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/logo_header.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/m1.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/mail.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/bubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/file_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/file_save-all.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/mail.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/profile.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/speechbubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/users.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/minus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/mobile_logo_att_header_black.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/mobile_logo_att_header_grey.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/mobile_logo_att_header_horizontal.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/mobile_logo_att_header_white.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/modify_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/no_favorites_star.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/note-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/note-search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/note.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/notes.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/offline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/offlineMsg.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/online.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/page.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/pagination.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/panel-e-w-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/panel-n-s-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/pix.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/plus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/printer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/profile.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/report-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/report-favorite.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/report-my.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/report-public.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/report.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/reports.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-first-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-first-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-last-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-last-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-next-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-next-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-prev-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-prev-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/resultset_last.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/resultset_previous.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/return_to_top.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/rightButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/search_profile.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/sort_asc.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/sort_desc.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/spacer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/success_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/swoosh.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/tab-hm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/tab-v-hm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/tab.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/table-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/table-delete.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/table-edit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/table.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/tabs-bg.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/toolButton.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/toolButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/toolbar.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/users.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/warning_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/webphone.ico create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/whiteButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/att_angular_gridster/angular-gridster.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/att_angular_gridster/ui-gridster-tpls.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/jquery.resize.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/layout/debug.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/layout/jquery-latest.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/layout/jquery-ui-latest.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/layout/jquery.layout-latest.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/moment.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/Style.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/bd_quantum_raptor.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/calendar.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/dashboard.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/drupal.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/form-field-tooltip.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/mobile_raptor.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/novamap.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/picker.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/ral.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/raptor.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/tree/context-menu.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/tree/drag-drop-folder-tree.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/css/nv.d3.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/cie.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/colorbrewer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/core.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/crossfilter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/crossfilter.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.geom.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.layout.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.v2.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.v2.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.v3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.v3.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/fisheye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/hive.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/horizon.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/interactiveLayer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/intro.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/axis-min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/axis.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/axis.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/boilerplate.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/bullet.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/bulletChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/cumulativeLineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/discreteBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/discreteBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/distribution.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/historicalBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/historicalBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/indentedTree.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/legend.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/line.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/lineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/linePlusBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/linePlusBarWithFocusChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/lineWithFisheye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/lineWithFisheyeChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/lineWithFocusChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiBarHorizontal.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiBarHorizontalChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiBarTimeSeries.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiBarTimeSeriesChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/ohlcBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/parallelCoordinates.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/pie.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/pie.js.bak create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/pieChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/scatter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/scatterChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/scatterPlusLineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/sparkline.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/sparklinePlus.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/stackedArea.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/stackedAreaChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/nv.d3.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/outro.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/sankey.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/tooltip.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/utils.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dashed-canvas.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/data.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-canvas.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-combined.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-combined_bak_color.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-dev.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-externs.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-gviz.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-interaction-model.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-layout.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-options-reference.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-options.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-plugin-base.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-plugin-install.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-tickers.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-utils.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/excanvas.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/interaction.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/interaction.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/interaction_sun.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/moment.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/phantom-driver.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/phantom-perf.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/README create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/annotations.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/axes.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/chart-labels.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/grid.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/legend.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/range-selector.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/rgbcolor/rgbcolor.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/stacktrace.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/strftime/Doxyfile create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/strftime/strftime-min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/strftime/strftime.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/date_time_picker.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/date_time_picker.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/dynamicform.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/moment.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/multiselect.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/quick_links.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/report_chart_wizard.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/report_chart_wizard.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/report_run.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/report_run.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/report_search.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/report_search.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/ATT_Business_logo.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/RAPTOR_BANNER.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/accessicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/active.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/addbtn.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/ajax-loader.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_add.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_add_edge.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_add_multiple.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_add_one.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_back.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_cancel.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_left.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_left2.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_next.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_plus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_reorder_all.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_reorder_all.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_right.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_right2.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_save.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/att-globe1.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/button_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/calendar_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/calendar_icon_nav.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/calendar_icon_nav1.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/calender_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/columnblankdown.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/columnblankup.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/columndown.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/columnup.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/crosshairs.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/csv_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/deleteicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/downloadicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/excel2007.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/excel2007.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/excelicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/excelicon_multi.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/green-arrow-right.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/green-arrow.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/grnarrowdn.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/grnarrowup.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/h.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/inactive.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/loader.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/loading.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/lookup_arrow.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/blue.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/green.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/lightblue.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/map_iphone.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/orange.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/pink.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/purple.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/red.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/yellow.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/minus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/modify_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/page.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/pdficon_large.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/pdficon_small.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/pen_paper.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/plus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/popupicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/position.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/printer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/progress.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/question_mark.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/quickhelp_dk.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/quickhelp_lt.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/r_back.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/raptor.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/raptor_logo.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/raptor_logo.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/required.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/shareicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/sv.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tab_left.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tab_left_sel.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tab_right.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tab_right_sel.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/test_run.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/text.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/context-menu-gradient.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_folder.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_minus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_plus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_sheet.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_sheet_crosstab.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_sheet_dashboard.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_sheet_graph.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dragDrop_ind1.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dragDrop_ind2.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/folder_close.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/folder_dots.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/folder_folder.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/folder_lastsub.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/folder_open.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/folder_sub.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/grnarrowleft.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/grnarrowright.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/txt_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/uF033.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/uF034.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/uF035.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/uF036.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/BorderLayout-24x24.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/Calendar-16x16.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/DeleteCross-16x16.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/addbtn.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/button_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/copyicon-highlighted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/copyicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/cross-small.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/csv_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/csv_icon.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/csv_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/deleteicon-highlighted.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/deleteicon-highlighted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/deleteicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/downloadicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/editicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/excel2007.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/excelicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/excelicon_multi.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/executeicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/file_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/pdficon_small.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/pen_paper.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/pencil-small.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/report-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/report-favorite.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/report-my.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/report-public.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/report.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/reports.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/search.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/tick-small.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/CalendarPopup.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/ajax.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/ajax_dynamic_content.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/cingular_button.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/drupal.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/editabledropdown.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/form-field-tooltip.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/gmap.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/jquery.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/jquery.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/label_quantum.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/nova_button.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/other_scripts.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/persist_table_header.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/prototype-1.6.0.3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/raptor.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/rounded-corners.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/script.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/tree/ajax.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/tree/context-menu.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/tree/drag-drop-folder-tree.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/ui-grid.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/ui-grid.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/ui-grid.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/ui-grid.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/ui-grid.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/ui-grid.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/vfs_fonts.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/css/images/blank.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/css/scribble.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/css/slider.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/css/spacegallery.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/css/welcome.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/area_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/bar_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/d3_gauges_demo.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/data/speedometer2.csv create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/data/speedometer3.csv create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/data/worddata.csv create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/donut_d3.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/js/area_chart.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/js/donut.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/js/gauges.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/js/line_chart.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/js/pie_chart.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/js/worddata.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/line_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/pie_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/wordcloud.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/Calendar-16x16.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/arrow-next.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/arrow-prev.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_drive_test_map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_eppt_county.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_eppt_regression.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_ios_throughput.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_lata_map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_lata_map_legend.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_nova_sdn_map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/copyicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/deleteicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/example-frame.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/loading.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/1_mon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/2_tue.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/3_wed.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/4_thu.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/5_fri.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/6_sat.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/7_sun.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/BH_DLSTX_IN.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/BH_DLSTX_OUT.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat_Def.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat_Priority.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/FusionCharts.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/charts.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/eye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/jquery.flexslider-min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/scribble.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/slides.min.jquery.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/spacegallery.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/utils.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/css/bootstrap.min.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/css/custom.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/css/jquery.jOrgChart.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/css/prettify.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/example.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/example_vsp.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/images/bkgd.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/images/raspberry.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/jquery.jOrgChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/prettify.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/js/jquery-1.10.2.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/js/jquery-ui.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/js/jquery.mask.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/js/modalService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/js/search.js create mode 100644 dcae_dmaapbc_webapp/src/test/java/org/openecomp/fusion/core/MockApplicationContextTestSuite.java create mode 100644 dcae_dmaapbc_webapp/src/test/java/org/openecomp/fusionapp/SanityTest.java create mode 100644 dcae_dmaapbc_webapp/src/test/java/org/openecomp/fusionapp/controller/CollaborationControllerTest.java create mode 100644 dcae_dmaapbc_webapp/src/test/java/org/openecomp/fusionapp/controller/NetMapTest.java create mode 100644 dcae_dmaapbc_webapp/src/test/java/org/openecomp/fusionapp/service/ProfileServiceTest.java create mode 100644 dcae_dmaapbc_webapp/upgrade-sdk-notes.txt diff --git a/.gitreview b/.gitreview new file mode 100644 index 0000000..5d062a3 --- /dev/null +++ b/.gitreview @@ -0,0 +1,4 @@ +[gerrit] +host=gerrit.openecomp.org +port=29418 +project=ui/dmaapbc.git \ No newline at end of file diff --git a/.idea/dmaapbc.iml b/.idea/dmaapbc.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/dmaapbc.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..107a11b --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..68b4a5b --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..b0405f8 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1486565644891 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..880bbc9 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,19 @@ +/* + * ============LICENSE_START=========================================================== + * ==================================================================================== + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ==================================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================================== + * ECOMP and OpenECOMP are trademarks and service marks of AT&T Intellectual Property. + */ \ No newline at end of file diff --git a/dcae_dmaapbc_client/.gitignore b/dcae_dmaapbc_client/.gitignore new file mode 100644 index 0000000..d4111ff --- /dev/null +++ b/dcae_dmaapbc_client/.gitignore @@ -0,0 +1,2 @@ +/.settings/ +/target/ diff --git a/dcae_dmaapbc_client/README.md b/dcae_dmaapbc_client/README.md new file mode 100644 index 0000000..a803c4a --- /dev/null +++ b/dcae_dmaapbc_client/README.md @@ -0,0 +1,17 @@ + +### DCAE DMaaP Bus Controller API Client + +Provides a Java client for using the DCAE DMaaP Bus Controller API via REST. +Implements all API methods. +Initial motivation was to support the Bus Controller webapp developed in 1610. + +#### Build Instructions + +This project is organized as a mvn project for a jar package. + +#### Contact + +Chris Lott, cl778h + +#### Release Notes +Version 1.0 \ No newline at end of file diff --git a/dcae_dmaapbc_client/pom.xml b/dcae_dmaapbc_client/pom.xml new file mode 100644 index 0000000..d6c03b5 --- /dev/null +++ b/dcae_dmaapbc_client/pom.xml @@ -0,0 +1,199 @@ + + + 4.0.0 + + + org.openecomp.ui.dmaapbc + dmaap-bc-client + 1.0.0 + DCAE DMaaP Bus Controller REST Client + Java client for using the DMaaP Bus Controller API via REST. + + https://gitlab/projects/ST_DBPA/repos/dcae_dmaapbc_client/browse + scm:git:ssh://git@gitlab/st_dbpa/dcae_dmaapbc_client.git + + + + UTF-8 + true + + + + + + openecomp-snapshots + Nexus Maven Central - Snapshots + https://ecomp-nexus:8443/repository/maven-snapshots/ + + + + openecomp + Nexus Maven Central - Releases + https://ecomp-nexus:8443/repository/maven-releases/ + + + + + + + doclint-java8-disable + + [1.8,) + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + -Xdoclint:none + + + + + + + + + + + org.apache.maven.plugins + maven-scm-plugin + 1.8.1 + + developerConnection + branch + master + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + **/logback.xml + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.3 + + + attach-javadocs + + jar + + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.0.0 + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + ${skiptests} + + + + + org.apache.maven.plugins + maven-release-plugin + 2.5.3 + + + + + + + + org.openecomp.ui.dmaapbc + dmaap-bc-model + 1.0.0 + + + ch.qos.logback + logback-classic + 1.1.1 + + + com.fasterxml.jackson.core + jackson-core + 2.6.3 + + + com.fasterxml.jackson.core + jackson-databind + 2.6.3 + + + org.apache.httpcomponents + httpclient + 4.5 + + + org.slf4j + slf4j-api + 1.7.21 + + + org.slf4j + jcl-over-slf4j + 1.7.21 + + + junit + junit + 4.12 + + + + + + + + nexus-snapshots + OpenECOMP Nexus Maven Central - Snapshots + https://ecomp-nexus:8443/repository/maven-snapshots/ + + + + nexus + OpenECOMP Nexus Maven Central - Releases + https://ecomp-nexus:8443/repository/maven-releases/ + + + + diff --git a/dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/DmaapBcRestClient.java b/dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/DmaapBcRestClient.java new file mode 100644 index 0000000..f8a58e9 --- /dev/null +++ b/dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/DmaapBcRestClient.java @@ -0,0 +1,1480 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller REST Client + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaap.bcapi.client; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +import org.apache.http.client.utils.URIBuilder; +import org.openecomp.dcae.dmaapbc.model.DR_Node; +import org.openecomp.dcae.dmaapbc.model.DR_Pub; +import org.openecomp.dcae.dmaapbc.model.DR_Sub; +import org.openecomp.dcae.dmaapbc.model.DcaeLocation; +import org.openecomp.dcae.dmaapbc.model.Dmaap; +import org.openecomp.dcae.dmaapbc.model.DmaapObject; +import org.openecomp.dcae.dmaapbc.model.ErrorResponse; +import org.openecomp.dcae.dmaapbc.model.Feed; +import org.openecomp.dcae.dmaapbc.model.MR_Client; +import org.openecomp.dcae.dmaapbc.model.MR_Cluster; +import org.openecomp.dcae.dmaapbc.model.Topic; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Provides methods to communicate with the DMaaP Bus Controller REST API. This + * hides all JSON; instead it accepts and returns Java objects. + */ +public class DmaapBcRestClient extends SimpleRestClientBase { + + private static Logger logger = LoggerFactory.getLogger(DmaapBcRestClient.class); + + // Omit leading and trailing slashes here + private static final String DCAELOCATIONS = "dcaeLocations"; + private static final String DMAAP = "dmaap"; + private static final String DR_NODES = "dr_nodes"; + private static final String DR_PUBS = "dr_pubs"; + private static final String DR_SUBS = "dr_subs"; + private static final String FEEDS = "feeds"; + private static final String TOPICS = "topics"; + private static final String MR_CLUSTERS = "mr_clusters"; + private static final String MR_CLIENTS = "mr_clients"; + + /** + * Reusable JSON (de)serializer + */ + private final ObjectMapper mapper; + + /** + * URL of the DMAAP REST endpoint + */ + private final String dmaapRestUrl; + + /** + * Constructor that configures the client for the specified endpoint using + * no authentication. + * + * @param dmaapRestUrl + */ + public DmaapBcRestClient(final String dmaapRestUrl) { + super(); + this.dmaapRestUrl = dmaapRestUrl; + this.mapper = new ObjectMapper(); + // Don't serialize null-value fields in objects + this.mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + } + + /** + * Constructor that onfigures the client for the specified endpoint using + * the specified username and password for basic HTTP authentication. + * + * @param dmaapRestUrl + * @param username + * @param password + */ + public DmaapBcRestClient(final String dmaapRestUrl, final String username, final String password) { + super(username, password); + this.dmaapRestUrl = dmaapRestUrl; + this.mapper = new ObjectMapper(); + // Don't serialize null-value fields in objects + this.mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + } + + /** + * Configures the behavior of the JSON deserializer used to build business + * objects (e.g., a Feed) from REST responses. + * + * @param failOnUnknownProperties + * If true, rejects JSON responses with unexpected fields + * (default behavior); if false, ignores unexpected fields. + */ + public void setFailOnUnknownProperties(boolean failOnUnknownProperties) { + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, failOnUnknownProperties); + } + + /** + * Gets the DMaaP endpoint URL that is used by methods in this class. + * + * @return dmaapEndpointUrl + */ + public String getDmaapRestUrl() { + return this.dmaapRestUrl; + } + + ///////////////////////////////////////////////////////////////////// + + /** + * Gets a list of DCAE locations. + * + * @return List of DmaapObject: list contains DcaeLocation object(s) on + * success; a single ErrorResponse object if the remote site rejects + * the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public List getDcaeLocations() throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(DCAELOCATIONS)); + logger.debug("getDcaeLocations: resp is {}", hsr); + if (hsr == null) + throw new Exception("getDcaeLocations: unexpected null response"); + + List responseList = null; + try { + TypeReference> typeRef = new TypeReference>() { + }; + responseList = mapper.readValue(hsr.getResponseString(), typeRef); + } catch (Exception ex) { + logger.debug("getDcaeLocations: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + responseList = new ArrayList(); + responseList.add(errResp); + } + return responseList; + } + + /** + * Gets the DCAE location with the specified name. + * + * @param locName + * name of the location to get + * @return DmaapObject: a DcaeLocation object on success; an ErrorResponse + * object if the remote site rejects the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public DmaapObject getDcaeLocation(final String locName) throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(DCAELOCATIONS, locName)); + logger.debug("getDcaeLocation: resp is {}", hsr); + if (hsr == null) + throw new Exception("getDcaeLocation: unexpected null response"); + + DmaapObject response = null; + try { + response = mapper.readValue(hsr.getResponseString(), DcaeLocation.class); + } catch (Exception ex) { + logger.debug("getDcaeLocation: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + } + return response; + } + + /** + * Creates a DCAE location in DMaaP. + * + * @param dcaeLoc + * DcaeLocation to be created + * @return Status and response: expect 200 and a DcaeLocation on success; a + * code and an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse postDcaeLocation(DcaeLocation dcaeLoc) throws Exception { + String jsonBody = mapper.writeValueAsString(dcaeLoc); + HttpStatusAndResponse hsr = postRestContent(buildDmaapUri(DCAELOCATIONS), jsonBody); + if (hsr == null) + throw new Exception("postDcaeLocation: unexpected null response"); + logger.debug("postDcaeLocation: resp is {}", hsr); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("postDcaeLocation: null response body"); + return response; + } + try { + DcaeLocation resp = mapper.readValue(hsr.getResponseString(), DcaeLocation.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("postDcaeLocation: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Deletes the DCAE location with the specified name. + * + * @param locName + * Name of the location to delete + * @return Status and response: expect 204 and a DcaeLocation on success; a + * code and an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse deleteDcaeLocation(final String locName) throws Exception { + HttpStatusAndResponse hsr = deleteRestContent(buildDmaapUri(DCAELOCATIONS, locName)); + logger.debug("deleteDcaeLocation: resp is {}", hsr); + if (hsr == null) + throw new Exception("deleteDcaeLocation: unexpected null response"); + // Returns a loc on success, error message string on error. + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("deleteDcaeLocation: null response body"); + return response; + } + try { + DcaeLocation resp = mapper.readValue(hsr.getResponseString(), DcaeLocation.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("deleteDcaeLocation: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Updates a DCAE location. + * + * @param dcaeLoc + * DCAE Location to be updated + * @return Status and response; expect 200 and a DcaeLocation on success, a + * string error on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse putDcaeLocation(DcaeLocation dcaeLoc) throws Exception { + String jsonBody = mapper.writeValueAsString(dcaeLoc); + HttpStatusAndResponse hsr = putRestContent(buildDmaapUri(DCAELOCATIONS, dcaeLoc.getDcaeLocationName()), jsonBody); + logger.debug("putDcaeLocation: resp is {}", hsr); + if (hsr == null) + throw new Exception("putDcaeLocation: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("putDcaeLocation: null response body"); + return response; + } + try { + DcaeLocation resp = mapper.readValue(hsr.getResponseString(), DcaeLocation.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("putDcaeLocation: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + ///////////////////////////////////////////////////////////////////// + + /** + * Gets the DMAAP instance for this DCAE deployment. + * + * @return DmaapObject: a Dmaap object on success; an ErrorResponse object + * if the remote site rejects the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public DmaapObject getDmaap() throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(DMAAP)); + logger.debug("getDmaap: resp is {}", hsr); + if (hsr == null) + throw new Exception("getDmaap: unexpected null response"); + DmaapObject response = null; + try { + response = mapper.readValue(hsr.getResponseString(), Dmaap.class); + } catch (Exception ex) { + logger.debug("getDmaap: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + } + return response; + } + + /** + * Creates a new DMaaP set system wide configuration settings for the + * dcaeEnvironment + * + * @param dmaap + * @return Status and response: expect 200 and a Dmaap on success; a code + * and an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse postDmaap(Dmaap dmaap) throws Exception { + String jsonBody = mapper.writeValueAsString(dmaap); + HttpStatusAndResponse hsr = postRestContent(buildDmaapUri(DMAAP), jsonBody); + if (hsr == null) + throw new Exception("postDmaap: unexpected null response"); + logger.debug("postDmaap: resp is {}", hsr); + // Returns ? on success, error message string on error. + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("postDmaap: null response body"); + return response; + } + try { + Dmaap resp = mapper.readValue(hsr.getResponseString(), Dmaap.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("postDmaap: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Updates DMaaP system wide configuration settings for the dcaeEnvironment. + * + * @param dmaap + * @return Status and response; expect 200 and a DR_Pub on success; a code + * and and ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse putDmaap(Dmaap dmaap) throws Exception { + String jsonBody = mapper.writeValueAsString(dmaap); + // Oddly, this PUT has no ID parameter in the URL + HttpStatusAndResponse hsr = putRestContent(buildDmaapUri(DMAAP), jsonBody); + if (hsr == null) + throw new Exception("putDmaap: unexpected null response"); + logger.debug("putDmaap: resp is {}", hsr); + // Returns ? on success, error message string on error. + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("putDmaap: null response body"); + return response; + } + try { + Dmaap resp = mapper.readValue(hsr.getResponseString(), Dmaap.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("putDmaap: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + // NO DELETE_DMAAP METHOD + + ///////////////////////////////////////////////////////////////////// + + /** + * Gets a list of data router nodes. + * + * @return List of DmaapObject: list contains DR_Node object(s) on success; + * a single ErrorResponse object if the remote site rejects the + * request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public List getDRNodes() throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(DR_NODES)); + logger.debug("getDRNodes: resp is {}", hsr); + if (hsr == null) + throw new Exception("getDRNodes: unexpected null response"); + + List responseList = null; + try { + TypeReference> typeRef = new TypeReference>() { + }; + responseList = mapper.readValue(hsr.getResponseString(), typeRef); + } catch (Exception ex) { + logger.debug("getDRNodes: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + responseList = new ArrayList(); + responseList.add(errResp); + } + return responseList; + } + + /** + * Gets a data router node with the specified ID. + * + * @param fqdn + * Name of the node to get + * @return DmaapObject: a DR_Node object on success; an ErrorResponse object + * if the remote site rejects the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public DmaapObject getDRNode(final String fqdn) throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(DR_NODES, fqdn)); + logger.debug("getDRNode: resp is {}", hsr); + if (hsr == null) + throw new Exception("getDRNode: unexpected null response"); + DmaapObject response = null; + try { + response = mapper.readValue(hsr.getResponseString(), DR_Node.class); + } catch (Exception ex) { + logger.debug("getDRNode: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + } + return response; + } + + /** + * Creates a data router node. + * + * @param drNode + * Node to be created + * @return Status and response: expect 200 and a DR_Node on success; a code + * and an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse postDRNode(DR_Node drNode) throws Exception { + String jsonBody = mapper.writeValueAsString(drNode); + HttpStatusAndResponse hsr = postRestContent(buildDmaapUri(DR_NODES), jsonBody); + logger.debug("postDRNode: resp is {}", hsr); + if (hsr == null) + throw new Exception("postDRNode: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("postDRNode: null response body"); + return response; + } + try { + DR_Node resp = mapper.readValue(hsr.getResponseString(), DR_Node.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("postDRNode: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Updates a data router node. + * + * @param drNode + * Node to be updated + * @return Status and response: expect 200 and a DR_Node on success; a code + * and an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse putDRNode(DR_Node drNode) throws Exception { + String jsonBody = mapper.writeValueAsString(drNode); + HttpStatusAndResponse hsr = putRestContent(buildDmaapUri(DR_NODES, drNode.getFqdn()), jsonBody); + logger.debug("putDRNode: resp is {}", hsr); + if (hsr == null) + throw new Exception("putDRNode: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("putDRNode: null response body"); + return response; + } + try { + DR_Node resp = mapper.readValue(hsr.getResponseString(), DR_Node.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("postDRNode: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Deletes the data router node with the specified FQDN. + * + * @param fqdn + * Name of the node to delete + * @return Status and response: expect 204 and a null on success; a code and + * an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse deleteDRNode(final String fqdn) throws Exception { + HttpStatusAndResponse hsr = deleteRestContent(buildDmaapUri(DR_NODES, fqdn)); + logger.debug("deleteDRNode: resp is {}", hsr); + if (hsr == null) + throw new Exception("deleteDRNode: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("deleteDRNode: null response body"); + return response; + } + try { + DR_Node resp = mapper.readValue(hsr.getResponseString(), DR_Node.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("deleteDRNode: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + ///////////////////////////////////////////////////////////////////// + + /** + * Gets a list of data router publishers. + * + * @return List of DmaapObject: list contains DR_Pub object(s) on success; a + * single ErrorResponse object if the remote site rejects the + * request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public List getDRPubs() throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(DR_PUBS)); + logger.debug("getDRPubs: resp is {}", hsr); + if (hsr == null) + throw new Exception("getDRPubs: unexpected null response"); + List responseList = null; + try { + TypeReference> typeRef = new TypeReference>() { + }; + responseList = mapper.readValue(hsr.getResponseString(), typeRef); + } catch (Exception ex) { + logger.debug("getDRPubs: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + responseList = new ArrayList(); + responseList.add(errResp); + } + return responseList; + } + + /** + * Gets a data router publisher with the specified ID. + * + * @param pubId + * ID of the publisher to get + * @return DmaapObject: a DR_Pub object on success; an ErrorResponse object + * if the remote site rejects the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public DmaapObject getDRPub(final String pubId) throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(DR_PUBS, pubId)); + logger.debug("getDRPub: resp is {}", hsr); + if (hsr == null) + throw new Exception("getDRPub: unexpected null response"); + DmaapObject response = null; + try { + response = mapper.readValue(hsr.getResponseString(), DR_Pub.class); + } catch (Exception ex) { + logger.debug("getDRPub: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + } + return response; + } + + /** + * Creates a data router publisher. + * + * @param drPub + * @return Status and response: expect 200 and a DR_Pub on success; a code + * and an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse postDRPub(DR_Pub drPub) throws Exception { + String jsonBody = mapper.writeValueAsString(drPub); + HttpStatusAndResponse hsr = postRestContent(buildDmaapUri(DR_PUBS), jsonBody); + logger.debug("postDRPub: resp is {}", hsr); + if (hsr == null) + throw new Exception("postDRPub: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("postDRPub: null response body"); + return response; + } + try { + DR_Pub resp = mapper.readValue(hsr.getResponseString(), DR_Pub.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("postDRPub: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Updates a data router publisher. + * + * @param drPub + * Publisher to be updated + * @return Status and response: expect 200 and a DR_Pub on success, a code + * and an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse putDRPub(DR_Pub drPub) throws Exception { + String jsonBody = mapper.writeValueAsString(drPub); + HttpStatusAndResponse hsr = putRestContent(buildDmaapUri(DR_PUBS, drPub.getPubId()), jsonBody); + logger.debug("putDRPub: resp is {}", hsr); + if (hsr == null) + throw new Exception("putDRPub: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("putDRPub: null response body"); + return response; + } + try { + DR_Pub resp = mapper.readValue(hsr.getResponseString(), DR_Pub.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("postDRPub: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Deletes the data router publisher with the specified ID. + * + * @param pubId + * ID of the publisher to delete + * @return Status and response: expect 204 and a null on success; a code and + * an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse deleteDRPub(final String pubId) throws Exception { + HttpStatusAndResponse hsr = deleteRestContent(buildDmaapUri(DR_PUBS, pubId)); + logger.debug("deleteDRPub: resp is {}", hsr); + if (hsr == null) + throw new Exception("deleteDRPub: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("deleteDRPub: null response body"); + return response; + } + try { + DR_Pub resp = mapper.readValue(hsr.getResponseString(), DR_Pub.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("deleteDRPub: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + ///////////////////////////////////////////////////////////////////// + + /** + * Gets a list of data router subscribers. + * + * @return List of DmaapObject: list contains DR_Sub object(s) on success; a + * single ErrorResponse object if the remote site rejects the + * request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public List getDRSubs() throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(DR_SUBS)); + logger.debug("getDRSubs: resp is {}", hsr); + if (hsr == null) + throw new Exception("getDRSubs: unexpected null response"); + List responseList = null; + try { + TypeReference> typeRef = new TypeReference>() { + }; + responseList = mapper.readValue(hsr.getResponseString(), typeRef); + } catch (Exception ex) { + logger.debug("getDRSubs: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + responseList = new ArrayList(); + responseList.add(errResp); + } + return responseList; + } + + /** + * Gets a data router subscriber with the specified ID. + * + * @param subId + * ID of the subscriber to get + * @return DmaapObject: a DR_Sub object on success; an ErrorResponse object + * if the remote site rejects the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public DmaapObject getDRSub(final String subId) throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(DR_SUBS, subId)); + logger.debug("getDRPub: resp is {}", hsr); + if (hsr == null) + throw new Exception("getDRSub: unexpected null response"); + DmaapObject response = null; + try { + response = mapper.readValue(hsr.getResponseString(), DR_Sub.class); + } catch (Exception ex) { + logger.debug("getDRSub: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + } + return response; + } + + /** + * Creates a data router subscriber. + * + * @param drSub + * @return Status and response: expect 200 and a DR_Sub on success; a code + * and an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse postDRSub(DR_Sub drSub) throws Exception { + String jsonBody = mapper.writeValueAsString(drSub); + HttpStatusAndResponse hsr = postRestContent(buildDmaapUri(DR_SUBS), jsonBody); + logger.debug("postDRSub: resp is {}", hsr); + if (hsr == null) + throw new Exception("postDRSub: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("postDRSub: null response body"); + return response; + } + try { + DR_Sub resp = mapper.readValue(hsr.getResponseString(), DR_Sub.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("postDRSub: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Updates a data router subscriber. + * + * @param drSub + * Subscriber to be updated + * @return Status and response; expect 200 and a DR_Sub on success, a string + * error on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse putDRSub(DR_Sub drSub) throws Exception { + String jsonBody = mapper.writeValueAsString(drSub); + HttpStatusAndResponse hsr = putRestContent(buildDmaapUri(DR_SUBS, drSub.getSubId()), jsonBody); + logger.debug("putDRSub: resp is {}", hsr); + if (hsr == null) + throw new Exception("putDRSub: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("putDRSub: null response body"); + return response; + } + try { + DR_Sub resp = mapper.readValue(hsr.getResponseString(), DR_Sub.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("putDRSub: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Deletes the data router subscriber with the specified ID. + * + * @param subId + * ID of the subscriber to delete + * @return Status and response: expect 204 and a null on success; a code and + * an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse deleteDRSub(final String subId) throws Exception { + HttpStatusAndResponse hsr = deleteRestContent(buildDmaapUri(DR_SUBS, subId)); + logger.debug("deleteDRSub: resp is {}", hsr); + if (hsr == null) + throw new Exception("deleteDRSub: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("deleteDRSub: null response body"); + return response; + } + try { + DR_Sub resp = mapper.readValue(hsr.getResponseString(), DR_Sub.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("deleteDRSub: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + ///////////////////////////////////////////////////////////////////// + + /** + * Gets a list of data router feeds. + * + * @return List of DmaapObject: list contains DcaeLocation object(s) on + * success; a single ErrorResponse object if the remote site rejects + * the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public List getFeeds() throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(FEEDS)); + logger.debug("getFeeds: resp is {}", hsr); + if (hsr == null) + throw new Exception("getFeeds: unexpected null response"); + List responseList = null; + try { + TypeReference> typeRef = new TypeReference>() { + }; + responseList = mapper.readValue(hsr.getResponseString(), typeRef); + } catch (Exception ex) { + logger.debug("getFeeds: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + responseList = new ArrayList(); + responseList.add(errResp); + } + return responseList; + } + + /** + * Gets a data router feed with the specified ID. + * + * @param feedId + * ID of the feed to get + * @return DmaapObject: a Feed object on success; an ErrorResponse object if + * the remote site rejects the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public DmaapObject getFeed(final String feedId) throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(FEEDS, feedId)); + logger.debug("getFeed: resp is {}", hsr); + if (hsr == null) + throw new Exception("getFeed: unexpected null response"); + DmaapObject response = null; + try { + response = mapper.readValue(hsr.getResponseString(), Feed.class); + } catch (Exception ex) { + logger.debug("getFeed: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + } + return response; + } + + /** + * Creates a feed and adds any specified pubs and subs. + * + * @param feed + * @return Status and response: expect 200 and a Feed on success; a code and + * an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse postFeed(Feed feed) throws Exception { + String jsonBody = mapper.writeValueAsString(feed); + HttpStatusAndResponse hsr = postRestContent(buildDmaapUri(FEEDS), jsonBody); + logger.debug("postFeed: resp is {}", hsr); + if (hsr == null) + throw new Exception("postFeed: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("postFeed: null response body"); + return response; + } + try { + Feed resp = mapper.readValue(hsr.getResponseString(), Feed.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("postFeed: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Updates a data router feed. + * + * @param feed + * Feed to be updated + * @return Status and response: expect 200 and a Feed on success; a code and + * an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse putFeed(Feed feed) throws Exception { + String jsonBody = mapper.writeValueAsString(feed); + HttpStatusAndResponse hsr = putRestContent(buildDmaapUri(FEEDS, feed.getFeedId()), jsonBody); + logger.debug("putFeed: resp is {}", hsr); + if (hsr == null) + throw new Exception("putFeed: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("putFeed: null response body"); + return response; + } + try { + Feed resp = mapper.readValue(hsr.getResponseString(), Feed.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("putFeed: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Deletes the data router feed with the specified ID. + * + * @param feedId + * ID of the feed to delete + * @return Status and response: expect 204 and a null on success; a code and + * an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse deleteFeed(final String feedId) throws Exception { + HttpStatusAndResponse hsr = deleteRestContent(buildDmaapUri(FEEDS, feedId)); + logger.debug("deleteFeed: resp is {}", hsr); + if (hsr == null) + throw new Exception("deleteFeed: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("deleteFeed: null response body"); + return response; + } + try { + Feed resp = mapper.readValue(hsr.getResponseString(), Feed.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("deleteFeed: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + ///////////////////////////////////////////////////////////////////// + + /** + * Gets a list of message router topics. + * + * @return List of DmaapObject: list contains Topic object(s) on success; a + * single ErrorResponse object if the remote site rejects the + * request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public List getTopics() throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(TOPICS)); + logger.debug("getTopics: resp is {}", hsr); + if (hsr == null) + throw new Exception("getTopics: unexpected null response"); + List responseList = null; + try { + TypeReference> typeRef = new TypeReference>() { + }; + responseList = mapper.readValue(hsr.getResponseString(), typeRef); + } catch (Exception ex) { + logger.debug("getTopics: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + responseList = new ArrayList(); + responseList.add(errResp); + } + return responseList; + } + + /** + * Gets the message router topic with the specified FQTN. + * + * @param fqtn + * Fully qualified topic name + * @return DmaapObject: a Topic object on success; an ErrorResponse object + * if the remote site rejects the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public DmaapObject getTopic(final String fqtn) throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(TOPICS, fqtn)); + logger.debug("getTopic: resp is {}", hsr); + if (hsr == null) + throw new Exception("getTopic: unexpected null response"); + DmaapObject response = null; + try { + response = mapper.readValue(hsr.getResponseString(), Topic.class); + } catch (Exception ex) { + logger.debug("getTopic: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + } + return response; + } + + /** + * Creates a topic and grants appropriate permissions to specified pubs and + * subs. + * + * @param topic + * @return Status and response: expect 200 and a Topic on success; a code + * and an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse postTopic(Topic topic) throws Exception { + String jsonBody = mapper.writeValueAsString(topic); + HttpStatusAndResponse hsr = postRestContent(buildDmaapUri(TOPICS), jsonBody); + logger.debug("postTopic: resp is {}", hsr); + if (hsr == null) + throw new Exception("postTopic: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("postTopic: null response body"); + return response; + } + try { + Topic resp = mapper.readValue(hsr.getResponseString(), Topic.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("postTopic: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Deletes the message router topic with the specified FQTN. + * + * @param fqtn + * Fully qualified topic name to delete + * @return Status and response: expect 204 and a null on success; a code and + * an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse deleteTopic(final String fqtn) throws Exception { + HttpStatusAndResponse hsr = deleteRestContent(buildDmaapUri(TOPICS, fqtn)); + logger.debug("deleteTopic: resp is {}", hsr); + if (hsr == null) + throw new Exception("deleteTopic: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("deleteTopic: null response body"); + return response; + } + try { + Topic resp = mapper.readValue(hsr.getResponseString(), Topic.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("deleteTopic: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + ///////////////////////////////////////////////////////////////////// + + /** + * Gets a list of message router clients. + * + * @return List of DmaapObject: list contains MR_Client object(s) on + * success; a single ErrorResponse object if the remote site rejects + * the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public List getMRClients() throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(MR_CLIENTS)); + logger.debug("getMRClients: resp is {}", hsr); + if (hsr == null) + throw new Exception("getMRClients: unexpected null response"); + List responseList = null; + try { + TypeReference> typeRef = new TypeReference>() { + }; + responseList = mapper.readValue(hsr.getResponseString(), typeRef); + } catch (Exception ex) { + logger.debug("getMRClients: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + responseList = new ArrayList(); + responseList.add(errResp); + } + return responseList; + } + + /** + * Gets the message router client with the specified ID. + * + * @param mrClientId + * ID of the client to get + * @return DmaapObject: a MR_Client object on success; an ErrorResponse + * object if the remote site rejects the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public DmaapObject getMRClient(final String mrClientId) throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(MR_CLIENTS, mrClientId)); + logger.debug("getMRClient: resp is {}", hsr); + if (hsr == null) + throw new Exception("getMRClient: unexpected null response"); + DmaapObject response = null; + try { + response = mapper.readValue(hsr.getResponseString(), MR_Client.class); + } catch (Exception ex) { + logger.debug("getMRClient: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + } + return response; + } + + /** + * Creates a message router client. + * + * @param mrClient + * @return Status and response: expect 200 and a MR_Client on success; a + * code and an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse postMRClient(MR_Client mrClient) throws Exception { + String jsonBody = mapper.writeValueAsString(mrClient); + HttpStatusAndResponse hsr = postRestContent(buildDmaapUri(MR_CLIENTS), jsonBody); + logger.debug("postMRClient: resp is {}", hsr); + if (hsr == null) + throw new Exception("postMRClient: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("postMRClient: null response body"); + return response; + } + try { + MR_Client resp = mapper.readValue(hsr.getResponseString(), MR_Client.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("postMRClient: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Updates a message router client. + * + * @param mrClient + * client to be updated + * @return Status and response; expect 200 and a MR_Client on success, a + * string error on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse putMRClient(MR_Client mrClient) throws Exception { + String jsonBody = mapper.writeValueAsString(mrClient); + HttpStatusAndResponse hsr = putRestContent(buildDmaapUri(MR_CLIENTS, mrClient.getMrClientId()), jsonBody); + logger.debug("putMRClient: resp is {}", hsr); + if (hsr == null) + throw new Exception("putMRClient: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("putMRClient: null response body"); + return response; + } + try { + MR_Client resp = mapper.readValue(hsr.getResponseString(), MR_Client.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("putMRClient: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Deletes the message router client with the specified ID. + * + * @param mrClientId + * ID of the client to delete + * @return Status and response; expect 204 and a null on success, a string + * error on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse deleteMRClient(final String mrClientId) throws Exception { + HttpStatusAndResponse hsr = deleteRestContent(buildDmaapUri(MR_CLIENTS, mrClientId)); + logger.debug("deleteMRClient: resp is {}", hsr); + if (hsr == null) + throw new Exception("deleteMRClient: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("deleteMRClient: null response body"); + return response; + } + try { + MR_Client resp = mapper.readValue(hsr.getResponseString(), MR_Client.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("deleteMRClient: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + ///////////////////////////////////////////////////////////////////// + + /** + * Gets a list of message router clusters. + * + * @return List of DmaapObject: list contains MR_Cluster object(s) on + * success; a single ErrorResponse object if the remote site rejects + * the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public List getMRClusters() throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(MR_CLUSTERS)); + logger.debug("getMRClusters: resp is {}", hsr); + if (hsr == null) + throw new Exception("getMRClusters: unexpected null response"); + List responseList = null; + try { + TypeReference> typeRef = new TypeReference>() { + }; + responseList = mapper.readValue(hsr.getResponseString(), typeRef); + } catch (Exception ex) { + logger.debug("getDcaeLocations: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + responseList = new ArrayList(); + responseList.add(errResp); + } + return responseList; + } + + /** + * Gets the message router cluster with the specified location name. + * + * @param dcaeLocName + * name of the cluster to get + * @return DmaapObject: a MR_Cluster object on success; an ErrorResponse + * object if the remote site rejects the request. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public DmaapObject getMRCluster(final String dcaeLocName) throws Exception { + HttpStatusAndResponse hsr = getRestContent(buildDmaapUri(MR_CLUSTERS, dcaeLocName)); + logger.debug("getMRCluster: resp is {}", hsr); + if (hsr == null) + throw new Exception("getMRCluster: unexpected null response"); + DmaapObject response = null; + try { + response = mapper.readValue(hsr.getResponseString(), MR_Cluster.class); + } catch (Exception ex) { + logger.debug("getMRCluster: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + } + return response; + } + + /** + * Creates a message router cluster. + * + * @param mrCluster + * @return Status and response: expect 200 and a MR_Cluster on success; a + * code and an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse postMRCluster(MR_Cluster mrCluster) throws Exception { + String jsonBody = mapper.writeValueAsString(mrCluster); + HttpStatusAndResponse hsr = postRestContent(buildDmaapUri(MR_CLUSTERS), jsonBody); + logger.debug("postMRCluster: resp is {}", hsr); + if (hsr == null) + throw new Exception("postMRCluster: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("postMRCluster: null response body"); + return response; + } + try { + MR_Cluster resp = mapper.readValue(hsr.getResponseString(), MR_Cluster.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("postMRCluster: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Updates a message router cluster. + * + * @param mrCluster + * cluster to be updated + * @return Status and response; expect 200 and a MR_Cluster on success, a + * string error on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse putMRCluster(MR_Cluster mrCluster) throws Exception { + String jsonBody = mapper.writeValueAsString(mrCluster); + HttpStatusAndResponse hsr = putRestContent(buildDmaapUri(MR_CLUSTERS, mrCluster.getDcaeLocationName()), jsonBody); + logger.debug("putMRCluster: resp is {}", hsr); + if (hsr == null) + throw new Exception("putMRCluster: unexpected null response"); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("putMRCluster: null response body"); + return response; + } + try { + MR_Cluster resp = mapper.readValue(hsr.getResponseString(), MR_Cluster.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("putMRCluster: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + /** + * Deletes the message router cluster with the specified location name. + * + * @param dcaeLocName + * Location name of the cluster to delete + * @return Status and response: expect 204 and a null on success; a code + * and an ErrorResponse on failure. + * @throws Exception + * if host cannot be reached, response cannot be parsed, etc. + */ + public HttpStatusAndResponse deleteMRCluster(final String dcaeLocName) throws Exception { + HttpStatusAndResponse hsr = deleteRestContent(buildDmaapUri(MR_CLUSTERS, dcaeLocName)); + if (hsr == null) + throw new Exception("deleteMRCluster: unexpected null response"); + logger.debug("deleteMRCluster: resp is {}", hsr); + HttpStatusAndResponse response = new HttpStatusAndResponse(hsr.getStatusCode(), null); + if (hsr.getResponse() == null) { + logger.debug("deleteMRCluster: null response body"); + return response; + } + try { + MR_Cluster resp = mapper.readValue(hsr.getResponseString(), MR_Cluster.class); + response.setResponse(resp); + } catch (Exception ex) { + logger.debug("deleteMRCluster: trying to parse response as error: {}", ex.toString()); + // If this parse fails, let the exception be thrown + ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class); + response.setResponse(errResp); + } + return response; + } + + ///////////////////////////////////////////////////////////////////// + + /** + * Builds the URI for the DMaaP REST endpoint using configuration and the + * specified task and path parameter(s). Deals with extra or missing slashes + * to allow for some flexibility in the config file. + * + * @param requestPath + * Last part of endpoint path + * @param pathParam + * Additional path parameters in order; ignored if null or empty + * @return REST endpoint URI + * @throws Exception + * if the RESAT URL property is not found + */ + private URI buildDmaapUri(String task, String... pathParam) throws Exception { + if (dmaapRestUrl == null || dmaapRestUrl.length() == 0) + throw new Exception("buildUrlPath: unconfigured, must set dmaapEndpointUrl"); + StringBuilder sb = new StringBuilder(); + // Clean the base of any trailing slashes + sb.append(trimSlashes(dmaapRestUrl)); + sb.append('/'); + // task is controlled in this file, don't clean it. + sb.append(task); + if (pathParam != null) { + for (String pp : pathParam) { + sb.append('/'); + // path comes from the user, definitely clean it. + sb.append(trimSlashes(pp)); + } + } + String urlPath = sb.toString(); + URIBuilder uriBuilder = new URIBuilder(urlPath); + return uriBuilder.build(); + } + + /** + * Strips the specified string of leading and trailing forward-slash + * characters. + * + * @param s + * String to trim + * @return String without any leading or trailing '/' characters. + */ + private String trimSlashes(String s) { + while (s.length() > 0 && s.charAt(0) == '/') + s = s.substring(1, s.length()); + while (s.length() > 0 && s.charAt(s.length() - 1) == '/') + s = s.substring(0, s.length() - 1); + return s; + } + +} diff --git a/dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/HttpStatusAndResponse.java b/dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/HttpStatusAndResponse.java new file mode 100644 index 0000000..3b8e97e --- /dev/null +++ b/dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/HttpStatusAndResponse.java @@ -0,0 +1,66 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller REST Client + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaap.bcapi.client; + +/** + * Holds the status code and body that result from accessing an HTTP URL. + */ +public class HttpStatusAndResponse { + + private int statusCode; + private ResponseType response; + + public HttpStatusAndResponse(int status, ResponseType resp) { + this.statusCode = status; + this.response = resp; + } + + public int getStatusCode() { + return statusCode; + } + + public void setStatusCode(final int code) { + this.statusCode = code; + } + + public ResponseType getResponse() { + return response; + } + + public void setResponse(ResponseType response) { + this.response = response; + } + + /** + * Convenience method to avoid testing for null and calling .toString() + * + * @return String version of the response object; null if the object is + * null. + */ + public String getResponseString() { + return response == null ? null : response.toString(); + } + + @Override + public String toString() { + return "HttpStatusAndResponse[" + Integer.toString(statusCode) + ";" + + (response == null ? "" : response.toString()) + "]"; + } +} diff --git a/dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/IRestClientConstants.java b/dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/IRestClientConstants.java new file mode 100644 index 0000000..10b8189 --- /dev/null +++ b/dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/IRestClientConstants.java @@ -0,0 +1,35 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller REST Client + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaap.bcapi.client; + +public interface IRestClientConstants { + + /** + * Default configuration file to be found on classpath + */ + public static final String PROPERTY_FILE_NAME = "bc-rest-client.properties"; + + /** Base URL of the Bus Controller REST service API; e.g., + * + */ + public static final String DMAAP_BUS_CONTROLLER_REST_URL = "dmaap_bus_controller_rest_url"; + + +} diff --git a/dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/SimpleRestClientBase.java b/dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/SimpleRestClientBase.java new file mode 100644 index 0000000..1e5b064 --- /dev/null +++ b/dcae_dmaapbc_client/src/main/java/org/openecomp/dcae/dmaap/bcapi/client/SimpleRestClientBase.java @@ -0,0 +1,273 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller REST Client + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaap.bcapi.client; + +import java.io.IOException; +import java.net.URI; + +import org.apache.http.Consts; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.AuthCache; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.config.RequestConfig.Builder; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.client.protocol.HttpClientContext; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.auth.BasicScheme; +import org.apache.http.impl.client.BasicAuthCache; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Provides a basic client to access a REST endpoint, optionally using HTTP + * basic authentication. + * + * Caveat: If HTTPS access is used and the server uses a self-signed + * certificate, the local trust store must be extended appropriately. The client + * throws exceptions if the JVM cannot validate the server certificate. + */ +public class SimpleRestClientBase { + + private static Logger logger = LoggerFactory.getLogger(SimpleRestClientBase.class); + + /** + * Credentials for HTTP basic authentication (optional). + */ + private final String username; + private final String password; + + /** + * Timeouts (optional) + */ + private Integer connectTimeoutMs = null; + private Integer connectionRequestTimeoutMs = null; + private Integer socketTimeoutMs = null; + + /** + * Constructs a client that does not use any authentication and uses Apache HTTPD client default values for timeouts. + */ + public SimpleRestClientBase() { + this(null, null, null, null, null); + } + + /** + * Convenience constructor to build a client that uses the specified username and password for + * basic HTTP authentication on all requests. In other words, this client + * pre-emptively sends the "Basic" header instead of first trying the + * request without, failing, negotiating, then sending with credentials. + * + * @param username User name for basic HTTP authentication. + * @param password Password for basic HTTP authentication. + */ + public SimpleRestClientBase(final String username, final String password) { + this(username, password, null, null, null); + } + + /** + * Convenience constructor to build a client that uses the specified timeouts + * on all requests. + * + * @param connectTimeoutMs + * Connection timeout, in milliseconds + * @param connectionRequestTimeoutMs + * Connection request timeout, in milliseconds + * @param socketTimeoutMs + * Socket timeout, in milliseconds + */ + public SimpleRestClientBase(final Integer connectTimeoutMs, final Integer connectionRequestTimeoutMs, final Integer socketTimeoutMs) { + this(null, null, connectTimeoutMs, connectionRequestTimeoutMs, socketTimeoutMs); + } + + /** + * Constructs a client with the specified credentials and timeout values. + * @param username User name for basic HTTP authentication; ignored if null + * @param password Password for basic HTTP authentication; ignored if null + * @param connectTimeoutMs ignored if null + * @param connectionRequestTimeoutMs ignored if null + * @param socketTimeoutMs ignored if null + */ + public SimpleRestClientBase(final String username, final String password, final Integer connectTimeoutMs, final Integer connectionRequestTimeoutMs, final Integer socketTimeoutMs) { + this.username = username; + this.password = password; + this.connectTimeoutMs = null; + this.connectionRequestTimeoutMs = null; + this.socketTimeoutMs = null; + } + + + /** + * Constructs and sends a GET request for the URI. + * + * @param uri + * REST endpoint + * @return Result of the get + * @throws Exception + */ + public HttpStatusAndResponse getRestContent(final URI uri) throws Exception { + HttpGet httpGet = new HttpGet(uri); + return doRestRequest(httpGet); + } + + /** + * Constructs and sends a POST request using the specified body. + * + * @param uri + * REST endpoint + * @param json + * Content to post + * @return Result of the post; null if an error happens + * @throws Exception + */ + public HttpStatusAndResponse postRestContent(final URI uri, final String json) throws Exception { + HttpPost httpPost = new HttpPost(uri); + StringEntity postEntity = new StringEntity(json, ContentType.create("application/json", Consts.UTF_8)); + httpPost.setEntity(postEntity); + return doRestRequest(httpPost); + } + + /** + * Constructs and sends a PUT request using the specified body. + * + * @param uri + * REST endpoint + * @param json + * Content to put + * @return Result of the put; null if an error happens + * @throws Exception + */ + public HttpStatusAndResponse putRestContent(final URI uri, final String json) throws Exception { + HttpPut httpPut = new HttpPut(uri); + StringEntity postEntity = new StringEntity(json, ContentType.create("application/json", Consts.UTF_8)); + httpPut.setEntity(postEntity); + return doRestRequest(httpPut); + } + + /** + * Constructs and sends a DELETE request for the URI. + * + * @param uri + * REST endpoint + * @return Result of the get + * @throws Exception + */ + public HttpStatusAndResponse deleteRestContent(final URI uri) throws Exception { + HttpDelete httpDel = new HttpDelete(uri); + return doRestRequest(httpDel); + } + + /** + * Executes the specified request and gathers the response. + * + * @param request + * HttpGet, HttpPost, etc. + * @return Status code and response body + * @throws ClientProtocolException + * @throws IOException + */ + private HttpStatusAndResponse doRestRequest(final HttpRequestBase request) + throws ClientProtocolException, IOException { + + // Set up authentication if needed + final HttpClientContext context = HttpClientContext.create(); + if (this.username != null || this.password != null) { + UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(this.username, this.password); + CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, credentials); + context.setCredentialsProvider(credentialsProvider); + + HttpHost host = new HttpHost(request.getURI().getHost(), request.getURI().getPort(), request.getURI().getScheme()); + AuthCache authCache = new BasicAuthCache(); + authCache.put(host, new BasicScheme()); + context.setAuthCache(authCache); + } + final Builder requestConfigBuilder = RequestConfig.custom(); + if (connectionRequestTimeoutMs != null) + requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeoutMs); + if (connectTimeoutMs != null) + requestConfigBuilder.setConnectTimeout(connectTimeoutMs); + if (socketTimeoutMs != null) + requestConfigBuilder.setSocketTimeout(socketTimeoutMs); + RequestConfig requestConfig = requestConfigBuilder.build(); + final CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build(); + CloseableHttpResponse response = null; + String responseJson = null; + try { + response = httpClient.execute(request, context); + // Some methods return non-200 on success + logger.debug("doRestRequest: status is {}", response.getStatusLine()); + HttpEntity entity = response.getEntity(); + // This is common; don't warn + if (entity == null) { + logger.debug("doRestRequest: Entity is null"); + } else { + // entity content length is never set; + // this naively tries to read everything. + responseJson = EntityUtils.toString(entity); + EntityUtils.consume(entity); + // Don't give back empty string; + // it has no more meaning than null. + if (responseJson.length() == 0) + responseJson = null; + } + } finally { + if (response != null) + response.close(); + } + if (response == null) + return null; + return new HttpStatusAndResponse(response.getStatusLine().getStatusCode(), responseJson); + } + + /** + * Basic test invocation. + * + * @param args + * Expect 1 argument, the URL of a REST endpoint. + * @throws Exception + * if anything goes wrong + */ + public static void main(String[] args) throws Exception { + if (args.length != 1) + throw new IllegalArgumentException("Expect 1 argument: REST URL for GET"); + SimpleRestClientBase client = new SimpleRestClientBase(); + URIBuilder uriBuilder = new URIBuilder(args[0]); + URI uri = uriBuilder.build(); + HttpStatusAndResponse hsr = client.getRestContent(uri); + System.out.println("Response code is " + hsr.getStatusCode()); + System.out.println(hsr.getResponseString()); + System.out.println("main ends."); + } +} diff --git a/dcae_dmaapbc_client/src/main/resources/logback.xml b/dcae_dmaapbc_client/src/main/resources/logback.xml new file mode 100644 index 0000000..39d3b0f --- /dev/null +++ b/dcae_dmaapbc_client/src/main/resources/logback.xml @@ -0,0 +1,24 @@ + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_client/src/test/java/org/openecomp/dcae/dmaapbc/TestDmaapBcRestClient.java b/dcae_dmaapbc_client/src/test/java/org/openecomp/dcae/dmaapbc/TestDmaapBcRestClient.java new file mode 100644 index 0000000..e90c7b8 --- /dev/null +++ b/dcae_dmaapbc_client/src/test/java/org/openecomp/dcae/dmaapbc/TestDmaapBcRestClient.java @@ -0,0 +1,159 @@ +package org.openecomp.dcae.dmaapbc; + +import java.util.List; + +import org.junit.Test; +import org.openecomp.dcae.dmaap.bcapi.client.DmaapBcRestClient; +import org.openecomp.dcae.dmaap.bcapi.client.HttpStatusAndResponse; +import org.openecomp.dcae.dmaapbc.model.DmaapObject; +import org.openecomp.dcae.dmaapbc.model.Feed; +import org.openecomp.dcae.dmaapbc.model.Topic; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TestDmaapBcRestClient { + + private static Logger logger = LoggerFactory.getLogger(TestDmaapBcRestClient.class); + + /** + * Exercises some of the DMaaP Bus Controller client's functionality. + */ + @Test + public void test() throws Exception { + DmaapBcRestClient client = new DmaapBcRestClient("https://host:8443/webapi/", + "host", "MechIdPassword"); + + // This may help when in a hurry, but it's dangerous. + // client.setFailOnUnknownProperties(false); + + DmaapObject dmaap = client.getDmaap(); + if (dmaap == null) + logger.warn("Failed to get DMAAP"); + else + logger.info("DMAAP is " + dmaap.toString()); + + List locs = client.getDcaeLocations(); + if (locs == null) { + logger.warn("Failed to get DCAE locations"); + } else { + logger.info("Loc count is " + locs.size()); + for (DmaapObject loc : locs) + logger.info("Location is: " + loc.toString()); + } + + List nodes = client.getDRNodes(); + if (nodes == null) { + logger.warn("Failed to get nodes"); + } else { + logger.info("node count is " + nodes.size()); + for (DmaapObject node : nodes) + logger.info("Nodeis: " + node.toString()); + } + + List drPubs = client.getDRPubs(); + if (drPubs == null) { + logger.warn("Failed to get DR pubs"); + } else { + logger.info("DR_Pub count is " + drPubs.size()); + for (DmaapObject pub : drPubs) + logger.info("DR_Pub is: " + pub.toString()); + } + List drSubs = client.getDRSubs(); + if (drSubs == null) { + logger.warn("Failed to get DR subs"); + } else { + logger.info("DR_Sub count is " + drSubs.size()); + for (DmaapObject sub : drSubs) + logger.info("DR_Sub is: " + sub.toString()); + } + + List feeds = client.getFeeds(); + if (feeds == null) { + logger.warn("Failed to get feeds"); + } else { + logger.info("Feed count is " + feeds.size()); + for (DmaapObject feed : feeds) + logger.info("Feed is: " + feed.toString()); + } + List topics = client.getTopics(); + if (topics == null) { + logger.warn("Failed to get topics"); + } else { + logger.info("Topic count is " + topics.size()); + for (DmaapObject topic : topics) + logger.info("Topic is: " + topic.toString()); + } + List clients = client.getMRClients(); + if (clients == null) { + logger.warn("Failed to get MR clients"); + } else { + logger.info("MR client count is " + clients.size()); + for (DmaapObject mrc : clients) + logger.info("MR client is: " + mrc.toString()); + } + List clusters = client.getMRClusters(); + if (clusters == null) { + logger.warn("Failed to get MR clusters"); + } else { + logger.info("MR cluster count is " + clusters.size()); + for (DmaapObject mrc : clusters) + logger.info("MR cluster is: " + mrc.toString()); + } + + // Create and delete feed + + Feed feed = (Feed) feeds.get(0); + final String feedId = "987654321"; + final String feedName = "TestFeed1234567890"; + final String feedUrl = "http://host.com/foo/bar"; + feed.setFeedId(feedId); + feed.setFeedName(feedName); + feed.setPublishURL(feedUrl); + HttpStatusAndResponse addFeedResp = client.postFeed(feed); + if (addFeedResp.getStatusCode() == 200) + logger.info("add feed succeeded, response is " + addFeedResp); + else + logger.error("add feed failed, response is " + addFeedResp); + + DmaapObject getFeedResp = client.getFeed(feedId); + logger.info("get feed response is " + getFeedResp); + HttpStatusAndResponse delFeedResp = client.deleteFeed(feedId); + if (delFeedResp.getStatusCode() == 200) + logger.info("delete feed succeeded, response is " + delFeedResp); + else + logger.error("delete feed failed, response is " + delFeedResp); + + // Attempt to create empty feed should fail -- but does not + // Feed emptyFeed = new Feed(); + // HttpStatusAndResponse addEmptyFeedResp = + // client.postFeed(emptyFeed); + // if (addEmptyFeedResp.getStatusCode() == 200) + // logger.info("add feed succeeded, response is " + addFeedResp); + // else + // logger.error("add feed failed, response is " + addFeedResp); + + // Create and delete topic + + Topic topic = new Topic(); + final String fqtn = "host"; + topic.setFqtn(fqtn); + HttpStatusAndResponse createTopicResp = client.postTopic(topic); + logger.info("create topic response is " + createTopicResp); + DmaapObject getTopicResp = client.getTopic(fqtn); + logger.info("get topic response is " + getTopicResp); + HttpStatusAndResponse delTopic = client.deleteTopic(fqtn); + if (delTopic.getStatusCode() == 200) + logger.info("del topic succeeded, response is " + delTopic); + else + logger.error("del topic failed, response is " + delTopic); + HttpStatusAndResponse delTopicMissing = client.deleteTopic(fqtn); + if (delTopicMissing.getStatusCode() == 204) + logger.info("del of missing topic succeeded, response is " + delTopicMissing); + else + logger.error("del of missing topic failed, response is " + delTopic); + + logger.info("ends"); + + } + +} diff --git a/dcae_dmaapbc_model/.gitignore b/dcae_dmaapbc_model/.gitignore new file mode 100644 index 0000000..d4111ff --- /dev/null +++ b/dcae_dmaapbc_model/.gitignore @@ -0,0 +1,2 @@ +/.settings/ +/target/ diff --git a/dcae_dmaapbc_model/README.md b/dcae_dmaapbc_model/README.md new file mode 100644 index 0000000..c678c00 --- /dev/null +++ b/dcae_dmaapbc_model/README.md @@ -0,0 +1,19 @@ + +DCAE DMaaP Bus Controller API Data Models +----------------------------------------- + +Provides plain old Java objects for the DCAE DMaaP Bus Controller, +which were originally developed by the DCAE DMaaP project. +Can be used on both sides of a REST interface. + +### Build Instructions + +This project is organized as a mvn project for a jar package. + +### Contact + +Chris Lott, + +Release Notes +------------- +Version 1.0 \ No newline at end of file diff --git a/dcae_dmaapbc_model/pom.xml b/dcae_dmaapbc_model/pom.xml new file mode 100644 index 0000000..b90e657 --- /dev/null +++ b/dcae_dmaapbc_model/pom.xml @@ -0,0 +1,121 @@ + + 4.0.0 + + + org.openecomp.ui.dmaapbc + dmaap-bc-model + 1.0.0 + DCAE DMaaP Bus Controller Data Models + Java objects used by the DMaaP Bus Controller + + https://gitlab/projects/ST_DBPA/repos/dcae_dmaapbc_model/browse + scm:git:ssh://git@gitlab/st_dbpa/dcae_dmaapbc_model.git + + + + UTF-8 + true + + + + + + doclint-java8-disable + + [1.8,) + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + -Xdoclint:none + + + + + + + + + + + org.apache.maven.plugins + maven-scm-plugin + 1.8.1 + + developerConnection + branch + master + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.3 + + + attach-javadocs + + jar + + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.0.0 + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-release-plugin + 2.5.3 + + + + + + + + + nexus-snapshots + OpenECOMP Nexus Maven Central - Snapshots + https://ecomp-nexus:8443/repository/maven-snapshots/ + + + + nexus + OpenECOMP Nexus Maven Central - Releases + https://ecomp-nexus:8443/repository/maven-releases/ + + + + diff --git a/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Node.java b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Node.java new file mode 100644 index 0000000..87ad86e --- /dev/null +++ b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Node.java @@ -0,0 +1,87 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Models + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaapbc.model; + +/** + * Bean that models a DMaaP Data Router node. + */ +public class DR_Node extends DmaapObject { + + private String fqdn; + /** dcaeLocation where node VM is deployed */ + private String dcaeLocationName; + /** + * name for this VM (sometimes this is a local VM name and may be different + * than FQDN) + */ + private String hostName; + /** version of Node software package */ + private String version; + + public DR_Node() { + } + + public DR_Node(String lastMod, Dmaap_Status status, String fqdn, String dcaeLocationName, String hostName, + String version) { + super(lastMod, status); + this.fqdn = fqdn; + this.dcaeLocationName = dcaeLocationName; + this.hostName = hostName; + this.version = version; + } + + public String getFqdn() { + return fqdn; + } + + public void setFqdn(String fqdn) { + this.fqdn = fqdn; + } + + public String getDcaeLocationName() { + return dcaeLocationName; + } + + public void setDcaeLocationName(String dcaeLocationName) { + this.dcaeLocationName = dcaeLocationName; + } + + public String getHostName() { + return hostName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + @Override + public String toString() { + return "DR_Node[fqdn=" + fqdn + ", dcaeLocationName=" + dcaeLocationName + ", ...]"; + } + +} diff --git a/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Pub.java b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Pub.java new file mode 100644 index 0000000..fe0aeca --- /dev/null +++ b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Pub.java @@ -0,0 +1,96 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Models + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaapbc.model; + +/** + * Bean that models a DMaaP Data Router publisher. + */ +public class DR_Pub extends DmaapObject { + + /** dcaeLocation tag where this publisher is deployed */ + private String dcaeLocationName; + /** name used for basic authentication to DR */ + private String username; + /** password used for basic authentication to DR */ + private String userpwd; + /** tag of feed for which this publisher is a source */ + private String feedId; + /** unique id of a DCAE publisher (generated by Data Router PROV) */ + private String pubId; + + public DR_Pub() { + } + + public DR_Pub(Dmaap_Status status, String lastMod, String dcaeLocationName, String username, String userpwd, + String feedId, String pubId) { + super(lastMod, status); + this.dcaeLocationName = dcaeLocationName; + this.username = username; + this.userpwd = userpwd; + this.feedId = feedId; + this.pubId = pubId; + } + + public String getDcaeLocationName() { + return dcaeLocationName; + } + + public void setDcaeLocationName(String dcaeLocationName) { + this.dcaeLocationName = dcaeLocationName; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getUserpwd() { + return userpwd; + } + + public void setUserpwd(String userpwd) { + this.userpwd = userpwd; + } + + public String getFeedId() { + return feedId; + } + + public void setFeedId(String feedId) { + this.feedId = feedId; + } + + public String getPubId() { + return pubId; + } + + public void setPubId(String pubId) { + this.pubId = pubId; + } + + @Override + public String toString() { + return "DR_Pub[dcaeLocationName=" + dcaeLocationName + ", feedId=" + feedId + ", ...]"; + } + +} diff --git a/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Sub.java b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Sub.java new file mode 100644 index 0000000..45adf9c --- /dev/null +++ b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Sub.java @@ -0,0 +1,152 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Models + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaapbc.model; + +/** + * Bean that models a DMaaP Data Router subscriber. + */ +public class DR_Sub extends DmaapObject { + + /** Tag where this publisher is deployed */ + private String dcaeLocationName; + /** name used for basic authentication from DR */ + private String username; + /** password used for basic authentication from DR */ + private String userpwd; + /** tag of feed for which this publisher is a source */ + private String feedId; + /** URL used by DR to deliver files to this subscriber */ + private String deliveryURL; + /** URL for accessing the transaction log for this susbcriber */ + private String logURL; + /** unique ID for a subscriber in this DR environment */ + private String subId; + /** TODO */ + private boolean suspended; + /** TODO */ + private boolean use100; + /** TODO */ + private String owner; + + public DR_Sub() { + } + + public DR_Sub(String lastMod, Dmaap_Status status, String dcaeLocationName, String username, String userpwd, + String feedId, String deliveryURL, String logURL, String subId, boolean suspended, boolean use100, + String owner) { + super(lastMod, status); + this.dcaeLocationName = dcaeLocationName; + this.username = username; + this.userpwd = userpwd; + this.feedId = feedId; + this.deliveryURL = deliveryURL; + this.logURL = logURL; + this.subId = subId; + this.suspended = suspended; + this.use100 = use100; + this.owner = owner; + } + + public String getDcaeLocationName() { + return dcaeLocationName; + } + + public void setDcaeLocationName(String dcaeLocationName) { + this.dcaeLocationName = dcaeLocationName; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getUserpwd() { + return userpwd; + } + + public void setUserpwd(String userpwd) { + this.userpwd = userpwd; + } + + public String getFeedId() { + return feedId; + } + + public void setFeedId(String feedId) { + this.feedId = feedId; + } + + public String getDeliveryURL() { + return deliveryURL; + } + + public void setDeliveryURL(String deliveryURL) { + this.deliveryURL = deliveryURL; + } + + public String getLogURL() { + return logURL; + } + + public void setLogURL(String logURL) { + this.logURL = logURL; + } + + public String getSubId() { + return subId; + } + + public void setSubId(String subId) { + this.subId = subId; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public boolean isSuspended() { + return suspended; + } + + public void setSuspended(boolean suspended) { + this.suspended = suspended; + } + + public boolean isUse100() { + return use100; + } + + public void setUse100(boolean use100) { + this.use100 = use100; + } + + @Override + public String toString() { + return "DR_Sub[dcaeLocationName=" + dcaeLocationName + ", feedId=" + feedId + ", ...]"; + } + +} diff --git a/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DcaeLocation.java b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DcaeLocation.java new file mode 100644 index 0000000..3e072e9 --- /dev/null +++ b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DcaeLocation.java @@ -0,0 +1,97 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Models + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaapbc.model; + +/** + * Bean that models a DMaaP DCAE location. + */ +public class DcaeLocation extends DmaapObject { + + public enum Dcae_Status { + EMPTY, NEW, STAGED, VALID, INVALID + } + + /** + * AT&T network location code used to identify the location. (might there be more + * than one location per clli?) + */ + private String clli; + /** + * indicator of DCAE layer. Either opendcae-central or opendcae-local-ntc + */ + private String dcaeLayer; + /** + * unique name of this dcaeLocation. Value should match what DCAE Controller + * uses. + */ + private String dcaeLocationName; + /** determines “where,â€� within the OpenStack deployment, the edge exists */ + private String openStackAvailabilityZone; + + public DcaeLocation() { + } + + public DcaeLocation(String lastMod, Dmaap_Status status, String clli, String dcaeLayer, String dcaeLocationName, + String openStackAvailabilityZone) { + super(lastMod, status); + this.clli = clli; + this.dcaeLayer = dcaeLayer; + this.dcaeLocationName = dcaeLocationName; + this.openStackAvailabilityZone = openStackAvailabilityZone; + } + + public String getClli() { + return clli; + } + + public void setClli(String clli) { + this.clli = clli; + } + + public String getDcaeLayer() { + return dcaeLayer; + } + + public void setDcaeLayer(String dcaeLayer) { + this.dcaeLayer = dcaeLayer; + } + + public String getDcaeLocationName() { + return dcaeLocationName; + } + + public void setDcaeLocationName(String dcaeLocationName) { + this.dcaeLocationName = dcaeLocationName; + } + + public String getOpenStackAvailabilityZone() { + return openStackAvailabilityZone; + } + + public void setOpenStackAvailabilityZone(String openStackAvailabilityZone) { + this.openStackAvailabilityZone = openStackAvailabilityZone; + } + + @Override + public String toString() { + return "DcaeLocation[dcaeLocationName=" + dcaeLocationName + ", dcaeLayer=" + dcaeLayer + ", ...]"; + } + +} diff --git a/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/Dmaap.java b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/Dmaap.java new file mode 100644 index 0000000..a644e2f --- /dev/null +++ b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/Dmaap.java @@ -0,0 +1,141 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Models + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaapbc.model; + +/** + * Bean that models a DMaaP instance. + */ +public class Dmaap extends DmaapObject { + + /** the version of DMaaP BC software */ + private String version; + /** the root portion of the topic namespace */ + private String topicNsRoot; + /** + * a unique identifier for this instance. e.g. 1607.somersetLab or 1607.FTL + */ + private String dmaapName; + /** URL for DR Provisioning Server */ + private String drProvUrl; + /** + * topic name used by MR Bridge Admin to communicate which topics to + * replicate + */ + private String bridgeAdminTopic; + /** used by DCAE Controller to upload event logs */ + private String loggingUrl; + /** used by DCAE Controller to authenticate inter-node messages */ + private String nodeKey; + /** used by DCAE Controller to set up ssh access to VMs */ + private String accessKeyOwner; + + public Dmaap() { + } + + public Dmaap(String lastMod, Dmaap_Status status, String version, String topicNsRoot, String dmaapName, + String drProvUrl, String loggingUrl, String nodeKey, String accessKeyOwner) { + super(lastMod, status); + this.version = version; + this.topicNsRoot = topicNsRoot; + this.dmaapName = dmaapName; + this.drProvUrl = drProvUrl; + this.loggingUrl = loggingUrl; + this.nodeKey = nodeKey; + this.accessKeyOwner = accessKeyOwner; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getTopicNsRoot() { + return topicNsRoot; + } + + public void setTopicNsRoot(String topicNsRoot) { + this.topicNsRoot = topicNsRoot; + } + + public String getDmaapName() { + return dmaapName; + } + + public void setDmaapName(String dmaapName) { + this.dmaapName = dmaapName; + } + + public String getDrProvUrl() { + return drProvUrl; + } + + public void setDrProvUrl(String drProvUrl) { + this.drProvUrl = drProvUrl; + } + + public String getLogginUrl() { + return loggingUrl; + } + + public void setLogginUrl(String logginUrl) { + this.loggingUrl = logginUrl; + } + + public String getNodeKey() { + return nodeKey; + } + + public void setNodeKey(String nodeKey) { + this.nodeKey = nodeKey; + } + + public String getAccessKeyOwner() { + return accessKeyOwner; + } + + public void setAccessKeyOwner(String accessKeyOwner) { + this.accessKeyOwner = accessKeyOwner; + } + + public String getLoggingUrl() { + return loggingUrl; + } + + public void setLoggingUrl(String loggingUrl) { + this.loggingUrl = loggingUrl; + } + + public String getBridgeAdminTopic() { + return bridgeAdminTopic; + } + + public void setBridgeAdminTopic(String bridgeAdminTopic) { + this.bridgeAdminTopic = bridgeAdminTopic; + } + + @Override + public String toString() { + return "Dmaap[dmaapName=" + dmaapName + ", version=" + version + ", ...]"; + } + +} diff --git a/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DmaapObject.java b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DmaapObject.java new file mode 100644 index 0000000..fc66281 --- /dev/null +++ b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/DmaapObject.java @@ -0,0 +1,70 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Models + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaapbc.model; + +/** + * Parent class for all DMaaP BC models. + */ +public abstract class DmaapObject { + + public enum Dmaap_Status { + EMPTY, NEW, STAGED, VALID, INVALID //, DELETED + } + + /** time stamp when object was last modified */ + private String lastMod; + /** indicator of health of this object using values common in this API */ + private Dmaap_Status status; + /** TODO */ + private String type; + + public DmaapObject() { + } + + public DmaapObject(String lastMod, Dmaap_Status status) { + this.lastMod = lastMod; + this.status = status; + } + + public String getLastMod() { + return lastMod; + } + + public void setLastMod(String lastMod) { + this.lastMod = lastMod; + } + + public Dmaap_Status getStatus() { + return status; + } + + public void setStatus(Dmaap_Status status) { + this.status = status; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + +} diff --git a/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/ErrorResponse.java b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/ErrorResponse.java new file mode 100644 index 0000000..2cdb182 --- /dev/null +++ b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/ErrorResponse.java @@ -0,0 +1,65 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Models + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaapbc.model; + +/** + * Bean that models a DMaaP Bus Controller error response. + * + * This inherits some fields (e.g., lastMod and status) that are not used. + */ +public class ErrorResponse extends DmaapObject { + + private Integer code; + private String message; + private String fields; + + public ErrorResponse() { + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getFields() { + return fields; + } + + public void setFields(String fields) { + this.fields = fields; + } + + @Override + public String toString() { + return "ErrorResponse[code=" + code + ", message=" + message + ", fields=" + fields + "]"; + } + +} diff --git a/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/Feed.java b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/Feed.java new file mode 100644 index 0000000..f56aa54 --- /dev/null +++ b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/Feed.java @@ -0,0 +1,193 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Models + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaapbc.model; + +import java.util.ArrayList; +import java.util.List; + +/** + * Bean that models a DMaaP Data Router feed. + */ +public class Feed extends DmaapObject { + + public enum Feed_Status { + EMPTY, NEW, STAGED, VALID, INVALID, DELETED + } + + /** unique id assigned by the DR PROV server for this feed */ + private String feedId; + /** name of feed. Combined with feedVersion must be unique */ + private String feedName; + /** version of feed. Combined with feedName must be unique */ + private String feedVersion; + /** description */ + private String feedDescription; + /** ASPR classification */ + private String asprClassification; + /** provisioning URL for adding subscribers to this feed */ + private String subscribeURL; + /** URL publisher use to connect to DR */ + private String publishURL; + /** URL for transaction log for this feed */ + private String logURL; + /** indicator of whether the feed is suspended */ + private boolean suspended; + /** what identity owns this feed */ + private String owner; + /** id of format description of feed content */ + private String formatUuid; + /** a set of publishers for this feed */ + private List pubs; + /** a set of subscribers for this feed */ + private List subs; + + public Feed() { + this.pubs = new ArrayList(); + this.subs = new ArrayList(); + } + + public Feed(Dmaap_Status status, String lastMod, String feedName, String feedVersion, String feedDescription, + String asprClassification, String subscribeURL, String publishURL, String logURL, boolean suspended, + String owner, String formatUuid) { + super(lastMod, status); + this.feedName = feedName; + this.feedVersion = feedVersion; + this.feedDescription = feedDescription; + this.asprClassification = asprClassification; + this.subscribeURL = subscribeURL; + this.publishURL = publishURL; + this.logURL = logURL; + this.suspended = suspended; + this.owner = owner; + this.formatUuid = formatUuid; + this.pubs = new ArrayList(); + this.subs = new ArrayList(); + } + + public String getFeedId() { + return feedId; + } + + public void setFeedId(String feedId) { + this.feedId = feedId; + } + + public String getFeedName() { + return feedName; + } + + public void setFeedName(String feedName) { + this.feedName = feedName; + } + + public String getFeedVersion() { + return feedVersion; + } + + public void setFeedVersion(String feedVersion) { + this.feedVersion = feedVersion; + } + + public String getFeedDescription() { + return feedDescription; + } + + public void setFeedDescription(String feedDescription) { + this.feedDescription = feedDescription; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public String getAsprClassification() { + return asprClassification; + } + + public void setAsprClassification(String asprClassification) { + this.asprClassification = asprClassification; + } + + public String getSubscribeURL() { + return subscribeURL; + } + + public void setSubscribeURL(String subscribeURL) { + this.subscribeURL = subscribeURL; + } + + public String getPublishURL() { + return publishURL; + } + + public void setPublishURL(String publishURL) { + this.publishURL = publishURL; + } + + public String getLogURL() { + return logURL; + } + + public void setLogURL(String logURL) { + this.logURL = logURL; + } + + public boolean isSuspended() { + return suspended; + } + + public void setSuspended(boolean suspended) { + this.suspended = suspended; + } + + public String getFormatUuid() { + return formatUuid; + } + + public void setFormatUuid(String formatUuid) { + this.formatUuid = formatUuid; + } + + public List getPubs() { + return pubs; + } + + public void setPubs(List pubs) { + this.pubs = pubs; + } + + public List getSubs() { + return subs; + } + + public void setSubs(List subs) { + this.subs = subs; + } + + @Override + public String toString() { + return "Feed[feedId=" + feedId + ", feedName=" + feedName + ", feedVersion=" + feedVersion + ", ...]"; + } + +} diff --git a/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Client.java b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Client.java new file mode 100644 index 0000000..a1abc70 --- /dev/null +++ b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Client.java @@ -0,0 +1,110 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Models + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaapbc.model; + +/** + * Bean that models a DMaaP Message Router client. + */ +public class MR_Client extends DmaapObject { + + /** dcaeLocation tag where this client is deployed */ + private String dcaeLocationName; + /** fully qualified topic name */ + private String fqtn; + /** + * name of role of client which will be + * granted the AAF permission associated with any action + */ + private String clientRole; + /** an array of actions. Current possibilities are view, pub, sub */ + private String[] action; + /** unique handle for this client, generated by DMaaP Bus Controller */ + private String mrClientId; + /** TODO */ + private String topicURL; + + public MR_Client() { + } + + public MR_Client(String lastMod, Dmaap_Status status, String dcaeLocationName, String fqtn, String clientRole, + String[] action, String mrClientId, String topicURL) { + super(lastMod, status); + this.dcaeLocationName = dcaeLocationName; + this.fqtn = fqtn; + this.clientRole = clientRole; + this.action = action; + this.mrClientId = mrClientId; + this.topicURL = topicURL; + } + + public String getDcaeLocationName() { + return dcaeLocationName; + } + + public void setDcaeLocationName(String dcaeLocationName) { + this.dcaeLocationName = dcaeLocationName; + } + + public String getFqtn() { + return fqtn; + } + + public void setFqtn(String fqtn) { + this.fqtn = fqtn; + } + + public String getClientRole() { + return clientRole; + } + + public void setClientRole(String clientRole) { + this.clientRole = clientRole; + } + + public String[] getAction() { + return action; + } + + public void setAction(String[] action) { + this.action = action; + } + + public String getMrClientId() { + return mrClientId; + } + + public void setMrClientId(String mrClientId) { + this.mrClientId = mrClientId; + } + + public String getTopicURL() { + return topicURL; + } + + public void setTopicURL(String topicURL) { + this.topicURL = topicURL; + } + + @Override + public String toString() { + return "MR_Client[dcaeLocationName=" + dcaeLocationName + ", fqtn=" + fqtn + ", ...]"; + } + +} diff --git a/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Cluster.java b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Cluster.java new file mode 100644 index 0000000..21d87cf --- /dev/null +++ b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Cluster.java @@ -0,0 +1,102 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Models + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaapbc.model; + +import java.util.List; + +/** + * Bean that models a DMaaP Message Router cluster. + */ +public class MR_Cluster extends DmaapObject { + + /** dcaeLocation where cluster VMs are deployed */ + private String dcaeLocationName; + /** DNS name used by MR clients for this cluster */ + private String fqdn; + /** an array of hosts that are part of the MR Cluster. */ + private List hosts; + /** TODO */ + private String topicPort; + /** TODO */ + private String topicProtocol; + + public MR_Cluster() { + } + + /** + * @param dcaeLocationName + * @param fqdn + * @param hosts + */ + public MR_Cluster(Dmaap_Status status, String lastMod, String dcaeLocationName, String fqdn, + final String[] hosts) { + super(lastMod, status); + this.dcaeLocationName = dcaeLocationName; + this.fqdn = fqdn; + for (String h : hosts) + this.hosts.add(h); + } + + public String getDcaeLocationName() { + return dcaeLocationName; + } + + public void setDcaeLocationName(String dcaeLocationName) { + this.dcaeLocationName = dcaeLocationName; + } + + public String getFqdn() { + return fqdn; + } + + public void setFqdn(String fqdn) { + this.fqdn = fqdn; + } + + public List getHosts() { + return hosts; + } + + public void setHosts(List hosts) { + this.hosts = hosts; + } + + public String getTopicPort() { + return topicPort; + } + + public void setTopicPort(String topicPort) { + this.topicPort = topicPort; + } + + public String getTopicProtocol() { + return topicProtocol; + } + + public void setTopicProtocol(String topicProtocol) { + this.topicProtocol = topicProtocol; + } + + @Override + public String toString() { + return "MR_Cluster[dcaeLocationName=" + dcaeLocationName + ", fqdn=" + fqdn + ", ...]"; + } + +} diff --git a/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/Topic.java b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/Topic.java new file mode 100644 index 0000000..b76a34b --- /dev/null +++ b/dcae_dmaapbc_model/src/main/java/org/openecomp/dcae/dmaapbc/model/Topic.java @@ -0,0 +1,122 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Models + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dcae.dmaapbc.model; + +import java.util.ArrayList; +import java.util.List; + +/** + * Bean that models a DMaaP Message Router topic. + */ +public class Topic extends DmaapObject { + + /** fully qualified topic name (topic_ns_root.environment.topic_name) */ + private String fqtn; + /** application supplied value for topicName */ + private String topicName; + /** description of topic */ + private String topicDescription; + /** what identity owns this topic */ + private String owner; + /** flag to MR indicating whether transactions are enabled for this topic */ + private String tnxEnabled; + /** id of format description of feed content */ + private String formatUuid; + /** a set of publishers and subscribers for this topic */ + private List clients; + + public Topic() { + this.clients = new ArrayList(); + } + + public Topic(String lastMod, Dmaap_Status status, String fqtn, String topicName, String topicDescription, + String owner, String tnxEnabled, String formatUuid) { + super(lastMod, status); + this.fqtn = fqtn; + this.topicName = topicName; + this.topicDescription = topicDescription; + this.owner = owner; + this.tnxEnabled = tnxEnabled; + this.formatUuid = formatUuid; + this.clients = new ArrayList(); + } + + public String getFqtn() { + return fqtn; + } + + public void setFqtn(String fqtn) { + this.fqtn = fqtn; + } + + public String getTopicName() { + return topicName; + } + + public void setTopicName(String topicName) { + this.topicName = topicName; + } + + public String getTopicDescription() { + return topicDescription; + } + + public void setTopicDescription(String topicDescription) { + this.topicDescription = topicDescription; + } + + public String getTnxEnabled() { + return tnxEnabled; + } + + public void setTnxEnabled(String tnxEnabled) { + this.tnxEnabled = tnxEnabled; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public String getFormatUuid() { + return formatUuid; + } + + public void setFormatUuid(String formatUuid) { + this.formatUuid = formatUuid; + } + + public List getClients() { + return clients; + } + + public void setClients(List clients) { + this.clients = clients; + } + + @Override + public String toString() { + return "Topic[fqtn=" + fqtn + ", topicName=" + topicName + ", ...]"; + } + +} diff --git a/dcae_dmaapbc_webapp/.gitignore b/dcae_dmaapbc_webapp/.gitignore new file mode 100644 index 0000000..43b4259 --- /dev/null +++ b/dcae_dmaapbc_webapp/.gitignore @@ -0,0 +1,2 @@ +/target/ +/catalina.base_IS_UNDEFINED/ diff --git a/dcae_dmaapbc_webapp/README.md b/dcae_dmaapbc_webapp/README.md new file mode 100644 index 0000000..cfddeed --- /dev/null +++ b/dcae_dmaapbc_webapp/README.md @@ -0,0 +1,26 @@ +DMaaP Bus Controller Application +================================ + +The DMaaP Bus Controller web application provides a front-end GUI to a subset of +the OpenDCAE DMaaP Bus Controller API. The GUI offers a user-friendly way for DMaaP +administrators to add, modify and remove Data Router feeds (transfers of large +file-based data sets) and Message Router topics (low-latency transfers of small +messages). Users can view all feeds and topics; add and remove feed publishers; +add and remove feed subscribers; and add and remove topic clients. + +The Data Bus Controller web application is a essentially proxy that passes thru +all requests to the DMaaP bus controller's REST API, and displays the results. +All data is stored in the DMaaP bus controller back-end; the application stores no +data on feeds or topics. The application only stores user-entered access profiles. + +This application is planned for integration with ECOMP Portal in release 1610, +and is expected to run on the same virtual machines and the same Apache Tomcat web +containers as the Portal application. + +This application is based on the ECOMP SDK. Use Apache Maven to build and package +this webapp for deployment. See the file dbc-app-deployment-guide.txt for complete +details. + +This application relies on the DBC Microservice to access DMaaP access profiles. +A related Maven project contains the code and deployment instructions for that +micro service. \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/build-scripts/build-deploy-app.sh b/dcae_dmaapbc_webapp/build-scripts/build-deploy-app.sh new file mode 100644 index 0000000..5c46462 --- /dev/null +++ b/dcae_dmaapbc_webapp/build-scripts/build-deploy-app.sh @@ -0,0 +1,78 @@ +#!/usr/bin/bash +# Script for DMaaP Bus Controller web app on development host demeter. +# Checks out code, downloads jars from Maven Central, builds war file, +# stops Tomcat server, unpacks the war file, starts server. +# On demeter the webapp is deployed to same tomcat as ECOMP Portal app. + +# URL of the project Git repository +GIT_REPO="https://gitlab/scm/ST_DBPA/dcae_dmaapbc_webapp.git" +# Name of git project +PROJECT_THIS_NAME=dcae_dmaapbc_webapp +# Branch to get from git +BRANCH="master" +# Name from the pom file +PROJECT_BUILD_NAME=dmaap-bc-app +# Version from the pom file +PROJECT_BUILD_VERSION=1.0.0 +# Get yymmddhhmmss +BUILD_DATE=`date +%G%m%d%H%M%S` + +# The following are highly specific to host demeter. + +# Directory with maven binary, config and repository +MVN_HOME=/demeter/WebApps/dev/ECOMP_APP/apache-maven-3.3.3/ +# Base directory for building +PROJECT_HOME=/demeter/WebApps/dev/DBCAPP +# Build directory +PROJECT_BUILD_HOME=${PROJECT_HOME}/build-dbcapp +# The deploy name is actually a link created by sanjayc from this directory: +# /usr/local/add-on/apache-tomcat-8.0.35/build-ecompportal/webapps +PROJECT_DEPLOY_NAME=dmaap-bc-app + +echo "Build and deploy begins" + +# stop on any error +set -e +# be verbose +set -x + +# clone or pull. +if [ -d $PROJECT_THIS_NAME -a ${PROJECT_THIS_NAME}/.git ]; then + echo "git repo exists, pulling" + cd $PROJECT_THIS_NAME + git checkout ${BRANCH} + git pull + cd .. +else + echo "cloning git repo" + git clone -b ${BRANCH} ${GIT_REPO} +fi + +# build +cd $PROJECT_BUILD_HOME/$PROJECT_THIS_NAME +$MVN_HOME/bin/mvn clean package + +# stop Tomcat server (it might not be running) +/usr/local/sbin/tomcatadmin-8.0-ecompportal stop || echo "Tomcat not running, continuing anyhow" + +# move old deployment out of the way +cd $PROJECT_HOME +if [ -d ${PROJECT_DEPLOY_NAME} ]; then + mv ${PROJECT_DEPLOY_NAME} ${PROJECT_DEPLOY_NAME}_${BUILD_DATE} +fi + +# unpack war in the appropriate directory +mkdir $PROJECT_HOME/$PROJECT_DEPLOY_NAME/ +cd $PROJECT_HOME/$PROJECT_DEPLOY_NAME/ +jar xf $PROJECT_BUILD_HOME/$PROJECT_THIS_NAME/target/${PROJECT_BUILD_NAME}.${PROJECT_BUILD_VERSION}.war + +# copy in appropriate property files +cp $PROJECT_BUILD_HOME/properties/system.properties $PROJECT_HOME/$PROJECT_DEPLOY_NAME/WEB-INF/conf/ +cp $PROJECT_BUILD_HOME/properties/fusion.properties $PROJECT_HOME/$PROJECT_DEPLOY_NAME/WEB-INF/fusion/conf/ +cp $PROJECT_BUILD_HOME/properties/portal.properties $PROJECT_HOME/$PROJECT_DEPLOY_NAME/WEB-INF/classes/ +cp $PROJECT_BUILD_HOME/properties/dbcapp.properties $PROJECT_HOME/$PROJECT_DEPLOY_NAME/WEB-INF/dbcapp/ + +# restart server +/usr/local/sbin/tomcatadmin-8.0-ecompportal start + +echo "Build and deploy complete" diff --git a/dcae_dmaapbc_webapp/db-scripts/EcompSdkDDLMySql_1610_Complete_OS.sql b/dcae_dmaapbc_webapp/db-scripts/EcompSdkDDLMySql_1610_Complete_OS.sql new file mode 100644 index 0000000..15b53bb --- /dev/null +++ b/dcae_dmaapbc_webapp/db-scripts/EcompSdkDDLMySql_1610_Complete_OS.sql @@ -0,0 +1,1622 @@ +-- --------------------------------------------------------------------------------------------------------------- +-- This script creates tables for the DMaaP Bus Controller Application +-- as required by the SDK core library. +-- +-- Note to : Database Admin, set the MySQL system variable called lower_case_table_names +-- It can be set 3 different ways: +-- command-line options (Cmd-line), +-- options valid in configuration files (Option file), or +-- server system variables (System Var). +-- It needs to be set to 1, then table names are stored in lowercase on disk and comparisons are not case sensitive. +-- ------------------------------------------------------------------------------------------------------------------ + +SET FOREIGN_KEY_CHECKS=1; + +-- Adjust the database name for the DMaaP Bus Controller application. +CREATE DATABASE IF NOT EXISTS dbca_os; +USE dbca_os; + +-- ------------------- create table SECTION +-- +-- NAME: CR_FAVORITE_REPORTS; TYPE: TABLE +-- +create table cr_favorite_reports ( + USER_ID INTEGER NOT NULL, + REP_ID INTEGER NOT NULL +); + +-- +-- NAME: CR_FILEHIST_LOG; TYPE: TABLE +-- +create table cr_filehist_log ( + SCHEDULE_ID NUMERIC(11,0) NOT NULL, + URL CHARACTER VARYING(4000), + NOTES CHARACTER VARYING(3500), + RUN_TIME TIMESTAMP +-- RUN_TIME TIMESTAMP WITHOUT TIME ZONE +); + +-- +-- NAME: CR_FOLDER; TYPE: TABLE +-- +create table cr_folder ( + FOLDER_ID INTEGER NOT NULL, + FOLDER_NAME CHARACTER VARYING(50) NOT NULL, + DESCR CHARACTER VARYING(500), + CREATE_ID INTEGER NOT NULL, + CREATE_DATE TIMESTAMP NOT NULL, +-- CREATE_DATE TIMESTAMP WITHOUT TIME ZONE NOT NULL, + PARENT_FOLDER_ID INTEGER, + PUBLIC_YN CHARACTER VARYING(1) DEFAULT 'N' NOT NULL +-- PUBLIC_YN CHARACTER VARYING(1) DEFAULT 'N'::CHARACTER VARYING NOT NULL +); + +-- +-- NAME: CR_FOLDER_ACCESS; TYPE: TABLE +-- +create table cr_folder_access ( + FOLDER_ACCESS_ID NUMERIC(11,0) NOT NULL, + FOLDER_ID NUMERIC(11,0) NOT NULL, + ORDER_NO NUMERIC(11,0) NOT NULL, + ROLE_ID NUMERIC(11,0), + USER_ID NUMERIC(11,0), + READ_ONLY_YN CHARACTER VARYING(1) DEFAULT 'N' NOT NULL +-- READ_ONLY_YN CHARACTER VARYING(1) DEFAULT 'N'::CHARACTER VARYING NOT NULL +); + +-- +-- NAME: CR_HIST_USER_MAP; TYPE: TABLE +-- +create table cr_hist_user_map ( + HIST_ID INT(11) NOT NULL, + USER_ID INT(11) NOT NULL +); + +-- +-- NAME: CR_LU_FILE_TYPE; TYPE: TABLE +-- +create table cr_lu_file_type ( + LOOKUP_ID NUMERIC(2,0) NOT NULL, + LOOKUP_DESCR CHARACTER VARYING(255) NOT NULL, + ACTIVE_YN CHARACTER(1) DEFAULT 'Y', +-- ACTIVE_YN CHARACTER(1) DEFAULT 'Y'::BPCHAR, + ERROR_CODE NUMERIC(11,0) +); + +-- +-- NAME: CR_RAPTOR_ACTION_IMG; TYPE: TABLE +-- +create table cr_raptor_action_img ( + IMAGE_ID CHARACTER VARYING(100) NOT NULL, + IMAGE_LOC CHARACTER VARYING(400) +); + +-- +-- NAME: CR_RAPTOR_PDF_IMG; TYPE: TABLE +-- +create table cr_raptor_pdf_img ( + IMAGE_ID CHARACTER VARYING(100) NOT NULL, + IMAGE_LOC CHARACTER VARYING(400) +); + +-- +-- NAME: CR_REMOTE_SCHEMA_INFO; TYPE: TABLE +-- +create table cr_remote_schema_info ( + SCHEMA_PREFIX CHARACTER VARYING(5) NOT NULL, + SCHEMA_DESC CHARACTER VARYING(75) NOT NULL, + DATASOURCE_TYPE CHARACTER VARYING(100) +); + +-- +-- NAME: CR_REPORT; TYPE: TABLE +-- +create table cr_report ( + REP_ID NUMERIC(11,0) NOT NULL, + TITLE CHARACTER VARYING(100) NOT NULL, + DESCR CHARACTER VARYING(255), + PUBLIC_YN CHARACTER VARYING(1) DEFAULT 'N' NOT NULL, +-- PUBLIC_YN CHARACTER VARYING(1) DEFAULT 'N'::CHARACTER VARYING NOT NULL, + REPORT_XML TEXT, + CREATE_ID NUMERIC(11,0), + CREATE_DATE TIMESTAMP default now(), +-- CREATE_DATE TIMESTAMP WITHOUT TIME ZONE, + MAINT_ID NUMERIC(11,0), + MAINT_DATE TIMESTAMP DEFAULT NOW(), +-- MAINT_DATE TIMESTAMP WITHOUT TIME ZONE, + MENU_ID CHARACTER VARYING(500), + MENU_APPROVED_YN CHARACTER VARYING(1) DEFAULT 'N' NOT NULL, +-- MENU_APPROVED_YN CHARACTER VARYING(1) DEFAULT 'N'::CHARACTER VARYING NOT NULL, + OWNER_ID NUMERIC(11,0), + FOLDER_ID INTEGER DEFAULT 0, + DASHBOARD_TYPE_YN CHARACTER VARYING(1) DEFAULT 'N', +-- DASHBOARD_TYPE_YN CHARACTER VARYING(1) DEFAULT 'N'::CHARACTER VARYING, + DASHBOARD_YN CHARACTER VARYING(1) DEFAULT 'N' +-- DASHBOARD_YN CHARACTER VARYING(1) DEFAULT 'N'::CHARACTER VARYING +); + +-- +-- NAME: CR_REPORT_ACCESS; TYPE: TABLE +-- +create table cr_report_access ( + REP_ID NUMERIC(11,0) NOT NULL, + ORDER_NO NUMERIC(11,0) NOT NULL, + ROLE_ID NUMERIC(11,0), + USER_ID NUMERIC(11,0), + READ_ONLY_YN CHARACTER VARYING(1) DEFAULT 'N' NOT NULL +-- READ_ONLY_YN CHARACTER VARYING(1) DEFAULT 'N'::CHARACTER VARYING NOT NULL +); + +-- +-- NAME: CR_REPORT_DWNLD_LOG; TYPE: TABLE +-- +create table cr_report_dwnld_log ( + USER_ID NUMERIC(11,0) NOT NULL, + REP_ID INTEGER NOT NULL, + FILE_NAME CHARACTER VARYING(100) NOT NULL, + DWNLD_START_TIME TIMESTAMP DEFAULT NOW() NOT NULL, +-- DWNLD_START_TIME TIMESTAMP WITHOUT TIME ZONE NOT NULL, + RECORD_READY_TIME TIMESTAMP DEFAULT NOW(), +-- RECORD_READY_TIME TIMESTAMP WITHOUT TIME ZONE, + FILTER_PARAMS CHARACTER VARYING(2000) +); + +-- +-- NAME: CR_REPORT_EMAIL_SENT_LOG; TYPE: TABLE +-- +create table cr_report_email_sent_log ( + LOG_ID INTEGER NOT NULL, + SCHEDULE_ID NUMERIC(11,0), + GEN_KEY CHARACTER VARYING(25) NOT NULL, + REP_ID NUMERIC(11,0) NOT NULL, + USER_ID NUMERIC(11,0), + SENT_DATE TIMESTAMP DEFAULT NOW(), +-- SENT_DATE TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), + ACCESS_FLAG CHARACTER VARYING(1) DEFAULT 'Y' NOT NULL, +-- ACCESS_FLAG CHARACTER VARYING(1) DEFAULT 'Y'::CHARACTER VARYING NOT NULL, + TOUCH_DATE TIMESTAMP DEFAULT NOW() +-- TOUCH_DATE TIMESTAMP WITHOUT TIME ZONE +); + +-- +-- NAME: CR_REPORT_FILE_HISTORY; TYPE: TABLE +-- +create table cr_report_file_history ( + HIST_ID INT(11) NOT NULL, + SCHED_USER_ID NUMERIC(11,0) NOT NULL, + SCHEDULE_ID NUMERIC(11,0) NOT NULL, + USER_ID NUMERIC(11,0) NOT NULL, + REP_ID NUMERIC(11,0), + RUN_DATE TIMESTAMP, +-- RUN_DATE TIMESTAMP WITHOUT TIME ZONE, + RECURRENCE CHARACTER VARYING(50), + FILE_TYPE_ID NUMERIC(2,0), + FILE_NAME CHARACTER VARYING(80), + FILE_BLOB BLOB, + FILE_SIZE NUMERIC(11,0), + RAPTOR_URL CHARACTER VARYING(4000), + ERROR_YN CHARACTER(1) DEFAULT 'N', +-- ERROR_YN CHARACTER(1) DEFAULT 'N'::BPCHAR, + ERROR_CODE NUMERIC(11,0), + DELETED_YN CHARACTER(1) DEFAULT 'N', +-- DELETED_YN CHARACTER(1) DEFAULT 'N'::BPCHAR, + DELETED_BY NUMERIC(38,0) +); + +-- +-- NAME: CR_REPORT_LOG; TYPE: TABLE +-- +create table cr_report_log ( + REP_ID NUMERIC(11,0) NOT NULL, + LOG_TIME TIMESTAMP NOT NULL, +-- LOG_TIME TIMESTAMP WITHOUT TIME ZONE NOT NULL, + USER_ID NUMERIC(11,0) NOT NULL, + ACTION CHARACTER VARYING(2000) NOT NULL, + ACTION_VALUE CHARACTER VARYING(50), + FORM_FIELDS CHARACTER VARYING(4000) +); + +-- +-- NAME: CR_REPORT_SCHEDULE; TYPE: TABLE +-- +create table cr_report_schedule ( + SCHEDULE_ID NUMERIC(11,0) NOT NULL, + SCHED_USER_ID NUMERIC(11,0) NOT NULL, + REP_ID NUMERIC(11,0) NOT NULL, + ENABLED_YN CHARACTER VARYING(1) NOT NULL, + START_DATE TIMESTAMP DEFAULT NOW(), +-- START_DATE TIMESTAMP WITHOUT TIME ZONE, + END_DATE TIMESTAMP DEFAULT NOW(), +-- END_DATE TIMESTAMP WITHOUT TIME ZONE, + RUN_DATE TIMESTAMP DEFAULT NOW(), +-- RUN_DATE TIMESTAMP WITHOUT TIME ZONE, + RECURRENCE CHARACTER VARYING(50), + CONDITIONAL_YN CHARACTER VARYING(1) NOT NULL, + CONDITION_SQL CHARACTER VARYING(4000), + NOTIFY_TYPE INTEGER DEFAULT 0, + MAX_ROW INTEGER DEFAULT 1000, + INITIAL_FORMFIELDS CHARACTER VARYING(3500), + PROCESSED_FORMFIELDS CHARACTER VARYING(3500), + FORMFIELDS CHARACTER VARYING(3500), + CONDITION_LARGE_SQL TEXT, + ENCRYPT_YN CHARACTER(1) DEFAULT 'N', +-- ENCRYPT_YN CHARACTER(1) DEFAULT 'N'::BPCHAR, + ATTACHMENT_YN CHARACTER(1) DEFAULT 'Y' +-- ATTACHMENT_YN CHARACTER(1) DEFAULT 'Y'::BPCHAR +); + +-- +-- NAME: CR_REPORT_SCHEDULE_USERS; TYPE: TABLE +-- +create table cr_report_schedule_users ( + SCHEDULE_ID NUMERIC(11,0) NOT NULL, + REP_ID NUMERIC(11,0) NOT NULL, + USER_ID NUMERIC(11,0) NOT NULL, + ROLE_ID NUMERIC(11,0), + ORDER_NO NUMERIC(11,0) NOT NULL +); + +-- +-- NAME: CR_REPORT_TEMPLATE_MAP; TYPE: TABLE +-- +create table cr_report_template_map ( + REPORT_ID INTEGER NOT NULL, + TEMPLATE_FILE CHARACTER VARYING(200) +); + +-- +-- NAME: CR_SCHEDULE_ACTIVITY_LOG; TYPE: TABLE +-- +create table cr_schedule_activity_log ( + SCHEDULE_ID NUMERIC(11,0) NOT NULL, + URL CHARACTER VARYING(4000), + NOTES CHARACTER VARYING(2000), + RUN_TIME TIMESTAMP +-- RUN_TIME TIMESTAMP WITHOUT TIME ZONE +); + +-- +-- NAME: CR_TABLE_JOIN; TYPE: TABLE +-- +create table cr_table_join ( + SRC_TABLE_NAME CHARACTER VARYING(30) NOT NULL, + DEST_TABLE_NAME CHARACTER VARYING(30) NOT NULL, + JOIN_EXPR CHARACTER VARYING(500) NOT NULL +); + +-- +-- NAME: CR_TABLE_ROLE; TYPE: TABLE +-- +create table cr_table_role ( + TABLE_NAME CHARACTER VARYING(30) NOT NULL, + ROLE_ID NUMERIC(11,0) NOT NULL +); + +-- +-- NAME: CR_TABLE_SOURCE; TYPE: TABLE +-- +create table cr_table_source ( + TABLE_NAME CHARACTER VARYING(30) NOT NULL, + DISPLAY_NAME CHARACTER VARYING(30) NOT NULL, + PK_FIELDS CHARACTER VARYING(200), + WEB_VIEW_ACTION CHARACTER VARYING(50), + LARGE_DATA_SOURCE_YN CHARACTER VARYING(1) DEFAULT 'N' NOT NULL, +-- LARGE_DATA_SOURCE_YN CHARACTER VARYING(1) DEFAULT 'N'::CHARACTER VARYING NOT NULL, + FILTER_SQL CHARACTER VARYING(4000), + SOURCE_DB CHARACTER VARYING(50) +); + +-- +-- NAME: DEMO_FN_CSPF_ROUT_UTIL_LINKS; TYPE: TABLE +-- +create table demo_fn_cspf_rout_util_links ( + POINT_A_ID CHARACTER VARYING(5), + POINT_Z_ID CHARACTER VARYING(5), + COLOR CHARACTER VARYING(10), + NUMBER_A INTEGER, + NUMBER_Z INTEGER, + BLUE_TEXT CHARACTER VARYING(20), + RED_TEXT CHARACTER VARYING(20), + GREEN_TEXT CHARACTER VARYING(20), + CURVE INTEGER, + LINE_TYPE INTEGER, + SORT_ORDER INTEGER +); + +-- +-- NAME: DEMO_FN_CSPF_ROUT_UTIL_MAP; TYPE: TABLE +-- +create table demo_fn_cspf_rout_util_map ( + ID CHARACTER VARYING(5), + CITY CHARACTER VARYING(40), + LATITUDE INTEGER, + LONGITUDE INTEGER, + CIRCLE_COLOR CHARACTER VARYING(10), + SUBTITLE CHARACTER VARYING(10), + SUBTITLE_COLOR CHARACTER VARYING(10), + SORT_ORDER INTEGER +); + +-- +-- NAME: DEMO_FN_CSSNG_DATA; TYPE: TABLE +-- +create table demo_fn_cssng_data ( + USID CHARACTER VARYING(20), + ANTENNA_AZIMUTH CHARACTER VARYING(50), + ANTENNA_HORIZONTAL_BEAMWIDTH INTEGER, + SITE_COUNTY CHARACTER VARYING(100), + SITE_STATE CHARACTER VARYING(50), + SLT_LATITUDE double precision, + SLT_LONGITUDE double precision, + MADE_UP_SECTOR_ID CHARACTER VARYING(20), + MADE_UP_SECTOR_ID_NUM INTEGER +); + +-- +-- NAME: DEMO_FN_E911_LTE_TEMPLATE; TYPE: TABLE +-- +create table demo_fn_e911_lte_template ( + REGION CHARACTER VARYING(20), + MARKET CHARACTER VARYING(60), + MARKETCLUSTER CHARACTER VARYING(100), + USID DOUBLE PRECISION, + LATITUDE DOUBLE PRECISION, + LONGITUDE DOUBLE PRECISION, + LAT_LONG_SOURCE CHARACTER VARYING(15), + FA_CODE DOUBLE PRECISION, + UDF4_NAME CHARACTER VARYING(200), + UDF7_NAME CHARACTER VARYING(200), + LTE_SITE CHARACTER VARYING(200), + LTE_LAUNCH_DATE CHARACTER VARYING(200), + LTE_STATUS CHARACTER VARYING(200), + LTE_SCORECARD_STATUS CHARACTER VARYING(200), + UPDATED_BY DOUBLE PRECISION, + UPDATED_DATE TIMESTAMP default now(), +-- UPDATED_DATE TIMESTAMP WITHOUT TIME ZONE, + VERSION DOUBLE PRECISION, + OEM CHARACTER VARYING(200), + COMMENTS CHARACTER VARYING(200), + ATOLL_LATITUDE DOUBLE PRECISION, + ATOLL_LONGITUDE DOUBLE PRECISION, + OFFICIAL_REGION CHARACTER VARYING(200), + OFFICIAL_MARKET CHARACTER VARYING(200), + OFFICIAL_MARKETCLUSTER CHARACTER VARYING(200), + LTE_LAUNCH_DATE_OPTIMA TIMESTAMP DEFAULT NOW(), +-- LTE_LAUNCH_DATE_OPTIMA TIMESTAMP WITHOUT TIME ZONE, + E911PULLDATE TIMESTAMP DEFAULT NOW(), +-- E911PULLDATE TIMESTAMP WITHOUT TIME ZONE, + ATOLL_LTE_SITE CHARACTER VARYING(200), + USID_SOURCE CHARACTER VARYING(20) +); + +-- +-- NAME: FN_LU_TIMEZONE; TYPE: TABLE +-- +create table fn_lu_timezone ( + TIMEZONE_ID INT(11) NOT NULL, + TIMEZONE_NAME CHARACTER VARYING(100) NOT NULL, + TIMEZONE_VALUE CHARACTER VARYING(100) NOT NULL +); + +create table fn_user ( + USER_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + ORG_ID INT(11), + MANAGER_ID INT(11), + FIRST_NAME CHARACTER VARYING(25), + MIDDLE_NAME CHARACTER VARYING(25), + LAST_NAME CHARACTER VARYING(25), + PHONE CHARACTER VARYING(25), + FAX CHARACTER VARYING(25), + CELLULAR CHARACTER VARYING(25), + EMAIL CHARACTER VARYING(50), + ADDRESS_ID NUMERIC(11,0), + ALERT_METHOD_CD CHARACTER VARYING(10), + HRID CHARACTER VARYING(20), + ORG_USER_ID CHARACTER VARYING(20), + ORG_CODE CHARACTER VARYING(30), + LOGIN_ID CHARACTER VARYING(25), + LOGIN_PWD CHARACTER VARYING(25), + LAST_LOGIN_DATE TIMESTAMP, + ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y' NOT NULL, + CREATED_ID INT(11), + CREATED_DATE TIMESTAMP DEFAULT NOW(), + MODIFIED_ID INT(11), + MODIFIED_DATE TIMESTAMP default now(), + IS_INTERNAL_YN CHARACTER(1) DEFAULT 'N' NOT NULL, + ADDRESS_LINE_1 CHARACTER VARYING(100), + ADDRESS_LINE_2 CHARACTER VARYING(100), + CITY CHARACTER VARYING(50), + STATE_CD CHARACTER VARYING(3), + ZIP_CODE CHARACTER VARYING(11), + COUNTRY_CD CHARACTER VARYING(3), + LOCATION_CLLI CHARACTER VARYING(8), + ORG_MANAGER_USERID CHARACTER VARYING(20), + COMPANY CHARACTER VARYING(100), + DEPARTMENT_NAME CHARACTER VARYING(100), + JOB_TITLE CHARACTER VARYING(100), + TIMEZONE INT(11), + DEPARTMENT CHARACTER VARYING(25), + BUSINESS_UNIT CHARACTER VARYING(25), + BUSINESS_UNIT_NAME CHARACTER VARYING(100), + COST_CENTER CHARACTER VARYING(25), + FIN_LOC_CODE CHARACTER VARYING(10), + SILO_STATUS CHARACTER VARYING(10) +); + +-- +-- NAME: FN_ROLE; TYPE: TABLE +-- +create table fn_role ( + ROLE_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + ROLE_NAME CHARACTER VARYING(50) NOT NULL, + ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y' NOT NULL, +-- ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y'::CHARACTER VARYING NOT NULL, + PRIORITY NUMERIC(4,0) +); + +-- +-- NAME: FN_APP_MME_CPU; TYPE: TABLE +-- +create table fn_app_mme_cpu ( + MME CHARACTER VARYING(200), + YEARMONTH INTEGER, + SCTP_CPU INTEGER, + AP_CPU INTEGER, + DP_CPU INTEGER, + ROUTER_CPU INTEGER, + PEB_CPU INTEGER, + SAU INTEGER +); + +-- +-- NAME: FN_AUDIT_ACTION; TYPE: TABLE +-- +create table fn_audit_action ( + AUDIT_ACTION_ID INTEGER NOT NULL, + CLASS_NAME CHARACTER VARYING(500) NOT NULL, + METHOD_NAME CHARACTER VARYING(50) NOT NULL, + AUDIT_ACTION_CD CHARACTER VARYING(20) NOT NULL, + AUDIT_ACTION_DESC CHARACTER VARYING(200), + ACTIVE_YN CHARACTER VARYING(1) +); + +-- +-- NAME: FN_AUDIT_ACTION_LOG; TYPE: TABLE +-- +create table fn_audit_action_log ( + AUDIT_LOG_ID INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, + AUDIT_ACTION_CD CHARACTER VARYING(200), + ACTION_TIME TIMESTAMP, +-- ACTION_TIME TIMESTAMP WITHOUT TIME ZONE, + USER_ID NUMERIC(11,0), + CLASS_NAME CHARACTER VARYING(100), + METHOD_NAME CHARACTER VARYING(50), + SUCCESS_MSG CHARACTER VARYING(20), + ERROR_MSG CHARACTER VARYING(500) +); + +-- +-- NAME: FN_LU_ACTIVITY; TYPE: TABLE +-- +create table fn_lu_activity ( + ACTIVITY_CD CHARACTER VARYING(50) NOT NULL PRIMARY KEY, + ACTIVITY CHARACTER VARYING(50) NOT NULL +); + +-- +-- NAME: FN_AUDIT_LOG; TYPE: TABLE +-- +create table fn_audit_log ( + LOG_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + USER_ID INT(11) NOT NULL, + ACTIVITY_CD CHARACTER VARYING(50) NOT NULL, + AUDIT_DATE TIMESTAMP DEFAULT NOW() NOT NULL, +-- AUDIT_DATE TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW() NOT NULL, + COMMENTS CHARACTER VARYING(1000), + AFFECTED_RECORD_ID_BK CHARACTER VARYING(500), + AFFECTED_RECORD_ID CHARACTER VARYING(4000), + CONSTRAINT FK_FN_AUDIT_REF_209_FN_USER FOREIGN KEY (USER_ID) REFERENCES FN_USER(USER_ID) +); + +-- +-- NAME: FN_BROADCAST_MESSAGE; TYPE: TABLE +-- +create table fn_broadcast_message ( + MESSAGE_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + MESSAGE_TEXT CHARACTER VARYING(1000) NOT NULL, + MESSAGE_LOCATION_ID NUMERIC(11,0) NOT NULL, + BROADCAST_START_DATE TIMESTAMP NOT NULL DEFAULT NOW(), +-- BROADCAST_START_DATE TIMESTAMP WITHOUT TIME ZONE NOT NULL, + BROADCAST_END_DATE TIMESTAMP NOT NULL DEFAULT NOW(), +-- BROADCAST_END_DATE TIMESTAMP WITHOUT TIME ZONE NOT NULL, + ACTIVE_YN CHARACTER(1) DEFAULT 'Y' NOT NULL, +-- ACTIVE_YN CHARACTER(1) DEFAULT 'Y'::BPCHAR NOT NULL, + SORT_ORDER NUMERIC(4,0) NOT NULL, + BROADCAST_SITE_CD CHARACTER VARYING(50) +); + +-- +-- NAME: FN_CHAT_LOGS; TYPE: TABLE +-- +create table fn_chat_logs ( + CHAT_LOG_ID INTEGER NOT NULL, + CHAT_ROOM_ID INTEGER, + USER_ID INTEGER, + MESSAGE CHARACTER VARYING(1000), + MESSAGE_DATE_TIME TIMESTAMP +-- MESSAGE_DATE_TIME TIMESTAMP WITHOUT TIME ZONE +); + +-- +-- NAME: FN_CHAT_ROOM; TYPE: TABLE +-- +create table fn_chat_room ( + CHAT_ROOM_ID INTEGER NOT NULL, + NAME CHARACTER VARYING(50) NOT NULL, + DESCRIPTION CHARACTER VARYING(500), + OWNER_ID INTEGER, + CREATED_DATE TIMESTAMP DEFAULT NOW(), +-- CREATED_DATE TIMESTAMP WITHOUT TIME ZONE, + UPDATED_DATE TIMESTAMP DEFAULT NOW() +-- UPDATED_DATE TIMESTAMP WITHOUT TIME ZONE +); + +-- +-- NAME: FN_CHAT_USERS; TYPE: TABLE +-- +create table fn_chat_users ( + CHAT_ROOM_ID INTEGER, + USER_ID INTEGER, + LAST_ACTIVITY_DATE_TIME TIMESTAMP, +-- LAST_ACTIVITY_DATE_TIME TIMESTAMP WITHOUT TIME ZONE, + CHAT_STATUS CHARACTER VARYING(20), + ID INTEGER NOT NULL +); + +-- +-- NAME: FN_DATASOURCE; TYPE: TABLE +-- +create table fn_datasource ( + ID INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, + NAME CHARACTER VARYING(50), + DRIVER_NAME CHARACTER VARYING(256), + SERVER CHARACTER VARYING(256), + PORT INTEGER, + USER_NAME CHARACTER VARYING(256), + PASSWORD CHARACTER VARYING(256), + URL CHARACTER VARYING(256), + MIN_POOL_SIZE INTEGER, + MAX_POOL_SIZE INTEGER, + ADAPTER_ID INTEGER, + DS_TYPE CHARACTER VARYING(20) +); + +-- +-- NAME: FN_FUNCTION; TYPE: TABLE +-- +create table fn_function ( + FUNCTION_CD CHARACTER VARYING(30) NOT NULL PRIMARY KEY, + FUNCTION_NAME CHARACTER VARYING(50) NOT NULL +); + +-- +-- NAME: FN_LU_ALERT_METHOD; TYPE: TABLE +-- +create table fn_lu_alert_method ( + ALERT_METHOD_CD CHARACTER VARYING(10) NOT NULL, + ALERT_METHOD CHARACTER VARYING(50) NOT NULL +); + +-- +-- NAME: FN_LU_BROADCAST_SITE; TYPE: TABLE +-- +create table fn_lu_broadcast_site ( + BROADCAST_SITE_CD CHARACTER VARYING(50) NOT NULL, + BROADCAST_SITE_DESCR CHARACTER VARYING(100) +); + +-- +-- NAME: FN_LU_CALL_TIMES; TYPE: TABLE +-- +create table fn_lu_call_times ( + CALL_TIME_ID NUMERIC(10,0) NOT NULL, + CALL_TIME_AMOUNT NUMERIC(10,0) NOT NULL, + CALL_TIME_DISPLAY CHARACTER VARYING(50) NOT NULL +); + +-- +-- NAME: FN_LU_CITY; TYPE: TABLE +-- +create table fn_lu_city ( + CITY_CD CHARACTER VARYING(2) NOT NULL, + CITY CHARACTER VARYING(100) NOT NULL, + STATE_CD CHARACTER VARYING(2) NOT NULL +); + +-- +-- NAME: FN_LU_COUNTRY; TYPE: TABLE +-- +create table fn_lu_country ( + COUNTRY_CD CHARACTER VARYING(3) NOT NULL, + COUNTRY CHARACTER VARYING(100) NOT NULL, + FULL_NAME CHARACTER VARYING(100), + WEBPHONE_COUNTRY_LABEL CHARACTER VARYING(30) +); + +-- +-- NAME: FN_LU_MENU_SET; TYPE: TABLE +-- +create table fn_lu_menu_set ( + MENU_SET_CD CHARACTER VARYING(10) NOT NULL PRIMARY KEY, + MENU_SET_NAME CHARACTER VARYING(50) NOT NULL +); + +-- +-- NAME: FN_LU_PRIORITY; TYPE: TABLE +-- +create table fn_lu_priority ( + PRIORITY_ID NUMERIC(11,0) NOT NULL, + PRIORITY CHARACTER VARYING(50) NOT NULL, + ACTIVE_YN CHARACTER(1) NOT NULL, + SORT_ORDER NUMERIC(5,0) +); + +-- +-- NAME: FN_LU_ROLE_TYPE; TYPE: TABLE +-- +create table fn_lu_role_type ( + ROLE_TYPE_ID NUMERIC(11,0) NOT NULL, + ROLE_TYPE CHARACTER VARYING(50) NOT NULL +); + +-- +-- NAME: FN_LU_STATE; TYPE: TABLE +-- +create table fn_lu_state ( + STATE_CD CHARACTER VARYING(2) NOT NULL, + STATE CHARACTER VARYING(100) NOT NULL +); + +-- +-- NAME: FN_LU_TAB_SET; TYPE: TABLE +-- +create table fn_lu_tab_set ( + TAB_SET_CD CHARACTER VARYING(30) NOT NULL, + TAB_SET_NAME CHARACTER VARYING(50) NOT NULL +); + +-- +-- NAME: FN_MENU; TYPE: TABLE +-- +create table fn_menu ( + MENU_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + LABEL CHARACTER VARYING(100), + PARENT_ID INT(11), + SORT_ORDER NUMERIC(4,0), + ACTION CHARACTER VARYING(200), + FUNCTION_CD CHARACTER VARYING(30), + ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y' NOT NULL, +-- ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y'::CHARACTER VARYING NOT NULL, + SERVLET CHARACTER VARYING(50), + QUERY_STRING CHARACTER VARYING(200), + EXTERNAL_URL CHARACTER VARYING(200), + TARGET CHARACTER VARYING(25), + MENU_SET_CD CHARACTER VARYING(10) DEFAULT 'APP', +-- MENU_SET_CD CHARACTER VARYING(10) DEFAULT 'APP'::CHARACTER VARYING, + SEPARATOR_YN CHARACTER(1) DEFAULT 'N', +-- SEPARATOR_YN CHARACTER(1) DEFAULT 'N'::BPCHAR, + IMAGE_SRC CHARACTER VARYING(100), + CONSTRAINT FK_FN_MENU_REF_196_FN_MENU FOREIGN KEY (PARENT_ID) REFERENCES FN_MENU(MENU_ID), + CONSTRAINT FK_FN_MENU_MENU_SET_CD FOREIGN KEY (MENU_SET_CD) REFERENCES FN_LU_MENU_SET(MENU_SET_CD), + CONSTRAINT FK_FN_MENU_REF_223_FN_FUNCT FOREIGN KEY (FUNCTION_CD) REFERENCES FN_FUNCTION(FUNCTION_CD) +); + +-- +-- NAME: FN_ORG; TYPE: TABLE +-- +create table fn_org ( + ORG_ID INT(11) NOT NULL, + ORG_NAME CHARACTER VARYING(50) NOT NULL, + ACCESS_CD CHARACTER VARYING(10) +); + +-- +-- NAME: FN_RESTRICTED_URL; TYPE: TABLE +-- +create table fn_restricted_url ( + RESTRICTED_URL CHARACTER VARYING(250) NOT NULL, + FUNCTION_CD CHARACTER VARYING(30) NOT NULL +); + +-- +-- NAME: FN_ROLE_COMPOSITE; TYPE: TABLE +-- +create table fn_role_composite ( + PARENT_ROLE_ID INT(11) NOT NULL, + CHILD_ROLE_ID INT(11) NOT NULL, + CONSTRAINT FK_FN_ROLE_COMPOSITE_CHILD FOREIGN KEY (CHILD_ROLE_ID) REFERENCES FN_ROLE(ROLE_ID), + CONSTRAINT FK_FN_ROLE_COMPOSITE_PARENT FOREIGN KEY (PARENT_ROLE_ID) REFERENCES FN_ROLE(ROLE_ID) +); + +-- +-- NAME: FN_ROLE_FUNCTION; TYPE: TABLE +-- +create table fn_role_function ( + ROLE_ID INT(11) NOT NULL, + FUNCTION_CD CHARACTER VARYING(30) NOT NULL, + CONSTRAINT FK_FN_ROLE__REF_198_FN_ROLE FOREIGN KEY (ROLE_ID) REFERENCES FN_ROLE(ROLE_ID) +); + +-- +-- NAME: FN_TAB; TYPE: TABLE +-- +create table fn_tab ( + TAB_CD CHARACTER VARYING(30) NOT NULL, + TAB_NAME CHARACTER VARYING(50) NOT NULL, + TAB_DESCR CHARACTER VARYING(100), + ACTION CHARACTER VARYING(100) NOT NULL, + FUNCTION_CD CHARACTER VARYING(30) NOT NULL, + ACTIVE_YN CHARACTER(1) NOT NULL, + SORT_ORDER NUMERIC(11,0) NOT NULL, + PARENT_TAB_CD CHARACTER VARYING(30), + TAB_SET_CD CHARACTER VARYING(30) +); + +-- +-- NAME: FN_TAB_SELECTED; TYPE: TABLE +-- +create table fn_tab_selected ( + SELECTED_TAB_CD CHARACTER VARYING(30) NOT NULL, + TAB_URI CHARACTER VARYING(40) NOT NULL +); + +-- +-- NAME: FN_USER_PSEUDO_ROLE; TYPE: TABLE +-- +create table fn_user_pseudo_role ( + PSEUDO_ROLE_ID INT(11) NOT NULL, + USER_ID INT(11) NOT NULL +); + +-- +-- NAME: FN_USER_ROLE; TYPE: TABLE +-- +create table fn_user_role ( + USER_ID INT(10) NOT NULL, + ROLE_ID INT(10) NOT NULL, + PRIORITY NUMERIC(4,0), + APP_ID INT(11) DEFAULT 1, + CONSTRAINT FK_FN_USER__REF_172_FN_USER FOREIGN KEY (USER_ID) REFERENCES FN_USER(USER_ID), + CONSTRAINT FK_FN_USER__REF_175_FN_ROLE FOREIGN KEY (ROLE_ID) REFERENCES FN_ROLE(ROLE_ID) +); + +-- +-- NAME: FN_XMLTYPE; TYPE: TABLE +-- +create table fn_xmltype ( + ID NUMERIC(10,0) NOT NULL, + XML_DOCUMENT TEXT +); + +-- +-- NAME: SCHEMA_INFO; TYPE: TABLE +-- +create table schema_info ( + SCHEMA_ID CHARACTER VARYING(25) NOT NULL, + SCHEMA_DESC CHARACTER VARYING(75) NOT NULL, + DATASOURCE_TYPE CHARACTER VARYING(100), + CONNECTION_URL VARCHAR(200) NOT NULL, + USER_NAME VARCHAR(45) NOT NULL, + PASSWORD VARCHAR(45) NULL DEFAULT NULL, + DRIVER_CLASS VARCHAR(100) NOT NULL, + MIN_POOL_SIZE INT NOT NULL, + MAX_POOL_SIZE INT NOT NULL, + IDLE_CONNECTION_TEST_PERIOD INT NOT NULL + +); + +-- ---------------------------------------------------------- +-- NAME: FN_APP; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_app ( + APP_ID int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, + APP_NAME varchar(100) NOT NULL DEFAULT '?', + APP_IMAGE_URL varchar(256) DEFAULT NULL, + APP_DESCRIPTION varchar(512) DEFAULT NULL, + APP_NOTES varchar(4096) DEFAULT NULL, + APP_URL varchar(256) DEFAULT NULL, + APP_ALTERNATE_URL varchar(256) DEFAULT NULL, + APP_REST_ENDPOINT varchar(2000) DEFAULT NULL, + ML_APP_NAME varchar(50) NOT NULL DEFAULT '?', + ML_APP_ADMIN_ID varchar(7) NOT NULL DEFAULT '?', + MOTS_ID int(11) DEFAULT NULL, + APP_PASSWORD varchar(256) NOT NULL DEFAULT '?', + OPEN char(1) DEFAULT 'N', + ENABLED char(1) DEFAULT 'Y', + THUMBNAIL mediumblob, + APP_USERNAME varchar(50), + UEB_KEY VARCHAR(256) DEFAULT NULL, + UEB_SECRET VARCHAR(256) DEFAULT NULL, + UEB_TOPIC_NAME VARCHAR(256) DEFAULT NULL + +); + +-- ---------------------------------------------------------- +-- NAME: FN_FN_WORKFLOW; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_workflow ( + id mediumint(9) NOT NULL AUTO_INCREMENT, + name varchar(20) NOT NULL, + description varchar(500) DEFAULT NULL, + run_link varchar(300) DEFAULT NULL, + suspend_link varchar(300) DEFAULT NULL, + modified_link varchar(300) DEFAULT NULL, + active_yn varchar(300) DEFAULT NULL, + created varchar(300) DEFAULT NULL, + created_by int(11) DEFAULT NULL, + modified varchar(300) DEFAULT NULL, + modified_by int(11) DEFAULT NULL, + workflow_key varchar(50) DEFAULT NULL, + PRIMARY KEY (id), + UNIQUE KEY name (name) +); + +-- ---------------------------------------------------------- +-- NAME: FN_SCHEDULE_WORKFLOWS; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_schedule_workflows ( + id_schedule_workflows bigint(25) PRIMARY KEY NOT NULL AUTO_INCREMENT, + workflow_server_url varchar(45) DEFAULT NULL, + workflow_key varchar(45) NOT NULL, + workflow_arguments varchar(45) DEFAULT NULL, + startDateTimeCron varchar(45) DEFAULT NULL, + endDateTime TIMESTAMP DEFAULT NOW(), + start_date_time TIMESTAMP DEFAULT NOW(), + recurrence varchar(45) DEFAULT NULL + ); + + +-- For demo reporting application add : demo_bar_chart, demo_bar_chart_inter, demo_line_chart, demo_pie_chart and demo_util_chart +-- demo_scatter_chart, demo_scatter_plot +-- ---------------------------------------------------------- +-- NAME: DEMO_BAR_CHART; TYPE: TABLE +-- ---------------------------------------------------------- +create table demo_bar_chart ( + label varchar(20), + value numeric(25,15) + ); + +-- ---------------------------------------------------------- +-- NAME: DEMO_BAR_CHART_INTER; TYPE: TABLE +-- ---------------------------------------------------------- +create table demo_bar_chart_inter ( + spam_date date, + num_rpt_sources numeric(10,0), + num_det_sources numeric(10,0) + ); + +-- ---------------------------------------------------------- +-- NAME: DEMO_LINE_CHART; TYPE: TABLE +-- ---------------------------------------------------------- +create table demo_line_chart ( + series varchar(20), + log_date date, + data_value numeric(10,5) + ); + +-- ---------------------------------------------------------- +-- NAME: DEMO_PIE_CHART; TYPE: TABLE +-- ---------------------------------------------------------- +create table demo_pie_chart ( + legend varchar(20), + data_value numeric(10,5) + ); + +-- ---------------------------------------------------------- +-- NAME: DEMO_UTIL_CHART; TYPE: TABLE +-- ---------------------------------------------------------- +create table demo_util_chart ( + traffic_date date, + util_perc numeric(10,5) + ); + +-- ---------------------------------------------------------- +-- NAME: DEMO_SCATTER_CHART; TYPE: TABLE +-- ---------------------------------------------------------- +create table demo_scatter_chart ( + rainfall numeric(10,2), + key_value varchar(20), + measurements numeric(10,2) +); + +-- ---------------------------------------------------------- +-- NAME: DEMO_SCATTER_PLOT; TYPE: TABLE +-- ---------------------------------------------------------- +create table demo_scatter_plot +( + SERIES VARCHAR(20), + VALUEX numeric(25,15), + VALUEY numeric(25,15) +); + +-- ---------------------------------------------------------- +-- NAME: FN_QZ_JOB_DETAILS; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_qz_job_details ( +SCHED_NAME VARCHAR(120) NOT NULL, +JOB_NAME VARCHAR(200) NOT NULL, +JOB_GROUP VARCHAR(200) NOT NULL, +DESCRIPTION VARCHAR(250) NULL, +JOB_CLASS_NAME VARCHAR(250) NOT NULL, +IS_DURABLE VARCHAR(1) NOT NULL, +IS_NONCONCURRENT VARCHAR(1) NOT NULL, +IS_UPDATE_DATA VARCHAR(1) NOT NULL, +REQUESTS_RECOVERY VARCHAR(1) NOT NULL, +JOB_DATA BLOB NULL, +PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) +); + +-- ---------------------------------------------------------- +-- NAME: FN_QZ_TRIGGERS; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_qz_triggers ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_NAME VARCHAR(200) NOT NULL, +TRIGGER_GROUP VARCHAR(200) NOT NULL, +JOB_NAME VARCHAR(200) NOT NULL, +JOB_GROUP VARCHAR(200) NOT NULL, +DESCRIPTION VARCHAR(250) NULL, +NEXT_FIRE_TIME BIGINT(13) NULL, +PREV_FIRE_TIME BIGINT(13) NULL, +PRIORITY INTEGER NULL, +TRIGGER_STATE VARCHAR(16) NOT NULL, +TRIGGER_TYPE VARCHAR(8) NOT NULL, +START_TIME BIGINT(13) NOT NULL, +END_TIME BIGINT(13) NULL, +CALENDAR_NAME VARCHAR(200) NULL, +MISFIRE_INSTR SMALLINT(2) NULL, +JOB_DATA BLOB NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) +REFERENCES FN_QZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP) +); + +-- ---------------------------------------------------------- +-- NAME: FN_QZ_SIMPLE_TRIGGERS; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_qz_simple_triggers ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_NAME VARCHAR(200) NOT NULL, +TRIGGER_GROUP VARCHAR(200) NOT NULL, +REPEAT_COUNT BIGINT(7) NOT NULL, +REPEAT_INTERVAL BIGINT(12) NOT NULL, +TIMES_TRIGGERED BIGINT(10) NOT NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +REFERENCES FN_QZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +); + +-- ---------------------------------------------------------- +-- NAME: FN_QZ_CRON_TRIGGERS; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_qz_cron_triggers ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_NAME VARCHAR(200) NOT NULL, +TRIGGER_GROUP VARCHAR(200) NOT NULL, +CRON_EXPRESSION VARCHAR(120) NOT NULL, +TIME_ZONE_ID VARCHAR(80), +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +REFERENCES FN_QZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +); + +-- ---------------------------------------------------------- +-- NAME: FN_QZ_SIMPROP_TRIGGERS; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_qz_simprop_triggers + ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + STR_PROP_1 VARCHAR(512) NULL, + STR_PROP_2 VARCHAR(512) NULL, + STR_PROP_3 VARCHAR(512) NULL, + INT_PROP_1 INT NULL, + INT_PROP_2 INT NULL, + LONG_PROP_1 BIGINT NULL, + LONG_PROP_2 BIGINT NULL, + DEC_PROP_1 NUMERIC(13,4) NULL, + DEC_PROP_2 NUMERIC(13,4) NULL, + BOOL_PROP_1 VARCHAR(1) NULL, + BOOL_PROP_2 VARCHAR(1) NULL, + PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) + REFERENCES FN_QZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +); + +-- ---------------------------------------------------------- +-- NAME: FN_QZ_BLOB_TRIGGERS; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_qz_blob_triggers ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_NAME VARCHAR(200) NOT NULL, +TRIGGER_GROUP VARCHAR(200) NOT NULL, +BLOB_DATA BLOB NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +REFERENCES FN_QZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +); + +-- ---------------------------------------------------------- +-- NAME: FN_QZ_CALENDARS; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_qz_calendars ( +SCHED_NAME VARCHAR(120) NOT NULL, +CALENDAR_NAME VARCHAR(200) NOT NULL, +CALENDAR BLOB NOT NULL, +PRIMARY KEY (SCHED_NAME,CALENDAR_NAME) +); + +-- ---------------------------------------------------------- +-- NAME: FN_QZ_PAUSED_TRIGGER_GRPS; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_qz_paused_trigger_grps ( +SCHED_NAME VARCHAR(120) NOT NULL, +TRIGGER_GROUP VARCHAR(200) NOT NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP) +); + +-- ---------------------------------------------------------- +-- NAME: FN_QZ_FIRED_TRIGGERS; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_qz_fired_triggers ( +SCHED_NAME VARCHAR(120) NOT NULL, +ENTRY_ID VARCHAR(95) NOT NULL, +TRIGGER_NAME VARCHAR(200) NOT NULL, +TRIGGER_GROUP VARCHAR(200) NOT NULL, +INSTANCE_NAME VARCHAR(200) NOT NULL, +FIRED_TIME BIGINT(13) NOT NULL, +SCHED_TIME BIGINT(13) NOT NULL, +PRIORITY INTEGER NOT NULL, +STATE VARCHAR(16) NOT NULL, +JOB_NAME VARCHAR(200) NULL, +JOB_GROUP VARCHAR(200) NULL, +IS_NONCONCURRENT VARCHAR(1) NULL, +REQUESTS_RECOVERY VARCHAR(1) NULL, +PRIMARY KEY (SCHED_NAME,ENTRY_ID) +); + +-- ---------------------------------------------------------- +-- NAME: FN_QZ_SCHEDULER_STATE; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_qz_scheduler_state ( +SCHED_NAME VARCHAR(120) NOT NULL, +INSTANCE_NAME VARCHAR(200) NOT NULL, +LAST_CHECKIN_TIME BIGINT(13) NOT NULL, +CHECKIN_INTERVAL BIGINT(13) NOT NULL, +PRIMARY KEY (SCHED_NAME,INSTANCE_NAME) +); + +-- ---------------------------------------------------------- +-- NAME: FN_QZ_LOCKS; TYPE: TABLE +-- ---------------------------------------------------------- +create table fn_qz_locks ( +SCHED_NAME VARCHAR(120) NOT NULL, +LOCK_NAME VARCHAR(40) NOT NULL, +PRIMARY KEY (SCHED_NAME,LOCK_NAME) +); + +-- +-- name: rcloudinvocation; type: table +-- +create table rcloudinvocation ( + id varchar(128) not null primary key, + created timestamp not null, + userinfo varchar(2048) not null, + notebookid varchar(128) not null, + parameters varchar(2048) default null +); + +-- +-- name: rcloudnotebook; type: table +-- +create table rcloudnotebook ( + notebookname varchar(128) not null primary key, + notebookid varchar(128) not null +); + +-- +-- Name: fn_lu_message_location; Type: TABLE +-- + +CREATE TABLE fn_lu_message_location ( + message_location_id numeric(11,0) NOT NULL, + message_location_descr character varying(30) NOT NULL +); + +-- +-- Name: fn_lu_message_location_MESSAGE_LOCATION_ID; Type: CONSTRAINT +-- + +ALTER TABLE fn_lu_message_location + ADD CONSTRAINT fn_lu_message_location_MESSAGE_LOCATION_ID PRIMARY KEY (message_location_id); + +-- ---------------------------------------------------------- +-- NAME: QUARTZ TYPE: INDEXES +-- ---------------------------------------------------------- +create index idx_fn_qz_j_req_recovery on fn_qz_job_details(sched_name,requests_recovery); +create index idx_fn_qz_j_grp on fn_qz_job_details(sched_name,job_group); +create index idx_fn_qz_t_j on fn_qz_triggers(sched_name,job_name,job_group); +create index idx_fn_qz_t_jg on fn_qz_triggers(sched_name,job_group); +create index idx_fn_qz_t_c on fn_qz_triggers(sched_name,calendar_name); +create index idx_fn_qz_t_g on fn_qz_triggers(sched_name,trigger_group); +create index idx_fn_qz_t_state on fn_qz_triggers(sched_name,trigger_state); +create index idx_fn_qz_t_n_state on fn_qz_triggers(sched_name,trigger_name,trigger_group,trigger_state); +create index idx_fn_qz_t_n_g_state on fn_qz_triggers(sched_name,trigger_group,trigger_state); +create index idx_fn_qz_t_next_fire_time on fn_qz_triggers(sched_name,next_fire_time); +create index idx_fn_qz_t_nft_st on fn_qz_triggers(sched_name,trigger_state,next_fire_time); +create index idx_fn_qz_t_nft_misfire on fn_qz_triggers(sched_name,misfire_instr,next_fire_time); +create index idx_fn_qz_t_nft_st_misfire on fn_qz_triggers(sched_name,misfire_instr,next_fire_time,trigger_state); +create index idx_fn_qz_t_nft_st_misfire_grp on fn_qz_triggers(sched_name,misfire_instr,next_fire_time,trigger_group,trigger_state); +create index idx_fn_qz_ft_trig_inst_name on fn_qz_fired_triggers(sched_name,instance_name); +create index idx_fn_qz_ft_inst_job_req_rcvry on fn_qz_fired_triggers(sched_name,instance_name,requests_recovery); +create index idx_fn_qz_ft_j_g on fn_qz_fired_triggers(sched_name,job_name,job_group); +create index idx_fn_qz_ft_jg on fn_qz_fired_triggers(sched_name,job_group); +create index idx_fn_qz_ft_t_g on fn_qz_fired_triggers(sched_name,trigger_name,trigger_group); +create index idx_fn_qz_ft_tg on fn_qz_fired_triggers(sched_name,trigger_group); + +-- ------------------ CREATE VIEW SECTION +-- +-- NAME: V_URL_ACCESS; TYPE: VIEW +-- +CREATE VIEW v_url_access AS + SELECT DISTINCT M.ACTION AS URL, + M.FUNCTION_CD + FROM FN_MENU M + WHERE (M.ACTION IS NOT NULL) +UNION + SELECT DISTINCT T.ACTION AS URL, + T.FUNCTION_CD + FROM FN_TAB T + WHERE (T.ACTION IS NOT NULL) +UNION + SELECT R.RESTRICTED_URL AS URL, + R.FUNCTION_CD + FROM FN_RESTRICTED_URL R; +-- ------------------ ALTER TABLE ADD CONSTRAINT PRIMARY KEY SECTION +-- +-- NAME: CR_FAVORITE_REPORTS_USER_IDREP_ID; TYPE: CONSTRAINT +-- +alter table cr_favorite_reports + add constraint cr_favorite_reports_user_idrep_id primary key (user_id, rep_id); +-- +-- NAME: CR_FOLDER_FOLDER_ID; TYPE: CONSTRAINT +-- +alter table cr_folder + add constraint cr_folder_folder_id primary key (folder_id); +-- +-- NAME: CR_FOLDER_ACCESS_FOLDER_ACCESS_ID; TYPE: CONSTRAINT +-- +alter table cr_folder_access + add constraint cr_folder_access_folder_access_id primary key (folder_access_id); +-- +-- NAME: CR_HIST_USER_MAP_HIST_IDUSER_ID; TYPE: CONSTRAINT +-- +alter table cr_hist_user_map + add constraint cr_hist_user_map_hist_iduser_id primary key (hist_id, user_id); +-- +-- NAME: CR_LU_FILE_TYPE_LOOKUP_ID; TYPE: CONSTRAINT +-- +alter table cr_lu_file_type + add constraint cr_lu_file_type_lookup_id primary key (lookup_id); +-- +-- NAME: CR_RAPTOR_ACTION_IMG_IMAGE_ID; TYPE: CONSTRAINT +-- +alter table cr_raptor_action_img + add constraint cr_raptor_action_img_image_id primary key (image_id); +-- +-- NAME: CR_RAPTOR_PDF_IMG_IMAGE_ID; TYPE: CONSTRAINT +-- +alter table cr_raptor_pdf_img + add constraint cr_raptor_pdf_img_image_id primary key (image_id); +-- +-- NAME: CR_REMOTE_SCHEMA_INFO_SCHEMA_PREFIX; TYPE: CONSTRAINT +-- +alter table cr_remote_schema_info + add constraint cr_remote_schema_info_schema_prefix primary key (schema_prefix); +-- +-- NAME: CR_REPORT_REP_ID; TYPE: CONSTRAINT +-- +alter table cr_report + add constraint cr_report_rep_id primary key (rep_id); +-- +-- NAME: CR_REPORT_ACCESS_REP_IDORDER_NO; TYPE: CONSTRAINT +-- +alter table cr_report_access + add constraint cr_report_access_rep_idorder_no primary key (rep_id, order_no); +-- +-- NAME: CR_REPORT_EMAIL_SENT_LOG_LOG_ID; TYPE: CONSTRAINT +-- +alter table cr_report_email_sent_log + add constraint cr_report_email_sent_log_log_id primary key (log_id); +-- +-- NAME: CR_REPORT_FILE_HISTORY_HIST_ID; TYPE: CONSTRAINT +-- +alter table cr_report_file_history + add constraint cr_report_file_history_hist_id primary key (hist_id); +-- +-- NAME: CR_REPORT_SCHEDULE_SCHEDULE_ID; TYPE: CONSTRAINT +-- +alter table cr_report_schedule + add constraint cr_report_schedule_schedule_id primary key (schedule_id); +-- +-- NAME: CR_REPORT_SCHEDULE_USERS_SCHEDULE_IDREP_IDUSER_IDORDER_NO; TYPE: CONSTRAINT +-- +alter table cr_report_schedule_users + add constraint cr_report_schedule_users_schedule_idrep_iduser_idorder_no primary key (schedule_id, rep_id, user_id, order_no); +-- +-- NAME: CR_REPORT_TEMPLATE_MAP_REPORT_ID; TYPE: CONSTRAINT +-- +alter table cr_report_template_map + add constraint cr_report_template_map_report_id primary key (report_id); +-- +-- NAME: CR_TABLE_ROLE_TABLE_NAMEROLE_ID; TYPE: CONSTRAINT +-- +alter table cr_table_role + add constraint cr_table_role_table_namerole_id primary key (table_name, role_id); +-- +-- NAME: CR_TABLE_SOURCE_TABLE_NAME; TYPE: CONSTRAINT +-- +alter table cr_table_source + add constraint cr_table_source_table_name primary key (table_name); +-- +-- NAME: FN_AUDIT_ACTION_AUDIT_ACTION_ID; TYPE: CONSTRAINT +-- +alter table fn_audit_action + add constraint fn_audit_action_audit_action_id primary key (audit_action_id); +-- +-- +-- NAME: FK_FN_AUDIT_REF_205_FN_LU_AC; TYPE: CONSTRAINT +-- +alter table fn_audit_log + add constraint fk_fn_audit_ref_205_fn_lu_ac foreign key (activity_cd) references fn_lu_activity(activity_cd); +-- +-- NAME: FK_FN_ROLE__REF_201_FN_FUNCT; TYPE: CONSTRAINT +-- +alter table fn_role_function + add constraint fk_fn_role__ref_201_fn_funct foreign key (function_cd) references fn_function(function_cd); +-- +-- NAME: FN_CHAT_LOGS_CHAT_LOG_ID; TYPE: CONSTRAINT +-- +alter table fn_chat_logs + add constraint fn_chat_logs_chat_log_id primary key (chat_log_id); +-- +-- NAME: FN_CHAT_ROOM_CHAT_ROOM_ID; TYPE: CONSTRAINT +-- +alter table fn_chat_room + add constraint fn_chat_room_chat_room_id primary key (chat_room_id); +-- +-- NAME: FN_CHAT_USERS_ID; TYPE: CONSTRAINT +-- +alter table fn_chat_users + add constraint fn_chat_users_id primary key (id); +-- +-- NAME: FN_LU_ALERT_METHOD_ALERT_METHOD_CD; TYPE: CONSTRAINT +-- +alter table fn_lu_alert_method + add constraint fn_lu_alert_method_alert_method_cd primary key (alert_method_cd); +-- +-- NAME: FN_LU_BROADCAST_SITE_BROADCAST_SITE_CD; TYPE: CONSTRAINT +-- +alter table fn_lu_broadcast_site + add constraint fn_lu_broadcast_site_broadcast_site_cd primary key (broadcast_site_cd); +-- +-- NAME: FN_LU_CALL_TIMES_CALL_TIME_ID; TYPE: CONSTRAINT +-- +alter table fn_lu_call_times + add constraint fn_lu_call_times_call_time_id primary key (call_time_id); +-- +-- NAME: FN_LU_CITY_CITY_CDSTATE_CD; TYPE: CONSTRAINT +-- +alter table fn_lu_city + add constraint fn_lu_city_city_cdstate_cd primary key (city_cd, state_cd); +-- +-- NAME: FN_LU_COUNTRY_COUNTRY_CD; TYPE: CONSTRAINT +-- +alter table fn_lu_country + add constraint fn_lu_country_country_cd primary key (country_cd); +-- +-- NAME: FN_LU_PRIORITY_PRIORITY_ID; TYPE: CONSTRAINT +-- +alter table fn_lu_priority + add constraint fn_lu_priority_priority_id primary key (priority_id); +-- +-- NAME: FN_LU_ROLE_TYPE_ROLE_TYPE_ID; TYPE: CONSTRAINT +-- +alter table fn_lu_role_type + add constraint fn_lu_role_type_role_type_id primary key (role_type_id); +-- +-- NAME: FN_LU_STATE_STATE_CD; TYPE: CONSTRAINT +-- +alter table fn_lu_state + add constraint fn_lu_state_state_cd primary key (state_cd); +-- +-- NAME: FN_LU_TAB_SET_TAB_SET_CD; TYPE: CONSTRAINT +-- +alter table fn_lu_tab_set + add constraint fn_lu_tab_set_tab_set_cd primary key (tab_set_cd); +-- +-- NAME: FN_LU_TIMEZONE_TIMEZONE_ID; TYPE: CONSTRAINT +-- +alter table fn_lu_timezone + add constraint fn_lu_timezone_timezone_id primary key (timezone_id); +-- +-- NAME: FN_ORG_ORG_ID; TYPE: CONSTRAINT +-- +alter table fn_org + add constraint fn_org_org_id primary key (org_id); +-- +-- NAME: FN_RESTRICTED_URL_RESTRICTED_URLFUNCTION_CD; TYPE: CONSTRAINT +-- +alter table fn_restricted_url + add constraint fn_restricted_url_restricted_urlfunction_cd primary key (restricted_url, function_cd); +-- +-- NAME: FN_ROLE_COMPOSITE_PARENT_ROLE_IDCHILD_ROLE_ID; TYPE: CONSTRAINT +-- +alter table fn_role_composite + add constraint fn_role_composite_parent_role_idchild_role_id primary key (parent_role_id, child_role_id); +-- +-- NAME: FN_ROLE_FUNCTION_ROLE_IDFUNCTION_CD; TYPE: CONSTRAINT +-- +alter table fn_role_function + add constraint fn_role_function_role_idfunction_cd primary key (role_id, function_cd); +-- +-- NAME: FN_TAB_TAB_CD; TYPE: CONSTRAINT +-- +alter table fn_tab + add constraint fn_tab_tab_cd primary key (tab_cd); +-- +-- NAME: FN_TAB_SELECTED_SELECTED_TAB_CDTAB_URI; TYPE: CONSTRAINT +-- +alter table fn_tab_selected + add constraint fn_tab_selected_selected_tab_cdtab_uri primary key (selected_tab_cd, tab_uri); +-- +-- NAME: FN_USER_PSEUDO_ROLE_PSEUDO_ROLE_IDUSER_ID; TYPE: CONSTRAINT +-- +alter table fn_user_pseudo_role + add constraint fn_user_pseudo_role_pseudo_role_iduser_id primary key (pseudo_role_id, user_id); +-- +-- NAME: FN_USER_ROLE_USER_IDROLE_ID; TYPE: CONSTRAINT +-- +alter table fn_user_role + add constraint fn_user_role_user_idrole_id primary key (user_id, role_id, app_id); + +-- ------------------ CREATE INDEX SECTION +-- +-- NAME: CR_REPORT_CREATE_IDPUBLIC_YNTITLE; TYPE: INDEX +-- +create index cr_report_create_idpublic_yntitle using btree on cr_report (create_id, public_yn, title); +-- +-- NAME: CR_TABLE_JOIN_DEST_TABLE_NAME; TYPE: INDEX +-- +create index cr_table_join_dest_table_name using btree on cr_table_join (dest_table_name); +-- +-- NAME: CR_TABLE_JOIN_SRC_TABLE_NAME; TYPE: INDEX +-- +create index cr_table_join_src_table_name using btree on cr_table_join (src_table_name); +-- +-- NAME: FN_AUDIT_LOG_ACTIVITY_CD; TYPE: INDEX +-- +create index fn_audit_log_activity_cd using btree on fn_audit_log (activity_cd); +-- +-- NAME: FN_AUDIT_LOG_USER_ID; TYPE: INDEX +-- +create index fn_audit_log_user_id using btree on fn_audit_log (user_id); +-- +-- NAME: FN_MENU_FUNCTION_CD; TYPE: INDEX +-- +create index fn_menu_function_cd using btree on fn_menu (function_cd); +-- +-- NAME: FN_ORG_ACCESS_CD; TYPE: INDEX +-- +create index fn_org_access_cd using btree on fn_org (access_cd); +-- +-- NAME: FN_ROLE_FUNCTION_FUNCTION_CD; TYPE: INDEX +-- +create index fn_role_function_function_cd using btree on fn_role_function (function_cd); +-- +-- NAME: FN_ROLE_FUNCTION_ROLE_ID; TYPE: INDEX +-- +create index fn_role_function_role_id using btree on fn_role_function (role_id); +-- +-- NAME: FN_USER_ADDRESS_ID; TYPE: INDEX +-- +create index fn_user_address_id using btree on fn_user (address_id); +-- +-- NAME: FN_USER_ALERT_METHOD_CD; TYPE: INDEX +-- +create index fn_user_alert_method_cd using btree on fn_user (alert_method_cd); +-- +-- NAME: FN_USER_HRID; TYPE: INDEX +-- +create unique index fn_user_hrid using btree on fn_user (hrid); +-- +-- NAME: FN_USER_LOGIN_ID; TYPE: INDEX +-- +create unique index fn_user_login_id using btree on fn_user (login_id); +-- +-- NAME: FN_USER_ORG_ID; TYPE: INDEX +-- +create index fn_user_org_id using btree on fn_user (org_id); +-- +-- NAME: FN_USER_ROLE_ROLE_ID; TYPE: INDEX +-- +create index fn_user_role_role_id using btree on fn_user_role (role_id); +-- +-- NAME: FN_USER_ROLE_USER_ID; TYPE: INDEX +-- +create index fn_user_role_user_id using btree on fn_user_role (user_id); +-- +-- NAME: FN_XMLTYPE_ID; TYPE: INDEX +-- +create unique index fn_xmltype_id using btree on fn_xmltype (id); +-- +-- NAME: FK_FN_USER__REF_178_FN_APP_idx; TYPE: INDEX +-- +create index fk_fn_user__ref_178_fn_app_IDX on fn_user_role (app_id); + +-- ------------------ ALTER TABLE ADD CONSTRAINT FOREIGN KEY SECTION +-- +-- NAME: FK_FN_USER__REF_178_FN_APP; TYPE: FK CONSTRAINT +-- +alter table fn_user_role + add constraint fk_fn_user__ref_178_fn_app foreign key (app_id) references fn_app(app_id); +-- +-- NAME: FK_CR_REPOR_REF_14707_CR_REPOR; TYPE: FK CONSTRAINT +-- +alter table cr_report_schedule + add constraint fk_cr_repor_ref_14707_cr_repor foreign key (rep_id) references cr_report(rep_id); +-- +-- NAME: FK_CR_REPOR_REF_14716_CR_REPOR; TYPE: FK CONSTRAINT +-- +alter table cr_report_schedule_users + add constraint fk_cr_repor_ref_14716_cr_repor foreign key (schedule_id) references cr_report_schedule(schedule_id); +-- +-- NAME: FK_CR_REPOR_REF_17645_CR_REPOR; TYPE: FK CONSTRAINT +-- +alter table cr_report_log + add constraint fk_cr_repor_ref_17645_cr_repor foreign key (rep_id) references cr_report(rep_id); +-- +-- NAME: FK_CR_REPOR_REF_8550_CR_REPOR; TYPE: FK CONSTRAINT +-- +alter table cr_report_access + add constraint fk_cr_repor_ref_8550_cr_repor foreign key (rep_id) references cr_report(rep_id); +-- +-- NAME: FK_CR_REPORT_REP_ID; TYPE: FK CONSTRAINT +-- +alter table cr_report_email_sent_log + add constraint fk_cr_report_rep_id foreign key (rep_id) references cr_report(rep_id); +-- +-- NAME: FK_CR_TABLE_REF_311_CR_TAB; TYPE: FK CONSTRAINT +-- +alter table cr_table_join + add constraint fk_cr_table_ref_311_cr_tab foreign key (src_table_name) references cr_table_source(table_name); +-- +-- NAME: FK_CR_TABLE_REF_315_CR_TAB; TYPE: FK CONSTRAINT +-- +alter table cr_table_join + add constraint fk_cr_table_ref_315_cr_tab foreign key (dest_table_name) references cr_table_source(table_name); +-- +-- NAME: FK_CR_TABLE_REF_32384_CR_TABLE; TYPE: FK CONSTRAINT +-- +alter table cr_table_role + add constraint fk_cr_table_ref_32384_cr_table foreign key (table_name) references cr_table_source(table_name); +-- +-- NAME: FK_FN_TAB_FUNCTION_CD; TYPE: FK CONSTRAINT +-- +alter table fn_tab + add constraint fk_fn_tab_function_cd foreign key (function_cd) references fn_function(function_cd); +-- +-- NAME: FK_FN_TAB_SELECTED_TAB_CD; TYPE: FK CONSTRAINT +-- +alter table fn_tab_selected + add constraint fk_fn_tab_selected_tab_cd foreign key (selected_tab_cd) references fn_tab(tab_cd); +-- +-- NAME: FK_FN_TAB_SET_CD; TYPE: FK CONSTRAINT +-- +alter table fn_tab + add constraint fk_fn_tab_set_cd foreign key (tab_set_cd) references fn_lu_tab_set(tab_set_cd); +-- +-- NAME: FK_FN_USER_REF_110_FN_ORG; TYPE: FK CONSTRAINT +-- +alter table fn_user + add constraint fk_fn_user_ref_110_fn_org foreign key (org_id) references fn_org(org_id); +-- +-- NAME: FK_FN_USER_REF_123_FN_LU_AL; TYPE: FK CONSTRAINT +-- +alter table fn_user + add constraint fk_fn_user_ref_123_fn_lu_al foreign key (alert_method_cd) references fn_lu_alert_method(alert_method_cd); +-- +-- NAME: FK_FN_USER_REF_197_FN_USER; TYPE: FK CONSTRAINT +-- +alter table fn_user + add constraint fk_fn_user_ref_197_fn_user foreign key (manager_id) references fn_user(user_id); +-- +-- NAME: FK_FN_USER_REF_198_FN_USER; TYPE: FK CONSTRAINT +-- +alter table fn_user + add constraint fk_fn_user_ref_198_fn_user foreign key (created_id) references fn_user(user_id); +-- +-- NAME: FK_FN_USER_REF_199_FN_USER; TYPE: FK CONSTRAINT +-- +alter table fn_user + add constraint fk_fn_user_ref_199_fn_user foreign key (modified_id) references fn_user(user_id); +-- +-- NAME: FK_PARENT_KEY_CR_FOLDER; TYPE: FK CONSTRAINT +-- +alter table cr_folder + add constraint fk_parent_key_cr_folder foreign key (parent_folder_id) references cr_folder(folder_id); +-- +-- NAME: FK_PSEUDO_ROLE_PSEUDO_ROLE_ID; TYPE: FK CONSTRAINT +-- +alter table fn_user_pseudo_role + add constraint fk_pseudo_role_pseudo_role_id foreign key (pseudo_role_id) references fn_role(role_id); +-- +-- NAME: FK_PSEUDO_ROLE_USER_ID; TYPE: FK CONSTRAINT +-- +alter table fn_user_pseudo_role + add constraint fk_pseudo_role_user_id foreign key (user_id) references fn_user(user_id); +-- +-- NAME: FK_RESTRICTED_URL_FUNCTION_CD; TYPE: FK CONSTRAINT +-- +alter table fn_restricted_url + add constraint fk_restricted_url_function_cd foreign key (function_cd) references fn_function(function_cd); +-- +-- NAME: FK_TIMEZONE; TYPE: FK CONSTRAINT +-- +alter table fn_user + add constraint fk_timezone foreign key (timezone) references fn_lu_timezone(timezone_id); +-- +-- NAME: SYS_C0014614; TYPE: FK CONSTRAINT +-- +alter table cr_report_file_history + add constraint sys_c0014614 foreign key (file_type_id) references cr_lu_file_type(lookup_id); +-- +-- NAME: SYS_C0014615; TYPE: FK CONSTRAINT +-- +alter table cr_report_file_history + add constraint sys_c0014615 foreign key (rep_id) references cr_report(rep_id); +-- +-- NAME: SYS_C0014616; TYPE: FK CONSTRAINT +-- +alter table cr_hist_user_map + add constraint sys_c0014616 foreign key (hist_id) references cr_report_file_history(hist_id); +-- +-- NAME: SYS_C0014617; TYPE: FK CONSTRAINT +-- +alter table cr_hist_user_map + add constraint sys_c0014617 foreign key (user_id) references fn_user(user_id); + +commit; + +-- Table structure for table `dbca_dmaap_access` + +DROP TABLE IF EXISTS `dbca_dmaap_access`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `dbca_dmaap_access` ( + `DMAAP_ID` int(11) NOT NULL AUTO_INCREMENT, + `USER_ID` varchar(16) NOT NULL, + `NAME` varchar(100) NOT NULL, + `DMAAP_URL` varchar(256) NOT NULL, + `MECH_ID` varchar(96) DEFAULT NULL, + `PASSWORD` varchar(96) DEFAULT NULL, + `CREATED_ID` int(11) DEFAULT NULL, + `CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `MODIFIED_ID` int(11) DEFAULT NULL, + `MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `SELECT_YN` char(1) DEFAULT 'N', + PRIMARY KEY (`DMAAP_ID`) +) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; diff --git a/dcae_dmaapbc_webapp/db-scripts/EcompSdkDMLMySql_1610_Complete_OS.sql b/dcae_dmaapbc_webapp/db-scripts/EcompSdkDMLMySql_1610_Complete_OS.sql new file mode 100644 index 0000000..240d699 --- /dev/null +++ b/dcae_dmaapbc_webapp/db-scripts/EcompSdkDMLMySql_1610_Complete_OS.sql @@ -0,0 +1,3826 @@ +-- --------------------------------------------------------------------------------------------------------------- +-- This script loads data for the DMaaP Bus Controller Application, +-- open source version. +-- Includes sample data for the 1610, open-source version of SDK database, +-- plus additional entries for the DBC application. +-- --------------------------------------------------------------------------------------------------------------- + +USE dbca_os; + +set foreign_key_checks=1; + +-- fn_function +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('quantum_bd','Big Data Function'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_process','Process List'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('1','test role function'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_job','Job Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_job_create','Job Create'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_job_designer','Process in Designer view'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_task','Task Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_task_search','Task Search'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_hiveconfig','Hive Configuration'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_mapreduce_create','Map Reduce Configuration Create'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_mapreduce_search','Map Reduce Configuration Search'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_hiveconfig_search','Hive Configuration Search'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_hiveconfig_create','Hive Configuration Create'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_map','Map Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_sample','Sample Pages Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_test','Test Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('login','Login'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_home','Home Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_customer','Customer Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_reports','Reports Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_profile','Profile Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_admin','Admin Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_feedback','Feedback Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_help','Help Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_logout','Logout Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_doclib','Document Library Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('doclib','Document Library'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('doclib_admin','Document Library Admin'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_notes','Notes Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_ajax','Ajax Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_customer_create','Customer Create'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_profile_create','Profile Create'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_profile_import','Profile Import'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_tab','Sample Tab Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_concept','CoNCEPT'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_itracker','iTracker Menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('view_reports','View Raptor reports'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_itracker_admin','Itracker Admin/Support menu'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_mapreduce','Map Reduce Configuration'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_data_router','Data Router'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_dbc','Data Bus Controller'); +Insert into fn_function (FUNCTION_CD,FUNCTION_NAME) values ('menu_message_router','Message Router'); + +-- fn_lu_activity +Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('add_role','add_role'); +Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('remove_role','remove_role'); +Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('add_user_role','add_user_role'); +Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('remove_user_role','remove_user_role'); +Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('add_role_function','add_role_function'); +Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('remove_role_function','remove_role_function'); +Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('add_child_role','add_child_role'); +Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('remove_child_role','remove_child_role'); +Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('mobile_login','Mobile Login'); +Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('mobile_logout','Mobile Logout'); +Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('login','Login'); +Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('logout','Logout'); + +-- fn_lu_alert_method +Insert into fn_lu_alert_method (ALERT_METHOD_CD,ALERT_METHOD) values ('PHONE','Phone'); +Insert into fn_lu_alert_method (ALERT_METHOD_CD,ALERT_METHOD) values ('FAX','Fax'); +Insert into fn_lu_alert_method (ALERT_METHOD_CD,ALERT_METHOD) values ('PAGER','Pager'); +Insert into fn_lu_alert_method (ALERT_METHOD_CD,ALERT_METHOD) values ('EMAIL','Email'); +Insert into fn_lu_alert_method (ALERT_METHOD_CD,ALERT_METHOD) values ('SMS','SMS'); + +-- fn_lu_call_times +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (1,20,'20 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (2,40,'40 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (3,60,'1 hr'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (4,80,'1 hr 20 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (5,100,'1 hr 40 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (6,120,'2 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (7,140,'2 hr 20 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (8,160,'2 hr 40 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (9,180,'3 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (10,200,'3 hr 20 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (11,220,'3 hr 40 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (12,240,'4 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (13,260,'4 hr 20 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (14,280,'4 hr 40 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (15,300,'5 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (16,320,'5 hr 20 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (17,340,'5 hr 40 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (18,360,'6 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (19,380,'6 hr 20 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (20,400,'6 hr 40 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (21,420,'7 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (22,440,'7 hr 20 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (23,460,'7 hr 40 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (24,480,'8 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (25,500,'8 hr 20 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (26,520,'8 hr 40 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (27,540,'9 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (28,560,'9 hr 20 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (29,580,'9 hr 40 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (30,600,'10 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (31,10,'10 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (32,5,'5 min'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (33,1200,'20 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (34,1800,'30 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (35,2400,'40 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (36,3000,'50 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (37,4200,'70 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (38,4800,'80 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (39,5400,'90 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (40,6000,'100 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (41,7200,'120 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (42,9600,'160 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (43,10800,'180 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (44,12000,'200 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (45,18000,'300 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (46,24000,'400 hrs'); +Insert into fn_lu_call_times (CALL_TIME_ID,CALL_TIME_AMOUNT,CALL_TIME_DISPLAY) values (47,30000,'500 hrs'); + +-- fn_lu_country +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('YU','Yugoslavia','Yugoslavia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('ZA','South Africa','South Africa',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('ZM','Zambia','Zambia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('ZR','Zaire','Zaire',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('ZW','Zimbabwe','Zimbabwe',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AD','Andorra','Andorra',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AE','United Arab Emirates','United Arab Emirates',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AF','Afghanistan','Afghanistan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AG','Antigua and Barbuda','Antigua and Barbuda',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AI','Anguilla','Anguilla',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AL','Albania','Albania',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AM','Armenia','Armenia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AN','Netherlands Antilles','Netherlands Antilles',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AO','Angola','Angola',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AQ','Antarctica','Antarctica',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AR','Argentina','Argentina',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AS','American Samoa','American Samoa',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AT','Austria','Austria',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AU','Australia','Australia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AW','Aruba','Aruba',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('AZ','Azerbaidjan','Azerbaidjan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BA','Bosnia-Herzegovina','Bosnia-Herzegovina',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BB','Barbados','Barbados',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BD','Bangladesh','Bangladesh',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BE','Belgium','Belgium',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BF','Burkina Faso','Burkina Faso',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BG','Bulgaria','Bulgaria',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BH','Bahrain','Bahrain',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BI','Burundi','Burundi',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BJ','Benin','Benin',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BM','Bermuda','Bermuda',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BN','Brunei Darussalam','Brunei Darussalam',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BO','Bolivia','Bolivia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BR','Brazil','Brazil',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BS','Bahamas','Bahamas',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BT','Bhutan','Bhutan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BV','Bouvet Island','Bouvet Island',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BW','Botswana','Botswana',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BY','Belarus','Belarus',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('BZ','Belize','Belize',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CA','Canada','Canada',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CC','Cocos (Keeling) Islands','Cocos (Keeling) Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CF','Central African Republic','Central African Republic',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CG','Congo','Congo',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CH','Switzerland','Switzerland',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CI','Ivory Coast (Cote D''Ivoire)','Ivory Coast (Cote D''Ivoire)',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CK','Cook Islands','Cook Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CL','Chile','Chile',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CM','Cameroon','Cameroon',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CN','China','China','China'); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CO','Colombia','Colombia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CR','Costa Rica','Costa Rica',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CS','Former Czechoslovakia','Former Czechoslovakia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CU','Cuba','Cuba',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CV','Cape Verde','Cape Verde',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CX','Christmas Island','Christmas Island',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CY','Cyprus','Cyprus',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('CZ','Czech Republic','Czech Republic',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('DE','Germany','Germany',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('DJ','Djibouti','Djibouti',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('DK','Denmark','Denmark',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('DM','Dominica','Dominica',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('DO','Dominican Republic','Dominican Republic',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('DZ','Algeria','Algeria',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('EC','Ecuador','Ecuador',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('EE','Estonia','Estonia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('EG','Egypt','Egypt',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('EH','Western Sahara','Western Sahara',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('ER','Eritrea','Eritrea',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('ES','Spain','Spain',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('ET','Ethiopia','Ethiopia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('FI','Finland','Finland',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('FJ','Fiji','Fiji',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('FK','Falkland Islands','Falkland Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('FM','Micronesia','Micronesia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('FO','Faroe Islands','Faroe Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('FR','France','France',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('FX','France (European Territory)','France (European Territory)',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GA','Gabon','Gabon',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GB','Great Britain','Great Britain',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GD','Grenada','Grenada',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GE','Georgia','Georgia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GF','French Guyana','French Guyana',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GH','Ghana','Ghana',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GI','Gibraltar','Gibraltar',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GL','Greenland','Greenland',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GM','Gambia','Gambia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GN','Guinea','Guinea',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GP','Guadeloupe (French)','Guadeloupe (French)',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GQ','Equatorial Guinea','Equatorial Guinea',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GR','Greece','Greece',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GS','S. Georgia and S. Sandwich Isls.','S. Georgia and S. Sandwich Isls.',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GT','Guatemala','Guatemala',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GU','Guam (USA)','Guam (USA)',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GW','Guinea Bissau','Guinea Bissau',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('GY','Guyana','Guyana',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('HK','Hong Kong','Hong Kong',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('HM','Heard and McDonald Islands','Heard and McDonald Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('HN','Honduras','Honduras',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('HR','Croatia','Croatia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('HT','Haiti','Haiti',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('HU','Hungary','Hungary',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('ID','Indonesia','Indonesia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('IE','Ireland','Ireland',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('IL','Israel','Israel',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('IN','India','India',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('IO','British Indian Ocean Territory','British Indian Ocean Territory',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('IQ','Iraq','Iraq',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('IR','Iran','Iran',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('IS','Iceland','Iceland',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('IT','Italy','Italy',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('JM','Jamaica','Jamaica',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('JO','Jordan','Jordan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('JP','Japan','Japan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('KE','Kenya','Kenya',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('KG','Kyrgyzstan','Kyrgyzstan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('KH','Cambodia','Cambodia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('KI','Kiribati','Kiribati',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('KM','Comoros','Comoros',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('KN','Saint Kitts and Nevis Anguilla','Saint Kitts and Nevis Anguilla',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('KP','North Korea','North Korea',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('KR','South Korea','South Korea',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('KW','Kuwait','Kuwait',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('KY','Cayman Islands','Cayman Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('KZ','Kazakhstan','Kazakhstan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('LA','Laos','Laos',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('LB','Lebanon','Lebanon',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('LC','Saint Lucia','Saint Lucia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('LI','Liechtenstein','Liechtenstein',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('LK','Sri Lanka','Sri Lanka',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('LR','Liberia','Liberia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('LS','Lesotho','Lesotho',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('LT','Lithuania','Lithuania',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('LU','Luxembourg','Luxembourg',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('LV','Latvia','Latvia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('LY','Libya','Libya',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MA','Morocco','Morocco',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MC','Monaco','Monaco',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MD','Moldavia','Moldavia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MG','Madagascar','Madagascar',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MH','Marshall Islands','Marshall Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MK','Macedonia','Macedonia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('ML','Mali','Mali',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MM','Myanmar','Myanmar',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MN','Mongolia','Mongolia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MO','Macau','Macau',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MP','Northern Mariana Islands','Northern Mariana Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MQ','Martinique (French)','Martinique (French)',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MR','Mauritania','Mauritania',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MS','Montserrat','Montserrat',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MT','Malta','Malta',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MU','Mauritius','Mauritius',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MV','Maldives','Maldives',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MW','Malawi','Malawi',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MX','Mexico','Mexico','Mexico'); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MY','Malaysia','Malaysia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('MZ','Mozambique','Mozambique',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('NA','Namibia','Namibia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('NC','New Caledonia (French)','New Caledonia (French)',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('NE','Niger','Niger',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('NF','Norfolk Island','Norfolk Island',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('NG','Nigeria','Nigeria',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('NI','Nicaragua','Nicaragua',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('NL','Netherlands','Netherlands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('NO','Norway','Norway',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('NP','Nepal','Nepal',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('NR','Nauru','Nauru',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('NU','Niue','Niue',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('NZ','New Zealand','New Zealand',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('OM','Oman','Oman',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PA','Panama','Panama',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PE','Peru','Peru',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PF','Polynesia (French)','Polynesia (French)',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PG','Papua New Guinea','Papua New Guinea',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PH','Philippines','Philippines',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PK','Pakistan','Pakistan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PL','Poland','Poland',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PM','Saint Pierre and Miquelon','Saint Pierre and Miquelon',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PN','Pitcairn Island','Pitcairn Island',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PR','Puerto Rico','Puerto Rico',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PT','Portugal','Portugal',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PW','Palau','Palau',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('PY','Paraguay','Paraguay',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('QA','Qatar','Qatar',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('RE','Reunion (French)','Reunion (French)',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('RO','Romania','Romania',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('RU','Russian Federation','Russian Federation',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('RW','Rwanda','Rwanda',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SA','Saudi Arabia','Saudi Arabia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SB','Solomon Islands','Solomon Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SC','Seychelles','Seychelles',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SD','Sudan','Sudan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SE','Sweden','Sweden',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SG','Singapore','Singapore',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SH','Saint Helena','Saint Helena',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SI','Slovenia','Slovenia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SJ','Svalbard and Jan Mayen Islands','Svalbard and Jan Mayen Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SK','Slovak Republic','Slovak Republic',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SL','Sierra Leone','Sierra Leone',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SM','San Marino','San Marino',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SN','Senegal','Senegal',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SO','Somalia','Somalia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SR','Suriname','Suriname',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('ST','Saint Tome (Sao Tome) and Principe','Saint Tome (Sao Tome) and Principe',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SU','Former USSR','Former USSR',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SV','El Salvador','El Salvador',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SY','Syria','Syria',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('SZ','Swaziland','Swaziland',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TC','Turks and Caicos Islands','Turks and Caicos Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TD','Chad','Chad',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TF','French Southern Territories','French Southern Territories',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TG','Togo','Togo',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TH','Thailand','Thailand',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TJ','Tadjikistan','Tadjikistan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TK','Tokelau','Tokelau',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TM','Turkmenistan','Turkmenistan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TN','Tunisia','Tunisia',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TO','Tonga','Tonga',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TP','East Timor','East Timor',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TR','Turkey','Turkey',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TT','Trinidad and Tobago','Trinidad and Tobago',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TV','Tuvalu','Tuvalu',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TW','Taiwan','Taiwan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('TZ','Tanzania','Tanzania',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('UA','Ukraine','Ukraine',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('UG','Uganda','Uganda',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('UK','United Kingdom','United Kingdom',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('UM','USA Minor Outlying Islands','USA Minor Outlying Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('US','United States','United States','USA'); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('UY','Uruguay','Uruguay',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('UZ','Uzbekistan','Uzbekistan',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('VA','Vatican City State','Vatican City State',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('VC','Saint Vincent and Grenadines','Saint Vincent and Grenadines',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('VE','Venezuela','Venezuela',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('VG','Virgin Islands (British)','Virgin Islands (British)',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('VI','Virgin Islands (USA)','Virgin Islands (USA)',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('VN','Vietnam','Vietnam',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('VU','Vanuatu','Vanuatu',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('WF','Wallis and Futuna Islands','Wallis and Futuna Islands',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('WS','Samoa','Samoa',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('YE','Yemen','Yemen',null); +Insert into fn_lu_country (COUNTRY_CD,COUNTRY,FULL_NAME,WEBPHONE_COUNTRY_LABEL) values ('YT','Mayotte','Mayotte',null); + +-- fn_lu_menu_set +Insert into fn_lu_menu_set (MENU_SET_CD,MENU_SET_NAME) values ('APP','Application Menu'); + +-- fn_lu_priority +Insert into fn_lu_priority (PRIORITY_ID,PRIORITY,ACTIVE_YN,SORT_ORDER) values (10,'Low','Y',10); +Insert into fn_lu_priority (PRIORITY_ID,PRIORITY,ACTIVE_YN,SORT_ORDER) values (20,'Normal','Y',20); +Insert into fn_lu_priority (PRIORITY_ID,PRIORITY,ACTIVE_YN,SORT_ORDER) values (30,'High','Y',30); +Insert into fn_lu_priority (PRIORITY_ID,PRIORITY,ACTIVE_YN,SORT_ORDER) values (40,'Urgent','Y',40); +Insert into fn_lu_priority (PRIORITY_ID,PRIORITY,ACTIVE_YN,SORT_ORDER) values (50,'Fatal','Y',50); + +-- fn_lu_state +Insert into fn_lu_state (STATE_CD,STATE) values ('NJ','NJ - New Jersey'); +Insert into fn_lu_state (STATE_CD,STATE) values ('NY','NY - New York'); +Insert into fn_lu_state (STATE_CD,STATE) values ('CA','CA - California'); +Insert into fn_lu_state (STATE_CD,STATE) values ('CO','CO - Colorado'); +Insert into fn_lu_state (STATE_CD,STATE) values ('FL','FL - Florida'); +Insert into fn_lu_state (STATE_CD,STATE) values ('GA','GA - Georgia'); +Insert into fn_lu_state (STATE_CD,STATE) values ('VA','VA - Virginia'); +Insert into fn_lu_state (STATE_CD,STATE) values ('KY','KY - Kentucky'); +Insert into fn_lu_state (STATE_CD,STATE) values ('TX','TX - Texas'); +Insert into fn_lu_state (STATE_CD,STATE) values ('AK','AK - Alaska'); +Insert into fn_lu_state (STATE_CD,STATE) values ('AL','AL - Alabama'); +Insert into fn_lu_state (STATE_CD,STATE) values ('AR','AR - Arkansas'); +Insert into fn_lu_state (STATE_CD,STATE) values ('AZ','AZ - Arizona'); +Insert into fn_lu_state (STATE_CD,STATE) values ('CT','CT - Connecticut'); +Insert into fn_lu_state (STATE_CD,STATE) values ('DC','DC - District Of Columbia'); +Insert into fn_lu_state (STATE_CD,STATE) values ('DE','DE - Delaware'); +Insert into fn_lu_state (STATE_CD,STATE) values ('HI','HI - Hawaii'); +Insert into fn_lu_state (STATE_CD,STATE) values ('ID','ID - Idaho'); +Insert into fn_lu_state (STATE_CD,STATE) values ('IL','IL - Illinois'); +Insert into fn_lu_state (STATE_CD,STATE) values ('IN','IN - Indiana'); +Insert into fn_lu_state (STATE_CD,STATE) values ('IA','IA - Iowa'); +Insert into fn_lu_state (STATE_CD,STATE) values ('KS','KS - Kansas'); +Insert into fn_lu_state (STATE_CD,STATE) values ('LA','LA - Louisiana'); +Insert into fn_lu_state (STATE_CD,STATE) values ('MA','MA - Massachusetts'); +Insert into fn_lu_state (STATE_CD,STATE) values ('MD','MD - Maryland'); +Insert into fn_lu_state (STATE_CD,STATE) values ('ME','ME - Maine'); +Insert into fn_lu_state (STATE_CD,STATE) values ('MI','MI - Michigan'); +Insert into fn_lu_state (STATE_CD,STATE) values ('MN','MN - Minnesota'); +Insert into fn_lu_state (STATE_CD,STATE) values ('MO','MO - Missouri'); +Insert into fn_lu_state (STATE_CD,STATE) values ('MS','MS - Mississippi'); +Insert into fn_lu_state (STATE_CD,STATE) values ('MT','MT - Montana'); +Insert into fn_lu_state (STATE_CD,STATE) values ('NC','NC - North Carolina'); +Insert into fn_lu_state (STATE_CD,STATE) values ('ND','ND - North Dakota'); +Insert into fn_lu_state (STATE_CD,STATE) values ('NE','NE - Nebraska'); +Insert into fn_lu_state (STATE_CD,STATE) values ('NH','NH - New Hampshire'); +Insert into fn_lu_state (STATE_CD,STATE) values ('NM','NM - New Mexico'); +Insert into fn_lu_state (STATE_CD,STATE) values ('NV','NV - Nevada'); +Insert into fn_lu_state (STATE_CD,STATE) values ('OH','OH - Ohio'); +Insert into fn_lu_state (STATE_CD,STATE) values ('OK','OK - Oklahoma'); +Insert into fn_lu_state (STATE_CD,STATE) values ('OR','OR - Oregon'); +Insert into fn_lu_state (STATE_CD,STATE) values ('PA','PA - Pennsylvania'); +Insert into fn_lu_state (STATE_CD,STATE) values ('PR','PR - Puerto Rico'); +Insert into fn_lu_state (STATE_CD,STATE) values ('RI','RI - Rhode Island'); +Insert into fn_lu_state (STATE_CD,STATE) values ('SC','SC - South Carolina'); +Insert into fn_lu_state (STATE_CD,STATE) values ('SD','SD - South Dakota'); +Insert into fn_lu_state (STATE_CD,STATE) values ('TN','TN - Tennessee'); +Insert into fn_lu_state (STATE_CD,STATE) values ('UT','UT - Utah'); +Insert into fn_lu_state (STATE_CD,STATE) values ('VT','VT - Vermont'); +Insert into fn_lu_state (STATE_CD,STATE) values ('WA','WA - Washington'); +Insert into fn_lu_state (STATE_CD,STATE) values ('WV','WV - West Virginia'); +Insert into fn_lu_state (STATE_CD,STATE) values ('WI','WI - Wisconsin'); +Insert into fn_lu_state (STATE_CD,STATE) values ('WY','WY - Wyoming'); +Insert into fn_lu_state (STATE_CD,STATE) values ('VI','VI-Virgin Island'); + +-- fn_lu_tab_set +Insert into fn_lu_tab_set (TAB_SET_CD,TAB_SET_NAME) values ('APP','Application Tabs'); + +-- fn_lu_timezone +Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (10,'US/Eastern','US/Eastern'); +Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (20,'US/Central','US/Central'); +Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (30,'US/Mountain','US/Mountain'); +Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (40,'US/Arizona','America/Phoenix'); +Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (50,'US/Pacific','US/Pacific'); +Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (60,'US/Alaska','US/Alaska'); +Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (70,'US/Hawaii','US/Hawaii'); + +-- fn_menu +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (1, 'Root', NULL, 10, NULL, 'menu_home', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150000, 'iTracker', 1, 120, NULL, 'menu_itracker', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5000, 'Sample Pages', 1, 30, 'sample.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'icon-local-search'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (3, 'Customer', 5000, 30, NULL, 'menu_customer', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/customers.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5095, 'Network Diagram', 5000, 50, 'net_map.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5086, 'Call Flow', 5000, 105, 'callflow.htm', 'menu_sample', 'Y', NULL, NULL,NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5096, 'ASE Tool', 5000, 125, 'userProfile#/ase', 'menu_sample', 'Y', NULL, NULL,NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (2, 'Home', 1, 10, 'welcome.htm', 'menu_home', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'icon-location-pin'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (8, 'Reports', 1, 40, 'report.htm', 'menu_reports', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'icon-data'); +-- The Users (previously called Profile) category is disabled in this checked-in version, ACTIVE_YN = N, +-- because EP recommends against displaying that menu in IST, ETE and PROD. +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (9, 'Users', 1, 90, 'userProfile', 'menu_profile', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', 'ion-person'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10, 'Admin', 1, 110, 'role_list.htm', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'ion-gear-a'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (13, 'Application Logout', 1, 130, 'app_logout.htm', 'menu_logout', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'icon-sign-out'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (16, 'Library', 1, 60, 'doclib.htm', 'menu_doclib', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (30, 'Create', 3, 10, 'customer.htm', 'menu_customer_create', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/customers-add.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (32, 'Search', 3, 30, 'customer_search.htm', 'menu_customer', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/customers-search.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (84, 'All Reports', 8, 50, 'report', 'menu_reports', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/reports.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (85, 'Favorite Reports', 8, 35, 'raptor.htm', 'menu_reports', 'N', NULL, 'action=report.search.favorite', NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (86, 'Customize Favorite Reports', 8, 100, 'report_list.htm', 'menu_reports', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) values (87, 'Create Reports', 8, 120, 'report_wizard.htm?r_action=report.create', 'menu_reports', 'Y', NULL, 'r_action=report.create', NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) values (88, 'Sample Dashboard', 8, 130, 'report_sample', 'menu_reports', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (92, 'Import from WEBPHONE', 9, 30, 'userProfile#/post_search', 'menu_profile_import', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/webphone.ico'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (94, 'Self', 9, 40, 'userProfile#/self_profile', 'menu_profile', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/profile.png'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (101, 'Roles', 10, 20, 'admin', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/users.png'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (102, 'Role Functions', 10, 30, 'admin#/role_function_list', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (103, 'Broadcast Messages', 10, 50, 'admin#/broadcast_list', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/bubble.png'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (105, 'Cache Admin', 10, 40, 'admin#/jcs_admin', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/cache.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (106, 'Lock/Unlock Application', 10, 60, 'application_lockout.htm', 'menu_admin', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/decrypted.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (107, 'Admin', 150000, 70, 'issues_view.htm?issueView=AllIssues', 'menu_itracker_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (108, 'Usage', 10, 80, 'admin#/usage_list', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/users.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (109, 'Open Requests', 107, 20, 'itracker_search.htm', 'menu_itracker_admin', 'Y', NULL, 'view=open', NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (110, 'Closed Requests', 107, 30, 'itracker_search.htm', 'menu_itracker_admin', 'Y', NULL, 'view=closed', NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (113, 'Requests By Assignee', 107, 40, 'itracker_byassignee.htm', 'menu_itracker_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (115, NULL, 10, 35, NULL, 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'Y', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (116, NULL, 10, 45, NULL, 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'Y', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (117, NULL, 10, 55, NULL, 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'Y', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (120, NULL, 10, 90, NULL, 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'Y', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (121, 'Collaboration', 5000, 100, 'collaborate_list.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/bubble.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (170, 'Ajax Examples', 5000, 60, 'ajax_test.htm', 'menu_ajax', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (930, 'Search', 9, 15, 'userProfile', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/search_profile.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (15, 'Attachments', 5000, 35, 'attachment_list.htm', 'menu_admin', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/file_save-all.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5010, 'Services', 5000, 102, NULL, 'menu_sample', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/images/vsp_network_small.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5011, 'My Services', 5010, 10, 'my_services.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5012, 'Add Services', 5010, 10, 'add_services.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5040, 'Sample Nested Menu', 5000, 20, NULL, 'menu_sample', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5045, NULL, 5000, 25, NULL, 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'Y', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5050, 'Grid Implementations', 5000, 70, NULL, 'menu_sample', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/table.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5055, 'Sample Tab Layouts', 5000, 75, 'tab1.htm', 'menu_sample', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/tab.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5060, 'Sample File Generation', 5000, 80, 'file_generate.htm', 'menu_sample', 'N', NULL, 'task=showPage', NULL, NULL, 'APP', 'N', '/static/fusion/images/file_import.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5070, 'Sample Async Invocation', 5000, 90, 'async_test.htm', 'menu_sample', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5080, 'Geo Map', 5000, 100, 'leafletMap.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/map.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5081, 'Map-Grid Link', 5080, 10, 'grid_heatmap.htm', 'menu_sample', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5082, 'LTE Heat Map', 5080, 20, 'sample_heat_map.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5083, 'LTE Animated Map', 5080, 30, 'sample_animated_map.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5084, 'Sample Tutorial Map', 5080, 40, 'sample_map.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5085, 'Data Traffic Map', 5080, 11, 'traffic_map.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5090, NULL, 5000, 55, NULL, 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'Y', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5091, NULL, 5000, 65, NULL, 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'Y', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5092, NULL, 5000, 75, NULL, 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'Y', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5094, NULL, 5000, 95, NULL, 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'Y', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5104, NULL, 5000, 105, NULL, 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'Y', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (6000, 'Nested Menu Item #1', 5040, 10, NULL, 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (6010, 'Nested Menu Item #2', 5040, 20, NULL, 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (6100, 'Another Nested Menu', 6000, 10, NULL, 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (6200, 'Another Nested Child Menu A', 6100, 10, NULL, 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (6210, 'Another Nested Child Menu B', 6100, 10, NULL, 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (7010, 'Customer List', 5050, 10, 'customer_list.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (7020, 'Contact List', 5050, 20, 'app_contact_list.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (7030, 'Alternate Contact List', 5050, 30, 'alt_contact_list.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (7040, 'Customer Update', 5050, 15, 'customer_update.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10000, 'Big Data Integration', 1, 50, NULL, 'quantum_bd', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (23, 'Job/Process Management', 10000, 110, 'process.htm', 'menu_process', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10100, 'Sector BH Analysis', 10000, 5, 'bd_optima.htm', 'quantum_bd', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10500, 'Adworks', 10000, 30, NULL, 'quantum_bd', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10200, 'Adworks Impression Data - Scheduled', 10500, 8, 'raptor.htm?action=raptor&refresh_params=Y&r_action=report.run.container&refresh=Y&c_master=23&display_content=N', 'quantum_bd', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10210, 'Adworks Impression Data - Live', 10500, 5, 'raptor.htm?action=raptor&refresh_params=Y&r_action=report.run.container&refresh=Y&c_master=22&display_content=N', 'quantum_bd', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10520, 'Frequency by Program', 10500, 50, 'raptor.htm?action=raptor&refresh_params=Y&r_action=report.run.container&refresh=Y&c_master=41&display_content=N', 'quantum_bd', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10540, 'Reach by VHO', 10500, 10, 'raptor.htm?action=raptor&refresh_params=Y&r_action=report.run.container&refresh=Y&c_master=42&display_content=N', 'quantum_bd', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10560, 'Frequency by VHO', 10500, 40, 'raptor.htm?action=raptor&refresh_params=Y&r_action=report.run.container&refresh=Y&c_master=43&display_content=N', 'quantum_bd', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10580, 'Reach by Seconds Watched', 10500, 30, 'raptor.htm?action=raptor&refresh_params=Y&r_action=report.run.container&refresh=Y&c_master=44&display_content=N', 'quantum_bd', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10590, 'Reach by Channel', 10500, 20, 'raptor.htm?action=raptor&refresh_params=Y&r_action=report.run.container&refresh=Y&c_master=45&display_content=N', 'quantum_bd', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10800, 'ePTT Analysis', 10000, 6, 'bd_p2t.htm', 'quantum_bd', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (11000, 'Map Reduce Configuration', 10000, 120, NULL, 'menu_mapreduce', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (12000, 'Hive Configuration', 10000, 130, NULL, 'menu_hiveconfig', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (13000, 'Map Reduce Configuration Create', 11000, 120, 'mapreduce.htm', 'menu_mapreduce_create', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (14000, 'Map Reduce Configuration Search', 11000, 130, 'mapreduce_search.htm', 'menu_mapreduce_search', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (14500, 'Hive Configuration Create', 12000, 120, 'hiveconfig.htm', 'menu_hiveconfig_create', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (15000, 'Hive Configuration Search', 12000, 130, 'hive_search.htm', 'menu_hiveconfig_search', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150001, 'Create Request', 150000, 10, NULL, 'menu_itracker', 'Y', NULL, NULL, 'javascript:createITrackerRequest();', NULL, 'APP', 'N', '/static/fusion/images/note-add.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150002, 'View My Requests', 150000, 20, 'itracker_search.htm', 'menu_itracker', 'Y', NULL, 'view=myrequests', NULL, NULL, 'APP', 'N', '/static/fusion/images/notes.png'); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150003, 'Search Requests', 150000, 30, 'itracker_search.htm', 'menu_itracker', 'Y', NULL, 'view=all', NULL, NULL, 'APP', 'N', '/static/fusion/images/note-search.png'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150022, 'Menus', 10, 60, 'admin#/admin_menu_edit', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150024, 'Camunda Cockpit', 10, 70, 'admin#/admin_closed_loop', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150026, 'Workflows', 10, 71, 'workflows#/all', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'Y', NULL); +-- INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150028, 'Drools', 5000, 110, 'drools.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); +-- Additions for DBCA +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150030,'DMaaP Access Profiles',1, 15,'dbc#/dmaap', 'menu_dbc', 'Y','N/A','N/A','N/A','N/A','APP','Y','ion-ios-paper'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150031,'Data Router', 1, 20,'dbc', 'menu_data_router', 'Y','N/A','N/A','N/A','N/A','APP','Y','ion-upload'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150032,'Feeds', 150031, 10,'dbc#/dr_feed', 'menu_data_router', 'Y','N/A','N/A','N/A','N/A','APP','N','N/A'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150033,'Publishers', 150031, 25,'dbc#/dr_pub', 'menu_data_router', 'Y','N/A','N/A','N/A','N/A','APP','N','N/A'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150034,'Subscribers', 150031, 50,'dbc#/dr_sub', 'menu_data_router', 'Y','N/A','N/A','N/A','N/A','APP','N','N/A'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150035,'Message Router', 1, 25,'#', 'menu_message_router','Y','N/A','N/A','N/A','N/A','APP','Y','ion-ios-email'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150036,'Topics', 150035, 10,'dbc#/mr_topic', 'menu_message_router','Y','N/A','N/A','N/A','N/A','APP','N','N/A'); +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150037,'Clients', 150035, 20,'dbc#/mr_client','menu_message_router','Y','N/A','N/A','N/A','N/A','APP','Y','N/A'); + +-- fn_restricted_url +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('attachment.htm','menu_admin'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('broadcast.htm','menu_admin'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('file_upload.htm','menu_admin'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('job.htm','menu_admin'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('role.htm','menu_admin'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('role_function.htm','menu_admin'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('test.htm','menu_admin'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('async_test.htm','menu_home'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('chatWindow.htm','menu_home'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('contact_list.htm','menu_home'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('customer_dynamic_list.htm','menu_home'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('event.htm','menu_home'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('event_list.htm','menu_home'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('mobile_welcome.htm','menu_home'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('sample_map.htm','menu_home'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('template.jsp','menu_home'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('zkau','menu_home'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('itracker_assign.htm','menu_itracker'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('itracker_byassignee.htm','menu_itracker'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('itracker_create.htm','menu_itracker'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('itracker_update.htm','menu_itracker'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('manage_license.htm','menu_itracker'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('support_ticket.htm','menu_itracker'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('jbpm_designer.htm','menu_job_create'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('jbpm_drools.htm','menu_job_create'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('process_job.htm','menu_job_create'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('novamap_controller.htm','menu_map'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('profile.htm','menu_profile_create'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor.htm','menu_reports'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor2.htm','menu_reports'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor_blob_extract.htm','menu_reports'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor_email_attachment.htm','menu_reports'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor_search.htm','menu_reports'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('report_list.htm','menu_reports'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('gauge.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('gmap_controller.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('gmap_frame.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('map.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('map_download.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('map_grid_search.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('sample_animated_map.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('sample_heat_map.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('sample_heat_map_no_header.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('sample_map_2.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('sample_map_3.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('tab2_sub1.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('tab2_sub2_link1.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('tab2_sub2_link2.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('tab2_sub3.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('tab3.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('tab4.htm','menu_tab'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('bd_optima.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('bd_optima_interactive.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('bd_p2t.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('grid_heatmap.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('hive.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('hiveconfig.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('hiveconfig_popup.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('hive_search.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('hive_search_popup.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('jbpmTestProcess.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('job_progress.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('mapreduce.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('mapreduce_search.htm','quantum_bd'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor.htm','view_reports'); +INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor_blob_extract.htm','view_reports'); + +-- fn_role +Insert into fn_role (ROLE_ID,ROLE_NAME,ACTIVE_YN,PRIORITY) values (16,'Standard User','Y',5); +Insert into fn_role (ROLE_ID,ROLE_NAME,ACTIVE_YN,PRIORITY) values (1,'System Administrator','Y',1); + +-- fn_role_composite +Insert into fn_role_composite (PARENT_ROLE_ID,CHILD_ROLE_ID) values (1,16); + +-- fn_role_function +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'doclib'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'doclib_admin'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'login'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_admin'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_ajax'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_customer'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_customer_create'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_feedback'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_help'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_hiveconfig'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_hiveconfig_create'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_hiveconfig_search'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_home'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_itracker'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_itracker_admin'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_job'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_job_create'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_logout'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_mapreduce'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_mapreduce_create'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_mapreduce_search'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_notes'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_process'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_profile'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_profile_create'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_profile_import'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_reports'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_sample'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_tab'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_test'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'quantum_bd'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'login'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_ajax'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_customer'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_customer_create'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_home'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_itracker'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_logout'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_map'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_profile'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_reports'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_tab'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'quantum_bd'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_dbc'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_data_router'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_message_router'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_dbc'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_data_router'); +Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_message_router'); + +-- fn_tab +Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB2_SUB1_S1','Left Tab 1','Sub - Sub Tab 1 Information','tab2_sub1.htm','menu_tab','Y',10,'TAB2_SUB1','APP'); +Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB1','Tab 1','Tab 1 Information','tab1.htm','menu_tab','Y',10,null,'APP'); +Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB2','Tab 2','Tab 2 Information','tab2_sub1.htm','menu_tab','Y',20,null,'APP'); +Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB3','Tab 3','Tab 3 Information','tab3.htm','menu_tab','Y',30,null,'APP'); +Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB4','Tab 4','Tab 4 Information','tab4.htm','menu_tab','Y',40,null,'APP'); +Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB2_SUB1','Sub Tab 1','Sub Tab 1 Information','tab2_sub1.htm','menu_tab','Y',10,'TAB2','APP'); +Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB2_SUB2','Sub Tab 2','Sub Tab 2 Information','tab2_sub2.htm','menu_tab','Y',20,'TAB2','APP'); +Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB2_SUB3','Sub Tab 3','Sub Tab 3 Information','tab2_sub3.htm','menu_tab','Y',30,'TAB2','APP'); + +-- fn_tab_selected +Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB1','tab1'); +Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2','tab2_sub1'); +Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2','tab2_sub2'); +Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2','tab2_sub3'); +Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2_SUB1','tab2_sub1'); +Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2_SUB1_S1','tab2_sub1'); +Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2_SUB2','tab2_sub2'); +Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2_SUB3','tab2_sub3'); +Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB3','tab3'); +Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB4','tab4'); + +-- fn_user +-- This row defines a superuser which is accepted by login_extern.htm +-- The superuser entry is disabled in this checked-in version, ACTIVE = N, +-- because it is a security hole that should not exist in IST, ETE and PROD. +Insert into fn_user (USER_ID,ORG_ID,MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) + values (1,null,null,'Demo',null,'User',null,null,null,null,null,null,null,'demo',null,'demo','demo',str_to_date('24-OCT-16','%d-%M-%Y'),'Y',null,str_to_date('17-OCT-16','%d-%M-%Y'),1,str_to_date('24-OCT-16','%d-%M-%Y'),'N',null,null,null,'NJ',null,'US',null,null,null,null,null,10,null,null,null,null,null,null); + +-- fn_datasource +Insert into fn_datasource (ID,NAME,DRIVER_NAME,SERVER,PORT,USER_NAME,PASSWORD,URL,MIN_POOL_SIZE,MAX_POOL_SIZE,ADAPTER_ID,DS_TYPE) values (1,'Hive2-bragi08','org.apache.hive.jdbc.HiveDriver',null,null,null,null,'',1,5,1,'BIGDATA'); + +-- cr_raptor_action_img +Insert into cr_raptor_action_img (IMAGE_ID, IMAGE_LOC) Values ('DELETE', '/static/fusion/raptor/img/deleteicon.gif'); +Insert into cr_raptor_action_img (IMAGE_ID, IMAGE_LOC) Values ('CALENDAR', '/static/fusion/raptor/img/Calendar-16x16.png'); + +-- demo_fn_cspf_rout_util_links +-- Insert into demo_fn_cspf_rout_util_links values ('st6wa','cgcil','black',1,1,'1405','46ms','30G',null,null,1); +-- Insert into demo_fn_cspf_rout_util_links values ('st6wa','cgcil','black',2,2,'1400','46ms','70G',null,null,2); +-- Insert into demo_fn_cspf_rout_util_links values ('st6wa','dvmco','black',2,2,'1100','34ms','40G',null,null,3); +-- Insert into demo_fn_cspf_rout_util_links values ('st6wa','ptdor','black',2,2,'200','4ms','60G',null,null,4); +-- Insert into demo_fn_cspf_rout_util_links values ('st6wa','sffca','black',1,2,'850','23ms','40G',1,null,5); +-- Insert into demo_fn_cspf_rout_util_links values ('ptdor','sffca','orange',1,1,'650','19ms','70G',null,null,6); +-- Insert into demo_fn_cspf_rout_util_links values ('sffca','cgcil','black',1,1,'1550','50ms','170G',1,2,7); +-- Insert into demo_fn_cspf_rout_util_links values ('sffca','dvmco','black',2,1,'950','30ms','90G',null,null,8); +-- Insert into demo_fn_cspf_rout_util_links values ('sffca','sl9mo','black',2,1,'1555','50ms','80G',1,2,9); +-- Insert into demo_fn_cspf_rout_util_links values ('sffca','sc1ca','black',1,1,'150','2ms','80G',null,null,10); +-- Insert into demo_fn_cspf_rout_util_links values ('sffca','sc1ca','black',2,2,'150','2ms','160G',null,null,11); +-- Insert into demo_fn_cspf_rout_util_links values ('sffca','la2ca','yellow',1,1,'350','11ms','180G',null,null,12); +-- Insert into demo_fn_cspf_rout_util_links values ('sffca','la2ca','black',2,2,'360','11ms','280G',null,null,13); +-- Insert into demo_fn_cspf_rout_util_links values ('sc1ca','slkut','black',2,2,'500','15ms','200G',null,null,14); +-- Insert into demo_fn_cspf_rout_util_links values ('la2ca','slkut','black',1,1,'500','14ms','200G',null,2,15); +-- Insert into demo_fn_cspf_rout_util_links values ('la2ca','dlstx','black',2,2,'1050','33ms','280G',2,null,16); +-- Insert into demo_fn_cspf_rout_util_links values ('la2ca','phmaz','black',1,2,'450','11ms','260G',null,null,17); +-- Insert into demo_fn_cspf_rout_util_links values ('la2ca','sd2ca','yellow',2,2,'250','4ms','160G',null,null,18); +-- Insert into demo_fn_cspf_rout_util_links values ('sd2ca','phmaz','black',1,1,'255','7ms','200G',null,null,19); +-- Insert into demo_fn_cspf_rout_util_links values ('slkut','dvmco','black',1,2,'355','12ms','200G',null,null,20); +-- Insert into demo_fn_cspf_rout_util_links values ('dvmco','cgcil','black',2,1,'650','21ms','200G',null,null,21); +-- Insert into demo_fn_cspf_rout_util_links values ('dvmco','kc9mo','black',1,1,'500','15ms','100G',null,null,22); +-- Insert into demo_fn_cspf_rout_util_links values ('dvmco','dlstx','black',2,2,'650','20ms','200G',null,null,23); +-- Insert into demo_fn_cspf_rout_util_links values ('phmaz','dlstx','black',1,1,'750','22ms','210G',null,null,24); +-- Insert into demo_fn_cspf_rout_util_links values ('phmaz','santx','black',2,2,'650','21ms','160G',null,null,25); +-- Insert into demo_fn_cspf_rout_util_links values ('kc9mo','sl9mo','black',2,2,'220','5ms','280G',null,null,26); +-- Insert into demo_fn_cspf_rout_util_links values ('kc9mo','dlstx','black',2,1,'500','11ms','280G',null,null,27); +-- Insert into demo_fn_cspf_rout_util_links values ('santx','dlstx','black',1,2,'200','7ms','180G',null,null,28); +-- Insert into demo_fn_cspf_rout_util_links values ('santx','hs1tx','black',2,1,'200','5ms','240G',null,null,29); +-- Insert into demo_fn_cspf_rout_util_links values ('cgcil','n54ny','black',2,1,'650','21ms','280G',null,null,30); +-- Insert into demo_fn_cspf_rout_util_links values ('cgcil','cl2oh','yellow',1,1,'200','7ms','200G',null,null,31); +-- Insert into demo_fn_cspf_rout_util_links values ('cgcil','wswdc','black',1,2,'650','21ms','200G',null,2,32); +-- Insert into demo_fn_cspf_rout_util_links values ('cgcil','sl9mo','black',1,1,'405','10.3ms','160G',null,null,33); +-- Insert into demo_fn_cspf_rout_util_links values ('cgcil','sl9mo','black',2,2,'350','8ms','370G',null,null,34); +-- Insert into demo_fn_cspf_rout_util_links values ('sl9mo','wswdc','black',2,1,'650','18ms','280G',null,null,35); +-- Insert into demo_fn_cspf_rout_util_links values ('sl9mo','nsvtn','black',1,1,'350','11ms','170G',null,null,36); +-- Insert into demo_fn_cspf_rout_util_links values ('sl9mo','dlstx','black',1,2,'600','19ms','200G, 35G',null,null,37); +-- Insert into demo_fn_cspf_rout_util_links values ('dlstx','nsvtn','black',1,2,'650','18ms','160G',null,null,38); +-- Insert into demo_fn_cspf_rout_util_links values ('dlstx','attga','black',2,1,'650','20ms','240G',null,null,39); +-- Insert into demo_fn_cspf_rout_util_links values ('dlstx','hs1tx','yellow',1,2,'200','5ms','360G',null,null,40); +-- Insert into demo_fn_cspf_rout_util_links values ('hs1tx','nwrla','black',1,1,'250','7ms','170G',null,null,41); +-- Insert into demo_fn_cspf_rout_util_links values ('hs1tx','ormfl','black',2,1,'650','21ms','130G',null,null,42); +-- Insert into demo_fn_cspf_rout_util_links values ('nwrla','attga','black',1,2,'350','12ms','200G',null,null,43); +-- Insert into demo_fn_cspf_rout_util_links values ('nwrla','ormfl','black',2,2,'550','14ms','90G',null,null,44); +-- Insert into demo_fn_cspf_rout_util_links values ('ormfl','attga','black',1,2,'350','10ms','120G',null,null,45); +-- Insert into demo_fn_cspf_rout_util_links values ('ormfl','attga','black',2,1,'355','10ms','210G',null,null,46); +-- Insert into demo_fn_cspf_rout_util_links values ('nsvtn','attga','yellow',1,2,'350','8ms','240G',null,null,47); +-- Insert into demo_fn_cspf_rout_util_links values ('nsvtn','cl2oh','black',2,1,'350','11ms','200G',null,2,48); +-- Insert into demo_fn_cspf_rout_util_links values ('cl2oh','phlpa','black',2,2,'350','11ms','240G',null,null,49); +-- Insert into demo_fn_cspf_rout_util_links values ('n54ny','cb1ma','black',2,1,'200','6ms','80G',null,null,50); +-- Insert into demo_fn_cspf_rout_util_links values ('n54ny','phlpa','black',1,1,'200','3ms','240G',null,null,51); +-- Insert into demo_fn_cspf_rout_util_links values ('n54ny','wswdc','black',2,2,'200','5ms','380G',2,2,52); +-- Insert into demo_fn_cspf_rout_util_links values ('cb1ma','phlpa','black',2,1,'350','9ms','110G',2,null,53); +-- Insert into demo_fn_cspf_rout_util_links values ('phlpa','wswdc','black',2,1,'200','3ms','240G',null,null,54); +-- Insert into demo_fn_cspf_rout_util_links values ('wswdc','rlgnc','black',1,2,'350','9ms','200G',null,null,55); +-- Insert into demo_fn_cspf_rout_util_links values ('wswdc','attga','yellow',2,1,'650','19ms','380G',null,null,56); +-- Insert into demo_fn_cspf_rout_util_links values ('rlgnc','attga','black',1,2,'355','10ms','160G',null,null,57); + +-- demo_fn_cspf_rout_util_map +-- Insert into demo_fn_cspf_rout_util_map values ('cb1ma','Cambridge, MA',42.3736111111111,-71.1105555555555,'black','100G','green',1); +-- Insert into demo_fn_cspf_rout_util_map values ('st6wa','Seattle, WA',47.6097222222222,-122.333055555556,'black','40G','green',2); +-- Insert into demo_fn_cspf_rout_util_map values ('cgcil','Chicago, IL',41.8819444444444,-87.6277777777778,'black','310G','green',3); +-- Insert into demo_fn_cspf_rout_util_map values ('n54ny','New York, NY',40.7127777777778,-74.0058333333333,'black','160G','green',4); +-- Insert into demo_fn_cspf_rout_util_map values ('cl2oh','Columbus, OH',39.9833333333333,-82.9833333333333,'black','300G','green',5); +-- Insert into demo_fn_cspf_rout_util_map values ('phlpa','Philadelphia, PA',39.95,-75.1666666666667,'black','210G','green',6); +-- Insert into demo_fn_cspf_rout_util_map values ('ptdor','Portland, OR',45.52,-122.681944444444,'yellow','90G','green',7); +-- Insert into demo_fn_cspf_rout_util_map values ('dvmco','Denver, CO',39.7391666666667,-104.984722222222,'black','170G','green',8); +-- Insert into demo_fn_cspf_rout_util_map values ('kc9mo','Kansas City, MO',39.0997222222222,-94.5783333333333,'black','100G','green',9); +-- Insert into demo_fn_cspf_rout_util_map values ('sffca','San Fransisco, CA',37.7833333333333,-122.416666666667,'black','130G','green',10); +-- Insert into demo_fn_cspf_rout_util_map values ('sl9mo','St Louis, MO',38.6272222222222,-90.1977777777778,'black','330G','green',11); +-- Insert into demo_fn_cspf_rout_util_map values ('wswdc','Washington, DC',38.8951111111111,-77.0366666666667,'black','210G','green',12); +-- Insert into demo_fn_cspf_rout_util_map values ('sc1ca','Sacramento, CA',38.5555555555556,-121.468888888889,'black','250G','green',13); +-- Insert into demo_fn_cspf_rout_util_map values ('slkut','Salt Lake City, UT',40.75,-111.883333333333,'black','250G','green',14); +-- Insert into demo_fn_cspf_rout_util_map values ('rlgnc','Raleigh, NC',35.8188888888889,-78.6447222222222,'black','180G','green',15); +-- Insert into demo_fn_cspf_rout_util_map values ('nsvtn','Nashville, TN',36.1666666666667,-86.7833333333333,'black','210G','green',16); +-- Insert into demo_fn_cspf_rout_util_map values ('la2ca','Los Angeles, CA',34.05,-118.25,'black','180G','green',17); +-- Insert into demo_fn_cspf_rout_util_map values ('dlstx','Dallas, TX',32.7758333333333,-96.7966666666667,'black','330G','green',18); +-- Insert into demo_fn_cspf_rout_util_map values ('attga','Atlanta, GA',33.755,-84.39,'black','280G','green',19); +-- Insert into demo_fn_cspf_rout_util_map values ('nwrla','New Orleans, LA',29.9647222222222,-90.0705555555556,'black','180G','green',20); +-- Insert into demo_fn_cspf_rout_util_map values ('sd2ca','San Diego, CA',32.715,-117.1625,'black','150G','green',21); +-- Insert into demo_fn_cspf_rout_util_map values ('phmaz','Phoenix, AZ',33.45,-112.066666666667,'black','210G','green',22); +-- Insert into demo_fn_cspf_rout_util_map values ('santx','San Antonio, TX',29.4166666666667,-98.5,'black','220G','green',23); +-- Insert into demo_fn_cspf_rout_util_map values ('hs1tx','Houston, TX',29.7627777777778,-95.3830555555555,'black','290G','green',24); +-- Insert into demo_fn_cspf_rout_util_map values ('ormfl','Orlando, FL',28.4158333333333,-81.2988888888889,'black','130G','green',25); + +-- demo_fn_cssng_data +-- Insert into demo_fn_cssng_data values ('4796','30.000',64,'RICHMOND','NY',40.5172269,-74.1962731,'4796-1',1); +-- Insert into demo_fn_cssng_data values ('4797','70.000',91,'RICHMOND','NY',40.5371389,-74.2368333,'4797-1',1); +-- Insert into demo_fn_cssng_data values ('97408','60.000',null,'RICHMOND','NY',40.6396944,-74.1158889,'97408-2',2); +-- Insert into demo_fn_cssng_data values ('35799','100.000',64,'RICHMOND','NY',40.6266897,-74.1585278,'35799-1',1); +-- Insert into demo_fn_cssng_data values ('88313','30.000',65,'RICHMOND','NY',40.5905561,-74.1341669,'88313-2',2); +-- Insert into demo_fn_cssng_data values ('92812','310.000',65,'RICHMOND','NY',40.6138611,-74.1579719,'92812-3',3); +-- Insert into demo_fn_cssng_data values ('35977',null,null,'RICHMOND','NY',40.5954397,-74.0830369,'35977-4',4); +-- Insert into demo_fn_cssng_data values ('36368',null,null,'RICHMOND','NY',40.6113981,-74.0941436,'36368-5',5); +-- Insert into demo_fn_cssng_data values ('35012',null,null,'RICHMOND','NY',40.5407964,-74.17825,'35012-3',3); +-- Insert into demo_fn_cssng_data values ('4869',null,null,'RICHMOND','NY',40.5127361,-74.2217778,'4869-6',6); +-- Insert into demo_fn_cssng_data values ('14299','140.000',64,'RICHMOND','NY',40.6348797,-74.0862083,'14299-3',3); +-- Insert into demo_fn_cssng_data values ('27796','180.000',85,'RICHMOND','NY',40.6380231,-74.1616575,'27796-4',4); +-- Insert into demo_fn_cssng_data values ('35944','270.000',64,'RICHMOND','NY',40.5520786,-74.2183286,'35944-3',3); +-- Insert into demo_fn_cssng_data values ('4801','215.000',64,'RICHMOND','NY',40.6126667,-74.1822269,'4801-4',4); +-- Insert into demo_fn_cssng_data values ('47225','240.000',65,'RICHMOND','NY',40.5360119,-74.1805239,'47225-6',6); +-- Insert into demo_fn_cssng_data values ('35948','250.000',360,'RICHMOND','NY',40.5590647,-74.1325833,'35948-6',6); +-- Insert into demo_fn_cssng_data values ('35799','100.000',65,'RICHMOND','NY',40.6266897,-74.1585278,'35799-2',2); +-- Insert into demo_fn_cssng_data values ('86075','40.000',90,'RICHMOND','NY',40.6122778,-74.0827547,'86075-3',3); +-- Insert into demo_fn_cssng_data values ('103136','240.000',65,'RICHMOND','NY',40.615945,-74.138723,'103136-3',3); +-- Insert into demo_fn_cssng_data values ('4882','240.000',64,'RICHMOND','NY',40.6051158,-74.0758564,'4882-5',5); +-- Insert into demo_fn_cssng_data values ('14992','270.000',91,'RICHMOND','NY',40.5440833,-74.162,'14992-6',6); +-- Insert into demo_fn_cssng_data values ('88313','270.000',65,'RICHMOND','NY',40.5905561,-74.1341669,'88313-6',6); +-- Insert into demo_fn_cssng_data values ('14304','50.000',64,'RICHMOND','NY',40.5594306,-74.1634953,'14304-2',2); +-- Insert into demo_fn_cssng_data values ('14992','30.000',90,'RICHMOND','NY',40.5440833,-74.162,'14992-1',1); +-- Insert into demo_fn_cssng_data values ('4869','270.000',null,'RICHMOND','NY',40.5127361,-74.2217778,'4869-5',5); +-- Insert into demo_fn_cssng_data values ('14299','20.000',64,'RICHMOND','NY',40.6348797,-74.0862083,'14299-2',2); +-- Insert into demo_fn_cssng_data values ('4801','15.000',64,'RICHMOND','NY',40.6126667,-74.1822269,'4801-1',1); +-- Insert into demo_fn_cssng_data values ('118015','0.000',360,'RICHMOND','NY',40.5441111,-74.162,'118015-1',1); +-- Insert into demo_fn_cssng_data values ('47097','115.000',64,'RICHMOND','NY',40.5980417,-74.1617869,'47097-1',1); +-- Insert into demo_fn_cssng_data values ('35966','150.000',64,'RICHMOND','NY',40.5496481,-74.1504119,'35966-3',3); +-- Insert into demo_fn_cssng_data values ('35977','120.000',65,'RICHMOND','NY',40.5954397,-74.0830369,'35977-2',2); +-- Insert into demo_fn_cssng_data values ('86075','240.000',65,'RICHMOND','NY',40.6122778,-74.0827547,'86075-4',4); +-- Insert into demo_fn_cssng_data values ('4883',null,null,'RICHMOND','NY',40.6013056,-74.0669492,'4883-3',3); +-- Insert into demo_fn_cssng_data values ('4796',null,null,'RICHMOND','NY',40.5172269,-74.1962731,'4796-5',5); +-- Insert into demo_fn_cssng_data values ('4800',null,null,'RICHMOND','NY',40.6083519,-74.1224353,'4800-5',5); +-- Insert into demo_fn_cssng_data values ('88313',null,null,'RICHMOND','NY',40.5905561,-74.1341669,'88313-7',7); +-- Insert into demo_fn_cssng_data values ('14304','290.000',64,'RICHMOND','NY',40.5594306,-74.1634953,'14304-6',6); +-- Insert into demo_fn_cssng_data values ('16385',null,null,'RICHMOND','NY',40.6188611,-74.1070556,'16385-5',5); +-- Insert into demo_fn_cssng_data values ('36361',null,null,'RICHMOND','NY',40.6260603,-74.0756297,'36361-4',4); +-- Insert into demo_fn_cssng_data values ('98037',null,null,'RICHMOND','NY',40.6027917,-74.1758139,'98037-4',4); +-- Insert into demo_fn_cssng_data values ('4876','120.000',90,'RICHMOND','NY',40.5734119,-74.1361806,'4876-1',1); +-- Insert into demo_fn_cssng_data values ('101680','325.000',65,'RICHMOND','NY',40.6119278,-74.0642444,'101680-3',3); +-- Insert into demo_fn_cssng_data values ('14304','170.000',64,'RICHMOND','NY',40.5594306,-74.1634953,'14304-4',4); +-- Insert into demo_fn_cssng_data values ('50736','155.000',null,'RICHMOND','NY',40.6236297,-74.1715139,'50736-3',3); +-- Insert into demo_fn_cssng_data values ('14989','140.000',64,'RICHMOND','NY',40.6359397,-74.106125,'14989-3',3); +-- Insert into demo_fn_cssng_data values ('4878','310.000',null,'RICHMOND','NY',40.5400647,-74.1483056,'4878-3',3); +-- Insert into demo_fn_cssng_data values ('46861','270.000',64,'RICHMOND','NY',40.5860694,-74.1942175,'46861-3',3); +-- Insert into demo_fn_cssng_data values ('16424','240.000',65,'RICHMOND','NY',40.6053381,-74.1506158,'16424-3',3); +-- Insert into demo_fn_cssng_data values ('47235',null,null,'RICHMOND','NY',40.5198981,-74.2265278,'47235-7',7); +-- Insert into demo_fn_cssng_data values ('4797','165.000',91,'RICHMOND','NY',40.5371389,-74.2368333,'4797-2',2); +-- Insert into demo_fn_cssng_data values ('14304',null,null,'RICHMOND','NY',40.5594306,-74.1634953,'14304-7',7); +-- Insert into demo_fn_cssng_data values ('27796',null,null,'RICHMOND','NY',40.6380231,-74.1616575,'27796-7',7); +-- Insert into demo_fn_cssng_data values ('49099','120.000',65,'RICHMOND','NY',40.5265092,-74.1798889,'49099-2',2); +-- Insert into demo_fn_cssng_data values ('47005','15.000',64,'RICHMOND','NY',40.5790186,-74.1070464,'47005-1',1); +-- Insert into demo_fn_cssng_data values ('4882','0.000',64,'RICHMOND','NY',40.6051158,-74.0758564,'4882-1',1); +-- Insert into demo_fn_cssng_data values ('4797',null,null,'RICHMOND','NY',40.5371389,-74.2368333,'4797-4',4); +-- Insert into demo_fn_cssng_data values ('47235','310.000',65,'RICHMOND','NY',40.5198981,-74.2265278,'47235-5',5); +-- Insert into demo_fn_cssng_data values ('103137','300.000',null,'RICHMOND','NY',40.6146194,-74.0905056,'103137-4',4); +-- Insert into demo_fn_cssng_data values ('47097','300.000',64,'RICHMOND','NY',40.5980417,-74.1617869,'47097-5',5); +-- Insert into demo_fn_cssng_data values ('4866','240.000',65,'RICHMOND','NY',40.6309028,-74.1249583,'4866-5',5); +-- Insert into demo_fn_cssng_data values ('47235','120.000',65,'RICHMOND','NY',40.5198981,-74.2265278,'47235-3',3); +-- Insert into demo_fn_cssng_data values ('36361','150.000',64,'RICHMOND','NY',40.6260603,-74.0756297,'36361-1',1); +-- Insert into demo_fn_cssng_data values ('88313','150.000',65,'RICHMOND','NY',40.5905561,-74.1341669,'88313-4',4); +-- Insert into demo_fn_cssng_data values ('97374','200.000',65,'RICHMOND','NY',40.5981,-74.11214,'97374-3',3); +-- Insert into demo_fn_cssng_data values ('86075','40.000',85,'RICHMOND','NY',40.6122778,-74.0827547,'86075-2',2); +-- Insert into demo_fn_cssng_data values ('35967','270.000',65,'RICHMOND','NY',40.5954214,-74.0908103,'35967-6',6); +-- Insert into demo_fn_cssng_data values ('4882','240.000',65,'RICHMOND','NY',40.6051158,-74.0758564,'4882-6',6); +-- Insert into demo_fn_cssng_data values ('15623','240.000',64,'RICHMOND','NY',40.5324953,-74.1915278,'15623-4',4); +-- Insert into demo_fn_cssng_data values ('35978','90.000',64,'RICHMOND','NY',40.6170186,-74.0754167,'35978-1',1); +-- Insert into demo_fn_cssng_data values ('47006','200.000',64,'RICHMOND','NY',40.5093611,-74.2466853,'47006-3',3); +-- Insert into demo_fn_cssng_data values ('49099','200.000',64,'RICHMOND','NY',40.5265092,-74.1798889,'49099-3',3); +-- Insert into demo_fn_cssng_data values ('36368','200.000',65,'RICHMOND','NY',40.6113981,-74.0941436,'36368-3',3); +-- Insert into demo_fn_cssng_data values ('92812','70.000',65,'RICHMOND','NY',40.6138611,-74.1579719,'92812-1',1); +-- Insert into demo_fn_cssng_data values ('47225',null,null,'RICHMOND','NY',40.5360119,-74.1805239,'47225-7',7); +-- Insert into demo_fn_cssng_data values ('47227',null,null,'RICHMOND','NY',40.6462036,-74.0907314,'47227-4',4); +-- Insert into demo_fn_cssng_data values ('35012','360.000',360,'RICHMOND','NY',40.5407964,-74.17825,'35012-2',2); +-- Insert into demo_fn_cssng_data values ('4797','230.000',64,'RICHMOND','NY',40.5371389,-74.2368333,'4797-3',3); +-- Insert into demo_fn_cssng_data values ('4798','270.000',65,'RICHMOND','NY',40.567375,-74.1091297,'4798-3',3); +-- Insert into demo_fn_cssng_data values ('36361','250.000',64,'RICHMOND','NY',40.6260603,-74.0756297,'36361-2',2); +-- Insert into demo_fn_cssng_data values ('14299','250.000',64,'RICHMOND','NY',40.6348797,-74.0862083,'14299-4',4); +-- Insert into demo_fn_cssng_data values ('4800','0.000',91,'RICHMOND','NY',40.6083519,-74.1224353,'4800-2',2); +-- Insert into demo_fn_cssng_data values ('97374','0.000',65,'RICHMOND','NY',40.5981,-74.11214,'97374-1',1); +-- Insert into demo_fn_cssng_data values ('47225','150.000',65,'RICHMOND','NY',40.5360119,-74.1805239,'47225-4',4); +-- Insert into demo_fn_cssng_data values ('88313','120.000',65,'RICHMOND','NY',40.5905561,-74.1341669,'88313-3',3); +-- Insert into demo_fn_cssng_data values ('46861','150.000',64,'RICHMOND','NY',40.5860694,-74.1942175,'46861-2',2); +-- Insert into demo_fn_cssng_data values ('47228','150.000',65,'RICHMOND','NY',40.580694,-74.130778,'47228-2',2); +-- Insert into demo_fn_cssng_data values ('49099','270.000',65,'RICHMOND','NY',40.5265092,-74.1798889,'49099-5',5); +-- Insert into demo_fn_cssng_data values ('35977','240.000',65,'RICHMOND','NY',40.5954397,-74.0830369,'35977-3',3); +-- Insert into demo_fn_cssng_data values ('86075','340.000',65,'RICHMOND','NY',40.6122778,-74.0827547,'86075-5',5); +-- Insert into demo_fn_cssng_data values ('4877',null,null,'RICHMOND','NY',40.5295508,-74.1617731,'4877-3',3); +-- Insert into demo_fn_cssng_data values ('4880',null,null,'RICHMOND','NY',40.5619075,-74.1862778,'4880-5',5); +-- Insert into demo_fn_cssng_data values ('14299',null,null,'RICHMOND','NY',40.6348797,-74.0862083,'14299-5',5); +-- Insert into demo_fn_cssng_data values ('36280',null,null,'RICHMOND','NY',40.6441667,-74.0741667,'36280-4',4); +-- Insert into demo_fn_cssng_data values ('35799','285.000',64,'RICHMOND','NY',40.6266897,-74.1585278,'35799-3',3); +-- Insert into demo_fn_cssng_data values ('47005','15.000',65,'RICHMOND','NY',40.5790186,-74.1070464,'47005-2',2); +-- Insert into demo_fn_cssng_data values ('47235','310.000',null,'RICHMOND','NY',40.5198981,-74.2265278,'47235-6',6); +-- Insert into demo_fn_cssng_data values ('35971','180.000',64,'RICHMOND','NY',40.5520925,-74.1897408,'35971-1',1); +-- Insert into demo_fn_cssng_data values ('14992','30.000',91,'RICHMOND','NY',40.5440833,-74.162,'14992-2',2); +-- Insert into demo_fn_cssng_data values ('103137','0.000',null,'RICHMOND','NY',40.6146194,-74.0905056,'103137-1',1); +-- Insert into demo_fn_cssng_data values ('16385','335.000',65,'RICHMOND','NY',40.6188611,-74.1070556,'16385-4',4); +-- Insert into demo_fn_cssng_data values ('86075','40.000',65,'RICHMOND','NY',40.6122778,-74.0827547,'86075-1',1); +-- Insert into demo_fn_cssng_data values ('16424',null,null,'RICHMOND','NY',40.6053381,-74.1506158,'16424-5',5); +-- Insert into demo_fn_cssng_data values ('14989','20.000',64,'RICHMOND','NY',40.6359397,-74.106125,'14989-1',1); +-- Insert into demo_fn_cssng_data values ('16424','240.000',91,'RICHMOND','NY',40.6053381,-74.1506158,'16424-4',4); +-- Insert into demo_fn_cssng_data values ('35966','270.000',65,'RICHMOND','NY',40.5496481,-74.1504119,'35966-6',6); +-- Insert into demo_fn_cssng_data values ('88313','240.000',65,'RICHMOND','NY',40.5905561,-74.1341669,'88313-5',5); +-- Insert into demo_fn_cssng_data values ('35966','270.000',64,'RICHMOND','NY',40.5496481,-74.1504119,'35966-5',5); +-- Insert into demo_fn_cssng_data values ('4800','240.000',91,'RICHMOND','NY',40.6083519,-74.1224353,'4800-4',4); +-- Insert into demo_fn_cssng_data values ('15623','250.000',64,'RICHMOND','NY',40.5324953,-74.1915278,'15623-5',5); +-- Insert into demo_fn_cssng_data values ('47225','0.000',65,'RICHMOND','NY',40.5360119,-74.1805239,'47225-2',2); +-- Insert into demo_fn_cssng_data values ('47225','0.000',64,'RICHMOND','NY',40.5360119,-74.1805239,'47225-1',1); +-- Insert into demo_fn_cssng_data values ('126659','0.000',65,'RICHMOND','NY',40.5815444,-74.1660111,'126659-1',1); +-- Insert into demo_fn_cssng_data values ('47227','80.000',65,'RICHMOND','NY',40.6462036,-74.0907314,'47227-1',1); +-- Insert into demo_fn_cssng_data values ('103137','250.000',null,'RICHMOND','NY',40.6146194,-74.0905056,'103137-3',3); +-- Insert into demo_fn_cssng_data values ('16385','75.000',65,'RICHMOND','NY',40.6188611,-74.1070556,'16385-1',1); +-- Insert into demo_fn_cssng_data values ('47005','120.000',64,'RICHMOND','NY',40.5790186,-74.1070464,'47005-3',3); +-- Insert into demo_fn_cssng_data values ('47097','300.000',65,'RICHMOND','NY',40.5980417,-74.1617869,'47097-6',6); +-- Insert into demo_fn_cssng_data values ('35966',null,null,'RICHMOND','NY',40.5496481,-74.1504119,'35966-7',7); +-- Insert into demo_fn_cssng_data values ('47006',null,null,'RICHMOND','NY',40.5093611,-74.2466853,'47006-7',7); +-- Insert into demo_fn_cssng_data values ('4877','25.000',65,'RICHMOND','NY',40.5295508,-74.1617731,'4877-1',1); +-- Insert into demo_fn_cssng_data values ('46861','30.000',64,'RICHMOND','NY',40.5860694,-74.1942175,'46861-1',1); +-- Insert into demo_fn_cssng_data values ('47006','50.000',64,'RICHMOND','NY',40.5093611,-74.2466853,'47006-1',1); +-- Insert into demo_fn_cssng_data values ('47228','30.000',65,'RICHMOND','NY',40.580694,-74.130778,'47228-1',1); +-- Insert into demo_fn_cssng_data values ('98037','40.000',65,'RICHMOND','NY',40.6027917,-74.1758139,'98037-1',1); +-- Insert into demo_fn_cssng_data values ('27796','100.000',65,'RICHMOND','NY',40.6380231,-74.1616575,'27796-1',1); +-- Insert into demo_fn_cssng_data values ('36368','100.000',65,'RICHMOND','NY',40.6113981,-74.0941436,'36368-1',1); +-- Insert into demo_fn_cssng_data values ('158754','0.000',360,'RICHMOND','NY',40.58437,-74.08574,'158754-1',1); +-- Insert into demo_fn_cssng_data values ('47225','240.000',64,'RICHMOND','NY',40.5360119,-74.1805239,'47225-5',5); +-- Insert into demo_fn_cssng_data values ('100652','260.000',65,'RICHMOND','NY',40.5447861,-74.1817194,'100652-3',3); +-- Insert into demo_fn_cssng_data values ('14304','270.000',64,'RICHMOND','NY',40.5594306,-74.1634953,'14304-5',5); +-- Insert into demo_fn_cssng_data values ('4876','120.000',91,'RICHMOND','NY',40.5734119,-74.1361806,'4876-2',2); +-- Insert into demo_fn_cssng_data values ('88313','0.000',65,'RICHMOND','NY',40.5905561,-74.1341669,'88313-1',1); +-- Insert into demo_fn_cssng_data values ('50736',null,null,'RICHMOND','NY',40.6236297,-74.1715139,'50736-5',5); +-- Insert into demo_fn_cssng_data values ('4801','113.000',64,'RICHMOND','NY',40.6126667,-74.1822269,'4801-3',3); +-- Insert into demo_fn_cssng_data values ('4869','60.000',null,'RICHMOND','NY',40.5127361,-74.2217778,'4869-2',2); +-- Insert into demo_fn_cssng_data values ('101680','155.000',65,'RICHMOND','NY',40.6119278,-74.0642444,'101680-1',1); +-- Insert into demo_fn_cssng_data values ('47225','150.000',64,'RICHMOND','NY',40.5360119,-74.1805239,'47225-3',3); +-- Insert into demo_fn_cssng_data values ('48674','150.000',null,'RICHMOND','NY',40.5602314,-74.1986528,'48674-2',2); +-- Insert into demo_fn_cssng_data values ('4869','100.000',65,'RICHMOND','NY',40.5127361,-74.2217778,'4869-3',3); +-- Insert into demo_fn_cssng_data values ('36280','310.000',64,'RICHMOND','NY',40.6441667,-74.0741667,'36280-3',3); +-- Insert into demo_fn_cssng_data values ('35946','150.000',64,'RICHMOND','NY',40.6361944,-74.1350325,'35946-3',3); +-- Insert into demo_fn_cssng_data values ('16421',null,null,'RICHMOND','NY',40.5944167,-74.0625369,'16421-3',3); +-- Insert into demo_fn_cssng_data values ('4866','0.000',90,'RICHMOND','NY',40.6309028,-74.1249583,'4866-2',2); +-- Insert into demo_fn_cssng_data values ('4801','15.000',65,'RICHMOND','NY',40.6126667,-74.1822269,'4801-2',2); +-- Insert into demo_fn_cssng_data values ('16385','80.000',65,'RICHMOND','NY',40.6188611,-74.1070556,'16385-2',2); +-- Insert into demo_fn_cssng_data values ('50736','155.000',65,'RICHMOND','NY',40.6236297,-74.1715139,'50736-2',2); +-- Insert into demo_fn_cssng_data values ('4880','355.000',0,'RICHMOND','NY',40.5619075,-74.1862778,'4880-3',3); +-- Insert into demo_fn_cssng_data values ('47226','0.000',360,'RICHMOND','NY',40.5371388,-74.2368333,'47226-1',1); +-- Insert into demo_fn_cssng_data values ('35946','270.000',65,'RICHMOND','NY',40.6361944,-74.1350325,'35946-6',6); +-- Insert into demo_fn_cssng_data values ('35971',null,null,'RICHMOND','NY',40.5520925,-74.1897408,'35971-4',4); +-- Insert into demo_fn_cssng_data values ('14989',null,null,'RICHMOND','NY',40.6359397,-74.106125,'14989-5',5); +-- Insert into demo_fn_cssng_data values ('100652','30.000',65,'RICHMOND','NY',40.5447861,-74.1817194,'100652-1',1); +-- Insert into demo_fn_cssng_data values ('35978','350.000',64,'RICHMOND','NY',40.6170186,-74.0754167,'35978-3',3); +-- Insert into demo_fn_cssng_data values ('36280','180.000',64,'RICHMOND','NY',40.6441667,-74.0741667,'36280-1',1); +-- Insert into demo_fn_cssng_data values ('16421','320.000',64,'RICHMOND','NY',40.5944167,-74.0625369,'16421-2',2); +-- Insert into demo_fn_cssng_data values ('46861',null,null,'RICHMOND','NY',40.5860694,-74.1942175,'46861-4',4); +-- Insert into demo_fn_cssng_data values ('97408','32.000',64,'RICHMOND','NY',40.6396944,-74.1158889,'97408-1',1); +-- Insert into demo_fn_cssng_data values ('35966','150.000',65,'RICHMOND','NY',40.5496481,-74.1504119,'35966-4',4); +-- Insert into demo_fn_cssng_data values ('101680','260.000',65,'RICHMOND','NY',40.6119278,-74.0642444,'101680-2',2); +-- Insert into demo_fn_cssng_data values ('4796','270.000',64,'RICHMOND','NY',40.5172269,-74.1962731,'4796-3',3); +-- Insert into demo_fn_cssng_data values ('4880','270.000',64,'RICHMOND','NY',40.5619075,-74.1862778,'4880-2',2); +-- Insert into demo_fn_cssng_data values ('97408','190.000',64,'RICHMOND','NY',40.6396944,-74.1158889,'97408-3',3); +-- Insert into demo_fn_cssng_data values ('16424','130.000',90,'RICHMOND','NY',40.6053381,-74.1506158,'16424-1',1); +-- Insert into demo_fn_cssng_data values ('48675','70.000',65,'RICHMOND','NY',40.5656389,-74.1414561,'48675-3',3); +-- Insert into demo_fn_cssng_data values ('27796','180.000',65,'RICHMOND','NY',40.6380231,-74.1616575,'27796-3',3); +-- Insert into demo_fn_cssng_data values ('97374',null,null,'RICHMOND','NY',40.5981,-74.11214,'97374-4',4); +-- Insert into demo_fn_cssng_data values ('35966','30.000',65,'RICHMOND','NY',40.5496481,-74.1504119,'35966-2',2); +-- Insert into demo_fn_cssng_data values ('35967','150.000',64,'RICHMOND','NY',40.5954214,-74.0908103,'35967-3',3); +-- Insert into demo_fn_cssng_data values ('4866','120.000',65,'RICHMOND','NY',40.6309028,-74.1249583,'4866-3',3); +-- Insert into demo_fn_cssng_data values ('4876',null,null,'RICHMOND','NY',40.5734119,-74.1361806,'4876-6',6); +-- Insert into demo_fn_cssng_data values ('4882',null,null,'RICHMOND','NY',40.6051158,-74.0758564,'4882-7',7); +-- Insert into demo_fn_cssng_data values ('86075',null,null,'RICHMOND','NY',40.6122778,-74.0827547,'86075-6',6); +-- Insert into demo_fn_cssng_data values ('35799',null,null,'RICHMOND','NY',40.6266897,-74.1585278,'35799-4',4); +-- Insert into demo_fn_cssng_data values ('35948','0.000',360,'RICHMOND','NY',40.5590647,-74.1325833,'35948-2',2); +-- Insert into demo_fn_cssng_data values ('4882','0.000',65,'RICHMOND','NY',40.6051158,-74.0758564,'4882-2',2); +-- Insert into demo_fn_cssng_data values ('27796','100.000',85,'RICHMOND','NY',40.6380231,-74.1616575,'27796-2',2); +-- Insert into demo_fn_cssng_data values ('50736','30.000',null,'RICHMOND','NY',40.6236297,-74.1715139,'50736-1',1); +-- Insert into demo_fn_cssng_data values ('35966','30.000',64,'RICHMOND','NY',40.5496481,-74.1504119,'35966-1',1); +-- Insert into demo_fn_cssng_data values ('48674','30.000',null,'RICHMOND','NY',40.5602314,-74.1986528,'48674-1',1); +-- Insert into demo_fn_cssng_data values ('4880','355.000',64,'RICHMOND','NY',40.5619075,-74.1862778,'4880-4',4); +-- Insert into demo_fn_cssng_data values ('4798','30.000',64,'RICHMOND','NY',40.567375,-74.1091297,'4798-1',1); +-- Insert into demo_fn_cssng_data values ('4796','270.000',65,'RICHMOND','NY',40.5172269,-74.1962731,'4796-4',4); +-- Insert into demo_fn_cssng_data values ('4880','270.000',0,'RICHMOND','NY',40.5619075,-74.1862778,'4880-1',1); +-- Insert into demo_fn_cssng_data values ('103136','120.000',65,'RICHMOND','NY',40.615945,-74.138723,'103136-2',2); +-- Insert into demo_fn_cssng_data values ('4882','120.000',64,'RICHMOND','NY',40.6051158,-74.0758564,'4882-3',3); +-- Insert into demo_fn_cssng_data values ('47227','160.000',65,'RICHMOND','NY',40.6462036,-74.0907314,'47227-2',2); +-- Insert into demo_fn_cssng_data values ('4877','265.000',65,'RICHMOND','NY',40.5295508,-74.1617731,'4877-2',2); +-- Insert into demo_fn_cssng_data values ('47005','250.000',64,'RICHMOND','NY',40.5790186,-74.1070464,'47005-5',5); +-- Insert into demo_fn_cssng_data values ('47005','120.000',65,'RICHMOND','NY',40.5790186,-74.1070464,'47005-4',4); +-- Insert into demo_fn_cssng_data values ('92812',null,null,'RICHMOND','NY',40.6138611,-74.1579719,'92812-4',4); +-- Insert into demo_fn_cssng_data values ('35971','250.000',64,'RICHMOND','NY',40.5520925,-74.1897408,'35971-2',2); +-- Insert into demo_fn_cssng_data values ('47097','190.000',64,'RICHMOND','NY',40.5980417,-74.1617869,'47097-3',3); +-- Insert into demo_fn_cssng_data values ('4798','170.000',65,'RICHMOND','NY',40.567375,-74.1091297,'4798-2',2); +-- Insert into demo_fn_cssng_data values ('47005',null,null,'RICHMOND','NY',40.5790186,-74.1070464,'47005-7',7); +-- Insert into demo_fn_cssng_data values ('4866',null,null,'RICHMOND','NY',40.6309028,-74.1249583,'4866-7',7); +-- Insert into demo_fn_cssng_data values ('35946',null,null,'RICHMOND','NY',40.6361944,-74.1350325,'35946-7',7); +-- Insert into demo_fn_cssng_data values ('4796','30.000',65,'RICHMOND','NY',40.5172269,-74.1962731,'4796-2',2); +-- Insert into demo_fn_cssng_data values ('35967','30.000',65,'RICHMOND','NY',40.5954214,-74.0908103,'35967-2',2); +-- Insert into demo_fn_cssng_data values ('36280','180.000',65,'RICHMOND','NY',40.6441667,-74.0741667,'36280-2',2); +-- Insert into demo_fn_cssng_data values ('48674',null,null,'RICHMOND','NY',40.5602314,-74.1986528,'48674-4',4); +-- Insert into demo_fn_cssng_data values ('35948','180.000',360,'RICHMOND','NY',40.5590647,-74.1325833,'35948-4',4); +-- Insert into demo_fn_cssng_data values ('4882','120.000',65,'RICHMOND','NY',40.6051158,-74.0758564,'4882-4',4); +-- Insert into demo_fn_cssng_data values ('47005','250.000',65,'RICHMOND','NY',40.5790186,-74.1070464,'47005-6',6); +-- Insert into demo_fn_cssng_data values ('16385','165.000',65,'RICHMOND','NY',40.6188611,-74.1070556,'16385-3',3); +-- Insert into demo_fn_cssng_data values ('36368','270.000',65,'RICHMOND','NY',40.6113981,-74.0941436,'36368-4',4); +-- Insert into demo_fn_cssng_data values ('27796','270.000',65,'RICHMOND','NY',40.6380231,-74.1616575,'27796-5',5); +-- Insert into demo_fn_cssng_data values ('35946','270.000',64,'RICHMOND','NY',40.6361944,-74.1350325,'35946-5',5); +-- Insert into demo_fn_cssng_data values ('97408','270.000',null,'RICHMOND','NY',40.6396944,-74.1158889,'97408-4',4); +-- Insert into demo_fn_cssng_data values ('35012','0.000',360,'RICHMOND','NY',40.5407964,-74.17825,'35012-1',1); +-- Insert into demo_fn_cssng_data values ('35967','30.000',64,'RICHMOND','NY',40.5954214,-74.0908103,'35967-1',1); +-- Insert into demo_fn_cssng_data values ('36368','130.000',65,'RICHMOND','NY',40.6113981,-74.0941436,'36368-2',2); +-- Insert into demo_fn_cssng_data values ('14304','130.000',64,'RICHMOND','NY',40.5594306,-74.1634953,'14304-3',3); +-- Insert into demo_fn_cssng_data values ('98037','120.000',65,'RICHMOND','NY',40.6027917,-74.1758139,'98037-2',2); +-- Insert into demo_fn_cssng_data values ('5204',null,null,'RICHMOND','NY',40.5819631,-74.1619075,'5204-4',4); +-- Insert into demo_fn_cssng_data values ('35944',null,null,'RICHMOND','NY',40.5520786,-74.2183286,'35944-4',4); +-- Insert into demo_fn_cssng_data values ('4878',null,null,'RICHMOND','NY',40.5400647,-74.1483056,'4878-4',4); +-- Insert into demo_fn_cssng_data values ('97408',null,null,'RICHMOND','NY',40.6396944,-74.1158889,'97408-6',6); +-- Insert into demo_fn_cssng_data values ('5204','120.000',64,'RICHMOND','NY',40.5819631,-74.1619075,'5204-2',2); +-- Insert into demo_fn_cssng_data values ('49099','200.000',65,'RICHMOND','NY',40.5265092,-74.1798889,'49099-4',4); +-- Insert into demo_fn_cssng_data values ('35967','150.000',65,'RICHMOND','NY',40.5954214,-74.0908103,'35967-4',4); +-- Insert into demo_fn_cssng_data values ('4883','30.000',65,'RICHMOND','NY',40.6013056,-74.0669492,'4883-2',2); +-- Insert into demo_fn_cssng_data values ('35946','30.000',65,'RICHMOND','NY',40.6361944,-74.1350325,'35946-2',2); +-- Insert into demo_fn_cssng_data values ('47228','270.000',65,'RICHMOND','NY',40.580694,-74.130778,'47228-3',3); +-- Insert into demo_fn_cssng_data values ('35978','230.000',64,'RICHMOND','NY',40.6170186,-74.0754167,'35978-2',2); +-- Insert into demo_fn_cssng_data values ('35944','30.000',64,'RICHMOND','NY',40.5520786,-74.2183286,'35944-1',1); +-- Insert into demo_fn_cssng_data values ('47235','0.000',65,'RICHMOND','NY',40.5198981,-74.2265278,'47235-1',1); +-- Insert into demo_fn_cssng_data values ('49099','120.000',64,'RICHMOND','NY',40.5265092,-74.1798889,'49099-1',1); +-- Insert into demo_fn_cssng_data values ('97374','100.000',65,'RICHMOND','NY',40.5981,-74.11214,'97374-2',2); +-- Insert into demo_fn_cssng_data values ('97408','272.000',64,'RICHMOND','NY',40.6396944,-74.1158889,'97408-5',5); +-- Insert into demo_fn_cssng_data values ('50736','300.000',null,'RICHMOND','NY',40.6236297,-74.1715139,'50736-4',4); +-- Insert into demo_fn_cssng_data values ('5204','240.000',64,'RICHMOND','NY',40.5819631,-74.1619075,'5204-3',3); +-- Insert into demo_fn_cssng_data values ('4876','230.000',90,'RICHMOND','NY',40.5734119,-74.1361806,'4876-3',3); +-- Insert into demo_fn_cssng_data values ('35946','150.000',65,'RICHMOND','NY',40.6361944,-74.1350325,'35946-4',4); +-- Insert into demo_fn_cssng_data values ('4866','240.000',90,'RICHMOND','NY',40.6309028,-74.1249583,'4866-6',6); +-- Insert into demo_fn_cssng_data values ('48675','20.000',65,'RICHMOND','NY',40.5656389,-74.1414561,'48675-2',2); +-- Insert into demo_fn_cssng_data values ('35948',null,null,'RICHMOND','NY',40.5590647,-74.1325833,'35948-7',7); +-- Insert into demo_fn_cssng_data values ('48675',null,null,'RICHMOND','NY',40.5656389,-74.1414561,'48675-6',6); +-- Insert into demo_fn_cssng_data values ('35948','0.000',64,'RICHMOND','NY',40.5590647,-74.1325833,'35948-1',1); +-- Insert into demo_fn_cssng_data values ('14989','20.000',65,'RICHMOND','NY',40.6359397,-74.106125,'14989-2',2); +-- Insert into demo_fn_cssng_data values ('35971','350.000',64,'RICHMOND','NY',40.5520925,-74.1897408,'35971-3',3); +-- Insert into demo_fn_cssng_data values ('35948','250.000',64,'RICHMOND','NY',40.5590647,-74.1325833,'35948-5',5); +-- Insert into demo_fn_cssng_data values ('48675','220.000',65,'RICHMOND','NY',40.5656389,-74.1414561,'48675-5',5); +-- Insert into demo_fn_cssng_data values ('14992','270.000',90,'RICHMOND','NY',40.5440833,-74.162,'14992-5',5); +-- Insert into demo_fn_cssng_data values ('47006','280.000',65,'RICHMOND','NY',40.5093611,-74.2466853,'47006-6',6); +-- Insert into demo_fn_cssng_data values ('47097',null,null,'RICHMOND','NY',40.5980417,-74.1617869,'47097-7',7); +-- Insert into demo_fn_cssng_data values ('35967',null,null,'RICHMOND','NY',40.5954214,-74.0908103,'35967-7',7); +-- Insert into demo_fn_cssng_data values ('47006','50.000',65,'RICHMOND','NY',40.5093611,-74.2466853,'47006-2',2); +-- Insert into demo_fn_cssng_data values ('4866','120.000',90,'RICHMOND','NY',40.6309028,-74.1249583,'4866-4',4); +-- Insert into demo_fn_cssng_data values ('47006','200.000',65,'RICHMOND','NY',40.5093611,-74.2466853,'47006-4',4); +-- Insert into demo_fn_cssng_data values ('36361','350.000',64,'RICHMOND','NY',40.6260603,-74.0756297,'36361-3',3); +-- Insert into demo_fn_cssng_data values ('4883','30.000',64,'RICHMOND','NY',40.6013056,-74.0669492,'4883-1',1); +-- Insert into demo_fn_cssng_data values ('14304','30.000',64,'RICHMOND','NY',40.5594306,-74.1634953,'14304-1',1); +-- Insert into demo_fn_cssng_data values ('4878','0.000',90,'RICHMOND','NY',40.5400647,-74.1483056,'4878-1',1); +-- Insert into demo_fn_cssng_data values ('4866','0.000',65,'RICHMOND','NY',40.6309028,-74.1249583,'4866-1',1); +-- Insert into demo_fn_cssng_data values ('35946','30.000',64,'RICHMOND','NY',40.6361944,-74.1350325,'35946-1',1); +-- Insert into demo_fn_cssng_data values ('103137','10.000',65,'RICHMOND','NY',40.6146194,-74.0905056,'103137-2',2); +-- Insert into demo_fn_cssng_data values ('35944','150.000',64,'RICHMOND','NY',40.5520786,-74.2183286,'35944-2',2); +-- Insert into demo_fn_cssng_data values ('134407','230.000',64,'RICHMOND','NY',40.57295,-74.08762,'134407-2',2); +-- Insert into demo_fn_cssng_data values ('35948','180.000',64,'RICHMOND','NY',40.5590647,-74.1325833,'35948-3',3); +-- Insert into demo_fn_cssng_data values ('15623','0.000',64,'RICHMOND','NY',40.5324953,-74.1915278,'15623-1',1); +-- Insert into demo_fn_cssng_data values ('14992',null,null,'RICHMOND','NY',40.5440833,-74.162,'14992-7',7); +-- Insert into demo_fn_cssng_data values ('4801',null,null,'RICHMOND','NY',40.6126667,-74.1822269,'4801-5',5); +-- Insert into demo_fn_cssng_data values ('47097','190.000',65,'RICHMOND','NY',40.5980417,-74.1617869,'47097-4',4); +-- Insert into demo_fn_cssng_data values ('101680',null,null,'RICHMOND','NY',40.6119278,-74.0642444,'101680-4',4); +-- Insert into demo_fn_cssng_data values ('48674','250.000',null,'RICHMOND','NY',40.5602314,-74.1986528,'48674-3',3); +-- Insert into demo_fn_cssng_data values ('15623',null,null,'RICHMOND','NY',40.5324953,-74.1915278,'15623-6',6); +-- Insert into demo_fn_cssng_data values ('27796','270.000',85,'RICHMOND','NY',40.6380231,-74.1616575,'27796-6',6); +-- Insert into demo_fn_cssng_data values ('47235','0.000',null,'RICHMOND','NY',40.5198981,-74.2265278,'47235-2',2); +-- Insert into demo_fn_cssng_data values ('47235','120.000',null,'RICHMOND','NY',40.5198981,-74.2265278,'47235-4',4); +-- Insert into demo_fn_cssng_data values ('14299','10.000',65,'RICHMOND','NY',40.6348797,-74.0862083,'14299-1',1); +-- Insert into demo_fn_cssng_data values ('48675','90.000',65,'RICHMOND','NY',40.5656389,-74.1414561,'48675-4',4); +-- Insert into demo_fn_cssng_data values ('103136','0.000',65,'RICHMOND','NY',40.615945,-74.138723,'103136-1',1); +-- Insert into demo_fn_cssng_data values ('134407','30.000',64,'RICHMOND','NY',40.57295,-74.08762,'134407-1',1); +-- Insert into demo_fn_cssng_data values ('35977','0.000',65,'RICHMOND','NY',40.5954397,-74.0830369,'35977-1',1); +-- Insert into demo_fn_cssng_data values ('92812','220.000',65,'RICHMOND','NY',40.6138611,-74.1579719,'92812-2',2); +-- Insert into demo_fn_cssng_data values ('4800','120.000',91,'RICHMOND','NY',40.6083519,-74.1224353,'4800-3',3); +-- Insert into demo_fn_cssng_data values ('4869','270.000',65,'RICHMOND','NY',40.5127361,-74.2217778,'4869-4',4); +-- Insert into demo_fn_cssng_data values ('4876','230.000',91,'RICHMOND','NY',40.5734119,-74.1361806,'4876-4',4); +-- Insert into demo_fn_cssng_data values ('35967','270.000',64,'RICHMOND','NY',40.5954214,-74.0908103,'35967-5',5); +-- Insert into demo_fn_cssng_data values ('15623','25.000',64,'RICHMOND','NY',40.5324953,-74.1915278,'15623-2',2); +-- Insert into demo_fn_cssng_data values ('14989','260.000',64,'RICHMOND','NY',40.6359397,-74.106125,'14989-4',4); +-- Insert into demo_fn_cssng_data values ('35978',null,null,'RICHMOND','NY',40.6170186,-74.0754167,'35978-4',4); +-- Insert into demo_fn_cssng_data values ('14992','150.000',90,'RICHMOND','NY',40.5440833,-74.162,'14992-3',3); +-- Insert into demo_fn_cssng_data values ('47006','280.000',64,'RICHMOND','NY',40.5093611,-74.2466853,'47006-5',5); +-- Insert into demo_fn_cssng_data values ('16421','215.000',64,'RICHMOND','NY',40.5944167,-74.0625369,'16421-1',1); +-- Insert into demo_fn_cssng_data values ('47227','260.000',65,'RICHMOND','NY',40.6462036,-74.0907314,'47227-3',3); +-- Insert into demo_fn_cssng_data values ('15623','120.000',64,'RICHMOND','NY',40.5324953,-74.1915278,'15623-3',3); +-- Insert into demo_fn_cssng_data values ('134407','310.000',64,'RICHMOND','NY',40.57295,-74.08762,'134407-3',3); +-- Insert into demo_fn_cssng_data values ('4878','230.000',65,'RICHMOND','NY',40.5400647,-74.1483056,'4878-2',2); +-- Insert into demo_fn_cssng_data values ('100652','210.000',65,'RICHMOND','NY',40.5447861,-74.1817194,'100652-2',2); +-- Insert into demo_fn_cssng_data values ('48675','10.000',65,'RICHMOND','NY',40.5656389,-74.1414561,'48675-1',1); +-- Insert into demo_fn_cssng_data values ('4876','270.000',65,'RICHMOND','NY',40.5734119,-74.1361806,'4876-5',5); +-- Insert into demo_fn_cssng_data values ('5204','0.000',64,'RICHMOND','NY',40.5819631,-74.1619075,'5204-1',1); +-- Insert into demo_fn_cssng_data values ('4800','0.000',65,'RICHMOND','NY',40.6083519,-74.1224353,'4800-1',1); +-- Insert into demo_fn_cssng_data values ('47097','115.000',65,'RICHMOND','NY',40.5980417,-74.1617869,'47097-2',2); +-- Insert into demo_fn_cssng_data values ('16424','130.000',91,'RICHMOND','NY',40.6053381,-74.1506158,'16424-2',2); +-- Insert into demo_fn_cssng_data values ('98037','220.000',65,'RICHMOND','NY',40.6027917,-74.1758139,'98037-3',3); +-- Insert into demo_fn_cssng_data values ('4869','20.000',65,'RICHMOND','NY',40.5127361,-74.2217778,'4869-1',1); +-- Insert into demo_fn_cssng_data values ('14992','150.000',91,'RICHMOND','NY',40.5440833,-74.162,'14992-4',4); + +-- demo_fn_e911_lte_template +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',35946,40.63617,-74.13501,'GPS',10097693,null,null,'NWL03584','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.63612,-74.13485,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03584',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',35966,40.549613,-74.150438,'Sector',10075383,null,null,'NWL03745','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.549622,-74.15043,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03745',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',47225,40.535961,-74.180031,'GPS',10108315,null,null,'NWL01133','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.535961,-74.180031,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL01133',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',47227,40.646197,-74.090761,'GPS',10105066,null,null,'NWL01140','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.646197,-74.090761,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL01140',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',14989,40.635962,-74.106137,'Sector',10075432,'2013 NYC NYC IF','SC 1','NWL03194',null,'NOT ON AIR','NOT ON AIR INCLUDE IN SCORECARDS',0,null,0,null,null,40.635962,-74.106137,'Northeast','New York City','NYC/NNJ',null,'2013-04-03','NYNYU3194',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',14299,40.634847,-74.086345,'Sector',10075371,null,null,'NWL03062','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.63488,-74.086242,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03062',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',47097,40.598029,-74.161815,'Sector',10075357,null,null,'NWL03196','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.598061,-74.161888,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03196',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',47005,40.579004,-74.107064,'Sector',10105063,null,null,'NWL03734','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.579002,-74.107075,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03734',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',35977,40.595429,-74.083038,'Sector',10075355,null,null,'NWL03607','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.59541,-74.08309,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03607',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4869,40.51273,-74.22179,'Sector',10075379,null,null,'NWL04853','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.512735,-74.221798,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL04853',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',50736,40.62375,-74.171425,'GPS',10107998,null,null,'NWL05139','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.62375,-74.171425,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL05139',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',36368,40.611414,-74.094157,'Sector',10105872,null,null,'NWL05312','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.611396,-74.094161,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL05312',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',16424,40.60531,-74.15066,'GPS',10075476,'2013 NYC NYC IF','SC 1','NWL03061',null,'NOT ON AIR','NOT ON AIR INCLUDE IN SCORECARDS',0,null,0,null,null,40.605299,-74.15041,'Northeast','New York City','NYC/NNJ',null,'2013-04-03','NYNYU3061',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',35012,40.540794,-74.178253,'Sector',10075484,null,null,'NWL03059','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.540786,-74.178262,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03059',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4796,40.517221,-74.196297,'Sector',10075348,'2013 NYC NYC IF','SC 1','NWL03333',null,'NOT ON AIR','NOT ON AIR INCLUDE IN SCORECARDS',0,null,0,null,null,40.517221,-74.196297,'Northeast','New York City','NYC/NNJ',null,'2013-04-03','NYNYU3333',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4801,40.612641,-74.18229,'GPS',10075211,null,null,'NWL03089','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.6126,-74.1823,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03089',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',98037,40.602815,-74.17586,'GPS',10112093,null,null,'NWL05294','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.602805,-74.175846,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL05294',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',35948,40.559076,-74.132586,'Sector',10074217,null,null,'NWL00187','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.559064,-74.132575,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL00187',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',35971,40.552092,-74.189733,'Sector',10073895,null,null,'NWL03657','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.552089,-74.189742,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03657',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',36280,40.644744,-74.07616,'Sector',10075349,null,null,'NWL03650','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.64472,-74.076166,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03650',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',100652,40.544914,-74.181428,'Sector',10114523,'2013 NYC NYC IF','SC 1','NWL03368',null,'NOT ON AIR','NOT ON AIR INCLUDE IN SCORECARDS',0,null,0,null,null,40.544914,-74.181428,'Northeast','New York City','NYC/NNJ',null,'2013-04-03','NYCWU3368',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',14304,40.559443,-74.163518,'Sector',10075173,null,null,'NWL03058','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.559443,-74.16351,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03058',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4866,40.630895,-74.124977,'Sector',10075256,null,null,'NWL03772','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.630907,-74.124984,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03772',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4876,40.57341,-74.13618,'GPS',10108312,null,null,'NWL03063','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.573386,-74.136162,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03063',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4882,40.60512,-74.075871,'Sector',10074345,null,null,'NWL03418','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.605088,-74.07589,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03418',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',35967,40.595374,-74.090791,'Sector',10097692,null,null,'NWL06248','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.595393,-74.090797,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL06248',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',88313,40.590511,-74.134287,'GPS',10110398,null,null,'NWL06141','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.590527,-74.134268,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL06141',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',92812,40.613431,-74.15779,'GPS',10114757,null,null,'NWL03163','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.61348,-74.15785,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03163',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',97408,40.639739,-74.115838,'Sector',10112084,null,null,'NWL00292','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.639745,-74.115841,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL00292',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',27796,40.638041,-74.161675,'Sector',10074271,null,null,'NWL03255',null,'COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.638031,-74.161683,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03255',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4800,40.608349,-74.122451,'Sector',10074076,null,null,'NWL03419','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.60828,-74.122476,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03419',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',15623,40.5325,-74.19155,'Sector',10075166,null,null,'NWL03392','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.532507,-74.191501,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03392',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',16385,40.618851,-74.107061,'GPS',10074859,null,null,'NWL03060','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.618859,-74.107073,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03060',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4883,40.601325,-74.066993,'Sector',10075402,null,null,'NWL03289','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.601295,-74.066971,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03289',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4797,40.537138,-74.236743,'GPS',10074822,null,null,'NWL03082','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.537155,-74.236716,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03082',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',5204,40.581959,-74.161913,'Sector',10075235,null,null,'NWL03380','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.581959,-74.16191,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03380',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',103136,40.616,-74.13866,'GPS',10114518,null,null,'NWL05373',null,'NOT ON AIR','NOT ON AIR INCLUDE IN SCORECARDS',0,null,0,null,null,40.616,-74.13866,'Northeast','New York City','NYC/NNJ',null,'2013-04-03','NYCWU5373',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',14992,40.544202,-74.161766,'Sector',10073913,null,null,'NWL03522','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.544192,-74.161721,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03522',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',47226,40.537141,-74.236832,'GPS',10110076,null,null,'NWL00135','Prior to 2013','NOT ON AIR','NOT ON AIR INCLUDE IN SCORECARDS',0,null,0,null,null,40.543417,-74.207497,'Northeast','New York City','NYC/NNJ',null,'2013-04-03','NYCWU9135',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',47235,40.519885,-74.226568,'GPS',10108313,null,null,'NWL05134','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.519896,-74.226557,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL05134',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',46861,40.586091,-74.194253,'GPS',10108314,null,null,'NWL03343','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.58604,-74.194281,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03343',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',49099,40.52651,-74.17989,'Sector',10111935,null,null,'NWL05136','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.526486,-74.179878,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL05136',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4877,40.52955,-74.16179,'Sector',10073915,null,null,'NWL05064','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.529538,-74.161761,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL05064',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',97374,40.601342,-74.108511,'GPS',10114515,null,null,'NWL00376','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.601374,-74.108498,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL00376',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',35799,40.626708,-74.158569,'Sector',10105064,null,null,'NWL00330','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.626711,-74.15856,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL00330',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4798,40.567372,-74.10915,'GPS',10074996,null,null,'NWL03278','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.567377,-74.109147,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03278',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',48674,40.56023,-74.19868,'Sector',10107116,null,null,'NWL05138','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.560229,-74.198682,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL05138',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4880,40.561903,-74.186299,'Sector',10075222,null,null,'NWL03157','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.561861,-74.186269,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03157',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',35978,40.617011,-74.07541,'Sector',10075376,null,null,'NWL03510','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.617014,-74.075409,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03510',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',103137,40.6148,-74.09081,'Sector',10114521,null,null,'NWL04370','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.61481,-74.09077,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL04370',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',101680,40.611769,-74.064113,'Sector',10127992,null,null,'NWL06186','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.61179,-74.064091,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL06186',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',86075,40.61228,-74.08278,'GPS',10112121,null,null,'NWL04270','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.612278,-74.082755,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL04270',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',48675,40.572841,-74.11756,'GPS',10112794,null,null,'NWL01137','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.57279,-74.11739,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL01137',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',47006,40.509363,-74.246687,'Sector',10075356,null,null,'NWL03759','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.509375,-74.246691,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03759',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',36361,40.626045,-74.075658,'Sector',10108316,null,null,'NWL03585','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.626044,-74.07564,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03585',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',35944,40.552082,-74.218345,'Sector',10097682,null,null,'NWL03280','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.552071,-74.218339,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03280',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',118015,40.59206,-74.15411,'GPS',10111607,null,null,null,null,'NOT IN OSS FOR LTE','NOT ON AIR INCLUDE IN SCORECARDS',0,null,0,null,null,40.560373,-74.144111,'Northeast','New York City','NYC/NNJ',null,'2013-04-03','NYCWU5931',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',4878,40.540061,-74.148311,'Sector',10105065,null,null,'NWL03065','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.540056,-74.148307,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03065',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',126659,40.5815444,-74.1660111,'Structure',10553877,null,null,'NWL01387',null,'COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,null,null,40.58154,-74.16601,'Northeast','New York City','NYC/NNJ','2013-02-01','2013-04-03','NYCWU1387',null); +-- Insert into demo_fn_e911_lte_template values ('NORTHEAST','NYC','NYC/NNJ',16421,40.594361,-74.06251,'GPS',10097685,null,null,'NWL03251','Prior to 2013','COMMERCIALLY ACTIVE','ON AIR INCLUDE IN SCORECARDS',0,null,0,'Alcatel-Lucent',null,40.59438,-74.06264,'Northeast','New York City','NYC/NNJ','2012-12-31','2013-04-03','NWL03251',null); + + +-- fn_app +-- Use name "DMAAP-BC-APP" (originally "Default") +Insert into fn_app (APP_ID,APP_NAME,APP_IMAGE_URL,APP_DESCRIPTION,APP_NOTES,APP_URL,APP_ALTERNATE_URL,APP_REST_ENDPOINT,ML_APP_NAME,ML_APP_ADMIN_ID,MOTS_ID,APP_PASSWORD,OPEN,ENABLED,THUMBNAIL,APP_USERNAME,UEB_KEY,UEB_SECRET,UEB_TOPIC_NAME) VALUES (1,'DMAAP-BC-APP','assets/images/tmp/portal1.png','Some Default Description','Some Default Note','','',null,'ECPP','?','1','okYTaDrhzibcbGVq5mjkVQ==','N','N',null,'Default',null,null,'ECOMP-PORTAL-INBOX'); + +-- fn_user_role +Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (1,1,null,1); + +-- DEMO_BAR_CHART +-- Insert into demo_bar_chart (label, value) values ('A', 29.765957771107); +-- Insert into demo_bar_chart (label, value) values ('B', 0); +-- Insert into demo_bar_chart (label, value) values ('C', 32.807804682612); +-- Insert into demo_bar_chart (label, value) values ('D', 196.45946739256); +-- Insert into demo_bar_chart (label, value) values ('E', 0.19434030906893); +-- Insert into demo_bar_chart (label, value) values ('F', 98.079782601442); +-- Insert into demo_bar_chart (label, value) values ('G', 13.925743130903); +-- Insert into demo_bar_chart (label, value) values ('H', 5.1387322875705); + +-- DEMO_BAR_CHART_INTER +-- Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('6-Mar-13','%e-%b-%y'), 198, 220); +-- Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('5-Mar-13','%e-%b-%y'), 198, 220); +-- Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('4-Mar-13','%e-%b-%y'), 238, 235); +-- Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('3-Mar-13','%e-%b-%y'), 238, 235); +-- Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('2-Mar-13','%e-%b-%y'), 256, 275); +-- Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('1-Mar-13','%e-%b-%y'), 239, 260); +-- Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('28-Feb-13','%e-%b-%y'), 247, 255); +-- Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('27-Feb-13','%e-%b-%y'), 252, 265); +-- Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('26-Feb-13','%e-%b-%y'), 198, 220); + +-- DEMO_LINE_CHART +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-May-12','%e-%b-%y'),582.13); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Apr-12','%e-%b-%y'),583.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('27-Apr-12','%e-%b-%y'),603); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Apr-12','%e-%b-%y'),607.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Apr-12','%e-%b-%y'),610); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Apr-12','%e-%b-%y'),560.28); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Apr-12','%e-%b-%y'),571.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Apr-12','%e-%b-%y'),572.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('19-Apr-12','%e-%b-%y'),587.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Apr-12','%e-%b-%y'),608.34); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Apr-12','%e-%b-%y'),609.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Apr-12','%e-%b-%y'),580.13); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Apr-12','%e-%b-%y'),605.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Apr-12','%e-%b-%y'),622.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Apr-12','%e-%b-%y'),626.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Apr-12','%e-%b-%y'),628.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Apr-12','%e-%b-%y'),636.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Apr-12','%e-%b-%y'),633.68); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Apr-12','%e-%b-%y'),624.31); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Apr-12','%e-%b-%y'),629.32); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('2-Apr-12','%e-%b-%y'),618.63); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Mar-12','%e-%b-%y'),599.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Mar-12','%e-%b-%y'),609.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Mar-12','%e-%b-%y'),617.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Mar-12','%e-%b-%y'),614.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Mar-12','%e-%b-%y'),606.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('23-Mar-12','%e-%b-%y'),596.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Mar-12','%e-%b-%y'),599.34); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Mar-12','%e-%b-%y'),602.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Mar-12','%e-%b-%y'),605.96); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Mar-12','%e-%b-%y'),601.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Mar-12','%e-%b-%y'),585.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('15-Mar-12','%e-%b-%y'),585.56); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Mar-12','%e-%b-%y'),589.58); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Mar-12','%e-%b-%y'),568.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Mar-12','%e-%b-%y'),552); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Mar-12','%e-%b-%y'),545.17); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Mar-12','%e-%b-%y'),541.99); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('7-Mar-12','%e-%b-%y'),530.69); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Mar-12','%e-%b-%y'),530.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Mar-12','%e-%b-%y'),533.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Mar-12','%e-%b-%y'),545.18); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Mar-12','%e-%b-%y'),544.47); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Feb-12','%e-%b-%y'),542.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Feb-12','%e-%b-%y'),535.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Feb-12','%e-%b-%y'),525.76); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Feb-12','%e-%b-%y'),522.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Feb-12','%e-%b-%y'),516.39); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Feb-12','%e-%b-%y'),513.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Feb-12','%e-%b-%y'),514.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Feb-12','%e-%b-%y'),502.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Feb-12','%e-%b-%y'),502.21); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Feb-12','%e-%b-%y'),497.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Feb-12','%e-%b-%y'),509.46); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Feb-12','%e-%b-%y'),502.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Feb-12','%e-%b-%y'),493.42); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Feb-12','%e-%b-%y'),493.17); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Feb-12','%e-%b-%y'),476.68); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Feb-12','%e-%b-%y'),468.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Feb-12','%e-%b-%y'),463.97); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Feb-12','%e-%b-%y'),459.68); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Feb-12','%e-%b-%y'),455.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Feb-12','%e-%b-%y'),456.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Jan-12','%e-%b-%y'),456.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Jan-12','%e-%b-%y'),453.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jan-12','%e-%b-%y'),447.28); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Jan-12','%e-%b-%y'),444.63); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Jan-12','%e-%b-%y'),446.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Jan-12','%e-%b-%y'),420.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Jan-12','%e-%b-%y'),427.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Jan-12','%e-%b-%y'),420.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Jan-12','%e-%b-%y'),427.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Jan-12','%e-%b-%y'),429.11); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jan-12','%e-%b-%y'),424.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('13-Jan-12','%e-%b-%y'),419.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Jan-12','%e-%b-%y'),421.39); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Jan-12','%e-%b-%y'),422.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Jan-12','%e-%b-%y'),423.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Jan-12','%e-%b-%y'),421.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Jan-12','%e-%b-%y'),422.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Jan-12','%e-%b-%y'),418.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Jan-12','%e-%b-%y'),413.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Jan-12','%e-%b-%y'),411.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Dec-11','%e-%b-%y'),405); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Dec-11','%e-%b-%y'),405.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Dec-11','%e-%b-%y'),402.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('27-Dec-11','%e-%b-%y'),406.53); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Dec-11','%e-%b-%y'),403.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Dec-11','%e-%b-%y'),398.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Dec-11','%e-%b-%y'),396.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Dec-11','%e-%b-%y'),395.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Dec-11','%e-%b-%y'),382.21); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Dec-11','%e-%b-%y'),381.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Dec-11','%e-%b-%y'),378.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Dec-11','%e-%b-%y'),380.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Dec-11','%e-%b-%y'),388.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Dec-11','%e-%b-%y'),391.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Dec-11','%e-%b-%y'),393.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Dec-11','%e-%b-%y'),390.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Dec-11','%e-%b-%y'),389.09); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Dec-11','%e-%b-%y'),390.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Dec-11','%e-%b-%y'),393.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Dec-11','%e-%b-%y'),389.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Dec-11','%e-%b-%y'),387.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('30-Nov-11','%e-%b-%y'),382.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Nov-11','%e-%b-%y'),373.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Nov-11','%e-%b-%y'),376.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Nov-11','%e-%b-%y'),363.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Nov-11','%e-%b-%y'),366.99); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Nov-11','%e-%b-%y'),376.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Nov-11','%e-%b-%y'),369.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Nov-11','%e-%b-%y'),374.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Nov-11','%e-%b-%y'),377.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Nov-11','%e-%b-%y'),384.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Nov-11','%e-%b-%y'),388.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Nov-11','%e-%b-%y'),379.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Nov-11','%e-%b-%y'),384.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Nov-11','%e-%b-%y'),385.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Nov-11','%e-%b-%y'),395.28); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Nov-11','%e-%b-%y'),406.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Nov-11','%e-%b-%y'),399.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Nov-11','%e-%b-%y'),400.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('3-Nov-11','%e-%b-%y'),403.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Nov-11','%e-%b-%y'),397.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Nov-11','%e-%b-%y'),396.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Oct-11','%e-%b-%y'),404.78); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Oct-11','%e-%b-%y'),404.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Oct-11','%e-%b-%y'),404.69); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('26-Oct-11','%e-%b-%y'),400.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Oct-11','%e-%b-%y'),397.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Oct-11','%e-%b-%y'),405.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Oct-11','%e-%b-%y'),392.87); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Oct-11','%e-%b-%y'),395.31); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Oct-11','%e-%b-%y'),398.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('18-Oct-11','%e-%b-%y'),422.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Oct-11','%e-%b-%y'),419.99); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Oct-11','%e-%b-%y'),422); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Oct-11','%e-%b-%y'),408.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Oct-11','%e-%b-%y'),402.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Oct-11','%e-%b-%y'),400.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Oct-11','%e-%b-%y'),388.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Oct-11','%e-%b-%y'),369.8); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Oct-11','%e-%b-%y'),377.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Oct-11','%e-%b-%y'),378.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Oct-11','%e-%b-%y'),372.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Oct-11','%e-%b-%y'),374.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('30-Sep-11','%e-%b-%y'),381.32); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Sep-11','%e-%b-%y'),390.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Sep-11','%e-%b-%y'),397.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Sep-11','%e-%b-%y'),399.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Sep-11','%e-%b-%y'),403.17); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Sep-11','%e-%b-%y'),404.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('22-Sep-11','%e-%b-%y'),401.82); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Sep-11','%e-%b-%y'),412.14); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Sep-11','%e-%b-%y'),413.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Sep-11','%e-%b-%y'),411.63); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Sep-11','%e-%b-%y'),400.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Sep-11','%e-%b-%y'),392.96); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('14-Sep-11','%e-%b-%y'),389.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Sep-11','%e-%b-%y'),384.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Sep-11','%e-%b-%y'),379.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Sep-11','%e-%b-%y'),377.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Sep-11','%e-%b-%y'),384.14); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Sep-11','%e-%b-%y'),383.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('6-Sep-11','%e-%b-%y'),379.74); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Sep-11','%e-%b-%y'),374.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Sep-11','%e-%b-%y'),381.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Aug-11','%e-%b-%y'),384.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Aug-11','%e-%b-%y'),389.99); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Aug-11','%e-%b-%y'),389.97); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('26-Aug-11','%e-%b-%y'),383.58); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Aug-11','%e-%b-%y'),373.72); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Aug-11','%e-%b-%y'),376.18); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Aug-11','%e-%b-%y'),373.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Aug-11','%e-%b-%y'),356.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Aug-11','%e-%b-%y'),356.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('18-Aug-11','%e-%b-%y'),366.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Aug-11','%e-%b-%y'),380.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Aug-11','%e-%b-%y'),380.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Aug-11','%e-%b-%y'),383.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Aug-11','%e-%b-%y'),376.99); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Aug-11','%e-%b-%y'),373.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Aug-11','%e-%b-%y'),363.69); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Aug-11','%e-%b-%y'),374.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Aug-11','%e-%b-%y'),353.21); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Aug-11','%e-%b-%y'),373.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Aug-11','%e-%b-%y'),377.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Aug-11','%e-%b-%y'),392.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('2-Aug-11','%e-%b-%y'),388.91); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Aug-11','%e-%b-%y'),396.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Jul-11','%e-%b-%y'),390.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jul-11','%e-%b-%y'),391.82); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Jul-11','%e-%b-%y'),392.59); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Jul-11','%e-%b-%y'),403.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Jul-11','%e-%b-%y'),398.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jul-11','%e-%b-%y'),393.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Jul-11','%e-%b-%y'),387.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Jul-11','%e-%b-%y'),386.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Jul-11','%e-%b-%y'),376.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Jul-11','%e-%b-%y'),373.8); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('15-Jul-11','%e-%b-%y'),364.92); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Jul-11','%e-%b-%y'),357.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Jul-11','%e-%b-%y'),358.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Jul-11','%e-%b-%y'),353.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Jul-11','%e-%b-%y'),354); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Jul-11','%e-%b-%y'),359.71); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('7-Jul-11','%e-%b-%y'),357.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Jul-11','%e-%b-%y'),351.76); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Jul-11','%e-%b-%y'),349.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jul-11','%e-%b-%y'),343.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Jun-11','%e-%b-%y'),335.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Jun-11','%e-%b-%y'),334.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Jun-11','%e-%b-%y'),335.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jun-11','%e-%b-%y'),332.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Jun-11','%e-%b-%y'),326.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Jun-11','%e-%b-%y'),331.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Jun-11','%e-%b-%y'),322.61); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Jun-11','%e-%b-%y'),325.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-Jun-11','%e-%b-%y'),315.32); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jun-11','%e-%b-%y'),320.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Jun-11','%e-%b-%y'),325.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Jun-11','%e-%b-%y'),326.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Jun-11','%e-%b-%y'),332.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Jun-11','%e-%b-%y'),326.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Jun-11','%e-%b-%y'),325.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jun-11','%e-%b-%y'),331.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Jun-11','%e-%b-%y'),332.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Jun-11','%e-%b-%y'),332.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Jun-11','%e-%b-%y'),338.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Jun-11','%e-%b-%y'),343.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('2-Jun-11','%e-%b-%y'),346.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jun-11','%e-%b-%y'),345.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-May-11','%e-%b-%y'),347.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-May-11','%e-%b-%y'),337.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-May-11','%e-%b-%y'),335); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-May-11','%e-%b-%y'),336.78); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-May-11','%e-%b-%y'),332.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-May-11','%e-%b-%y'),334.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-May-11','%e-%b-%y'),335.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-May-11','%e-%b-%y'),340.53); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-May-11','%e-%b-%y'),339.87); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-May-11','%e-%b-%y'),336.14); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-May-11','%e-%b-%y'),333.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-May-11','%e-%b-%y'),340.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-May-11','%e-%b-%y'),346.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-May-11','%e-%b-%y'),347.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-May-11','%e-%b-%y'),349.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-May-11','%e-%b-%y'),347.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('6-May-11','%e-%b-%y'),346.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-May-11','%e-%b-%y'),346.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-May-11','%e-%b-%y'),349.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-May-11','%e-%b-%y'),348.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-May-11','%e-%b-%y'),346.28); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Apr-11','%e-%b-%y'),350.13); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Apr-11','%e-%b-%y'),346.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Apr-11','%e-%b-%y'),350.15); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Apr-11','%e-%b-%y'),350.42); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Apr-11','%e-%b-%y'),353.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Apr-11','%e-%b-%y'),350.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Apr-11','%e-%b-%y'),342.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('19-Apr-11','%e-%b-%y'),337.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Apr-11','%e-%b-%y'),331.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Apr-11','%e-%b-%y'),327.46); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Apr-11','%e-%b-%y'),332.42); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Apr-11','%e-%b-%y'),336.13); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Apr-11','%e-%b-%y'),332.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Apr-11','%e-%b-%y'),330.8); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Apr-11','%e-%b-%y'),335.06); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Apr-11','%e-%b-%y'),338.08); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Apr-11','%e-%b-%y'),338.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Apr-11','%e-%b-%y'),338.89); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Apr-11','%e-%b-%y'),341.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Apr-11','%e-%b-%y'),344.56); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Mar-11','%e-%b-%y'),348.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Mar-11','%e-%b-%y'),348.63); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Mar-11','%e-%b-%y'),350.96); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Mar-11','%e-%b-%y'),350.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Mar-11','%e-%b-%y'),351.54); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Mar-11','%e-%b-%y'),344.97); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Mar-11','%e-%b-%y'),339.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Mar-11','%e-%b-%y'),341.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Mar-11','%e-%b-%y'),339.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Mar-11','%e-%b-%y'),330.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Mar-11','%e-%b-%y'),334.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Mar-11','%e-%b-%y'),330.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Mar-11','%e-%b-%y'),345.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Mar-11','%e-%b-%y'),353.56); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Mar-11','%e-%b-%y'),351.99); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Mar-11','%e-%b-%y'),346.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Mar-11','%e-%b-%y'),352.47); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Mar-11','%e-%b-%y'),355.76); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Mar-11','%e-%b-%y'),355.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Mar-11','%e-%b-%y'),360); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Mar-11','%e-%b-%y'),359.56); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Mar-11','%e-%b-%y'),352.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Mar-11','%e-%b-%y'),349.31); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Feb-11','%e-%b-%y'),353.21); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Feb-11','%e-%b-%y'),348.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Feb-11','%e-%b-%y'),342.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Feb-11','%e-%b-%y'),342.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Feb-11','%e-%b-%y'),338.61); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Feb-11','%e-%b-%y'),350.56); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Feb-11','%e-%b-%y'),358.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Feb-11','%e-%b-%y'),363.13); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Feb-11','%e-%b-%y'),359.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Feb-11','%e-%b-%y'),359.18); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Feb-11','%e-%b-%y'),356.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Feb-11','%e-%b-%y'),354.54); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Feb-11','%e-%b-%y'),358.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Feb-11','%e-%b-%y'),355.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Feb-11','%e-%b-%y'),351.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Feb-11','%e-%b-%y'),346.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Feb-11','%e-%b-%y'),343.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Feb-11','%e-%b-%y'),344.32); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Feb-11','%e-%b-%y'),345.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Jan-11','%e-%b-%y'),339.32); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Jan-11','%e-%b-%y'),336.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jan-11','%e-%b-%y'),343.21); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Jan-11','%e-%b-%y'),343.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Jan-11','%e-%b-%y'),341.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Jan-11','%e-%b-%y'),337.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Jan-11','%e-%b-%y'),326.72); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Jan-11','%e-%b-%y'),332.68); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Jan-11','%e-%b-%y'),338.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Jan-11','%e-%b-%y'),340.65); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Jan-11','%e-%b-%y'),348.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('13-Jan-11','%e-%b-%y'),345.68); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Jan-11','%e-%b-%y'),344.42); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Jan-11','%e-%b-%y'),341.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Jan-11','%e-%b-%y'),342.46); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Jan-11','%e-%b-%y'),336.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Jan-11','%e-%b-%y'),333.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Jan-11','%e-%b-%y'),334); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Jan-11','%e-%b-%y'),331.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Jan-11','%e-%b-%y'),329.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Dec-10','%e-%b-%y'),322.56); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Dec-10','%e-%b-%y'),323.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Dec-10','%e-%b-%y'),325.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Dec-10','%e-%b-%y'),325.47); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Dec-10','%e-%b-%y'),324.68); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Dec-10','%e-%b-%y'),323.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Dec-10','%e-%b-%y'),325.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Dec-10','%e-%b-%y'),324.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Dec-10','%e-%b-%y'),322.21); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Dec-10','%e-%b-%y'),320.61); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Dec-10','%e-%b-%y'),321.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Dec-10','%e-%b-%y'),320.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Dec-10','%e-%b-%y'),320.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Dec-10','%e-%b-%y'),321.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Dec-10','%e-%b-%y'),320.56); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Dec-10','%e-%b-%y'),319.76); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Dec-10','%e-%b-%y'),321.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Dec-10','%e-%b-%y'),318.21); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Dec-10','%e-%b-%y'),320.15); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Dec-10','%e-%b-%y'),317.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Dec-10','%e-%b-%y'),318.15); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Dec-10','%e-%b-%y'),316.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Nov-10','%e-%b-%y'),311.15); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Nov-10','%e-%b-%y'),316.87); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Nov-10','%e-%b-%y'),315); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Nov-10','%e-%b-%y'),314.8); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Nov-10','%e-%b-%y'),308.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('22-Nov-10','%e-%b-%y'),313.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Nov-10','%e-%b-%y'),306.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Nov-10','%e-%b-%y'),308.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Nov-10','%e-%b-%y'),300.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Nov-10','%e-%b-%y'),301.59); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Nov-10','%e-%b-%y'),307.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-Nov-10','%e-%b-%y'),308.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Nov-10','%e-%b-%y'),316.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Nov-10','%e-%b-%y'),318.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Nov-10','%e-%b-%y'),316.08); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Nov-10','%e-%b-%y'),318.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Nov-10','%e-%b-%y'),317.13); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-Nov-10','%e-%b-%y'),318.27); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Nov-10','%e-%b-%y'),312.8); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Nov-10','%e-%b-%y'),309.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Nov-10','%e-%b-%y'),304.18); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Oct-10','%e-%b-%y'),300.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Oct-10','%e-%b-%y'),305.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('27-Oct-10','%e-%b-%y'),307.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Oct-10','%e-%b-%y'),308.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Oct-10','%e-%b-%y'),308.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Oct-10','%e-%b-%y'),307.47); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Oct-10','%e-%b-%y'),309.52); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Oct-10','%e-%b-%y'),310.53); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('19-Oct-10','%e-%b-%y'),309.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Oct-10','%e-%b-%y'),318); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Oct-10','%e-%b-%y'),314.74); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Oct-10','%e-%b-%y'),302.31); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Oct-10','%e-%b-%y'),300.14); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Oct-10','%e-%b-%y'),298.54); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Oct-10','%e-%b-%y'),295.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Oct-10','%e-%b-%y'),294.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Oct-10','%e-%b-%y'),289.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Oct-10','%e-%b-%y'),289.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Oct-10','%e-%b-%y'),288.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Oct-10','%e-%b-%y'),278.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Oct-10','%e-%b-%y'),282.52); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Sep-10','%e-%b-%y'),283.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Sep-10','%e-%b-%y'),287.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Sep-10','%e-%b-%y'),286.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Sep-10','%e-%b-%y'),291.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Sep-10','%e-%b-%y'),292.32); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('23-Sep-10','%e-%b-%y'),288.92); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Sep-10','%e-%b-%y'),287.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Sep-10','%e-%b-%y'),283.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Sep-10','%e-%b-%y'),283.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Sep-10','%e-%b-%y'),275.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Sep-10','%e-%b-%y'),276.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('15-Sep-10','%e-%b-%y'),270.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Sep-10','%e-%b-%y'),268.06); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Sep-10','%e-%b-%y'),267.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Sep-10','%e-%b-%y'),263.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Sep-10','%e-%b-%y'),263.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Sep-10','%e-%b-%y'),262.92); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('7-Sep-10','%e-%b-%y'),257.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Sep-10','%e-%b-%y'),258.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Sep-10','%e-%b-%y'),258.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Sep-10','%e-%b-%y'),252.17); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Sep-10','%e-%b-%y'),250.33); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Aug-10','%e-%b-%y'),243.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('30-Aug-10','%e-%b-%y'),242.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Aug-10','%e-%b-%y'),241.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Aug-10','%e-%b-%y'),240.28); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Aug-10','%e-%b-%y'),242.89); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Aug-10','%e-%b-%y'),239.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Aug-10','%e-%b-%y'),245.8); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-Aug-10','%e-%b-%y'),249.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Aug-10','%e-%b-%y'),249.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Aug-10','%e-%b-%y'),253.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Aug-10','%e-%b-%y'),251.97); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Aug-10','%e-%b-%y'),247.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Aug-10','%e-%b-%y'),249.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-Aug-10','%e-%b-%y'),251.79); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Aug-10','%e-%b-%y'),250.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Aug-10','%e-%b-%y'),259.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Aug-10','%e-%b-%y'),261.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Aug-10','%e-%b-%y'),260.09); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Aug-10','%e-%b-%y'),261.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-Aug-10','%e-%b-%y'),262.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Aug-10','%e-%b-%y'),261.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Aug-10','%e-%b-%y'),261.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Jul-10','%e-%b-%y'),257.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Jul-10','%e-%b-%y'),258.11); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jul-10','%e-%b-%y'),260.96); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('27-Jul-10','%e-%b-%y'),264.08); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Jul-10','%e-%b-%y'),259.28); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Jul-10','%e-%b-%y'),259.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jul-10','%e-%b-%y'),259.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Jul-10','%e-%b-%y'),254.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Jul-10','%e-%b-%y'),251.89); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('19-Jul-10','%e-%b-%y'),245.58); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Jul-10','%e-%b-%y'),249.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Jul-10','%e-%b-%y'),251.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Jul-10','%e-%b-%y'),252.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Jul-10','%e-%b-%y'),251.8); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Jul-10','%e-%b-%y'),257.28); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Jul-10','%e-%b-%y'),259.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Jul-10','%e-%b-%y'),258.09); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Jul-10','%e-%b-%y'),258.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Jul-10','%e-%b-%y'),248.63); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Jul-10','%e-%b-%y'),246.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Jul-10','%e-%b-%y'),246.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Jul-10','%e-%b-%y'),248.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Jun-10','%e-%b-%y'),251.53); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Jun-10','%e-%b-%y'),256.17); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jun-10','%e-%b-%y'),268.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Jun-10','%e-%b-%y'),266.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Jun-10','%e-%b-%y'),269); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('23-Jun-10','%e-%b-%y'),270.97); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jun-10','%e-%b-%y'),273.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Jun-10','%e-%b-%y'),270.17); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Jun-10','%e-%b-%y'),274.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Jun-10','%e-%b-%y'),271.87); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Jun-10','%e-%b-%y'),267.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('15-Jun-10','%e-%b-%y'),259.69); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Jun-10','%e-%b-%y'),254.28); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Jun-10','%e-%b-%y'),253.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Jun-10','%e-%b-%y'),250.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Jun-10','%e-%b-%y'),243.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Jun-10','%e-%b-%y'),249.33); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('7-Jun-10','%e-%b-%y'),250.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Jun-10','%e-%b-%y'),255.96); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Jun-10','%e-%b-%y'),263.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Jun-10','%e-%b-%y'),263.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Jun-10','%e-%b-%y'),260.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-May-10','%e-%b-%y'),256.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-May-10','%e-%b-%y'),256.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-May-10','%e-%b-%y'),253.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-May-10','%e-%b-%y'),244.11); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-May-10','%e-%b-%y'),245.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-May-10','%e-%b-%y'),246.76); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-May-10','%e-%b-%y'),242.32); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-May-10','%e-%b-%y'),237.76); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-May-10','%e-%b-%y'),248.34); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-May-10','%e-%b-%y'),252.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-May-10','%e-%b-%y'),254.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-May-10','%e-%b-%y'),253.82); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-May-10','%e-%b-%y'),258.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-May-10','%e-%b-%y'),262.09); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-May-10','%e-%b-%y'),256.52); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-May-10','%e-%b-%y'),253.99); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-May-10','%e-%b-%y'),235.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-May-10','%e-%b-%y'),246.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-May-10','%e-%b-%y'),255.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-May-10','%e-%b-%y'),258.68); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-May-10','%e-%b-%y'),266.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Apr-10','%e-%b-%y'),261.09); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Apr-10','%e-%b-%y'),268.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Apr-10','%e-%b-%y'),261.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Apr-10','%e-%b-%y'),262.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('26-Apr-10','%e-%b-%y'),269.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Apr-10','%e-%b-%y'),270.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Apr-10','%e-%b-%y'),266.47); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Apr-10','%e-%b-%y'),259.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Apr-10','%e-%b-%y'),244.59); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Apr-10','%e-%b-%y'),247.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Apr-10','%e-%b-%y'),247.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Apr-10','%e-%b-%y'),248.92); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Apr-10','%e-%b-%y'),245.69); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Apr-10','%e-%b-%y'),242.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Apr-10','%e-%b-%y'),242.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Apr-10','%e-%b-%y'),241.79); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Apr-10','%e-%b-%y'),239.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Apr-10','%e-%b-%y'),240.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Apr-10','%e-%b-%y'),239.54); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Apr-10','%e-%b-%y'),238.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Apr-10','%e-%b-%y'),235.97); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Apr-10','%e-%b-%y'),235.97); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('31-Mar-10','%e-%b-%y'),235); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Mar-10','%e-%b-%y'),235.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Mar-10','%e-%b-%y'),232.39); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Mar-10','%e-%b-%y'),230.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Mar-10','%e-%b-%y'),226.65); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Mar-10','%e-%b-%y'),229.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('23-Mar-10','%e-%b-%y'),228.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Mar-10','%e-%b-%y'),224.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Mar-10','%e-%b-%y'),222.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Mar-10','%e-%b-%y'),224.65); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Mar-10','%e-%b-%y'),224.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Mar-10','%e-%b-%y'),224.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('15-Mar-10','%e-%b-%y'),223.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Mar-10','%e-%b-%y'),226.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Mar-10','%e-%b-%y'),225.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Mar-10','%e-%b-%y'),224.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Mar-10','%e-%b-%y'),223.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Mar-10','%e-%b-%y'),219.08); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Mar-10','%e-%b-%y'),218.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Mar-10','%e-%b-%y'),210.71); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Mar-10','%e-%b-%y'),209.33); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Mar-10','%e-%b-%y'),208.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Mar-10','%e-%b-%y'),208.99); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Feb-10','%e-%b-%y'),204.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Feb-10','%e-%b-%y'),202); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Feb-10','%e-%b-%y'),200.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Feb-10','%e-%b-%y'),197.06); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Feb-10','%e-%b-%y'),200.42); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Feb-10','%e-%b-%y'),201.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Feb-10','%e-%b-%y'),202.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Feb-10','%e-%b-%y'),202.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Feb-10','%e-%b-%y'),203.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Feb-10','%e-%b-%y'),200.38); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Feb-10','%e-%b-%y'),200.38); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Feb-10','%e-%b-%y'),198.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Feb-10','%e-%b-%y'),195.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Feb-10','%e-%b-%y'),196.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Feb-10','%e-%b-%y'),194.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Feb-10','%e-%b-%y'),195.46); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Feb-10','%e-%b-%y'),192.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Feb-10','%e-%b-%y'),199.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Feb-10','%e-%b-%y'),195.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Feb-10','%e-%b-%y'),194.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Jan-10','%e-%b-%y'),192.06); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Jan-10','%e-%b-%y'),199.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jan-10','%e-%b-%y'),207.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Jan-10','%e-%b-%y'),205.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Jan-10','%e-%b-%y'),203.08); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('22-Jan-10','%e-%b-%y'),197.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Jan-10','%e-%b-%y'),208.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Jan-10','%e-%b-%y'),211.72); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Jan-10','%e-%b-%y'),215.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Jan-10','%e-%b-%y'),205.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Jan-10','%e-%b-%y'),205.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('14-Jan-10','%e-%b-%y'),209.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Jan-10','%e-%b-%y'),210.65); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Jan-10','%e-%b-%y'),207.72); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Jan-10','%e-%b-%y'),210.11); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Jan-10','%e-%b-%y'),211.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Jan-10','%e-%b-%y'),210.58); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('6-Jan-10','%e-%b-%y'),210.97); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Jan-10','%e-%b-%y'),214.38); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Jan-10','%e-%b-%y'),214.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jan-10','%e-%b-%y'),210.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Dec-09','%e-%b-%y'),210.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Dec-09','%e-%b-%y'),211.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-Dec-09','%e-%b-%y'),209.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Dec-09','%e-%b-%y'),211.61); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Dec-09','%e-%b-%y'),209.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Dec-09','%e-%b-%y'),209.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Dec-09','%e-%b-%y'),202.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Dec-09','%e-%b-%y'),200.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Dec-09','%e-%b-%y'),198.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Dec-09','%e-%b-%y'),195.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Dec-09','%e-%b-%y'),191.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Dec-09','%e-%b-%y'),195.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Dec-09','%e-%b-%y'),194.17); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Dec-09','%e-%b-%y'),196.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Dec-09','%e-%b-%y'),194.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Dec-09','%e-%b-%y'),196.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Dec-09','%e-%b-%y'),197.8); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Dec-09','%e-%b-%y'),189.87); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Dec-09','%e-%b-%y'),188.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Dec-09','%e-%b-%y'),193.32); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('3-Dec-09','%e-%b-%y'),196.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Dec-09','%e-%b-%y'),196.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Dec-09','%e-%b-%y'),196.97); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Nov-09','%e-%b-%y'),199.91); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Nov-09','%e-%b-%y'),200.59); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Nov-09','%e-%b-%y'),204.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Nov-09','%e-%b-%y'),204.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Nov-09','%e-%b-%y'),204.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Nov-09','%e-%b-%y'),205.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Nov-09','%e-%b-%y'),199.92); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Nov-09','%e-%b-%y'),200.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Nov-09','%e-%b-%y'),205.96); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Nov-09','%e-%b-%y'),207); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Nov-09','%e-%b-%y'),206.63); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Nov-09','%e-%b-%y'),204.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Nov-09','%e-%b-%y'),201.99); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Nov-09','%e-%b-%y'),203.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Nov-09','%e-%b-%y'),202.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Nov-09','%e-%b-%y'),201.46); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Nov-09','%e-%b-%y'),194.34); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Nov-09','%e-%b-%y'),194.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Nov-09','%e-%b-%y'),190.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Nov-09','%e-%b-%y'),188.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Nov-09','%e-%b-%y'),189.31); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('30-Oct-09','%e-%b-%y'),188.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Oct-09','%e-%b-%y'),196.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Oct-09','%e-%b-%y'),192.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Oct-09','%e-%b-%y'),197.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Oct-09','%e-%b-%y'),202.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Oct-09','%e-%b-%y'),203.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('22-Oct-09','%e-%b-%y'),205.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Oct-09','%e-%b-%y'),204.92); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Oct-09','%e-%b-%y'),198.76); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Oct-09','%e-%b-%y'),189.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Oct-09','%e-%b-%y'),188.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Oct-09','%e-%b-%y'),190.56); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('14-Oct-09','%e-%b-%y'),191.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Oct-09','%e-%b-%y'),190.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Oct-09','%e-%b-%y'),190.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Oct-09','%e-%b-%y'),190.47); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Oct-09','%e-%b-%y'),189.27); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Oct-09','%e-%b-%y'),190.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('6-Oct-09','%e-%b-%y'),190.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Oct-09','%e-%b-%y'),186.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Oct-09','%e-%b-%y'),184.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Oct-09','%e-%b-%y'),180.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Sep-09','%e-%b-%y'),185.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Sep-09','%e-%b-%y'),185.38); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Sep-09','%e-%b-%y'),186.15); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Sep-09','%e-%b-%y'),182.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Sep-09','%e-%b-%y'),183.82); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Sep-09','%e-%b-%y'),185.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Sep-09','%e-%b-%y'),184.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Sep-09','%e-%b-%y'),184.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('18-Sep-09','%e-%b-%y'),185.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Sep-09','%e-%b-%y'),184.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Sep-09','%e-%b-%y'),181.87); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Sep-09','%e-%b-%y'),175.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Sep-09','%e-%b-%y'),173.72); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Sep-09','%e-%b-%y'),172.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Sep-09','%e-%b-%y'),172.56); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Sep-09','%e-%b-%y'),171.14); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Sep-09','%e-%b-%y'),172.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Sep-09','%e-%b-%y'),170.31); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Sep-09','%e-%b-%y'),166.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Sep-09','%e-%b-%y'),165.18); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Sep-09','%e-%b-%y'),165.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Aug-09','%e-%b-%y'),168.21); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Aug-09','%e-%b-%y'),170.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Aug-09','%e-%b-%y'),169.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Aug-09','%e-%b-%y'),167.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Aug-09','%e-%b-%y'),169.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Aug-09','%e-%b-%y'),169.06); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Aug-09','%e-%b-%y'),169.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Aug-09','%e-%b-%y'),166.33); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Aug-09','%e-%b-%y'),164.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Aug-09','%e-%b-%y'),164); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Aug-09','%e-%b-%y'),159.59); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('14-Aug-09','%e-%b-%y'),166.78); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Aug-09','%e-%b-%y'),168.42); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Aug-09','%e-%b-%y'),165.31); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Aug-09','%e-%b-%y'),164.72); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Aug-09','%e-%b-%y'),165.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Aug-09','%e-%b-%y'),163.91); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Aug-09','%e-%b-%y'),165.11); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Aug-09','%e-%b-%y'),165.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Aug-09','%e-%b-%y'),166.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Jul-09','%e-%b-%y'),163.39); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Jul-09','%e-%b-%y'),162.79); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Jul-09','%e-%b-%y'),160.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Jul-09','%e-%b-%y'),160); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jul-09','%e-%b-%y'),160.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Jul-09','%e-%b-%y'),159.99); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Jul-09','%e-%b-%y'),157.82); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Jul-09','%e-%b-%y'),156.74); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Jul-09','%e-%b-%y'),151.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-Jul-09','%e-%b-%y'),152.91); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jul-09','%e-%b-%y'),151.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Jul-09','%e-%b-%y'),147.52); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Jul-09','%e-%b-%y'),146.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Jul-09','%e-%b-%y'),142.27); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Jul-09','%e-%b-%y'),142.34); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Jul-09','%e-%b-%y'),138.52); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jul-09','%e-%b-%y'),136.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Jul-09','%e-%b-%y'),137.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Jul-09','%e-%b-%y'),135.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Jul-09','%e-%b-%y'),138.61); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Jul-09','%e-%b-%y'),140.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('2-Jul-09','%e-%b-%y'),140.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jul-09','%e-%b-%y'),142.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Jun-09','%e-%b-%y'),142.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Jun-09','%e-%b-%y'),141.97); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Jun-09','%e-%b-%y'),142.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Jun-09','%e-%b-%y'),139.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Jun-09','%e-%b-%y'),136.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Jun-09','%e-%b-%y'),134.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Jun-09','%e-%b-%y'),137.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Jun-09','%e-%b-%y'),139.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Jun-09','%e-%b-%y'),135.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jun-09','%e-%b-%y'),135.58); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Jun-09','%e-%b-%y'),136.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Jun-09','%e-%b-%y'),136.09); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Jun-09','%e-%b-%y'),136.97); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Jun-09','%e-%b-%y'),139.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Jun-09','%e-%b-%y'),140.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jun-09','%e-%b-%y'),142.72); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Jun-09','%e-%b-%y'),143.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Jun-09','%e-%b-%y'),144.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Jun-09','%e-%b-%y'),143.74); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Jun-09','%e-%b-%y'),140.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Jun-09','%e-%b-%y'),139.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jun-09','%e-%b-%y'),139.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-May-09','%e-%b-%y'),135.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-May-09','%e-%b-%y'),135.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-May-09','%e-%b-%y'),133.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-May-09','%e-%b-%y'),130.78); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-May-09','%e-%b-%y'),122.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-May-09','%e-%b-%y'),124.18); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-May-09','%e-%b-%y'),125.87); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-May-09','%e-%b-%y'),127.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-May-09','%e-%b-%y'),126.65); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-May-09','%e-%b-%y'),122.42); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-May-09','%e-%b-%y'),122.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-May-09','%e-%b-%y'),119.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-May-09','%e-%b-%y'),124.42); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-May-09','%e-%b-%y'),129.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-May-09','%e-%b-%y'),129.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-May-09','%e-%b-%y'),129.06); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-May-09','%e-%b-%y'),132.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-May-09','%e-%b-%y'),132.71); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-May-09','%e-%b-%y'),132.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-May-09','%e-%b-%y'),127.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Apr-09','%e-%b-%y'),125.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Apr-09','%e-%b-%y'),125.14); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Apr-09','%e-%b-%y'),123.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Apr-09','%e-%b-%y'),124.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Apr-09','%e-%b-%y'),123.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Apr-09','%e-%b-%y'),125.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Apr-09','%e-%b-%y'),121.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Apr-09','%e-%b-%y'),121.76); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Apr-09','%e-%b-%y'),120.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Apr-09','%e-%b-%y'),123.42); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Apr-09','%e-%b-%y'),121.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Apr-09','%e-%b-%y'),117.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Apr-09','%e-%b-%y'),118.31); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Apr-09','%e-%b-%y'),120.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Apr-09','%e-%b-%y'),119.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Apr-09','%e-%b-%y'),119.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Apr-09','%e-%b-%y'),116.32); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Apr-09','%e-%b-%y'),115); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Apr-09','%e-%b-%y'),118.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Apr-09','%e-%b-%y'),115.99); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Apr-09','%e-%b-%y'),112.71); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Apr-09','%e-%b-%y'),108.69); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('31-Mar-09','%e-%b-%y'),105.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Mar-09','%e-%b-%y'),104.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Mar-09','%e-%b-%y'),106.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Mar-09','%e-%b-%y'),109.87); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Mar-09','%e-%b-%y'),106.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Mar-09','%e-%b-%y'),106.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('23-Mar-09','%e-%b-%y'),107.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Mar-09','%e-%b-%y'),101.59); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Mar-09','%e-%b-%y'),101.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Mar-09','%e-%b-%y'),101.52); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Mar-09','%e-%b-%y'),99.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Mar-09','%e-%b-%y'),95.42); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('13-Mar-09','%e-%b-%y'),95.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Mar-09','%e-%b-%y'),96.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Mar-09','%e-%b-%y'),92.68); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Mar-09','%e-%b-%y'),88.63); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Mar-09','%e-%b-%y'),83.11); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Mar-09','%e-%b-%y'),85.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Mar-09','%e-%b-%y'),88.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Mar-09','%e-%b-%y'),91.17); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Mar-09','%e-%b-%y'),88.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Mar-09','%e-%b-%y'),87.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Feb-09','%e-%b-%y'),89.31); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Feb-09','%e-%b-%y'),89.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Feb-09','%e-%b-%y'),91.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Feb-09','%e-%b-%y'),90.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Feb-09','%e-%b-%y'),86.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Feb-09','%e-%b-%y'),91.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Feb-09','%e-%b-%y'),90.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Feb-09','%e-%b-%y'),94.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Feb-09','%e-%b-%y'),94.53); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Feb-09','%e-%b-%y'),99.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Feb-09','%e-%b-%y'),99.27); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Feb-09','%e-%b-%y'),96.82); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Feb-09','%e-%b-%y'),97.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Feb-09','%e-%b-%y'),102.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('6-Feb-09','%e-%b-%y'),99.72); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Feb-09','%e-%b-%y'),96.46); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Feb-09','%e-%b-%y'),93.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Feb-09','%e-%b-%y'),92.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Feb-09','%e-%b-%y'),91.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Jan-09','%e-%b-%y'),90.13); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-Jan-09','%e-%b-%y'),93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jan-09','%e-%b-%y'),94.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Jan-09','%e-%b-%y'),90.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Jan-09','%e-%b-%y'),89.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Jan-09','%e-%b-%y'),88.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jan-09','%e-%b-%y'),88.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Jan-09','%e-%b-%y'),82.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Jan-09','%e-%b-%y'),78.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Jan-09','%e-%b-%y'),82.33); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Jan-09','%e-%b-%y'),83.38); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Jan-09','%e-%b-%y'),85.33); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Jan-09','%e-%b-%y'),87.71); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-Jan-09','%e-%b-%y'),88.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jan-09','%e-%b-%y'),90.58); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Jan-09','%e-%b-%y'),92.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Jan-09','%e-%b-%y'),91.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Jan-09','%e-%b-%y'),93.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Jan-09','%e-%b-%y'),94.58); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('2-Jan-09','%e-%b-%y'),90.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jan-09','%e-%b-%y'),85.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Dec-08','%e-%b-%y'),85.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Dec-08','%e-%b-%y'),86.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Dec-08','%e-%b-%y'),86.61); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Dec-08','%e-%b-%y'),85.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Dec-08','%e-%b-%y'),85.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Dec-08','%e-%b-%y'),85.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Dec-08','%e-%b-%y'),86.38); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Dec-08','%e-%b-%y'),85.74); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Dec-08','%e-%b-%y'),90); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Dec-08','%e-%b-%y'),89.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Dec-08','%e-%b-%y'),89.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Dec-08','%e-%b-%y'),95.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Dec-08','%e-%b-%y'),94.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Dec-08','%e-%b-%y'),98.27); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Dec-08','%e-%b-%y'),95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Dec-08','%e-%b-%y'),98.21); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Dec-08','%e-%b-%y'),100.06); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Dec-08','%e-%b-%y'),99.72); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Dec-08','%e-%b-%y'),94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Dec-08','%e-%b-%y'),91.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Dec-08','%e-%b-%y'),95.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Dec-08','%e-%b-%y'),92.47); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Dec-08','%e-%b-%y'),88.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Nov-08','%e-%b-%y'),92.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Nov-08','%e-%b-%y'),95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Nov-08','%e-%b-%y'),95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Nov-08','%e-%b-%y'),90.8); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Nov-08','%e-%b-%y'),92.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Nov-08','%e-%b-%y'),82.58); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Nov-08','%e-%b-%y'),80.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Nov-08','%e-%b-%y'),86.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Nov-08','%e-%b-%y'),89.91); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Nov-08','%e-%b-%y'),88.14); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Nov-08','%e-%b-%y'),90.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('13-Nov-08','%e-%b-%y'),96.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Nov-08','%e-%b-%y'),90.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Nov-08','%e-%b-%y'),94.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Nov-08','%e-%b-%y'),95.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Nov-08','%e-%b-%y'),98.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Nov-08','%e-%b-%y'),99.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Nov-08','%e-%b-%y'),103.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Nov-08','%e-%b-%y'),110.99); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Nov-08','%e-%b-%y'),106.96); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Oct-08','%e-%b-%y'),107.59); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Oct-08','%e-%b-%y'),111.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Oct-08','%e-%b-%y'),104.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Oct-08','%e-%b-%y'),99.91); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Oct-08','%e-%b-%y'),92.09); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Oct-08','%e-%b-%y'),96.38); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Oct-08','%e-%b-%y'),98.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Oct-08','%e-%b-%y'),96.87); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Oct-08','%e-%b-%y'),91.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-Oct-08','%e-%b-%y'),98.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Oct-08','%e-%b-%y'),97.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Oct-08','%e-%b-%y'),101.89); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Oct-08','%e-%b-%y'),97.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Oct-08','%e-%b-%y'),104.08); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Oct-08','%e-%b-%y'),110.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Oct-08','%e-%b-%y'),96.8); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Oct-08','%e-%b-%y'),88.74); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Oct-08','%e-%b-%y'),89.79); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Oct-08','%e-%b-%y'),89.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Oct-08','%e-%b-%y'),98.14); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Oct-08','%e-%b-%y'),97.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('2-Oct-08','%e-%b-%y'),100.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Oct-08','%e-%b-%y'),109.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Sep-08','%e-%b-%y'),113.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Sep-08','%e-%b-%y'),105.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Sep-08','%e-%b-%y'),128.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Sep-08','%e-%b-%y'),131.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Sep-08','%e-%b-%y'),128.71); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Sep-08','%e-%b-%y'),126.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Sep-08','%e-%b-%y'),131.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Sep-08','%e-%b-%y'),140.91); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Sep-08','%e-%b-%y'),134.09); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Sep-08','%e-%b-%y'),127.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Sep-08','%e-%b-%y'),139.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Sep-08','%e-%b-%y'),140.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Sep-08','%e-%b-%y'),148.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Sep-08','%e-%b-%y'),152.65); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Sep-08','%e-%b-%y'),151.61); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Sep-08','%e-%b-%y'),151.68); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Sep-08','%e-%b-%y'),157.92); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Sep-08','%e-%b-%y'),160.18); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Sep-08','%e-%b-%y'),161.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Sep-08','%e-%b-%y'),166.96); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Sep-08','%e-%b-%y'),166.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Aug-08','%e-%b-%y'),169.53); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Aug-08','%e-%b-%y'),173.74); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Aug-08','%e-%b-%y'),174.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Aug-08','%e-%b-%y'),173.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Aug-08','%e-%b-%y'),172.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Aug-08','%e-%b-%y'),176.79); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Aug-08','%e-%b-%y'),174.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-Aug-08','%e-%b-%y'),175.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Aug-08','%e-%b-%y'),173.53); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Aug-08','%e-%b-%y'),175.39); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Aug-08','%e-%b-%y'),175.74); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Aug-08','%e-%b-%y'),179.32); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Aug-08','%e-%b-%y'),179.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-Aug-08','%e-%b-%y'),176.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Aug-08','%e-%b-%y'),173.56); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Aug-08','%e-%b-%y'),169.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Aug-08','%e-%b-%y'),163.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Aug-08','%e-%b-%y'),164.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Aug-08','%e-%b-%y'),160.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-Aug-08','%e-%b-%y'),153.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Aug-08','%e-%b-%y'),156.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Jul-08','%e-%b-%y'),158.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Jul-08','%e-%b-%y'),159.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Jul-08','%e-%b-%y'),157.08); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jul-08','%e-%b-%y'),154.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Jul-08','%e-%b-%y'),162.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Jul-08','%e-%b-%y'),159.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Jul-08','%e-%b-%y'),166.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jul-08','%e-%b-%y'),162.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Jul-08','%e-%b-%y'),166.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Jul-08','%e-%b-%y'),165.15); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Jul-08','%e-%b-%y'),171.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Jul-08','%e-%b-%y'),172.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Jul-08','%e-%b-%y'),169.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Jul-08','%e-%b-%y'),173.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Jul-08','%e-%b-%y'),172.58); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Jul-08','%e-%b-%y'),176.63); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Jul-08','%e-%b-%y'),174.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Jul-08','%e-%b-%y'),179.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Jul-08','%e-%b-%y'),175.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Jul-08','%e-%b-%y'),170.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Jul-08','%e-%b-%y'),168.18); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jul-08','%e-%b-%y'),174.68); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('30-Jun-08','%e-%b-%y'),167.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jun-08','%e-%b-%y'),170.09); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Jun-08','%e-%b-%y'),168.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Jun-08','%e-%b-%y'),177.39); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Jun-08','%e-%b-%y'),173.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Jun-08','%e-%b-%y'),173.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-Jun-08','%e-%b-%y'),175.27); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Jun-08','%e-%b-%y'),180.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Jun-08','%e-%b-%y'),178.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jun-08','%e-%b-%y'),181.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Jun-08','%e-%b-%y'),176.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Jun-08','%e-%b-%y'),172.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-Jun-08','%e-%b-%y'),173.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Jun-08','%e-%b-%y'),180.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Jun-08','%e-%b-%y'),185.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jun-08','%e-%b-%y'),181.61); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Jun-08','%e-%b-%y'),185.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Jun-08','%e-%b-%y'),189.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-Jun-08','%e-%b-%y'),185.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Jun-08','%e-%b-%y'),185.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Jun-08','%e-%b-%y'),186.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-May-08','%e-%b-%y'),188.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-May-08','%e-%b-%y'),186.69); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-May-08','%e-%b-%y'),187.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('27-May-08','%e-%b-%y'),186.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-May-08','%e-%b-%y'),181.17); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-May-08','%e-%b-%y'),177.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-May-08','%e-%b-%y'),178.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-May-08','%e-%b-%y'),185.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-May-08','%e-%b-%y'),183.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-May-08','%e-%b-%y'),187.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-May-08','%e-%b-%y'),189.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-May-08','%e-%b-%y'),186.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-May-08','%e-%b-%y'),189.96); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-May-08','%e-%b-%y'),188.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-May-08','%e-%b-%y'),183.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-May-08','%e-%b-%y'),185.06); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-May-08','%e-%b-%y'),182.59); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-May-08','%e-%b-%y'),186.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-May-08','%e-%b-%y'),184.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-May-08','%e-%b-%y'),180.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-May-08','%e-%b-%y'),180); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('30-Apr-08','%e-%b-%y'),173.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Apr-08','%e-%b-%y'),175.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Apr-08','%e-%b-%y'),172.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Apr-08','%e-%b-%y'),169.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Apr-08','%e-%b-%y'),168.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Apr-08','%e-%b-%y'),162.89); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('22-Apr-08','%e-%b-%y'),160.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Apr-08','%e-%b-%y'),168.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Apr-08','%e-%b-%y'),161.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Apr-08','%e-%b-%y'),154.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Apr-08','%e-%b-%y'),153.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Apr-08','%e-%b-%y'),148.38); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('14-Apr-08','%e-%b-%y'),147.78); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Apr-08','%e-%b-%y'),147.14); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Apr-08','%e-%b-%y'),154.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Apr-08','%e-%b-%y'),151.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Apr-08','%e-%b-%y'),152.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Apr-08','%e-%b-%y'),155.89); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-Apr-08','%e-%b-%y'),153.08); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Apr-08','%e-%b-%y'),151.61); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Apr-08','%e-%b-%y'),147.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Apr-08','%e-%b-%y'),149.53); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Mar-08','%e-%b-%y'),143.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Mar-08','%e-%b-%y'),143.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('27-Mar-08','%e-%b-%y'),140.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Mar-08','%e-%b-%y'),145.06); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Mar-08','%e-%b-%y'),140.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Mar-08','%e-%b-%y'),139.53); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Mar-08','%e-%b-%y'),133.27); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Mar-08','%e-%b-%y'),129.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('18-Mar-08','%e-%b-%y'),132.82); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Mar-08','%e-%b-%y'),126.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Mar-08','%e-%b-%y'),126.61); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Mar-08','%e-%b-%y'),127.94); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Mar-08','%e-%b-%y'),126.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Mar-08','%e-%b-%y'),127.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Mar-08','%e-%b-%y'),119.69); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Mar-08','%e-%b-%y'),122.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Mar-08','%e-%b-%y'),120.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Mar-08','%e-%b-%y'),124.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Mar-08','%e-%b-%y'),124.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Mar-08','%e-%b-%y'),121.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-Feb-08','%e-%b-%y'),125.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Feb-08','%e-%b-%y'),129.91); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Feb-08','%e-%b-%y'),122.96); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Feb-08','%e-%b-%y'),119.15); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Feb-08','%e-%b-%y'),119.74); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Feb-08','%e-%b-%y'),119.46); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Feb-08','%e-%b-%y'),121.54); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Feb-08','%e-%b-%y'),123.82); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Feb-08','%e-%b-%y'),122.18); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Feb-08','%e-%b-%y'),124.63); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Feb-08','%e-%b-%y'),127.46); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Feb-08','%e-%b-%y'),129.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-Feb-08','%e-%b-%y'),124.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Feb-08','%e-%b-%y'),129.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Feb-08','%e-%b-%y'),125.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Feb-08','%e-%b-%y'),121.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Feb-08','%e-%b-%y'),122); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Feb-08','%e-%b-%y'),129.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-Feb-08','%e-%b-%y'),131.65); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Feb-08','%e-%b-%y'),133.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Jan-08','%e-%b-%y'),135.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Jan-08','%e-%b-%y'),132.18); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Jan-08','%e-%b-%y'),131.54); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jan-08','%e-%b-%y'),130.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Jan-08','%e-%b-%y'),130.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Jan-08','%e-%b-%y'),135.6); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Jan-08','%e-%b-%y'),139.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jan-08','%e-%b-%y'),155.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Jan-08','%e-%b-%y'),161.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jan-08','%e-%b-%y'),160.89); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Jan-08','%e-%b-%y'),159.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Jan-08','%e-%b-%y'),169.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Jan-08','%e-%b-%y'),178.78); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Jan-08','%e-%b-%y'),172.69); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Jan-08','%e-%b-%y'),178.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jan-08','%e-%b-%y'),179.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Jan-08','%e-%b-%y'),171.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Jan-08','%e-%b-%y'),177.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Jan-08','%e-%b-%y'),180.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Jan-08','%e-%b-%y'),194.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Jan-08','%e-%b-%y'),194.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Dec-07','%e-%b-%y'),198.08); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Dec-07','%e-%b-%y'),199.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Dec-07','%e-%b-%y'),198.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Dec-07','%e-%b-%y'),198.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Dec-07','%e-%b-%y'),198.8); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Dec-07','%e-%b-%y'),193.91); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Dec-07','%e-%b-%y'),187.21); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('19-Dec-07','%e-%b-%y'),183.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Dec-07','%e-%b-%y'),182.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Dec-07','%e-%b-%y'),184.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Dec-07','%e-%b-%y'),190.39); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Dec-07','%e-%b-%y'),191.83); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Dec-07','%e-%b-%y'),190.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Dec-07','%e-%b-%y'),188.54); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Dec-07','%e-%b-%y'),194.21); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Dec-07','%e-%b-%y'),194.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Dec-07','%e-%b-%y'),189.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Dec-07','%e-%b-%y'),185.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Dec-07','%e-%b-%y'),179.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('3-Dec-07','%e-%b-%y'),178.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Nov-07','%e-%b-%y'),182.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Nov-07','%e-%b-%y'),184.29); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Nov-07','%e-%b-%y'),180.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Nov-07','%e-%b-%y'),174.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Nov-07','%e-%b-%y'),172.54); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('23-Nov-07','%e-%b-%y'),171.54); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Nov-07','%e-%b-%y'),168.46); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Nov-07','%e-%b-%y'),168.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Nov-07','%e-%b-%y'),163.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Nov-07','%e-%b-%y'),166.39); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Nov-07','%e-%b-%y'),164.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('14-Nov-07','%e-%b-%y'),166.11); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Nov-07','%e-%b-%y'),169.96); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Nov-07','%e-%b-%y'),153.76); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Nov-07','%e-%b-%y'),165.37); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Nov-07','%e-%b-%y'),175.47); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Nov-07','%e-%b-%y'),186.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('6-Nov-07','%e-%b-%y'),191.79); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Nov-07','%e-%b-%y'),186.18); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Nov-07','%e-%b-%y'),187.87); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Nov-07','%e-%b-%y'),187.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Oct-07','%e-%b-%y'),189.95); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Oct-07','%e-%b-%y'),187); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-Oct-07','%e-%b-%y'),185.09); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Oct-07','%e-%b-%y'),184.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Oct-07','%e-%b-%y'),182.78); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Oct-07','%e-%b-%y'),185.93); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Oct-07','%e-%b-%y'),186.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Oct-07','%e-%b-%y'),174.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('19-Oct-07','%e-%b-%y'),170.42); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Oct-07','%e-%b-%y'),173.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Oct-07','%e-%b-%y'),172.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Oct-07','%e-%b-%y'),169.58); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Oct-07','%e-%b-%y'),166.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Oct-07','%e-%b-%y'),167.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Oct-07','%e-%b-%y'),162.23); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Oct-07','%e-%b-%y'),166.79); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Oct-07','%e-%b-%y'),167.86); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Oct-07','%e-%b-%y'),167.91); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Oct-07','%e-%b-%y'),161.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Oct-07','%e-%b-%y'),156.24); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('3-Oct-07','%e-%b-%y'),157.92); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Oct-07','%e-%b-%y'),158.45); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Oct-07','%e-%b-%y'),156.34); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Sep-07','%e-%b-%y'),153.47); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Sep-07','%e-%b-%y'),154.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Sep-07','%e-%b-%y'),152.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Sep-07','%e-%b-%y'),153.18); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Sep-07','%e-%b-%y'),148.28); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Sep-07','%e-%b-%y'),144.15); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Sep-07','%e-%b-%y'),140.31); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Sep-07','%e-%b-%y'),140.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Sep-07','%e-%b-%y'),140.92); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Sep-07','%e-%b-%y'),138.41); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Sep-07','%e-%b-%y'),138.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Sep-07','%e-%b-%y'),137.2); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Sep-07','%e-%b-%y'),136.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Sep-07','%e-%b-%y'),135.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Sep-07','%e-%b-%y'),136.71); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('7-Sep-07','%e-%b-%y'),131.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Sep-07','%e-%b-%y'),135.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Sep-07','%e-%b-%y'),136.76); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Sep-07','%e-%b-%y'),144.16); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Aug-07','%e-%b-%y'),138.48); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Aug-07','%e-%b-%y'),136.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-Aug-07','%e-%b-%y'),134.08); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Aug-07','%e-%b-%y'),126.82); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Aug-07','%e-%b-%y'),132.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Aug-07','%e-%b-%y'),135.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Aug-07','%e-%b-%y'),131.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Aug-07','%e-%b-%y'),132.51); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Aug-07','%e-%b-%y'),127.57); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Aug-07','%e-%b-%y'),122.22); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Aug-07','%e-%b-%y'),122.06); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Aug-07','%e-%b-%y'),117.05); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Aug-07','%e-%b-%y'),119.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Aug-07','%e-%b-%y'),124.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('13-Aug-07','%e-%b-%y'),127.79); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Aug-07','%e-%b-%y'),125); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Aug-07','%e-%b-%y'),126.39); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Aug-07','%e-%b-%y'),134.01); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Aug-07','%e-%b-%y'),135.03); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Aug-07','%e-%b-%y'),135.25); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('3-Aug-07','%e-%b-%y'),131.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Aug-07','%e-%b-%y'),136.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Aug-07','%e-%b-%y'),135); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Jul-07','%e-%b-%y'),131.76); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Jul-07','%e-%b-%y'),141.43); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jul-07','%e-%b-%y'),143.85); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('26-Jul-07','%e-%b-%y'),146); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Jul-07','%e-%b-%y'),137.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Jul-07','%e-%b-%y'),134.89); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Jul-07','%e-%b-%y'),143.7); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Jul-07','%e-%b-%y'),143.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Jul-07','%e-%b-%y'),140); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('18-Jul-07','%e-%b-%y'),138.12); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jul-07','%e-%b-%y'),138.91); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Jul-07','%e-%b-%y'),138.1); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Jul-07','%e-%b-%y'),137.73); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Jul-07','%e-%b-%y'),134.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Jul-07','%e-%b-%y'),132.39); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Jul-07','%e-%b-%y'),132.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jul-07','%e-%b-%y'),130.33); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Jul-07','%e-%b-%y'),132.3); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Jul-07','%e-%b-%y'),132.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Jul-07','%e-%b-%y'),127.17); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Jul-07','%e-%b-%y'),121.26); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-Jun-07','%e-%b-%y'),122.04); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jun-07','%e-%b-%y'),120.56); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Jun-07','%e-%b-%y'),121.89); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Jun-07','%e-%b-%y'),119.65); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Jun-07','%e-%b-%y'),122.34); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jun-07','%e-%b-%y'),123); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Jun-07','%e-%b-%y'),123.9); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Jun-07','%e-%b-%y'),121.55); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Jun-07','%e-%b-%y'),123.66); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Jun-07','%e-%b-%y'),125.09); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Jun-07','%e-%b-%y'),120.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Jun-07','%e-%b-%y'),118.75); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('13-Jun-07','%e-%b-%y'),117.5); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Jun-07','%e-%b-%y'),120.38); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Jun-07','%e-%b-%y'),120.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Jun-07','%e-%b-%y'),124.49); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Jun-07','%e-%b-%y'),124.07); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Jun-07','%e-%b-%y'),123.64); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Jun-07','%e-%b-%y'),122.67); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Jun-07','%e-%b-%y'),121.33); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Jun-07','%e-%b-%y'),118.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-May-07','%e-%b-%y'),121.19); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-May-07','%e-%b-%y'),118.77); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-May-07','%e-%b-%y'),114.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-May-07','%e-%b-%y'),113.62); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-May-07','%e-%b-%y'),110.69); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-May-07','%e-%b-%y'),112.89); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-May-07','%e-%b-%y'),113.54); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-May-07','%e-%b-%y'),111.98); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-May-07','%e-%b-%y'),110.02); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-May-07','%e-%b-%y'),109.44); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-May-07','%e-%b-%y'),107.34); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-May-07','%e-%b-%y'),107.52); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-May-07','%e-%b-%y'),109.36); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-May-07','%e-%b-%y'),108.74); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-May-07','%e-%b-%y'),107.34); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-May-07','%e-%b-%y'),106.88); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-May-07','%e-%b-%y'),105.06); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-May-07','%e-%b-%y'),103.92); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-May-07','%e-%b-%y'),100.81); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-May-07','%e-%b-%y'),100.4); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-May-07','%e-%b-%y'),100.39); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-May-07','%e-%b-%y'),99.47); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Apr-07','%e-%b-%y'),99.8); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Apr-07','%e-%b-%y'),99.92); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Apr-07','%e-%b-%y'),98.84); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Apr-07','%e-%b-%y'),95.35); +-- Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Apr-07','%e-%b-%y'),93.24); + +-- DEMO_PIE_CHART +-- Insert into demo_pie_chart (legend, data_value) values ('One', 5); +-- Insert into demo_pie_chart (legend, data_value) values ('Two', 2); +-- Insert into demo_pie_chart (legend, data_value) values ('Three', 9); +-- Insert into demo_pie_chart (legend, data_value) values ('Four', 7); +-- Insert into demo_pie_chart (legend, data_value) values ('Five', 4); +-- Insert into demo_pie_chart (legend, data_value) values ('Six', 3); +-- Insert into demo_pie_chart (legend, data_value) values ('Seven', .5); + + +-- DEMO_SCATTER_CHART +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (4.1, 'Particulate', 122); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (4.3, 'Particulate', 117); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (5.7, 'Particulate', 112); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (5.4, 'Particulate', 114); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (5.9, 'Particulate', 110); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (5.0, 'Particulate', 114); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (3.6, 'Particulate', 128); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (1.9, 'Particulate', 137); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (7.3, 'Particulate', 104); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (6.9, 'Humidity', 119); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (7.9, 'Humidity', 118); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (9.8, 'Humidity', 103); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (4.9, 'Humidity', 137); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (6.8, 'Humidity', 102); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (4.7, 'Humidity', 89); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (2.7, 'Humidity', 98); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (3.7, 'Humidity', 145); +-- Insert into demo_scatter_chart (rainfall, key_value, measurements) values (7.4, 'Humidity', 118); + +-- DEMO_SCATTER_PLOT + +-- SET DEFINE OFF; +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -46.5901128883449, -464.477370615131); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -85.0293361247543, -362.252178232471); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 70.9700275365898, 402.214363675566); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -50.1110580054506, -310.108907443154); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 85.043005750476, 813.481841353449); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -14.2356123424179, -134.200903707809); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -66.7014933188071, -445.754374526706); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -79.941582021797, -694.089097548454); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -64.4665101305822, -431.660620986243); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 13.718818366452, 100.010719918027); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 35.457456199233, 223.254643848734); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 55.2326402548387, 268.940835852805); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -32.9989160276248, -237.280626944034); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -0.464911506111831, -2.65656324666862); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -59.0205101710777, -498.895652307826); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 28.0939970575828, 117.200615553207); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 31.7305239061572, 186.662624012256); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 50.9035126419798, 440.937283203403); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 58.3875046571053, 547.879249694999); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 76.7846997917459, 525.020578968308); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 1.73485745801611, 7.28149474936192); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 15.304841061276, 71.2374666595537); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 75.1342455000693, 381.145932349436); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -58.2087417684623, -573.630956069476); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 76.7977837302114, 624.733726327778); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 56.3295585433654, 309.697529902676); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -9.27601440680639, -49.5126219388194); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 98.3002030040236, 765.653589829535); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -25.0987502451517, -174.651201240269); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 39.9215299020147, 337.889176256456); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 77.9225832868337, 356.183903852096); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 75.4311841137638, 14.5258766665983); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 58.9445375968278, 376.359576288564); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', 46.9521897141796, 3.5679984193934); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -49.0378307695689, -230.816092788509); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -96.2461776340861, -863.765255159092); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -96.3388912796447, -538.147283544646); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -21.4684477767032, -200.140077054848); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -30.3532837083366, -226.462637188158); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample0', -17.5055590488884, -118.709622452841); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 56.6394671790491, 385.48951169801); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 70.4622912302344, 356.986529538635); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 58.2647422222769, 489.418744916999); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -92.16093253903, -425.576081634713); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -2.64574970943097, -26.190027661226); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -16.7568654181289, -117.460886096034); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 68.215377945908, 606.917788617984); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 53.7387814434413, 367.53491797949); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -51.8861573715238, -289.998186955562); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -15.9721784074351, -75.335027134323); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 63.2540648905791, 602.546517566905); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -53.376167960458, -470.921238684285); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 40.8307443439851, 276.112653117961); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -13.0540977188468, -127.648158921993); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -43.7358336047599, -435.080470107322); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -74.5673321340732, -617.960236798371); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -6.47907144443936, -55.654651151187); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 68.1915507628225, 352.320728639801); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -23.5393521654339, -137.714557244391); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 28.3621412621467, 141.103859877604); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -99.5615230664525, -974.857161307048); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -77.7132553058204, -736.182131225006); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 95.9321864873013, 478.286112499176); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 97.7451855292708, 940.301427763062); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -10.2483179758141, -70.1145330070458); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -24.0750124187893, -113.523998470537); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -5.5721118558967, -43.8516395203455); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -55.5378338160537, -368.506951528332); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 52.6669516338013, 38.2926120131942); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -74.1981412067658, -436.990411988621); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -8.70511941690364, -71.3277811558721); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 63.2921735621378, 534.825008407329); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 97.9066635843841, 678.994971737474); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -83.1613916743288, -494.53303650568); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 23.4730547863992, 223.031148353333); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 40.6105099506845, 199.937366405274); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 35.4473225526307, 331.61786915261); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 27.2050975460142, 146.277993239147); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', -1.54684302938646, -12.6706471561247); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample1', 45.8386162291745, 401.780882699918); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 43.4241956158593, 228.71488367607); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -23.4517134254585, -165.958577325218); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -98.8954664030229, -829.964553125469); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 48.0527046113198, 451.527720751234); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -77.8912947988124, -416.867729852279); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 23.8325471824168, 206.907438743452); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 83.2787398847467, 814.01250022556); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 49.1572992549647, 451.03037365466); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -11.1351768833872, -57.3863334655361); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 71.1980242104626, 572.745863967841); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 15.0952976022392, 103.30274980367); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 75.0300005037414, 406.581640027236); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -82.0092720309019, -690.340287049552); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 40.2433497232209, 363.579616486762); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 26.8157962678174, 262.150124949525); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -83.9563210001448, -432.739081022174); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -20.6480437627346, -161.330015497217); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 37.1388896882226, 161.352404658606); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 20.2126667486174, 168.833789818416); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 58.3723632769494, 293.206814023827); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -20.2876832456236, -88.0090685884954); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 72.9768050433371, 691.684023528398); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -21.6612128833675, -130.834158714088); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 97.4870524045038, 806.47904449193); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 60.6688063197852, 255.749289305775); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -44.235772358471, -336.262226570567); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -47.39573087854, -321.133647936626); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -24.7522484346097, -204.548308435727); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -42.903238078129, -239.651563752902); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 20.4656734934697, 172.700213789797); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 56.0665747085147, 365.360390019834); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 31.9979219049038, 237.490140339893); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -29.9884426739069, -203.821484170813); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 13.5011085362703, 79.4784314297668); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 41.8402945507358, 297.04934398378); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -84.9323678979223, -345.2331996232); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', -42.2469964847455, -361.468816319656); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 98.1057699772752, 445.181262282444); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 95.5327901766563, 522.663100406047); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample2', 35.0916611161316, 246.796980313209); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 99.3987950082867, 401.97428571655); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -3.0419413965969, -14.5325761725203); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -79.388026451666, -701.817589967372); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -88.451242397524, -668.370526000304); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 34.3131838963851, 254.418322223563); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -61.518208630511, -347.521623572776); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 45.6124480237487, 356.33565541369); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -1.0716036518037, -7.80544934354423); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 31.7371714687412, 283.925868763573); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -76.771029786315, -626.268489584739); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -67.913690110843, -614.736930677921); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 34.9311671860034, 171.384205820777); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 94.3264454603021, 914.267819214392); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 76.7493996267558, 705.649611960615); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -87.795202856922, -749.505178721718); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 2.10914716736019, 15.4036733330536); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -50.456669557937, -318.410608422062); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -94.646644883092, -734.660992935541); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 34.9170862075359, 347.583881438806); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 44.3524585090071, 294.615219199443); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -67.191016143335, -609.956472872497); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -78.826443879164, -369.129912603377); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -50.427554400015, -418.144241602024); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -70.371769526721, -307.02193189609); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 16.3220947890044, 97.0997346831135); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -47.067245718878, -398.27032236792); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 5.91206661301702, 24.7239863780181); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -99.621681801868, -843.593457399484); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 87.4503492670535, 695.345037859433); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -91.176921118057, -683.305064255346); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -0.6632900001386, -5.34157539224209); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 2.98188785882178, 12.1181973600389); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 30.6008700087597, 205.922863867274); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 7.90348761612496, 65.5271597329641); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 40.3565229854156, 268.058138389501); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 37.6892733312091, 247.519083233639); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 16.4759733864001, 107.72661087278); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -53.578492311122, -369.768816039059); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', 77.1292326560541, 765.262108306778); +-- Insert into demo_scatter_plot +-- (SERIES, VALUEX, VALUEY) +-- Values +-- ('Sample3', -79.566811593352, -677.545127214159); + +-- DEMO_UTIL_CHART +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-17','%Y-%m-%d'),53.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-10','%Y-%m-%d'),62.95747); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-21','%Y-%m-%d'),48.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-22','%Y-%m-%d'),51.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-11','%Y-%m-%d'),56.13373); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-23','%Y-%m-%d'),53.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-12','%Y-%m-%d'),57.05287); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-24','%Y-%m-%d'),51.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-13','%Y-%m-%d'),55.78947); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-25','%Y-%m-%d'),54.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-14','%Y-%m-%d'),63.34907); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-26','%Y-%m-%d'),50.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-15','%Y-%m-%d'),52.21327); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-27','%Y-%m-%d'),48.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-16','%Y-%m-%d'),51.32080); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-28','%Y-%m-%d'),50.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-17','%Y-%m-%d'),58.35720); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-29','%Y-%m-%d'),51.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-18','%Y-%m-%d'),57.62293); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-30','%Y-%m-%d'),67.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-19','%Y-%m-%d'),55.25000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-01','%Y-%m-%d'),59.89393); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-20','%Y-%m-%d'),58.79573); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-02','%Y-%m-%d'),61.20753); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-21','%Y-%m-%d'),54.09720); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-03','%Y-%m-%d'),58.98340); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-22','%Y-%m-%d'),59.95813); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-04','%Y-%m-%d'),59.55873); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-23','%Y-%m-%d'),62.03067); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-05','%Y-%m-%d'),58.73680); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-24','%Y-%m-%d'),61.97620); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-06','%Y-%m-%d'),59.89967); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-25','%Y-%m-%d'),58.00207); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-07','%Y-%m-%d'),60.67973); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-26','%Y-%m-%d'),59.95440); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-08','%Y-%m-%d'),60.85913); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-27','%Y-%m-%d'),55.43747); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-09','%Y-%m-%d'),60.62460); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-28','%Y-%m-%d'),52.53933); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-10','%Y-%m-%d'),59.51887); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-29','%Y-%m-%d'),57.46260); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-11','%Y-%m-%d'),61.57187); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-30','%Y-%m-%d'),60.04787); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-12','%Y-%m-%d'),60.70000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-31','%Y-%m-%d'),58.79480); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-13','%Y-%m-%d'),69.85133); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-01','%Y-%m-%d'),54.40107); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-14','%Y-%m-%d'),68.99620); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-02','%Y-%m-%d'),62.26007); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-15','%Y-%m-%d'),67.64080); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-03','%Y-%m-%d'),60.72360); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-16','%Y-%m-%d'),59.71433); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-04','%Y-%m-%d'),60.95847); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-17','%Y-%m-%d'),59.99667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-05','%Y-%m-%d'),59.45920); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-18','%Y-%m-%d'),63.27207); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-06','%Y-%m-%d'),60.58620); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-19','%Y-%m-%d'),60.32080); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-07','%Y-%m-%d'),61.94207); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-20','%Y-%m-%d'),57.32907); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-08','%Y-%m-%d'),59.03327); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-21','%Y-%m-%d'),59.76933); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-09','%Y-%m-%d'),62.83087); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-22','%Y-%m-%d'),59.12453); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-10','%Y-%m-%d'),59.36840); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-23','%Y-%m-%d'),57.10167); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-11','%Y-%m-%d'),56.11480); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-24','%Y-%m-%d'),58.45820); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-12','%Y-%m-%d'),62.23393); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-25','%Y-%m-%d'),59.45440); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-13','%Y-%m-%d'),59.72313); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-26','%Y-%m-%d'),60.12807); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-14','%Y-%m-%d'),53.37093); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-27','%Y-%m-%d'),59.11760); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-15','%Y-%m-%d'),52.99233); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-28','%Y-%m-%d'),57.32020); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-16','%Y-%m-%d'),55.99080); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-29','%Y-%m-%d'),59.80360); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-17','%Y-%m-%d'),53.93853); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-30','%Y-%m-%d'),66.73280); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-18','%Y-%m-%d'),55.99313); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-31','%Y-%m-%d'),58.78673); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-19','%Y-%m-%d'),68.23393); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-01','%Y-%m-%d'),58.82773); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-20','%Y-%m-%d'),61.86213); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-02','%Y-%m-%d'),63.12100); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-21','%Y-%m-%d'),61.20307); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-03','%Y-%m-%d'),59.70467); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-22','%Y-%m-%d'),61.05900); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-04','%Y-%m-%d'),58.85173); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-23','%Y-%m-%d'),58.41040); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-05','%Y-%m-%d'),61.21880); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-24','%Y-%m-%d'),59.15967); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-06','%Y-%m-%d'),58.99920); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-25','%Y-%m-%d'),56.42153); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-07','%Y-%m-%d'),59.94693); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-26','%Y-%m-%d'),60.46580); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-08','%Y-%m-%d'),66.27293); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-27','%Y-%m-%d'),57.44333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-09','%Y-%m-%d'),61.46773); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-28','%Y-%m-%d'),56.88887); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-10','%Y-%m-%d'),59.70467); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-29','%Y-%m-%d'),61.85773); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-11','%Y-%m-%d'),60.16000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-30','%Y-%m-%d'),61.96400); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-12','%Y-%m-%d'),61.20300); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-01','%Y-%m-%d'),65.88833); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-13','%Y-%m-%d'),60.95673); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-02','%Y-%m-%d'),62.67920); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-14','%Y-%m-%d'),60.70207); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-03','%Y-%m-%d'),63.52047); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-15','%Y-%m-%d'),61.02520); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-04','%Y-%m-%d'),58.60280); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-16','%Y-%m-%d'),60.33953); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-05','%Y-%m-%d'),63.74487); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-17','%Y-%m-%d'),61.20300); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-06','%Y-%m-%d'),59.94880); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-18','%Y-%m-%d'),63.12100); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-07','%Y-%m-%d'),59.44380); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-23','%Y-%m-%d'),61.09153); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-08','%Y-%m-%d'),59.16320); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-24','%Y-%m-%d'),61.28867); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-09','%Y-%m-%d'),60.84593); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-25','%Y-%m-%d'),60.95673); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-10','%Y-%m-%d'),58.84113); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-26','%Y-%m-%d'),60.61100); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-11','%Y-%m-%d'),62.59827); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-27','%Y-%m-%d'),61.22913); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-12','%Y-%m-%d'),60.94660); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-28','%Y-%m-%d'),58.88507); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-13','%Y-%m-%d'),59.37593); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-29','%Y-%m-%d'),59.73693); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-14','%Y-%m-%d'),67.21840); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-30','%Y-%m-%d'),62.45307); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-15','%Y-%m-%d'),68.56020); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-01','%Y-%m-%d'),61.30167); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-16','%Y-%m-%d'),57.56493); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-02','%Y-%m-%d'),62.92727); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-17','%Y-%m-%d'),57.02280); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-03','%Y-%m-%d'),60.05887); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-18','%Y-%m-%d'),56.20947); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-06','%Y-%m-%d'),61.20100); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-19','%Y-%m-%d'),55.69353); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-07','%Y-%m-%d'),60.66120); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-20','%Y-%m-%d'),57.17640); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-08','%Y-%m-%d'),59.78180); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-21','%Y-%m-%d'),57.50867); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-09','%Y-%m-%d'),58.74653); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-22','%Y-%m-%d'),61.67860); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-10','%Y-%m-%d'),59.77893); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-23','%Y-%m-%d'),57.34867); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-11','%Y-%m-%d'),67.34500); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-24','%Y-%m-%d'),61.68080); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-12','%Y-%m-%d'),57.07293); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-25','%Y-%m-%d'),55.55793); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-13','%Y-%m-%d'),57.37567); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-26','%Y-%m-%d'),55.81013); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-14','%Y-%m-%d'),63.97820); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-27','%Y-%m-%d'),59.85540); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-15','%Y-%m-%d'),56.06647); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-28','%Y-%m-%d'),61.05073); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-16','%Y-%m-%d'),53.66347); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-29','%Y-%m-%d'),59.81253); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-23','%Y-%m-%d'),56.50813); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-30','%Y-%m-%d'),61.02047); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-24','%Y-%m-%d'),53.19667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-31','%Y-%m-%d'),60.60413); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-25','%Y-%m-%d'),51.57133); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-01','%Y-%m-%d'),57.43067); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-26','%Y-%m-%d'),45.98160); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-02','%Y-%m-%d'),58.63027); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-27','%Y-%m-%d'),49.21113); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-03','%Y-%m-%d'),59.08127); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-28','%Y-%m-%d'),49.67213); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-04','%Y-%m-%d'),59.37373); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-29','%Y-%m-%d'),52.94053); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-05','%Y-%m-%d'),58.13413); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-30','%Y-%m-%d'),57.55727); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-06','%Y-%m-%d'),57.18893); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-31','%Y-%m-%d'),61.76900); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-07','%Y-%m-%d'),56.72853); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-01','%Y-%m-%d'),56.51953); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-08','%Y-%m-%d'),56.47340); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-02','%Y-%m-%d'),61.04853); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-09','%Y-%m-%d'),62.02333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-03','%Y-%m-%d'),70.06067); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-10','%Y-%m-%d'),61.21787); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-04','%Y-%m-%d'),60.97787); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-11','%Y-%m-%d'),62.01087); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-05','%Y-%m-%d'),59.25967); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-12','%Y-%m-%d'),62.67573); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-06','%Y-%m-%d'),56.12287); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-13','%Y-%m-%d'),59.23993); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-07','%Y-%m-%d'),63.99913); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-14','%Y-%m-%d'),67.34973); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-08','%Y-%m-%d'),58.71127); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-15','%Y-%m-%d'),60.93753); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-09','%Y-%m-%d'),64.01913); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-16','%Y-%m-%d'),54.52607); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-17','%Y-%m-%d'),57.81127); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-18','%Y-%m-%d'),63.53027); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-19','%Y-%m-%d'),58.13000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-20','%Y-%m-%d'),58.46827); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-21','%Y-%m-%d'),65.27807); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-22','%Y-%m-%d'),53.74513); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-23','%Y-%m-%d'),60.99107); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-24','%Y-%m-%d'),60.45427); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-25','%Y-%m-%d'),56.16847); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-26','%Y-%m-%d'),59.04040); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-27','%Y-%m-%d'),54.62040); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-28','%Y-%m-%d'),56.34687); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-29','%Y-%m-%d'),54.81560); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-30','%Y-%m-%d'),60.22753); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-01','%Y-%m-%d'),59.07307); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-02','%Y-%m-%d'),59.73553); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-03','%Y-%m-%d'),68.69447); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-04','%Y-%m-%d'),68.91767); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-05','%Y-%m-%d'),67.86460); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-06','%Y-%m-%d'),64.43120); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-01','%Y-%m-%d'),61.22507); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-07','%Y-%m-%d'),60.67793); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-02','%Y-%m-%d'),63.27533); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-08','%Y-%m-%d'),62.47060); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-03','%Y-%m-%d'),69.88087); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-09','%Y-%m-%d'),58.26053); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-04','%Y-%m-%d'),66.84920); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-10','%Y-%m-%d'),61.03340); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-05','%Y-%m-%d'),61.57367); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-11','%Y-%m-%d'),57.32620); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-06','%Y-%m-%d'),60.52293); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-12','%Y-%m-%d'),63.10353); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-07','%Y-%m-%d'),62.21027); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-13','%Y-%m-%d'),61.73167); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-08','%Y-%m-%d'),63.20380); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-14','%Y-%m-%d'),65.31080); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-09','%Y-%m-%d'),62.72427); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-15','%Y-%m-%d'),64.67620); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-10','%Y-%m-%d'),61.59373); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-16','%Y-%m-%d'),62.87287); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-11','%Y-%m-%d'),61.21280); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-17','%Y-%m-%d'),60.14680); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-12','%Y-%m-%d'),60.79787); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-18','%Y-%m-%d'),63.01007); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-13','%Y-%m-%d'),60.00080); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-19','%Y-%m-%d'),57.82680); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-14','%Y-%m-%d'),60.82333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-20','%Y-%m-%d'),62.59173); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-15','%Y-%m-%d'),59.62020); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-21','%Y-%m-%d'),61.65607); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-16','%Y-%m-%d'),60.27420); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-23','%Y-%m-%d'),61.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-17','%Y-%m-%d'),60.06200); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-24','%Y-%m-%d'),59.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-18','%Y-%m-%d'),60.88900); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-25','%Y-%m-%d'),50.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-19','%Y-%m-%d'),59.92547); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-26','%Y-%m-%d'),60.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-20','%Y-%m-%d'),59.99853); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-27','%Y-%m-%d'),62.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-21','%Y-%m-%d'),58.65873); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-28','%Y-%m-%d'),61.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-22','%Y-%m-%d'),60.61000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-29','%Y-%m-%d'),61.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-23','%Y-%m-%d'),59.92280); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-30','%Y-%m-%d'),61.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-24','%Y-%m-%d'),59.52427); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-31','%Y-%m-%d'),62.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-25','%Y-%m-%d'),59.44887); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-01','%Y-%m-%d'),60.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-26','%Y-%m-%d'),60.23540); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-02','%Y-%m-%d'),62.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-27','%Y-%m-%d'),61.18333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-03','%Y-%m-%d'),62.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-28','%Y-%m-%d'),60.88133); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-04','%Y-%m-%d'),60.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-29','%Y-%m-%d'),61.74160); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-06','%Y-%m-%d'),62.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-30','%Y-%m-%d'),60.25647); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-08','%Y-%m-%d'),61.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-31','%Y-%m-%d'),60.41220); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-09','%Y-%m-%d'),63.20000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-01','%Y-%m-%d'),59.21053); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-10','%Y-%m-%d'),61.82227); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-02','%Y-%m-%d'),55.04713); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-11','%Y-%m-%d'),61.89553); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-03','%Y-%m-%d'),56.08473); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-12','%Y-%m-%d'),60.90127); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-04','%Y-%m-%d'),64.51107); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-13','%Y-%m-%d'),62.23660); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-05','%Y-%m-%d'),56.75193); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-14','%Y-%m-%d'),61.76947); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-06','%Y-%m-%d'),61.64240); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-15','%Y-%m-%d'),63.08853); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-07','%Y-%m-%d'),61.33653); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-16','%Y-%m-%d'),60.12627); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-08','%Y-%m-%d'),69.28867); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-17','%Y-%m-%d'),60.60020); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-09','%Y-%m-%d'),60.87507); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-18','%Y-%m-%d'),60.43440); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-10','%Y-%m-%d'),68.08707); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-19','%Y-%m-%d'),65.02820); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-11','%Y-%m-%d'),60.57680); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-20','%Y-%m-%d'),62.95593); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-12','%Y-%m-%d'),61.52467); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-21','%Y-%m-%d'),61.23967); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-13','%Y-%m-%d'),58.06567); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-22','%Y-%m-%d'),62.61853); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-14','%Y-%m-%d'),59.80807); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-23','%Y-%m-%d'),63.64227); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-15','%Y-%m-%d'),79.90007); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-24','%Y-%m-%d'),63.42147); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-16','%Y-%m-%d'),54.75020); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-25','%Y-%m-%d'),60.82687); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-17','%Y-%m-%d'),65.69500); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-26','%Y-%m-%d'),60.66260); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-18','%Y-%m-%d'),68.56247); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-27','%Y-%m-%d'),60.12767); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-19','%Y-%m-%d'),72.67153); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-28','%Y-%m-%d'),60.51513); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-20','%Y-%m-%d'),71.30720); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-29','%Y-%m-%d'),61.71520); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-21','%Y-%m-%d'),57.75233); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-30','%Y-%m-%d'),60.89553); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-22','%Y-%m-%d'),59.04200); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-31','%Y-%m-%d'),63.50540); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-23','%Y-%m-%d'),62.30153); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-01','%Y-%m-%d'),62.37533); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-24','%Y-%m-%d'),67.68287); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-02','%Y-%m-%d'),60.31400); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-25','%Y-%m-%d'),69.21800); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-03','%Y-%m-%d'),63.43920); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-26','%Y-%m-%d'),69.75993); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-04','%Y-%m-%d'),61.20487); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-27','%Y-%m-%d'),64.64113); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-05','%Y-%m-%d'),62.11167); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-28','%Y-%m-%d'),60.10053); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-06','%Y-%m-%d'),59.96140); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-29','%Y-%m-%d'),58.67653); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-07','%Y-%m-%d'),62.60727); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-30','%Y-%m-%d'),58.29180); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-08','%Y-%m-%d'),61.95493); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-01','%Y-%m-%d'),60.56173); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-09','%Y-%m-%d'),58.89653); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-02','%Y-%m-%d'),57.15840); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-10','%Y-%m-%d'),66.20167); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-03','%Y-%m-%d'),54.49167); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-11','%Y-%m-%d'),64.76873); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-04','%Y-%m-%d'),61.54087); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-12','%Y-%m-%d'),69.90680); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-05','%Y-%m-%d'),63.86073); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-13','%Y-%m-%d'),68.49253); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-06','%Y-%m-%d'),64.13460); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-14','%Y-%m-%d'),63.19360); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-07','%Y-%m-%d'),65.30087); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-15','%Y-%m-%d'),63.35453); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-08','%Y-%m-%d'),64.46353); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-16','%Y-%m-%d'),59.78020); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-09','%Y-%m-%d'),62.81193); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-17','%Y-%m-%d'),60.70760); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-10','%Y-%m-%d'),56.14480); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-18','%Y-%m-%d'),58.05167); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-11','%Y-%m-%d'),61.47853); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-19','%Y-%m-%d'),57.12700); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-12','%Y-%m-%d'),63.39287); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-20','%Y-%m-%d'),59.49013); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-13','%Y-%m-%d'),64.30640); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-21','%Y-%m-%d'),59.18607); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-14','%Y-%m-%d'),64.29447); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-22','%Y-%m-%d'),60.94680); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-15','%Y-%m-%d'),65.63307); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-23','%Y-%m-%d'),59.85807); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-16','%Y-%m-%d'),62.32887); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-24','%Y-%m-%d'),60.06767); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-17','%Y-%m-%d'),56.52853); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-25','%Y-%m-%d'),61.60267); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-18','%Y-%m-%d'),70.26520); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-26','%Y-%m-%d'),60.94220); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-19','%Y-%m-%d'),64.38267); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-27','%Y-%m-%d'),59.99040); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-20','%Y-%m-%d'),63.01447); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-28','%Y-%m-%d'),63.05567); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-21','%Y-%m-%d'),61.89200); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-22','%Y-%m-%d'),62.06920); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-23','%Y-%m-%d'),68.49253); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-24','%Y-%m-%d'),69.98867); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-25','%Y-%m-%d'),60.26940); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-26','%Y-%m-%d'),62.91493); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-09','%Y-%m-%d'),62.28433); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-27','%Y-%m-%d'),62.36827); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-10','%Y-%m-%d'),64.38787); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-11','%Y-%m-%d'),61.17093); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-28','%Y-%m-%d'),60.33887); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-12','%Y-%m-%d'),57.17713); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-29','%Y-%m-%d'),83.89220); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-13','%Y-%m-%d'),57.69653); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-30','%Y-%m-%d'),60.96747); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-14','%Y-%m-%d'),55.97980); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-31','%Y-%m-%d'),57.80627); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-15','%Y-%m-%d'),62.08940); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-01','%Y-%m-%d'),61.60173); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-16','%Y-%m-%d'),83.81047); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-02','%Y-%m-%d'),63.23627); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-17','%Y-%m-%d'),61.32540); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-03','%Y-%m-%d'),58.39987); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-18','%Y-%m-%d'),61.08900); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-04','%Y-%m-%d'),69.51947); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-19','%Y-%m-%d'),67.26267); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-05','%Y-%m-%d'),69.67787); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-20','%Y-%m-%d'),58.71120); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-06','%Y-%m-%d'),62.40513); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-21','%Y-%m-%d'),55.77320); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-07','%Y-%m-%d'),61.01893); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-22','%Y-%m-%d'),59.99420); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-08','%Y-%m-%d'),61.34813); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-23','%Y-%m-%d'),60.83867); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-24','%Y-%m-%d'),59.57020); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-25','%Y-%m-%d'),63.20393); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-17','%Y-%m-%d'),67.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-26','%Y-%m-%d'),58.30480); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-18','%Y-%m-%d'),64.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-27','%Y-%m-%d'),58.79667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-19','%Y-%m-%d'),60.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-28','%Y-%m-%d'),54.04967); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-20','%Y-%m-%d'),57.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-29','%Y-%m-%d'),57.88313); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-21','%Y-%m-%d'),58.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-30','%Y-%m-%d'),56.94940); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-22','%Y-%m-%d'),59.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-01','%Y-%m-%d'),65.01080); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-23','%Y-%m-%d'),59.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-02','%Y-%m-%d'),64.97013); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-24','%Y-%m-%d'),59.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-03','%Y-%m-%d'),65.06647); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-25','%Y-%m-%d'),59.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-04','%Y-%m-%d'),64.08287); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-26','%Y-%m-%d'),76.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-05','%Y-%m-%d'),65.40367); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-27','%Y-%m-%d'),59.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-06','%Y-%m-%d'),72.61373); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-28','%Y-%m-%d'),59.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-07','%Y-%m-%d'),72.53120); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-29','%Y-%m-%d'),58.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-08','%Y-%m-%d'),72.54133); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-26','%Y-%m-%d'),58.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-30','%Y-%m-%d'),54.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-01','%Y-%m-%d'),58.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-02','%Y-%m-%d'),59.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-03','%Y-%m-%d'),58.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-04','%Y-%m-%d'),60.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-05','%Y-%m-%d'),101.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-06','%Y-%m-%d'),58.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-07','%Y-%m-%d'),59.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-08','%Y-%m-%d'),56.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-09','%Y-%m-%d'),57.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-10','%Y-%m-%d'),65.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-11','%Y-%m-%d'),56.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-12','%Y-%m-%d'),54.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-13','%Y-%m-%d'),68.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-14','%Y-%m-%d'),69.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-15','%Y-%m-%d'),66.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-16','%Y-%m-%d'),58.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-17','%Y-%m-%d'),60.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-18','%Y-%m-%d'),58.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-19','%Y-%m-%d'),55.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-20','%Y-%m-%d'),55.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-21','%Y-%m-%d'),57.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-22','%Y-%m-%d'),57.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-23','%Y-%m-%d'),58.20000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-24','%Y-%m-%d'),57.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-25','%Y-%m-%d'),58.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-26','%Y-%m-%d'),61.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-27','%Y-%m-%d'),57.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-28','%Y-%m-%d'),58.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-29','%Y-%m-%d'),59.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-30','%Y-%m-%d'),55.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-31','%Y-%m-%d'),53.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-01','%Y-%m-%d'),56.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-02','%Y-%m-%d'),57.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-03','%Y-%m-%d'),55.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-04','%Y-%m-%d'),57.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-05','%Y-%m-%d'),65.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-06','%Y-%m-%d'),55.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-07','%Y-%m-%d'),57.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-08','%Y-%m-%d'),59.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-09','%Y-%m-%d'),60.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-10','%Y-%m-%d'),58.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-11','%Y-%m-%d'),58.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-12','%Y-%m-%d'),57.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-13','%Y-%m-%d'),57.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-14','%Y-%m-%d'),55.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-15','%Y-%m-%d'),55.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-16','%Y-%m-%d'),58.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-17','%Y-%m-%d'),58.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-18','%Y-%m-%d'),64.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-19','%Y-%m-%d'),59.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-20','%Y-%m-%d'),57.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-21','%Y-%m-%d'),57.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-22','%Y-%m-%d'),59.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-23','%Y-%m-%d'),56.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-24','%Y-%m-%d'),58.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-25','%Y-%m-%d'),57.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-26','%Y-%m-%d'),57.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-27','%Y-%m-%d'),53.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-28','%Y-%m-%d'),58.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-29','%Y-%m-%d'),56.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-30','%Y-%m-%d'),58.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-01','%Y-%m-%d'),60.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-02','%Y-%m-%d'),59.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-03','%Y-%m-%d'),58.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-04','%Y-%m-%d'),77.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-05','%Y-%m-%d'),56.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-06','%Y-%m-%d'),55.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-07','%Y-%m-%d'),57.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-08','%Y-%m-%d'),57.20000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-09','%Y-%m-%d'),71.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-10','%Y-%m-%d'),62.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-11','%Y-%m-%d'),59.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-12','%Y-%m-%d'),59.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-13','%Y-%m-%d'),62.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-14','%Y-%m-%d'),59.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-15','%Y-%m-%d'),59.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-16','%Y-%m-%d'),62.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-17','%Y-%m-%d'),66.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-18','%Y-%m-%d'),59.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-19','%Y-%m-%d'),60.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-20','%Y-%m-%d'),57.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-21','%Y-%m-%d'),60.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-22','%Y-%m-%d'),59.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-23','%Y-%m-%d'),61.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-24','%Y-%m-%d'),57.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-25','%Y-%m-%d'),52.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-09','%Y-%m-%d'),70.77980); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-10','%Y-%m-%d'),70.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-11','%Y-%m-%d'),60.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-12','%Y-%m-%d'),58.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-13','%Y-%m-%d'),58.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-14','%Y-%m-%d'),58.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-15','%Y-%m-%d'),68.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-16','%Y-%m-%d'),84.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-17','%Y-%m-%d'),61.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-18','%Y-%m-%d'),64.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-19','%Y-%m-%d'),59.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-20','%Y-%m-%d'),77.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-21','%Y-%m-%d'),60.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-22','%Y-%m-%d'),65.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-23','%Y-%m-%d'),68.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-24','%Y-%m-%d'),58.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-25','%Y-%m-%d'),56.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-26','%Y-%m-%d'),58.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-27','%Y-%m-%d'),59.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-28','%Y-%m-%d'),59.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-29','%Y-%m-%d'),58.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-30','%Y-%m-%d'),59.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-27','%Y-%m-%d'),59.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-31','%Y-%m-%d'),57.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-28','%Y-%m-%d'),305.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-01','%Y-%m-%d'),59.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-29','%Y-%m-%d'),62.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-02','%Y-%m-%d'),61.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-30','%Y-%m-%d'),60.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-03','%Y-%m-%d'),59.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-31','%Y-%m-%d'),60.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-04','%Y-%m-%d'),83.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-01','%Y-%m-%d'),55.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-05','%Y-%m-%d'),59.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-02','%Y-%m-%d'),61.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-06','%Y-%m-%d'),58.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-03','%Y-%m-%d'),61.20000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-07','%Y-%m-%d'),59.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-04','%Y-%m-%d'),62.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-08','%Y-%m-%d'),57.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-05','%Y-%m-%d'),61.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-09','%Y-%m-%d'),58.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-06','%Y-%m-%d'),61.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-10','%Y-%m-%d'),59.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-07','%Y-%m-%d'),62.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-11','%Y-%m-%d'),58.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-08','%Y-%m-%d'),100.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-12','%Y-%m-%d'),57.20000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-09','%Y-%m-%d'),62.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-13','%Y-%m-%d'),61.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-10','%Y-%m-%d'),66.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-14','%Y-%m-%d'),58.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-11','%Y-%m-%d'),61.20000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-15','%Y-%m-%d'),59.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-12','%Y-%m-%d'),60.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-16','%Y-%m-%d'),61.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-13','%Y-%m-%d'),61.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-17','%Y-%m-%d'),59.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-14','%Y-%m-%d'),60.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-18','%Y-%m-%d'),59.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-15','%Y-%m-%d'),61.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-19','%Y-%m-%d'),59.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-16','%Y-%m-%d'),61.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-20','%Y-%m-%d'),60.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-17','%Y-%m-%d'),70.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-21','%Y-%m-%d'),63.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-18','%Y-%m-%d'),61.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-22','%Y-%m-%d'),58.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-19','%Y-%m-%d'),61.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-23','%Y-%m-%d'),59.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-20','%Y-%m-%d'),61.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-24','%Y-%m-%d'),59.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-21','%Y-%m-%d'),61.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-25','%Y-%m-%d'),63.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-22','%Y-%m-%d'),60.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-26','%Y-%m-%d'),61.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-23','%Y-%m-%d'),61.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-27','%Y-%m-%d'),60.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-24','%Y-%m-%d'),60.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-28','%Y-%m-%d'),57.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-25','%Y-%m-%d'),61.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-29','%Y-%m-%d'),59.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-26','%Y-%m-%d'),61.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-30','%Y-%m-%d'),57.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-27','%Y-%m-%d'),61.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-31','%Y-%m-%d'),59.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-28','%Y-%m-%d'),61.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-01','%Y-%m-%d'),58.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-29','%Y-%m-%d'),61.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-02','%Y-%m-%d'),61.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-30','%Y-%m-%d'),61.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-03','%Y-%m-%d'),59.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-31','%Y-%m-%d'),59.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-04','%Y-%m-%d'),59.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-01','%Y-%m-%d'),60.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-05','%Y-%m-%d'),59.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-02','%Y-%m-%d'),60.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-06','%Y-%m-%d'),61.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-03','%Y-%m-%d'),60.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-07','%Y-%m-%d'),59.20000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-04','%Y-%m-%d'),61.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-08','%Y-%m-%d'),61.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-05','%Y-%m-%d'),60.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-09','%Y-%m-%d'),61.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-06','%Y-%m-%d'),60.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-10','%Y-%m-%d'),60.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-07','%Y-%m-%d'),60.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-11','%Y-%m-%d'),58.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-08','%Y-%m-%d'),61.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-12','%Y-%m-%d'),58.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-09','%Y-%m-%d'),61.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-13','%Y-%m-%d'),58.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-10','%Y-%m-%d'),60.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-14','%Y-%m-%d'),60.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-11','%Y-%m-%d'),60.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-15','%Y-%m-%d'),62.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-12','%Y-%m-%d'),59.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-16','%Y-%m-%d'),65.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-13','%Y-%m-%d'),61.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-14','%Y-%m-%d'),69.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-15','%Y-%m-%d'),59.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-16','%Y-%m-%d'),59.80000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-17','%Y-%m-%d'),60.46667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-18','%Y-%m-%d'),61.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-19','%Y-%m-%d'),62.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-20','%Y-%m-%d'),60.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-21','%Y-%m-%d'),59.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-22','%Y-%m-%d'),61.40000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-23','%Y-%m-%d'),60.93333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-24','%Y-%m-%d'),64.13333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-25','%Y-%m-%d'),61.53333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-26','%Y-%m-%d'),59.06667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-27','%Y-%m-%d'),61.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-28','%Y-%m-%d'),60.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-29','%Y-%m-%d'),61.00000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-01','%Y-%m-%d'),61.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-02','%Y-%m-%d'),61.66667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-03','%Y-%m-%d'),60.73333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-04','%Y-%m-%d'),61.26667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-05','%Y-%m-%d'),61.60000); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-06','%Y-%m-%d'),61.33333); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-07','%Y-%m-%d'),61.86667); +-- INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-08','%Y-%m-%d'),62.00000); + +commit; diff --git a/dcae_dmaapbc_webapp/db-scripts/dbca-user-mysql.sql b/dcae_dmaapbc_webapp/db-scripts/dbca-user-mysql.sql new file mode 100644 index 0000000..b1b8be5 --- /dev/null +++ b/dcae_dmaapbc_webapp/db-scripts/dbca-user-mysql.sql @@ -0,0 +1,5 @@ +-- This trivial script creates a default user for the +-- database used by the DMaaP Bus Controller application +-- and the DMaaP Bus Controller microservice. +create user 'dbcauser'@'localhost' identified by 'dbca1234'; +grant all on dbca.* to dbcauser@localhost; diff --git a/dcae_dmaapbc_webapp/db-scripts/mysqldump-notes.txt b/dcae_dmaapbc_webapp/db-scripts/mysqldump-notes.txt new file mode 100644 index 0000000..f204ae5 --- /dev/null +++ b/dcae_dmaapbc_webapp/db-scripts/mysqldump-notes.txt @@ -0,0 +1,7 @@ +Create a Mysql database backup using this command: + + mysqldump -h (HOST) -u (USER) -p (DBNAME) > out-file + +For example: + + mysqldump -h host -u dbpauser -p xxxx > out.sql diff --git a/dcae_dmaapbc_webapp/dbc-app-deployment-guide.txt b/dcae_dmaapbc_webapp/dbc-app-deployment-guide.txt new file mode 100644 index 0000000..2169363 --- /dev/null +++ b/dcae_dmaapbc_webapp/dbc-app-deployment-guide.txt @@ -0,0 +1,363 @@ + + DEPLOYMENT AND ON-BOARDING GUIDE + for the + DATA BUS CONTROLLER WEB APPLICATION + + ECOMP Release 1610 + + + Contact: Christopher Lott + +-- + +1.0 Purpose and Scope + +1.1 This deployment guide offers instructions to install the Data Bus +Controller webapp in ECOMP Release 1610, and to on-board the application +into the ECOMP Portal. + +This application is packaged as a single WAR file with all CSS, HTML, +JavaScript, compiled Java classes and Jar files together in a single +deployable bundle. No front-end/back-end separation is implemented for +1610. + +2.0 Service Impact and Time Estimates + +2.1 This DG has the following estimated timings and service impacts: + +Name Estimated Time Service Impact +---- ------------ ----------- +Pre Maintenance N/A N/A +Window + +Maintenance 60 App is down +Window + +Post Maintenance N/A N/A +Window + +Rollback 30 App is down +Procedure + + +3.0 Assumptions + +3.1 The operator who is performing the change must have adequate +system administrative privileges for the affected systems, which usually +means superuser access on the Linux host, and Portal administrator +status in the ECOMP Portal. + +3.2 This deployment guide assumes that ECOMP Portal 1610 is installed +and working according to that release’s Deployment Guide. + +3.3 Nick Picciocca will be the DevOps escalation for this change. + +3.4 For staged files, ENV will represent the overall environment and +SERVERNAME is a file specific to the server. + +3.4.1 Valid environments in 1610 are as follows: + DEVN1 + QA1 + QA2 + IST (not geo redundant) + ETE1 + ETE2 + PROD1 + PROD2 + +4.0 Prerequisites + +4.1 All connectivity should be in place and tested. + +4.1.1 Please see ECP_CM_v2.2.xlsx (connectivity matrix). + +4.1.2 WebJunction addresses have been created for the DMaaP Bus Control +application, using the usual CSP-WJ application form. +Although the application is co-hosted with the Portal application, sharing +the Portal's WJ is not sufficient - proper cookie management requires two +separate WJ addresses. Addresses are defined for the DEV_N1, QA, IST, ETE +and PROD environments. + +4.2 All tooling must properly installed to support UAM / SWM based installation. + +4.3 Software + +4.3.1 Java + +Java version 1.8 with a recent update must be installed. Java includes a +file with known root certificates, which may require changes to recognize +self-signed server certificates. + +4.3.2 Apache Tomcat + +Version 8 of the Apache Tomcat server must be installed. The Apache HTTPD +package may also be required, but details about front-end (HTTPD) / back-end +(Tomcat) separation are outside the scope of this document. + +4.3.3 MariaDB + +These instructions assume version 10.1.13-MariaDB or later. + +4.4 Web Application Archive (WAR) File + +The DBC web application is built by maven and packaged as a war file. This +deployment guide does not cover the build process, which is assumed to be +covered by Continuous Integration / Continuous Deployment efforts. + +4.5 Property Files + +The DBC web app requires appropriate configuration for each deployment environment. +Configurations are represented as key-values pairs stored in property files. + +4.5.1 Portal Properties for ecompFW Library + +This file within the web application contains properties used by the ecompFW library: + + WEB-INF/classes/portal.properties + +The application requires the location of the hosting Portal's REST endpoint in +this config key: + - ecomp_rest_url + +The application requires the unique UEB key that's assigned during the on-boarding +process in the following config key: + - ueb_app_key + + +4.5.2 Quantum Library System Properties + +This file within the web application database properties used by the ecompSDK-core library: + + WEB-INF/conf/system.properties + +The application requires the base URL of the WebJunction where users enter via +the Portal application, which is a proper prefix of the URL used to on-board the +application to Portal. The file in source code management has the expected values +for each environment in release 1610 for use in the following key: + - app_base_url + +The application requires suitable database coordinates in the following config keys. +Note that the database password must be encrypted using the ECOMP Portal utility class +CipherUtil: + - db.connectionURL + - db.userName + - db.password + +For example, the following connection URL configures the application for a local MySQL +database named "dbca": + + db.connectionURL = jdbc:mysql://localhost:3306/dbca + +As part of deployment, the following config key must be updated with a unique UUID. +For example, a new value can be generated at https://www.uuidgenerator.net/version1 + - instance_uuid + + +4.5.3 Data Bus Control App Properties + +This file within the web application properties used by the web application; +an example file is in source code management: + + WEB-INF/dbcapp/dbcapp.properties + +The application requires a comma-separated list of DCAE DMaaP Bus Controller +URLs in the following config key. The file in source code management has the +expected values for each environment in release 1610 for use in the following key: + - dmaap.rest.url.list + +As part of deployment, the following key must be set to choose whether the DMaaP +access profile interface is a local database ("dao") or the micro service ("rest"). +In release 1610 the expected value is "rest"; the other is only for debugging. + - profile.access.method + +If the profile access method is "rest" (i.e., microservice), the following keys must be +configured with the coordinates of the micro service. The URL will always use "localhost" +as the hostname, but the port may vary: + - profile.microservice.url + - profile.microservice.user.name + - profile.microservice.user.password + +Finally, the application uses a mech ID as the default credentials presented to the +DCAE REST endpoint. A mech ID and password must be configured using the following keys. +The file in source code management has the mech ID assigned to the web application, and +the password is encrypted using the ECOMP Portal utility class CipherUtil. No changes +are expected to these config keys during deployment: + - dmaap.mechid.name + - dmaap.mechid.password + + +PRE MAINTENANCE WINDOW PREPARATION + + N/A + + +MAINTENANCE WINDOW WORK (60 mins) + +5.0 Database + +This uses MariaDB. + +5.1 Database Creation + +Login to the database with super user privileges and type the following commands +to create a Mysql database, create a user and grant privileges to the user to +access all tables in the new database: + +% mysql -u root -p + + create database dbca; + create user 'dbcuser'@'localhost' identified by 'dbpa1234'; + grant all on dbca.* to dbcuser@localhost; + +5.2 Database Loading + +As part of deployment the database must be loaded with menu items and a super user entry. +The following files are part of the application source area. Copy these files to /var/tmp: + + db-scripts/EcompSdkDDLMySql.sql + db-scripts/EcompSdkDMLMySql.sql + db-scripts/dbca-ddl-dml-mysql.sql + +Create tables and populate the tables by running the scripts in the order shown below. +On one node of the MariaDB Cluster, in the Mysql command-line client, execute the following +commands: + + source /var/tmp/EcompSdkDDLMySql.sql + source /var/tmp/EcompSdkDMLMySql.sql + source /var/tmp/dbca-ddl-dml-mysql.sql + + +6.0 Application Installation + +6.1 Copy the application war file and the property files as prepared above to directory /var/tmp: + + dmaap-bc-app-1.0.war + portal.properties-1610 + system.properties-1610 + +6.2 Deploy the application war file. + +Stop the server and clean the logs + + service tomcat stop + rm -f /opt/app/tomcat/logs/catalina.out + +If a previous version is installed, make a backup: + +Copy the war file to the server's webapps area (the destination names are suggestions only): + +Start the server so it unpacks the WAR archive, then immediately stop the server again. + service tomcat start; sleep 30; service tomcat stop + +Copy the appropriate property files into place: + + cp /var/tmp/system.properties-1610 /opt/app/tomcat/webapps/dmaap-bc-app/WEB-INF/conf/system.properties + cp /var/tmp/portal.properties-1610 /opt/app/tomcat/webapps/dmaap-bc-app/WEB-INF/classes/portal.properties + + +6.3 Test Tomcat and Application: + +Launch the Tomcat server. It should deploy the application. After starting, verify there are no +relevant errors in file /opt/app/tomcat/logs/application.log + + service tomcat start + service tomcat status + tail -f /opt/app/tomcat/logs/catalina.out + +6.4 Login to Application + +After the database is first created the application has exactly one user, and that user has +administrator privileges. Look in the file EcompSdkDMLMySql.sql for the sole row added to +the FN_USER table. Use the username and password from that row to login at this URL in the +running application. Use the application deployment (context) name chosen above to form the +proper url, it will be something like this: + + http://servername.openecomp.org:port/dmaap-bc-app/login_external.htm + +6.5 Import Users + +For testing purposes ONLY, users may be imported from WEBPHONE after logging in to the +application. Find the Profile part on the left-hand menu, click on Import From WEBPHONE, and +import users. Testers can then logon via the CSP Global Log On process starting with this URL: + + http://servername.openecomp.org:port/dmaap-bc-app/login.htm + +For normal usage, users are configured via the ECOMP Portal after the application has been +on-boarded, as discussed in the next section. + + +7.O ON-BOARD TO ECOMP PORTAL + +The application must be on-boarded to an appropriate instance of the ECOMP Portal. + +This section summarizes the steps that must be done. + +7.1 Define Users and Roles + +Login directly to the application as discussed above and create roles. + +7.2 Determine URLs + +Determine the URLs where the application is available. + +7.2.1 The first URL to enter is the main application landing page, and in general +must use HTTPS; for example: + + https://www.server.openecomp.org:port/dmaap-bc-app/dbc/ + +7.2.2. The second URL to enter is the REST endpoint, also known as the "aux" API where +the SDK-core library listens for requests to manage roles and users. This should use +HTTPS but must NOT use a WebJunction URL; it probably points to a load balancer site. +For example: + + https://server.openecomp.org:port/dmaap-bc-app/api + +7.3 Configure Portal + +An ECOMP Portal administrator must use the Portal on-boarding screen to create/register +this application. + +7.3.1 This screen accepts the URLs from the previous step. + +7.3.2 This screen accepts an application thumbnail image. + +7.3.3. The onboarding process will cause new UEB key information to be generated +and emailed to the on-boarding user. This information must be entered in the +application configuration file(s). + +7.4 Add Application Users from Portal + +After successful on-boarding, the Portal should be able to manage users in the remote +application. Use the User Management feature to provision new users on the application. + +7.5 Test Access from Portal + +The Portal will display a tile on the applications home screen. Click the tile. +This should open a tab in the user's browser with the DBC web application. + + +8.0 POST MAINTENANCE WINDOW WORK + +N/A + + +9.0 ROLLBACK PROCEDURE + +To restore the previous Data Bus Controll App version, stop the server +and remove the new version: + + service tomcat stop + rm /opt/app/tomcat/webapps/dmaap-bc-app.war + rm -rf /opt/app/tomcat/webapps/dmaap-bc-app + +Then restore the old files. + +Start the server to deploy the WAR file, and stop again: + service tomcat start; sleep 30; service tomcat stop + +Copy in property files: + cp /opt/app/tomcat/webapps/dmaap-bc-app-DATE/WEB-INF/conf/system.properties /opt/app/tomcat/webapps/dmaap-bc-app/WEB-INF/conf/system.properties + cp /opt/app/tomcat/webapps/dmaap-bc-app-DATE/WEB-INF/classes/portal.properties /opt/app/tomcat/webapps/dmaap-bc-app/WEB-INF/classes/portal.properties + +Finally restart the server + service tomcat start diff --git a/dcae_dmaapbc_webapp/ecomp_dcae_logo_170x130.png b/dcae_dmaapbc_webapp/ecomp_dcae_logo_170x130.png new file mode 100644 index 0000000000000000000000000000000000000000..2b1955357473e1319f71ab4eb506ebfafb462d1e GIT binary patch literal 21818 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

KFESItxSK5GKT|qV2f{rE` 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:h@*tdwR>^&OcV)23fh`%zEmetoM`;BlgW`ug77 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 literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/pom.xml b/dcae_dmaapbc_webapp/pom.xml new file mode 100644 index 0000000..8dbe125 --- /dev/null +++ b/dcae_dmaapbc_webapp/pom.xml @@ -0,0 +1,369 @@ + + + 4.0.0 + + + org.openecomp.ui.dmaapbc + dmaap-bc-app + 1.0.0 + war + DMaaP Bus Controller Webapp + DCAE DMaaP Bus Controller GUI based on the ECOMP Portal Open-Source SDK + + https://gitlab/projects/ST_DBPA/repos/dcae_dmaapbc_webapp/browse + scm:git:ssh://git@gitlab/st_dbpa/dcae_dmaapbc_webapp.git + + + + UTF-8 + 1.0.0 + 4.2.0.RELEASE + 4.3.11.Final + + true + + 0 + **.js + + + + + + nexus-snapshots + Nexus Maven Central - Snapshots + https://ecomp-nexus:8443/repository/maven-snapshots/ + + + + nexus + Nexus Maven Central - Releases + https://ecomp-nexus:8443/repository/maven-releases/ + + + + + + + doclint-java8-disable + + [1.8,) + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + -Xdoclint:none + + + + + + + + + + + ${project.artifactId}.${project.version}.${build.number} + + + + com.blackducksoftware.integration + hub-maven-plugin + 1.4.0 + false + + ${project.name} + ${project.basedir} + + + + create-bdio-file + package + + createHubOutput + + + + + + org.codehaus.mojo + sonar-maven-plugin + 3.2 + + + org.apache.maven.plugins + maven-scm-plugin + 1.8.1 + + developerConnection + branch + master + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + false + org.umlgraph.doclet.UmlGraphDoc + + org.umlgraph + umlgraph + 5.6 + + -views + true + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + ${skiptests} + + **/Test*.java + **/*Test.java + **/*TestCase.java + + + ${basedir}/war + + + classpath: + + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.0.2 + + + + true + + + ${build.number} + ${maven.build.timestamp} + + + + + + + + org.apache.maven.plugins + maven-site-plugin + 3.6 + + + org.apache.maven.wagon + wagon-webdav-jackrabbit + 2.10 + + + + + + + org.apache.maven.plugins + maven-release-plugin + 2.5.3 + + + + + + + + org.openecomp.ui.dmaapbc + dmaap-bc-client + 1.0.0 + + + + org.apache.httpcomponents + httpclient + 4.3.5 + + + + org.openecomp.ecompsdkos + ecompSDK-core + ${epsdk.version} + + + com.att.eelf + eelf-core + 0.0.1 + + + + com.fasterxml.jackson.core + jackson-annotations + 2.6.3 + + + com.fasterxml.jackson.core + jackson-core + 2.6.3 + + + com.fasterxml.jackson.core + jackson-databind + 2.6.3 + + + com.mchange + c3p0 + 0.9.5.2 + + + io.searchbox + jest + 2.0.0 + + + commons-logging + commons-logging + + + + + javax.servlet + javax.servlet-api + 3.1.0 + + + junit + junit + 4.12 + + + + org.elasticsearch + elasticsearch + 2.2.0 + + + org.json + json + 20160212 + + + org.quartz-scheduler + quartz + 2.2.1 + + + + c3p0 + c3p0 + + + + + + org.slf4j + jcl-over-slf4j + 1.7.12 + + + org.springframework + spring-context-support + ${springframework.version} + + + org.springframework + spring-core + ${springframework.version} + + + commons-logging + commons-logging + + + + + org.springframework + spring-test + ${springframework.version} + + + org.springframework + spring-tx + ${springframework.version} + + + org.springframework + spring-web + ${springframework.version} + + + org.springframework + spring-webmvc + ${springframework.version} + + + + + + + nexus + dav:https://ecomp-nexus:8443/repository/dbc-javadoc/${project.version} + + + + + + JCenter + JCenter Repository + http://jcenter.bintray.com + + + + Restlet + Restlet Repository + http://maven.restlet.com + + + + diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataBusHomeController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataBusHomeController.java new file mode 100644 index 0000000..830c1fa --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataBusHomeController.java @@ -0,0 +1,57 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.controller; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import javax.servlet.ServletException; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +/** + * This controller maps requests for the DMaaP-BC-App's landing page, which is + * an Angular single-page application. + */ +@Controller +@RequestMapping("/") +public class DataBusHomeController extends DbcappRestrictedBaseController { + + public static final String APP_NAME = "dmaap-bc-app"; + public static final DateFormat logDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + + /** + * At one time I published the landing page as simply "/dbc", but it can + * also be accessed with a default suffix; e.g., "/dbc.htm". + * + * @return View name key, which is resolved to a file using an Apache tiles + * "definitions.xml" file. + * @throws ServletException + */ + @RequestMapping(value = { "/dbc" }, method = RequestMethod.GET) + public ModelAndView dbcDefaultController() throws ServletException { + // a model is only useful for JSP; this app is angular. + return new ModelAndView("dbc_home_tdkey"); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataRouterController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataRouterController.java new file mode 100644 index 0000000..27f5dd6 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataRouterController.java @@ -0,0 +1,315 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.controller; + +import java.util.Date; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.slf4j.MDC; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * Data Router controller: serves Ajax requests made by Angular scripts on pages + * that show feeds, publishers and subscribers. + */ +@Controller +@RequestMapping("/") +public class DataRouterController extends DbcappRestrictedBaseController { + + private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DataRouterController.class); + + private static final String FEED_PATH = "/dr_feed"; + private static final String PUB_PATH = "/dr_pub"; + private static final String SUB_PATH = "/dr_sub"; + + public DataRouterController() { + } + + /** + * Answers a request for one page of data router feeds. + * + * @param request + * @return Result of + * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)} + * @throws ServletException + */ + @RequestMapping(value = { FEED_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getDRFeedsByPage(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = getItemListForPageWrapper(request, DmaapDataItem.DR_FEED); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Answers a request for one page of data router publishers. + * + * @param request + * + * @return Result of + * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)} + * @throws ServletException + */ + @RequestMapping(value = { PUB_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getDRPubsByPage(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = getItemListForPageWrapper(request, DmaapDataItem.DR_PUB); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Answers a request for one page of data router subscribers. + * + * @param request + * + * @return Result of + * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)} + * @throws ServletException + */ + @RequestMapping(value = { SUB_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getDRSubsByPage(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = getItemListForPageWrapper(request, DmaapDataItem.DR_SUB); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Adds a feed with the specified information. Expects a JSON block in the + * request body - a Feed object. + * + * @param request + * @return a JSON object; on success it has a "status" and possibly a "data" + * item; on failure, also has an "error" item. + * @throws ServletException + */ + @RequestMapping(value = { FEED_PATH }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String addDRFeed(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = addItem(request, DmaapDataItem.DR_FEED, null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Adds a publisher with the specified information. Expects a JSON block in + * the request body - a DR_Pub object. + * + * @return a JSON object; on success it has a "status" and possibly a "data" + * item; on failure, also has an "error" item. + * + * @param request + * @throws ServletException + */ + @RequestMapping(value = { PUB_PATH }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String addDRPub(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = addItem(request, DmaapDataItem.DR_PUB, HttpServletResponse.SC_CREATED); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Adds a subscriber with the specified information. Expects a JSON block in + * the request body - a DR_Sub object. + * + * @return a JSON object; on success it has a "status" and possibly a "data" + * item; on failure, also has an "error" item. + * + * @param request + * @throws ServletException + */ + @RequestMapping(value = { SUB_PATH }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String addDRSub(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = addItem(request, DmaapDataItem.DR_SUB, HttpServletResponse.SC_CREATED); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Updates a feed with the specified information. Expects a JSON block in + * the request body - a Feed object. + * + * @param id + * Path parameter with object ID + * @param request + * @return a JSON object; on success it has a "status" and possibly a "data" + * item; on failure, also has an "error" item. + * @throws ServletException + */ + @RequestMapping(value = { FEED_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String updateFeed(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = updateItem(request, DmaapDataItem.DR_FEED, Long.toString(id), null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Updates a publisher with the specified information. Expects a JSON block + * in the request body - a DR_Pub object. + * + * The pubId may have a dot in it. Spring, in its infinite wisdom, truncates + * extensions on dotted path parameters; e.g., "foo.json" becomes "foo". + * Avoid truncation here with the extra ":.+" incantation at the end. + * + * @param id + * Path parameter with object ID + * @param request + * @return a JSON object; on success it has a "status" and possibly a "data" + * item; on failure, also has an "error" item. + * @throws ServletException + */ + @RequestMapping(value = { PUB_PATH + "/{id:.+}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String updateDRPub(@PathVariable("id") String id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = updateItem(request, DmaapDataItem.DR_PUB, id, null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Updates a subscriber with the specified information. Expects a JSON block + * in the request body - a DR_Sub object. + * + * @param id + * Path parameter with object ID + * @param request + * @return a JSON object; on success it has a "status" and possibly a "data" + * item; on failure, also has an "error" item. + * @throws ServletException + */ + @RequestMapping(value = { SUB_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String updateDRSub(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = updateItem(request, DmaapDataItem.DR_SUB, Long.toString(id), null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Deletes a feed with the ID specified as a path parameter. On successful + * delete the endpoint returns 204 (confusingly). + * + * Writes a JSON object as an HTTP response; on success it only has "status" + * item; on failure, also has an "error" item. + * + * @param id + * Path parameter with object ID + * @param request + * @return JSON object + * @throws ServletException + */ + @RequestMapping(value = { FEED_PATH + "/{id}" }, method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + public String deleteDRFeed(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = deleteItem(request, DmaapDataItem.DR_FEED, Long.toString(id), 204); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Deletes the publisher with the ID specified as a path parameter. + * + * The pubId may have a dot in it. Spring, in its infinite wisdom, truncates + * extensions on dotted path parameters; e.g., "foo.json" becomes "foo". + * Avoid truncation here with the extra ":.+" incantation at the end. + * + * @param id + * Path parameter with object ID + * @param request + * @return a JSON object; on success it only has "status" item; on failure, + * also has an "error" item. + * @throws ServletException + */ + @RequestMapping(value = { PUB_PATH + "/{id:.+}" }, method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + public String deleteDRPub(@PathVariable("id") String id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = deleteItem(request, DmaapDataItem.DR_PUB, id, null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Deletes the subscriber with the ID specified as a path parameter. + * + * @param id + * Path parameter with object ID + * @param request + * @return Writes a JSON object; on success it only has "status" item; on + * failure, also has an "error" item. + * @throws ServletException + */ + @RequestMapping(value = { SUB_PATH + "/{id}" }, method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + public String deleteDRSub(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = deleteItem(request, DmaapDataItem.DR_SUB, Long.toString(id), 204); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DbcappRestrictedBaseController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DbcappRestrictedBaseController.java new file mode 100644 index 0000000..a527127 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DbcappRestrictedBaseController.java @@ -0,0 +1,974 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.controller; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.openecomp.dcae.dmaap.bcapi.client.DmaapBcRestClient; +import org.openecomp.dcae.dmaap.bcapi.client.HttpStatusAndResponse; +import org.openecomp.dcae.dmaapbc.model.DR_Pub; +import org.openecomp.dcae.dmaapbc.model.DR_Sub; +import org.openecomp.dcae.dmaapbc.model.DcaeLocation; +import org.openecomp.dcae.dmaapbc.model.Dmaap; +import org.openecomp.dcae.dmaapbc.model.DmaapObject; +import org.openecomp.dcae.dmaapbc.model.ErrorResponse; +import org.openecomp.dcae.dmaapbc.model.Feed; +import org.openecomp.dcae.dmaapbc.model.MR_Client; +import org.openecomp.dcae.dmaapbc.model.Topic; +import org.openecomp.dmaapbc.dbcapp.domain.DmaapAccess; +import org.openecomp.dmaapbc.dbcapp.rest.DbcUsvcRestClient; +import org.openecomp.dmaapbc.dbcapp.service.DmaapAccessService; +import org.openecomp.dmaapbc.dbcapp.util.DbcappProperties; +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.domain.User; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.CipherUtil; +import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * This base class provides utility methods to child controllers. All of the + * requests are forwarded on to a remote REST API, so there's a large degree of + * commonality among the implementations. Combining them kept the lines-of-code + * count down, at the expense of some complexity. + */ +public class DbcappRestrictedBaseController extends RestrictedBaseController { + + /** + * Query parameter for desired page number + */ + protected static final String PAGE_NUM_QUERY_PARAM = "pageNum"; + + /** + * Query parameter for desired items per page + */ + protected static final String VIEW_PER_PAGE_QUERY_PARAM = "viewPerPage"; + + /** + * Tag for status code in JSON responses - ALWAYS PRESENT. + */ + protected static final String STATUS_RESPONSE_KEY = "status"; + + /** + * Tag for data in JSON responses. + */ + protected static final String DATA_RESPONSE_KEY = "data"; + + /** + * Tag for error message in JSON responses; absent on success. + */ + protected static final String ERROR_RESPONSE_KEY = "error"; + + /** + * Tag for response integer, pages required to display complete result list + */ + protected static final String TOTAL_PAGES_RESPONSE_KEY = "totalPages"; + + /** + * Tag for DMaaP name obtained from REST client. + */ + protected static final String PROFILE_NAME_RESPONSE_KEY = "profileName"; + + /** + * Tag for DMaaP name obtained from REST client. + */ + protected static final String DMAAP_NAME_RESPONSE_KEY = "dmaapName"; + + /** + * Tag for DCAE location name list obtained from REST client. + */ + protected static final String DCAE_LOCATIONS_RESPONSE_KEY = "dcaeLocations"; + + /** + * Logger that conforms with ECOMP guidelines + */ + private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DbcappRestrictedBaseController.class); + + /** + * For general use in these methods and subclasses + */ + protected final ObjectMapper mapper = new ObjectMapper(); + + /** + * DAO accesses the profiles via a local database. REST accesses the + * profiles via a remote REST service. + */ + public enum AccessMethod { + DAO, REST + }; + + /** + * Enum for selecting an item type. + */ + public enum DmaapDataItem { + DR_FEED, DR_PUB, DR_SUB, MR_TOPIC, MR_CLIENT; + } + + /** + * Application properties - NOT available to constructor. + */ + @Autowired + private DbcappProperties appProperties; + + /** + * Database access - which might not be used. + */ + @Autowired + private DmaapAccessService dmaapAccessDaoServiceAuto; + + /** + * Read from application properties. + */ + private String mechIdName, mechIdPass; + + /** + * This is set by {@link #getDmaapAccessService()} to the DAO or REST + * implementation as configured in properties. + */ + private DmaapAccessService dmaapAccessService; + + /** + * Hello Spring, here's your no-arg constructor. + */ + public DbcappRestrictedBaseController() { + // Do not serialize null values + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + } + + /** + * Access method for subclasses. + * + * @return DbcappProperties object that was autowired by Spring. + */ + protected DbcappProperties getAppProperties() { + return appProperties; + } + + /** + * Lazy initialization. As a side effect, caches mech ID and password. + * + * @return Either DAO or REST client that implements the access service + * interface. + */ + protected DmaapAccessService getDmaapAccessService() { + if (dmaapAccessService != null) + return dmaapAccessService; + + // Get the application's mechid + mechIdName = appProperties.getProperty(DbcappProperties.DMAAP_MECHID_NAME); + // This is encrypted + String cipher = appProperties.getProperty(DbcappProperties.DMAAP_MECHID_PASSWORD); + if (mechIdName == null || cipher == null) + throw new RuntimeException("Failed to get MECH_ID name and/or password from properties"); + try { + mechIdPass = CipherUtil.decrypt(cipher); + } catch (Exception ex) { + throw new RuntimeException("Failed to decrypt password from config file", ex); + } + + String accessMethod = appProperties.getProperty(DbcappProperties.PROFILE_ACCESS_METHOD); + if (accessMethod == null) + throw new RuntimeException("Failed to get property " + DbcappProperties.PROFILE_ACCESS_METHOD); + AccessMethod profileAccessMethod = AccessMethod.valueOf(accessMethod.toUpperCase()); + if (AccessMethod.DAO == profileAccessMethod) { + // Spring auto-wired this field + dmaapAccessService = dmaapAccessDaoServiceAuto; + } else { + String url = appProperties.getProperty(DbcappProperties.PROFILE_USVC_URL); + String user = appProperties.getProperty(DbcappProperties.PROFILE_USVC_USER); + String pass = appProperties.getProperty(DbcappProperties.PROFILE_USVC_PASS); + if (url == null || user == null || pass == null) + throw new RuntimeException("getDmaapAccessService: missing property: one of url, user, pass"); + String clearText = null; + try { + clearText = CipherUtil.decrypt(pass); + } catch (Exception ex) { + throw new RuntimeException("getDmaapAccessService: failed to decrypt password from config"); + } + dmaapAccessService = new DbcUsvcRestClient(url, user, clearText); + } + return dmaapAccessService; + } + + /** + * Creates a REST client with appropriate credentials, the user/pass from + * the access profile if present, otherwise with the default mech ID and + * password. + * + * @param dmaapAccess + * @return REST client + */ + protected DmaapBcRestClient getDmaapBcRestClient(DmaapAccess dmaapAccess) { + DmaapBcRestClient restClient = null; + if (dmaapAccess.getMechId() == null || dmaapAccess.getMechId().length() == 0) + restClient = new DmaapBcRestClient(dmaapAccess.getDmaapUrl(), mechIdName, mechIdPass); + else + restClient = new DmaapBcRestClient(dmaapAccess.getDmaapUrl(), dmaapAccess.getMechId(), + dmaapAccess.getPassword()); + return restClient; + } + + /** + * Pulls out of the specified list the appropriate items for the page of + * results specified by the page number and view-per-page parameters. + * + * @param pageNum + * Page number requested by user + * @param viewPerPage + * Number of items per page + * @param itemList + * List of items available + * @return List of items to display + */ + @SuppressWarnings("rawtypes") + private static List shrinkListToPage(final int pageNum, final int viewPerPage, final List itemList) { + // user-friendly page numbers index from 1 + int firstIndexOnThisPage = viewPerPage * (pageNum - 1); + int firstIndexOnNextPage = viewPerPage * pageNum; + int fromIndex = firstIndexOnThisPage < itemList.size() ? firstIndexOnThisPage : itemList.size(); + int toIndex = firstIndexOnNextPage < itemList.size() ? firstIndexOnNextPage : itemList.size(); + // answers empty list if from==to + return itemList.subList(fromIndex, toIndex); + } + + /** + * Gets the body of a HTTP request assuming UTF-8 encoding. + * + * @param request + * @return String version of request body + * @throws IOException If the read fails + */ + protected static String getBody(HttpServletRequest request) throws IOException { + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try { + InputStream inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); + char[] charBuffer = new char[512]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException ex) { + throw ex; + } + } + + } + return stringBuilder.toString(); + } + + /** + * Builds a JSON success response from the specified inputs. + * + * @param statusCode + * e.g., 200 for OK + * @param dataPojo + * Plain old Java object to serialize as JSON; ignored if null. + * @throws JsonProcessingException + * If the POJO cannot be serialized + * @return JSON block with items "status" : 200 and "data" : (data..) + */ + protected String buildJsonSuccess(int statusCode, Object dataPojo) throws JsonProcessingException { + Map model = new HashMap(); + model.put(STATUS_RESPONSE_KEY, statusCode); + if (dataPojo != null) + model.put(DATA_RESPONSE_KEY, dataPojo); + String json = mapper.writeValueAsString(model); + return json; + } + + /** + * Builds a JSON error response from the specified inputs. + * + * @param statusCode + * e.g., 500 for internal server error + * @param errMsg + * Information about the operation that failed + * @param exception + * Converted to string; ignored if null. + * @return JSON block with tags "status" and "error". + */ + protected String buildJsonError(int statusCode, String errMsg, Exception exception) { + Map model = new HashMap(); + model.put(STATUS_RESPONSE_KEY, new Integer(500)); + if (exception == null) { + model.put(ERROR_RESPONSE_KEY, errMsg); + } else { + final int enough = 512; + String exString = exception.toString(); + String exceptionMsg = exString.length() > enough ? exString.substring(0, enough) : exString; + model.put(ERROR_RESPONSE_KEY, errMsg + ": " + exceptionMsg); + } + String json = null; + try { + json = mapper.writeValueAsString(model); + } catch (JsonProcessingException ex) { + // serializing the trivial map should never fail + String err = "buildJsonError: failed to serialize"; + logger.error(EELFLoggerDelegate.errorLogger, err, ex); + throw new RuntimeException(err, ex); + } + return json; + } + + /** + * Gets a list of DMaaP access profiles for this user from the database. The + * profiles have passwords in the clear - this method decrypts the database + * entries. + * + * Initializes the list for new users and/or configuration changes. Checks + * the database list against the configured list of URLs, and creates new + * rows for any configured URLs not present for the user. Most environments + * are expected to have exactly one valid URL, and the webapp uses a fixed + * MechID to authenticate itself to the DMaaP bus controller, so this + * approach means new users can start without any setup of URLs. + * + * @param userId + * @return List of DmaapAccess objects + * @throws Exception + */ + protected List getOrInitDmaapAccessList(String userId) throws Exception { + String[] configUrls = getAppProperties().getCsvListProperty(DbcappProperties.DMAAP_REST_URL_LIST); + if (configUrls == null || configUrls.length == 0) + throw new Exception("getOrInitDmaapAccessList: Failed to get DMAAP REST URL list"); + // Update this list to track which URLs are in the database. + List configUrlList = new ArrayList(configUrls.length); + for (String c : configUrls) { + // Validate URL to detect config botches + URL url = new URL(c); + configUrlList.add(url.toExternalForm()); + } + + List dbAccessList = getDmaapAccessService().getDmaapAccessList(userId); + + // Check the database entries against the configuration. Also + // build a list of non-DAO objects with clear-text passwords. + List clearList = new ArrayList(dbAccessList.size()); + for (DmaapAccess dmaapAccess : dbAccessList) { + // drop this URL from the list. + // If it's not known to config, complain because that's a bogus row. + if (!configUrlList.remove(dmaapAccess.getDmaapUrl())) + logger.warn(EELFLoggerDelegate.errorLogger, "getOrInitDmaapAccessList: detected extra URL {}", + dmaapAccess.getDmaapUrl()); + // Return cleartext in JSON + DmaapAccess clone = new DmaapAccess(dmaapAccess); + clone.setPassword(clone.decryptPassword()); + clearList.add(clone); + } + + // Create new rows for any configured URLs not found for this user. + for (int i = 0; i < configUrlList.size(); ++i) { + String missUrl = configUrlList.get(i); + logger.debug(EELFLoggerDelegate.debugLogger, "getOrInitDmaapAccessList: adding missing URL {}", missUrl); + DmaapAccess newDmaapAccess = new DmaapAccess(); + // Create a semi-reasonable name for the table + newDmaapAccess.setName("dmaap-" + Integer.toString(i + 1)); + newDmaapAccess.setUserId(userId); + newDmaapAccess.setDmaapUrl(missUrl); + // Write to db. + getDmaapAccessService().saveDmaapAccess(newDmaapAccess); + // Add to response, which assumes the write was successful. + clearList.add(newDmaapAccess); + } + + return clearList; + } + + /** + * Gets the user's selected DMaaP access profile. + * + * @param userId + * User's UID + * @return DmaapAccess object that is currently selected, or the first one + * found if none are selected; null if no access profiles are + * configured. + * @throws ServletException + * If the user's UID cannot be extracted from request. + */ + protected DmaapAccess getSelectedDmaapAccess(String userId) throws Exception { + List profiles = getOrInitDmaapAccessList(userId); + if (profiles.size() == 0) { + logger.debug("getSelectedDmaapAccess: no rows found, returning null"); + return null; + } + + // Return the first one by default if nothing is selected. + DmaapAccess selected = profiles.get(0); + for (DmaapAccess da : profiles) + if (da.getSelected()) + selected = da; + + return selected; + } + + /** + * Supports sorting a list of feeds by the first column displayed: ID + */ + private static Comparator feedComparator = new Comparator() { + @Override + public int compare(DmaapObject o1, DmaapObject o2) { + Feed f1 = (Feed) o1; + Feed f2 = (Feed) o2; + // sort these numbers lexicographically, same as the front end + // table. + return f1.getFeedId().compareTo(f2.getFeedId()); + } + }; + + /** + * Supports sorting a list of publishers by the first column displayed: pub + * ID + */ + private static Comparator pubComparator = new Comparator() { + @Override + public int compare(DmaapObject o1, DmaapObject o2) { + DR_Pub p1 = (DR_Pub) o1; + DR_Pub p2 = (DR_Pub) o2; + return p1.getPubId().compareTo(p2.getPubId()); + } + }; + + /** + * Supports sorting a list of subscribers by the first column displayed: sub + * ID + */ + private static Comparator subComparator = new Comparator() { + @Override + public int compare(DmaapObject o1, DmaapObject o2) { + DR_Sub s1 = (DR_Sub) o1; + DR_Sub s2 = (DR_Sub) o2; + // sort these numbers lexicographically, same as the front end + // table. + return s1.getSubId().compareTo(s2.getSubId()); + } + }; + + /** + * Supports sorting a list of topics by the first column displayed: FQTN + */ + private static Comparator topicComparator = new Comparator() { + @Override + public int compare(DmaapObject o1, DmaapObject o2) { + Topic t1 = (Topic) o1; + Topic t2 = (Topic) o2; + return t1.getFqtn().compareTo(t2.getFqtn()); + } + }; + + /** + * Supports sorting a list of clients by the first column displayed: client + * ID. + */ + private static Comparator clientComparator = new Comparator() { + @Override + public int compare(DmaapObject o1, DmaapObject o2) { + MR_Client c1 = (MR_Client) o1; + MR_Client c2 = (MR_Client) o2; + // sort these numbers lexicographically, same as the front end + // table. + return c1.getMrClientId().compareTo(c2.getMrClientId()); + } + }; + + /** + * Gets one page of DMaaP objects and supporting information via the Bus + * Controller REST client. On success, returns a JSON object as String with + * the following tags: + *

    + *
  • status: Integer; HTTP status code 200. + *
  • dmaapName: String, name returned by the remote DMaaP instance. + *
  • dcaeLocations: Array of string, locations returned by the remote + * DMaaP instance. + *
  • data: Array of the desired items; e.g., data router feeds. + *
  • totalPages: Integer, the number of pages required to display the + * complete list of items using the submitted page size + *
+ * + * This duplicates all of {@link #buildJsonSuccess(int, Object)}. + * + * @param dmaapAccess + * Access details for the DMaaP REST API + * @param option + * Specifies which item list type to get: data router feeds, etc. + * @param pageNum + * Page number of results + * @param viewPerPage + * Number of items per page + * @return JSON block as String, see above. + * @throws Exception + */ + private String getItemListForPage(DmaapAccess dmaapAccess, DmaapDataItem option, int pageNum, int viewPerPage) + throws Exception { + DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess); + // Get the instance so the page can display its name + DmaapObject dmaap = restClient.getDmaap(); + if (dmaap instanceof ErrorResponse) { + // Bad password is caught here. + ErrorResponse err = (ErrorResponse) dmaap; + throw new Exception(err.getMessage()); + } + // Get locations for editing + List dcaeLocations = restClient.getDcaeLocations(); + if (dcaeLocations.size() == 1 && dcaeLocations.get(0) instanceof ErrorResponse) { + // Should never happen - bad password is caught right above - but be + // careful. + ErrorResponse err = (ErrorResponse) dcaeLocations.get(0); + throw new Exception(err.getMessage()); + } + // Pass them back as String array + String[] dcaeLocs = new String[dcaeLocations.size()]; + for (int i = 0; i < dcaeLocs.length; ++i) { + DcaeLocation dcaeLoc = (DcaeLocation) dcaeLocations.get(i); + dcaeLocs[i] = dcaeLoc.getDcaeLocationName(); + } + // Get the requested item list + List itemList = null; + switch (option) { + case DR_FEED: + itemList = restClient.getFeeds(); + Collections.sort(itemList, feedComparator); + break; + case DR_PUB: + itemList = restClient.getDRPubs(); + Collections.sort(itemList, pubComparator); + break; + case DR_SUB: + itemList = restClient.getDRSubs(); + Collections.sort(itemList, subComparator); + break; + case MR_TOPIC: + itemList = restClient.getTopics(); + Collections.sort(itemList, topicComparator); + break; + case MR_CLIENT: + itemList = restClient.getMRClients(); + Collections.sort(itemList, clientComparator); + break; + default: + throw new Exception("getItemListForPage: pgmr error, unimplemented case: " + option.name()); + } + + logger.debug("getItemListForPage: list size is {}", itemList.size()); + int pageCount = (int) Math.ceil((double) itemList.size() / viewPerPage); + @SuppressWarnings("unchecked") + List subList = shrinkListToPage(pageNum, viewPerPage, itemList); + itemList = subList; + // Build response here + Map model = new HashMap(); + model.put(STATUS_RESPONSE_KEY, new Integer(200)); + model.put(PROFILE_NAME_RESPONSE_KEY, dmaapAccess.getName()); + model.put(DMAAP_NAME_RESPONSE_KEY, ((Dmaap) dmaap).getDmaapName()); + model.put(DCAE_LOCATIONS_RESPONSE_KEY, dcaeLocs); + model.put(DATA_RESPONSE_KEY, itemList); + model.put(TOTAL_PAGES_RESPONSE_KEY, pageCount); + + // build the response + String outboundJson = null; + try { + outboundJson = mapper.writeValueAsString(model); + } catch (Exception ex) { + // should never happen + logger.error("getItemListForPage: failed to serialize model: ", ex); + throw new Exception("sendItemListForPage", ex); + } + + return outboundJson; + } + + /** + * Gets a page of the specified DMaaP items. This method traps errors and + * constructs an appropriate JSON block if an error happens. + * + * See {@link #getItemListForPage(DmaapAccess, DmaapDataItem, int, int)}. + * + * @param request + * Inbound request + * @param option + * DMaaP item type to get + * @return JSON with list of serialized objects, or an error. + */ + protected String getItemListForPageWrapper(HttpServletRequest request, DmaapDataItem option) + throws ServletException { + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("getItemListForPageWrapper: Failed to get UID"); + DmaapAccess selected = getSelectedDmaapAccess(appUser.getLoginId()); + if (selected == null) // leap into exception handler + throw new Exception("No DMaaP access profiles are configured."); + int pageNum = Integer.parseInt(request.getParameter(PAGE_NUM_QUERY_PARAM)); + int viewPerPage = Integer.parseInt(request.getParameter(VIEW_PER_PAGE_QUERY_PARAM)); + outboundJson = getItemListForPage(selected, option, pageNum, viewPerPage); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to get DMaaP item type " + option.name(), ex); + } + return outboundJson; + } + + /** + * Adds an item of the specified type with the specified content. Constructs + * an object by deserializing the JSON block, but ignores any ID field that + * is supplied. + * + * On success, returns a JSON block as String with any data returned by the + * REST client. Throws an exception on any failure. + * + * @param dmaapAccess + * Access details for the DMaaP REST API + * @param userId + * The UID of the user making the request + * @param itemType + * DMaaP item type to add + * @param itemContent + * JSON block to deserialize as an object + * @param scAddlStatus + * HTTP status code 200 is always accepted. If this parameter is + * not null, the value is also considered a valid HTTP status + * code on success; e.g., 204. + * @return JSON object with result of the operation + * @throws Exception + * on any problem + */ + private String addDmaapItem(DmaapAccess dmaapAccess, String userId, DmaapDataItem itemType, String itemContent, + Integer scAddlStatus) throws Exception { + DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess); + HttpStatusAndResponse hsr = null; + switch (itemType) { + case DR_FEED: + Feed feed = mapper.readValue(itemContent, Feed.class); + logger.debug("addDmaapItem: received feed: {} ", feed); + // Null out any ID to get an auto-generated ID + feed.setFeedId(null); + // Assign the owner to be the webapp user + feed.setOwner(userId); + hsr = restClient.postFeed(feed); + break; + case DR_PUB: + DR_Pub pub = mapper.readValue(itemContent, DR_Pub.class); + logger.debug("addDmaapItem: received pub: {} ", pub); + // Null out any ID to get an auto-generated ID + pub.setPubId(null); + hsr = restClient.postDRPub(pub); + break; + case DR_SUB: + DR_Sub sub = mapper.readValue(itemContent, DR_Sub.class); + logger.debug("addDmaapItem: received sub: {} ", sub); + // Null out any ID to get an auto-generated ID + sub.setSubId(null); + // Assign the owner to be the webapp user + sub.setOwner(userId); + hsr = restClient.postDRSub(sub); + break; + case MR_TOPIC: + Topic topic = mapper.readValue(itemContent, Topic.class); + logger.debug("addDmaapItem: received topic: {} ", topic); + // No ID on topic + topic.setOwner(userId); + hsr = restClient.postTopic(topic); + break; + case MR_CLIENT: + MR_Client client = mapper.readValue(itemContent, MR_Client.class); + logger.debug("addDmaapItem: received client: {} ", client); + client.setMrClientId(null); + hsr = restClient.postMRClient(client); + break; + default: + throw new Exception("addDmaapItem: pgmr error, unimplemented case: " + itemType.name()); + } + + // Build result here + String outboundJson = null; + if (hsr.getStatusCode() == HttpServletResponse.SC_OK + || (scAddlStatus != null && hsr.getStatusCode() == scAddlStatus)) { + outboundJson = buildJsonSuccess(hsr.getStatusCode(), hsr.getResponseString()); + } else { + throw new Exception("Unexpected HTTP response code " + Integer.toString(hsr.getStatusCode()) + + " with content " + hsr.getResponseString()); + } + return outboundJson; + } + + /** + * Adds the specified DMaaP item that is read from the request body. This + * method traps errors and constructs an appropriate JSON block if an error + * happens. + * + * @param request + * Used to obtain user info from the active session + * @param itemType + * DMaaP item type to add + * @param scAddlStatus + * HTTP status code 200 is always accepted. If this parameter is + * not null, the value is also considered a valid HTTP status + * code on success; e.g., 204. + * @return JSON block with success or failure object + */ + protected String addItem(HttpServletRequest request, DmaapDataItem itemType, Integer scAddlStatus) + throws ServletException { + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("addDmaapItem: Failed to get UID"); + + DmaapAccess access = getSelectedDmaapAccess(appUser.getLoginId()); + if (access == null) // leap into exception handler + throw new Exception("No DMaaP access profiles are configured."); + String jsonContent = getBody(request); + outboundJson = addDmaapItem(access, appUser.getLoginId(), itemType, jsonContent, scAddlStatus); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to add DMaaP item " + itemType.name(), ex); + } + + return outboundJson; + } + + /** + * Updates an item of the specified type with the specified content. + * Constructs an object by deserializing the JSON block. + * + * On success, returns a JSON block as String with any data returned by the + * REST client. Throws an exception on any failure. + * + * @param dmaapAccess + * Access details for the DMaaP REST API + * @param userId + * The UID of the user making the request + * @param itemType + * DMaaP item type to update + * @param itemId + * Item identification + * @param itemContent + * JSON block to deserialize as an object + * @param scAddlStatus + * HTTP status code 200 is always accepted. If this parameter is + * not null, the value is also considered a valid HTTP status + * code on success; e.g., 204. + * @return JSON object with result of the operation + * @throws Exception + * on any problem + */ + private String updateDmaapItem(DmaapAccess dmaapAccess, String userId, DmaapDataItem itemType, String itemId, + String itemContent, Integer scAddlStatus) throws Exception { + DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess); + HttpStatusAndResponse hsr = null; + switch (itemType) { + case DR_FEED: + Feed feed = mapper.readValue(itemContent, Feed.class); + logger.debug("updateDmaapItem: received feed: {} ", feed); + // Ensure the owner is the webapp user + feed.setOwner(userId); + hsr = restClient.putFeed(feed); + break; + case DR_PUB: + DR_Pub pub = mapper.readValue(itemContent, DR_Pub.class); + logger.debug("updateDmaapItem: received pub: {} ", pub); + hsr = restClient.putDRPub(pub); + break; + case DR_SUB: + DR_Sub sub = mapper.readValue(itemContent, DR_Sub.class); + logger.debug("updateDmaapItem: received sub: {} ", sub); + // Ensure the owner is the webapp user + sub.setOwner(userId); + hsr = restClient.putDRSub(sub); + break; + case MR_TOPIC: + Topic topic = mapper.readValue(itemContent, Topic.class); + logger.debug("updateDmaapItem: received topic: {} ", topic); + // Ensure the owner is the webapp user + topic.setOwner(userId); + if (true && userId != null) + throw new UnsupportedOperationException("put topic"); + // TODO: someday the backend may implement PUT + break; + case MR_CLIENT: + MR_Client client = mapper.readValue(itemContent, MR_Client.class); + logger.debug("updateDmaapItem: received client: {} ", client); + hsr = restClient.putMRClient(client); + break; + default: + throw new Exception("updateDmaapItem: pgmr error, unimplemented case: " + itemType.name()); + } + + // Build result here + String outboundJson = null; + if (hsr.getStatusCode() == HttpServletResponse.SC_OK + || (scAddlStatus != null && hsr.getStatusCode() == scAddlStatus)) { + outboundJson = buildJsonSuccess(hsr.getStatusCode(), hsr.getResponseString()); + } else { + throw new Exception("Unexpected HTTP response code " + Integer.toString(hsr.getStatusCode()) + + " with content " + hsr.getResponseString()); + } + return outboundJson; + } + + /** + * Updates the specified DMaaP item that is read from the request body. This + * method traps errors and constructs an appropriate JSON block if an error + * happens. + * + * @param request + * Used to obtain user info from the active session + * @param itemType + * DMaaP item type to update + * @param itemId + * Item identification to update + * @param scUpdatelStatus + * HTTP status code 200 is always accepted. If this parameter is + * not null, the value is also considered a valid HTTP status + * code on success; e.g., 204. + * @return JSON object with success or error information. + */ + protected String updateItem(HttpServletRequest request, DmaapDataItem itemType, String itemId, + Integer scUpdatelStatus) throws ServletException { + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("updateItem: Failed to get UID"); + DmaapAccess access = getSelectedDmaapAccess(appUser.getLoginId()); + if (access == null) // leap into exception handler + throw new Exception("No DMaaP access profiles are configured."); + String jsonContent = getBody(request); + outboundJson = updateDmaapItem(access, appUser.getLoginId(), itemType, itemId, jsonContent, + scUpdatelStatus); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to update DMaaP item " + itemType.name(), ex); + } + + return outboundJson; + } + + /** + * Deletes an item of the specified type with the specified ID. + * + * @param dmaapAccess + * Access details for the DMaaP REST API + * @param itemType + * DMaaP item type to delete + * @param itemId + * Item identification + * @param scAddlStatus + * HTTP status code 200 is always accepted. If this parameter is + * not null, the value is also considered a valid HTTP status + * code on success; e.g., 204. + * @return On success, returns a JSON block as String with any data returned + * by the REST client. + * @throws Exception + * Throws an exception on any failure. + */ + private String deleteDmaapItem(DmaapAccess dmaapAccess, DmaapDataItem itemType, String itemId, Integer scAddlStatus) + throws Exception { + DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess); + HttpStatusAndResponse hsr = null; + switch (itemType) { + case DR_FEED: + hsr = restClient.deleteFeed(itemId); + break; + case DR_PUB: + hsr = restClient.deleteDRPub(itemId); + break; + case DR_SUB: + hsr = restClient.deleteDRSub(itemId); + break; + case MR_TOPIC: + hsr = restClient.deleteTopic(itemId); + break; + case MR_CLIENT: + hsr = restClient.deleteMRClient(itemId); + break; + default: + throw new Exception("deleteDmaapItem: pgmr error, unimplemented case: " + itemType.name()); + } + + // Build result here + String outboundJson = null; + if (hsr.getStatusCode() == HttpServletResponse.SC_OK + || (scAddlStatus != null && hsr.getStatusCode() == scAddlStatus)) { + outboundJson = buildJsonSuccess(hsr.getStatusCode(), hsr.getResponseString()); + } else { + throw new Exception("Unexpected HTTP response code " + Integer.toString(hsr.getStatusCode()) + + " with content " + hsr.getResponseString()); + } + return outboundJson; + } + + /** + * Deletes the specified DMaaP item. This method traps errors and constructs + * an appropriate JSON block if an error happens. + * + * @param request + * Used to obtain user info from the active session + * @param itemType + * DMaaP item type to delete + * @param itemId + * item ID to delete + * @param scAddlStatus + * HTTP status code 200 is always accepted. If this parameter is + * not null, the value is also considered a valid HTTP status + * code on success; e.g., 204. + * @return JSON object with success or error information. + */ + protected String deleteItem(HttpServletRequest request, DmaapDataItem itemType, String itemId, Integer scAddlStatus) + throws ServletException { + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("deleteItem: Failed to get UID"); + DmaapAccess selected = getSelectedDmaapAccess(appUser.getLoginId()); + if (selected == null) // leap into exception handler + throw new Exception("No DMaaP access profiles are configured."); + outboundJson = deleteDmaapItem(selected, itemType, itemId, scAddlStatus); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to delete DMaaP item " + itemType.name() + " ID " + itemId, ex); + } + return outboundJson; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DmaapAccessController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DmaapAccessController.java new file mode 100644 index 0000000..9b36c8b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DmaapAccessController.java @@ -0,0 +1,374 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.controller; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.dcae.dmaap.bcapi.client.DmaapBcRestClient; +import org.openecomp.dcae.dmaapbc.model.Dmaap; +import org.openecomp.dcae.dmaapbc.model.DmaapObject; +import org.openecomp.dcae.dmaapbc.model.ErrorResponse; +import org.openecomp.dmaapbc.dbcapp.domain.DmaapAccess; +import org.openecomp.portalsdk.core.domain.User; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.slf4j.MDC; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * DMaaP Access controller: serves Ajax requests made by Angular on pages where + * the user adds, edits and deletes DMaaP access profiles. This controller must + * defend the database against rogue requests including SQL injection attacks. + */ +@Controller +@RequestMapping("/") +public class DmaapAccessController extends DbcappRestrictedBaseController { + + /** + * Logger that conforms with ECOMP guidelines + */ + private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DmaapAccessController.class); + + private static final String DMAAP_ACCESS_PATH = "/dmaap_access"; + private static final String SELECT_DMAAP_ACCESS_PATH = "/select_dmaap_access"; + + /** + * For general use in these methods + */ + private final ObjectMapper mapper; + + /** + * Never forget that Spring autowires fields AFTER the constructor is + * called. + */ + public DmaapAccessController() { + mapper = new ObjectMapper(); + } + + /** + * Gets a list of DMaaP access profiles for this user from the database and + * returns them in a JSON array nested within a response object. + * + * See {@link #getOrInitDmaapAccessList(String)}. + * + * @param request + * @return JSON with access profiles, or an error JSON if the request fails. + * @throws ServletException + */ + @RequestMapping(value = { DMAAP_ACCESS_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getDmaapAccessList(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("getDmaapAccessList: Failed to get UID from request"); + List dbAccessList = getOrInitDmaapAccessList(appUser.getLoginId()); + // Wrap the list in the status indicator. + Map model = new HashMap(); + model.put(STATUS_RESPONSE_KEY, new Integer(200)); + model.put(DATA_RESPONSE_KEY, dbAccessList); + outboundJson = mapper.writeValueAsString(model); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to get DMaaP access profile list", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + + /** + * Adds a DMaaP access profile for the requesting user ID; ignores any + * values for row ID and user ID in the body. + * + * @param request + * @return Trivial JSON object indicating success or failure. + * @throws ServletException + */ + @RequestMapping(value = { DMAAP_ACCESS_PATH }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String addDmaapAccess(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("addDmaapAccess: Failed to get UID"); + + DmaapAccess dmaapAccess = mapper.readValue(request.getReader(), DmaapAccess.class); + logger.debug("addDmaapAccess: received object: {} ", dmaapAccess); + + // Null out ID to get an auto-generated ID + dmaapAccess.setId(null); + // Overwrite any submitted user id + dmaapAccess.setUserId(appUser.getLoginId()); + // Encrypt password + if (dmaapAccess.getPassword() != null) + dmaapAccess.encryptPassword(dmaapAccess.getPassword()); + + // Create a new row + getDmaapAccessService().saveDmaapAccess(dmaapAccess); + + // Answer success + outboundJson = buildJsonSuccess(200, null); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to add DMaaP access profile", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + + /** + * Updates a DMaaP access profile if the row user ID matches the requesting + * user ID. + * + * @param id + * Path parameter with ID of the DMaaP access profile + * @param request + * @return Trivial JSON object indicating success or failure. + * @throws ServletException + * in case of unrecoverable failure + */ + @RequestMapping(value = { DMAAP_ACCESS_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String updateDmaapAccess(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("updateDmaapAccess: Failed to get UID"); + + DmaapAccess domainObj = getDmaapAccessService().getDmaapAccess(id); + if (!appUser.getLoginId().equals(domainObj.getUserId())) + throw new Exception("updateDmaapAccess: mismatch of appUser and row user ID"); + + DmaapAccess dmaapAccess = mapper.readValue(request.getReader(), DmaapAccess.class); + logger.debug("updateDmaapAccess: received object: {} ", dmaapAccess); + + // Use the path-parameter id; don't trust the one in the object + dmaapAccess.setId(id); + // Encrypt password if present + if (dmaapAccess.getPassword() != null) + dmaapAccess.encryptPassword(dmaapAccess.getPassword()); + + // Update the existing row + getDmaapAccessService().saveDmaapAccess(dmaapAccess); + + // Answer "OK" + outboundJson = buildJsonSuccess(200, null); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to update DMaaP access profile", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + + /** + * Deletes a DMaaP access profile if the row user ID matches the requesting + * user ID. + * + * @param id + * Path parameter with ID of the DMaaP access profile + * @param request + * @return Trivial JSON object indicating success or failure (altho this is + * slightly contrary to conventions for a DELETE method) + * @throws ServletException + * in case of unrecoverable failure + */ + @RequestMapping(value = { + DMAAP_ACCESS_PATH + "/{id}" }, method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + public String deleteDmaapAccess(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("deleteDmaapAccess: Failed to get UID"); + // Validate that this user owns the row with the specified ID + DmaapAccess domainObj = getDmaapAccessService().getDmaapAccess(id); + if (!appUser.getLoginId().equals(domainObj.getUserId())) + throw new Exception("deleteDmaapAccess: mismatch of appUser and row user ID"); + + getDmaapAccessService().deleteDmaapAccess(id); + + // Answer "OK" + outboundJson = buildJsonSuccess(200, null); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to delete DMaaP access profile", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + + /** + * Gets the selected DMaaP access row for the requesting user. + * + * See {@link #getSelectedDmaapAccess(String)} + * + * @param request + * @return JSON object with one DmaapAccessProfile, or an error + * @throws ServletException + * in case of unrecoverable failure + */ + @RequestMapping(value = { SELECT_DMAAP_ACCESS_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getSelectedDmaapAccessProfile(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("getSelectedDmaapAccessProfile: Failed to get UID"); + DmaapAccess selected = super.getSelectedDmaapAccess(appUser.getLoginId()); + // clone and decrypt + DmaapAccess clear = new DmaapAccess(selected); + try { + clear.setPassword(clear.decryptPassword()); + } catch (Exception ex) { + throw new ServletException("getSelectedDmaapAccessProfile: Failed to decrypt password", ex); + } + outboundJson = buildJsonSuccess(200, clear); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to get selected DMaaP access profile", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + + /** + * Marks the DMaaP access row as selected (first choice) for the requesting + * user if the row user ID matches the requesting user ID. As a side effect, + * removes selected marking from all other user rows. Returns status, + * additionally an error message on failure. + * + * Choice of PUT is fairly arbitrary - there is no body, but GET is for + * actions that do not change data. + * + * @param id + * Path parameter with ID of the DMaaP access profile + * @param request + * @return Trivial JSON object indicating success or failure. + * @throws ServletException + * in case of unrecoverable failure + */ + @RequestMapping(value = { + SELECT_DMAAP_ACCESS_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String selectDmaapAccess(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("selectDmaapAccess: Failed to get UID"); + // A little inefficient in that it requires 3 database accesses; + // probably could be done in 1 with some sophisticated SQL. + List dmaapAccessList = getDmaapAccessService().getDmaapAccessList(appUser.getLoginId()); + for (DmaapAccess dmaap : dmaapAccessList) { + // Only write out the changed rows. + boolean changed = false; + if (id == dmaap.getId()) { + changed = !dmaap.getSelected(); + dmaap.setSelected(true); + } else { + changed = dmaap.getSelected(); + dmaap.setSelected(false); + } + if (changed) + getDmaapAccessService().saveDmaapAccess(dmaap); + } + + // Answer OK + outboundJson = buildJsonSuccess(200, null); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to select a DMaaP access profile", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + + /** + * Tests the URL in the DMaaP access profile object. + * + * @param request + * @return JSON with a Dmaap object (which has name etc.) on success, error + * on failure. + * @throws ServletException + * in case of unrecoverable failure + */ + @RequestMapping(value = { "test_dmaap_access" }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String testDmaapAccess(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + DmaapAccess dmaapAccess = mapper.readValue(request.getReader(), DmaapAccess.class); + logger.debug("testDmaapAccess: received object: {} ", dmaapAccess); + if (dmaapAccess.getDmaapUrl() == null || dmaapAccess.getDmaapUrl().trim().length() == 0) + throw new Exception("Null or empty URL"); + + DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess); + // Get the instance so the page can display its name + DmaapObject dmaap = restClient.getDmaap(); + if (dmaap instanceof Dmaap) { + outboundJson = buildJsonSuccess(200, dmaap); + } else { + // Bad credentials lands here. + ErrorResponse err = (ErrorResponse) dmaap; + outboundJson = buildJsonError(500, "Test failed: " + err.getMessage(), null); + } + } catch (Exception ex) { + // This is entirely likely; e.e., unknown host exception on typo. + outboundJson = buildJsonError(500, "Invalid DMaaP URL", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/HealthCheckController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/HealthCheckController.java new file mode 100644 index 0000000..90a67a1 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/HealthCheckController.java @@ -0,0 +1,157 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.controller; + +import java.util.Date; + +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.dmaapbc.dbcapp.service.DmaapAccessService; +import org.openecomp.portalsdk.core.controller.UnRestrictedBaseController; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * This controller responds to probes for application health, returning a JSON + * body to indicate current status. + */ +@RestController +@Configuration +@EnableAspectJAutoProxy +@RequestMapping("/") +public class HealthCheckController extends UnRestrictedBaseController { + + private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HealthCheckController.class); + + private static final String HEALTH_CHECK_PATH = "/healthCheck"; + + @Autowired + private DmaapAccessService dmaapAccessService; + + /** + * Model for JSON response with health-check results. + */ + public class HealthStatus { + // Either 200 or 500 + public int statusCode; + // Additional detail in case of error, empty in case of success. + public String message; + + public HealthStatus(int code, String msg) { + this.statusCode = code; + this.message = msg; + } + + public int getStatusCode() { + return statusCode; + } + + public void setStatusCode(int code) { + this.statusCode = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String msg) { + this.message = msg; + } + } + + /** + * Checks application health by making a trivial query to the database. + * + * @param request + * @return 200 if database access succeeds, 500 if it fails. + */ + @RequestMapping(value = { HEALTH_CHECK_PATH }, method = RequestMethod.GET, produces = "application/json") + public HealthStatus healthCheck(HttpServletRequest request) { + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + HealthStatus healthStatus = null; + try { + logger.debug(EELFLoggerDelegate.debugLogger, "Performing health check"); + dmaapAccessService.getDmaapAccessCount(); + healthStatus = new HealthStatus(200, "health check succeeded"); + } catch (Exception ex) { + logger.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex); + healthStatus = new HealthStatus(500, "health check failed: " + ex.toString()); + } + return healthStatus; + } + + /** + * This implementation does not support suspend/resume. + * + * @param request + * @return Trivial success + */ + @RequestMapping(value = { + HEALTH_CHECK_PATH + "/suspend" }, method = RequestMethod.GET, produces = "application/json") + public HealthStatus healthCheckSuspend(HttpServletRequest request) { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + HealthStatus response = new HealthStatus(200, "suspend not implemented"); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * This implementation does not support suspend/resume. + * + * @param request + * @return Trivial success + */ + @RequestMapping(value = { + HEALTH_CHECK_PATH + "/resume" }, method = RequestMethod.GET, produces = "application/json") + public HealthStatus healthCheckResume(HttpServletRequest request) { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + HealthStatus response = new HealthStatus(200, "resume not implemented"); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Answers ping request without checking the application health. + * + * @param request + * @return Trivial success + */ + @RequestMapping(value = { HEALTH_CHECK_PATH + "/ping" }, method = RequestMethod.GET, produces = "application/json") + public HealthStatus ping(HttpServletRequest request) { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + HealthStatus response = new HealthStatus(200, "ping received"); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/ManifestController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/ManifestController.java new file mode 100644 index 0000000..a2986f9 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/ManifestController.java @@ -0,0 +1,113 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.controller; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.jar.Attributes; +import java.util.jar.Manifest; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * This controller responds to a request for the web application manifest, + * returning a JSON with the information that was created at build time. + * + * Manifest entries have names with hyphens, which means Javascript code can't + * simply use the shorthand object.key; instead use object['key']. + */ +@RestController +@Configuration +@EnableAspectJAutoProxy +@RequestMapping("/") +public class ManifestController extends RestrictedBaseController { + + private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ManifestController.class); + + /** + * Required to obtain the webapp manifest. + */ + @Autowired + ServletContext context; + + /** + * Gets the content of the webapp manifest file META-INF/MANIFEST.MF. + * + * @return Attributes object with key-value pairs from the manifest + * @throws IOException + */ + private Attributes getWebappManifest() throws IOException { + // Path to resource on classpath + final String MANIFEST_RESOURCE_PATH = "/META-INF/MANIFEST.MF"; + // Manifest is formatted as Java-style properties + InputStream inputStream = context.getResourceAsStream(MANIFEST_RESOURCE_PATH); + if (inputStream == null) + throw new IOException("getWebappManifest: failed to get resource at path " + MANIFEST_RESOURCE_PATH); + Manifest manifest = new Manifest(inputStream); + inputStream .close(); + return manifest.getMainAttributes(); + } + + /** + * Gets the webapp manifest contents as a JSON object. + * + * @param request + * @return A map of key-value pairs. On success: + * + *
+	 * { "manifest" : { "key1": "value1", "key2": "value2" } }
+	 *         
+ * + * On failure: + * + *
+	 * { "error": "message" }
+	 *         
+ */ + @RequestMapping(value = { "/manifest" }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public Map getManifest(HttpServletRequest request) { + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + Map response = new HashMap(); + try { + Attributes attributes = getWebappManifest(); + response.put("manifest", attributes); + } catch (Exception ex) { + logger.error(EELFLoggerDelegate.errorLogger, "getManifest: failed to read manifest", ex); + response.put("error", "failed to get manifest: " + ex.toString()); + } + return response; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/MessageRouterController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/MessageRouterController.java new file mode 100644 index 0000000..1513e17 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/MessageRouterController.java @@ -0,0 +1,226 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.controller; + +import java.util.Date; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.slf4j.MDC; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * Message Router controller: serves Ajax requests made by Angular scripts on + * pages that show topics and clients. + */ +@Controller +@RequestMapping("/") +public class MessageRouterController extends DbcappRestrictedBaseController { + + private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MessageRouterController.class); + + private static final String TOPIC_PATH = "/mr_topic"; + private static final String CLIENT_PATH = "/mr_client"; + + public MessageRouterController() { + } + + /** + * Answers a request for one page of message router topics. See + * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)} + * + * @param request + * @return Item list for the specified page + * @throws ServletException + */ + @RequestMapping(value = { TOPIC_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getMRTopicsByPage(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = getItemListForPageWrapper(request, DmaapDataItem.MR_TOPIC); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Answers a request for one page of message router clients. See + * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)} + * + * @param request + * @return Item list for the specified page + * @throws ServletException + */ + @RequestMapping(value = { CLIENT_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getMRClientsByPage(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = getItemListForPageWrapper(request, DmaapDataItem.MR_CLIENT); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Adds a topic with the specified information. Expects a JSON block in the + * request body - a Topic object. + * + * @param request + * @return Item list for the specified page + * @throws ServletException + */ + @RequestMapping(value = { TOPIC_PATH }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String addTopic(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = addItem(request, DmaapDataItem.MR_TOPIC, HttpServletResponse.SC_CREATED); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Adds a client with the specified information. Expects a JSON block in the + * request body - a MR_Client object. + * + * @param request + * @return Success / failure JSON + * @throws ServletException + */ + @RequestMapping(value = { CLIENT_PATH }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String addMRClient(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = addItem(request, DmaapDataItem.MR_CLIENT, HttpServletResponse.SC_CREATED); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Updates a topic with the specified information. Expects a JSON block in + * the request body - a Topic object. + * + * Writes a JSON object as an HTTP response; on success it has a "status" + * and possibly a "data" item; on failure, also has an "error" item. + * + * @param id + * @param request + * @return Success / failure JSON + * @throws ServletException + */ + @RequestMapping(value = { TOPIC_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String updateTopic(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = updateItem(request, DmaapDataItem.MR_TOPIC, Long.toString(id), null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Updates a client with the specified information. Expects a JSON block in + * the request body - a MR_Client object. + * + * Writes a JSON object as an HTTP response; on success it has a "status" + * and possibly a "data" item; on failure, also has an "error" item. + * + * @param id + * + * @param request + * @return Success / failure JSON + * @throws ServletException + */ + @RequestMapping(value = { CLIENT_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String updateMRClient(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = updateItem(request, DmaapDataItem.MR_CLIENT, Long.toString(id), null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Deletes a topic with the FQTN ID specified as a path parameter. + * + * FQTN is a string of dot-separated names. Spring, in its infinite wisdom, + * truncates extensions on dotted path parameters; e.g., "foo.json" becomes + * "foo". Avoid truncation here with the extra ":.+" incantation at the end. + * + * Writes a JSON object as an HTTP response; on success it only has "status" + * item; on failure, also has an "error" item. + * + * @param id + * Path parameter with object ID + * @param request + * @return Success / failure JSON + * @throws ServletException + */ + @RequestMapping(value = { "/mr_topic/{id:.+}" }, method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + public String deleteTopic(@PathVariable("id") String id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = deleteItem(request, DmaapDataItem.MR_TOPIC, id, 204); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Deletes a client with the mrClientId specified as a path parameter. + * + * Writes a JSON object as an HTTP response; on success it only has "status" + * item; on failure, also has an "error" item. + * + * @param id + * Path parameter with object ID + * @param request + * @return Success / failure JSON + * @throws ServletException + */ + @RequestMapping(value = { "/mr_client/{id}" }, method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + public String deleteMRClient(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = deleteItem(request, DmaapDataItem.MR_CLIENT, Long.toString(id), null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/domain/DmaapAccess.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/domain/DmaapAccess.java new file mode 100644 index 0000000..bb11dfd --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/domain/DmaapAccess.java @@ -0,0 +1,167 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.domain; + +import org.openecomp.portalsdk.core.domain.support.DomainVo; +import org.openecomp.portalsdk.core.util.CipherUtil; + +/** + * Hold an access profile for a DMaaP REST endpoint. Represents one row in the + * DBCA_DMAAP table. + */ +public class DmaapAccess extends DomainVo { + + private static final long serialVersionUID = 6443219375733216340L; + + // parent class defines these fields: + // ID, created, modified, created_id, modified_id + + /** UID for user who owns this row */ + private String userId; + /** Nickname for this row */ + private String name; + /** REST API endpoint */ + private String dmaapUrl; + /** Credentials */ + private String mechId; + /** Credentials */ + private String password; + /** User's preferred access profile */ + private boolean selected; + + /** + * Standard POJO no-arg constructor + */ + public DmaapAccess() { + } + + /** + * Copy constructor + * @param copy + */ + public DmaapAccess(final DmaapAccess copy) { + // Unfortunately DomainVo doesn't provide a copy constructor; + // only the ID field is needed. + this.id = copy.id; + // Our fields + this.userId = copy.userId; + this.name = copy.name; + this.dmaapUrl = copy.dmaapUrl; + this.mechId = copy.mechId; + this.password = copy.password; + this.selected = copy.selected; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDmaapUrl() { + return dmaapUrl; + } + + public void setDmaapUrl(String dmaapUrl) { + this.dmaapUrl = dmaapUrl; + } + + public String getMechId() { + return mechId; + } + + public void setMechId(String mechId) { + this.mechId = mechId; + } + + /** + * Gets the encrypted password. Applications should use + * {@link #decryptPassword()}! + * + * @return The encrypted password + */ + public String getPassword() { + return password; + } + + /** + * Sets the encrypted password. Applications should use + * {@link #encryptPassword(String)}! + * + * @param password + * The encrypted password + */ + public void setPassword(String password) { + this.password = password; + } + + public boolean getSelected() { + return selected; + } + + public void setSelected(boolean selected) { + this.selected = selected; + } + + /** + * A getter that decrypts the value read from the database and returns the + * clear text. Has no side effects. + * + * @return Clear-text password. + * @throws Exception + */ + public String decryptPassword() throws Exception { + if (password == null) + return null; + return CipherUtil.decrypt(password); + } + + /** + * A setter that encrypts the clear-text in preparation for storing in the + * database. + * + * @param clearText + * The clear-text password to be encrypted + * @throws Exception + */ + public void encryptPassword(String clearText) throws Exception { + if (clearText == null) { + password = null; + return; + } + password = CipherUtil.encrypt(clearText); + } + + @Override + public String toString() { + return "DmaapAccess[id=" + id + ", url=" + dmaapUrl + ", ...]"; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestClient.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestClient.java new file mode 100644 index 0000000..43542b2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestClient.java @@ -0,0 +1,184 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.rest; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; + +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.openecomp.dmaapbc.dbcapp.domain.DmaapAccess; +import org.openecomp.dmaapbc.dbcapp.service.DmaapAccessService; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +/** + * Provides methods for accessing the DBC microservice via REST using basic HTTP + * authentication. + * + */ +public class DbcUsvcRestClient implements DmaapAccessService { + + public static final String endpointPath = "/dmaap_access"; + private final String baseUrl; + private final RestTemplate restTemplate; + + /** + * Builds a restTemplate that uses basic HTTP authentication for use by all + * methods in this class. + * + * @param webapiUrl + * @param user + * @param pass + */ + public DbcUsvcRestClient(String webapiUrl, String user, String pass) { + if (webapiUrl == null || user == null || pass == null) + throw new IllegalArgumentException("Nulls not permitted"); + + baseUrl = webapiUrl; + URL url = null; + try { + url = new URL(baseUrl); + } catch (MalformedURLException ex) { + throw new RuntimeException("Failed to parse URL", ex); + } + final HttpHost httpHost = new HttpHost(url.getHost(), url.getPort()); + + // Build a client with a credentials provider + CredentialsProvider credsProvider = new BasicCredentialsProvider(); + credsProvider.setCredentials(new AuthScope(httpHost), new UsernamePasswordCredentials(user, pass)); + HttpClientBuilder clientBuilder = HttpClientBuilder.create(); + CloseableHttpClient httpClient = clientBuilder.setDefaultCredentialsProvider(credsProvider).build(); + + // Create request factory with our superpower client + HttpComponentsClientHttpRequestFactoryBasicAuth requestFactory = new HttpComponentsClientHttpRequestFactoryBasicAuth( + httpHost); + requestFactory.setHttpClient(httpClient); + + // Put the factory in the template + this.restTemplate = new RestTemplate(); + restTemplate.setRequestFactory(requestFactory); + } + + /** + * Gets the count of DMaaP access profiles. + * + * @return Number of access profiles in the database. + */ + public int getDmaapAccessCount() { + String url = baseUrl + "/count_dmaap_access"; + ResponseEntity daResponse = restTemplate.exchange(url, HttpMethod.GET, null, + DbcUsvcRestResponse.class); + DbcUsvcRestResponse response = daResponse.getBody(); + return response.getStatus(); + } + + /** + * Gets the DMaaP access profiles for the specified userId. + * + * @param userId + * @return List of DmaapAccess items + */ + @Override + public List getDmaapAccessList(final String userId) { + String url = baseUrl + endpointPath + "?userId=" + userId; + // ResponseEntity responseEntity = + // restTemplate.getForEntity(url, Object[].class); + // MediaType contentType = responseEntity.getHeaders().getContentType(); + // HttpStatus statusCode = responseEntity.getStatusCode(); + // Object[] objects = responseEntity.getBody(); + ResponseEntity> daResponse = restTemplate.exchange(url, HttpMethod.GET, null, + new ParameterizedTypeReference>() { + }); + List daList = daResponse.getBody(); + return daList; + } + + /** + * Gets the specified DMaaP access profile. + */ + @Override + public DmaapAccess getDmaapAccess(Long dmaapId) { + String url = baseUrl + endpointPath + "?dmaapId=" + dmaapId; + ResponseEntity daResponse = restTemplate.exchange(url, HttpMethod.GET, null, + new ParameterizedTypeReference() { + }); + DmaapAccess da = daResponse.getBody(); + return da; + } + + /** + * POSTs or PUTs the DMaaP access profile as needed, based on whether the + * object's ID field is set. If not set it creates a new row; if set, it + * updates a row in the remote service table. + * + * @param dmaapAccess + */ + @Override + public void saveDmaapAccess(final DmaapAccess dmaapAccess) { + if (dmaapAccess.getId() == null) { + String url = baseUrl + endpointPath; + restTemplate.postForObject(url, dmaapAccess, String.class); + } else { + String url = baseUrl + endpointPath + "/" + Long.toString(dmaapAccess.getId()); + restTemplate.put(url, dmaapAccess); + } + } + + /** + * Deletes the new DMaaP access profile row in the remote service table. + * + * @param id + */ + @Override + public void deleteDmaapAccess(final Long id) { + String url = baseUrl + endpointPath + "/" + Long.toString(id); + restTemplate.delete(url); + } + + /** + * Simple test + * + * @param args + * @throws Exception + */ + public static void main(String[] args) throws Exception { + if (args.length != 1) + throw new IllegalArgumentException("Single argument expected: userid"); + DbcUsvcRestClient client = new DbcUsvcRestClient("http://localhost:8081/dbus", "dbus_user", "dbus_pass"); + final String userId = args[0]; + System.out.println("Requesting profiles for user " + userId); + List access = client.getDmaapAccessList(userId); + if (access == null) + System.err.println("Received null"); + else + for (DmaapAccess da : access) + System.out.println(da); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java new file mode 100644 index 0000000..50e37d8 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java @@ -0,0 +1,61 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.rest; + +/** + * Models the responses sent by the micro service in JSON format. + */ +public class DbcUsvcRestResponse { + + private int status; + private String data, error, exception; + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getException() { + return exception; + } + + public void setException(String exception) { + this.exception = exception; + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/HttpComponentsClientHttpRequestFactoryBasicAuth.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/HttpComponentsClientHttpRequestFactoryBasicAuth.java new file mode 100644 index 0000000..dd70d48 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/HttpComponentsClientHttpRequestFactoryBasicAuth.java @@ -0,0 +1,65 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.rest; + +import java.net.URI; + +import org.apache.http.HttpHost; +import org.apache.http.client.AuthCache; +import org.apache.http.client.protocol.HttpClientContext; +import org.apache.http.impl.auth.BasicScheme; +import org.apache.http.impl.client.BasicAuthCache; +import org.apache.http.protocol.BasicHttpContext; +import org.apache.http.protocol.HttpContext; +import org.springframework.http.HttpMethod; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; + +/** + * Utility class to enable Basic HTTP Authentication with Spring REST templates. + * + * From: + * http://www.baeldung.com/2012/04/16/how-to-use-resttemplate-with-basic-authentication-in-spring-3-1/ + */ +public class HttpComponentsClientHttpRequestFactoryBasicAuth extends HttpComponentsClientHttpRequestFactory { + + private HttpHost host; + + public HttpComponentsClientHttpRequestFactoryBasicAuth(HttpHost host) { + super(); + this.host = host; + } + + protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { + return createHttpContext(); + } + + private HttpContext createHttpContext() { + // Create AuthCache instance + AuthCache authCache = new BasicAuthCache(); + // Generate BASIC scheme object and add it to the local auth cache + BasicScheme basicAuth = new BasicScheme(); + authCache.put(host, basicAuth); + + // Add AuthCache to the execution context + BasicHttpContext localcontext = new BasicHttpContext(); + localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache); + return localcontext; + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessService.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessService.java new file mode 100644 index 0000000..e0bf0b2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessService.java @@ -0,0 +1,72 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.service; + +import java.util.List; + +import org.openecomp.dmaapbc.dbcapp.domain.DmaapAccess; + +/** + * Defines methods to manipulate the database table with DmaapAccess domain + * objects. No method throws a checked exception, in keeping with the Spring + * philosophy of throwing unchecked exceptions. + */ +public interface DmaapAccessService { + + /** + * Gets the number of Dmaap Access entries. + * + * @return Number of rows in the table. + */ + int getDmaapAccessCount(); + + /** + * Gets all DMaaP access rows in the table for the specified user. + * + * @param userId + * UID of the user + * @return List of DMaaP instance objects, which may be empty. + */ + List getDmaapAccessList(String userId); + + /** + * Gets the DMaaP access object with the specified row ID. + * + * @param dmaapId + * @return DMaap instance; null if none exists. + */ + DmaapAccess getDmaapAccess(Long dmaapId); + + /** + * Creates a new managed object (a new row in the table). + * + * @param dmaap + * DMaaP instance to create. + */ + void saveDmaapAccess(DmaapAccess dmaap); + + /** + * Deletes the DMaaP access row with the specified ID. + * + * @param dmaapId + */ + void deleteDmaapAccess(Long dmaapId); + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessServiceImpl.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessServiceImpl.java new file mode 100644 index 0000000..a7e5185 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessServiceImpl.java @@ -0,0 +1,86 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.service; + +import java.util.ArrayList; +import java.util.List; + +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.Restrictions; +import org.openecomp.dmaapbc.dbcapp.domain.DmaapAccess; +import org.openecomp.portalsdk.core.service.DataAccessService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Hibernate-assisted methods to manipulate the DBCA_DMAAP table. + */ +@Service("dmaapAccessService") +@Transactional +public class DmaapAccessServiceImpl implements DmaapAccessService { + + @Autowired + private DataAccessService dataAccessService; + + public DataAccessService getDataAccessService() { + return dataAccessService; + } + + public void setDataAccessService(DataAccessService dataAccessService) { + this.dataAccessService = dataAccessService; + } + + @SuppressWarnings("unchecked") + @Override + public int getDmaapAccessCount() { + List accesses = (List) getDataAccessService().getList(DmaapAccess.class, null); + return accesses.size(); + } + + @SuppressWarnings("unchecked") + @Override + public List getDmaapAccessList(String userId) { + List restrictionsList = new ArrayList(); + Criterion criterion1 = Restrictions.eq("userId", userId); + restrictionsList.add(criterion1); + List accesses = (List) getDataAccessService().getList(DmaapAccess.class, null, + restrictionsList, null); + return accesses; + } + + @Override + public DmaapAccess getDmaapAccess(Long dmaapId) { + return (DmaapAccess) getDataAccessService().getDomainObject(DmaapAccess.class, dmaapId, null); + } + + @Override + public void saveDmaapAccess(DmaapAccess dmaap) { + getDataAccessService().saveDomainObject(dmaap, null); + } + + @Override + public void deleteDmaapAccess(Long dmaapId) { + DmaapAccess dmaapAccess = getDmaapAccess(dmaapId); + if (dmaapAccess != null) + getDataAccessService().deleteDomainObject(dmaapAccess, null); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/util/DbcappProperties.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/util/DbcappProperties.java new file mode 100644 index 0000000..d2acf3e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/util/DbcappProperties.java @@ -0,0 +1,88 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.dmaapbc.dbcapp.util; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; + +/** + * Publishes a list of constants and methods to access the properties that are + * read by Spring from the specified configuration file(s). + * + * Should be used like this (and never in a constructor): + * + *
+ * @Autowired
+ * DbcappProperties properties;
+ * 
+ */ +@Configuration +@PropertySource(value = { "${container.classpath:}/WEB-INF/dbcapp/dbcapp.properties" }) +public class DbcappProperties { + + public static final String DMAAP_REST_URL_LIST = "dmaap.rest.url.list"; + public static final String DMAAP_MECHID_NAME = "dmaap.mechid.name"; + public static final String DMAAP_MECHID_PASSWORD = "dmaap.mechid.password"; + public static final String PROFILE_ACCESS_METHOD = "profile.access.method"; + public static final String PROFILE_USVC_URL = "profile.microservice.url"; + public static final String PROFILE_USVC_USER = "profile.microservice.user.name"; + public static final String PROFILE_USVC_PASS = "profile.microservice.user.password"; + + private Environment environment; + + public DbcappProperties() { + } + + protected Environment getEnvironment() { + return environment; + } + + @Autowired + public void setEnvironment(final Environment environment) { + this.environment = environment; + } + + public boolean containsProperty(String key) { + return environment.containsProperty(key); + } + + public String getProperty(String key) { + return environment.getRequiredProperty(key); + } + + /** + * Gets the values for a comma-separated list property value as a String + * array. + * + * @param key + * @return Array of values with leading and trailing whitespace removed; + * null if key is not found. + */ + public String[] getCsvListProperty(final String key) { + String listVal = getProperty(key); + if (listVal == null) + return null; + String[] vals = listVal.split("\\s*,\\s*"); + return vals; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppConfig.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppConfig.java new file mode 100644 index 0000000..fc0a54a --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppConfig.java @@ -0,0 +1,203 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.conf; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.openecomp.fusionapp.uebhandler.InitUebHandler; +import org.openecomp.fusionapp.uebhandler.MainUebHandler; +import org.openecomp.fusionapp.uebhandler.WidgetNotificationHandler; +import org.openecomp.portalsdk.core.conf.AppConfig; +import org.openecomp.portalsdk.core.conf.Configurable; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.objectcache.AbstractCacheManager; +import org.openecomp.portalsdk.core.service.DataAccessService; +import org.openecomp.portalsdk.core.util.CacheManager; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Profile; +import org.springframework.context.annotation.PropertySource; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; + +/** + * Configures Spring features in the DMaaP Bus Control web application. + * Subclasses the ECOMP Portal SDK core AppConfig class to reuse interceptors, + * view resolvers and other features defined there. + */ +@Configuration +@EnableWebMvc +@ComponentScan(basePackages = { "org.openecomp" } ) +@PropertySource(value = { "${container.classpath:}/WEB-INF/conf/app/test.properties" }, ignoreResourceNotFound = true) +@Profile("src") +@EnableAsync +@EnableScheduling +public class ExternalAppConfig extends AppConfig implements Configurable { + + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ExternalAppConfig.class); + + // private RegistryAdapter schedulerRegistryAdapter; + + @Configuration + @Import(SystemProperties.class) + static class InnerConfiguration { + } + + /** + * @see org.openecomp.portalsdk.core.conf.AppConfig#viewResolver() + */ + public ViewResolver viewResolver() { + return super.viewResolver(); + } + + /** + * @see org.openecomp.portalsdk.core.conf.AppConfig#addResourceHandlers(ResourceHandlerRegistry) + * + * @param registry + */ + public void addResourceHandlers(ResourceHandlerRegistry registry) { + super.addResourceHandlers(registry); + } + + /** + * @see org.openecomp.portalsdk.core.conf.AppConfig#dataAccessService() + */ + public DataAccessService dataAccessService() { + return super.dataAccessService(); + } + + /** + * Creates a new list with entries that are external app + * definitions.xml paths. + * + * @return List of String + */ + public List addTileDefinitions() { + List definitions = new ArrayList(); + definitions.add("/WEB-INF/defs/definitions.xml"); + definitions.add("/WEB-INF/dbcapp/dbcapp-definitions.xml"); + if (logger.isDebugEnabled()) + logger.debug(EELFLoggerDelegate.debugLogger, "addTileDefinitions: list is " + definitions); + return definitions; + } + + /** + * Adds request interceptors to the specified registry by calling + * {@link AppConfig#addInterceptors(InterceptorRegistry)}, but excludes + * certain paths from the session timeout interceptor. + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + super.setExcludeUrlPathsForSessionTimeout("/login_external", "*/login_external.htm", "login", "/login.htm", + "/api*","/single_signon.htm","/single_signon"); + super.addInterceptors(registry); + } + + /** + * Creates and returns a new instance of a {@link CacheManager} class. + * + * @return New instance of {@link CacheManager} + */ + @Bean + public AbstractCacheManager cacheManager() { + return new CacheManager(); + } + + @PostConstruct + public void initGlobalLocalContext() { + // logger.init(); + } + + + /** + * Creates and returns a new instance of a {@link MainUebHandler}. + * + * @return New instance of {@link MainUebHandler}. + */ + @Bean + public MainUebHandler mainUebHandler() { + + return new MainUebHandler(); + } + + /** + * Creates and returns a new instance of a {@link InitUebHandler}. + * + * @return New instance of {@link InitUebHandler}. + */ + @Bean + public InitUebHandler initUebHandler() { + + return new InitUebHandler(); + } + + /** + * Creates and returns a new instance of a {@link WidgetNotificationHandler} + * . + * + * @return New instance of {@link WidgetNotificationHandler}. + */ + @Bean + public WidgetNotificationHandler widgetNotificationHandler() { + return new WidgetNotificationHandler(); + } + + /** + * Creates and returns a new instance of a {@link SchedulerFactoryBean} and + * populates it with triggers. + * + * @return New instance of {@link SchedulerFactoryBean} + * @throws Exception + */ + // APPLICATIONS REQUIRING QUARTZ SHOULD RESTORE ANNOTATION + /* + @Bean // ANNOTATION COMMENTED OUT + public SchedulerFactoryBean schedulerFactoryBean() throws Exception { + SchedulerFactoryBean scheduler = new SchedulerFactoryBean(); + scheduler.setTriggers(schedulerRegistryAdapter.getTriggers()); + scheduler.setConfigLocation(appApplicationContext.getResource("WEB-INF/conf/quartz.properties")); + scheduler.setDataSource(dataSource()); + return scheduler; + } + */ + + + /** + * Sets the scheduler registry adapter. + * + * @param schedulerRegistryAdapter + */ + /* + @Autowired + public void setSchedulerRegistryAdapter(final RegistryAdapter schedulerRegistryAdapter) { + this.schedulerRegistryAdapter = schedulerRegistryAdapter; + } + */ +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppInitializer.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppInitializer.java new file mode 100644 index 0000000..f9d5065 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppInitializer.java @@ -0,0 +1,60 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.conf; + +import java.util.Arrays; + +import org.openecomp.portalsdk.core.conf.AppInitializer; + +public class ExternalAppInitializer extends AppInitializer{ + + + @Override + protected Class[] getRootConfigClasses() { + return super.getRootConfigClasses(); + } + + @Override + protected Class[] getServletConfigClasses() { +// Class[] configClasses = super.getServletConfigClasses(); +// Class[] additionalConfigClasses = Arrays.copyOf(configClasses, configClasses.length); +// addConfigClass(additionalConfigClasses, ExternalAppConfig.class); +// return additionalConfigClasses; +// + return new Class[] {ExternalAppConfig.class}; + } + + static Class[] addConfigClass(Class[] a, Class e) { + a = Arrays.copyOf(a, a.length + 1); + a[a.length - 1] = e; + return a; + } + + /* + * URL request will direct to the Spring dispatcher for processing + */ + @Override + protected String[] getServletMappings() { + return super.getServletMappings(); + } + +} + + diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/HibernateMappingLocations.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/HibernateMappingLocations.java new file mode 100644 index 0000000..bac61a6 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/HibernateMappingLocations.java @@ -0,0 +1,45 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.conf; + +import org.openecomp.portalsdk.core.conf.HibernateMappingLocatable; +import org.springframework.context.annotation.Profile; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; + +@Component +@Profile("src") +public class HibernateMappingLocations implements HibernateMappingLocatable { + + public Resource[] getMappingLocations() { + return new Resource[] { + // Path is relative to WEB-INF/conf; + // a leading slash gets stripped so don't bother. + new ClassPathResource("../fusion/orm/Fusion.hbm.xml"), + // DBC does not use workflow nor RCloud + // new ClassPathResource("../fusion/orm/Workflow.hbm.xml"), + // new ClassPathResource("../fusion/orm/RNoteBookIntegration.hbm.xml"), + new ClassPathResource("../dbcapp/dbcapp.hbm.xml") + }; + } + + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/AngularSinglePageController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/AngularSinglePageController.java new file mode 100644 index 0000000..2a4c6d5 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/AngularSinglePageController.java @@ -0,0 +1,48 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.controller; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +/** + * Controller for a single-page application sample. The view is restricted to + * authenticated users. The named view resolves to page singlePageSample.html, + * which uses Angular. + */ +@Controller +@RequestMapping("/") +public class AngularSinglePageController extends RestrictedBaseController { + + @RequestMapping(value = { "/singlePageSample" }, method = RequestMethod.GET) + public ModelAndView view(HttpServletRequest request) { + Map model = new HashMap(); + return new ModelAndView("single_page_sample", "model", model); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/CallflowController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/CallflowController.java new file mode 100644 index 0000000..371284c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/CallflowController.java @@ -0,0 +1,44 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.controller; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +/** + * Controller for a message sequence chart view. The view is restricted to + * authenticated users. The view name defaults to the request name with no + * suffix, "callflow", which resolves to page details.jsp. That page is an + * iframe around page details.html. + */ +@Controller +@RequestMapping("/") +public class CallflowController extends RestrictedBaseController { + + @RequestMapping(value = { "/callflow" }, method = RequestMethod.GET) + public ModelAndView plot() { + final String defaultViewName = null; + return new ModelAndView(defaultViewName); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/ElasticSearchController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/ElasticSearchController.java new file mode 100644 index 0000000..5b59aa9 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/ElasticSearchController.java @@ -0,0 +1,128 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.controller; + +import java.io.IOException; + +import org.json.JSONObject; +import org.openecomp.fusionapp.model.Result; +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import io.searchbox.client.JestClient; +import io.searchbox.client.JestClientFactory; +import io.searchbox.client.config.HttpClientConfig; +import io.searchbox.core.Search; +import io.searchbox.core.SearchResult; +import io.searchbox.core.Suggest; +import io.searchbox.core.SuggestResult; +import io.searchbox.params.Parameters; + +/** + * Controller for views that demonstrate Elastic Search features. + */ +@RestController +public class ElasticSearchController extends RestrictedBaseController{ + + @RequestMapping(value = {"/es_search_demo" }, method = RequestMethod.GET) + public ModelAndView search() { + return new ModelAndView("es_search_demo"); + } + + @RequestMapping(value = {"/es_suggest_demo" }, method = RequestMethod.GET) + public ModelAndView suggest() { + return new ModelAndView("es_suggest_demo"); + } + + @RequestMapping(value="/es_suggest/{task}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity doSuggest(@PathVariable("task") String task) throws IOException { + JSONObject obj = new JSONObject(task); + String searchTerm = obj.getString("data"); + String searchSize = obj.getString("size"); + String searchFuzzy = obj.getString("fuzzy"); + String resultName = obj.getString("resultname"); + + JestClientFactory factory = new JestClientFactory(); + factory.setHttpClientConfig(new HttpClientConfig + .Builder("http://host:9200") + .multiThreaded(true) + .build()); + JestClient client = factory.getObject(); + + + Suggest suggest = new Suggest.Builder("{\n" + +"\"" + resultName +"\" : {\n" + +"\"text\" : \""+ searchTerm +"\",\n" + +"\"completion\" : {\n" + +"\"field\" : \"suggest\",\n" + +"\"size\" : " + searchSize + ",\n" + +"\"fuzzy\" : \"" + searchFuzzy + "\"\n" + +"}\n" + +"}\n" + +"}").addIndex("customer").build(); + + SuggestResult result = client.execute(suggest); + System.err.println(result.getJsonObject().toString()); + return new ResponseEntity(new Result(result.getJsonObject().toString()),HttpStatus.OK); + } + + @RequestMapping(value="/es_search/{task}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity doSearch(@PathVariable("task") String task) throws IOException { + JSONObject obj = new JSONObject(task); + String searchTerm = obj.getString("data"); + String searchSize = obj.getString("size"); + // String searchFuzzy = obj.getString("fuzzy"); + + JestClientFactory factory = new JestClientFactory(); + factory.setHttpClientConfig(new HttpClientConfig + .Builder("http://host:9200") + .multiThreaded(true) + .build()); + JestClient client = factory.getObject(); + + Search search = new Search.Builder("{\n" + +"\"query\" : {\n" + +"\"query_string\" : {\n" + +"\"query\" : \"name:"+ searchTerm +"\"\n" + +"}\n" + +"}\n" + +"}").addIndex("customer").setParameter(Parameters.SIZE,Integer.valueOf(searchSize)).build(); + + SearchResult result = client.execute(search); + System.err.println(result.getJsonObject().toString()); + return new ResponseEntity(new Result(result.getJsonObject().toString()),HttpStatus.OK); + } + + public ResponseEntity sendResult(Result result) { + return new ResponseEntity(result, HttpStatus.OK); + } + + @Override + public boolean isRESTfulCall() { + return true; + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/LeafletMapContoller.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/LeafletMapContoller.java new file mode 100644 index 0000000..3c461be --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/LeafletMapContoller.java @@ -0,0 +1,43 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.controller; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +/** + * Controller for geographic map view. The view is restricted to authenticated + * users. The view name defaults to the request name with no suffix, + * "leafletMap", which resolves to page leafletMap.jsp. + */ +@Controller +@RequestMapping("/") +public class LeafletMapContoller extends RestrictedBaseController { + + @RequestMapping(value = { "/leafletMap" }, method = RequestMethod.GET) + public ModelAndView plot() { + final String defaultViewName = null; + return new ModelAndView(defaultViewName); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/NetMapController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/NetMapController.java new file mode 100644 index 0000000..fedd95f --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/NetMapController.java @@ -0,0 +1,57 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.controller; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +/** + * Controller for a network map view that uses iframes. The view is restricted + * to authenticated users. + */ +@Controller +@RequestMapping("/") +public class NetMapController extends RestrictedBaseController { + + @RequestMapping(value = { "/net_map" }, method = RequestMethod.GET) + public ModelAndView plot(HttpServletRequest request) { + Map model = new HashMap(); + model.put("frame_int", "net_map_int"); + // This view resolves to page frame_insert.jsp + return new ModelAndView("frame_insert", model); + } + + @RequestMapping(value = { "/net_map_int" }, method = RequestMethod.GET) + public ModelAndView plot2() { + // The view name defaults to the request without any suffix. + final String defaultViewName = null; + // This view resolves to page net_map.jsp + return new ModelAndView(defaultViewName); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/PostDroolsController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/PostDroolsController.java new file mode 100644 index 0000000..0fd902e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/PostDroolsController.java @@ -0,0 +1,138 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.controller; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.json.JSONObject; +import org.openecomp.portalsdk.core.command.PostDroolsBean; +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.service.PostDroolsService; +import org.openecomp.portalsdk.core.web.support.JsonMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +@Controller +@RequestMapping("/") +public class PostDroolsController extends RestrictedBaseController{ + + @Autowired + private PostDroolsService postDroolsService; + + @RequestMapping(value = {"/drools" }, method = RequestMethod.GET) + public ModelAndView drools(HttpServletRequest request) { + + return new ModelAndView(getViewName()); + } + + + @RequestMapping(value = {"/getDrools" }, method = RequestMethod.GET) + public void getDrools(HttpServletRequest request, HttpServletResponse response) { + // Map model = new HashMap(); + + ObjectMapper mapper = new ObjectMapper(); + try { + List beanList = postDroolsService.fetchDroolBeans(); + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(beanList)); + JSONObject j = new JSONObject(msg); + response.getWriter().write(j.toString()); + + } catch (JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @RequestMapping(value = {"/getDroolDetails" }, method = RequestMethod.GET) + public void getDroolDetails(HttpServletRequest request, HttpServletResponse response) { + + ObjectMapper mapper = new ObjectMapper(); + try { + + PostDroolsBean postDroolsBean = new PostDroolsBean(); + String selectedFile = request.getParameter("selectedFile"); + postDroolsBean.setDroolsFile(selectedFile);//sample populated + //postDroolsBean.setSelectedRules("[\"NJ\",\"NY\",\"KY\"]"); + postDroolsBean.setClassName(postDroolsService.retrieveClass(selectedFile)); + + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(postDroolsBean)); + JSONObject j = new JSONObject(msg); + response.getWriter().write(j.toString()); + + } catch (JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @RequestMapping(value = {"/post_drools/execute" }, method = RequestMethod.POST) + public ModelAndView search(HttpServletRequest request, + HttpServletResponse response) throws Exception { + try { + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + JsonNode root = mapper.readTree(request.getReader()); + PostDroolsBean postDroolsBean = mapper.readValue(root.get("postDroolsBean").toString(), PostDroolsBean.class); + + String resultsString = postDroolsService.execute(postDroolsBean.getDroolsFile(), postDroolsBean.getClassName(), postDroolsBean.getSelectedRules()); + + response.setCharacterEncoding("UTF-8"); + response.setContentType("application / json"); + request.setCharacterEncoding("UTF-8"); + + PrintWriter out = response.getWriter(); + //String responseString = mapper.writeValueAsString(resultsString); + JSONObject j = new JSONObject("{resultsString: "+resultsString+"}"); + + out.write(j.toString()); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return null; + } + + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/UserProfileController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/UserProfileController.java new file mode 100644 index 0000000..cf5feb8 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/UserProfileController.java @@ -0,0 +1,73 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.controller; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.domain.Profile; +import org.openecomp.portalsdk.core.service.ProfileService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Controller for user profile view. The view is restricted to authenticated + * users. The view name resolves to page user_profile.jsp which uses Angular. + */ + +@Controller +@RequestMapping("/") +public class UserProfileController extends RestrictedBaseController { + + @Autowired + ProfileService service; + + @RequestMapping(value = { "/user_profile" }, method = RequestMethod.GET) + public ModelAndView ProfileSearch(HttpServletRequest request) { + Map model = new HashMap(); + ObjectMapper mapper = new ObjectMapper(); + List profileList = service.findAll(); + try { + model.put("customerInfo", mapper.writeValueAsString(profileList)); + } catch (JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return new ModelAndView("user_profile", "model", model); + } + +} + diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/WelcomeController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/WelcomeController.java new file mode 100644 index 0000000..510d154 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/WelcomeController.java @@ -0,0 +1,44 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.controller; + +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +/** + * Controller for welcome view. The view is restricted to authenticated users. + * If no view name is provided, the view name defaults to the request name with + * no suffix, "welcome", which is resolved by consulting a definitions.xml file. + */ +@Controller +@RequestMapping("/") +public class WelcomeController extends RestrictedBaseController { + @RequestMapping(value = { "/welcome" }, method = RequestMethod.GET) + public ModelAndView welcome(HttpServletRequest request) { + // The ECOMP SDK controller process_csp always redirects + // to welcome.htm, so map it to something useful. + return new ModelAndView("dbc_home_tdkey"); + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/model/Result.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/model/Result.java new file mode 100644 index 0000000..9dfd546 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/model/Result.java @@ -0,0 +1,37 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.model; + +public class Result { + private String result; + + public Result(String result) { + this.result = result; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/service/AdminAuthExtension.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/service/AdminAuthExtension.java new file mode 100644 index 0000000..d6e5193 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/service/AdminAuthExtension.java @@ -0,0 +1,34 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.service; + +import org.openecomp.portalsdk.core.domain.User; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service("adminAuthExtension") +@Transactional +public class AdminAuthExtension { + + public void saveUserExtension(User user){ + //app's developer implement their own logic here, like updating app's related tables + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/InitUebHandler.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/InitUebHandler.java new file mode 100644 index 0000000..1b50693 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/InitUebHandler.java @@ -0,0 +1,73 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.uebhandler; + +import java.util.concurrent.ConcurrentLinkedQueue; + +import javax.annotation.PostConstruct; + +import org.openecomp.portalsdk.core.logging.format.AlarmSeverityEnum; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.onboarding.crossapi.PortalApiConstants; +import org.openecomp.portalsdk.core.onboarding.crossapi.PortalApiProperties; +import org.openecomp.portalsdk.core.onboarding.ueb.UebManager; +import org.openecomp.portalsdk.core.onboarding.ueb.UebMsg; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; + +// +// Adding this class for the sole purpose of insuring that the MainUebHandler really +// honors @Async and kicks off a thread. For more info google @Async and read about +// @Async only working if called from different class. +// +@Configuration +public class InitUebHandler { + + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(InitUebHandler.class); + + + @Autowired + MainUebHandler mainUebHandler; + + public InitUebHandler() { + + } + + @PostConstruct + public void initUeb() { + + try { + String enableListenerThread = PortalApiProperties.getProperty(PortalApiConstants.UEB_LISTENERS_ENABLE); + if (enableListenerThread.equalsIgnoreCase("true")) { + ConcurrentLinkedQueue inboxQueue = new ConcurrentLinkedQueue(); + UebManager.getInstance().initListener(inboxQueue); + mainUebHandler.runHandler(inboxQueue); + logger.info(EELFLoggerDelegate.debugLogger, ("Returned from initiating mainUebHandler...")); + } + else { + logger.info(EELFLoggerDelegate.debugLogger, ("Not starting UEB listening thread because ueb_listeners_enable is not set to true in the properties file.")); + } + } + catch (Exception e) { + logger.error(EELFLoggerDelegate.debugLogger, ("Not starting UEB listening thread because property could not be read " + PortalApiConstants.UEB_LISTENERS_ENABLE),AlarmSeverityEnum.MAJOR); + } + + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/MainUebHandler.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/MainUebHandler.java new file mode 100644 index 0000000..604880b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/MainUebHandler.java @@ -0,0 +1,104 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.uebhandler; + +import java.util.concurrent.ConcurrentLinkedQueue; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.onboarding.ueb.UebMsg; +import org.openecomp.portalsdk.core.onboarding.ueb.UebMsgTypes; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +//------------------------------------------------------------------------- +// Listens for received UEB messages and handles the messages +// +// Note: To implement a synchronous reply call getMsgId on the request +// and putMsgId on the reply (echoing the request MsgId). +// +//------------------------------------------------------------------------- +@Component("MainUebHandler") +public class MainUebHandler { + + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MainUebHandler.class); + + + ConcurrentLinkedQueue inboxQueue = null; + + @Autowired + WidgetNotificationHandler widgetNotificationHandler; + + @Async + public void runHandler(ConcurrentLinkedQueue queue) { + inboxQueue = queue; + + logger.info(EELFLoggerDelegate.debugLogger, ("==> MainUebHandler started")); + + while (true) { + UebMsg msg = null; + while ((msg = inboxQueue.poll()) != null) { + if (msg.getMsgType() != null) { + logger.debug(EELFLoggerDelegate.debugLogger, ("<== Received UEB message : " + msg.toString())); + + switch (msg.getMsgType()) { + /* + * Add your own defined handler objects, use @Component for + * the class. See WidgetNotificationHandler as an example. + * + * Use @Async on methods for performance + * + * For syncronous replies use UebManager publishReply and + * echo back the msgId in your response ie + * msg.putMsgId(requestMsg.getMsgId()) + * + * case UebMsgTypes.UEB_MSG_TYPE_XYZ: { + * XYZHandler.handleMsg(msg); break; } + */ + case UebMsgTypes.UEB_MSG_TYPE_WIDGET_NOTIFICATION: { + widgetNotificationHandler.handleWidgetNotification(msg); + break; + } + default: { + + logger.info(EELFLoggerDelegate.debugLogger, ("Unknown message type [" + msg.getMsgType() + "] from " + msg.getSourceTopicName())); + + break; + } + } + } + } + + if (Thread.interrupted()) { + + logger.info(EELFLoggerDelegate.debugLogger, ("==> UebMainHandler exiting")); + + break; + } + + try { + Thread.sleep(10); + } catch (InterruptedException e) { + logger.info(EELFLoggerDelegate.debugLogger, ("UebMainHandler interrupted during sleep" + e.getMessage())); + + } + } + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/WidgetNotificationHandler.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/WidgetNotificationHandler.java new file mode 100644 index 0000000..9b0ff58 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/WidgetNotificationHandler.java @@ -0,0 +1,46 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.uebhandler; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.onboarding.ueb.UebMsg; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +@Component +public class WidgetNotificationHandler { + + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(WidgetNotificationHandler.class); + + + public WidgetNotificationHandler() { + } + + @Async + public void handleWidgetNotification(UebMsg requestMsg) { + logger.debug(EELFLoggerDelegate.debugLogger, ("handleWidgetNotification received notification: " + requestMsg.toString())); + /* + * Here the notification msg can be handled + * + * requestMsg.getPayload() - returns string that contains the + * Application defined content + */ + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/CustomLoggingFilter.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/CustomLoggingFilter.java new file mode 100644 index 0000000..760460f --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/CustomLoggingFilter.java @@ -0,0 +1,54 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.util; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.filter.Filter; +import ch.qos.logback.core.spi.FilterReply; + +/** + * Custom Filter class bind with logback.xml + * configuration file to strip out certain log messages + * coming out of special packages or classes. + * + */ +public class CustomLoggingFilter extends Filter { + + /** + * Custom Filter is added to strip out the continuous U-EB logging messages + * But make sure we log the ERROR & WARNING Level messages. + */ + @Override + public FilterReply decide(ILoggingEvent event) { + try { + if ((event.getLevel() != Level.ERROR || event.getLevel() != Level.WARN) && + (event.getThreadName().equalsIgnoreCase("UEBConsumerThread")) && + (event.getLoggerName().contains("com.att.nsa") || event.getLoggerName().contains("org.apache.http")) + ) { + return FilterReply.DENY; + } else { + return FilterReply.NEUTRAL; + } + } catch(Exception e) { + return FilterReply.NEUTRAL; + } + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/LoggerDemo.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/LoggerDemo.java new file mode 100644 index 0000000..9bdff16 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/LoggerDemo.java @@ -0,0 +1,48 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ch.qos.logback.classic.LoggerContext; + +public class LoggerDemo { + + private static final Logger log = LoggerFactory.getLogger(LoggerDemo.class); + + public static void main(String[] args) { + new LoggerDemo().new Parent().hello(); + new LoggerDemo().new Child().hello(); + // Flush messages before shutting down async logger + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + loggerContext.stop(); + } + + public class Parent { + public void hello() { + log.info("Hello from " + getClass().getSimpleName()); + } + } + + public class Child extends Parent { + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/ValidateEncodingApp.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/ValidateEncodingApp.java new file mode 100644 index 0000000..cd327b2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/ValidateEncodingApp.java @@ -0,0 +1,203 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.openecomp.fusionapp.util; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CodingErrorAction; + +/** + * Reads bytes from file using a decoder that throws an exception if the bytes + * cannot be decoded as UTF-8. Can be used to validate a single file or a + * directory of files with full recursion. Includes a feature to create a file + * with a non-UTF-8 byte sequence for testing. + */ +public class ValidateEncodingApp { + + private final String charsetName; + private final CharsetDecoder decoder; + private int filesPassed = 0, filesFailed = 0; + + /** + * Obtains a decoder and configures it to blow up on problems. + * + * @param charsetName + * Name of character set to use; e.g., UTF-8 + */ + public ValidateEncodingApp(String charsetName) { + this.charsetName = charsetName; + Charset charset = Charset.forName(charsetName); + decoder = charset.newDecoder(); + decoder.onMalformedInput(CodingErrorAction.REPORT); + decoder.onUnmappableCharacter(CodingErrorAction.REPORT); + } + + /** + * @return The character set name supplied to the constructor + */ + public String getCharsetName() { + return charsetName; + } + + /** + * @return The number of files that could not be validated for whatever + * reason. + */ + public int getFilesFailed() { + return filesFailed; + } + + /** + * @return The number of files successfully validated. + */ + public int getFilesPassed() { + return filesPassed; + } + + /** + * Reads and decodes bytes from the specified file, which will find byte + * sequences that cannot be decoded using the current system. Traps all + * exceptions and reports to System.err. + * + * @param file + * @return True on success, false on IOException or decoding error + */ + private boolean validateFile(File file) { + boolean result = true; + int lineNr = 1; + BufferedReader br = null; + try { + br = new BufferedReader(new InputStreamReader(new FileInputStream(file), decoder)); + while (br.readLine() != null) + ++lineNr; + ++filesPassed; + } catch (CharacterCodingException ex) { + ++filesFailed; + System.err.println("Failed at line " + lineNr + ", file " + file.getPath() + ": " + ex.toString()); + result = false; + } catch (IOException ex) { + ++filesFailed; + System.err.println("Failed to read file " + file.getPath() + ": " + ex.toString()); + result = false; + } finally { + if (br != null) + try { + br.close(); + } catch (IOException ex) { + System.err.println("Failed to close file: " + ex.toString()); + } + } + return result; + } + + /** + * Validates all files in the specified directory. Optionally recurses into + * subdirectories. Prints message to stdout when it starts and again when it + * finishes traversing a directory. + * + * @param dir + * Directory to traverse. + * @param isRecurse + * If true, will call itself to process subdirectories. + * @throws Exception + */ + private void validateDirectory(File dir, boolean isRecurse) throws Exception { + if (!dir.exists() || !dir.isDirectory()) + throw new IllegalArgumentException("Not found or not a directory: " + dir.getPath()); + System.out.println("Entering directory " + dir.getPath()); + File[] contents = dir.listFiles(); + for (File f : contents) { + if (f.isFile()) + validateFile(f); + else if (f.isDirectory() && isRecurse) + validateDirectory(f, isRecurse); + } + System.out.println("Leaving directory " + dir.getPath()); + } + + /** + * Prints message(s) and exits + * + * @param msg + */ + private static void usage(String msg) { + if (msg != null) + System.err.println(msg); + System.err.println("Usage: ValidateEncodingApp -validate (file|dir)"); + System.err.println(" ValidateEncodingApp -create filename"); + System.exit(0); + } + + public static void main(String[] args) throws Exception { + + // TODO: extend to accept encoding system name + // and recurse option as arguments. + String charsetName = "UTF-8"; + boolean recurse = true; + + if (args.length != 2) + usage("Unexpected number of arguments"); + + String cmd = args[0]; + File file = new File(args[1]); + + if ("-create".equals(cmd)) { + if (file.exists()) + usage("Will not overwrite existing file: " + file.getPath()); + System.out.println("Creating file with ISO-8859-1 content: " + file.getPath()); + try { + // The word "dolt" has an o with a diagonal slash thru it. + // The slash-o is valid in ISO-8859-1 but not in UTF-8. + final byte[] invalid = "d\u00f8lt\n".getBytes("iso-8859-1"); + FileOutputStream fis = new FileOutputStream(file); + fis.write(invalid); + fis.close(); + } catch (IOException ex) { + System.err.println("Failed to write file: " + ex.toString()); + } + } else if ("-validate".equals(cmd)) { + if (!file.exists()) + usage("Not found: " + file.getPath()); + + ValidateEncodingApp validator = new ValidateEncodingApp(charsetName); + if (file.isFile()) { + System.out.println("Validating decoding of bytes as " + charsetName + " for file " + file.getPath()); + validator.validateFile(file); + } else { + System.out.println("Validating decoding of bytes as " + charsetName + " for files in/below directory " + + file.getPath()); + validator.validateDirectory(file, recurse); + } + System.out.println("Validation success count is " + validator.getFilesPassed()); + System.out.println("Validation failure count is " + validator.getFilesFailed()); + } else { + usage("Unexpected command: " + cmd); + } + + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/resources/att-rules.drl b/dcae_dmaapbc_webapp/src/main/resources/att-rules.drl new file mode 100644 index 0000000..e15c3fb --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/resources/att-rules.drl @@ -0,0 +1,16 @@ +package org.openecomp.portalsdk.core.drools; + + +rule "Drools NJ" +when +$droolsRuleService : DroolsRuleServiceImpl( state == "NJ" ) +then +$droolsRuleService.setResultsString("NJ state :" + " Garden State"); +end + +rule "Drools NY" +when +$droolsRuleService : DroolsRuleServiceImpl( state == "NY" ) +then +$droolsRuleService.setResultsString("NY state :" + " Empire State"); +end diff --git a/dcae_dmaapbc_webapp/src/main/resources/cache.ccf b/dcae_dmaapbc_webapp/src/main/resources/cache.ccf new file mode 100644 index 0000000..d21404b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/resources/cache.ccf @@ -0,0 +1,30 @@ +# DEFAULT CACHE REGION +jcs.default=DC +jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes +jcs.default.cacheattributes.MaxObjects=1000 +jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache +jcs.default.elementattributes=org.apache.jcs.engine.ElementAttributes +jcs.default.elementattributes.IsEternal=true +jcs.default.elementattributes.IsSpool=true + + +# MEMORY SHRINKING CONFIGURATION (Commented) +#jcs.default.cacheattributes.UseMemoryShrinker=true +#jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds=3600 +#jcs.default.cacheattributes.ShrinkerIntervalSeconds=60 +#jcs.default.cacheattributes.MaxSpoolPerRun=500 +#jcs.default.elementattributes=org.apache.jcs.engine.ElementAttributes +#jcs.default.elementattributes.IsEternal=false + + +# AUXILLARY CACHE CONFIGURATION +jcs.auxiliary.DC=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory +jcs.auxiliary.DC.attributes=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes +jcs.auxiliary.DC.attributes.DiskPath=/tmp + + +# PRE-DEFINED REGION FOR LOOKUP DATA +jcs.region.lookUpObjectCache=DC +jcs.region.lookUpObjectCache.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes +jcs.region.lookUpObjectCache.cacheattributes.MaxObjects=4000 +jcs.region.lookUpObjectCache.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache diff --git a/dcae_dmaapbc_webapp/src/main/resources/logback.xml b/dcae_dmaapbc_webapp/src/main/resources/logback.xml new file mode 100644 index 0000000..65746ed --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/resources/logback.xml @@ -0,0 +1,350 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${defaultLoggerPattern} + + + + + + + + + + + + ${logDirectory}/${generalLogName}.log + + + ${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.log.zip + + + 30 + 3GB + + + + ${applicationLoggerPattern} + + + + + + 256 + + true + + + + + + + + + + + + + + + + + + + ${logDirectory}/${auditLogName}.log + + + ${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.log.zip + + + 30 + 3GB + + + + ${auditLoggerPattern} + + + + 256 + + + + + ${logDirectory}/${metricsLogName}.log + + + ${logDirectory}/${metricsLogName}.%d{yyyy-MM-dd}.log.zip + + + 30 + 3GB + + + + ${metricsLoggerPattern} + + + + + + 256 + + + + + ${logDirectory}/${errorLogName}.log + + + ${logDirectory}/${errorLogName}.%d{yyyy-MM-dd}.log.zip + + + 30 + 3GB + + + + ${errorLoggerPattern} + + + + + 256 + + + + + ${debugLogDirectory}/${debugLogName}.log + + + ${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.log.zip + + + 30 + 3GB + + + + ${defaultLoggerPattern} + + + + + 256 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/resources/mchange-log.properties b/dcae_dmaapbc_webapp/src/main/resources/mchange-log.properties new file mode 100644 index 0000000..ce1fa5f --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/resources/mchange-log.properties @@ -0,0 +1,4 @@ +# Direct the proprietary logger used by com.mchange.c3p0 to use slf4j + +com.mchange.v2.log.MLog=com.mchange.v2.log.FallbackMLog +com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL=OFF diff --git a/dcae_dmaapbc_webapp/src/main/resources/portal.properties b/dcae_dmaapbc_webapp/src/main/resources/portal.properties new file mode 100644 index 0000000..c5ae309 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/resources/portal.properties @@ -0,0 +1,50 @@ +# Properties read by ECOMP Framework library, ecompFW.jar + +########################################################################## +# The following properties should NOT be changed by partner applications. +########################################################################## + +portal.api.prefix = /api +max.idle.time = 5 +user.attribute.name = user_attribute + +testing=testing + +#Use REST API instead of UEB to fetch the functional menu data +use_rest_for_functional_menu=true + +########################################################################## +# The following properties MUST be changed by partner applications. +########################################################################## + +# Name of java class that implements the OnBoardingApiService interface. +portal.api.impl.class = org.openecomp.portalsdk.core.onboarding.client.OnBoardingApiServiceImpl + +# CSP Global Log On for single sign on +ecomp_redirect_url = http://todo_enter_portal_hostname:8080/ecompportal/login.htm + +# URL of the ECOMP Portal REST API + +ecomp_rest_url = TODO_Portal_URL + +# Applications do not need to run a UEB listener in 1610. +ueb_listeners_enable = false + +# UEB Configuration +# In release 1607, all 6 entries below were required. +# In release 1610, if key ueb_listeners_enable is set to false, +# then only the ueb_app_key is required. +# UEB servers +ueb_url_list = todo_ueb_url_list +# ECOMP Portal listens on this UEB topic +ecomp_portal_inbox_name = ECOMP-PORTAL-INBOX-TEST-DEMETER +# Replace these 3 default values with the ones for your specific App, +# as shown on the on-boarding page on the ECOMP Portal web application. +ueb_app_key = ZOicEniw7BWDL1pM +ueb_app_secret = PJIsBErHfo2RGKzuu03CZKgV +ueb_app_mailbox_name = ECOMP-PORTAL-OUTBOX-TEST-32756 +# Consumer group name for UEB topic. +# Use the special tag '{UUID}' to generate a unique one for each sdk-app server. +ueb_app_consumer_group_name = {UUID} + +decryption_key = AGLDdG4D04BKm2IxIWEr8o== \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/resources/state-rules.drl b/dcae_dmaapbc_webapp/src/main/resources/state-rules.drl new file mode 100644 index 0000000..586ae6b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/resources/state-rules.drl @@ -0,0 +1,38 @@ +package org.openecomp.portalsdk.core.drools; +global String age + +rule "Default" +when +$droolsRuleService : DroolsRuleServiceImpl( state != null ) +then +System.out.println($droolsRuleService.accessLabel() +" "+ $droolsRuleService.getState() +" state legal age is " + getDefaultIfNull(age)); +$droolsRuleService.setResultsString($droolsRuleService.getState()+" state legal age is " + getDefaultIfNull(age)); +end + +rule "Drools NJ" +when +$droolsRuleService : DroolsRuleServiceImpl( state == "NJ" ) +then +System.out.println($droolsRuleService.accessLabel() +" "+ "NJ state legal age is " + getDefaultIfNull(age)); +$droolsRuleService.setResultsString("NJ state legal age is " + getDefaultIfNull(age)); +end + +rule "Drools KY" +when +$droolsRuleService : DroolsRuleServiceImpl( state == "KY" ) +then +System.out.println($droolsRuleService.accessLabel() +" "+ "KY state legal age is " + getDefaultIfNull("20")); +$droolsRuleService.setResultsString("KY state legal age is " + getDefaultIfNull("20")); +end + +rule "Drools NY" +when +$droolsRuleService : DroolsRuleServiceImpl( state == "NY" ) +then +System.out.println($droolsRuleService.accessLabel() +" "+ "NY state legal age is " + getDefaultIfNull("21")); +$droolsRuleService.setResultsString("NY state legal age is " + getDefaultIfNull("21")); +end + +function String getDefaultIfNull(String age) { +return age == null ? "18" : age; +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/quartz.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/quartz.properties new file mode 100644 index 0000000..23340dd --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/quartz.properties @@ -0,0 +1,30 @@ +################################################################################# +# Quartz configurations for Quantum Work Flow # +################################################################################# + +org.quartz.scheduler.instanceId = AUTO + +################################################################################# +# Main configurations +org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool +org.quartz.threadPool.threadCount = 30 + +============================================================================ +# Configure JobStore +#============================================================================ + +org.quartz.jobStore.misfireThreshold = 60000 + +org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX +org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate +org.quartz.jobStore.useProperties = false +#org.quartz.jobStore.dataSource = myDS +org.quartz.jobStore.tablePrefix = FN_QZ_ + +org.quartz.jobStore.isClustered = true +org.quartz.jobStore.clusterCheckinInterval = 20000 + +#============================================================================ +# Configure Datasources +#============================================================================ + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor.properties new file mode 100644 index 0000000..d4b8cd0 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor.properties @@ -0,0 +1,168 @@ +##C## Mention the name of the framework. At present RAPTOR supports FUSION +system=fusion +##C## Determines the priority for the debug message. +debug_level=5 +##C## Determines the number of records can be downloaded in excel when you select "download all" option. +download_limit=65000 +csv_download_limit=10 +##C## Determines the number of records to be displayed in a single page. +default_page_size=50 +##C## Determines the list size in the form field. +form_fields_list_size=99000 +##C## Determines the scheduler interval +#scheduler_interval=0 => disabled +scheduler_interval=0 +##C## System Name +system_name=RAPTOR +##C## This is used for Bread crumbs. +base_title=ANALYSIS +##C## whether to allow SQL-based report definition (security risk); super users are always allowed to create SQL-based reports +allow_sql_based_reports=yes +##C## Determines whether to include disclaimer page at the bottom of each screen +show_disclaimer=yes +disclaimer_positioned_top_in_csvexcel=yes +##C## Determines whether to display the form page as a separate page before running the report +display_form_before_run=yes +##C## Determines whether to include the form page on the report data page +include_form_with_data=yes +##C## Determines whether to cache chart data in the session => faster re-display if the data volume does not get too large +cache_chart_data=yes +##C## Determines whether to cache report data for the currently displayed page in the session => faster re-display + ##C## if the data volume does not get too large +cache_cur_page_data=yes +##C## Determines Chart width +default_chart_width=700 +##C## Determines Chart height +default_chart_height=420 +##C## Determines whether to permit report deletion only by report owner or by everyone with "write" access +delete_only_by_owner=no +##C## Determines whether to log each report execution and update time and user ID +enable_report_log=yes +##C## Determines whether to cache user roles info in memory (saves many DB reads, but does not account for roles + ##C## assigned after the cache was loaded) +cache_user_roles=yes +##C## Determines whether to convert month formats (e.g. MM/YYYY) to the last day of the month (true) or + ##C## first day (false) - like 12/2003 is converted to either 12/31/2003 or 12/01/2003 +month_format_use_last_day=no +##C## Determines whether to print the report title in the download files +print_title_in_download=yes +##C## Determines whether to show report description when the report is run and in the quick links +show_descr_at_runtime=no +##C## Determines whether to skip labels on the Line chart axis when they overlap +#DEPRECATED skip_chart_labels_to_fit=no +##C## Determines whether to show chart types that are purpose and/or data specific +show_nonstandard_charts=yes +##C## Determines whether to allow the user to change the chart type at runtime +allow_runtime_chart_sel=yes +##C## Determines whether to display the report title as chart title as well +display_chart_title=yes +##C## Determines whether to merge/blank multi-level row headings in cross-tab report +merge_crosstab_row_headings=yes +##C## Determines whether to display chart when displaying the report at first or just a "Show Chart" button +display_chart_by_default=yes +##C## Determines whether to print the form field values in the download files +print_params_in_download=yes +##C## Determines the limitation to the characters in chart label. +skip_chart_labels_limit=30 +##C## Determines whether to users with read-only rights for a report can copy it +can_copy_on_read_only=yes +##C## Determines the no of decimals to be displayed in Totals column +#max_decimals_on_totals=-1 => don't truncate, display all decimal digits +max_decimals_on_totals=2 +##C## Determines which JFreeChart to use. +jfree_version=latest +#jfree_version=0.9.11 +# Added this restriction so that heavily used system which contain +# more than 1000 users can enable this feature not to display whole +# users in the drop down menu +display_all_users=yes +##Sheet name +sheet_name=raptor +#shell_script_name=/home/sundar/test.sh +#download_query_folder=/titan/PROJECT3/RAPTOR/raptor/dwnld/query/ +## this directory is mentioned if the flat file is downloaded using shell script +shell_script_dir=/titan/PROJECT3/RAPTOR/raptor/dwnld/ +flat_file_lower_limit=1 +flat_file_upper_limit=200000 +## whatever request mentioned here would be parsed in sql and request parameter would be filled +request_get_params=isEmbedded +print_footer_in_download=yes +## footer mentioned here appears in downloaded excel +footer_first_line=TODO footer first line +footer_second_line=Use Pursuant to Company Instructions +## to run report in popup window +report_in_popup_window=yes +## to run each report in new popup window if the above is selected +popup_in_new_window=yes +## "Yes" allows the request param to be passed to the drill down report +pass_request_param_in_drilldown=yes +## Show PDF download icon +show_pdf_download=yes +# Show Folder Tree +show_folder_tree=no +#Show folder tree only for Admin Users +show_folder_tree_only_to_admin_users=no +#folder tree should be minimized +folder_tree_minimized=yes +## whatever session mentioned here would be parsed in sql and session parameter would be filled +session_params=login_id +display_formfield_info=yes +customize_formfield_info=yes +#schedule limit for end users +schedule_limit=10 +# customized query if you need any restrictions for schedule and security tab for fusion +#schedule_custom_query_for_users=getAllUsersByCustomer +#schedule_custom_query_for_roles=getAllRolesByCustomer +# customized query if you need any restrictions for schedule and security tab for prisms example +#schedule_custom_query_for_users=SELECT au.user_id, au.first_name||' '||au.last_name user_name FROM app_user au order by 2 +schedule_custom_query_for_users=SELECT au.user_id id, au.first_name||' '||au.last_name name FROM app_user au where user_id = 1 order by 2 +#schedule_custom_query_for_roles=SELECT ar.role_id, ar.descr role_name FROM app_role ar order by 2 +schedule_date_pattern=MM/dd/yyyy hh:mm:ss a +## This is used to display in right format in chart timestamp axis as we give in the sql +#chart_yearly_format=yyyy +#chart_monthly_format=MMM-yyyy +#chart_daily_format=MM-dd-yyyy +chart_hourly_format=MM/dd HH +#chart_minute_format=HH:mm +chart_minute_format=MM-dd-yyyy-HH:mm +#chart_second_format=HH:mm:ss +chart_second_format=MM-dd-yyyy +#chart_millisecond_format=HH:mm:ss.S +schedule_help_text=This form is used to schedule a specific Reporting Platform report to be delivered to one or more email addresses associated with your Company's Business Direct user logins. Note that report output delivered via email does not include the capability to drill down/back up to additional data levels. So, select the appropriate data level report for the scheduled report. View the status of scheduled report requests in the My Schedules menu item. +use_loginid_in_schedYN=Y +session_params_for_scheduling=login_id +session_date_formfield_auto_incr=yes +display_session_param_pdfexcel=login_id;Login Id +session_params_for_displaying_in_scheduling=login_id;Login Id +application_server=tomcat +#gmap properties +gmap_key=ABQIAAAAToJSSetKBMjBJx8MiRw4ghQiU0SbbKnm8C5eu25cpyLwgkLzyRShrQTbgZtqnKAqZU9JwcSq1bKwiA +PROJECT-FOLDER=/Users/sundar/git/st_quantum/quantum/target/quantum-1.0 +# +MARKET-SHAPEFILE-FOLDER=resources/files +# output folder for files generated on server side +OUTPUT-FOLDER=resources/temp +# tile size in pixel +TILE-SIZE=256 +#check if map is disabled or not +map_allowed=Y +max_drilldown_level=2 +admin_role_equiv_to_super_role=N +show_loading_during_formfield_chain=Y +show_print_icon=N +globally_nowrap=N +calendar_output_date_format=MM/dd/yyyy +memory_threshold_percentage=99 +print_params_in_csv_download=yes +notitle_in_dashboard=yes +generate_store_sched_reports=yes +show_excel_2007_download=yes +print_excel_in_landscape=yes +show_animated_chart_option=yes +show_animated_chart_only=no +adjust_content_based_on_height=yes +custom_submit_button_text=Run Button +customize_formfield_layout=yes +#db_type=postgresql +#db_type=oracle +db_type=mysql \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_app_fusion.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_app_fusion.properties new file mode 100644 index 0000000..908abed --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_app_fusion.properties @@ -0,0 +1,20 @@ +temp_folder_path=/demeter/WebApps/dev/ECOMP_PORTAL/temp/ +upload_folder_path=/demeter/WebApps/dev/ECOMP_PORTAL/files/ +excel_template_path=/demeter/WebApps/dev/ECOMP_PORTAL/files/raptor_template/ +temp_folder_url=temp/ +upload_folder_url=upload/ +smtp_server=todo.smtp.com +default_email_sender=email-name@email.com +error_page=error_page.jsp +jsp_context_path=raptor/ +img_folder_url=static/fusion/raptor/images/ +base_folder_url=static/fusion/raptor/ +direct_access_url=http://localhost:8080/quantum/raptor_email_attachment.htm?action=raptor&source_page=report_run&display_content=y +#base_action_url=report.htm#/report_run/ +drill_action_url=report.htm#/report_run/c_master= +base_action_url=report_wizard.htm?action= +base_action_url_ng=report#/ +base_action_param=c_master= +super_role_id=1 +admin_role_ids=1 +quick_links_menu_ids=HOME,CUSTOMER,REPORTS diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_db_fusion.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_db_fusion.properties new file mode 100644 index 0000000..e69de29 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_pdf.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_pdf.properties new file mode 100644 index 0000000..c043e47 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_pdf.properties @@ -0,0 +1,30 @@ +## pdf file specific properties +pdf_data_font_size=9 +pdf_data_font_family=Arial +#reduce the font size from html config +pdf_data_font_size_offset=2 +pdf_data_alternate_color=true +#data row background(white), alternate(light light blue/gray) +pdf_data_background_alternate_hex_code=#EDEDED +pdf_data_default_background_hex_code=#FFFFFF +#header font (white) background (gray) +pdf_data_table_header_font_hex_code=#FFFFFF +pdf_data_table_header_background_hex_code=#8A9BB3 +#footer header +pdf_footer_font_size=9 +pdf_footer_font_family=Arial +pdf_att_proprietary=Proprietary\nUse Pursuant to Company Instructions +pdf_att_proprierary_font_size=7 +pdf_date_timezone=GMT +pdf_date_pattern=MM/dd/yyyy hh:mm:ss a +##page number position at 1 - footer middle, 0 -- header right, 2 - both +pdf_page_number_position=1 +pdf_word_before_page_number=Page +pdf_word_after_page_number= +pdf_coverpage_firstcolumn_size=0.3 +pdf_image_auto_rotate=false +display_create_owner_info=true +#session_info=customer,customerId +display_loginid_for_downloaded_by=false +# please use false if you want landscape to be default. +is_default_orientation_portrait=true diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/sql.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/sql.properties new file mode 100644 index 0000000..24cd550 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/sql.properties @@ -0,0 +1,303 @@ +#SQL Statements for PostgreSQL + +#ReportLoader.java + +load.custom.report.xml = SELECT cr.report_xml FROM cr_report cr WHERE rep_id=? + +# need to copy to oracle +load.remoteDB.schema = SELECT 'local' SCHEMA_ID, 'local' SCHEMA_DESC, null DATASOURCE_TYPE FROM dual union SELECT a.SCHEMA_ID, a.SCHEMA_DESC, DATASOURCE_TYPE FROM SCHEMA_INFO a where schema_id <> 'local' order by schema_id +load.remoteDB.schema.where = SELECT a.SCHEMA_ID, a.SCHEMA_DESC, DATASOURCE_TYPE FROM SCHEMA_INFO a where schema_id = '[schema_id]' +#formfield rendering + +formfield.id.name.sql.prefix=SELECT id, name FROM ( +formfield.id.name.sql=SELECT id, name + +formfield.id.name.sql.suffix= + +report.security.create= SELECT coalesce(cr.owner_id, cr.create_id) AS owner_id, cr.create_id, DATE_FORMAT(cr.create_date, '%m/%d/%Y') create_date, maint_id, DATE_FORMAT(cr.maint_date, '%m/%d/%Y') update_date, cr.public_yn FROM cr_report cr WHERE cr.rep_id = [rw.getReportID()] + +db.update.report.xml = SELECT cr.rep_id, cr.report_xml FROM cr_report cr WHERE rep_id=? FOR UPDATE + +update.custom.report.rec = UPDATE cr_report SET title='[Utils.oracleSafe(rw.getReportName())]', descr='[Utils.oracleSafe(rw.getReportDescr())]', public_yn='[(rw.isPublic()]', menu_id='[rw.getMenuID()]', menu_approved_yn='[(rw.isMenuApproved()]', owner_id=[rw.getOwnerID()], maint_id=[rw.getUpdateID()], maint_date=STR_TO_DATE('[rw.getUpdateDate()]', '[Globals.getOracleTimeFormat()]'), dashboard_type_yn='[(rw.isDashboardType()]', dashboard_yn= '[(rw.getReportType().equals(AppConstants.RT_DASHBOARD)]' WHERE rep_id = [rw.getReportID()] + +is.report.already.scheduled = select rep_id from cr_report_schedule where rep_id = ? + +create.custom.report.rec = INSERT INTO cr_report(rep_id, title, descr, public_yn, menu_id, menu_approved_yn, report_xml, owner_id, create_id, create_date, maint_id, maint_date, dashboard_type_yn, dashboard_yn, folder_id) VALUES([rw.getReportID()], '[Utils.oracleSafe(rw.getReportName())]', '[Utils.oracleSafe(rw.getReportDescr())]', '[rw.isPublic()]', '[rw.getMenuID()]', '[rw.isMenuApproved()]', '', [rw.getOwnerID()], [rw.getCreateID()], STR_TO_DATE('[rw.getCreateDate()]', '[Globals.getOracleTimeFormat()]'), [rw.getUpdateID()], STR_TO_DATE('[rw.getUpdateDate()]', '[Globals.getOracleTimeFormat()]'), '[rw.isDashboardType()]', '[rw.getReportType().equals(AppConstants.RT_DASHBOARD)]',[rw.getFolderId()]) + +get.user.report.names = SELECT cr.rep_id, cr.title FROM cr_report cr WHERE coalesce(cr.owner_id, cr.create_id) = [userID] + +get.report.owner.id = SELECT coalesce(cr.owner_id, cr.create_id) AS owner FROM cr_report cr WHERE rep_id = ? + +delete.report.record.log = DELETE FROM cr_report_log WHERE rep_id = [reportID] + +delete.report.record.users = DELETE FROM cr_report_schedule_users WHERE rep_id = [reportID] + +delete.report.record.schedule = DELETE FROM cr_report_schedule WHERE rep_id = [reportID] + +delete.report.record.access = DELETE FROM cr_report_access WHERE rep_id = [reportID] + +delete.report.record.email = DELETE FROM cr_report_email_sent_log WHERE rep_id = [reportID] + +delete.report.record.favorite = DELETE FROM cr_favorite_reports WHERE rep_id = [reportID] + +delete.report.record.report = DELETE FROM cr_report WHERE rep_id = [reportID] + +load.quick.links = select finalcr.rep_id, finalcr.title, finalcr.descr from (SELECT cr.rep_id, cr.title, cr.descr FROM (SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra LEFT JOIN cr_report cr ON cr.rep_id = ra.rep_id WHERE cr.menu_id LIKE '%[nvls(menuId)]%' AND cr.menu_approved_yn = 'Y' AND (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL) UNION SELECT cr.rep_id, cr.title, cr.descr FROM cr_report cr WHERE cr.menu_id LIKE '%[nvls(menuId)]%' AND (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' or EXISTS (select * from fn_user_role where user_id=[userID] and role_id in (1)))) finalcr ORDER BY finalcr.title + +load.folder.reports = SELECT cr.rep_id, cr.rep_id report_id, concat([rep_title_sql] , (CASE WHEN cr.public_yn = 'Y' THEN '' ELSE '[PRIVATE_ICON]' END),cr.title,'') title, cr.descr, concat(au.first_name,' ',au.last_name) owner_name, DATE_FORMAT(cr.create_date, '%m/%d/%Y') create_date, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'N' ELSE coalesce(ra.read_only_yn, 'Y') END read_only_yn, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'Y' ELSE 'N' END user_is_owner_yn FROM cr_report cr JOIN app_user au ON coalesce(cr.owner_id, cr.create_id) = au.user_id AND cr.folder_id= '[folderId]' LEFT JOIN (SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL(SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON cr.rep_id = ra.rep_id +#If roleList.toString() is '' PostgreSQL returns an error - needs to be null instead of empty + +load.folder.reports.user = AND coalesce(cr.owner_id, cr.create_id) = [userID] + +load.folder.reports.publicsql = AND (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL) + +load.quick.download.links = SELECT a.file_name, b.title,DATE_FORMAT(a.dwnld_start_time, '%W %d-%m-%Y %H:%i:%s') as time, a.dwnld_start_time FROM cr_report_dwnld_log a, cr_report b where a.user_id = [userID] and a.rep_id = b.rep_id and (a.dwnld_start_time) >= STR_TO_DATE(DATE_FORMAT(now() - INTERVAL 1 DAY, '%m/%d/%Y'), '%m/%d/%Y') and a.record_ready_time is not null order by a.dwnld_start_time + +load.reports.to.schedule = SELECT cr.rep_id, Initcap(cr.title), cr.descr FROM cr_report cr LEFT OUTER JOIN (SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON cr.rep_id = ra.rep_id AND (cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL or cr.owner_id = [userID] )ORDER BY Initcap(cr.title) + +load.reports.to.add.in.dashboard = SELECT cr.rep_id, cr.title, cr.descr FROM cr_report cr LEFT OUTER JOIN (SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON cr.rep_id = ra.rep_id AND (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL) AND (cr.dashboard_yn = 'N' or cr.dashboard_yn is null) ORDER BY cr.title + +load.my.recent.links = select rep_id, title, descr, form_fields from ( select rep_id, title, descr, form_fields from (select cr.rep_id, cr.title, a.form_fields, cr.descr, a.log_time, a.user_id, a.action, a.action_value from cr_report_log a, cr_report cr where user_id = [userID] AND action = 'Report Execution Time' and a.rep_id = cr.rep_id order by log_time desc) AS x) AS y where LIMIT 1, 6 + +create.report.log.entry = INSERT INTO cr_report_log (rep_id, log_time, user_id, action, action_value, form_fields) VALUES([reportID], now(), [userID], '[action]' , '[executionTime]', '[form_fields]') + +create.report.log.entry.exec.time = INSERT INTO cr_report_log (rep_id, log_time, user_id, action, action_value, form_fields) VALUES([reportID], NOW() + INTERVAL 1 SECOND, [userID], '[action]' , '[executionTime]', '[formFields]') + +clear.report.log.entries = DELETE FROM cr_report_log WHERE rep_id = ? and user_id = ? + +load.report.log.entries = SELECT x.log_time, x.user_id, (CASE WHEN x.action = 'Report Execution Time' THEN concat('',x.action,'') ELSE x.action END) action, (CASE WHEN x.action = 'Report Execution Time' THEN action_value ELSE 'N/A' END) time_taken, (CASE WHEN x.action = 'Report Execution Time' THEN concat('\"Run') ELSE 'N/A' END) run_image, x.name FROM (SELECT rl.rep_id, DATE_FORMAT(rl.log_time, '%m/%d/%Y %h:%i:%s %p') log_time, rl.action_value, concat(fuser.last_name ,', ',fuser.first_name) name, rl.user_id, rl.action, rl.form_fields FROM cr_report_log rl, fn_user fuser WHERE rl.rep_id = [nvls(reportId)] and rl.action != 'Report Run' and fuser.user_id = rl.user_id ORDER BY rl.log_time DESC) x LIMIT 100 + +does.user.can.schedule.report = select crs.sched_user_id, count(*) from cr_report_schedule crs where sched_user_id = [userId] group by crs.sched_user_id having count(*) >= [Globals.getScheduleLimit()] + +does.user.can.schedule = select crs.schedule_id from cr_report_schedule crs where schedule_id = [scheduleId] + +get.system.date.time = select DATE_FORMAT(now(),'%m/%d/%Y %H:%i:%s') + +get.next.day.date.time = select DATE_FORMAT(NOW() + INTERVAL 1 DAY,'%m/%d/%Y %H:%i:%s') + +get.next.fifteen.minutes.date.time = select DATE_FORMAT(NOW() + INTERVAL 15 MINUTES,'%m/%d/%Y %H:%i:%s') + +get.next.thirty.minutes.date.time = select DATE_FORMAT(NOW() + INTERVAL 30 MINUTES,'%m/%d/%Y %H:%i:%s') + +get.template.file = select template_file from cr_report_template_map where report_id = [reportId] + +load.pdf.img.lookup = select image_id, image_loc from cr_raptor_pdf_img + +load.action.img.lookup = select image_id, image_loc from cr_raptor_action_img + + +#ActionHandler.java + +report.values.map.def.a = SELECT x FROM (SELECT DISTINCT + +report.values.map.def.b = TO_CHAR([colName], '[nvl(displayFormat, AppConstants.DEFAULT_DATE_FORMAT)]') + +report.values.map.def.c = [colName] + +report.values.map.def.d = x FROM [rdef.getTableById(tableId).getTableName()] WHERE [colName] IS NOT NULL ORDER BY 1) xx LIMIT <= [Globals.getDefaultPageSize()] + +test.sched.cond.popup = SELECT 1 WHERE EXISTS ([sql]) + +download.all.email.sent = Select user_id, rep_id from CR_REPORT_EMAIL_SENT_LOG where gen_key='[pdfAttachmentKey.trim()]' and log_id =[report_email_sent_log_id.trim()] and (now() - sent_date) < '1 day' limit 1 + +download.all.gen.key = select schedule_id from cr_report_email_sent_log u where U.GEN_KEY = '[pdfAttachmentKey]' + +download.all.retrieve = SELECT au.user_id FROM (SELECT rs.schedule_id, rs.rep_id FROM cr_report_schedule rs WHERE rs.enabled_yn='Y' AND rs.run_date IS NOT NULL AND rs.schedule_id = [scheduleId]) x, cr_report r, app_user au WHERE x.rep_id = r.rep_id AND au.user_id IN (SELECT rsu.user_id FROM cr_report_schedule_users rsu WHERE rsu.schedule_id = x.schedule_id and rsu.schedule_id = [scheduleId] UNION SELECT ur.user_id FROM fn_user_role ur WHERE ur.role_id IN (SELECT rsu2.role_id FROM cr_report_schedule_users rsu2 WHERE rsu2.schedule_id = x.schedule_id and rsu2.schedule_id = [scheduleId])) + +download.all.insert = insert into cr_report_dwnld_log (user_id,rep_id,file_name,dwnld_start_time,filter_params) values (?,?,?,?,?) + +#ReportWrapper.java + +report.wrapper.format = SELECT coalesce(cr.owner_id, cr.create_id) owner_id, cr.create_id, DATE_FORMAT(cr.create_date, '[Globals.getOracleTimeFormat()]') create_date, maint_id, DATE_FORMAT(cr.maint_date, '[Globals.getOracleTimeFormat()]') update_date, cr.menu_id, cr.menu_approved_yn FROM cr_report cr WHERE cr.rep_id= [reportID] + +generate.subset.sql = SELECT [colNames.toString()] FROM (SELECT [colNames.toString()] FROM ([reportSQL]) AS x ) AS y + +report.sql.only.first.part = SELECT [colNames.toString()] FROM (SELECT [colNames.toString()] FROM ( + +report.sql.only.second.part.a = [startRow] + +report.sql.only.second.part.b = [pageSize] +#MYSQL: LIMIT [startRow], [pageSize] +#ORacle: rownum >= [startRow] and rownum <= ([startRow]+[pageSize]) +#Postgre: limit [pageSize] offset [startRow] + +report.sql.only.second.part.b.noorderby = LIMIT [startRow] + +generate.sql.visual.select = SELECT + +generate.sql.visual.count = COUNT(*) cnt + +generate.sql.visual.dual = +#No DUAL table in PostgreSQL so this is blank + +#ReportRuntime.java + +load.crosstab.report.data = SELECT [colNames.toString()] FROM ( [reportSQL] + +#RaptorRunHandler.java + +generate.sql.handler = SELECT x.* from ([sql]) AS x LIMIT 2 + +generate.sql.select = SELECT [colNames.toString()] FROM (SELECT [colNames.toString()] FROM ([sql]) AS y) AS x + +#ReportSchedule.java + +load.schedule.data = SELECT rs.enabled_yn, DATE_FORMAT(rs.start_date, '%m/%d/%Y') start_date, DATE_FORMAT(rs.end_date, '%m/%d/%Y') end_date, DATE_FORMAT(rs.run_date, '%m/%d/%Y') run_date, coalesce(DATE_FORMAT(rs.run_date, '%h'), '12') run_hour, coalesce(DATE_FORMAT(rs.run_date, '%i'), '00') run_min, coalesce(DATE_FORMAT(rs.run_date, '%p'), 'AM') run_ampm, rs.recurrence, rs.conditional_yn, rs.notify_type, rs.max_row, rs.initial_formfields, rs.schedule_id, coalesce(DATE_FORMAT(rs.end_date, '%h'), '11') end_hour, coalesce(DATE_FORMAT(rs.end_date, '%i'), '45') end_min, coalesce(DATE_FORMAT(rs.end_date, '%p'), 'PM') end_ampm, encrypt_yn, attachment_yn FROM cr_report_schedule rs WHERE rs.rep_id = [reportID] + +load.schedule.getid = SELECT rsu.user_id, concat(fuser.last_name,', ',fuser.first_name), fuser.login_id FROM cr_report_schedule_users rsu, fn_user fuser WHERE rsu.rep_id = [reportID] AND rsu.schedule_id = [getScheduleID()] and rsu.user_id IS NOT NULL and rsu.user_id = fuser.user_id + +load.schedule.users = SELECT rsu.role_id FROM cr_report_schedule_users rsu WHERE rsu.rep_id = [reportID] AND rsu.schedule_id = [getScheduleID()] AND rsu.role_id IS NOT NULL + +new.schedule.data = select coalesce(max(schedule_id),0)+1 AS sequence from cr_report_schedule + +new.report.data = select coalesce(max(rep_id),0)+1 AS rep_id from cr_report + +execute.update = DELETE FROM cr_report_schedule_users WHERE rep_id = [reportID] and schedule_id = [getScheduleID()] + +execute.update.users = INSERT INTO cr_report_schedule_users (schedule_id, rep_id, user_id, role_id, order_no) VALUES([getScheduleID()], [reportID], [emailToUsers.get(i)).getId()], NULL, [(i + 1)]) + +execute.update.roles = INSERT INTO cr_report_schedule_users (schedule_id, rep_id, user_id, role_id, order_no) VALUES([getScheduleID()], [reportID], NULL, [emailToRoles.get(i)).getId()], [((emailToUsers.size() + i + 1)]) + +execute.update.activity = INSERT into cr_schedule_activity_log (schedule_id, notes, run_time) values ([getScheduleID()],'Submitted:Schedule',TO_DATE('[getRunDate()] [getRunHour()]:[getRunMin()] [getRunAMPM()]', 'MM/DD/YYYY HH:MI AM')) + +delete.schedule.data = SELECT 1 FROM cr_report_schedule WHERE rep_id = [reportID] and sched_user_id = [getScheduleUserID()] and schedule_id = [getScheduleID()] + +delete.schedule.data.users = DELETE FROM cr_report_schedule_users WHERE rep_id = [reportID] and schedule_id = [getScheduleID()] + +delete.schedule.data.id = DELETE FROM cr_report_schedule where rep_id = [reportID] and sched_user_id = [getScheduleUserID()] and schedule_id = [getScheduleID()] + +load.cond.sql = SELECT condition_large_sql FROM cr_report_schedule WHERE schedule_id=? + +load.cond.sql.select = SELECT condition_sql FROM cr_report_schedule WHERE schedule_id = [scheduleId] + +persist.cond.sql.update = update cr_report_schedule set condition_large_sql = '' where schedule_id = [scheduleId] +#EMPTY CLOB() changed to '' + +persist.cond.sql.large = SELECT condition_large_sql FROM cr_report_schedule cr WHERE schedule_id=? FOR UPDATE + +persist.cond.sql.set = update cr_report_schedule set condition_sql = ? where schedule_id = [scheduleId] + +#DataCache.java + +get.data.view.actions = SELECT ts.web_view_action FROM cr_table_source ts WHERE ts.web_view_action IS NOT NULL + +get.public.report.id.names = SELECT rep_id, title FROM cr_report WHERE public_yn = 'Y' ORDER BY title + +get.private.accessible.names.a = SELECT cr.rep_id, cr.title FROM cr_report cr WHERE cr.rep_id not in (select rep_id from cr_report_access cra where user_id = '[user_id]' + +get.private.accessible.names.if = OR role_id in ( + +get.private.accessible.names.b = ) AND public_yn = 'N' and cr.owner_id = '[user_id]' order by 2 + +get.group.accessible.names.a = SELECT cr.rep_id, cr.title FROM cr_report cr WHERE cr.rep_id in (select rep_id from cr_report_access cra where user_id = '[user_id]' + +get.group.accessible.names.b = ) AND public_yn = 'N' order by 2 + +get.report.table.sources.a = SELECT table_name, display_name, pk_fields, web_view_action, large_data_source_yn, filter_sql FROM cr_table_source + +get.report.table.sources.where = where SOURCE_DB= '[dBInfo]' + +get.report.table.sources.if = where SOURCE_DB is null or SOURCE_DB = '[AppConstants.DB_LOCAL]' + +get.report.table.sources.else = ORDER BY table_name + +grab.report.table.a = SELECT ts.table_name, ts.display_name, ts.pk_fields, ts.web_view_action, ts.large_data_source_yn, ts.filter_sql FROM cr_table_source ts WHERE + +grab.report.table.if = ts.SOURCE_DB= '[dBInfo]' + +grab.report.table.else = (ts.SOURCE_DB is null or ts.SOURCE_DB = '[AppConstants.DB_LOCAL]') + +grab.report.table.b = except SELECT ts.table_name, ts.display_name, ts.pk_fields, ts.web_view_action, ts.large_data_source_yn, ts.filter_sql from cr_table_source ts where table_name in (select table_name from cr_table_role where role_id not IN [sb.toString()]) and + +grab.report.table.c = ORDER BY 1 + +get.report.table.crjoin = SELECT src_table_name, dest_table_name, join_expr FROM cr_table_join + +get.report.table.joins = SELECT tj.src_table_name, tj.dest_table_name, tj.join_expr FROM cr_table_join tj WHERE ((EXISTS (SELECT 1 FROM cr_table_role trs WHERE trs.table_name=tj.src_table_name AND trs.role_id IN [sb.toString()])) OR (NOT EXISTS (SELECT 1 FROM cr_table_role trs WHERE trs.table_name=tj.src_table_name))) AND ((EXISTS (SELECT 1 FROM cr_table_role trd WHERE trd.table_name=tj.dest_table_name AND trd.role_id IN [sb.toString()])) OR (NOT EXISTS (SELECT 1 FROM cr_table_role trd WHERE trd.table_name=tj.dest_table_name))) + +generate.report.table.col = SELECT a.table_name, a.column_name, a.data_type, a.label FROM user_column_def a WHERE a.table_name = '[tableName.toUpperCase()]' ORDER BY a.column_id + +generate.db.user.sql.a = SELECT utc.table_name, utc.column_name, utc.data_type, + +generate.db.user.sql.if = utc.column_name FROM user_tab_columns utc + +generate.db.user.sql.else = coalesce(x.label, utc.column_name) FROM user_tab_columns utc + +generate.db.user.sql.b = WHERE utc.table_name = '[tableName.toUpperCase()]' + +generate.db.user.sql.c = AND utc.table_name = x.table_name AND utc.column_name = x.column_name + +generate.db.user.sql.d = ORDER BY utc.column_id + +#SearchHandler.java + +load.report.search.result = SELECT cr.rep_id, cr.rep_id report_id, [rep_title_sql] title, cr.descr, concat(au.first_name,' ',au.last_name) owner_name, DATE_FORMAT(cr.create_date, '%m/%d/%Y') create_date, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'N' ELSE coalesce(ra.read_only_yn, 'Y') END read_only_yn, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'Y' ELSE 'N' END user_is_owner_yn, case when report_xml like '%N%' then 'N' when report_xml like '%Y%' or 1 = (select distinct 1 from cr_report_schedule where rep_id = cr.rep_id) then 'Y' else 'N' end FROM cr_report cr JOIN fn_user au ON coalesce (cr.owner_id, cr.create_id) = au.user_id [fReportID] [fReportName] LEFT JOIN(SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON ra.rep_id = cr.rep_id + +load.report.search.instr = WHERE cr.menu_id LIKE '%[menuId]%' + +load.report.search.result.user = WHERE coalesce(cr.owner_id, cr.create_id) = [userID] + +load.report.search.result.public = WHERE (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL) + +load.report.search.result.fav = WHERE cr.rep_id in (select rep_id from cr_favorite_reports where user_id = [userID] + +load.report.search.result.sort = ORDER BY CASE coalesce(cr.owner_id, cr.create_id) WHEN [userID] THEN ' ' WHEN 'upper(concat(au.first_name,' ',au.last_name))' ELSE 'upper(cr.title)' END + +load.folder.report.result = SELECT cr.rep_id, cr.rep_id report_id, concat([rep_title_sql] , (CASE WHEN cr.public_yn = 'Y' THEN '' ELSE '[PRIVATE_ICON]' END),cr.title,'') title, cr.descr, concat(au.first_name,' ',au.last_name) owner_name, TO_CHAR(cr.create_date, 'MM/DD/YYYY') create_date, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'N' ELSE coalesce(ra.read_only_yn, 'Y') END read_only_yn, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'Y' ELSE 'N' END user_is_owner_yn FROM cr_report cr JOIN fn_user au ON coalesce (cr.owner_id, cr.create_id) = au.user_id AND TO_CHAR(cr.rep_id, 'FM99999999') like coalesce('%[fReportID]%', TO_CHAR(cr.rep_id, 'FM99999999')) AND UPPER(cr.title) LIKE UPPER('%[fReportName]%') LEFT JOIN(SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON ra.rep_id = cr.rep_id + +load.folder.report.result.sort = ORDER BY CASE coalesce(cr.owner_id, cr.create_id) WHEN [userID] THEN ' ' WHEN '(concat(au.first_name,' ',au.last_name))' ELSE 'cr.title' END + +#WizardProcessor.java + +process.filter.add.edit = '[argValue]' + +#ReportDefinition.java + +persist.report.adhoc = SELECT nextval('[Globals.getAdhocReportSequence()]') AS sequence + +#Globals.java + +initialize.roles = SELECT 1 WHERE EXISTS (SELECT 1 FROM cr_table_role) + +initialize.version = SELECT cr_raptor.get_version + +# scheduler + + +scheduler.available.schedules = SELECT x.rep_id, x.schedule_id, x.conditional_yn, x.condition_large_sql, x.notify_type, x.max_row, x.initial_formfields, x.processed_formfields, r.title, x.user_id FROM ( SELECT rs.rep_id, rs.schedule_id, rs.sched_user_id user_id, rs.conditional_yn, rs.condition_large_sql, rs.notify_type, rs.max_row, rs.initial_formfields, rs.processed_formfields FROM cr_report_schedule rs WHERE rs.enabled_yn='Y' AND rs.start_date <= [currentDate] AND (rs.end_date >= [currentDate] or rs.end_date is null ) AND rs.run_date IS NOT NULL ) x, cr_report r WHERE x.rep_id = r.rep_id + +random.string = select ( concat('Z' , round(random() * 1000000000000) ) ) + + +scheduler.user.emails = SELECT au.user_id FROM (SELECT rs.schedule_id, rs.rep_id FROM cr_report_schedule rs WHERE rs.enabled_yn='Y' AND rs.start_date <= now() AND rs.end_date >= now() AND rs.run_date IS NOT NULL AND rs.schedule_id = [p_schedule_id] ) x, cr_report r, fn_user au WHERE x.rep_id = r.rep_id AND au.user_id IN (SELECT rsu.user_id FROM cr_report_schedule_users rsu WHERE rsu.schedule_id = x.schedule_id and rsu.schedule_id = [p_schedule_id] UNION SELECT ur.user_id FROM fn_user_role ur WHERE ur.role_id IN (SELECT rsu2.role_id FROM cr_report_schedule_users rsu2 WHERE rsu2.schedule_id = x.schedule_id and rsu2.schedule_id = [p_schedule_id])) + + +# my logins + +app.query = SELECT APP_ID, ML_APP_NAME, MOTS_ID from fn_app + +user.log.query = SELECT DISTINCT IFNULL(ORG_USER_ID, '') CUID, '' AWID, CONCAT('"',IFNULL(ORG_USER_ID, ''),'"') APPLICATIONUSERID, CONCAT('"',IFNULL(FIRST_NAME, ''),'"') FIRST_NAME, CONCAT('"',substr(IFNULL(MIDDLE_NAME, ''), 0, 1),'"') MIDDLE_INITIAL, CONCAT('"',IFNULL(LAST_NAME, ''),'"') LAST_NAME, IFNULL(DATE_FORMAT(LAST_LOGIN_DATE, '%Y/%m/%d'), '') LAST_LOGON_DATE, DATE_FORMAT(CREATED_DATE, '%Y/%m/%d') ACCOUNT_ACTIVATION_DATE, IFNULL(DATE_FORMAT(MODIFIED_DATE, '%Y/%m/%d'), '') LAST_DATE_ACCOUNT_MODIFIED, '' LAST_PASSWORD_CHANGE_DATE, CONCAT('"',IFNULL(FIRST_NAME, ''),' ',IFNULL(MIDDLE_NAME, ''),' ',IFNULL(LAST_NAME, ''),'"') FULL_USER_NAME, '' NT_ID, IFNULL(EMAIL, '') EMAIL FROM FN_USER FU, FN_USER_ROLE FUR WHERE FU.USER_ID \= FUR.USER_ID and FUR.app_id \= ? and ACTIVE_YN \= 'Y' and ORG_USER_ID is not null order by 1 + +profile.log.query = SELECT DISTINCT CONCAT('"' , ROLE_NAME , '"') PROFILE_NAME, '""' SECURITY_SETTINGS FROM FN_ROLE FR, FN_USER_ROLE FUR WHERE FUR.ROLE_ID \= FR.ROLE_ID and FR.ACTIVE_YN \= 'Y' and ((FUR.APP_ID \= 1 and FR.ROLE_NAME <> 'Standard User') or (FUR.APP_ID \= ? and FUR.APP_ID <> 1)) ORDER BY 1 + +user.profile.log.query = SELECT DISTINCT IFNULL(ORG_USER_ID, '') CUID, '' AWID, CONCAT('"' , IFNULL(ORG_USER_ID, '') , '"') APPLICATIONUSERID , CONCAT('"' , ROLE_NAME , '"') PROFILE_NAME FROM FN_USER A, FN_USER_ROLE B, FN_ROLE C WHERE A.USER_ID \= B.USER_ID AND B.ROLE_ID \= C.ROLE_ID AND A.ACTIVE_YN \= 'Y' AND C.ACTIVE_YN \= 'Y' AND a.ORG_USER_ID is not null AND ((B.APP_ID \= 1 and C.ROLE_NAME <> 'Standard User') or (B.APP_ID \= ? and B.APP_ID <> 1)) ORDER BY 1 + +all.accounts.log.query = SELECT DISTINCT IFNULL(ORG_USER_ID, '') CUID, (case when A.ACTIVE_YN\='Y' then 'ACTIVE' else 'INACTIVE' end) ACTIVE_YN, CONCAT('"' , IFNULL(ORG_USER_ID, '') , '"') APPLICATIONUSERID , IFNULL(DATE_FORMAT(LAST_LOGIN_DATE, '%Y/%m/%d'), '') LAST_LOGON_DATE, '' LAST_PASSWORD_CHANGE_DATE, CONCAT('"' , ROLE_NAME , '"') PROFILE_NAME FROM FN_USER A, FN_USER_ROLE B, FN_ROLE C WHERE A.USER_ID \= B.USER_ID AND B.ROLE_ID \= C.ROLE_ID AND a.ORG_USER_ID is not null AND ((B.APP_ID \= 1 and C.ROLE_NAME <> 'Standard User') or (B.APP_ID \= ? and B.APP_ID <> 1)) ORDER BY 1 + +# basic sql + +seq.next.val = SELECT nextval('[sequenceName]') AS id + +current.date = now() + +nvl = IFNULL + +# report security +report.user.access = SELECT ra.role_id, ra.user_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.rep_id = [reportID] +add.user.access = INSERT INTO cr_report_access (rep_id, order_no, role_id, user_id, read_only_yn) VALUES([reportID], IFNULL((select order_no from (SELECT MAX(order_no) AS order_no FROM cr_report_access WHERE rep_id=[reportID]) AS temp), 0)+1, NULL, [userID], '[readOnlyAccess]') +update.user.access = UPDATE cr_report_access SET read_only_yn='[readOnlyAccess]' WHERE rep_id=[reportID] AND user_id=[userID] +remove.user.access = DELETE FROM cr_report_access WHERE rep_id=[reportID] AND user_id=[userID] +add.role.access = INSERT INTO cr_report_access (rep_id, order_no, role_id, user_id, read_only_yn) VALUES([reportID], IFNULL((select order_no from (SELECT MAX(order_no) AS order_no FROM cr_report_access WHERE rep_id=[reportID]) AS temp), 0)+1, [roleID], NULL, '[readOnlyAccess]') +update.role.access = UPDATE cr_report_access SET read_only_yn='[readOnlyAccess]' WHERE rep_id=[reportID] AND role_id=[roleID] +remove.role.access = DELETE FROM cr_report_access WHERE rep_id=[reportID] AND role_id=[roleID] + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/system.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/system.properties new file mode 100644 index 0000000..bafa77d --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/system.properties @@ -0,0 +1,61 @@ +#Local +app_display_name = DMaaP Bus Ctlr + +db.driver = com.mysql.jdbc.Driver +db.connectionURL = jdbc:mysql://localhost:3306/dbca_os +db.userName = xxxxx +db.password = xxxxxx +# db.encrypt_flag = true +db.hib.dialect = org.hibernate.dialect.MySQLDialect +db.min_pool_size = 5 +db.max_pool_size = 10 +hb.dialect = org.hibernate.dialect.MySQLDialect +hb.show_sql = false +hb.db_reconnect = true +hb.idle_connection_test_period = 3600 + +# Directory with the Quantum.lic file +files_path = /opt/app/tomcat/webapps/dmaap-bc-app/WEB-INF/dbcapp + +application_user_id = 30000 +post_default_role_id = 16 +clustered = true + +#Enable Fusion Mobile capabilities for the application +mobile_enable = false + +# Cache config file is needed on the classpath +cache_config_file_path = /WEB-INF/classes/cache.ccf +cache_switch = 199 +cache_load_on_startup = false + +user_name = fullName +decryption_key = AGLDdG4D04BKm2IxIWEr8o== + +#element map files +element_map_file_path = /tmp +element_map_icon_path = app/fusionapp/icons/ + + +# An Unique 128-bit value defined to identify a specific version +# of an application deployed on a specific virtual machine. +# This value must be generated and updated by the application +# which is using the ECOMP SDK at the time of its deployment. +# Online Unique UUID generator - https://www.uuidgenerator.net/ +# ID generated for DBC to supply to EELF +# A bogus value is cached in SCM: 12345678-.. +instance_uuid = 12345678-90ab-cdef-1234-567890abcdef + +# R Cloud feature +guard_notebook_url=https://host/mini.html?notebook=a06a9cf14211012e221bf842c168849d& + +# Application base URL is a proper prefix of the on-boarded URL. +app_base_url = http://localhost:8080/dmaap-bc-app.1.0.0/ + +# open source authenticate user server +authenticate_user_server=http://todo_enter_auth_server_hostname:8383/openid-connect-server-webapp/allUsers + +# ECOMP Portal Shared Context REST API URL +ecomp_shared_context_rest_url= http://todo_enter_be_hostname:9000/ecompportal/context +# Link shown in Help menu +contact_us_link = https://todo_contact_us_link.com \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp-definitions.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp-definitions.xml new file mode 100644 index 0000000..bca92c7 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp-definitions.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.hbm.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.hbm.xml new file mode 100644 index 0000000..01a10a2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.hbm.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + seq_dbca_dmaap + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.properties new file mode 100644 index 0000000..b2c8e0f --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.properties @@ -0,0 +1,36 @@ +### +# ================================================================================ +# DCAE DMaaP Bus Controller Web Application +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property +# ================================================================================ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ================================================================================ +### +# Properties for the Data Bus Controller webapp + +dmaap.rest.url.list = http://10.0.4.102:18080/webapi + +# webapp's mechid is sent to DCAE for authorization; +dmaap.mechid.name = xxxxx@dbcapp.dmaap.dcae.openecomp.org +# encrypted with CipherUtil +dmaap.mechid.password = xxxxxxxxxx + +# Valid access methods are "dao" and "rest" +profile.access.method = dao + +# these properties are required if the access method is rest +profile.microservice.url = http://localhost:8081/dbus +profile.microservice.user.name = dbus_user +# encrypted with CipherUtil +profile.microservice.user.password = xxxxxxxxxxxxxxxxxxxxx diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/defs/definitions.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/defs/definitions.xml new file mode 100644 index 0000000..91b6440 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/defs/definitions.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/conf/fusion.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/conf/fusion.properties new file mode 100644 index 0000000..5a43646 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/conf/fusion.properties @@ -0,0 +1,61 @@ +### +# ================================================================================ +# DCAE DMaaP Bus Controller Web Application +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property +# ================================================================================ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ================================================================================ +### + + +# validator settings +#default_error_message = Default error message + +#login message +login.error.hrid.empty = Login failed, please contact system administrator. +login.error.hrid.not-found = User not found, please contact system administrator. +login.error.user.inactive = Account is disabled, please contact system administrator. + +authentication_mechanism = BOTH + +user_attribute_name = user + +# User Session settings +#user_attribute_name = user +roles_attribute_name = roles +role_functions_attribute_name = role_functions +#client_device_attribute_name = client_device +#client_device_emulation = false + + +# menu settings +menu_query_name = menuData +#menu_properties_file_location = /WEB-INF/fusion/menu/ +application_menu_set_name = APP +application_menu_attribute_name = applicationMenuData +#application_menu_properties_name = menu.properties +business_direct_menu_set_name = BD +#business_direct_menu_properties_name = bd.menu.properties +business_direct_menu_attribute_name = businessDirectMenuData + +# RAPTOR config settings +#raptor_config_file_path = /WEB-INF/conf/ + +# Role settings +sys_admin_role_id = 1 +#sys_admin_role_function_delete_from_ui = true + +# Profile Search settings +#profile_search_report_id=181 +#callable_profile_search_report_id=386 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/defs/definitions.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/defs/definitions.xml new file mode 100644 index 0000000..c61aaa6 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/defs/definitions.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/.gitignore b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast.jsp new file mode 100644 index 0000000..3415f5c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast.jsp @@ -0,0 +1,137 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ page import="org.openecomp.portalsdk.core.web.support.UserUtils" %> +<%@ page import="org.openecomp.portalsdk.core.web.support.ControllerProperties" %> +<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties" %> + +<%-- <%@ include file="/WEB-INF/fusion/jsp/include.jsp" %> --%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + "/> + + + +
+

+ + +

Broadcast Message Edit

+
+ +

Broadcast Message Create

+
+
+

+
+ +
+ Please edit the broadcast message details below: 

+
+
+ +
+
+
+
+ + +
+ +
+
+ + +
+ +
+
+ +
+ + +
+
+
+
+
+
+
+ +
+
+ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast_list.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast_list.jsp new file mode 100644 index 0000000..182a7e3 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast_list.jsp @@ -0,0 +1,201 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ page import="java.util.*" %> +<%@ page import="com.fasterxml.jackson.databind.ObjectMapper" %> +<%@ page import="org.json.JSONObject" %> +<%@ page import="java.io.StringWriter" %> +<%@ page import="org.openecomp.portalsdk.core.web.support.ControllerProperties" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + + +
+

+ Broadcast Messages +

+
+ + <%-- Display a table for the broadcast messages of each message location --%> +
+ +
+ {{location.label}} Messages +
+ + + + + + + + + + + + + + + + + {{message.id}} + + + + + + + + + + + +
No.Message TextStart DateEnd DateSort OrderServerActive?Delete?
{{$index+1}}{{message.messageText}} + {{message.displayStartDate}} + {{message.displayEndDate}}{{message.sortOrder}}{{message.siteCd}} +
+ +
+
+
+
+
+ +


+
+
+ + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/collaborateList.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/collaborateList.jsp new file mode 100644 index 0000000..1b538e3 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/collaborateList.jsp @@ -0,0 +1,146 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> + +
+
+

User List

+
+ + + + + + + + + + + + + + + + + + + + + + +
User IDLast NameFirst NameEmailUserIdOnline/Offline
+ Offline + Online +
+
+
+
+ Rows Per Page: + +
+
+ Current Page: + +
+
+ Total Page(s): + +
+ + +
+ + + + + + + + + + + +
diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/data_out.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/data_out.jsp new file mode 100644 index 0000000..933b214 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/data_out.jsp @@ -0,0 +1,20 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +${model.output_string} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_footer.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_footer.jsp new file mode 100644 index 0000000..102c920 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_footer.jsp @@ -0,0 +1,46 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> + +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + + + +
+
+ +
+ +
+
+
+ + +
+
+
+
+
+
+
+ + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_header.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_header.jsp new file mode 100644 index 0000000..b10cf6c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_header.jsp @@ -0,0 +1,799 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ page isELIgnored="false"%> +<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%> +<%@ page import="org.openecomp.portalsdk.core.onboarding.crossapi.PortalApiProperties"%> +<%@ page import="org.openecomp.portalsdk.core.onboarding.crossapi.PortalApiConstants"%> +<%@ page import="org.openecomp.portalsdk.core.domain.MenuData"%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + +" /> +" /> + +<% + String contactUsLink = SystemProperties.getProperty(SystemProperties.CONTACT_US_LINK); + String redirectUrl = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL); + String portalUrl = redirectUrl.substring(0, redirectUrl.lastIndexOf('/')) + "/processSingleSignOn"; + String getAccessLink = redirectUrl.substring(0, redirectUrl.lastIndexOf('/')) + "/get_access"; +%> + + + + +<%@include file="/WEB-INF/fusion/jsp/ebz/loginSnippet.html" %> + +
+
+ +
+
+
+ + +
+
+
+
+
  • + + ECOMP Portal +
  • +
    +
    + +
    +
    + + +
    + + +
    +
    +
    +
  • + Unable to load menus +
  • +
    + +
    +
  • +
    + + +
    +
  • +
  •  
  • +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    + + + +     {{app_name}} + +
    +
    +
    +
    + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/loginSnippet.html b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/loginSnippet.html new file mode 100644 index 0000000..c71775b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/loginSnippet.html @@ -0,0 +1,120 @@ + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template.jsp new file mode 100644 index 0000000..5bc66ea --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template.jsp @@ -0,0 +1,45 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%> + + + + + <%@ include file="/WEB-INF/fusion/jsp/meta.jsp" %> + + + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_noheader_nofooter.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_noheader_nofooter.jsp new file mode 100644 index 0000000..b3124fe --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_noheader_nofooter.jsp @@ -0,0 +1,35 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%> + + + <%@ include file="/WEB-INF/fusion/jsp/meta.jsp" %> + +
    + +
    +
    + +
    +
    + +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_report_embedded.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_report_embedded.jsp new file mode 100644 index 0000000..54b85f8 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_report_embedded.jsp @@ -0,0 +1,48 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%> + + + <%@ include file="/WEB-INF/fusion/jsp/meta.jsp" %> + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_search_demo.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_search_demo.jsp new file mode 100644 index 0000000..938e6fe --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_search_demo.jsp @@ -0,0 +1,97 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> + + + +
    +
    Elastic Search - Corporate Location Data System
    +
    +
    + +   +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    Customer NamePhoneStreetCityStateZIPCLLI
    {{options._source.name}}{{options._source.suggest.payload.tn}}{{options._source.suggest.payload.addr}}{{options._source.suggest.payload.city}}{{options._source.suggest.payload.st}}{{options._source.suggest.payload.zip}}{{options._source.suggest.payload.clli}}
    +
    +
    diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_suggest_demo.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_suggest_demo.jsp new file mode 100644 index 0000000..17548e8 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_suggest_demo.jsp @@ -0,0 +1,97 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> + + + +
    +
    Elastic Search - Corporate Location Data System
    +
    +
    + +   +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    Customer NamePhoneStreetCityStateZIPCLLI
    {{options.text}}{{options.payload.tn}}{{options.payload.addr}}{{options.payload.city}}{{options.payload.st}}{{options.payload.zip}}{{options.payload.clli}}
    +
    +
    diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/frame_insert.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/frame_insert.jsp new file mode 100644 index 0000000..2a8f082 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/frame_insert.jsp @@ -0,0 +1,44 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/include.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/include.jsp new file mode 100644 index 0000000..dd0c98e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/include.jsp @@ -0,0 +1,30 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties" %> +<%@ page import="org.openecomp.portalsdk.core.web.support.AppUtils" %> + +<%@ page import="java.util.LinkedHashMap" %> + + +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/jcs_admin.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/jcs_admin.jsp new file mode 100644 index 0000000..4fbaffa --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/jcs_admin.jsp @@ -0,0 +1,144 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%-- <%@ include file="/WEB-INF/fusion/jsp/include.jsp"%> --%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> + +
    +

    Cache Regions

    + These are the regions which are currently defined in the cache. 'Items' and 'Bytes' refer to the elements currently in memory (not spooled). + You can clear all items for a region by clicking on the Clear icon next to the desired region below. You can also clear all regions which + empties the entire cache.

    + +
    +
    +
    Cache Name
    +
    # of Items
    +
    Bytes
    +
    Status
    +
    Memory Hits
    +
    Aux Hits
    +
    Not Found Misses
    +
    Expired Misses
    +
    Clear?
    +
    Items
    +
    +
    +
    + +
    {{region.size}}
    +
    {{region.byteCount}}
    +
    {{region.status}}
    +
    {{region.hitCountRam}}
    +
    {{region.hitCountAux}}
    +
    {{region.missCountNotFound}}
    +
    {{region.missCountExpired}}
    +
    +
    +
    +
    +
    +
    + +
    Key
    +
    Eternal?
    +
    Created
    +
    Max Life
    +
    Expires
    +
    Clear?
    +
    +
    +
    + + +
    {{item.eternal}}
    +
    {{item.createTime}}
    +
    {{item.maxLifeSeconds}}
    +
    {{item.expiresInSeconds}}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/meta.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/meta.jsp new file mode 100644 index 0000000..1044775 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/meta.jsp @@ -0,0 +1,36 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal.html b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal.html new file mode 100644 index 0000000..ccff557 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal.html @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_role.html b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_role.html new file mode 100644 index 0000000..d573ba5 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_role.html @@ -0,0 +1,274 @@ + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_rolefunction.html b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_rolefunction.html new file mode 100644 index 0000000..50f7fee --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_rolefunction.html @@ -0,0 +1,87 @@ + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/post_search.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/post_search.jsp new file mode 100644 index 0000000..4a0dd4e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/post_search.jsp @@ -0,0 +1,356 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ page import="java.util.*" %> +<%@ page import="com.fasterxml.jackson.databind.ObjectMapper" %> +<%@ page import="org.json.JSONObject" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal_rolefunction.html" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal_role.html" %> + + +
    + +

    WEBPHONE Search

    +
    + Please enter search criteria below:
    + +
    + Last Name:
    + +
    + +
    + First Name:
    + +
    + +
    + UserId:
    + +
    + +
    + Manager OrgUserId:
    + +
    +
    +
    + Organization:
    + +
    + +
    + Email:
    + +
    +
    + +
    + + + +
    +
    + {{noResultsString}} +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    NoNameOrgUserIdOrganizationPhoneEmailImport?
    + {{$index + 1}} + +
    + {{profile.lastName}}, {{profile.firstName}} +
    + + +
    + {{profile.orgUserId}} + + {{profile.orgCode}} + + {{profile.phone}} + + {{profile.email}} + +
    +
    + +
    +
    +
    + Exists +
    +
    +
    + Rows Per Page: + +
    +
    + Current Page: + +
    +
    + Total Page(s): + +
    + +
    + +
    + +
    + + + + +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile.jsp new file mode 100644 index 0000000..2123003 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile.jsp @@ -0,0 +1,441 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ page import="org.openecomp.portalsdk.core.domain.User"%> +<%@ page import="org.openecomp.portalsdk.core.web.support.UserUtils"%> + +<%@page import="org.openecomp.portalsdk.core.web.support.ControllerProperties"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> + +<%@ include file="/WEB-INF/fusion/jsp/include.jsp"%> + +
    +

    + + +

    Profile Edit

    +
    + +

    Profile Edit

    +
    +
    +

    +
    + +
    + + Please edit the profile details below: 

    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    +
    + + +
    + + + + + + + + + + + + + + + + +
    NameRemove?
    {{ role.name }} + +
    + + + +
    + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile_search.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile_search.jsp new file mode 100644 index 0000000..c27599c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile_search.jsp @@ -0,0 +1,104 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> +
    +
    +

    Profile Search

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    User IDLast NameFirst NameEmailOrgUserIdManager OrgUserIdEditActive?
    {{rowData.id}}{{rowData.lastName}}{{rowData.firstName}}{{rowData.email}}{{rowData.orgUserId}}{{rowData.managerId}} +
    + +
    +
    +
    +
    +
    + Rows Per Page: + +
    +
    + Current Page: + +
    +
    + Total Page(s): + +
    +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role.jsp new file mode 100644 index 0000000..45f600b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role.jsp @@ -0,0 +1,286 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal_rolefunction.html" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal_role.html" %> + +
    + +
    +
    +

    + + +

    Role Edit

    +
    + +

    Role Create

    +
    +
    +

    +
    + +
    + +
    + Please edit the role details below: 
    + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    + + + + + + + + + + + + + + +
    NameRemove?
    {{ roleFunction.name }} +
    +
    + Manage Role Functions

    + +
    + + +
    + + + + + + + + + + + + + + +
    NameRemove?
    {{ role.name }} +
    +
    + +
    + + + + + + + + + + + + + + +
    Role
    +
    + +
    +
    {{ availableRole.name }}
    +
    +
    + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_function_list.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_function_list.jsp new file mode 100644 index 0000000..45c2d10 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_function_list.jsp @@ -0,0 +1,213 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> + +<%-- <%@ include file="/WEB-INF/fusion/jsp/include.jsp" %> --%> + +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + +<%@ include file="/WEB-INF/fusion/jsp/popup_modal_rolefunction.html" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> +
    +
    + +

    Role Functions

    + + +

    + +
    + +
    + Click on the edit icon to update a role function, the plus icon to add additional role functions, or the delete icon to remove them. +
    +
    + + + + + + + + + + + + + + + + + +
    NameCodeEdit?Delete?
    {{ availableRoleFunction.name }}{{ availableRoleFunction.code }} + +
    +
    + +
    +
    +
    + + + + + + +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    + +
    + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_list.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_list.jsp new file mode 100644 index 0000000..dbf8878 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_list.jsp @@ -0,0 +1,139 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> + +<%-- <%@ include file="/WEB-INF/fusion/jsp/include.jsp" %> --%> + +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> + +
    +

    Roles

    +
    +
    +Click on a Role to view its details. + +
    +
    + + + + + + + + + + + + + + + + + + +
    NamePriorityActive?Delete?
    {{ availableRole.name }}{{ availableRole.priority }} +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/usage_list.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/usage_list.jsp new file mode 100644 index 0000000..6e8a370 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/usage_list.jsp @@ -0,0 +1,87 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> + +<%-- <%@ include file="/WEB-INF/fusion/jsp/include.jsp" %> --%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> + +
    +
    +

    + Usage +

    +
    +
    + The following shows all users currently logged into the application. Click the icon to expel a user from the application. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current User Sessions
    User IdUser NameEmailLast Access Time (minutes)Time Remaining (minutes)Expel?
    {{user.id}}{{user.lastName}}{{user.email}}{{user.lastAccess}}{{user.remaining}}
    Current Session
    +
    +
    +
    +
    + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/webrtc/collaboration.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/webrtc/collaboration.jsp new file mode 100644 index 0000000..ac80a91 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/webrtc/collaboration.jsp @@ -0,0 +1,492 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    + + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Fusion.hbm.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Fusion.hbm.xml new file mode 100644 index 0000000..2520c9a --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Fusion.hbm.xml @@ -0,0 +1,352 @@ + + + + + + + + + + + + seq_fn_user + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + seq_fn_audit_log + + + + + + + + + + + + + seq_fn_role + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + seq_fn_menu + + + + + + + + + + + + + + + + + + + + + + + + seq_fn_menu + + + + + + + + + + + + + + + + + + + + + + + + + + + + seq_fn_broadcast_message + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select distinct md.parentMenu.id from MenuData as md where md.label = :paramLabel and md.label is not null + + + + select distinct md.id from MenuData as md where md.label = :paramLabel + + + + select distinct md.id, md.label, md.parentMenu.id from MenuData as md where md.label is not null + + + + select distinct functionCd from MenuData + + + + select distinct code from RoleFunction + + + + from MenuData where menuSetCode = :menu_set_cd and parentMenu is null + + + FROM UrlsAccessible A where upper(A.urlsAccessibleKey.url) = upper(:current_url) + + + + select firstName, lastName from User where id = :user_id + + + + select email from User where id = :user_id + + + + select id, firstName, lastName from User where active = true order by lastName, firstName + + + + select name from Role where id = :role_id + + + + select id, name from Role order by name + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml new file mode 100644 index 0000000..25fe5d9 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Workflow.hbm.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Workflow.hbm.xml new file mode 100644 index 0000000..e524706 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Workflow.hbm.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/error.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/error.jsp new file mode 100644 index 0000000..fad43e4 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/error.jsp @@ -0,0 +1,20 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +${errMsg} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/leafletMap.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/leafletMap.jsp new file mode 100644 index 0000000..5351ec0 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/leafletMap.jsp @@ -0,0 +1,288 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> + + + + + + + + + + + + + + + + + + +
    + + +
    + + + + + + + + + +
    SiteUsage
    + + + + + + + + + +
    LinkUsage
    +
    + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/login_external.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/login_external.jsp new file mode 100644 index 0000000..870cb50 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/login_external.jsp @@ -0,0 +1,154 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties" %> + +" /> + + + + + + + Login + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + +

    ECOMP Portal

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






    + +
    + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/net_map.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/net_map.jsp new file mode 100644 index 0000000..2ed9758 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/net_map.jsp @@ -0,0 +1,38 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> + + + + + + + + + +
    + +
    + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/user_profile.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/user_profile.jsp new file mode 100644 index 0000000..9be47c5 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/user_profile.jsp @@ -0,0 +1,84 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> +
    +
    +

    Profile Search

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    User IDLast NameFirst NameEmailOrgUserIdManager OrgUserId
    {{rowData.id}}{{rowData.last_name}}{{rowData.first_name}}{{rowData.email}}{{rowData.orgUserId}}{{rowData.org_manager_userid}}
    +
    +
    +
    + Rows Per Page: + +
    +
    + Current Page: + +
    +
    + Total Page(s): + +
    +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/welcome.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/welcome.jsp new file mode 100644 index 0000000..8d84668 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/welcome.jsp @@ -0,0 +1,629 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ================================================================================ + --%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + Welcome ${sessionScope.user.firstName} ${sessionScope.user.lastName}  + (Last Login:  ${lastLogin}) +
    + +
    +
    +
    +
    +
    + +
    + + + + +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + +
    + + +
    +
    + +
    + +
    +
    +
      +
    • {{Daytab.title}}
    • +
    +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
      +
    • {{TrafficTab.title}}
    • +
    +
    +
    +
    + + + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + +
    JQuery + +
    Animated Map + +
    Chat Session + +
    +
    +
    +
    +
    + +
    + + + + + + + + + +
    + +
    + + +
    + +
    +
    +
    +
    + +
    + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/web.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..40529a0 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,38 @@ + + + + + + dmaap-bc-app + + + + + + + 37 + COOKIE + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/att-globe-16x16.ico b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/att-globe-16x16.ico new file mode 100644 index 0000000000000000000000000000000000000000..d2c5e0fc379e1a7fee787a3c1b7ab9fef6777468 GIT binary patch literal 1150 zcmZ`(Urbw77{5dlW1`7kwq!oA#i&~{jf=DK0h7fCHPHvB$)e6g2&s+>03eFgi0{!$Jea07Q5f?Z_H#ed&}kWs%C~nuQ+qs_0N6>R-7Y5E$L)ZEirh5-#exeRux(OcL zPh@@?_e{<3%?`ou;}D62TZr9Ni_vgH$M^4|`|MsYqZh!>jbJIjBDv^6CLTl~n;>B+ zpup&3 zK80I*3M+miN`-Y43Iamh9Xtqm+lG{l7;O3os=DVf{N1xe|253?d<^^GS8$Ej!fQAW zPFD}F@j~UFQM?DgxdoZk1VTaH({cU~6t&fuy74W-E-kU!jdb)b(u)qPJ#-_t8m-t* z;!J!fSI&Z8*1RDe?x4+ihL&iDDGkrWr!6>cOVw?$i#R! z$B%=@=pzp31ZLB0$0ululIy^ht@ zG#)N3RPu-LQTcpcHr!bo8vFeyg1j5C*a}FkfbgSKDiIV>Ah{E9jzQD#Dgv&_$N4Mi zOZAh_t?!v-X_{qO!Rz&s{EQHunB*f;sZ?bi4u_NXIYwS83je4di9>=^zllWR0LO9t z4u>OXu~-C~&9=t#ygeF?Hj;e(PyGrzC@S<6MbS@CRDBhB9VGl;BWuzgX|JRs>HZDN C3L@YD literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-list-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-list-controller.js new file mode 100644 index 0000000..36b7dd0 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-list-controller.js @@ -0,0 +1,286 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('drFeedListCtrl', function($scope, $log, $modal, modalService, DRFeedService) { + + // populates the table of Data Router feeds + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + // models for controls on screen + $scope.dbcapp.tableData = []; + $scope.dbcapp.currentPageNum = 1; + $scope.dbcapp.totalPages = 1; + $scope.dbcapp.viewPerPage = 100; + $scope.dbcapp.viewPerPageOptions = [ + { index : 0, value : 100 }, + { index : 1, value : 500 }, + { index : 2, value : 1000 }, + { index : 3, value : 2500 } + ]; + // other + $scope.dbcapp.errMsg = null; + $scope.dbcapp.isDataLoading = true; + $scope.dbcapp.isRequestFailed = false; + + /** + * Answers an array of the specified size - makes Angular iteration easy. + */ + $scope.dbcapp.buildArraySizeN = function(num) { + // $log.debug("buildArraySizeN: invoked with " + num); + return new Array(num); + } + + /** + * Loads the table of data router feeds. + * + * Interprets the remote controller's response and copies to scope + * variables. The response is either list to be assigned to tableData, or an + * error to be shown. + */ + $scope.dbcapp.loadTable = function() { + $scope.dbcapp.isDataLoading = true; + DRFeedService.getFeedsByPage($scope.dbcapp.currentPageNum, $scope.dbcapp.viewPerPage) + .then(function(jsonObj) { + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + $scope.dbcapp.tableData = []; + } else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.profileName = jsonObj.profileName; + $scope.dbcapp.dmaapName=jsonObj.dmaapName; + $scope.dbcapp.dcaeLocations=jsonObj.dcaeLocations; + $scope.dbcapp.totalPages = jsonObj.totalPages; + $scope.dbcapp.tableData = jsonObj.data; + } + $scope.dbcapp.isDataLoading = false; + }, function(error) { + $log.error("drFeedListCtrl.loadTable failed: " + error); + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = error; + $scope.dbcapp.tableData = []; + $scope.dbcapp.isDataLoading = false; + }); + }; + + /** + * Shows a modal pop-up to add a feed. + * Passes data in via an object named "message". + * On success, updates the table. + */ + $scope.dbcapp.addFeedModalPopup = function() { + $scope.dbcapp.editFeed = null; + var modalInstance = $modal.open({ + templateUrl : 'add_feed_popup.html', + controller : 'feedPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + feed : $scope.dbcapp.editFeed, + feedList : $scope.dbcapp.tableData, + dcaeList: $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + // $log.debug('addFeedModalPopup: response: ' + JSON.stringify(response)); + if (response == null) { + // $log.debug('addFeedModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Add Failed', + 'Failed to add feed:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable() + } + }); + }; + + /** + * Shows a modal pop-up to edit a feed. + * Passes data in via an object named "message". + * Always updates the table, even on failure, to discard + * user-entered changes that were not persisted. + */ + $scope.dbcapp.editFeedModalPopup = function(feed) { + $scope.dbcapp.editFeed = feed; + var modalInstance = $modal.open({ + templateUrl : 'edit_feed_popup.html', + controller : 'feedPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + feed : $scope.dbcapp.editFeed, + feedList : $scope.dbcapp.tableData + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('editFeedModalPopup: user closed dialog'); + } + else { + // $log.debug('editFeedModalPopup: response: ' + JSON.stringify(response)); + if (response.error != null) + modalService.showFailure('Edit Failed', + 'Failed to edit feed ' + feed.feedName + + '\n' + response.error); + // refresh in all cases + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion of a feed. + * On successful completion, updates the table. + */ + $scope.dbcapp.deleteFeedModalPopup = function(feed) { + modalService.popupConfirmWin("Confirm", "Delete the feed: " + + feed.feedName + "\nContinue?", function() { + DRFeedService.deleteFeed(feed.feedId).then( + function(response) { + // $log.debug('deleteFeedModalPopup: response: ' + JSON.stringify(response)); + if (response.error != null) { + $log.error('deleteFeedModalPopup: failed to delete: ' + response.error); + modalService.showFailure('Delete Failed', + 'Failed to delete feed ' + feed.feedName + + '\n' + response.error); + } + else { + // success, get the updated list. + $scope.dbcapp.loadTable() + } + }, + function(error) { + $log.error('deleteFeed failed'); + modalService.showFailure('Delete Failed', 'feedListCtrl failed to delete object: ' + + JSON.stringify(error)); + }); + }) + }; + + /** + * Shows a modal pop-up with all publishers and subscribers of a feed. + * Passes data in via an object named "message". + */ + $scope.dbcapp.showFeedPubsSubsModalPopup = function(feed) { + var modalInstance = $modal.open({ + templateUrl : 'feed_pub_sub_list_popup.html', + controller : 'feedPubSubListPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + feed : feed + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + // No response expected. + }); + }; + + /** + * Shows a modal pop-up to add a feed publisher. + * Passes data in via an object named "message". + * On successful completion, updates the table. + */ + $scope.dbcapp.addFeedPublisherModalPopup = function(feed) { + $scope.dbcapp.editPub = { feedId : feed.feedId } + var modalInstance = $modal.open({ + templateUrl : 'edit_pub_popup.html', + controller : 'pubPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + pub : $scope.dbcapp.editPub, + pubList : [], + dcaeList: $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('addFeedPublisherModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Add Publisher Failed', + 'Failed to add publisher to feed:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to add a feed subscriber. + * Passes data in via an object named "message". + * On successful completion, updates the table. + */ + $scope.dbcapp.addFeedSubscriberModalPopup = function(feed) { + // Create a subscriber object with the feed ID + $scope.dbcapp.editSub = { feedId : feed.feedId } + var modalInstance = $modal.open({ + templateUrl : 'edit_sub_popup.html', + controller : 'subPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + sub : $scope.dbcapp.editSub, + subList : [], + dcaeList: $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('addFeedSubscriberModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Add Subscriber Failed', + 'Failed to add subscriber to feed:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable(); + } + }); + }; + + // Populate the table on load. + $scope.dbcapp.loadTable(); + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-popup-controller.js new file mode 100644 index 0000000..4efef98 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-popup-controller.js @@ -0,0 +1,125 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('feedPopupCtrl', function($scope, $log, $modalInstance, modalService, message, DRFeedService) { + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + if (message.feed == null) { + $scope.dbcapp.label = 'Add Feed'; + // Must add publisher with a feed. + $scope.dbcapp.editFeed = + { + pubs: [ + { username: null } + ] + }; + } + else { + $scope.dbcapp.label = 'Edit Feed'; + $scope.dbcapp.editFeed = message.feed; + } + $scope.dbcapp.dcaeList = message.dcaeList; + + // for populating selection boxes on add and edit popup templates + $scope.dbcapp.asprClassificationList = [ + "unclassified", + "Non-Sensitive Customer Data", + "AT&T Proprietary (Internal Use Only)", + "AT&T Proprietary (Secure Restricted)", + "AT&T Proprietary (Restricted)", + "AT&T Proprietary (Sensitive Personal Information)", + "Customer Sensitive Data", + "Customer Data Conduit", + ]; + + /** + * Validates content of user-editable fields. + * Uses the list in message.feedList + * Returns null if all is well, + * a descriptive error message otherwise. + */ + $scope.dbcapp.validateFeed = function(feed) { + if (feed == null) + return "No data found.\nPlease enter some values."; + if (feed.feedName == null || feed.feedName.trim() == '') + return "Name is required.\nPlease enter a value."; + if (feed.feedVersion == null || feed.feedVersion.trim() == '') + return "Version is required.\nPlease enter a value."; + if (feed.feedDescription == null || feed.feedDescription.trim() == '') + return "Description is required.\nPlease enter a value."; + if (feed.asprClassification == null || feed.asprClassification.trim() == '') + return "ASPR Classification is required.\nPlease select a value."; + for (var x in message.feedList) { + // Ignore the one being edited. + if (message.feedList[x].feedId == feed.feedId) + continue; + if (message.feedList[x].feedName == feed.feedName) + return "Name " + feed.feedName + " exists.\n" + + "Please choose a different name."; + } + // Extra validation if adding a new feed - check first publisher + if (feed.feedId == null && feed.pubs != null && feed.pubs[0] != null) { + $log.info('validateFeed: pubs[0] is ' + JSON.stringify(feed.pubs[0])); + if (feed.pubs[0].dcaeLocationName == null) + return "DCAE Location is required.\nPlease select a value."; + // username, userpwd are optional + } + return null; + } + + $scope.dbcapp.saveFeed = function(feed) { + var validateMsg = $scope.dbcapp.validateFeed(feed); + if (validateMsg != null) { + modalService.showFailure("Invalid Content", validateMsg); + return; + } + + if (feed.feedId == null) { + // No id, so create a new one + DRFeedService.addFeed(feed) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('feedPopupCtrl: error while adding: ' + error); + } + ); + } + else { + // Has id, so update an existing one + DRFeedService.updateFeed(feed) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('feedPopupCtrl: error while updating: ' + error); + } + ); + } + + }; + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-pub-sub-list-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-pub-sub-list-popup-controller.js new file mode 100644 index 0000000..3c15370 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-pub-sub-list-popup-controller.js @@ -0,0 +1,38 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('feedPubSubListPopupCtrl', function($scope, $log, $modalInstance, modalService, message) { + + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + $scope.dbcapp.label = 'Pub/Sub of Feed ' + message.feed.feedName; + + // Source of data table + $scope.dbcapp.showFeed = message.feed; + + // $log.debug('feedPubSubListPopupCtrl: showFeed.pubs is ' + JSON.stringify($scope.dbcapp.showFeed.pubs)); + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-service.js new file mode 100644 index 0000000..a3700dd --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-service.js @@ -0,0 +1,105 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.factory('DRFeedService', function ($http, $q, $log) { + return { + /** + * Gets one page of data router feed objects. + * @param {Number} pageNum - page number; e.g., 1 + * @param {Number} viewPerPage - number of items per page; e.g., 25 + * @return {JSON} Response object from remote side + */ + getFeedsByPage: function(pageNum,viewPerPage) { + // cache control for IE + var cc = "&cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'dr_feed?pageNum=' + pageNum + '&viewPerPage=' + viewPerPage + cc, + cache: false, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRFeedService.getFeedsByPage: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRFeedService.getFeedsByPage failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Creates a new feed. + addFeed: function(feed) { + return $http({ + method: 'POST', + url: 'dr_feed', + data: feed, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRFeedService.addFeed: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRFeedService.addFeed failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Updates an existing feed. + updateFeed: function(feed) { + return $http({ + method: 'PUT', + url: 'dr_feed/' + feed.feedId, + data: feed, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRFeedService.updateFeed: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRFeedService.updateFeed failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Deletes the feed with the specified ID. + deleteFeed: function(feedId) { + return $http({ + method: 'DELETE', + url: 'dr_feed/' + feedId, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRFeedService.deleteFeed: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRFeedService.deleteFeed failed: ' + error); + return $q.reject(error.data); + }); + }, + + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-list-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-list-controller.js new file mode 100644 index 0000000..ba90900 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-list-controller.js @@ -0,0 +1,149 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('drPubListCtrl', function($scope, $log, $modal, modalService, DRPubService) { + + // populates the list of Data Router publishers. + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + // models for controls on screen + $scope.dbcapp.tableData=[]; + $scope.dbcapp.currentPageNum=1; + $scope.dbcapp.totalPages=1; + $scope.dbcapp.viewPerPage = 100; + $scope.dbcapp.viewPerPageOptions = [ + { index : 0, value : 100 }, + { index : 1, value : 500 }, + { index : 2, value : 1000 }, + { index : 3, value : 2500 } + ]; + // other + $scope.dbcapp.errMsg=null; + $scope.dbcapp.isDataLoading=true; + $scope.dbcapp.isRequestFailed=false; + + /** + * Answers an array of the specified size - makes Angular iteration easy. + */ + $scope.dbcapp.buildArraySizeN = function(num) { + // $log.debug("buildArraySizeN: invoked with " + num); + return new Array(num); + } + + /** + * Loads the table of data router publishers. + * + * Interprets the remote controller's response and copies to scope + * variables. The response is either list to be assigned to tableData, or an + * error to be shown. + */ + $scope.dbcapp.loadTable = function() { + $scope.dbcapp.isDataLoading = true; + DRPubService.getPubsByPage($scope.dbcapp.currentPageNum,$scope.dbcapp.viewPerPage) + .then(function(jsonObj) { + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + $scope.dbcapp.tableData = []; + } + else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.profileName = jsonObj.profileName; + $scope.dbcapp.dmaapName = jsonObj.dmaapName; + $scope.dbcapp.dcaeLocations = jsonObj.dcaeLocations; + $scope.dbcapp.totalPages = jsonObj.totalPages; + $scope.dbcapp.tableData = jsonObj.data; + } + $scope.dbcapp.isDataLoading = false; + },function(error){ + $log.error("drPubListCtrl.loadTable failed: " + error); + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = error; + $scope.dbcapp.tableData = []; + $scope.dbcapp.isDataLoading = false; + }); + }; + + /** + * Shows a modal pop-up to edit a publisher. + * Passes data in via an object named "message". + * Always updates the table, even on failure, to discard + * user-entered changes that were not persisted. + */ + $scope.dbcapp.editPubModalPopup = function(pub) { + $scope.dbcapp.editPub = pub; + var modalInstance = $modal.open({ + templateUrl : 'edit_pub_popup.html', + controller : 'pubPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + pub : $scope.dbcapp.editPub, + pubList : $scope.dbcapp.tableData, + dcaeList : $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('editPubModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Update Failed', + 'Failed to update publisher:\n' + response.error); + // refresh in all cases + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion of a publisher. + * On successful completion, updates the table. + */ + $scope.dbcapp.deletePubModalPopup = function(pub) { + modalService.popupConfirmWin("Confirm", "Delete the publisher: " + + pub.pubId + "\nContinue?", function() { + DRPubService.deletePub(pub.pubId).then( + function(response) { + if (response.error != null) + modalService.showFailure('Delete Failed', + 'Failed to delete publisher ' + pub.pubId + + '\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable() + }, + function(error) { + modalService.showFailure('Delete Failed', 'pubListCtrl failed to delete: ' + + JSON.stringify(error)); + }); + }) + }; + + // Populate the table on load. + $scope.dbcapp.loadTable(); + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-popup-controller.js new file mode 100644 index 0000000..07b80e4 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-popup-controller.js @@ -0,0 +1,82 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('pubPopupCtrl', function($scope, $log, $modalInstance, modalService, message, DRPubService) { + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + if (message.pub == null || message.pub.subId == null) + $scope.dbcapp.label = 'Add Publisher'; + else + $scope.dbcapp.label = 'Edit Publisher'; + $scope.dbcapp.editPub = message.pub; + $scope.dbcapp.dcaeList = message.dcaeList; + + /** + * Validates content of user-editable fields. + * Returns null if all is well, + * a descriptive error message otherwise. + */ + $scope.dbcapp.validatePub = function(pub) { + if (pub == null) + return "No data found.\nPlease enter some values."; + if (pub.dcaeLocationName == null) + return "DCAE Location is required.\nPlease select a value."; + return null; + } + + $scope.dbcapp.savePub = function(pub) { + var validateMsg = $scope.dbcapp.validatePub(pub); + if (validateMsg != null) { + modalService.showFailure("Invalid Content", validateMsg); + return; + } + + if (pub.pubId == null) { + // No id, so create a new one + DRPubService.addPub(pub) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('pubPopupCtrl: error while adding: ' + error); + } + ); + } + else { + // Has id, so update an existing one + DRPubService.updatePub(pub) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('pubPopupCtrl: error while updating: ' + error); + } + ); + } + + }; + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-service.js new file mode 100644 index 0000000..f317c0f --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-service.js @@ -0,0 +1,106 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.factory('DRPubService', function ($http, $q, $log) { + return { + /** + * Gets one page of data router publisher objects. + * @param {Number} pageNum - page number; e.g., 1 + * @param {Number} viewPerPage - number of items per page; e.g., 25 + * @return {JSON} Response object from remote side + */ + getPubsByPage: function(pageNum,viewPerPage) { + // cache control for IE + var cc = "&cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'dr_pub?pageNum=' + pageNum + '&viewPerPage=' + viewPerPage + cc, + cache: false, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRPubService.getPubsByPage: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRPubService.getPubsByPage failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Creates a new publisher. + addPub: function(pub) { + return $http({ + method: 'POST', + url: 'dr_pub', + data: pub, + responseType: 'json' }) + .then(function(response) { + // $log.debug('DRPubService.addPub: response: ' + JSON.stringify(response)); + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRPubService.addPub: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRPubService.addPub failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Updates an existing publisher. + updatePub: function(pub) { + return $http({ + method: 'PUT', + url: 'dr_pub/' + pub.pubId, + data: pub, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRPubService.updatePub: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRPubService.updatePub failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Deletes the publisher with the specified ID. + deletePub: function(pubId) { + return $http({ + method: 'DELETE', + url: 'dr_pub/' + pubId, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRPubService.deletePub: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRPubService.deletePub failed: ' + error); + return $q.reject(error.data); + }); + }, + + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-list-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-list-controller.js new file mode 100644 index 0000000..4faf695 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-list-controller.js @@ -0,0 +1,149 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('drSubListCtrl', function($scope, $log, $modal, modalService, DRSubService) { + + // populates the list of Data Router subscribers. + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + // models for controls on screen + $scope.dbcapp.tableData=[]; + $scope.dbcapp.currentPageNum=1; + $scope.dbcapp.totalPages=1; + $scope.dbcapp.viewPerPage = 100; + $scope.dbcapp.viewPerPageOptions = [ + { index : 0, value : 100 }, + { index : 1, value : 500 }, + { index : 2, value : 1000 }, + { index : 3, value : 2500 } + ]; + // other + $scope.dbcapp.errMsg=null; + $scope.dbcapp.isDataLoading=true; + $scope.dbcapp.isRequestFailed=false; + + /** + * Answers an array of the specified size - makes Angular iteration easy. + */ + $scope.dbcapp.buildArraySizeN = function(num) { + // $log.debug("buildArraySizeN: invoked with " + num); + return new Array(num); + } + + /** + * Loads the table of data router subscribers. + * + * Interprets the remote controller's response and copies to scope + * variables. The response is either list to be assigned to tableData, or an + * error to be shown. + */ + $scope.dbcapp.loadTable = function() { + $scope.dbcapp.isDataLoading = true; + DRSubService.getSubsByPage($scope.dbcapp.currentPageNum,$scope.dbcapp.viewPerPage) + .then(function(jsonObj){ + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + $scope.dbcapp.tableData = []; + } + else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.profileName = jsonObj.profileName; + $scope.dbcapp.dmaapName = jsonObj.dmaapName; + $scope.dbcapp.dcaeLocations = jsonObj.dcaeLocations; + $scope.dbcapp.totalPages = jsonObj.totalPages; + $scope.dbcapp.tableData = jsonObj.data; + } + $scope.dbcapp.isDataLoading = false; + },function(error){ + $log.error("drSubListCtrl.loadTable failed: " + error); + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = error; + $scope.dbcapp.tableData = []; + $scope.dbcapp.isDataLoading = false; + }); + }; + + /** + * Shows a modal pop-up to edit a subscriber. + * Passes data in via an object named "message". + * Always updates the table, even on failure, to discard + * user-entered changes that were not persisted. + */ + $scope.dbcapp.editSubModalPopup = function(sub) { + $scope.dbcapp.editSub = sub; + var modalInstance = $modal.open({ + templateUrl : 'edit_sub_popup.html', + controller : 'subPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + sub : $scope.dbcapp.editSub, + subList : $scope.dbcapp.tableData, + dcaeList : $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('editSubModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Update Failed', + 'Failed to update subscriber:\n' + response.error); + // refresh in all cases + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion of a subscriber. + * On successful completion, updates the table. + */ + $scope.dbcapp.deleteSubModalPopup = function(sub) { + modalService.popupConfirmWin("Confirm", "Delete the subscriber: " + + sub.subId + "\nContinue?", function() { + DRSubService.deleteSub(sub.subId).then( + function(response) { + if (response.error != null) + modalService.showFailure('Delete Failed', + 'Failed to delete subscriber ' + sub.subId + + '\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable() + }, + function(error) { + modalService.showFailure('Delete Failed', 'subListCtrl failed to delete: ' + + JSON.stringify(error)); + }); + }) + }; + + // Populate the table on load. + $scope.dbcapp.loadTable(); + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-popup-controller.js new file mode 100644 index 0000000..c920fc1 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-popup-controller.js @@ -0,0 +1,89 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('subPopupCtrl', function($scope, $log, $modalInstance, modalService, message, DRSubService) { + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + if (message.sub == null || message.sub.subId == null) + $scope.dbcapp.label = 'Add Subscriber'; + else + $scope.dbcapp.label = 'Edit Subscriber'; + $scope.dbcapp.editSub = message.sub; + $scope.dbcapp.dcaeList = message.dcaeList; + + /** + * Validates content of user-editable fields. + * Returns null if all is well, + * a descriptive error message otherwise. + */ + $scope.dbcapp.validateSub = function(sub) { + if (sub == null) + return "No data found.\nPlease enter some values."; + if (sub.dcaeLocationName == null) + return "DCAE Location is required.\nPlease select a value."; + if (sub.deliveryURL == null || sub.deliveryURL.trim() == '') + return "Delivery URL is required.\nPlease enter a value."; + if (sub.username == null || sub.username.trim() == '') + return "User Name is required.\nPlease enter a value."; + if (sub.userpwd == null || sub.userpwd.trim() == '') + return "Password is required.\nPlease enter a value."; + return null; + } + + $scope.dbcapp.saveSub = function(sub) { + var validateMsg = $scope.dbcapp.validateSub(sub); + if (validateMsg != null) { + modalService.showFailure("Invalid Content", validateMsg); + return; + } + + if (sub.subId == null) { + // No id, so create a new one + DRSubService.addSub(sub) + .then(function(response) { + // $log.debug('subPopupCtrl.saveSub: ' + JSON.stringify(response)); + $modalInstance.close(response); + }, + function (error) { + $log.error('subPopupCtrl: error while adding: ' + error); + } + ); + } + else { + // Has id, so update an existing one + DRSubService.updateSub(sub) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('subPopupCtrl: error while updating: ' + error); + } + ); + } + + }; + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-service.js new file mode 100644 index 0000000..f399282 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-service.js @@ -0,0 +1,105 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.factory('DRSubService', function ($http, $q, $log) { + return { + /** + * Gets one page of data router subscriber objects. + * @param {Number} pageNum - page number; e.g., 1 + * @param {Number} viewPerPage - number of items per page; e.g., 25 + * @return {JSON} Response object from remote side + */ + getSubsByPage: function(pageNum,viewPerPage) { + // cache control for IE + var cc = "&cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'dr_sub?pageNum=' + pageNum + '&viewPerPage=' + viewPerPage + cc, + cache: false, + responseType: 'json'}) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRSubService.getSubsByPage: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRSubService.getSubsByPage failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Creates a new subscriber. + addSub: function(sub) { + return $http({ + method: 'POST', + url: 'dr_sub', + data: sub, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRSubService.addSub: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRSubService.addSub failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Updates an existing subscriber. + updateSub: function(sub) { + return $http({ + method: 'PUT', + url: 'dr_sub/' + sub.subId, + data: sub, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRSubService.updateSub: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRSubService.updateSub failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Deletes the subscriber with the specified ID. + deleteSub: function(subId) { + return $http({ + method: 'DELETE', + url: 'dr_sub/' + subId, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRSubService.deleteSub: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRSubService.deleteSub failed: ' + error); + return $q.reject(error.data); + }); + }, + + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_add_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_add_popup_template.html new file mode 100644 index 0000000..d0d6d94 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_add_popup_template.html @@ -0,0 +1,104 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_edit_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_edit_popup_template.html new file mode 100644 index 0000000..3fc6d74 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_edit_popup_template.html @@ -0,0 +1,75 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_list.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_list.html new file mode 100644 index 0000000..1cff03b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_list.html @@ -0,0 +1,177 @@ + + + +
    +

    Data Router Feeds

    +
    + +
    + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    + Access Profile {{dbcapp.profileName}}, DMaaP Name {{dbcapp.dmaapName}} +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDNameVerDescriptionClassificationPublish URLLog URLOwnerStatusSuspP+SPubSubDel
    + + + + + + + + + + {{rowData.suspended | dbcYesNoFilter}} + + +
    + +P +
    +
    +
    + +S +
    +
    +
    + +
    +
    + +
    + Page Number: + + Page Count: + + Rows per Page: + +
    + +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_pub_sub_list_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_pub_sub_list_popup_template.html new file mode 100644 index 0000000..80fe26e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_pub_sub_list_popup_template.html @@ -0,0 +1,122 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_list.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_list.html new file mode 100644 index 0000000..300ec99 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_list.html @@ -0,0 +1,130 @@ + + + +
    +

    Feed Publishers

    +
    + +
    + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    + Access Profile {{dbcapp.profileName}}, DMaaP Name {{dbcapp.dmaapName}} +
    + + + + + + + + + + + + + + + + + + +
    Pub IDFeed IDDCAE Location NameStatusUser NameDelete
    + + + + + +
    + +
    +
    + +
    + Page Number: + + Page Count: + + Rows per Page: + +
    + +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_popup_template.html new file mode 100644 index 0000000..0e42f62 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_popup_template.html @@ -0,0 +1,60 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_list.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_list.html new file mode 100644 index 0000000..c5d2525 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_list.html @@ -0,0 +1,156 @@ + + + +
    +

    Feed Subscribers

    +
    + +
    + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    + Access Profile {{dbcapp.profileName}}, DMaaP Name {{dbcapp.dmaapName}} +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Sub IDFeed IDDCAE Location NameDelivery URLLog URLOwnerStatusSuspUser NameDelete
    + + + + + + + + {{rowData.suspended | dbcYesNoFilter}} + + +
    + +
    +
    + +
    + Page Number: + + Page Count: + + Rows per Page: + +
    + +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_popup_template.html new file mode 100644 index 0000000..10f923c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_popup_template.html @@ -0,0 +1,72 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-list-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-list-controller.js new file mode 100644 index 0000000..0c60aee --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-list-controller.js @@ -0,0 +1,194 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('dmaapAccessListCtrl', function ($scope, $log, $modal, modalService, DmaapAccessService) { + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + // Model for radio-button selection group. + // Uses database row ID as unique value. + $scope.dbcapp.selectDmaapModel = { id: null }; + $("#dialog").hide(); + $scope.dbcapp.isDataLoading=true; + + /** + * Loads the table of DMaaP access profiles. + * + * Interprets the remote controller's response and copies to scope + * variables. The response is either list to be assigned to tableData, + * or an error to be shown. + */ + $scope.dbcapp.loadTable = function() { + $scope.dbcapp.isDataLoading = true; + DmaapAccessService.getDmaapAccessList() + .then(function(jsonObj) { + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + $scope.dbcapp.tableData = []; + } else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.tableData = jsonObj.data; + $scope.dbcapp.updateDmaapAccessSelection(); + } + $scope.dbcapp.isDataLoading = false; + }, function(error) { + // Called with a string, not JSON obj. + $log.error("dmaapAccessListCtrl.getDmaapAccessList failed: " + error); + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = error; + $scope.dbcapp.tableData = []; + $scope.dbcapp.isDataLoading = false; + }); + }; + + /** + * Sets a value in the model for the radio-button selection group. + */ + $scope.dbcapp.updateDmaapAccessSelection = function() { + for (var i in $scope.dbcapp.tableData) { + var da = $scope.dbcapp.tableData[i]; + // Set radio button for the selected profile + // $log.info('dmaapAccessListCtrl: examining ' + JSON.stringify(da)); + if (da.selected) { + // $log.info('dmaapAccessListCtrl: selecting id ' + da.id); + $scope.dbcapp.selectDmaapModel.id = da.id; + } + } + }; + + /** + * Handles a click on radio button to select a profile. + */ + $scope.dbcapp.selectDmaapAccess = function(dmaapAccess) { + if (dmaapAccess == null || dmaapAccess.id == null) + $log.error('selectDmaapAccess invoked with null'); + else + DmaapAccessService.setSelectedDmaapAccess(dmaapAccess.id); + }; + + /** + * Shows a modal pop-up to add a DMaaP access profile. + * Passes data in via an object named "message". + * On successful completion, updates the profile list. + * + * After implementing DE238329, this is never called. + */ + $scope.dbcapp.addDmaapAccessModalPopup = function() { + $scope.dbcapp.editDmaapAccess = null; + var modalInstance = $modal.open({ + templateUrl: 'edit_dmaap_access_popup.html', + controller: 'dmaapAccessPopupCtrl', + resolve: { + message: function () { + var dataForPopup = { + dmaapAccess : $scope.dbcapp.editDmaapAccess, + dmaapAccessList : $scope.dbcapp.tableData + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('addDmaapAccessModelPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Add Profile Failed', + 'Failed to add access profile:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to edit a DMaaP access profile. + * Passes data in via an object named "message". + * On successful completion, updates the profile list. + */ + $scope.dbcapp.editDmaapAccessModalPopup = function(dmaapAccess) { + // edit a copy, not the model for the table row. + $scope.dbcapp.editDmaapAccess = JSON.parse(JSON.stringify(dmaapAccess)); + var modalInstance = $modal.open({ + templateUrl: 'edit_dmaap_access_popup.html', + controller: 'dmaapAccessPopupCtrl', + resolve: { + message: function () { + var dataForPopup = { + dmaapAccess : $scope.dbcapp.editDmaapAccess, + dmaapAccessList : $scope.dbcapp.tableData + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('addDmaapAccessModelPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Edit Profile Failed', + 'Failed to edit access profile:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion of a DMaaP access profile. + * On successful completion, updates the profile list. + * + * After implementing DE238329, this is never called. + */ + $scope.dbcapp.deleteDmaapAccess = function(dmaapAccess) { + modalService.popupConfirmWin("Confirm", "Delete the DMaaP access profile: " + + dmaapAccess.name + "\nContinue?", + function() { + // $log.debug('deleteDmaapAccess: deleting id ' + dmaapAccess.id); + DmaapAccessService.deleteDmaapAccess(dmaapAccess.id).then( + function(response) { + if (response.error != null) { + $log.error('deleteDmaapAccess: failed to delete: ' + response.error); + modalService.showFailure('Delete Failed', + 'Failed to delete access profile:\n' + response.error); + } + else { + // success, get the updated list. + $scope.dbcapp.loadTable() + } + }, + function(error) { + $log.error('deleteDmaapAccess failed: ' + error); + modalService.showFailure("Fail", "dmaapAccessListCtrl failed to delete object"); + }); + }) + }; + + // Populate the table on load. + $scope.dbcapp.loadTable(); + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-popup-controller.js new file mode 100644 index 0000000..d4d2301 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-popup-controller.js @@ -0,0 +1,125 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('dmaapAccessPopupCtrl', function($scope, $log, $modalInstance, modalService, message, DmaapAccessService) { + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + if (message.dmaapAccess == null) + $scope.dbcapp.label = 'Add Access Profile'; + else + $scope.dbcapp.label = 'Edit Access Profile'; + $scope.dbcapp.editDmaapAccess = message.dmaapAccess; + + /** + * Validates content of user-editable fields. + * Returns null if all is well, + * a descriptive error message otherwise. + */ + $scope.dbcapp.validateProfile = function(dmaapAccess) { + if (dmaapAccess == null) + return "No data found.\nPlease enter some values."; + if (dmaapAccess.name == null || dmaapAccess.name.trim() == '') + return "Name is required.\nPlease enter a value."; + // User cannot edit URL + //if (dmaapAccess.dmaapUrl == null || dmaapAccess.dmaapUrl.trim() == '') + // return "URL is required.\nPlease enter a value."; + //if (dmaapAccess.dmaapUrl.toLowerCase().indexOf('http') != 0) + // return "Unexpected URL prefix.\nPlease enter a URL starting with 'http'."; + for (var x in message.dmaapAccessList) { + // $log.debug('saveDmaapAccess: checking item >' + message.dmaapAccessList[x].name + '<'); + // Ignore the name in the one being edited. + if (message.dmaapAccessList[x].id == dmaapAccess.id) + continue; + if (message.dmaapAccessList[x].name == dmaapAccess.name) + return "Name " + dmaapAccess.name + " exists.\nPlease enter a different name."; + } + return null; + } + + /** + * Tests the URL for validity. Shows a modal dialog to display test result. + * Returns nothing. + */ + $scope.dbcapp.testDmaapAccess = function(dmaapAccess) { + if (dmaapAccess == null || dmaapAccess.dmaapUrl == null || dmaapAccess.dmaapUrl.trim() == '') { + modalService.showFailure("Missing Input", "No URL found.\nPlease enter a URL."); + return; + } + // result should have a data aggregate that's a serialized DMaaP object + DmaapAccessService.testDmaapAccess(dmaapAccess) + .then(function(response) { + if (response.error != null) + modalService.showFailure("Invalid Content", response.error); + else + modalService.showSuccess("Valid URL", "DMaaP name is " + response.data.dmaapName) + }, + function (error) { + modalService.showFailure("Invalid Content", error); + } + ); + } + + /** + * Validates the content; on success, calls service to save it. + */ + $scope.dbcapp.saveDmaapAccess = function(dmaapAccess) { + var validateMsg = $scope.dbcapp.validateProfile(dmaapAccess); + if (validateMsg != null) { + modalService.showFailure("Invalid Content", validateMsg); + return; + } + + // Set the selected flag if this is the only access profile. + if (dmaapAccess.id == null && message.dmaapAccessList.length == 0) + dmaapAccess.selected = true; + + if (dmaapAccess.id == null) { + // No id, so create a new one + DmaapAccessService.addDmaapAccess(dmaapAccess) + .then(function(dmaapAccessList) { + + $modalInstance.close(dmaapAccessList); + }, + function (error) { + $log.error('dmaapAccessPopupCtrl: error while adding: ' + error); + } + ); + } + else { + // Has id, so update an existing one + DmaapAccessService.updateDmaapAccess(dmaapAccess) + .then(function(dmaapAccessList) { + $modalInstance.close(dmaapAccessList); + }, + function (error) { + $log.error('dmaapAccessPopupCtrl: error while updating: ' + error); + } + ); + } + + }; + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-service.js new file mode 100644 index 0000000..8e92c67 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-service.js @@ -0,0 +1,160 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.factory('DmaapAccessService', function ($http, $q, $log) { + return { + /** + * Gets the list of DMaaP access profiles for the current user (not paginated). + * @return {JSON} Response object from remote side + */ + getDmaapAccessList: function() { + // cache control for IE + var cc = "?cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'dmaap_access' + cc, + cache: false, + responseType: 'json'}) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DmaapAccessService.getDmaapAccessList: response.data null or not object'); + else + return response.data; + }, function(error) { + $log.error('DmaapAccessService.getDmaapAccessList failed: ' + error.data); + return $q.reject(error.data); + }); + }, + + // Gets and returns the selected DMaaP access profile for the current user. + getSelectedDmaapAccess: function() { + // cache control for IE + var cc = "?cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'select_dmaap_access' + cc, + cache: false, + responseType: 'json'}) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DmaapAccessService.getSelectedDmaapAccess: response.data null or not object'); + else + return response.data; + }, function(error) { + $log.error('DmaapAccessService.getSelectedDmaapAccess failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Selects the specified DMaaP access profile for the current user. + // Returns nothing. + setSelectedDmaapAccess: function(dmaapId) { + return $http({ + method: 'PUT', + url: 'select_dmaap_access/' + dmaapId, + responseType: 'json' }) + .then(function(response) { + // successful response is status:200 + // $log.info('setSelectedDmaapAccess complete: ' + JSON.stringify(response)); + }, function(error) { + $log.error('DmaapAccessService.setSelectedDmaapAccess failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Creates a new DMaaP access profile for the current user. + // Returns the current DMaaP access list. + addDmaapAccess: function(dmaapAccess) { + return $http({ + method: 'POST', + url: 'dmaap_access', + data: dmaapAccess, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DmaapAccessService.addDmaapAccess: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DmaapAccessService.addDmaapAccess failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Updates an existing DMaaP access profile for the current user + // Returns the current DMaaP access list. + updateDmaapAccess: function(dmaapAccess) { + return $http({ + method: 'PUT', + url: 'dmaap_access/' + dmaapAccess.id, + data: dmaapAccess, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DmaapAccessService.updateDmaapAccess: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DmaapAccessService.updateDmaapAccess failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Deletes the specified DMaaP access profile for the current user. + // Returns the current DMaaP access list. + deleteDmaapAccess: function(dmaapId) { + return $http({ + method: 'DELETE', + url: 'dmaap_access/' + dmaapId, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DmaapAccessService.deleteDmaapAccess: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DmaapAccessService.deleteDmaapAccess failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Tests the URL in the access profile by fetching the DMaaP object from it. + testDmaapAccess: function(dmaapAccess) { + return $http({ + method: 'POST', + url: 'test_dmaap_access', + data: dmaapAccess, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DmaapAccessService.testDmaapAccess: response.data null or not object'); + else + return response.data; + }, function(error) { + $log.error('DmaapAccessService.testDmaapAccess failed: ' + error); + return $q.reject(error.data); + }); + }, + + + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_list.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_list.html new file mode 100644 index 0000000..381a850 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_list.html @@ -0,0 +1,108 @@ + + + +
    +

    DMaaP + Access Profiles

    +
    + +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    +
    + Click on a radio button to select that profile for use in this web application. +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + +
    SelectedNameURLMech ID
    + + +
    +
    + +
    diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_popup_template.html new file mode 100644 index 0000000..c64f28c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_popup_template.html @@ -0,0 +1,73 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/modal-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/modal-popup-controller.js new file mode 100644 index 0000000..00b6e3e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/modal-popup-controller.js @@ -0,0 +1,26 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('modalpopupController', function ($scope, $modalInstance, message) { + 'use strict'; + // The modalService from modalService.js requires this controller. + // One is provided by fusion/scripts/controllers/modelpopupController.js + // (yes, with spelling error) but that has cruft not required here. + $scope.message = message; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-home-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-home-controller.js new file mode 100644 index 0000000..5b9dbca --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-home-controller.js @@ -0,0 +1,66 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('dbcHomeCtrl', function($scope, $log, DmaapAccessService, ManifestService) { + // Loads info to show on the welcome page. + + // this object holds all app data and functions + $scope.dbcapp = {}; + $scope.dbcapp.selectedDmaapAccess=null; + $scope.dbcapp.isDataLoading = true; + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.manifest=null; + + DmaapAccessService.getSelectedDmaapAccess() + .then(function(jsonObj) { + // must match keys in java controller's method + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + } + else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.selectedDmaapAccess=jsonObj.data; + + // Next get the manifest + ManifestService.getManifest() + .then(function(jsonObj) { + // $log.debug("dbcHomeCtrl: getManifest returned " + JSON.stringify(jsonObj)); + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + } + else { + $scope.dbcapp.manifest=jsonObj.manifest; + } + },function(error){ + $log.error("dbcHomeCtrl getManifest failed: " + error); + }); + + } + $scope.dbcapp.isDataLoading=false; + },function(error){ + $log.error("dbcHomeCtrl: getSelectdDmaapAccess failed: " + error); + $scope.dbcapp.isDataLoading=false; + }); + + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-spa-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-spa-controller.js new file mode 100644 index 0000000..1be3ffc --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-spa-controller.js @@ -0,0 +1,50 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.config(function($routeProvider) { + $routeProvider + .when('/dmaap', { + templateUrl: 'app/dbcapp/dmaapaccess/dmaap_access_list.html', + controller : 'dmaapAccessListCtrl' + }) + .when('/dr_feed', { + templateUrl: 'app/dbcapp/datarouter/dr_feed_list.html', + controller : 'drFeedListCtrl' + }) + .when('/dr_pub', { + templateUrl: 'app/dbcapp/datarouter/dr_pub_list.html', + controller: 'drPubListCtrl' + }) + .when('/dr_sub', { + templateUrl: 'app/dbcapp/datarouter/dr_sub_list.html', + controller: 'drSubListCtrl' + }) + .when('/mr_topic', { + templateUrl: 'app/dbcapp/messagerouter/mr_topic_list.html', + controller : "mrTopicListCtrl" + }) + .when('/mr_client', { + templateUrl: 'app/dbcapp/messagerouter/mr_client_list.html', + controller: 'mrClientListCtrl' + }) + .otherwise({ + templateUrl: 'app/dbcapp/home/dbc_home_body.html', + controller: 'dbcHomeCtrl' + }); +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-style.css b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-style.css new file mode 100644 index 0000000..86944fb --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-style.css @@ -0,0 +1,77 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ + +/* Tweak height and width of password as set fn-ebz.css */ +input[type="password"].fn-ebz-text.dbcpassword { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + height: 40px; + width: 210px; + border: 1px solid gray; + font-size: .875rem; + padding-left: 10px; + margin-top: 0px; /* override */ + margin-right: 20px; +} + +input[type="text"].fn-ebz-text.dbcpagenum { + width: 85px; + height: 30px; + margin-right: 10px; +} + +/* Adjusts height and width to be narrow */ +select.fn-ebz-select.dbcpageselect { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + height: 30px; + width: 85px; + padding-left: 10px; + padding-right: 10px; + background-color: white; + color: black; + margin-top: 8px; + margin-right: 10px; + font-size: 12px; + appearance: none; /* not supported in IE */ + -webkit-appearance: none; /* not supported in IE */ + -moz-appearance: none; /* not supported in IE */ +} + +/* Adjusts height, width and top margin to match text fields */ +select.fn-ebz-select.dbcselect { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + height: 40px; + width: 210px; + padding-left: 10px; + padding-right: 10px; + background-color: white; + color: black; + margin-top: 0px; + margin-right: 10px; + font-size: 12px; + appearance: none; /* not supported in IE */ + -webkit-appearance: none; /* not supported in IE */ + -moz-appearance: none; /* not supported in IE */ +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-yn-filter.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-yn-filter.js new file mode 100644 index 0000000..79eb99d --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-yn-filter.js @@ -0,0 +1,26 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.filter('dbcYesNoFilter', + function() { + return function(input) { + return input ? 'Y' : 'N'; + } + } +); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_home_body.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_home_body.html new file mode 100644 index 0000000..9aa56d4 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_home_body.html @@ -0,0 +1,51 @@ + + +

    DMaaP Bus Controller

    + +

    Welcome to the DMaaP Bus Controller web application.

    + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    + Selected DMaaP access profile: +
      +
    • Name: {{dbcapp.selectedDmaapAccess.name}}
    • +
    • URL: {{dbcapp.selectedDmaapAccess.dmaapUrl}}
    • +
    + + Manifest + information: +
      +
    • Build-Number: {{dbcapp.manifest['Build-Number']}}
    • +
    • Build-Time: {{dbcapp.manifest['Build-Time']}}
    • +
    +
    +
    + +
    diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_popup_templates.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_popup_templates.html new file mode 100644 index 0000000..cf2b77d --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_popup_templates.html @@ -0,0 +1,73 @@ + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_spa.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_spa.html new file mode 100644 index 0000000..d9d2546 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_spa.html @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/manifest-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/manifest-service.js new file mode 100644 index 0000000..03f143a --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/manifest-service.js @@ -0,0 +1,43 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.factory('ManifestService', function ($http, $q, $log) { + return { + // Gets and returns the manifest for the webapp. + getManifest: function() { + // cache control for IE + var cc = "?cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'manifest' + cc, + cache: false, + responseType: 'json'}) + .then(function(response) { + // $log.debug("ManifestService.getManifest: " + JSON.stringify(response)); + if (response.data == null || typeof response.data != 'object') + return $q.reject('ManifestService.getManifest: response.data null or not object'); + else + return response.data; + }, function(error) { + $log.error('ManifestService.getManifest failed: ' + error.data); + return $q.reject(error.data); + }); + } + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-list-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-list-controller.js new file mode 100644 index 0000000..e6b11f8 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-list-controller.js @@ -0,0 +1,154 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('mrClientListCtrl', function($scope, $log, $modal, modalService, MRClientService){ + + // populates the table of Message Router clients + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + // models for controls on screen + $scope.dbcapp.tableData=[]; + $scope.dbcapp.currentPageNum=1; + $scope.dbcapp.totalPages=1; + $scope.dbcapp.viewPerPage = 100; + $scope.dbcapp.viewPerPageOptions = [ + { index : 0, value : 100 }, + { index : 1, value : 500 }, + { index : 2, value : 1000 }, + { index : 3, value : 2500 } + ]; + // other + $scope.dbcapp.errMsg=null; + $scope.dbcapp.isDataLoading=true; + $scope.dbcapp.isRequestFailed=false; + + /** + * Answers an array of the specified size - makes Angular iteration easy. + */ + $scope.dbcapp.buildArraySizeN = function(num) { + // $log.debug("buildArraySizeN: invoked with " + num); + return new Array(num); + } + + /** + * Loads the table of message router clients. + */ + $scope.dbcapp.loadTable = function() { + $scope.dbcapp.isDataLoading = true; + MRClientService.getClientsByPage($scope.dbcapp.currentPageNum,$scope.dbcapp.viewPerPage) + .then(function(jsonObj){ + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + $scope.dbcapp.tableData = []; + } + else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.profileName = jsonObj.profileName; + $scope.dbcapp.dmaapName = jsonObj.dmaapName; + $scope.dbcapp.dcaeLocations = jsonObj.dcaeLocations; + $scope.dbcapp.totalPages = jsonObj.totalPages; + $scope.dbcapp.tableData = jsonObj.data; + } + $scope.dbcapp.isDataLoading=false; + },function(error){ + $log.error("mrClientListCtrl.loadTable failed: " + error); + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = error; + $scope.dbcapp.tableData = []; + $scope.dbcapp.isDataLoading = false; + }); + }; + + /** + * Shows a modal pop-up to edit a client. + * Passes data in via an object named "message". + * Always updates the table, even on failure, to discard + * user-entered changes that were not persisted. + */ + $scope.dbcapp.editClientModalPopup = function(client) { + $scope.dbcapp.editClient = client; + var modalInstance = $modal.open({ + templateUrl : 'edit_client_popup.html', + controller : 'clientPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + client : $scope.dbcapp.editClient, + clientList : $scope.dbcapp.tableData, + dcaeList : $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('editClientModalPopup: user closed dialog'); + } + else { + // $log.debug('editClientModalPopup: response: ' + JSON.stringify(response)); + if (response.error != null) + modalService.showFailure('Edit Failed', + 'Failed to edit client:\n' + response.error); + // refresh in all cases + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion of a client. + * On successful completion, updates the table. + */ + $scope.dbcapp.deleteClientModalPopup = function(client) { + modalService.popupConfirmWin("Confirm", + "Delete the client:\n" + client.mrClientId + "\nContinue?", + function() { + // $log.debug('deleteClientModalPopup: ' + topic.fqtn); + MRClientService.deleteClient(client.mrClientId) + .then( + function(response) { + // $log.debug('deleteClientModalPopup: response: ' + JSON.stringify(response)); + if (response.error != null) { + modalService.showFailure('Delete Failed', + 'Failed to delete client ' + client.mrClientId + + '\n' + response.error); + } + else { + // success, get the updated list. + $scope.dbcapp.loadTable() + } + }, + function(error) { + modalService.showFailure('Delete Failed', + 'Request failed to delete client ' + client.mrClientId + '\n' + + JSON.stringify(error)); + } + ); + }) + }; + + // Populate the table on load. + $scope.dbcapp.loadTable(); + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-popup-controller.js new file mode 100644 index 0000000..d4bb40b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-popup-controller.js @@ -0,0 +1,127 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('clientPopupCtrl', function($scope, $log, $modalInstance, modalService, message, MRClientService) { + + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + if (message.client == null || message.client.mrClientId == null) + $scope.dbcapp.label = 'Add Client'; + else + $scope.dbcapp.label = 'Edit Client'; + + // client object brings fqtn + $scope.dbcapp.editClient = message.client; + $scope.dbcapp.dcaeList = message.dcaeList; + + // Models for checkboxes + var PUB = 0; + var SUB = 1; + var VIEW = 2; + $scope.dbcapp.clientactionbox = []; + $scope.dbcapp.clientactionbox[PUB] = false; + $scope.dbcapp.clientactionbox[SUB] = false; + $scope.dbcapp.clientactionbox[VIEW] = false; + + // Morph the list of action strings into checks in boxes + for (var aidx in $scope.dbcapp.editClient.action) { + var action = $scope.dbcapp.editClient.action[aidx]; + // $log.debug('clientPopupCtrl: action idx ' + aidx + ', action ' + action); + if ("pub" == action) + $scope.dbcapp.clientactionbox[PUB] = true; + else if ("sub" == action) + $scope.dbcapp.clientactionbox[SUB] = true; + else if ("view" == action) + $scope.dbcapp.clientactionbox[VIEW] = true; + } + + /** + * Validates content of user-editable fields. + * Returns null if all is well, + * a descriptive error message otherwise. + */ + $scope.dbcapp.validateClient = function(client) { + if (client == null) + return "No data found.\nPlease enter some values."; + if (client.dcaeLocationName == null) + return "DCAE Location is required.\nPlease select a value."; + if (client.clientRole == null || client.clientRole.trim() == '') + return "Client role is required.\nPlease enter a value."; + // I don't like hardcoded strings, but what to do? + // IE does not support startsWith method + // $log.debug('validateClient: ' + client.clientRole.indexOf('com.openecomp.')); + if (client.clientRole.toLowerCase().indexOf('com.openecomp.') != 0) + return "Unexpected client role prefix.\nPlease enter a value starting with 'com.openecomp.'"; + if (client.action.length == 0) + return "An action is required.\nPlease select one or more actions."; + return null; + } + + $scope.dbcapp.saveClient = function(client) { + // Store list of action strings (if any) + var action_list = []; + for (var aidx in $scope.dbcapp.clientactionbox) { + if (aidx == PUB && $scope.dbcapp.clientactionbox[aidx]) + action_list.push('pub'); + else if (aidx == SUB && $scope.dbcapp.clientactionbox[aidx]) + action_list.push('sub'); + else if (aidx == VIEW && $scope.dbcapp.clientactionbox[aidx]) + action_list.push('view'); + } + $scope.dbcapp.editClient.action = action_list; + + var validateMsg = $scope.dbcapp.validateClient(client); + if (validateMsg != null) { + modalService.showFailure("Invalid Content", validateMsg); + return; + } + + if (client.mrClientId == null) { + // No id, so create a new one + MRClientService.addClient(client) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('clientPopupCtrl.saveClient: error while adding: ' + error); + } + ); + } + else { + // Has ID, so update an existing one + MRClientService.updateClient(client) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('clientPopupCtrl.saveClient: error while updating: ' + error); + } + ); + } + + }; // saveClient + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-service.js new file mode 100644 index 0000000..f5f8167 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-service.js @@ -0,0 +1,105 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.factory('MRClientService', function ($http, $q, $log) { + return { + /** + * Gets one page of message router client objects. + * @param {Number} pageNum - page number; e.g., 1 + * @param {Number} viewPerPage - number of items per page; e.g., 25 + * @return {JSON} Response object from remote side + */ + getClientsByPage: function(pageNum,viewPerPage) { + // cache control for IE + var cc = "&cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'mr_client?pageNum=' + pageNum + '&viewPerPage=' + viewPerPage + cc, + cache: false, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRClientService.getClientsByPage: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRClientService.getClientsByPage failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Creates a new client. + addClient: function(client) { + return $http({ + method: 'POST', + url: 'mr_client', + data: client, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRClientService.addClient: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRClientService.addClient failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Updates an existing client. + updateClient: function(client) { + return $http({ + method: 'PUT', + url: 'mr_client/' + client.mrClientId, + data: client, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRClientService.updateClient: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRClientService.updateClient failed: ' + JSON.stringify(error)); + return $q.reject(error.data); + }); + }, + + // Deletes the client with the specified ID + deleteClient: function(mrClientId) { + return $http({ + method: 'DELETE', + url: 'mr_client/' + mrClientId, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRClientService.deleteClient: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRClientService.deleteClient failed: ' + error); + return $q.reject(error.data); + }); + }, + + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-client-list-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-client-list-popup-controller.js new file mode 100644 index 0000000..4546ac9 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-client-list-popup-controller.js @@ -0,0 +1,36 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('topicClientListPopupCtrl', function($scope, $log, $modalInstance, modalService, message) { + + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + $scope.dbcapp.label = 'Clients of Topic ' + message.topic.topicName; + + // Source of data table + $scope.dbcapp.showTopic = message.topic; + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-list-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-list-controller.js new file mode 100644 index 0000000..46e1951 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-list-controller.js @@ -0,0 +1,248 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('mrTopicListCtrl', function($scope, $log, $modal, modalService, MRTopicService){ + + // populates the table of Message Router topics + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + // models for controls on screen + $scope.dbcapp.tableData=[]; + $scope.dbcapp.currentPageNum=1; + $scope.dbcapp.totalPages=1; + $scope.dbcapp.viewPerPage = 100; + $scope.dbcapp.viewPerPageOptions = [ + { index : 0, value : 100 }, + { index : 1, value : 500 }, + { index : 2, value : 1000 }, + { index : 3, value : 2500 } + ]; + // other + $scope.dbcapp.errMsg=null; + $scope.dbcapp.isDataLoading=true; + $scope.dbcapp.isRequestFailed=false; + + /** + * Answers an array of the specified size - makes Angular iteration easy. + */ + $scope.dbcapp.buildArraySizeN = function(num) { + // $log.debug("buildArraySizeN: invoked with " + num); + return new Array(num); + } + + /** + * Loads the table of message router topics. + */ + $scope.dbcapp.loadTable = function() { + $scope.dbcapp.isDataLoading = true; + MRTopicService.getTopicsByPage($scope.dbcapp.currentPageNum, $scope.dbcapp.viewPerPage) + .then(function(jsonObj){ + // must match keys in java controller's method + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + $scope.dbcapp.tableData = []; + } + else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.profileName = jsonObj.profileName; + $scope.dbcapp.dmaapName = jsonObj.dmaapName; + $scope.dbcapp.dcaeLocations = jsonObj.dcaeLocations; + $scope.dbcapp.totalPages = jsonObj.totalPages; + $scope.dbcapp.tableData = jsonObj.data; + } + $scope.dbcapp.isDataLoading=false; + },function(error){ + $log.error("mrTopicListCtrl.loadTable failed: " + error); + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = error; + $scope.dbcapp.tableData = []; + $scope.dbcapp.isDataLoading = false; + }); + }; + + /** + * Shows a modal pop-up to add a topic. Passes data in via an object named + * "message". On successful completion, updates the table. + */ + $scope.dbcapp.addTopicModalPopup = function() { + $scope.dbcapp.editTopic = null; + var modalInstance = $modal.open({ + templateUrl : 'edit_topic_popup.html', + controller : 'topicPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + topic : $scope.dbcapp.editTopic, + topicList : $scope.dbcapp.tableData + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('addFeedModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Add Failed', + 'Failed to add topic:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to edit a topic. + * Passes data in via an object named "message". + * Always updates the table, even on failure, to discard + * user-entered changes that were not persisted. + */ + $scope.dbcapp.editTopicModalPopup = function(topic) { + $scope.dbcapp.editTopic = topic; + var modalInstance = $modal.open({ + templateUrl : 'edit_topic_popup.html', + controller : 'topicPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + topic : $scope.dbcapp.editTopic, + topicList : $scope.dbcapp.tableData + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('editTopicModalPopup: user closed dialog'); + } + else { + // $log.debug('editTopicModalPopup: response: ' + JSON.stringify(response)); + if (response.error != null) + modalService.showFailure('Edit Failed', + 'Failed to edit topic ' + topic.fqtn + + '\n' + response.error); + // refresh in all cases + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion of a topic. On successful + * completion, updates the table. + */ + $scope.dbcapp.deleteTopicModalPopup = function(topic) { + modalService.popupConfirmWin("Confirm", + "Delete the topic:\n" + topic.fqtn + "\nContinue?", + function() { + // $log.debug('deleteTopicModalPopup: ' + topic.fqtn); + MRTopicService.deleteTopic(topic.fqtn) + .then( + function(response) { + // $log.debug('deleteTopicModalPopup: response: ' + JSON.stringify(response)); + if (response.error != null) { + $log.error('deleteTopicModalPopup: failed to delete: ' + response.error); + modalService.showFailure('Delete Failed', + 'Failed to delete topic ' + topic.fqtn + + '\n' + response.error); + } + else { + // success, get the updated list. + $scope.dbcapp.loadTable() + } + }, + function(error) { + modalService.showFailure('Delete Failed', + 'Request failed to delete topic ' + topic.fqtn + '\n' + + JSON.stringify(error)); + } + ); + }) + }; + + /** + * Shows a modal pop-up with all clients of a topic. + * Passes data in via an object named "message". + */ + $scope.dbcapp.showTopicClientsModalPopup = function(topic) { + var modalInstance = $modal.open({ + templateUrl : 'topic_client_list_popup.html', + controller : 'topicClientListPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + topic : topic + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + // No response expected. + }); + }; + + /** + * Shows a modal pop-up to add a client to a topic + * Passes data in via an object named "message". + * On successful completion, updates the table. + */ + $scope.dbcapp.addTopicClientModalPopup = function(topic) { + $scope.dbcapp.editClient = { fqtn : topic.fqtn } + var modalInstance = $modal.open({ + templateUrl : 'edit_client_popup.html', + controller : 'clientPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + client : $scope.dbcapp.editClient, + clientList : [], // empty list + dcaeList : $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('addTopicClientModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Add Client Failed', + 'Failed to add client to topic:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable(); + } + }); + }; + + // Populate the table on load. + $scope.dbcapp.loadTable(); + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-popup-controller.js new file mode 100644 index 0000000..4d885c5 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-popup-controller.js @@ -0,0 +1,83 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.controller('topicPopupCtrl', function($scope, $log, $modalInstance, modalService, message, MRTopicService) { + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + if (message.topic == null) + $scope.dbcapp.label = 'Add Topic'; + else + $scope.dbcapp.label = 'Edit Topic'; + $scope.dbcapp.editTopic = message.topic; + + /** + * Validates content of user-editable fields. + * Returns null if all is well, + * a descriptive error message otherwise. + */ + $scope.dbcapp.validateTopic = function(topic) { + if (topic == null) + return "No data found.\nPlease enter some values."; + if (topic.topicName == null || topic.topicName.trim() == '') + return "Name is required.\nPlease enter a value."; + if (topic.topicDescription == null || topic.topicDescription.trim() == '') + return "Description is required.\nPlease enter a value."; + return null; + } + + $scope.dbcapp.saveTopic = function(topic) { + var validateMsg = $scope.dbcapp.validateTopic(topic); + if (validateMsg != null) { + modalService.showFailure("Invalid Content", validateMsg); + return; + } + + if (topic.fqtn == null) { + // No fqtn, so create a new one + MRTopicService.addTopic(topic) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('topicPopupCtrl.saveTopic: error while adding: ' + error); + } + ); + } + else { + // Has fqtn, so update an existing one + MRTopicService.updateTopic(topic) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('topicPopupCtrl.saveTopic: error while updating: ' + error); + } + ); + } + + }; // saveTopic + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-service.js new file mode 100644 index 0000000..49642f7 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-service.js @@ -0,0 +1,105 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +app.factory('MRTopicService', function ($http, $q, $log) { + return { + /** + * Gets one page of message router topic objects. + * @param {Number} pageNum - page number; e.g., 1 + * @param {Number} viewPerPage - number of items per page; e.g., 25 + * @return {JSON} Response object from remote side + */ + getTopicsByPage: function(pageNum,viewPerPage) { + // cache control for IE + var cc = "&cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'mr_topic?pageNum=' + pageNum + '&viewPerPage=' + viewPerPage + cc, + cache: false, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRTopicService.getTopicsByPage: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRTopicService.getTopicsByPage failed: ' + JSON.stringify(error)); + return $q.reject(error.data); + }); + }, + + // Creates a new topic. + addTopic: function(topic) { + return $http({ + method: 'POST', + url: 'mr_topic', + data: topic, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRTopicService.addTopic: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRTopicService.addTopic failed: ' + JSON.stringify(error)); + return $q.reject(error.data); + }); + }, + + // Updates an existing topic. + updateTopic: function(topic) { + return $http({ + method: 'PUT', + url: 'mr_topic/' + topic.fqtn, + data: topic, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRTopicService.updateTopic: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRTopicService.updateTopic failed: ' + JSON.stringify(error)); + return $q.reject(error.data); + }); + }, + + // Deletes the topic with the specified FQTN. + deleteTopic: function(fqtn) { + return $http({ + method: 'DELETE', + url: 'mr_topic/' + fqtn, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRTopicService.deleteTopic: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRTopicService.deleteTopic failed: ' + JSON.stringify(error)); + return $q.reject(error.data); + }); + }, + + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_list.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_list.html new file mode 100644 index 0000000..1dac153 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_list.html @@ -0,0 +1,142 @@ + + + +
    +

    Topic Clients

    +
    + +
    + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    + Access Profile {{dbcapp.profileName}}, DMaaP Name {{dbcapp.dmaapName}} +
    + + + + + + + + + + + + + + + + + + + + + +
    MR Client IDDCAE Location NameQualified Topic NameActionClient RoleLast ModifiedStatusTopic URLDelete
    + + + + + + + + +
    + +
    +
    + +
    + Page Number: + + Page Count: + + Rows per Page: + +
    + +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_popup_template.html new file mode 100644 index 0000000..8f45073 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_popup_template.html @@ -0,0 +1,68 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_client_list_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_client_list_popup_template.html new file mode 100644 index 0000000..4976138 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_client_list_popup_template.html @@ -0,0 +1,74 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_list.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_list.html new file mode 100644 index 0000000..4ed4726 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_list.html @@ -0,0 +1,154 @@ + + + +
    +

    Message Router Topics

    +
    + +
    + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    + Access Profile {{dbcapp.profileName}}, DMaaP Name {{dbcapp.dmaapName}} +
    + + + + + + + + + + + + + + + + + + + + + + + +
    Qualified NameNameDescriptionOwnerStatusClAddDelete
    + + + + + + + +
    + +
    +
    +
    + +
    +
    + +
    + Page Number: + + Page Count: + + Rows per Page: + +
    + +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_popup_template.html new file mode 100644 index 0000000..b83c698 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_popup_template.html @@ -0,0 +1,62 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/bg-top-bar.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/bg-top-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0a7571f9c7a3bbba1dff3b50d7124eea301094 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^i9qbY!2~2*r}U)*sd=6*jv*Dd-d+#nVh|8<2|P9F z?U{cc-m)(hnHzcN?KzvIQ>rISG`F-Jnk2|!W0fvqc*!*Ou*da^mWj9Z7rTopgE%>6 z{ci;OkH~#IA@{Mvy+6;a-)vV{;04p!Z+TBD_vCE*K9NVRQvRlLbxMB)5FJtexcsVV z>|;TO@6ZO<*mg%4v!|D-8Yf1P^WCQ$E}bBK$kLj My85}Sb4q9e0OMm_H~;_u literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/checkmark_yes.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/checkmark_yes.gif new file mode 100644 index 0000000000000000000000000000000000000000..113cd346579a9e879c731b17ced34118f83ecfc8 GIT binary patch literal 145 zcmZ?wbhEHblw=TLSj5I4eO~(i|Nl-EY3*CiZoK^T^4lLkE&~ID;!hSv1_m|;9Uz+l zq}G8sEMwOl83V5yOgqAP9!W?tEhvo5)Du(7J0-sARmC~cH5c8wPI`SzYMj%XTEy$Q w<0$*g9Ij-)*fx*J>t?8H`+wZcA{wQ|%)*^4?RLX-W}G#z-bd+oJ`4=j0LvvdhX4Qo literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/downCaret.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/downCaret.gif new file mode 100644 index 0000000000000000000000000000000000000000..304b645596619647561210626f07246548e42b10 GIT binary patch literal 2951 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 literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/home-icon.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/home-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bf09c8569fcfbcdac19d197ea518893a17023326 GIT binary patch literal 3483 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 literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/cut.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/cut.gif new file mode 100644 index 0000000000000000000000000000000000000000..2dcdc8471a2824b42d79d4a603e9e12884eb46be GIT binary patch literal 532 zcmZ?wbhEHb6krfwc*Xz%|NsBjkDG6pxWFiB(Zkn2Ofy!P=d3YFU1D9ZUN>%vSqO5XNRvnKX>o#otIyo z>NdJGZT0HfSF-5T(zEZU@3=g3=jFM3uC6C<<& zuRGnh`F#K8bCb7SG|HRi*tE{BdbwFvpJUyMka-sZrymcTdc=Ry{_q7C6V^V7T5`>| zcSrK3=jq$ur)_(ay7^V?vKtAj?)bE>i(7gvY4zRojZXvG*GKkmOPsPZYS|5-@4&ts zq=e#67DfgJZw4KZ`#^ERz+Twk-PGJ<)Y9Ie)6w0e+~VBRq|&UfJ<(gDNl9_KyOg({ zPJZuXon6deyLb)vK$d_2rsC3h-dDN|Yr*AH)aWJcMGp%(tuXj1I zc|5dyKec^AxPV2vf=IlCOTLCqz=%=8ic`ajRmP54$dFvgkzUJ_V9k|d(3oe>muAwM zY15l))0=G7oo=_cx2~?PY;0`*|Nj6000000000000000000000A^8LW004OaEC2ui z01yBW000M}fO&$0goTEOhjnyvac^#HYiekQa}5d$2?!h=8fJ!Y3|Dk&x*Fg#zP_n129&G zWiurtAVNSqM^uJmG9w>BK07&EQifqmLO(q^SU5#bhQ26Cg2c!cEkv?3A!O%Hmn&AP SOo;-;36mRm@F3b42mm`5U=?lv literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/export.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/export.gif new file mode 100644 index 0000000000000000000000000000000000000000..fdc232e984bcc4310e028a4b69636c76fbf278d5 GIT binary patch literal 613 zcmZ?wbhEHb6krfwcoxmj)YR0_(2$v#nV+A3?AWo?)YP=Jv`LdD9X@<`^5n^VeSO*4 z*{4sRo;!E$%$YOm>+Ajf{i~{~3JVLJot=}Cl1`pHnVXxNl9G~@m9=BXj^oFVPn|l| z#>VE*p+hAlC9SQkk&%)8{r%IYPv5?M`?F`y-oAbN<;xdOPtQAd?rhw+ao)UnMMXss z5fNr)W+o;k85tSz@$s>-vAcHdx^(H%j2SatzI?f2#foXurX4wQ#L>~w)z!72pddXx zefI3x0RaJac6R#u`gL`67cXA4x3{mTsPORcXm4*14-ao_Y}~SC%jeIZ_wU~y78X`n zS^40>gWB3!Cnu-o=H}|^YIAe*xVX5xckd=ACm%g}w70i6AtB-5!Gr(*|7V~hQ2fcl z$iNWIpaZfK6ekSqhZ>@rnp>K}xz$>`qD^^&nY_B2qL|dJ3>0iUrKL^yl+5{jEhU6l zN&72gaid*x5Fnn4`J*K!Z>- I6C;B)0J0&%)&G&E#qXHS|mY4YUBsi~=l4<9x* zHl99xdR0}`)TvYZ`uYkB3*Fq@yu7?JGBSdKf_CrTy>Q_|S6A2Bvu7Vaemo{7CND3q zprF9k*7o%2)A#S+pFe+oMMXt@ef{UppAQ{6v}Mbdo}QlA*w{I9=Iq$9!_UvJy1Lra z({tLiY3=Rp78VvsNl7P8oM>)tZftBUDk|#l@9*g7NK8yjPfx#d=T2Q+T~1Dpi;GJ@ zK*0X}`)ACUapT5~1q&9;n>X*-vuAJLzWw|6Z)9YowY9arzW$UcQ+$1WpFDZu?(S}C zYC3b~%(-*tZrHFPE-voq(WAY+y$J~k2M-=hOH2Fz|3AY30mYvzj0_Cn3_2kDL2<&s zzN;a;skx;^nWeR}Swg?7)4|-BUDNUPM+bke7{BKthv)J1or1%T3&w z)5t{8+R4tA+echTT1z85%$Q}Fn7W9x6dQ|Am6N5DXFeyp$ literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_copy.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_copy.gif new file mode 100644 index 0000000000000000000000000000000000000000..55e0d29b10068e9a26dcacaa8108e97d5872eacd GIT binary patch literal 361 zcmZ?wbhEHb6krfwxT?VL^XJb`pFW*9apK64BZm$hdiCnn=g*(NfB*je{rfX#&di%P z@Ad1~U%!4mb?VgdcXesYPGvitXM4ebhG;7nZW>cT1P$Y2cssYQxl literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_delete.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..8db60b8980f89c4ee5de5bf0ad9a26b07a507bd5 GIT binary patch literal 568 zcmZ?wbhEHb6krfwc*Xz%|NsAgSH|$FlJ!R!!~1%PyD5whGnoI^OZ;zB{9i8ktX%PR zm&3nnJHE_K{<@-Qk1xxqG>uc)x|hmq|4;J$zP0z;*4}?-*G)BN+Udf))0KIPGxKI= z<|Vew2O{MTM#&$FQMtdedyf;#9%t5hZsNxiwH~aU^l;teKY#xG{{8#cuU|iZ{`~Rd z$M^5wzkU1m_3PI!U%q_){Q1+TPai*i{P5w!`}gnPzJ2@V&70S+U%z_w>gCIq&!0bk z_UzfrnKP$OojPU86rkh5o*1fx;!hSv1_lQP9gqh=al*hpwZWmOxuvyPM^mG#TgSdl z(?EZcv8k1YwOy-*uC}hOp^2r2o`G$PhW1KbJtK>5jpdyhnmYQ%=9V@an%8gMYGi7* zyJ_z}Jwv0z4o5Y#wDt5(ozYZNRhF07)2(?&U09TtU+7lX9W4bh5iU+1$s_CUD2p?G nVO4s+SB{T^g^69NDNKZ0F!3M*vjC5%(m}@~ZF~+)j11NQuHdpF literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_edit.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_edit.gif new file mode 100644 index 0000000000000000000000000000000000000000..af1b38c0d6968cde21b86f7d7cb65f5c441d4eb1 GIT binary patch literal 576 zcmZ?wbhEHb6krfwc*Xz%|NsC0`|Z%*Z%6)qKmPq;)b~fxU++i%coh5fPTbc!@!#(! zKRFrt?QYJyYmJ|utp9Ya>ci#Aw-+itUa5X}x$@nW+7~xhe0aR;)6>1rPnSQry5{Yv z-0Qo_em>sx^ve3DS2wNdbiTT+D#}@+HC^xM4A1BL$}h}yJG~A~Gu-j5aq9`EzGJ2!A&m(TUZ$zNaJ|Mc?Sof)3TdpvH;3OPSB z=JNcspC>1Nes<&CqbvVEKmGXf!MbdKbssKm`Sak&*QZzh{Q2|y z_wQf7e*OIU^T&@L-@kwV_U+r(uV24>`SSVm=TDzLef;?G!-o&=-@kwL>eb7aFQ-hI z0t^jssL+W}{K>+|z!1%#1F{bkCk*U!8={+5U7?I$kE%qwkbJ*V4CLWG5jO~A0_ zn4BaFC#$f5=lL#q876KHK?`%Qn_7yRJnTZoW`2*4D(G8js~Fk&y}haIV(aW=@569+ iZIDtEYp<~5G!36AXJWmr53Kf2m3-k2uOmn(5#qrKG=R4C~?#=eTHQVd{T)(9yRu?CG zU7X^5dAjeVX}(ux_+6gix2)WDRfF%1B}vy8CEc0obfMqle4oeS0?SL2y)R7iT9{>W zw%vJAuGzV6w=tg#^XK>P-@ktS`uX$cj~_q2fB*jN+qbV@zkd1h<@4vy zpFVwh|Ni~kw{Ks+e*Nmzs~Iz9OqntT7*OBEKlX=yZ9PFKfL&BqC z<1bF;R(7=Ywm$eW@_g`Qc{?xnK+l%IjgwNl_escA$W$^N?cAUlx+cMrgZboSwV)X` mOM;f3Iw+gsAUGqc*-+Jy@j zc6D{Nwzd`(73JpUE?Tsxt*!0y<;xu%9WP(LT)A>(TwGjlZ*OL1W=ToO%$YNP{``68 z&K*}*S35g9Q&ZFI>}-2``+$Ie@6&DvzpFVxsv}t*HdG7A+KYsj3Oic9j^sKM1_ww?ZF=NJx z6)P+)En8YzY;0`azI_`R85t1~k(QSB@#DucXU~!NId;&5DVM znKNh3vuDp58ynA`KVM#6zIgHCtgNgD4<1aIFyY|AgAEN0mo8lj4-a3ye7V2B|CK9O zRaD=OYhgEIL1``bd25SJHA)!QcOwS?k)_>#w|r1Kptm-M`SUO z_5fqIli7AahM1>|V~EA+ zRdP`(kYX@0Ff`RQFw-@%2r)3XGB&j`FxECOure^P2$mH=(U6;;l9^VCTZ1Rx(iK1r N44$rjF6*2UngBRQG3)>U literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_flat_75_ffffff_40x100.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..e812e187b8133da98303f3db674c072693bef81e GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F2qYNp$opRhQcOwS?k)_Bce{j_0C}7R9+AaB z+5?Q;PG;Ky8A6^ejv*T7lYj6t@hpC#;TbB#aBAWwna#KLs)4eqC9V-ADTyViR>?)F zK#IZ0z|d6Jz)aW3BE-Pl%GlJ(z*yVBz{12WJ6 literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_55_fbf9ee_1x400.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..f28febb83533d858f336c53cb040221488b1da48 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12TF&T^vI^j=w#x$i?I+((tf;UXnmgbH|3oY>pC!)f}(GR!16S-u+#{ ze6YEqRkW=8vGl=5qArKM<9}TC-}iEvB{zdaTcX5$wyRTK&ALYGq)oZD3$! kU|RXUCGx5b?-VBQkUm|IuXOmYJrBRJgj{Vx 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 Q^5g_ikWrPcku(qaFX2Wbe*gdg literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_2e83ff_256x240.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..f2bf8388370920783b94285cb75827ce4b4cc1c5 GIT binary patch literal 4549 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 F{sUG;a@YU> literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_454545_256x240.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..d6169e8bf9389ab9b5b7d2c6f0c5fe3e4d363105 GIT binary patch literal 6992 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 literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_cd0a0a_256x240.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..49370189231d006600b0f0c2967cad1583eba634 GIT binary patch literal 4549 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 E2b3c!L;wH) literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/pipe.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..90dea7da364c9de5d35b9effd7e3e65f090280d8 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^OhBy2!3HEh_f_oyQVE_ejv*C{xo2a!8WaRr9$eeP zmva64Lg}AEQ@(8%=2f|U=)m($J?pBEAGPp2*PU=V+eVP#|Iq{krh^UUcV@`dU98cP zVz)^yVBEcoi9OJ?^+v~5N5y~nT(d=U{4(u6?qHmLQsFIYIb#XXE(T9mKbLh*2~7Y6 C$Ts`{ literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/selfArrow.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/selfArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..918b8b7fe98b5968f11abe54d90a49506898fb98 GIT binary patch literal 3658 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

    Ik)S`pXxkUtNw? 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 z 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 r=s; + + + + + + + --> + +

    diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/mocks/networkElements.yml b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/mocks/networkElements.yml new file mode 100644 index 0000000..9437cfa --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/mocks/networkElements.yml @@ -0,0 +1,95 @@ +elementsList: +- {displayShortname: eNB, enclosingDomain: RAN, tosca_id: com.trinity.ran.enodeb} +- {displayShortname: SIAD, enclosingDomain: RAN, tosca_id: com.trinity.ran.siad} +- {displayShortname: NodeB, enclosingDomain: RAN, tosca_id: com.trinity.ran.nb} +- {displayShortname: MGCF eMSC, enclosingDomain: RAN, tosca_id: com.trinity.ran.emsc} +- {displayShortname: RNC, enclosingDomain: RAN, tosca_id: com.trinity.ran.rnc} +- {displayShortname: MGW, enclosingDomain: RAN, tosca_id: com.trinity.ran.mgw} +- {displayShortname: SS7 GPORT, enclosingDomain: RAN, tosca_id: com.trinity.ran.ss7_gport} +- {displayShortname: MSN, enclosingDomain: RAN, tosca_id: com.trinity.ran.msn} +- {displayShortname: E-SMLC, enclosingDomain: RAN, tosca_id: com.trinity.ran.e_smlc} +- {displayShortname: SGSN-S4, enclosingDomain: EPC, tosca_id: com.trinity.epc.sgsn_s4} +- {displayShortname: MME, enclosingDomain: EPC, tosca_id: com.trinity.epc.mme} +- {displayShortname: P_LRF (RDF), enclosingDomain: EPC, tosca_id: com.trinity.epc.p_lrf} +- {displayShortname: GMLC, enclosingDomain: EPC, tosca_id: com.trinity.epc.gmlc} +- {displayShortname: PCEF, enclosingDomain: EPC, tosca_id: com.trinity.epc.pcef} +- {displayShortname: SDG, enclosingDomain: EPC, tosca_id: com.trinity.epc.sdg} +- {displayShortname: P-GW, enclosingDomain: EPC, tosca_id: com.trinity.epc.p_gw} +- {displayShortname: S-GW, enclosingDomain: EPC, tosca_id: com.trinity.epc.s_gw} +- {displayShortname: PAS, enclosingDomain: EPC, tosca_id: com.trinity.epc.pas} +- {displayShortname: PCRF, enclosingDomain: EPC, tosca_id: com.trinity.epc.pcrf} +- {displayShortname: MIND, enclosingDomain: EPC, tosca_id: com.trinity.epc.mind} +- {displayShortname: APN DNS, enclosingDomain: EPC, tosca_id: com.trinity.epc.apn_dns} +- {displayShortname: DRA EPC, enclosingDomain: EPC, tosca_id: com.trinity.epc.dra_epc} +- {displayShortname: HSS EPC, enclosingDomain: EPC, tosca_id: com.trinity.epc.hss_epc} +- {displayShortname: HLR, enclosingDomain: EPC, tosca_id: com.trinity.epc.hlr} +- {displayShortname: CPM, enclosingDomain: EPC, tosca_id: com.trinity.epc.cpm} +- {displayShortname: P-LRF/RDF, enclosingDomain: EPC, tosca_id: com.trinity.epc.p_lrf_sup} +- {displayShortname: SBC, enclosingDomain: USP, tosca_id: com.trinity.usp.sbc} +- {displayShortname: ATGW, enclosingDomain: USP, tosca_id: com.trinity.usp.atgw} +- {displayShortname: IWF, enclosingDomain: USP, tosca_id: com.trinity.usp.iwf} +- {displayShortname: ATCF, enclosingDomain: USP, tosca_id: com.trinity.usp.atcf} +- {displayShortname: P-CSCF, enclosingDomain: USP, tosca_id: com.trinity.usp.p_cscf} +- {displayShortname: Transcoder, enclosingDomain: USP, tosca_id: com.trinity.usp.transcoder} +- {displayShortname: I-SBC, enclosingDomain: USP, tosca_id: com.trinity.usp.i_sbc} +- {displayShortname: SCC-AS, enclosingDomain: USP, tosca_id: com.trinity.usp.scc_as} +- {displayShortname: EATF, enclosingDomain: USP, tosca_id: com.trinity.usp.eatf} +- {displayShortname: TAS, enclosingDomain: USP, tosca_id: com.trinity.usp.tas_cts} +- {displayShortname: S-CSCF, enclosingDomain: USP, tosca_id: com.trinity.usp.s_cscf} +- {displayShortname: E-CSCF (911), enclosingDomain: USP, tosca_id: com.trinity.usp.e_cscf} +- {displayShortname: I-CSCF, enclosingDomain: USP, tosca_id: com.trinity.usp.i_cscf} +- {displayShortname: TF / BGCF, enclosingDomain: USP, tosca_id: com.trinity.usp.tf_bgcf} +- {displayShortname: MGC-8, enclosingDomain: USP, tosca_id: com.trinity.usp.mgc8} +- {displayShortname: MRF, enclosingDomain: USP, tosca_id: com.trinity.usp.mrf} +- {displayShortname: USP DNS, enclosingDomain: USP, tosca_id: com.trinity.usp.dns} +- {displayShortname: DRA IMS, enclosingDomain: USP, tosca_id: com.trinity.usp.dra_ims} +- {displayShortname: ENUM, enclosingDomain: USP, tosca_id: com.trinity.usp.enum} +- {displayShortname: HSS IMS, enclosingDomain: USP, tosca_id: com.trinity.usp.hss_ims} +- {displayShortname: CCF, enclosingDomain: "", tosca_id: com.trinity."".dc1.ccf} +- {displayShortname: BGF, enclosingDomain: "", tosca_id: com.trinity."".dc1.bgf} +- {displayShortname: vMS, enclosingDomain: "", tosca_id: com.trinity."".dc1.ms} +- {displayShortname: vNS, enclosingDomain: "", tosca_id: com.trinity."".dc1.ns} +- {displayShortname: vAS, enclosingDomain: "", tosca_id: com.trinity."".dc1.as} +- {displayShortname: vA-SBG, enclosingDomain: "", tosca_id: com.trinity."".dc1.a_sbg} +- {displayShortname: vDBE, enclosingDomain: "", tosca_id: com.trinity."".dc1.dbe} +- {displayShortname: vN-SBG, enclosingDomain: "", tosca_id: com.trinity."".dc1.n_sbg} +- {displayShortname: CCF, enclosingDomain: "", tosca_id: com.trinity."".dc2.ccf} +- {displayShortname: BGF, enclosingDomain: "", tosca_id: com.trinity."".dc2.bgf} +- {displayShortname: vMS, enclosingDomain: "", tosca_id: com.trinity."".dc2.ms} +- {displayShortname: vNS, enclosingDomain: "", tosca_id: com.trinity."".dc2.ns} +- {displayShortname: vAS, enclosingDomain: "", tosca_id: com.trinity."".dc2.as} +- {displayShortname: vA-SBG, enclosingDomain: "", tosca_id: com.trinity."".dc2.a_sbg} +- {displayShortname: vDBE, enclosingDomain: "", tosca_id: com.trinity."".dc2.dbe} +- {displayShortname: vN-SBG, enclosingDomain: "", tosca_id: com.trinity."".dc2.n_sbg} +- {displayShortname: PSX SIP, enclosingDomain: VNI, tosca_id: com.trinity.vni.sip_psx} +- {displayShortname: PSX Policy, enclosingDomain: VNI, tosca_id: com.trinity.vni.policy_psx} +- {displayShortname: IPBE, enclosingDomain: VNI, tosca_id: com.trinity.vni.ipbe} +- {displayShortname: GSX, enclosingDomain: VNI, tosca_id: com.trinity.vni.gsx} +- {displayShortname: BVoIP AS, enclosingDomain: VNI, tosca_id: com.trinity.vni.bvoip_as} +- {displayShortname: NGBE, enclosingDomain: VNI, tosca_id: com.trinity.vni.ngbe} +- {displayShortname: VoLTE UE, enclosingDomain: RAN, tosca_id: com.trinity.ue1} +- {displayShortname: 3G UE, enclosingDomain: RAN, tosca_id: com.trinity.ue2} +- {displayShortname: Trinity UE-A, enclosingDomain: "", tosca_id: com.trinity.ue3} +- {displayShortname: Trinity UE-B, enclosingDomain: "", tosca_id: com.trinity.ue4} +- {displayShortname: VNI UE-PBX, enclosingDomain: VNI, tosca_id: com.trinity.ue5} +- {displayShortname: PSTN, enclosingDomain: VNI, tosca_id: com.trinity.ue6} +- {displayShortname: Intrado SBC, enclosingDomain: NotApplicable, tosca_id: com.trinity.intrado_sbc} +- {displayShortname: FMCC, enclosingDomain: NotApplicable, tosca_id: com.trinity.fmcc} +- {displayShortname: ESGW, enclosingDomain: NotApplicable, tosca_id: com.trinity.esgw} +- {displayShortname: PSAP, enclosingDomain: NotApplicable, tosca_id: com.trinity.psap} +- {displayShortname: IPFR User, enclosingDomain: NotApplicable, tosca_id: com.trinity.ipfr_user} +- {displayShortname: PBX, enclosingDomain: NotApplicable, tosca_id: com.trinity.pbx} +- {displayShortname: IPBE, enclosingDomain: NotApplicable, tosca_id: com.trinity.ipbe} +- {displayShortname: MGCF/eMSC, enclosingDomain: NotApplicable, tosca_id: com.trinity.mgcf_msc} +- {displayShortname: 3G UE, enclosingDomain: NotApplicable, tosca_id: com.trinity.2G_3G_Endpoint} +- {displayShortname: IPBE, enclosingDomain: NotApplicable, tosca_id: com.trinity.vni.pstn_tdm} +- {displayShortname: PSTN, enclosingDomain: NotApplicable, tosca_id: com.trinity.pstn} +- {displayShortname: AT&T LNS Switch, enclosingDomain: NotApplicable, tosca_id: com.trinity.att_lns_switch} +- {displayShortname: SGX, enclosingDomain: NotApplicable, tosca_id: com.trinity.sgx} +- {displayShortname: CNAM DB, enclosingDomain: NotApplicable, tosca_id: com.trinity.cnam_db} +- {displayShortname: LEA, enclosingDomain: VNI, tosca_id: com.trinity.ue10} +- {displayShortname: SS8 LIG, enclosingDomain: VNI, tosca_id: com.trinity.ue9} +- {displayShortname: PGW, enclosingDomain: NotApplicable, tosca_id: com.trinity.usp.pgw} +- {displayShortname: SGW, enclosingDomain: NotApplicable, tosca_id: com.trinity.usp.sgw} +- {displayShortname: PSTN-TDM Switch, enclosingDomain: VNI, tosca_id: com.trinity.ue7} +- {displayShortname: PSAP, enclosingDomain: EPC, tosca_id: com.trinity.ue8} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/BPMNconversion.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/BPMNconversion.js new file mode 100644 index 0000000..1dded39 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/BPMNconversion.js @@ -0,0 +1,208 @@ +/* +============================================================================================= +The MIT License (MIT) + +Copyright 2015 AT&T Intellectual Property. All other rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +//Contains functions to convert diagram to BPMN and display in a #canvas div +var xmlText=null; +var lifelineBPMN = []; +var nodeXVal = []; +function convertToBPMN (m,BPMNFilename,whatToDo) { + if (whatToDo!='source'){ + bootbox.hideAll(); + } + + m = decodeJSON(m); + n = JSON.parse(m); + $.each(n.diagram.elements.nodes, function(index, value) { + var newText = value.innerText.replace(/&/g,"&") + .replace(/"/g,""") + .replace(/'/g,"'") + .replace(//g,">"); + value.innerText = newText; + }); + var elementList = n.diagram.elements; //stores all elements + var allNodes = n.diagram.elements.nodes; + var allArrows = n.diagram.elements.arrows; + var allNotes = n.diagram.elements.notes; + var loadedRows = n.diagram.rows; + var loadedCols = n.diagram.cols; + var description = n.diagram.description; + var transposeDown = 75; + xmlText = ''; + lifelineBPMN.length=0; + lifelineBPMN = []; + nodeXVal.length=0; + nodeXVal = []; + xmlText = '\n'; + xmlText += '\n'; + xmlText += ' \n' + for (var i=0; i\n' + for (var j=0; j\n' + } + for (var j=0; j\n' + } + xmlText += ' \n' + var tempId = guid();// + lifelineBPMN.push(tempId);// + xmlText += ' \n'// + } + for (var i=0; i\n' + } + xmlText += ' \n' + xmlText += ' \n' + xmlText += ' \n' + var maxY = 0; + for (var i=0; imaxY){ + maxY = parseInt(arrowArr[i][4]); + } + } + for (var i=0; i\n' + xmlText += ' \n' + xmlText += ' \n' + + xmlText += ' \n'// + xmlText += ' \n'// + nodeXVal.push(parseInt(100+i*150)); + xmlText += ' \n'// + } + + for (var i=0; i\n' + for (var j=0; j\n' + xmlText += ' \n' + xmlText += ' \n' + var textWidth = parseInt((arrowArr[arrowIndex][2]).length) * 6 + if (nodeXVal[startNodeIndex]\n' + } + else{ //Points left, so place text right + xmlText += ' \n' + } + xmlText += ' \n' + xmlText += ' \n' + } + else{ + xmlText += ' \n' + for (var j=0; j\n' + xmlText += ' \n' + xmlText += ' \n' + xmlText += ' \n' + xmlText += ' \n' + var textWidth = parseInt((arrowArr[arrowIndex][2]).length) * 6 + xmlText += ' \n' + xmlText += ' \n' + xmlText += ' \n' + } + } + + xmlText += ' \n' + xmlText += ' \n' + xmlText += '' + + //alert(xmlText); + + if (whatToDo=="save"){ + var textToWrite = xmlText + var blob = new Blob([textToWrite], {type: "text/plain;charset=utf-8"}); + + var downloadLink = document.createElement("a"); + + filename = BPMNFilename + ".BPMN"; + + downloadLink.download = filename; + downloadLink.innerHTML="Download File"; + downloadLink.href = window.webkitURL.createObjectURL(blob); + downloadLink.click(); + } + else if (whatToDo =="show"){ + bootbox.dialog({ + size:'large', + message:'
    Please save before exporting
    Export as :
    ', + animate:false, + backdrop:true, + onEscape: function() {}, + callback: function(result){ + if (result == true){ + + } + } + }); + showBPMN(xmlText); + } + else if (whatToDo =="source"){ + return xmlText + } +} + +function showBPMN (xmlText) { + var BpmnViewer = window.BpmnJS; + + var viewer = new BpmnViewer({ container: '#canvas' }); + + viewer.importXML(xmlText, function(err) { + if (!err) { + console.log('success!'); + viewer.get('canvas').zoom('fit-viewport'); + } else { + console.log('something went wrong:', err); + } + }); +} + +function svgprint (quality) { + var setWide = $(document.querySelector('svg')).width(); + var setHeight = $(document.querySelector('svg')).height(); + $(document.querySelector('svg')).attr('width',setWide) + $(document.querySelector('svg')).attr('height',setHeight) + svgAsDataUri(document.querySelector('svg'), {scale:quality}, function(uri){ + console.log(uri) + var img = new Image(); + img.src = uri; + img.onload = function() { + var canvas = document.createElement('canvas'); + canvas.width = img.width; + canvas.height = img.height; + var context = canvas.getContext('2d'); + context.drawImage(img,0,0); + + var a = document.createElement('a'); + a.download = 'image.png'; + a.href = canvas.toDataURL('image/png'); + document.body.appendChild(a); + a.click(); + } + }) +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/app.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/app.js new file mode 100644 index 0000000..7fdf912 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/app.js @@ -0,0 +1,55 @@ +(function() { + +angular.module('eAse',[]) + .controller('ETitleController',eTitleController); + + function eTitleController($scope){ + $scope.title = "My Sequence Diagram"; + $scope.titleEdit = true; + $scope.editTitle = function() { + $scope.titleEdit = !$scope.titleEdit; + }; + $scope.doneEdit = function(event) { + if(event.which === 13) { + $scope.titleEdit = !$scope.titleEdit; + } + }; + $scope.blur = function(event) { + $scope.titleEdit = !$scope.titleEdit; + }; + } +})(); + + + + + + + + + +/* + +app.controller('eSidebarController',function($scope){ + +}); +app.controller('eGridController',function($scope){ + +}); +app.controller('',function($scope){ + +}); +app.directive('sequenceFlow', function () { + return { + restrict: 'E', + templateUrl: "../view-models/ase_view.html", + controller: 'flowController', + scope: '=', + link: function(scope, element, attrs, flowCtrl) { + flowCtrl.init(); + } + } +}); + +*/ + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/arrayManipulation.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/arrayManipulation.js new file mode 100644 index 0000000..2f041f3 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/arrayManipulation.js @@ -0,0 +1,356 @@ + +//Contains functions to update, create and retrieve arrays. Also uses arrays to determine properties (lNode, rNode) of arrows + +var missingStarts = []; +var missingEnds = []; + +//Stores module's properties in its array +function storeXY (arrayType,id) { + 'use strict'; + var index; + for ( i = 0; i' + + '
    '+ text +'
    '+ + '
    '+ + ''; + dropOffLocation = document.getElementById("nodeChildrenDroppedOffHere"); + dropOffLocation.innerHTML += tag; + var index = nodeArr.push([document.getElementById(id),id,text,parseInt(lX),parseInt(lY),wide,parseInt(lX)+parseInt(wide),parseInt(lY)]); + if (tosca_ID !==null){ + document.getElementById(id).setAttribute('taska_id',tosca_ID); + } + if ( text !== null ){ + document.getElementById(id).setAttribute('sname',text); + } + // When Role is added uncomment. + console.log(role); + if ( role !== null ){ + document.getElementById(id).setAttribute('role_id',role); + } + + if (isOverlapped(id) === true){ + shiftRight(document.getElementById(id),160); + } + if (isOverlapped(id) === false){ + for (i=0;i'+ + '
    '+text+'
    '+ + '
    '+ + ''; + } + if (direction === "left"){ + tag = '
    '+ + '
    '+ + '
    ' + text + '
    '+ + '
    '; + } + if (direction === "self"){ + tag = '
    '+ + '
    '+ + '
    ' + text + '
    '+ + '
    '; + } + + + dropOffLocation = document.getElementById("arrowChildrenDroppedOffHere"); + dropOffLocation.innerHTML += tag; + arrowArr.push([document.getElementById(id),id,text,parseInt(lX),lY,parseInt(wide),parseInt(lX)+parseInt(wide),parseInt(lY),"","",arrowDescription]); + + determineLRNode(id,"arrow"); + } + if (arrayType == "noteArr"){ + tag = '
    ' + + text + + '
    '; + dropOffLocation = document.getElementById("noteChildrenDroppedOffHere"); + dropOffLocation.innerHTML += tag; + noteArr.push([document.getElementById(id),id,text,parseInt(lX),parseInt(lY),wide,parseInt(lX)+parseInt(wide),parseInt(lY)+parseInt(height)]); + + } + +} + +var layers = {}; +var nodesInLayer = []; +function determineLayers () { + var doAgain = true; + layers.length = 0; + var layerNumber = -1; + while (doAgain === true){ + layerNumber++; + nodesInLayer.length = 0; + var classToAssign = 'layer'+layerNumber; + for (var i=0; i ' + + '
    Description:
    ' + + '
    Message Type:
    ', + callback: function(result){ + if (result === true) { + var innerText=$("#arrowInnerText").val(); + var messageType = $("#arrowMessageType").val(); + pushToDict(innerText, "arrow"); + storeText(arrowArr,uuid,innerText); + makeArrow(uuid); + arrowArr[index][10] = $("#arrowDescription").val(); + $(arrowArr[index][0]).attr("message_type",messageType); + } + } + }); + $("#arrowInnerText").autocomplete({ + source: arrowTags, + autoFocus: true, + delay: 0 + }); + $("#arrowMessageType").autocomplete({ + source: messageTags, + autoFocus: true, + delay: 0 + }); + + var currentInput = $("#arrowInnerText").val(); + $("#arrowInnerText").selectRange(0,currentInput.length); + $("#arrowInnerText").click(function(){ + var currentInput = $("#arrowInnerText").val(); + $("#arrowInnerText").selectRange(0,currentInput.length); + }); + $("#arrowInnerText").keyup( function(e) { + if (e.keyCode == 13){ + $(document.getElementsByClassName('btn-primary')[0]).click(); + } + }); + $("#arrowDescription").keyup( function(e) { + if (e.keyCode == 13){ + $(document.getElementsByClassName('btn-primary')[0]).click(); + } + }); +} + +$(document).delegate('.arrowText','mouseover',function(mainEvent){ + if(!$(this).hasClass("bound")){ + console.log("ENTERING"); + var hoverIndex = recallArray(arrowArr,event.target.parentNode.parentNode.id); + if (arrowArr[hoverIndex][10] !== null && arrowArr[hoverIndex][10] !== "") { + arrowDescript = arrowArr[hoverIndex][10]; + } else { + arrowDescript = '--no description entered--'; + } + $('#'+event.target.parentNode.parentNode.id).tooltipster({ + maxWidth:200, + position:'bottom', + theme: 'tooltipster-shadow', + interactive:false, + delay:300, + multiple:false, + trigger:'click', + contentAsHTML:true, + content: arrowDescript + }); + $(this).hover( + function(event){ + var hoverIndex = recallArray(arrowArr,event.target.parentNode.parentNode.id); + if (arrowArr[hoverIndex][10] !== null && arrowArr[hoverIndex][10] !== "") { + arrowDescript = arrowArr[hoverIndex][10]; + } else { + arrowDescript = '--no description entered--'; + } + console.log("ENTERING"+event.target.parentNode.parentNode.id); + $('#'+event.target.parentNode.parentNode.id).tooltipster({ + maxWidth:200, + position:'bottom', + theme: 'tooltipster-shadow', + interactive:false, + delay:300, + multiple:false, + trigger:'click', + contentAsHTML:true, + content: arrowDescript + }); + }, + function(event) { + $(this).addClass("bound"); + console.log("LEAVING"+event.target.parentNode.parentNode.id); + $('#'+event.target.parentNode.parentNode.id).tooltipster('destroy'); + }); + } +}); \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/ase.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/ase.js new file mode 100644 index 0000000..3f3432e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/ase.js @@ -0,0 +1,112 @@ +//window.filename = ""; +//window.name = "My_Flow_1"; +window.description = "My Sequence Diagram"; +window.arrowTip = 12; +window.resized = false; +window.arrowConnections = true; +window.negativeWidth = false; +window.gridPitchx = 160; +window.gridPitchy = 42; +window.clipboard = []; +window.selection = []; +//var networkMap(); +var step = 1; +var sessiontoken = ''; +var uid= 'XX0000'; +var username= ''; +var toscaDetails = { + 'toscaID':'', + 'name':'', + 'domain':'' +}; +var ase = { + 'elementsFileName' : '', + 'description' : 'My Sequence Diagram', + 'name' : 'My_Flow_1', + 'filename' : '', + 'elementsFile' : '../mocks/networkElements.yml' +}; + + + +$(function() { + + newProject(null,null,initialRows); + + //buildTable(); + //buildDomain(); + + var loadSample = false; + var showBpmn = false; + + + $('#sampleEx').click(function(){ + if (! loadSample ) { + loadSample = loadSampleData(); + } + }); + $('#bpmnEx').click(function(){ + convertToBPMN(makeJSON(),window.description,'show'); + }); + $('#popupEx').click(function(){ + showPopup(); + }); + +// if ( getParameterByName("bpmn") === "1" ) { +// +// } else if ( getParameterByName("sample") === "1" ) { +// $('#sampleDiv').show(); +// } else if ( getParameterByName("interact") === "1" ) { +// +// +// } + + + + + //Allows nodes to scroll with the page and adjusts transparencies + $(window).scroll(function(event) { + scroll(); + }); + + toggleDoubleLine(document.getElementById('row1'),null,"Step 1:",""); + //buildDomain(); + //addStep(document.getElementById('row1'),'row1',step,''); + buildNetworkMap(); + $("#backHome").click(function(){ document.location = "../welcome.htm?showASE=true";}); +}); + +function getParameterByName( name ){ + var regexS = "[\\?&]"+name+"=([^&#]*)"; + var regex = new RegExp( regexS ); + var results = regex.exec( window.location.search ); + if( results == null ){ + return ""; + } else { + return decodeURIComponent(results[1].replace(/\+/g, " ")); + } +} + +function loadSampleData() { + try { + //loadFile(0,null,preloadedJSON); + loadFile(0,null,trinity_3g_json); + } catch(err){ + return false; + } finally { + + } + return true; +} + +function showPopup(){ + bootbox.dialog({ + backdrop:true, + animate:false, + onEscape: function() {}, + title: '
    Sample Dialog
    ', + size: 'small', + message: '

    Sample Dialog using Bootstraps bootbox.dialog components.

    '+ + '

    ' + }); +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/backend.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/backend.js new file mode 100644 index 0000000..1c32fcc --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/backend.js @@ -0,0 +1,827 @@ +/* +============================================================================================= +The MIT License (MIT) + +Copyright 2015 AT&T Intellectual Property. All other rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +//Contains functions to save/export information, load/import from files, and update the titlebar + +var m; +var doc; +var linePosition; +var lineSpacing; +var doubleLineNumbers = []; +var doubleLineText=[] +var doubleLineType=[] + +//Creates a JSON data structure +function makeJSON () { + if (nodeArr.length>1){ + for (var k = nodeArr.length-1; k>=0; k--){ + for (var j = 1; j<=k; j++){ + if (parseInt(document.getElementById(nodeArr[j-1][1]).getAttribute("data_x"))>parseInt(document.getElementById(nodeArr[j][1]).getAttribute("data_x"))) { + var swap = nodeArr[j-1]; + nodeArr[j-1] = nodeArr[j]; + nodeArr[j] = swap; + } + } + } + } + if (arrowArr.length>1){ + for (var k = arrowArr.length-1; k>=0; k--){ + for (var j = 1; j<=k; j++){ + if (parseInt(document.getElementById(arrowArr[j-1][1]).getAttribute("data_y"))>parseInt(document.getElementById(arrowArr[j][1]).getAttribute("data_y"))) { + var swap = arrowArr[j-1]; + arrowArr[j-1] = arrowArr[j]; + arrowArr[j] = swap; + } + } + } + } + var now = new Date; + var utc_timestamp = Date.UTC(now.getUTCFullYear(),now.getUTCMonth(), now.getUTCDate() , + now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); + var canvasWidth = $("#grid").width() - $("#sideBar").width(); + + doubleLineNumbers.length=0; + doubleLineText.length=0; + doubleLineType.length=0; + var doubleElements = document.getElementsByClassName("doubleLine"); + $.each(doubleElements,function(index, value){ + doubleLineNumbers.push(($(value).attr('id')).substring(3)); + doubleLineText.push(value.children[0].innerHTML); + doubleLineType.push($(value).attr('messageType')) + }); + m = ""; + m += '{ "diagram": \n'; + m += '{ "created": "' + utc_timestamp + '",\n'; + m += '"rows": "' + rows + '",\n'; + m += '"cols": "' + cols + '",\n'; + m += '"gridPitchy": "' + gridPitchy + '",\n'; + m += '"canvasHeight": "' + $("#grid").height() + '",\n'; + m += '"canvasWidth": "' + canvasWidth + '",\n'; + m += '"encoding": "base64",\n'; + m += '"elements": {"nodes": [\n'; + nodeArr.forEach(saveNodeArrayElements); + m += '],\n "arrows": [\n'; + arrowArr.forEach(saveArrowArrayElements); + m += '],\n "notes": [\n'; + noteArr.forEach(saveNoteArrayElements); + m += '],\n "separators": [\n'; + doubleLineNumbers.forEach(saveSeparatorArrayElements); + m += ']}}}'; + + var n = JSON.parse(m); + return m + +} +function saveNodeArrayElements(element, index, array) { + var myElement = document.getElementById(element[1]); + var roleName = ''; + var infobox = "{\n"; + infobox += '"id":"' + myElement.id + '",\n'; + infobox += '"data_x": "' + myElement.getAttribute('data_x') + '",\n'; + infobox += '"data_y": "' + myElement.getAttribute('data_y') + '",\n'; + infobox += '"width": "' + $(myElement).width() + '",\n'; + infobox += '"innerText": "' + Base64.encode(myElement.getAttribute('sname')) + '",\n'; + infobox += '"bpmn": "' + Base64.encode($.trim(nodeArr[index][10])) + '",\n'; + if (myElement.getAttribute('taska_id')==null) myElement.setAttribute('taska_id',""); + infobox += '"taska_id": "' + Base64.encode(myElement.getAttribute('taska_id')) + '",\n'; + if (nodeArr[index][0].hasAttribute('role_id')) { + roleName = myElement.getAttribute('role_id'); + } + infobox += '"role": "' + Base64.encode(roleName) + '"\n'; + + infobox += "}"; + if(index'){ + databaseHTML = 'Sorry, you are not authenticated to any database at this time.
    ' + } + else{ + databaseHTML = '

    Description

    ' + } +*/ + bootbox.dialog({ + backdrop:true, + animate:false, + onEscape: function() {}, + title: '
    Save/Export
    ', + size: 'small', + message: '

    Save locally to hard drive :

    '+ +// message: '
    '+ + '

    Call Flow Name

    '+ + ''+ + '

    ' + + '' + + ' ' + + '

    ' + }); + /* + * Let enter (13) submit the text + * Key "Enter" has the key code 13 + */ +/* + $("#saveLocalFileName").keyup( function(e) { + if (e.keyCode == 13){ + description = $("#saveLocalDescription").val(); + // replace space with underscore + name = ase.description.trim().replace(/ /g,"_"); + saveLocalFile(description); + } + }); +*/ + $("#saveLocalDescription").keyup( function(e) { + if (e.keyCode == 13){ + description = $("#saveLocalDescription").val(); + // replace space with underscore + saveLocalFile(description); + } + }); +/* + $("#saveDBDescription").keyup( function(e) { + if (e.keyCode == 13){ + description = $("#saveDBDescription").val(); + saveDBFile(description); + } + }); +*/ + /* + * Selects all text in text box on focus + * Local File Name Box is removed + */ + /* $("#saveLocalFileName").click(function(){ + var currentInput = $("#saveLocalFileName").val(); + $("#saveLocalFileName"e).selectRange(0,currentInput.length); + }); */ + $("#saveLocalDescription").click(function(){ + var currentInput = $("#saveLocalDescription").val(); + $("#saveLocalDescription").selectRange(0,currentInput.length); + }); + $("#saveDBDescription").click(function(){ + var currentInput = $("#saveDBDescription").val(); + $("#saveDBDescription").selectRange(0,currentInput.length); + }); + + $("input[name=fileType]:radio").change(function () { + if (document.getElementById('json').checked) { + document.getElementById("saveWarning").innerHTML=''; + } else { + document.getElementById("saveWarning").innerHTML='*This file type is not reloadable. Please export a json as well as your desired filetype to enable yourself to edit this document in the future'; + } + }) +} + +function viewSource() { + if (document.getElementById('yaml').checked) { //YAML + sourceCode = convertToYaml(m) + if (sourceCode==false){ + alert("Node(s) missing tosca ID") + } else { + alert(sourceCode); + } + } + + if (document.getElementById('json').checked) { + decodeJSON(m,'show') + }; +} + +function saveLocalFile(description) { + var data = JSON.parse(m); + var name = description.trim().replace(/ /g,"_"); + + $.extend(data.diagram,{"description":description}); + m=JSON.stringify(data,null,' '); + var textToWrite = m; +/* + if (document.getElementById('yaml').checked) { //YAML + m = convertToYaml(textToWrite) + if (m==false){ + bootbox.hideAll(); + bootbox.alert({ + size:'small', + message:"***Node(s) missing taska_id***", + callback: function(result){ + + } + }); + return; + } + var blob = new Blob([m], {type: "text/plain;charset=utf-8"}); + ase.name = name + name = name + ".yml"; + } else if (document.getElementById('bpmnio').checked) { //YAML + convertToBPMN(m,name,'save') + bootbox.hideAll(); + ase.name = name + return; + } + if (document.getElementById('json').checked) { //JSON + var blob = new Blob([m], {type: "text/plain;charset=utf-8"}); + ase.name = name + name = name + ".txt"; + } +*/ + + var JSON_blob = new Blob([m], {type: "text/plain;charset=utf-8"}); + ase.name = name + JSON_name = name + ".txt"; + + YAMLString = convertToYaml(textToWrite) + if (YAMLString==false){ + bootbox.hideAll(); + bootbox.alert({ + size:'small', + message:"***Node(s) missing taska_id***", + callback: function(result){ + + } + }); + return; + } + var YAML_blob = new Blob([YAMLString], {type: "text/plain;charset=utf-8"}); + ase.name = name + YAML_name = name + ".yml"; + + if (navigator.appVersion.toString().indexOf('.NET') > 0) { + window.navigator.msSaveBlob(JSON_blob, JSON_name); + window.navigator.msSaveBlob(YAML_blob, YAML_name); + } else { + var downloadLink = document.createElement("a"); + //window.description=description; + ase.description = description; + downloadLink.download = JSON_name; + downloadLink.innerHTML="Download File"; + downloadLink.href = window.URL.createObjectURL(JSON_blob)||window.webkitURL.createObjectURL(JSON_blob); + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + + var downloadLink = document.createElement("a"); + downloadLink.download = YAML_name; + downloadLink.innerHTML="Download File"; + downloadLink.href = window.URL.createObjectURL(YAML_blob)||window.webkitURL.createObjectURL(YAML_blob); + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + } + resetTitleBar(); + bootbox.hideAll(); + +} + +//Creates blob and exports to database +function saveDBFile(description) { + bootbox.hideAll(); + + var data = JSON.parse(m); + $.extend(data.diagram,{"description":description}); + m=JSON.stringify(data,null,' '); + + //file name from description + //fileName=description.trim().replace(/ /g,"_"); + + // JSON + var textToWrite = m; + + // YAML + var ymlTextToWrite = convertToYaml(m); + + //window.description=description; + ase.description=description; + + $.post("ase.htm?action=save",{ + jsonString:textToWrite, + ymlString:ymlTextToWrite, + callFlowName:description, + uid:uid}) + .success(function(data){ + console.log("success"); + bootbox.alert({ + size:'small', + message:' Successfully stored!
    The call flow is accessible in the Network Simulator', + callback: function(result){ + } + }); + }) + .error(function(jqXHR, textStatus, errorThrown){ + //console.log(textToWrite); + bootbox.alert({ + size:'small', + message:"***Failed to save to Server***", + callback: function(result){ + } + }); + }); + + +/* + $.post("postjaml.htm",{ + jamlData:textToWrite, + filename:description, + uid:uid}) + .success(function(data){ + console.log("success"); + }) + .error(function(jqXHR, textStatus, errorThrown){ + //console.log(textToWrite); + bootbox.alert({ + size:'small', + message:"***Failed to save to database***", + callback: function(result){ + } + }); + }); +*/ + resetTitleBar(); +} + +//LOADING/////////////////////////////////////////////////////// + +//Prompts user to select file then loads +function loadDialog(){ + //load table into var + var message = null; + //$.get('loadableList.htm?sessiontoken=' + sessiontoken) + // .success(function(data){ + //var message = data; + bootbox.dialog({ + backdrop:true, + animate:false, + onEscape: function() {}, + title: 'Load File', + size: 'small', + message: '

    Load locally from hard drive :

    ' + + '', + //''+ + //'

    '+ + //'

    Load from database :

    '+message + + }); + /* + },"text") + .error(function(jqXHR, textStatus, errorThrown){ //If server not reached + //console.log(jqXHR+' ' +textStatus+' ' +errorThrown); + var message = 'Error: Database not detected or configured'; + bootbox.dialog({ + backdrop:true, + animate:false, + onEscape: function() {}, + title: 'Load File', + size: 'small', + message: '

    Load locally from hard drive :

    ' + + '
    ', + //''+ + //'

    '+ + //'

    Load from database :

    '+message + + }); + }); + */ +} + + + +function loadFile(typeOfLoad,preloadedFile,preloadedJSON) { + //Case of load locally + if(preloadedFile==null && preloadedJSON==null){ + var file = document.getElementById("fileToLoad").files[0]; + var reader = new FileReader(); + reader.onload = recievedText; + reader.readAsText(file); + } + //Not used, but can be useful if you load the page with a parameter of "preloadedJSON" + else if (preloadedFile==null && preloadedJSON!=null){ + recievedText(preloadedJSON); + } + //Case of load from server + else if (preloadedFile!=null && preloadedJSON==null){ + $.get(preloadedFile,function(data){ + recievedText(data); + }); + } + function recievedText (importedText) { //Called when fully loaded + var textFromFileLoaded =""; + if (preloadedFile === null && preloadedJSON === null) { + var textFromFileLoaded = reader.result; + //var path = document.getElementById("fileToLoad").value; + //var loadedFilename = path.replace(/^.*\\/,""); + } else { + textFromFileLoaded = importedText; + } + + m = decodeJSON(textFromFileLoaded,null); + console.log("m=" + m); + + var n = JSON.parse(m); + + var elementList = n.diagram.elements; //stores all elements + var allNodes = n.diagram.elements.nodes; + var allArrows = n.diagram.elements.arrows; + var allNotes = n.diagram.elements.notes; + var loadedRows = n.diagram.rows; + var loadedCols = n.diagram.cols; + var description = n.diagram.description + + + //Promotes backwards compatibility to before descriptions were added + try { + var path = document.getElementById("fileToLoad").value; + var loadedFilename = path.replace(/^.*\\/,""); + } + catch (err){ + var loadedFilename = description; + } + + //Replace + if (typeOfLoad == 0){ + bootbox.hideAll(); + //window.description = n.diagram.description; + ase.description = n.diagram.description; + $('#description').text(ase.description); + linesToMakeDouble = [] + doubleLineText = [] + doubleLineType = [] + var separators = n.diagram.elements.separators; + if (separators == null) separators = [] //Backwards compatibility + $.each(separators,function(index, value){ + linesToMakeDouble.push(value.lineNumber); + doubleLineText.push(value.text); + // Added on Sept 24, 2015 + // double line separator should not store message type + doubleLineType.push(value.messageType); + }); + + rows=loadedRows; + cols=loadedCols; + newProject(linesToMakeDouble,doubleLineText,loadedRows,doubleLineType); + document.getElementById('grid').style.height = 91.5 + (rows-initialRows)*6 + '%'; //Increases height by 6% + for (var j = 0; jrows){ + var deltaRow = loadedRows-rows + for (var i = 0; imaxX){ + maxX = nodeArr[i][3]; + } + } + while (maxX>$("#grid").width() - $("#sideBar").width()){ + addWidth(); + } +} + +function resetTitleBar () { + //if (uid==null || uid=="" || uid==''){ + // document.getElementById("titleBar").innerHTML = '

    ' + description + '

    Log In
    '; + //} + //else{ + //document.getElementById("titleBar").innerHTML = '

    ' + description + '

    Hello, '+username+'
    '; + $("h3 .titleBar").html(ase.description); + /* + $('.loggedIn').tooltipster({ + minWidth:200, + theme: 'tooltipster-shadow', + interactive:true, + trigger:'hover', + contentAsHTML:true, + content: 'Hello '+username+' how are you'+ + '

    Your diagram has'+ + '

  • '+nodeArr.length+' nodes
  • '+ + '
  • '+arrowArr.length+' arrows

  • '+ + 'Log out' + }); + */ + //} +} + +function logIn () { + open("login.htm"); + resetTitleBar(); +} + +function showInfo () { + //Called when user clicks on their name after they are logged in +} + +//Allows editing title by double clicking on the top bar +$("#titleBar").dblclick(function(event) { + var presetSelectMenu='' + presetSelectMenu+='
    ' + bootbox.confirm({ + size:'small', + backdrop:true, + onEscape: function() {}, + title: "Change file attributes", + message:'Filename:
    '+ + '

    Description:
    '+ + '
    '+presetSelectMenu+'
    ', + callback: function(result){ + if (result == true){ + name = $("#saveFileName").val(); + description = $("#saveDescription").val(); + window.selectedPreset = document.getElementById('presetSelect-button').textContent; + resetTitleBar(); + } + } + }); + $( "#presetSelect" ).selectmenu(); + $('#presetSelect-button').css('width','inherit'); + $('#presetSelect-button').css('top',10); + $('#presetSelect-button').css('font-size','14px') + $('#presetSelect-button').css('margin-left',10) + $("#saveFileName").click(function(){ + currentInput = $("#saveFileName").val(); + $("#saveFileName").selectRange(0,currentInput.length); + }); + $("#saveDescription").click(function(){ + currentInput = $("#saveDescription").val(); + $("#saveDescription").selectRange(0,currentInput.length); + }); +}); + +//SELECT TEXT RANGE +$.fn.selectRange = function(start, end) { + return this.each(function() { + if (this.setSelectionRange) { + this.focus(); + this.setSelectionRange(start, end); + } else if (this.createTextRange) { + var range = this.createTextRange(); + range.collapse(true); + range.moveEnd('character', end); + range.moveStart('character', start); + range.select(); + } + }); +}; + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/.bower.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/.bower.json new file mode 100644 index 0000000..4997498 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/.bower.json @@ -0,0 +1,35 @@ +{ + "name": "Snap.svg", + "version": "0.4.1", + "homepage": "http://snapsvg.io", + "authors": [ + "Dmitry Baranovskiy " + ], + "description": "The JavaScript library for modern SVG graphics", + "main": "dist/snap.svg-min.js", + "keywords": [ + "svg", + "snap", + "js", + "javascript" + ], + "license": "Apache 2", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "demos", + "src" + ], + "_release": "0.4.1", + "_resolution": { + "type": "version", + "tag": "v0.4.1", + "commit": "3919b7a3077dfdb4b31cc4b485d70aab4a163a44" + }, + "_source": "git://github.com/adobe-webplatform/Snap.svg.git", + "_target": "~0.4.1", + "_originalSource": "Snap.svg", + "_direct": true +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/CONTRIBUTING b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/CONTRIBUTING new file mode 100644 index 0000000..c02401a --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/CONTRIBUTING @@ -0,0 +1,3 @@ +Contributions to this code are covered by the Adobe contributors +license agreeent. Developers must sign and submit the Adobe CLA in +order to contribute to this project. \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/Gruntfile.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/Gruntfile.js new file mode 100644 index 0000000..415c624 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/Gruntfile.js @@ -0,0 +1,62 @@ +module.exports = function(grunt) { + + var pkg = grunt.file.readJSON("package.json"); + + // Project configuration. + grunt.initConfig({ + // Metadata. + pkg: pkg, + banner: grunt.file.read("./src/copy.js") + .replace(/@VERSION/, pkg.version) + .replace(/@DATE/, grunt.template.today("yyyy-mm-dd")) + "\n", + // Task configuration. + uglify: { + options: { + banner: "<%= banner %>", + report: "min" + }, + dist: { + src: "<%= concat.target.dest %>", + dest: "dist/snap.svg-min.js" + } + }, + concat: { + options: { + banner: "<%= banner %>" + }, + target: { + dest: "dist/snap.svg.js", + src: [ + "./node_modules/eve/eve.js", + "./src/amd-banner.js", + "./src/mina.js", + "./src/svg.js", + "./src/element.js", + "./src/matrix.js", + "./src/attr.js", + "./src/class.js", + "./src/attradd.js", + "./src/paper.js", + "./src/path.js", + "./src/set.js", + "./src/equal.js", + "./src/mouse.js", + "./src/filter.js", + "./src/align.js", + "./src/amd-footer.js" + ] + } + }, + exec: { + dr: { + command: "node node_modules/dr.js/dr dr.json" + } + } + }); + + grunt.loadNpmTasks("grunt-contrib-concat"); + grunt.loadNpmTasks("grunt-contrib-uglify"); + grunt.loadNpmTasks("grunt-exec"); + + grunt.registerTask("default", ["concat", "uglify", "exec"]); +}; diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/LICENSE b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/LICENSE new file mode 100644 index 0000000..86a96fa --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013 Adobe Systems Incorporated + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/NOTICE b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/NOTICE new file mode 100644 index 0000000..b9fb2b2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/NOTICE @@ -0,0 +1,190 @@ +Snap.svg is licensed under the Apache license version 2.0, January 2004 (see LICENSE file). + +Snap.svg uses the following third party libraries that may have licenses +differing from that of Snap.svg itself. You can find the libraries and their +respective licenses below. + + - eve ./node_modules/eve + + https://github.com/adobe-webplatform/eve/ + + Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + - Mocha ./node_modules/mocha + + https://github.com/visionmedia/mocha/ + + (The MIT License) + + Copyright (c) 2011-2013 TJ Holowaychuk + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + 'Software'), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + - Expect ./node_modules/expect.js + + https://github.com/LearnBoost/expect.js + + (The MIT License) + + Copyright (c) 2011 Guillermo Rauch + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + 'Software'), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + - Grunt ./node_modules/grunt + + http://gruntjs.com + + Copyright (c) 2013 "Cowboy" Ben Alman + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + + - Backbone ./demos/animated-game/js/backbone.js + + http://backbonejs.org/ + + (The MIT License) + + Copyright (c) 2010-2013 Jeremy Ashkenas, DocumentCloud + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + 'Software'), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + - Underscore ./demos/animated-game/js/underscore.js + + http://underscorejs.org + + (The MIT License) + + Copyright (c) 2010-2013 Jeremy Ashkenas, DocumentCloud + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + 'Software'), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + - jQuery ./demos/animated-game/js/jquery-1.9.0.min.js + + http://http://jquery.com/ + + (The MIT License) + + Copyright 2013 jQuery Foundation and other contributors + http://jquery.com/ + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + 'Software'), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/README.md b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/README.md new file mode 100644 index 0000000..8040710 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/README.md @@ -0,0 +1,68 @@ +[Snap.svg](http://snapsvg.io) +====== + +A JavaScript SVG library for the modern web. Learn more at [snapsvg.io](http://snapsvg.io). + +[Follow us on Twitter.](https://twitter.com/snapsvg) + +### Install +* [Bower](http://bower.io/) - `bower install snap.svg` +* Manual Minified - https://github.com/adobe-webplatform/Snap.svg/raw/master/dist/snap.svg-min.js +* Manual Unminified - https://raw.githubusercontent.com/adobe-webplatform/Snap.svg/master/dist/snap.svg.js + + +### Learn + +* [About Snap.svg](http://snapsvg.io/about/) +* [Getting Started](http://snapsvg.io/start/) +* [API Reference](http://snapsvg.io/docs/) + +### Use + +In your HTML file, load simply by: `` +No other scripts are needed. Both the minified and uncompressed (for development) versions are in the `/dist` folder. + +### Build + +Snap.svg uses [Grunt](http://gruntjs.com/) to build. + +* Open the terminal from the Snap.svg directory: + + cd Snap.svg + +* Install its command line interface (CLI) globally: + + npm install -g grunt-cli + +_*You might need to use `sudo npm`, depending on your configuration._ + +* Install dependencies with npm: + + npm install + +_*Snap.svg uses Grunt 0.4.0. You might want to [read](http://gruntjs.com/getting-started) more on their website if you haven’t upgraded since a lot has changed._ + +* Type `grunt` in the command line to build the files. +* The results will be built into the release folder. +* Alternatively type `grunt watch` to have the build run automatically when you make changes to source files. + +### Contribute + +* [Fill out the CLA](http://snapsvg.io/contributions/). +* [Fork](https://help.github.com/articles/fork-a-repo) the repo. +* Create a branch: + + git checkout -b my_branch + +* Add your changes. +* Commit your changes: + + git commit -am "Added some awesome stuff" + +* Push your branch: + + git push origin my_branch + +* Make a [pull request](https://help.github.com/articles/using-pull-requests) to `dev` branch. + +*Note:* Pull requests to other branches than `dev` or without filled CLA wouldn’t be accepted. diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/bower.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/bower.json new file mode 100644 index 0000000..2d97a8f --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/bower.json @@ -0,0 +1,25 @@ +{ + "name": "Snap.svg", + "version": "0.4.0", + "homepage": "http://snapsvg.io", + "authors": [ + "Dmitry Baranovskiy " + ], + "description": "The JavaScript library for modern SVG graphics", + "main": "dist/snap.svg-min.js", + "keywords": [ + "svg", + "snap", + "js", + "javascript" + ], + "license": "Apache 2", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "demos", + "src" + ] +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/component.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/component.json new file mode 100644 index 0000000..a9fdee3 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/component.json @@ -0,0 +1,13 @@ +{ + "name": "Snap.svg", + "repo": "adobe-webplatform/Snap.svg", + "description": "The JavaScript library for modern SVG graphics.", + "version": "0.3.0", + "keywords": ["svg", "snap", "js", "javascript"], + "dependencies": {}, + "development": {}, + "main": "dist/snap.svg-min.js", + "scripts": [ + "dist/snap.svg-min.js" + ] +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg-min.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg-min.js new file mode 100644 index 0000000..6567d19 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg-min.js @@ -0,0 +1,21 @@ +// Snap.svg 0.4.1 +// +// Copyright (c) 2013 – 2015 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// build: 2015-04-13 + +!function(a){var b,c,d="0.4.2",e="hasOwnProperty",f=/[\.\/]/,g=/\s*,\s*/,h="*",i=function(a,b){return a-b},j={n:{}},k=function(){for(var a=0,b=this.length;b>a;a++)if("undefined"!=typeof this[a])return this[a]},l=function(){for(var a=this.length;--a;)if("undefined"!=typeof this[a])return this[a]},m=function(a,d){a=String(a);var e,f=c,g=Array.prototype.slice.call(arguments,2),h=m.listeners(a),j=0,n=[],o={},p=[],q=b;p.firstDefined=k,p.lastDefined=l,b=a,c=0;for(var r=0,s=h.length;s>r;r++)"zIndex"in h[r]&&(n.push(h[r].zIndex),h[r].zIndex<0&&(o[h[r].zIndex]=h[r]));for(n.sort(i);n[j]<0;)if(e=o[n[j++]],p.push(e.apply(d,g)),c)return c=f,p;for(r=0;s>r;r++)if(e=h[r],"zIndex"in e)if(e.zIndex==n[j]){if(p.push(e.apply(d,g)),c)break;do if(j++,e=o[n[j]],e&&p.push(e.apply(d,g)),c)break;while(e)}else o[e.zIndex]=e;else if(p.push(e.apply(d,g)),c)break;return c=f,b=q,p};m._events=j,m.listeners=function(a){var b,c,d,e,g,i,k,l,m=a.split(f),n=j,o=[n],p=[];for(e=0,g=m.length;g>e;e++){for(l=[],i=0,k=o.length;k>i;i++)for(n=o[i].n,c=[n[m[e]],n[h]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},m.on=function(a,b){if(a=String(a),"function"!=typeof b)return function(){};for(var c=a.split(g),d=0,e=c.length;e>d;d++)!function(a){for(var c,d=a.split(f),e=j,g=0,h=d.length;h>g;g++)e=e.n,e=e.hasOwnProperty(d[g])&&e[d[g]]||(e[d[g]]={n:{}});for(e.f=e.f||[],g=0,h=e.f.length;h>g;g++)if(e.f[g]==b){c=!0;break}!c&&e.f.push(b)}(c[d]);return function(a){+a==+a&&(b.zIndex=+a)}},m.f=function(a){var b=[].slice.call(arguments,1);return function(){m.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},m.stop=function(){c=1},m.nt=function(a){return a?new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)").test(b):b},m.nts=function(){return b.split(f)},m.off=m.unbind=function(a,b){if(!a)return void(m._events=j={n:{}});var c=a.split(g);if(c.length>1)for(var d=0,i=c.length;i>d;d++)m.off(c[d],b);else{c=a.split(f);var k,l,n,d,i,o,p,q=[j];for(d=0,i=c.length;i>d;d++)for(o=0;od;d++)for(k=q[d];k.n;){if(b){if(k.f){for(o=0,p=k.f.length;p>o;o++)if(k.f[o]==b){k.f.splice(o,1);break}!k.f.length&&delete k.f}for(l in k.n)if(k.n[e](l)&&k.n[l].f){var r=k.n[l].f;for(o=0,p=r.length;p>o;o++)if(r[o]==b){r.splice(o,1);break}!r.length&&delete k.n[l].f}}else{delete k.f;for(l in k.n)k.n[e](l)&&k.n[l].f&&delete k.n[l].f}k=k.n}}},m.once=function(a,b){var c=function(){return m.unbind(a,c),b.apply(this,arguments)};return m.on(a,c)},m.version=d,m.toString=function(){return"You are running Eve "+d},"undefined"!=typeof module&&module.exports?module.exports=m:"function"==typeof define&&define.amd?define("eve",[],function(){return m}):a.eve=m}(this),function(a,b){if("function"==typeof define&&define.amd)define(["eve"],function(c){return b(a,c)});else if("undefined"!=typeof exports){var c=require("eve");module.exports=b(a,c)}else b(a,a.eve)}(window||this,function(a,b){var c=function(b){var c={},d=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){setTimeout(a,16)},e=Array.isArray||function(a){return a instanceof Array||"[object Array]"==Object.prototype.toString.call(a)},f=0,g="M"+(+new Date).toString(36),h=function(){return g+(f++).toString(36)},i=Date.now||function(){return+new Date},j=function(a){var b=this;if(null==a)return b.s;var c=b.s-a;b.b+=b.dur*c,b.B+=b.dur*c,b.s=a},k=function(a){var b=this;return null==a?b.spd:void(b.spd=a)},l=function(a){var b=this;return null==a?b.dur:(b.s=b.s*a/b.dur,void(b.dur=a))},m=function(){var a=this;delete c[a.id],a.update(),b("mina.stop."+a.id,a)},n=function(){var a=this;a.pdif||(delete c[a.id],a.update(),a.pdif=a.get()-a.b)},o=function(){var a=this;a.pdif&&(a.b=a.get()-a.pdif,delete a.pdif,c[a.id]=a)},p=function(){var a,b=this;if(e(b.start)){a=[];for(var c=0,d=b.start.length;d>c;c++)a[c]=+b.start[c]+(b.end[c]-b.start[c])*b.easing(b.s)}else a=+b.start+(b.end-b.start)*b.easing(b.s);b.set(a)},q=function(){var a=0;for(var e in c)if(c.hasOwnProperty(e)){var f=c[e],g=f.get();a++,f.s=(g-f.b)/(f.dur/f.spd),f.s>=1&&(delete c[e],f.s=1,a--,function(a){setTimeout(function(){b("mina.finish."+a.id,a)})}(f)),f.update()}a&&d(q)},r=function(a,b,e,f,g,i,s){var t={id:h(),start:a,end:b,b:e,s:0,dur:f-e,spd:1,get:g,set:i,easing:s||r.linear,status:j,speed:k,duration:l,stop:m,pause:n,resume:o,update:p};c[t.id]=t;var u,v=0;for(u in c)if(c.hasOwnProperty(u)&&(v++,2==v))break;return 1==v&&d(q),t};return r.time=i,r.getById=function(a){return c[a]||null},r.linear=function(a){return a},r.easeout=function(a){return Math.pow(a,1.7)},r.easein=function(a){return Math.pow(a,.48)},r.easeinout=function(a){if(1==a)return 1;if(0==a)return 0;var b=.48-a/1.04,c=Math.sqrt(.1734+b*b),d=c-b,e=Math.pow(Math.abs(d),1/3)*(0>d?-1:1),f=-c-b,g=Math.pow(Math.abs(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},r.backin=function(a){if(1==a)return 1;var b=1.70158;return a*a*((b+1)*a-b)},r.backout=function(a){if(0==a)return 0;a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},r.elastic=function(a){return a==!!a?a:Math.pow(2,-10*a)*Math.sin(2*(a-.075)*Math.PI/.3)+1},r.bounce=function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b},a.mina=r,r}("undefined"==typeof b?function(){}:b),d=function(a){function c(a,b){if(a){if(a.nodeType)return w(a);if(e(a,"array")&&c.set)return c.set.apply(c,a);if(a instanceof s)return a;if(null==b)return a=y.doc.querySelector(String(a)),w(a)}return a=null==a?"100%":a,b=null==b?"100%":b,new v(a,b)}function d(a,b){if(b){if("#text"==a&&(a=y.doc.createTextNode(b.text||b["#text"]||"")),"#comment"==a&&(a=y.doc.createComment(b.text||b["#text"]||"")),"string"==typeof a&&(a=d(a)),"string"==typeof b)return 1==a.nodeType?"xlink:"==b.substring(0,6)?a.getAttributeNS(T,b.substring(6)):"xml:"==b.substring(0,4)?a.getAttributeNS(U,b.substring(4)):a.getAttribute(b):"text"==b?a.nodeValue:null;if(1==a.nodeType){for(var c in b)if(b[z](c)){var e=A(b[c]);e?"xlink:"==c.substring(0,6)?a.setAttributeNS(T,c.substring(6),e):"xml:"==c.substring(0,4)?a.setAttributeNS(U,c.substring(4),e):a.setAttribute(c,e):a.removeAttribute(c)}}else"text"in b&&(a.nodeValue=b.text)}else a=y.doc.createElementNS(U,a);return a}function e(a,b){return b=A.prototype.toLowerCase.call(b),"finite"==b?isFinite(a):"array"==b&&(a instanceof Array||Array.isArray&&Array.isArray(a))?!0:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||J.call(a).slice(8,-1).toLowerCase()==b}function f(a){if("function"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[z](c)&&(b[c]=f(a[c]));return b}function h(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function i(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("␀"),g=d.cache=d.cache||{},i=d.count=d.count||[];return g[z](f)?(h(i,f),c?c(g[f]):g[f]):(i.length>=1e3&&delete g[i.shift()],i.push(f),g[f]=a.apply(b,e),c?c(g[f]):g[f])}return d}function j(a,b,c,d,e,f){if(null==e){var g=a-c,h=b-d;return g||h?(180+180*D.atan2(-h,-g)/H+360)%360:0}return j(a,b,e,f)-j(c,d,e,f)}function k(a){return a%360*H/180}function l(a){return 180*a/H%360}function m(a){var b=[];return a=a.replace(/(?:^|\s)(\w+)\(([^)]+)\)/g,function(a,c,d){return d=d.split(/\s*,\s*|\s+/),"rotate"==c&&1==d.length&&d.push(0,0),"scale"==c&&(d.length>2?d=d.slice(0,2):2==d.length&&d.push(0,0),1==d.length&&d.push(d[0],0,0)),b.push("skewX"==c?["m",1,0,D.tan(k(d[0])),1,0,0]:"skewY"==c?["m",1,D.tan(k(d[0])),0,1,0,0]:[c.charAt(0)].concat(d)),a}),b}function n(a,b){var d=ab(a),e=new c.Matrix;if(d)for(var f=0,g=d.length;g>f;f++){var h,i,j,k,l,m=d[f],n=m.length,o=A(m[0]).toLowerCase(),p=m[0]!=o,q=p?e.invert():0;"t"==o&&2==n?e.translate(m[1],0):"t"==o&&3==n?p?(h=q.x(0,0),i=q.y(0,0),j=q.x(m[1],m[2]),k=q.y(m[1],m[2]),e.translate(j-h,k-i)):e.translate(m[1],m[2]):"r"==o?2==n?(l=l||b,e.rotate(m[1],l.x+l.width/2,l.y+l.height/2)):4==n&&(p?(j=q.x(m[2],m[3]),k=q.y(m[2],m[3]),e.rotate(m[1],j,k)):e.rotate(m[1],m[2],m[3])):"s"==o?2==n||3==n?(l=l||b,e.scale(m[1],m[n-1],l.x+l.width/2,l.y+l.height/2)):4==n?p?(j=q.x(m[2],m[3]),k=q.y(m[2],m[3]),e.scale(m[1],m[1],j,k)):e.scale(m[1],m[1],m[2],m[3]):5==n&&(p?(j=q.x(m[3],m[4]),k=q.y(m[3],m[4]),e.scale(m[1],m[2],j,k)):e.scale(m[1],m[2],m[3],m[4])):"m"==o&&7==n&&e.add(m[1],m[2],m[3],m[4],m[5],m[6])}return e}function o(a){var b=a.node.ownerSVGElement&&w(a.node.ownerSVGElement)||a.node.parentNode&&w(a.node.parentNode)||c.select("svg")||c(0,0),d=b.select("defs"),e=null==d?!1:d.node;return e||(e=u("defs",b.node).node),e}function p(a){return a.node.ownerSVGElement&&w(a.node.ownerSVGElement)||c.select("svg")}function q(a,b,c){function e(a){if(null==a)return I;if(a==+a)return a;d(j,{width:a});try{return j.getBBox().width}catch(b){return 0}}function f(a){if(null==a)return I;if(a==+a)return a;d(j,{height:a});try{return j.getBBox().height}catch(b){return 0}}function g(d,e){null==b?i[d]=e(a.attr(d)||0):d==b&&(i=e(null==c?a.attr(d)||0:c))}var h=p(a).node,i={},j=h.querySelector(".svg---mgr");switch(j||(j=d("rect"),d(j,{x:-9e9,y:-9e9,width:10,height:10,"class":"svg---mgr",fill:"none"}),h.appendChild(j)),a.type){case"rect":g("rx",e),g("ry",f);case"image":g("width",e),g("height",f);case"text":g("x",e),g("y",f);break;case"circle":g("cx",e),g("cy",f),g("r",e);break;case"ellipse":g("cx",e),g("cy",f),g("rx",e),g("ry",f);break;case"line":g("x1",e),g("x2",e),g("y1",f),g("y2",f);break;case"marker":g("refX",e),g("markerWidth",e),g("refY",f),g("markerHeight",f);break;case"radialGradient":g("fx",e),g("fy",f);break;case"tspan":g("dx",e),g("dy",f);break;default:g(b,e)}return h.removeChild(j),i}function r(a){e(a,"array")||(a=Array.prototype.slice.call(arguments,0));for(var b=0,c=0,d=this.node;this[b];)delete this[b++];for(b=0;bc;c++){var e={type:a[c].type,attr:a[c].attr()},f=a[c].children();b.push(e),f.length&&x(f,e.childNodes=[])}}c.version="0.4.0",c.toString=function(){return"Snap v"+this.version},c._={};var y={win:a.window,doc:a.window.document};c._.glob=y;{var z="hasOwnProperty",A=String,B=parseFloat,C=parseInt,D=Math,E=D.max,F=D.min,G=D.abs,H=(D.pow,D.PI),I=(D.round,""),J=Object.prototype.toString,K=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?%?)\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?%?)\s*\))\s*$/i,L=(c._.separator=/[,\s]+/,/[\s]*,[\s]*/),M={hs:1,rg:1},N=/([a-z])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\s]*,?[\s]*)+)/gi,O=/([rstm])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\s]*,?[\s]*)+)/gi,P=/(-?\d*\.?\d*(?:e[\-+]?\\d+)?)[\s]*,?[\s]*/gi,Q=0,R="S"+(+new Date).toString(36),S=function(a){return(a&&a.type?a.type:I)+R+(Q++).toString(36)},T="http://www.w3.org/1999/xlink",U="http://www.w3.org/2000/svg",V={};c.url=function(a){return"url('#"+a+"')"}}c._.$=d,c._.id=S,c.format=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return A(b).replace(a,function(a,b){return c(a,b,d)})}}(),c._.clone=f,c._.cacher=i,c.rad=k,c.deg=l,c.sin=function(a){return D.sin(c.rad(a))},c.tan=function(a){return D.tan(c.rad(a))},c.cos=function(a){return D.cos(c.rad(a))},c.asin=function(a){return c.deg(D.asin(a))},c.acos=function(a){return c.deg(D.acos(a))},c.atan=function(a){return c.deg(D.atan(a))},c.atan2=function(a){return c.deg(D.atan2(a))},c.angle=j,c.len=function(a,b,d,e){return Math.sqrt(c.len2(a,b,d,e))},c.len2=function(a,b,c,d){return(a-c)*(a-c)+(b-d)*(b-d)},c.closestPoint=function(a,b,c){function d(a){var d=a.x-b,e=a.y-c;return d*d+e*e}for(var e,f,g,h,i=a.node,j=i.getTotalLength(),k=j/i.pathSegList.numberOfItems*.125,l=1/0,m=0;j>=m;m+=k)(h=d(g=i.getPointAtLength(m))).5;){var n,o,p,q,r,s;(p=f-k)>=0&&(r=d(n=i.getPointAtLength(p)))f)return b-f;if(f>a-c)return b-f+a}return b},c.getRGB=i(function(a){if(!a||(a=A(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:Z};if("none"==a)return{r:-1,g:-1,b:-1,hex:"none",toString:Z};if(!(M[z](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=W(a)),!a)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:Z};var b,d,f,g,h,i,j=a.match(K);return j?(j[2]&&(f=C(j[2].substring(5),16),d=C(j[2].substring(3,5),16),b=C(j[2].substring(1,3),16)),j[3]&&(f=C((h=j[3].charAt(3))+h,16),d=C((h=j[3].charAt(2))+h,16),b=C((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4].split(L),b=B(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=B(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),f=B(i[2]),"%"==i[2].slice(-1)&&(f*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(g=B(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100)),j[5]?(i=j[5].split(L),b=B(i[0]),"%"==i[0].slice(-1)&&(b/=100),d=B(i[1]),"%"==i[1].slice(-1)&&(d/=100),f=B(i[2]),"%"==i[2].slice(-1)&&(f/=100),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(g=B(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100),c.hsb2rgb(b,d,f,g)):j[6]?(i=j[6].split(L),b=B(i[0]),"%"==i[0].slice(-1)&&(b/=100),d=B(i[1]),"%"==i[1].slice(-1)&&(d/=100),f=B(i[2]),"%"==i[2].slice(-1)&&(f/=100),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(g=B(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100),c.hsl2rgb(b,d,f,g)):(b=F(D.round(b),255),d=F(D.round(d),255),f=F(D.round(f),255),g=F(E(g,0),1),j={r:b,g:d,b:f,toString:Z},j.hex="#"+(16777216|f|d<<8|b<<16).toString(16).slice(1),j.opacity=e(g,"finite")?g:1,j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:Z}},c),c.hsb=i(function(a,b,d){return c.hsb2rgb(a,b,d).hex}),c.hsl=i(function(a,b,d){return c.hsl2rgb(a,b,d).hex}),c.rgb=i(function(a,b,c,d){if(e(d,"finite")){var f=D.round;return"rgba("+[f(a),f(b),f(c),+d.toFixed(2)]+")"}return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)});var W=function(a){var b=y.doc.getElementsByTagName("head")[0]||y.doc.getElementsByTagName("svg")[0],c="rgb(255, 0, 0)";return(W=i(function(a){if("red"==a.toLowerCase())return c;b.style.color=c,b.style.color=a;var d=y.doc.defaultView.getComputedStyle(b,I).getPropertyValue("color");return d==c?null:d}))(a)},X=function(){return"hsb("+[this.h,this.s,this.b]+")"},Y=function(){return"hsl("+[this.h,this.s,this.l]+")"},Z=function(){return 1==this.opacity||null==this.opacity?this.hex:"rgba("+[this.r,this.g,this.b,this.opacity]+")"},$=function(a,b,d){if(null==b&&e(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,b=a.g,a=a.r),null==b&&e(a,string)){var f=c.getRGB(a);a=f.r,b=f.g,d=f.b}return(a>1||b>1||d>1)&&(a/=255,b/=255,d/=255),[a,b,d]},_=function(a,b,d,f){a=D.round(255*a),b=D.round(255*b),d=D.round(255*d);var g={r:a,g:b,b:d,opacity:e(f,"finite")?f:1,hex:c.rgb(a,b,d),toString:Z};return e(f,"finite")&&(g.opacity=f),g};c.color=function(a){var b;return e(a,"object")&&"h"in a&&"s"in a&&"b"in a?(b=c.hsb2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.opacity=1,a.hex=b.hex):e(a,"object")&&"h"in a&&"s"in a&&"l"in a?(b=c.hsl2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.opacity=1,a.hex=b.hex):(e(a,"string")&&(a=c.getRGB(a)),e(a,"object")&&"r"in a&&"g"in a&&"b"in a&&!("error"in a)?(b=c.rgb2hsl(a),a.h=b.h,a.s=b.s,a.l=b.l,b=c.rgb2hsb(a),a.v=b.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1,a.error=1)),a.toString=Z,a},c.hsb2rgb=function(a,b,c,d){e(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,d=a.o,a=a.h),a*=360;var f,g,h,i,j;return a=a%360/60,j=c*b,i=j*(1-G(a%2-1)),f=g=h=c-j,a=~~a,f+=[j,i,0,0,i,j][a],g+=[i,j,j,i,0,0][a],h+=[0,0,i,j,j,i][a],_(f,g,h,d)},c.hsl2rgb=function(a,b,c,d){e(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var f,g,h,i,j;return a=a%360/60,j=2*b*(.5>c?c:1-c),i=j*(1-G(a%2-1)),f=g=h=c-j/2,a=~~a,f+=[j,i,0,0,i,j][a],g+=[i,j,j,i,0,0][a],h+=[0,0,i,j,j,i][a],_(f,g,h,d)},c.rgb2hsb=function(a,b,c){c=$(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=E(a,b,c),g=f-F(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:X}},c.rgb2hsl=function(a,b,c){c=$(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=E(a,b,c),h=F(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:Y}},c.parsePathString=function(a){if(!a)return null;var b=c.path(a);if(b.arr)return c.path.clone(b.arr);var d={a:7,c:6,o:2,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,u:3,z:0},f=[];return e(a,"array")&&e(a[0],"array")&&(f=c.path.clone(a)),f.length||A(a).replace(N,function(a,b,c){var e=[],g=b.toLowerCase();if(c.replace(P,function(a,b){b&&e.push(+b)}),"m"==g&&e.length>2&&(f.push([b].concat(e.splice(0,2))),g="l",b="m"==b?"l":"L"),"o"==g&&1==e.length&&f.push([b,e[0]]),"r"==g)f.push([b].concat(e));else for(;e.length>=d[g]&&(f.push([b].concat(e.splice(0,d[g]))),d[g]););}),f.toString=c.path.toString,b.arr=c.path.clone(f),f};var ab=c.parseTransformString=function(a){if(!a)return null;var b=[];return e(a,"array")&&e(a[0],"array")&&(b=c.path.clone(a)),b.length||A(a).replace(O,function(a,c,d){{var e=[];c.toLowerCase()}d.replace(P,function(a,b){b&&e.push(+b)}),b.push([c].concat(e))}),b.toString=c.path.toString,b};c._.svgTransform2string=m,c._.rgTransform=/^[a-z][\s]*-?\.?\d/i,c._.transform2matrix=n,c._unit2px=q;y.doc.contains||y.doc.compareDocumentPosition?function(a,b){var c=9==a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a==d||!(!d||1!=d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b;)if(b=b.parentNode,b==a)return!0;return!1};c._.getSomeDefs=o,c._.getSomeSVG=p,c.select=function(a){return a=A(a).replace(/([^\\]):/g,"$1\\:"),w(y.doc.querySelector(a))},c.selectAll=function(a){for(var b=y.doc.querySelectorAll(a),d=(c.set||Array)(),e=0;ei;i++)h[g[i].nodeName]=g[i].nodeValue;return h}if(e(a,"string")){if(!(arguments.length>1))return b("snap.util.getattr."+a,d).firstDefined();var k={};k[a]=c,a=k}for(var l in a)a[z](l)&&b("snap.util.attr."+l,d,a[l]);return d},c.parse=function(a){var b=y.doc.createDocumentFragment(),c=!0,d=y.doc.createElement("div");if(a=A(a),a.match(/^\s*<\s*svg(?:\s|>)/)||(a=""+a+"",c=!1),d.innerHTML=a,a=d.getElementsByTagName("svg")[0])if(c)b=a;else for(;a.firstChild;)b.appendChild(a.firstChild);return new t(b)},c.fragment=function(){for(var a=Array.prototype.slice.call(arguments,0),b=y.doc.createDocumentFragment(),d=0,e=a.length;e>d;d++){var f=a[d];f.node&&f.node.nodeType&&b.appendChild(f.node),f.nodeType&&b.appendChild(f),"string"==typeof f&&b.appendChild(c.parse(f).node)}return new t(b)},c._.make=u,c._.wrap=w,v.prototype.el=function(a,b){var c=u(a,this.node);return b&&c.attr(b),c},s.prototype.children=function(){for(var a=[],b=this.node.childNodes,d=0,e=b.length;e>d;d++)a[d]=c(b[d]);return a},s.prototype.toJSON=function(){var a=[];return x([this],a),a[0]},b.on("snap.util.getattr",function(){var a=b.nt();a=a.substring(a.lastIndexOf(".")+1);var c=a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()});return bb[z](c)?this.node.ownerDocument.defaultView.getComputedStyle(this.node,null).getPropertyValue(c):d(this.node,a)});var bb={"alignment-baseline":0,"baseline-shift":0,clip:0,"clip-path":0,"clip-rule":0,color:0,"color-interpolation":0,"color-interpolation-filters":0,"color-profile":0,"color-rendering":0,cursor:0,direction:0,display:0,"dominant-baseline":0,"enable-background":0,fill:0,"fill-opacity":0,"fill-rule":0,filter:0,"flood-color":0,"flood-opacity":0,font:0,"font-family":0,"font-size":0,"font-size-adjust":0,"font-stretch":0,"font-style":0,"font-variant":0,"font-weight":0,"glyph-orientation-horizontal":0,"glyph-orientation-vertical":0,"image-rendering":0,kerning:0,"letter-spacing":0,"lighting-color":0,marker:0,"marker-end":0,"marker-mid":0,"marker-start":0,mask:0,opacity:0,overflow:0,"pointer-events":0,"shape-rendering":0,"stop-color":0,"stop-opacity":0,stroke:0,"stroke-dasharray":0,"stroke-dashoffset":0,"stroke-linecap":0,"stroke-linejoin":0,"stroke-miterlimit":0,"stroke-opacity":0,"stroke-width":0,"text-anchor":0,"text-decoration":0,"text-rendering":0,"unicode-bidi":0,visibility:0,"word-spacing":0,"writing-mode":0};b.on("snap.util.attr",function(a){var c=b.nt(),e={};c=c.substring(c.lastIndexOf(".")+1),e[c]=a;var f=c.replace(/-(\w)/gi,function(a,b){return b.toUpperCase()}),g=c.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()});bb[z](g)?this.node.style[f]=null==a?I:a:d(this.node,e)}),function(){}(v.prototype),c.ajax=function(a,c,d,f){var g=new XMLHttpRequest,h=S();if(g){if(e(c,"function"))f=d,d=c,c=null;else if(e(c,"object")){var i=[];for(var j in c)c.hasOwnProperty(j)&&i.push(encodeURIComponent(j)+"="+encodeURIComponent(c[j]));c=i.join("&")}return g.open(c?"POST":"GET",a,!0),c&&(g.setRequestHeader("X-Requested-With","XMLHttpRequest"),g.setRequestHeader("Content-type","application/x-www-form-urlencoded")),d&&(b.once("snap.ajax."+h+".0",d),b.once("snap.ajax."+h+".200",d),b.once("snap.ajax."+h+".304",d)),g.onreadystatechange=function(){4==g.readyState&&b("snap.ajax."+h+"."+g.status,f,g)},4==g.readyState?g:(g.send(c),g)}},c.load=function(a,b,d){c.ajax(a,function(a){var e=c.parse(a.responseText);d?b.call(d,e):b(e)})};var cb=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,h=e.clientLeft||d.clientLeft||0,i=b.top+(g.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(g.win.pageXOffset||e.scrollLeft||d.scrollLeft)-h;return{y:i,x:j}};return c.getElementByPoint=function(a,b){var c=this,d=(c.canvas,y.doc.elementFromPoint(a,b));if(y.win.opera&&"svg"==d.tagName){var e=cb(d),f=d.createSVGRect();f.x=a-e.x,f.y=b-e.y,f.width=f.height=1;var g=d.getIntersectionList(f,null);g.length&&(d=g[g.length-1])}return d?w(d):null},c.plugin=function(a){a(c,s,v,y,t)},y.win.Snap=c,c}(a||this);return d.plugin(function(d,e,f,g,h){function i(a,b){if(null==b){var c=!0;if(b=a.node.getAttribute("linearGradient"==a.type||"radialGradient"==a.type?"gradientTransform":"pattern"==a.type?"patternTransform":"transform"),!b)return new d.Matrix;b=d._.svgTransform2string(b)}else b=d._.rgTransform.test(b)?o(b).replace(/\.{3}|\u2026/g,a._.transform||""):d._.svgTransform2string(b),n(b,"array")&&(b=d.path?d.path.toString.call(b):o(b)),a._.transform=b;var e=d._.transform2matrix(b,a.getBBox(1));return c?e:void(a.matrix=e)}function j(a){function b(a,b){var c=q(a.node,b);c=c&&c.match(f),c=c&&c[2],c&&"#"==c.charAt()&&(c=c.substring(1),c&&(h[c]=(h[c]||[]).concat(function(c){var d={};d[b]=URL(c),q(a.node,d)})))}function c(a){var b=q(a.node,"xlink:href");b&&"#"==b.charAt()&&(b=b.substring(1),b&&(h[b]=(h[b]||[]).concat(function(b){a.attr("xlink:href","#"+b)})))}for(var d,e=a.selectAll("*"),f=/^\s*url\(("|'|)(.*)\1\)\s*$/,g=[],h={},i=0,j=e.length;j>i;i++){d=e[i],b(d,"fill"),b(d,"stroke"),b(d,"filter"),b(d,"mask"),b(d,"clip-path"),c(d);var k=q(d.node,"id");k&&(q(d.node,{id:d.id}),g.push({old:k,id:d.id}))}for(i=0,j=g.length;j>i;i++){var l=h[g[i].old];if(l)for(var m=0,n=l.length;n>m;m++)l[m](g[i].id)}}function k(a,b,c){return function(d){var e=d.slice(a,b);return 1==e.length&&(e=e[0]),c?c(e):e}}function l(a){return function(){var b=a?"<"+this.type:"",c=this.node.attributes,d=this.node.childNodes;if(a)for(var e=0,f=c.length;f>e;e++)b+=" "+c[e].name+'="'+c[e].value.replace(/"/g,'\\"')+'"';if(d.length){for(a&&(b+=">"),e=0,f=d.length;f>e;e++)3==d[e].nodeType?b+=d[e].nodeValue:1==d[e].nodeType&&(b+=u(d[e]).toString());a&&(b+="")}else a&&(b+="/>");return b}}var m=e.prototype,n=d.is,o=String,p=d._unit2px,q=d._.$,r=d._.make,s=d._.getSomeDefs,t="hasOwnProperty",u=d._.wrap;m.getBBox=function(a){if(!d.Matrix||!d.path)return this.node.getBBox();var b=this,c=new d.Matrix;if(b.removed)return d._.box();for(;"use"==b.type;)if(a||(c=c.add(b.transform().localMatrix.translate(b.attr("x")||0,b.attr("y")||0))),b.original)b=b.original;else{var e=b.attr("xlink:href");b=b.original=b.node.ownerDocument.getElementById(e.substring(e.indexOf("#")+1))}var f=b._,g=d.path.get[b.type]||d.path.get.deflt;try{return a?(f.bboxwt=g?d.path.getBBox(b.realPath=g(b)):d._.box(b.node.getBBox()),d._.box(f.bboxwt)):(b.realPath=g(b),b.matrix=b.transform().localMatrix,f.bbox=d.path.getBBox(d.path.map(b.realPath,c.add(b.matrix))),d._.box(f.bbox))}catch(h){return d._.box()}};var v=function(){return this.string};m.transform=function(a){var b=this._;if(null==a){for(var c,e=this,f=new d.Matrix(this.node.getCTM()),g=i(this),h=[g],j=new d.Matrix,k=g.toTransformString(),l=o(g)==o(this.matrix)?o(b.transform):k;"svg"!=e.type&&(e=e.parent());)h.push(i(e));for(c=h.length;c--;)j.add(h[c]);return{string:l,globalMatrix:f,totalMatrix:j,localMatrix:g,diffMatrix:f.clone().add(g.invert()),global:f.toTransformString(),total:j.toTransformString(),local:k,toString:v}}return a instanceof d.Matrix?(this.matrix=a,this._.transform=a.toTransformString()):i(this,a),this.node&&("linearGradient"==this.type||"radialGradient"==this.type?q(this.node,{gradientTransform:this.matrix}):"pattern"==this.type?q(this.node,{patternTransform:this.matrix}):q(this.node,{transform:this.matrix})),this},m.parent=function(){return u(this.node.parentNode)},m.append=m.add=function(a){if(a){if("set"==a.type){var b=this;return a.forEach(function(a){b.add(a)}),this}a=u(a),this.node.appendChild(a.node),a.paper=this.paper}return this},m.appendTo=function(a){return a&&(a=u(a),a.append(this)),this},m.prepend=function(a){if(a){if("set"==a.type){var b,c=this;return a.forEach(function(a){b?b.after(a):c.prepend(a),b=a}),this}a=u(a);var d=a.parent();this.node.insertBefore(a.node,this.node.firstChild),this.add&&this.add(),a.paper=this.paper,this.parent()&&this.parent().add(),d&&d.add()}return this},m.prependTo=function(a){return a=u(a),a.prepend(this),this},m.before=function(a){if("set"==a.type){var b=this;return a.forEach(function(a){var c=a.parent();b.node.parentNode.insertBefore(a.node,b.node),c&&c.add()}),this.parent().add(),this}a=u(a);var c=a.parent();return this.node.parentNode.insertBefore(a.node,this.node),this.parent()&&this.parent().add(),c&&c.add(),a.paper=this.paper,this},m.after=function(a){a=u(a);var b=a.parent();return this.node.nextSibling?this.node.parentNode.insertBefore(a.node,this.node.nextSibling):this.node.parentNode.appendChild(a.node),this.parent()&&this.parent().add(),b&&b.add(),a.paper=this.paper,this},m.insertBefore=function(a){a=u(a);var b=this.parent();return a.node.parentNode.insertBefore(this.node,a.node),this.paper=a.paper,b&&b.add(),a.parent()&&a.parent().add(),this},m.insertAfter=function(a){a=u(a);var b=this.parent();return a.node.parentNode.insertBefore(this.node,a.node.nextSibling),this.paper=a.paper,b&&b.add(),a.parent()&&a.parent().add(),this},m.remove=function(){var a=this.parent();return this.node.parentNode&&this.node.parentNode.removeChild(this.node),delete this.paper,this.removed=!0,a&&a.add(),this},m.select=function(a){return u(this.node.querySelector(a))},m.selectAll=function(a){for(var b=this.node.querySelectorAll(a),c=(d.set||Array)(),e=0;eb;b++)a[b].stop();return this},m.animate=function(a,d,e,f){"function"!=typeof e||e.length||(f=e,e=c.linear),a instanceof w&&(f=a.callback,e=a.easing,d=a.dur,a=a.attr);var g,h,i,j,l=[],m=[],p={},q=this;for(var r in a)if(a[t](r)){q.equal?(j=q.equal(r,o(a[r])),g=j.from,h=j.to,i=j.f):(g=+q.attr(r),h=+a[r]);var s=n(g,"array")?g.length:1;p[r]=k(l.length,l.length+s,i),l=l.concat(g),m=m.concat(h)}var u=c.time(),v=c(l,m,u,u+d,c.time,function(a){var b={};for(var c in p)p[t](c)&&(b[c]=p[c](a));q.attr(b)},e);return q.anims[v.id]=v,v._attrs=a,v._callback=f,b("snap.animcreated."+q.id,v),b.once("mina.finish."+v.id,function(){delete q.anims[v.id],f&&f.call(q)}),b.once("mina.stop."+v.id,function(){delete q.anims[v.id]}),q};var x={};m.data=function(a,c){var e=x[this.id]=x[this.id]||{};if(0==arguments.length)return b("snap.data.get."+this.id,this,e,null),e; +if(1==arguments.length){if(d.is(a,"object")){for(var f in a)a[t](f)&&this.data(f,a[f]);return this}return b("snap.data.get."+this.id,this,e[a],a),e[a]}return e[a]=c,b("snap.data.set."+this.id,this,c,a),this},m.removeData=function(a){return null==a?x[this.id]={}:x[this.id]&&delete x[this.id][a],this},m.outerSVG=m.toString=l(1),m.innerSVG=l(),m.toDataURL=function(){if(a&&a.btoa){var b=this.getBBox(),c=d.format('{contents}',{x:+b.x.toFixed(3),y:+b.y.toFixed(3),width:+b.width.toFixed(3),height:+b.height.toFixed(3),contents:this.outerSVG()});return"data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent(c)))}},h.prototype.select=m.select,h.prototype.selectAll=m.selectAll}),d.plugin(function(a){function b(a,b,d,e,f,g){return null==b&&"[object SVGMatrix]"==c.call(a)?(this.a=a.a,this.b=a.b,this.c=a.c,this.d=a.d,this.e=a.e,void(this.f=a.f)):void(null!=a?(this.a=+a,this.b=+b,this.c=+d,this.d=+e,this.e=+f,this.f=+g):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0))}var c=Object.prototype.toString,d=String,e=Math,f="";!function(c){function g(a){return a[0]*a[0]+a[1]*a[1]}function h(a){var b=e.sqrt(g(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)}c.add=function(a,c,d,e,f,g){var h,i,j,k,l=[[],[],[]],m=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],n=[[a,d,f],[c,e,g],[0,0,1]];for(a&&a instanceof b&&(n=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),h=0;3>h;h++)for(i=0;3>i;i++){for(k=0,j=0;3>j;j++)k+=m[h][j]*n[j][i];l[h][i]=k}return this.a=l[0][0],this.b=l[1][0],this.c=l[0][1],this.d=l[1][1],this.e=l[0][2],this.f=l[1][2],this},c.invert=function(){var a=this,c=a.a*a.d-a.b*a.c;return new b(a.d/c,-a.b/c,-a.c/c,a.a/c,(a.c*a.f-a.d*a.e)/c,(a.b*a.e-a.a*a.f)/c)},c.clone=function(){return new b(this.a,this.b,this.c,this.d,this.e,this.f)},c.translate=function(a,b){return this.add(1,0,0,1,a,b)},c.scale=function(a,b,c,d){return null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d),this},c.rotate=function(b,c,d){b=a.rad(b),c=c||0,d=d||0;var f=+e.cos(b).toFixed(9),g=+e.sin(b).toFixed(9);return this.add(f,g,-g,f,c,d),this.add(1,0,0,1,-c,-d)},c.x=function(a,b){return a*this.a+b*this.c+this.e},c.y=function(a,b){return a*this.b+b*this.d+this.f},c.get=function(a){return+this[d.fromCharCode(97+a)].toFixed(4)},c.toString=function(){return"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")"},c.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},c.determinant=function(){return this.a*this.d-this.b*this.c},c.split=function(){var b={};b.dx=this.e,b.dy=this.f;var c=[[this.a,this.c],[this.b,this.d]];b.scalex=e.sqrt(g(c[0])),h(c[0]),b.shear=c[0][0]*c[1][0]+c[0][1]*c[1][1],c[1]=[c[1][0]-c[0][0]*b.shear,c[1][1]-c[0][1]*b.shear],b.scaley=e.sqrt(g(c[1])),h(c[1]),b.shear/=b.scaley,this.determinant()<0&&(b.scalex=-b.scalex);var d=-c[0][1],f=c[1][1];return 0>f?(b.rotate=a.deg(e.acos(f)),0>d&&(b.rotate=360-b.rotate)):b.rotate=a.deg(e.asin(d)),b.isSimple=!(+b.shear.toFixed(9)||b.scalex.toFixed(9)!=b.scaley.toFixed(9)&&b.rotate),b.isSuperSimple=!+b.shear.toFixed(9)&&b.scalex.toFixed(9)==b.scaley.toFixed(9)&&!b.rotate,b.noRotation=!+b.shear.toFixed(9)&&!b.rotate,b},c.toTransformString=function(a){var b=a||this.split();return+b.shear.toFixed(9)?"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]:(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[+b.dx.toFixed(4),+b.dy.toFixed(4)]:f)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:f)+(b.rotate?"r"+[+b.rotate.toFixed(4),0,0]:f))}}(b.prototype),a.Matrix=b,a.matrix=function(a,c,d,e,f,g){return new b(a,c,d,e,f,g)}}),d.plugin(function(a,c,d,e,f){function g(d){return function(e){if(b.stop(),e instanceof f&&1==e.node.childNodes.length&&("radialGradient"==e.node.firstChild.tagName||"linearGradient"==e.node.firstChild.tagName||"pattern"==e.node.firstChild.tagName)&&(e=e.node.firstChild,n(this).appendChild(e),e=l(e)),e instanceof c)if("radialGradient"==e.type||"linearGradient"==e.type||"pattern"==e.type){e.node.id||p(e.node,{id:e.id});var g=q(e.node.id)}else g=e.attr(d);else if(g=a.color(e),g.error){var h=a(n(this).ownerSVGElement).gradient(e);h?(h.node.id||p(h.node,{id:h.id}),g=q(h.node.id)):g=e}else g=r(g);var i={};i[d]=g,p(this.node,i),this.node.style[d]=t}}function h(a){b.stop(),a==+a&&(a+="px"),this.node.style.fontSize=a}function i(a){for(var b=[],c=a.childNodes,d=0,e=c.length;e>d;d++){var f=c[d];3==f.nodeType&&b.push(f.nodeValue),"tspan"==f.tagName&&b.push(1==f.childNodes.length&&3==f.firstChild.nodeType?f.firstChild.nodeValue:i(f))}return b}function j(){return b.stop(),this.node.style.fontSize}var k=a._.make,l=a._.wrap,m=a.is,n=a._.getSomeDefs,o=/^url\(#?([^)]+)\)$/,p=a._.$,q=a.url,r=String,s=a._.separator,t="";b.on("snap.util.attr.mask",function(a){if(a instanceof c||a instanceof f){if(b.stop(),a instanceof f&&1==a.node.childNodes.length&&(a=a.node.firstChild,n(this).appendChild(a),a=l(a)),"mask"==a.type)var d=a;else d=k("mask",n(this)),d.node.appendChild(a.node);!d.node.id&&p(d.node,{id:d.id}),p(this.node,{mask:q(d.id)})}}),function(a){b.on("snap.util.attr.clip",a),b.on("snap.util.attr.clip-path",a),b.on("snap.util.attr.clipPath",a)}(function(a){if(a instanceof c||a instanceof f){if(b.stop(),"clipPath"==a.type)var d=a;else d=k("clipPath",n(this)),d.node.appendChild(a.node),!d.node.id&&p(d.node,{id:d.id});p(this.node,{"clip-path":q(d.node.id||d.id)})}}),b.on("snap.util.attr.fill",g("fill")),b.on("snap.util.attr.stroke",g("stroke"));var u=/^([lr])(?:\(([^)]*)\))?(.*)$/i;b.on("snap.util.grad.parse",function(a){a=r(a);var b=a.match(u);if(!b)return null;var c=b[1],d=b[2],e=b[3];return d=d.split(/\s*,\s*/).map(function(a){return+a==a?+a:a}),1==d.length&&0==d[0]&&(d=[]),e=e.split("-"),e=e.map(function(a){a=a.split(":");var b={color:a[0]};return a[1]&&(b.offset=parseFloat(a[1])),b}),{type:c,params:d,stops:e}}),b.on("snap.util.attr.d",function(c){b.stop(),m(c,"array")&&m(c[0],"array")&&(c=a.path.toString.call(c)),c=r(c),c.match(/[ruo]/i)&&(c=a.path.toAbsolute(c)),p(this.node,{d:c})})(-1),b.on("snap.util.attr.#text",function(a){b.stop(),a=r(a);for(var c=e.doc.createTextNode(a);this.node.firstChild;)this.node.removeChild(this.node.firstChild);this.node.appendChild(c)})(-1),b.on("snap.util.attr.path",function(a){b.stop(),this.attr({d:a})})(-1),b.on("snap.util.attr.class",function(a){b.stop(),this.node.className.baseVal=a})(-1),b.on("snap.util.attr.viewBox",function(a){var c;c=m(a,"object")&&"x"in a?[a.x,a.y,a.width,a.height].join(" "):m(a,"array")?a.join(" "):a,p(this.node,{viewBox:c}),b.stop()})(-1),b.on("snap.util.attr.transform",function(a){this.transform(a),b.stop()})(-1),b.on("snap.util.attr.r",function(a){"rect"==this.type&&(b.stop(),p(this.node,{rx:a,ry:a}))})(-1),b.on("snap.util.attr.textpath",function(a){if(b.stop(),"text"==this.type){var d,e,f;if(!a&&this.textPath){for(e=this.textPath;e.node.firstChild;)this.node.appendChild(e.node.firstChild);return e.remove(),void delete this.textPath}if(m(a,"string")){var g=n(this),h=l(g.parentNode).path(a);g.appendChild(h.node),d=h.id,h.attr({id:d})}else a=l(a),a instanceof c&&(d=a.attr("id"),d||(d=a.id,a.attr({id:d})));if(d)if(e=this.textPath,f=this.node,e)e.attr({"xlink:href":"#"+d});else{for(e=p("textPath",{"xlink:href":"#"+d});f.firstChild;)e.appendChild(f.firstChild);f.appendChild(e),this.textPath=l(e)}}})(-1),b.on("snap.util.attr.text",function(a){if("text"==this.type){for(var c=this.node,d=function(a){var b=p("tspan");if(m(a,"array"))for(var c=0;c1&&(a=Array.prototype.slice.call(arguments,0));var b={};return h(a,"object")&&!h(a,"array")?b=a:null!=a&&(b={points:a}),this.el("polyline",b)},g.polygon=function(a){arguments.length>1&&(a=Array.prototype.slice.call(arguments,0));var b={};return h(a,"object")&&!h(a,"array")?b=a:null!=a&&(b={points:a}),this.el("polygon",b)},function(){function d(){return this.selectAll("stop")}function e(a,b){var d=k("stop"),e={offset:+b+"%"};return a=c.color(a),e["stop-color"]=a.hex,a.opacity<1&&(e["stop-opacity"]=a.opacity),k(d,e),this.node.appendChild(d),this}function f(){if("linearGradient"==this.type){var a=k(this.node,"x1")||0,b=k(this.node,"x2")||1,d=k(this.node,"y1")||0,e=k(this.node,"y2")||0;return c._.box(a,d,math.abs(b-a),math.abs(e-d))}var f=this.node.cx||.5,g=this.node.cy||.5,h=this.node.r||0;return c._.box(f-h,g-h,2*h,2*h)}function h(a,c){function d(a,b){for(var c=(b-l)/(a-m),d=m;a>d;d++)g[d].offset=+(+l+c*(d-m)).toFixed(2);m=a,l=b}var e,f=b("snap.util.grad.parse",null,c).firstDefined();if(!f)return null;f.params.unshift(a),e="l"==f.type.toLowerCase()?i.apply(0,f.params):j.apply(0,f.params),f.type!=f.type.toLowerCase()&&k(e.node,{gradientUnits:"userSpaceOnUse"});var g=f.stops,h=g.length,l=0,m=0;h--;for(var n=0;h>n;n++)"offset"in g[n]&&d(n,g[n].offset);for(g[h].offset=g[h].offset||100,d(h,g[h].offset),n=0;h>=n;n++){var o=g[n];e.addStop(o.color,o.offset)}return e}function i(a,b,g,h,i){var j=c._.make("linearGradient",a);return j.stops=d,j.addStop=e,j.getBBox=f,null!=b&&k(j.node,{x1:b,y1:g,x2:h,y2:i}),j}function j(a,b,g,h,i,j){var l=c._.make("radialGradient",a);return l.stops=d,l.addStop=e,l.getBBox=f,null!=b&&k(l.node,{cx:b,cy:g,r:h}),null!=i&&null!=j&&k(l.node,{fx:i,fy:j}),l}var k=c._.$;g.gradient=function(a){return h(this.defs,a)},g.gradientLinear=function(a,b,c,d){return i(this.defs,a,b,c,d)},g.gradientRadial=function(a,b,c,d,e){return j(this.defs,a,b,c,d,e)},g.toString=function(){var a,b=this.node.ownerDocument,d=b.createDocumentFragment(),e=b.createElement("div"),f=this.node.cloneNode(!0);return d.appendChild(e),e.appendChild(f),c._.$(f,{xmlns:"http://www.w3.org/2000/svg"}),a=e.innerHTML,d.removeChild(d.firstChild),a},g.toDataURL=function(){return a&&a.btoa?"data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent(this))):void 0},g.clear=function(){for(var a,b=this.node.firstChild;b;)a=b.nextSibling,"defs"!=b.tagName?b.parentNode.removeChild(b):g.clear.call({node:b}),b=a}}()}),d.plugin(function(a,b){function c(a){var b=c.ps=c.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[K](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]}function d(a,b,c,d){return null==a&&(a=b=c=d=0),null==b&&(b=a.y,c=a.width,d=a.height,a=a.x),{x:a,y:b,width:c,w:c,height:d,h:d,x2:a+c,y2:b+d,cx:a+c/2,cy:b+d/2,r1:N.min(c,d)/2,r2:N.max(c,d)/2,r0:N.sqrt(c*c+d*d)/2,path:w(a,b,c,d),vb:[a,b,c,d].join(" ")}}function e(){return this.join(",").replace(L,"$1")}function f(a){var b=J(a);return b.toString=e,b}function g(a,b,c,d,e,f,g,h,j){return null==j?n(a,b,c,d,e,f,g,h):i(a,b,c,d,e,f,g,h,o(a,b,c,d,e,f,g,h,j))}function h(c,d){function e(a){return+(+a).toFixed(3)}return a._.cacher(function(a,f,h){a instanceof b&&(a=a.attr("d")),a=E(a);for(var j,k,l,m,n,o="",p={},q=0,r=0,s=a.length;s>r;r++){if(l=a[r],"M"==l[0])j=+l[1],k=+l[2];else{if(m=g(j,k,l[1],l[2],l[3],l[4],l[5],l[6]),q+m>f){if(d&&!p.start){if(n=g(j,k,l[1],l[2],l[3],l[4],l[5],l[6],f-q),o+=["C"+e(n.start.x),e(n.start.y),e(n.m.x),e(n.m.y),e(n.x),e(n.y)],h)return o;p.start=o,o=["M"+e(n.x),e(n.y)+"C"+e(n.n.x),e(n.n.y),e(n.end.x),e(n.end.y),e(l[5]),e(l[6])].join(),q+=m,j=+l[5],k=+l[6];continue}if(!c&&!d)return n=g(j,k,l[1],l[2],l[3],l[4],l[5],l[6],f-q)}q+=m,j=+l[5],k=+l[6]}o+=l.shift()+l}return p.end=o,n=c?q:d?p:i(j,k,l[0],l[1],l[2],l[3],l[4],l[5],1)},null,a._.clone)}function i(a,b,c,d,e,f,g,h,i){var j=1-i,k=R(j,3),l=R(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*N.atan2(q-s,r-t)/O;return{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}}function j(b,c,e,f,g,h,i,j){a.is(b,"array")||(b=[b,c,e,f,g,h,i,j]);var k=D.apply(null,b);return d(k.min.x,k.min.y,k.max.x-k.min.x,k.max.y-k.min.y)}function k(a,b,c){return b>=a.x&&b<=a.x+a.width&&c>=a.y&&c<=a.y+a.height}function l(a,b){return a=d(a),b=d(b),k(b,a.x,a.y)||k(b,a.x2,a.y)||k(b,a.x,a.y2)||k(b,a.x2,a.y2)||k(a,b.x,b.y)||k(a,b.x2,b.y)||k(a,b.x,b.y2)||k(a,b.x2,b.y2)||(a.xb.x||b.xa.x)&&(a.yb.y||b.ya.y)}function m(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function n(a,b,c,d,e,f,g,h,i){null==i&&(i=1),i=i>1?1:0>i?0:i;for(var j=i/2,k=12,l=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;k>p;p++){var q=j*l[p]+j,r=m(q,a,c,e,g),s=m(q,b,d,f,h),t=r*r+s*s;o+=n[p]*N.sqrt(t)}return j*o}function o(a,b,c,d,e,f,g,h,i){if(!(0>i||n(a,b,c,d,e,f,g,h)o;)l/=2,m+=(i>j?1:-1)*l,j=n(a,b,c,d,e,f,g,h,m);return m}}function p(a,b,c,d,e,f,g,h){if(!(Q(a,c)Q(e,g)||Q(b,d)Q(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+P(a,c).toFixed(2)||n>+Q(a,c).toFixed(2)||n<+P(e,g).toFixed(2)||n>+Q(e,g).toFixed(2)||o<+P(b,d).toFixed(2)||o>+Q(b,d).toFixed(2)||o<+P(f,h).toFixed(2)||o>+Q(f,h).toFixed(2)))return{x:l,y:m}}}}function q(a,b,c){var d=j(a),e=j(b);if(!l(d,e))return c?0:[];for(var f=n.apply(0,a),g=n.apply(0,b),h=~~(f/8),k=~~(g/8),m=[],o=[],q={},r=c?0:[],s=0;h+1>s;s++){var t=i.apply(0,a.concat(s/h));m.push({x:t.x,y:t.y,t:s/h})}for(s=0;k+1>s;s++)t=i.apply(0,b.concat(s/k)),o.push({x:t.x,y:t.y,t:s/k});for(s=0;h>s;s++)for(var u=0;k>u;u++){var v=m[s],w=m[s+1],x=o[u],y=o[u+1],z=S(w.x-v.x)<.001?"y":"x",A=S(y.x-x.x)<.001?"y":"x",B=p(v.x,v.y,w.x,w.y,x.x,x.y,y.x,y.y);if(B){if(q[B.x.toFixed(4)]==B.y.toFixed(4))continue;q[B.x.toFixed(4)]=B.y.toFixed(4);var C=v.t+S((B[z]-v[z])/(w[z]-v[z]))*(w.t-v.t),D=x.t+S((B[A]-x[A])/(y[A]-x[A]))*(y.t-x.t);C>=0&&1>=C&&D>=0&&1>=D&&(c?r++:r.push({x:B.x,y:B.y,t1:C,t2:D}))}}return r}function r(a,b){return t(a,b)}function s(a,b){return t(a,b,1)}function t(a,b,c){a=E(a),b=E(b);for(var d,e,f,g,h,i,j,k,l,m,n=c?0:[],o=0,p=a.length;p>o;o++){var r=a[o];if("M"==r[0])d=h=r[1],e=i=r[2];else{"C"==r[0]?(l=[d,e].concat(r.slice(1)),d=l[6],e=l[7]):(l=[d,e,d,e,h,i,h,i],d=h,e=i);for(var s=0,t=b.length;t>s;s++){var u=b[s];if("M"==u[0])f=j=u[1],g=k=u[2];else{"C"==u[0]?(m=[f,g].concat(u.slice(1)),f=m[6],g=m[7]):(m=[f,g,f,g,j,k,j,k],f=j,g=k);var v=q(l,m,c);if(c)n+=v;else{for(var w=0,x=v.length;x>w;w++)v[w].segment1=o,v[w].segment2=s,v[w].bez1=l,v[w].bez2=m;n=n.concat(v)}}}}}return n}function u(a,b,c){var d=v(a);return k(d,b,c)&&t(a,[["M",b,c],["H",d.x2+10]],1)%2==1}function v(a){var b=c(a);if(b.bbox)return J(b.bbox);if(!a)return d();a=E(a);for(var e,f=0,g=0,h=[],i=[],j=0,k=a.length;k>j;j++)if(e=a[j],"M"==e[0])f=e[1],g=e[2],h.push(f),i.push(g);else{var l=D(f,g,e[1],e[2],e[3],e[4],e[5],e[6]);h=h.concat(l.min.x,l.max.x),i=i.concat(l.min.y,l.max.y),f=e[5],g=e[6]}var m=P.apply(0,h),n=P.apply(0,i),o=Q.apply(0,h),p=Q.apply(0,i),q=d(m,n,o-m,p-n);return b.bbox=J(q),q}function w(a,b,c,d,f){if(f)return[["M",+a+ +f,b],["l",c-2*f,0],["a",f,f,0,0,1,f,f],["l",0,d-2*f],["a",f,f,0,0,1,-f,f],["l",2*f-c,0],["a",f,f,0,0,1,-f,-f],["l",0,2*f-d],["a",f,f,0,0,1,f,-f],["z"]];var g=[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]];return g.toString=e,g}function x(a,b,c,d,f){if(null==f&&null==d&&(d=c),a=+a,b=+b,c=+c,d=+d,null!=f)var g=Math.PI/180,h=a+c*Math.cos(-d*g),i=a+c*Math.cos(-f*g),j=b+c*Math.sin(-d*g),k=b+c*Math.sin(-f*g),l=[["M",h,j],["A",c,c,0,+(f-d>180),0,i,k]];else l=[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]];return l.toString=e,l}function y(b){var d=c(b),g=String.prototype.toLowerCase;if(d.rel)return f(d.rel);a.is(b,"array")&&a.is(b&&b[0],"array")||(b=a.parsePathString(b));var h=[],i=0,j=0,k=0,l=0,m=0;"M"==b[0][0]&&(i=b[0][1],j=b[0][2],k=i,l=j,m++,h.push(["M",i,j]));for(var n=m,o=b.length;o>n;n++){var p=h[n]=[],q=b[n];if(q[0]!=g.call(q[0]))switch(p[0]=g.call(q[0]),p[0]){case"a":p[1]=q[1],p[2]=q[2],p[3]=q[3],p[4]=q[4],p[5]=q[5],p[6]=+(q[6]-i).toFixed(3),p[7]=+(q[7]-j).toFixed(3);break;case"v":p[1]=+(q[1]-j).toFixed(3);break;case"m":k=q[1],l=q[2];default:for(var r=1,s=q.length;s>r;r++)p[r]=+(q[r]-(r%2?i:j)).toFixed(3)}else{p=h[n]=[],"m"==q[0]&&(k=q[1]+i,l=q[2]+j);for(var t=0,u=q.length;u>t;t++)h[n][t]=q[t]}var v=h[n].length;switch(h[n][0]){case"z":i=k,j=l;break;case"h":i+=+h[n][v-1];break;case"v":j+=+h[n][v-1];break;default:i+=+h[n][v-2],j+=+h[n][v-1]}}return h.toString=e,d.rel=f(h),h}function z(b){var d=c(b);if(d.abs)return f(d.abs);if(I(b,"array")&&I(b&&b[0],"array")||(b=a.parsePathString(b)),!b||!b.length)return[["M",0,0]];var g,h=[],i=0,j=0,k=0,l=0,m=0;"M"==b[0][0]&&(i=+b[0][1],j=+b[0][2],k=i,l=j,m++,h[0]=["M",i,j]);for(var n,o,p=3==b.length&&"M"==b[0][0]&&"R"==b[1][0].toUpperCase()&&"Z"==b[2][0].toUpperCase(),q=m,r=b.length;r>q;q++){if(h.push(n=[]),o=b[q],g=o[0],g!=g.toUpperCase())switch(n[0]=g.toUpperCase(),n[0]){case"A":n[1]=o[1],n[2]=o[2],n[3]=o[3],n[4]=o[4],n[5]=o[5],n[6]=+o[6]+i,n[7]=+o[7]+j;break;case"V":n[1]=+o[1]+j;break;case"H":n[1]=+o[1]+i;break;case"R":for(var s=[i,j].concat(o.slice(1)),t=2,u=s.length;u>t;t++)s[t]=+s[t]+i,s[++t]=+s[t]+j;h.pop(),h=h.concat(G(s,p));break;case"O":h.pop(),s=x(i,j,o[1],o[2]),s.push(s[0]),h=h.concat(s);break;case"U":h.pop(),h=h.concat(x(i,j,o[1],o[2],o[3])),n=["U"].concat(h[h.length-1].slice(-2));break;case"M":k=+o[1]+i,l=+o[2]+j;default:for(t=1,u=o.length;u>t;t++)n[t]=+o[t]+(t%2?i:j)}else if("R"==g)s=[i,j].concat(o.slice(1)),h.pop(),h=h.concat(G(s,p)),n=["R"].concat(o.slice(-2));else if("O"==g)h.pop(),s=x(i,j,o[1],o[2]),s.push(s[0]),h=h.concat(s);else if("U"==g)h.pop(),h=h.concat(x(i,j,o[1],o[2],o[3])),n=["U"].concat(h[h.length-1].slice(-2));else for(var v=0,w=o.length;w>v;v++)n[v]=o[v];if(g=g.toUpperCase(),"O"!=g)switch(n[0]){case"Z":i=+k,j=+l;break;case"H":i=n[1];break;case"V":j=n[1];break;case"M":k=n[n.length-2],l=n[n.length-1];default:i=n[n.length-2],j=n[n.length-1]}}return h.toString=e,d.abs=f(h),h}function A(a,b,c,d){return[a,b,c,d,c,d]}function B(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]}function C(b,c,d,e,f,g,h,i,j,k){var l,m=120*O/180,n=O/180*(+f||0),o=[],p=a._.cacher(function(a,b,c){var d=a*N.cos(c)-b*N.sin(c),e=a*N.sin(c)+b*N.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(b,c,-n),b=l.x,c=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(N.cos(O/180*f),N.sin(O/180*f),(b-i)/2),r=(c-j)/2,s=q*q/(d*d)+r*r/(e*e);s>1&&(s=N.sqrt(s),d=s*d,e=s*e);var t=d*d,u=e*e,v=(g==h?-1:1)*N.sqrt(S((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*d*r/e+(b+i)/2,x=v*-e*q/d+(c+j)/2,y=N.asin(((c-x)/e).toFixed(9)),z=N.asin(((j-x)/e).toFixed(9));y=w>b?O-y:y,z=w>i?O-z:z,0>y&&(y=2*O+y),0>z&&(z=2*O+z),h&&y>z&&(y-=2*O),!h&&z>y&&(z-=2*O)}var A=z-y;if(S(A)>m){var B=z,D=i,E=j;z=y+m*(h&&z>y?1:-1),i=w+d*N.cos(z),j=x+e*N.sin(z),o=C(i,j,d,e,f,0,h,D,E,[z,B,w,x])}A=z-y;var F=N.cos(y),G=N.sin(y),H=N.cos(z),I=N.sin(z),J=N.tan(A/4),K=4/3*d*J,L=4/3*e*J,M=[b,c],P=[b+K*G,c-L*F],Q=[i+K*I,j-L*H],R=[i,j];if(P[0]=2*M[0]-P[0],P[1]=2*M[1]-P[1],k)return[P,Q,R].concat(o);o=[P,Q,R].concat(o).join().split(",");for(var T=[],U=0,V=o.length;V>U;U++)T[U]=U%2?p(o[U-1],o[U],n).y:p(o[U],o[U+1],n).x;return T}function D(a,b,c,d,e,f,g,h){for(var i,j,k,l,m,n,o,p,q=[],r=[[],[]],s=0;2>s;++s)if(0==s?(j=6*a-12*c+6*e,i=-3*a+9*c-9*e+3*g,k=3*c-3*a):(j=6*b-12*d+6*f,i=-3*b+9*d-9*f+3*h,k=3*d-3*b),S(i)<1e-12){if(S(j)<1e-12)continue;l=-k/j,l>0&&1>l&&q.push(l)}else o=j*j-4*k*i,p=N.sqrt(o),0>o||(m=(-j+p)/(2*i),m>0&&1>m&&q.push(m),n=(-j-p)/(2*i),n>0&&1>n&&q.push(n));for(var t,u=q.length,v=u;u--;)l=q[u],t=1-l,r[0][u]=t*t*t*a+3*t*t*l*c+3*t*l*l*e+l*l*l*g,r[1][u]=t*t*t*b+3*t*t*l*d+3*t*l*l*f+l*l*l*h;return r[0][v]=a,r[1][v]=b,r[0][v+1]=g,r[1][v+1]=h,r[0].length=r[1].length=v+2,{min:{x:P.apply(0,r[0]),y:P.apply(0,r[1])},max:{x:Q.apply(0,r[0]),y:Q.apply(0,r[1])}}}function E(a,b){var d=!b&&c(a);if(!b&&d.curve)return f(d.curve);for(var e=z(a),g=b&&z(b),h={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},i={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},j=(function(a,b,c){var d,e;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"].concat(C.apply(0,[b.x,b.y].concat(a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e].concat(a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"].concat(B(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"].concat(B(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"].concat(A(b.x,b.y,a[1],a[2]));break;case"H":a=["C"].concat(A(b.x,b.y,a[1],b.y));break;case"V":a=["C"].concat(A(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"].concat(A(b.x,b.y,b.X,b.Y))}return a}),k=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)m[b]="A",g&&(n[b]="A"),a.splice(b++,0,["C"].concat(c.splice(0,6)));a.splice(b,1),r=Q(e.length,g&&g.length||0)}},l=function(a,b,c,d,f){a&&b&&"M"==a[f][0]&&"M"!=b[f][0]&&(b.splice(f,0,["M",d.x,d.y]),c.bx=0,c.by=0,c.x=a[f][1],c.y=a[f][2],r=Q(e.length,g&&g.length||0))},m=[],n=[],o="",p="",q=0,r=Q(e.length,g&&g.length||0);r>q;q++){e[q]&&(o=e[q][0]),"C"!=o&&(m[q]=o,q&&(p=m[q-1])),e[q]=j(e[q],h,p),"A"!=m[q]&&"C"==o&&(m[q]="C"),k(e,q),g&&(g[q]&&(o=g[q][0]),"C"!=o&&(n[q]=o,q&&(p=n[q-1])),g[q]=j(g[q],i,p),"A"!=n[q]&&"C"==o&&(n[q]="C"),k(g,q)),l(e,g,h,i,q),l(g,e,i,h,q);var s=e[q],t=g&&g[q],u=s.length,v=g&&t.length;h.x=s[u-2],h.y=s[u-1],h.bx=M(s[u-4])||h.x,h.by=M(s[u-3])||h.y,i.bx=g&&(M(t[v-4])||i.x),i.by=g&&(M(t[v-3])||i.y),i.x=g&&t[v-2],i.y=g&&t[v-1]}return g||(d.curve=f(e)),g?[e,g]:e}function F(a,b){if(!b)return a;var c,d,e,f,g,h,i;for(a=E(a),e=0,g=a.length;g>e;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a}function G(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}var H=b.prototype,I=a.is,J=a._.clone,K="hasOwnProperty",L=/,?([a-z]),?/gi,M=parseFloat,N=Math,O=N.PI,P=N.min,Q=N.max,R=N.pow,S=N.abs,T=h(1),U=h(),V=h(0,1),W=a._unit2px,X={path:function(a){return a.attr("path")},circle:function(a){var b=W(a);return x(b.cx,b.cy,b.r)},ellipse:function(a){var b=W(a);return x(b.cx||0,b.cy||0,b.rx,b.ry)},rect:function(a){var b=W(a);return w(b.x||0,b.y||0,b.width,b.height,b.rx,b.ry)},image:function(a){var b=W(a);return w(b.x||0,b.y||0,b.width,b.height)},line:function(a){return"M"+[a.attr("x1")||0,a.attr("y1")||0,a.attr("x2"),a.attr("y2")]},polyline:function(a){return"M"+a.attr("points")},polygon:function(a){return"M"+a.attr("points")+"z"},deflt:function(a){var b=a.node.getBBox();return w(b.x,b.y,b.width,b.height)}};a.path=c,a.path.getTotalLength=T,a.path.getPointAtLength=U,a.path.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return V(a,b).end;var d=V(a,c,1);return b?V(d,b).end:d},H.getTotalLength=function(){return this.node.getTotalLength?this.node.getTotalLength():void 0},H.getPointAtLength=function(a){return U(this.attr("d"),a)},H.getSubpath=function(b,c){return a.path.getSubpath(this.attr("d"),b,c)},a._.box=d,a.path.findDotsAtSegment=i,a.path.bezierBBox=j,a.path.isPointInsideBBox=k,a.closest=function(b,c,e,f){for(var g=100,h=d(b-g/2,c-g/2,g,g),i=[],j=e[0].hasOwnProperty("x")?function(a){return{x:e[a].x,y:e[a].y}}:function(a){return{x:e[a],y:f[a]}},l=0;1e6>=g&&!l;){for(var m=0,n=e.length;n>m;m++){var o=j(m);if(k(h,o.x,o.y)){l++,i.push(o);break}}l||(g*=2,h=d(b-g/2,c-g/2,g,g))}if(1e6!=g){var p,q=1/0;for(m=0,n=i.length;n>m;m++){var r=a.len(b,c,i[m].x,i[m].y);q>r&&(q=r,i[m].len=r,p=i[m])}return p}},a.path.isBBoxIntersect=l,a.path.intersection=r,a.path.intersectionNumber=s,a.path.isPointInside=u,a.path.getBBox=v,a.path.get=X,a.path.toRelative=y,a.path.toAbsolute=z,a.path.toCubic=E,a.path.map=F,a.path.toString=e,a.path.clone=f}),d.plugin(function(a){var d=Math.max,e=Math.min,f=function(a){if(this.items=[],this.bindings={},this.length=0,this.type="set",a)for(var b=0,c=a.length;c>b;b++)a[b]&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},g=f.prototype;g.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],a&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},g.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},g.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this},g.animate=function(d,e,f,g){"function"!=typeof f||f.length||(g=f,f=c.linear),d instanceof a._.Animation&&(g=d.callback,f=d.easing,e=f.dur,d=d.attr);var h=arguments;if(a.is(d,"array")&&a.is(h[h.length-1],"array"))var i=!0;var j,k=function(){j?this.b=j:j=this.b},l=0,m=this,n=g&&function(){++l==m.length&&g.call(this) +};return this.forEach(function(a,c){b.once("snap.animcreated."+a.id,k),i?h[c]&&a.animate.apply(a,h[c]):a.animate(d,e,f,n)})},g.remove=function(){for(;this.length;)this.pop().remove();return this},g.bind=function(a,b,c){var d={};if("function"==typeof b)this.bindings[a]=b;else{var e=c||a;this.bindings[a]=function(a){d[e]=a,b.attr(d)}}return this},g.attr=function(a){var b={};for(var c in a)this.bindings[c]?this.bindings[c](a[c]):b[c]=a[c];for(var d=0,e=this.items.length;e>d;d++)this.items[d].attr(b);return this},g.clear=function(){for(;this.length;)this.pop()},g.splice=function(a,b){a=0>a?d(this.length+a,0):a,b=d(0,e(this.length-a,b));var c,g=[],h=[],i=[];for(c=2;cc;c++)h.push(this[a+c]);for(;cc?i[c]:g[c-j];for(c=this.items.length=this.length-=b-j;this[c];)delete this[c++];return new f(h)},g.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0;return!1},g.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},g.getBBox=function(){for(var a=[],b=[],c=[],f=[],g=this.items.length;g--;)if(!this.items[g].removed){var h=this.items[g].getBBox();a.push(h.x),b.push(h.y),c.push(h.x+h.width),f.push(h.y+h.height)}return a=e.apply(0,a),b=e.apply(0,b),c=d.apply(0,c),f=d.apply(0,f),{x:a,y:b,x2:c,y2:f,width:c-a,height:f-b,cx:a+(c-a)/2,cy:b+(f-b)/2}},g.clone=function(a){a=new f;for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},g.toString=function(){return"Snap‘s set"},g.type="set",a.Set=f,a.set=function(){var a=new f;return arguments.length&&a.push.apply(a,Array.prototype.slice.call(arguments,0)),a}}),d.plugin(function(a,c){function d(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}}function e(b,c,e){c=p(c).replace(/\.{3}|\u2026/g,b),b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];for(var f,g,h,i,l=Math.max(b.length,c.length),m=[],n=[],o=0;l>o;o++){if(h=b[o]||d(c[o]),i=c[o]||d(h),h[0]!=i[0]||"r"==h[0].toLowerCase()&&(h[2]!=i[2]||h[3]!=i[3])||"s"==h[0].toLowerCase()&&(h[3]!=i[3]||h[4]!=i[4])){b=a._.transform2matrix(b,e()),c=a._.transform2matrix(c,e()),m=[["m",b.a,b.b,b.c,b.d,b.e,b.f]],n=[["m",c.a,c.b,c.c,c.d,c.e,c.f]];break}for(m[o]=[],n[o]=[],f=0,g=Math.max(h.length,i.length);g>f;f++)f in h&&(m[o][f]=h[f]),f in i&&(n[o][f]=i[f])}return{from:k(m),to:k(n),f:j(m)}}function f(a){return a}function g(a){return function(b){return+b.toFixed(3)+a}}function h(a){return a.join(" ")}function i(b){return a.rgb(b[0],b[1],b[2])}function j(a){var b,c,d,e,f,g,h=0,i=[];for(b=0,c=a.length;c>b;b++){for(f="[",g=['"'+a[b][0]+'"'],d=1,e=a[b].length;e>d;d++)g[d]="val["+h++ +"]";f+=g+"]",i[b]=f}return Function("val","return Snap.path.toString.call(["+i+"])")}function k(a){for(var b=[],c=0,d=a.length;d>c;c++)for(var e=1,f=a[c].length;f>e;e++)b.push(a[c][e]);return b}function l(a){return isFinite(parseFloat(a))}function m(b,c){return a.is(b,"array")&&a.is(c,"array")?b.toString()==c.toString():!1}var n={},o=/[a-z]+$/i,p=String;n.stroke=n.fill="colour",c.prototype.equal=function(a,c){return b("snap.util.equal",this,a,c).firstDefined()},b.on("snap.util.equal",function(b,c){var d,q,r=p(this.attr(b)||""),s=this;if(l(r)&&l(c))return{from:parseFloat(r),to:parseFloat(c),f:f};if("colour"==n[b])return d=a.color(r),q=a.color(c),{from:[d.r,d.g,d.b,d.opacity],to:[q.r,q.g,q.b,q.opacity],f:i};if("viewBox"==b)return d=this.attr(b).vb.split(" ").map(Number),q=c.split(" ").map(Number),{from:d,to:q,f:h};if("transform"==b||"gradientTransform"==b||"patternTransform"==b)return c instanceof a.Matrix&&(c=c.toTransformString()),a._.rgTransform.test(c)||(c=a._.svgTransform2string(c)),e(r,c,function(){return s.getBBox(1)});if("d"==b||"path"==b)return d=a.path.toCubic(r,c),{from:k(d[0]),to:k(d[1]),f:j(d[0])};if("points"==b)return d=p(r).split(a._.separator),q=p(c).split(a._.separator),{from:d,to:q,f:function(a){return a}};var t=r.match(o),u=p(c).match(o);return t&&m(t,u)?{from:parseFloat(r),to:parseFloat(c),f:g(t)}:{from:this.asPX(b),to:this.asPX(b,c),f:f}})}),d.plugin(function(a,c,d,e){for(var f=c.prototype,g="hasOwnProperty",h=("createTouch"in e.doc),i=["click","dblclick","mousedown","mousemove","mouseout","mouseover","mouseup","touchstart","touchmove","touchend","touchcancel"],j={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},k=(function(a,b){var c="y"==a?"scrollTop":"scrollLeft",d=b&&b.node?b.node.ownerDocument:e.doc;return d[c in d.documentElement?"documentElement":"body"][c]}),l=function(){return this.originalEvent.preventDefault()},m=function(){return this.originalEvent.stopPropagation()},n=function(a,b,c,d){var e=h&&j[b]?j[b]:b,f=function(e){var f=k("y",d),i=k("x",d);if(h&&j[g](b))for(var n=0,o=e.targetTouches&&e.targetTouches.length;o>n;n++)if(e.targetTouches[n].target==a||a.contains(e.targetTouches[n].target)){var p=e;e=e.targetTouches[n],e.originalEvent=p,e.preventDefault=l,e.stopPropagation=m;break}var q=e.clientX+i,r=e.clientY+f;return c.call(d,e,q,r)};return b!==e&&a.addEventListener(b,f,!1),a.addEventListener(e,f,!1),function(){return b!==e&&a.removeEventListener(b,f,!1),a.removeEventListener(e,f,!1),!0}},o=[],p=function(a){for(var c,d=a.clientX,e=a.clientY,f=k("y"),g=k("x"),i=o.length;i--;){if(c=o[i],h){for(var j,l=a.touches&&a.touches.length;l--;)if(j=a.touches[l],j.identifier==c.el._drag.id||c.el.node.contains(j.target)){d=j.clientX,e=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}else a.preventDefault();{var m=c.el.node;m.nextSibling,m.parentNode,m.style.display}d+=g,e+=f,b("snap.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,a)}},q=function(c){a.unmousemove(p).unmouseup(q);for(var d,e=o.length;e--;)d=o[e],d.el._drag={},b("snap.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,c),b.off("snap.drag.*."+d.el.id);o=[]},r=i.length;r--;)!function(b){a[b]=f[b]=function(c,d){if(a.is(c,"function"))this.events=this.events||[],this.events.push({name:b,f:c,unbind:n(this.node||document,b,c,d||this)});else for(var e=0,f=this.events.length;f>e;e++)if(this.events[e].name==b)try{this.events[e].f.call(this)}catch(g){}return this},a["un"+b]=f["un"+b]=function(a){for(var c=this.events||[],d=c.length;d--;)if(c[d].name==b&&(c[d].f==a||!a))return c[d].unbind(),c.splice(d,1),!c.length&&delete this.events,this;return this}}(i[r]);f.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},f.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var s=[];f.drag=function(c,d,e,f,g,h){function i(i,j,l){(i.originalEvent||i).preventDefault(),k._drag.x=j,k._drag.y=l,k._drag.id=i.identifier,!o.length&&a.mousemove(p).mouseup(q),o.push({el:k,move_scope:f,start_scope:g,end_scope:h}),d&&b.on("snap.drag.start."+k.id,d),c&&b.on("snap.drag.move."+k.id,c),e&&b.on("snap.drag.end."+k.id,e),b("snap.drag.start."+k.id,g||f||k,j,l,i)}function j(a,c,d){b("snap.draginit."+k.id,k,a,c,d)}var k=this;if(!arguments.length){var l;return k.drag(function(a,b){this.attr({transform:l+(l?"T":"t")+[a,b]})},function(){l=this.transform().local})}return b.on("snap.draginit."+k.id,i),k._drag={},s.push({el:k,start:i,init:j}),k.mousedown(j),k},f.undrag=function(){for(var c=s.length;c--;)s[c].el==this&&(this.unmousedown(s[c].init),s.splice(c,1),b.unbind("snap.drag.*."+this.id),b.unbind("snap.draginit."+this.id));return!s.length&&a.unmousemove(p).unmouseup(q),this}}),d.plugin(function(a,c,d){var e=(c.prototype,d.prototype),f=/^\s*url\((.+)\)/,g=String,h=a._.$;a.filter={},e.filter=function(b){var d=this;"svg"!=d.type&&(d=d.paper);var e=a.parse(g(b)),f=a._.id(),i=(d.node.offsetWidth,d.node.offsetHeight,h("filter"));return h(i,{id:f,filterUnits:"userSpaceOnUse"}),i.appendChild(e.node),d.defs.appendChild(i),new c(i)},b.on("snap.util.getattr.filter",function(){b.stop();var c=h(this.node,"filter");if(c){var d=g(c).match(f);return d&&a.select(d[1])}}),b.on("snap.util.attr.filter",function(d){if(d instanceof c&&"filter"==d.type){b.stop();var e=d.node.id;e||(h(d.node,{id:d.id}),e=d.id),h(this.node,{filter:a.url(e)})}d&&"none"!=d||(b.stop(),this.node.removeAttribute("filter"))}),a.filter.blur=function(b,c){null==b&&(b=2);var d=null==c?b:[b,c];return a.format('',{def:d})},a.filter.blur.toString=function(){return this()},a.filter.shadow=function(b,c,d,e,f){return"string"==typeof d&&(e=d,f=e,d=4),"string"!=typeof e&&(f=e,e="#000"),e=e||"#000",null==d&&(d=4),null==f&&(f=1),null==b&&(b=0,c=2),null==c&&(c=b),e=a.color(e),a.format('',{color:e,dx:b,dy:c,blur:d,opacity:f})},a.filter.shadow.toString=function(){return this()},a.filter.grayscale=function(b){return null==b&&(b=1),a.format('',{a:.2126+.7874*(1-b),b:.7152-.7152*(1-b),c:.0722-.0722*(1-b),d:.2126-.2126*(1-b),e:.7152+.2848*(1-b),f:.0722-.0722*(1-b),g:.2126-.2126*(1-b),h:.0722+.9278*(1-b)})},a.filter.grayscale.toString=function(){return this()},a.filter.sepia=function(b){return null==b&&(b=1),a.format('',{a:.393+.607*(1-b),b:.769-.769*(1-b),c:.189-.189*(1-b),d:.349-.349*(1-b),e:.686+.314*(1-b),f:.168-.168*(1-b),g:.272-.272*(1-b),h:.534-.534*(1-b),i:.131+.869*(1-b)})},a.filter.sepia.toString=function(){return this()},a.filter.saturate=function(b){return null==b&&(b=1),a.format('',{amount:1-b})},a.filter.saturate.toString=function(){return this()},a.filter.hueRotate=function(b){return b=b||0,a.format('',{angle:b})},a.filter.hueRotate.toString=function(){return this()},a.filter.invert=function(b){return null==b&&(b=1),a.format('',{amount:b,amount2:1-b})},a.filter.invert.toString=function(){return this()},a.filter.brightness=function(b){return null==b&&(b=1),a.format('',{amount:b})},a.filter.brightness.toString=function(){return this()},a.filter.contrast=function(b){return null==b&&(b=1),a.format('',{amount:b,amount2:.5-b/2})},a.filter.contrast.toString=function(){return this()}}),d.plugin(function(a,b){var c=a._.box,d=a.is,e=/^[^a-z]*([tbmlrc])/i,f=function(){return"T"+this.dx+","+this.dy};b.prototype.getAlign=function(a,b){null==b&&d(a,"string")&&(b=a,a=null),a=a||this.paper;var g=a.getBBox?a.getBBox():c(a),h=this.getBBox(),i={};switch(b=b&&b.match(e),b=b?b[1].toLowerCase():"c"){case"t":i.dx=0,i.dy=g.y-h.y;break;case"b":i.dx=0,i.dy=g.y2-h.y2;break;case"m":i.dx=0,i.dy=g.cy-h.cy;break;case"l":i.dx=g.x-h.x,i.dy=0;break;case"r":i.dx=g.x2-h.x2,i.dy=0;break;default:i.dx=g.cx-h.cx,i.dy=0}return i.toString=f,i},b.prototype.align=function(a,b){return this.transform("..."+this.getAlign(a,b))}}),d}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg.js new file mode 100644 index 0000000..5475170 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg.js @@ -0,0 +1,8170 @@ +// Snap.svg 0.4.1 +// +// Copyright (c) 2013 – 2015 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// build: 2015-04-13 + +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ┌────────────────────────────────────────────────────────────┐ \\ +// │ Eve 0.4.2 - JavaScript Events Library │ \\ +// ├────────────────────────────────────────────────────────────┤ \\ +// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\ +// └────────────────────────────────────────────────────────────┘ \\ + +(function (glob) { + var version = "0.4.2", + has = "hasOwnProperty", + separator = /[\.\/]/, + comaseparator = /\s*,\s*/, + wildcard = "*", + fun = function () {}, + numsort = function (a, b) { + return a - b; + }, + current_event, + stop, + events = {n: {}}, + firstDefined = function () { + for (var i = 0, ii = this.length; i < ii; i++) { + if (typeof this[i] != "undefined") { + return this[i]; + } + } + }, + lastDefined = function () { + var i = this.length; + while (--i) { + if (typeof this[i] != "undefined") { + return this[i]; + } + } + }, + /*\ + * eve + [ method ] + + * Fires event with given `name`, given scope and other parameters. + + > Arguments + + - name (string) name of the *event*, dot (`.`) or slash (`/`) separated + - scope (object) context for the event handlers + - varargs (...) the rest of arguments will be sent to event handlers + + = (object) array of returned values from the listeners. Array has two methods `.firstDefined()` and `.lastDefined()` to get first or last not `undefined` value. + \*/ + eve = function (name, scope) { + name = String(name); + var e = events, + oldstop = stop, + args = Array.prototype.slice.call(arguments, 2), + listeners = eve.listeners(name), + z = 0, + f = false, + l, + indexed = [], + queue = {}, + out = [], + ce = current_event, + errors = []; + out.firstDefined = firstDefined; + out.lastDefined = lastDefined; + current_event = name; + stop = 0; + for (var i = 0, ii = listeners.length; i < ii; i++) if ("zIndex" in listeners[i]) { + indexed.push(listeners[i].zIndex); + if (listeners[i].zIndex < 0) { + queue[listeners[i].zIndex] = listeners[i]; + } + } + indexed.sort(numsort); + while (indexed[z] < 0) { + l = queue[indexed[z++]]; + out.push(l.apply(scope, args)); + if (stop) { + stop = oldstop; + return out; + } + } + for (i = 0; i < ii; i++) { + l = listeners[i]; + if ("zIndex" in l) { + if (l.zIndex == indexed[z]) { + out.push(l.apply(scope, args)); + if (stop) { + break; + } + do { + z++; + l = queue[indexed[z]]; + l && out.push(l.apply(scope, args)); + if (stop) { + break; + } + } while (l) + } else { + queue[l.zIndex] = l; + } + } else { + out.push(l.apply(scope, args)); + if (stop) { + break; + } + } + } + stop = oldstop; + current_event = ce; + return out; + }; + // Undocumented. Debug only. + eve._events = events; + /*\ + * eve.listeners + [ method ] + + * Internal method which gives you array of all event handlers that will be triggered by the given `name`. + + > Arguments + + - name (string) name of the event, dot (`.`) or slash (`/`) separated + + = (array) array of event handlers + \*/ + eve.listeners = function (name) { + var names = name.split(separator), + e = events, + item, + items, + k, + i, + ii, + j, + jj, + nes, + es = [e], + out = []; + for (i = 0, ii = names.length; i < ii; i++) { + nes = []; + for (j = 0, jj = es.length; j < jj; j++) { + e = es[j].n; + items = [e[names[i]], e[wildcard]]; + k = 2; + while (k--) { + item = items[k]; + if (item) { + nes.push(item); + out = out.concat(item.f || []); + } + } + } + es = nes; + } + return out; + }; + + /*\ + * eve.on + [ method ] + ** + * Binds given event handler with a given name. You can use wildcards “`*`” for the names: + | eve.on("*.under.*", f); + | eve("mouse.under.floor"); // triggers f + * Use @eve to trigger the listener. + ** + > Arguments + ** + - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards + - f (function) event handler function + ** + = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. + > Example: + | eve.on("mouse", eatIt)(2); + | eve.on("mouse", scream); + | eve.on("mouse", catchIt)(1); + * This will ensure that `catchIt` function will be called before `eatIt`. + * + * If you want to put your handler before non-indexed handlers, specify a negative value. + * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”. + \*/ + eve.on = function (name, f) { + name = String(name); + if (typeof f != "function") { + return function () {}; + } + var names = name.split(comaseparator); + for (var i = 0, ii = names.length; i < ii; i++) { + (function (name) { + var names = name.split(separator), + e = events, + exist; + for (var i = 0, ii = names.length; i < ii; i++) { + e = e.n; + e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}}); + } + e.f = e.f || []; + for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) { + exist = true; + break; + } + !exist && e.f.push(f); + }(names[i])); + } + return function (zIndex) { + if (+zIndex == +zIndex) { + f.zIndex = +zIndex; + } + }; + }; + /*\ + * eve.f + [ method ] + ** + * Returns function that will fire given event with optional arguments. + * Arguments that will be passed to the result function will be also + * concated to the list of final arguments. + | el.onclick = eve.f("click", 1, 2); + | eve.on("click", function (a, b, c) { + | console.log(a, b, c); // 1, 2, [event object] + | }); + > Arguments + - event (string) event name + - varargs (…) and any other arguments + = (function) possible event handler function + \*/ + eve.f = function (event) { + var attrs = [].slice.call(arguments, 1); + return function () { + eve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0))); + }; + }; + /*\ + * eve.stop + [ method ] + ** + * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing. + \*/ + eve.stop = function () { + stop = 1; + }; + /*\ + * eve.nt + [ method ] + ** + * Could be used inside event handler to figure out actual name of the event. + ** + > Arguments + ** + - subname (string) #optional subname of the event + ** + = (string) name of the event, if `subname` is not specified + * or + = (boolean) `true`, if current event’s name contains `subname` + \*/ + eve.nt = function (subname) { + if (subname) { + return new RegExp("(?:\\.|\\/|^)" + subname + "(?:\\.|\\/|$)").test(current_event); + } + return current_event; + }; + /*\ + * eve.nts + [ method ] + ** + * Could be used inside event handler to figure out actual name of the event. + ** + ** + = (array) names of the event + \*/ + eve.nts = function () { + return current_event.split(separator); + }; + /*\ + * eve.off + [ method ] + ** + * Removes given function from the list of event listeners assigned to given name. + * If no arguments specified all the events will be cleared. + ** + > Arguments + ** + - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards + - f (function) event handler function + \*/ + /*\ + * eve.unbind + [ method ] + ** + * See @eve.off + \*/ + eve.off = eve.unbind = function (name, f) { + if (!name) { + eve._events = events = {n: {}}; + return; + } + var names = name.split(comaseparator); + if (names.length > 1) { + for (var i = 0, ii = names.length; i < ii; i++) { + eve.off(names[i], f); + } + return; + } + names = name.split(separator); + var e, + key, + splice, + i, ii, j, jj, + cur = [events]; + for (i = 0, ii = names.length; i < ii; i++) { + for (j = 0; j < cur.length; j += splice.length - 2) { + splice = [j, 1]; + e = cur[j].n; + if (names[i] != wildcard) { + if (e[names[i]]) { + splice.push(e[names[i]]); + } + } else { + for (key in e) if (e[has](key)) { + splice.push(e[key]); + } + } + cur.splice.apply(cur, splice); + } + } + for (i = 0, ii = cur.length; i < ii; i++) { + e = cur[i]; + while (e.n) { + if (f) { + if (e.f) { + for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) { + e.f.splice(j, 1); + break; + } + !e.f.length && delete e.f; + } + for (key in e.n) if (e.n[has](key) && e.n[key].f) { + var funcs = e.n[key].f; + for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) { + funcs.splice(j, 1); + break; + } + !funcs.length && delete e.n[key].f; + } + } else { + delete e.f; + for (key in e.n) if (e.n[has](key) && e.n[key].f) { + delete e.n[key].f; + } + } + e = e.n; + } + } + }; + /*\ + * eve.once + [ method ] + ** + * Binds given event handler with a given name to only run once then unbind itself. + | eve.once("login", f); + | eve("login"); // triggers f + | eve("login"); // no listeners + * Use @eve to trigger the listener. + ** + > Arguments + ** + - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards + - f (function) event handler function + ** + = (function) same return function as @eve.on + \*/ + eve.once = function (name, f) { + var f2 = function () { + eve.unbind(name, f2); + return f.apply(this, arguments); + }; + return eve.on(name, f2); + }; + /*\ + * eve.version + [ property (string) ] + ** + * Current version of the library. + \*/ + eve.version = version; + eve.toString = function () { + return "You are running Eve " + version; + }; + (typeof module != "undefined" && module.exports) ? (module.exports = eve) : (typeof define === "function" && define.amd ? (define("eve", [], function() { return eve; })) : (glob.eve = eve)); +})(this); + +(function (glob, factory) { + // AMD support + if (typeof define == "function" && define.amd) { + // Define as an anonymous module + define(["eve"], function (eve) { + return factory(glob, eve); + }); + } else if (typeof exports != 'undefined') { + // Next for Node.js or CommonJS + var eve = require('eve'); + module.exports = factory(glob, eve); + } else { + // Browser globals (glob is window) + // Snap adds itself to window + factory(glob, glob.eve); + } +}(window || this, function (window, eve) { + +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +var mina = (function (eve) { + var animations = {}, + requestAnimFrame = window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { + setTimeout(callback, 16); + }, + isArray = Array.isArray || function (a) { + return a instanceof Array || + Object.prototype.toString.call(a) == "[object Array]"; + }, + idgen = 0, + idprefix = "M" + (+new Date).toString(36), + ID = function () { + return idprefix + (idgen++).toString(36); + }, + diff = function (a, b, A, B) { + if (isArray(a)) { + res = []; + for (var i = 0, ii = a.length; i < ii; i++) { + res[i] = diff(a[i], b, A[i], B); + } + return res; + } + var dif = (A - a) / (B - b); + return function (bb) { + return a + dif * (bb - b); + }; + }, + timer = Date.now || function () { + return +new Date; + }, + sta = function (val) { + var a = this; + if (val == null) { + return a.s; + } + var ds = a.s - val; + a.b += a.dur * ds; + a.B += a.dur * ds; + a.s = val; + }, + speed = function (val) { + var a = this; + if (val == null) { + return a.spd; + } + a.spd = val; + }, + duration = function (val) { + var a = this; + if (val == null) { + return a.dur; + } + a.s = a.s * val / a.dur; + a.dur = val; + }, + stopit = function () { + var a = this; + delete animations[a.id]; + a.update(); + eve("mina.stop." + a.id, a); + }, + pause = function () { + var a = this; + if (a.pdif) { + return; + } + delete animations[a.id]; + a.update(); + a.pdif = a.get() - a.b; + }, + resume = function () { + var a = this; + if (!a.pdif) { + return; + } + a.b = a.get() - a.pdif; + delete a.pdif; + animations[a.id] = a; + }, + update = function () { + var a = this, + res; + if (isArray(a.start)) { + res = []; + for (var j = 0, jj = a.start.length; j < jj; j++) { + res[j] = +a.start[j] + + (a.end[j] - a.start[j]) * a.easing(a.s); + } + } else { + res = +a.start + (a.end - a.start) * a.easing(a.s); + } + a.set(res); + }, + frame = function () { + var len = 0; + for (var i in animations) if (animations.hasOwnProperty(i)) { + var a = animations[i], + b = a.get(), + res; + len++; + a.s = (b - a.b) / (a.dur / a.spd); + if (a.s >= 1) { + delete animations[i]; + a.s = 1; + len--; + (function (a) { + setTimeout(function () { + eve("mina.finish." + a.id, a); + }); + }(a)); + } + a.update(); + } + len && requestAnimFrame(frame); + }, + /*\ + * mina + [ method ] + ** + * Generic animation of numbers + ** + - a (number) start _slave_ number + - A (number) end _slave_ number + - b (number) start _master_ number (start time in general case) + - B (number) end _master_ number (end time in gereal case) + - get (function) getter of _master_ number (see @mina.time) + - set (function) setter of _slave_ number + - easing (function) #optional easing function, default is @mina.linear + = (object) animation descriptor + o { + o id (string) animation id, + o start (number) start _slave_ number, + o end (number) end _slave_ number, + o b (number) start _master_ number, + o s (number) animation status (0..1), + o dur (number) animation duration, + o spd (number) animation speed, + o get (function) getter of _master_ number (see @mina.time), + o set (function) setter of _slave_ number, + o easing (function) easing function, default is @mina.linear, + o status (function) status getter/setter, + o speed (function) speed getter/setter, + o duration (function) duration getter/setter, + o stop (function) animation stopper + o pause (function) pauses the animation + o resume (function) resumes the animation + o update (function) calles setter with the right value of the animation + o } + \*/ + mina = function (a, A, b, B, get, set, easing) { + var anim = { + id: ID(), + start: a, + end: A, + b: b, + s: 0, + dur: B - b, + spd: 1, + get: get, + set: set, + easing: easing || mina.linear, + status: sta, + speed: speed, + duration: duration, + stop: stopit, + pause: pause, + resume: resume, + update: update + }; + animations[anim.id] = anim; + var len = 0, i; + for (i in animations) if (animations.hasOwnProperty(i)) { + len++; + if (len == 2) { + break; + } + } + len == 1 && requestAnimFrame(frame); + return anim; + }; + /*\ + * mina.time + [ method ] + ** + * Returns the current time. Equivalent to: + | function () { + | return (new Date).getTime(); + | } + \*/ + mina.time = timer; + /*\ + * mina.getById + [ method ] + ** + * Returns an animation by its id + - id (string) animation's id + = (object) See @mina + \*/ + mina.getById = function (id) { + return animations[id] || null; + }; + + /*\ + * mina.linear + [ method ] + ** + * Default linear easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.linear = function (n) { + return n; + }; + /*\ + * mina.easeout + [ method ] + ** + * Easeout easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.easeout = function (n) { + return Math.pow(n, 1.7); + }; + /*\ + * mina.easein + [ method ] + ** + * Easein easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.easein = function (n) { + return Math.pow(n, .48); + }; + /*\ + * mina.easeinout + [ method ] + ** + * Easeinout easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.easeinout = function (n) { + if (n == 1) { + return 1; + } + if (n == 0) { + return 0; + } + var q = .48 - n / 1.04, + Q = Math.sqrt(.1734 + q * q), + x = Q - q, + X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1), + y = -Q - q, + Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1), + t = X + Y + .5; + return (1 - t) * 3 * t * t + t * t * t; + }; + /*\ + * mina.backin + [ method ] + ** + * Backin easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.backin = function (n) { + if (n == 1) { + return 1; + } + var s = 1.70158; + return n * n * ((s + 1) * n - s); + }; + /*\ + * mina.backout + [ method ] + ** + * Backout easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.backout = function (n) { + if (n == 0) { + return 0; + } + n = n - 1; + var s = 1.70158; + return n * n * ((s + 1) * n + s) + 1; + }; + /*\ + * mina.elastic + [ method ] + ** + * Elastic easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.elastic = function (n) { + if (n == !!n) { + return n; + } + return Math.pow(2, -10 * n) * Math.sin((n - .075) * + (2 * Math.PI) / .3) + 1; + }; + /*\ + * mina.bounce + [ method ] + ** + * Bounce easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.bounce = function (n) { + var s = 7.5625, + p = 2.75, + l; + if (n < (1 / p)) { + l = s * n * n; + } else { + if (n < (2 / p)) { + n -= (1.5 / p); + l = s * n * n + .75; + } else { + if (n < (2.5 / p)) { + n -= (2.25 / p); + l = s * n * n + .9375; + } else { + n -= (2.625 / p); + l = s * n * n + .984375; + } + } + } + return l; + }; + window.mina = mina; + return mina; +})(typeof eve == "undefined" ? function () {} : eve); +// Copyright (c) 2013 - 2015 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +var Snap = (function(root) { +Snap.version = "0.4.0"; +/*\ + * Snap + [ method ] + ** + * Creates a drawing surface or wraps existing SVG element. + ** + - width (number|string) width of surface + - height (number|string) height of surface + * or + - DOM (SVGElement) element to be wrapped into Snap structure + * or + - array (array) array of elements (will return set of elements) + * or + - query (string) CSS query selector + = (object) @Element +\*/ +function Snap(w, h) { + if (w) { + if (w.nodeType) { + return wrap(w); + } + if (is(w, "array") && Snap.set) { + return Snap.set.apply(Snap, w); + } + if (w instanceof Element) { + return w; + } + if (h == null) { + w = glob.doc.querySelector(String(w)); + return wrap(w); + } + } + w = w == null ? "100%" : w; + h = h == null ? "100%" : h; + return new Paper(w, h); +} +Snap.toString = function () { + return "Snap v" + this.version; +}; +Snap._ = {}; +var glob = { + win: root.window, + doc: root.window.document +}; +Snap._.glob = glob; +var has = "hasOwnProperty", + Str = String, + toFloat = parseFloat, + toInt = parseInt, + math = Math, + mmax = math.max, + mmin = math.min, + abs = math.abs, + pow = math.pow, + PI = math.PI, + round = math.round, + E = "", + S = " ", + objectToString = Object.prototype.toString, + ISURL = /^url\(['"]?([^\)]+?)['"]?\)$/i, + colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?%?)\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?%?)\s*\))\s*$/i, + bezierrg = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/, + reURLValue = /^url\(#?([^)]+)\)$/, + separator = Snap._.separator = /[,\s]+/, + whitespace = /[\s]/g, + commaSpaces = /[\s]*,[\s]*/, + hsrg = {hs: 1, rg: 1}, + pathCommand = /([a-z])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\s]*,?[\s]*)+)/ig, + tCommand = /([rstm])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\s]*,?[\s]*)+)/ig, + pathValues = /(-?\d*\.?\d*(?:e[\-+]?\\d+)?)[\s]*,?[\s]*/ig, + idgen = 0, + idprefix = "S" + (+new Date).toString(36), + ID = function (el) { + return (el && el.type ? el.type : E) + idprefix + (idgen++).toString(36); + }, + xlink = "http://www.w3.org/1999/xlink", + xmlns = "http://www.w3.org/2000/svg", + hub = {}, + URL = Snap.url = function (url) { + return "url('#" + url + "')"; + }; + +function $(el, attr) { + if (attr) { + if (el == "#text") { + el = glob.doc.createTextNode(attr.text || attr["#text"] || ""); + } + if (el == "#comment") { + el = glob.doc.createComment(attr.text || attr["#text"] || ""); + } + if (typeof el == "string") { + el = $(el); + } + if (typeof attr == "string") { + if (el.nodeType == 1) { + if (attr.substring(0, 6) == "xlink:") { + return el.getAttributeNS(xlink, attr.substring(6)); + } + if (attr.substring(0, 4) == "xml:") { + return el.getAttributeNS(xmlns, attr.substring(4)); + } + return el.getAttribute(attr); + } else if (attr == "text") { + return el.nodeValue; + } else { + return null; + } + } + if (el.nodeType == 1) { + for (var key in attr) if (attr[has](key)) { + var val = Str(attr[key]); + if (val) { + if (key.substring(0, 6) == "xlink:") { + el.setAttributeNS(xlink, key.substring(6), val); + } else if (key.substring(0, 4) == "xml:") { + el.setAttributeNS(xmlns, key.substring(4), val); + } else { + el.setAttribute(key, val); + } + } else { + el.removeAttribute(key); + } + } + } else if ("text" in attr) { + el.nodeValue = attr.text; + } + } else { + el = glob.doc.createElementNS(xmlns, el); + } + return el; +} +Snap._.$ = $; +Snap._.id = ID; +function getAttrs(el) { + var attrs = el.attributes, + name, + out = {}; + for (var i = 0; i < attrs.length; i++) { + if (attrs[i].namespaceURI == xlink) { + name = "xlink:"; + } else { + name = ""; + } + name += attrs[i].name; + out[name] = attrs[i].textContent; + } + return out; +} +function is(o, type) { + type = Str.prototype.toLowerCase.call(type); + if (type == "finite") { + return isFinite(o); + } + if (type == "array" && + (o instanceof Array || Array.isArray && Array.isArray(o))) { + return true; + } + return (type == "null" && o === null) || + (type == typeof o && o !== null) || + (type == "object" && o === Object(o)) || + objectToString.call(o).slice(8, -1).toLowerCase() == type; +} +/*\ + * Snap.format + [ method ] + ** + * Replaces construction of type `{}` to the corresponding argument + ** + - token (string) string to format + - json (object) object which properties are used as a replacement + = (string) formatted string + > Usage + | // this draws a rectangular shape equivalent to "M10,20h40v50h-40z" + | paper.path(Snap.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z", { + | x: 10, + | y: 20, + | dim: { + | width: 40, + | height: 50, + | "negative width": -40 + | } + | })); +\*/ +Snap.format = (function () { + var tokenRegex = /\{([^\}]+)\}/g, + objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, // matches .xxxxx or ["xxxxx"] to run over object properties + replacer = function (all, key, obj) { + var res = obj; + key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) { + name = name || quotedName; + if (res) { + if (name in res) { + res = res[name]; + } + typeof res == "function" && isFunc && (res = res()); + } + }); + res = (res == null || res == obj ? all : res) + ""; + return res; + }; + return function (str, obj) { + return Str(str).replace(tokenRegex, function (all, key) { + return replacer(all, key, obj); + }); + }; +})(); +function clone(obj) { + if (typeof obj == "function" || Object(obj) !== obj) { + return obj; + } + var res = new obj.constructor; + for (var key in obj) if (obj[has](key)) { + res[key] = clone(obj[key]); + } + return res; +} +Snap._.clone = clone; +function repush(array, item) { + for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) { + return array.push(array.splice(i, 1)[0]); + } +} +function cacher(f, scope, postprocessor) { + function newf() { + var arg = Array.prototype.slice.call(arguments, 0), + args = arg.join("\u2400"), + cache = newf.cache = newf.cache || {}, + count = newf.count = newf.count || []; + if (cache[has](args)) { + repush(count, args); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + count.length >= 1e3 && delete cache[count.shift()]; + count.push(args); + cache[args] = f.apply(scope, arg); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + return newf; +} +Snap._.cacher = cacher; +function angle(x1, y1, x2, y2, x3, y3) { + if (x3 == null) { + var x = x1 - x2, + y = y1 - y2; + if (!x && !y) { + return 0; + } + return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360; + } else { + return angle(x1, y1, x3, y3) - angle(x2, y2, x3, y3); + } +} +function rad(deg) { + return deg % 360 * PI / 180; +} +function deg(rad) { + return rad * 180 / PI % 360; +} +function x_y() { + return this.x + S + this.y; +} +function x_y_w_h() { + return this.x + S + this.y + S + this.width + " \xd7 " + this.height; +} + +/*\ + * Snap.rad + [ method ] + ** + * Transform angle to radians + - deg (number) angle in degrees + = (number) angle in radians +\*/ +Snap.rad = rad; +/*\ + * Snap.deg + [ method ] + ** + * Transform angle to degrees + - rad (number) angle in radians + = (number) angle in degrees +\*/ +Snap.deg = deg; +/*\ + * Snap.sin + [ method ] + ** + * Equivalent to `Math.sin()` only works with degrees, not radians. + - angle (number) angle in degrees + = (number) sin +\*/ +Snap.sin = function (angle) { + return math.sin(Snap.rad(angle)); +}; +/*\ + * Snap.tan + [ method ] + ** + * Equivalent to `Math.tan()` only works with degrees, not radians. + - angle (number) angle in degrees + = (number) tan +\*/ +Snap.tan = function (angle) { + return math.tan(Snap.rad(angle)); +}; +/*\ + * Snap.cos + [ method ] + ** + * Equivalent to `Math.cos()` only works with degrees, not radians. + - angle (number) angle in degrees + = (number) cos +\*/ +Snap.cos = function (angle) { + return math.cos(Snap.rad(angle)); +}; +/*\ + * Snap.asin + [ method ] + ** + * Equivalent to `Math.asin()` only works with degrees, not radians. + - num (number) value + = (number) asin in degrees +\*/ +Snap.asin = function (num) { + return Snap.deg(math.asin(num)); +}; +/*\ + * Snap.acos + [ method ] + ** + * Equivalent to `Math.acos()` only works with degrees, not radians. + - num (number) value + = (number) acos in degrees +\*/ +Snap.acos = function (num) { + return Snap.deg(math.acos(num)); +}; +/*\ + * Snap.atan + [ method ] + ** + * Equivalent to `Math.atan()` only works with degrees, not radians. + - num (number) value + = (number) atan in degrees +\*/ +Snap.atan = function (num) { + return Snap.deg(math.atan(num)); +}; +/*\ + * Snap.atan2 + [ method ] + ** + * Equivalent to `Math.atan2()` only works with degrees, not radians. + - num (number) value + = (number) atan2 in degrees +\*/ +Snap.atan2 = function (num) { + return Snap.deg(math.atan2(num)); +}; +/*\ + * Snap.angle + [ method ] + ** + * Returns an angle between two or three points + > Parameters + - x1 (number) x coord of first point + - y1 (number) y coord of first point + - x2 (number) x coord of second point + - y2 (number) y coord of second point + - x3 (number) #optional x coord of third point + - y3 (number) #optional y coord of third point + = (number) angle in degrees +\*/ +Snap.angle = angle; +/*\ + * Snap.len + [ method ] + ** + * Returns distance between two points + > Parameters + - x1 (number) x coord of first point + - y1 (number) y coord of first point + - x2 (number) x coord of second point + - y2 (number) y coord of second point + = (number) distance +\*/ +Snap.len = function (x1, y1, x2, y2) { + return Math.sqrt(Snap.len2(x1, y1, x2, y2)); +}; +/*\ + * Snap.len2 + [ method ] + ** + * Returns squared distance between two points + > Parameters + - x1 (number) x coord of first point + - y1 (number) y coord of first point + - x2 (number) x coord of second point + - y2 (number) y coord of second point + = (number) distance +\*/ +Snap.len2 = function (x1, y1, x2, y2) { + return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); +}; +/*\ + * Snap.closestPoint + [ method ] + ** + * Returns closest point to a given one on a given path. + > Parameters + - path (Element) path element + - x (number) x coord of a point + - y (number) y coord of a point + = (object) in format + { + x (number) x coord of the point on the path + y (number) y coord of the point on the path + length (number) length of the path to the point + distance (number) distance from the given point to the path + } +\*/ +// Copied from http://bl.ocks.org/mbostock/8027637 +Snap.closestPoint = function (path, x, y) { + function distance2(p) { + var dx = p.x - x, + dy = p.y - y; + return dx * dx + dy * dy; + } + var pathNode = path.node, + pathLength = pathNode.getTotalLength(), + precision = pathLength / pathNode.pathSegList.numberOfItems * .125, + best, + bestLength, + bestDistance = Infinity; + + // linear scan for coarse approximation + for (var scan, scanLength = 0, scanDistance; scanLength <= pathLength; scanLength += precision) { + if ((scanDistance = distance2(scan = pathNode.getPointAtLength(scanLength))) < bestDistance) { + best = scan, bestLength = scanLength, bestDistance = scanDistance; + } + } + + // binary search for precise estimate + precision *= .5; + while (precision > .5) { + var before, + after, + beforeLength, + afterLength, + beforeDistance, + afterDistance; + if ((beforeLength = bestLength - precision) >= 0 && (beforeDistance = distance2(before = pathNode.getPointAtLength(beforeLength))) < bestDistance) { + best = before, bestLength = beforeLength, bestDistance = beforeDistance; + } else if ((afterLength = bestLength + precision) <= pathLength && (afterDistance = distance2(after = pathNode.getPointAtLength(afterLength))) < bestDistance) { + best = after, bestLength = afterLength, bestDistance = afterDistance; + } else { + precision *= .5; + } + } + + best = { + x: best.x, + y: best.y, + length: bestLength, + distance: Math.sqrt(bestDistance) + }; + return best; +} +/*\ + * Snap.is + [ method ] + ** + * Handy replacement for the `typeof` operator + - o (…) any object or primitive + - type (string) name of the type, e.g., `string`, `function`, `number`, etc. + = (boolean) `true` if given value is of given type +\*/ +Snap.is = is; +/*\ + * Snap.snapTo + [ method ] + ** + * Snaps given value to given grid + - values (array|number) given array of values or step of the grid + - value (number) value to adjust + - tolerance (number) #optional maximum distance to the target value that would trigger the snap. Default is `10`. + = (number) adjusted value +\*/ +Snap.snapTo = function (values, value, tolerance) { + tolerance = is(tolerance, "finite") ? tolerance : 10; + if (is(values, "array")) { + var i = values.length; + while (i--) if (abs(values[i] - value) <= tolerance) { + return values[i]; + } + } else { + values = +values; + var rem = value % values; + if (rem < tolerance) { + return value - rem; + } + if (rem > values - tolerance) { + return value - rem + values; + } + } + return value; +}; +// Colour +/*\ + * Snap.getRGB + [ method ] + ** + * Parses color string as RGB object + - color (string) color string in one of the following formats: + #
      + #
    • Color name (red, green, cornflowerblue, etc)
    • + #
    • #••• — shortened HTML color: (#000, #fc0, etc.)
    • + #
    • #•••••• — full length HTML color: (#000000, #bd2300)
    • + #
    • rgb(•••, •••, •••) — red, green and blue channels values: (rgb(200, 100, 0))
    • + #
    • rgba(•••, •••, •••, •••) — also with opacity
    • + #
    • rgb(•••%, •••%, •••%) — same as above, but in %: (rgb(100%, 175%, 0%))
    • + #
    • rgba(•••%, •••%, •••%, •••%) — also with opacity
    • + #
    • hsb(•••, •••, •••) — hue, saturation and brightness values: (hsb(0.5, 0.25, 1))
    • + #
    • hsba(•••, •••, •••, •••) — also with opacity
    • + #
    • hsb(•••%, •••%, •••%) — same as above, but in %
    • + #
    • hsba(•••%, •••%, •••%, •••%) — also with opacity
    • + #
    • hsl(•••, •••, •••) — hue, saturation and luminosity values: (hsb(0.5, 0.25, 0.5))
    • + #
    • hsla(•••, •••, •••, •••) — also with opacity
    • + #
    • hsl(•••%, •••%, •••%) — same as above, but in %
    • + #
    • hsla(•••%, •••%, •••%, •••%) — also with opacity
    • + #
    + * Note that `%` can be used any time: `rgb(20%, 255, 50%)`. + = (object) RGB object in the following format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #••••••, + o error (boolean) true if string can't be parsed + o } +\*/ +Snap.getRGB = cacher(function (colour) { + if (!colour || !!((colour = Str(colour)).indexOf("-") + 1)) { + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: rgbtoString}; + } + if (colour == "none") { + return {r: -1, g: -1, b: -1, hex: "none", toString: rgbtoString}; + } + !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == "#") && (colour = toHex(colour)); + if (!colour) { + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: rgbtoString}; + } + var res, + red, + green, + blue, + opacity, + t, + values, + rgb = colour.match(colourRegExp); + if (rgb) { + if (rgb[2]) { + blue = toInt(rgb[2].substring(5), 16); + green = toInt(rgb[2].substring(3, 5), 16); + red = toInt(rgb[2].substring(1, 3), 16); + } + if (rgb[3]) { + blue = toInt((t = rgb[3].charAt(3)) + t, 16); + green = toInt((t = rgb[3].charAt(2)) + t, 16); + red = toInt((t = rgb[3].charAt(1)) + t, 16); + } + if (rgb[4]) { + values = rgb[4].split(commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + rgb[1].toLowerCase().slice(0, 4) == "rgba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + } + if (rgb[5]) { + values = rgb[5].split(commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red /= 100); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green /= 100); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue /= 100); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return Snap.hsb2rgb(red, green, blue, opacity); + } + if (rgb[6]) { + values = rgb[6].split(commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red /= 100); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green /= 100); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue /= 100); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsla" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return Snap.hsl2rgb(red, green, blue, opacity); + } + red = mmin(math.round(red), 255); + green = mmin(math.round(green), 255); + blue = mmin(math.round(blue), 255); + opacity = mmin(mmax(opacity, 0), 1); + rgb = {r: red, g: green, b: blue, toString: rgbtoString}; + rgb.hex = "#" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1); + rgb.opacity = is(opacity, "finite") ? opacity : 1; + return rgb; + } + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: rgbtoString}; +}, Snap); +/*\ + * Snap.hsb + [ method ] + ** + * Converts HSB values to a hex representation of the color + - h (number) hue + - s (number) saturation + - b (number) value or brightness + = (string) hex representation of the color +\*/ +Snap.hsb = cacher(function (h, s, b) { + return Snap.hsb2rgb(h, s, b).hex; +}); +/*\ + * Snap.hsl + [ method ] + ** + * Converts HSL values to a hex representation of the color + - h (number) hue + - s (number) saturation + - l (number) luminosity + = (string) hex representation of the color +\*/ +Snap.hsl = cacher(function (h, s, l) { + return Snap.hsl2rgb(h, s, l).hex; +}); +/*\ + * Snap.rgb + [ method ] + ** + * Converts RGB values to a hex representation of the color + - r (number) red + - g (number) green + - b (number) blue + = (string) hex representation of the color +\*/ +Snap.rgb = cacher(function (r, g, b, o) { + if (is(o, "finite")) { + var round = math.round; + return "rgba(" + [round(r), round(g), round(b), +o.toFixed(2)] + ")"; + } + return "#" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1); +}); +var toHex = function (color) { + var i = glob.doc.getElementsByTagName("head")[0] || glob.doc.getElementsByTagName("svg")[0], + red = "rgb(255, 0, 0)"; + toHex = cacher(function (color) { + if (color.toLowerCase() == "red") { + return red; + } + i.style.color = red; + i.style.color = color; + var out = glob.doc.defaultView.getComputedStyle(i, E).getPropertyValue("color"); + return out == red ? null : out; + }); + return toHex(color); +}, +hsbtoString = function () { + return "hsb(" + [this.h, this.s, this.b] + ")"; +}, +hsltoString = function () { + return "hsl(" + [this.h, this.s, this.l] + ")"; +}, +rgbtoString = function () { + return this.opacity == 1 || this.opacity == null ? + this.hex : + "rgba(" + [this.r, this.g, this.b, this.opacity] + ")"; +}, +prepareRGB = function (r, g, b) { + if (g == null && is(r, "object") && "r" in r && "g" in r && "b" in r) { + b = r.b; + g = r.g; + r = r.r; + } + if (g == null && is(r, string)) { + var clr = Snap.getRGB(r); + r = clr.r; + g = clr.g; + b = clr.b; + } + if (r > 1 || g > 1 || b > 1) { + r /= 255; + g /= 255; + b /= 255; + } + + return [r, g, b]; +}, +packageRGB = function (r, g, b, o) { + r = math.round(r * 255); + g = math.round(g * 255); + b = math.round(b * 255); + var rgb = { + r: r, + g: g, + b: b, + opacity: is(o, "finite") ? o : 1, + hex: Snap.rgb(r, g, b), + toString: rgbtoString + }; + is(o, "finite") && (rgb.opacity = o); + return rgb; +}; +/*\ + * Snap.color + [ method ] + ** + * Parses the color string and returns an object featuring the color's component values + - clr (string) color string in one of the supported formats (see @Snap.getRGB) + = (object) Combined RGB/HSB object in the following format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #••••••, + o error (boolean) `true` if string can't be parsed, + o h (number) hue, + o s (number) saturation, + o v (number) value (brightness), + o l (number) lightness + o } +\*/ +Snap.color = function (clr) { + var rgb; + if (is(clr, "object") && "h" in clr && "s" in clr && "b" in clr) { + rgb = Snap.hsb2rgb(clr); + clr.r = rgb.r; + clr.g = rgb.g; + clr.b = rgb.b; + clr.opacity = 1; + clr.hex = rgb.hex; + } else if (is(clr, "object") && "h" in clr && "s" in clr && "l" in clr) { + rgb = Snap.hsl2rgb(clr); + clr.r = rgb.r; + clr.g = rgb.g; + clr.b = rgb.b; + clr.opacity = 1; + clr.hex = rgb.hex; + } else { + if (is(clr, "string")) { + clr = Snap.getRGB(clr); + } + if (is(clr, "object") && "r" in clr && "g" in clr && "b" in clr && !("error" in clr)) { + rgb = Snap.rgb2hsl(clr); + clr.h = rgb.h; + clr.s = rgb.s; + clr.l = rgb.l; + rgb = Snap.rgb2hsb(clr); + clr.v = rgb.b; + } else { + clr = {hex: "none"}; + clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1; + clr.error = 1; + } + } + clr.toString = rgbtoString; + return clr; +}; +/*\ + * Snap.hsb2rgb + [ method ] + ** + * Converts HSB values to an RGB object + - h (number) hue + - s (number) saturation + - v (number) value or brightness + = (object) RGB object in the following format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #•••••• + o } +\*/ +Snap.hsb2rgb = function (h, s, v, o) { + if (is(h, "object") && "h" in h && "s" in h && "b" in h) { + v = h.b; + s = h.s; + o = h.o; + h = h.h; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = v * s; + X = C * (1 - abs(h % 2 - 1)); + R = G = B = v - C; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return packageRGB(R, G, B, o); +}; +/*\ + * Snap.hsl2rgb + [ method ] + ** + * Converts HSL values to an RGB object + - h (number) hue + - s (number) saturation + - l (number) luminosity + = (object) RGB object in the following format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #•••••• + o } +\*/ +Snap.hsl2rgb = function (h, s, l, o) { + if (is(h, "object") && "h" in h && "s" in h && "l" in h) { + l = h.l; + s = h.s; + h = h.h; + } + if (h > 1 || s > 1 || l > 1) { + h /= 360; + s /= 100; + l /= 100; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = 2 * s * (l < .5 ? l : 1 - l); + X = C * (1 - abs(h % 2 - 1)); + R = G = B = l - C / 2; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return packageRGB(R, G, B, o); +}; +/*\ + * Snap.rgb2hsb + [ method ] + ** + * Converts RGB values to an HSB object + - r (number) red + - g (number) green + - b (number) blue + = (object) HSB object in the following format: + o { + o h (number) hue, + o s (number) saturation, + o b (number) brightness + o } +\*/ +Snap.rgb2hsb = function (r, g, b) { + b = prepareRGB(r, g, b); + r = b[0]; + g = b[1]; + b = b[2]; + + var H, S, V, C; + V = mmax(r, g, b); + C = V - mmin(r, g, b); + H = (C == 0 ? null : + V == r ? (g - b) / C : + V == g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C == 0 ? 0 : C / V; + return {h: H, s: S, b: V, toString: hsbtoString}; +}; +/*\ + * Snap.rgb2hsl + [ method ] + ** + * Converts RGB values to an HSL object + - r (number) red + - g (number) green + - b (number) blue + = (object) HSL object in the following format: + o { + o h (number) hue, + o s (number) saturation, + o l (number) luminosity + o } +\*/ +Snap.rgb2hsl = function (r, g, b) { + b = prepareRGB(r, g, b); + r = b[0]; + g = b[1]; + b = b[2]; + + var H, S, L, M, m, C; + M = mmax(r, g, b); + m = mmin(r, g, b); + C = M - m; + H = (C == 0 ? null : + M == r ? (g - b) / C : + M == g ? (b - r) / C + 2 : + (r - g) / C + 4); + H = ((H + 360) % 6) * 60 / 360; + L = (M + m) / 2; + S = (C == 0 ? 0 : + L < .5 ? C / (2 * L) : + C / (2 - 2 * L)); + return {h: H, s: S, l: L, toString: hsltoString}; +}; + +// Transformations +/*\ + * Snap.parsePathString + [ method ] + ** + * Utility method + ** + * Parses given path string into an array of arrays of path segments + - pathString (string|array) path string or array of segments (in the last case it is returned straight away) + = (array) array of segments +\*/ +Snap.parsePathString = function (pathString) { + if (!pathString) { + return null; + } + var pth = Snap.path(pathString); + if (pth.arr) { + return Snap.path.clone(pth.arr); + } + + var paramCounts = {a: 7, c: 6, o: 2, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, u: 3, z: 0}, + data = []; + if (is(pathString, "array") && is(pathString[0], "array")) { // rough assumption + data = Snap.path.clone(pathString); + } + if (!data.length) { + Str(pathString).replace(pathCommand, function (a, b, c) { + var params = [], + name = b.toLowerCase(); + c.replace(pathValues, function (a, b) { + b && params.push(+b); + }); + if (name == "m" && params.length > 2) { + data.push([b].concat(params.splice(0, 2))); + name = "l"; + b = b == "m" ? "l" : "L"; + } + if (name == "o" && params.length == 1) { + data.push([b, params[0]]); + } + if (name == "r") { + data.push([b].concat(params)); + } else while (params.length >= paramCounts[name]) { + data.push([b].concat(params.splice(0, paramCounts[name]))); + if (!paramCounts[name]) { + break; + } + } + }); + } + data.toString = Snap.path.toString; + pth.arr = Snap.path.clone(data); + return data; +}; +/*\ + * Snap.parseTransformString + [ method ] + ** + * Utility method + ** + * Parses given transform string into an array of transformations + - TString (string|array) transform string or array of transformations (in the last case it is returned straight away) + = (array) array of transformations +\*/ +var parseTransformString = Snap.parseTransformString = function (TString) { + if (!TString) { + return null; + } + var paramCounts = {r: 3, s: 4, t: 2, m: 6}, + data = []; + if (is(TString, "array") && is(TString[0], "array")) { // rough assumption + data = Snap.path.clone(TString); + } + if (!data.length) { + Str(TString).replace(tCommand, function (a, b, c) { + var params = [], + name = b.toLowerCase(); + c.replace(pathValues, function (a, b) { + b && params.push(+b); + }); + data.push([b].concat(params)); + }); + } + data.toString = Snap.path.toString; + return data; +}; +function svgTransform2string(tstr) { + var res = []; + tstr = tstr.replace(/(?:^|\s)(\w+)\(([^)]+)\)/g, function (all, name, params) { + params = params.split(/\s*,\s*|\s+/); + if (name == "rotate" && params.length == 1) { + params.push(0, 0); + } + if (name == "scale") { + if (params.length > 2) { + params = params.slice(0, 2); + } else if (params.length == 2) { + params.push(0, 0); + } + if (params.length == 1) { + params.push(params[0], 0, 0); + } + } + if (name == "skewX") { + res.push(["m", 1, 0, math.tan(rad(params[0])), 1, 0, 0]); + } else if (name == "skewY") { + res.push(["m", 1, math.tan(rad(params[0])), 0, 1, 0, 0]); + } else { + res.push([name.charAt(0)].concat(params)); + } + return all; + }); + return res; +} +Snap._.svgTransform2string = svgTransform2string; +Snap._.rgTransform = /^[a-z][\s]*-?\.?\d/i; +function transform2matrix(tstr, bbox) { + var tdata = parseTransformString(tstr), + m = new Snap.Matrix; + if (tdata) { + for (var i = 0, ii = tdata.length; i < ii; i++) { + var t = tdata[i], + tlen = t.length, + command = Str(t[0]).toLowerCase(), + absolute = t[0] != command, + inver = absolute ? m.invert() : 0, + x1, + y1, + x2, + y2, + bb; + if (command == "t" && tlen == 2){ + m.translate(t[1], 0); + } else if (command == "t" && tlen == 3) { + if (absolute) { + x1 = inver.x(0, 0); + y1 = inver.y(0, 0); + x2 = inver.x(t[1], t[2]); + y2 = inver.y(t[1], t[2]); + m.translate(x2 - x1, y2 - y1); + } else { + m.translate(t[1], t[2]); + } + } else if (command == "r") { + if (tlen == 2) { + bb = bb || bbox; + m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2); + } else if (tlen == 4) { + if (absolute) { + x2 = inver.x(t[2], t[3]); + y2 = inver.y(t[2], t[3]); + m.rotate(t[1], x2, y2); + } else { + m.rotate(t[1], t[2], t[3]); + } + } + } else if (command == "s") { + if (tlen == 2 || tlen == 3) { + bb = bb || bbox; + m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2); + } else if (tlen == 4) { + if (absolute) { + x2 = inver.x(t[2], t[3]); + y2 = inver.y(t[2], t[3]); + m.scale(t[1], t[1], x2, y2); + } else { + m.scale(t[1], t[1], t[2], t[3]); + } + } else if (tlen == 5) { + if (absolute) { + x2 = inver.x(t[3], t[4]); + y2 = inver.y(t[3], t[4]); + m.scale(t[1], t[2], x2, y2); + } else { + m.scale(t[1], t[2], t[3], t[4]); + } + } + } else if (command == "m" && tlen == 7) { + m.add(t[1], t[2], t[3], t[4], t[5], t[6]); + } + } + } + return m; +} +Snap._.transform2matrix = transform2matrix; +Snap._unit2px = unit2px; +var contains = glob.doc.contains || glob.doc.compareDocumentPosition ? + function (a, b) { + var adown = a.nodeType == 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a == bup || !!(bup && bup.nodeType == 1 && ( + adown.contains ? + adown.contains(bup) : + a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16 + )); + } : + function (a, b) { + if (b) { + while (b) { + b = b.parentNode; + if (b == a) { + return true; + } + } + } + return false; + }; +function getSomeDefs(el) { + var p = (el.node.ownerSVGElement && wrap(el.node.ownerSVGElement)) || + (el.node.parentNode && wrap(el.node.parentNode)) || + Snap.select("svg") || + Snap(0, 0), + pdefs = p.select("defs"), + defs = pdefs == null ? false : pdefs.node; + if (!defs) { + defs = make("defs", p.node).node; + } + return defs; +} +function getSomeSVG(el) { + return el.node.ownerSVGElement && wrap(el.node.ownerSVGElement) || Snap.select("svg"); +} +Snap._.getSomeDefs = getSomeDefs; +Snap._.getSomeSVG = getSomeSVG; +function unit2px(el, name, value) { + var svg = getSomeSVG(el).node, + out = {}, + mgr = svg.querySelector(".svg---mgr"); + if (!mgr) { + mgr = $("rect"); + $(mgr, {x: -9e9, y: -9e9, width: 10, height: 10, "class": "svg---mgr", fill: "none"}); + svg.appendChild(mgr); + } + function getW(val) { + if (val == null) { + return E; + } + if (val == +val) { + return val; + } + $(mgr, {width: val}); + try { + return mgr.getBBox().width; + } catch (e) { + return 0; + } + } + function getH(val) { + if (val == null) { + return E; + } + if (val == +val) { + return val; + } + $(mgr, {height: val}); + try { + return mgr.getBBox().height; + } catch (e) { + return 0; + } + } + function set(nam, f) { + if (name == null) { + out[nam] = f(el.attr(nam) || 0); + } else if (nam == name) { + out = f(value == null ? el.attr(nam) || 0 : value); + } + } + switch (el.type) { + case "rect": + set("rx", getW); + set("ry", getH); + case "image": + set("width", getW); + set("height", getH); + case "text": + set("x", getW); + set("y", getH); + break; + case "circle": + set("cx", getW); + set("cy", getH); + set("r", getW); + break; + case "ellipse": + set("cx", getW); + set("cy", getH); + set("rx", getW); + set("ry", getH); + break; + case "line": + set("x1", getW); + set("x2", getW); + set("y1", getH); + set("y2", getH); + break; + case "marker": + set("refX", getW); + set("markerWidth", getW); + set("refY", getH); + set("markerHeight", getH); + break; + case "radialGradient": + set("fx", getW); + set("fy", getH); + break; + case "tspan": + set("dx", getW); + set("dy", getH); + break; + default: + set(name, getW); + } + svg.removeChild(mgr); + return out; +} +/*\ + * Snap.select + [ method ] + ** + * Wraps a DOM element specified by CSS selector as @Element + - query (string) CSS selector of the element + = (Element) the current element +\*/ +Snap.select = function (query) { + query = Str(query).replace(/([^\\]):/g, "$1\\:"); + return wrap(glob.doc.querySelector(query)); +}; +/*\ + * Snap.selectAll + [ method ] + ** + * Wraps DOM elements specified by CSS selector as set or array of @Element + - query (string) CSS selector of the element + = (Element) the current element +\*/ +Snap.selectAll = function (query) { + var nodelist = glob.doc.querySelectorAll(query), + set = (Snap.set || Array)(); + for (var i = 0; i < nodelist.length; i++) { + set.push(wrap(nodelist[i])); + } + return set; +}; + +function add2group(list) { + if (!is(list, "array")) { + list = Array.prototype.slice.call(arguments, 0); + } + var i = 0, + j = 0, + node = this.node; + while (this[i]) delete this[i++]; + for (i = 0; i < list.length; i++) { + if (list[i].type == "set") { + list[i].forEach(function (el) { + node.appendChild(el.node); + }); + } else { + node.appendChild(list[i].node); + } + } + var children = node.childNodes; + for (i = 0; i < children.length; i++) { + this[j++] = wrap(children[i]); + } + return this; +} +// Hub garbage collector every 10s +setInterval(function () { + for (var key in hub) if (hub[has](key)) { + var el = hub[key], + node = el.node; + if (el.type != "svg" && !node.ownerSVGElement || el.type == "svg" && (!node.parentNode || "ownerSVGElement" in node.parentNode && !node.ownerSVGElement)) { + delete hub[key]; + } + } +}, 1e4); +function Element(el) { + if (el.snap in hub) { + return hub[el.snap]; + } + var svg; + try { + svg = el.ownerSVGElement; + } catch(e) {} + /*\ + * Element.node + [ property (object) ] + ** + * Gives you a reference to the DOM object, so you can assign event handlers or just mess around. + > Usage + | // draw a circle at coordinate 10,10 with radius of 10 + | var c = paper.circle(10, 10, 10); + | c.node.onclick = function () { + | c.attr("fill", "red"); + | }; + \*/ + this.node = el; + if (svg) { + this.paper = new Paper(svg); + } + /*\ + * Element.type + [ property (string) ] + ** + * SVG tag name of the given element. + \*/ + this.type = el.tagName || el.nodeName; + var id = this.id = ID(this); + this.anims = {}; + this._ = { + transform: [] + }; + el.snap = id; + hub[id] = this; + if (this.type == "g") { + this.add = add2group; + } + if (this.type in {g: 1, mask: 1, pattern: 1, symbol: 1}) { + for (var method in Paper.prototype) if (Paper.prototype[has](method)) { + this[method] = Paper.prototype[method]; + } + } +} + /*\ + * Element.attr + [ method ] + ** + * Gets or sets given attributes of the element. + ** + - params (object) contains key-value pairs of attributes you want to set + * or + - param (string) name of the attribute + = (Element) the current element + * or + = (string) value of attribute + > Usage + | el.attr({ + | fill: "#fc0", + | stroke: "#000", + | strokeWidth: 2, // CamelCase... + | "fill-opacity": 0.5, // or dash-separated names + | width: "*=2" // prefixed values + | }); + | console.log(el.attr("fill")); // #fc0 + * Prefixed values in format `"+=10"` supported. All four operations + * (`+`, `-`, `*` and `/`) could be used. Optionally you can use units for `+` + * and `-`: `"+=2em"`. + \*/ + Element.prototype.attr = function (params, value) { + var el = this, + node = el.node; + if (!params) { + if (node.nodeType != 1) { + return { + text: node.nodeValue + }; + } + var attr = node.attributes, + out = {}; + for (var i = 0, ii = attr.length; i < ii; i++) { + out[attr[i].nodeName] = attr[i].nodeValue; + } + return out; + } + if (is(params, "string")) { + if (arguments.length > 1) { + var json = {}; + json[params] = value; + params = json; + } else { + return eve("snap.util.getattr." + params, el).firstDefined(); + } + } + for (var att in params) { + if (params[has](att)) { + eve("snap.util.attr." + att, el, params[att]); + } + } + return el; + }; +/*\ + * Snap.parse + [ method ] + ** + * Parses SVG fragment and converts it into a @Fragment + ** + - svg (string) SVG string + = (Fragment) the @Fragment +\*/ +Snap.parse = function (svg) { + var f = glob.doc.createDocumentFragment(), + full = true, + div = glob.doc.createElement("div"); + svg = Str(svg); + if (!svg.match(/^\s*<\s*svg(?:\s|>)/)) { + svg = "" + svg + ""; + full = false; + } + div.innerHTML = svg; + svg = div.getElementsByTagName("svg")[0]; + if (svg) { + if (full) { + f = svg; + } else { + while (svg.firstChild) { + f.appendChild(svg.firstChild); + } + } + } + return new Fragment(f); +}; +function Fragment(frag) { + this.node = frag; +} +/*\ + * Snap.fragment + [ method ] + ** + * Creates a DOM fragment from a given list of elements or strings + ** + - varargs (…) SVG string + = (Fragment) the @Fragment +\*/ +Snap.fragment = function () { + var args = Array.prototype.slice.call(arguments, 0), + f = glob.doc.createDocumentFragment(); + for (var i = 0, ii = args.length; i < ii; i++) { + var item = args[i]; + if (item.node && item.node.nodeType) { + f.appendChild(item.node); + } + if (item.nodeType) { + f.appendChild(item); + } + if (typeof item == "string") { + f.appendChild(Snap.parse(item).node); + } + } + return new Fragment(f); +}; + +function make(name, parent) { + var res = $(name); + parent.appendChild(res); + var el = wrap(res); + return el; +} +function Paper(w, h) { + var res, + desc, + defs, + proto = Paper.prototype; + if (w && w.tagName == "svg") { + if (w.snap in hub) { + return hub[w.snap]; + } + var doc = w.ownerDocument; + res = new Element(w); + desc = w.getElementsByTagName("desc")[0]; + defs = w.getElementsByTagName("defs")[0]; + if (!desc) { + desc = $("desc"); + desc.appendChild(doc.createTextNode("Created with Snap")); + res.node.appendChild(desc); + } + if (!defs) { + defs = $("defs"); + res.node.appendChild(defs); + } + res.defs = defs; + for (var key in proto) if (proto[has](key)) { + res[key] = proto[key]; + } + res.paper = res.root = res; + } else { + res = make("svg", glob.doc.body); + $(res.node, { + height: h, + version: 1.1, + width: w, + xmlns: xmlns + }); + } + return res; +} +function wrap(dom) { + if (!dom) { + return dom; + } + if (dom instanceof Element || dom instanceof Fragment) { + return dom; + } + if (dom.tagName && dom.tagName.toLowerCase() == "svg") { + return new Paper(dom); + } + if (dom.tagName && dom.tagName.toLowerCase() == "object" && dom.type == "image/svg+xml") { + return new Paper(dom.contentDocument.getElementsByTagName("svg")[0]); + } + return new Element(dom); +} + +Snap._.make = make; +Snap._.wrap = wrap; +/*\ + * Paper.el + [ method ] + ** + * Creates an element on paper with a given name and no attributes + ** + - name (string) tag name + - attr (object) attributes + = (Element) the current element + > Usage + | var c = paper.circle(10, 10, 10); // is the same as... + | var c = paper.el("circle").attr({ + | cx: 10, + | cy: 10, + | r: 10 + | }); + | // and the same as + | var c = paper.el("circle", { + | cx: 10, + | cy: 10, + | r: 10 + | }); +\*/ +Paper.prototype.el = function (name, attr) { + var el = make(name, this.node); + attr && el.attr(attr); + return el; +}; +/*\ + * Element.children + [ method ] + ** + * Returns array of all the children of the element. + = (array) array of Elements +\*/ +Element.prototype.children = function () { + var out = [], + ch = this.node.childNodes; + for (var i = 0, ii = ch.length; i < ii; i++) { + out[i] = Snap(ch[i]); + } + return out; +}; +function jsonFiller(root, o) { + for (var i = 0, ii = root.length; i < ii; i++) { + var item = { + type: root[i].type, + attr: root[i].attr() + }, + children = root[i].children(); + o.push(item); + if (children.length) { + jsonFiller(children, item.childNodes = []); + } + } +} +/*\ + * Element.toJSON + [ method ] + ** + * Returns object representation of the given element and all its children. + = (object) in format + o { + o type (string) this.type, + o attr (object) attributes map, + o childNodes (array) optional array of children in the same format + o } +\*/ +Element.prototype.toJSON = function () { + var out = []; + jsonFiller([this], out); + return out[0]; +}; +// default +eve.on("snap.util.getattr", function () { + var att = eve.nt(); + att = att.substring(att.lastIndexOf(".") + 1); + var css = att.replace(/[A-Z]/g, function (letter) { + return "-" + letter.toLowerCase(); + }); + if (cssAttr[has](css)) { + return this.node.ownerDocument.defaultView.getComputedStyle(this.node, null).getPropertyValue(css); + } else { + return $(this.node, att); + } +}); +var cssAttr = { + "alignment-baseline": 0, + "baseline-shift": 0, + "clip": 0, + "clip-path": 0, + "clip-rule": 0, + "color": 0, + "color-interpolation": 0, + "color-interpolation-filters": 0, + "color-profile": 0, + "color-rendering": 0, + "cursor": 0, + "direction": 0, + "display": 0, + "dominant-baseline": 0, + "enable-background": 0, + "fill": 0, + "fill-opacity": 0, + "fill-rule": 0, + "filter": 0, + "flood-color": 0, + "flood-opacity": 0, + "font": 0, + "font-family": 0, + "font-size": 0, + "font-size-adjust": 0, + "font-stretch": 0, + "font-style": 0, + "font-variant": 0, + "font-weight": 0, + "glyph-orientation-horizontal": 0, + "glyph-orientation-vertical": 0, + "image-rendering": 0, + "kerning": 0, + "letter-spacing": 0, + "lighting-color": 0, + "marker": 0, + "marker-end": 0, + "marker-mid": 0, + "marker-start": 0, + "mask": 0, + "opacity": 0, + "overflow": 0, + "pointer-events": 0, + "shape-rendering": 0, + "stop-color": 0, + "stop-opacity": 0, + "stroke": 0, + "stroke-dasharray": 0, + "stroke-dashoffset": 0, + "stroke-linecap": 0, + "stroke-linejoin": 0, + "stroke-miterlimit": 0, + "stroke-opacity": 0, + "stroke-width": 0, + "text-anchor": 0, + "text-decoration": 0, + "text-rendering": 0, + "unicode-bidi": 0, + "visibility": 0, + "word-spacing": 0, + "writing-mode": 0 +}; + +eve.on("snap.util.attr", function (value) { + var att = eve.nt(), + attr = {}; + att = att.substring(att.lastIndexOf(".") + 1); + attr[att] = value; + var style = att.replace(/-(\w)/gi, function (all, letter) { + return letter.toUpperCase(); + }), + css = att.replace(/[A-Z]/g, function (letter) { + return "-" + letter.toLowerCase(); + }); + if (cssAttr[has](css)) { + this.node.style[style] = value == null ? E : value; + } else { + $(this.node, attr); + } +}); +(function (proto) {}(Paper.prototype)); + +// simple ajax +/*\ + * Snap.ajax + [ method ] + ** + * Simple implementation of Ajax + ** + - url (string) URL + - postData (object|string) data for post request + - callback (function) callback + - scope (object) #optional scope of callback + * or + - url (string) URL + - callback (function) callback + - scope (object) #optional scope of callback + = (XMLHttpRequest) the XMLHttpRequest object, just in case +\*/ +Snap.ajax = function (url, postData, callback, scope){ + var req = new XMLHttpRequest, + id = ID(); + if (req) { + if (is(postData, "function")) { + scope = callback; + callback = postData; + postData = null; + } else if (is(postData, "object")) { + var pd = []; + for (var key in postData) if (postData.hasOwnProperty(key)) { + pd.push(encodeURIComponent(key) + "=" + encodeURIComponent(postData[key])); + } + postData = pd.join("&"); + } + req.open((postData ? "POST" : "GET"), url, true); + if (postData) { + req.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + } + if (callback) { + eve.once("snap.ajax." + id + ".0", callback); + eve.once("snap.ajax." + id + ".200", callback); + eve.once("snap.ajax." + id + ".304", callback); + } + req.onreadystatechange = function() { + if (req.readyState != 4) return; + eve("snap.ajax." + id + "." + req.status, scope, req); + }; + if (req.readyState == 4) { + return req; + } + req.send(postData); + return req; + } +}; +/*\ + * Snap.load + [ method ] + ** + * Loads external SVG file as a @Fragment (see @Snap.ajax for more advanced AJAX) + ** + - url (string) URL + - callback (function) callback + - scope (object) #optional scope of callback +\*/ +Snap.load = function (url, callback, scope) { + Snap.ajax(url, function (req) { + var f = Snap.parse(req.responseText); + scope ? callback.call(scope, f) : callback(f); + }); +}; +var getOffset = function (elem) { + var box = elem.getBoundingClientRect(), + doc = elem.ownerDocument, + body = doc.body, + docElem = doc.documentElement, + clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, + top = box.top + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop, + left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft; + return { + y: top, + x: left + }; +}; +/*\ + * Snap.getElementByPoint + [ method ] + ** + * Returns you topmost element under given point. + ** + = (object) Snap element object + - x (number) x coordinate from the top left corner of the window + - y (number) y coordinate from the top left corner of the window + > Usage + | Snap.getElementByPoint(mouseX, mouseY).attr({stroke: "#f00"}); +\*/ +Snap.getElementByPoint = function (x, y) { + var paper = this, + svg = paper.canvas, + target = glob.doc.elementFromPoint(x, y); + if (glob.win.opera && target.tagName == "svg") { + var so = getOffset(target), + sr = target.createSVGRect(); + sr.x = x - so.x; + sr.y = y - so.y; + sr.width = sr.height = 1; + var hits = target.getIntersectionList(sr, null); + if (hits.length) { + target = hits[hits.length - 1]; + } + } + if (!target) { + return null; + } + return wrap(target); +}; +/*\ + * Snap.plugin + [ method ] + ** + * Let you write plugins. You pass in a function with five arguments, like this: + | Snap.plugin(function (Snap, Element, Paper, global, Fragment) { + | Snap.newmethod = function () {}; + | Element.prototype.newmethod = function () {}; + | Paper.prototype.newmethod = function () {}; + | }); + * Inside the function you have access to all main objects (and their + * prototypes). This allow you to extend anything you want. + ** + - f (function) your plugin body +\*/ +Snap.plugin = function (f) { + f(Snap, Element, Paper, glob, Fragment); +}; +glob.win.Snap = Snap; +return Snap; +}(window || this)); + +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var elproto = Element.prototype, + is = Snap.is, + Str = String, + unit2px = Snap._unit2px, + $ = Snap._.$, + make = Snap._.make, + getSomeDefs = Snap._.getSomeDefs, + has = "hasOwnProperty", + wrap = Snap._.wrap; + /*\ + * Element.getBBox + [ method ] + ** + * Returns the bounding box descriptor for the given element + ** + = (object) bounding box descriptor: + o { + o cx: (number) x of the center, + o cy: (number) x of the center, + o h: (number) height, + o height: (number) height, + o path: (string) path command for the box, + o r0: (number) radius of a circle that fully encloses the box, + o r1: (number) radius of the smallest circle that can be enclosed, + o r2: (number) radius of the largest circle that can be enclosed, + o vb: (string) box as a viewbox command, + o w: (number) width, + o width: (number) width, + o x2: (number) x of the right side, + o x: (number) x of the left side, + o y2: (number) y of the bottom edge, + o y: (number) y of the top edge + o } + \*/ + elproto.getBBox = function (isWithoutTransform) { + if (!Snap.Matrix || !Snap.path) { + return this.node.getBBox(); + } + var el = this, + m = new Snap.Matrix; + if (el.removed) { + return Snap._.box(); + } + while (el.type == "use") { + if (!isWithoutTransform) { + m = m.add(el.transform().localMatrix.translate(el.attr("x") || 0, el.attr("y") || 0)); + } + if (el.original) { + el = el.original; + } else { + var href = el.attr("xlink:href"); + el = el.original = el.node.ownerDocument.getElementById(href.substring(href.indexOf("#") + 1)); + } + } + var _ = el._, + pathfinder = Snap.path.get[el.type] || Snap.path.get.deflt; + try { + if (isWithoutTransform) { + _.bboxwt = pathfinder ? Snap.path.getBBox(el.realPath = pathfinder(el)) : Snap._.box(el.node.getBBox()); + return Snap._.box(_.bboxwt); + } else { + el.realPath = pathfinder(el); + el.matrix = el.transform().localMatrix; + _.bbox = Snap.path.getBBox(Snap.path.map(el.realPath, m.add(el.matrix))); + return Snap._.box(_.bbox); + } + } catch (e) { + // Firefox doesn’t give you bbox of hidden element + return Snap._.box(); + } + }; + var propString = function () { + return this.string; + }; + function extractTransform(el, tstr) { + if (tstr == null) { + var doReturn = true; + if (el.type == "linearGradient" || el.type == "radialGradient") { + tstr = el.node.getAttribute("gradientTransform"); + } else if (el.type == "pattern") { + tstr = el.node.getAttribute("patternTransform"); + } else { + tstr = el.node.getAttribute("transform"); + } + if (!tstr) { + return new Snap.Matrix; + } + tstr = Snap._.svgTransform2string(tstr); + } else { + if (!Snap._.rgTransform.test(tstr)) { + tstr = Snap._.svgTransform2string(tstr); + } else { + tstr = Str(tstr).replace(/\.{3}|\u2026/g, el._.transform || ""); + } + if (is(tstr, "array")) { + tstr = Snap.path ? Snap.path.toString.call(tstr) : Str(tstr); + } + el._.transform = tstr; + } + var m = Snap._.transform2matrix(tstr, el.getBBox(1)); + if (doReturn) { + return m; + } else { + el.matrix = m; + } + } + /*\ + * Element.transform + [ method ] + ** + * Gets or sets transformation of the element + ** + - tstr (string) transform string in Snap or SVG format + = (Element) the current element + * or + = (object) transformation descriptor: + o { + o string (string) transform string, + o globalMatrix (Matrix) matrix of all transformations applied to element or its parents, + o localMatrix (Matrix) matrix of transformations applied only to the element, + o diffMatrix (Matrix) matrix of difference between global and local transformations, + o global (string) global transformation as string, + o local (string) local transformation as string, + o toString (function) returns `string` property + o } + \*/ + elproto.transform = function (tstr) { + var _ = this._; + if (tstr == null) { + var papa = this, + global = new Snap.Matrix(this.node.getCTM()), + local = extractTransform(this), + ms = [local], + m = new Snap.Matrix, + i, + localString = local.toTransformString(), + string = Str(local) == Str(this.matrix) ? + Str(_.transform) : localString; + while (papa.type != "svg" && (papa = papa.parent())) { + ms.push(extractTransform(papa)); + } + i = ms.length; + while (i--) { + m.add(ms[i]); + } + return { + string: string, + globalMatrix: global, + totalMatrix: m, + localMatrix: local, + diffMatrix: global.clone().add(local.invert()), + global: global.toTransformString(), + total: m.toTransformString(), + local: localString, + toString: propString + }; + } + if (tstr instanceof Snap.Matrix) { + this.matrix = tstr; + this._.transform = tstr.toTransformString(); + } else { + extractTransform(this, tstr); + } + + if (this.node) { + if (this.type == "linearGradient" || this.type == "radialGradient") { + $(this.node, {gradientTransform: this.matrix}); + } else if (this.type == "pattern") { + $(this.node, {patternTransform: this.matrix}); + } else { + $(this.node, {transform: this.matrix}); + } + } + + return this; + }; + /*\ + * Element.parent + [ method ] + ** + * Returns the element's parent + ** + = (Element) the parent element + \*/ + elproto.parent = function () { + return wrap(this.node.parentNode); + }; + /*\ + * Element.append + [ method ] + ** + * Appends the given element to current one + ** + - el (Element|Set) element to append + = (Element) the parent element + \*/ + /*\ + * Element.add + [ method ] + ** + * See @Element.append + \*/ + elproto.append = elproto.add = function (el) { + if (el) { + if (el.type == "set") { + var it = this; + el.forEach(function (el) { + it.add(el); + }); + return this; + } + el = wrap(el); + this.node.appendChild(el.node); + el.paper = this.paper; + } + return this; + }; + /*\ + * Element.appendTo + [ method ] + ** + * Appends the current element to the given one + ** + - el (Element) parent element to append to + = (Element) the child element + \*/ + elproto.appendTo = function (el) { + if (el) { + el = wrap(el); + el.append(this); + } + return this; + }; + /*\ + * Element.prepend + [ method ] + ** + * Prepends the given element to the current one + ** + - el (Element) element to prepend + = (Element) the parent element + \*/ + elproto.prepend = function (el) { + if (el) { + if (el.type == "set") { + var it = this, + first; + el.forEach(function (el) { + if (first) { + first.after(el); + } else { + it.prepend(el); + } + first = el; + }); + return this; + } + el = wrap(el); + var parent = el.parent(); + this.node.insertBefore(el.node, this.node.firstChild); + this.add && this.add(); + el.paper = this.paper; + this.parent() && this.parent().add(); + parent && parent.add(); + } + return this; + }; + /*\ + * Element.prependTo + [ method ] + ** + * Prepends the current element to the given one + ** + - el (Element) parent element to prepend to + = (Element) the child element + \*/ + elproto.prependTo = function (el) { + el = wrap(el); + el.prepend(this); + return this; + }; + /*\ + * Element.before + [ method ] + ** + * Inserts given element before the current one + ** + - el (Element) element to insert + = (Element) the parent element + \*/ + elproto.before = function (el) { + if (el.type == "set") { + var it = this; + el.forEach(function (el) { + var parent = el.parent(); + it.node.parentNode.insertBefore(el.node, it.node); + parent && parent.add(); + }); + this.parent().add(); + return this; + } + el = wrap(el); + var parent = el.parent(); + this.node.parentNode.insertBefore(el.node, this.node); + this.parent() && this.parent().add(); + parent && parent.add(); + el.paper = this.paper; + return this; + }; + /*\ + * Element.after + [ method ] + ** + * Inserts given element after the current one + ** + - el (Element) element to insert + = (Element) the parent element + \*/ + elproto.after = function (el) { + el = wrap(el); + var parent = el.parent(); + if (this.node.nextSibling) { + this.node.parentNode.insertBefore(el.node, this.node.nextSibling); + } else { + this.node.parentNode.appendChild(el.node); + } + this.parent() && this.parent().add(); + parent && parent.add(); + el.paper = this.paper; + return this; + }; + /*\ + * Element.insertBefore + [ method ] + ** + * Inserts the element after the given one + ** + - el (Element) element next to whom insert to + = (Element) the parent element + \*/ + elproto.insertBefore = function (el) { + el = wrap(el); + var parent = this.parent(); + el.node.parentNode.insertBefore(this.node, el.node); + this.paper = el.paper; + parent && parent.add(); + el.parent() && el.parent().add(); + return this; + }; + /*\ + * Element.insertAfter + [ method ] + ** + * Inserts the element after the given one + ** + - el (Element) element next to whom insert to + = (Element) the parent element + \*/ + elproto.insertAfter = function (el) { + el = wrap(el); + var parent = this.parent(); + el.node.parentNode.insertBefore(this.node, el.node.nextSibling); + this.paper = el.paper; + parent && parent.add(); + el.parent() && el.parent().add(); + return this; + }; + /*\ + * Element.remove + [ method ] + ** + * Removes element from the DOM + = (Element) the detached element + \*/ + elproto.remove = function () { + var parent = this.parent(); + this.node.parentNode && this.node.parentNode.removeChild(this.node); + delete this.paper; + this.removed = true; + parent && parent.add(); + return this; + }; + /*\ + * Element.select + [ method ] + ** + * Gathers the nested @Element matching the given set of CSS selectors + ** + - query (string) CSS selector + = (Element) result of query selection + \*/ + elproto.select = function (query) { + return wrap(this.node.querySelector(query)); + }; + /*\ + * Element.selectAll + [ method ] + ** + * Gathers nested @Element objects matching the given set of CSS selectors + ** + - query (string) CSS selector + = (Set|array) result of query selection + \*/ + elproto.selectAll = function (query) { + var nodelist = this.node.querySelectorAll(query), + set = (Snap.set || Array)(); + for (var i = 0; i < nodelist.length; i++) { + set.push(wrap(nodelist[i])); + } + return set; + }; + /*\ + * Element.asPX + [ method ] + ** + * Returns given attribute of the element as a `px` value (not %, em, etc.) + ** + - attr (string) attribute name + - value (string) #optional attribute value + = (Element) result of query selection + \*/ + elproto.asPX = function (attr, value) { + if (value == null) { + value = this.attr(attr); + } + return +unit2px(this, attr, value); + }; + // SIERRA Element.use(): I suggest adding a note about how to access the original element the returned instantiates. It's a part of SVG with which ordinary web developers may be least familiar. + /*\ + * Element.use + [ method ] + ** + * Creates a `` element linked to the current element + ** + = (Element) the `` element + \*/ + elproto.use = function () { + var use, + id = this.node.id; + if (!id) { + id = this.id; + $(this.node, { + id: id + }); + } + if (this.type == "linearGradient" || this.type == "radialGradient" || + this.type == "pattern") { + use = make(this.type, this.node.parentNode); + } else { + use = make("use", this.node.parentNode); + } + $(use.node, { + "xlink:href": "#" + id + }); + use.original = this; + return use; + }; + function fixids(el) { + var els = el.selectAll("*"), + it, + url = /^\s*url\(("|'|)(.*)\1\)\s*$/, + ids = [], + uses = {}; + function urltest(it, name) { + var val = $(it.node, name); + val = val && val.match(url); + val = val && val[2]; + if (val && val.charAt() == "#") { + val = val.substring(1); + } else { + return; + } + if (val) { + uses[val] = (uses[val] || []).concat(function (id) { + var attr = {}; + attr[name] = URL(id); + $(it.node, attr); + }); + } + } + function linktest(it) { + var val = $(it.node, "xlink:href"); + if (val && val.charAt() == "#") { + val = val.substring(1); + } else { + return; + } + if (val) { + uses[val] = (uses[val] || []).concat(function (id) { + it.attr("xlink:href", "#" + id); + }); + } + } + for (var i = 0, ii = els.length; i < ii; i++) { + it = els[i]; + urltest(it, "fill"); + urltest(it, "stroke"); + urltest(it, "filter"); + urltest(it, "mask"); + urltest(it, "clip-path"); + linktest(it); + var oldid = $(it.node, "id"); + if (oldid) { + $(it.node, {id: it.id}); + ids.push({ + old: oldid, + id: it.id + }); + } + } + for (i = 0, ii = ids.length; i < ii; i++) { + var fs = uses[ids[i].old]; + if (fs) { + for (var j = 0, jj = fs.length; j < jj; j++) { + fs[j](ids[i].id); + } + } + } + } + /*\ + * Element.clone + [ method ] + ** + * Creates a clone of the element and inserts it after the element + ** + = (Element) the clone + \*/ + elproto.clone = function () { + var clone = wrap(this.node.cloneNode(true)); + if ($(clone.node, "id")) { + $(clone.node, {id: clone.id}); + } + fixids(clone); + clone.insertAfter(this); + return clone; + }; + /*\ + * Element.toDefs + [ method ] + ** + * Moves element to the shared `` area + ** + = (Element) the element + \*/ + elproto.toDefs = function () { + var defs = getSomeDefs(this); + defs.appendChild(this.node); + return this; + }; + /*\ + * Element.toPattern + [ method ] + ** + * Creates a `` element from the current element + ** + * To create a pattern you have to specify the pattern rect: + - x (string|number) + - y (string|number) + - width (string|number) + - height (string|number) + = (Element) the `` element + * You can use pattern later on as an argument for `fill` attribute: + | var p = paper.path("M10-5-10,15M15,0,0,15M0-5-20,15").attr({ + | fill: "none", + | stroke: "#bada55", + | strokeWidth: 5 + | }).pattern(0, 0, 10, 10), + | c = paper.circle(200, 200, 100); + | c.attr({ + | fill: p + | }); + \*/ + elproto.pattern = elproto.toPattern = function (x, y, width, height) { + var p = make("pattern", getSomeDefs(this)); + if (x == null) { + x = this.getBBox(); + } + if (is(x, "object") && "x" in x) { + y = x.y; + width = x.width; + height = x.height; + x = x.x; + } + $(p.node, { + x: x, + y: y, + width: width, + height: height, + patternUnits: "userSpaceOnUse", + id: p.id, + viewBox: [x, y, width, height].join(" ") + }); + p.node.appendChild(this.node); + return p; + }; +// SIERRA Element.marker(): clarify what a reference point is. E.g., helps you offset the object from its edge such as when centering it over a path. +// SIERRA Element.marker(): I suggest the method should accept default reference point values. Perhaps centered with (refX = width/2) and (refY = height/2)? Also, couldn't it assume the element's current _width_ and _height_? And please specify what _x_ and _y_ mean: offsets? If so, from where? Couldn't they also be assigned default values? + /*\ + * Element.marker + [ method ] + ** + * Creates a `` element from the current element + ** + * To create a marker you have to specify the bounding rect and reference point: + - x (number) + - y (number) + - width (number) + - height (number) + - refX (number) + - refY (number) + = (Element) the `` element + * You can specify the marker later as an argument for `marker-start`, `marker-end`, `marker-mid`, and `marker` attributes. The `marker` attribute places the marker at every point along the path, and `marker-mid` places them at every point except the start and end. + \*/ + // TODO add usage for markers + elproto.marker = function (x, y, width, height, refX, refY) { + var p = make("marker", getSomeDefs(this)); + if (x == null) { + x = this.getBBox(); + } + if (is(x, "object") && "x" in x) { + y = x.y; + width = x.width; + height = x.height; + refX = x.refX || x.cx; + refY = x.refY || x.cy; + x = x.x; + } + $(p.node, { + viewBox: [x, y, width, height].join(" "), + markerWidth: width, + markerHeight: height, + orient: "auto", + refX: refX || 0, + refY: refY || 0, + id: p.id + }); + p.node.appendChild(this.node); + return p; + }; + // animation + function slice(from, to, f) { + return function (arr) { + var res = arr.slice(from, to); + if (res.length == 1) { + res = res[0]; + } + return f ? f(res) : res; + }; + } + var Animation = function (attr, ms, easing, callback) { + if (typeof easing == "function" && !easing.length) { + callback = easing; + easing = mina.linear; + } + this.attr = attr; + this.dur = ms; + easing && (this.easing = easing); + callback && (this.callback = callback); + }; + Snap._.Animation = Animation; + /*\ + * Snap.animation + [ method ] + ** + * Creates an animation object + ** + - attr (object) attributes of final destination + - duration (number) duration of the animation, in milliseconds + - easing (function) #optional one of easing functions of @mina or custom one + - callback (function) #optional callback function that fires when animation ends + = (object) animation object + \*/ + Snap.animation = function (attr, ms, easing, callback) { + return new Animation(attr, ms, easing, callback); + }; + /*\ + * Element.inAnim + [ method ] + ** + * Returns a set of animations that may be able to manipulate the current element + ** + = (object) in format: + o { + o anim (object) animation object, + o mina (object) @mina object, + o curStatus (number) 0..1 — status of the animation: 0 — just started, 1 — just finished, + o status (function) gets or sets the status of the animation, + o stop (function) stops the animation + o } + \*/ + elproto.inAnim = function () { + var el = this, + res = []; + for (var id in el.anims) if (el.anims[has](id)) { + (function (a) { + res.push({ + anim: new Animation(a._attrs, a.dur, a.easing, a._callback), + mina: a, + curStatus: a.status(), + status: function (val) { + return a.status(val); + }, + stop: function () { + a.stop(); + } + }); + }(el.anims[id])); + } + return res; + }; + /*\ + * Snap.animate + [ method ] + ** + * Runs generic animation of one number into another with a caring function + ** + - from (number|array) number or array of numbers + - to (number|array) number or array of numbers + - setter (function) caring function that accepts one number argument + - duration (number) duration, in milliseconds + - easing (function) #optional easing function from @mina or custom + - callback (function) #optional callback function to execute when animation ends + = (object) animation object in @mina format + o { + o id (string) animation id, consider it read-only, + o duration (function) gets or sets the duration of the animation, + o easing (function) easing, + o speed (function) gets or sets the speed of the animation, + o status (function) gets or sets the status of the animation, + o stop (function) stops the animation + o } + | var rect = Snap().rect(0, 0, 10, 10); + | Snap.animate(0, 10, function (val) { + | rect.attr({ + | x: val + | }); + | }, 1000); + | // in given context is equivalent to + | rect.animate({x: 10}, 1000); + \*/ + Snap.animate = function (from, to, setter, ms, easing, callback) { + if (typeof easing == "function" && !easing.length) { + callback = easing; + easing = mina.linear; + } + var now = mina.time(), + anim = mina(from, to, now, now + ms, mina.time, setter, easing); + callback && eve.once("mina.finish." + anim.id, callback); + return anim; + }; + /*\ + * Element.stop + [ method ] + ** + * Stops all the animations for the current element + ** + = (Element) the current element + \*/ + elproto.stop = function () { + var anims = this.inAnim(); + for (var i = 0, ii = anims.length; i < ii; i++) { + anims[i].stop(); + } + return this; + }; + /*\ + * Element.animate + [ method ] + ** + * Animates the given attributes of the element + ** + - attrs (object) key-value pairs of destination attributes + - duration (number) duration of the animation in milliseconds + - easing (function) #optional easing function from @mina or custom + - callback (function) #optional callback function that executes when the animation ends + = (Element) the current element + \*/ + elproto.animate = function (attrs, ms, easing, callback) { + if (typeof easing == "function" && !easing.length) { + callback = easing; + easing = mina.linear; + } + if (attrs instanceof Animation) { + callback = attrs.callback; + easing = attrs.easing; + ms = attrs.dur; + attrs = attrs.attr; + } + var fkeys = [], tkeys = [], keys = {}, from, to, f, eq, + el = this; + for (var key in attrs) if (attrs[has](key)) { + if (el.equal) { + eq = el.equal(key, Str(attrs[key])); + from = eq.from; + to = eq.to; + f = eq.f; + } else { + from = +el.attr(key); + to = +attrs[key]; + } + var len = is(from, "array") ? from.length : 1; + keys[key] = slice(fkeys.length, fkeys.length + len, f); + fkeys = fkeys.concat(from); + tkeys = tkeys.concat(to); + } + var now = mina.time(), + anim = mina(fkeys, tkeys, now, now + ms, mina.time, function (val) { + var attr = {}; + for (var key in keys) if (keys[has](key)) { + attr[key] = keys[key](val); + } + el.attr(attr); + }, easing); + el.anims[anim.id] = anim; + anim._attrs = attrs; + anim._callback = callback; + eve("snap.animcreated." + el.id, anim); + eve.once("mina.finish." + anim.id, function () { + delete el.anims[anim.id]; + callback && callback.call(el); + }); + eve.once("mina.stop." + anim.id, function () { + delete el.anims[anim.id]; + }); + return el; + }; + var eldata = {}; + /*\ + * Element.data + [ method ] + ** + * Adds or retrieves given value associated with given key. (Don’t confuse + * with `data-` attributes) + * + * See also @Element.removeData + - key (string) key to store data + - value (any) #optional value to store + = (object) @Element + * or, if value is not specified: + = (any) value + > Usage + | for (var i = 0, i < 5, i++) { + | paper.circle(10 + 15 * i, 10, 10) + | .attr({fill: "#000"}) + | .data("i", i) + | .click(function () { + | alert(this.data("i")); + | }); + | } + \*/ + elproto.data = function (key, value) { + var data = eldata[this.id] = eldata[this.id] || {}; + if (arguments.length == 0){ + eve("snap.data.get." + this.id, this, data, null); + return data; + } + if (arguments.length == 1) { + if (Snap.is(key, "object")) { + for (var i in key) if (key[has](i)) { + this.data(i, key[i]); + } + return this; + } + eve("snap.data.get." + this.id, this, data[key], key); + return data[key]; + } + data[key] = value; + eve("snap.data.set." + this.id, this, value, key); + return this; + }; + /*\ + * Element.removeData + [ method ] + ** + * Removes value associated with an element by given key. + * If key is not provided, removes all the data of the element. + - key (string) #optional key + = (object) @Element + \*/ + elproto.removeData = function (key) { + if (key == null) { + eldata[this.id] = {}; + } else { + eldata[this.id] && delete eldata[this.id][key]; + } + return this; + }; + /*\ + * Element.outerSVG + [ method ] + ** + * Returns SVG code for the element, equivalent to HTML's `outerHTML`. + * + * See also @Element.innerSVG + = (string) SVG code for the element + \*/ + /*\ + * Element.toString + [ method ] + ** + * See @Element.outerSVG + \*/ + elproto.outerSVG = elproto.toString = toString(1); + /*\ + * Element.innerSVG + [ method ] + ** + * Returns SVG code for the element's contents, equivalent to HTML's `innerHTML` + = (string) SVG code for the element + \*/ + elproto.innerSVG = toString(); + function toString(type) { + return function () { + var res = type ? "<" + this.type : "", + attr = this.node.attributes, + chld = this.node.childNodes; + if (type) { + for (var i = 0, ii = attr.length; i < ii; i++) { + res += " " + attr[i].name + '="' + + attr[i].value.replace(/"/g, '\\"') + '"'; + } + } + if (chld.length) { + type && (res += ">"); + for (i = 0, ii = chld.length; i < ii; i++) { + if (chld[i].nodeType == 3) { + res += chld[i].nodeValue; + } else if (chld[i].nodeType == 1) { + res += wrap(chld[i]).toString(); + } + } + type && (res += ""); + } else { + type && (res += "/>"); + } + return res; + }; + } + elproto.toDataURL = function () { + if (window && window.btoa) { + var bb = this.getBBox(), + svg = Snap.format('{contents}', { + x: +bb.x.toFixed(3), + y: +bb.y.toFixed(3), + width: +bb.width.toFixed(3), + height: +bb.height.toFixed(3), + contents: this.outerSVG() + }); + return "data:image/svg+xml;base64," + btoa(unescape(encodeURIComponent(svg))); + } + }; + /*\ + * Fragment.select + [ method ] + ** + * See @Element.select + \*/ + Fragment.prototype.select = elproto.select; + /*\ + * Fragment.selectAll + [ method ] + ** + * See @Element.selectAll + \*/ + Fragment.prototype.selectAll = elproto.selectAll; +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var objectToString = Object.prototype.toString, + Str = String, + math = Math, + E = ""; + function Matrix(a, b, c, d, e, f) { + if (b == null && objectToString.call(a) == "[object SVGMatrix]") { + this.a = a.a; + this.b = a.b; + this.c = a.c; + this.d = a.d; + this.e = a.e; + this.f = a.f; + return; + } + if (a != null) { + this.a = +a; + this.b = +b; + this.c = +c; + this.d = +d; + this.e = +e; + this.f = +f; + } else { + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.e = 0; + this.f = 0; + } + } + (function (matrixproto) { + /*\ + * Matrix.add + [ method ] + ** + * Adds the given matrix to existing one + - a (number) + - b (number) + - c (number) + - d (number) + - e (number) + - f (number) + * or + - matrix (object) @Matrix + \*/ + matrixproto.add = function (a, b, c, d, e, f) { + var out = [[], [], []], + m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]], + matrix = [[a, c, e], [b, d, f], [0, 0, 1]], + x, y, z, res; + + if (a && a instanceof Matrix) { + matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]]; + } + + for (x = 0; x < 3; x++) { + for (y = 0; y < 3; y++) { + res = 0; + for (z = 0; z < 3; z++) { + res += m[x][z] * matrix[z][y]; + } + out[x][y] = res; + } + } + this.a = out[0][0]; + this.b = out[1][0]; + this.c = out[0][1]; + this.d = out[1][1]; + this.e = out[0][2]; + this.f = out[1][2]; + return this; + }; + /*\ + * Matrix.invert + [ method ] + ** + * Returns an inverted version of the matrix + = (object) @Matrix + \*/ + matrixproto.invert = function () { + var me = this, + x = me.a * me.d - me.b * me.c; + return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x); + }; + /*\ + * Matrix.clone + [ method ] + ** + * Returns a copy of the matrix + = (object) @Matrix + \*/ + matrixproto.clone = function () { + return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f); + }; + /*\ + * Matrix.translate + [ method ] + ** + * Translate the matrix + - x (number) horizontal offset distance + - y (number) vertical offset distance + \*/ + matrixproto.translate = function (x, y) { + return this.add(1, 0, 0, 1, x, y); + }; + /*\ + * Matrix.scale + [ method ] + ** + * Scales the matrix + - x (number) amount to be scaled, with `1` resulting in no change + - y (number) #optional amount to scale along the vertical axis. (Otherwise `x` applies to both axes.) + - cx (number) #optional horizontal origin point from which to scale + - cy (number) #optional vertical origin point from which to scale + * Default cx, cy is the middle point of the element. + \*/ + matrixproto.scale = function (x, y, cx, cy) { + y == null && (y = x); + (cx || cy) && this.add(1, 0, 0, 1, cx, cy); + this.add(x, 0, 0, y, 0, 0); + (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy); + return this; + }; + /*\ + * Matrix.rotate + [ method ] + ** + * Rotates the matrix + - a (number) angle of rotation, in degrees + - x (number) horizontal origin point from which to rotate + - y (number) vertical origin point from which to rotate + \*/ + matrixproto.rotate = function (a, x, y) { + a = Snap.rad(a); + x = x || 0; + y = y || 0; + var cos = +math.cos(a).toFixed(9), + sin = +math.sin(a).toFixed(9); + this.add(cos, sin, -sin, cos, x, y); + return this.add(1, 0, 0, 1, -x, -y); + }; + /*\ + * Matrix.x + [ method ] + ** + * Returns x coordinate for given point after transformation described by the matrix. See also @Matrix.y + - x (number) + - y (number) + = (number) x + \*/ + matrixproto.x = function (x, y) { + return x * this.a + y * this.c + this.e; + }; + /*\ + * Matrix.y + [ method ] + ** + * Returns y coordinate for given point after transformation described by the matrix. See also @Matrix.x + - x (number) + - y (number) + = (number) y + \*/ + matrixproto.y = function (x, y) { + return x * this.b + y * this.d + this.f; + }; + matrixproto.get = function (i) { + return +this[Str.fromCharCode(97 + i)].toFixed(4); + }; + matrixproto.toString = function () { + return "matrix(" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + ")"; + }; + matrixproto.offset = function () { + return [this.e.toFixed(4), this.f.toFixed(4)]; + }; + function norm(a) { + return a[0] * a[0] + a[1] * a[1]; + } + function normalize(a) { + var mag = math.sqrt(norm(a)); + a[0] && (a[0] /= mag); + a[1] && (a[1] /= mag); + } + /*\ + * Matrix.determinant + [ method ] + ** + * Finds determinant of the given matrix. + = (number) determinant + \*/ + matrixproto.determinant = function () { + return this.a * this.d - this.b * this.c; + }; + /*\ + * Matrix.split + [ method ] + ** + * Splits matrix into primitive transformations + = (object) in format: + o dx (number) translation by x + o dy (number) translation by y + o scalex (number) scale by x + o scaley (number) scale by y + o shear (number) shear + o rotate (number) rotation in deg + o isSimple (boolean) could it be represented via simple transformations + \*/ + matrixproto.split = function () { + var out = {}; + // translation + out.dx = this.e; + out.dy = this.f; + + // scale and shear + var row = [[this.a, this.c], [this.b, this.d]]; + out.scalex = math.sqrt(norm(row[0])); + normalize(row[0]); + + out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1]; + row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear]; + + out.scaley = math.sqrt(norm(row[1])); + normalize(row[1]); + out.shear /= out.scaley; + + if (this.determinant() < 0) { + out.scalex = -out.scalex; + } + + // rotation + var sin = -row[0][1], + cos = row[1][1]; + if (cos < 0) { + out.rotate = Snap.deg(math.acos(cos)); + if (sin < 0) { + out.rotate = 360 - out.rotate; + } + } else { + out.rotate = Snap.deg(math.asin(sin)); + } + + out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate); + out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate; + out.noRotation = !+out.shear.toFixed(9) && !out.rotate; + return out; + }; + /*\ + * Matrix.toTransformString + [ method ] + ** + * Returns transform string that represents given matrix + = (string) transform string + \*/ + matrixproto.toTransformString = function (shorter) { + var s = shorter || this.split(); + if (!+s.shear.toFixed(9)) { + s.scalex = +s.scalex.toFixed(4); + s.scaley = +s.scaley.toFixed(4); + s.rotate = +s.rotate.toFixed(4); + return (s.dx || s.dy ? "t" + [+s.dx.toFixed(4), +s.dy.toFixed(4)] : E) + + (s.scalex != 1 || s.scaley != 1 ? "s" + [s.scalex, s.scaley, 0, 0] : E) + + (s.rotate ? "r" + [+s.rotate.toFixed(4), 0, 0] : E); + } else { + return "m" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)]; + } + }; + })(Matrix.prototype); + /*\ + * Snap.Matrix + [ method ] + ** + * Matrix constructor, extend on your own risk. + * To create matrices use @Snap.matrix. + \*/ + Snap.Matrix = Matrix; + /*\ + * Snap.matrix + [ method ] + ** + * Utility method + ** + * Returns a matrix based on the given parameters + - a (number) + - b (number) + - c (number) + - d (number) + - e (number) + - f (number) + * or + - svgMatrix (SVGMatrix) + = (object) @Matrix + \*/ + Snap.matrix = function (a, b, c, d, e, f) { + return new Matrix(a, b, c, d, e, f); + }; +}); +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var has = "hasOwnProperty", + make = Snap._.make, + wrap = Snap._.wrap, + is = Snap.is, + getSomeDefs = Snap._.getSomeDefs, + reURLValue = /^url\(#?([^)]+)\)$/, + $ = Snap._.$, + URL = Snap.url, + Str = String, + separator = Snap._.separator, + E = ""; + // Attributes event handlers + eve.on("snap.util.attr.mask", function (value) { + if (value instanceof Element || value instanceof Fragment) { + eve.stop(); + if (value instanceof Fragment && value.node.childNodes.length == 1) { + value = value.node.firstChild; + getSomeDefs(this).appendChild(value); + value = wrap(value); + } + if (value.type == "mask") { + var mask = value; + } else { + mask = make("mask", getSomeDefs(this)); + mask.node.appendChild(value.node); + } + !mask.node.id && $(mask.node, { + id: mask.id + }); + $(this.node, { + mask: URL(mask.id) + }); + } + }); + (function (clipIt) { + eve.on("snap.util.attr.clip", clipIt); + eve.on("snap.util.attr.clip-path", clipIt); + eve.on("snap.util.attr.clipPath", clipIt); + }(function (value) { + if (value instanceof Element || value instanceof Fragment) { + eve.stop(); + if (value.type == "clipPath") { + var clip = value; + } else { + clip = make("clipPath", getSomeDefs(this)); + clip.node.appendChild(value.node); + !clip.node.id && $(clip.node, { + id: clip.id + }); + } + $(this.node, { + "clip-path": URL(clip.node.id || clip.id) + }); + } + })); + function fillStroke(name) { + return function (value) { + eve.stop(); + if (value instanceof Fragment && value.node.childNodes.length == 1 && + (value.node.firstChild.tagName == "radialGradient" || + value.node.firstChild.tagName == "linearGradient" || + value.node.firstChild.tagName == "pattern")) { + value = value.node.firstChild; + getSomeDefs(this).appendChild(value); + value = wrap(value); + } + if (value instanceof Element) { + if (value.type == "radialGradient" || value.type == "linearGradient" + || value.type == "pattern") { + if (!value.node.id) { + $(value.node, { + id: value.id + }); + } + var fill = URL(value.node.id); + } else { + fill = value.attr(name); + } + } else { + fill = Snap.color(value); + if (fill.error) { + var grad = Snap(getSomeDefs(this).ownerSVGElement).gradient(value); + if (grad) { + if (!grad.node.id) { + $(grad.node, { + id: grad.id + }); + } + fill = URL(grad.node.id); + } else { + fill = value; + } + } else { + fill = Str(fill); + } + } + var attrs = {}; + attrs[name] = fill; + $(this.node, attrs); + this.node.style[name] = E; + }; + } + eve.on("snap.util.attr.fill", fillStroke("fill")); + eve.on("snap.util.attr.stroke", fillStroke("stroke")); + var gradrg = /^([lr])(?:\(([^)]*)\))?(.*)$/i; + eve.on("snap.util.grad.parse", function parseGrad(string) { + string = Str(string); + var tokens = string.match(gradrg); + if (!tokens) { + return null; + } + var type = tokens[1], + params = tokens[2], + stops = tokens[3]; + params = params.split(/\s*,\s*/).map(function (el) { + return +el == el ? +el : el; + }); + if (params.length == 1 && params[0] == 0) { + params = []; + } + stops = stops.split("-"); + stops = stops.map(function (el) { + el = el.split(":"); + var out = { + color: el[0] + }; + if (el[1]) { + out.offset = parseFloat(el[1]); + } + return out; + }); + return { + type: type, + params: params, + stops: stops + }; + }); + + eve.on("snap.util.attr.d", function (value) { + eve.stop(); + if (is(value, "array") && is(value[0], "array")) { + value = Snap.path.toString.call(value); + } + value = Str(value); + if (value.match(/[ruo]/i)) { + value = Snap.path.toAbsolute(value); + } + $(this.node, {d: value}); + })(-1); + eve.on("snap.util.attr.#text", function (value) { + eve.stop(); + value = Str(value); + var txt = glob.doc.createTextNode(value); + while (this.node.firstChild) { + this.node.removeChild(this.node.firstChild); + } + this.node.appendChild(txt); + })(-1); + eve.on("snap.util.attr.path", function (value) { + eve.stop(); + this.attr({d: value}); + })(-1); + eve.on("snap.util.attr.class", function (value) { + eve.stop(); + this.node.className.baseVal = value; + })(-1); + eve.on("snap.util.attr.viewBox", function (value) { + var vb; + if (is(value, "object") && "x" in value) { + vb = [value.x, value.y, value.width, value.height].join(" "); + } else if (is(value, "array")) { + vb = value.join(" "); + } else { + vb = value; + } + $(this.node, { + viewBox: vb + }); + eve.stop(); + })(-1); + eve.on("snap.util.attr.transform", function (value) { + this.transform(value); + eve.stop(); + })(-1); + eve.on("snap.util.attr.r", function (value) { + if (this.type == "rect") { + eve.stop(); + $(this.node, { + rx: value, + ry: value + }); + } + })(-1); + eve.on("snap.util.attr.textpath", function (value) { + eve.stop(); + if (this.type == "text") { + var id, tp, node; + if (!value && this.textPath) { + tp = this.textPath; + while (tp.node.firstChild) { + this.node.appendChild(tp.node.firstChild); + } + tp.remove(); + delete this.textPath; + return; + } + if (is(value, "string")) { + var defs = getSomeDefs(this), + path = wrap(defs.parentNode).path(value); + defs.appendChild(path.node); + id = path.id; + path.attr({id: id}); + } else { + value = wrap(value); + if (value instanceof Element) { + id = value.attr("id"); + if (!id) { + id = value.id; + value.attr({id: id}); + } + } + } + if (id) { + tp = this.textPath; + node = this.node; + if (tp) { + tp.attr({"xlink:href": "#" + id}); + } else { + tp = $("textPath", { + "xlink:href": "#" + id + }); + while (node.firstChild) { + tp.appendChild(node.firstChild); + } + node.appendChild(tp); + this.textPath = wrap(tp); + } + } + } + })(-1); + eve.on("snap.util.attr.text", function (value) { + if (this.type == "text") { + var i = 0, + node = this.node, + tuner = function (chunk) { + var out = $("tspan"); + if (is(chunk, "array")) { + for (var i = 0; i < chunk.length; i++) { + out.appendChild(tuner(chunk[i])); + } + } else { + out.appendChild(glob.doc.createTextNode(chunk)); + } + out.normalize && out.normalize(); + return out; + }; + while (node.firstChild) { + node.removeChild(node.firstChild); + } + var tuned = tuner(value); + while (tuned.firstChild) { + node.appendChild(tuned.firstChild); + } + } + eve.stop(); + })(-1); + function setFontSize(value) { + eve.stop(); + if (value == +value) { + value += "px"; + } + this.node.style.fontSize = value; + } + eve.on("snap.util.attr.fontSize", setFontSize)(-1); + eve.on("snap.util.attr.font-size", setFontSize)(-1); + + + eve.on("snap.util.getattr.transform", function () { + eve.stop(); + return this.transform(); + })(-1); + eve.on("snap.util.getattr.textpath", function () { + eve.stop(); + return this.textPath; + })(-1); + // Markers + (function () { + function getter(end) { + return function () { + eve.stop(); + var style = glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue("marker-" + end); + if (style == "none") { + return style; + } else { + return Snap(glob.doc.getElementById(style.match(reURLValue)[1])); + } + }; + } + function setter(end) { + return function (value) { + eve.stop(); + var name = "marker" + end.charAt(0).toUpperCase() + end.substring(1); + if (value == "" || !value) { + this.node.style[name] = "none"; + return; + } + if (value.type == "marker") { + var id = value.node.id; + if (!id) { + $(value.node, {id: value.id}); + } + this.node.style[name] = URL(id); + return; + } + }; + } + eve.on("snap.util.getattr.marker-end", getter("end"))(-1); + eve.on("snap.util.getattr.markerEnd", getter("end"))(-1); + eve.on("snap.util.getattr.marker-start", getter("start"))(-1); + eve.on("snap.util.getattr.markerStart", getter("start"))(-1); + eve.on("snap.util.getattr.marker-mid", getter("mid"))(-1); + eve.on("snap.util.getattr.markerMid", getter("mid"))(-1); + eve.on("snap.util.attr.marker-end", setter("end"))(-1); + eve.on("snap.util.attr.markerEnd", setter("end"))(-1); + eve.on("snap.util.attr.marker-start", setter("start"))(-1); + eve.on("snap.util.attr.markerStart", setter("start"))(-1); + eve.on("snap.util.attr.marker-mid", setter("mid"))(-1); + eve.on("snap.util.attr.markerMid", setter("mid"))(-1); + }()); + eve.on("snap.util.getattr.r", function () { + if (this.type == "rect" && $(this.node, "rx") == $(this.node, "ry")) { + eve.stop(); + return $(this.node, "rx"); + } + })(-1); + function textExtract(node) { + var out = []; + var children = node.childNodes; + for (var i = 0, ii = children.length; i < ii; i++) { + var chi = children[i]; + if (chi.nodeType == 3) { + out.push(chi.nodeValue); + } + if (chi.tagName == "tspan") { + if (chi.childNodes.length == 1 && chi.firstChild.nodeType == 3) { + out.push(chi.firstChild.nodeValue); + } else { + out.push(textExtract(chi)); + } + } + } + return out; + } + eve.on("snap.util.getattr.text", function () { + if (this.type == "text" || this.type == "tspan") { + eve.stop(); + var out = textExtract(this.node); + return out.length == 1 ? out[0] : out; + } + })(-1); + eve.on("snap.util.getattr.#text", function () { + return this.node.textContent; + })(-1); + eve.on("snap.util.getattr.viewBox", function () { + eve.stop(); + var vb = $(this.node, "viewBox"); + if (vb) { + vb = vb.split(separator); + return Snap._.box(+vb[0], +vb[1], +vb[2], +vb[3]); + } else { + return; + } + })(-1); + eve.on("snap.util.getattr.points", function () { + var p = $(this.node, "points"); + eve.stop(); + if (p) { + return p.split(separator); + } else { + return; + } + })(-1); + eve.on("snap.util.getattr.path", function () { + var p = $(this.node, "d"); + eve.stop(); + return p; + })(-1); + eve.on("snap.util.getattr.class", function () { + return this.node.className.baseVal; + })(-1); + function getFontSize() { + eve.stop(); + return this.node.style.fontSize; + } + eve.on("snap.util.getattr.fontSize", getFontSize)(-1); + eve.on("snap.util.getattr.font-size", getFontSize)(-1); +}); + +// Copyright (c) 2014 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var rgNotSpace = /\S+/g, + rgBadSpace = /[\t\r\n\f]/g, + rgTrim = /(^\s+|\s+$)/g, + Str = String, + elproto = Element.prototype; + /*\ + * Element.addClass + [ method ] + ** + * Adds given class name or list of class names to the element. + - value (string) class name or space separated list of class names + ** + = (Element) original element. + \*/ + elproto.addClass = function (value) { + var classes = Str(value || "").match(rgNotSpace) || [], + elem = this.node, + className = elem.className.baseVal, + curClasses = className.match(rgNotSpace) || [], + j, + pos, + clazz, + finalValue; + + if (classes.length) { + j = 0; + while ((clazz = classes[j++])) { + pos = curClasses.indexOf(clazz); + if (!~pos) { + curClasses.push(clazz); + } + } + + finalValue = curClasses.join(" "); + if (className != finalValue) { + elem.className.baseVal = finalValue; + } + } + return this; + }; + /*\ + * Element.removeClass + [ method ] + ** + * Removes given class name or list of class names from the element. + - value (string) class name or space separated list of class names + ** + = (Element) original element. + \*/ + elproto.removeClass = function (value) { + var classes = Str(value || "").match(rgNotSpace) || [], + elem = this.node, + className = elem.className.baseVal, + curClasses = className.match(rgNotSpace) || [], + j, + pos, + clazz, + finalValue; + if (curClasses.length) { + j = 0; + while ((clazz = classes[j++])) { + pos = curClasses.indexOf(clazz); + if (~pos) { + curClasses.splice(pos, 1); + } + } + + finalValue = curClasses.join(" "); + if (className != finalValue) { + elem.className.baseVal = finalValue; + } + } + return this; + }; + /*\ + * Element.hasClass + [ method ] + ** + * Checks if the element has a given class name in the list of class names applied to it. + - value (string) class name + ** + = (boolean) `true` if the element has given class + \*/ + elproto.hasClass = function (value) { + var elem = this.node, + className = elem.className.baseVal, + curClasses = className.match(rgNotSpace) || []; + return !!~curClasses.indexOf(value); + }; + /*\ + * Element.toggleClass + [ method ] + ** + * Add or remove one or more classes from the element, depending on either + * the class’s presence or the value of the `flag` argument. + - value (string) class name or space separated list of class names + - flag (boolean) value to determine whether the class should be added or removed + ** + = (Element) original element. + \*/ + elproto.toggleClass = function (value, flag) { + if (flag != null) { + if (flag) { + return this.addClass(value); + } else { + return this.removeClass(value); + } + } + var classes = (value || "").match(rgNotSpace) || [], + elem = this.node, + className = elem.className.baseVal, + curClasses = className.match(rgNotSpace) || [], + j, + pos, + clazz, + finalValue; + j = 0; + while ((clazz = classes[j++])) { + pos = curClasses.indexOf(clazz); + if (~pos) { + curClasses.splice(pos, 1); + } else { + curClasses.push(clazz); + } + } + + finalValue = curClasses.join(" "); + if (className != finalValue) { + elem.className.baseVal = finalValue; + } + return this; + }; +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var operators = { + "+": function (x, y) { + return x + y; + }, + "-": function (x, y) { + return x - y; + }, + "/": function (x, y) { + return x / y; + }, + "*": function (x, y) { + return x * y; + } + }, + Str = String, + reUnit = /[a-z]+$/i, + reAddon = /^\s*([+\-\/*])\s*=\s*([\d.eE+\-]+)\s*([^\d\s]+)?\s*$/; + function getNumber(val) { + return val; + } + function getUnit(unit) { + return function (val) { + return +val.toFixed(3) + unit; + }; + } + eve.on("snap.util.attr", function (val) { + var plus = Str(val).match(reAddon); + if (plus) { + var evnt = eve.nt(), + name = evnt.substring(evnt.lastIndexOf(".") + 1), + a = this.attr(name), + atr = {}; + eve.stop(); + var unit = plus[3] || "", + aUnit = a.match(reUnit), + op = operators[plus[1]]; + if (aUnit && aUnit == unit) { + val = op(parseFloat(a), +plus[2]); + } else { + a = this.asPX(name); + val = op(this.asPX(name), this.asPX(name, plus[2] + unit)); + } + if (isNaN(a) || isNaN(val)) { + return; + } + atr[name] = val; + this.attr(atr); + } + })(-10); + eve.on("snap.util.equal", function (name, b) { + var A, B, a = Str(this.attr(name) || ""), + el = this, + bplus = Str(b).match(reAddon); + if (bplus) { + eve.stop(); + var unit = bplus[3] || "", + aUnit = a.match(reUnit), + op = operators[bplus[1]]; + if (aUnit && aUnit == unit) { + return { + from: parseFloat(a), + to: op(parseFloat(a), +bplus[2]), + f: getUnit(aUnit) + }; + } else { + a = this.asPX(name); + return { + from: a, + to: op(a, this.asPX(name, bplus[2] + unit)), + f: getNumber + }; + } + } + })(-10); +}); +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var proto = Paper.prototype, + is = Snap.is; + /*\ + * Paper.rect + [ method ] + * + * Draws a rectangle + ** + - x (number) x coordinate of the top left corner + - y (number) y coordinate of the top left corner + - width (number) width + - height (number) height + - rx (number) #optional horizontal radius for rounded corners, default is 0 + - ry (number) #optional vertical radius for rounded corners, default is rx or 0 + = (object) the `rect` element + ** + > Usage + | // regular rectangle + | var c = paper.rect(10, 10, 50, 50); + | // rectangle with rounded corners + | var c = paper.rect(40, 40, 50, 50, 10); + \*/ + proto.rect = function (x, y, w, h, rx, ry) { + var attr; + if (ry == null) { + ry = rx; + } + if (is(x, "object") && x == "[object Object]") { + attr = x; + } else if (x != null) { + attr = { + x: x, + y: y, + width: w, + height: h + }; + if (rx != null) { + attr.rx = rx; + attr.ry = ry; + } + } + return this.el("rect", attr); + }; + /*\ + * Paper.circle + [ method ] + ** + * Draws a circle + ** + - x (number) x coordinate of the centre + - y (number) y coordinate of the centre + - r (number) radius + = (object) the `circle` element + ** + > Usage + | var c = paper.circle(50, 50, 40); + \*/ + proto.circle = function (cx, cy, r) { + var attr; + if (is(cx, "object") && cx == "[object Object]") { + attr = cx; + } else if (cx != null) { + attr = { + cx: cx, + cy: cy, + r: r + }; + } + return this.el("circle", attr); + }; + + var preload = (function () { + function onerror() { + this.parentNode.removeChild(this); + } + return function (src, f) { + var img = glob.doc.createElement("img"), + body = glob.doc.body; + img.style.cssText = "position:absolute;left:-9999em;top:-9999em"; + img.onload = function () { + f.call(img); + img.onload = img.onerror = null; + body.removeChild(img); + }; + img.onerror = onerror; + body.appendChild(img); + img.src = src; + }; + }()); + + /*\ + * Paper.image + [ method ] + ** + * Places an image on the surface + ** + - src (string) URI of the source image + - x (number) x offset position + - y (number) y offset position + - width (number) width of the image + - height (number) height of the image + = (object) the `image` element + * or + = (object) Snap element object with type `image` + ** + > Usage + | var c = paper.image("apple.png", 10, 10, 80, 80); + \*/ + proto.image = function (src, x, y, width, height) { + var el = this.el("image"); + if (is(src, "object") && "src" in src) { + el.attr(src); + } else if (src != null) { + var set = { + "xlink:href": src, + preserveAspectRatio: "none" + }; + if (x != null && y != null) { + set.x = x; + set.y = y; + } + if (width != null && height != null) { + set.width = width; + set.height = height; + } else { + preload(src, function () { + Snap._.$(el.node, { + width: this.offsetWidth, + height: this.offsetHeight + }); + }); + } + Snap._.$(el.node, set); + } + return el; + }; + /*\ + * Paper.ellipse + [ method ] + ** + * Draws an ellipse + ** + - x (number) x coordinate of the centre + - y (number) y coordinate of the centre + - rx (number) horizontal radius + - ry (number) vertical radius + = (object) the `ellipse` element + ** + > Usage + | var c = paper.ellipse(50, 50, 40, 20); + \*/ + proto.ellipse = function (cx, cy, rx, ry) { + var attr; + if (is(cx, "object") && cx == "[object Object]") { + attr = cx; + } else if (cx != null) { + attr ={ + cx: cx, + cy: cy, + rx: rx, + ry: ry + }; + } + return this.el("ellipse", attr); + }; + // SIERRA Paper.path(): Unclear from the link what a Catmull-Rom curveto is, and why it would make life any easier. + /*\ + * Paper.path + [ method ] + ** + * Creates a `` element using the given string as the path's definition + - pathString (string) #optional path string in SVG format + * Path string consists of one-letter commands, followed by comma seprarated arguments in numerical form. Example: + | "M10,20L30,40" + * This example features two commands: `M`, with arguments `(10, 20)` and `L` with arguments `(30, 40)`. Uppercase letter commands express coordinates in absolute terms, while lowercase commands express them in relative terms from the most recently declared coordinates. + * + #

    Here is short list of commands available, for more details see SVG path string format or article about path strings at MDN.

    + # + # + # + # + # + # + # + # + # + # + # + #
    CommandNameParameters
    Mmoveto(x y)+
    Zclosepath(none)
    Llineto(x y)+
    Hhorizontal linetox+
    Vvertical linetoy+
    Ccurveto(x1 y1 x2 y2 x y)+
    Ssmooth curveto(x2 y2 x y)+
    Qquadratic Bézier curveto(x1 y1 x y)+
    Tsmooth quadratic Bézier curveto(x y)+
    Aelliptical arc(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
    RCatmull-Rom curveto*x1 y1 (x y)+
    + * * _Catmull-Rom curveto_ is a not standard SVG command and added to make life easier. + * Note: there is a special case when a path consists of only three commands: `M10,10R…z`. In this case the path connects back to its starting point. + > Usage + | var c = paper.path("M10 10L90 90"); + | // draw a diagonal line: + | // move to 10,10, line to 90,90 + \*/ + proto.path = function (d) { + var attr; + if (is(d, "object") && !is(d, "array")) { + attr = d; + } else if (d) { + attr = {d: d}; + } + return this.el("path", attr); + }; + /*\ + * Paper.g + [ method ] + ** + * Creates a group element + ** + - varargs (…) #optional elements to nest within the group + = (object) the `g` element + ** + > Usage + | var c1 = paper.circle(), + | c2 = paper.rect(), + | g = paper.g(c2, c1); // note that the order of elements is different + * or + | var c1 = paper.circle(), + | c2 = paper.rect(), + | g = paper.g(); + | g.add(c2, c1); + \*/ + /*\ + * Paper.group + [ method ] + ** + * See @Paper.g + \*/ + proto.group = proto.g = function (first) { + var attr, + el = this.el("g"); + if (arguments.length == 1 && first && !first.type) { + el.attr(first); + } else if (arguments.length) { + el.add(Array.prototype.slice.call(arguments, 0)); + } + return el; + }; + /*\ + * Paper.svg + [ method ] + ** + * Creates a nested SVG element. + - x (number) @optional X of the element + - y (number) @optional Y of the element + - width (number) @optional width of the element + - height (number) @optional height of the element + - vbx (number) @optional viewbox X + - vby (number) @optional viewbox Y + - vbw (number) @optional viewbox width + - vbh (number) @optional viewbox height + ** + = (object) the `svg` element + ** + \*/ + proto.svg = function (x, y, width, height, vbx, vby, vbw, vbh) { + var attrs = {}; + if (is(x, "object") && y == null) { + attrs = x; + } else { + if (x != null) { + attrs.x = x; + } + if (y != null) { + attrs.y = y; + } + if (width != null) { + attrs.width = width; + } + if (height != null) { + attrs.height = height; + } + if (vbx != null && vby != null && vbw != null && vbh != null) { + attrs.viewBox = [vbx, vby, vbw, vbh]; + } + } + return this.el("svg", attrs); + }; + /*\ + * Paper.mask + [ method ] + ** + * Equivalent in behaviour to @Paper.g, except it’s a mask. + ** + = (object) the `mask` element + ** + \*/ + proto.mask = function (first) { + var attr, + el = this.el("mask"); + if (arguments.length == 1 && first && !first.type) { + el.attr(first); + } else if (arguments.length) { + el.add(Array.prototype.slice.call(arguments, 0)); + } + return el; + }; + /*\ + * Paper.ptrn + [ method ] + ** + * Equivalent in behaviour to @Paper.g, except it’s a pattern. + - x (number) @optional X of the element + - y (number) @optional Y of the element + - width (number) @optional width of the element + - height (number) @optional height of the element + - vbx (number) @optional viewbox X + - vby (number) @optional viewbox Y + - vbw (number) @optional viewbox width + - vbh (number) @optional viewbox height + ** + = (object) the `pattern` element + ** + \*/ + proto.ptrn = function (x, y, width, height, vx, vy, vw, vh) { + if (is(x, "object")) { + var attr = x; + } else { + attr = {patternUnits: "userSpaceOnUse"}; + if (x) { + attr.x = x; + } + if (y) { + attr.y = y; + } + if (width != null) { + attr.width = width; + } + if (height != null) { + attr.height = height; + } + if (vx != null && vy != null && vw != null && vh != null) { + attr.viewBox = [vx, vy, vw, vh]; + } else { + attr.viewBox = [x || 0, y || 0, width || 0, height || 0]; + } + } + return this.el("pattern", attr); + }; + /*\ + * Paper.use + [ method ] + ** + * Creates a element. + - id (string) @optional id of element to link + * or + - id (Element) @optional element to link + ** + = (object) the `use` element + ** + \*/ + proto.use = function (id) { + if (id != null) { + if (id instanceof Element) { + if (!id.attr("id")) { + id.attr({id: Snap._.id(id)}); + } + id = id.attr("id"); + } + if (String(id).charAt() == "#") { + id = id.substring(1); + } + return this.el("use", {"xlink:href": "#" + id}); + } else { + return Element.prototype.use.call(this); + } + }; + /*\ + * Paper.symbol + [ method ] + ** + * Creates a element. + - vbx (number) @optional viewbox X + - vby (number) @optional viewbox Y + - vbw (number) @optional viewbox width + - vbh (number) @optional viewbox height + = (object) the `symbol` element + ** + \*/ + proto.symbol = function (vx, vy, vw, vh) { + var attr = {}; + if (vx != null && vy != null && vw != null && vh != null) { + attr.viewBox = [vx, vy, vw, vh]; + } + + return this.el("symbol", attr); + }; + /*\ + * Paper.text + [ method ] + ** + * Draws a text string + ** + - x (number) x coordinate position + - y (number) y coordinate position + - text (string|array) The text string to draw or array of strings to nest within separate `` elements + = (object) the `text` element + ** + > Usage + | var t1 = paper.text(50, 50, "Snap"); + | var t2 = paper.text(50, 50, ["S","n","a","p"]); + | // Text path usage + | t1.attr({textpath: "M10,10L100,100"}); + | // or + | var pth = paper.path("M10,10L100,100"); + | t1.attr({textpath: pth}); + \*/ + proto.text = function (x, y, text) { + var attr = {}; + if (is(x, "object")) { + attr = x; + } else if (x != null) { + attr = { + x: x, + y: y, + text: text || "" + }; + } + return this.el("text", attr); + }; + /*\ + * Paper.line + [ method ] + ** + * Draws a line + ** + - x1 (number) x coordinate position of the start + - y1 (number) y coordinate position of the start + - x2 (number) x coordinate position of the end + - y2 (number) y coordinate position of the end + = (object) the `line` element + ** + > Usage + | var t1 = paper.line(50, 50, 100, 100); + \*/ + proto.line = function (x1, y1, x2, y2) { + var attr = {}; + if (is(x1, "object")) { + attr = x1; + } else if (x1 != null) { + attr = { + x1: x1, + x2: x2, + y1: y1, + y2: y2 + }; + } + return this.el("line", attr); + }; + /*\ + * Paper.polyline + [ method ] + ** + * Draws a polyline + ** + - points (array) array of points + * or + - varargs (…) points + = (object) the `polyline` element + ** + > Usage + | var p1 = paper.polyline([10, 10, 100, 100]); + | var p2 = paper.polyline(10, 10, 100, 100); + \*/ + proto.polyline = function (points) { + if (arguments.length > 1) { + points = Array.prototype.slice.call(arguments, 0); + } + var attr = {}; + if (is(points, "object") && !is(points, "array")) { + attr = points; + } else if (points != null) { + attr = {points: points}; + } + return this.el("polyline", attr); + }; + /*\ + * Paper.polygon + [ method ] + ** + * Draws a polygon. See @Paper.polyline + \*/ + proto.polygon = function (points) { + if (arguments.length > 1) { + points = Array.prototype.slice.call(arguments, 0); + } + var attr = {}; + if (is(points, "object") && !is(points, "array")) { + attr = points; + } else if (points != null) { + attr = {points: points}; + } + return this.el("polygon", attr); + }; + // gradients + (function () { + var $ = Snap._.$; + // gradients' helpers + function Gstops() { + return this.selectAll("stop"); + } + function GaddStop(color, offset) { + var stop = $("stop"), + attr = { + offset: +offset + "%" + }; + color = Snap.color(color); + attr["stop-color"] = color.hex; + if (color.opacity < 1) { + attr["stop-opacity"] = color.opacity; + } + $(stop, attr); + this.node.appendChild(stop); + return this; + } + function GgetBBox() { + if (this.type == "linearGradient") { + var x1 = $(this.node, "x1") || 0, + x2 = $(this.node, "x2") || 1, + y1 = $(this.node, "y1") || 0, + y2 = $(this.node, "y2") || 0; + return Snap._.box(x1, y1, math.abs(x2 - x1), math.abs(y2 - y1)); + } else { + var cx = this.node.cx || .5, + cy = this.node.cy || .5, + r = this.node.r || 0; + return Snap._.box(cx - r, cy - r, r * 2, r * 2); + } + } + function gradient(defs, str) { + var grad = eve("snap.util.grad.parse", null, str).firstDefined(), + el; + if (!grad) { + return null; + } + grad.params.unshift(defs); + if (grad.type.toLowerCase() == "l") { + el = gradientLinear.apply(0, grad.params); + } else { + el = gradientRadial.apply(0, grad.params); + } + if (grad.type != grad.type.toLowerCase()) { + $(el.node, { + gradientUnits: "userSpaceOnUse" + }); + } + var stops = grad.stops, + len = stops.length, + start = 0, + j = 0; + function seed(i, end) { + var step = (end - start) / (i - j); + for (var k = j; k < i; k++) { + stops[k].offset = +(+start + step * (k - j)).toFixed(2); + } + j = i; + start = end; + } + len--; + for (var i = 0; i < len; i++) if ("offset" in stops[i]) { + seed(i, stops[i].offset); + } + stops[len].offset = stops[len].offset || 100; + seed(len, stops[len].offset); + for (i = 0; i <= len; i++) { + var stop = stops[i]; + el.addStop(stop.color, stop.offset); + } + return el; + } + function gradientLinear(defs, x1, y1, x2, y2) { + var el = Snap._.make("linearGradient", defs); + el.stops = Gstops; + el.addStop = GaddStop; + el.getBBox = GgetBBox; + if (x1 != null) { + $(el.node, { + x1: x1, + y1: y1, + x2: x2, + y2: y2 + }); + } + return el; + } + function gradientRadial(defs, cx, cy, r, fx, fy) { + var el = Snap._.make("radialGradient", defs); + el.stops = Gstops; + el.addStop = GaddStop; + el.getBBox = GgetBBox; + if (cx != null) { + $(el.node, { + cx: cx, + cy: cy, + r: r + }); + } + if (fx != null && fy != null) { + $(el.node, { + fx: fx, + fy: fy + }); + } + return el; + } + /*\ + * Paper.gradient + [ method ] + ** + * Creates a gradient element + ** + - gradient (string) gradient descriptor + > Gradient Descriptor + * The gradient descriptor is an expression formatted as + * follows: `()`. The `` can be + * either linear or radial. The uppercase `L` or `R` letters + * indicate absolute coordinates offset from the SVG surface. + * Lowercase `l` or `r` letters indicate coordinates + * calculated relative to the element to which the gradient is + * applied. Coordinates specify a linear gradient vector as + * `x1`, `y1`, `x2`, `y2`, or a radial gradient as `cx`, `cy`, + * `r` and optional `fx`, `fy` specifying a focal point away + * from the center of the circle. Specify `` as a list + * of dash-separated CSS color values. Each color may be + * followed by a custom offset value, separated with a colon + * character. + > Examples + * Linear gradient, relative from top-left corner to bottom-right + * corner, from black through red to white: + | var g = paper.gradient("l(0, 0, 1, 1)#000-#f00-#fff"); + * Linear gradient, absolute from (0, 0) to (100, 100), from black + * through red at 25% to white: + | var g = paper.gradient("L(0, 0, 100, 100)#000-#f00:25-#fff"); + * Radial gradient, relative from the center of the element with radius + * half the width, from black to white: + | var g = paper.gradient("r(0.5, 0.5, 0.5)#000-#fff"); + * To apply the gradient: + | paper.circle(50, 50, 40).attr({ + | fill: g + | }); + = (object) the `gradient` element + \*/ + proto.gradient = function (str) { + return gradient(this.defs, str); + }; + proto.gradientLinear = function (x1, y1, x2, y2) { + return gradientLinear(this.defs, x1, y1, x2, y2); + }; + proto.gradientRadial = function (cx, cy, r, fx, fy) { + return gradientRadial(this.defs, cx, cy, r, fx, fy); + }; + /*\ + * Paper.toString + [ method ] + ** + * Returns SVG code for the @Paper + = (string) SVG code for the @Paper + \*/ + proto.toString = function () { + var doc = this.node.ownerDocument, + f = doc.createDocumentFragment(), + d = doc.createElement("div"), + svg = this.node.cloneNode(true), + res; + f.appendChild(d); + d.appendChild(svg); + Snap._.$(svg, {xmlns: "http://www.w3.org/2000/svg"}); + res = d.innerHTML; + f.removeChild(f.firstChild); + return res; + }; + /*\ + * Paper.toDataURL + [ method ] + ** + * Returns SVG code for the @Paper as Data URI string. + = (string) Data URI string + \*/ + proto.toDataURL = function () { + if (window && window.btoa) { + return "data:image/svg+xml;base64," + btoa(unescape(encodeURIComponent(this))); + } + }; + /*\ + * Paper.clear + [ method ] + ** + * Removes all child nodes of the paper, except . + \*/ + proto.clear = function () { + var node = this.node.firstChild, + next; + while (node) { + next = node.nextSibling; + if (node.tagName != "defs") { + node.parentNode.removeChild(node); + } else { + proto.clear.call({node: node}); + } + node = next; + } + }; + }()); +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +Snap.plugin(function (Snap, Element, Paper, glob) { + var elproto = Element.prototype, + is = Snap.is, + clone = Snap._.clone, + has = "hasOwnProperty", + p2s = /,?([a-z]),?/gi, + toFloat = parseFloat, + math = Math, + PI = math.PI, + mmin = math.min, + mmax = math.max, + pow = math.pow, + abs = math.abs; + function paths(ps) { + var p = paths.ps = paths.ps || {}; + if (p[ps]) { + p[ps].sleep = 100; + } else { + p[ps] = { + sleep: 100 + }; + } + setTimeout(function () { + for (var key in p) if (p[has](key) && key != ps) { + p[key].sleep--; + !p[key].sleep && delete p[key]; + } + }); + return p[ps]; + } + function box(x, y, width, height) { + if (x == null) { + x = y = width = height = 0; + } + if (y == null) { + y = x.y; + width = x.width; + height = x.height; + x = x.x; + } + return { + x: x, + y: y, + width: width, + w: width, + height: height, + h: height, + x2: x + width, + y2: y + height, + cx: x + width / 2, + cy: y + height / 2, + r1: math.min(width, height) / 2, + r2: math.max(width, height) / 2, + r0: math.sqrt(width * width + height * height) / 2, + path: rectPath(x, y, width, height), + vb: [x, y, width, height].join(" ") + }; + } + function toString() { + return this.join(",").replace(p2s, "$1"); + } + function pathClone(pathArray) { + var res = clone(pathArray); + res.toString = toString; + return res; + } + function getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) { + if (length == null) { + return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y); + } else { + return findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, + getTotLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length)); + } + } + function getLengthFactory(istotal, subpath) { + function O(val) { + return +(+val).toFixed(3); + } + return Snap._.cacher(function (path, length, onlystart) { + if (path instanceof Element) { + path = path.attr("d"); + } + path = path2curve(path); + var x, y, p, l, sp = "", subpaths = {}, point, + len = 0; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = +p[1]; + y = +p[2]; + } else { + l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + if (len + l > length) { + if (subpath && !subpaths.start) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + sp += [ + "C" + O(point.start.x), + O(point.start.y), + O(point.m.x), + O(point.m.y), + O(point.x), + O(point.y) + ]; + if (onlystart) {return sp;} + subpaths.start = sp; + sp = [ + "M" + O(point.x), + O(point.y) + "C" + O(point.n.x), + O(point.n.y), + O(point.end.x), + O(point.end.y), + O(p[5]), + O(p[6]) + ].join(); + len += l; + x = +p[5]; + y = +p[6]; + continue; + } + if (!istotal && !subpath) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + return point; + } + } + len += l; + x = +p[5]; + y = +p[6]; + } + sp += p.shift() + p; + } + subpaths.end = sp; + point = istotal ? len : subpath ? subpaths : findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1); + return point; + }, null, Snap._.clone); + } + var getTotalLength = getLengthFactory(1), + getPointAtLength = getLengthFactory(), + getSubpathsAtLength = getLengthFactory(0, 1); + function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t, + t13 = pow(t1, 3), + t12 = pow(t1, 2), + t2 = t * t, + t3 = t2 * t, + x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x, + y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y, + mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x), + my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y), + nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x), + ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y), + ax = t1 * p1x + t * c1x, + ay = t1 * p1y + t * c1y, + cx = t1 * c2x + t * p2x, + cy = t1 * c2y + t * p2y, + alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI); + // (mx > nx || my < ny) && (alpha += 180); + return { + x: x, + y: y, + m: {x: mx, y: my}, + n: {x: nx, y: ny}, + start: {x: ax, y: ay}, + end: {x: cx, y: cy}, + alpha: alpha + }; + } + function bezierBBox(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { + if (!Snap.is(p1x, "array")) { + p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y]; + } + var bbox = curveDim.apply(null, p1x); + return box( + bbox.min.x, + bbox.min.y, + bbox.max.x - bbox.min.x, + bbox.max.y - bbox.min.y + ); + } + function isPointInsideBBox(bbox, x, y) { + return x >= bbox.x && + x <= bbox.x + bbox.width && + y >= bbox.y && + y <= bbox.y + bbox.height; + } + function isBBoxIntersect(bbox1, bbox2) { + bbox1 = box(bbox1); + bbox2 = box(bbox2); + return isPointInsideBBox(bbox2, bbox1.x, bbox1.y) + || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y) + || isPointInsideBBox(bbox2, bbox1.x, bbox1.y2) + || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2) + || isPointInsideBBox(bbox1, bbox2.x, bbox2.y) + || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y) + || isPointInsideBBox(bbox1, bbox2.x, bbox2.y2) + || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2) + || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x + || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x) + && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y + || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y); + } + function base3(t, p1, p2, p3, p4) { + var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4, + t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3; + return t * t2 - 3 * p1 + 3 * p2; + } + function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) { + if (z == null) { + z = 1; + } + z = z > 1 ? 1 : z < 0 ? 0 : z; + var z2 = z / 2, + n = 12, + Tvalues = [-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816], + Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472], + sum = 0; + for (var i = 0; i < n; i++) { + var ct = z2 * Tvalues[i] + z2, + xbase = base3(ct, x1, x2, x3, x4), + ybase = base3(ct, y1, y2, y3, y4), + comb = xbase * xbase + ybase * ybase; + sum += Cvalues[i] * math.sqrt(comb); + } + return z2 * sum; + } + function getTotLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) { + if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) { + return; + } + var t = 1, + step = t / 2, + t2 = t - step, + l, + e = .01; + l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2); + while (abs(l - ll) > e) { + step /= 2; + t2 += (l < ll ? 1 : -1) * step; + l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2); + } + return t2; + } + function intersect(x1, y1, x2, y2, x3, y3, x4, y4) { + if ( + mmax(x1, x2) < mmin(x3, x4) || + mmin(x1, x2) > mmax(x3, x4) || + mmax(y1, y2) < mmin(y3, y4) || + mmin(y1, y2) > mmax(y3, y4) + ) { + return; + } + var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4), + ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4), + denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); + + if (!denominator) { + return; + } + var px = nx / denominator, + py = ny / denominator, + px2 = +px.toFixed(2), + py2 = +py.toFixed(2); + if ( + px2 < +mmin(x1, x2).toFixed(2) || + px2 > +mmax(x1, x2).toFixed(2) || + px2 < +mmin(x3, x4).toFixed(2) || + px2 > +mmax(x3, x4).toFixed(2) || + py2 < +mmin(y1, y2).toFixed(2) || + py2 > +mmax(y1, y2).toFixed(2) || + py2 < +mmin(y3, y4).toFixed(2) || + py2 > +mmax(y3, y4).toFixed(2) + ) { + return; + } + return {x: px, y: py}; + } + function inter(bez1, bez2) { + return interHelper(bez1, bez2); + } + function interCount(bez1, bez2) { + return interHelper(bez1, bez2, 1); + } + function interHelper(bez1, bez2, justCount) { + var bbox1 = bezierBBox(bez1), + bbox2 = bezierBBox(bez2); + if (!isBBoxIntersect(bbox1, bbox2)) { + return justCount ? 0 : []; + } + var l1 = bezlen.apply(0, bez1), + l2 = bezlen.apply(0, bez2), + n1 = ~~(l1 / 8), + n2 = ~~(l2 / 8), + dots1 = [], + dots2 = [], + xy = {}, + res = justCount ? 0 : []; + for (var i = 0; i < n1 + 1; i++) { + var p = findDotsAtSegment.apply(0, bez1.concat(i / n1)); + dots1.push({x: p.x, y: p.y, t: i / n1}); + } + for (i = 0; i < n2 + 1; i++) { + p = findDotsAtSegment.apply(0, bez2.concat(i / n2)); + dots2.push({x: p.x, y: p.y, t: i / n2}); + } + for (i = 0; i < n1; i++) { + for (var j = 0; j < n2; j++) { + var di = dots1[i], + di1 = dots1[i + 1], + dj = dots2[j], + dj1 = dots2[j + 1], + ci = abs(di1.x - di.x) < .001 ? "y" : "x", + cj = abs(dj1.x - dj.x) < .001 ? "y" : "x", + is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y); + if (is) { + if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) { + continue; + } + xy[is.x.toFixed(4)] = is.y.toFixed(4); + var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t), + t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t); + if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) { + if (justCount) { + res++; + } else { + res.push({ + x: is.x, + y: is.y, + t1: t1, + t2: t2 + }); + } + } + } + } + } + return res; + } + function pathIntersection(path1, path2) { + return interPathHelper(path1, path2); + } + function pathIntersectionNumber(path1, path2) { + return interPathHelper(path1, path2, 1); + } + function interPathHelper(path1, path2, justCount) { + path1 = path2curve(path1); + path2 = path2curve(path2); + var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2, + res = justCount ? 0 : []; + for (var i = 0, ii = path1.length; i < ii; i++) { + var pi = path1[i]; + if (pi[0] == "M") { + x1 = x1m = pi[1]; + y1 = y1m = pi[2]; + } else { + if (pi[0] == "C") { + bez1 = [x1, y1].concat(pi.slice(1)); + x1 = bez1[6]; + y1 = bez1[7]; + } else { + bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m]; + x1 = x1m; + y1 = y1m; + } + for (var j = 0, jj = path2.length; j < jj; j++) { + var pj = path2[j]; + if (pj[0] == "M") { + x2 = x2m = pj[1]; + y2 = y2m = pj[2]; + } else { + if (pj[0] == "C") { + bez2 = [x2, y2].concat(pj.slice(1)); + x2 = bez2[6]; + y2 = bez2[7]; + } else { + bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m]; + x2 = x2m; + y2 = y2m; + } + var intr = interHelper(bez1, bez2, justCount); + if (justCount) { + res += intr; + } else { + for (var k = 0, kk = intr.length; k < kk; k++) { + intr[k].segment1 = i; + intr[k].segment2 = j; + intr[k].bez1 = bez1; + intr[k].bez2 = bez2; + } + res = res.concat(intr); + } + } + } + } + } + return res; + } + function isPointInsidePath(path, x, y) { + var bbox = pathBBox(path); + return isPointInsideBBox(bbox, x, y) && + interPathHelper(path, [["M", x, y], ["H", bbox.x2 + 10]], 1) % 2 == 1; + } + function pathBBox(path) { + var pth = paths(path); + if (pth.bbox) { + return clone(pth.bbox); + } + if (!path) { + return box(); + } + path = path2curve(path); + var x = 0, + y = 0, + X = [], + Y = [], + p; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = p[1]; + y = p[2]; + X.push(x); + Y.push(y); + } else { + var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + X = X.concat(dim.min.x, dim.max.x); + Y = Y.concat(dim.min.y, dim.max.y); + x = p[5]; + y = p[6]; + } + } + var xmin = mmin.apply(0, X), + ymin = mmin.apply(0, Y), + xmax = mmax.apply(0, X), + ymax = mmax.apply(0, Y), + bb = box(xmin, ymin, xmax - xmin, ymax - ymin); + pth.bbox = clone(bb); + return bb; + } + function rectPath(x, y, w, h, r) { + if (r) { + return [ + ["M", +x + (+r), y], + ["l", w - r * 2, 0], + ["a", r, r, 0, 0, 1, r, r], + ["l", 0, h - r * 2], + ["a", r, r, 0, 0, 1, -r, r], + ["l", r * 2 - w, 0], + ["a", r, r, 0, 0, 1, -r, -r], + ["l", 0, r * 2 - h], + ["a", r, r, 0, 0, 1, r, -r], + ["z"] + ]; + } + var res = [["M", x, y], ["l", w, 0], ["l", 0, h], ["l", -w, 0], ["z"]]; + res.toString = toString; + return res; + } + function ellipsePath(x, y, rx, ry, a) { + if (a == null && ry == null) { + ry = rx; + } + x = +x; + y = +y; + rx = +rx; + ry = +ry; + if (a != null) { + var rad = Math.PI / 180, + x1 = x + rx * Math.cos(-ry * rad), + x2 = x + rx * Math.cos(-a * rad), + y1 = y + rx * Math.sin(-ry * rad), + y2 = y + rx * Math.sin(-a * rad), + res = [["M", x1, y1], ["A", rx, rx, 0, +(a - ry > 180), 0, x2, y2]]; + } else { + res = [ + ["M", x, y], + ["m", 0, -ry], + ["a", rx, ry, 0, 1, 1, 0, 2 * ry], + ["a", rx, ry, 0, 1, 1, 0, -2 * ry], + ["z"] + ]; + } + res.toString = toString; + return res; + } + var unit2px = Snap._unit2px, + getPath = { + path: function (el) { + return el.attr("path"); + }, + circle: function (el) { + var attr = unit2px(el); + return ellipsePath(attr.cx, attr.cy, attr.r); + }, + ellipse: function (el) { + var attr = unit2px(el); + return ellipsePath(attr.cx || 0, attr.cy || 0, attr.rx, attr.ry); + }, + rect: function (el) { + var attr = unit2px(el); + return rectPath(attr.x || 0, attr.y || 0, attr.width, attr.height, attr.rx, attr.ry); + }, + image: function (el) { + var attr = unit2px(el); + return rectPath(attr.x || 0, attr.y || 0, attr.width, attr.height); + }, + line: function (el) { + return "M" + [el.attr("x1") || 0, el.attr("y1") || 0, el.attr("x2"), el.attr("y2")]; + }, + polyline: function (el) { + return "M" + el.attr("points"); + }, + polygon: function (el) { + return "M" + el.attr("points") + "z"; + }, + deflt: function (el) { + var bbox = el.node.getBBox(); + return rectPath(bbox.x, bbox.y, bbox.width, bbox.height); + } + }; + function pathToRelative(pathArray) { + var pth = paths(pathArray), + lowerCase = String.prototype.toLowerCase; + if (pth.rel) { + return pathClone(pth.rel); + } + if (!Snap.is(pathArray, "array") || !Snap.is(pathArray && pathArray[0], "array")) { + pathArray = Snap.parsePathString(pathArray); + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = pathArray[0][1]; + y = pathArray[0][2]; + mx = x; + my = y; + start++; + res.push(["M", x, y]); + } + for (var i = start, ii = pathArray.length; i < ii; i++) { + var r = res[i] = [], + pa = pathArray[i]; + if (pa[0] != lowerCase.call(pa[0])) { + r[0] = lowerCase.call(pa[0]); + switch (r[0]) { + case "a": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] - x).toFixed(3); + r[7] = +(pa[7] - y).toFixed(3); + break; + case "v": + r[1] = +(pa[1] - y).toFixed(3); + break; + case "m": + mx = pa[1]; + my = pa[2]; + default: + for (var j = 1, jj = pa.length; j < jj; j++) { + r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3); + } + } + } else { + r = res[i] = []; + if (pa[0] == "m") { + mx = pa[1] + x; + my = pa[2] + y; + } + for (var k = 0, kk = pa.length; k < kk; k++) { + res[i][k] = pa[k]; + } + } + var len = res[i].length; + switch (res[i][0]) { + case "z": + x = mx; + y = my; + break; + case "h": + x += +res[i][len - 1]; + break; + case "v": + y += +res[i][len - 1]; + break; + default: + x += +res[i][len - 2]; + y += +res[i][len - 1]; + } + } + res.toString = toString; + pth.rel = pathClone(res); + return res; + } + function pathToAbsolute(pathArray) { + var pth = paths(pathArray); + if (pth.abs) { + return pathClone(pth.abs); + } + if (!is(pathArray, "array") || !is(pathArray && pathArray[0], "array")) { // rough assumption + pathArray = Snap.parsePathString(pathArray); + } + if (!pathArray || !pathArray.length) { + return [["M", 0, 0]]; + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0, + pa0; + if (pathArray[0][0] == "M") { + x = +pathArray[0][1]; + y = +pathArray[0][2]; + mx = x; + my = y; + start++; + res[0] = ["M", x, y]; + } + var crz = pathArray.length == 3 && + pathArray[0][0] == "M" && + pathArray[1][0].toUpperCase() == "R" && + pathArray[2][0].toUpperCase() == "Z"; + for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) { + res.push(r = []); + pa = pathArray[i]; + pa0 = pa[0]; + if (pa0 != pa0.toUpperCase()) { + r[0] = pa0.toUpperCase(); + switch (r[0]) { + case "A": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +pa[6] + x; + r[7] = +pa[7] + y; + break; + case "V": + r[1] = +pa[1] + y; + break; + case "H": + r[1] = +pa[1] + x; + break; + case "R": + var dots = [x, y].concat(pa.slice(1)); + for (var j = 2, jj = dots.length; j < jj; j++) { + dots[j] = +dots[j] + x; + dots[++j] = +dots[j] + y; + } + res.pop(); + res = res.concat(catmullRom2bezier(dots, crz)); + break; + case "O": + res.pop(); + dots = ellipsePath(x, y, pa[1], pa[2]); + dots.push(dots[0]); + res = res.concat(dots); + break; + case "U": + res.pop(); + res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3])); + r = ["U"].concat(res[res.length - 1].slice(-2)); + break; + case "M": + mx = +pa[1] + x; + my = +pa[2] + y; + default: + for (j = 1, jj = pa.length; j < jj; j++) { + r[j] = +pa[j] + ((j % 2) ? x : y); + } + } + } else if (pa0 == "R") { + dots = [x, y].concat(pa.slice(1)); + res.pop(); + res = res.concat(catmullRom2bezier(dots, crz)); + r = ["R"].concat(pa.slice(-2)); + } else if (pa0 == "O") { + res.pop(); + dots = ellipsePath(x, y, pa[1], pa[2]); + dots.push(dots[0]); + res = res.concat(dots); + } else if (pa0 == "U") { + res.pop(); + res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3])); + r = ["U"].concat(res[res.length - 1].slice(-2)); + } else { + for (var k = 0, kk = pa.length; k < kk; k++) { + r[k] = pa[k]; + } + } + pa0 = pa0.toUpperCase(); + if (pa0 != "O") { + switch (r[0]) { + case "Z": + x = +mx; + y = +my; + break; + case "H": + x = r[1]; + break; + case "V": + y = r[1]; + break; + case "M": + mx = r[r.length - 2]; + my = r[r.length - 1]; + default: + x = r[r.length - 2]; + y = r[r.length - 1]; + } + } + } + res.toString = toString; + pth.abs = pathClone(res); + return res; + } + function l2c(x1, y1, x2, y2) { + return [x1, y1, x2, y2, x2, y2]; + } + function q2c(x1, y1, ax, ay, x2, y2) { + var _13 = 1 / 3, + _23 = 2 / 3; + return [ + _13 * x1 + _23 * ax, + _13 * y1 + _23 * ay, + _13 * x2 + _23 * ax, + _13 * y2 + _23 * ay, + x2, + y2 + ]; + } + function a2c(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) { + // for more information of where this math came from visit: + // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + var _120 = PI * 120 / 180, + rad = PI / 180 * (+angle || 0), + res = [], + xy, + rotate = Snap._.cacher(function (x, y, rad) { + var X = x * math.cos(rad) - y * math.sin(rad), + Y = x * math.sin(rad) + y * math.cos(rad); + return {x: X, y: Y}; + }); + if (!recursive) { + xy = rotate(x1, y1, -rad); + x1 = xy.x; + y1 = xy.y; + xy = rotate(x2, y2, -rad); + x2 = xy.x; + y2 = xy.y; + var cos = math.cos(PI / 180 * angle), + sin = math.sin(PI / 180 * angle), + x = (x1 - x2) / 2, + y = (y1 - y2) / 2; + var h = (x * x) / (rx * rx) + (y * y) / (ry * ry); + if (h > 1) { + h = math.sqrt(h); + rx = h * rx; + ry = h * ry; + } + var rx2 = rx * rx, + ry2 = ry * ry, + k = (large_arc_flag == sweep_flag ? -1 : 1) * + math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))), + cx = k * rx * y / ry + (x1 + x2) / 2, + cy = k * -ry * x / rx + (y1 + y2) / 2, + f1 = math.asin(((y1 - cy) / ry).toFixed(9)), + f2 = math.asin(((y2 - cy) / ry).toFixed(9)); + + f1 = x1 < cx ? PI - f1 : f1; + f2 = x2 < cx ? PI - f2 : f2; + f1 < 0 && (f1 = PI * 2 + f1); + f2 < 0 && (f2 = PI * 2 + f2); + if (sweep_flag && f1 > f2) { + f1 = f1 - PI * 2; + } + if (!sweep_flag && f2 > f1) { + f2 = f2 - PI * 2; + } + } else { + f1 = recursive[0]; + f2 = recursive[1]; + cx = recursive[2]; + cy = recursive[3]; + } + var df = f2 - f1; + if (abs(df) > _120) { + var f2old = f2, + x2old = x2, + y2old = y2; + f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1); + x2 = cx + rx * math.cos(f2); + y2 = cy + ry * math.sin(f2); + res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]); + } + df = f2 - f1; + var c1 = math.cos(f1), + s1 = math.sin(f1), + c2 = math.cos(f2), + s2 = math.sin(f2), + t = math.tan(df / 4), + hx = 4 / 3 * rx * t, + hy = 4 / 3 * ry * t, + m1 = [x1, y1], + m2 = [x1 + hx * s1, y1 - hy * c1], + m3 = [x2 + hx * s2, y2 - hy * c2], + m4 = [x2, y2]; + m2[0] = 2 * m1[0] - m2[0]; + m2[1] = 2 * m1[1] - m2[1]; + if (recursive) { + return [m2, m3, m4].concat(res); + } else { + res = [m2, m3, m4].concat(res).join().split(","); + var newres = []; + for (var i = 0, ii = res.length; i < ii; i++) { + newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x; + } + return newres; + } + } + function findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t; + return { + x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x, + y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y + }; + } + + // Returns bounding box of cubic bezier curve. + // Source: http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html + // Original version: NISHIO Hirokazu + // Modifications: https://github.com/timo22345 + function curveDim(x0, y0, x1, y1, x2, y2, x3, y3) { + var tvalues = [], + bounds = [[], []], + a, b, c, t, t1, t2, b2ac, sqrtb2ac; + for (var i = 0; i < 2; ++i) { + if (i == 0) { + b = 6 * x0 - 12 * x1 + 6 * x2; + a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3; + c = 3 * x1 - 3 * x0; + } else { + b = 6 * y0 - 12 * y1 + 6 * y2; + a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3; + c = 3 * y1 - 3 * y0; + } + if (abs(a) < 1e-12) { + if (abs(b) < 1e-12) { + continue; + } + t = -c / b; + if (0 < t && t < 1) { + tvalues.push(t); + } + continue; + } + b2ac = b * b - 4 * c * a; + sqrtb2ac = math.sqrt(b2ac); + if (b2ac < 0) { + continue; + } + t1 = (-b + sqrtb2ac) / (2 * a); + if (0 < t1 && t1 < 1) { + tvalues.push(t1); + } + t2 = (-b - sqrtb2ac) / (2 * a); + if (0 < t2 && t2 < 1) { + tvalues.push(t2); + } + } + + var x, y, j = tvalues.length, + jlen = j, + mt; + while (j--) { + t = tvalues[j]; + mt = 1 - t; + bounds[0][j] = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3); + bounds[1][j] = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3); + } + + bounds[0][jlen] = x0; + bounds[1][jlen] = y0; + bounds[0][jlen + 1] = x3; + bounds[1][jlen + 1] = y3; + bounds[0].length = bounds[1].length = jlen + 2; + + + return { + min: {x: mmin.apply(0, bounds[0]), y: mmin.apply(0, bounds[1])}, + max: {x: mmax.apply(0, bounds[0]), y: mmax.apply(0, bounds[1])} + }; + } + + function path2curve(path, path2) { + var pth = !path2 && paths(path); + if (!path2 && pth.curve) { + return pathClone(pth.curve); + } + var p = pathToAbsolute(path), + p2 = path2 && pathToAbsolute(path2), + attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + processPath = function (path, d, pcom) { + var nx, ny; + if (!path) { + return ["C", d.x, d.y, d.x, d.y, d.x, d.y]; + } + !(path[0] in {T: 1, Q: 1}) && (d.qx = d.qy = null); + switch (path[0]) { + case "M": + d.X = path[1]; + d.Y = path[2]; + break; + case "A": + path = ["C"].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1)))); + break; + case "S": + if (pcom == "C" || pcom == "S") { // In "S" case we have to take into account, if the previous command is C/S. + nx = d.x * 2 - d.bx; // And reflect the previous + ny = d.y * 2 - d.by; // command's control point relative to the current point. + } + else { // or some else or nothing + nx = d.x; + ny = d.y; + } + path = ["C", nx, ny].concat(path.slice(1)); + break; + case "T": + if (pcom == "Q" || pcom == "T") { // In "T" case we have to take into account, if the previous command is Q/T. + d.qx = d.x * 2 - d.qx; // And make a reflection similar + d.qy = d.y * 2 - d.qy; // to case "S". + } + else { // or something else or nothing + d.qx = d.x; + d.qy = d.y; + } + path = ["C"].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2])); + break; + case "Q": + d.qx = path[1]; + d.qy = path[2]; + path = ["C"].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4])); + break; + case "L": + path = ["C"].concat(l2c(d.x, d.y, path[1], path[2])); + break; + case "H": + path = ["C"].concat(l2c(d.x, d.y, path[1], d.y)); + break; + case "V": + path = ["C"].concat(l2c(d.x, d.y, d.x, path[1])); + break; + case "Z": + path = ["C"].concat(l2c(d.x, d.y, d.X, d.Y)); + break; + } + return path; + }, + fixArc = function (pp, i) { + if (pp[i].length > 7) { + pp[i].shift(); + var pi = pp[i]; + while (pi.length) { + pcoms1[i] = "A"; // if created multiple C:s, their original seg is saved + p2 && (pcoms2[i] = "A"); // the same as above + pp.splice(i++, 0, ["C"].concat(pi.splice(0, 6))); + } + pp.splice(i, 1); + ii = mmax(p.length, p2 && p2.length || 0); + } + }, + fixM = function (path1, path2, a1, a2, i) { + if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") { + path2.splice(i, 0, ["M", a2.x, a2.y]); + a1.bx = 0; + a1.by = 0; + a1.x = path1[i][1]; + a1.y = path1[i][2]; + ii = mmax(p.length, p2 && p2.length || 0); + } + }, + pcoms1 = [], // path commands of original path p + pcoms2 = [], // path commands of original path p2 + pfirst = "", // temporary holder for original path command + pcom = ""; // holder for previous path command of original path + for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) { + p[i] && (pfirst = p[i][0]); // save current path command + + if (pfirst != "C") // C is not saved yet, because it may be result of conversion + { + pcoms1[i] = pfirst; // Save current path command + i && ( pcom = pcoms1[i - 1]); // Get previous path command pcom + } + p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath + + if (pcoms1[i] != "A" && pfirst == "C") pcoms1[i] = "C"; // A is the only command + // which may produce multiple C:s + // so we have to make sure that C is also C in original path + + fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1 + + if (p2) { // the same procedures is done to p2 + p2[i] && (pfirst = p2[i][0]); + if (pfirst != "C") { + pcoms2[i] = pfirst; + i && (pcom = pcoms2[i - 1]); + } + p2[i] = processPath(p2[i], attrs2, pcom); + + if (pcoms2[i] != "A" && pfirst == "C") { + pcoms2[i] = "C"; + } + + fixArc(p2, i); + } + fixM(p, p2, attrs, attrs2, i); + fixM(p2, p, attrs2, attrs, i); + var seg = p[i], + seg2 = p2 && p2[i], + seglen = seg.length, + seg2len = p2 && seg2.length; + attrs.x = seg[seglen - 2]; + attrs.y = seg[seglen - 1]; + attrs.bx = toFloat(seg[seglen - 4]) || attrs.x; + attrs.by = toFloat(seg[seglen - 3]) || attrs.y; + attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x); + attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y); + attrs2.x = p2 && seg2[seg2len - 2]; + attrs2.y = p2 && seg2[seg2len - 1]; + } + if (!p2) { + pth.curve = pathClone(p); + } + return p2 ? [p, p2] : p; + } + function mapPath(path, matrix) { + if (!matrix) { + return path; + } + var x, y, i, j, ii, jj, pathi; + path = path2curve(path); + for (i = 0, ii = path.length; i < ii; i++) { + pathi = path[i]; + for (j = 1, jj = pathi.length; j < jj; j += 2) { + x = matrix.x(pathi[j], pathi[j + 1]); + y = matrix.y(pathi[j], pathi[j + 1]); + pathi[j] = x; + pathi[j + 1] = y; + } + } + return path; + } + + // http://schepers.cc/getting-to-the-point + function catmullRom2bezier(crp, z) { + var d = []; + for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) { + var p = [ + {x: +crp[i - 2], y: +crp[i - 1]}, + {x: +crp[i], y: +crp[i + 1]}, + {x: +crp[i + 2], y: +crp[i + 3]}, + {x: +crp[i + 4], y: +crp[i + 5]} + ]; + if (z) { + if (!i) { + p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]}; + } else if (iLen - 4 == i) { + p[3] = {x: +crp[0], y: +crp[1]}; + } else if (iLen - 2 == i) { + p[2] = {x: +crp[0], y: +crp[1]}; + p[3] = {x: +crp[2], y: +crp[3]}; + } + } else { + if (iLen - 4 == i) { + p[3] = p[2]; + } else if (!i) { + p[0] = {x: +crp[i], y: +crp[i + 1]}; + } + } + d.push(["C", + (-p[0].x + 6 * p[1].x + p[2].x) / 6, + (-p[0].y + 6 * p[1].y + p[2].y) / 6, + (p[1].x + 6 * p[2].x - p[3].x) / 6, + (p[1].y + 6*p[2].y - p[3].y) / 6, + p[2].x, + p[2].y + ]); + } + + return d; + } + + // export + Snap.path = paths; + + /*\ + * Snap.path.getTotalLength + [ method ] + ** + * Returns the length of the given path in pixels + ** + - path (string) SVG path string + ** + = (number) length + \*/ + Snap.path.getTotalLength = getTotalLength; + /*\ + * Snap.path.getPointAtLength + [ method ] + ** + * Returns the coordinates of the point located at the given length along the given path + ** + - path (string) SVG path string + - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps + ** + = (object) representation of the point: + o { + o x: (number) x coordinate, + o y: (number) y coordinate, + o alpha: (number) angle of derivative + o } + \*/ + Snap.path.getPointAtLength = getPointAtLength; + /*\ + * Snap.path.getSubpath + [ method ] + ** + * Returns the subpath of a given path between given start and end lengths + ** + - path (string) SVG path string + - from (number) length, in pixels, from the start of the path to the start of the segment + - to (number) length, in pixels, from the start of the path to the end of the segment + ** + = (string) path string definition for the segment + \*/ + Snap.path.getSubpath = function (path, from, to) { + if (this.getTotalLength(path) - to < 1e-6) { + return getSubpathsAtLength(path, from).end; + } + var a = getSubpathsAtLength(path, to, 1); + return from ? getSubpathsAtLength(a, from).end : a; + }; + /*\ + * Element.getTotalLength + [ method ] + ** + * Returns the length of the path in pixels (only works for `path` elements) + = (number) length + \*/ + elproto.getTotalLength = function () { + if (this.node.getTotalLength) { + return this.node.getTotalLength(); + } + }; + // SIERRA Element.getPointAtLength()/Element.getTotalLength(): If a is broken into different segments, is the jump distance to the new coordinates set by the _M_ or _m_ commands calculated as part of the path's total length? + /*\ + * Element.getPointAtLength + [ method ] + ** + * Returns coordinates of the point located at the given length on the given path (only works for `path` elements) + ** + - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps + ** + = (object) representation of the point: + o { + o x: (number) x coordinate, + o y: (number) y coordinate, + o alpha: (number) angle of derivative + o } + \*/ + elproto.getPointAtLength = function (length) { + return getPointAtLength(this.attr("d"), length); + }; + // SIERRA Element.getSubpath(): Similar to the problem for Element.getPointAtLength(). Unclear how this would work for a segmented path. Overall, the concept of _subpath_ and what I'm calling a _segment_ (series of non-_M_ or _Z_ commands) is unclear. + /*\ + * Element.getSubpath + [ method ] + ** + * Returns subpath of a given element from given start and end lengths (only works for `path` elements) + ** + - from (number) length, in pixels, from the start of the path to the start of the segment + - to (number) length, in pixels, from the start of the path to the end of the segment + ** + = (string) path string definition for the segment + \*/ + elproto.getSubpath = function (from, to) { + return Snap.path.getSubpath(this.attr("d"), from, to); + }; + Snap._.box = box; + /*\ + * Snap.path.findDotsAtSegment + [ method ] + ** + * Utility method + ** + * Finds dot coordinates on the given cubic beziér curve at the given t + - p1x (number) x of the first point of the curve + - p1y (number) y of the first point of the curve + - c1x (number) x of the first anchor of the curve + - c1y (number) y of the first anchor of the curve + - c2x (number) x of the second anchor of the curve + - c2y (number) y of the second anchor of the curve + - p2x (number) x of the second point of the curve + - p2y (number) y of the second point of the curve + - t (number) position on the curve (0..1) + = (object) point information in format: + o { + o x: (number) x coordinate of the point, + o y: (number) y coordinate of the point, + o m: { + o x: (number) x coordinate of the left anchor, + o y: (number) y coordinate of the left anchor + o }, + o n: { + o x: (number) x coordinate of the right anchor, + o y: (number) y coordinate of the right anchor + o }, + o start: { + o x: (number) x coordinate of the start of the curve, + o y: (number) y coordinate of the start of the curve + o }, + o end: { + o x: (number) x coordinate of the end of the curve, + o y: (number) y coordinate of the end of the curve + o }, + o alpha: (number) angle of the curve derivative at the point + o } + \*/ + Snap.path.findDotsAtSegment = findDotsAtSegment; + /*\ + * Snap.path.bezierBBox + [ method ] + ** + * Utility method + ** + * Returns the bounding box of a given cubic beziér curve + - p1x (number) x of the first point of the curve + - p1y (number) y of the first point of the curve + - c1x (number) x of the first anchor of the curve + - c1y (number) y of the first anchor of the curve + - c2x (number) x of the second anchor of the curve + - c2y (number) y of the second anchor of the curve + - p2x (number) x of the second point of the curve + - p2y (number) y of the second point of the curve + * or + - bez (array) array of six points for beziér curve + = (object) bounding box + o { + o x: (number) x coordinate of the left top point of the box, + o y: (number) y coordinate of the left top point of the box, + o x2: (number) x coordinate of the right bottom point of the box, + o y2: (number) y coordinate of the right bottom point of the box, + o width: (number) width of the box, + o height: (number) height of the box + o } + \*/ + Snap.path.bezierBBox = bezierBBox; + /*\ + * Snap.path.isPointInsideBBox + [ method ] + ** + * Utility method + ** + * Returns `true` if given point is inside bounding box + - bbox (string) bounding box + - x (string) x coordinate of the point + - y (string) y coordinate of the point + = (boolean) `true` if point is inside + \*/ + Snap.path.isPointInsideBBox = isPointInsideBBox; + Snap.closest = function (x, y, X, Y) { + var r = 100, + b = box(x - r / 2, y - r / 2, r, r), + inside = [], + getter = X[0].hasOwnProperty("x") ? function (i) { + return { + x: X[i].x, + y: X[i].y + }; + } : function (i) { + return { + x: X[i], + y: Y[i] + }; + }, + found = 0; + while (r <= 1e6 && !found) { + for (var i = 0, ii = X.length; i < ii; i++) { + var xy = getter(i); + if (isPointInsideBBox(b, xy.x, xy.y)) { + found++; + inside.push(xy); + break; + } + } + if (!found) { + r *= 2; + b = box(x - r / 2, y - r / 2, r, r) + } + } + if (r == 1e6) { + return; + } + var len = Infinity, + res; + for (i = 0, ii = inside.length; i < ii; i++) { + var l = Snap.len(x, y, inside[i].x, inside[i].y); + if (len > l) { + len = l; + inside[i].len = l; + res = inside[i]; + } + } + return res; + }; + /*\ + * Snap.path.isBBoxIntersect + [ method ] + ** + * Utility method + ** + * Returns `true` if two bounding boxes intersect + - bbox1 (string) first bounding box + - bbox2 (string) second bounding box + = (boolean) `true` if bounding boxes intersect + \*/ + Snap.path.isBBoxIntersect = isBBoxIntersect; + /*\ + * Snap.path.intersection + [ method ] + ** + * Utility method + ** + * Finds intersections of two paths + - path1 (string) path string + - path2 (string) path string + = (array) dots of intersection + o [ + o { + o x: (number) x coordinate of the point, + o y: (number) y coordinate of the point, + o t1: (number) t value for segment of path1, + o t2: (number) t value for segment of path2, + o segment1: (number) order number for segment of path1, + o segment2: (number) order number for segment of path2, + o bez1: (array) eight coordinates representing beziér curve for the segment of path1, + o bez2: (array) eight coordinates representing beziér curve for the segment of path2 + o } + o ] + \*/ + Snap.path.intersection = pathIntersection; + Snap.path.intersectionNumber = pathIntersectionNumber; + /*\ + * Snap.path.isPointInside + [ method ] + ** + * Utility method + ** + * Returns `true` if given point is inside a given closed path. + * + * Note: fill mode doesn’t affect the result of this method. + - path (string) path string + - x (number) x of the point + - y (number) y of the point + = (boolean) `true` if point is inside the path + \*/ + Snap.path.isPointInside = isPointInsidePath; + /*\ + * Snap.path.getBBox + [ method ] + ** + * Utility method + ** + * Returns the bounding box of a given path + - path (string) path string + = (object) bounding box + o { + o x: (number) x coordinate of the left top point of the box, + o y: (number) y coordinate of the left top point of the box, + o x2: (number) x coordinate of the right bottom point of the box, + o y2: (number) y coordinate of the right bottom point of the box, + o width: (number) width of the box, + o height: (number) height of the box + o } + \*/ + Snap.path.getBBox = pathBBox; + Snap.path.get = getPath; + /*\ + * Snap.path.toRelative + [ method ] + ** + * Utility method + ** + * Converts path coordinates into relative values + - path (string) path string + = (array) path string + \*/ + Snap.path.toRelative = pathToRelative; + /*\ + * Snap.path.toAbsolute + [ method ] + ** + * Utility method + ** + * Converts path coordinates into absolute values + - path (string) path string + = (array) path string + \*/ + Snap.path.toAbsolute = pathToAbsolute; + /*\ + * Snap.path.toCubic + [ method ] + ** + * Utility method + ** + * Converts path to a new path where all segments are cubic beziér curves + - pathString (string|array) path string or array of segments + = (array) array of segments + \*/ + Snap.path.toCubic = path2curve; + /*\ + * Snap.path.map + [ method ] + ** + * Transform the path string with the given matrix + - path (string) path string + - matrix (object) see @Matrix + = (string) transformed path string + \*/ + Snap.path.map = mapPath; + Snap.path.toString = toString; + Snap.path.clone = pathClone; +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +Snap.plugin(function (Snap, Element, Paper, glob) { + var mmax = Math.max, + mmin = Math.min; + + // Set + var Set = function (items) { + this.items = []; + this.bindings = {}; + this.length = 0; + this.type = "set"; + if (items) { + for (var i = 0, ii = items.length; i < ii; i++) { + if (items[i]) { + this[this.items.length] = this.items[this.items.length] = items[i]; + this.length++; + } + } + } + }, + setproto = Set.prototype; + /*\ + * Set.push + [ method ] + ** + * Adds each argument to the current set + = (object) original element + \*/ + setproto.push = function () { + var item, + len; + for (var i = 0, ii = arguments.length; i < ii; i++) { + item = arguments[i]; + if (item) { + len = this.items.length; + this[len] = this.items[len] = item; + this.length++; + } + } + return this; + }; + /*\ + * Set.pop + [ method ] + ** + * Removes last element and returns it + = (object) element + \*/ + setproto.pop = function () { + this.length && delete this[this.length--]; + return this.items.pop(); + }; + /*\ + * Set.forEach + [ method ] + ** + * Executes given function for each element in the set + * + * If the function returns `false`, the loop stops running. + ** + - callback (function) function to run + - thisArg (object) context object for the callback + = (object) Set object + \*/ + setproto.forEach = function (callback, thisArg) { + for (var i = 0, ii = this.items.length; i < ii; i++) { + if (callback.call(thisArg, this.items[i], i) === false) { + return this; + } + } + return this; + }; + /*\ + * Set.animate + [ method ] + ** + * Animates each element in set in sync. + * + ** + - attrs (object) key-value pairs of destination attributes + - duration (number) duration of the animation in milliseconds + - easing (function) #optional easing function from @mina or custom + - callback (function) #optional callback function that executes when the animation ends + * or + - animation (array) array of animation parameter for each element in set in format `[attrs, duration, easing, callback]` + > Usage + | // animate all elements in set to radius 10 + | set.animate({r: 10}, 500, mina.easein); + | // or + | // animate first element to radius 10, but second to radius 20 and in different time + | set.animate([{r: 10}, 500, mina.easein], [{r: 20}, 1500, mina.easein]); + = (Element) the current element + \*/ + setproto.animate = function (attrs, ms, easing, callback) { + if (typeof easing == "function" && !easing.length) { + callback = easing; + easing = mina.linear; + } + if (attrs instanceof Snap._.Animation) { + callback = attrs.callback; + easing = attrs.easing; + ms = easing.dur; + attrs = attrs.attr; + } + var args = arguments; + if (Snap.is(attrs, "array") && Snap.is(args[args.length - 1], "array")) { + var each = true; + } + var begin, + handler = function () { + if (begin) { + this.b = begin; + } else { + begin = this.b; + } + }, + cb = 0, + set = this, + callbacker = callback && function () { + if (++cb == set.length) { + callback.call(this); + } + }; + return this.forEach(function (el, i) { + eve.once("snap.animcreated." + el.id, handler); + if (each) { + args[i] && el.animate.apply(el, args[i]); + } else { + el.animate(attrs, ms, easing, callbacker); + } + }); + }; + setproto.remove = function () { + while (this.length) { + this.pop().remove(); + } + return this; + }; + /*\ + * Set.bind + [ method ] + ** + * Specifies how to handle a specific attribute when applied + * to a set. + * + ** + - attr (string) attribute name + - callback (function) function to run + * or + - attr (string) attribute name + - element (Element) specific element in the set to apply the attribute to + * or + - attr (string) attribute name + - element (Element) specific element in the set to apply the attribute to + - eattr (string) attribute on the element to bind the attribute to + = (object) Set object + \*/ + setproto.bind = function (attr, a, b) { + var data = {}; + if (typeof a == "function") { + this.bindings[attr] = a; + } else { + var aname = b || attr; + this.bindings[attr] = function (v) { + data[aname] = v; + a.attr(data); + }; + } + return this; + }; + setproto.attr = function (value) { + var unbound = {}; + for (var k in value) { + if (this.bindings[k]) { + this.bindings[k](value[k]); + } else { + unbound[k] = value[k]; + } + } + for (var i = 0, ii = this.items.length; i < ii; i++) { + this.items[i].attr(unbound); + } + return this; + }; + /*\ + * Set.clear + [ method ] + ** + * Removes all elements from the set + \*/ + setproto.clear = function () { + while (this.length) { + this.pop(); + } + }; + /*\ + * Set.splice + [ method ] + ** + * Removes range of elements from the set + ** + - index (number) position of the deletion + - count (number) number of element to remove + - insertion… (object) #optional elements to insert + = (object) set elements that were deleted + \*/ + setproto.splice = function (index, count, insertion) { + index = index < 0 ? mmax(this.length + index, 0) : index; + count = mmax(0, mmin(this.length - index, count)); + var tail = [], + todel = [], + args = [], + i; + for (i = 2; i < arguments.length; i++) { + args.push(arguments[i]); + } + for (i = 0; i < count; i++) { + todel.push(this[index + i]); + } + for (; i < this.length - index; i++) { + tail.push(this[index + i]); + } + var arglen = args.length; + for (i = 0; i < arglen + tail.length; i++) { + this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen]; + } + i = this.items.length = this.length -= count - arglen; + while (this[i]) { + delete this[i++]; + } + return new Set(todel); + }; + /*\ + * Set.exclude + [ method ] + ** + * Removes given element from the set + ** + - element (object) element to remove + = (boolean) `true` if object was found and removed from the set + \*/ + setproto.exclude = function (el) { + for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) { + this.splice(i, 1); + return true; + } + return false; + }; + setproto.insertAfter = function (el) { + var i = this.items.length; + while (i--) { + this.items[i].insertAfter(el); + } + return this; + }; + setproto.getBBox = function () { + var x = [], + y = [], + x2 = [], + y2 = []; + for (var i = this.items.length; i--;) if (!this.items[i].removed) { + var box = this.items[i].getBBox(); + x.push(box.x); + y.push(box.y); + x2.push(box.x + box.width); + y2.push(box.y + box.height); + } + x = mmin.apply(0, x); + y = mmin.apply(0, y); + x2 = mmax.apply(0, x2); + y2 = mmax.apply(0, y2); + return { + x: x, + y: y, + x2: x2, + y2: y2, + width: x2 - x, + height: y2 - y, + cx: x + (x2 - x) / 2, + cy: y + (y2 - y) / 2 + }; + }; + setproto.clone = function (s) { + s = new Set; + for (var i = 0, ii = this.items.length; i < ii; i++) { + s.push(this.items[i].clone()); + } + return s; + }; + setproto.toString = function () { + return "Snap\u2018s set"; + }; + setproto.type = "set"; + // export + Snap.Set = Set; + Snap.set = function () { + var set = new Set; + if (arguments.length) { + set.push.apply(set, Array.prototype.slice.call(arguments, 0)); + } + return set; + }; +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +Snap.plugin(function (Snap, Element, Paper, glob) { + var names = {}, + reUnit = /[a-z]+$/i, + Str = String; + names.stroke = names.fill = "colour"; + function getEmpty(item) { + var l = item[0]; + switch (l.toLowerCase()) { + case "t": return [l, 0, 0]; + case "m": return [l, 1, 0, 0, 1, 0, 0]; + case "r": if (item.length == 4) { + return [l, 0, item[2], item[3]]; + } else { + return [l, 0]; + } + case "s": if (item.length == 5) { + return [l, 1, 1, item[3], item[4]]; + } else if (item.length == 3) { + return [l, 1, 1]; + } else { + return [l, 1]; + } + } + } + function equaliseTransform(t1, t2, getBBox) { + t2 = Str(t2).replace(/\.{3}|\u2026/g, t1); + t1 = Snap.parseTransformString(t1) || []; + t2 = Snap.parseTransformString(t2) || []; + var maxlength = Math.max(t1.length, t2.length), + from = [], + to = [], + i = 0, j, jj, + tt1, tt2; + for (; i < maxlength; i++) { + tt1 = t1[i] || getEmpty(t2[i]); + tt2 = t2[i] || getEmpty(tt1); + if ((tt1[0] != tt2[0]) || + (tt1[0].toLowerCase() == "r" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) || + (tt1[0].toLowerCase() == "s" && (tt1[3] != tt2[3] || tt1[4] != tt2[4])) + ) { + t1 = Snap._.transform2matrix(t1, getBBox()); + t2 = Snap._.transform2matrix(t2, getBBox()); + from = [["m", t1.a, t1.b, t1.c, t1.d, t1.e, t1.f]]; + to = [["m", t2.a, t2.b, t2.c, t2.d, t2.e, t2.f]]; + break; + } + from[i] = []; + to[i] = []; + for (j = 0, jj = Math.max(tt1.length, tt2.length); j < jj; j++) { + j in tt1 && (from[i][j] = tt1[j]); + j in tt2 && (to[i][j] = tt2[j]); + } + } + return { + from: path2array(from), + to: path2array(to), + f: getPath(from) + }; + } + function getNumber(val) { + return val; + } + function getUnit(unit) { + return function (val) { + return +val.toFixed(3) + unit; + }; + } + function getViewBox(val) { + return val.join(" "); + } + function getColour(clr) { + return Snap.rgb(clr[0], clr[1], clr[2]); + } + function getPath(path) { + var k = 0, i, ii, j, jj, out, a, b = []; + for (i = 0, ii = path.length; i < ii; i++) { + out = "["; + a = ['"' + path[i][0] + '"']; + for (j = 1, jj = path[i].length; j < jj; j++) { + a[j] = "val[" + (k++) + "]"; + } + out += a + "]"; + b[i] = out; + } + return Function("val", "return Snap.path.toString.call([" + b + "])"); + } + function path2array(path) { + var out = []; + for (var i = 0, ii = path.length; i < ii; i++) { + for (var j = 1, jj = path[i].length; j < jj; j++) { + out.push(path[i][j]); + } + } + return out; + } + function isNumeric(obj) { + return isFinite(parseFloat(obj)); + } + function arrayEqual(arr1, arr2) { + if (!Snap.is(arr1, "array") || !Snap.is(arr2, "array")) { + return false; + } + return arr1.toString() == arr2.toString(); + } + Element.prototype.equal = function (name, b) { + return eve("snap.util.equal", this, name, b).firstDefined(); + }; + eve.on("snap.util.equal", function (name, b) { + var A, B, a = Str(this.attr(name) || ""), + el = this; + if (isNumeric(a) && isNumeric(b)) { + return { + from: parseFloat(a), + to: parseFloat(b), + f: getNumber + }; + } + if (names[name] == "colour") { + A = Snap.color(a); + B = Snap.color(b); + return { + from: [A.r, A.g, A.b, A.opacity], + to: [B.r, B.g, B.b, B.opacity], + f: getColour + }; + } + if (name == "viewBox") { + A = this.attr(name).vb.split(" ").map(Number); + B = b.split(" ").map(Number); + return { + from: A, + to: B, + f: getViewBox + }; + } + if (name == "transform" || name == "gradientTransform" || name == "patternTransform") { + if (b instanceof Snap.Matrix) { + b = b.toTransformString(); + } + if (!Snap._.rgTransform.test(b)) { + b = Snap._.svgTransform2string(b); + } + return equaliseTransform(a, b, function () { + return el.getBBox(1); + }); + } + if (name == "d" || name == "path") { + A = Snap.path.toCubic(a, b); + return { + from: path2array(A[0]), + to: path2array(A[1]), + f: getPath(A[0]) + }; + } + if (name == "points") { + A = Str(a).split(Snap._.separator); + B = Str(b).split(Snap._.separator); + return { + from: A, + to: B, + f: function (val) { return val; } + }; + } + var aUnit = a.match(reUnit), + bUnit = Str(b).match(reUnit); + if (aUnit && arrayEqual(aUnit, bUnit)) { + return { + from: parseFloat(a), + to: parseFloat(b), + f: getUnit(aUnit) + }; + } else { + return { + from: this.asPX(name), + to: this.asPX(name, b), + f: getNumber + }; + } + }); +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +Snap.plugin(function (Snap, Element, Paper, glob) { + var elproto = Element.prototype, + has = "hasOwnProperty", + supportsTouch = "createTouch" in glob.doc, + events = [ + "click", "dblclick", "mousedown", "mousemove", "mouseout", + "mouseover", "mouseup", "touchstart", "touchmove", "touchend", + "touchcancel" + ], + touchMap = { + mousedown: "touchstart", + mousemove: "touchmove", + mouseup: "touchend" + }, + getScroll = function (xy, el) { + var name = xy == "y" ? "scrollTop" : "scrollLeft", + doc = el && el.node ? el.node.ownerDocument : glob.doc; + return doc[name in doc.documentElement ? "documentElement" : "body"][name]; + }, + preventDefault = function () { + this.returnValue = false; + }, + preventTouch = function () { + return this.originalEvent.preventDefault(); + }, + stopPropagation = function () { + this.cancelBubble = true; + }, + stopTouch = function () { + return this.originalEvent.stopPropagation(); + }, + addEvent = function (obj, type, fn, element) { + var realName = supportsTouch && touchMap[type] ? touchMap[type] : type, + f = function (e) { + var scrollY = getScroll("y", element), + scrollX = getScroll("x", element); + if (supportsTouch && touchMap[has](type)) { + for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) { + if (e.targetTouches[i].target == obj || obj.contains(e.targetTouches[i].target)) { + var olde = e; + e = e.targetTouches[i]; + e.originalEvent = olde; + e.preventDefault = preventTouch; + e.stopPropagation = stopTouch; + break; + } + } + } + var x = e.clientX + scrollX, + y = e.clientY + scrollY; + return fn.call(element, e, x, y); + }; + + if (type !== realName) { + obj.addEventListener(type, f, false); + } + + obj.addEventListener(realName, f, false); + + return function () { + if (type !== realName) { + obj.removeEventListener(type, f, false); + } + + obj.removeEventListener(realName, f, false); + return true; + }; + }, + drag = [], + dragMove = function (e) { + var x = e.clientX, + y = e.clientY, + scrollY = getScroll("y"), + scrollX = getScroll("x"), + dragi, + j = drag.length; + while (j--) { + dragi = drag[j]; + if (supportsTouch) { + var i = e.touches && e.touches.length, + touch; + while (i--) { + touch = e.touches[i]; + if (touch.identifier == dragi.el._drag.id || dragi.el.node.contains(touch.target)) { + x = touch.clientX; + y = touch.clientY; + (e.originalEvent ? e.originalEvent : e).preventDefault(); + break; + } + } + } else { + e.preventDefault(); + } + var node = dragi.el.node, + o, + next = node.nextSibling, + parent = node.parentNode, + display = node.style.display; + // glob.win.opera && parent.removeChild(node); + // node.style.display = "none"; + // o = dragi.el.paper.getElementByPoint(x, y); + // node.style.display = display; + // glob.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node)); + // o && eve("snap.drag.over." + dragi.el.id, dragi.el, o); + x += scrollX; + y += scrollY; + eve("snap.drag.move." + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e); + } + }, + dragUp = function (e) { + Snap.unmousemove(dragMove).unmouseup(dragUp); + var i = drag.length, + dragi; + while (i--) { + dragi = drag[i]; + dragi.el._drag = {}; + eve("snap.drag.end." + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e); + eve.off("snap.drag.*." + dragi.el.id); + } + drag = []; + }; + /*\ + * Element.click + [ method ] + ** + * Adds a click event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unclick + [ method ] + ** + * Removes a click event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.dblclick + [ method ] + ** + * Adds a double click event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.undblclick + [ method ] + ** + * Removes a double click event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mousedown + [ method ] + ** + * Adds a mousedown event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmousedown + [ method ] + ** + * Removes a mousedown event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mousemove + [ method ] + ** + * Adds a mousemove event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmousemove + [ method ] + ** + * Removes a mousemove event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseout + [ method ] + ** + * Adds a mouseout event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseout + [ method ] + ** + * Removes a mouseout event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseover + [ method ] + ** + * Adds a mouseover event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseover + [ method ] + ** + * Removes a mouseover event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseup + [ method ] + ** + * Adds a mouseup event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseup + [ method ] + ** + * Removes a mouseup event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchstart + [ method ] + ** + * Adds a touchstart event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchstart + [ method ] + ** + * Removes a touchstart event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchmove + [ method ] + ** + * Adds a touchmove event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchmove + [ method ] + ** + * Removes a touchmove event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchend + [ method ] + ** + * Adds a touchend event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchend + [ method ] + ** + * Removes a touchend event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchcancel + [ method ] + ** + * Adds a touchcancel event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchcancel + [ method ] + ** + * Removes a touchcancel event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + for (var i = events.length; i--;) { + (function (eventName) { + Snap[eventName] = elproto[eventName] = function (fn, scope) { + if (Snap.is(fn, "function")) { + this.events = this.events || []; + this.events.push({ + name: eventName, + f: fn, + unbind: addEvent(this.node || document, eventName, fn, scope || this) + }); + } else { + for (var i = 0, ii = this.events.length; i < ii; i++) if (this.events[i].name == eventName) { + try { + this.events[i].f.call(this); + } catch (e) {} + } + } + return this; + }; + Snap["un" + eventName] = + elproto["un" + eventName] = function (fn) { + var events = this.events || [], + l = events.length; + while (l--) if (events[l].name == eventName && + (events[l].f == fn || !fn)) { + events[l].unbind(); + events.splice(l, 1); + !events.length && delete this.events; + return this; + } + return this; + }; + })(events[i]); + } + /*\ + * Element.hover + [ method ] + ** + * Adds hover event handlers to the element + - f_in (function) handler for hover in + - f_out (function) handler for hover out + - icontext (object) #optional context for hover in handler + - ocontext (object) #optional context for hover out handler + = (object) @Element + \*/ + elproto.hover = function (f_in, f_out, scope_in, scope_out) { + return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in); + }; + /*\ + * Element.unhover + [ method ] + ** + * Removes hover event handlers from the element + - f_in (function) handler for hover in + - f_out (function) handler for hover out + = (object) @Element + \*/ + elproto.unhover = function (f_in, f_out) { + return this.unmouseover(f_in).unmouseout(f_out); + }; + var draggable = []; + // SIERRA unclear what _context_ refers to for starting, ending, moving the drag gesture. + // SIERRA Element.drag(): _x position of the mouse_: Where are the x/y values offset from? + // SIERRA Element.drag(): much of this member's doc appears to be duplicated for some reason. + // SIERRA Unclear about this sentence: _Additionally following drag events will be triggered: drag.start. on start, drag.end. on end and drag.move. on every move._ Is there a global _drag_ object to which you can assign handlers keyed by an element's ID? + /*\ + * Element.drag + [ method ] + ** + * Adds event handlers for an element's drag gesture + ** + - onmove (function) handler for moving + - onstart (function) handler for drag start + - onend (function) handler for drag end + - mcontext (object) #optional context for moving handler + - scontext (object) #optional context for drag start handler + - econtext (object) #optional context for drag end handler + * Additionaly following `drag` events are triggered: `drag.start.` on start, + * `drag.end.` on end and `drag.move.` on every move. When element is dragged over another element + * `drag.over.` fires as well. + * + * Start event and start handler are called in specified context or in context of the element with following parameters: + o x (number) x position of the mouse + o y (number) y position of the mouse + o event (object) DOM event object + * Move event and move handler are called in specified context or in context of the element with following parameters: + o dx (number) shift by x from the start point + o dy (number) shift by y from the start point + o x (number) x position of the mouse + o y (number) y position of the mouse + o event (object) DOM event object + * End event and end handler are called in specified context or in context of the element with following parameters: + o event (object) DOM event object + = (object) @Element + \*/ + elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) { + var el = this; + if (!arguments.length) { + var origTransform; + return el.drag(function (dx, dy) { + this.attr({ + transform: origTransform + (origTransform ? "T" : "t") + [dx, dy] + }); + }, function () { + origTransform = this.transform().local; + }); + } + function start(e, x, y) { + (e.originalEvent || e).preventDefault(); + el._drag.x = x; + el._drag.y = y; + el._drag.id = e.identifier; + !drag.length && Snap.mousemove(dragMove).mouseup(dragUp); + drag.push({el: el, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope}); + onstart && eve.on("snap.drag.start." + el.id, onstart); + onmove && eve.on("snap.drag.move." + el.id, onmove); + onend && eve.on("snap.drag.end." + el.id, onend); + eve("snap.drag.start." + el.id, start_scope || move_scope || el, x, y, e); + } + function init(e, x, y) { + eve("snap.draginit." + el.id, el, e, x, y); + } + eve.on("snap.draginit." + el.id, start); + el._drag = {}; + draggable.push({el: el, start: start, init: init}); + el.mousedown(init); + return el; + }; + /* + * Element.onDragOver + [ method ] + ** + * Shortcut to assign event handler for `drag.over.` event, where `id` is the element's `id` (see @Element.id) + - f (function) handler for event, first argument would be the element you are dragging over + \*/ + // elproto.onDragOver = function (f) { + // f ? eve.on("snap.drag.over." + this.id, f) : eve.unbind("snap.drag.over." + this.id); + // }; + /*\ + * Element.undrag + [ method ] + ** + * Removes all drag event handlers from the given element + \*/ + elproto.undrag = function () { + var i = draggable.length; + while (i--) if (draggable[i].el == this) { + this.unmousedown(draggable[i].init); + draggable.splice(i, 1); + eve.unbind("snap.drag.*." + this.id); + eve.unbind("snap.draginit." + this.id); + } + !draggable.length && Snap.unmousemove(dragMove).unmouseup(dragUp); + return this; + }; +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +Snap.plugin(function (Snap, Element, Paper, glob) { + var elproto = Element.prototype, + pproto = Paper.prototype, + rgurl = /^\s*url\((.+)\)/, + Str = String, + $ = Snap._.$; + Snap.filter = {}; + /*\ + * Paper.filter + [ method ] + ** + * Creates a `` element + ** + - filstr (string) SVG fragment of filter provided as a string + = (object) @Element + * Note: It is recommended to use filters embedded into the page inside an empty SVG element. + > Usage + | var f = paper.filter(''), + | c = paper.circle(10, 10, 10).attr({ + | filter: f + | }); + \*/ + pproto.filter = function (filstr) { + var paper = this; + if (paper.type != "svg") { + paper = paper.paper; + } + var f = Snap.parse(Str(filstr)), + id = Snap._.id(), + width = paper.node.offsetWidth, + height = paper.node.offsetHeight, + filter = $("filter"); + $(filter, { + id: id, + filterUnits: "userSpaceOnUse" + }); + filter.appendChild(f.node); + paper.defs.appendChild(filter); + return new Element(filter); + }; + + eve.on("snap.util.getattr.filter", function () { + eve.stop(); + var p = $(this.node, "filter"); + if (p) { + var match = Str(p).match(rgurl); + return match && Snap.select(match[1]); + } + }); + eve.on("snap.util.attr.filter", function (value) { + if (value instanceof Element && value.type == "filter") { + eve.stop(); + var id = value.node.id; + if (!id) { + $(value.node, {id: value.id}); + id = value.id; + } + $(this.node, { + filter: Snap.url(id) + }); + } + if (!value || value == "none") { + eve.stop(); + this.node.removeAttribute("filter"); + } + }); + /*\ + * Snap.filter.blur + [ method ] + ** + * Returns an SVG markup string for the blur filter + ** + - x (number) amount of horizontal blur, in pixels + - y (number) #optional amount of vertical blur, in pixels + = (string) filter representation + > Usage + | var f = paper.filter(Snap.filter.blur(5, 10)), + | c = paper.circle(10, 10, 10).attr({ + | filter: f + | }); + \*/ + Snap.filter.blur = function (x, y) { + if (x == null) { + x = 2; + } + var def = y == null ? x : [x, y]; + return Snap.format('\', { + def: def + }); + }; + Snap.filter.blur.toString = function () { + return this(); + }; + /*\ + * Snap.filter.shadow + [ method ] + ** + * Returns an SVG markup string for the shadow filter + ** + - dx (number) #optional horizontal shift of the shadow, in pixels + - dy (number) #optional vertical shift of the shadow, in pixels + - blur (number) #optional amount of blur + - color (string) #optional color of the shadow + - opacity (number) #optional `0..1` opacity of the shadow + * or + - dx (number) #optional horizontal shift of the shadow, in pixels + - dy (number) #optional vertical shift of the shadow, in pixels + - color (string) #optional color of the shadow + - opacity (number) #optional `0..1` opacity of the shadow + * which makes blur default to `4`. Or + - dx (number) #optional horizontal shift of the shadow, in pixels + - dy (number) #optional vertical shift of the shadow, in pixels + - opacity (number) #optional `0..1` opacity of the shadow + = (string) filter representation + > Usage + | var f = paper.filter(Snap.filter.shadow(0, 2, 3)), + | c = paper.circle(10, 10, 10).attr({ + | filter: f + | }); + \*/ + Snap.filter.shadow = function (dx, dy, blur, color, opacity) { + if (typeof blur == "string") { + color = blur; + opacity = color; + blur = 4; + } + if (typeof color != "string") { + opacity = color; + color = "#000"; + } + color = color || "#000"; + if (blur == null) { + blur = 4; + } + if (opacity == null) { + opacity = 1; + } + if (dx == null) { + dx = 0; + dy = 2; + } + if (dy == null) { + dy = dx; + } + color = Snap.color(color); + return Snap.format('', { + color: color, + dx: dx, + dy: dy, + blur: blur, + opacity: opacity + }); + }; + Snap.filter.shadow.toString = function () { + return this(); + }; + /*\ + * Snap.filter.grayscale + [ method ] + ** + * Returns an SVG markup string for the grayscale filter + ** + - amount (number) amount of filter (`0..1`) + = (string) filter representation + \*/ + Snap.filter.grayscale = function (amount) { + if (amount == null) { + amount = 1; + } + return Snap.format('', { + a: 0.2126 + 0.7874 * (1 - amount), + b: 0.7152 - 0.7152 * (1 - amount), + c: 0.0722 - 0.0722 * (1 - amount), + d: 0.2126 - 0.2126 * (1 - amount), + e: 0.7152 + 0.2848 * (1 - amount), + f: 0.0722 - 0.0722 * (1 - amount), + g: 0.2126 - 0.2126 * (1 - amount), + h: 0.0722 + 0.9278 * (1 - amount) + }); + }; + Snap.filter.grayscale.toString = function () { + return this(); + }; + /*\ + * Snap.filter.sepia + [ method ] + ** + * Returns an SVG markup string for the sepia filter + ** + - amount (number) amount of filter (`0..1`) + = (string) filter representation + \*/ + Snap.filter.sepia = function (amount) { + if (amount == null) { + amount = 1; + } + return Snap.format('', { + a: 0.393 + 0.607 * (1 - amount), + b: 0.769 - 0.769 * (1 - amount), + c: 0.189 - 0.189 * (1 - amount), + d: 0.349 - 0.349 * (1 - amount), + e: 0.686 + 0.314 * (1 - amount), + f: 0.168 - 0.168 * (1 - amount), + g: 0.272 - 0.272 * (1 - amount), + h: 0.534 - 0.534 * (1 - amount), + i: 0.131 + 0.869 * (1 - amount) + }); + }; + Snap.filter.sepia.toString = function () { + return this(); + }; + /*\ + * Snap.filter.saturate + [ method ] + ** + * Returns an SVG markup string for the saturate filter + ** + - amount (number) amount of filter (`0..1`) + = (string) filter representation + \*/ + Snap.filter.saturate = function (amount) { + if (amount == null) { + amount = 1; + } + return Snap.format('', { + amount: 1 - amount + }); + }; + Snap.filter.saturate.toString = function () { + return this(); + }; + /*\ + * Snap.filter.hueRotate + [ method ] + ** + * Returns an SVG markup string for the hue-rotate filter + ** + - angle (number) angle of rotation + = (string) filter representation + \*/ + Snap.filter.hueRotate = function (angle) { + angle = angle || 0; + return Snap.format('', { + angle: angle + }); + }; + Snap.filter.hueRotate.toString = function () { + return this(); + }; + /*\ + * Snap.filter.invert + [ method ] + ** + * Returns an SVG markup string for the invert filter + ** + - amount (number) amount of filter (`0..1`) + = (string) filter representation + \*/ + Snap.filter.invert = function (amount) { + if (amount == null) { + amount = 1; + } +// + return Snap.format('', { + amount: amount, + amount2: 1 - amount + }); + }; + Snap.filter.invert.toString = function () { + return this(); + }; + /*\ + * Snap.filter.brightness + [ method ] + ** + * Returns an SVG markup string for the brightness filter + ** + - amount (number) amount of filter (`0..1`) + = (string) filter representation + \*/ + Snap.filter.brightness = function (amount) { + if (amount == null) { + amount = 1; + } + return Snap.format('', { + amount: amount + }); + }; + Snap.filter.brightness.toString = function () { + return this(); + }; + /*\ + * Snap.filter.contrast + [ method ] + ** + * Returns an SVG markup string for the contrast filter + ** + - amount (number) amount of filter (`0..1`) + = (string) filter representation + \*/ + Snap.filter.contrast = function (amount) { + if (amount == null) { + amount = 1; + } + return Snap.format('', { + amount: amount, + amount2: .5 - amount / 2 + }); + }; + Snap.filter.contrast.toString = function () { + return this(); + }; +}); + +// Copyright (c) 2014 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var box = Snap._.box, + is = Snap.is, + firstLetter = /^[^a-z]*([tbmlrc])/i, + toString = function () { + return "T" + this.dx + "," + this.dy; + }; + /*\ + * Element.getAlign + [ method ] + ** + * Returns shift needed to align the element relatively to given element. + * If no elements specified, parent `` container will be used. + - el (object) @optional alignment element + - way (string) one of six values: `"top"`, `"middle"`, `"bottom"`, `"left"`, `"center"`, `"right"` + = (object|string) Object in format `{dx: , dy: }` also has a string representation as a transformation string + > Usage + | el.transform(el.getAlign(el2, "top")); + * or + | var dy = el.getAlign(el2, "top").dy; + \*/ + Element.prototype.getAlign = function (el, way) { + if (way == null && is(el, "string")) { + way = el; + el = null; + } + el = el || this.paper; + var bx = el.getBBox ? el.getBBox() : box(el), + bb = this.getBBox(), + out = {}; + way = way && way.match(firstLetter); + way = way ? way[1].toLowerCase() : "c"; + switch (way) { + case "t": + out.dx = 0; + out.dy = bx.y - bb.y; + break; + case "b": + out.dx = 0; + out.dy = bx.y2 - bb.y2; + break; + case "m": + out.dx = 0; + out.dy = bx.cy - bb.cy; + break; + case "l": + out.dx = bx.x - bb.x; + out.dy = 0; + break; + case "r": + out.dx = bx.x2 - bb.x2; + out.dy = 0; + break; + default: + out.dx = bx.cx - bb.cx; + out.dy = 0; + break; + } + out.toString = toString; + return out; + }; + /*\ + * Element.align + [ method ] + ** + * Aligns the element relatively to given one via transformation. + * If no elements specified, parent `` container will be used. + - el (object) @optional alignment element + - way (string) one of six values: `"top"`, `"middle"`, `"bottom"`, `"left"`, `"center"`, `"right"` + = (object) this element + > Usage + | el.align(el2, "top"); + * or + | el.align("middle"); + \*/ + Element.prototype.align = function (el, way) { + return this.transform("..." + this.getAlign(el, way)); + }; +}); + +return Snap; +})); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/dr.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/dr.css new file mode 100644 index 0000000..e85f5a8 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/dr.css @@ -0,0 +1,144 @@ +#content section.code { + display: block; + font-weight: 400; + background: #181818; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; +} +#content section.code pre code { + font-size: 14px; +} +code { + font-family: source-code-pro, Menlo, "Arial Unicode MS", sans-serif; +} +a.dr-hash, +a.dr-sourceline { + -webkit-transition: opacity 0.2s linear; + color: #333; + font-family: Menlo, "Arial Unicode MS", sans-serif; + margin: 0 0 0 .3em; + opacity: 0; + text-decoration: none; +} +h2:hover a.dr-hash, +h3:hover a.dr-hash, +h4:hover a.dr-hash, +h5:hover a.dr-hash, +h2:hover a.dr-sourceline, +h3:hover a.dr-sourceline, +h4:hover a.dr-sourceline, +h5:hover a.dr-sourceline { + opacity: 1; +} +.dr-param { + float: left; + min-width: 8em; +} +.dr-type { + float: left; +} +.dr-title { + float: left; + margin: 0 8px 0 0; +} +.dr-type em, +.dr-returns em, +.dr-property em { + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + background: #ccc; + border-radius: 5px; + float: left; + font-size: .75em; + font-style: normal; + font-weight: 700; + margin: 0 8px 0 0; + min-width: 80px; + padding: 2px 5px; + text-align: center; +} +.dr-type em.amp, +.dr-returns em.amp, +.dr-property em.amp { + float: none; + background: none; + font-size: 1em; + font-weight: 400; + font-style: italic; + margin: 0; + padding: 0; + min-width: 0; +} +.dr-property em.dr-type { + margin: 4px 16px 0 0; +} +em.dr-type-string { + background: #e1edb1; + color: #3d4c00; +} +em.dr-type-object { + background: #edb1b1; + color: #4c0000; +} +em.dr-type-function { + background: #cfb1ed; + color: #26004c; +} +em.dr-type-number { + background: #b1c9ed; + color: #001e4c; +} +em.dr-type-boolean { + background: #b1edc9; + color: #004c1e; +} +em.dr-type-array { + background: #edd5b1; + color: #4c2d00; +} +.dr-optional { + display: none; +} +ol.dr-json { + background: #ddd; + list-style: none; + margin: 0 -30px; + padding: 16px 30px; + line-height: 1.5; +} +ol.dr-json .dr-json-key { + float: left; + min-width: 50px; + margin-right: 16px; +} +ol.dr-json .dr-json-description { + display: table; +} +ol.dr-json ol.dr-json { + margin: 0; + padding: 0 0 0 50px; +} +#pageNav li.dr-lvl1 a { + padding-left: 1em; +} +#pageNav li.dr-lvl2 a { + padding-left: 2em; +} +#pageNav li.dr-lvl3 a { + padding-left: 3em; +} +#pageNav li.dr-lvl4 a { + padding-left: 4em; +} +#pageNav li.dr-lvl5 a { + padding-left: 5em; +} +#pageNav li.dr-lvl6 a { + padding-left: 6em; +} +#pageNav ol { + list-style: none; + margin: 0; + padding: 0; +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/main.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/main.css new file mode 100644 index 0000000..2d0bda3 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/main.css @@ -0,0 +1,508 @@ +html,body{ + margin:0; + padding:0; + height: 100%; +} +body { + font-family: source-sans-pro, sans-serif; + position: relative; + -webkit-font-smoothing: antialiased; +} +body.light { + background: #F4F4F4; +} +body.dark { + color: #F0F1F1; + background: #4A4D4E; +} +body.light { + color: #181919; +} + +h1 { + font-weight: 600; +} +#wrapper { + width: 100%; + overflow-x: hidden; + background: inherit; + position: relative; +} +#site { + width: 100%; + position: relative; + z-index: 10; + background: inherit; + left: 0; + transition: all 0.2s ease-out; + -webkit-transition: all 0.2s ease-out; + transform: translate3d(0, 0, 0); + -webkit-transform: translate3d(0, 0, 0); +} +#site:before{ + position: absolute; + content: ''; + left: -4px; + height: 100%; + width: 4px; + background: #3B3E3E; +} +#site.open { + transform: translate3d(250px, 0, 0); + -webkit-transform: translate3d(250px, 0, 0); +} +pre { + font-family: source-code-pro, sans-serif; + font-size: 12px; +} +/* Main Header */ +#main-header { + color: #373435; + background: #fff; + height: 98px; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 10px 20px; + position: relative; +} +#main-header hgroup { + text-align: center; +} +#main-header hgroup h1 { + font-size: 40px; + margin: 5px 0 0; + letter-spacing: -.065em; + line-height: 1.1em; +} +#main-header hgroup a { + color: #464646; + text-decoration: none; +} +#main-header hgroup a:hover { + color: #000; +} +#main-header hgroup p { + font-size: 13px; + color: #999; + margin: 0; +} +#main-header nav { + display: none; +} +#slide-menu-button { + position: absolute; + top: 20px; + left: 20px; + display: inline-block; + vertical-align: top; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-background-clip: padding; + -moz-background-clip: padding; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + padding: 0 0.5rem; + line-height: 2rem; + letter-spacing: 1px; + color: #454545; + text-shadow: 0 1px #fff; + vertical-align: baseline; + -webkit-box-shadow: inset 0 1px #fff; + box-shadow: inset 0 1px #fff; + -webkit-border-radius: 3px; + border-radius: 3px; + width: 2.6rem; + height: 2.6rem; + line-height: 2.6rem; + border: 1px solid transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +#slide-menu:disabled, +#slide-menu.is-disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} +#slide-menu-button:active, +#slide-menu-button.is-active { + color: #454545; + text-shadow: 0 1px #fff; + background-color: #d3d7d7; + border: 1px solid #a5a8a8; + -webkit-box-shadow: inset 0 1px rgba(0,0,0,0.12); + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} +#slide-menu-button span { + background-repeat: no-repeat; + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCIgWw0KCTwhRU5USVRZIG5zX2V4dGVuZCAiaHR0cDovL25zLmFkb2JlLmNvbS9FeHRlbnNpYmlsaXR5LzEuMC8iPg0KCTwhRU5USVRZIG5zX2FpICJodHRwOi8vbnMuYWRvYmUuY29tL0Fkb2JlSWxsdXN0cmF0b3IvMTAuMC8iPg0KCTwhRU5USVRZIG5zX2dyYXBocyAiaHR0cDovL25zLmFkb2JlLmNvbS9HcmFwaHMvMS4wLyI+DQoJPCFFTlRJVFkgbnNfdmFycyAiaHR0cDovL25zLmFkb2JlLmNvbS9WYXJpYWJsZXMvMS4wLyI+DQoJPCFFTlRJVFkgbnNfaW1yZXAgImh0dHA6Ly9ucy5hZG9iZS5jb20vSW1hZ2VSZXBsYWNlbWVudC8xLjAvIj4NCgk8IUVOVElUWSBuc19zZncgImh0dHA6Ly9ucy5hZG9iZS5jb20vU2F2ZUZvcldlYi8xLjAvIj4NCgk8IUVOVElUWSBuc19jdXN0b20gImh0dHA6Ly9ucy5hZG9iZS5jb20vR2VuZXJpY0N1c3RvbU5hbWVzcGFjZS8xLjAvIj4NCgk8IUVOVElUWSBuc19hZG9iZV94cGF0aCAiaHR0cDovL25zLmFkb2JlLmNvbS9YUGF0aC8xLjAvIj4NCl0+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zOng9IiZuc19leHRlbmQ7IiB4bWxuczppPSImbnNfYWk7IiB4bWxuczpncmFwaD0iJm5zX2dyYXBoczsiDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDAgNDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDQwIDQwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzd2l0Y2g+DQoJPGZvcmVpZ25PYmplY3QgcmVxdWlyZWRFeHRlbnNpb25zPSImbnNfYWk7IiB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4NCgkJPGk6cGdmUmVmICB4bGluazpocmVmPSIjYWRvYmVfaWxsdXN0cmF0b3JfcGdmIj4NCgkJPC9pOnBnZlJlZj4NCgk8L2ZvcmVpZ25PYmplY3Q+DQoJPGcgaTpleHRyYW5lb3VzPSJzZWxmIj4NCgkJPGcgb3BhY2l0eT0iMC43Ij4NCgkJCTxnIG9wYWNpdHk9IjAuNzUiPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMzksMTF2LTFjMC0xLjQ3LTAuNDgtMi0yLTJIM2MtMS41MywwLTIsMC41Mi0yLDJ2MQ0KCQkJCQljMCwxLjU1LDAuNTIsMiwyLDJoMzRDMzguNSwxMywzOSwxMi41MiwzOSwxMXoiLz4NCgkJCTwvZz4NCgkJCTxnPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzksMTBWOWMwLTEuNDctMC40OC0yLTItMkgzQzEuNDcsNywxLDcuNTIsMSw5djFjMCwxLjU1LDAuNTIsMiwyLDJoMzQNCgkJCQkJQzM4LjUsMTIsMzksMTEuNTIsMzksMTB6Ii8+DQoJCQk8L2c+DQoJCTwvZz4NCgkJPGcgb3BhY2l0eT0iMC43Ij4NCgkJCTxnIG9wYWNpdHk9IjAuNzUiPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMzksMjJ2LTFjMC0xLjQ3LTAuNDgtMi0yLTJIM2MtMS41MywwLTIsMC41Mi0yLDJ2MQ0KCQkJCQljMCwxLjU1LDAuNTIsMiwyLDJoMzRDMzguNSwyNCwzOSwyMy41MiwzOSwyMnoiLz4NCgkJCTwvZz4NCgkJCTxnPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzksMjF2LTFjMC0xLjQ3LTAuNDgtMi0yLTJIM2MtMS41MywwLTIsMC41Mi0yLDJ2MWMwLDEuNTUsMC41MiwyLDIsMmgzNA0KCQkJCQlDMzguNSwyMywzOSwyMi41MiwzOSwyMXoiLz4NCgkJCTwvZz4NCgkJPC9nPg0KCQk8ZyBvcGFjaXR5PSIwLjciPg0KCQkJPGcgb3BhY2l0eT0iMC43NSI+DQoJCQkJPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zOSwzM3YtMWMwLTEuNDcxLTAuNDgtMi0yLTJIM2MtMS41MywwLTIsMC41Mi0yLDJ2MQ0KCQkJCQljMCwxLjU1LDAuNTIsMiwyLDJoMzRDMzguNSwzNSwzOSwzNC41MiwzOSwzM3oiLz4NCgkJCTwvZz4NCgkJCTxnPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzksMzJ2LTFjMC0xLjQ3MS0wLjQ4LTItMi0ySDNjLTEuNTMsMC0yLDAuNTItMiwydjFjMCwxLjU1LDAuNTIsMiwyLDJoMzQNCgkJCQkJQzM4LjUsMzQsMzksMzMuNTIsMzksMzJ6Ii8+DQoJCQk8L2c+DQoJCTwvZz4NCgk8L2c+DQo8L3N3aXRjaD4NCjxpOnBnZiAgaWQ9ImFkb2JlX2lsbHVzdHJhdG9yX3BnZiI+DQoJPCFbQ0RBVEFbDQoJZUp6c3ZlbVNKTG1SSnZnRTlnNitQMXFFSEprS0dnQ0RBY1lkV1pId09IbzRRM2FYa094anBXV2tKSmtWVGVaMEhpVlpXZVJ5bjM3MQorMVFWZ0xsN1pFVWVSVksySzFDVkVhNE9nNW5oVU9qeHFlTHYvbzh2Zi9QRjlkZHZmdmZ3UmJxYUQ5UGYvZDNOMjRkbjc5NjgvZm1CCjFNTXZYcjc4N3R0M2IwSDZ5YTkvZWdqcjFTeVZybjlSdjdLSy8venc5dHNYYjE3L25GOWRKZm55SGxmLzVCZmZQdnZkdzh1WEQ0ZGYKUG52OTlicy9QSHY1OFBhbmg1LzhWTDcvN1l0M0x4K2t4aCtldmZyZGQyOS8vL0QyNnRzLy92Nm5mbXRwNi9iWk8vbCsrVm44V1VpSAorUE01SHI3OEZiNSs5dnFQejc3OTlzWC8rNENicFlwN0hkOTg5L3JyRjY5L2Yzenovd2p4OEVYS2g3UWR2aWp5MVg5LzhldUhiOS96Ci9lMmI1OSs5ZW5qOTdzdTNiNTQvZlB2dHpadVhiOTUrKy9QRHpaK2Z2VDc4NnRudjVadG5oLzliM3VETm53N0hsOCtlLzhja2I1Mi8KdW4veDhrRmU4Tld6ZDRjUTBSZlh2d2p4cStOM0wxNSsvUS9mdmZyZGc3ejZ1cEdjdm1LVC8vU3R0Q1hONG0rUXkxZS9lQ1dVM3p5OApleWZQSlRkRWYvNzY3NC9qWXdpUjVTZi85dXVIMzc5ZzkwdTMvSytmV3JOdjMzeno2dG5iLzhDMWh5K1crU0QvMlIxLysvRHFtNWZTCmUzemRPRi9sd3hmOHQvOXA5ZVF0V09lTHVGYnBsYkllMGx3UEtWZjl2dmZOd3g5ZlBQenA1NGQvZVBQNlFUdmcrdTI3MytnUUxNczgKNjcvNnphKy9rekgrcDljdjNzbURyU0J0MmdPL2V2UDF3MHVwMzY2L2YvbU1MODRTK3I5YTRiZlBaRTY4azdGNzgvSzdkNXhaMWU4ZwpQZnpMWjM5K3dEQUZ2Y0UvZnZQdytyZHYvcG5QK0VVTTBrN2NyclpEWE9TTlF0eVdRNmhzUCtKUnQ3bmRNL1IvdFdrMGhHYThmY3lRCkwyV2Mvdkh0aTkrL2VQM3pMMUtWdms1eDFpSDgrN2N2dnU0akdBN1YvcGZHcitydy8rYi82OVBLaTc5NzkvRGFubDdtemMydmhua3cKWC8zcU4zTFh1OWRmMzd4NWhkNy9GaE5jSnNCcm1Sc3YzL3hldjJ0Lzh4dTUvTHR2OUEzNCtTc1pxQy9mdm5pTk5xZC80RGYxcXk5ZgpmaWRmL2YzYk45OTk4NHZYLy81bStva3U3WDkrZUM3clY4Ynk2OE0vL3U1L3l3ZFpuNXliaDkrK2ZmWmNHcERQcmM3VnN4ZmYvUFM5Cnpjbkx2WDA0NkpkeUpULzY3KysvK3ZiaDMyVlY5Y3VWZXZmNmp3OHYzM3d6Tk5zb3dsVU8vL0xzN1RmZjMvU1hMNSs5ZnZiMlFIcHIKK1pjdi9pamZQSk9lNm0xMzJoTWFsVm55alhRT0wyR1ZreHU4cDhMdzFSTnU5T3pkSDRRQlBieisrdHZXdG43Y1A3alN2cis5M3p6SApISHg3T0w3OTd0cy9ISDc3NXMzTDF1eitxOWE2a1VsRi9iK05lM3pKQzE3LzQydnRvUE03V1lYVE93bi8rWnU3aTlSKy9BN3k1ZDl5CjZ6ZlBYcjU4OGZ1M3o3NzV3NHZubDI1dzRmdDJKLzN1UXliV24xLzk3czNMRjkrKzZ2TnBvSHo1N08yN0Y4OWZQdnptejkrK2UzajEKNU1FOTNIMzlRcGpjSTh2NHZYVis4NmRuNzU3LzRaY3ZmdmYyMmRzWEQrOWRmUmlBZjMveCttdVorNy81N3NXN2g5NUJiMTU5QXlubAo4SnMvUFB2bWdhL3g3Zy8zclBtYjFtRCtTbGoveU55LytPSTlYRCtzaCtQcjRmdS9mL3ZzNnhleW9ZalE5ZmR2WG43OThQcndhN0QzCmFmZEp0cTl5T0g0OS9kczBXd2tzeStIdnZqcStuZjdiTkovK2hKTVNoNUtzTEZZeS8vZXk0djlKZm8ybHRGTG5iVmV1aDNLVWNtUGwKZGloMzgvMDAzM3ZaUGRqNEU0ZVNockxzU3RZeThWY0pxNVRDMzNVbzI2NWNoMk1yTjYwY3c2MFUvM1E3eVljN2ttN0QvVmpHcnVQRAorVThheWpLVUhGZVVTWC9GTXBRYU55bjY3L1ZRamxxbS8rdlNXRDQybW1rM25zc3dxbjFzcFV4dGVKZGhrSFZVeDlHdFV2QWJvMXAzCjQ3c05JeXovVGpiVVB0akhOc3o2RzZOOE40NjIvS3MvODhXeGp0TnVvSk9NSzM1alpESEdLMHZsS0plVEViNjJzaDliR1V2OHVtTzUKUFJsRnYybmlHUFl4UTlGQjhpSGJiTEJrZ0NZYkk0elZqWlZibGpzcjl5aStzdkF5NDFnR2p0SmlIVi9ab1VjdWtudjJUZVRMcjN5OQpqYTl5eXljTzlvUXJwNHc4d3NUNzRqNHhwYlNrTlJWUnRyWjBsSEtiN21XMHc1S1daY2xMV2VxeUxkZkxjYmxkN3BaNzZjaVlVMTd5Cm1rdmU4blUrNXB0OGwrOG5lYUFnczNSWjg3cXVkZDNXNi9XNDNxeTM2NzNNaFNEZHNKUmMxbExMVm83bHB0eVdlNWtub2NhNjFGelgKV3VwV3IrdXgzdGE3ZWkvekpVNWIycFpOMnRucXRtM0g3V2E3Mis1bDBvVHJkTDFjNSt2MXVsNXYxOWZYUnlrMzE3ZlhkNXhKVVY1ZwpPZVpqT2RiakpsOGRqemZIdStPOXpLNHdzYmZUelhLVGIrUUJicmFiNjV2anpjM043YzI5VExiQVVWaHU4KzE2S3c5M1cyKzMyK1B0CnplM2Q3ZjNkTE9PUzdwYTc5YTdjMWJ2dFR1NTFkM04zTzkzZDNkMWpSdHhMaDkzbmUzblRlM24yKzJzcGNzdDd1ZkwrNUVmR2NwYlIKYkovdmhuSTdsSnVoSEhmbGVpaWJsMG4rcVVNcFExbDNKUTlsR1VvYWlrekE2VDYyTXJLd3puem44ZEh2eHAvYlhiblJNdkhYY1NqWApROWwycFE2bERHVWRTcDd1Y2l2THJxU2h4S0dFb2N4ajBTNmZyTy9IcHg5L2JvWnkxTUtWdVJ2SC9lanR4OHhIYXo5RSsyR1JvWmlHCjBkZ1B3YjdqOTkxdDNYelN0K3pQcVhYcHZpUDN2YmZ2c1pOKzJuZk5kTklqMmh2WFZqYVdhcVZZV1ZteWxZVWxXWWtUMTU1dG1jcjYKMi9UM045TjcrYytSNWRyS3hsS3R5TnFlNUovVlNyYXlzQ1FyeW5xZDBRc0g5Ykc4NC9nZE9WNlY0NU01SUJpRW1kMSt5MjYrWnE4Vwo5dVBDZmd2c3B6dDJ6SkVkVVNlK2VlYTc0Z1ZudnRBdFgrQ2FqMXo0aEF1ZlNKNURac3VkZE9hTjhLMXI0VjlWK05ncTNHd1JyaGFGCm04K1RUS1E3NmVVYllYclh3djdxZFJGR21JVWhKdGxSZ3V5dzl6TGl0OUlkeCsxYTJHYmRpakRRTEl3MHlSWVVaRCsrbDRsd0s5MTAKRkc2NzFUb0o0MTJGQVM4MUNTc09zbkhmeXd5NWxUNDhsbXRoMWJVVVlkcFptSGNTRmg1a283K1h1WE1ySFhzVUJyOEpveS9DN3JPdwovU1RNUDZ6ekpOUDRUc2I0UmphR2E5a2dxbXdUYTg2eVlTVFpPSUxJRHZjeTNXNWxMSTZ5cVd5eXVaUmxsVzFta2UwbXlxWXp5N3kvCmsxbHhJeHZSdFd4SWRaS2RhVTFaOXFna2UxVVFXZVZlWnVpdERCOTJVV3lyMkdpemJHN1lpRU9jQTdoc0UyaXRGdXA1TGRhVEJhV2IKT3VRMzdQd2JKUU9WRkVSMjRIeDQ1SFpzaGczNDVmMWlpQjJ4TTRiN2dkVXJTOWhrVW1XWlVFRW0wNldwRkcyUDRPNkRIOTJCQXRjbApkcUhNMWVzN2tlMUYySXBrdHhFaGdQZkdmdGMydTFWbVdiMnczYVcyM1dHenU4WU5lWEdUR0pMSm9NV2xCZ29OZHhRYmdna091WWtPCjEyTzNveGNncDgzMzJxUjhvREIzeTQ5WUxicFdmRU5zdXlpLzU1dnpyWFVZcmltVjNLWGR5RklrREUzb1VRbFBCUitWNUc0b2lOOUoKMDhHRWJIMGRsNXBOU3FaYXdhYThvZDRNRzJGdjZNVVhlMElmZVJ3b0hhU2RzRUJKSWNuSUY1a0JSODZGRStuQXV5TGJCdUFjWitRNQpmYXAwdmpOeUh2SWU3ZUlMN0dqUGpiNlBGMm5YbjZ6R1QxNk14eWIrZXVtS1ROMnBPTVhVSGkxNXB4bVp0alRaSC82akF2bE9SOTJyCllMN0hOQVd0U2Zvc3gybW4yTjFRZ25hbEFMKzNrMUpQU2xjaTlhOTFjald6bGVXc3BMTVNMeFQ3bVhhYTdwbENoeFUzQ21udDkrM0YKSW54aWFwcjJqU2xqUjlYT0xwYnQwVkpkNzVzR0pWL0wrc1RTVmNvOGxtbi9zUmtiK3QvbkpUMVNPQ21tT1Q2eFhPcmdDMlY2WXNVbgovMXpTM1QvcDU3TTE2UHRpYUQycU1xcUwyYmRXVk1KeW80UWJLYXJwd203RXNKVSttZHJzeTl2TkluMzZuNjVtbDFCOTlZNEw5cWpyCjJGWDY4OVZhbWdsZ3RaS2JnYURiaHRLNFFLZnZYNW55VnpOTGRQUFV5WEwwQlhrN0RVYXQwY2gxdkxnY2p6dlQyUG1DTkdQSzZmcXMKT3l0YnQ4NjRoZWJTRW0yZnA3T1ZlYm9JenhmbGU4dDBaakM4dEZMZnQzNVBsdWMwMkNBL2VRMi9ieDMvOVpmZFoyL3drb2c2YWovbgorby9LSStmNmowc2hNM1RvTzBvYm0ybCtxOGtic1drLzk0UEVVWFlTUnh3MG9CdlJnYWdCVGFJQ1FRbFNGUWhLMEV3TlNIV2dHeHAvClZBK3FUUTlLcGdkQkU3b1JMZWhJUGFqU2xMUk1WSVVDRjhjOXRlSmIzRUd1cjZJSnFTNEViU2lxTmtSOTZOYjBvU1Axb1VwOUNCb1IKT0ZlWVRDbTZwNFlMdFVnVkk2aEdsYW9SbEtPRnlsSGdVcnFuaG5SRERRazZFclNrSW5kRlZWR0VKbEdVRXRsaG9Hbm1qdXJTcmFoTApVSmlnTWtGcGd0cFVsa3pGQ2FwVElxZWFxVDdkbTJKOTFES0ozQWJKRGJKYm9meTJvbjdDVDZEODFMazRaRm9kaXk2bHFXUldxVUNoCkxGUGoxR2RTMXlCanVTVlZmNDhNZUJTUktBOU5neEMwWTZwbmpITW51ZXg0NUk0alRqdVpCT1dFdDExa2ErK1JJTTRsaHFleGlVZloKeCtkY3g2WXRhaG5OVk9QUDNpdzNtQnIzdGpEZlZ5ZjdJKzVLMnBXOTJTMmZsSFZYeXJRejVaV2RrYTlTVWRxWDY1TnlQQzFUczNsNQp1VDByNXovMzU4WG4yRFR1MVBmaFFva1hTN3BZekpKM1h2SWpaWDIwTkZ2dXREUHNGcHFiMzFlMjd5blgwODZjZkxrY24xakkzS2VkCjVmcDk1ZlpwWmJwQXZEU0lUeTdUbzE5OTVNLzVKdnF4RFpuaFptN3FaelNQaFpiRmlwb3ozYnhackxqMWM3Tml0dEhKVEtYKzQ3eWgKTHhzZkQrZXNyaUs3Sk85V1dyWFpMaE9OUmxyV1Z0ek1XMXZackZ5M2NyekFvK1JuT21OUWwxaFROOTFmNWtZREg1b2VZVUtQY1ovSAp1TTdBYVk2MDRUek9hOTdEWTNaTXhSakw5RjZlY29HVGZCOExtZDdQTjU3QU1rNVl3elJ5aVk5bURjTjZmNHd4UEpFTm5LLzh4OWZ4Cis4dGZhQjEva0ExMVowVVZrZTFHaloxMHdrTE9Tc3N5aWFTM0RyN1lvM0FDOWNmTzVwR0ZUemJUSzF0Rm9IVFA3QzE4czdLNXFITTIKVVJTRmc3Wk1sRS9kU3dzLzdSMDl0ZXFyVFpBdTZhL0ZEM3kyMXhTQTRiZkZBbExmTGJ5M0VDenB3WjNveEsyUXRPbklQUW8zdW0zdQozRm5FUDBpUzhPa3U4bmlRa0F2RjhrMUU5R3Y2ZDIrRVg5eVpsM2UrRHBQSThaSHlQTnk5Y1BpdTE0V1Mvalk0ZnVuNmxZTHBDRUV3CjBNQ1k2QWFHSXhnQ2VhRTd1RTdIalQ1aDlRcmZrQmRoYWQvVFB6dzNsdXZNMXRtc3M5Zk9WbzJqVG8yVmRoYnFyTE16emM0ck80L3MKdkhIa2lMZFQ0NE1qLyt0OGI4L3JSaFkzc3JXQm1VMERIOXV6cmhObWRVSHlPZWRIZzB4eldXNTVqTXVjaUIxam1kN0hOYjZYVFR4eApnLy9ZZFd5RzYzK2JSbEJ4T0VUNWF6M1UrV3FSNVhJbzZVb1dTRVRWMzB4Lzk5VlRxaDYvUFcveEtrdkZQQjlxdUJJOWNIMjB1ZE42CmFPc3FyR1ZiZ253Wm9OMUdSeW5uV3VNaWY1UWM3ZXNZOHJvZFVFRWJpVmRwemt1NzJTYzN4S2VaUlRQTnE5U2FaWkd2dUU2VWExRysKMmRhMjVIa2pkbHFZNHBMbGo0amZZV2dyWGMzQ1Z2cERmYWIyOU5uV1dSZ3Eyc3Boem9YWFZXSEUycGFvaUZYYmo4SlIwWmFNVzk1MgpiZVY1M29abit6enRmZndveG5KVlU5clFVczFsKzhTaFBHM3R3a3kxSjkrMksrSG5qMDNUZlNWcDVYamJJSTZPVkx3TVh2ekh0OC8vCjhPTHJuMDcrQjREOURiSjR0YTVCOWttTVk0cWxyQVF3eXVKaTkrSnJqUHh1MmRvVkI3OUM0eERzaW9OZFljdFVIbGlVOWVHVlB1SmkKN2JDblhvaHVXdGFybERDOVArTEcrK3MvcEp0Lzh4OS9sajdHdjNMaG9oMzgzM3ovdWJkZEo5cCtrODJmV1d4M3ViWU41WFowUE50bQpzUmdXU25ZRFNrS3lGd1REZVMwVUVZRDBPbEkwdUtkVlNFV0NsY0xBTmNXQU8rNFNBSHBoMzljOS81cld2dHRUWUtPQ0dOMGpwUFp0Ck5aTmpMNTROQUtvdVhVZHcwaXZjUUhINU1hemtwWi9IMGJDajhUcWJVWVpXUWtWT0VEdlIwQk9uaHNKaUtBckZVUT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJR0pLQ3BzSTdBMVBjWkhYcnZoOGVNcUJEbm9RTkdYMnpUUkFLQmgwWXdRTWRQbkNqMHM0QUlWaWFkTE01ak9CV3h3bGlyQ0VKSWIxVwpSeEZTWmxVTVlhV2NDdmtVMG1tV2ZvQkllaU9UYmFZWW1nMHdlRnZVUDQ1dU5keEZSMTdzZ0J0bU81eWIxL09HMWtFMUJ4WXoreTNtCk1RaG1DSDh5WU9aSmFCa0ZCSFR6dHpyY28yS2JETk4wMjNCTTE0WmVjbk40TnBpU3dwTm1Da1YzT3kvNkFCUnRVRkUxbjZvL1BEV3QKSWxPeldLbGRGR29ZbGRiZ2Erb1pSeG9XYmllS2xmZFVPTHJLb2VoUGpKdnFIYXA1ZE4yRDJvZmhRUlVSQ3YwREdzZzZVUW1wVkVKYwpEYm5kcVNJbnlvanBJaGg2UjQxU0gzR05aRHBSU1RBbk5nT1MzbENxdm10dzBraUZ4RUdsbzBaeVE0M2tEZ0xwWkFwSkdoU1NZc3JJCmtjcklMWlVSQlp4MlBXUVo5QkRvSUUwTG1Xamo2R3JJdVNLU1RSR2hLdEwwa0NOMUVXb2l5b2NNY0dmNDV3R2tTRS9oK2Q5MzdlODkKMWF6bWs4R281WVA1SXUrNlY5TC9Hbjgza1BVSXFsZUR2RUdzUTdQUXA0YXc3Ny9UN3ZkaTdOZmgyTG5oN3RYNEwxeHgyaUh2SFg5Zgo3Ri8xR3VpLzZzenQvMTd2ZkF5M0J0VTIvRDJCUDNBVUQxanRqdFJPNXNKWURhdTltaTlhUFIwZFZFOC95RFRncy91UzYwc3RFUkJ6CnVzdzRZd2lja2RYLy9qMW05QkdjK2dzZTh5Nll0M0owTVlUbWxoZ2RGT2NPMFhPZjZ1SmVqbE5IN1BtbjhmZnAzeU10ZThSQUR3MVoKSHNWdVBJN3NTTHUvMHpSOFdFNWNOcU1qNTdMUHVuL2ZQTmpUbWE5SCs2NjdsSHV2OWg3dWc5QTlNRHRrNnZFQ01yVVlLTFhEVVIySQphaEJVNWZUYzRXV1BuOGdicnJuUjYxWmZhTXpJNUNmSnRuemQ5UGN1MGV2bUVpMWtWdVlXblNnRmROL29MUjlPdHozZCtIenJhNXRmCjIvNThBeVJtbEp1Z2JJT1Q3WVBqVGpqdWhTTjJkSThlM2VOSEc0SjBVc0hIUEtTbkdOTEhVS1R2d1pGT0EzVHRvOEJyUWJueU9WcDgKS044UEdPK1diN09GVHcwbmZZNlVMczJvdmtkTEQzaHBLd05jZWpwRFROL3VFTk9QejhwcS9vTjFQemVuQVMwOVlxWG5ObEh2emE2awpiNmJ0SDl1YzFWbTdjYS9qM0oxcytxN2NDdnNrVGdZSlZGNnVybHlmMEhmV1hUZURyMThudDVUSlpuaXhXYjVTV2FDSW9xeVhIRnczCkN2VUw2N1MvNDlUbjVGY014Q1VuM1dsSXhHbTU3QW1NcDhiOXM2Q0ppOEVUZXp6L1dTREZkQjVOY1FMM3Z4eFVjUjVZWVhFQTA4WG8KaW5MaXNWMVAvTG1QQjFtazZkRTRpL0NlbGZQWXVwR1ZNMTFjUE1mQm1kVFh6N2lHaHBXMHM5NWRiU0prcGt6RkdlSTdyQjdDS0NwMAo2amtJczhxMGpZZ1dYVmVvMTNtTElaZWRHVU5xZHhQZjUycVBWcCs2cmx1Z2RyK0pJRnpOa0NJZm02VkdMVnpkWnJSZWlmeFUrOU44CmRBdThmMW1Tc0Q3WXBsSVIxbS9YaGxCRTdzY2I0aSs4YWwyRVp3NHZrVmU1TkhSRDVTYzNwRGF3T3FmRWZzeHBxelQ2eVQ1YlUwKzcKVUhBOWpHdmF1OWJNZHBYelBCcFJQcjJsRHpLbmZQZnExY05iV0ZUMER4ckJ6R28xU0g0dWtJMVMxUmhHV1Jwa3o3Rit4eFlFZStlaQp1NEtBSWRHNmVKMmJERjJhcE53akdUMFVkUlNGZTlncDFiMXBpRnFzRGFYWkEwb1YwYW40enNkMXpreXRrNEx3TkVqQ3FuSnVnMFI4CnRLM3N6alZQMFQySlhqSUFLTnVoOW9rTm5YcmlSTUJUSWZ4SkZWRlhSbysrUHhwdmNnK0ZDbnZSY05lbURHZHJOZWVKMmlxaFhMUkQKVkZOWnRkZ3U1Y0ZEdVczR3piUHNJS0tHSVowYVdEMjFrbHZwUDZXVjJzcDFLOGRlcHZWbUtOM2J2bmU1akRET3NDdHBLT3k3cVN5dAo1RjA1LzZrblpidFFycWR5ZlZadUhpbTM3eW5OYlRSZDlsbFR1Zi9Rd29rODFmZzV5bmtNYm8vQ0xTME85OWhYYWRqSGsxUXV5bU9QCkpzWlNuRXdkM2NXa2NKbmREL3BsZHcxdkZnZHpPMWhxRmw4ZnNNOU10aVp1NkIyY1c3QnV0bkRkU25QYnRVM25POXBpTUlFVHpZN1oKNWlZc01VZk94RnZNUUhjTFI4Nmo3aEsrcGt2WXhvOVl5VUJ0SU5FKzVyYVhTbU12YkM4UU9HaDNtYzN1a21sMVVSZncxaHpBdDJiOQpCUU9NRk9LNjFRWGkzdGJzTHZUOVR0L2ovdTBPNEcyd3Vkd3dLaGdHenp2REVUYmY3M1RpL0YwcEczZUVqVHVCVmVMdFVKb09vZW5nCkdZN1ZkT0lFWG5kUW1lME1LTE56Q0EvSW1JYUpVVzFrRDRKeHNld1U2M0tPY1RuSDA5MU1GMUF0RjlFc285eDZqbXJwWmJvZ0dWOUUKeUQwQklMZGNSdEk5aHFKN2I2R21Ic2FZWFkvVzlTaGRqOC90c2JuK0RGM3FONUYrRU5vcG91K2piM3NjczB2V1hZcnVnYlpOUUI0RQo0bHNGUmUwRGE3dVlleDVPMjFYREU3VncxQWVuQytyZ1pSUEZtU3A0b2dlYUpqaGRVQVgzeXVCZUhkd3JoTlZNb2FWdGRubHFhbUZYCkRWMDVqQzN0eGp5b2lQZURvbmpYRklNV0ZUejVqYS83ejlaS2JhWHZYWDBienEwc3ZVeW1WM2J0TWc0NlpoaDF6VUhqN0dYVXhEaWUKMDZERDNPeks4YXhjbjVSTFAzVWlPOTJYaXpzM1RUMlBseVlHVGYzUGs3SjhjT0VPTm0zcGM1UVBqOVorZjd3MlF5U25reGpKODVqdApmYVRrUG01N2pOdzI1OXpVREhhanNlN09wbWszMU8zTWRPcXJhOTQ2OTlkZCsvZ1dHeC90MEhnU3kzRFRQRlhiU1VSRDZyWTZzOWJkCmxkdUpLLzdJNmIrWkE2dFFPSFhYcFJydXV2Tnk3Nzdza1E2RnNtMmVMTnhCdlpoeEYvSndSMzYxRDN6WUtKU1VadURMSnA2M0dJZ0oKMWo3YSsrNXRrN3VsM2UvR09NVVlFcUZCRVNvT2VXaUVCa2VvV2tFM3hOU2lKTzVOLzFEdXFVenVTR3ZodFZrTVBYQmlESjFZVFpNdwpKU1dsaWJxUGg2U0dDN0Z4ajBYSGVaekZQaUoybTB6OTJnWUI5TEdnMkY2V1N3R3lIaVo3L25NZXgvWlkrTlFGSVB4MFJycjdtUEkrCmhCWEJLSFVIaXJqOHZRRXU4bHhGdVNQbVJnVGF6UUFUR2JhSDBLMFF6ZVp3Z3ZQNGlLcy94RHJ3VDY5ZlAzdjE4UFhoOTBZNmhKOU8KbDRnZDYzSWg0MDl1dXNhUTlTYzhIcmV1NGUvM0hyMCtHUXoxRklLNkQrTGZnMC9WQjZ6KzMrc2Q1bFRVaXFrQlRyZTllNnViT0pZegpKY2tmM0lQdSsrT2Z2c0J4MGpjd284VlRzeEc4QjBrNzlmZDUrZ01mN1lGN2pvQ3h0M2Y5UFZtSGg5M2pqcHJkWThrVExnTi8wOVM3CnZ5Y08ra0VTbEh5bTlDVFg5MU5QVC9LRFpsVDU4WUgxZ1FjYmQxcEtucEdJTmhhMU9rTVhMelREWHFuaDZjSWZGeG5pWjJoS3VLT20KM3lXbE5iMmpmUm9IbmVlTFBGVEkwblRlY2RGbzREQ3M1eHZDR3hLeEJ4dlhMVGhNSWhaZ282WHpUaGFvbWwwcWw2UkNtRFFWMnZYVQpFRXlSN0svUVZuZzdKRDl6QkpNRDZudnFzMkl3ZW9Mb0hhMHlOYmpLSHFwaVFKVWRjRDZieldRUG5COHRKM2ZiL2RUTUp3cGNpYWF2CkxHWkljU2o5YWtxUHEwRmR0L0FmVTU4bXM3VW8xdjdXZ0M1ajZRRWh1NUQxbml0eFg2YW0xZldTTHBibGtaTDNaVG9ockU4cTVmRXkKUGZwVi9iZ3lmVURsQzhyZmVabWVWdTNwNWNjR0wxUm9Vb0pMWVd2aklpcDdSVW9DWlpkck1SSmRWTGpwcXpHM0MxazFYVStheTZqSgpWOWpleCt5S2lRYmIxZUJ6RnNQVFFITWRNTmRDZDZhR2xmUEluWDNjVG1NNUFNbWRSZTRvVUc1dHhscmhQNVBOeEJ0enFONVpFTWRzCmNUekIxQk9IenVVV3orUEZiUS82Y3owWlovRis3WFlPdDM1MHcwaVBFdW1HbEhCYXBqRi8wTTRxazNiYzdyemtzMEplT0EyMm45TnkKd2NmeFNPazJwVHFOSDU1VXppdzgreko5WDRVUExVOXQ4TWsvMDlPci9xZHA4REVPQXAzaXp1RHBtVnJFdGZxR1dxNngxWlFHVDlJSwovbUVxMmdTaGhCN1QyREswUWplN2I3anF2TXZPcXE0ZWg5eU9icDZMSE1SNWlFTnRMMFQvWGVRaXprY0tzZ29xTTduZWNSSTFpSi95CmtzNVBvcGxjT2xmSlpvOHMwOEJZL0tmUDBUMWYyU0ZEVGdFd3ptR21NeWJ6R0xPSmo1UVRqak05a1FGOUh6dHFaWHJmbHg5UjNzdmoKUHFyODJPQmZvTUVQaVU1NThzLzdHdHpqaHRPWldhVHM3RGhtdzVtYVZXU1hPWEVNczZIZFJzMGdMaFc1ZTNzMTB4TUJJU29ZVFJaNwpVTGxPWUhlNmI5TFJRbHZ4Nk1xK3AzU1VMSUtra0dsQXhpZGFRckVRRTUzWGluUUFLNEhkVzEya3dBb2t1cTJ6Z1IzQVp0UWpCdGVwCnNxclVmTlpaZWRGa2JPakdRcGJnVzUzTmJhM0ZGN21QcGZNcmQwdDFNQnVWcDRrYVZOZVRSa1ZvMUc3MkNzbXAwRHI4S0lMNDlrSTUKejZhaW51RDV2U1ZPTi9ISlpYbEttWjVXN1daOWFwbWVYdlUvVFlOdTFybzlTejU3bERsYjdySXNPbVJqdmJYRVhTc1RkczFNMVhXawpqV3FsZlNwWWFxNmp6REs2dG1DVWdra0s5aWc0cytESVVpZVdnc3h2bVg1TG9lWFo4MjdSVTlYU0Q5ZmkwVlJUQTVFL0pmWHdhZkxoCmxuNjRZOGNuOHpLNWg4bTlTOGtnNUtFNWxXNEhJUG4xa0YycnU1SG9RcHJNZytUdW83M3J5QjFIM1duVVhVYWp3eWgxYjlFME9vdDIKanFKVE45R3BrK2dSLzlCMDRpQjZ6RDIwY3c2OXp6TTBQZVlZdXVRVWVvSWZpTEU1VHkwM1R5blQwNm85WW9tNlVLYW5WLzFQMCtDUApIT1JIRHZJakIvbmJYWjkvK3czK3lFRis1Q0EvY3BDLzNmWDV0OTlnOTNWZlBMbnU2VVM0eWt0Y2F0am91bDYyd29RcVdlWVlLS1ZrCmRYMkhHZEZURi83Z24rc0ZyL2xuYmRVYzZNZ3NFOUloaDZ0WmVOam9Sai81eHV2TFBlV0xOVndoYnYrUWxxczE5UHhPNzZteHY3NUkKcXptdU9GTTR4YTFjdVA2MFJydStsQXMrLzVIOGlXNy9lTm50SCtIMlQrNzJiOW5FN2s2Z3liY25FT1ZIQzNlczY5dXpjdk5oUlpzNQpoU0hqNTMwK2x6UHZrRVloZDZESmJIRHgyNFlUUHo5NnFaN0gyYmd4Y1R4R3JneWdzdkhreGZIVXhaUHlOOWRNVDJKejB6TDdkVHVYCnpRVWRpdjM0N01aV0sxeENRaGdXd3ZPNnRPTnk3SlNhZGk2UHAvRG9TV2Zxa0c3R2s4MThhb1dSa2FXMUtxY3BLZU1ZYk9FOTg4SmMKYVhVSmlYblI1cnhzYzd6d3gyWHN6K2RyVXFOTDh4d0RXeE5aU1p1Rml4eFF5em1zaTZFNkRjK1poSWZXaXV2NzQzemM5WHJ2ei9JcQpuNzF2UHBFRlhtU0E4Y094bzNlR1o3eHc0bEhEalJxTWNYTFk1ZmZoSnNzWmJ2SVMyUE1FcmFwN1AwN2JmRS9ybDkvaU1vaDA5ejZUCnY5TEhRQ2kvRjk0blBOWGpCVDUzVEFMdk1IbEV3dnRhL3dCNDRyNzlGdkd3NXlwMWdPbnRlTVBwRno4NHlpOWRtdXRwTjljTlp4WlAKTXI2T1NaWjBTN2hyYVY1N2t0YzhISSttR2M2T0U3TmtNNlJ2Q09mcnFWelhsc0wxMnVMMGRON1NQYVh4eHBFcVhxYTZWd3pLczlGWgpkYlJnNGp0enlYZFlUeHJpaE9IQXF0T3F3Y0F3NFNQbTk4N2llNVBoQ1RNZFdXTWNwbWRJd3l4djJWMU84N3VNR1Y0aW5lOHpYZktlCjVXWE04eklFa0V5UFJaQzBzekU4Z0tSNkFNbm5ndE5lWG0xUGg5T2V6TzBQelpXd1h3QWZjelgzSXJsdW5wSDlJSVdRbU5CUnJ4UnUKdGRaMXpKazUzTzVETHZxMGRWWXZMclM2U3c3Wk1xQjVEclF4RzdQRFJVMnE0dUNmWlg1MitHb0hjalFJcTE1dzExQ3Y4d0FONlpmNgp4ZkxEQzNaNUJHL01FNXk0Z0k3bSswMjJVdlFPajV4RGVUbDcwRi9pZ2k2Nm9oL0cyTWpUYkRtWDh1V0VDL2x5TEZmTzFBTE1YS1B3CkVFY1BhOVFkYTFmbEF4THFXRURqN1k3VENLK1o3TGdkanpMMFdMWFlZOVgwdnYwZStlS2Q0bnRTOTdTN2RjNDJuY1RGUlp0QWMyTncKT2o2MEpFWmhEWGM4WkdqajZVTHBHS1FQYjVrM2M1V25pSEpQbkI2MDBXeVlwSWs3Sm4vTXdnSm4yZ2MzbVZSWkpsZVllUFRQVVdaYwpFZmFkWkduZU04cnRta2Y2WURMb0FaR1hKYXNubks3NS9jRWhsaFArTkNQODhwL3d2bTA1RGFrY1cxNzVob3QzL05aajdHelAwQWg0Cm4zWnBCanEyZllTdmorRDBFV1BlY04zSzVOSU9kSHNoWC81NytPWXA1MFFXcTQ3OUg0RC9sNkgvYTN2VnNvT2RLZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJVUhISW5abDNHUno2OHozR29FOVpkTVA5NmhDTVdMd091K3Z3dXZNUWhRN05aU2JaUElLRVRuTEtFaDMweUU2UXovWUNRSC91Sm1KKwpNckUrTjhUNEpPSjZBT2U1STRSbklXQUhJQjFnY2hKeE54dmhOSURKQU4raVR6YWVmZnhwUngvclVhdlRwNXkxNmljUy8vaGtIL1ZrCmc1aTR5dFNQVlBERHZGSEJYK2Q1Z2NSM0pjc2paUVpIYVI2cjh6OTZucThxa3R1UXkvOHpONnVDNVRKSDVnVFBhd2pNUUNiZEoxMUwKcWJHbzhTUWgxWHU4OEVkcmNvMVhtNmpRdzVOKzFtYlZIUE5wOW5Gdk1seGg4LzFzWnZlVFpyVlBaeVFleFRzTFYrR0w1VENuamFNegpyMVZmbnNuOUwveHhVWkQvVEExK2twQy9YSkx4bDUzZG5HbVRrTDJuV3BMMmV5Wm9kK2FJOU96M2xwZ0g3Rm1USU9zZWVXZWJZaklsCkhOdmVOcG4rZmR2MDczRGpCNU12N1hnVnp5L2VEbFlaejFVWkRxV1NoVHp0VDZNNk9ZaHFmd2pWaUFQZkgwQTFIRVUxcGhwOC81bDUKVHl2MzA0Y2RhZlQ5NWEvZm9OcmxOQlh2UHY0Sk5qZFkydlNjZEpYeVhNSTd0a1JXaVZuaENwTWkzOWdHem1oczNjRWh6MW5TcXBaUApmTEhzYkc0NHVlRXVjVzlJMzBpVHlkTFNxUkh2T3pWemlhWkFtaTF0VmFUQkJJNXdUN3hXTGNkWmoxanFnTnJCWFhLU2pPejByRy9tCnU3cGM4c1d5VEhXNVdOYVBMZFBIWC9xWkd0U3AwYk91ZVNvNlQ3V3Y1MjE2WXNOaS8yOEQzVk0xdzhDYlBNdHpwTHRqVE1vOC9vdmYKWTVMcmVVaDNQUUxabjRSMy82aWZIeHQ4d2dWMkNNWXNxL0ZHQkhtY2hvdHpjR2VlZm52a3FiY1E5Q0tGUEloNEVQQWczaTA4em5ibQpRYmFRN0VhNWpvaVZ4OFM2UWJCcm90MnRJUyt1TFl1OG56M3J4MFdrYVRqRTIxUGo5NHo2NHltejQ0bmIyOW1VYnhraDkrZlZ2LzlVCitpY2RXdjE5eDh2LzhHUDUyUnRVVTh5Tm5RT2RhWklad1YzVjBoNW8wb09XOGVEOWg1cE03UUNQZFc5MDJsbTRqME9DSkxkd2U1S2sKMGNnZDZqeVpwZnZlOHVuZG1yMzd4bXpleHhiNzZSdEpUNWpaZjRhTW45TkozczNscktSSFNyeGNwa2UrQ0I5YnBvKy85RE0xcUZpSAo3aE1ZdlFMdUZ3aG5DQWpIUDR3SGovZmNlQ0kzeGwxYXZKNGsvU2taOGZZNThaajV5ME5YVWl0ajlNc2UrWFVTU0hQeHNNeTc2YkdvCm5EUHN5dFBLemZUOUlKY1BLMy85QmtjRDMxOWRLdjRoR255dmJqRTk4c1hsUXdmT3M2ZVBXZFNwRlUwWGp5Qll6N0pMN2pOTWhyT0YKNU12b09Oa2EybXp0ck9hTlczYkhHZGtCRnhkUzNJUVRiczhrLzJEM2lSYjVld1B6cWswK3lXNStMNDk5SkNkZmhYZkhxdnZLWDEwcQovcFFHTDZzSXl5TTZoV2tjMDVrS2NxYXNuR1JVSG1GaFhmdHBHdEhVMGtENzNxVlpwSFYzVVhsSGM4M2VHQmo2U0Myc1dDTEFoYUplCnBLQUZoTUx0UktudnhwTCtGUU5DTThXZlpmYURpVStCenpEd3didzNFOTE4STFxanluOXExVlBoN3pnMXVZOFNuOGw1a084ZzFVR00KZy9CMlRWMERjbGo2aTBmUy90amcyYzllUDdOQTQ2bDk4TE4zNG9uQ3QxY0VIUlNVMmxFK2UwMXptd1pWczU2b21tV25wRm94VmVVVApPK2JzNXkvUzRQdFZnOGVPSzdReVhUd1M2dlJNcDFHZGFWck9XUzlTSzVvTXVUa2VYbkF6NERidkcyQXJ0R1I2eVE0Rlc0ZVVlcFlEClVKUHF1UmR4OUNPK3o1TjRudEN3cHpQa1FRSmI4eHJ0ODNqZE1OTk9wR1VKU2ZsNURxR2VZdm5YbG9vL3BjRkhkSWRIaW1rYzA1a0sKY3E2czdKV1pRYys1ZEpEQTFNOE5zSEswckNMOWVJQzdJYi9JM0hLTXZDZkx5R1BlMDlGMzZtZU5iK1l4N1FmN1JUdGNYQS8wdTU1MgpwdXhvaHV4S3Y5OE43ZGVCbnI4c0R3eDd0VUpLL3VwUzhRL1I0SHQxaSttUkx4NVhZTzR1NlR4ZEk1cUdMUHk5akFwVlY3TThKMERYCnhWWnpJNVNlcG44eUphNGYxMzQwUmU4OFkvOTRZbnNIK2EzbVNqRG53ZVJZdjdQemNmVWs5blYzTnU3TjNlMEo2cXdJUndJK1ROZ1cKVHU1dHVERjM4VUhEejlsY1BhVmU0YURmUTFtdVFpNkRVKzdUbXFGcks4OXhJNDU2RG5IbGNUekNNMFBXM0k1TDJtSWdtaG40NnRHWApGOUpoS1ZmQ2x2dkRmSEpMZXZyUkI3MVNMWWU0WEpYZGMzeDBDNS9rVE11WG5HbDVoMHk5aUhzNTNhK2VuQXgyV1U0Uk1LY1ltRENjCnc0cjhUME9XV3o4bzBrOGc4bi83QVlmNzR5RzdpSlZPUDA4NzBXQTgyZkZVU0lEQUpjSldPN2ZYTVp3ZkR1RTBkZkVrSCtwMDNCOTUKM0pPcFAyWWZKQ0oxUEwvaGZqaG83ZndBaDIwNEpHMS9oTVBTam5DSTA2T25PSFFOL0hvd1QwSFlEUHU4clpFbmlNMnhsdUtuWnEyegpMS0RJdUFJZUdCOGV6ZFQ2NFJmck9WdXlKT2gybGpteHhHSlhWbzlaMkJUSGVobVcraEhYZnRwYXV3Z0R6ei9pd0gvRWdmK0lBLytzCk9QQjF1N1RTaEhvV1hSU2VFRjMwZUc1NjArZytzMG1tN1RSUG5HMVBTT0h0azdjZkYzUnI1Nno2a1VIOTBLRGFEZzFhaDhPTCtvR2gKT0JucGhQZC9NQ2ZkemNLUHVsclBTemc3UzJFMzRSNzcvcFBtVnJrb01wWDh2c2kxUjZPKzNuUHl3UTUzZkRta3JNc3U2NldwT3pUdgpGb3E4QzFoN05FNnROMWhQWXRST1R3NDRlOXJMNFdtUFQ5N0htZVZ1Q2ovT2ZaL0tmOSt6S3A3RzBwK1VKLy8weE5ZZ214SzFDNW16CkVOWkJtZGR0c3lsdWJMYk45ZE16UlUvV3lTZTM5YmtqM2Y3bER5L2VQZnpYdy9IbHMrZi9JY3RpOS9FdmNRckl1ZG5zSTg4Qm1jNFMKem5xNmFrODNPNmFhdlczSENlNXpWWHVPMlJ1Z3J1NHN2V3djOE9oN3JQemo2ZkhINVBqSGpvLy9GUGovelpEeG52ai82ZU1EQUt5MApGSkNlcVBIVTdISmlOZmtoejFjNXM2eCs5QWtyazZxcGo4d1V6OTJaN1NoS25TdzlQN0dMd0QxSHNZaStHME1BWFBpOXN3TlBuNURuCi9DUS9zVmtOMzJjeGZGcTh4ZmxoQ3g4YmNiRlBMZEFQV3poTklYRjdJVW5CazZiQ1I1eGNNMyt1czJ1bUN4TmhGNnBELzk4NEVjWXoKU1gwYURNbXEzemNWdmk5aDlUNWR0Wm1ScC9wcEFTNm5rK0oyK3ZnUWwyR0tEQk5sZXVSWWpuMDZpczhuUFpzTS9aZHI4SkpuNnRMQgoyR1hQM2FZTHpPMkNmbkV4OC9BKzc3QUZGRTJmR0ZGVU5LYW9oeFJOSHg5VFpKNkZveG9mYUhaSXQ4c2thMk9mZHVUdVF1S1JIK3JvCm9vOHgxVjA4dkdqNkVHTmR3L0k1a3M4VHQ5MzIxRzJUbVNXWXZhMGxiN3Q5VXZxMmZmSTJpMGFhUGkwY1NhTjZEYlhLZUtUcDR3T1MKaUZnRm5tRTFwQ3BBcXJLYzdrL1N3NVFMR1dSK25Bby9Ub1VmcDhLUFUrR3h0RkVma0ZUcExEL1VoMS83UTVtY2hQRFZQN3g1L2VYYgpGNi9mdlhqOSt5KytHSFR0OFl2cEg3N0JOMG0vK2ZMWnUzY1BiMStMRW43OThzL2ZmdnRNMUcvNzQ3QnRWOXVhRm5oT2wzVk5oN2dzClY3S055eDlodlpLNXRQSkpyL252di81SmZuM0hQOTNuK0s5LzVzZi9JWC8rYnlIK1NWNys4S3ZEdi8yditmQzFYdkpyK2VYMzhDWVAKcjRSNGRxUERMMGVxUDg4dmgrc3YwWFpYdjViL2YzYjk5dDN0aStmdlhyeDUvZXp0bnc4L3A4bmlaOGMzYjE3SzIvL0NldUtydTY5Zgp2SHZ6OXF2anMrZi9JYjMxMVc5ZnZIejQ2dGNQejkvOTlQQmY1WUwvVS82M1YvMHYzN0dCVzc3TlAzSTZSQndWcURiSUVETW54aUlUCm9sclNQenRBdGZwWmdjdFc1N1FkL3ZVWkc5cDFYQXJoYWs2cmpIdTlTaUxaYThmSXEwVVJ1QTU1dTFwRnBEcklpcitTcHZJaEZ4elcKS3U5Y3BYcU42WkR6VlpDMWRYaU95MnEra3NWYkR6bGVyUWdCRmNuL2FwRlZkVmkyS3hINmNYYnNlaFZrQVI2V2RDVnJMZHBsMjlVcwpYT0dRNU12Q3hvdmVMZGFySEdIUXIvTlYzamFab3VVcXdmakt5OHB5SlNxSTFGb1JtQ3QzVytVdTg3SWVVdFJuQWlIbHVoMlN2SVpJCnQzcVpFRU9vNVNERFhJT00vVnF1SUcvQ1A3NGhTbFMwSUJuT1hFQ0lxZHFycmZNVmxKTERzbDdoN0o5RGxLNEpzaFlQUzdoS290OGMKV28yVXJ4YS9LRnlKb0xxMng0NXJScTQwVFptRzVHVHJlcldFYlRtRUxFTXFnNkJYclZkYlNPc0JOd2gxNHdOSmk5SldYWEFlYms1WAp4Z1NFeWZoRjhqYnNzaS9DbGJBb2RIV3FWM091NGJCSUh3cjdFNEk4QmVaRElEdkplcDMwT1NDZWgxRHNOUlpoS1J1ZVdVWWNuU3VmCkY0VERZcnczRzdDRW1TLzlLYS9LMFVRclhCWnl6N3pLZTZaRngydkpWL0trTmw0cFhNbmZNb2RXNmRjZzd5V1hWMUVuRHVzaTQ1YmwKbGt1VW0waTdxOXhNaGxZdmt5a1hwT01PWlVXMGRtVW5DbmRlY0puc1NFS1FSWmx5a0haV21XV2h0RWtscTJSRlc0ajZQYVJaWG1pVApjYStMakxNTWsweDh6bUNaa3NMdmRjVGtzYTdXV2ZwY1ppQ2NUREtWY0RONXN5cFhaNWxUU1dZYnAzU0pPdXQ0bVF5d0tEYVJrZGRGCk9pQ2g5K1JlOHV4elR2Rnd0c3B3MWI5elFkOXl5Q3RUMmFFKzE4bXJrU2dUQy9rSU9WczJCRjNMdE1JYlJIYkEzRDdyNUpISGtxMjYKMTVHVkkwcmQwSWdSL0ZZK3U1VW9jM2RiVWN1YWtibkdGMnYzY2tLYnFYaWdYc3ZmbzdWejhtTCszaW1nSTJSWVNwSTFML1BxMVk2NAo2THhLTWl0bFA5NUFrTzFWT0lTdzJpeWoyQWc2YURMTGdxeU1YbXZSdS9aMm5HQjMwOHVjR0s5RVk1VkJhKzJFcTBWR2Y3aWJFZlF5CmY2Wld5NSs2dFhQeWJ2N1MvK1dmNUo5L2V2SUc4WXR2di9yVk05bFRiOTU4OCtldjN2dzdONHkvZi92bXUyOTBoN2g4eGE4ZnZubDQKOXU3aDY2L2tGcnVkWkR2ODVLZUhmLzJYQzN1S1RJeTh6c1FVQ1YvWjZQR2NTNUdld1c0aXJLakVQTzRtUmMvbDF0MWtxVmRseTdJeApZc0VzT25NN0Via0o0Q3FWQ1NKNnYweGxtU2hWZUt6MHN0WkFRbHdSOXRoRlFkaEtCRkVtaTE0bXF4RlJCNGVTdGZGRzJLd0dMM05pCm1EZTdMbUtYbHAwNWhOVW93dnZXdUEwVVhybllEdDdyeWNUVmVuUFZCMnVVcmVvbXp3dWRLRXlHODd5OWNRWEQydzVuM2JKZjcyRkIKZndnVHFWRzZWYmpLcXgxUjVBOXdyQ0RzY0JHaDF6bFd3RllqbzJJZjlRMlF2M2p0VmRDRlNYYWwxa1lqMkoxYVI1TVlaREFyN3VUTgp6THBNMjYzbXZtejc0N1JLL3NDdG1aUFgyazM4M1pSTGFhNExrR3F6N0E5MERzMjVoTlV5SGMvTTZWblZ6eTUvYkl2czJEcmhvdXlkCjdORzh3QUdibFZWaTVRSjBsNE9JRmNKdjR5emY1aXdNR1ZNSzIvVXNlNDNzQjNqV09SaXZuSVU3cjdLU3VWV0FXd1ZoMzlqc3RrVzIKMWlxYm42emtUVGFmd3lhN2dFZ1NlaGwyQUhtNVRaaURNUDREOXpYWmZUWVJla1M3a00vQ0I0S0lNYktIYkZ1MDdVaUlKVmZkUjRUcgpIQ0prRzlHWTBKc2l6SUVnMWF1SUc4STE1clRZWlVKYzVJME9zdWZCOXNtYnJWVkVCOWxFNndLSjZMUS9UbllXTEE3c3JYTGZQTXY5ClgrMkllRi9zeFBLZWVVbWNScGcxVVhoY1FKZmI1K2ZleDZYR1hrZjJlT1FvNlkwNHdXNmxWemxSUmxpMHYwTnJwcUJybDdYZnl3bDYKbVQxUXIrV1AzTm81ZWJIZFhBdUg2MjgrbWJVRlNJK3laVUx3a0wxZkYya2paaGtsR1Z4NThxdFFaYTdJc0ZYTVlQQVNVVlJySXlpUApFc2xZNXNCUVMzcHhGY21vdCtNRXU1dGU1c1J5QlFYODBOc1JrVG5MOFBlN0dVRXY4MmRxdGZ5cFd6c243OVo2VDNVcjl0NG5yOVVnClV5VkQzc1dVRWE3SURvU09nRTEzbGJFUmVUTUlLeGZobFk4V1NzUktGVFlqUTRTbHUyRmg2SHlRU1FaR0s0dzNZNWFMNUhzVnNaNWsKK3ErekxJeFE0VUplWXlPd0l5RHJ6MnV2Skt1R2ZEc2w1L2RHRUkxbDRPNUdGT0ZsWFdYMUJ3aVc1T2FMWFNiU1VDM1lGSVR0T25zUAowQnVLek5sQVhzUFdSWW9xM0hXeUNyU2RFbVg2TG41bG80cEVEQ01JZDUwTjR3S1dDbmZJQWExdklsWjJDcStVSFhhck12eTluanhqCnljdkNMWS9xeTBBUmpXRUwyYTUwS2htSWFGL29yTVRueDVyTkFUckJDaTgrbmovb0lQRktXWEdKYzFqMnlCWHlqUT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJak8xVldyRGJ5R3ljWlorUVVmVjlOSlRlUTNHV01STEd5dWxIaFV3K3lBVTFzRjdCcXA2dEorYXRiNXdjZll4am1JRytBcGg0aGxKUQpPQUJsa1hVZFpIdEcyQnk0Y0oyRExSLzVzS3p5Z0tLOUpqQi8yYVNrdTRUamI3UGUvM1NHbm16VDBCMDRTUU51VTB5NjZWU0loL0xXCkt6aFlVVjVBMWgyRVhTTUhTNmY0QkZuQTRZZDZVVjUvRFVOVGpXQjMxQXNiVlRvaUNUOFltaElwZEpWbE05elNLSHBsZTdSV3J6MTkKYSt2MExiMFhSRFBWM3NHTW5uTlVLUjFqV3pPWWlGTkZEeGJCZXdaRnhuL0xPMHBSTFV2SG8xR3hzbW8rREczSmVnZ1lrWDVQbytpVgo2U29LS3gvcnlTNEwrTlhRVnFQczd0bW83ZGxhVyszNVQ5K3o5WUNzRXZhTktMTFVURi90aUVEVVo2eXdwTDI4VkZYQ2crZ0dDYlBRCkNjNk1rSFdtMTFxckRtdHJweEhzYnM5dHVpa3h5UlNCbU52YWlmWkM3VzVHMFBYdHo5UnErVk43TzZmdjlyaTA5aW5tSnVpSXM1QkgKK3hMWUd4UXROeTlCSGNpQVdMcDVLU3dpZ1ltV3RUTXZRU2lWdlc5cjVpVlZHSVFMdUhrSkl1bzhMOHZPdklTMk5naHNibDRDcitUZAozTHdVYUw0UVBqR2FsOGd0d2ZQY3ZDUnZmZ1h6ZFRNdmdSRGozcm9VNHFKU25GbVh3RjFsZXcvTnVrVFdKMHJIenJwRXZpbkNZN011ClljT1FUbHVhZGFuVjZOWWxzTXhscWYycFF4UlJhS3RyTXkrRktITi8yeG1YUUNwVk9MUWJsNW9rNE9ZbHJMQ2E2cll6TDRIeDVpUjgKdXBtWFpCRnRFVlkwc3k1aFVjbnVzVE11eWRMTE0zck9iRXV5L0dYZVJqY3R5Y2UwMENqWVRVdmdCd2tIcEpobFNacElhZDNjc0NSOApXd2FxN094S0ltWXpNNTZibFRaS3lLVlpsV1Jud0p3ZGJVcmtmVnNKemFhRXJvTVE2U1lsdWZjVlhBQTdrMUtRdTNKSnVVa3B5SFROCkFDSzc5aVhjbHJOMk5Da0ZLSytsVzVTd2ZjNTFYWnBGS2RTb3MzaTBLR0dub2xqckZpVzVyMnpLOHNodVVqcGJXQ2Q3RitOdHdySXoKS1RXaVc0TXdIV29XR2RqTVJTRXk5V0FlVFVyWXJTS0VPNjhUWUxTRXVjMGJjY0pvNU9sRU13VzFadHhZMU80MW1wVGFBL1ZhL2g3ZQp6dW1MamJ4YTVLRmxaMUxxUkRNRmdTK21MVGRia2NpY0NKdmFkaFlsY0ZTRSt3eTFacjFwYjhZSmc0Mm5FODBTMU5zeFcxRy8yMkJSCmFvL1VLdmt6dDJaTzN1eHYzYUQwOGRxOUxQQll5WVhNT1BkcXBNcFNwb0d1dVJGazR3YW9WQWhCcHd2WVVNNW1PWVpLc1VScTVtbWIKNFQyUWpoWkpFWmZsWk9aSmJzVlNRN1lOZHhDWS9SL0duU3lNcEpueFJjWGdXaFIySWs4ZFF5T29CUjRDZXVtVllGa3ZJc0xYYW40RgpKMnlidHQvczd5QmlOY3dySGxJMk0rRTRHMVVFQ2lNd3hzWjFJT2pMVmRFMnVJUzlXdXU3WUNicTg5NDhNUTZVV2UyYjJBUkVDRkk3ClZLY0tVeFFaZmxFckxqMEhNWnB6QUh4eHphRlR0T2ZnaEVqcldDK3FwMkJveXlsK1R6ZGJHN1dZUzY2MUJkMkpvOWZ1NlJTOTBwK3QKMWV0djVXMmR2ZWNQSXVvMEl6L2szSFhkbHIwdkRTb0tPWGR6cHFHZWFQT2xlOU1nbSthOHVsL00zR215VTRzSWlDdmRueWJhdmV6RAo5TERaU3NDMkl2SjkzbnZVS09NbDNxRzQwTG5xM0cwK05XZ09JaGI1bWpHbkdsVGN0V0FTdVZjTjNJM1AxdHhxMkpPNmhjdjlhdGk2CkFxWjA4NnlKdkNDRG4zSjNyY0VLSUpQZGg5QThaOURHUkJ3czNia202MEJ1empYb2RXQkJXVXk0Ynl1enZZTjcyS2d5eWExR0YxdFMKMTg3T3gwYkpNeSt4T2RuZzJscmt6czNMRmloNkxIc3ZHNVZycUNITnl3YlJVM2FqT0xqWkZuU0lTUUhkenliN21MNlJPOW9DOWxFWgpyZVpxbzdraEIzZlFtYThOTDY0K0ZYZTJRVDNmSXVhM3U5dlFnZlBpN00vOWJWUnZOcnlqTzl6aW5DQmVidDNqSmt4VUpCL2JrSnJMCkxkSkZVa1AzdWZGS3ZHOXp1c0d5Mm1hUE85M1FYQzF4N1Y0MzJDbXBwRFMvbTJ4dElxaVpnYWM1M21LRVJpZzdaUE84UlhER1FLZWEKODdVdzY5emMrZDVnRXFLWTZjNDNLSmVMOVBmaGZHRSs0bjdEOTF4V3IvYlVLaHR6M0xvRERvWU12a3h6aXpYS3pnazMxRE1IMjlCVwpvOWc5ZDQ0NE1JS2E2ZnkxdHFESTBzRGI3dGtvTzEvY1VLODlmMnZyOUQzUDNIRlJ1aXBMcCszOWNUREFjTzQxNTFjTXN0R1cwRjFrClR0ZzU1SG90MjMrR2hockZicmh6eVdHRU00VGszaFRVa2hDSEd4cGg1NVBydGRxVHQ0Wk8zL0QvdDBKVVNFSE5sU0hCS0dqVEdic2gKOVRwOExkb2hkdFlaUmpxbzM5S24wR1JwYnlaRnVCOHBybWlxZzIxRnZBNGxFV0hvQzJ3dXdpbDBMc3F0MU9EbkZOV1lrbnIwZWoyNAozQ2pHZzZQa0RRelJlRmJJWUwxK3BXZzFkcVZzU0x5blhEa25tRzFnSk1WK2RQYWFKeHBRZ2o0RkcxbWUrM1k4VUlOdU5tZ0hGbWxZClliZEE1ZzRmQTh5VVRsSE5SQlpQbXRlaG5uQ2VDald2TjlVcGMyYzBuU3F2b050M2Eyc1JkaERETXR6VEtjOXRKUGxvdlpvL2ZXdnEKN0MwZmwyMCtoNThYL2h2T2daMmpGM1pjSFYvMzlNS01QOE9EMDF5OVFRUWgyQXIydmw1YWlubWx1M0hCTkhTV05Vckt3NXhxMU1YbgpsTHQ3WTNiTzZPN2VSdG01ZTNzOTkrTkdyb0EwVWxMcGs2cFRNWlI1ZFBCaUY1dXpqZEcraHg3eCtVYUl3c2pwLzJwUGhROGdydDNyCjIzWk1kOFkyd3M3ejI2dTVWN2MzMVNsMnk1MzNseHNyRmZqV0Z1UmpXdGI4bGs3WU9ZQ0hhdTNwVzFPbmIva0QrSURCcjRRdjFMMlcKMktpdUpUWnJvR3VKbUJZMHFveGFJcmlIaVBxeGFZbFFxRUlWSnVoYUlpd090QmVPV21LejQ3bVcyTXh4cmdEQ0RGM1dXSFphSW5TLwplVkFsWVNKYlpESzdrdWlmUngzUmFVMUZoSmw2aFgrdjZYNzArS1Z0M2V1SXNHS1ZCYy9XNnJXZWN4M3h2QzlQN1VpcldpeDJPbUtuCnVsNUhzd3htVmRQOThNZWFjdG5yaUxUNnBDVU85VUpWbTE5dnExRkdmVzJnbWw3WDIzTGRyOTl6MUJIN3MvVjY3YTFhVzZmdmVkbWgKL0NtbThDVWJMQVdHWnpoOVgrMnB4WlNlWlhFbjRhb2FCRmJWREptbFVkd2VUZ3ZuVUE4N09seHp2YTFHc1hzNjh6RHFabGFFMXBacwpSTUxGMXVHZVRuRmp1cmtxVzczMi9LMnQwL2Y4UWJ6TEVldVU3bG5aQ0NqZVUyb1h0V0VyaEJoRkZSeGlvaVc3ME15ZmtDb0pYTHdVCkd2NEIzZGdjMXlHVGc3NG9HTlJqVUxhcElvZDBzR2hKa1dDRkxVWjlXZHJtSE9RUTRYekVacXkyR01JZXNPQ2djbUVxUURMVkxvZkcKMkd4TndLbHNVUkU0OHJLSnV2NmFpbDVadG5XaGQ1V0dYdlNyZEpiTmFhajRDVzhsKzc3cTNmQjBWVkxnaUlZT3Z4VzFHMEtJRXYzUQp0RHRSNFdUVENIUitLNEIycHZ6SHpVOEJ1Q0ttdzl3T0tTeTRnaEhBVm1HdkZxV2JMNENkcDlMbHVHSVJWY1Y5cmh0VTJES3JmcXhhCnN6UnJHbXlBd2hjelR5YUhaNHNXY05qVFJPcE1ORHFrNUpwdnB1MS80V05WSGNsRk1RSVVDbFdIUEowREo1cGRYQlUvZ2l1V3NoaTgKdVZQZGJJQlpRME92OUVrQnNKN2FxYnJpamFKekpDa2VaNmdubTJLb2VXeXJVZXllZW1XakpvTy85cmFpYnBYRFBXUGZQSWRuYS9YYQo4N2UyVHQvekI1RUNZM1pBd0Z5NkZOaW84S3BUR1Y2Q3dlTjhDV0tZU01oWGN6UVhCeVpVWFdGbmhTMWxVUnk5eW9Telh3ZDFrZjVBClVkcWFOQVpoczFEN2dDaW81Z2JYUHFDR3VHNGNYVG5vRWlCOEw1aW92VjdaSENxNDZSMDRLeFc2c0kwU1lEbWhnaE5xWDhpc1ZIbTEKVVdUWk5BbXdVMHR5R1pPK00vaWRrVnNtY3RvckRyR09Jbkl4R0FxTWZmcXdxeitzL0tHM3JMTzlwbE9jTjVRZFZlMkYyQ0ZnTHd5MAp3SGxiMjZBOWdmdndZU0crNjJ0dU5paUFYT2lnekI0RElHd2orVDA1ditlbHFqMUlybEsrcXlKK3RQVUxOcHBpcG9tUUJrMi9VdGxJCkVjMGNGclE1V25lczJhMHIyYlhCMlBWUzJxd1dDQVR3OE5MRUhseHJCRHVsUVFES3JzNkQ4V0VYUXdOU2g2UTFyczNzYUZQMGZLNmYKc0JaTVNRRFo4REkwbmIzYVUyVnJxWXVhUE5hbDZsZ3RzRGxpYzlDdWQ0b3VCK25vQXQ3WjZ4WDFwUTV0TlVvYXpIV2RtbkhVVlRnTQpiY0VxQkl4OHY2ZFI5TXIyYksxZWUvN1cxdWw3Tm9lYlRGdDZ0ekRmdVZXOTJsTTNOV01DckVLM0dPd0htWjZNRldoSTRsMk1va2lICm9OaWRvWjZzMTVoM2JUV0szZE92TkdveEMxZHJDLzVTbURyN1BaMmlWL3F6OVhydCtWdGJwKy9aZWtBR1pzdllja1g1SXl6eDFZNksKcmJuUVhEKzd2UVFqeWIyd0VnSFJDTDdpWjdyL2U3VUZ5ZWJTMEZTaitDMzF5a2FGK0VPZm9iY0ZLRVVKL1k3MldSbUZQNWRYNmkvawo3Wnk5b3I4ODdLMlZxQytndXBNNVhBZnFBdWxYb1hvaVRLcWpnWkkxektLeHB0SXB5bnRnMG9DSjNLa0VkZkd4dksyQll2ZlVLeHMxCm1tRFgyNElmQUs2SGZrK2pQTGVudFdkcjlkcnpXMXZuNzlsNklNRzlHeFhQSklxTCtjOGFGZlkxQ09IZ2hETm1uaXczaW1vQS82WjUKQzUzeTNNUVN1dmlIZW9CQndEdlltbW9VdjZXTENFWTFxMFZ2UzFnbjBKVDlsa1pRRjRFOW1GZnFMK1R0bkwzaUQ2RFBOd3d6ZGdwNgp2SGFnYm14VkszT0pPcW9iVzlDYTRTaHlXRGRNRXFtNi9kMkIzUkQwMWF2Z3lHN2dzRFBzYkEzYUhVVVV5RnNOYlFnQUZZS2tDZG5JCnNkM29LSFZvT3JnYk5WTjJINDJCdTJrR1dkYWxvN3NwNUFCMjB1RGQ0S2RwTzRGMzQ4MElXR3I0YnRqRjdFYW5uWE82RHhrUUduOVEKLzlwQnZLSERKRlZkREZMTm5Sclkwb2E4YnBUbjN1M2c5ME05dzNBUGJUbkY3K2xxa0ZHcjltSnJTdTVFSDJpL3BWTmNFdFJINi9YYQpTM2xUcDI5NVdUMy9ISGh2ZXIyaW96MDdWVkVhRFZ5Tk9TV1RaK3NZN0VaUmM0VkJ0WWQ2aHVidVRUV0MzVkV2YkZUWnhWZkNhbHRUCnhlekEvWlpsTUJmM1IydjEydE8zdGs3ZnNuRXptRzdoN0lQYUxwekNzQmVOS2dKVW5nTWlBa1hJS21ycEMrWkRuR2NQL3dpMnNjSm0KVzVaMUhlcWwyWUNhcmFWRzhUczZVMUlxVEd4QWVmVzJNS0dXYmJ5blUxU3MweWRydGRxenQ1Yk8zdkVITVUwMFdESFdFS0hVSS9TZApzaGhOaG81OXgwTEppVjR1QTc5RHgra2hrSTUrcHljUExLREIzeUhuYkNYR2puOXZGQlZ2RkFEZnF6bTJIY0syMmNDZHNvVlIzekVxCmVTbms0UWFDcDlDbzZvaWg0TUZDbTJ6ZFlQQndscXNLNGZCMjlENGx5RTVaWVdEd0t4dFZwSms1MHFkaE1IamdlK2ltYnpENFJsSHgKeDJEd3ZaN0QyMk14cEVHbnVObkJCU2VqaGl1Q2doMEZIK25tQVVUQVVmQkE1cXp0WVIwRkR6ZUUyc2tjQlEvM1FpcHI3aWg0NkJKZAorWEFVUE56c2hFODBGRHgxamhSVHg4R2o5YVo4TkJ3OFVBZTB0emdNSGlOQXZ0cHc4TmhJa0RqSEJDUUR3a01SWCtzQWhNZEd4V2M0Cm43SW5kbUJIaVdNUUE0SXBYdTJwb29MaDZPS0dPT2M3YndNVzNnaytTWWhmNzdVTTRqNDAxQ2gyUTcyd1VWMnhhMDBCT0JWSDlIMmoKNkpYK1lMMWVlL2pXMXVsTE5rbmZJZUtBZVMzQkF4MGR2dDZvRGVLTzJVOW55VURKUThoSHA4SndCY2RmYnd1Q05tRS83WjVHMFNzTgp2ajdVTTRqNzBGYWo3TzdacU8zWldsdnQrVS9mcy9XQXc4VXhkOHJpMXV0T0ZSWkdJSXdEejBXQXZab0pyM1o4ZXFNNGF5S012ZGR6CnBIdHZxMVBzbnMrbkFSRlAzWVNHbE43V2JHL1c3MmtVWGUzdDJWcTk5dnplMXRsN1BpN3hmZzVjL0E0czVzRDRoaFZyeVBpR0ZXdlEKK0IxV3JHSGpHMWFzZ2VNYlZxejV3M1pZc1FhUGIxaXhobzl2V0xFR2tOOWh4UnBDdm1IRkdrUytZY1VjSTcrRGlqV1FmSU9LTlpoOApnNG8xLzlvT0t0Wmc4QTBxMXBEeURTclc2NHhRc2VhZWE2L1E0UElOSzlidzhnTlNyQUhtRzFLc0krWWRLOVlnOHlOV3JFSG1HMWJNCklmTU5LdFl3OHlOU3JJSG1IU2ptcVBtR0UzUGMvQTRuNXNENUJoTno1SHhEaVRsMmZnY1NjL0I4dzRnNWVyNUJ4QT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJREQ2L0E0ZzEvSHdEaURtQXZ1SERHb0oreEljMUJIM0RoelVJZlhkak80aCtodzl6RkgyRGh6VVlmWU9ITlJ6OURoN1dnUFFOSHRhUQo5QTBmZHI0V1QzMmdCam5mNGNNR3FtRzZHbmk5NGI0YXhuMkhEMnRRK0Y3UDBmSzlyVTRac0ZvRDFUQmRyYTJHKzJyMzNPSEQyck1OCjlkcnplMXRuN3preWYzcVNkdml3Z1dxd0xvZXlPL0NyNGQxSGVGaER4ZmRhaHBzZjJtbVVBYTAxVUEzVjFac3k0RmUvNFFBUGEwL1YKS3JYbmJ1MmN2dDhsOWJKN0VtRnVFeFpoOXA1R2hTV2hxSlNWeVZBS29qZk0rbElEVjZOUlZQMTNMdC9yQ1pkS1N4amJhaFM3WnpNYwpLRlZXRkZqNTBKWnQrY005QnlGZ2VEYXYxNS9mMnpwN3o3WWVQa1hCUGtuWlJLMHVMV3FjS1ZqeHIvYlVvRkUyc01VVUlDWXhXSE5TCllaZTdmYU80RWNhVXFWWXZHTkNsTjlVb2Rzdm5ackF6YXRKZzFhR3RqTDA5ai9jMGlsN3BqOWFxdGFkdlRaMitaZS9MajljdjRRbWMKaStvY0lqT2FOTnFwc0cweGVRV1E1dGloQVRDbjRKOW5VeVdkb3BxWEorcG85UmhTbDllaHJVNnhleXBIZCtvMksvUzN0eVdVc29IUgp0SHM2UmUvcHo5YnIrZlAzdGs3ZnN6R2twWnFrZ1kwSEMrWFZub3JlTmZUWmxyT2xEZ0dDT2VnNVNGdW42SHNBRDFQaldFOTJHaHBNCmUxdU5ZdmYwUGExUjYwb0luN2NGQzFvZDdxaWY5U3AvTHE4enZJKzFjdnFHbjJVUmh0TkZLQktZK3RDU2dvdGU3YWtBUlVIZGh0MlUKbnRNbFdPS0poSEF3V0NxZDB0YlNHdU5ZVHg0Z09pQkQyMm9VdTZlYmZScFZrMlMxcGhiR3Z3eDNWSUl2ZTNzd3J6VzhrYlp6K29xOQpJejlCZ0QvaFpxcStNUXJUUWhkZjdhbUFuQ1dOYjlaWWRCbldBbTgrbFhNSzRFNVJaVzFXQ0VhclZoMy8ycHJxRkx1bE8zK05LbnBWCm9KempUY0hNYWlLQTNkRW96MDNGdFNkcjlkclR0NlpPMy9JSG1aU3drTUJQTEtJL3NqS2FZOG1KaSs1UzhQSFVMWVVEbElpcU9oTTUKclgzV2R4SlpyOGo5V3AxVlhUaTlFU2ZZclZ3NVY2SXM1SVZPY0crbWFMaEV2MWNaSXJYYkF4VVBxdkJIdG5iT1hxeTdVcVBxd0JzQwpXdHlQMklqU1cvT3F6czhVNVRFMlROaWtEbFdxc1U1UXhycXBBdHRxQVk1UVZRUFFkaHJCN3FhWE9SR1RBeXlwdFlQMXMyM0QzWXpnCnJsZDlwbGJMbjlyYk9YMjNIMkw1Y1p1RnlBSjFnMTZqVjNzcTVMdlZRbVVpSEVGUVZPYW8wb1JtUm5PSzg3RTFwVFRXdzl0dmVXeXIKVWV5ZXpzZU1XaFRTUGJSVlRhem85Nnc5c2Nid2JLMWVlLzdXMXVsN2ZnNXg0cVF2WTFZak5PVnRHRWRmN2Fnd3RzQWpEQVZ0aWJPYQp6U2hmUnpldkdFRUZUcmpRbG0yb05hdTNiR2pJS1g1RHZiQlJJOS9rMEp1aUhTZlY0WTVPMFN2OXdYcTk5a3F0cmRPWC9DRmtYRERPCjFSTEdCTWVJZEdJMFVBT2N0VVFMdG5nMm9GRFcxQW1xd3FVclpPa2ZxMkdOTWF0SGE2cFI3STZ1L0JrVnJoRmlIRnRiU0Y0YTZuQkwKSStpRjdjbGFOWC80MXRMSkszNytDVWtiekd6eDFMSkFISVBjcURBMlpaVzNwQTIxQjJyd0hqeVdXMW83UmQrSytYTzNzZDVNODhYUQpsQlBzam43ZDdCTnlKZ3JVR3hLS2FORExjRU9uZVAvcmcvVjY3ZUZiVzZjditYbTJWaUI3a29hK01pengxWTVZUFNuQmF1WkR4dm9zCmFzOUZzdjVPVWVGaThVeDhyWjVJV1VncU5MVFZLSFpMdDhNb1ZmcU11ZFI2VzNIV3dKOStUNmM4dDRmVlordjE3UEY3VXljdjZWMzMKMmNLNkhnL1grbHcrUTBBamsxbDhHNW9ad0s4RnE4N0J6UEtpY3dIT3g3SE1BR1Zsc0xvUnlsd1JlMUZ6UnpJWEdyaFNCeklYakViYQp3NWhsN29zUUVEdUtHZWtiS3h3TURtSmVrWU9CcU9ZQnc0eXdyUlhENHhCbUdFcm5VanVDR1U2SVV0SWV3QXl6OCt6SUp1YmpKVVF4CmRmaHlKZ0I5RDE2V204MGNhY2N1TXp3eXJoMjd2QUl3UU4yM1k1Y0xBVnhMaHk2WFRkWXRzY3lHWEthSVRPUGdBRnlHQ1hjcnk5cVIKeTRHUVF6cFV6WWxJcE15NmJYdnNNdEF5RWJab2h5NURGbHRTQnk2ZmpmYmU0bGhoZEFZYkdtSExuV2dXYk9SZDVDZzZHQmtoM2FtRQpQV2E1d0Erd2JwMVk1TmtxRkZadnB4TUc4SEFuR3NhNHQyTXc1SDYzQWEzY244bHJ0YWUyZHM3ZTdYSC95aWVoT2VJZXBReUNBNVFoCnpqZHdjczA3V0hKaHJFaHFxR1RoejhpQzB6REp6Q01UOTRoaytEK0M1ZGtqSUJtaWN3Y1pZMmFqaVJHS0xPdDNnOTI3RVJOU3hBMzQKWWdRZG5XQ1EwMGlaTy9CNDNpT081dzQxQmc2NFlzY3lwSEdFL25HQ000WUMzVEhHMFI3RGtjTkltclN1ZTN6eHdpeDFuWWFFNmRHdwpwUVFYTDliSUNDMDJkQU0vWiszVEJpa0daSUJaT3djM09lWmZ5VXZIRTFkN0VrY1RZeDdOS2V6QnhLWGF3allzTWZwbFJCSXozK3k2Cnh4RUxDOGtobEE0amhqRjRYVHVJdUJZYnYrSHhBZ1BiNGJweUNERm5uS09IZDlOdnY3YkJjaFp6ZmpYY2NDY2ExSmM1aG9BUmNqUXcKbVBFcFpoaHpjNmtEc1FBSEgwSnZwaE1HOEc0bkdzYTN0Mk13NEhhekFTemNuOGlJL1ptdG1iTTM4eGVIQlMzbnZBY0tkNkpqZTJtWgpIdEMvQU9LWEU0eXdDSnNsYkNORVdIYlJkV3lsRVhZQVlTYzZwdGZiYWJCZnU5a09IR3dQNUxUK3hOYksyWHY1Q3lkRy9BNGczVmNqCjBiRzhXRnRrR3c3M1RjamFXOVk5S2hoV3IxQ0hTdGloNktiMFpwd3dJblE3MFlDODNvd2hmZHV0Qmpod2V4NnYwOTdDMnpoOUxYOWYKNUdJSzg3YUhBbmVpb1hmUmoyR0UvV2JHSGc2SVgyN3h3UHBUWC9SYWNFMVNxL1IyR21FQTVIYWk0WFo3T3didDdYY2JFTUQ5bWJ4VwplMnB2NS9UZC9LVmg1c25NOXptZ2Z4dlJFYnV5T0xiRVBEWUc2b1hwcWRCelBXQi9oWmt0c1F4RXVEZDVpbmhyeHdrakVMY1REYS9iCjJqRkViN3ZaZ1BwdFQrUjEybnQ0STZjdmRza1pCcWQzWk9ENUNCZnNWQWY1SWE0MExCNGFEQ0NnN0w0NHIydVBGNFRmT1pUWWlSWHAKbGJjQmQ5Z0lJM1N2RVIzaDE5cHhFR0M3MjRnVTdBL2wxUDdnM3RMNUMzNTJyZUtqazBVODhnVEw0V2UvZVAzdXdpRWorUFhzZHk4Zgo5RUYrK2ViNVYvL3o0Yy9hZHA0UFAvdjF3N05MUjVQY3ZuajExWmNQYjU4L3ZINDMxSC9zSGwrK2ZmamppNGMvZmZYck4zLzYxbDR2Cndac2t1dTFqTitDWkovLzk0Y1h2Ly9EdTBRN3hxbSsrK1VvNjh2N3RtOWZmVy9lWEQvLys3c21WOFpMU0t5OGV2djJBZDd4NTg5TGYKVWNPNzF2ZS80Nys4K1ByZEh5Nk81WjJla1hQMyttdTc3dUtaT2YvanhSOGZmanJwTCtwWHE4N1BsVEhmVURLMnFxanBXRU9hTHA2WApvd2pwRHpzMngyN2xEVGVNMHU1MlBQZW1VZHRqL2JKZmY0bTJ1L292Y1dvT1RjbXlJOHc0ZGpndU9HVUtta1VOY2RZemlhT2ZTYnpzCmtxbGt6ZFdMVklDTFp3RUhFZUlsc25jamxTVUlBUUVKY0tHck9nNEwvMXlWNEJpa2hmaHMwR0tsSlhXMnRpdHlWS2s5Q2tkYmdkZEIKcGJtWjFNQWVxZHdGUUJJWHVoY1RzamdWWkdHQVVpL2Jjb0g1SElMdzRyWXFwTUFBbEF6RXpZNUFJQ1JMQ01haGhZQWRUd2hFQ3JYTApBSHhFcHJHY0ZiMVVlQUJLTW0wUFFnQ1F5U1NrMk41TTA3d25XSzREUmFRUTRERkJSbFB1blRRZndpa2dleXBmVFBiakxVY2lsVGErClBXQ1kwSjQycGtaTlNtREdOeWhmaXdNZ1IrcXlCcjB3TFp0U01zY2pCOHVSTmRQZzFxL01sWHRTbE02aER1ckNPK3BsQzhqU2pOSm8KZlZsdDVKQWZIRkVIT1BNcGE1Z3dqVjNJTmJGcURpOHEvOGh4c2phaEUvRVFWQVNRMVduVkJLR3NGdVlrMG1wV1ZQVUt4QzhzQ3lVNQprSDlkN2ZRSmhycXV3YXlyVEdFd3cvR21ZZGg2bGdid0RzSFRicTRPZ0E2dW5hL29DcWJXZzN1bExrWlpsQUl2Uzd0eW9TMDA0RkN4CnhZelB6QlNNL0ZrODFCNzNaR1FXS05HTkhaQ1VWdGVKbzQwMkE5QkpLQ3JMemV5S3dQTVhITThUVEVhUVd5NDBCcFZWVlM1MHh4S3AKeUsyVy8ydzJXeGpuRGhDTUplbjRwbG8xbzF4ZE1LUXp6RVVLSzAzSmp2TGdZS3N4RWI2NVJlT25Tb1FVeE1Tc20wbzdoY3V5MnRJaApaZldIQlZUT3JzdXNvMWthMFhyT0NtNWxQQVVvbEVuMEtoaUNZRUxDaUZkRE9Hb3l3aG51T0xpenEybTBHeXpwVXZmR0wxeEVLOTJZCktGNFJlbWxHbnBJTmpuVUZqeEUxaUNqL1pmV0FOc2o5U0hFQ3d4YVJkck9HMUFCd1hLTTZKWm44aExoQ2d4V1F5T1M1Z0JSR2JSdlQKa29BNGpkaWJvZUx4OCtJdWF2aUFnV09Vc1Nyb1NuajRrSWR1WTlwVVRWT29pVHZ4aFkwZHN3MGtwQkNHUGNwRGxMQzRLck56V0xCSwpLcFZLc1Bja2lVaGJCUU5mWkVqUXFtSVpMRExNSXh5Z3BraUhnckNHSHM1RUhBS0lTTElubnd1ODUyaUd3RU1RbHFSWmZaMVRhSEJNCkptZE9jektJUGhLelZXWVZEblFKVjdQa2dRUG9teVZDRUtEK3pveFhxMW9IVm9scUFMUWxiVkN2UXpJWEMybEFrWlpaRnhrSU5HTEQKdkxJQmpENzdVVlpDV0wwN1pvVFV5N2NnSnJ0TWRJRmx1S3hxaGc1ditMbDF2bXpWdEFnSERDUkdkczB5VVdEZUsxa0JDclRzbDAyVgpQWDJ6b0hjcmlGaUpodXFFcmdCblJad1YwWmxnZlFNY2YvYjhqQ0RTbWdHZ0g4NGdtMjN2RW9Md1REWDVzQjBRaHF1WXZYS0ZsMVF0ClFGUkRVQ2RWaS9xck9HNEx1NDIvR0x6TWtYMnJRTmd0Z2FGdVBHbGkwZkJsT3VIaGNGa2RoRlJ3N2dOdUJUZ09RL0ZocXlzOENhdFoKaUFQU0M4SlEyeGdYaUZIbTRySnFYOU9PSFBWNE9OSFJpMEduTnhKd2NHWmo2d1ZyRVVUYVZ0ZFY4MG5pc2hLTXdMdXRnRXZIeGw4MwpwTENVM3l1Vk9SaXB6Wklyb29vNllXS0JwU3JUa0VZR2doRkdzdUNLclhkVHY2MXM5eHpZVEIvQ3V1cThLZ3c2eXJZckY1czE0WXBKCmgyREh0ZVdoVytZaTAzTUxIRUx1MHJyL2J6QVlaUjBpeS9QRzhFV01ZU0U4QjViN2xXTVdRdW9DRWF6dm9JR0Q4Zk9zSXkyclQwRlEKekdzaGhGUWNrdDJhUWk3MHF2anBLdXVObVVyMWtUZlIrZkFLb3RzdCtsN1Nvem8vbUNtNDBMcTNJR0VpWEhMWUVDRENWYVo4WHRlVwpBMTYyTFRoYVlSU2UxYVBCWEZFRjdHSFZKQzA3NlhCdjZxTUVBTVJUZ0tYYmo0OVlORFl2RW1uS25UMXVBQTBIWktQWHdHbHVHWkg1Cm9HT1RKVFFrV0hnbHVEWUpnTVVqYVJLRkpSQVlFeHZBbFQxVUFpbytUWExZREt0NktXWWVMb1VVNWJySmg1bmF1QktlbXpDZnNNQmEKTGFUY1o1TE5ESjViTlVFZ2pLNUpYanpZbHNVMWcyaXRUUmMzd2QwTWg4VldZNEg5QkxkRktFMk82Vjh0a3hBeXFabllNVmZHUHJYUApnY0Y3aTVxblhGclJTRkhJUlVWcmFXd3F6MmhSdVNjdWpHMFJucHNkZExocUFpZ0UvWWFzdWhORlJ6cXY0dkFaWndPRTNDUlZTRm9MCnBNdW81ajZjTTR2TS95SzRhbFRhd25QL3pLeWdqNWhvZ29hbExVZXpWaUVWS2dpMFdVQk13bGpncXRsVDB5UEFEU2RVTWRlTkdibDQKWHVFQ3pxblpGTWo4MHFMN29MNVhWYjh5WmpuTldSbHhYWW5aNFkyelJIV2VZaDNYMGlXM2pkdXNlbVR3RVNPQlBLRTBsNjRRZXlzMwpTM29yL0NJKzlycjVlMFFlZW9iUGVWVmNRMFpPTFJEbUpuc1huVkxJeDB1K2duRVNNUVpwK210U3ZxSkhCVmExVHQrWXhCN1FaNWxLCmtPSlhaMGhQMENMSnhCYUQ3Qyt5V2tTRHM4dG1qZFNqWXBBTVRJbUZpOUN3T0d0V1gxMzlRZTJnejkxZWdhZ0VFQXR0VDFWRGQwSEkKbVBZSlRrcnNscGl6S2JUTFpvQlRzZlhRYmdZQ1lPV0tWOWU0a0FCeHRjejZic3JHZ3ZYMnFqckVzbWlpWlRoVTY2cm52N0dMc1BpMgo1SHpNd1ByY0hDT2RRTVVlVWZSTnkxYVhjZnFnRVhndldjZ2JRazViTGNTWFluOGk5d0dEb0swUHZwbEJMT1FwUE1KSVpXaTRPTUFPCnNKMHYyYlk5NW9TS1BPMGl1V1FDWW9GUEdjU0VaR3VJZ2VlYVFseGtVQUpqN3hHSFZ1YlNMbU5LdkdXeGtRVUIxZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJSS9aTDBDUjNqRGNGb1hvd1FWQ1pLek4zY3FZQmxUb0ZHUVJkM0ZGUHZnRXZoaExHWGhUWkVaN0ZqRk9HWm0yNkFNbTlVTnRWbTU5TQpQdDNRRzF1TWxmY0NqVXNST1JXd1BFQ29ub2t5ckhtL2ZZT0ljUVlNZUU3WmFnVVNSSWpRM0d3SURNYm42cjJJL0FMZ1o1aTUwQ2d4CnJzd2dMWE9hOGtzbklDallkOVJHcktiK01TNEFtK1ZNK1JkQld5cUI2V2Vkd0NZcXRUcW1vbENKWnk0eUovRG9Fdy8vTWlMc0VWQkkKTkZ1cE5MMUFyV01DZVp1S0N5QldwUjlic2lFMWh4RFZheWdxWVZseFVDM0VIR0JMSVRhRHdhQS9NQmp1VVpkbkJFMGtaOVhxOUlqWgpZajZZdWRxeE9BVWRWOXBWaEFtZ3FaeFVYU051QW9NUnF4RVFOdzM1cmpFcjVHaUFNQXVuN0x3YXdoWkhDU1RxUlNvSmtETXdwV1N5CldSWEJ1bVprdmI2YWJWWWg3MnMwaVJ6TGlWeUlsaGUvRjlZWTVBRllYbGEzUkZma1NDNG1nczZXa0JLWGJRNjhuemROWEFoaXBHSzYKRWIrRjlPTWJkRzljQlFzTXdzLzZhZ25ndGppMDFLM2kwSldnVFNKbjM2cjRMazFzdG5ZNUhrTk5TRklzTHBjRmxRcHhIRTNRcEtYYwpiSG5hVURJdWpEZzNhS3pZYklzbHVTTjZPTklVcFI3eEJkQU9rVm0yWlppTkdrT0VPSExXNFZnQUNMMmdWM0VSeEdHaytVN05ONTRVClRFQXBLbW5lTHoweU9xaWV4MG5PZk9LQnpFeFo4T3laQ01BanpGdkc5TzhJbWl1YTlhYXN1clBQalhzNEVkbGc2NktJLzFVVHB0dVEKTVJ5VG92b1ZqcXR2REorVENLR0lxMlZaMWJ5TnhUZ2xDSHFBbEdwVmZobWxmYzJkWWZsZ0dlcGZiTVBGM3Nma1RnV1NrMGNZVURLRApxVUoySnd0ZzVBR1ZjR3U2U0w0aStBOWhqMUQ5Zk92VWVBK2tmY3FLdEZGZEI5YkNUZkc4ekE3dkJGZHRhTG5zdFRZMWRjR1dvaDViCkl5REdLM3RZWHlQQ0pKbzFsYURzTUh4SW5Xa25JblJ6S1NOeGt5YUJTenJsTkdlN0IzU0ZsVllnaEpQektFL0MweXBQbHkvS0FaajYKczZxeXhEQjdIa3dRZzJLZWtCRlk4NmtqNHBEWitiT2RneEJydC9HQnV1YWdySDlGZjRHU0dZUWR3YkVRaDRSOG1Nd2tBTXJzUnhvdQo4RSt1eS81S1pyelhPMVM5TXVwSlRnZ0x0QVhDTy9CSUw3cXE3Q3dCUm90aDkxdXh4d0J6VEhRcldBNzJBYjVscWhhbmk0U1ZtNTQ0ClFPY2k0S0FsSVdtOGNJdEZVMWxYYllsM0JGT2gyNXh2d0JnT2c4ZVFzZ1E5OTRDSEl1SEN6WlBKQU9hQ0JVNXE1b0VKWEZuUmtvTW0KUFJkbFcycngzYlBmVWZHbXEvSjNWRXVjR1h4V0tGQUlNVTEyZWhQdEszcGxVS2xKeFlYTUNMcUVjRnV5NDhRVEJUSmtSWVY5eHR6eQpmeVl6aTJJOVlESUNSOHk4M1VoM2ptNUdWbFVhYTVGUDE4MmZpTFBUb3luQTloZkdzbTRhNlFJS2hWdUF3dFh5ek9UcmF3OTVVWE1xCnFNdHFvVEUwcGVJdDhxYXdjMEtLUUtHVzdsZFM2Z00xYjhndmlyWjRZQkl6Q0ZXTjR1UE1URHlDd1pQdDRRQ2pXVE9KeHh3dDFRNE4KM3B4anErWUYwc0FCSlBpTTdmelh0cEt3c2RCSUNHc1dQS1VCRTV6V0hNQUtvU0dGVmYwZ3o4MHNwc2Jhc0JydUI1b1JKVU9leWFmUgp4bnhXbVBCcTdOY3RtclNYWmk5V1VuQU5USFl4V3Q1SENxSlpWNExiajNSNEdZU0hidVZwa3BzeUM0TFlFSi9IblFkTFlZVWdvR2F1Cll1dUJ4d3hpR1NDUkdLTVlFTEZjR1NNY2JNV2owZGt0OXJCd01tYUduY0lnTmlna1NUZG0zWkZ4RENWRHUyYUc1dmVVaXlLQmE3MUkKT1hjek9ZcGJlc2xHNFJTR2xMNzU3Z1UvQ1RHNGNGVkE5NGw2Z2JvekNINkFrVlFHZDZWem40NXh2aWZlUGxmMVE2UjUxaXMxSC9ScwpFZzRNYXJTM1NnL1E2dGFzYkJYbmJtNDAxOEV1eUx4WUc3UFJHcUVtaG8xdnZwWm5TejZEb0JreVpiUkNDekJCWjVadGN0Rmc4N1ZOCkd6Z0YwRkpXNlFHcG9MZ1NObU13V01iVU16azJhN1ozUXdwb0pueVpaelVQWVQ0anBuSGpPWWNhU0VwbVR5U1pzemo0UWhpbEg1SHgKSzJzVXVaMGVSZTJMQkdSVVFZUitzY3d6SkJKM2dGMk5TWnV3NUMzK2ZsMDBsY3MybDZLRTBCZFR6WHBvZEt5enZoeWNGWnM1NXhqWQpnRFd6QWF4aEJoWXMxWFhORFBkUksyeWNkUVV5RGFqMUNHWmhTU3FINkpMUHFxUUJGTWk4WG9oSUxmb1p6ampHMU1OMXdwaGpQNWdLCldXZXBNU1owdzhxRVo0VFpBVHFjRnczRnA0a0JhUmFhV1RyaTNFTkNVK2VDOTRMRUNJNVF6VlRDWUppWktkZ0p1dE1oc3h6cU1GOFcKTytXYSt4a01uQ25idG9RRnpIdTUwd0tpTHhRUUVHZWVqRlBVRmtCME16OFdlRHJ3ZlV6OUlnb1loYWNNYUtML1RXWWpDTzFlUE4rQgpXWWg4ejRXcEI2dWVWbVJNdmtVejZXd01EeEk1QS9ZaWZCS0oxMC9ScVhyTVljSkprSmxWbUU4RWVTQUNSRlVRa0xkemcwSElNOUNSCldQVm9NOWdoMlF6Q2pYQW9PUUdSdUJVaXZkVWg1RGZEdDVHckpSWm02ZHJVMUVaemZxSTh3M3hBVzlJS0t2WlVOWDhqeWV2TXpNeVIKbS9oV1RRb2lSSGlqMHltN21RVEVpc1RNSUdZNFI3SmxLTjQyOVJZUkMwQm5hSEY5bGpTNCsrRkI1VjZCcHBtdWVtYWMya2JLdXRveAp2OElJL2MyQ0JaWWhXVUtraFErdVVtRjNZRG96N2dmTk1XN21pRElIR2tTNnlMQmlSSEJ4azBIZVhjbzJ6TGNFRlFQb2NUOStkcXZ0CktKM0lYQlB3U2dwdnJLeEdHQU44cjdCQWtzQXdrVUFvUVd6WDJlbWRzeHBwMlJLVFo0S1hzV3R3UjBaSGc5THVDT3VGWmpPQmZvYVYKdmJqQVFIeDUxTnphVEpXMVZiVkNxa1NYZFlyakphbkI2Q0ZTTVpxbVd6V0ZsQjBTQUVPcU0yVjR0UFVvY0lUSll2WEFaSWpnT3owRgpCZ3VJWnMyc0NTbGxoZmZ6OGJLZSs0aHpXS3VlbmFWcHYxblBLRVhUelVXRWZiUUw5UnlVZ0FRb21GNmdLT2dxS1pEdFhLeHZBais0Cjl1SUtyMldnaUE3ZkFpQVJNUWNnTU1RZ204aUdjNC9odlZnUndPazhPNmg0QnNPYmN2WkF2Q01QbUxPTHVCMkJrTmJVcmlLMEY4UmcKMndnTXMyZ2FXamsvMDAyMWRsV0ZxUWZnUTRlUkppZjFDV3E0dzZLeUZSMXdVanZ4R0dNVFEyaC9wZWtuV01UaEJ1NjN3cDVnc29XNgpyWXhBY1FENVQ4eHJxcldRdlFGOXNVTEsxZUFqQnZjai9mcnN4a3NRMGExNVZyQXJuRUdZaW5sV095M2NJMjVnODlQc1M5U3RFYUgrCk5PaVZxT1l6cTBTM0dseE5hTFRCQkpDSkRkb0hnSm0wK0RMN3JOcW9hWFpDVkN6MkN2dXNNbzZkZU9kMW1PY0dNTTFnRVMxT2dGcm4KUGRGb21QQ1dVSUI3c09nUUZGUGdyS2NPNndUdHdFUTdkcThFWVVmZUlnRmNEeE9URTNCMFc5NWFyeXNOTzNyUndDa0NTUUgyaVlxcwpwLzF4MlpxSEV6U3VidEN5T2NxWjBCUnVNNGJLZ0lBdXhqay84M0RaU2xWOE01c1Aya0ZjTmpZakluZVJ2MkhUeTdxaHVTN3FoUWVSCmJqYmtDZ3c4djdxc2tBMEw3Qmx3Y0ppcmdvWUFnSklnSVM5dUNnR2hiZ3pVS2ZRNEZRckF0TEtYNHNlcEZNcS9CejBpYzJVbDJveHoKTk1CeHNmTVFRU2d0Z2Q5bWJ0ZG8vc095cVdPTkcxTFFaeVFPQkpmTjN2bEZoWWtGY0I0SWdpMkR5YXFpSHQ2VVo5WnVDbjI1c1htNApZRElnQkZMdk5Xc3dRSXFLU0NOaFU0UDE3R0FIbU80aFZnTHZ0M3JVSVNBUnpEdFFOR2ROVXV0MDNQcEY5TXZDOGgxV0RTK2krNTFKCnZQU2pNR28yMm4xMnF5WVRTY21zUy9CSkUrbXp3UE5UdEU4NXl0QlQzZnNHNkF6U1E5RTl0Rm82R2pBcytvOFd2WnM4S1M3YjZPL3gKUjZSZ0E4OW1XdFc1UE5QS0xmMnRjQ0VMa3NRRWIyZHhnd2cyZ2ZTSmpBb0FBYUtvaHNJc1l6dVp5cUhlemR5WWNQSGxUYk4yMGVzego5K1UvR3dCbVZpdEh2dEtWeDM3RDZXK0VhU0VuTURkcEkraTZCNTlrRWtlcnRSWFZ3WkRES2xkTm9FbVZTWGFaa2p5b2tVSTNUS2ZxCkdlTm54TWtqdjFvRkQ5elV4OEF0MXAzUVc5S3NJTEJPWmp1NmsyWitaREtqcTJxemc5WVQ1WDduWnpBMzg2MW1ndmRVOHcwOGtKdUcKNUVhQXM2WDBJenVVdGhsUWtEcFE1Und1SmVpT1VQUkFTZ1dBNno2Q2ljMHNpNHI0aHBiSGhSNGRmb0dVdlp2R1E5RGE1OG9KMVF3egprT0d6bmtRQ1FZS1cyRVY5bExocWJrbEtrUU5uMDZZb3NEQXpHNjhpdStmbnhPUndNbnRyVDIzS1BRQkdGRFVxV040eDV2VW94VUJGCkdXZjZJWjR2dHplclNMR0pFS2pWY3FwU2g0SG1VSG5HQzRGbTdLRE5UNXhnSmhYVVRyb0I4cEFxb0tXaTZVdUVJa0UxNUJIcUxvSEMKOXFnbitITFdzQlk1SWV3akJDeEZneHZDWlQwbnZ4dmkxakxqTThpY296bWRSR2FqL2ZCTW9ybVpIazJ0TFdNYXFpWkt3RkhwczhhVAp0ampTTmNMSndUT2xrRFBCUXRGbE05N25TQ2dha2djWDMyeEhncE5JcitOcUdDWGE4UUpycmVDOHRNL1Y5dEcxUENKMEFJTmNGOHQ4CnpLWVRBNGMwYThKR1R5RVd1cW12UWRWK2VHY1g1cXd5SFJQUldKVFFreDI1dFl5R1Vod3FzNUMyQXFqQnBFdXpFc3lBYU9rSGw5RisKdUtpVkJpbUI0ZDlrMC9EWmd4QldKWkEza0ZDN0RaQmdNTFJOTUZiUTdIVTB6VUs4aHBjSmJoK1lwOXQ3bWN3Sk9TRkZtM3FLalNESQpBRE9CZkFsNnJyUENrWWo5Z3A5aGVPZnhZOFh5SlBESTVFMFhsRisxQXRVVHpTb1RtZTBOWjdwdUNvUWdBYndDUnNoNWRURjBNOXhECjBPVkExQnNNamN4RVVUVGRGblVvV1hmQjhRR3doOUUyU0tzbHN3QXVXZ3ZaekxkcVdTaVlNSFV3aUFLL1JkZExNcUVjK3RhcURodGQKQ0xObWN5SjJaZW5tSG1ZbjRacGNOTHRYMVJNN2RlR3pCdmhRNUVSZisyV0V6OHdHaXd4bVZFWDNMWXZkRFh3WWhPUWFGeTJDUERwRwp6WDlNdU16emUwSFE3QjF4b2ZCOTFYWUtzSjJDUXl2QkpyRHhRdEtrS29xd1NhSk9ZR1RpUTIvcXpPUldodWhpV00wd0pMQlRBUVBLCnpJTVJjRXZJSjBoblNWQlE2c1kyRU1uazBJOUVCZ0Y4dUhLR3lZNjhhZ2o5eWxSdnlPYmJRL1RwZjRocW1XQ1lQVStjVFlvSUpTRXgKcmJaMnRGOUZOekVHRml1YWFUY1pseG9Ndm9JRFkyQW5nU2RzZFZrS2x3VXlhd1VJSTgwbkRJdUlOaU40cDVobEQrdHh6aDExTjhOTQp4VVc2YXBZRldnMnh0TG1kTVN0Q1prUWNoWmwyR2JZemdLNW1WVlVJU2t6R1pFQ2dGNUlFOTB6aEZIakloUERZRWhCUVljZVR3Uk8rCkpsdUdKVU1HeW1IV2RjWVg0em5TOEYxbU5RTEJMMWF4Z3VEdGhyY2RmakVDeW9CVkMzNVVLb2haRVczcTBZUDNEQ1lwd2lJWHZZeG0KQ2RTQWdPeVhFUkVBWXJXazNCVG0xbVIrTVJBZzZSTTQ2VEpwUmhiQVRLNUxwQmloWS9BWE1TYzFVLzh0RGFIQVphN3ZWdFVwQXcyRgorb0NpNnhaRzNCUGdCSWdQdkMvQWUzZWNWcVRXc0FZREpPUHp4cytLZWxrdERuY05LcmZxUlVsZEpraEFIaFlGUFJGK1BGNG1mQ3BxCnV3M3l1REo0WDFURmpNZDJRVDlIUTNtVW9odHVKdGR5alNYb3ZmSmlBYjFBWmNKQUNLOGdnN2JYVE1WNnJicDhuOXRJYzVVQkVNeGcKLzlWMkpRQ0NpWFdEUUw0cVRxbzduUEdFVldHUnE5YWhWN0hCSkVFb0NsZk9jenZTYVRZVmZjWnkzNmpWVUVLam5ZMEtTOVUwRG5sVAoyNFFLamFwVHJXWmQxRlBqWU1OY0ZWeEpOQzRVUXpDSTFOd25XWkdyWUNQMG9PRVVKZHdkekFiVEJRUTZKRUJ3dSs4TVVLVThMMmcwCktNMW1aVWN6MVE1ald2MW1henRVYmxNUElUQmZ0TmE3alI5Mkp0ZURHVFlNRnp2ZVhUa2o1bVdnOXI0UjFLMnVESTQwYlZYY1REQ3IKOHRhZDFKRDJkTTY0M1h2Vy9HUU5JUnd0WG9OQnk5bWxscWl1eDlVUVp0anRaK0JUMXVyaUgxWlg1bHhZSGNjSElrTjVRT1ErRkZOTApCWUJRSVNVczJyRGJJSHBUT0hpQlFnQU1Ld2liNWltaUZqNEZvd21PdG9lblZVM2hhNXNoS2cvVGtWczVJU0xOVGdtcG9BTEJPWTNKClVXaURHd0pFTnA1cys4cW12WjhKZjI1WHV4QjI5Wk12bURGUFJ2Mm5oNS85NXQzYkY2OS9mL2pKOFhqOS9QbDNydz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJZnYzbTNUUFUzY1ZiMlVra2tCWUllb0JWRkZhTVYwYXRqTU1Jczh0UXhiTHVoRmxSZlJRUW1DNGFsbE1INzlCVVJyd0VxSFZSUVlJWQpWNDE1TVZ3K3BWVkd0NFFXenJBcXVnOVd4SVcyZHQ2VFVUQlFDVGN6OHFuUDBTZ3FUbmhpNGw1djArbk8zQitxTkxrakNzZVpGUmNDClZ5Z2U2b3dqMjZEYVJCYzVUbFlGcTFmRDQ2Ymh1bXVLcm00Rm5jdzhNSFpXVVl5cFRFZ0lSaUVPK2VUQ1dYZE5VSW1uSVNXdmFqVzIKSUltZ2dSdWcwQVRodXBxR00xVUZEK1BwS1h6Q0dZbFo1NThCTEFkRGNUbDNnYU8rRW8ra1dYNEpxWUZITE5zNEZzWjdsS3VtOHVyWgowSlZFNHZoQXdHRGpjN0JSWllRU3JscVczSzVLd0RreTlkNmlWeEVSQUoxK0NScmZRQTY3R1hwRzN3eWFYT0JKZzBYZkxLblJvN2pOCkdad0tIQmJiVllOeEVITTFjM0VTNk1wYTVEQlJ6WG9rSUpaanRmUWxUWXJFazRPb1V4dlltc0IyVmtyamlIeUVZUXMxZkhlanNzcTkKSVN2N0FpUU9DdVpxU1VIMHNFaDFaTkVaZStQYTYycEpYbmdjdEdYVDhCaHY5WWNHNXZsTFFLZjdWVXhVd3hRUm1MMVVjVFl5cG9WRwpBUUNqd0dIV2ViQjJKME1acjdPeFJvaDlNSUtnRmtlUi9vaUV6M1gydE1TZ3dWS0YvVzJlRnp1eE0zUDdoeVdOclVBU1hvTyttRjQxClcxOW4wMFdpaFNvV0lBTWhwRU9hWm1ZT1FJeXJPWGlBVjREd3lTMTRVNTZucHVwTndmaVJhRTdZRExlT3pzZXBHNGdQYVpXd3E2NkIKNlN6VWd3dUJCT2R6QU9UdmNremtzQXZEZ1pFOTgraU9XZ3FubWU2dHlCa1BPWmZ4WmY1aUFNbERuYTIrR2lHb2NWa1ZjMFh6UEpxTgpNZml4SFYrRlREbFlSVEJTY3c4RUFSQUJuSlNRWjIxSDB3aXRxZ2k0NTVBcDlwSDlpV1lLcE1TQTFGUm1sV3pnRXl4b0J5bldaN01SCndla21NaGJXaDd5NWVzbVdxbExDRE9nYXozRkJoRUJkMUJYTm15MUpaVWpLRWxpTndDWHprUllGbkpNQWl3ekVoSWF4V2VpcUpWSGgKUUt5MU1WRUJUZHBzZU5FMENUUXQ2R1ZaK1JyVGVLSzdnV1dEL1I2eVBGMDRUaERCa0NZWnZjeUp5WFQreFVJcmNEb0U0SStSR0d6RgpSYmY0RXNDa0tKUzFXbjcrZkNHNHRnNEVoSHU2U3VuRW10VmtIK2ttbUl1NjZ6SDdmVDdDSGJINXdiQUF3aU9lRmhZOFFyRFdXZk9pClFSUmtaQmQwQnh5NFNjM09XUSs4Y0VrSFFKY3huSENyaW1VMHI5R1ZWakxIcmNXUmNMYmpmSGEweFNxeUNEaldhOVMxUU13Z3hxeHgKSzZ6d2pUN2l4VmVWMm5CbjErY2hrbURoYmJScTM5aEFpd1FWV0FuR2pJelpGUFVpWFRGTVdhamU3NmJSZ01pejl1QVM1enNnTVhwbQpSS0ZLdW93bmluUnJ0N2pxU0tXb3Npa0Nxa2xBQWhxNHlNbTlHV0hFQ2t0Ykwram5va2V0WStMQlEwZlFsdXp6Q3Y4Q0VqMVZUWlRSCjlBVU1zd0lEWjZRaldUVVRNcVZQSE15UXNwNTB4VTBYUm1wSURNcXVOc1hjYk5WV05RQmQ2bzVHREF0Nk5qSGVWTStUYUZJUXJFb0kKQnlSVnA2TzZCK21maHA1REF1RjVjRkM3dnNiVzZxcjFvb0w3cW1xK3BQQVZrMFd5a05JQmREUnlNSW5acHNjTnAyQnlEUFlWUFpJdQpyN3FqTzRZak9kRElJQnJFblFDS3p1Zms0Q1ZHRFN2ODBJSGRQS2lJMHltbzQ0UUU5YjliaEF1dkk5QW5MRDNtbkZRT0QrelZ5NnlaCjdEY2U2QUNLOXVpc0hJK1Via1FyYW9RUGxCWTJUV1ZLVHNIOEs2b0tSUFhJV1F4RWJydXBScHJEeXNaM0FxYU51RHVBQXkwcFBUTWoKTzZHWnhHZ2M5MXF6UVJZQ0FYbkxTSUZlc05VZTFtalUxZUpWTWUwQVR3bDZXSUxLdG51NSszUEs5Z1RhODBDWnFwTlprNmtGRGZXQwpqTXM0ZHFDTUNUSkk1ZzNER1M4RXppMmFhWW5xbnNaaVlZMXB2QWlQaDZGMkE5Mnk2a25yM1BxVjBmdlpGYXNleUtLeGhKckdrSjZ1Cm1ldUdXUTJoZjJuK2c5UXUybGE2ZXZ5aW9zbi92R2tsekhUaE5FbVE5Nkx6STNxbXhhQ3dMOEFlNlE5ajRDQW5qZHJQK0dhQW0xY2UKT3FOdWMvZ2hwTW1LQ1UrRXB3Rytrcmw1ZUM4R3oyMTh4Sll4a2VkSEppN3NhSGtsNExnbTB0c0RMN0s1bzhMTUdEYW1qcU1yS3FxNwpHNFNBN2tnOWFCTDNTbkR6SlpvS1VZY29wLzZFMVZLWHpXb0U0bFhZd25oRU5mUnBUWkdta2YwZVA0ZlFGM2o2Z2JOb0VTOHczK01rCmxzMWlDb0RPd01sQ1FLZlJUb1Z6WUdnMnBybkNyMW9zRlJkcy83TW12YXpBSzh5UWl2RmVPRmNjeG0rbVUyaEJiSXRCTElEbFYzOGQKOFBBdzdzSWgyK0lWT0lteFFIcHdQcWpvU2JoQWFmZml3ZVdhRjJUbFpnZEtRUmcrOG5ndUxRUU9salBJNEYvTVYzcHVBUzN1UG84UQpSQ2kzRmNHTEFwT241ZllWZ2xES3RaaVJqY2NzV1pDYWhxVERSdGloMTNva0djOEVObE1Zb3ZXWXNpSXIrb2FFaGNjTnEvSFVMeXRRCmFLRHB1Uk9abHVxd2VpNkhhcGtuTEtWb000WnhPSXZucDRqcU1RUjhudmxBc3UxUmhlZ0d0U2N1bk9zeFdrNUxxRnF3aFFFTHFPYnUKMlk1aGpZUGRyUUp3eVVOVHpUY09WSUllbGFyUVp4S2dMc2N4WWdBZS9aWEhBeUcyU0kvOFlob1JNT3hpWjN0eGprYW1wZWdISkcvMAowRzBlSG1vcFBia3QyM0ZMeUNyaS9Qakd4b3dSTEF6aENob2hTV1JKTXNNb3Zkd3crS2JZTlY3NjFBSGVCSkZCUnZTOEp6cFg2RlpVCllNQkt3emxOQ00wNldJVUpwcWpCaFMzT083bGR0bGpLQnh4cDBHZElVR050V2kzWFY0dk5UYW90YVl3a3BEQ3pwdlBkbGszUmRqeG0KZ2FHd0NMeExCTWtraTZnbHM4WmhnL1BjczRRd3BDdDU2RGxNeE5pK2s2bG1yQUhzSmhDVHBaMzNaeG1yMDZaNFl6Yk9sSEtiNWU5QQovSzRzdUxScERvaG0zNGFFbExBRlIzMHp5a0xKWEg4TUJhL3FBaUNhU2tjdHFzZVlpejdZSWR0WWFkbGkyZ0VneE5URGtxeXpNNE5WCk5UamtqV1hBeXJJcUxDUWpoUWVHWXpHdkRXcmtHdHRsQkd1RHFORTVGbFdmMVVYR3p6QkE1S0lHQ0wwS1JneGhUSm53WVEzK1ZKQ0YKNTZGWkxDOERRbEFoaXV1WVlXWEJDYUV4S2F5RXZZbEdWdXhOYWRIbG1zdGdnNGViaFdrM2k2cThJTkJRQUFMRG5rQ0F1d1VFTjRXQgpTRUVEYlRFYUdDSElzSHVDNEhkVDdGaFJDT0Z6MndtcExpNUluVkUxU2JuT3E4cmNJZ1FjZ2w4bHk3bkFxd0x6a1NzeEdWSWYxamxtCkc5cXFmUTZNblN2TmF3VWlJaFU4b0k0RVFyYUtoNFBDMVErSFZORVZySmNWVFJDQVkrMnE1ZDZtWVk1WldSbkl1ZXFaS3d3VG5vM1AKUWNUVm1MZk1OSmR4dHMwNWVWenJxdkJyQUluY2trTEJEUlp0T0ZZM2srU1NmbGF2RlQ1elVnZDF2ZmxWUEVNQ2dYcmNITkJNcGY5MgowVTlFSXlVTGlsUFJKU2lhQ0lwRlpBeFBOZ1JRdEN4QzBjS3QzQmZtUWhuVHBqQkVwMnFjVE1vODlWcGRuMFRIenJRbURqc01zQ1E0Cnd5SzZQMmkyQS9nWWx4Y3RpTUk4dW5rZXdoMXBGV1dnbGFzMW1OUHcrMVlMV1NLU0tKb2R3OStOOHBOSVlSdDBEb3BsZElRdjVxVmgKYUhaUzNnZ0Frb3BscTA3czZObU0wV0hnc1J4TGlubFp3MW9vMExmREFqYzlhaHRTTGIxL09MR1pSNlFWZW9jMVZ4Q3owUTdDRWd5ZApWVkU2QkJ4VGRNYk90aWx1aHArWjc2anF1dk9yRnJxQUZVWFB6endCemxNL25RcmduMVc2QngvR0lvZnFuS0tmUWltekN4T0pKMkN1CjZzWGtIbHV5SjdLYURZQ2FOVXVCTXZsWjVUWFk4UmloRERNZ0pPVjEwWEJvcG5MQS9zVjBVS1duckdJWUY0aVc3NEdHWHJTZG5VRGYKV3U3cURkcW1teDhlNTNtMkF3L2dMV0F1ZUNJR2c2WnhBa1RmTVNqME5xNmFGbzN2eStNR3dURmhUNG5aY3VtcXM0MmYxUUUzTjErdgpWdHFLZFlnR2srclJMN2g1VUF1ZHUrMVV4QTYybzZBV0pqRXNkRkFHQVpCSEZCZk9FbTVTQUVEMGxnRlVzNi9EKzBlRG5OVWlBUndGCnpUaWdBWjQwS2lERjlFU2U4d2VyUkxIVUtjemJpeTJtakxsVVNsV0JwdFhDOVhDU0VaaUhTZXlFdW95WEdaRjUwNkVQVk4yK2dZZGcKNHZOcTV3TTVRV1czcXRieFZtdWIxVHlNb0J0R1NEZkMzR0ZialZnOWl5OE1vd0Q4MUdUeVZiVk1HalVPSHRxYWxFTlVwcU93dE1SYQphU21ySGxUQWNPMjZFMHVUeHRIVmFNSDUxU0JCZ0NDU3JlRm1SUzlyTm13OEVyTVhnQWhJSE1PL0VFbk1rNVpYd3djQ3hGM05EY0xwCmlDUkZLMDEwbWs5bVM1cVNOVjJwYXNjUXBVcERZNE84a0lqRmh5R2lvQXdDWE5nNEFwVU1HeW4xNEJsaW5udGZubHN5ci9GR1l4OVIKamZBSTRqTnpGbTVKc1N0b3BxVlZNakVFUGg4bVRFVzJzVVJ2VmJaZGI3UDFTdHVKSS9Rd0gydFdJNUpIaWpIcUNKTzNNR0ZVVUdOVQpOU2VYM2k2bzFhWGFoczdMQU9tQUNSMTZLd2dVQWFzRlVmdGw5QzJEQ0E4c0E4cG05blZtWEdMVUdCSm1kc3ZkU1JoaDUwSW1MNDB2ClhEU1BCM1pYWmxSZ3gvSTR2RmhVbGRWWHN4UmlvS3FDczdseUJRb01qUm9ZaDBRc01GVTRPRm9mcTI1bXdLanFKbWNlQVZJcW55SXEKREpaV2phMjV3Nkx1eVNGcUh2VkV6VkVEVXV2WVRGRTNzWTY0TzFBQlFiVGM2ZlFyY1JzMElKSzZZbzJnN3hmY0JMSnE0QUFXSVBnNQp3SEFVWWJET21DSFBLY29VaWlWbWJQWGdRb0ZLUjlHSitLQ3FhaGllc3dYY0VPeTlXREN4YXRCMDlDd2FKY3lNRTd6U0k0azd2cnIyCllHSlZJOERQNkV5RnlrWWhDTW5YR0dRYjY0QzRRYlJYc0hlazEwdlY2RTJQMEtINjNTbGhpQzNveEtnNTBvdW0rWUdEbFc5RTRITDIKQ0J4WU45aXA4R1VsbW8xTlZZRXUyUklQcWdpVExYNk5kczVTTzhySHdyMFh5eEFCdlVnVE9FS3kzelRUa3NvbnRJWDYwYzY1YUZCKwpDRXUvZzZXUnROUXJyTVB6NVlDcHlFMm5ORUFGckxtYUxtdmROTW9aa1ovY2xRbWpZdUtOZVFUWEI0WDdZL2xEaitPekJxdW1xZmVECkpqWmtoN1hEeDRMQ3BCaWFSZUVhYVU0V0U3V29wREV6Z1JvUHErTGg5RXBtZFYySC9rZDRTMUdQdDY3aWJFQksrdE5kd09ZWkJId3UKYzBVeWZSVlkzYlphMU1pcGJIVHpHUVd2Ly9KSUN1Y1BidWl2bjR6NkpOdnV4K1haUFQzUGJkWFR2OGVzdTFpcG9kU1dkRGZ5U0tyVQpjdTdDNEl0RHJzYVV1MmxUOTZLbjNNV2hvNWovbm5GMzVUa2k2NWh3RjdvMFpyRG4yNFZHS3ZkdDZYYWhRMVU5VXJCbDI0Mk1hVmxhCnNsMTh4cU42cmwxOFhqUkRiMHUxeTJ0Q2JwbDIwVzRwVzB1MEd4bXp2a3V6QzRTaXBmU2pReEYyVmxqUE5jbHVOdVRXa0dNWG1HbUsKd0paaUY0R1NNS2g0aHQzRkVGRzdCTHNqa2ZsMWwyVEpXejI5N3BMVWZMdkxycnNrUmZLMzVMckk1UDcvc2ZkdXU3NGt5WG5mRS9RNwo3QnNEdG9HaEtzK1psMUpiaG1XM1pFR3daQW1HUWRETmxrU0RQU05RbEFtL3ZkZDNpTXlzdFhvb0Nkd0NmS0VMY25yRnJxcC9IVE1qCkk3NzRCUmRSd2RhdHpuNi8wTHBNc3VVUlpOMXFoWS9CdXMzVDZNM1ZoYVJTN0ZkamRZTjF0cW02aU5qb2c3K2d1b2hhNURJT1U1ZTkKZWVZNlNGMG00MHQ1RTNXYmkwTTJVTGNWYWUwMlQ1ZUczdDQ0M1ZiTVdRaWFMbzZUNTJIcE5vdklYaWhkdE1RUnVVQWtYZWdmQzFONApCdWxpWlNhVXdzWFJaZnF6OUlQUlpjSFFPQkRkUGtQQ2RERjA0ZkVYQzVZNGQ0NGh6V2tRZERFSGkrQi9BWFE1VmZkNitMbXMzQXBVCk1UNnhxTzk2MFhPallzbjRYQlNKemNQTzVaOHV6TjNSZVhpM3ludWFuSXVPTUpwQkRjNGRsU0dpRzVzN0hLa0lhaTU2SFdDbURHZ3UKa3V3b3lMcVp1Y3VOTlFLWnV4SXpKUUhNeForY0JTNHdHblpaTldpNUsybCtNU3dYN2hOV0p6Y3JkM2JsSVFPVml5OFlxODRnNWVLOApxL2Jkb0Z5SXN4QlBDVTR1UzJMeHFRUW5sek1jSVc0M2NaalRYaDJiazh0Wno4UmJjbkl0SWlzdlRpNDFaUGpJemNtbGdpeEpDcW4xCkpBelVMODRiWHRXMU5nMU9MdTc3WTIzb293dzQ4OHNYSlhlNXkwNVFjdlVacXcwVksxQTRJeU80ZFdOeVpaeHIwdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJYkdHZ0dyeHZ1dGFqd2UzRzVQSmRvZHphbUZ4Nkt4UmtYYnN4OG5oamNwZnB6a0hKQmJzaDZaT2dDQlg2L2FZRjEyYmtycXhmQ2tTdQpGMEFCeUYzVCtxbUxqd3NiUHFiQTR5S3FnTnJ0b09QaU5GcTUyYmpJdUROV0lqUXVYdjFIQjZYdUZXSTVDbG9QR0hlaHFxMmx6Y1hsCnkxT0Rpb3U1RWl1K2k0a0xQcW5iK3pBODI1WWNyQ0RpdGtObjJ5TlFzKzR2ZUxoZ0Z1QkhBNGZicFBpN1liaE5ZYTlBNGFLK0Y3OFMKSkZ6OHpWKzVTSHBJVUVBc0hCemNIazJPbkl1QXMxREdEY0h0YnRRVEROenV4R0FnY0JIdnhpdHpFM0JaUzl0SEFIQ2hSL0pycjFrdApLWTEzNDIrclMzbUNmZ3ZPR2ZWOWh0K0tmMWRlN050cXZFaXdiNnVyVkFKOWk3K0Jjcm5KdC9zNEJ0OHl3UUhaczhDM3Rhb1kvdWJlCkZnK09nYjFGRkxxV0h0UmIrRkR0NlMvcUxWZEVxd1QwTm5jOTkyRGVmbmJOSWh3cEVUQW01MW5leUZzVVJTQTBaZUl0YUJGTmZGc0MKYjV1N0M5NjhXOElobnJseHQ4M2xTa0c3eFQ2Wkl0dFRPSXVWaHRwRGluV0wzK25zNUM2SWJjdGFGMXlnVzZJUkxocHVOUjAzTUxmSQpVeVB5ZEZGdVVXZGVSdDJRVzFSc00zNXN4bTEwRnJzUnR3QjQ0cFV5MGJhNVdldjVrMEs1bTI4TGhIRTVkTnVXbmIwMDNCWi9zNFQ1Cll0dFc1NWNEYmN2dkUwWGRJdHZ1UHkrd2JaMUt3Z1hZOW1PaHBNSlh3MXFhS3dodXJDMXkyNkI3QnRhMnVZWWdxTGJ3UW5IWGI2Z3QKM0poZU45SVdJd21URjBiYTRwK2JPTGliYUl0VElVL09RRnNreWxBQUhEemJWaG5MdTJtMk1QR0xNczRXZitPdUI4MFd3d2ZrSGpmTQpGZzRYNGFCbTJVS01oekJMc0d5QlZXbUNxdS9KQVRsSERySWkyVUtiaU1CRWdHeEp2eXoxeGJHbGt1SGpKZ1hHdGpvWUVCUmJnR2N4Ck9OOFFXeUFWTDRSdGRVNDVDTFlnVWZKRHZnQzJoZjFFOHViWEVqejU4WG9FdmhaL3AxVmU5TnE4eEc4TGVHMVc4Qy9RdFpuUThCZTQKdHJoMXNMbTFoZW1ydkxHMWhjclEvS0xXSW1XV1ZmVEVpbUpRbUhWZVV2MTB3TUxYQzFtTEZFUStGRnNvTXJpcUMyQXRKQVZFZXI2QQp0Ui92S3g2MWdiV1k0L1NFUE5XakdyKythYlVvTFdqandHcmgrai9qc0dvZnljOWZxRnFnMXNZNHBGcmNuSXRUKzNDWXV5bTFtSmhRCml4bVVXa2dlaTlvUnFpYU43ZWhmaUZxZ1pqRXZiRVF0MGhLaXlJcFF1NFFWZWdGcWtUbDd4Z2JVb2l6bTBHbXpaWGozbElvVVpoTDkKbElJQ2JsUHlRZE11ZFVCOW9XbVJOVVloVDVCcFVkSFcxZ0hUeHQ4M2x6WnNnYVZkV3N1Yk9BditKOWJZRjVRV0ZaVm9wQnhiMFBtdgpHMG03Lzc2SXRHRUxJQzNxZlhEVXphUDFhM2JqYUJmTHhldW0wYUo4SGk1S3dHZ2ZMb0VGeTlpYXhhMHJDaG90NUIyRVdRU045cUZXCnJMeHB0UGc2S1JJSkd1M3ZtRmJDV2pSd3RBOHJac1VDM2dNT3lqOTd1V2kwOEtyd2Q2RGF1ajd6bTBVTHNpRkFRa2JSZnJ3c0hBTTMKaXBZcXgvSW0wV0tXZnRJRzBRSm5NeEcvREJBdFJnaUdRRzRRTGJ1bnozbEF0QS9vejRqTUI0a1dxMklNakRlSVZoU3RkRGkwai9seApnYUZGa0tYTUY0VVdJV05FbFFKQ0M1bk0wMG93YURIdVBDTy9FTFNZVVRycVNrMmdCVlNBWlVOUk1JTlFVU2t2L214dUd2ck5uMlZsCnM0cVhtV25IMzFQYy9aMXF3bUZLR3hzK2k1eXlRRUxXYkRhRmRpNzBMUHl3cmlKY2NwdllkMm5XRFo2RnlCQkJtSnM3RzdiQXprSWEKTW1mYTFGbmVFS0kzams0Y0FpTzhLOEdjaFJRQVkyQWdaL0h2N0E1eEVXZGhtK3k5STBsTGNSMTM4R2FSWWMvdFJadEZucDFNV2NObQp5ekxjMUt4Wk1HeGR1YnlyK0twMUlVR2F4Y2pHUllRUnNxMG9WWDl6WnVHd0kxNFhOc1R2eUtBelpUYit2aUd6MjJiR0xKcnpQa3ppCjZqMzY3TEtHUTR1QXNLbGNGMkpXRFRGRzM0alpWRjFNdFJHemtDSUloM1VJczZrNGk3c0pzOWhLdUZHTGVmQzlNT0J4QTJacFRSY2wKRmdiaFJvTXZtMWdSMk1hYkx3dnBBMHV4cnoyN2FQNmJMMHZMek9YTmw4WHhLRi9jZkZuQlFsYzVmRmxwWWNvbndDemg0c1VKREdhNApTM1plSWdDelJLZU9OTitBV1ZxRkhEVmdGdi9Cbk9ZR3pQSS9tRjY2Q2JNQ3k1WjVDTE84T2tSbk5tR1cvNVNNNU4wUXF6eGRQUmVFCldXYWYrR0lFWVphUGhwQzBtekNMQkpGU1VTYk00ajQ5ZFpaRG1OV1RaK0xySXN3eUw4WklZUkJteVRaRlZYa2daZ21pWitqeVJzemkKQjFEMnNnbXpPQi9seDRJd3kwTXkvSG9UWmlsc1lwUXhDTFBFNFdmM0xaYk1NcHY0OVNMTVNoTFZEMkNXQm5ZT0NjQXNMT0lTM1lSWgp3bG1adnd6Q0xHS1ZpdnNHWVphQlAyVVlMOElzTTJQNmtFeVlaWXhuK1Q2eGVtMDFRWFplZ0Zrd0Y2UkJGbDhXREVRQ3N3TXZpMFpWCmFwVjI0V1ZYaStwUzgyVzUxVGgwV1J4bU9lMjU0YklJMmZEQkJsdVdnU2tWVlpndGkrdWdFdW5GbGwzTFgwS2daVmNTejIrVFpaRWMKU1BYTmxVV2NVTzNEakpXZFJiaXhUWldGQWV2TkYxUjI1bWlhWnFZc0RLSUNHaW1yN0VWNUUyVlJvcTN5VVFObEdUNUQxbjREWlpuUApiMk84Z2JLODVQejBBNVRsbytOWEdFQlpjREFSbDd4NXNzdTFpTWJKSWxiRjRMOXBzdmk3OXBzbEN3dGxKVWJKNGdDUG9tc2t5UksyCitmRTkzU0RaeEt4N1Nwc2txemk1a3d3c0lNRHNKNHppUlpMbElFWVljNUJrZWRPclhoVnhHbkNqTUtyZktGa0cxSWNhR3hJbFN3T2kKYllHU3BjRUUybzJTVlE2bTVZMlNWWnBram8yU1ZmNWx6UmRLRnFkTWVWaWdaRmx1dy9yYWFQU0ljbE44SHpkTGxpME9vQ0VJbGl5RwpkbjVyWnNueW5yQlc3bUxKMG9qNHVWbXl6SXdqQWgwc1dSaVlSTGhac2pBR2daWXNXUm9RVndtV0xBMXNTM2F4WkNsNXBLYkdNRmwyCkJNSFhIekJaREI5VUhOdzBXY2tnODl3MFdXNkYyU3Rvc2lrN1ozSFRaR0ZrZWlGb3Nsc3NLWnBzSXJ4bnRCZE5Ga2I2RWtHVHBRRmgKdktESjBzRG1NQmRORnFNMktibUd5WXJvdjFMUVpObmFHd1BXelpPRmtXV3lBWlJOcElhV3VZR3lOTENLK3dMS3lvaGtoWUd5UEE0TApEZzJVaFlFczl4c295MDRJeUxZSFVGYkZFbmtGVUpaOVFQa09YMEJaMWNZQXpXcWdMTnJWY05JT29peVV6eFMyM2tSWnlxR05rU1pSCk5sV2pmVTJVNWQ5OHB5K2tMSTJRQ0FSU1ZxcnFyQXdST1Z6OE5XcVRicVNzWk5UNnJpblFZT09mcFZwQUVtVzNRdm9teXRLdGExbUQKbkFTZUlQSFRtUW1pTEVUMFQvb0VsSVV4c1JneWlMS3dlSXA2b2dkOFBYbkdqWlJOcDMyQmtiSThGbnRHQkZJV29uaXFMRjlJV1Z5agovS3hBeW5JK1ZvTFdoRGE0TitNVFVaWktKNWFYQlZFVys2bWdMWWl5dUJFaUc5eEVXVWpZVFhVM1VSWXZGaitLQU1xbTVvNlJMNkFzCnkyV29DQW1nTEx0d0tUVnJvQ3g5Y1FDU2JxQnNpb3ozQnNyS2NuQ3lYMTM0N2R4akxIMmtGTjg0V1VFUzhxYkpZbXlsTk5vMFdUMzQKbFY0NFdScmhpd1ZPRm9lbWdEbDRzakJ3VnJwNXNreVR6N0Z4c3Z3YnMxVHdaR1hvNjhXVHhZOGhqUnc0V1g0UEFralNqOExNWUJUWgpscXNodjRZU2xjREpNaStaK3ViRVloU2FiYjVnc2hqUG5GbWtyVWRyVGFGa093YVlaNzVJc3JBOVpyNU9iVUpNaVRpeVVPZk9GMFdXCm5lZytibHRBWkx0ckE3MEovc1NRY0NOa3UxdTZCa0VXMktoSFFXSEVpTkFxRnRQRHhZOGxqSFhWTUxIWGErdWJIaHQvWC9EWWJUSTcKZG5yT0RTb3NXS2tzMHJuSXNhTXBhcnkzS1FLRUJEZzIvcjY0c2R0a2JPekh1VlBuYUdyc2ZBU3R1cUN4UWNzTlp1eDhOTFFGTW5ZKwpiaGgxRVdPeGo4bXZqTTFNQzBpQ0Z6c2Z2Ym8zTG5hNEJVN1FZcGtiVTRpS3RGalFCTWpOdTJDeGhJaVd1Vm14QVJVTlZDd0MwQjhECndRMktoUW1mVW9CaThUZHlvY0dKSFNLMzNwVFlZYWxYUUdLSHU1Y0VJNVpCNnR4ZmlOaHVEeUVRc2ZqY0prdkU1Y0dONkJad0VXSUQKR3hXQVdEUzhRVFl6K0xBOUszbC80V0ZwS25uVFliRUxrWVNHd3dMNnd3em9nY09DaUZYR1JzTWltWW1Vczhpd2dHR3hIMWw5NWJkWQo3Qk5jV0NSbUtWY3hGblo0VFhoVFlkbk9sQldtZ3NKMnJYRUNDZHNOL2J1SnNEeVJ1bm13YkROOWFMQ2RZYS82Z3NHeXVBdHZvbG13CjNjVE9RTUh1UXh3UWJIZCtMeml3dzBtVFozL0Vvc0NDU29GUUJDQ3dHSlBTaFh5ZDBTYmpRc0JDeDhYVlNXeXp0RndLQUN4SlYwUzcKSHY0cmlSV29JVk1xQ1g5MjNpUFJYNmYxQ2pmOWRSbzBHL0JYcU4xWnZXVDJLMUMyS05PN3lLK0xvZDJ5d2E5WWJiTEJnd3VDNCs4TAorN3BOcHI2QzY5SkY5aHRXam5HZGNUTmZsNkV3Z1h6Rk9veWZheUJmaVRkb2FoYTFrYTh3U2xHc2lCVjFIUXdlalNoZDZacktMK0lyCmdVaEQ4VWI1RTVCYlVVdHE1Q3Uzb056MFFyNWlDdU9vSGNoWE9KUmw4MTVuMFJPL2NhOVlKcUhTUDJpdlBKdEhHNm5pRjM3Q05LSjEKMXczQVZjQ1ZCdTVWYm9JZ3VXclRsZHdwOXNhOTJsVW9HL2NLQTBlendMM1N3UExsQy9kS1A0c25idHdyOFFrWWVvTDMrc1hsK1BHSAovNks4VjRiUXdQQzVlYTgwSXNvWXZGZUYxVXJlZ0ZkR3kwaDN2NGl2RElwQWVCTEVWMkllZUhBUlgxZlZ1M0FEWDNIQlhKMEg4SFV2CkJBUDRpckFYKzN2ZXdGZTFQcFREUXVJckRUam51Z042WFk1QXZlTjVvbFFFOEZVUnRkNDI4SlUxZlNTMVg4QlhCcFllSjdNa0srb1MKa0FmeGxmRUxacXN2NU90MkRJMTg1ZnRub1lEcTR1bktJa04vSVY5dkkyUHV5Ukh3UUw0UzZkQ1VwdG5JVndyTklXSUo1R3NpYkRmbgpqWHcxdEtLOGtLOVVDRklQWU9Tcm1HQ3RiT1FySGlFWE9UZnlGZVVaV0VJRzhSVmxSVVFtcTVwMXVhbkd6WHVGSnNsUWFYck44RWt4CkNnVHVsYkdqcWk1L0cvZkthRWRYUTJQeEJ4NzM2UXpjS3cxTmxYbW45b1hHMmpmdWxjZEJoRE53ci95MVBGKzBWOGJvMkJ2WnRGY3UKQnl2ckwxalB4d2dUYVlNSDlvb3dqUHMwc3pvSXpDYXNFUVAxeXRLSlhGK2tWeFFORVJwcjBPdVk0cllGNTNXNFNPdkd2TUpXVkpGSQpWZnR3dldoQVhvZS9oaHZ5Q2wzYU10TVZRa2pSTW9Qd09yb2lPVGZnZFRSWDI1dnZPb2FLVUUxM1JZaUZyUElMN29wK0RSaFRBKzdhCmw3dGJtdTNhSFd1NzBhNWdEaUZvRkdUWHJnaGVjRjNKS0JydGhYVmw4eEJrcGtSMXhSSHdoZ1hVbGYyUXgzZ3hYYnVyTDZPTUZUMHMKc2lyWFdiT0dNOGQ2K3lhNnN2OXdMUnZveWtMcm5EZlBGYXdvT0hrM3poVXViOVk1TVZtR0xvRkZsMEdZYTNVVjRNMXl4ZHJSemV2cApZTmE1QWJBTStlTnZ1T0EzeUpVTnpVZmVIRmYyeXNsbFkxd0JJSVZ5NWFhNG92NlJMcmNocnExcG0yQzRRdG1DdGZHTmNJVU5ybndnClhLR0lhVUt2Y2pVSnhZeHBiYnQ2dkZVbEpBTGcycXJrc05jK3JDQzY4YTJvQjJmSnU1a1Y0WVFIdmhXMUpKZy9iM29yUUJQNG5ZQzMKdHJsNzBuTE1SeFVNeWJvWHV4VTJmRHFCYm0yZVhvTGNpdk1vSnNSRnJoWXljSVRhREc1RlFuRWNkUitJQUVYaTJZMXB3WlV1MXdvQQpYSXJGRGN2cHpXeWRiaVIvSTF1WFZ6ZUJiRjN1MHhQRVZtaDZpWGk3Z0swUWpMS0kwYnhXbHRDc3RYR3QwQ2NqQUhmUldpVmozcXpXCjVUQjJvRnJ4ZC94S2tGb1ptSWVySGFUV0NLRUhxQlYxUGVBZzNKeFcxT2h4N1dsTTZ6TEdMeWl0eS9IY0c5S0tuSURlakFnb3UySTcKeEtxaU9lWHhnclRTU0t5dzVWT0pHTTFjTjZTVjRXejRxamVrbFEydUVmb0xTQ3NtZHNNQnlXaE4wWjdnWXJTZUk1blJDZ01STk1GbwpwWG9mUVltYjBRb3ZKbDRJcGFuZ2dMTjN0aG10VHMydUY2T1ZuaGRiUDVqUnlnd2tacDFndEg1eDJDSlk5ZjBZcmNzdFcxNklWa1JkCktmUVBRaXVpcmxHOHdQVU1wdlJrWXV1V3N5eFN5Z3h0eFhBQmd3cEJUV2ZGYmt5ZzNIQldGaVhLcXlhYWRRVmZOUT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJaUtzS2wxMm9WcjIyOFAxWWNoaWJvV3ZUOU5xRWhmRW5yM09CV2VtR00xOGZZRll1ZHBoYURqQXJRM2l1NGR0NFZZYnhXQnRwTGl2UApDN1hTbTh0S0I1ZmtyYzg3OWlxZHZkb2NzeUptam04Ynkwb0xPN0hlV0ZidXdGb1lZMWw1MFpoTWpHWGRmOTlZVm9aeldhMXZMS3NxCmMyZmRXRmJtcjFoZGNHRlpHZnhtZzdnUnNyVkh5czdnc3RMenpRS3NucHBDZUU0NWJTd3JZdThzT2pLVmxmOWVoSURkVkZhZUVlNWMKVUZsVDlCRUlLaXZGK3hoRWJ5b3JqZnlvVFdXbGdVT0txYXdjekZBN2NGTlo2ZTNodklQS0NnT3JZNFBLQ2dQVjVqZVZsWXRLanYyaQpzbExac0JReTBxOWpkSmhLQ0cwcUt4ZVp1R3VCWmNWN0RkRitVRm1WV3l6MVJXVWxUd0pJZzZDeUtzR2QrcWF5SWpiUE1lV21zaExvCjBRUmQxVmdJeHQ0OFVGWkY5RFZlYlNvclZRd0lGQVdWbFlZaUNpc0NXTnlyS25Cekt0cWhpZUs5TnBXVlhMcWtZTjRRNGkzcEJ0MVUKVmdnZUVPb0xLQ3R6YmZNd1dhR0RZZERpWnJLQ3A4WDA5TjRLbmdPQkM0YXlJdTNCOStPR3NzTEk1cXlDc2dJR1JIY2dvS3hJenpCQwpkRU5aeVI3RGtqT2dyRERRWXdzb0t3MlFTdDlRVmdKNldNOXZLS3VJUFI5M002Q3MzSTIxTGhlVU5UVzdhUUZsUlYwcmx4VUJaVlh6CmJqQ0VENVNWYVN2V214akt5cE91OGdVSVpRVytqYUNBaThrS20zN0xUTlpFVWsydG04bEtBK0ltTjVNVlJtTEhnc25LclhqOVpyTHkKd0VtYytNMWtSZjVQbkFveldmRmtpYThLSnVzMjNFeldZelNURlFkblFDSm9xNG42NGp4ZlRGWmtUT2wwN2EyeUZqQ0JaTjEvWDBUVwpzQVdRTlJIU0JTbUNnYXo3WmJ5QnJNeDhvaTQ3Z0t3c0ZVWnlPb0NzVEdPWmdIKzZ1OE80NUo3cEMwWVNDNnVTQUxJeUdhVy9kNTBEClgvU3FtOTlVZ3Z5SUIwRkVBLzRWNjhlYngwcThWWk1QcWV4eENkWmJBRmtad3BrM2o1Vkl3Q2RMVWpQMGFhZ3FQbmlzL0ppY1BMNDYKVEZTNUJ1YXg0dStPQkY3d1dHR2dwM1B6V0dGa29ENTRyRFM0R1NsNXJEUThPazQ5MzBwV210UkVWbVpYS1hJS0lpdjBhaXlKZXhGWgo4Wmk3T2VzRVlyS0NmNmdmS0lHc2xHOFJHSElCV2FrVHlJS2c2NHZHK2xuWlhBTlo4ZGF4ODlPTHlBb3IrY0NieUVvTEhzbEdzdEpDClFkdU5aT1h4Mk9vOGtLeFV6TEVxTlpDc3NEQnVkU0ZaNldBeSsya2tLd2xXZytxaklJY2treUl2SnV1MmJTWXJKeVBxTW9QSnluczEKeXljb0s2eDZwUXhsaFlHTC9RMWw1U2JVek54UVZscjVoQUxLS3Z6WE1LWlZ1TTZzRWU4RlphV0k3akZycVd2bTdCb3FOcFNWakFLbAo4eThvS3dPMnJFOE9LQ3RySUtsVk0yNlZiejJ2KzRLeWN0R1NqbTFGTDdSQUFHN0RUV1E5Um9OMjBNSkMxQkR6V0wvNDJOL1ZqZis0CkUxV1lpWU5qVlZWNTJqUldlT3RjWVFXTUZaSGNYdDhzVmdTSldGNXJGR3VYdW5xVFdLZEsyRjhnMWcvYklERFZTRlhJSmhBc0RCQXIKVnMxbzBITnpXTEdPNi9jdUErckVEV0cxM3ZQRllFVXRJSW9FakdCRmV3MXhTRVJnUmJ5eXBmb0NzRUp5alFwNzgxY1Ira0xOYk5CTgpnWldGL09QR3I4STJpV1FWZlJWQnVtZHU5aXBVOVNpV3VkR3JVR2Vqd0NMUXEvaDdJY1J2OGlyK1JubnZUVjRsdlBialF3anlLclRuClVERHNVNFBJbHF1Umd4SmpNZ1J1c2JDclVGY1hmTzB1N1FLVmJ1RUdYZEJWS0crSWw5YUFXcGJHOTBDdWxzNlcyQmR2RlI1RXhuTEIKdUZYMlhudktwcTJDYWxlZitZYXRsaUk5d0dhdFFndmVpR1IxU1FRTUtDQjZrVlpoaEdRMFFLdUZoUHQ4T0tzRkViVlMzcGpWc3FRawpKV1VWbVZBeU5mMmlJTlhNRmdrWFk3V2FMUmVJVmNiQTF0aUVWU3pZdWE2OUFLdUlUcERuRXJHcXg5UUM0MVc3UlZZM1hSVTI2b3dNClY4VStTNWxKUlVvZjh3Y3V0R3F6eENuSXFzM3Q1d0tzMm1LcU9XQlZxRTRZU0RkWUZaSUl2S2ZHcXNJNUhPa0ZWVVVnbEFrdU0xV0gKRVRPQlZCMHM5SHNCVlpFQXo2S2xrcWM2alBZSm5DcDJBWUxncHFsQzZjTDhsMkdxbU0zQlh6WkxGVElzMWlsY0tGVmNIaWJwSUtuaQo4cGxCZFhnUzRVT0VXbStPS2dKdjBDMEdScFhaYXBFVG1hM3JLdFMvR2FyZFBQOUFxRWFKY0JCVXUrdi9iNEFxR3g2VXRmbXB1K2pUCitOVEMwdVQwb3FkV002OENuZ3JJSjlKalpxZTJzdkdSRzUxS2tFU3VtNXphM0ZZb3dLbk5Lc1dibXdwYkVRQ1ZxbHBTSlhyZTFOUlcKQkpxL3FhblZBdnVBcHNLTFl0YzBKODlRL2NTZWZoY3lsYUtEVVRZeEZhUU9mRGdHcHVJT1FFbDU4MUpoZTFiZnVGVGdGNmZFTjZTbApGcVkrMGd1V0dpaVZZS1VXbGwvblFLWGl6NHlydWtpcHVCdVBoRU1FcFJhOGVpS1pNTUZmV0psZlhwaFVWUDJ3N2t1RkZTVnIrZ2hJCkttcUt5SFc5R0ttc0FjaHRJMUpGdmxxYmtJbzhaUjh2UG1ydUtySU1QQ3IrQmpRazZLajQrNm5yQlVmTnlJTTg3YkJSUVJaU2grbkIKcHJDVkgvcE5SaVVnM1RhQVVTSGdRSTR2d0toNFdiTUFwNXVMMm9BMmVnNFdGWE1qbk1LZ29pSSs5SWlsdXFHb2l6WGo2VEJSS3lzdQpEeElWNDVaZW8wTkViY0xkYkNKcThwUnBJQ3BlaFpwZU9GUzhRWEEzZ29ZSzNTVFNGMEZEeGF6SXk3MWdxS0FrUVA4UUxGUUVFSldpCnhFU0RMSHNlbjBpb1VNKzBBMExGbWwwL1F2SUxXMitXL01hZ2ZyeFlnRTFzQ3FvRm94dUNDbDF2TFc4R0tzSVBwUjRFS3FhT2NnQ28KeUhDbS91YWZJdnE4NXNHZjRsVmwyd0RUVHo4bS9xcUt5QU0vTFhKZWduMmFQVE1IK3BSbHZYaUxMdklweEJWOWJPNHBGaEFrNFFYMgpGS1ZBVC9wRVBRVUF2bTdvS1JKbGoxd3FESjFjdWxBdGV6RlBKVlZnWTNaSlloRkRkS3RsS1VjZWxycktvZHpRVTBUVFJZczI5UlFHCm9lRU41L25pNTM1UEp4ckQ1dkQ2TktDblVBVkFjUlhNMDBBbkJmSVV1YXNwU3VrbW5tSWxEaGxrQUU5UjhneWhTUEJPU1J5bzY0VTcKeFNnRVg4RzAwMlpTWThCTzhmZVlMOVJwYzRZN1NLZklEaUx1SHFCVDBrTWc0NzA0cDYySk5oS0JZaUNTNEcwRXdCVEFEK2VuTnVWMApwcDBCcFEyTFpkNEJWUzBDVFlQVitJMDRoUTAzTWdpbnk1aDlBMDVCaHRTL2Jyd3BJdG1ZOVlKdWlpb1lCcmE4RFJKbnlDemRiTk01CjFkWXowS1lCOWd4bTZaaEtWOXhnVTRUWDRGK0VyVThKUVFOckduL2ZWTk93QmRSMGVIWU5YT25vV2tUZVRGTW9MSXZrVzdUTnBOQnEKRUUzMzN4ZlFOR3pCTXlXRGRkV05NeDFHS053MFUwaE1TVEl4ekJSQU13UjZBMlpLd0ZrZUw1YnBjQy9hUUprT2ExMENYSXBYdStUeApBcGtDQm1yOEtZVmUwelR2d0poQzZSYlV6cUNZSXI1V0ZDOWtMSUovbDBNeFpSd3h2UmltMDVDWlFKaE90OW9KZ3FrYjI5NzhVc1lzCld3MThLWE9jSWlkeHJsTU90Tjd3MHFEMkJMdDBUamVEQ1hUcDlNZjNJcGRPWmlPbDMzSlJFa3RjQWx5S3Y3UEN4WnRiU2x1YUcxc0sKMWl0RUMwRXRSWDBLZkxBYldycE94ekJXZGhFRk8xSXdTMW5sa1YvRVV1Q0JFQVVLWUNuZU9lbm16U3VOMXI4dlhPa01BR1BRU2xlcwpWZ0pXeXJLck50K3NVcE5vTjZrVTU3UDY0WlNpNklTVmVEZW1GR0ZCb3Fvejc1UEtFZ0pTdW85d0lVcG41QkJOS0oxT3NRU1BORDd0Cm0wOEsyYVBvcDhLVHpxUWJ0N0dqbzVwQWR0TkplNkJDdzRoTUMvR2JacE5TUFR6ckcwMDYzSlI2azBuSnhlamxnRW5IYytwUFE5bzcKbmxPQktyVGE0ODRlUVNYOU1LZ3U4NGFTZGtkN041TzBQMUU0NmJMYmJiaUlwTWNtSUdrM29HVURNVWRXZWMrTFIwckpTdjIyYWFRbwpLd21NRzUySzZ1cW5GNHUwcnFnTU5vcVUrdlFlSFpla0xJOFdUenRuaU94T0tvb0E2dGd6eUh1bWFsUW52bDhRMG1hOXdHYVFJcW5WCjJpYVFqcURnM2dCUzVBOGhJdy8rS0ZkRDNnaTFvU1FnbW9vV0tncVVBeFdEN2xoZVc3TlVUSnM5V3JONldyelFveFdMNndDWjRrYkQKb0pwb2swZXI1WHczZUJRTjczVFdUclpGcmlld281K2RreCsvbytQelg2bWpmeXQxbFAyWEtETEFTUG94eGtveVc1cTcwNUpxMTVQYgpNaTF0eDFjVUt3bkd5MmtJU1RDMFdYTzZ1enNodWs4Y2YycDFCYXl1RUwycmEwbW90VWh5ZVJqY2hxYldJOUs2Y3c3RDRJMzFYc1kvCnNhajBPYlFBZ1psQm84TnlDQlpxdk1TeWZvUUxVS3VxUlYrem5UMGZKR3lKQ2NmS2hDdEtrOHZUbUxJSTU3d2M1SXVyYkducVRDWlkKT3FRTVkvV1IrRTVqVklFT2lyd3UxT0xDSjlUeTBXMEZNZ3RiY1JjSUJ4NXErNnppelpiazZLQ1Q3V2x5ZjZ4WmdaelVYRUlKQyt2ZgptV2tsTkF1V2tzNmVoTWpSMnJwSXcrNWJnVFVwTGhnV3lqZ1JnWjRCNW0vdUtjMG1yMWoyc20zNzR0bGlQYzlBKzZOUmt3MWxJLy9lCnEvS3BiQTNIeW5rV01pVjEwUDJZaXh2YmhaUEppSDV5VWJ6RUh1T2RDMGpNSXl4cnFPSTNveXN4V2FQc3YwUGxPMUErc1ZCU201NXEKNjNCL0hTWmRZRUhva245WC9WMERza2pqVkVQdHhsWTUzYzIxWU9rdEd2NGdza3hMTDZjNXZBQnRrTkJTUzRWSHJqWk1qemlncVR1dgpyajBqSjhibFJkSjJEenRoUUJHYjJTRWJqZGZaamFvcjE0NlhvRTVEcGRCemdEQlVQaWFFcnRGMVFDZzFURC9FRjB5WGpPRVc4bkVyCndXQXhLRytzV2xRTlIwb1JqK1czT3YwcDBaTGliT0gxZVQ5a1B2QTNpMUo0ZkZiL3c0SUJIcFlVMkFCOHQ2eW14aFAzOGJzS3kvQlcKRkR3QlVOV25wTXpqa29wdzlRUDFORHNRNC9OU25XNm1wUzUyVkhaZktIdzJZM3F5aHBXQ0RWcEI5S05sOEJjNmtWVTB3S25PcktqWQpUUWNmbFVMRFNnaFRWaEcvRHNXd1gzN2M0MUtXcVBSZUx2Q0VWZG80RWsxTjExZUpPQzRJdXEwc1dZN2pGVS9Jb0hFODlZOUVySVF0CkJ6QXFaM1dsWm5OME1OMzNyYVVWekZGWSticnd2V0dPRGt2bXhaYmRybC9rTm8rakVHeUR6VzZPUTJFb2JpZTBQMzRoOFkxcmtqNm0KTWM4b3dnN09LSDVtM3djR0RPazdJRjZCcDFNNStBM0RWVUFMd09pZzZ5ekV1ckg3QW1vM3NLTTJtNGJBOGJIeU8xZ3FRTkV6V2RKdwpKUzU0a2p0U2t4Y0R6WVArbHRBTmY2ZTRPNCsxdG9tUVhlOG56RW5zNTZyNmZlU2YvVHdvZXVBM2hlZTdXMEhnUk9uM0xFdUQwMXpDCkxPa0NrMzhReTFzeW5BQ0hXQVF6c25URmJ4RllFSURuODV1UG4rUlhpUVp5S3o5Ky96anRRU2YySkwzZ090YkFnT09xV0xiWEpFb0kKVnVUOThKdHFQem1ZeVM2MHlNZWs1bXpGbnRuNERDaXgyR05zRllQNndheGxiNjVaQWl5WmxLelV1T1V1SEhqSmxLeGpzZDNRUUZjUQprTU00cithZ3JWOGpIcXhVUERaeXUvRzN6Z0h6Q2ZrbzNkSmZXa3BNMGFoZDVMcUdWaVRadXh1NzhVZ01FWEllaVY4c2dXM29XY215ClJKK1pYNFpieTdFbkMxWW1pQlFoVm9XM2xZaGlEajZqUzYzTzdpWHNGMENRYnRORC96alM0ay9xdlVQTUFQSVR6ZTNEYnhVNTZ1d0UKRVBYbncwTXhCRnNmbzZnZkwyWjcrUk5ZZWFCYWFEaU1DOHZIeUsvVEp6dUZmZDlXMThNa1FTSThrVFdUbnpuK0E0YkhiOEhIRGEyeQpKTDdzaGVITi9aTStISlE5dVBIVnhCMkFxNXZQbnFWaWliRXRYeVFFK1hwN2t1RWIxV0p3M2d6a1ErZ3Jza2RORlNMNTUzQXB1U3lCCmxYVXNzS1FzSi9OaitIQXowSmN6R2lGUVNYbnBWbVMxdENMRDcxY2JwUlNCZGVJbEl6QXhhMG1kcUdQdDdvS2QyRmYzOGxMVWh4ZFcKUWdwZ1lXMHNjQlYweG1DaDMxc0VkZk9lVFJoNnJaeVRlakdKRmZTeHRsNjl5STl3NXhOYjVGS0Jvekx6dFIxQ3FIeC9TelhkS3JvWgpraS9RUnJpT3pRMW9VWUgxdUxWRkk1bWNQYit5bTFSQmRRUkYyZWhSM2djVkpGOU02TXo0aEhxZ2FtNExrV0RhTStadzBocTdGR29mCkE1dXVxaWg4Z2ZOZmNyTVlxOFQ1TS8vMXN4M2RRc3dUeVBsdG1IREFxYWVaNDNsWnB0Qnc0U0lUVllHUGgxck5GZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJSFp1eFpxNXNwVmhVMVVIV3hneVZXSGRiRWpUaVh1eWloZi9BODRXRlZLL3Vya25jTWI0aDF0dXcvV0ZSTW9lV0lzUGlDOWRkK3FlTwpyZEVqcXdWMmkzMDBLT0lNTGo4Ri9sa3RUeGRIMHVHYzZoNmROS25YakdFQmYydENRc3FTelRxenlXV0RKSys2OTlQNWt4eis2UGg5Ckx2ZDhtZXJYU1lrcUxXMnZBWVpmT3haT1BSS29VUkNNampVMVY0MU42cW5kbldENjBhc0hpa2YxYmxVMUYyR3hPQnVwY0R4a3Q4MGwKcWVmVGg1MVZKREFmdDA1YkpEaHgzWlRWSldlaHowSmliaTFwTXVvdEpJTE12dUpMUnNkVVlpaVE3R1MzbnlPMURDb1RaTWhyQzlXbQpwVW1UMGZDa0pyL1R6VllaYU9HZUxESkdKSHQvSkRYRkkraGUyWkJ1eW04RDhWZXNRR3YyUGVzSVBBVUFwamkwdzVtNDlQaVFOVVl5CkJ3VjlGVlhNMjZMc1UxWHEvbXlIVlJWblFjQjA2cU1JbHQ2ZmZybXJGb045M08vbFR3bFJKRG9TVkZlU0cwVGRwK2dzOFRrajFjUkEKR1FBcUkzaHUxVEFXSnY5SUhFcTVCM2FsN0QybHZpTzBoUUhrYWRZMFhxUktQQXZZY0VzV092emEwOTRmbENqNWNRa29heS9BTzhpcwpIWEVkSkY0THJoWjVYeW5oS21yRFU1S09UMEtBVy84bzJNZ3laYm9IZTRoRldESjhobWF3SHFzRDZEUGszSUtLMXo3NURGUnFWSGtwCm81cTdwMGdqa2J2VGJaZndqVFRyb3JSajk2QklLY0RrODFZamVNclVlUTdiZ2dhZU1mUWM2L1NpRlZGWGptS0E4M1BhaGw1U0hxRXQKZXRIRFp6dmJlWFZGcHdsNTY4dENXWWwzREdOcm9oWVRpOGNmd0tmT0JlOStYVUVxZ1JPaEo0bGdQRTZXZlhTYk9EdWRrdGhzaU5GagpVajd2Vjl2bDd5eHMwejJMZU92eTN4UjFQY1JJVGxucXhzWGdzVlU5Sk5KZWhlTnBlclJVRmRCU3U1Mi9QZHFCOUVWbm14TDJxU29CCjl3VmJwb0VpZmxVTVRFbzFlcmdoRjA2cUc5UmsrckttdXBnVUxoMVlJc0VoREVUYkhXTEI5MGdmaEtGTkJsWWgrb1lRbUJiditlRVYKNlFkempjYXNXSnB3dUs2VVpJcWpCRkFMREE4bGNOaVJzU1d5UnZaM0JjZ1JoZkpKcEdrMk1lMTJyTkxqdVA2Z3l3dE1TeXc2S0NrZQpmai9zSWliN3FSRDBONDU5MlpNNkFrTWw2dHNRTnFha0dwMXZOUElqUU0zN0NrYm5sRitnR0RGSkJWdk1qcWlQUExLVzdJcm9FZUh0Cm0wa3V5KzdVbGtmb2dHRWQxVDRmVy9JV3Z6MTBBaC81TUlyYXdZSm5wdkg4OFRCRDRWT1ZBSnoxRFA0RUN1ZWowZTFIOUQzd2JDdXAKQlJTUkluYlFteitWNWp0V0l0VXpJc2dDZ2c3Zk1sZ2Z0MWNYdTRvNnlhVEhwU1VUOGZreHZ0WUlmN0p1R29NY0FXbGRGczNzTEpzZwpNZlRxOGNOWG5EY0dEenMxa2NONm9lb1lpd2l2SGZwangza0ZOQTdOeFpScUFacHRhSGgwbjU4cUxTbm11WjNzb0NWV1pidkptcmZiCnFaUEJzUE5sZ1pSdjlmQW50eFh4WVhvK3cwZ1hWQUx5WmZ6czVNY2FJS05PdXFJNkhzSTh2Sk5xa1lYTUUzdXhkd1hBY2hERU1xWUgKek50WjMrRGlOcHlpdVd5dnhybmxZaGxJeGdjMmliMW9lazAvdmdINUFMbk1IZDJFc1l1T2dmRUluUkdnT0N2a2xLaldFb2FLQkJBTgoxWmNQSzdYb3J4M0pRT1B4ay83T1ZLM0FiUWs5TFE3UDhuYktEeEZPd051OUdETEtVZ0hqSXVCOEkwekttWVNYQ0NqVzRHYndhSGxCCkpnaGxLcGJ3azhVdHgza0sxUnBKV0lWZzRBVWdwZ0ZHTHRzWUY0UHRZRUVyRlJwMmp5K29wL0NPOFhEb1ZseTYwcENaZmhmQ3FMQ2cKSm9BWDJhd1M0Uzh5WUY2YXBnVnN4KzVVT2xmOGI1WG1FQmZMd0pGMmRHa2JubmRMRkc3QzI2WHFjMEJOakFmZkFqR3dSSXptbmtSUgo4NUtTWHNlY3ExQUtrQXFpYzFCV0tsY1h1V08vZkxORUkxaEtSZkRKTEQ3QlIrNTBSajBFdys0WUk2dFQrckFxbGd3ckF0eXdLSTZNClBpc1FLTUhBakFBSGo1WDJqblFxYzNWREVCNEtDMGRZV0hqSW4wekxCc3V2TWpXcE9NV2FsTFptSkozQmZyNWtET1VPVlVqalRyTUIKV29UODlvYzBFTDVRbkE3Z2FDTERHWjBxVWl6RE1sWWc5b3ZEMUNpN2U1Z3VLQ0xsY1RNK3kwZmR6bUhvdWU3OUdHWnZpdVp4RzRiRgpRYUJRWUsxWWgwc21SV0RTbncyUUtPcFRvRGp4MGxpeEVFNWlGSnJ2SlI3eHNKd1BjZWNlMlFVQ1J0bHFHR0UwaEZSYlJwd0kzYTE0CnFvUWVSOStCSkJJampSQkZzdjB0c1VPd2NPS0dHSWowSXZqS0pWakswQU5CazVIcGU3UGRzUjB3V056cElQa0ZoaCsvRzBJUlJjSkcKNGxuTHJDeTI3VkNxcUxEeGVKY0tLTWRJek12RXhSTXNBdnhQemRwVGl1WEhEaEVicWo1WnFSM0dEM2UwY0E3RlRCbDlWSjlYcDRBNgovSEgxb3NXckNjOXVmOCt3RHNic3B3cGxlU3dGdkRGZ1JKUGFvUjF6dkR4cys3QVl2YVNQd2J0U0krZUVjWVl2Q0hsRmVFYVBWUjg1CkcyekdwQk5DV3JnSEJLNDgwSWJ4WVQwZThnRlZXVEhXb1lzZEk5K1BPYlE1dVZVUis4NFc3VWdTR2U5U01rT0tWbkxVY1dXTG1aUEgKc0xYSFJMYk1ibmhqMkpMUHA4VysyTHhMT1MzblYzUU9VMW1yWXNUTkE1R0UyenZoNVJKSEdpVmovQ1NReldJT2ZpNlA4Ymc5YkNSSwp2bkowNHNXSGx0ek5PV01TOUxjb0MyV1UvRjRyazBOUTBVVjdBSkMxdEU1MUVVT204cmRvTzdZZjRUYU1mS0I3NHc3RlEwQU90M2hGCmJ4VW9ZUmlhVzQ3bFlPanRqOFlETmliUW80U3NudTJ5bThCUm1WRHU0ZWd0SjdyaS9CVi9jU2R5aWpHcUNtRmpkQ3pSWWhZV3FBZGgKVVIzWExLZTZFMVo1SWxQcW1FeXR0cnRvNzU4a0NZUXRzM3ZNemhCc2N4VktPU0xlVC9oYlU0K2NpNGlNU0ZIbU5VSStxOTNRTFlkOQprNk1iSnZnZk5YdllhM2hMWVdtUHR1bWhrSmQxNnBheDB3RVBOYm9zSE9Qd2U2M29GOWY1eFNyQkp4SlRLK0c5UmNpSEl4UUtDZVVmCmRIVld4TGx6RzdsS1U1Ri9waFRnem1RU0NKMEVvdTlFTnNqU2dKSWlrZ1ByTEYzakRRdW1ZRm5QZEhLUGVUVnNzNW9ubDNoekNJU0IKLzRFRkYyY2FOc2h5VnJCandRWkw3MDVQVTZtc1BhMnZoSlZkVzNCTkpIbHh4S3FrbUdVVjR5dHA1N3dqSEVLaG5xQ201aVNGT0FsOQpJNHdreUdaa1JIN2EwR1RROCs0ZkJrMmlqV3JNeXZTK3BscjJ4WUNoTVUrN2JnMCtlcElOcGFRWmdlYVJHcWVwUjRzNC9tS21LMEk0CmdYK3hHZnlBbkNHckUra1NLczN2WmltWkRhbTZoMWVFVXVVVEdzeUNTWUVMSTdvc0hLblo1NGJ1TWpsYStNVU5mczRoNDhYQVZCQUwKd1Z1MkhuaEx1U2pmblJtWXhidU04aHZYdE1EWUpoNFRmRlZVUFdRR1psSFh3ODFzR1J3R0VBc3FWb2RsYWlpeXRtdDh5MGhnbXJKOApMQi8xays5VndWNHZZTEN2ZTJuOThTcHp2WUFxcCtxVzB1d1pCd3R4VTRqcXkrbER6cDFwbTY2S1FBM1p5UTA5Ui9lY2tGaU5oTDlaCmJBMERwek51TWNiYSt6MXdZbWh0bm9XV3MvNE1CTkNnMUYwL2F4N3NTQ0VDdzkycktYR3FoQVdiZURGZC9RaThVVjJiSXFkbVNuYkkKc0hwU0lwcjEzVWpjVVVjSkIyT244ZzUrSExKWlpadGp1MUhqM3FDTkR1SWh3eFF6Q2o5cXhGMWg1YjFHSVZqMmR1SVFFeVR6eU5JaQpGTGpkZmxnNTFhb0JkeDZSQkx1Mll5NkxHYmorNkVscXoyYWlDTVRuakdBSE1CYmhOQVhGZ0tYa2ZCTVdPVkpGenMvWmJqV0RUcUQrCjREUGNGc0JyVXNEWWp2VnhGNW5sK1ozMTVUeHQ4Qks0YUE2TDdtMVJvUDVzbHQzWG9FWnQ0N1l3Y2g3NGdHT3RiSStjU1BqMW1RMDIKdVovVEFkUTJUNHBZZVU1S2pOdzZBQloyRzJDZVFpazZrdzhSU1Q0Um9obmRjeEZmN3Q2T2ZSZGhZYU1mNXU1WERrdEUwV2Mxb2FZdApkZXBoQmh3dUFLb0IwYXdJZVFuQzh4Q0VacDZHMFFpa1FoZzJhaEdjZ1dYNlpGbUx4WHcrRXpWcVUrNjNZT2xieFlOREp6am1MeGtLCmgyd0hFMUhhL1hsUkN4Zk9XMkliWHpjOVY5SVZWQSttSDBuMktqcFhkWlhBc1dwQWxJWmNGbWFveVBKbkRoVWhwdExsYU9LcStZbVQKZStncmJGSklJeUNWOVh1UGtCL01QZkEvWUZGb0ZHOUxqay9rTWJFWERHd0lFN2dkRmR1YW9CUXVwcm9WaG5MdHFBdzNyQWdOa1ZMYwpSRkNmVlBQQXdrWXg2RDEwOHB2ZGpaQnJjUWlNRFphVFV4bFVIdTBHeCtnTGtnTzlQY3dwaGRYYmVSRkh5MHdLWkdmSmx3RjlDR0pPCkVKUnBaVFlOb1cwT0dMQ3dtcnN2QTRvU0tRMDdxTFJFUEsvUzd0QlNvc0tmYit0OXFIUnViQ1NBNGJhanlEZU55SUhSeVVqM0NCSVcKWGlhVFRtN1RrclNka1JrQ2ZDSWNpV29TRGlWaDBRaGlrTzdaYmczWHhaS3loYk9BVW1adFlsVGJnNVp4K1VXWlJGckVUY0IvUE5Jcwo2Q285dGNlT1JCR0pFYy9sWlltZU10bEphTWoxT2Rkd214aXowTUtBeXdFK2twRzlhbWRmbWNubC9qR0FEQnNkeEMvcnN1cVRqVWZtCmNKaTNhQW9hRWI5OXVtdlNNS0dKTklFUTNHaGVvSEs4S0tHSVNSdGIwQlc1akNXVk8rdzR5QWVMRVFodTRBcUxVcjNZcGg1TkZEbHAKUEJ3ZEoxaThIeWNXR2pneVpKRE12TnR1UHpRaU9sTEVVbVAwSE9velNjRndBMW1DNnA1UnVFWTFla0orSHplYnkwSGVhTWFCNGRiawpwSzRLdUYzRmJidHA1SVd6VXIzSys2UGdqUllzOWFnaG8wNUxFZmF5OTFTdGRkRWJSUU5IVjhUVEtUWExGbzlTRTFCYi9PVGpma1QxCmlRNXZ6c3NoVlBsSXpQZDJzMzc4NGI4bzVKZUJTREtYMlk3VVFBaGFsYTN0RnBVeFBKbVM1VHJGb2NoNS9vNGxxb1JVa0o0K1hkRVYKSHg5cTRhYm9sZDRRc0YreXV5YlRzU3RURXRnUEIxM0JMUzJVZTlieU9STXgwT1dMblRod1VhMFAwNFdMN0laSU5iY2RJNjEyYnRvcgpSbG9WaXFMV2lKMEI4UU1VUjZBSUZ4bTNYS0xNSHBiK25GQ25SSDJzVGs1eWUxa2pnVkwyeG9XbytsTlRackgyUllaenpNNjVqQm9rCnIvM0JKK0Nna04wTU9yR3dPODM5NXRnNk5TWFJ3b3dERkN5c0w4K1A5WFRVdEpTeDkxUVpSSEVraXVKY050b2dmWGhLbktzUmhzWGwKTTF6bUZhcVRwTStHWWtZQytWRGhrSmZjZHE3OXNNME1SVVptdlFKY1pFWnJzY0lOWUJ0MTRrd3NQTTMxTW5nTU94WU1KWjRTVXRrTApDcXlKdXhOWittUWVGUTFLVnRSUDFJbWpONHlOTDk3ajdHbnhhTUZ0T0lJUnNUMVBoTXo5eGg2cllaT2p5a3dXeithZjVJQU95NGhWCkk4T2lReWZDSUNoamFvZzAwdEladVJyR1EzRFBHTkNoeWw4Nk5SWVN3eFBtb2hvM1EwS2cxYUpkbW52YWNLWkVhU0hiaDVYb05JTlcKOGl6UEttNktxMm9CU3JqeUNUMG1Ncnk2MnFwMXlyaEk5U3lhQ3RnN01ybHFqb2FZMVhkTldISDRoUUt6NnNZdWxBVW5JYXYwMEhqegpZMDhsMzFrYVFORklFNm8zTVc5U05hdUxqZ0VKa1NWTDB5MXdhckppSENwY3d1U1JuS1dxZkRqVWlhK0dLdGhZL0R5TTFMRkxBcGVPCmpxWENvbmx5Wkl0WE1Wdms4TkJnNVR6SkZ1aGVjRW1GV21zNE01SEVoV1VuRE1ld3M0ck1ZYlpJbGUxUmtPZXM1RkNoOW5GWUV2VEUKazRUb2pUbEsvQ1JYQlZnRThYTnJydnpuZjhpVHpScFYrSk93TnNzVWxRVkZxcEZCT2NwaG5kSlg3emxZU25RSWc0YURRd2JGaTltNgpUenFZbE14YU5LQzFDU1d6b2N2R2VnTWNVNnllS2ZtakNEQS8xZ3F3S0dIVUVJYVlES1Bybkc1MmlQVVYxekRxU0Y4NXJnOXEwaURFCklwWnBwR3YxMDQzeEJMS051blVZbGd4U0krRmtPSGlpQmlESGUwYytMQVRSc0xZbW9acmFzOTE3c2hlV0RyNWxydUpnSjViQWNZWHYKdFFrenQxU05ERS9yNmxrUnk2M2tYNlMra1F0M3R3Q2hINDRwaU9FUUNzU0dQdm1mL1JMb282UmNIT2ZUWTlLalhCejVhYXdldXZWdApKNVBmdTVvTkRvY3FPRkZUemJIVnNiQU02OXBUdUNCY0xpZ3FnVEd0NkxmbEpFSjIzTGplbXBEdVJkNDVIRjh2RFlmRHJoalNKYmFZClRhcGFDclc1MG9XR1BUekp4MDNnWWVUS25Ma0luZ0paV0k4VTNzenR5TEw5M21qUGhPWUFqSzA5VGxWd08rWWdPQT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJaS9nblNRQ0trWm41Vmk2UG1mYUliRWxpU0xDcUVtck5KdWtPYjRRRzJPNENVc2hCV1F6d1JNUExuaFMvNHh6RjE2N1BMUUNBMDZrMwpxdS9FQVVJd0krVEVEc2VwUWVXWW11eC9kcVpGbGFYRFNrRzRGK3dRejZjclB4UzA3NmFIbFVPakNhdXF4c1owTVFDaWlhd0x4Uyt3CnBUQmhEejc2anJ4Y3gydnFlc3hRNGRQMERaSW5oZWsvSzNLMEpPQlNNaUZxS0dDbG84NWMrWlIrZlRJa3g0YXl5ZUtwWGZNQUQ1S2kKV0dqTStRc2xKc2Z1TU1WWGJ6VGlqOThQWVV6bnBEQU12UlMzK2RYV3FVS2ZGUjdjMFBLWWxsNGRuaWYvQ0h1R3NvcHhSS2EzOHVOVwp6K3h4dVJ4MmJxN3VvUGZNNnFtMjYyUzY5SnA2NE15a0RSY3FaZDVDaDBHYmt6MjB5R2xCZVZ2dTkzYkdJTE1BVEF1N25lbERBN0FWCkxpaW9aYzJPZVNGOHBJcDZ4WlVnNWdvRlo1M3lZOGY3SGJKOXVnTGIxTFR6M0FhOTN4SEIyT1NHQmU4OUg2YzBrM1ZOdExCUkJYTGwKcXJsSnJnZEs3RHU4RjVNdW1SdFNrUE5mMVduaFVRaDFXMWcrYUxVc2RoUW9FWmt4cmwrU2RVMU1reTQvemFFNm9xSElVenhOTHExWgpSRld6OGh4ODZEQTBQMTZWd21ISDJkUGVrVDNuYUUxT2tFaUQ4UURqclY5VXc1M0graVZkWkRGSEVDNmZMckk0cERNalVvOEJqU015CnhwSlF6bEFWOThqWWxYSmRNYTBSM0NVRGk0Tmd5UDNzS0lBaUFzMTYxNWNiRWNMQ0pRRUNOTjErejU0aHViVFduRkk5eXFXaDlrYUkKVmVra01KSlFlamJkSy96SFdHMTNWYVFtcHMyeU93MGhXakpSVTZKRXRGVURDeVVNc2FNSzVORUJpYm1yN0s2dmlUUjhOcW9vSG9JUQp1TnU1Z2hJNmMxZzVqRUpVejVET2VQeHdtZFZSZEt6V1VFN0F5UEFjNWtoOEVEQU1COUVZU2VTUjZJaWpvSCsvNk9XSisxKzlQc3BSClBndFZNbUtMMU16d2hxRVU5ekZNRktJUVJXTTU1Q2NOamc3d0w1VnZJSk9rR0U5WWxFbWlTUExhREZtZG5wUjNVQjRkM2s1MmRmSDIKa3pLWjE1alJrYjVBK0JLSG1tUG9UZFJVM1F5WlNHd2VFSmVKa2dxdXcxZDh2V0NnNlNNY0ZnZWdydysxMEtzckhCdDdLcUtOK25wTwpwckFRcW9HMmdpdnJXSHBuWVhsbS9DYjhTTlpYWWQyTEgxaEtjc0hocHUrRS9LdjRIS01yOWNRN3kzS0NLVjM0aDB1c1BLUmFxUU5jCkFibGh4dUtiMVNYd0swWUVNMUN3RUlWcVRCRkRuSzR6cXlwSW9JV2hKcm9mTWRQVklqb3RyRXlNY2pQZWpLb1VBSSt0QWFvcVVLSWQKbXhzb1l5d2puQS95UTZZL1FOMUFubXdiNWxDb1NUdHVhM2Jnb2thUkRuZzdVTFRtbW81QWZwY3VRYlVrNzI5dlYyS1ZOc25CcUxjRgpWY214L04zVzFaVHR5T3hQU0tIQlVpWDNmbVdaV2lzdDB0RlZIV1NoMTVCc3JyT3V2bk84VnBWaHAzYXE2Z2FGSnBUWnorSkhvaytmCkxXSHNBRDdhYjR5bVI3bUxrL2hOektFbndnZ3pMS3MydVp5WlVoeFlxUDJFOTdwSFBCUnEwTGZ0SVVjWUNuTXpZOG1BQk55ZHpNeXcKOHdBLytpVmdFeG5OcGtsU3lnZThIR1pFK1huaEV3eEp3bDVzd1RxclZSeXFSbFRzTE1sQ1Z4dExuNUZETXJhSnBIRHJwby9IckRJcwphMGtHd1NrZEJvNzRWUm54dUVncGg1YVZtc3hvNE1HZzhEWDdFMUY5TGFLK3NZQ2h1cEFlRERJQjFJcEIvcG5zNVM5MGc4ZWd5SmtkCmJ3VTlFdzE0SzdvekRZOEVKVGtKRHdJK2xVbUlXSFVKQWVwMnQ0b2JrTUhhOU1JcVF5dTlRSkc2a0hrSENRYnkyRHRLVFFSL1RtTE4KcWFVNi9UbGVaWEYxRkxlSnB1SDBjQkd2MFdSSHQwdk53bkRaTExhaitKRktNYm9OTWZac2E3S3FocnFoVW4xcWZKTFV5OHAxM3lMLwpUTG51SEphYWNzSnhPcHdoVm82NXJMNmpMckFlbWdLdGZFNVE1bUdsZ1B1L0VDR0NSWW92Uk1Rb21zdFhUU0Yxbml4K0p5ODM2Wjg1CnFtQU9ubHFIWk9VOEtZekZpamltYUxFVEVQYmlSWDA0WlZ6MElVZzhxVXVCakl3WEhwWWQ3bnZXWmFWU1JrclhJa0xCc2VTcE1LMzIKM05idVNtdW9idEtRZGtIdjRoZFAvM3V1SmxoNUlWalIxSHZOQWtwMnFXbWlRQXZOQUI1ZW94bzlPNzBJdlRZVkN0Z214ZEl6dTRFdApXeUJBOUlVNkM5VVdwQmFsTnQzdVJQSUV3YVU1RWNGdWQ2ejZWb3JhMVVVT21nVW1ZN2dLVERmdEF4a1prcy9QZmtNOUNQYnhaWG5VClcyNkhodm1MU2c4bExiQVJucVdtajcxcmxndFpsMG9TR0JQa05TSS93bXc3TmYyUGFralY0M2tvQ293SUtNVjg2dFFjTld6VkJjZzgKLzZ5S0U0SjYxQlN2RkVOVmtCS09wcy9hc3ptSmw1MkZMaTBTZUJ0bzB0aTFtVmM0UWxpS1gyUmxGbjZIMjBpc2RzNXpXb21DTC9uWgo4UC9IM2gxRU5ta3FYRWlPQldwVVZidFp1d1VZSU1qdmVxbEtNa3ZsOFZSd2dsWmdoV3ozSnY0azJ6Z3dLZ2xXMHpnMUMwcVVwV1J5CkFDcEx1ak94OU1rWlMyVVNJQkFpMmpNME1iRFdvUWlyUXRycFVkeVEyL0F0aHdBc25mSSsrYVpJSnpMU2loOWdIQVlXNGxOcU1sME0KSzRtZHNBWFNwamdsckZRdnlwMVMzUDdxWHQybVJJM2pqU2wxNDg4SVNGT0hEY203YWk2SlJMY21jYkxhVWQremZKUytlbzY0WHArbQp6TU5DTVFjc1BOdmNGQ21PUFlXeHg5SWtNdmNLMU9jV1BKTXA4Z3E3b0tRUWZTQ3lwMmM4Z3RDU25YbEZVUm9CT1UzVEd6OVdKQXNVCkw2MzZIdkE5alNnOVoyQVB5U21GL0I5LzdoRGE3MWdpcWp1VnZFeVNKMEFyUXRvT0cvQlpQTUo2eUhKWGtVQmNRYmtMa2FwWnRaM3EKVXg5d1hPN0pkN2d3U2hSUmMrUXF1bXFvWGIxYzFPazRFYnY3cUNxWkRXVlNET2MvK2xtcTlBa2ZrZGdIMFJ1cE9nUk1rUUhEM0RXZgo1Ym5pcWN5UFp1VmNwSDl3VG9vcFdnazF1akxIZFgvUXNMSWJBR0ZjVmIrZ01xRWFnZWhoRGdvdDUvMUpEazhEQ0V6Nndha3B6MXJECnFXZ1hqN2s0cjhEclpHMGZia045RkdaalF3d21TRkg2bjF3cnJtRWY5YnoxNXU4OEtxb2lYZ0dTR1FaOHExZU4zSVFhWHNwSm84ME0KNDlKREdqWnEwM2w4MW53QlVrQU5DYXJPVzdGaGR3Vng0UXFzS1ZWZEpCMHRmclBETmMwZlRremxqYUJpVGc4ek95M1Bpc2NpL3BFKwp6QjdzQm9oRytYSjJGTkh0WWFSN2RZbTZwY1NuM3kzaVlTVlQxWDFTZmd0N3JxRGdicDRWcktyd0NvcEVkNEtSRmtaUitsQVVSWHVpCjBSVGpsNCs3QWxSM0lHVC9FR3BJYXBCS1VOU0VsWUFlWnJTd2FLNW40bmFjOHhCVWRxa3lQL0Urcm53RThwdGNKOEU2dTc5a0JqcHcKcnF5bTQ3ZHRsa2VMS0IrczlHaG9aU0Y3cVk3dm9yR1JmdEZLd1NFWjZjK2VaYldjSlVUajhXeWsxMjVhMVlONEdBZThhdndJOTBRcwpTdFdSdy9LaXBNb1MzamQxVlFzMVNuVThMSFpVdjVLbzVKUkFxY25pV21WMENtUWViK2lyMTU3RFlBeUlwZkhDUXNiS1lRcXZ4Mk92CjU0bFhuYUpkK1V2bFQ2TE1NaTIycFhyc0FOUVM1ZGZkMm4xa3B5TXV4TTRiak9qRFNnUUNZcVkyS05tWDNER1k4OXF6TDdJTGo4OXAKa3RlR1EwMlZGeks3UXpsSFNyWkVxVWxPbG9XaEtHbWs0dm1rdWdpZVpLNGN4WHlSU0F5ZlVOd2gxbjh0MVcwWHVrY3M0OUtFSzJFOQoxazk3NXNJMERKNnJLa0xiOE1UOERGZUUxaHBUdGNrZTdhcStWUk1FTGt5bXBtcTkrRmhKa0QzMWhDUk1hNHQ5bFhMYzBKRWk1ZUk1CmJBbkdvV1FXT1FORkEreDBmWUtBRzdpYlpKVDdGQWZIYXFpWmhCRnRxcDVpWm4zUHNxd3p5aUtIS0lrS09WZHpmeWRtNEZrdnpkcGgKT0tiYlQwT1lkM28ycGpxZDdueFhHVHpkRlJvbzI0Tmw2NzlDMThIeXVFZFYya3FINTRDc2ZWa1lmTmRsaCtTYVh1TVAxVzB5Q2NzMwpEUEkwbmtTdzhaQ2RNelR1Q1pWeUZabERFOFpqWHhFaHk4ZlNZWUZYMlJ1cnFPSmQweUlzbXlzQlZBbGRJVmdEZTZMMk9qaldNdjdOCldjbDZWbUQ0QlFrc0VNT3EwaHlyMUJmdG9vY3p1cUtub1VWaWlJU1l0dTNHRTlLalE5TXpqcmpvcWRmRnI0Z3NaUW9QQjRGanBkRzkKMFJweGIxemp6SUFWNVpmcjBmb2lVcDV5K3RmaitRbmI4UjFIRkxKVTdTazhCU3piMlVCVFNrN1hLNkRvU0o4cTZPanRhT0V3aEtPSApxSVIzZ0N1azZYVXRybFY1eEdua1VHS0hPRU9YRG9TSUdPalNydTNZQ3BwbFBzdFNoRzFCZE96czJhTjg3VEg3Y01wRlVHSTJLOGVyCjVYdFk1RHRPcFEzT2RnenZONlZaV3IzL2ZvNzBibHQ1dFp6WUlQT21RZ3VpUy9wMU0rZ3lLMTk1NzJCMzAxcGNkdFM5V1lLb2h3WlMKQjliTFBTNEdBeUhhM2IyZFJGd3JtV0tBbnh6ZWN3ZjFpV2dicmtBVTRTb1pwWWI0TVZFbWtJQ3lKR0E1YWNTM2xVUm1SU0pGWkFvbQo4c29TZ1BJMTVtaEZWbnBNM3l2SVlKT05WZjIyTTdxN05PYXZBRS9QSlEvOVovK2VFL0pMSVUzZVRLWlRZVEdHUzZvaTdIZ2dadUh2CnJDa0NFSzVESEQ2MndjMjZTVXBtc1ZsQmFIVVF4bThLak8xNlJsYkJzVVFwa2RXV3JJZFpUaExxSjVQRjg4ditBdmVrdm1aUjhVK0QKL00vbCt2L1lVV2w3WkJyR1Vya2dWUnRzWnV4aUs5WXM4ZGl0bjJRcis2TWdLdVNDMkNxOERVSklwSWlJY1RxSDFZNUdBbE9jMVZqUApPN3dDVzE0RnNteU9wVW1zNDJTWlVOOXFlcDBab3YxczY3SWtReUFuZzV1VlIrTWJGZEU1bWpURm5wemxZYVZPbWhaaUlkR0phWmVZCnhyRm0zTmkwSWh0ZEg1TjNsdk54TEdTbTd4Zmp4N2JvTXBOaU9pelg1bmI0VEI4RkR1VW56ZDNjeHhZTkg4TXcxYjBkWmhnRytPR0oKMGhtbjlyOHJ3NzhydlZnandIQXJWTCtQNElTUE1tNkRrQlh1cHdMNGNVdng1Nm1DMTVvR2d4K1QwMlFXV2ZxaDJuQnVFd3Nyb0lBWQpEQzJ1S3RMS24vWGJMdjQvbG53WHF4eHJrcENWV256bnczbEoxTEczWGZyVjVsWUhFUzdEcERRNVRUMGZXS2o4b3VheVNrWnQwenFxCks1TUtxa0VvV0tXSnVsclZ3OFA0bnVWNGIwOTdUMElsYUkxZkVQazFtMFRFYmRRZXFxZ0xXY3pOaXQrbllpUWRrRUVzejRjbnhWbWQKRXJlbTJxdGRrSkdNUkNXSUUyTklNemcrcy9uaEVQNUVLRklFZGtMbXcyVWpyeDMza1k0OHdGY3FCL2Rxa1hpTlFuWEFrSHBSZXo3cQpFM21lUUh2TWJSaitvcHMxc1pRb3hJREhsVjVjZ0laK1pnbUhhekpaRC9EWnovcnhPenB4LzVXai9iZHl0S1BDNElYUlJwUXNEU1d4CkdXRkVUSnZSR0VPMEVjMW14T05tYUpmbHpHc3d0RUdGWDEzbFd5eW1nTHRMdXZ4TjBFWjVKc3VlRE5DT3psT2JuNDNsR3Z2djNQanMKdkpRdzNmUnNNbU00ODBjZCt2SVljN096dVZ0U3BRcmpjamo0c0Y5Qi9FaGVLbGE3dWRuMUNiU21zZG1JRERGYkVOVHNadjNjQzVvZApmV2syTTV0RWUyYzRxYkdwMXFPOWlObkhhR0IyZGRQTXpjc0dtcEF3aVJ1WERiUlJMV0pqY3lxdVJTdTJEY3V1Vmc2OFdObE1ObVpWCkozT2dxS0dvQ2xKMmkvbjJBbVZEQml1ZXM0UGNBUkRjbUd5V0NGUVJmcU1ndncxWFl3Y2tHOFhTSEZHRGtVMHBReWx2UkhaekFkRW0KWktPM1dyWXdINTIvaXVvV2J6NDIyNitab1UwaE13NlM1NEZqTjh2M1hteHNBdUJhT1doc3hKL1VVczlrYkt6K2hrOXdZMktaQ3k3OQpjTEZaZEtiY0hCT0lmWVppN0lKaW85OU5zVHlNTXl2b3RNOVF0US9qYXBpaXlkdStpZGljeUxzdzJRUmlzeDdRNkhIaTY2SnM4SVhECmpxcTN6Y01tWlBqYmhtSHp6NlZuczRITnFDcFRBdGdvYkpHVlJZY2dDWHRVMFZCdUR2WndtR1Jqc0Q5V05FeCtiUXIyY20rL0Z3UWIKcXdWMlJBd0c5bExUd0NCZ3I2UWw0Z3VBVFVHTjlxRjdoU1B6dFF2NjlYSS80UmY4ZW5ablpZTjlEVUJFSjU3YjZPdXh4Tng2a2EvWApWRS9qRGI1bTFWbkpxaUZnZ0pjTkpVUkN2Sm5pYkROUkpTSVdKeDBKVStHckRiNkdSZG1ORzN5ZDZFS25FSld5MDBWMGlRbndOUzBTCmxNNmI3ZGE5REE3d05kYlBUMmlHa2IzQ29vY3B5QnQ3dmFyVGFvRzlSajhPYlJiWWF6YkVZT3p0NWw3TE9sWHZxZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJaE0yVExQWWZodEE5cm5pOHVkZXdEaW5vemIxbW01RHVza2J2cDFqcHpiMWU1cmx2N0hVMEVRcnFOZW8xbXRkeUczcU4rV0o1WmMrQQpzOWRWbTNpOVpnalhMdUExakV5QkJ1OGFjWTJSODdlTnU4YlpOS24vZGlVekdqd3JiR1BXOVJvbWk0Wk9lUTBuSDI3U05kYTZUTzBFCjZIbzIxY2dHNWhwbHU0Wnlic2gxZDV1bXpiaHVTeDdiUmx5M2kzRzRoNjVtWmFZQjF3Qnk4S2VEYjkya3lIelJyWnZqY3NHMmJ0TjAKMFVCYnc3Qi9LYkt1U01kUTdoMWc2Mmo0R1Z4cjZoejFLVzJxTlhNVDFDa2FhdDBqYXhwTTZ6YjhTdDFJYXlTREZLTnlWZ1Fhc1AyRgpjSEpNVG5IZVBPc2FsVitCczY1UGFEQ2R0VWM1WkhNUng0WlpWME4zTnN5NlJnMVRzS3hoR0cxOGU2R3N6N0ZNc21iK2QraXJvdXFYCkpUS3NuRDhnYXl6cXBzVm1YRFFnbDZoaUlXT3M0YXlSZzMxanJITS9CVVNrV0dkT1pQTHhwS3Y1N0FsR0tGVmFic3o0NGl4ZkRHdlUKeDNEdEdBaHJRRkthZWRVa1dHT0daMlRoQmxpVGlQSW9qazU2U0l0aXQ4Qlh0K1k4NEUydnhpcUhTTm1BVitQWG1FOE5Kalc3K0tVMwp1WnBRa0J0d1hZTjRIZHpxNkNMN3dsWWo1YUtVcnFuVmRVVlkzTkJxSk9NWTY3eVoxWUJpODgwTFFEVk9xUm5uR0FicEdHOWdOWkRsClJZZGltU0QranBwVzVudGhVQkgrQmF1dWthY1BWald1bFpORm9LcVA0U0pWc3lLeXBrT3FidEhIUGtEVkxRcEpiazUxaTI1VndhbHUKVVVvU21Pcm1ibmczcFpvbEh6SXhFbzdWbjlJMlpsUmpBK1ZmTDBRMXpvaDNMUWpWSUV1d1NqMEExYTBxRm5uanFXSFRoMmcrTlF5YQpONHlueGlCRWljMU5weWFVaEJoZnc2a2htbVRvT2VEVUFCQ3BxdWxpVXlORnE3SGJhT3JhTEdJTk1qVSthR2JxYmpBMUZTT1BzcUtzCmRhZ09XbXdzZFlscDlxWlNJd2wvTTZsclpPY0RTVjJDVG40VHFVdG9Td0pJalFha0tsMDBqNW9kU1MwODJEanFqREtVcE4xRWNGR3IKdnMyaXprc3hvNXRFWFpqUWxEeWQza1JoWms5MU9nemVsbUp5NzRXaFJybThJdWltVU9kZFhCbHdhY0JzMHZyMllsQjM1NzNDOW5DRgptWVZ0OEpvWUdVMTNQVGdFYWk3UDJpRlE5eWpqRTMvNmNjTHVoWjkyYmVxaFR6OU9TRzM0Tk1iM21qK3hweDh4L1E1Nit2bVROM2dhCmZsVjZZNmN4QjZKbjhNWk9WelpsbFk1ZVZZOVZ1ZHViT1QwWmhHN2ZEblA2RVJicklLZVgweW92NHZSeUVqQ0kwMXkvSE53MC9od3oKdmVmeGJBMzRoazF6cTVJdjFqUzZSeHBIZlZqVGp0TnQxSFJYQ2ZraFRXL0REWnJleHVCTUw0Y21BaC9ORUdFYXg4QnpiQTYvN3EzcwpHRy9HOURFY3hQUzJCV0U2NzZyUEFFekhxM2p6cFZFTTBFZ2pGbDRhU3lXMkZ3cTY5TU5ZWktwdnVqU09rTnVZZ1pjV3BxRG1nNWZHCkI4MHV5aSs4OUVOSVl5a0hMLzA3SnQxcVQ0Y3ZEVkxCbU9aOTd4RUx6a2RuSGovdzBnWkhiTHAwRG1MMURaZkdLcHVwaW1CTEwvcXEKN1Z1d3BURVN6Zkx0alphR1o4Q0tkcE9sSC81a3Rab0JEaW5LeHovT3p6c0dXUnBlVVowenVBd2ZreUdHTHZiaTNHaHBPUVhTQW0yeQpOSW9sQVVFOFlHbmNxbVM1NHFPUGdHcnpGMVk2bTBpd3FkSm9TUDgwZ1NKSU1NQ3dKVVhSeFpTR1lLUzcxNEpHYllqcmpOVlE1Vld6ClJ1Y0dTcE0vMmkzR2xQNWJsV3liSncwRDVTQTNUaHJIS2sxdUZJVHp5TkYzcCs4bHlXMk9ZOTBzYWJpRzNiMHhpRlZoZWZqVXRiSUsKa05EWGtiKzlRTkxiR0J4cEtDSllUeHdZYWQ2aVZOOFVhV0pPeWpnUTZlS2lwTTJReGhZTStONElhUmo1VUlJZ0RTSENNK1lCU09QcwpyVTNaSlk2NEFBNU5RWTh1UzRqaURZK211bzArNVdGSDE5RG1CRG9hUlJOYy9nUVJHalFoeWlGdWNEVFdHTkVWazhiK0dCb1pzTkp0CnVLblJ4MmhvZEZ0V1h3UXorb3RUSFQ0M2hpQmo4aTVtdFByeWpINlkwZFRKc1d3dm1ORlVDRkltZnlHajhhRXlGckNSMGRoTUJPRlEKV0FGanpGalBSWXltTVYzY1o3M2NlVzFnZEdJQmFodHZZRFRlTDNJRXJoMjcrb0lZR00yL3AvbkV6OEd0RCtsUk56QWFNa2psRWdNWQpMVEZTK1VTTUp2U0JSYVZCaktha2tzSEZJRVlUNnNNYytrMk1wbFVNWVJPaitYaEdiNGNZVGVrSzgyNDNNcHBxbFZibVJrWlRxY0p3ClZDQ2p1VWt5WVB1dzR5Q3ZaN2c0a05GVXFqNnRibVEwVkRpaUZ0N0lhT3JhQlFNMk1qcVI3Y3NDQXlPajhVNktmSHNqb3lsc1pwQTAKa05Hd0VJS3dtZEZpSTVtVWZmb0ZKdlZYMnNob3FJK1VPUXhrTkhYQ2pEM2Z5R2lxeXhoaURXUTBHMll3dm1wa05BMTh6VzlrdEdScAovUkNqYWNDU2JST2pZV0hkNEFzWmpVc1MxRG1RMFJCcUsrWWR5R2pLa1pSN3ZaRFJiSzRiM3hGcnJSbTdVa2JReUdqRUpab3h0YUdXClIrQ01NZHdBUnE4bW9ldm1SYVBObnBvK0hsNzBhbEhHYkdBME54b0hGNDJqRU9oNTA2TFhqT2RxV0RRRGJvejhCaXdhbDBIUjF3c1cKaldLZ2lMS1RGWTFPN3VSckJpcWF2RjJWNGdRb0doRlJkVUUwSjNvVzRmdzJKcHJhbDZ3dzg2WkVvMCszMmo4YUVnMkRHSjFtUkdPMwphb3owUmtRallxY2laUk9pR1JTa3VpRUkwV3p5emJ6aFRZam1GZWRIU1EzbHBCNzNpTnFFYUZTOTlqcSt2UURSeTVXdG13L04xdHJPCmV4QjB5Szdmb2pkdk9EUnN4UlhOWkVQak1Bb0pDdzNOWHVDUGtKZEJoazRVSnlUakdOU0VKaWlvZ1liV1RPS09pQnNOTFE1Y2NUOVMKZGpzamIySHBXQUtMZ0pyQXNmMW1ROFBxQW1pem9XbEJzNWRnUTlNUVVPbk5ocWFWdFVuQmh1WVAxQmtrYUhqalRHaXQrZTNGaGtiQQptV0s4ellabWFZTUt1cU1BQkZYTi9HQnVPRFRMS2FoaURqZzBLaFNFN3dvNE5HK1FxaXd2T0hSUzhmdjZ0dUhRN0xmTkFIekFvVm5iCjhKZ09zK0hRckM3WldHbkFvV2xoSENqZzBMU29zK0lGaDZZU1ZTb2wwNkhaVTZpNXBsS3lEUEFpdXNzSU54NWE2bFNTMDQySDVuYmsKRXdVZUd0T1IybnZmZUdoNk5XcDFhRHowVWJFR0hocVdHcFRualllR1ZVNkg4ZEEwTURvWmVHaGExSHpxd2tNekZzZXFVTk9oMWRuRApNaUNoZXhCbTR1QjJBNks1T0tKQUpBalJpZEJmWS9ERmlXbHVoZjRpUk12S1Q5ZUVhQjVMOWFzaVJNT2diZzQzSVpvdFVpaGFDRUswCkZnRm1SbXNwWE1aaHFHOUN0SXFubW5SMVV5VTl4WE45SUtLNVlKa3UrdCtJYU1xMHhaTTNJcHBLYm4wV1JrVFRvZy9nWWtUVFN0RkYKTUtJbGxjOW1BVlF2d0V3MHVCalJFc2JyY0ZwTnd4OVpKdEVURWIwVjd5OUVOTDFDOW04T1JEUnVtUVNGZ1loV05PTVRJWm9SRGRYVwpHaEhOY0FhbnVHQkVLOERSamU4SVJuUTY3VXpNaUhaMFpCNUdOQ01xTS9BZCt6Yy9ybEorV2pDaTZRVXF1UjByVnN5dm54SFJXQXhJClNCSWNTVmJhcUFpVWlHaVMyWko3S1c5RU5BTy82dkpnUkRSZU13SW9naENkV3JUTHZRalJMSitpeWlZSTBXd05LSTJRQ2RIMDVIT3EKYjBKMDJvS0JJRVRMY3ZqUVgxY0FlMjJBMGZjSnVYL3dvWkVFWk5vdThOQ0o1SXRIb0NQNWQ4QUJrdmgyODZGcHBUVFlmR2djWDVMegpBRVRESWxuNkRZaUdWWEptODZGcFVGclFnR2habVBDNkFOSDRSYmFtQ2o0MEVwUE1Cd1FlR3BtOGdQZHRQRFR6a0N4VENqNzA2dFk3CkJ2WVpRMXdrd1RZZGVwVEl5TnJZbzhOd3NLRTdxc1Vka3Qxb2FCZ2ZzNXM1czhBZzFJN0IwSkJTVDBXd3RtdlBkcHJVV1pzSzNhUFUKTkxicTFSbXNtd25kM2Z0Nkk2Rkhjc0lxU00vb3E4MHA1Z1pDazZpODZqR3lOM2FUUHB3NDZHMjRhZERIYUJqMDlIeStJYytBT2FtQwo2MEpCaithdytONnFDSHV6U2REYmNJT2dqMUVjNk5HdFBnME1OS2dTQkx2ZEZPaU54QTRJTkVMUFRBa0ZBeG9HTmErN0VORFlMVGpPCkRCN04wTzRFQUhvK2Z0MXYvdk9JRmx1QmZ3YkVSWDBEalg4R3RVUjB5b3YrVFBTdkEzU01wMndXY0xDZlJ4SlM4U0kvdzdRc2V5TUUKQ0lZYURlSXh2UXhEbUcvczgzZ2luV3ZxODNCRHBBMTlob0Yxb1RmenVkc1AyY3huQkVCWm94SEk1eEVmN1VFK2I2UmFFSjhCWldOYQpPSURQNElSdUZuWmdpV2tzTWpJaGo5M0VBalh0K2NNZ1R1Rk5lKzVKZVYrem5oR1FaVm8vVU0rNllCbnVYS0Rxd1FMMGpIUzMrbkdaCjh6eThTbjFobnRuM2VkVkRlZTVhZVczR2N3L0k1bzE0NWluVkEzakdEV1lGalBITytMdll1MjFuSDJGK0F1N2NBNmtiYk9mcktKdnMKM0NNekdtRG5FU21rb0RqdmNlREdPZ09ZcURKZVU1MHg1cVViNFR5alYrTE5kSjdkWXZTOTFUS3lQWWpPa1BJMWs1b0Q2RXk4NWF5SAo1d3hEOTAwa3pubUdoT1RHT2MvZ1J3Zk5HWFVPVE00RnpCbkVhdmJqdkZET2k1SHNja2pPV0NvejcyV1E4Lzc3NWpnZm96SE9RTHBFCmYyRldiczFpWXQ4TmNWN0JTUXFHTTlhUyt1cUQ0WnlvYlhjenU4MXdobFVMbUlpNlVYMURrdWJPcTJONVpEanpidUVMYVJPQlZJRncKaG1Xd2ppQVl6dHlHSC9waE9HTUcxZlFRREdjMGVIZXBMdEw4V05Qd2hiajV6UitYUjY3SXhqZnpsSGgzQTkvTWd2NFp2T1ZkUkFLbgprUmNkL0daVzlFOURzTlZaTUVYWDdadmZ6R2ZKUWduem0vbEtOQU9pSlY1T1ZqTysrTTFzRXhsWG9GQTNQRDBPWlFZNGYvV0RmdnpoCnZ5akFtWEZCVXE1dWdET3RsRGdFd0ZuUndwSVBzSmxoUURXTHVCRE9ERmRSSHhRSVp6eFgvNElSenVBeDhnVzVDYzY0Y2hVWUJzSDUKckdhRDRLeHZlbW9DUFlGWmRueTFENlhNV283Nnk3WmpsdDNPU0h2RkxNVmgyUVJuR0tRYUNJSXppMGZWOGVFaU9PTXFwVTRMZ2pOZQpPMEdiQXVFTTEwNkNzcHZoZkR6WVlEano5UXlwaGdnUFpGSU1wYkEydy9teW11SE03cjBNL1FmREdSYkp3MjZHTTNFUFZCd0Z3emtSCnErMEtldlVTaDZDV3c4dk5jTVliYXpXR0djN1U1YW42MVF4blBGK1ZJOThNWjFTbmtlZ1ZDR2VVYWdtWDdnTHI1UVkvTDRBejFHWEIKbDZmSER6ZWFRMGZ3bS9HZWNIMXk4NXNaNE9Gd0hmeG1CbmpFSmZCb1FVdHpEZWlwbHFMVnJYMnA0K1N4V0NRZC9HYitaSlp3WitPYgpHYWlNWnZRcU9Yc2VSUUUzdm5uTllHd2ZlalBLYVlSWE5yeDVEcTEyTjd1WjVUVTg4d3Zkakc0d0FrR2IzQXpwSkN2MUE5dzhvdkx2CjVqYVA3dUV4c00wamlwZUQyanppNDdtb3pWallMQ09hR1JRWkp0c0dzaG5rUE03N043RjV0Q0JJR05nOGhzdWlqV3NHSW94Qm1rTnIKUnRzWURzMUJhNmFzZ2lYL2hqVjNCeDlmckdaUXVoZzNDMVJ6TDI2OVkxQXpzVjVENWRDYjA4eE9SNDl3enJ3c0hJYXZZRkNhMlgxKwpLSm04MDNJOUtvQ2p0SnBpUDBNWVdCZUpxNmlQR0FrYjBjd3U3MVdmTlFOUVNOVHhXd3BBTTZocjlFQnZQak95ZHdRakI1NFpFQUhHCnhJTE9YS1A4OUlZelF6WTFTcWp4SVBNTHJ6RFF6TVF3ckZCM1dqUU12UTlMNHdQTXpGWmZ1Und1TS9qQlZCZmRXR1pVNEdxTllDcHoKYTk0cW9NeFlGN0hFOEdZeXc4Z0ZTRENaSVYxcTVpaHoxUXh4azBpSkY1SVowd1RCOUVGa2J0V0Z0ZGR1cW1pOWVjeGNpaEhnWUc3TApYamNFanhuS0VzN1NONDRaVjhCZkN4cHptNmU3TnljVDFGV0pvSDNCbU52d2x4WXM1aGF6VjZDWWNUN0ZqTWFkQk1lc3dnS1RJREZqCktocVhxTE5OZDd1NE1jeHczclg4TjRVWnB5WkloQ0hNRURuTnRGNE01aFdMdEdBd3J4YTk5NHhnWHQycDQ0dkFEQzJ4Q21rTllGN2QKUHg3OFpVRWJ3ekMzVGxqTm5BeGZYczRGYlBZeURQRmJHNzNNUkFmWEJvRmVqbVRFSmk5RDVFWHF4dzFlbmlNNktwaTd2QUt3R2RqbApGWUh3aTdxTVJJdmVtNzRqOHNFY0NEVXoxeitVdzkvVVpWcEZFN2NNTHBHRGE4V2R2Y2RxanNsTlhZWjFzZUEvcU10a1JQbTlrQ0JpCk4wRzVvY3ZYNFF4ZGhrWG9wb0F1cCtSQ3R4ZDBXU3VmdFE1MG1mbG15azREdWl5UWdaVmxoMDhQUDVEQ3pvQXVNdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJemNzNUxhRExYejNJQ09wOVAranljck9wRjNONUxRRVdObklaVmZPc2p3bmlNcHlIWkFUejFob2hIY09VVWZDV1lWQnBzbkhMMkkwSgpxcHUyek1MWWVsakxLNERKZ1ZCV1FQRmlMK3Q5aGtpVEphK3hHYmlQNUFZSGFmbEtuRjJrWlM0TnFJc0kwaklYWkV6aEIybVpZVTZYCmtHNWNNa09kQWs4YnRNd3pVNWU4Y2FLYVJ0dDkyck1ieXF2KzhUQ282R2RFaVVkMjZjbkZXV1k5aCtxdHpGbm1aUS9XVjVtenZDMDMKWnhrN2ltd1NuR1Y4a2FUN2I4NHl2S3FxcXBXTHN3eXIydmtHWnhrV1NuazNhSmtPT0IvUkRWcW1sNWExR1JPRW9EU296RTJZWlc3QQpSM1pqbG5saWpDUUhaam50bmlTQldXWXBDQWZkQzdOTVkzVVhCdEhVWU5Gc0pjd3lCejBXbzl5WVpUcVkyVUw5b2hWRlVzbjJ4aXpECm9qS0ZHN1BNSmJEbURHT1dFd3ZoaW5TOU9nbU1IU3hkdURITFhCUlREeDJjWmF4a1dRTVNtR1VsZFV0OVk1WVpOeUdwSXpETFhDS3AKVzRReHkyU2pWY3MrVDhROWgxWTZNTXRrbzAxdnhrZWJnd0oyWTVhcEptRjB6SmhsR29xaHlnemdjVWVobmkvTU1qS1d2di9HTEVNTwpvczVOZ1ZuR05ycGhOMmFaYU1VZVF6eFRuY3ZoOGhWc3B1VVl6QTFaSmsyTGxUVjd1OVlzdEEvS010YU5lbmx1eWpMankyUTlCbVVaClBxWWNqYUFzSTNhZ09OaE5XUmJYYUk1RFdhYjJUNStnS2N1MFVFcC9VNWFscE96elVKYkZ1Q0pNeEpSbDdxa3lxNHV5ekJCNXdMWVgKcGU3SnE1MmdMSE1oS1hqNFJWbVdmSExOUTFubTZVZlJLaW5MQ0dBSmYzRkJsbUgwTHdxeXpEQ1hUc3lRWlZvWUVMb2h5N0NLOVdmSQpNamZUdlRCa21jZE9iaXV4SWN0YzNZak5Fb3pMc295R00yVDVHRzdJOG1VMVpCay9vQ2hMd0pNWkxsSUMvNElzWTZrbzcyNXZsNzIwCkNzYnlNVnlJNVcwTXdqTFhjOHJWbTdDODM5Y1hZWm1wWnhJR2dyRE1rbmVxQm9Ld3pPUmh0TTdZZWtsYWwzMUJmZlhJSG5LMUpNSXkKYzREeFp4VFBTS251cDJHdVkzT1dMUURMM0lZcjNodXdMRUh5VElldzdDREhQSVJsUnFybUo4QXlzWjFQam5ZRnlYa2hJaDhDc015dgpMekw2VnplYmFzY2pBTXV3OUdKMWdFaW9yY3FkZWdHV0dSc2ljU0FBeTdSb0hoTmdtUVlKRFM3Q01tOC9NOWFCV0dhcW00SzFRQ3dqCkVLQkt6aHV4VExTVnV6T1FhZ3VWV1ZlM1FCT1dNZGFwdmRsTldLYXVJMGZ6Qkk0Q2NIMlVYVGRobVRHVGt2SWJzUXdybWVBYnNVd0wKSDFJd2xtbWhRUEZtTFBONFZPVUVZNW1SRTVWWHI3aE1GL2E4R010MGFMTjdTVGc0WnU3T2hpd3prZEJHOUdhSW9XZGJBN0xNR1c3MQplaURMdkdmc0xYOVRsbUhWaXhhVVpWaWtsQXJLTXJlaEJPcW1MTlBLUnhXVVpSSDJSaitVWmNvSTFjdmpLbm1qTkpMMTFFRlpobktICnc4cW1MRE03UTRmMnBpd3phczJLKzZBc3M0Q1hDc1NnSjhPZFlJdXpGMldaSzZkMEdWZW9NUUxLdVEwM1l2a1lUYUpDYnh6eGNneFkKL3VMVmY5ZUZBMi8zMHc1R0RXdUd3cHVidm0yOE1wNXdtWHJFb2l0M2R4dDd3Wlc3bWF1YnJkd2RNTjVvNVdsVXc0dXNQQjBaM0lCawoxNmtmc3ZLTWQrNEdLMDlHNHU2OXhNVGRWT1hwOHBJWFZCbEZZMVErbWFuTU42VGxRQ3BETmNKSTlVMVVEdER0QmlwRHU4VWhMVURGCjJmV3ZOMDhadG1uR3Nwb3VkUEYzQXFiTVBOSXFiNVp5ZHVYTVppbkR3SFphZ1ZLbXB0NGg4UTFESTUwYXF4aWhsTkVSWTZ4MG5lQ0sKdGU4RlVrYmhBc0d3d1ZFT1BOTEdLSmRvOUh4VGxDR2NZb2c0SU1yVUI5ZDVHTXJBSjYwWFFMbTBjQ0xOVHk3UmxEZnd5VXd3T1FHNgo2Y2xJUXlzN1pYZ3lLZ0thR2NzTTZ4WFRPbTUwTW15azhRVTV1WVRRTDhESnlFa2htdkxpSnFNVUp2cm1jbnBGcWtFWlI3OUJLRG9SCklmdUNKdGRnT1FZem1WRzlOUTR5R1hvUFpvbHZZaklTT1BTNkE1Z01DVXEzSTA5SlViZDI3b1ZMN2srUUVFMUx4bTZNakFjc0dRZG0KYU81bUpUZEwxallxdVVYUHpTQWxOODlTTDFJeVd0eEZZb0drWkdoWW1Pb3pKeG41NTZGLzM3TXBWMW1QdmlHc2ZvZEpUTUZJUmxmMQpyckQ0cnBqQXNpK0hiQXNmeXpBRmEvT1JzUmY3b2R4NFpBUmNsRUUwSFJtT0FSbnNBVWVHdms0bExSY2JHZGZhWFF0QlNDb0ZLazBCCmRRYXFJRDFnZ1BrR0k2dGlySDdiWEdScUJwem1ZZWF6QzF6eGdpTDNhQWtTVE9SZC9oNUk1RzRveG91SXpBWXFQSmFCeUtkWTJUemsKNGdMWUZ3NjVCaDR5YU1nZzlETFZHRERrVmc3b05WaklCSzF3eGFLSy9CWk56NEtFM0VLdGVvT1FZU3pFR1p1RFRQWUsxeS9HSU9PMwoySmJpeGlCWEYyTnNDaks4TkhXR2RDS1N1ZXVscGRkbUlDT0x3Ynh3SUpCQnRlRjNGZ1RrRW0zWGJ3QnkyYzM3ekQ5R2hZWkltc1lmCmsyWm1odkdtSDI4WVVjQ1B5NGlwejZrNUdBaHF2ZEhIZk8wc0RlTzhBclljNWRzQlB0Njg3NXQ3akpveTFSdTZLS2RrVDB1aUhtY2sKcEl4c3Zwb0xPVTRWekdQa1padTNVaSsvTGhibkRUek9YYXIrelR1R2dSQjk0WTV6Tk1hOGFjY2YwenlyQ3cvc3VKb01HYXpqeGdGVgpOWDRiZGN6V0NtSEVYSWo1Z1VXdVFUckdPNTJOSzk2ZzQ0Wkt0NmVlc2tJTW00T2ZrREhIaUM0OTVpTnZ5dkZpTWpSOTI1RGo2azdlCm0zRThWQUw2Umh4L1RKakxnamNoanBPbjVTQWNXMmY2NGh0UExxTnN4TFFsR1o0b3lNeVNUWUo5bmJTTGRURmdJbWxKVVUyNDhmUkMKTHVER0VTZC9vNDJsK3pwazR4R3RDZ3cyenRIaTlzVTE3cXF5T0ZoakN4TTMxWmhKQUpVcEhxZ3hreDVSbFlqRnI2R2ptMmlNdHlJWgo5TENCeGlnSlcrWTZrR2VNOTlrTEVYMGxIUHUwcHRrMDQyS3ZLV0RHT1h5QVlCbXpSdDBqYnFDTVVlL1dWVzFKVHdtTEdyNlNtMk9NCmdqT2psQytNc1NYZFFURnVEQktrQXpIbXFvcGxxamZFV0FxU1VRN0VHQkhVajNWYVB4Ump5am1mc0lUc2lWclIySTQxQkxEVTZuSXgKUHJpdi92ZjM5TzR4K281WVNKdGlYS2NiVGdiRU9GaGxtMkhjY2tocEw0UXhBZ2pGMUVsNjFjQmRVTTBUQUdNU09Lb05JWlVIOGtKTgpndXRtWUFpcUd2VGlscDNKdTlqRkxiUUZSaGNqM1VxOVo1Q0xrYU9VQnZ3Q0Y3ZG1mSTlqNTFDTDBzTXhrUmo5aHlPeEY5amltU0s1CkxCc1JzWFVjYVBGS0NpQzhtTVV3c21vaWtNVXIrbmNFc1JnZ1YyK3dYZlNWUEtjR3JoakZXQXJlZVN2OEE5TnhONng0VHJkRURsYngKcHZNR2doaG9DcnFYTjZsNFBQWm93Z2loTUhOeHdTbmVoaHRUSE1aTktSNmV3VGQ5R0NKZXJuNXZTREhFdHdyazJEaVQ0YVJDRko4LwpMMEp4R0RlZ21IRGxWUStmZUFSVzVNWVRRNHdzTXBEcHhLTTVZeDEwWWhpbWVickhLNDFlMzhFbUhxRk9DaER4YU01aDNtUmljS2NDCmFZelhld2IyUDdqRStHdzJlamV3eExQWm1RNHNNUTNsd2hJemZwM2VVT0laSkNjemlhZmJnUVdTT0ZxSDMwQmljQmlWblRhUEdKcE0KSmhxTkk0YjZrdmZ3cGhGdllGYkFpSWxjWkRyTUxPTHBEL1dGSWthcFVqSWhORXJuMU1RMFNNUXdaRWZQTjRpWVJzeEV3U0VHMDRrSwpFbU9JVjdFRGVGT0kxOTBXRVI0TFVjOGpIUWd4Uys3eUcwRU1QQmREWEVFZ1J2cGVsUm9HRUVlejlSZC9lQVpITmZERHk4dXFUUjltCmxTQnh4QWMrYk5iMFJnL2poRlkvNE9GVkpObDljWWZ4dWJGWUxyRERLMHBoZ2pwOEhXWXpoMmNrWkFNNVBKMmEybnpoR0FaZXdHR28KWFVVME5tOFk1TEErTG83d3FCNUxiOXh3RC9adkdKRzFacXc3WU1QVW5NLzZaZzBqZ2ZTNDZUQkNIZmc3R1VnOEpjQncyZlFGR2taaQpLa3FuUlVOOGxIVFltR0drdUpwNzFXMHRUM2VnZTBPR2V4U1dCV040RzI3RThER2FNTndOTjlwOFd5eHBrMm0yR3pBTUtEN3h1VjZRCm9LQXAwSXYwVktxTDhsNXdZWkNqVk5SdXRqQldQQUpXR2kyTXRWQk9iN0F3VmxPcDlNTVZ4cG9yOE1QOHlxckZCQytxY0xNb1kwT0YKZ1JscTdTQ0ZSOUN0RDFFWWdpWWlKUU1vekxXWlM5dFkxa3h5YVpsdm5EQzlzZFFPVFZncjJYNWd3bHpyanZ4bUNXTlZ2SXdtNXEyRwpRUVg5UmdsWEt6TmZKR0VBcE9LOCtYMUVIbXh6aEQ4N09qOStSeWZxLzM4WTRTOTQ0RDl5NVBydDcvMmozLy8xZldBYzZBOS94Zi81CnMvL3JMMy9SRC96MGg1Ly85SC81NWYvVnNkdno3ZS85czEvKzdDOS9ZNi8vNFM5Ky9kTi8rc3RmL2Z6TDcvLzYydjZQL2NZLy9hdGYKL3ArLytPVnYvdlNmL2VGdi9yM3B4MUczOE1kKzRILzdpNDlUK3A5KytZdC84Mi8vK28veWttUFRQL3k3UC8yNFFmL2pYLzNoOS8vUgpiWC82NVYvLzlYL3l4cmpJajd2eUY3LzgrLytNYS96eEQzKzVyeEZWM1IvRDR0OTZqZi83WC96NVgvL2IzM3lXLy9DSC8rYnYvNlB5CnAvL3c5My91L2ZCM3c5OS8ray8rOFB0Lyt2R1MvZlhIZS9hNzM4bjhEMzc1TngvWGRmM0RELy9rMytGZnB2N2xIL3pWZi9qMy96YU8KODkvK2sxLys1cHYvK0piK3V4K2ViMy8vNC8vKzVkLzg4QjkrZUlHaG4yLy84OGQvL044ZnByLzVWci85NDIvL3gvLzVmUHR6YlBuUApmdmpkQktPUS8rL1gvUWZxZ3JDUS93a1cvRUZ4N2g4emYrenkwMzJjbjM3NC9jZXgvOWNmNEZ3endmVkFmNWIxSDFoK1Fwby9vTndGCkRPaGp5ZmV4OHNKL2ZJekRuUmJHNXY3bG4rR1lrTkpYMUgweGlKVSt4aG1lSmNaM2xHb2ZNNHhWMkt1SkFNTEhEOVpQeHE1MmNELy8KOERZREZmSHhDKytqb3BqbFkreDVuNEdOT3NDUU9QNjlyWU5QNzZNZTQrc01qdms2MjNQVTY3cSszSU9mZi9qWFB3Q3N0T0JrZ2lySwpmQmpVUFFWVEsybmhINjcyUkluRXgvSVhtWEFVSUMwVWNYN2MxL1I4KzhmN0VjS1BUY1FuUDM0Rk9EdTAyd3dqWk1YUUlLcHIyY2RNCjlEWW1wVDk0YVpmNUVTWGlkZFNQNldqaEpYaWRRUmgvL3UwVCs4dVBLNDUvWVAwVEpybE1rRTRjdTl4bW53V1dySk5GRkwyblQwYnIKaC9ZWjIweVFWLy8yT21yRGVxR1ViNjh6Q09QUHYzMWlQdVAvK2dMLzhSZTR6cHBOU3B1TXBIeXN1NEd3UVRGQnhidjdNUTRRQnRpZgpnZGc2NFFFWUxEUTJBSE9ITFA2blcwdEJSV3J2VTRBb2dVdWkrMlF2NDMxaGwvbmNoT3VvNTNaZFozRGYydWpmOE41MmtxdjI2YWpICitEcURZNzdPOWh6MXVxNHY5K0R2T0RiOGpxY3lRTHo3ZEY5eDJ0QnJ2SDRmRjRnby9ldE1MK045VlpmNTNJSHJxT2RlWFdkdzMxZjgKQkZ6bjk3YkladVpQcit4bGZKM0JNVjluZTQ1NlhkZVhlL0JkWGxsMjlYcmE1L0VMZ3c0cTFsN2pWMlBZcXJ6SHI4dDRqMStYK1l4Zgo1NmpYK0hYTzREVis5U3hGOW50YmxuWitQdW94M21kd21jL1pucU5lMS9YMUh2eXNvUkp6Q0pRK24yNE81cENuZkRvSXBvdktMK1FlCjNJL3hOYmdmODdtTWM5VHJnczhadkc0T1pyeUJRT0pyVy9MKzE2ZWpIdVByOFJ6ejlTajNVZStIL3VVZStPWmN6KzJlcTY5bmZPYnEKOHpaY2MvVmx2T2ZxeTN6bTZuUFVhNjQrWi9DYXE4OHp2cmZkYjhOOTFHTzh6K0F5bjdPOTNzZHpYVi92d1pjMzUzVnpybWQ4T1RMNwpiYmdkbVdOOE9UTEhmQzdqSFBXNjRITUdyNXR6bnZHOTdYNGI3cU1lNCt2eEhQUDFLTS83ZUQzMEwvZmc1ODhlU0dNZmkvYlpBd256Cnk2dG9UTEYvY2tzdzIwaVA4VFpia1BjK0trdVgxbnYrRCtNbkQrVGVkbnNWOTFHUDhYVUd4M3lkN1RucWRWMWY3c0hmZlpvOFUrL3IKdmg1SDRmcjk0MUpjWjNvWjc2dTZ6T2NPWEVjOTkrbzZnL3UrSGtmaDNuYTdGUGRSai9GMUJzZDhuZTA1Nm5WZFgrN0JkNWtteit6Nwp1clhIVjdoTzRYZ1YxOGxleHZ2Q0x2TzVDZGRSeisyNnp1Qyt0Y2RYdUxmZFhzVjkxR044bmNFeFgyZDdqbnBkMTVkNzhIZC9aYzluCmdFOW5sQzlEUVpoZm4zZEhxWW85Z21Qc2dvRjhHZ3B3cVBxTTkxREFaaGFwdmovRU1INGFDdTV0OStkOUgvVVlYdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJWjNETTE5bWVvMTdYOWVVZWZPZkZ5T3ZXbnUvMk9vWHpoVjhuZXhudkM3dk01eVpjUnoyMzZ6cUQrOWFlNy9iZWRuL2g5MUdQOFhVRwp4M3lkN1RucWRWMWY3c0gzWEl5ODd1djVhSy9mUDUvM2RhYVg4YjZxeTN6dXdIWFVjNit1TTdqdjYvbG83MjMzNTMwZjlSaGZaM0RNCjE5bWVvMTdYOWVVZWVHb0hXUWdKbkU5K3p4QSsvNVB6WklYNzI4MDZ4cGRMZHN6SFF6bEh2WHlaY3dZdnYrZnJpVGtjTXI2NDl6eHMKK2JUMjRRbG8yMnMxY1l5dmxjY3hIMGY4SFBWeTJjY1h6LzUxT2pqRmY2NVE2ei84L1orL0FxMy9LZkhYOG5lTHYvcU9mUXJDbmxncgozckEvWW94OWYvcHl0Qk9LL1RzSEMvSHVkcTNlcVh3cForN0lqUFdGMmZNQmlKVmVaNmYyeVlnMWVXMW43ckFaNi9kUnY3MlAycFQrCmY1K0JqWHZ1V0dOODJuWkk2ZjArNmpHK3p1Q1lyN005UjcydTY4czkrRzV6Qi83OTA2MmxOMUUrblFMOURyN1kxOGxleHZ2Q0x2TzUKQ2RkUnorMjZ6dUMrdGMwNjIvZTJVMEsxOTFHUDhYVUd4M3lkN1RucWRWMWY3c0YzbVR0WXRmSHB2dkswODZkWGxoZFlQcjJ5bC9HKwpxc3Q4N3NCMTFIT3Zyak80N3l0K292YithZHRwS2NQcnFNZjRPb05qdnM3MkhQVzZyaS8zNExzRnNsQVo1ZEd6ckJPT1lJdkFiZjZkClJ0dzhhZ3ptWlh3eW1oYTh3eEUyUHlvWWVSMlZnM2VhMzE1bkVNWWRqb0JvOGIxdGtScjJmZFJqdk0vZ01wK3pQVWU5cnV2clBiakMKRVUyZTczMXpPSmUyVHdmaHROblQrK2N1NDMxcWwvbGN4am5xZGNIbkRGNDNCelAvbk92VHRrVWxZZStqSHVQcjhSeno5U2ozVWUrSAovdVVlZkljVjkzNDVJbHQ1V1R6aHYxOUN1d2J2aDJYanA5ZmwzbmEvQXZkUmp6RjlmbGZIU1ZEdFJ4U25lRm5Pd2E1WDRmenNkY3Z1ClU3eHU3N1h0ZmhEM1VZOHhmWDVqZklyZjhjT1BYL3YwNFlmNWRZTjREYXQrTXZwNlA5M011RGV2bzM2S1Erb012c1FoOVNRL3hTSDEKME82akh1TjlCcGY1bk8wMW5KenIrbm9Qdm56NHI1dHpmYUxuSU9mUlhEOTNHZTlUdTh6bk1zNVJQOFVoZFFaZjRwQjZoejdGSWV2bgptM01aWDQvbm1LOUhlWWFUNjZGL3VRZmZZU0pQMGkxK3VxL1YzVHZmOTlYZDY5NzM5UmhmOS9XWXp4MDRSLzJVcU5ZWmZFbFV2MC9zClNsU1B2bGNYTVFYZzJDbmZacDlGbiszVEZIQ01yeW5nbU05Z2ZZNTZEZXZuREY1VHdOY1QrejdEd3ZhTXcrWDd0RG9JODh2anB5Zm8KNU1BeDJoUDh0RHFRMzdxRHpENnFQZHozR2RqNGFYVndiN3M5L3Z1b3gvZzZnMk8renZZYzlicXVML2ZnK3dTWjVSYS83dXR4NHEvZgpQKzcrZGFhWDhiNnF5M3p1d0hYVWM2K3VNN2p2NjNIaTcyMjN1MzhmOVJoZlozRE0xOW1lbzE3WDllVWVmSzhnc3ozajE2MDlmdngxCkNzZmp2MDcyTXQ0WGRwblBUYmlPZW03WGRRYjNyVDErL0wzdDl2anZveDdqNnd5TytUcmJjOVRydXI3Y2crOFRaTzRSaFpzajljOUQKUVpoZm56ZGpZUG5UVU1CNFdadWZod0ljQ28yRTNrZEZGTzc5R2NyMGFSZzQyKzBQK3o3ZU1iNSsrNWl2OHp6SHZLN295OVYvNXhEQgo2NmFlTC9ZNmhmTnRYeWQ3R2U4THU4em5KbHhIalp0MS9mNjVxZWRyUGR2dHIvbyszakcrZnZ1WXIvTTh4N3l1Nk12VmY4L2d3T3VPCm5nLzErdjN6U1Y5bmVobnZxN3JNNXc1Y1I0MDdkZjMrdWFQbkl6M2I3WS81UHQ0eHZuNzdtSy96UE1lOHJ1akwxZi84bngvOS9PZS8KLy8yZi9mckxuMzhicjhqbmYwYnNzK1lGYVMyazV2Z1BNR2wraFJXNE45U3pIL05Qbjh6dFk5SFRxOHpuR0w5dDNZZjRQYy90ZXdoVApYK2N5MUlKN256bmNRSnJseThrNGJIdjZyTGExNTJOaFFXTjZxRytYbWJXR05MTkYrK2NyOTYvOUJEK3pFdVVHTGdCNmxINmNlcDgrCkRkUzNmTHpxTkpQQUxDUDlRUDBrcWdwa0pMSkJQemhMbk1kZ1AwQnQybVAzanlGcCtkSlFSaVBqeHdyVXY4OWF2OWo5K2ZnUS9mc2YKYjVvdmVlMkRLdEl2bzI4TldSQnhGOWpTeDNjc04yL0ptbTM5UHFveGZMOHdubXJMUkxxbHpPUWk2cmJnZWZxazBKRlZScFRmK2FxZQpNSDQ0OXVmeTBSalo1Lzh4SHNlbWJYai9jd00rUFlBZjlXVHl3dzVpdEdmMGF2N1ZWcmFTcHJVcGxDL3JTUDQ1ZmVNeXJoWGI1dDYvCi9kWlI0OWZtbjlUMCtCK2VqNFdCZjI3dTE3R3JlNnFOV1FjQjdHcHVtMTREZzBGL2pQM0hpQzJmN0UzWnhVZkhaSmp4dDM0L1Rnek4KWVBTRTBXYWtGcDhZY0p5NnVLWWlVaHRSKzJmamFtRjhZc1BGK3h1YkxwOXY3M3QzRkJqS0JvVDJiLzcrZit6NXNORUt6ZXhuRUErSQp3RlZ2WGVOWlZML1BiTGd3LzdZSDlBQTNuUDJkZmJ4YU1kS2gyVW4zUzQxMXFXMTdhR0R2WEJqQjBXditKTmd5N01mWVArVnNNMG9DCjQ2RHhwZGFoczMzWURPTExkNzZFRHRQdkkxTm8yOXpuMVBmdTcvUDNoU1hVdHlYZmRiYUEvelhNVCt1WCtTZWJpYXlSK1dNMStzM0cKN2tmTTFoTzJvUkJkeGhUajQ5ZGY4MEFJTGdES1RmVVBZTjM5YW5NQ25rU0h3WXRnWTA3K0tqaDgyUWpJc0o3YzhnY0FhNHJ4TFkweAp2T25UWTNRaGM4REc5SGgwWUdvNURoQVBzK3RSeDdZamJnNGV4bTlld1hsMXh0TThtTEtUWGJ3NnJGV1Z1UTNQZXl6STJXYmdER3ljCmNjVWx4dU12eDQxSE9sV0FyWnUya3VlMlpCcTB6TlgzY3FvUzA4K3B0REEyRHpDRFk4RW40OHc5NzcxekdOdGEzMzd6NTMxZTZBUFMKdTZiMDUxRk14ZGJxTDRQUm1EQjZXbGdqNVczci9nUldxejR2ZHV2TVBmYlhKNlFXbmkxKzY5ci8rdms0cmUxcGdEQ2FQQVV2QUJwawpiQ3ZHRVJobjgzTm9WWGVMeHNldkNFSDhYNHhsZVdiODhsdCsvUWtnS2I1bkJYbWlYOFA4ekI3bXdXdWpjYVRmTU9ZUnhuai9VWFpaCnVzZlpqS1lETm83d3VQQ3AvT1lKK082d0VWb002dXlTK0t2Tk9SZWZCRWtZTXNhOGp6ZXNaaHViUHhaOGJUNHhTYTFHekVJbE52MVkKVmVUM3JQTDFCTTUzeFQ0akdoTFgzSjhWdTk3RWlOajhxYkFOaDQwbHZwK1AxN1Nlc1ROR1ZLNUlQWHBxZW53SVMyMnhxZWJjTDc5Lwo3dGo3Z24vOURXdjlqVnZ6TVhyOXE3amxvNGNaczhwUFlVWnJKcG5yRTNlSHpXTmtMSG4ra1Z1dXQyeXFiU2x2SlNlUlg4T2N3azFnCnRiMk1wTHZLT0hRZldQd2JiZ1lCS2ovK0VPWmNZdHVSWXR2Wi9HTk43OExYRTRneks1TEllSnpQZnBqczlWNUx2RkRObjJFQmd6S0YKZVNUOVhoRml6a2FOUlYrUDZ4OUV4ZmFZNjlyNlY1dkRKMmppSmRyWTloQ3A3K1hEMXNyK3RSYnpHOHg1blRQcnNTMGJHK2drMGd4agppZy9XbzZSL0MyT2dqeHUvVld1TGcyclErWHIrY1dHZ2J6emorckZmd3h4dUdLdWlaUHVZWDFaTTVuT0ZjV3lmc1V3UFhEQzNlQklzCkU3Y3hMbUZsVGE2d1BUR1FrTXo3NDIrZmxrZStpYTQyc1lDaDkvQ3J6ZWxKSHRXSEozNFlTN0ZuUmVLSmpSNDB3TGZ0OXF5bWNVSTYKYnRJUzRzTlllNDhmKzFqU2Yvdk5NN2g5dnZnNStORXh3SEM5ZHp3NUcvTzR2TFBmSGg5c0JZN0wxaGJ6ZTdncDJIL0ZvUE5IUEw0eAp0eU9adHNjNFJoaWY0NGUrVHYrOCtuUXFOUkd1dUs1b2R5TnppMitOMkM5TjhaT1VjZG02YjRHUDhKdUg5ZStoajBiekJYOThnZlpHCjBPOWlMMGNuOENRL2hmbXA0M29ZUHNLb05ZeHkrTDRjTmk0dmlZYjErZkt5ZUFOeUV6U0N3N2E5WjFJeFpVdzlKaEIrS3ZFQ2svUW0KTXhhQk5xNjhEMURpQVBtSjUwNmN3WSsvZlY3bkN5QSswUzl3S2VjTHVONXJyV0cvdnV6LzZtL2Y5blhjZi9IeGcvLzlmNkFmZ2llNAovQVRwcVB4cU0yTWtOc3Y1WEJoK2l1OStEQk5zNFJhL09CNnZ1OUVldWxhL2NzUjdhZE0wVXR5a3NjSklKaFYvS2NXeWNMSi9RYnlECm5uUUFYdW5KSHdJYlBNaEl1SitNTlc3eVhBcXY2SzE0dFBZaG1pVU93RmZGUm9TRS9aanJPWVB6SlgxNGFIRW5XdzczWWE0bkJxUDgKSkwrcDlrdDgxejErRHF2SlpRelBGWlRPMzN3NnNUdFYxL3FTUGFiU3VIek1qdzh0NzkvM2htbFB4YS9CN0ZrZU40ZldhdlFIZ0JtUwpMVUlzUThRLzdUKzBMS3M3cm1WanhNU2VHbGZQNXVNeWdtd1J1N01wbDNZSE52QW5tL3Z4bjNLT084QndudzVCTWY0bkk1c094WEZqCm1UTGtUc3Y0NGR2NldwTlgzOU5YbzZPMnZUdkRVSDRBK3ZweFVpc21BNzVNY2N6WVhjVE4rUGxZVVFONEdWZkZodHArVzNNY2dDdEMKais5eFRoOXJtSFZ0R0VjbHprbmZ3SGoyK2RkNFYrWlNGQVN0SWVIdzdjRkwrL2Y3dFh6OHJOSERjUHBPalRTbmphM0h3MmE4VUFkbwplOGdmNnM0dTQxbysxK0xRR1VoSkk4V1lXTUpabWVnc0VZZGx1RURHUEZNOGdPR0p0d3FPcnhONHdpdEF4OXhTWXJUSGZLd2JXLytrCjFVOURMWmxLeGMrZ3lBa0NRNzV1WDMrVnVDOVZuZjg4TmloSUFVNVRibkd1Y0VYOFF5M09kWnpIRFZ6TW5INWVYZE14anByaWpXOTEKeGxrOS9VbVhNUTdBVm1lK3J1bTVsQTJSNHoyeUl6ZEpieDZmWHMxOFhRR2ZzUTZicnhlK1o0M0UwKzNpUER3cUxEdXprTXIrcFlqcgpUaEQvWW5BaWNROUdFRnppVko4d3hWZUlTZDhmNFRDNU4zd3l4NFRHQ2Z1TlAzRlllcHlBaGRsUDNyRHVlU0E4eXc5ckhmc3I4ZzM0Clk4ZTBaem5VV0dIdlgrTXI2SzBYYjNzQzdsdzRlTXZWWTJJdXBlOERuQmhjckRySFdSTVp6Z3NqSnJWOUExTHlYUjJhQVgydTAyTWUKZXNpbEo4SVZjdnJIRUxIVkg1eEdZclNUV1BHdytabnBxSWlzeDB6UWNuRjhpQTN0NG8wamtSTkd0SnlJRXl0ZVlZeXFySnVudmVvNQorc05jZWpoTzRTdU84aWZka2VLNWwrTURYWGhqd3h4ZjEyQy90ZmhtS0xxaGtSQXgvNWFtVGRLQlp6eFpMRWgxZ0x5RDgwQnZhdHdICjRLbUhCeDNCWDlBQjkvRFFQbFk1K3dEaE8yQ0k3RzI3amdNZ2MyMDk4dHhtemlQMjBWSTlqdVp2KzUrRXV2ckYwZlNOUTZTMXg0N1MKdy9qRTlORkxPQkFmWmc3bEh2ODFKckt0eTlxdjR6ckdKKzc1TTN3QXRFR2Y4ZWFSOHZhVHpXY0VqVFV2eElNbEZnUGtVOGxJRXBzbgpDM1lvMEFIR2RpSStwb2djQjlnZmVzU1MwTW5RVXdpQXFSRkx3Z0hLZnFFMXJtUFRGZ3VYK002Nm1VSWVKMHJlKzNPNXBQMzdpbTE1CjZSNFVGRHpyVTExdy9JQ3pYeHkwTTZ3eFVueDhXbjd1NkNMZFl1RkNud3JHRGE5U0FGQm4yMVZsWm1PTUlLd3pDLzl3UFRNTzhPekoKVllNcWRpOWxSNEdxWGE3dUZKWEgyaWNlR0ZDdjhTTEVZTjNWZTZxRzEremR0eDlaKzdQMlVjTzUwT3BSTmhMci9FdDZCL0E3MitGYwpaZXpkQ1dDTGp6L3ZreW85bmxlTXk5MWtQRCtESEtmRmhoYTZWNGlBN3VQbUZ0UEZxaHdYZTFPSGFXN0xrVUxHbUxCdnB3Zm0wajIzCnNsdk5UemFIM3oyMVhJQVJoT1BoUmNLSHQ5bHRqRWtmdzBmeE5BSnozdDlvejluYlB2dkQ1UkFJSXpwaHJIQXh0VkNWdWZad01MencKak5LaTk1c0JldWJhazN0NHpwMkl1bmkyOWpyWStpL2M2VjZWaWUxWjVWa2U4Q00yakFPTVdJM0dSQTR1K2Q1MkpFM1BhTnkraC91NQo5MDg3YkFqZlh1NEZhKzduL2tBMW52VUh6YzlqS0NnUk1rRnZ6QkYrVjNPMjhjTTQrZ2x0K0t4Y1Z1YlpjZFo5Z0RialN5Z2Erc2oyCm0vdWo4YkJ4d216K05tSi9FcmM5dHpXUHlSQkE5cGdnbVdpRkVWVGZ4eTlNVEdQTmlRRVA2dUc0d0h4bVFyeTBQOWxjOGhPclZTeW0Kdy96c1lFN3ZXbTAxbjd3TzhXZ04yWEE2TVVhc0h1Tko2MmoyR1c2cElyMTlSMzA4cFA1T1lkcDZ1NmtSR1g5bThvWHBVb3VwOFR3aAp1K21rd2JjZUgwek16czNOVlR6NE55OVZBSUhmdHpEbVp4anovc0sxMUFTMTd3blhONVY5QjgrSE1HUFhlV0ljTTg3ejJkUHlUSEZHCllHK2YyNmxmZVhaQXg3RHREeU1BaWc1cFd2TEJlUXN3YzZUQlpQYmNTU1IrZklQaDhLQzliTjNSdlNlOGVZTEY0dz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJdUI5UElRSmJRK2hoMzM0Tnh1RHg1NUNkSkh0WDdEVVdRL0ZVYnNUbXNTTlFqZ3JVZHNVUGxpTjUwU1hBeHNqT1YxTmcrV001NnliVwphZ1MwN3pUL3J2dWlZbndIZUQ5dkI5ZnBPR3hiOTFRdzlhSVEwYi9kNjVUMi9vOUZMZmh0amZuc2JyeUhNRHdnR2JzanNYWU45VmkyCmN6alZhTnViOXIwcFdtVDVvRSs0T1FsQnB4OWoveDNWSVJCWXhxZEZzREdWRmNZMFkrVkdUeTBDY3ZQWmQzcHB2QVdyY2p2TlZCajgKN285SDlNRDhDbGVQcTBjWlc4cWZyd3NBOXUwNjdWaEpQUU91b3hhL1U3eDA3a1dHbzEwSTltK1p3RmxuSW80YVg4WU95ajlxa1BpYQpjcGlXeU8vWXFzeHhZZWQrbDdVWGxIWnliSXdCM3owVFphMGVnYVlXdDc5amp1WjhSVHdWR2J0ajJjQzlacDhBRUxKN2Vvc29QUkcrCjRmNVovRU1lYkd6WVl1SEVCdUF4T2JHM3ZIZmZBWXltbTFxc0x2TFB4MHFpM0Q3U2JCcEdQb3lNWHR1ZlV2UUFMZE42eExDSUs5Y0IKMEY0Z1hoZjY4RExXczU1VHhoOHQ5cmJNNm1PSkdQdlhLOXdWVThXSE1hMklBRVdTb1h5ODdqdHNUKzlZQjhCWHRGZHpVdzU4S1hJVgpkQUpacnhBeVdjOStnMklZNFA1N1JWb2o1MFVKNXZGSGJhekhHMjFuOTdiMnp6OG52M2FrV21VcXFTaVNmOGpnMm9yRHhzM3VFRDJzCmZkd1B6Mk03RFR2RmZQei94eTR0K3JLUGU2RWZhZXUrWXNBY3JVU0t1NjBZYjJPaHo3NkFFUkk1TDFaV2FrWFdPRmY0WXR2cDhPQlMKM0wzTXYxL1BBYzRhYWorWExOMmMzeXl0Zk5GUDU0bnh1WTRucmlEZEFTK0hrR0RjOFI5R0VuVFU0Mk1PYUpQaUFCeldYODRZT3Y3RQp1cWdVWi80VGN2ZzdZcHpxM2o4UyttN3I0VzFQeWp2dVMySkhLTnYydC9WZ3RvbmZ6d3BWb012ZEUyL1JJMmVTc3ExSXp1UWMzbWhlClhDTyt2b3g4Ui9LTDE3QXc3dFg4Y1lQUW4zUkZSS0dYV00xL21NdStMWFhya3ZLU1BNN20wTVNGbnN5OU9XUnNPdzFFYlVVSTVVYUoKUVkvaHRKOXNQbTRPeTNYQ2ZBSkp1WjF0VnppRFQ1UFVBai9uaSt0YXkzakwwbXc4amxLZWV3SEJsbFo4T3pJKzRkQWZ6YWw1SHUweQpaZ3dRSi9aUDg3ak5YNDBmRC9wZmVOc1dHWUZsalJyYlVLVklFL1FTUnJiVDFaYW9Zb3ZmWWxkVVhTM2NJQmtqYnNvK05TTU9zRU9CClIvbVd4M1pBaG54akdQc1ZzaXJkZWtkMG00Nmg4NFFqY3Q5KzRjbFU1SHVlS1UrSm81WTlTN2tkZ013blpzWEE0MDgyaC9CaDdLZzgKRy9SVW41anl6dG1kOVh5dU1TV3dCWEI0S3pVcFVZNmZ5aUUxWkVCRFc0WUdjbHdyYkpqM29pSWxUUjh3bnNCaGt5NkFYWU4zc21WRgpoamkzVzhNY0F0R0szNDJiK1AreDk3WHRiZHpHb3VmemZSNzlCL2EyYnB3bXBCZFlBTHNiSjIwc3lYYWR5ckZyNWNVOWJhcERrU3ViCk1VV3FKT1hFK2VQMzQ3a3pBd3dBdmk5bFN5SnA5c1VpaDhBQU13QUdnNW5Cd01WNFNHVTl5QTVyeGlRb0gzV0Vvc2N4VVpIRjJpSlYKTHJaVDJjY2xuWkR6ODFCRlpqc241L0VWbVpTM2VwbzVDTVJuQWgzS2hBV2ZsRDZPSTdNTzlDTUh6aFJIcUJvWDZDTFJsTWhIZWVVOApCUkpQeDF3L1k3c2NQdDBvZUxwUUxua0g5R0plT1pNVUFuM2tBRVhGV2dUQ1Iwc0V3eDRBcFdMaklybkI2amJhMUZ0SWhYZnR5Y1JtClhROHM1TmhVSmJKSm9aaFlvNVVGdXBnVGZDYlFtemhTTHpkRWlCak03TE1rRmtpaGFCWm9NZ2JxbkoxcjVOZndrWDNldWNaR1BIcUUKbEtNTEtiV01CZEliaTJGcVdRU1pmZi9hclRwN0doUE9VZWZZYVBWSWtVVnVZM3AxeVllRmVzcG9OK05vMHl6M3prempnaE9OalZOMAprOVk2cU9oVnk4eUoxQ0xqdVlSbGplRTRlcmRoUmpHc3h2dVRoWWtGZFNwQ3ZHcnVLQXVCNUZTV3lSWE95dzFBZXFMWmtoQWp3QVhCCnM5bnVnOEk5VGVFa2o0Y1Y3T0tqc0d5dW4yamVyNVQwbldXL0c0WWhXaE9EMFA3NGpJOWY4ekZKdUhnZnl4bkZiZ1NCd29mRk9zY2sKNFpPZ0diTUx4S2gwd05SSkRtZm9aTHpCSFVablprYkE0ZFBzVEVKZzdqY2dIMWlySXc5VllzKysrTTZKYngvV3RXMGZYN3VRdkZ1aQo4ZExXVjk1UmpmY1NiQndOdm5YcHdob1FhQmdyekh3NXhWazhmZk5oTjVXK01jRGx4WnppMEdDWVVTS2FuWXlBM2x0eGE1OE45ZlNHCnJRL1F3ZGRlR0J5V1E2cFVBUE0raWo1ZTYyY1NvSDhIRjZxd1J6aDhwOTQ1YS9FeFNNb0U0c29heGt1dk5GcWdOOEJ6aUQvQ0ZKK3IKM1B1d0RxMzNnN0NqUzZUV05PdGtuWnNJcWUyTGxmWVo3MWY4T3E5VFNtMVJhZk5jV1ozT0JVMUxlc1dROTBXT0twWTJ1TkFpZFpHVgpJdlp6K2ttUFQwejZRemdmb1FWS2NGYUoyWDJLUlROdnN5eHNGQWdDdGRjdGZFQzZqRHdvaVJ0dllSVm0yL3ZNS2tjaXNZNWNOMTBFCno2SWtzck56L0NXKzVaSDdaWkM0VzBTRnRSdTZrZVoxUVBIZU9WOUFLUXpIYzhFMFk2VUw5NXAvY0ZtdlNyRjVKSEZQUjduZFJuSnMKS3MxZVMxWWMyK29Wamx6N0tGaS9nMUVRVWQyRnJ1WFI1bUdyNTlZNzRCYUg1S0tzeDZIV2FsV2JKSThGdHpZQkFia2luRERVcmlnSgpDamQ5N0RZeDc3WkVjQUNoZmRuZHhNcDlzQ3Z1OTRhdlc4Z3NrTW9HYWdRTDlyOUk3YTltQkpkZnFxeHFnbGk5QjEvNWUwWDRzQXlqCjlYSDRXYlFoc2M2WlpKR3pqTjdIc1FqUXBzUENyQWozdzlDMHg5SFFIUEdReE1ZVjRaejFpRUJ5VUIvczNLbnZtSDErMHdzZDExdk4KeDAwaG1kM1NCR1U2Qy9YcHdVWGJBY054TzhSRzZUYWF0SmczdUc3R1NDOXlaS3FpS1ZNNEJCUXp5SmNjS0FHY2JjNmY0bkFxdTdPMAo4YzRLQkdxdmlBamg1N2V6c2hucmplRUpydDB4MEZnaDY0QStSTm80cDN0UzJIZDRDYWo4aFNrRU8rK1VzU1kzQjVRY2o4MHEvYXpiCkYyN2xLaVpCUzA5WFhyRDZIMkV0Y3U0QjN3L0RrcWxoWU02bkxSUW9obnRBandOWklNY2FHL3NNa0FVYWQydzJWZ2d4QXZLbldMRE8KM1BnS3diWmhaNG16UlRsWXlkaGJVN1lnV3hxTjlSc2V1UHJrc1NRd1Nnekd5dTV5ekNpWm1nRE8rWGpKZDUwQVNJRzh5dCtUc0VDVApGVzQ1cE9IeUVOcFU4b3g1YXhnQmgwWVpLK0FkMXN6ZnMvRDNFbEhZRytZWTM2MmhmWWxQMkh4RXArZkFEZk9yQ0pzVis4S01EY2x3Cm14VnJuc3JaTUxGNjdxZDk2alYxTkhaeCsvVE1tZHMvL1UwSXIzU2hHNGVCdEJueFhpdWRwZzdkY3Q1QWZBZzdaeDAxMVlwM2NPbWMKMGlZNmc1QmlrUHZCTFZnem9CeWxLcjZMc2VBK2xPU3JqdVF2dFVBT2hhRFhibGx0eTNtdzBpd29YWEFBWVFLODBtWVM3aE41c3B6YQphdGdZa3JENFJLZ3pXMmovbG8xVmtpVVB0MDBrTTZaUUc3c1pXS0RSR2ZkS2E1NFlicGJZTGpnN01LcjV6a0dFWGNnWnFFSVBOQjhPCjUxK1hZeFhSK0VBeVBGTW8xc2hGNms5TGlXZGhjT2NKcDdNcmUwdWdZSUtENHpHNmhrZE9UT2F0YyttSTNGOVE5QmM3SFRnVGZuNHIKUHB3RmtlWk1PaUlmVy9nY3VJZmdqT1ZrbGl0dWl3M2Z4bDdENUpiNGdpNnBraTFHSUpnSlh1L0w3ZHV3YnJkd0N6eW5KeE1kVWhOMQp3Ri9zby90S1J3NmNKaXdvS1pDVzBYcUpsdVRjRm5zRWpGV2dHRy9xVDR3eTk1ZmtWRmhoeXQ5OVU4YmZ2UEZlZUJHMGllaHlZdTZ0CmxzWjdzTEZiWHFnSDh3MGlVTXhGVnNnQWFEU1BMYXVwTSs3Wk9iQ0xJRGIybnR0NFdXTXRQUmFZdXhCb1krMmNiRThRZmd2aElEV1IKMitnY08rT1Vab09FczZXNjYxNWNuM0wvaDBWcWdieFRPS3NWQS8ya1Q5bXZobWFLY0QrVGRlcWk0YStHRmU3YUJGbytKTjhPTFRnQwpHODBrTEdRVGR6aEdJNHZNK2FxS2xteGtrZjQybnZSSENnQUxMN3pEdVE3QlJlYVhqTC9qelRKU0ZuYXJSSmdMUXpPUmpZVEFPZ2JQCkxEdXpaRUF3VnBhN2xlWGFuNW10OUpUQ3FpUmpITVRIRlhsSGtKcERWUW1hOHc2ZVNHOXRDOWZpNmJLZ0JXWUpLMTFTMm10ZUFHUjMKWVh6UlVlSWpodHdhNytzU1BibWVYenBueTZCSWVhTVEzak9HQnNQQzMrZDFZWWI0ckxTL3V3NHJLbk5BY3R3NEVyd0RJWTF1YUJYdQpEQXZBUEdmMWpQWTNMcGt3MEhzWHNhenhWNTU0enFUK1pJWjNZKzNxd2pjaEN6WWVKWkVabEk0amRzbzd1NTd5c1VQYTV6REFoOXo1CmJsYnVUNVpvbk0zODN1RUhCaDl5bHJ3dnBnVmpEVWZMeE4zNGxtamY4SHNFcmhoR1MrWWVaVy9lZXdlSzltdE9Xd1d4VG1icklLUlQKTGRqdWJkd2xMTHlSbndack9vVkcyT1lTdzZaNzZXK0lzZjBOamZ4K0VFTkFnRVM3VzhSRU8yUFE3dWN2ZithR2ZTSjhZMWpiZ0NQMgpLR2gvWTVFamdoQm9XSFJ6akw3RVFBYkRVd05uTHlNb25LVnFyQWVGUDVOd3BBbTZhaFJQWkZXd2xvM2VIczFya1I0VnQ4QndTWTdOCnhua3NqaEsyYVdHNkJwMTZpWjV3MlZUd0ZVYStaVGMvM3dNN1lMUS9SOHFjNzVGcGVvaVR5MFdUMEZmV25IK0JacjUzZGlVOGpUT1YKTWxIc2V0QStRUWMveG03SHhYdUt3bG5lWlhCWVVKK0RET0tjQWVqYmN6R3FtQmRDYzFxSmNNL1NuVzNucHBvd3prS2tmV0FnT2gxegpuNGNnRVp4cmdyWEFlRlR3eFhxdGZWOVRMbHV3R2t3M2QyMUJ0dnk1WkFOY1h4dSsvbGs0YXhRaVZTb2VBd3MwN2s2UXRpZEdSaEN1ClZYTllUaHFPYWJyaHRBU3NML2dlTG1rc3ZyN3pxbWtNOEdGWE1Qa1ZDT2p1VXdDTVVrTW92aGp1UGNrcDAwOWI0SkVEODdrY0pZYkgKQ2dzZ1k2QU51MFd2dGVadVNSMDg1TnJuUzZBWUFVYkxKMVh0cjFjQ01OTktNVEJMUGRCMWxwUis3emYzYzlCcFA0alRlQWE0S1l3RgppMEt4ZU9mcGl1NTQ3Zk1jT0w1STlwQWJObFZqTUlGa2ZZVGN6Tjd0SCs0UDI3V0tSWFBKbmRlS2d4RVNrekhReHlSUjNBSFhWKzVHCklyK2RiSUZ1TDhVK0dXWnFHdWFLOUs0RjkrcTdBL29iek01RU8rdkN2d1ZuT1NlWFlUOGhCa240MVdhY1RvdWhIMTZJMHJwbEJPR0kKeHZHaStFQzE1T1dldW1nMURCTGg1VXAzcmpoMGhHOWphT3NyY3ZVRmI4VSt6aWIxT29xMmxsTkdRRWNIVzFaN0JHSFQ0bHRWc3k2SAp1N0x1YUlHN1F5NTlVQXp0ZHVOTEhpK2Q4eW1DWFVHcGlzNWNwTUZidk1ydlpYaGU1ZXFxOE9mRGxIRVdMbjdIYnZ4Y20wM3k3c0JqCmdXem8xdmFoYVF1a3kyQ09yTUo0QlBSeXRwT0RCUmVWL3BLL3RwNC9Lc2pYd3BYM3BXRUlWUkRaN2hvZ0FqUFd3S1h6cGFYYVBtZHUKRVlTSUZPMVZsMmdRdFhYbVdtQWlHQ3NsUkhWck1OU1hJZWNRWDhKREJCbXJqMlM4WUREYjhJTktoQmdNVDI0T2NNQVlNSmM0UnR0bgp0VDI1eWllb2NOWTFCRW8rekxMMmhWajVXT0FOSGRnK0wwUDdxcUhqQ3lkd1VPNE1oZUZxR2VzTU1tSHRGY0ZlOGFFSXB5TUgxczYxCnJuMHdiR3E4ZVJFWngwRjRmUCtCUm9NSEVTM1VmbTVrZkZjaGpTTS82R2FGQmRKdEtHWk02b0JCZmZSbkU0UTZodzJnVFZ3Z0lzYWcKZXNXQnc5am1aNUF3UEk4eTNqZlFzczl5RC9iRm5JRWVRZUhQN1FET0ZmY3JrM3hvU3d0TzU2VHhxR2haVTNoUGJUamlBekQzaHp2cAo0eHNMNnd0MlN6SHpzWlFoSFFOTEtEeUsrbk9CaUNJc3M1eVhRdWJTZmlBQ3IvMFo1N0ZBWU1vSDdOeTc1MVRpVFZzaHA1WUtsNjl4Cjl0aHBPRCtoaE00SzFuVmRwRFpkNEdmYm1NZzFJK0RBRTJObERTTmdLV21zRk9leTNxeUVscVIvN00xRVVhY3cyVVR6dEpmT2VJSFoKQmdyMjFKS0gzRFltZkxTejl2ZTM4VUs5NWdPZU1vYXYzcy9NVTVGRzlza2s4U0hNS3RWZXNiZUdLWXhMVnB6anp0OXhSS2czbExCYgptNHI2ODRKTFVVVEpwN080Sll0QVJjbFVjdWxqb0lPeldtYzJya21GNkJzVEJSQUJtT05NUXNZcHhPb1RRSkd0eUFMWmRVdG5tOXdqClVJblhvS1JrQkR6bmpMMEtVS2U0ZE9sOHN0cWFnQzBDN1NOd3RZM0lPM0pndmlha3ZmVmJhVGEyaEF4ekNvZFordz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJNHhYTGI0VlRUZmw5eVlTeVh0U2prdktESzZ1OGM0UXNqWFVic1MrOGNRK2RJeGFvbkhLTWRtYjI5S25NTG0wM2E1VXJLbjNNQXp2MwpWZWFqeTdTMW8zUDlZUEpMM0kxMVJPQ042aXBKR0t2eGxramFqUmxCSmpsVlZPb1ViT1hDOGxWc25sUzV2MTZnYmRBQ0krRHJnZHE2ClhQamFBbnNGM1pIZG91Q0R1clkzV3kxUTVrSFdpM0FkUXBvZ2tyU3pJNm5jK3lhMERWRjNRTzltNDZ0MUNtV3FGd2dwWDFoVGhRMkEKY3R4MUlUeXFpSncrSnMwWmcwNjl3eUcxOFFrS1hWK1M5UnMrZkdDNmRpbjk2WmNka3pxSlVzQzVHenA0K0dHaG1EclJBY0RDRzFISQpZWHZncW1mZXI1bmtWaUFBa0ROQ09JbGlnZXdZMWRhV3p3aGtFYlpYd2JkYWd0NlRPWE1nQUhQRG94RHVmbUJacGtvSEFncldPL24rCmxvNlBkR1RwNStxNW5reG9xTVBWVTdyOTUyQWg4eUdwYXJhKzhMbWtjQnUyR3o0bDNPY3pyY3VWQjdEUWZlMTduM3FzMmtaWUlWRFoKNkRNcmQ0eFBjY1hDSDg5amZNa1Y4eGFiekNzY2ZCMHF6RmN0RmRlWFB1eFArS3RxbUF0TDhtQlRrSjhGY3U4TjV5UFRYbUNReW00cgpHNS8yUmR0SW1pTUhscEkzVUhkdXdJeG1pYzlJNXBSK0JFcldwRlVZVXVQRnNmYVplYlNKNW85MFNoQ1d6SVNiS0ltUG0wU3dZSjFQCjV0WUJnNWZKQkV2TjFLVzEwb1p2MHVNNVBhclBWKzIwdlczQWROSDFHTmJqY29laEVJWjc0QzZwWWJDTVR5eVhzLzFDWjlGSlVSVCsKVnA3TGoySkw4NDI0M01iMnVMS09Cem1lRi9pa21QTjFYZ1Jyemh2SmpuMmQrN0IzWktLMUZ1RmR2OEx2YU40d28xR1J5L2lvNkt6QgpKdkZpeU9XZnNzQ2N4U09wZ1ZRZmJ6RjZrVWNYNzQ4Y09KdytpUGQxdWtmSjdsRE52akVqdkJQTW5WMHNXc0hCTTdyaEwzRUdzNHd6CkpDUE03NGJLYjVKR2VGMUgrL1JRQmswbG5HK1M4MndZNFNNWXRKVjhqQ0FzVGZLSFc2S2t0ZXJhS2VPc05VYmF5NWRPNHRpNVpWTHIKV2JZTU5LeVpFWmpYcHQwT1Rlb3ZQbXViamF4dXI5eEtOa0dDdXNCTUNUZHh0UlVUUnc2Y3kzeGl2aGh0WTAwY1pRbGZVaGFLWjJ4MApxZHhFcDMxSzcxdW51OXVaNEFYcW9ueE1jTmRwdTh4cy9aQmhGMXZWWERRWEV4WUV2SlB1VFJBVXNzRDFNejhHOW9pRVY5cUQzOWdkCkdoQ1lDWC91WVhNTFhYL1A0elhBbC8yRkMyclEzdmxoQ3NwUzZHYTc0TGJZZGE5dHVnbEdtOHZDSDZCenpubVFSRVorVHErRWFSTzAKOFhZTmUwYktaSlNKa1NKV0NDK21idkNtUUZZK01NMkRadXNTQjR3QU1DUWJwY1hMQ0RJdlkwbFMySTZsTmlUYmtwRVduRlBDeXowWApRNWNwbTREYnpUaGVjVkNTZzI1MGRLY2NTa3QvK0JMYUpTRlJVVXBrWjU3S1VPVk8vVEdQRTNBb20rVEVpZFBDVGRtTVpLUGt5V1ZOCjE1bTJkeGpkZ05uOUtBUFJ6WjJsK0J5TEZrOEFpdXVuVms5Qm9HWlhxbklPL2N3RUJuZ0RYMmFpaEsycDA2S3pMSElyQ1plMUtzdDgKWWhSdGc0SXNnaXlLWUVoZHh0Y3M5eWx4dFUzMFo0RjhGZFVkWlN5Q1BOcm5OQWV5Wm5sa05jdGRMQkVCL2VHVGsySHdpYVZRSWJFTQpweFF4L3VvTUF2M0IxU2U4eU5tSGlTY0xsazFRTkZpR09JWXlLNkpvQk1xelpJRmFlMCtadit5RW1XRWttMmdwbTJMSWJPTXo1cnA0ClF3UjZ0ZHhaY3pPMEh2aTAwNFl2MldJYW5jemJocHdYRllBcVJMYTRTNXM1SHQ1OWVzU1FyeWZ4dVV1MFRlVmhnWm5rSUNCUldQRUUKd09DbUNxb09ndjJ4anpYdFBMSFhhQzFXbDNNRGdWNWtCTmJtd2tjZEI4TU1wUkZpTGtwM1ZzaEZISnRUOERrSXdkNmFXTGd6VXg0dQp3bW1iaHF4T09Zc1NyK21RRXNBSVFrTEozSXJZWFBpNFJEdzE1dHlCTkFuV3ZUeDBJSUJaelVDa0tXc1UybDNkeFpKZUxaTSt2UStWCjVXVkFKMnZYMmNJYmxKMUZHMU14OGRLa2JkcldsLzd5cnJaSE9nZFVYckYwbHhrcGxSTjNsT09yRVNpOVBvRm5sU01IOXJ1QmRyZHMKRWViRkk0c21BSEllRWxSKzJOMmFvNEJXdnF6aHNsbkJDNG50d1FBTWpwSW9KWnVNWEIwc3MvTTAwcjRveFlNRmh2eWxSSXRGZ0ZZWgp2Nk1uWEoram9aMVRZYksrRDdSQmFPWXpWNGVXQk0vQjNOMGZBeUEvRWVEeVhuTjk2YlUvc2gwNm9KOXFMdmxkNnFORVlpbElZSi8xCm5KTUtwdDR2UEk3QXUyOXlIMHVjcHo0bFJGUldScm82WjNqQkFmREdWUm5OaThLa1hrK3pkNWNRcVRmc2NUSXRHaFJtUU1oN2hYd3gKcktjSVRocVorbXhpSVNJRmdHeUlOWGJ6WXdSaEsrS1luRnpGeHFQY09wc3dvWnBQOTA5UG4xc0V5c2R6NHc1bHpRdDViR1ppZDIrTwpoaWpXVVh6TUFlYXY4MWRUcEJKY256SWhxZGh5ZzhBUURPR2pWQkJCTURlNnpSVGJ5dmtjeXlsdXFBTitaQVdibVhMalUxR0YzUUN6CjdSVXNYM25ud3J4OFJ2aStzcEtSWjFIb1lwSTVkcG1RY05pTFRBeVU5bFlpbnlZb056NWJGRTZ1akRQTm9VR2VsUlFPZE1mc3R6NWsKcitBc21GRjRoTC9YbnhmK0htWXdNQ05RcC83TW5qQ0M2QkVGdzJweFFVK3orRGxyVjBjaHJBRkVXVXVaMVFhS2NLNElrUmhGR3FsRAp1Wk10Q0N5OFI4YWR3UUNZaDRBL3pWWllCQWMzaFkvSExKVDN1cU9OS01rOU9OTWNXc1ZpRHpVcDd6TFVMdmtReldudkFHTDloZVFYCnN5c2NibmkxT1EzRVlxVm9LTGJSR0VlRThkZXFYVVNvUld2c25VWVZXOU9KZGN4d3VzeHFnU0Q0T1RiTU82SEkyR3ppWWJUOXdtd0sKYkh0M3I5RlljT0N2ZFBtSDZQcUVkOHk0b05JaTg5ZjF0RFZXSHpnRVJaWk02QXFZbmNjYnJsMk9Uc3cySVRsckFCMUxiWDJYQmNXcApGVzUrNUQ2aGl1R2NRcHlWMFZJbzJDZzNMMlYvbW5LR0JYNkxoakxyV0lxZEU2L0lRbUt1M0R1ajZVNlJ6OE9ZUlp4U0lSY1FaMHFtCnkwS2M1SVB5aEFlMityektxWTAvUVF3NVh3dmttdzUwcWNXbjB4UjhjNVd2cDlteTdzMkJ6TDg0RStYa3hRdGdmSW1kOWdhZUJibFAKMmVXenlaTVE0T1JIV1NKNElvSVU1cWJjL1JZc3FUZ1RRT0ZqMFFzWFFPNEl0eFlGUkJDeVdXWitkcHB3b1paVFY1QVAxRi93VnpuWApWNFZQNE9RT3VXVHQ5d2thL2MwcG1qdDhiNGZNZUE3b2N6VFFWUW9MVEhOT29oVTg0cVErZXdRdUJvYzJBbjRveFVzdTdZTXMzWXpnCmRhLzlGWEM2cE9qa2hyK09xMTAwZlRILzdRcWZTNXoxMkVJMWZBSlpUaElCc0pBQ2k2NHJIRGpCVldTY0Y0WHZpaGNxem1mcER2UUkKZEJsZzNMTnRYazRhbndEVk9TUlFKQ3UrVWxpd25FWWxKRXhPUGg4Z1dETUZWZ2tycEw5eEdsSVRJVEF0L0pwaEpiSUlJYVdaVjhJSwoxRmo1cWgyY0U1UURxcHdUUmxORU9TTlF2RzdKdEdoaDRRWS8rNDBMWVUrbGJwbjVJUlRldmg1eXJTQ0N6TThCdTMvVDVzWEpta1RtCkpRU0FDNTlvMWFXcktVU2M1MVZuRFBUWk5LbFRYRDljZGN5ZERST0JCVjlMejl6UkZZRDhva2h1azEwd2duQi96eWtnQUl1U1VMa1kKcWdJOXJueTFOZHlKS1pJb01RM2QySEJsQmFmbzVFd1NtQWZjTUsvOVUxdEZlT1lxOTJrWXB0T0wvMlB2YkUvVURwM2lHaVN5d2czeQpmQWJZOElrbUJ1YXpnRjZaazlFTmJBNnZHTXVPUzIrcTFlT3prOHZnM09MNm5yNm9xQXJKS3p6T0NRSmM2bms2S2ZLVllweEdqakswCjFQSUZaT1VQb0J4NWt6VmNBalE4RmFjc0pCUnJBWFNBOWhja25VaWtvdjd1c2JzMGhEaDk3bXE2VWVZUkpEeWJwZFBsaEErMnhUdVAKR2RlZjZEN1RsZHBKUUFLTFRLTThZa1hCYm5GMmVDQlFlL3UxTXczSXlENUhPZEVQcHVwek5wbzg5UmZldFQzTjF2bXM1RjB6bkFpVwp3TjVqVlBnekdDZlFEdFpqQXZJWmxqYWpDSUdjYnN5N2dVUkFPczRCWk0yZnZ0OUwzSnllT21PZU05aUg2ZWFhVWFYQk51dkNSeENvCnh1SnkvQkV0dkdsUzhCbVhuN0h6MFQ3elQzalN2NmpHbmg4NjR2cUQ2N0lqcWpUZUlzT3pKQ1FlZENlT21mU0haOW9tN2xnc2VVY3YKOWZmSTNEVVpCRXAyNFpJZVVGOTh5V0xtSFltUWZvVURCOGFCbkpwbnhwV1FNMmU0RHVsZ0tkWGp1UWZQU0VVc295ZllDbmF4VCtNNAo4bSt3VGVTTzREZlkwb0szWE9tQ3BNZHlSMUNpZFFmVUxLYkkyblhBQ0xSUDJzSzN0RXg0R3BMdllNeEtYc0hQc2sya1B1Qm4yYlJYCk1WS2ZVQlBBSVJrWDU2ZENvRTlBUkM2S21YaTV3ZFRlR0ozWUhCRHNjM2R4Vm5vQyt1eE1ibnJPVDNNUVV2aWxMbUNjRVBpVUFESFEKNXpOZ1BXRzZYMGZoNWFLeHZHejhjQkZmR1VhdzVyeHVRWkhtQ0V6MG9mbnNWeG1JbUphckh4SW9zQjBvRFJkZFFyNy9HWG5oN01LYgp5dnQwN3NEK1lqMWZMcE9adjdxUk5WekVrc3lpYS9uQlhJSFZNMVpPcFl0N3dLYUt4QVBkdmFDcDlxUG5aOXlwT0xjaHMrSGxKZW5CCkNiK2NGTXJ5YXhiemt5R3l1eVAzQVpzSWpFdldaNzlUTTdOYlIvNXB6cEE2bFk3Ri9EUW5CemI0WFZWbTNpU1grU3VuOHpsWkdNNlYKeFR1NHpDUEZrNU41VEhlQTN5Y2lOWXdQc2tiNHQyUHp3ajgyNHRPZ0U5Z1hkdStTRUpCbk5SK0ZreXpLZEJFZUg1aHFMVHhoTzFIYwpkOE1uMTZVem5lK0dUMnFnWE5aT0JHWWgzWWd4ODdyQkRZYUUxM1NUYUVtRG1UOHArL2VXTXA5NHlyOEdONFUxdkFMRjkwZHc1WXZ3CjhpZm5PblZKc3Z6empab2xxUmFDVTM4WTVWOEZkamxCcC9HeUNFeHNXaVA3QTZwKzV3NmNwUDZwME55L1laZjdqSytjMUIweGUxSkMKdXRMNVBRN1puL2o1QXhFbmx1ZUhnS1k3eGoyV0RjbUdaSm53VzZ4Q2VEZVQyN2c1RFVBUkxJWjgzUnZUc0hDZ1dlS3lEU0lDeFc4bwpKb2tJdC9qVGNJT04zL1FVM2lRVll2dW0raFUyR1JPaXgvaE5XN3h6WDdEN2g1MXRWSlNOLzduMk1CL1BRUWxOZUl2SWZEUWxSNTRnCnNQQldlbmNVbTJxZlpYWnExN2RpNitJNVF3VjcwQ2djNzhpQjB4RGVKMU8rM3loOVVBajNkd290TjZkdDFLamQ2WXgvMnhkVHhiR0cKRVI2ZVFMRGdrNzcwcjM5TUkyRzVhYUlRQXUySk1UNjd0YlladFRucG5uZXhrU0ovTkJQRmtYL2pMbWliZEgyQW4vZ0tGOWpDeFExTQovNXNHejdUZ21HS0tjN2VvMDR5QkUzaDV6eXA4dm1wbjVqOTM0RlJ6bUFiN25URzRVZm43SjRYbTRFWmp2SldlRFZCWU5IaDkrYlhBCndsc0JkY2hyUE5VQjFrdVR5TjFDRjRiT0hUZzhSb3ZCcHh6L0VSNEpwY2pnbzlrNGp1Z3grYUoyOTlQYXl4L0hQczE3WUY0ajhPVGIKZnUvNW9OTWJkWHF2Nm5VTHBuZm40eC8ydnIzQVgwUmlmenIrNGZHalRoZlE3TjN6SDJ0ZjdOMTcrZlRvMjM2N3hJK0huZGFvMCs4MQpCKzhXL1hDL2R2Zlg4MjRQZnFwRHR3YWQwOHRST2Z5MDl2bmV2UWVEUVhPaVJPdDFwOXNlbEQzOFhkYnVQZW1Od20vNHoramRSWW0vCjNRVk41TTZudFh2Zjl6b3RBQjhEM3Q2cjhhSnZtOTFMVy9hWFRudjBlbkhoWHZPY3lrSlhYT25QMTVtaTEyWG4xZXRSWlpLNCtJM1QKMUQvOXVXeU45dnVYdlRiMGI3Ly9hMVVDejJpK1FkSFJzREtWWTNWdW5OUUhUMDRlZEM5ZU4wOUVWUm83YlNpNWhDWXNjK09rVkorSAo3eW9QenJ1MXBtUEp2SXpvK0pYL0x1N3V1b2pKMGVYZzlMSmI5bHBsVlZiWXFoVzV3ZTNjOU1EQ0VhOHFQYWZOWWZsb1VQN25FcGhRCmZicE8xTHB4Q21WVjhucVg1ODlhbytiYnNycWNqS3ZjT0dHOS92R29NMm90Mlk0RGZVTXEvVjJudXdLQlkzVnVuRUpjY2xXcEc1VEQKeTI3MWZaeUxWNUZBYzdvdUZuUjk5bTRVYmNybGR4WEZTZWp6QXZhdjhiaDBla3NXWUx4Rlk5a2JuMldkWGxWYStoZmxvRG5xRHlvVApGQ3JjT0ZYSC9jdEJxM3c4YUY2ODdyU3FEOVlLWTNXTGkrZWdmMzdSSDNaR0s2eWQ2K2dIYWNsVnUzRHZzRHlyM2Q4ZEFkZVBvdDBSCmNBYVZhM0lFVkxzajRBeENka2ZBV3hHVFo0TW1hUHZkYi91ZDRaWWRBaXRiV2piekRGaFppdXpPZ0xzejRPNE11QT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJT3dQdXpvQzdNK0RIZGdaVVczY0dYSUdpVFRrRHdzRm92M3hiZG85Zk45djlYN2JBUTFhWDIzSkFXb1dTclQwaVZkYTBoNlAyWWZtMgowOFFPcmFDS3hwVnVmSVJQdTVkTFJQMEgwRVZ2UlVjZ1k4dTJhUWlQbTVmRFlhZloyMTg2Yk91b1lGZGVTZTNxWXJHOTFvZnZkbldwCjJQNzFGZ2pwbjUwTnk5SHkyYlI1UW1BVndiWXBxLzhaamRibXJmc3VhcFlZWGRqcWQvdURMMzU1dmZTSUUyK3E3N3JWclkydTlJM1AKdHNvQko4UEx3Vm16VlI2M21xdFFOVmJweG9rYlhwU3RaNWRMNXQxT1FveEppQnYzRFZhZWdEQ1lsOTNtNE9HdkYvMWUyYXMrVHRNVgpiNTdLVllrODZQZUdvK1lWaUF3Vk4rbWtBc2MxK0U5Vkp2MVdtU3UvM2NiUlU2eEN5NW9mby9VS3BIendjL1MxcUNMUCs1M2U2R2dWCkE5UDEyQ3JMWTdkaWo1eU9zWG5hMFpXT3F6dnZ3MjE0SDdaVUUxcVJyRTA1TGwzQm5iSXVNcUh5YnZGbWlVNFVqUVVXdmZrNGpNcUUKTExHcHhJU29kZFk5MzZUVkNVblhtcERxZTh5YjI5aGlWcFphNjc1bk5nZWQwZXZ6Y2xUZHNiMUplMmUzTTNyZTdDdzdpMjNlNXJtTApTS2k0aFc3T09YcDFxL2ltak9mVGN2Q3FSRTV1bmtxMHF2elk0aUc1dm43c0FvOCtqSTRsZG9GSDZ4OTQ5SEZkUGpubzk3djdnN0w4CnJiTHJiWDBEckZhWWpPdHVHYTVNeU5iR1Y3VTczV1oxZi9BbUhYa3EyM00zNjZ4enZaRlY2enBHSkEwckVuSWJRbEUwS3FlRkdEVGIKbmN2cVd4Y1h2ejBWdVQrNGVOM3Y5bDlWRnVicmMyelpYdWwyL1hlWTFsWVVyTGxNcTM2TGFTZlRkakx0S3ZyM3RnVHlubGIyaG15SwpFRnZoQnVPYUM3SFZMZ0t0SXNWdWFjbHZhdmp1OXVZSXFMeTdiR2FPZ01wUnlic2NBZE1FM202T2dOUHFpcyttYkV6VjVmbTY3MHlWCngyWlRkcVpOenRxd0pOd21FZ0tyM2JtNHBjc1dLMHl1dFE5b09hMDhOanNodHI1anMrNUdnZ2VWWFVFSHI1dTlYdGs5THJ0bGF4VWoKMjNURkd5ZnlSV1UzMFZXSm5LNTRhOXZSWVdkNDBXMjJ5dk95TjNyYXZOaThQZW04Q2FncXU1TTM0cXhVNC8vV3BqNktzWTlWcWFaUAoxZFZ4TG43emdyS3lzV3RqTnJIcW9uL2RON0hWY21sdWdDWitnRGVrbjFZUUgrc285cXJmejl6RVRDbVZyU2tiSXdlcXI1NTFsd09WCngrWWE1TUM2ckw2emxZSzd6anJkN2lyQmE5M2JVRHFXcUFlUmZSWWZwYXB1bDdXbGIvN0dTbVd4RnlqenpYOUwvYTlJNFVTdFd6RFEKOWlyUHhHYXJkWGwrdVR4S0lpWXZxbkx6VnZYS3M3SmRQVW1UTFh2anRBeEtPbWhWSHFwMnV6UHF2RjFob0h5RjliM25kamJvbjFlWApoRlI0ZlQwNW8zNzFrMlQvRmdocGRuOXB2cXU4Z0VBMUdqVUhLNmxTdHZ3dDNHN3JsYzNLMTRWYXpXN3JhYi82bFkrb3dpMmRUSnE5Cnp2a0tFdnFhN3Foc2R2cTdlcjR0WVRPdFhkak11aDZGcWcvTnBwaEVkbUV6OHpidzJ3cWIyZmIzRmF0blU5c0Z6c3l5MDkxbTRFeHIKNndKblZwRG82NzQzN1FKbjFtaC9xcXlOYmtiZ3pBcVRhKzBEWjFwYkZ6aXpSVUpzRnppekM1elpCYzdzQW1ldUdEZ2pQcGJBbWRiVwpCYzZzSVByWGZSUGJCYzZzazlqYjZzQ1oxdFlGenF5d2V0WmREdHhtNE13bXVJZzJKL3huaGFGY2RWTGUwbEJ1Y0xMQ0ZRTFNkb094CnVYazlObWNzcnE4ZnQ5dUhyVWtaK2VESnlTR2xDanBaemI2MFpVR3MyNXN1NldieVJLL3I1ZHVQSVQzUFRyNVZrbTltSjk5MjhtMUQKNUZ2bHVicVRienY1OW5BQWdJOWJmU3VSQlR2cHRpSFNiYWU5N2FUYml0THRvMWJlZHRKdGs2VGJUbmZiU2JmSzBpMTJHNTJzNWh6ZgpNaUZYbWZnUDRvdmVLQy9oYmhHdHNJaXlqM2tSVlNaK3Q0aDJpeWkrNTUzVWRPVkFRRXYyaXhWaUFhTWFONjZPZlZ5dmJUM3YvRnAyCm4zZWI3MDVXdTQrNVpYSndVSjczbDZXTDJPV2t3WTdjVms2YWlrSmtsNUJtTVhtM21aQkdWSitUdTR3MHQ1aVJabHR6bnd3dk1QdEoKVmJyZUsvZkpEVlBXNmJYTHMwNXY2ZnZYOGFoZGxNM1I0UXJMTEtweDg1S2pKdTdMcENZMC9KdlU0UC8zNFRQOHZROC8xSzc5UHNxdApIRnRXVG1TekxxclV6UjRwYnpwZWRvVzMxamZsbHNBV1BwYTV5akI5cEJjR05zTnpzKzRYNEpjdGhNMTBzN1g2NXhmOUlXZ1R6eTZYCnlLL05rM1lyaVlZTmliTS80UEhhUExsUTJZajRab2w5S2hvTExIcno5cGJLaEN4eFhNV0VxTnZRdFNzVHNpUXNKeVlrWFd0Q3F1OHkKYjI1ams3bVNncmJ1TzJkejBCbTlQaTlIMWJXQlRkMUJ0eTRINVZYVWc0OXhLOTBjOThlVnB1dW1ET251RnVMTy83enpQeThpZEMzOAp6NnZsWE56NW4zZis1NTMvK2NPVHVmTS9VOUdkLzNubmYvN2dkTjNnMnhzNy8vT0hWemZSQXkyVCt5dXBuanVmODg3bi9MN0U3WHpPClZ6TTNyUEV3N1h6T2ErVUFhSGZPemk2SDVVRy9CNnBCci9yeW1hcDM0NVB1WGRudDluK3BTbWUzOCtyMUNINnZ0ekFKYVdVeUo2dmQKL1BaYldieGZEczVBS1Q1ZTdTR0FzVXJyNjZheXdubzEyc2JxM0RocGJuMXMyK1oxclNFRTZ6MUVXL3dzOGM0RXQrNG11RlcycjUwZApibzN0Y0x1WGlYZDJ1SjBkYm1lSHUrSng1LzZyUVZuMjdvTWFWdDRIaWp1dit2ZmZkdnJkY25SL1VMYnY5d2ZOM2pJLys4NUFkOU01CmJpcGJUTXN1ZkZuSlBCZlZ1UG10TEs5TVdQTzN6dm5sYU1tTGxySGc1L0szWnYwNTdKQlo0d2pWcmx1T25UbTB4NVFqcHdGdTNnSUEKeWJUdFZocXgxV2FhNFVYWkFvVjVzTHNTc2RiMmpCVW1vUnZRaDc5ZXdGbHJCYXZ2ZE1WYmlHUllsY3FWYmR2VEZYZkduSjB4WjJmTQoyUmx6ZHNhY25URm5aOHpaR1hNK0FIMW91ckhHSEdmWkladk96cGl6M21mWm5USG5mWXc1dDZGbmJWdGMwaHBacG83ZE9XbHpUVk5iCmViMTRPeE56YkxFUjZncWtiY29GMUExT3oxRTloOEl1UGNlNkViTG02VG1xRTdMbTZUbFdEYUZiKzcxenUxTnpkRHVqNTgzT01rdjQKNW0yZ04vTTJ6bTRMdlQ0NXQ5dEMxMDJwV2ZNdGRHc3lYRjFKK2Q5dG8rdXdqVzVkZHF0VjlZT1BjUXZkbkVDQWxhZnBwZ3puTHF2Vgo5bVcxK3JoU1B4Mi9icmI3djN6Yzd3NVZUbnExUzF5d0h0ckJUU1F1dUtVZFpiTXYrMWQrRHJSZCtUVmFLbnJqTTZ3NklVdTJoNWlRClgyK0JrUDdaMmJBYzRXd2FsTzJWVnN5bUNJTnR6Q1gvakVidG96b2pYSDJpYnNxZ1h1R3dzQzZEczlWbTdkMGhidnNPY1VJbGQ2ck8KMDE4NjdSV0N5RnpwbXpjenA5VXBlbDJ1RXBQbGk5Kzhjdkl4SHJXdkljWHlEZE5TRjdyeVZLeXU1OStHbXI4S0pkVVYvVjgzeS94aApkdWFQelRyeDdNd2YvZlZVay9OdE1YOVVKMlJuL3RpWlAzYm1qNTM1WTJmKytJakdaV2YrV0hQengwZDJzQjQxVjRqdjJrWVA5dG1nCjJSbzF1OS8yTzlWRDRHM2xpbVBNTGQxMHRHdWpjaWFaMCthd2ZEUW8vM05aOWxyVnRldUpXamR2MWFzY3o5dTdQSDhHWS94MmhhdlYKY1pVYnA2elhQeDUxUnEwbGh0WFl1SUNsdit0MFZ5QndyTTZOVTlpcWJNbmJsTE5FNi9vQzlOWjJiSGJKdERjby85SUtRbjZYcm1neAplYmVacm1pWHJXaUZnYnE5YkVVcmFGOW5nLzU1ZGVGQmhXK0JuTW92VkkzNjFUWGovaTJRc3NzalJadjhMby9VL0R4U3QySk5Xam1iCjByVllrcjY3SEp4ZWRrRkYyRmhUNHk0UHpBWmN2bHZoakxFaHB1QXIzRTdibVdFWFduZTJMZ3B0QllwMlVXZ3pxTHgxWTNuWUhFK1cKWEt6ZmdFaTA2cE54dmVQUXF0T3h0VkZvbzRwSzI2WTVNSkl0OTJCVURoWGFPVENtQ2J4ZEJ3WXV1V3QzWWR5U0tyczdBKzdPZ0d1MgpoSGFud0pYNnNUc0Y3azZCTjBqVFIzc0tyS3lmN2s2QmEwUEgxcDRDdHplUXJYSkdpYzA4QmxZbWIzY00zQjBEZDhmQTNURndLUzI3ClkrRHVHTGhWeDBDOWRjZkFGU2phSFFOblVIbnJ4OEFmKy8zMnEwR3p1bEJlMnpOZ1hXekxLWEFWU3JiMkhGajVPTEhMU2JFZVYwZHUKNW9yc0dnL1VwcnphdDlrWk5uWUpSaGNSc3N1d2NldFNZTTBsV3I5Q1pvM05rMmtmTEYvSVRWdTd1NkIvMTF2OWJuL3d4V20zMlhwegp2MlpCL1l0bXF6TjY5OFVLWnVQaDZGMjN1aG5jbGI3NW1HbWtkZHNFeEVwRWJjcWFlb1FUY2ZPVzFQdmswZG5aVG0vRGRycjlDc1JxCjhtSE5OWWdoWlRFOTJFYVJ0OEh2RzFaTzNPRGVTVDNvOStqeDl1cG5pOGw2Tno3eGZubTl3dVhKcm5zSXZsNWg3VVZVVGxhN2NTSXIKQitNTUx3ZG56Vlo1M0dxdW92V05WYnA1ZjhGcWduMDEyc2JxM0RocEt6NC92Q2s3MXpZZGZWZDlJWHA3ODhLWXlrbW55aTU4V2NtMApIdFc0ZWZtU1ZoYWZ6ZDg2NTVjcnVGaDkrUnNuaXJhazI4eG1kQzJxMW1HSDFJaWpWWnpDMTVRdDROREtoU08zOVcrZTdyZFRqRFpkCk1ickN5OHM3RGVJVzlwZksreVlQNk1OZkwvcTljb1ZqMW5URjlkWFN1YThybnlXbksrNjBwNTMyZEgzYTAwNTV1amJsNmRndDVjM1YKbm5aUjFodmpLZGhpTmVrS3BHMXhIUG02eUliS3F0Q2JKU1dqc2NDaU4zLzlyREloUytJTllrTFVXaE95SkxsUlRFaTYxb1JVMzJ2ZQozTVpXczZwWmRlMzN6dWFnTTNwOVhxN3dvc1FtN2FIZHp1aDVzN1Bzc0xaNUcraFdQOUd6d1Z0b2RUbTMyMExYVGFsWjh5MjBPaUZyCnZvVmVTZm5mYmFPN2JmVDI2Zm9ZZDlETk1WWHZIcFZjWTgxb1c1ZmFocjRudVM3VFlsc3pJRzE5SXR6ZFUzNmJtd0twYXBxZ3pWUG8KcnVUZTJveU5acE56TzUwM0FWWGwzQ0tiSU45RkxYSC9uZlhKUTZxU1RKK3Fpdzh1ZnVOa1A0YXF3K1d4WnBzbk9GWVhpWnNpTitqdQowdE1LQzNBZEJjZFdKMGJaNWt1QVc3d1JiM1pLa1hybGM4bTY1eFNwYjAxU2tXZGJmeWQ0bTQxeW01cU80K3F6YnYzZE1kc1pFWWhtCmZSeXY3MjRpaGZHNm55dzJSVHhzY0RTRHFQNGk5aWJxMy9GeXFuemxjRlBXMDFWa3hhWXNxYzNXd0hGa1hwNlZnMGVkd2RhWlVkWkIKaXEvTE9JK2FwOVg1c0FrMlQxbXI3UE1oMm45WXphZzVWdWYyRW9GZDlsb3ZOaytvYk4xa2EyUzFwUFp4VExmSHUrbDIrOU5OZkN6QwpiZitXQTFYb1BJU1h2YjhiTkh2RHMrcXZYYXpQN0w5aTlQM09hSEpiUmhNN1lOdW9jRi9sTUxFcHg3d050cHhRTk42RGJ2ZmFwOXZtCkhJZXV0ZzQzWmE1dWFCam9kZlRoS2s5WTNYbndSQ1FuRDN0dC81UVZnalJDVHI3dDk1NERDc3JIVkxmZy9mSlZweGYvc1BmdEJlRlEKOXFmamQrZW4vZTdlM1FmdGR1MVI4MjEvZ0VKa0w2azlnUCsvL0dYdkV2NmIxSjd0SlExVFpIQ3FiUWlWcTh6RzdEU0VTYkpjd1FlVApKVHJQNFVPZUc1bnAyc3ZtWG9qeGVma092bndESDM0RzBDODFrZFNlMXY3NVUxSnJZd3N2OXVwSlF5a2o4NkltUlNQWFN0Zk85K3JDCk5FU1JLQ2pjRUZxb1dsMnFoaTdTdklhbHBjaWhqYnJVV0RHdDFZdUdFYmt3dFlPOUFCT3lZZklrcXgzdFlkVk1GMUJWSm8wa1VRVjkKa0Zyamg3U1I1QWJRaTZ5Ukdwa1NKRFdGcUxXb0R6cHpNSWRVTjNKcHBJVkFWd2tpbE5JQmd2V1NScEZMRlpVcUdsS1pCTnVURFNscQpkVUNUNU5pK3lCdENxQlI3N3JsUUY2SUJ6UnJvdW1vVXd1aFE3R2d2YjZTSTBPS0JocElpU1VORFFnRmRjY3V0UFFBVktiYnB5MmdZCnJWd0dxb0JNWlFvWmt5NEsrSVRNWnY3QTM5eGtXV0FoRG9kT1plRHp3WjRIOFhBY0VVZ1ZORUxhQ0MycFdxb05BUklGTXdZQkVzZW0KZ000ZzB3aFBrZVRZVmlOTnRDRThSYU1vbElsQktjNjFGRkRqNE9aWlVVdEZJODBLb0QwRHBoaVRJNEQ3azBvcHNZc2VCTDB1OGxSWgpQREI1TGNzSWhHeVJCQ2pzTU1EVUVCb0hENHFtS1l3YThBZG1weWdNZ1ZRS0k0VFRRSnZNQXNaR2dnR3RQZWhYWWxJZFFDbndRbVRZClVvYWpxbXZSSElBQk5pS2xpYUdnUHlyblVraGZrU1JwRWZDRVNSZ2F3OGxMREk1S1FRZUV5RUtuY1ZvbE1Lc2l3Zz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJY0sya1F1cEFmUjE1WnFRT0RLcW5NcXd4Z2tBblBZeVpEZXNPYWhwZ2dXakl4Q1FXZ1lHeFF0NklBbm5qeWVVK3d1QkRZYTJ6bXN5aApycW1waGxFNVRDQnBZTVVBd3cwc0NLVjFEWlo1a2lvSkZUd0VhRWhTYkJmNkM0c2lqU0N3SGtWUlNJbWdYQUE2WFA0UzBjS2NTZU9PCnNBUTYyRHZiKzM2UGhGZDd6OVR1ZmxwNytlUGVuWk5ab2dxZ1Z4UldVSE9HdUVMbzFRU1c3Y2xWUkJiV3ZJclFpamtTaWEwN0o5T0MKNjg3SnlxTHJ6c21WaEJkVXU0cjR1bk15UTRCWjRNb2lqS3BOQ2pFQVRvdXhPeWRYRW1SUWJWcVVFYTdWaFJudzZ5cmk3TTdKRlFVYQpUSm9yaVRRN3ZhOGcxT3lLdW9wWWc1b3pCQnRDcnlEYVlQeFhGVzUzVHFiRkd3elhsSUM3YzNJVkVYZm5wQWZhNjkwSHZYNnZWa2hECk1zNHBlMUM5S05JQ1dDMThzRGJvZElRTW1BYnp4ZVFGU2orR3dKQVdLcVhWRDNJQVZwU1lCZUo2UjZST3dtUkpaNEZ3a1Jja05MamUKTklSNGxwRnU0SG93RFFtMWFCQnhlS1lnb2ZsSjJvNW1id0hUTEFpd2lHSVlwV2syQkdCb0JJZHVpaFVSTUhRNTFKNEZDK1NIL3N5Qwp4WFduMlJKZ2NXZW1XUk5OSGVMTDl3Q0JRK05vN0d4TWdnWFdURkZUTU9FTlNFT2xZZlZSZTFKSmU0aTQ5NkpzZG0zSU5WUUFsRTlFCitoeE9vK1dnVnh4M096YnpLcHhhSGc4NjdiK1ZGRHQ1NTBTN00xZFUrQVdjWllhakFjVkhmT2VPWDhERzJyMzlmcjg3VnZKaEQrM0wKank4N2JYdllCZnFtMFdHV3pjRW9JSUpqMThsZXdiUEFuOERzMlduR2FXci9jalRxOTA3NmIrRjRGeCttL25RSmZEdDBpMnpPQVVtTgpuNCtTMnFzOWtCaEpJbkNQeFRXWDB3YzgyZmhQSUdhay9iMXVkd3FaNUxnbjRaZk1LbWcxcTVUSkd2MkkyR3dsM1BrTGxOQXdNQUpWCk1QcDd4RzNTWnl3SnV3Wjg1dnE2UmhoQnA2WVdqdmE0MlFKT2g2NDRkaWZxT1NwVkNSQ2ZDcWg0am45Z1dtall6VUVvRzQyYmVjTEYKNFpQdFNPTElkQit3WUlZOWdCNG5FcVU0NFRDNDZSQmFwRlRZRHRFSC9GWExyT2FyZ3FKVHMzeHpUZFFKdGU5bVlvOGIxQi84eGtpdwpDWXY1d0JKd3RMZC9pbXZnK3g2ZTBOdTFWNE5tdTFQQ05Fby9wVUd0RnpqQUlycnRJbXI3ci9DY2wrQi9VS21CM2hnOE5CTUFtc3NGClNQTmNBRWRlbm84VjFETUxTdEJiOWxzVk1lNVh3UWpuZWNTSXc3Uy92L2VuNzJIR3czYWl3elNOMkhRZU04OTlxTS84RkhOK2JFeVkKbjNYSDBMSGhuQnByT3dzT3duU1kvc3R6cDdzWFRha3d6OXdNNFFrU0QyMDg1QkdSclhtRExDc1BNaFFDVFcrTTB6a09pWmdjNUhSbQpRZFRlSmdaNVBzYjlLaGlGRWRFZ3o1SGNxZ1pUUVlEdWVRTkNXdHlXa0Q0WWxPM09xSGJRSExUbkN1bHJNM3RKUStzVlJzeDlza3RGCkZuVHdrMVowQ3diUUYrTUVPUjYxVWxMNTdUZjRBcnFhKzBybkZ2cmdrYmtQaUJUYWtxaFoycjhrNnZpM3FJcEZZMlY3d0Q3V3N1dVEKKzhCWW92NDdxbGpvZ3hZQXhjL3Bid1pyRGRRTjZmNktBZ3ZEdndmRUMvaUFyQWcvMXFNNmRZc0hTeFp4MzZhK1VkL09YREhiNlhQMwp6VmhXMCtIQkllVVAxSnFodjhTak9uVW0vam11NTdBZDdFV05ISTAxaVYwQU1UcFhQUUxOcUFhYXZCRGJyQXNkTmtmbG8wN1piVStyClEzYUphV0VVTFRLVkNnWDZaZlFoeWJRQzdSYktKSEJDbmZXQjFoeXN3R3FyTGlQVm8yN3NmZ01EakpNaDR6OFpEUmdneTNScWNJRnIKYVpUMmQxVkJNMDV4bjB3YVdacEpQYjNlNFF5SDJMTWFUYkhNYmpPRy85Z1pDZHJkSHU2K3RodlVNUDVGclZyN1AyYStlcUVYN2p6dwpBKzVjdWhhMkFSRDRDcVIrbHVHR2srQjVSTTh1a2NQQkVuZUdoVGoyRitPQTAwYllXNGllYzA4ZS9sV1dQaFdvdlpJV3RhQ0xaaW1aCnlWSXl6Vkl5ZFVUbUpWR0dtbmtkTFJKSUthcWpqbUwrSytiVGFvcEFySnBKYkk1VEF2K0tMTVhtbFNNU1ZhcjRoMXc1eXFZcjdNK3MKWU9MeGdsK2twVUphSWhMYmQvZEhMcWFnanROblpTSWlmVVdrRThSa2k0aFpVSEdTS0cySjBwWW9OeUR1ejRJcFNFU2w3MGVTR1M5UQpKRlZKTW90SVN0MTBFMjY2Q1RmTjB2RDNRMDIzSko1dTJUZzhGOVBVSlBGc215Zy9TWVMwTkVoTFFtSjc3djU4d01tV3pGc3h5WndWCms4eGJNYk9Jc081S083bEV6YkhmL2ZsZ2t5dFp0bDZTT2VzbFdiWmVwa2hLN055U2RncEpPNk1TLytjRHpTdVR4WU9pSnVENUZDRmMKZm45VytZbitTK28rYWJjMG14TDM3NGViVXVPOXo4YmhNMWJGZU8remhiMG5xeXJOSEZtelBMZi9mcWk1Tk43M2FIYmJ6azh2aC9ITwpUMVlZNnozSm4vTTlKMzYwLzBNV1Yvdm5ROHdkTllmN2FnNzMxUnp1cStuKzQ5elJORk0welpyVS9mc0I1NDZhTS9QVm5KbXY1c3o4CkdiM1gxSHVyUTFxZTIzOC8yTnk1TnM1Lzd3OFUvdkNkTkFvcGhmQXVDUFNzQ0kxbmNGQzdCVVdPS0s5MnhTdkZxMkRDcXZPQWpYYVoKYzk1WGVKY1IvRWZ5UVUzVUhseFEwNnJtbFhvOFFyaElsWXoxKzFpeGQrcitIUDVtaS9YMUNha3NzbkZkTTdWellsS3BJTFYwUnRGQwpXZFcyR3RaSmpXTWVWcU9YMjR0U3FDd1MvaWR0V0p2aHRoNW9CLzJMZHYrWEdlWjlzaDBsT0lsV3NQSUx0dktUcVZPamQwaVRsL3A4CkNuTGtJWFhUVVBRaEF1WGt0VlZrN3RRWnVhaVZxKzVLTU9CZ0Q3M0xOcmFnOElpOE5kVERNQ3dBaXVtQU8wQk13TVd3ME0xRklJK0sKbXl0Y0dkOG5CbEI0QnpWU2VEUk1IRU9ZZXNZNnlUSTBRTTJjc25kUmFHZEpWcGhQUTV6ZS92NkRWdXZ5L0VWLzVHL2FRdVc0WnUzZQp0LzNSaTdMVkg3UmhuZHQ1U0hvNC9ERXBuS0ZOYW5BUnBVVmlwaGJBd1lNbmo1MWsrTzZzUHpqblhFTTBDMkdPdHZ1bjVjbURKOFVKCmRQZDQ5SzVibm9TbW83bUtMYjVzbzhpUlZ6ZzZ3eXBtZnliSlJ1WjY3cWNkam5haUMrTkJNQ0ZzbWF4aDZBY1BDR3oyb0docUJoaFcKcENHM2lPR0RtMkYrSHVaK1Bwa3dvUmtSMXBOMkhpbzMzQVhYUjhUNTVMSTQyTXVuMWc1RG1BaEd5bFFhUDVVOFRaTzhxV2F2V0RBagpyTlFYTkV1RHFQVWZKSm5walNBUFJDNjBYWWkwQVdDRUM0Yk16S3VVQWxraXlhTmF1Qk9zMnRKK2haWnlNZDZJMnhwMnEyek9LdnZUCm5FMXp4NXNmcHp5TWs2djJmRzlxYVllRjdCZi9oSENZRWlEeGZoZUV5a3pZdElTYWxHRlRjbTZKN0l1MndBVWdMMW1uWk8ra0RKb3AKbGlabFZ4Q1pESm1XZnBNYlpSVmY1M0xSbHMwVE9GYWpsRTdnbUNRU2JXS3V3S0ZLS21IUnhyVkl0SzNZMG42Rmx2Smt2SkdQVXJRdApkbTZQTGQ5d2JrTlBxY3JSaTJOU2dUNVJBNmMxc3AzclBEVUNmd2ovbjNhVTBuR09GNUZ3aStoOEwrV1ZMUHk2U3ZCNFFlVzZNNm9jCnpWZjMzRkFueTBhTE9EVFBMOTdJc3d6RC9OeWZCUDFCN3M4V2U4b2ZkYnJuRXdjZGY5aFpjTWFaOUw3aElVZWtHUHdLekVNbGcxekMKY0VadHlCeGozUnpvS0lEd0EwWERIdm1LTTBDaDRoa2R2RENFTXlseVVsT2xrZVR5WXhDS1BTV290bWprR0VJOURlRnFjN1U5NVZhSQptcmxDWk43QStBQ01PaFUyK01nMHNqU25HQ1ZvQUlPSDRRQU8vUkVKbXRBSzNBSmtnWkpRWVNjeFVEblZqVlFxT2JPcVRGRFlwN0tXClM0bEIxWVpzZGhnSW5hTXpYamVVelBTY1ZnM00zRUpyYkRWdEpLbWt3S0Nza1JsUjBPYWxSWnJrczZ2cUhCRkxNalRqRm9JMUsvVlgKYUJBR1Jsc1BZMUlBZjZHN2ozeU1VUkFoYzliY3ZhZk40UnY2NUUvOFQzcHc4aDZWN1FsRHdFRzNjM0hSd2JkbXg4Q0huU0d1RVZmNgo1VmZ3enlYOG42NUh3Y3d1ditBdk5PZGZOSWQwcCtvRU9nVlM4akhKNy9KdGgyNHh2NnU5L0JZQS8vVERYU2U3Ty8zekU4Wk5wR2h6CmZ2bDZmaGtFMlhMMmYzazBmMVNON0U3WW5UdlVsOFBtcVBrRkxDT1o3YjE4OG4vKzY3My84Ly8rZCs1Ly9oLytQdi9uLy8zZm0vbDkKVHNkM3YrOSsvNjkxbUorTGYxKzJ2dDd2UHlnV1lKdEdvWUJ5N0s4c3RnRG1oZGEzYzBLTmd1WlExQjVkL3ZiYnV4cEsxVWdidUhPQwo0dGZyQkNjdlA3TUt6R0Ewb1hzY2RYcHZXSmJlSjRRbkU2aXNNSk1vUFpmcEEyUFI5ZDlQYWhJVHNmY290UDkwU1gxNWNFRUMvaG45Cit3cEJVMm9GM2hlWlVpd2lZS1JIaE9vemdYSDFNMEl4cFY1RXdLQk8yT2o4Y1JVandJS1NjZWNFMUF5a2FsVkZBM1M5SzZzYW9NdGUKWGRuQWl5bFhWamZ3NXRCVkZZNkt2WjZwY3R3NWVVVFRoYzV6WkpPWnAzRHc5WGZRQVI0OHFUMjRIUFZyZG9GMWZpdkQ2V0hxelBYcwpkRmdPM3BidEU5RHNUMnloWWJRc3dsMmJ3dDIxQ2U2Q3hNZWJKbW1HQnhyNElIV1NtK2dEZXNRVWhrSlAvbDNwdHJYQUF4cmVUSU1QClVoWTJmQ0dDSlJnRENYL3p4RTd3WE9VVUZ5M3NMd3c0c0JwMWtxb0FPeUtZRkVyRkZXVURCaWVQY0VjQTZvQkY1V0N5SVhEZ2pzWmgKYVVhdUIwWU9IN1RLTEM3YkJZWWdMdUhiSVpEMVBGaHlRa1ZQc1VjZVFhZ0xCek40WlE4WXpyMVR6ekJPMGFoUTVYd2NaaEhqM0JVNgpianhyNUhRWkxlbzBMT1BDNVBsWXIzR3RtandtdDJpSUxNdlNDSGtNNFY0SG1PLzFHTXlObzBQdUI4cDNJUnBpN21rMHdwNGNYekdRCjdIREhBQjdoS1Y1UmRLNkMzNVVSWXh5TVlaWklCZUpYNlRSaWhFSjVvTEl4RnVxR3pvdVlYVWQ3ZEdjMXlTSzJBcVRJa25qY0l3QXoKMElNQy95SVFrZWdSZXk3NDVpUDIrVzVHL1BQRStKcUJZSWM4QmpEL3BqaEYvTU9wanZjT1kvN0ZNRGUxR3lMbmxlU21QM1FpVitQcgpCcGNiYkl4ai9KTjRqem1McGlwQU1ySlBCZXd4aERrWVlJR0ZNWXpJOU1nOUozd1hZaW5EWFkybERCTVVwSXdubXFWTUJQQlNacEpiCnlFTVpNY2V4TUFZUmpiaC81anBpZy9CM29UMy9RTVRBYmpRdWVOQnNtWTd4RkdPSVpacEhTM2dNNHZnWHdUei94bUJJWWtET1hBaGQKQ1B6elBRM3M4OVF3S05Cck1jZmZIZSttdUlTc2d3MjRNT09zaTBGRW5nWU1PdWFVaGlhVUdaTitDamE5UkdZeDUxSWdKVWtqeHFVTgpvMENGQ29oamdHTmJBSG11eFNBa3plTmwybjNiZ1dXK2g0RmxuZ29HQlRvdDN2aTdZOWtVZDVCbE9VZ0VxY2UyakJoRWxPV1JxQ1RhCmMwQXBUQjZ6TEd2SU5FdGpqbVdnSjJUeFZtZ2FPV2hyT3VDTkFZNWpBZVE1Rm9PUU1vK1hTZWVtQThOOC93TERQQTBNQ2xSYXRQRjMKeDdBcDN0QnVLK3psNkloaE1ZZ0lFeUpzM1haNUN0QWM4N0h0UWVENlVXTWN3NWJUV0FoaTEraEN1MGNjQVJ6SEFzaHpMQVloYVI0dgowKzdianBZbDl6Q3d6RlBocTNrNkhkN291MlBaRkhmc3J1RFVGc3BIa1dleGhsZUF5cGc3UFlCVW9xSUJla0VlRkR6K0h1bDNESXJVCnUxRExLV2tCcndOdzI1RnlSd2NrazhXNm5aQjg3SEtJNGEvSzNJWkRqVE1nS0hZTWlmUzZVSXNwOTNnRGdObyttT1lPc1l6Vms0aGwKRFBLa3NlYmppWGZhVWNReTFxRWlsckdpNVd1eEt1YnhNaUJpbVFjRmxrVWdTeG9qOXNSejR4SExYQThqbGpFUnZwYW5uUEZHQUdiWgpKSGZHZExlSVpRenlwTEd5NDRsbmpTamlHU3RPRWM5WXUvTFZuUHJsOGJydkVjY1lFaGdXSUpZdVJ1b3A1NFlqZm5IM0lvWXhDYjZhCnA1c1JSd0JtMkNSdnhwUzFlRms2VUZnK2JwOE5DOHlwUHhIRFdFdUtHTWFxbEsvR3lwWkh6SUNJWlI0VWVCYUJMRzJNMkZQUGpjZnIKMG5VeFhwaU9qTEF3bVhhL01BUEFMOHdKL3NUYVdlQ1o5Qnl5bExFMnc2U3p3aE1ZNXRXaXdEQ3ZPekhJYTFlTTFnTUN3d0xJTXl3RwpFVjBlTVZQdUd3OE00eDRHZmpFTkRKR0JmWVExK3U2WU5jbVhXQjBMdkdJSUU4VnFERlBObWs3Z0ZhdERnVldzTVRHRU5Tckd5ZDhECm56ekVzeW1DRUQyTWsrbmxWZ09QdUdlQlI5eDNobmhxSGM3b3UrUFJKRDlpL1N2d2lDRk1UKzdGdnFXWGxadkFJdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJcHdBRkZyR0t4QkJXb1JnbGZ3OHM4aERQb2doQzVEQk9KdGMxR2pqRS9Rb2N5b1BnSm9pbjFhR012anNPVFhJalZyZ0NoeGpDNUxDaQo0bGVjMDJVQ2gxamhDU3hpbmNqWGNUcVR4K20rQnhaNWlHZFJCTEZtV1llVDZlVldvNVhtZWhaNHhIMzNkWmhheGhtK094NU44bVB4CmxkN3I4bFVtMXVMOXdWeVdwa2IvL0lSM21OTmt0c3ZTbDBHUUxXZi9yZUN5aERGOVg0K2w4NnJ3Ly80M2ZIL2ZILzlyL0gvOGFmZWYKM1gvOGYyYk1vZi82TUxOdi9vOVgvYy9IN2hja24rQXN4OFlFdExKcnczbnpKcHdiRm5vRjk0YXRPT25nbUlDdTRPTEFtbE5PRGt2cgpWZHdjczNoblUzemh2c00rcTl3eDIvbGUwUUVDRldlNFFDYWcxWjBnVUhHR0d3U2dWM1NFVU0wcFY4Z0V0TG96aE9pYWRJY1E4Q29PCmtWbThtOC8wV1k2U0NlZ0tyaEtvT2NOWlF0QXJ1RXVvM3FURFpCeFkzV1ZDUkUwNVRRaDZGYmZKTE00dDRQSU1kOG9FZEFXSENxYWQKbkhhcEVQUktUaFdxT2VWV21ZQldkNndRWVZPdUZZSmV4Ymt5aTN2ek9UM0Q2VElPck94MndWU0owNDRYU3FCNEpkY0wxcHgydmt4QQpxN3RmTUZ2bmxBTUdTVjNkQlRPRGEvTVpQTU0xTXc2czdKekJtT2NwOXd4ZStMeUNnd2FyVGJsb3hvRlZuVFJJelpTYkJvR3JPMnBtCmNHcytZMmM0Y01hQmxWMDRHQVl6NmNTaHBMcXJ1M0V3SEdmS2tUTU9yT2pLUVZxbW5Ea0lYTjJkTTROWEM3U0thVGZQT0xDeW93ZXEKVGJ0NkNMaTZzNGVxVGJwN3hvRlZIVDVFemFUTGg0QXJPMzFtY0d2Um5qYmxESXFBSzdpRElwMDRtSFVpbFhnVmwxQ2srZ2J6emppdwpzbHNvS01QQnloUHB3bUlGMTlBTWJpMWc3TFRMS0FLdTREU0sxTjR4eGw3RmNSUXB0Mk9NdllyektPaTdZNHk5aWdOcEJyY3E2THBqCmpMMktheW5TYzhjNHU3cDdLYWl6WTJ5OWdvc3BVbkRIMkhvVk45TU1YbFZRYnNjRndSVWNVSkZpTzhiV3F6aWhJdlYxakxOWGNVUkYKR3UyNEtMaUNNMm9HdjVacnN6Rm5WM2RUUlpwc3pOWXJ1YW9pZlRWbTY1WGNWVUdGamJtNnVzdHFtay9MMWRlWW82czdzNExxR2pOMApkWWRXMEZCalpxN3UxQW82YTh6SjFSMWIwL3hacnEvR25GemQ1ZVYxMVppUnE3dTlna29hTTNKbDExZFFVbU0rcnU3K211Yk9jZ1UxCjV1UHFqckdnbk1hTVhOMDVGblRRbUpHck84aUNWaHB6Y25VbjJUUi81bk55WGphRWE0KzZ6eGRkTWx6MVJ1eGYrK2ZsWk5Mb2lVaisKNjhvY25hcEdsdEtEUEtrb0tLK3hCTW1hNGhzeTlHQ09wcEFDQnVIN01pckZyTWdpblEvQ1YwRVNROG14NkpxMHZXRUJ3RFNsZ0E3YgpKdG4vVWlta0RRNHVHaExJcUZFcG0zOWFnc0lqcmRhUW9HSVN3d2diWG9FaFFKRlBBNmhXUXBlNENYZUVlWkptaWcxSmJEVjg1b0xZCndLa1VIT0JvTCtSVzhEM01YVHI1R1NCZnJVNlk4M1FHQkJXdVJORTFkTThtQVdlM3JLQkUwYTVIb2RSRUg1ZmtnOFkzblVBYWFWcFgKb3FheVJxWXhzWUxHNTVTS2JVNnA5YnpaSzdzbkI5MytzTFJQWnp5YlRxMjE2dXNaUHErV29hRkNrd1pNRWpUVTEyeEszc0lGeE5rbgpzd3I2SDM2bGQ0SHdkaEtGNHRsa3pwU2d3LzdDTmFnRUphbXEyUXdjdGhVYmpHdkxnblpTQzU4UlgyR1RPMGN0UlMxR0hlVzg2VG1sCm5NdWhsS0JEQS81Vm1NMEQ0RG4yRC84UUdReXZoOEwxbk5xMEdmbU82Qy8rSk8yYlM3YUMvYkdlRXgzMW5EcnZmNGtxNUpZZithSmsKZDVXZnZoQTJSL3hZcWpsS1lacE12b29nWmhhVWlaak1jemNmNDM0VmpBS0UzOVRURjFtWVlzUWJtOHQ2ak45MVluaGdxMk5UM2ZJcAovUEZERWczVTJBakcvNFl5b2FJZFNvdlBqV2ZVYnRRZE41anYrM0FGWmlDV3lUaWZNSnRLVmt5bUl5eG1GeXp5eVNHYWozRy9Fa2FUCnpzd1lhWk0ydm5mNkVkbkk2VjRveUc1VUpGMDhxNUpvQytYZktFUXlsNFdvMmQvb2VRRCtCTCtrTUZZVXp6ZU9hbUZTa2l6WHNCRlYKU2twU1o0VGN3TGx2YWtaL1p2UTZGSnBDdGFDUEV1OTlpa0s5WCtJVWpmZG8zVC9xZlJKRWl0dmR6YTZmd0EzWXJ2c1gzMThzZU9OcQoxUlNZUGp0TVN0bW8wRVpEMlg5c1RsSlNwTkx3VWZxUDlhaEVQYzBibVgxcHFxNHdDMm5kUDNSbHY5ckliUHhJc2M3MEtUeVVSWlhwCi9TeEVTYzlWOGFjajN5MzdCWXJpQTFqd1pReUhRMzJ3eDgwZDdVWDlRSVhYVmNRdXhvVHlYbzhNcUtjRllUbDNuOXhUVnZReFBKeUUKeVM3OWswcVdCZlNjbFhRZkhaUHNBMHlXak1TeGlDcFNQY1Nacy9MaG1zV3UrQjc0RXZoMkV1WFh0QThxTVRNU3o2T0VSeWg4c3QzdwpuVHVLaGpheFRCVCtqUzFQSFhhRnlUN2dqbnlZbDdaeS80d0Q3dEpDNWcwOTc2MnRtVVZudjdZMUYrdjBlMXV6aTg1NmNTdFNPMkttCm5jZmNqSGdjR0I4R0l4cWp3R3RtTlE4cEQzbVlhQk1qRVk5UjFKSDNWeTd3RGF1SkhWNFdsblZqNzJKaCtubDZoR05tWWRqaHAvSWQKTDhTOFh4WHorQnRaWVltZDcwMnN2WWwxNmFkdTNjL2R5WFVXcjBBM1hBZlJhbzJXY0QwYTdqa01GKy94REpreU14Z3U3TXVvY3dwTApkSjR1ZjQ0c1lONnZpbm1jNGUrbHpOSENxbU82YnpmQU9LK0ZuYjBTbjRiTEdYcm04MzA3bnVGLzNYdENNa0tvL09qUFhIWDBlL2hrCmZ6NExJMG12cFBwcVlteWtKOGY4Ykg2QzdTSlRwZ2FuRkdDSTJ1WmNjODlCd3h3dFZpaXV6N1NHWXFHUmFIeWMrWHpQcGpjeEF0OHQKQnJtUUpvSk9YRm1DRDdQaTYyRDhtUjZ0TnlZTGtDTVBRYU1wZWxnaUNLcmVNSWt4elM2KzMwdHZkS09keDAwVFkrM2RCenh0UUd2SQpETnFPOGtaU2FHdVhLMHhtRFc1VVpBckFPSTVzTXQreFZ1cVQvYWhQZHZWZ3J6NU5UejBtMkZyL3hobFNqOWxWanpuWnN1L1V3VWxECjB4RVluNWZUalRSVHRYL1lsK3B5KzNxeXg0bFpPaWtLenZESEEwZVorOHFFQnNKbmZmV0ZBeDZ5TE1adFJNMkhidG1YNzdpL01TbHYKbmFvR0RNNDB4Zk9BY3BlYWxDNFNKWXBpcVJ6a3lFTmtabTNqUjlQVjdMMHRYNHg2Zis0aE5JejJjbkRtaHpYNkhnM0hIQURqUEpwcQpoY1FmbGduTjFzZStNdzZCV1U2RmIzVGlhNHdPSCs4enhFQW44dHczTnh3WlZuU200MW5mZmVsNlFFUmZHbHFsQlVQcWFCZEdneWk5CktwNkZJYU12RFMyVkVpamxKNzlvN2txb1BvRTV0SHBRNGRrK0JZUnJZWkhsNlZZYloxOGNINC9KWTdkclhxY2d4cWZYWUwyUllhdEkKYzVjWXhvSmd1U3JjQzBIWVpLa21QMWxPUGdtMGhoV0NYTGtXMEtJbkRaUXdvVWpodkxRZUNRTzRvZGFlQndGKysvYTdRNElkeUlVSQo3VENndGVmNzRzdHdiejJTU1lwYTh3d3U5MTQrUGZyK3lXSHRpOXJkVm1mUTZwWW42Y21uTmJwU0FTTUY1ZUhIc1ZzVk1Cb2duM0pCCkxsMlRxWlRlT2trYUtlaGdxZkV3OHUwb1NiSXV3NmZvRTNLNXFBUjFWMHpVSlZFR3B6Q1k2RnBPYVZBVjBvYS9KWGgrZ0xKSjZ2aU0KVDVvRE9sRW9HMUZvTlA2VTRQclJRdHBMN0JhR3dqTXp4anFEb0M4aUo0dGFnWkVHTmZ5YlpXZzhNN1E3VFJKeU1FVWFTcG9DSDduUApaVVF1TEZ3WVVCMlZBbGxwaWdRblltNW90T3FZYWR3R1JzTnZtVWtwRHNvb2RKalZjZUVMbmJ0K1d4ak9BMGtaMmdRSVQ1UFM5TWs0CjZNRHVuZkJMU205aWozZm9ZS3FMQzNRN2dWbU8wNXFDM1N0REk1MUFucEFocVNoMHZzMlM1YmhzRGxxdloyUVd2bWJwQWxzWExuRmsKc1JJdWJWSU9lMnRCenZGQ3A0YjBMbkxpWVF3aUJUckQ1cXFFOVg0TG9hMXdFVW9sR09xY0ZETExNQ0YxQnZNWW94QndvdU1Mc0RDeApDcE1VQ0xDMkg5eHpNUGNkckMvWVJrbEd3VWNCNnhMVDFtTzRHS0tCNnRBTGxFcEt1dldTcFFtNkFWeVRXS2xBeHoyY1ptQm1rcElGClBjMEtQUFJubU9HUXVvUEpEclY5UHpkTGhNMXZXR1JBSHI1aGF5alNHeVBQSkFHQUl4YlBCSGU2TkhXbkxtVVYwZldzR1prYTdiWFYKWnphRWFiV0J4T2lycVJGQzRPcGpSTkdWazZOa3d4aFhIU2VvTlQxU0ZLdTIrbGpaWU5lSjBYTEpLVmNkcnhuY1FseTR1M3hQWTBDRApjK2NrRE05N0RBdVFBRUlON1FDWjhqR3ZlTUFRTlR3OUZOcGZja20xZFV6WmtFaE92V25TcEVDTkc1UlI1WURqS09mQnp1aE15aFI4Ckg4VjFaQzZiNHArdVcyem9oaUJIUDdJYlJqcWxiVWZyUkVZZzBBcFRlaVZDWU41TWVybElGclIxNEFOYm9JL2lsWEk4aVNsN0FOTVkKZlFSSGtqU2g0MVZTb09NZmtHRXdCbXhZV2ttVjJ5clN3SGFwOE9WcEc3Mk9FeW1qd0FDODFRQVRML3ArUUdrYmNNOWxpR3lBcGx2ZwplQmlhaXJCdlpUaFkwRzBwaFV1aGd0RStDdHJBeFVXdlp4VGFuaGxncWtsQmk4THUwaGd1ckFHUHpYVUNyQ1NER0V4VmpWT1VJdGNUCmlzQjNYSm5pM01IZUl6ck9oeDlTRzJ0OERuc3Q5TThFQ0xRTzJBci8rRGllZHh2S0dEcDZHbVZjdmhVWVdMcGtadDhBQjRnUXVhSGEKN2hZVExIK0Z2OEFjVURtdUlFbzVVdVM0VXVHb29QSFpYL2lScWtsWTlpUllwRlBXOEoyQnRDQ25BTXdscmRHM2x5clkrdUd2SUFFQwo2cDBRTXZWRHdkOVJFMGh5bUJRZWdyUGFHQnlTSkpYb2RFZ3hISWVDWnV4N1dERGNDblVRTkpuaDZjbytOYUFLVkZkTlErblVwclFGClFXUjFVNHBNZ1Vya3A3T3gvTnFHaTlrNjJHQkNsemFBOVlJZWhiT0JYSmdCUW9CaTdKTGgyZ0FnSENHaExNaFlZWWVDUm9RUm1ScTAKZytseFhCenBnbjVQR0NpQm1WQXIrQlFWdmNBM3NmM01WcVZBM1VhdEMwNW5hUUVEcXpCRVc5dUR2ZFJiL2N6NjhlcytKWlNvSFRRSApNK3huMTI0NkV3MGJZb2ltWG1kTFNJUjlqaTJSYkUxSVJIVHNsNWtOS2hObzFrM0l0WVlkS3hCaXp4VVlJb1lQU0tLYlBLRkllb1RrClpBUWpPenJPZXcvQ2JjWG1yQUZJUnRFRzBCYU12aXpjZDl4UFFCZUhobE9xZ1FDWDdNeDJqaUZIRWNUWVorc2NTRkNXNVFJUEJOYlkKVTJocGJkdnVxbVhhOE1adXJJYStBR0tOaDZCbEg1WldqZ1kxaG1FMlk0bnhHNEM1U0FraEEraVZHMUkzUFFoNmhBSWtvRUhEczBWagptK0x2MXBKbnlWQytkUWRDUzQ3N2FxOGVLYjZPQ3BLSk5obURCNUdVcUVTYWFFc3JMTWN6elYrQjNhNGJEdUM2Q1VzT3pqM0dmMDJwCjBkWWVmNGZXOFFhS3IyeG56dGcwT3JBWm9BcVprdHhPckNxQlVUaHdFc1ZBMWdiTVYyM0R1U3lFaGlpbnQzKzUzalRFWTBJaFpkeFoKbHN1ZG8vRE44a0pFTlFNRTFNczhzV2tTWFRWNm1naDBuUmptSzZKTnJHSHZiSUo4VmJpM0EvN2NZWU50TmNzb0t0Q0RRbWU1M2pTRQpNWEd1UDlxR1F2YzlDSmNWWUkzbXNxUWd4bmd4QnZSVG1Kd0VyK2R1ZFpJR3lrK3AyQVl5WnpmVytQaE9EVlpiWm1pL2NkOFZMU1U4ClVEaEF6aTA0QkRUN1NkR3dUYmp2WkhMSU1EYzZGeENvL0dLSXBzZkFnTkFHUTdnWERnVjNjb0lNdEw1QTVVeEhoRUhWSWsxOEZWU3EKWVhRWUlYL2xGdm03NnhKWGRsMTJ1RDFGNkhWQ3M2a0RwSUthNE1yOGxYSHpkOWMwVjNZZEcrOTNhNEZoQVVwSVVKZzBLRUVaR3FkZwpiOWNKMlN3em5jaHQzZzIvYTU3dU53ZjFVZk4wT2tCbGxhQVVjdDJqaS9MY2ZpU1hPR21sS1lXQm9rbEkyMWdBL0VCT0c1TFg5SlY4CmU3Ujc4RmVzcFhQN0ZjYlJGbVdrSG1Bc0t2Y1ZWcVlUM1ZMUGcxQ1Y2R3R1TjB4RUtXM01DWWFpK043UXQ2aXo5QjMzQWhsOWhxckMKZlNYdkQrT2tMN2FMZFN1NS9jNmlKNzY1YnMxeFgrdnFFUnpDZFZ3N0FvTWJQd2RsMVQwc2k5bis5V1JBQnowUmxpK3BLUk5ONjNMQwp0NzFDcS90WGFIWEdTM01UOFI5ak0rSjhiM3JHak0ybmVLNU56VVEvUjYxVE1KNjhZL05haDdFZG0yalRrMUdOVGIzM0QxRmdacWN6CldLWThzNVBwSVNaK1prdHF3aUZtMWhDdjBPcitGVnFkTWNRdVhoVWxzQ0NsdXpCMHJRKzBiMG1SeVVXQ2xpazNCdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJYkRoQ1VrelBDUjZKOHhuckxyeVh6S1duSWFIR21XMGpuVzZEYTUxUFlNVnYrUlRHYVVpb3NTQ3lBWFJ6MnB2b0w5bys4RFU5dWZXUAo2bjFYL2pwNk1DaWJKMmY5MXVWd1lvY2lEOXNMUEsvbHhnZzZwT1Y0b2NhZTJDZzBCclFiUlRjMmM1bnF0UGJ5d2V4TkRlWlRJVktRCkVWTjdXNFlPWEtYdDVoYStITGt2ZGZkdCtvdjdQS1JwWTBLVEtDNXptTHEvN0dVWVpLUGN2aG0rSExrdmRmZHQrb3Y3UEp5cjBxRHIKRmhRWWN1SFdDano2SlpRWUprOXV3Z2Q3WTVPRnNyZWRmTnZ2VVRnTTlMZGUzd3NKSCtNZjlyNjl3Rjl5Kzh2ejdpWDgrK3owNTdJMQoyck8zNUdyN2c4dmg2OXJUWnEvNXFoelVuZzNhcUE4dC9LMW1menhvZHJzZGtPUVhyenN0Vi9JN29QNWVMYTFkakJxMUYvM0xYdnZlCmRObFBhL1c5dStNVlJMS3d4bmhoWGJzZ0ZGRGhVYmM1NHZJd0daNzFnSjJ2eHdvZnZHNE9XdjFtdDFhdlBTOTdyVTZYaXhPS3RpMDYKVnFFNSttUUluM3V2TGtzdTZ3WnBFajJod0Nya2hoM2UrN1RXc0t5R3NSbGo5QWNlc0tsZXc1REUzWWF2bUhrVDl5VDcveFQzRHp3MwpZeEJNN2NHVGsvMEJUTjV1U1JpT09xZXdlazRPanFHa09VR09uaEJoei9zWWFIVkRKTTBaYktBa25ocjRGZWNLL2MvK1B5Z015YUsrClhxbnBkS0psT0lpTnRadGNVN3VhMnNXUm9HYmhnRVlORmZTL0NvMSt5SUdadGFwd3VrMHVLNENCV0t1eGZwZmRxL0YvY1h6dTFWejQKWk5pQ2hQK1VvQko0TTlUTVdjaEVrVjNFam81dnkxKzRjRTJNZjAybnZ1Si9jWm1wRkZRU1dqdTQzalI4a1JnRUFkcGhXa2pMZzJRdQpEejdzaUJiMkYzN21lYmgzNzIrOS9pODkrZ0liNWQwSDNYZkRZZlBrOGZHbnRYdmZ3b2pCcG5QdkFleWtiMHN1Y3UrZ2YzNkJVLzlSCnB3dUVZaVVZOUU2dlpndFlxRlhlNzdraW40UHVldStIenJBRCt4MGluTVp3UEdxMjNxeUFZYjg1N0xUaTZvUCttN0o2ZlVrL2RKOE4KWEVYQXVPaXA3WHUybU9OQXJiSnQyL2tlN2gyV1o3WDd0YjNhM1FnUGJ1ZjNhOVJzN2Y1ZTdkN3o1bUEwZzdLRGZxOTkyUmxWSVdvQgpGaVIyQmU0dTVBWGlDcHg0eGxQbTArbUpXL3VuUUR1VS9ZRSttU1RQUWVYQ3hGVmE2NElTTnZ4VXUxamxKV2d4emxIZkcrU250eHA5ClB5d2Z2aTE3ejlydGlteStUZ2JoTnB2a2lzTFg0Y1JXME9QeE9oUDJhVDZqOGVZdWFPTndqcVpuKy9KQ0NWQlJWL0doZkNpdUxHRFEKZnJmc3RUOFVod2paeXFzcGtCZnF6eVZrNzk3RFg4dldKZmFCZnFDNlU4S3VoKzdDZFpaejc5K0hpWEcwMjUwVGU4L096b2JsNkZNYQpnRG4xWFlVbjNlNGxuV3I2ZzBiekF0VHNlM1lud3B6eWpuMTN4NURXam9DVnRZZG5aN0JSUWVudk9xT3JDTjY3enk1SFF6Z2ZSZDdlCnc4N3dvdHQ4Wjc5K2VvM0MyUzhiQzdka1Blblo3bFFTS3B1MlpqNzBKdlRCSisrMVNta3llS1JGbmtlYTJHMEk0YTJaUlZ0RVUrWGQKcEphYWRMMTNsSjNtdkRhYTgwcTIvQThpaGNTSFVBV3RSbkE0NkYvVWpsODMyLzFmRmlzUVdOQ1dhelE3c3pXSE1WeGVWMWpJVEUvSgpSYk16Y0tTaEJiZDJGMS9OK1hTT2hQZG5GUEYrVEIyMnV0Um9sbkNyN2ViZ2paUHpGdkM2UC9pTkFHaGZjN0QrUmJNMU5neVh3L0w1CjhkRis5M0l3VnZjMEFNZ2UzQm9PV3ZIMzAyNlB4ZzJPRU01Z1RFTml0YTNhdzE4dm1pQmQ5OHV6L3FDcy9WQU9oaTRxN3BZM216RUgKNVMySTVrS2E5UmJOTzJWL3ArenZsUDJiMlhtdks1eDFkd3JZblFMYzVaTHIyMnBtaW5seVI5VU8rb01lN1BnZlNzeFBJSzJvbXpVRQpCclk2WlFZRGVpNkg4NmI1N2tDek5RZWFxM0ppWjZ4ZVJiRGs2NjNEN2xiam1xeEdWSEtTTk1NZ092Z2dkVUxPSmY2QUZnYUY5MnNtCi82NloyOG51VlBFRGs0djJOU3BuanlGemJRMlB5dWJvTmZLNTJsNkdVWmc2NTczc3hjSzk3Q09TUXNWT0N1MmswRWJwQkdzZ1NYSzgKZUx1VEpFNlM3SGN2eTlxMzVicDc0RzlabEdBb2R5b1QrOGFPeUdSV3VHajdFTWVkYVludnlZVElrWW1BYmdIREtpaWcyK2pwWUc3eAova0xvTm5paUU1TmhtSDlEWmpJM05pKzdTQXFLNWNicjY4TG1mNlRJTzJSTldraGg1ckpHYkJOcmpESDRTZ2ZNRzYwemtidnBrZ0pMCk1sUUJOWnU1c2dJL3plVUpKcGZjRnBaa3VhRzUwVkNTbmg1eEJqKzZBWUVzUVhzZnpxSE1vTVZ2TGtzd3ljclc4Q1RQMGpRWEZJK2EKRkJuZkV3SVd1WUEwV0Y1UzY3bThVQitHRVIvY0dIWXJLeTQxT3FWd2VwM1NnNzU0d2NzSzZrWnFweFJtRkRBcUl6R05VYjl5TG1PdgpaNFpkcjJNdnVnRjJEUTZLclpnajJxUjVnZk1nVFZKTWp1MFdtOTJYTUJtQXdGdHNxQ1NtbU1ocDN1d3dHemc3cE41TmoyWFRRNms4Cnh3MUs0bzBBT3pjMDc5Z0dVeVBpMU5EV1JETm5hbVNiT0RXdWRXYnNEc3M3QTNvNGNCNjhIdlRobVBuWHpxdlhYZmovYUtQT25ldmkKbFY5OFJXMmhUY1ZXb3RKWWVLNWRaUnI1MVdOSzdqMStkdnJ6QzVnTlg5VGkyM08xWlhUY2l5OWFZUTVkMTQ4UWcvV2c5NnBidmlnQgpHOHljNy9yNGs0L3pPdXdBS2NUWmlmS0g1UVhNNWVHejNsaTRGemxaZStXUXpFR0ZCMU9Oc1lJRSthRTU2UGhFWjJORTNmdSsxMm4xCjIyWDE2SmtYMVdNUTU5NFNUNlFTQmEzZzFmYWVaSkpiWTRReDJ6eHZsckJ1Wm1YR1BGYjMxdmM4bDVyM2hqYTkyOUYxdFV6b3VKMFYKQlQwWHJXQ1dpWlFDYnREbWdQcU9zOHhNZnBnLzBUQXIxZXJUN0VZT25WYWF1R0E0dkVMNm9lSXZ4bEJXc3pNclhodm4zYzQ1Y2dCegpKbUtxYmc1Q1BSdFNmQ3duRy9pNU43cW91QzUyd24rKzhKZWJLUHpkTW5NUjBYTlhYbXBrYm5ZaXZwcUlsMlNBM3F3VDcvV2RhUlprClRKc1RUckIvQ210cFJqNm9KRm1ZRVlwU0pHMVEyS1c4cG5qNGozMld1TGZrdG1lUzZCdU4vdDZBTVU3ejZ4L2lqODAyTW40RGEzUE0KSXJ2SW50dGF6dXRqckZ6UCs0alo4dnVJTjNIOWsyOHE2cW1iaXRsNzNGVFVremNWeGNSTlJiSFJOeFZ2VFF4L0ErSjJsM3RwSjRJcgo1MTdDQ1RNejh4Sm1YTUkzTStuZnBKYnFOR3VrR0JZa2lpSTFqVlFrK2lOSXZBUlN0S0JRcUtTUU5rU2pLQXkrdTBCME4zSmpNQlA2CjdlVDUrTmhrMjdOTDdQcmpidjhYVE5TNVdkNjNuWXpicVpuT3h1OW44WHRybVRHcWFrcm03YXFRNzZNZnlwMCtlQldaK1UrQU5pKzcKbzU4aWFYbmNPYi9vZW1rNUo3SEorenQyWnhFbzNOUjREdUo0RlBXYThvbys3TFZEVnRHbHFVbWZON3ZsYUZSUzM1K2ZWdTd0M1gvRworYlYvK3BTb2Z2bmIzaVI4NzNscm1pMTNmM3pkR1pYMnQrb0xCd1lUOWc3R09ETkgyTjBYai9kckw4cTJRNTBZZXNHVlNoc3RWTzdWCk15NzdqN0tMeTk0V056SXo1REFJdGl3dTkzaFFsajFYVEl1c3NJbnRHMExxMUlhNmU5S3c5TUc3SmhmTzg5UlFPR0ZtQ21HaWhMcSsKTUY2L2NJV2xLZXdWUUh6WjBtWHpGMk9GbnpaZmxiMVIwNVVIcFFvb1JPcXl2TWhJcTVLWnBMc0lpY21VdTVSZ2NncUZGWHc3UWRqNApWMEw1bFNqUzJ1T3YwcUsyLzVYU3pMWUVxaHFiZDE1SlJmaFRTYzhGSjBsU1VBTE5BcEZSNG9ZRVgrQWpoekpGeVZtMEVoajArQ3VaCkE5clUrQ0hMb0doS0kydnl6TjZIVEJKaHg1cWpuVlBmelRGOEFIcjhWWkZFK0xBdThKYWl4aE44bHhtUTVOcG9kNmx5S3RwWEVOMGUKSC9aUHdMK0FNQWtJcFZBVW9vOVBEdUk0WkNLMVVlcUFXNlgwbzRGcFdSaUtFQlFwTU4waDFOaEI3UEQrVjdwZ2hFcUwxUFVuRlhtdQpIQ1lYN1Y2aytCK2FSc1JNeGlTUmRTbnhMdVdSeGljSmM4dXdsS0pYWVdLbk5yQTU1OFNsR1haeENwMmdrWUJoak5CcHZLSWg3RjJOCjFFNmNJa2x6TzZtMXU0ZWFNZWVBV1lrdWVNS29CQWt0c0h1RzhXWEtDR3NlQjBRWlRRZDhTUU1qS0J2U3h0SGlBM0J1cGtqTFFZdFAKMDBEa0F0QmxpaGVOU2ZGVk1KeXFHcTlJVUU5VElOamVLdEdaMURSN3BNMFBZaEZSdHhUeTN6RC9nUTVhSG1tcThCVTVaQnFsd1lXRgpsaGh0eHhYRElCUnlRTnE4cnhHeUJIbW1lVlZrc05TMDdRRE0zU3kzekJjOGhwNDZPNUV0bWxSNTRvVHdpSEtsNko1TWtlVFVLNlV6ClRjRVpPQUV6MnkxL3FjaE1kY3ZnWWhVNlk2bTFXZ0lWd0tMc1ZNVmVTY21yS2M5MFNyelIwaWp2Nm9qQ1F2Z2FRdWlJU0xFamVjN2MKTG1DeDJOV3RGVFdmcEtwUU5neWZIaXJ4bWJZVGZNbE42Q3dNcHV1WkFieUs2Rk8yWXlTdVlieGdmZEdhVTFvU1JzRTNSUktlOWFuRgo2R1k5VFhvVUYraXU1RW1xSlhVQ3hJUndpNm13VTFWS2l2bFZRVHBpN0l5OWdtSm5mWUtMRWdZRWU4WURxUXF0cVE5QWVVRkJOYmlhCkVrdXd2UU1WaVIrV2ErN2FENittak1XdlVMeWFRUHdnT2lJcWt3bE5BNEZ2cU52NDlNSWtGTGhFRDZZblBEWHc3ZlBIWHlIRmhSY2EKQW1hYVphQXFwSDNmSnM4a3pZZlVyZnZBUHRzL0ZocVMrVmNrWWNmTjZPR2NCRjlXNWFVUTlnRXJYakhDQ0tkUHZBMmtOQTVTOEM0bgpjMXg3c0hxVkpQbU43OXJhWFRyajZXRndwMEQrZWZLQW16aHBjNXI3bmxNZ2xSVXRPc0NaMnRrTGROQzhNTG05YVc4c2xBU0d3a25qCmVhOXg2eE9wb3RXWmVkR1kyb0VERHRIR0RkeTJLd3prV0VGeTIyOVZMTWpUZUt2Q1o2dGhxOEloelQzU1RKTWlBc2lVSUtUQS9aeHcKd1Fhc0NKbVhhVzVBcE9ZOEFJQTB4NjdTaWpYYXM5RmtWcnJsOUZJcTNYNnhHbFFpQkYwbzhoTGNYMnBRTWhvZEZPTEFBRzFvbWJEUQpUSVV1eUVLakNwRmJ3WjNDN2tYVHA4Z0xDaWZqWE5uS2loWHNQYUR4VzRUQlpTeG95OGtsb3pVeXRmTS9Vd21oelZVQ24ybUhNSUlHCm0zZWVsUGRhdDNmRU93OXRQRjc0cGZaeFpMeGdLQkppQXJBVEh4Q25TM2ZFQkRmbXVPMjRPU1hHaHd1bktPM2JYck9BTWJJM3NnQzMKWlMxTWZhdFhBVlB3eFdkY21idzd1Z1VKU3ltd3RrQU9XTVl5WDFXV1dXR1l3VzVrN0NMTUJDMUxBMnViMkNpNXI0S1hWZUtDOFFncgo4VFVscVdzWGszWE1ramI5ZWMycXg1R3VQY3NoTzE0NDREaCs4MjVwVlN3VGFqd2J0RjUzMmtzcnVXS3VIcXUvKzYrcDBjdnpjejRlCkxtclhGcHVKNG5HLzJ5NTd0UmNVVzdVRVQxd1drYzAzMmtZSTBEaHJDMUtWUlRuMkp5cTVvbllYdS90NDBIeEgyYUNldjFycDBHUDMKV3BTZ2ZoK1QyaTVtZkMrVGtHallmbWk5dzduQkJuZWlnaVZtZkhCaUdlZVJ4Tm5wdDM5VEtDdWdVbnRmRjlZekxYa041eGVhaU9ILwpUbTlESlVLalJOSXMySTFPTTlwVU5DajZ0S0hDSGtwQnBpQ1liTWRTN3Mva0I0czBvN1dJU25ubVJTY0lYMUltdEVCaGdCK1NMQ05rCkVyWmIyczJVLzMrOFcrTy9LTmhZQXNHbXIwaVFvM0FwZFB3aHliVGI5TGxia3g4Y1lra1NrODQxOEMrdmJBbVNsOGhVV1c3Rklld2UKMm02NFJVNXFqdkgvSDl0OGREcStuOEd4alFTcmhIT1hzUW9QakxVOU4yVGNwY2tQRG1ObWQwalNKVEtXT3JDOUdPcWJRQTBzb3c4NgpkY2ZYM1AvZnpZdEUwYmFQZ2h2KzVWTk1yblJoSDAwUUtjMHpVSjR6NDg0MTNKZkpENndBSkhTWXdma3J3MEhyU3VsdzZOaEdlb25DCmdZVi9lVzM5V0o3V0R2cmQvZ0RPNmYzTEM3L0szR1FHQ2EzNDZoc2ZaaUlOdTRnVk1wTjZGVnQ2UlE4a2ZwS3hHWUhXQmVrNWJxUE8KV0EyUUZpTlBGYXRDMFo2ZGVSMEt5RXhwL3dBZW1kUVpHK1lkVXJXZU9xVGFQdGlSTEhCRXBVTWg4REViMGhUakE0aEZJWkdjTkhRQwpGbU5tdlRHcHpQQm1tOVVSN1ROMGZNMXRyQStTNW1uR1MwbkNTdGMwcTJTR3pNTG1UV2FjRXNmWDVTSkYwL0VrTDhMOEVoYlo4MzF2Cm8ySlQxQ3J2NWh4MWhxUFlQRGNlTXpEdDdJalRYY3k0aVJROHYvRUxQRk4yTldyMUtxLytpQ1IrUWhEUi9CZjA2QT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJY2pUcTk5d3p0OU1QMzA2OU0zajNlZi9pKzR2eFdrZzFVT3kvUDIvMnl1N0pRYmMvTEczQlo2NWNjMVErNnBUZE5oZDgxT21ldzU4WAp4MGp5Y2RtRTdSb1pNeWpiblJHK1JJOFBhMDI4VEgvM3I4QTBlb0N1WFh2VWZOc2ZrREh2THBINjZlUmJlSmJHK2J4eTQza0lwSjJYCnZSSDByNGtQQi9MMzJoZjBMYklSMjBlSnJWVjd2MXVXN2FQeWJQUkRFNjFvdGNrWC9wTGFXUmRmZ2VyQkhMZ1lsTU55OExhc0llRVgKMklmaDRncXRidWVpMXVxamtmZlgyZ0E2MmUrNUdsbjAzR0JjWTlBY3dteXJ2eTFiSTVCRnA4MXVzOWR5dmJyN3o2ZkEwY3Z6Mm90eQoyTzllT3FPcHo2OExpRVROMDN4Y2ppNHZLSnpjNG4yT1hSL1YwUERzdWh5aVNJQ0R0YWZsOEhYdEJUWGUrWTBNcjFFenRrYWFqTldBClpYRnhPVnBTSndsVVRuWHVxTmw3ZGRsOFZkWmdMbDVlMlBMZTJRRExEWWgvVVY1Y2RvY3h0bWpRWHVCeWkwWnQvTmZ2K2hmUmIvZGUKUGozNnR0OHVaODZGKzdXN3Y1NTNlL0J6SGRnMTZKekNnbmZEZE8vQkFKUXVXK3VhVVh3QS9GRXAwSmk3N1VIcEdNY3VHLzRWL3huNQpkeWp2L3JFM1BIbmJIQXp2UjlNcEx2bzJNSkxnd3pubGVuNTJ1WjRNeDc1dEtIZDYvVjVaZ1RIZGZ1dE4yYTdDR1M3NWdTYm1WZWs2CjdmVGEwRkZSZ1RhWUhMQm1yZkJZVGw5YytnTU4vM3R5UWl6a1JDWDZPL2pBYTVXSnYzUlVOMm1oZi9HMjhsTEhvcmM4bzVFOFVHOUcKL2ZQYmxXVFhOdysvR0RaUm1VQVZCNVpZMWVsNDdldmlHQjhqV0p1dWJNTXFIWjc5c3NhNzhTMHZneUcrNGIzaG8xeUhjN014ckxMTwpvL1NYVHB0dUN5OGRYMWZ3ZGdWd05acGVseTVqeDFLaXVPVHRVaVhSNDdHTXFIZFY2SGwzMjZUa3VwRExLUG0xa2ppNWJVcjhpWHNlCkdhZjlFZWdCZUxCL051aTg2dlNxVURWZFp3MzJmQkoyeC8zTFFhdmN4MERZVzkvMFlXdTY3UzZjbDZObUczU2c5KzFIOFo3OStIM2IKbVRTcXpLNm84T2V6dHFLeHVYUmNkdi9hSEIzMlcwZjlWck9MWjZraC9UNXIzdm15UUVzNWVISVlsNHgvL2c3MUkyelY5VjZvUnRKSQpvcTYvZWZEazBXVzN5M1lhRjdRSnY5b0t5bHRubnNNdkZ5V0ZlajhlZE5vbnVHUWVOVnVsejNTQVEreGVjWHZlNy9SR3lNMnBXc2RBCldiRGQwRUJNRnZtKzEzRzkxWGt5cjNVeUJEMzhkZVJadTZBczlqUXVxblNPd24xbTQ0KzYvZjdBaHUxUldkemRza1ZsOS8zTVdGcjAKQlJzQUZwVWt3cUlPNkxsa0VjNW5GODFXWi9SdU1VY0paK2lvTkJpdk5yc284aXB1UFM5eXNhQm9RS3JtOC8rSFR2a0x6TFhEem5BVQpMSnRHNjNRQllzK3JISk1UVVVES3NwazFJbk1rRlZqR09oTDNFNXhieEdUMzlCck44YmtMNHFEc2RnOUFXcnVDNlZ5Y1dQQzQ4eHVQCnh2eHUvclUvNlB6VzcvMDFVb21RYlhyUk1Idkd5VG1sdnZPeWJuN0RoR21TUWQ3YWJTTGJkYk0zNnRTYTNVNXpPRjB1dG5IM0wwZmQKVHErc2pjcGZlUlY2TTNIQk5tc1VTSCsvQkd5amQ3V2o4bTNaSGQ4NUFLVThPYjdvajhocDk3VGZYbUs2NXphSGRLdGl1RXlnRWRFVApFaTJwMVRXYndPZFBQYzRrUTVQbGgyYXZNM3dOcEVRemtWeCtlU3JNVWt6WWgrZmRacS9FU1JJTHJZVnJtMnBRY0h3SG1ZZExvWXlXClQxWXNYejRCejNmOWk3anJWZGRmUUxCUEtsV013MlNBQXhGVndUR0xnVm1ocXpFUVYvWnEvTHZzbGdPcitqM3B0Y3Rmajh0V3Y5ZGUKcmM2anptQzRwQm1hR3ZPSGFWNDFUODc3RGE1SGM4V3g5ZlduaGpiTFJMV2h0ZTYyNlpGbHlnOEcvUXYwVnRyTFpOT21pUW5OS1JjMApwYktwZHFPeEdXL0FKVlI2NnE1UGd5NzBZREE2N1RjSDdacVlUcjhVT2MyOHZIand3b2tRa0FvcUZncXcvci9ydjdDTld1TDd3NDdmCmpDVDNvM29WTVNIWW5neTVyODVqL2UyMHRzc2xZcFZ4Z21tcFA2ZGZOTnZ0Q1lGOVRvOXFqSUdHSUdzblFDQ2MyWnZKRzB6N290TVkKRittdGZuZmdWZEVIVDJvUExrZDk3elFzSnpDU201RFY1TnFiWHIvMUJnUjM3WlVOeVZoUXREUHNnOWd0YTZkNFdjY2x5Um9yWE5RdQptaGV3RHd3NzU1ZmRabkJReW1qbkdRMmF2ZUZGRTA0SHJYZlFacWNOcGJtTFdpcVpSMldiUEY5YUZEUWlvZVhJZXp5bldFVlVyeUtkCmExblpBVy94c1RJd282U0lPcmkwYU5TQnBXVjlCNFJKODlTWDVEUEVRYlAzdGprTUdvNFlHNy9uN0ZESCtJVGF3M1puMUxTQ2JVSVQKSTQrdWxUZVJVL2MrL3V3dmVrMU04Y2w3WUJNZWJ5RnJNQmtmY3g0YXZLcG1YZUNMbk42MjBoSHFFYkRDcUJKMWZMTFNlRXVpOXZENQo4Y3BOMlZyTDIxclZ3ODZ6OC9pSHg0LzZ2VkhRQU5Qd0F3eExxelBtZG5jUDZ2N3dHUHZ3ckdkekdFNys5ckk1dVVpcHd2bEYxKzlTCkU2M2o0VFppVzFUdCthdXpjZm9BZHZqZDRYUkJsQ2QvS3djVHl4bCtlTmdER2U1RlFkVHd3L1BUc20wbDBMaW9ndDhvTk9lN2FTdlQKMUFHak4wWHJWSkhYL1YvKzJtbFBFSDRFN2JKMGZ1TElXUjdZUWZOdVFUREh1RWFPVWhaVjhRZW9pc2NjOEdVSTN3RUdweHk0NEpRWApjWERLVk5GblRucytqclhuWkY2cDc3eGVIMGU1VUJITDlucy8yUENXL1RpOFJVd1VmVFlSWTFNbC9BV1hUR1UyWWVFbGZMSVlxekhLCmxsM0txZkZpczFsbHkxVGpsY00zUHlDcHFQWDZJV0NwMXVsUlFCSnFHS3haTFJHYnJxMTd3Zmg1NytmK2FZUFFOYnRkM2hHR2swYXoKcVFvZ2lXQ0hmVFZCd3p5OGkwc04zM1F1VG9FamI4YWx4R1N4QVp3Y0I4TVNxUmtzTGduN1dSQlRkNmVWd01ueVRIWkUwWDIvcXlHagp2K21mUHVtZDlXdkI0TGFFMGZONmR0b1puVGN4OUd4Uzd0dTlJaTUrOGVyOFRlTVVOOHYrMlZuRG1yUGRQajYzK0Rrb3djUEo0clBZClBvNzhjbGpDYmtNYnMxK2dUaUd0L1ZpZTN2c0JSRi8vM3RNKzdPZmxUNHZaaWF3dmlUTmptdlpVQjRhamJxTnRtNkJKd2tPNlpMU3cKbWlzZjdMRlY2bHkweitIbmJxOXlweTdhbFpIYk1BVmZZOWJZWDF3TVhMRUZZd0psWE90dW5JV2NPZEpRTG5JUlpzWGNVckhQVGVUegpTblhPWVRFM3VuQ09xMVp5MU9jQXYwSXRMamtJeldkNmJpOXQyWGpHM29YSkJ4SzFYVHQ5VnpzY2RON1NZMzRMQmdHeDlPS2RZYnFoCjFnVFg1aGVLbWJZQVZUK3lIUzVBTmxGc2F0Q3BGQjFXRm91MGRqbnN2T3JOT096TUZMbW56cm0wQ0NNVjdKOTFKczMyczJYNDBFcXUKeWlKMWJEaW1xZTRPR3VmZXpqZXZSS3Zmd3lSdGVGcGRRQXVXOUZ2aXFiMzBaTSt4TTBzUDJvMytBSlgzNXJUZVBWbndESlFGenNKRwo4YXd6UzEyNEUvNml1VUN0dm1vc25IeXVqQXU5RXNuY1VrUDB0VEN1cGVYZUxxWngyTHJvdHQ3TmwwcTJUS3MzYVFpYkxET0NzMTUwClZwOURINHhUdDNteG5BK3UzSUsrMHc1Vzl0QU50a2p1WXFraEoveFlPbk9wdUpYVFlXRlVxUU5UZm9TWllseFA4R21sZVhzMGlIaFUKRjhkbDBZSU5la21aMXFCL3NhUUlLbXNkVUYrV0ZCdEVtVHFXTllvR2c5UG1ZTGhnSE1kVmpMQzlWQ2c4aWtoYVZqYmFZeXJvUmFFYgpGUXI3YmxRb0czVmoxaW82NjQwYTdlNWlrV2ZMWEF6TytyMUY4ZzZMRFM5UGVUMm1zOFpvQ0lSNk44dk1VUnlDS29ySzY4SWl2ZkpWCk0xaHQ1eFRDRXdnb3RNUEZzd2JMd1hiVFc0eXJLeEJiMDN2YVpvLy9zREY4M1lSRFFMbUFTMWlvSEtIUGlIUDRSeGJmaVlManBiSloKY3Y3WGk4YlkvUTNxMnF4U2cwbmRudXhIczBxK21uRUttRlhPN1lMQndUWnJmb1Z5MWltMnVHUzNzMEJrUUFGMC9qWEhEdEp6Q3ZZdgpXZ3VrQ2hVWUxoaHhLdEMrWEdnVFdDQjVvZnBpTlFOT2RNUGxld1NWT3J2c3RSYk1FbHZHV1NONHBpelpHS2hPczlkalcvdnMwelNWClduWTBhSjFINnRMZDd4dkhqWnE5NUFpbjNIYnRYM2VQZjN6Mi9GK2YxdDdLSlllemM5RG1JcFZ2bGc0SlpmQjQ1ZjA0YzdyRDE2ZGEKNSs4V0hOdWpnbjM3SnZmMDJmb0JGNDlPMTdFdFJnZEw2UFBPcjJYM2VUbkFwR1JUMXBqajV0dnlLWnlkT2hmZDhzRzRIZU1LaC9WTwo3MDEzT0lKRjVmMyszT3NudlRjMXZNVTIzbDF2Vko4dzIxN2d4VHMzYmphbjJ2UERSODZhaFZwRC8ySmtUVkRqSnNKditxZTFaL2FuCnlPYVZaZU5HdUxoVU1NdmYyKzh3cFErT0Q1NDh5ZlZoaVRNQ2YxUi9lZmJIZjM3MjVZOWZmWEsvK2ZMemI5SS9QcXZ2ZnoxNGZQNzYKaTFlOTMzM3o2SGVmMy8za29OTnNEUDlndnYvclEvUDdMNzcrL3ZHZm42cS9mSEgwcjArZWZqMjRiR1dQSHNxbitSMmgxTytUWkhqNAo4K0dyejVNL2ZIMy8zNDAvZmYzbDV4ZkRyNGQvay9mMjdueDkvK2gzQXk3MHpXai8xVi8vZnZUMWw2bzhQdWg4OWVmV1lhUHh5YXVwCnBvN2EvNEQyc3NOSGQ3N0kvdnZ4NlBEbm4vYlZmOWMvZjNEZVB4ckM0STVlZi9abjgvdkxSNGZxRHovdS85ejk1TWU5TzRkbnlUZW4KTTVIOUlTdk9zaC8rL3M5L1BmanVvUEhEL0ViamNsLzg5UFdYYng3OTlQVVh3OGI1WjRlZjM3bDhkUGR4KzJ6dkRqSHIwZitjUExzOApQUHZweDJ5LyszWDM1UmRuKzY5SEI2K3oveFpqN1BpZlB4NjJ4TkYvdnY3eUw1LzhhUEZBbDRjSC8zNzE3ejU4K3VOL0RwKzBuL3h1CnY1Ny8vSWNIeC9YZjkyd2ZYamJibDN0M2lwL3ZmdFo2Mk5KL3YzdndXcDNjLy9MQm5mU1BuKzEvKy9uL2ZQYjF3U2ZmUHpvb0wvLzAKNXgrKytmM3IrNjFXOHcxKzZuejI4T3pvdFcxWkpQZWEyYUR6aC8vNW92UHZiOXI3M1R0LythUSsrT3hmbHcrT2p2LzRIK3ovcDEvZgovK1oxdW5mSDNQL2hwNjhmOUZxZm5ILzIxZFA3OTdMemYzM1Z5Yko3dzdQMHdhRDFSSHoyNWd2aE1iWU92eG4rQUd6TFBpbXpIOU9rCi9VWG40RjRUeGxjOC9lcHUvZk55djVzOVA3Y1UvT1BvenRjSFQ3NzgvWThQUHkvMEVNYmx5VC9ONy8rY0hmVC8vZG1YUDdULytZVTgKL2YxUGhQYlB2VHRBMEovTm4zNlBRL0pQODZQNWV3LzU5T2Y5TjUrYXVwdWFQN1NQRXZIVDc1OGUzbXQrK2NkSHYvdnN2d2ZZaXNFZgovazFZcU1qZW5lVDAvejVSOVBtelB6LzYwbjM2OHNlSGY3UEZEejUvK0Q4V21meUhmQUpUOTJYeTJaLy8vUEJ6ZWZpWFYxODVQRDkrCjllWDk5cy9mL3B0RzBuY1k4RDNiMTY0VktMVC9qZS9BVDZFRDR1NVhMN0JRcVFpbWY3ZC9lRUtzUGl5SGYxSG12ODNQclFmZkhmNzgKMmVIWnZiLzk1Mkd6K2NrZjlzM3A5Mzh2bnQ5NStmMkRad2Y3encvUGpqdi8rZm8vUDMzeGF1L08vMi92eTdmVFozSUZuNEIzQ1BzTwp0dG1Yc0dNZ1FCSUlFQ0FKTzRFRXdrNzM5UHh4bjMycXlydnhDbngzenAwejV6djlhNEtOVktXU1ZKSktLdVdDdmRhUUltWS9QT3NYCmg3aTdrd3Qyc3k5azRmZDltUC81RGZzVDMzL1dCWm4vZHVHQWdLbFJKTktjYlRsODBiZjlYelg3VW5OVnlZSnpWcVZvd3hDYTRuMncKK3FlZHIrRk9kOFo3YWtLcGNIU2NTYlJPcG16cjZYUytuSnFJc2p3Nk1BdlJQUmdaVUc5QWNsN3lKNE8xMko5WkY4UW9tUzVnNUdjbQpnRmdnT1VxU0JjQWRMbzg3dDQwTnhHc2xwQ3gvWVptRm9EZ252VHllRVpYQVhQaDBlcXFWc3NNbkhIRk0wcjFMakVqSGQ5V1h4Wkt0ClB1RzBESkxVUUlUa0NKK2JzVG5wc08yYytXVzR1U3E2YXo2UzQxUWdBTDB0MURCdnhSbmswQXdRcWo4Ym1KclptVjhzaThkSVl0cHUKWmlOOTRsMjhCcS9sZFVjQTIxUXFlajJUbU5TU3hGYnphdDVnemJicU16ZlFNS2xZSVZmcnJhUkdpOTdrdlZmcVJiNkIwQlFKakNnRgo2NWVjYzNvbG5hL3JCRmtJOVFsM3FqVHlHcXpjdk1Dc3B0OWtzUkNLNU1MZWx3NVNPRDY4M1BFZ3BBWC9hT2ZLL1o1bWY3bjFwclBOCnRwWmRDd0JSZGJNQWRrWFA5cGtnYmQ3SVI3YjV2YlNEbjMzWmNtRjNiVWxwUzJmaDIxNE9nOUZ1bDVRV0xIYTZaUT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJUm9VREJOV3ZWb0RNTEI2N1VNR1BDcFBnOGozYnRrNlB3dmRzMldicll4MzlYWHVUU0tOeEd3SEF3ajNmUG1ISjNNcXgreUdUSmR6QgowKzM5cG12TXB3bllTM2pLR3NjbTU2TGpjZi9PN1RTaXA0Q1RIYWZJQWd4di9uYnhQRHB5SnlySGI2Q3hwK1pRRGordlA3SnZvNmM4Ci9UU1dIV1dTNWJ3UHZETHFBQzFRcytYdy9ubVlmVHUzZ3R4VDlETFFZK0NMdjh4aEdyZFJxOFdYVDM4dm1YN0pieUxONzRVRG53emEKMllETmFDbENuczdqcFh3dEF6K2xzS2NTL29qTkovRTA3bkhrMCt4M0tlNFhCaXYzSnZvVy9wbURxakNQZm9qK0RML1ZpQVo4K2tqOQpta0dRaDkvbEtHRFpwSmVNaEx5RkpqSHM3NHJ3bFNSNkdmNVpNRmpaNGVYZ1M4OGNIQW9MeENjRWtXRUhuMkova1VDdndORzhvaUd4CjA4MmlnUmlzYUpyVWhPR2dJcS9sZWd0K2wwREFPQ3dJaEpoRXpKREZTTkdmTEx3M0dndjdhL1NiQkh5T3BwSG1TSWxlUjhPanFMaFoKSkJvc0NkNFFQVmtzU2RIU2dkVVhMcFRFMGw2eEVLSmxvTEZRdjRIRTRtQ2phU0E2Q2NueGlHYkYvWW1Bc1poTEVtUElTTTRscGI0awoxSkRSSnhZaWhWVDRKOFVXUVBQTE1ZWXNXOENYYSt5c09GYVJKQlo2QURqNWtsaVAxRnlSNUREa2VPVG1ERjkra1NLcVNGSlpBajVTCkZCTk5FOUVrTGdTUkZvNG16MkttZUZxRUZMM01TUjNnWkc2MUJLdWE0cmdXdlE0cGtaVVFsUVE3d2xkV2VWQk1paDdRc28vQTZpZTEKTXI4Z2tpTXFJc2cwajBrcFFEUTFWalQxc1NHMUpLd01VZG9TamJFWmp1TE9GL1NKSWorY0JobzgvS2N2TlAxYzJWYW51aUV6OW5rTApXUHJmQkgvRGlHVTNZSzljMU1oUnZSY25qUzRmMk1YZ3ZLTE1idSsxQU11bHNNcThtOXVML005Z21DbE9WM3NidFpYeHpJblE2VlhlCm5lR2JIZTUzNU00QVgwem8wS0NCRmhaZVo1b3kvVjRyems5dWp4TjRXNWc1MDdFN1l2bmx1ZGt2Vkt2N0hIOUN1ZUU4Mjl3VVhqSnYKZzhNRVdMRHJ6Qjh1eE9KR3ZrUDhHVnNQazk0UnVSVS85WnVjSDhBSjdleUtVMC9Mbnd0N0NDL1BiOFJ6azBWaDdpcVdPZHNLV2twUAo1eGhIR05vSys0eSs4RnczdmhFQlhGUG8yOGJXNVBhYk1zOHVBSFNENEdmZXJiL2UvTXpDY1FGTENWanJvZjR0em9rRzF3UmFTamM2Ckp4cGNFOXJxWXpuVUM2ZEd1Y3dDMzNldzRqeVU2TnAzS05OcjBMYXVhUHVvKzVSRFppeEhKdzdVLzF1ZUJYS2tHWCtxL0ZtbzVzSjIKZ01BNXlUVXlINjVjdy9wMVF1WXdWQlVSQ1RyeGZSSEU5cWx3MVZlby9FYkdITm1BWndFSlI1TS91eWxIT3V0YUsvdlNyZ0oyQjlKSgpNU2MzRURtbmdxSm5LaHgyc1FKUXlxM0RpdzlrL1J1c25QMS9PZEQ1UzZHMHNzNkJlRFdTTUtneEJaODhwOUxPTkluRjNJbmdzeEJzClRjWkpTZG9wRFZQS3ZxMHpidkRyeFI2Zk50TXZSS1p0ak5HZWFzczFCOFJhQlZXY2ZxSy9NdWVYbjhZNEdQQnd5S3orbHc5TTF3ZGsKUDdlcXU0RWo4dm9kWkFVa0RoMkRRVzVGUEJxNUJ5eXpZL0haM3hxRHkvUWs4SkhET1RKWi9QU3hVQ0xrNE10bEpvdWJNNUJLd2hyNwppMUtjNWJINFA2S1JhZTBwMTNqTmdOMmk5L2RNRC9UY3MyWWJ6MjhkNkdzekQ5NS9BelNOdHpZc3NqcFBYckhhenJjdUhWL21CeEZtCldpcEZ1TytOMldCbFdaTE1IQTdMZGpCZWYwOGpCQWtzblJoQjd5NlBmY2Z5RlI3c2wxMnVuQXVlY3hqdWFSK05nalg0R0dSamlhcVgKZmRBSzduMC9XZVNMRlQyWmcrbXBUTHFjbmlCUVYrL0F2L0hNTm1CM2FwTGswR2xjd3BrR01zbkpZSk41YjdodDhhWDc3UWRzZnJGZgp4T2M4N1h3UndDaDdDMDhIMTRqaXNVdU9NUlpUMUp1cy9BcUFhWk5lSXB5MW9SMFF4bUhVNURmQUJSMlZwWmMzRUNpOXdCWGNmdWQvCmpqOWhHRlh3ZmpTeHArSStMNEtvd2N2bmdXMFl3YzdOU0c4QW1DL1ZOWG9samtlTndPWW5uYjNYVTdiYXcyZlVNajVXbjJlRjJWL00Kd3pDZnd3VDg5RFJXeUpmTjFHYmszUnBUUGlvUVFFWFAzaDlEOGZuSU5xZnBWSDcxNTlhK0pnNkF2bTJRMldHd1VoaWYyOUd2NG5CZwovUUNEWHhneis5ekF3ZTVZUzVidmdOWU5XNnlBRXJFSzNITVd4WW0vL3lPMFlaREcva0MrTzcxZjF4YkFVb3E4MTNkdndyMmJlak9TCkRCVG54Y0hMWkFoc2t3UlVPTi9PNHRTTmZXYURqbGdEcUwvM0tHVUwwT2dENWt3eTNiWVZLbjgvSDdsUXArdkxObHl2aTJ5ejVRYWUKUmNsYStvcmtWdmpzd0RkVnFBM2wwVitvZk5SYzBOaG9vbGVBZGs2K1NRMCsyckpaM3NpaDJkWXJmQU42NWRaUmk2Znc1SEE2a0hIRAp5ajZ5SkJiV0ZlQ0ptQ254YlhsYlNpQU5nazIwZVN5NlhlRnYvdllHMTJvM3pBMHlIY3ZweEdLdWdTVmVHTU9uR3RrRW5CeHErYnlDClIzWWpWdmtvSldrUTdQNktJclQxMysvditJKzlVUWNtblNkTEZucGxsOVRVQk8rRjNBWnI0bXY3OGFuMFVzY1ZlWjRtWGtTdkpPWUQKNXdyRjBlTFBpOFJQMGJQdDQwQXpodkRzVzRqOEt2MmRYSGI0M2krallTNjR5SHdFZTBsOVNSa3k2WEMzbEgvT2Q5SWkzcUJQTHc3RwpEMkEyNzV0Z2tUTjdublZJZzhKOGdMenZPNE1WSFlCSXJJRVB5R2MxSEg0azkrVmtZVjBMY1VZd3ZZZ0RzN0h3L1RiYTVuOU1saEJnCjdPQkxkcE9xYktWNENLNExaTHFYN1hRWHEzLzc4ZXhMdkZqTkpISTd2dVZOanl6cHlCeThzVFBVeVpsczVHdjJYUGlPamZ6Ri92eGsKRTlFejludXd0OEMrUCtobHQ4c1hGNkNZa0ZsWWN3bjkrY2tOSGd3cVhlRnhTZW94SEpCaWtOZ3FXMnhsSTdFbU1odUhoZS9HRWV6SQpsS3FnUjFzMmsvbnMxNExNWnhiTnN1VVJyMlJqL2xWVytwV3M2emZUYVZYR1pMSnc0bzBHYUdLektSTi9ueTh5MGQxaGlPS1NsMWlBClErZENhd1c0NkhXcGRhYVVtU2VFa2l5dDYzL3VWS1JVQnZ2THZwL29zUXNWQUlxeWVJUmgrZ2Jnamw5YnB2UGRPdk5ncDhKUDU0S3YKT2ZObTRzKy9LNTV4RHY1cGhVM2tKazhmdmJEaXVzOUM3elgzQjNZL0FmbnRhLzl5UGhneHBKNEgrZVFvdjV3TDVjSHhXUEJNeUdMUwphYkcyQVMvMjlybS9sMVRva2w4YUpyQjlyZnJRVWtyZ0RxRG5nbFpncXJYOGhlL1dBVGg3MlBjZlR3SXJ4NjlSeVVvYXE1bURlWEFxCmZHOFBQZ21HallGZGMrR0VaenRkTXYrZERuRGlRL3N2MERpSXdFQXNaV0tSbHU3dkQwYUVWc3RDS1dXZEF4TWpGcVppc05OTy84aUMKVFpDT3l1d2RPcGVmVUVkMEMvUGtBTG9LWnpmbkFES25QQUdYd3hrTkhSTHZ3Q29xL1daZjhGd0F1Tm5wVlNhWjJwbjVzc2lZUWVEVAp6TStqSW5iMDlNT3BkckNZRFhtckRhZ284RXNzNkNVMDBBRkp0Q1QzSkJOWjJ4U25vUTNBN1BVNUpZaGx6MGJlNmlSWWc5NXJkcHY5CmRraGpBWlN2UnVWQU9JRDFoQzNpZFhjQTdLUXRtMUdUcEFyWW5sb1hPY1puZysvWUNRaHhhNVBGaURUWkFFdzF3b3JUM2lGVXlKUjMKZStabHp4WWFkR0dLa1VxOXpCb2RITkxXaGZ2eHFmL0VvdzdZZGI1eTYwakdnbHdKK2lBekRBOFhJcTR6MUJmTnVQYzdlV0JueWc5QgoxTXRPTExkZTcwWWlCNTdqTWQ2MlBTbE9zS1NkYjhIVEVNUFVnK3g2UEllbkVtWjRXSU5sbTl2YXFlQjUyYzhZUzJsMVprZk4zMThRCkZsdHhhZ3AvQVUvR2VDQ0wwV1paYkd6c3k4MGFjcFFUMzM4MkczRGJmOE9jTFNSaEFkU0J4aTc2MEdJRExBbzJSZUs5Nkg2eHV3RUIKQjE2bDkxSjFJSVpWQzhCTStxUXdHNndzN3ZkTWNrMDYrVGE0R05pYnZOeEJFZDdubjR1eEVkcFEzS2xqUDhZcFI2QXQ0WlFlSFExbgpEM29vei80ZmN6eEpHN1RNUytSdzdROERIUmxlWnlMZFJURWJMUjFQOE9qYlN6cWV2SjA4M3Y0N0p1WngyeCtZYzlQSng1emEveUVyCkV1cms5SFF1MUpibmJIU3lXL0MyQktSdys0MXhHZGg2V3l6eGZaNGZ4S3AzNnlyNGViOWdENFlSMHhpczRUMGVld1AyOWh0SlpoYUEKeWQvT3JaazYvNGFSMDR2b0FQMkFPbUNmZHdMWUk4bDY5czJUQWV1eWNHMzRXQkJ6RnFkbjB6QWI5ZnBNMENBTWk5Z0xiRWViZVM2NAptczNDbmZaWEp4cEo1OHY1NWNmTUJEMHNVeWJaQ0F3SzFXclN4QjRXaTM4RzdERnliQ3RtRWw5dFlIWkdHbTZNOE95blFNdjNWMkRQCi9kNWxtK3ZRdTBBSmo3dVpvN05yS2xTZkFvRHR6Ym1kbEVKbFR1MWYrNUhXOEx3eFdNR2IrY2ZDSWhRMkpUM256NTl3YXU4cUFpL0kKdFNlVDVKVG1SbFkvc2FxSjBVbTBIanZTVHNXcnpmMllpWmdLS0hjQURPUXJIM21iYlpQQUd0OVpCbDR1dUJtZnphYXRPREYydmViVwpYcnhWNnZhN0c3QXVweHdYemFOZWVSNU16dVRvNjd5RTJSWjI1QnQ1TjU1V0VDMEVmN0V4ZUxNMHRScmZmdTg3V1BpMkk3dVpMSTZzCmJoTkFIQkIvYUEvazVWZ0l3SGFBOFRvNEF3TDJyRUN0TmM3Y1U0ckgzck90ZHFURjBTNjJ5dnpXd016LzNnVWhTMGpsMFR2WW9uYlkKTVlzbG4zZThtQ2dpVnM2ZWJCVmNQLzVwMHRPcjVySlJUd1hDcy8yQXVTQlpaUTBpT2NvemkwTmJlRVZnVE9XbTJaZHFHUjZYTG5xUQpEb1JnU0EwVDJCem1ING54Ky9ZWGVLLys0cStWTE1hMlA4VkJkOWtHQ3NmYmszaDlGRzYvZlB6U0dxWkdmc3JDSnAybnhMWTREVHRECnViclQrUlBaVkJwdTZJbUxvOUVOc08vWFNUdGdaMHUvNk8xRkY3bmdlOERMVy8yZmdXZVJiUldPcnZDK09rNC9BdC9ZQVp5ckpDN0UKeDBKeFBRSjVtY1JYajRXdm41Nlp4MmdzSE9UV2d6M25UdzVFb0pGZlptYmVRbVdkZnhkdCtSalIrRFNUam1vdUN0Ymx0ZS9aOHVZdgppSU9IV2Mzd0EvM1BVSEhTS29ZNHpTakEzSWVHUTNtR0F0Wk1oS1FmUXpFVjZDTUhzSmt3NWhJdmprZS9udXdtYlh3bFI0NHZBZ3JEClorSEorSTF4dzJOZ0R3ZUp5a3U1R1k1MzJ4TXdsemxKbTRpQTFXaHQ4WVF0d09vRE04OEpFSHp5WS9YaHVQbExVMnBSS0RaMEYrdnUKR0pBNnR3ZklVT3RZbktiS0FGVGJ0clBFMnNVUFMyenhEbnhrTUxJeWpNdjdCdG5XY25xQ1kveXZGSnVDSjh4N0s2Q3J3elJrK1RrKwpLdXYxR1NXNGJ3OFB2QWFlT3F2WlpMS1NOVitqTHAwUURGTUxYd3ZrRUYyQlU5aitlME5kRGl2K3NXUnlzdlpyNTZXU09Sbk1UUDArCmowcXdpQi9RSkQvZVVhWDhQL09qSWh5Q2dvTXlUQ3ViS1lDRExyNVkveWdWbUdpNTNFY3lBWjhaT0hXTEUzblkvbVVQcDM5dkQ2dWMKU3ZFajgwUFlneWZQWmEvVE54VEpaN015djJzZGZ2N2dkU01LNmVjc1VjZUxlWVZmZWlFL0RlYW1lNjJ2OG1lcE5JVG1mTUVickJJOQpHRm9BTW1vZFJKTXJlM0MwbG9DQkhzYUgrY05wT1grZ0t4a2Z3TkpBSGpvKy9IczUzendjeC8rQ1FqYmVQUENGRWZMTHcvZ0l2K1p5ClpKbjdRSHdQN1NNQ0NmNFZBdnZQOXZ5d0E5ejlBS1JzVHJFcVFrMkJXOERlNUQ4Q1JKNEhnSXo5NlFhTS8rRzBoU0NtODRjZlZFNDkKZmxpUC93T3ZLUm52ZG9CdEtRaytucWRMT0x6S3BvQ3E4RGd3RkxZTklORVpqRzc3emFIL09UNmNOeXZZTk5pbnJHSVlzUUdncDRlZgpuWEk1QUVON0VvajQrM3dDTDJCVFgxYXFLOFlQVTE2dDlDcGJlcTQrQktTb2N2d1NJRm1OMERvQWFySlhpMGkvR0VRMG9JdVF0WEpmCmphdFpWVUQvZGhwdlpyQnppVUxsQmdPMnZ0MXNwNmdMakx3T1ZzSkY3UURnTVdCY1doSENuVU9ERGhUbzRPejBzSjJNVDdYeGYrWU0KZ1lPYVJzMVRaOVVmNXJvcmdwRFpOVmd0eUUyMkFvdHhzNVB0dnpUc0dJZ0Y1QlNvUHBYTjF5UGE1SVdpZEg2N21hSGl5OG9NVVB6bgorNGVwTWRDdzA4ZzNkRkhlb29VRUUzTkhXQWZCdUNYU1gvekNxZ0wyaWoycXFFQ3lLNHpZVU5IUUlVWjE0VGtTY05NSUtoSU9zcWs4CnA4a1ZUWXAzM2ZmNXJieWlMc1pBR1lQZGhMNTNraE5kamVoNHYzN1dla2tCODF1NlhmcC91Qi9xRXlSdEtwRm1SQT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJV0RBbU50RVVyUm5xNWdXNEN0eTlPakkvVUxwTVVrbEdSRVlaeDF1S2xoeEVNejdOVzh2ejMyUXovbGxyTU0xb3dXbnhMZ3BUMzhxQQpLWUtJME9KVk94TWh0Zm1BdCtlOGE3TVVkNkMzOHdTdTZIWnpha0lPMG1iRlNzbWlWR0VvMzlJRDBFWDNjMmsxemJsU1JPV3BJeTRUCnpWM24zc3ZUa0hwRS9XSUQxcklSaXJTYVdEL3BrMFBXa0FjK0szaUIwczE1MXAwVVZhL0J1NitnNFl2dWh0Nk54ZTRhZmNNV3hSb24KbHZFU2wwNXVndTFOSit5Z0JzZEpkVmFEdHhReHp3eG8vUHh2Skl2RzNLblFLT0pPZHlaK3pPK3VlOTNwNVNrQVB4SEJaQ01lWUI4MAoyRS9vUVNLUWJwMXloZTlZYVZVMk54L0g4T3dxeFQ0bDNJL044TkxvREpRZmpWNi92V213R3QycFZkTG9mTzdIako3bEQzZzArdllaCjNlZjRtOUZUN3hhTVhxeE9ZUDdIbmdPaER4bnp6a2J3U0J6cllIQ0ZWVEQ5TWtvRmN0RkFOTndQLy9WUjRnWUtpSEJQc2ZKd25qZFkKRDRmVTR5VHIyVDAvWmFxeFl5cGFUcjc3eUcwLzJDa2VQdnRZb1UvMld1Umo5bkdLdTdLUkRZMGxZR200ODE1WEUrQ3JoZVdtUzAzSQpGNmpGTElCaUZ5L1Zqb2RENHRnQ1NEd1Z6Qjk4bzZiQmpld1lKVThkWXJCZDJiQ1pEVWVZWHppd2h5L3NtQVN3bzJkM3FtUzBvWW1qCmRTbXNmUDVqdEJTTTdoTy80TS9TR3Z5NlZ4QWkvVHg4MVQ4YjBraExrVUVvWGhuNEpKRU9MTTgxZzFXRWxrTWEvcW1Xck5KSWswYkgKNFloYkQ5SklYL0hQb0ltSXV6aWtCaXVIOW1qMzFMMHlTRU5MeDlqZUswb2pEVG8vM1VsaUlUMVRFemtJR3F6bTltNWRrNW9yUnVhcQpHUm1rWWJObGMzQSt5aUR0RFREeSsvbU5RNHFLTEZtMEpXUFNoajhOVzVKSVMyV2lKVXRlb3A5cWpSQlN3SXVUb25CTjN3RW5mNTVUCk5ZaldlYm1xamw3Z1k0MDdBZExnOW9LVmFsaU9SdnBxdDR1UWhrSi93eDJIbE9Oa0N1M3c4TFhjdEdTUVpzYmhDR25CSlpFTzBxT20KSE5LeXdXb0pPQktmMG5OTkdyK081dVc4S1kyMGtYZW05cGEvbWhSU2QySWRUM0ZJd2JvSVdjbVY3bWRlcEpFR2V6Mk1qR0hQa2toTgo1Q0ppYWY0UkwxSklEVmFNL1BvaVplWWFObHRYbTNwZUR1a1lLM2xHSFdta0pTeHJuenNpUFlUVVlCVVQrR1QycEdta1BhOURST0QwCmMvQ1JKbS94YzBVS2tQYVRXQzNpeFNGU2x3aXB3WG8wbGVmYmNIUHNKUURheUU3TXY3V1AvbGdHYWRnY1djM0lnUnpTQWxaM2ZjVVEKVXNoam9ybFc5dkhNNytHNUtZbjBMV0VQeUNLdHp0OENtQlJTcVBtREgxN3NiZWcwU2MzMWFLcVc1ODhmZmFkREVtbkh2bG5JSW4xYgpOa1lUaE5SZ3ZaenJSd25yVkhkSmFhUzFnTFZOWnBLUDBraDNUeVlwcEVBblE3U2RZY2wwa2lId3h3djJucTRXcEpIV1U4WGhvUEgxCkpZbjA2MlZWUVVqaC9uSTUxOTllYUViS0lQMk1ZbC9IdFZjYTZmUHY3dThsRmcySWtNSlVBb2gyV1BGdVpBbDhzTDY1alRKSWUyMnMKK1BQM0pJazArdXcxR1ROZlhxREhBTnI0WGl3MDUyRmtTQ09kQkp3aW9YSDJhMk1YUWtyWVU0NnljS1kxYk9TS1p5RlNENGNVWUlGbwpBZGpmUGFQMEh3OWlwTWV0N1pGR2VrcTdSVE0xZm80L25CVFNYQSt2Q0JXaDUzQnNwNHdBQzBEcnU5UktGUythSzBDYVAxMm93cklwClRDRk40MVd2U0JGNmRzRm5hcWNKV09MNUtrSUtzZEJvTFlmRGVMS0JTREVSMHNNaE85OHkvUHRrRkNFOWhuN2o5RTZUampkOEl2S2EKdHZOUnkwRGJEL1B4TUN3Y1ZMbHRHMnpqc2s5N0RmeXZJL2QwaVpWSDFqUDM5RUx6QTlWYnNNbjhHcXlCeloxbnh2VTdqNGllaHFQNApzRVUvUGE2aUYxSVozaXhOWGFubmxGSjhyY1EvWlo5R0NWZHpKUDkwT1I3WVdZcGRQczhTdHY1VTltbk52VWtUOGs4bkw5OEo3cW1JClltSHppMms2S2N2OE9scTJsWlB0SS9YMDI3NlBpWDdiZHY4d3h1azNib3BmVUt3OWVYcmJTRDJudEZ6QnZUcklQbjIzVHZ4RythZWYKaGZnalF6R0o1eVBySUdLUmZmcDdldDJWWlordU9rU3V3VDI5b05qZmlrd041SDROaHRSSWhHU2ZQaEhCVkZlZVl0YnBadkpXay91MQp6V2lyZkxwa254YXo5Y2xjOXVrVGtUYmg4aFRMR2dtTE15N3pORlRHaW84dVpzNXhSMEwwMU4xcUhOUDAwN3d2S1piS2NtdFVjbVc1CjU4RmowTk1VZW1CNWJHYi95TlA2WjJSZHc2YzcyaDBsaHlGSzllUzJ4MmZxazBDUEVTY0w5RER6UnU5VHJBYzh6TjhXL01jSHZ5T04KbmtJekQvOTVSLzRiNjcxUk9vTEdOMjdtR00xM01CSDJ4MWN2cmMrQm55T3d4MUxtZ0IzODhPa1B5UWIwZEhnUzRhOUhOM2JneDNiUApRTFdhYkFEZmQ1TEZaL2IvUEU2Y1FEdVppb2Z6eU9jVnFOdUR5V0RsMENKUFJ3WnAyQXo5bkE5cHBNRmVYeFlwMkVSK2NaRTl4cDhyCjhuUmtrY0l0YnlxSGRNWkhHbndEUGpJUGJmUTU5OFpET3JQWnpCeFNaUDJ6U0FNaThrTHJuNTFwYVMxQTZ1d2g3NVdQVmtEZ1IwSVcKS2JMK1paQUNmeEJZL3dNT0taaUxZSzVmc2tnQmdZOUJlYVRRK3BkRmFyQkMrMzhwUGRlazBhZUV0R2FYUllwc0NnNHBsSDBCV21oVAp0QVNyT284eDZORW5laUdjK2Y3c1Q4dDdnL1BmaGkvN01tK0d6ZnRCc2Z1aStsNW9TZk1kclMxeVlNNmZXVnBiWG9qdXlQRUhxZFBrCkJXaFM1UGxBS3hmYlcwWWs4VEMxMGNQOWs5bzVaaTNhV1ljNmlmTDNVenRuY3NkQ2RDQVFxVmpaOG90R2tZcVZQZ3BBY1kyTEVIT0EKVTAwMCtsVFJTdi9qcVc5cEJNZ0VaaEN3dGlVWUQ1amM0NDU2U1JSOUFtb3Y1MS9PQzFiMm55YmZZcVpqWmkvc3l3V0lwY1NmN3VncApUY2VVd0pEYnIrQUxHelJvenk2R09wVGRUcXRqM2d4ZWJVSUNzaEUzTUdEc0tXUzFvbjhnUTc0THZTU3BRYTFpRmRHZytFTWFudTJBCmRlc2V3cDdHZUhFMFVUZ1FrUnhveTY5enJxcEdkUGdQUFhqS21aZVluOTBvT3orRGxac2gra2QyQlpuMWV6T3ByNStablorTDVqR3AKR1VManRhMUFMTzNydDBYOFNYa1dHb21sQUF4MzVYNUpXVkFHTGV6T0VDdmgxY1ZaSEY4SmRtU0tzMHFmZS8yVWw2UTdNRzc2TkNmZgpUSGtpMTQ4OUtkUGRJRThzb2VweFhxcWVRVkdvZWdLeXFzZWd4cnJGejhxQlQwQjJ5QUlDMmlqVkkwMjdBYnlLaGlHd3pIZzhSUS8xCkQwMDdmQ05OdTU3WEtLdTI1YVFTeGVNa3A5WXo2WjhhZnhkRGt3dWtPNjI2R3FsTFZSdDltaUE1a0lKYk5DditMc2FiMWZ6Vlo2TlgKLzBLTkZnR1d6bGJYaEtRMERPQWQ0TTUxZWJSbHhaRFA1eU9uRFF5dVc1QlpKczhPSDF2c1pUUUdLczUvSldFdytWMTZ1WFUvTXB6RAo0MlFVMUpFR2htc0ZKZ1VLMFoxM3l1TzZsTHN4cVZYdWxLVU83SlZqVS9lc3VKWm0zTlBHUGZDZkR6ZnZrT0tDTFlCbWRCU3JVc3NKCktNWmZVUGdQV0ZBdUVIM0pHMkIrckJhODVJMlhCanNrM3JqUVhFNGx5WkdsU3BPajNDUXoyUHpVOWw5WVlaZEx3bmw4ZGZmbGtzeEsKYWxhWVZ0V3ppaDROVnRtTlNZUE55TDBNckptUGsreTJaTERxV2Q4U3BFbFp2L1VrSmZ1emtsQlBTeENydnVVMlhvVWhuZEpQc252bApTNU1lanhhVERneEozcUJqbHM1ZzFiYUN3TXRYTkN6VWJIN0JDbTZzaW9hRmp2VXJ2ZjV4b0NoT3ZnSFkyMGJEdU9CVloxcUFDVGNVCnZlTmlUbmhwWUQxbEowYlBKUGxXM2MwVUd4N3VTREdoUnRNNXJwMHdEak9LSEM0YzExUHFlS1YxTERoL0FlTXBTem1EY2dhdDVBWk4KNUxwTG80b2U0eG5ZMGxKNVNwdnVKcFc1N3Q2aXoxR216bU12VnJJTWoweHFIRzJnSjY2Zk9qMlRUYXZ6d2RxV1l1cWtqdXkyckJwRwprRFlNeXlLbElDa3Y2c3VVT2lxN2VLS0IwSng4T1JRVkxhQnBJQ0xiOGpxYXFJZzlieUNVait5VzJhSVdaUmk2L3REaGsxT0hrc0lrCkl6YTNoL2c2VG55OGdEYjRWSUU4WDlTQlFDYW9BU3hCbzRJTkk2aytaQVNrb214MkdLeDZCbVcrVWdFSXRTVVV1YStUVlhsYjFxb0EKS3B3QzBPcnZ5OC9Qcm9Ia0JtMUVGOWdLNnZFTXNTWFB4ZnArSy9CUTcvMGVURlU0NGNXdlk0blRESUpjT0VuSFI4WW5CN3kvREdqbApUL3JFU29sWTJrVmMxdTFCWGhJZ2xrNFJGeENMRlhIMGk0QWx0dklMQmZ3SnprVW80cEpldDNwMENYQ3RTVnVFUkNtVzhDUU95WXBICm94U1NGVVZJL3A2RUZyeU1VNndla2dWVDR3a1N2ZnE2d3lSUE1DK2hyalc4d1hwSjRxRThuWVhiOGhYaERjQUhld0pOQ0dXcVhLeVcKOXJVUzdha3ljUitEVlNsSzkvY0VEM2Q3TjhWOUlGblVZMzBpVlNBVHI0SFVDV3ZpWko3ZUZFUWFkZ0pUT25NV205S0FEK1NEaWJSTwoxbUJNUXlwWHhhYTBIdHBSOWhnYWoxVjVQRnJqQzRGME8ySVhjUVRQRjlPMUVWWkZsdkIxOGhKdk9KV25wczduVlc3elkvZVhLNkxSCnU2cDQzNU9ia01HcXdPbUFkNFNiM2pVS0lOMjJoZ3dxYTY2Tk1FT1ZJTDFCdE5YSjJiS0FPcUtOVG0wZjR0dXkxRng0V3gwOHJMTHoKOHpmZ3JNQjNXcGhCVnVwNG5Kd0g0L0hwaTNsZnpybjdKclhiQ1U5Rk5SOUJBbUJ5OFZhcGFDdmxXY2pGV3lFd0hjSW43UzhCb1RGWQpiejZrUUt1bXZPVVpOTU1ST3BMNlJrT2ZpVk53YnBWQUNncnJUWEpRR0oyc0I0NytmWS8xOXlXQUNVNEk5VzJpd3ZOQk83SXVQQTZoCnhabEhhYXAzT1dISW8rUlRnMVZkRERWc054QVk0ZE45eGlkalJNQmNUcGNtVXZMTXovaGVzSXVKTmRweDVielFhTWVWK0FCUGcwYVQKakpEa0FXRXkrMXMxV3B2VGFJejNxc2VDRndOVDEyZ0dqU2RJRU5qMUdvMlZ5bEpuZXdlTkJsWk5TcVBwbG4wQVI3OUd1NGhkVUhCdQoxMmdReXUxbnJ3aU93bW1RSitkZ1QzSDhCcXVVTlNEWWhEcGJKUSthZjNRb2JhTUVQVTFodmlYd2VTNWk0L0M3V3c5Z21mM2wyNzZYClYwTWFMYk04a1BPWGs1UXdVeEY0ZldvV0FPc1lkU2xaZzFWV3pWNlovU0FVNWc3eXBRV2UrRFVHQ2xnMVVWS1RuSVpSaDZQTnRKZUYKZ3VJd0FNN3RLUkFJaW94RExUcDVWNGNqUEhUWEdGNldPRTFBd080UnE2YjJRakEvTjdRdWhMc2grTlo3aTMzUFk5S3hxWG04MmVQcgp2bXVOWnZGaUY3Szc0YnN1KzE0NUJndUIzVzdmZis2bDlrSzl1eGhjTmYwaHJjdGRETUs1eGI3blFXSDN3dXQzTVFSSHdyNlhnc0o2CnJ6Snd0TzZHeW5zaDBqQ2YrNXQzUThGZU9CU2ZFeU1zNE51N3BDTkIvU09aaDBYdmxZTGtLUzROUTlZV0dCNFVsb1JQU28rRzA3ZHUKOTVaWXRTak9ENERkS3QyOGNVbkl0bkt1dFFMRk5KbTd6RXBDTEhJZUVWaExueVk1VnpnOXpRTjZkdndLa1NzTjZYU2lJY2x5Qk1ydApVUlV2OGNhVTkza3Z0cVc4ejYvSnI5U3dNUkc1N2t3MlBVOCtjMDNHM3djakk3U1JVb053VFk3M3k3WUZ3R1RQYnRob2o5YUVlZ0FzCllFbFVhL2VJa0FDS1JmU1pHREk1aUhBbGh6NU5NVmdLbUl5dzl4U1RieW1PTUREeGUwMkQwc2dSRjhKRjc4aVU2SEw3V1NwVTMwaDYKRnZRYW9HcTU0OExvM1RTR1JrOW5VRFI2czRFQnJKc3JTbFhRVVRlMzNGNUR4OS9GTGl2b1JCVkRWOWZRS1ZmUUlaMThoeG82V2FTbwpnazYyV2xCbkRaMXlCUjIvV3ZDV0dqcmxDanFCMVhkRERaMXlCWjJnV3ZDR0dqcmxDanFGYWtGZE5YVEtGWFNvV3ZBT05YVEs3OUcxCjFUZlgwRjBJcnFDQ2p2VXNicXloVTY2Z1EvYVllZzJkSUNGWm9jTHMxVTVLV2R2eU9mRHlsVUNpWkJjTlE1S005QmJVRTdkZDJ1cWwKU0pHUGZIVXliRUZzL1VvRUI3UkdlajhLd3QxZTM5THh6dmdLNG9TTnErbVVjQW5ZVlZncnl1N3hEaTNGWVBQZmVVY3RpQ0k4NDFNQwpwcHlIcFcxK0tOYW5Wam1uZVg2aXlOV2x2R2dudWwvL2tHUXFIMVVpVjBwRGtpcVpnM1BSVlRTblNkY1VSYWtnWEc2UHZnS3FrNjVVCkVDcC9URElaUkgvWVdDNW9qRzRHdXpsZTFmT2FsYWRtMEZqc0pzeUUxQnNZUkp3TTF2eldpREZWN0NaM2JDUDBrZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJMUlyZDVQMVQ1UU1IbnJZc0tpYURDRnhUTlRla0tLcG1FRlFLYXdNbVRNSENMMDlzSnNSZXJmSlJtODRhazdxY1hpU1ZjbTd2SkNDZgpRcW1yeEJUVnZ0VTFWaDJxKy9hQVdGSm4yYXc5ZGhrNlV3c2NycUk3VVpnRS9MWXRtVFI3eFlsVlNkYnNrcTBDNDFsSzRqb3dWYk5MCmN4M2ZXUzBIWGtjZDMwU3Qvc1VzQ0ZySmw2YkpGOEVvbTlLWE9mRDJ4NlZaYmxBWnFSSk4rZlZUellIWG5FVXdLd2tqbUpMcnA3V08KTDNwUXE0bFJZZ1poZGpvRWRyY0swUU4zOGlGWG1hSUhtRHJIYTZlWU1NQjZJOFZVeTBTMVQ1TFRhRmRSVEJqNEpYTGRubGVZNkZRVwpKZFpMVkhKcHMyVXZZcjZYYmhZcjZrM3B1S1Z5dlp3SWhBeUFsVW00STB1QUdCRURIUDR6VXBUdXNnWm5qL1g0Vkp5OVJWbXpzeWNIClFKeWplQVVJdGF0UndEcXp0MnBvSzVXN2FvV0dtUHIrd3BnMDBtSUJTOXpVZ3d3R3haQTByRXFUY2VJdTJGNnBSczZnVXVhczRjZ1QKVFVqNXloUERoWHVsWUVmR2p4ZXAvSTdDU1FQSmVTY2pjcHo4VzlFWDNwRndsU2hMU2FWQTdrTHJ5RmRFblNSMzh5dnNzWXBXaWVmawpYZFllKzYzb0MrL0lsOW1KTTRpdXB0TlNKZEpnRUxrUzhpeWdNeUlqR0pLZ0hoa01pdEFUL2xBWWtsQ1kxWGN4QlRvRnRRNUpPVHRkCnZTaE9hVWppdXp0OG92Z3ZWWkowajRqTUU0ckkzSmlsQml4aGk0YUlESDNHcDFLZVk0bjdiTGRFWkhqKy90UHRFUmtBd0tHUTNhR2oKRE8yYWlNeEZ0ZUR0RVJsWWhpYUt5TWhWcEtyVjV3VjFSV1FrNC94UEdzcHp0Qlhud0JJOUlIRHFuS3d0ZlErMjZzQ0V4bktWTTVibAo4OGExR011QmROdHQxc0FNeWpXSnUrcDlNaG5ndXNRYjl2c0VkY0RVNGc2Vm5GNHRaV2hYSnJEejl4ZFlRQ1lmWGRKUlBuYVJ1aUJaCkxhaFdWNmM3YWZZeVF4WFYxV25NMTFPc3ErT1ZqaXBVQ3FzSFFhdUtsMVR4cEpkbld5cW02cjFlM2tVS3Y5TzQwVEUxNzNLSlNmZXAKaDROWTdwRlRwMXdQcC8vK3NXdnE0YVN5b0YvLzdsMFBkME9kaFk1Nk9LVU0xZnZWdzhHbzlZMFNxS0VlVHVKR1VOa2lydXZyNFFUWgpVTXh2N1BldWh4UGZPMHBWeE4yN0hrNzFsb0M3MU1NSlRxdzBwRnBlVnc4bjlzWGtqblZnSmR2dGxmVndnN3RiVGlRQUpjeUpsTE10CnRlUkVkcmFhY2lMVlpQKzRDdHhxQnVSUmdzVHQxZWdJamtkdDlUWEMwVkpISWd1RnNzY1FuRHRVY2wxa01pamt3S3RyTkZoY0p4OFEKdTh4MzV2V3lrY2w0dHU5ZEZ4blA5cjNLUW9pRVVEYmEwKzNjSW9aYzhSRXZxbkNyR0FKZ2l0ZktTT2t4V1RIczdiU0tvWUkxRHVtdAp6MStVWkxUNzNBYU00T2dUSDVsNlpBRG5Mb1dRQmIrMlhVd1ZqdnlWd0RLM2FjbWxXVjllQ2F4Nkc1b3dLaTI2cmRIcHVZeGh3ZUl6CjVZdWRWQjFxdGlJVk4xMmJJTUticzl6RndsZFZwSTVOUXcxRnBCb3JVc2VtaVphUWdVcXAzMTBxVWovMzk2bEloWER1VVpFSzY4VnUKcjBpRlVPNVJrUXJoYUxzR1d1UVNTK1gxSVFHUnZ6UlZkNUtSMDB1dnZsQU11emVMb2FnVVRscVAzYnNVRHVYeksyYjAzS01VVG5KZAo3bDRLZDMzY1VrZ3haZDlkaDE5NVF5a2MvdzRpVkF6M2o1VENTVVFWL29GU09PbjRtRWIvcktka0dQSlZBZi8rWktYQ3A2VnNycXFXCkcrR0Y5bGplcCtJV2FVMzBncUJDbWlLS0dnTElFSmo4elhZNmJaaUxTNGIxSGk3d3F0RjdHbzl3bEc3bkJhcGNhc3Zqc0tnWE40dnIKNmo1bHI4TVJidzVNZEZSaWUrRGtGM2FOODBqaG85Y0F0YmhNdlN4TDY4NTRXRERQemtVeVpza015RmJxdFpqeG4reEE4NU90ZEtTSAoyb1lYK3NWREpsc090NTd5T2Q4MG44LzVxN0FKd2R1TzJZNnNhK0dRNllpVHNCWkxxdW9NZWtsMGpkS0hmTjFadEJGLzViT1hzTmd0Ck1YMnA4NFBQUEtTaHBjdWFORzdsS3V5Q3ZhNVNzZHZNTDRzVUkxczVwUW83Njh0UGZTeUhkS1NBdE9TTjhaQ0thN0hpN2lNdkNpY3UKZGd0Mmx6VzJNNkdvQk16a1VDcDJ3MzBpcE1KK2ZJay91UXE3c05tOEQ1OC81WXJkUHBTcXp2NlVLK3kyclpZc1VsdHR2cHpKSVowcgo5K05yZE9XUkZwOC9TckxrdFd3Q2lhRWMwb2F3d2c2dEtoQllldGJvRTgzbmNZM3ZKYVRlbzZJS2dqZURuelZORUlQT1YrbzlldXVzCmhTVU0wV2ZHUzBxUjU3VjRRMVdLSFd0SXVSVmFzTzROTlJmQkdkR3JiWHVmMGg3MURGVngxRVMrajlWZXc1QjQ1MklLZzFKTFRsWEwKODZDODEzdDJrcE5xT3lKeHA0cUc2SkpTSnpsZFViaVBndVlVU1pWcVNIUW5wSTY4UHJVbWNvcDVmZHI1U2FXSm5PejhwUHErcVRVYgowVG8vOVY0RG1vbXUxbWRFZEpmYURmM2p0TXRMYVM3ZmlFZzIzVlZyQXpybFNPODExWFRYeFdIMFZ0TkorUUZNTDg3N1ZkTnB2Qi9tCnhtbzZxWmlnV0Y1dXI2YVRxcVc3dHZKUnZwcE9LaFl2bldsL1N6V2RnQ3kwekVyZVAzWlROWjBVS0pVYlFxNm9wcnR5UjlaWlRTZDEKVHNQdWxYZXJwcE9xcGVQNysvZXBwcE9xcGRPWTI2T2ptazRxMXM1MFlMOWZOWjNVNnFKSTcxMnI2YVNNRzM3dTZIMnE2YVJxNldSdQptNytobXU1eVNFdXp2S1YwYlRXZGxIRnFzTjY3bWs1cS9TU3lvVzZzcGhPRFV1MHBmRlUxblp4dGVkOXFPdTBVdTZXYVRnUktmQ1orCnAycTZxeWltdTVwT3NjYnFidFYwMHJYVjk2Nm1rd0lBc055NW1rN3F0RVNVQTMrSGFqb3A5U0QwWHU5UlRhZHlNbktuYWpyMS9lVWUKMVhSU3hPQ3M4WHRWMDZsVmN0Mm5tazZxbGs2Mkg5L3REcUNYY3dBRi9jVjBYZDBrMzhYcnNrbWx1RGVIeHNLbnZZcXdDNGdmM01yMQpzcm0rWDkzRmtFN3dsT2ZlL2Vya3JRdHRkRHE1N2Jyb3hGRkprQWtKYXpKVkRRdU5MQ0FvVUpDcGVwWWJsR2hJV2xXQmh1NXl3b09wCnE0WUVLUVlHcGF2dHN0S1FwQk1wWkRXTUFwMFUyaTdMcUV5NGl3azlvalQrZEJSNVJBRkxiS2ZTMkZ3NU1zZDJ5MUpxZEhkem16dmUKUFZjYVRmSnIydHpKZHBlcmFxcFYwdGptVHE2U1Mxc2huYVlFQ2VYOFpLN1IzVzFyVmVydHRIU1pVWXhTYVdwenB4cFJoSVM1dWMwZApiY01vTjdxN3VjMGRWZnVtMHVoTzIrSFJybnFIZTY0QzZUYXV2SWphNnl5cWQwdFIybFU1ay92cVdoNHd0VWVuVnY2VVBlV0JEZXBVCmN3L1YrQk9XMFVIbldURUNyNm1RVGt0R3MwRzl3bEEraVVOemZTSEFvcEIycUNPSkRGSkhOdlFuNUdSdEhiWUFack5kWEU4RUwwMlYKbmJQVTNWQnk1ejJsMTc4ckM3c0UyVkNBcVZUeXdUVm5Rd0ZRcXZsam1yT2hBREJ0R2QzS2ljMUk5OTJsOHZIMm94RFlVVkRoT25CNgo5VFhDMGRUYlZRb0tMN1ByN1I0U2lLQmNWTEpMVmdxcjE3SWpZSm9LYStWNlFJZ0xhOTgybDRXMWI1djczUW9JZ2QybGtUSGlNVEJhCkxjcU12M2ZKa3JJbFJVclZmcTlLT2RTdXl5TmRXSWwzbVVHdDZJbkw1VkRQajZ1N1ZLYXdOeC9ydHlRdVFkWE85K3BnQ0I2OHloOFIKYTViOXRxNUcxWEtuYjdEeDJzM21CQVZGS2F0VEI1dzczQkpBd2JtMVd6VUZoUkZDcVJzTzllV3F0alVVTXVnNjRYVzZKY1N3bzZHUQpRVk1FL3VZT2QweDlwVnlQdXl2RVVDSzU0dHErMWZvNjNDbFZQdDRnaGd5ajBSM3U3dElwVDdXZVNGdW52RnZyaWRoT2ViZUxvVUtICk8yRmRrcGI2a0dzNjNDbjFlNFU5N3ZSM3VOTjZxem1zZnJxOXNQWnp6NWs1Y3Q2cjVzSmFBRXpkekRGb01YU28zblRYRmRhS0t4OUQKdDhhUFlIMWhYYkljV3Q4OVZ3ak9GWHJ6NG80SUNPY3U5WngxVEpzdnBncEh2aFpXVk1Sa1VMdG1BclhMMDFQZkxsWEV4RDhWaFFyQwpjeUdHY1lmS1FtaUlhekY5M3pTV01Xa3BZckkvRHNTZUtHOFgwMUxHSkp5a1N1eVVBOFd1aTJ3WlU5eWhxVUpkMFcxbnBUTHUwQ0tWCldvcVk3SThic2ZGOXJWL1oxVlhFSkpkQkJIc25LdXkwK2d6RExsM0RlOE90L0NMRFVPS3l4RzZQNmdGeGp4clh2RS8rVmpIb3YranQKU0tlcjNTTWlwYnc5MXJ2ZjFWUTlkUHAycHhyWG51elZWUHB0bU1sUlY3dEhsVTU1L2l0clhIbnl5YVpoYUtoNlZxOXhCVVBTWFBXcwpWT05LUjREZ1F0UWkwdmdZMHc5V3ZKVWZXNFVWbnMvNW45NEw1dm5UbThGYVNMdmZXby9ia1RzTVBwVmVVWFVmMmYwa1o0UTlaU3BRCkd3OEs3ZkppeC9RblFSSGVjN3JKUnlxb2h6TllqK1pPNzVVZnFoTDJZWXZuUDNveTlYQk8rU0s4dzNrVXg0VTZXVlNHaDdua2F2L0MKWmt1azZmeVNLOEw3bEVVSzVtSWlkd0hadVdJbGM3OHRpOVJlbWZnV2NuM1luQnhTdHBLTEkvQnJpT0FoRlphbUhlMFJHOWRITUNDcQpjblE2MGg5ckthUUdLeVN3dU9lY29BeHZMSzc5NDVPM21ueVZRUm8yVzRQUGhSRVhneFZYeEEwVmtKWXNZWG1rcFlhNUw0VVU5WDJMCmxnV2xsV0trVGFVK2d0V09QTkppc1UwS01yc0FXZ3Q4N21FLzBVV1laOWVqWDdqNk11OEY4cGpzZS96NlNtemtpbWMxUUhUSHQ2Y2kKdDAyQ09mZUNZcU9UUGF5aG96M0N6VE92RUNkbU56cU5hWk9BcUNFbk9nMFNkREZUVDV6VXNEY0QySS9pd2liVkNJbDhTZEpsYXBYcwprQ0FueXc4cXI2VzBTYjJ3Nlhpdnppd29vS3ZTbVVWckpLbWduRm9sdTNRWG5Wa0FnamM5S1doS1ZYZWlteWR2cUVwVHlkQ2txR1RRCnhrK2lReSs5ODJPajFyRHVUbmVYUlpraFhXUnBpZVZGTTlGMVpXa1pyRXFEa284VDZ4c1MwSmJ5ZVZyMGVDNXlZMFhxcXZpWmNna1AKcjR1WFBWT3VjeVVBN0lxR3E2OVZZckNENHIwdWIreDVqZHB1T05SUWphUVlYdFo2eWpNbzNuSVRMVmVUZUhGbDNGWEZidEpIMXJydQp0UjRVcjR3c0MyL1JoRldBdDE1Q0szVlhuR3k5bUpyWGNubFhuSUlESkIwZkV5YU5TQnl4amtsZC9RN2tOUXg1Tng5NVRJbzF6TFduCjNsVEJuWndjb3hNcjlmWjFncEdKNC96cUlUdlVqMDgycWhMY1h5UVFyS0lIL2ZhSVRPOG4rMk5YL25CUVh5SFpSVCtMRzlxeUtWY3kKNmFxeGl1bTY1NEEzSkZIOXk2eWtGRHRXdGNZRlErS2w2dE9uMVR5cDFWa0t1TEpvS09YazMzT2xVQXFvMXRKWVpmMjRrL2RaU2IxUQpSek16aVBvYVMzYVowUUZNcll1T1hWeGRxd0JNdEt2Y1JqSFZXaDd0a3hTZVhONUlNZFYrT3Jvb1ZndCt5Z0M3S0JlV3NnNXBpbDFaCkJhaTFCbER6UFNSeUJXS2FhZ0FWc3RNMVZBRnFyUUc4akNmcnFRTFVXZ1BJditGUWZ4V2cxaHBBRkxXK3VncFF3Q29LSHFZNEQxWmYKRmFEV0drQklzZXVyQURsNkt1c05ZWTJWM2lwQXJUV0FySTk4VlJXZ3pKQXVhZ0Q1NTVYVWVDNW5kWHRUUHUwZDJXNXB5c2VieXovWQpsTzhpcXZDUE5PVlQ2OGgybjZaOFZNMklzb0Z5ZTFNK2cxWENLcng3VTc3TC9zai9SRk0rK2Y3STkyektwNmwvNVMxTitmaFJCVGlvCnNPeWdhQktwbFFiTGQvVzcvVzZvcDN2Y0RhV3hyNSttdTZGdTd1dkhtOW9kN29hUzYrdW5MMC9wMnI1K3lsMzlycm9iU3FLdm4zSlUKU05vVDE5L1hUNXI1Rk8rR3VxS3Zuem9uMzZPdm4zSm1DQnU1dXJHdm4xb2wxNTBDdW9wZC9ReFdYUUZkMmI1K3lsTVR4UzZ1N3VzbgpHTWhGVjc4ck9vQkk5dlZUbnBCVWh1bzFmZjBreXhHVmJqWFhUaGpObGJLU2QwRmYwZGRQK2VZdjlrejh4cjUraWh0ZEh1MWlkK2pyCnB4d1cxblVEbFVKZlAyVlhWeklMK29xK2ZsSmxrcHpvM2RhUDd3NDE3N3I2K2lsRGdYSCtlL1QxVXo1UU1XaUdjMHZodTdnaTlkcSsKZmhLbUpxK3JINzg3QTNaRFh6K1JHR0xDcm42Q083dDBsNmRnYkY4LzFiclh1L1QxVSs3cXgzTHlqWDM5bEJPdWVSV3BOL1gxNCtxMwpwSGhSZE0vVjFYMzlsQW1JTE5nNzlQVlRrTFhqS25DbmZud3VaU2lhKy9HcHRKUFQzSS92cHI1K0xCUko4ZEZielhIUjEwK2g3a0UxCjIzYXV0Nitmc2lVUGJ6eTRSMTgvdVQyOGMzbVNlRjM5bGdaem5qbEpWQk5EdGI1K3l1Zk53aXlDNi92NkNha3Q5Zz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJRnEvdHg2Y3ZTVU8rSDk4ZHhJZnQ2bmQ3UHo0dFJVeHF0emRjNW1yb2E4VW5ya2k5cmErZklMQjkwZFdQcWhpNnZhOGZXeXFsMUZmMAo1cjUreW1hT0RJL3A3dXVuM05YdjVsdWI2TDUrTjhiNk5QYjEwMUQzZW9lK2ZzcGQvWFQzNDd1cUNsZWtMUy83K2wxZkRNL3I2c2ZECmNsTmZ2OHRRTXIrcm45d3RaM3I3K2ltbmQ0bDJzYXY3K2lrbk9vbGlTbGYzOVpOWUYxNVhQK1Y3NGJUMzlicytiaW1rbVA2YUp4bS8KOG9hK2ZwemlrdXJxZDNYMm9LaXZueUpIOERxQTNOYlhUOWt3cEx6WDIvdjZLUmZFMGp2eXpYMzloSk1VZC9XN3NNYzAzMlFsN09zbgpid1JSTm96S1RWWWErL3Bwc21GdTd1dkhYOG5MQXh5RjZsb1orWlR1NjZlOE9TaFdjZDZ0SUpiYTkvMFMyME5meVVaN2FVdG5mSWp2CmxWcFNOeXFLOWtyd3JYeG9Wem54WGxTMktPQW1oc2U0MDV2VTQ0NWZCMC9GcG1oVURzRU82ZHR5aE1IOEwvTXdTODluZ1NkYU84TGEKTitLNE5JSnQ1Y25vL25pMllQN3VLa0s5Qk91cGpKWjZxdUxESEJ1amYvcXhDd1lPeXljeXRmNktOZG91aC9mUGFjL3RjMWg1OFp3MQo3OCs1c1BGelBBdUFUNk9NTlJSTmxHMzFsMzB6dEYvMVBneldTTWdYbkViclpOZFg5UjJNb1ZvcE9NbzFWKzMwN0swZWZsKzI1cytoCmZjY3gvN2E4WjUzQndxK3AxYXl1NHV0a2R6dFBPemI3WVdSdlBXUTI0V2ZqKzNQYWJnazRTbUhyOTBlbDRqd3Z6Ui9CN2VjOFRzcysKcXUxTXRWdHZIYVBQUGNnWWljVys0MDRHN0JtTXpGVnpHUGs5ZmNKS1lWdnpjQmpGSElkajlMMXlOQS9DazJObzh2SEtWbHEyM0k5Kwo3N3N2VUl1Wm1MSzNYLy9oK0xtRnplWmlacXEyK2xLSENPcExFLzNhTUphZE5uYlFvV1piUU1KK2t1Y1JiblZsTTdVbktXSWhZb0RwCm5teHdYUUlXbyt4Y1VVV2pZMnlmdjVvNy9WYktzam40U1JzUlhKek42NWx4Qml0Sm41amlVT1Bac3dzK3czeTErZ2JWSkJxelpLdGwKeFN6ekdmTDNYN2RDazMwbkVoOHd0ZGM4cjJpT2k3ZnlwZ2JVbWhRZFVtRnIvbXl3RnZya3ZJc2FhT2EvU3MxdStEay9NMlg4cCtSVAp4bitjSmNpWWVmVmFmTThFQm9Cc20xUnAzZWwrWnN0aDR3VEE2ZXdac0ZUN1RBZnVYa1ZnS1dOdmtFblVqQWMwcSt6ZkZuSnl0dnIrClBuUVhPOTB5L0FRbS9McjJ3YUpkRCtYV3AwSzlBL0tjTVAvSkFiTVJoaWRLRS90RFBqdnpDWGVnMkRHZ1NHUUQvb3k0VU5VdlVEaVYKSGZqejBZTTBqTmtPZHJHUEEvZ2k3Mk4rU1BySklsR1BBckJsekYzd1dNK2tvMXlwNEI3NzhxODRYZTFqbUQ4VmNhS0J3c0Y5NGE0OApuc2ovalAwNGVQRG81ajBZVy9LUEJpdnpLTy9sSGhHNWZqdk5QS2l3K0twOGZGNUxaY2tRNXRrSlZNWjJoWmRxcGpIN25adDcyV0RGClN3UGZsSDNrNWNFcDdlSVkvTTVQMjBlaFp3eFdHZjNoNVhDTmdIOFNGT3pKd01yQ2JyaXBWeVk3SEZyb0RTOHZCbXNoN0NrSFRMZHEKK0tpWHB1RThoTlBBWUhMWUFaK1dYOUNmTk5ocC93T24xNnBIdXYzMXQxVUFQRzE1MEZQQ0dZN1BHS1F0SDRNRmMxcWlHTEYrc3hZOQpNU2ZnRHF4ajRmdjdJd2Q5TEVjeHcwWDhpQTc1QUloK2l0a2w0QW56eHJWRHhIZ1FjYi81bUhTM0U0ZHdxaDE4emthK1pnNG9kVG5DCjJYOHpJbGFCRk90OUVPekNqd0tXWkhKRURwMGZWY0o1bnEyWXFiOTd1QVVqQ3VWSHlOUHZQb3BFaFg0Rmh4dTVoU2hNWDBMMHAzV2IKb0QrZFB3YTBiVWtVbmVNaC9ZbFloQ0NJRUFWaTJNOUFpSDBmck5mWUVzTjFEYU4rUFR3M2FkZ2paNWZsdGo3Qkc4MG9NZnRGRHhERgora0ZXS2llOHVZemVqWG00MHlSZ21rSXp0L1l0WE5uWDZYZXRVSzBZM3poRndoN201Tm5nZ0kwWGMrQk9Fbk1CNjdreVo4Yno1VWZUCkNOaUlkaENOTm1CTGZJVG9UNFh4RC90ZWdINnY4NWNWaitZbDMvb2lDMnZUTk50c2Zkb04xdUxFbTNtSG0zVVM1YlBSc24vYWhTbFoKRkpvT3drTmdtMEJ2c21ydFVtOHl1eGpVbkNLOUdmOTYyVHFLNzduNlU4NjVQc0JMQ3NMbFhCSHp0UzcxcHJqdHNCMU5IS2kxS0xxaQoxc21lOFFIMVQwK2p1M0pUcTVyckRvNllmMlh5K1g5TXI3YUFKZlozd2pDSDcwanJNYUF0VVNJNGlyZUNQNE5PVk9hTUZ6OHo4TSs0Ckd3YzdSd29xUXVnak13di9DWDdUZ1NxbDdFTjJIVXk5OGFGSUJGUkNNTkpROXN2RWxNcVl4T3JEQjFVSHpIM2R3em9MYkROaUZyVHEKb25TSUoyK2RzTjk1Nk8vYU9PVHBLdUNOU0tlY0g2MnlNNEZXcldGWWFGS0ZDMUhGK2Rvd3R3OGpPM254QW5VZlFORGJvcTBGVHYwegpDNy9ER2ZPc0ZxRXBVU0s5NkJYZ3lUWDM0TSthbjRFTmRTa2NEZENsbkxLbU5CK1lDMUNwWHMyc1JGbDRGeWNNZEhSRjNLQVdOYlIrCjlQL1NjWDdFYU5qY0ZQSnpaaVg2RHQ1YTBNQm0xazBCdkg1dzg4MGNCQ0taZnVNQnFIeDZmRUlBeTFSNzZLTHkrcG9uYUdDMkJSZEoKMUk3d096UDRMbnFtckV4Ym4zamltZHFVMlpWOEtiSUFHcGNBemhRQU1CY0tSTmxXNWx1OWdPZmQ4RVlFdEFiQUVIOG1ZSGtyMkpnOApaVGY4NUdPLzg3UGZnWFh4dk8yaGZYQ2dtQjJ3ZlorM2k5azQyd3YyekI0eEp0WWp3VmhYd0NpYldKcWZ3R0FJbHNROW8ra05BMDZJCnVtNGladVI2UjhOZTVFYnFKb29lc2pQcHZ0M3I5alBmQndGYko3MHVPV2ZWemR4dFVmN3ltWDdiWUFadUVpRDFlWkZZWDE1NlFWZjQKTWhRTFJGNVd0TlZMbkhITzRFWE53cUhiWUdKR3c3c0R4TVVqd2NjaE1PRmRRY0tTd0pudnp3YW93ZzRSd2VjVkVBRVYxMUZFR1BDSgpRQ3dhaUFqd1FaOVBBbEhyY2lEeEhBbTRmdUpDSW95VHp4d1JBaDlyUE1wclp2VjFuUGo0U0duRC8wdVdCT0srMVQ2Tys3dkdyYjlJCkVlR1E2MzFvNHdOME5UOWk3TE9SSTRIQmFnd2VQMndzRWJvS2ZBQXZMR1dvK0NuRlNySUF1RHlsM2s2Wkc5VjRFVWFKNWNZQTVVWEwKTklhSEs2ZkJSRWhRT09LMmFTd2xWNE5iQzBvcWxhYngrcm03amFkZmgzdFdXNHBBYUtNRUFERS9LazhEQUhCWkVDY3pJTkw1L1ZZQQpZbXRVSDRPaWRqcVlFQUJFc2Q0ZkJ3SXIxM3RUL3B1OVQ1Wi9lN3lGeDhpdnNqRG04dnAzTTQraDY4QnY0N0g1NlJZUUFNRGFlRE9QCmRUWTM4bGh2Szhkam1rRk1EdW9NMGhmdzJNVTBsamVTOG5WMTVuanNPaEM5b1FaeDdUTFJIbWtRRTNuZHAyME1jeDRwS1lycFhZM2UKVWwzaStXTUFjN2tZeGVyRzFlaHR6aUpTTWhUVFBvMkRpbXhJalVGUW01RHFuVTIzTVhiZmJGYmZrWW5qSndmQ2FPOHMzL2dnSnBOcgo5d0IyUjU3TTkycVVVQm5EVWtZK3dSaDQybEtKRXBQVjhWWnRPZG1jTk94RUN2dlFaSDlXSG9PNnRweWNqZncvcDJhVDRFK2JtWWwwCmxpa2ZFaDdMeFhoaGI4ZUhLd2hXM3pPY2RZMmUvYTVtOU5TN0w1UVJDSDdEUmNxNjBPTUw4MXd6bEU4eFAyV2l5QzVsWXpnRG5qYzUKdHZ4OVVoRVErMk12Uk5XOVFxOTc2SUcraXBlSlZuNGU0WjlzQUs1c1p6ODVLTWR1Zmx4QmE3eE0rYnZ3NE4rRHZHNzZ6N3pQUjduYgpURTR2OUxCWmR6eVE3dXh5ak5zYmRMREJSQ2MvZUJrN3NjRzlxcHYvb09abXc0WlZyeUNpNkJsRTJCQk1sY1AzRmJBa0Zsa0czd3ZPCkVZWU9VWlFlWGR4My9PaG9LZS9oUFJCRVIwc1ZId3dPdVFEdFB0MlVyLzExL0FXOFUycmk2TTlBdW0wRWY3NW1PTmhET216eFNpSnEKdTRDL01NOGh0d0NlMDBBdm9SWUZWdnZMQWNyTDY0c2Z4alk4QU1IZUF2NXNJN0F1S2lUaWYvMElzSkZKdHp0bFRwcmhVemRBNEFORwpTNi9HaFc1SERKWVJvSEc0N3kzNHgwbGJmTEd4dHcxV01sa00vdkxDNjFUd3ZkUnQ4SS9mbVRONDlyUW9Cc2E0eVV0QmxJSkg1U21wClFHUnV1a1FRblUvUlJpeGFJalAyZWF0UW1UMGFhYSs2MThVWlZtbnhBMzdPOVJEc2xYU0VxRGNPc2xNZkF5eW5HTDFna3hjVUV2SFEKNGZWSjIwOEhlU2RkREovVUtrN3c2UU9uNDFHVEFaR0tWUWl3VnBOeGdQazBDMUlSZUErOXRLc21ndWhGUitUZ3p5NFRsRnQ5WU15bgpBY2R0RThLZXJxWG8wYXhtQWQ2RGdURXdwT09TOWIyVm5jdnFMNHk4dGtBdUdvZ201Z1BuZDM0WkpsOXk2Nmc1S2hWcG9TYkUvVU5sCmJIT2htbFBYeHlLZG9vdzd5Q3luQVlhWDhJd0RmQnJqektjWkZ3S2Uwa0drMDIvd1lqU2hVNGQwT1ZPSlNNZHJxcE9qdWpWR0JVTnQKdzJNRWV5cTVRMGoydjhLMExIWXhNM0pTbGVPRCtxT0RMTVYweEFmMVJ3ZWw3dXRUaXcvcWp3NUNpdW1ORCtxUERsS2NyQzgreUk4TwpadjhyWllqaUVmd0IvZU52bnRmenc4dmhaL0d6ZWZBWUVnWi90b0xqN2Mxc1N4N204OWI4ZjUwSzIrbjViNzQ1UGNRZi9ObTNmS1VTCkRSWG0wKzFzL29DU21VS2pDS3MydkRTMzB2ek5QOUlXaEJoUnNEeFgrSTZWVm1WejgzRmMrTVo2S1o1WVVGYktyclUzZXBhL1piQ2gKdXFjK3RLdCtHRDBFK1daMGxJOGUrR2VQMnVVcElra2VyQ0t0NURJWDVvZmN1ZWl1MTk1RnB3UW9HQk1idFVwZ2V5aSs1K2JOalArNApTUHJMMlg2MTBDYzdieG4vQ2RzeUFVRjRuaW5JSHVDZGVrc2NrZ05ENW1Rek9wUFBRYVBYYisvQXcvSUNtSXVsRVBVYlBjNU1Cbjc3ClpIUTNUTTl3ZnMvd1Fkcm96UVptMEdvb0cxMTdNekRMeHZzb1gxWFlDRGN0Y3R4V1J3Nkh6SEsvYnBHYU5WRG54N2huc1VpaFl3TmEKWDBMeFF5Y1pqUGo1MFo4d3BkRkJmL3FkSStQQVNWc0Q5ajFzSVZOMjAzL0dIVjdLa0tHQ3p2Q0dHQnJFZHp0K1lpUzVnbkduajN3OQpydU1va3p2SU5GaGxqeks1QnplYkNkUXg4SUNQK3g4d0UxQmFIbTBvL0hObWdzR3F2SzNmeDB5Z1F0dWFJVjVwSmdCRGh6VVUvamt6CkFSbzZqS0h3ejVrSllDNnNvZkRQbVFrOGVabitjMmFDd2NvWkNtSXpRVGtqaE01Q3JNWGxOZ2RhL2J1K3lETjBwWmEvd0pYcURJcEEKS2I1M2pjN252b1BXbStmNEsxU3BaYUJMMHkyajgyZWRNbm8zalUrb1MyTndYN0NJM1N0cXdSNTdsS29EUXBOMUlJSGpEalhmZHZSTAo0NzJYU2Z3SU9yakVEelpYdzA1NWYwQmJ1bWx0Q1U5WWVOcVMzc3J0aEQxai9FTExEclZsM3VkQnQwOFRYK2RreGYvVFBma293K1BICkUzZWp0QzJneDRwUFVrWG53Tzk2cm9wV0h6NW9BeXlSQTZkYUtUMzJSWXVBU0sraWJCU2dVdUhJSFBBNFk1VmJtemFrMFBuQ09CdUcKNyt5VjRrN0lHM1ZrakNBRE5FcWQ1dU9sdGlQS1dqRzBTVlJhQkNIRm5uMjBSV0xKK0F0UHlTMEc0THhnbFBMa2FleFNtMEFMQWY1eAo4NnA2MkRSVzdpUVNLSE51OTBXTWVGR2d3WjcvaTFxcVVtbHB4VUZJZERqSXBlVlI1NHRlL3ZuaU5Gb1ZuUzhhalNjSEd6ODd2bDZjCkx3WmRKVit3bkdXTzJ4NjNUT3Ntd1VHb3Q4NGRCUkdPV0M4Z09BZ05tNDNXbktYQWdKamFMazVTYzM0ZUFKenNsbkIwNEVzbk5OQmkKRHpnZG1leituMVM3aUl3RHlHZ3B4T2ZNZDUwOTgxM3Y0UDk1MmJpNVJBdkVjZ0p6bnc2dENNT09Xa04rU0lYQkNkSG5udlQxK3E3TQp1MnZNSEVFaU81bytmVE5ZeFllUTZGYjA2NDhnblZLbmJ6QWtwUG44RGI4NVZMZUs3aGdpWkFJOElxQlRZWm9JUVQ5SEJEaWFGZThJCkV0MmtKMGNDSm9TYWpxODJEQkZjb2lOSTc0MUgwWThuN25oZWU5aVZ4d2ZwK090SncxRTBuV0lvZFJoTkZ4WlRWRVRueDFLc3BIQ2EKVFpkRUFnQmc5VFZ5NHdVSTFOUk4yeGlvMUp4TEVLZ2gxUzNUUUFuOGpFanhqclIxVEtNZDkrdEtETGlVU2svczVMcUZwNkZMN1JZQgpvQ21tbFJMUUEvZXFUZVB5YUo5ZkpJTjdkbmxNY2hvYVNRbFRLSEVFNEdncWxYTnV0cFdId1FvVEh2YThONEhiNzZUZkpIOXh0MFRUCkQ1clB4MFA3alR3R0RCVEhiVHhXQy9vNEFMSThwZ2hpa01GdTVUSDcwbkViajJFYnB3eVBhUVpSYzN0VUdZUVBBQT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJVFVMSVk0T0k3NWJWQVA3OG8xOEtBT0F4clNCS05aTzZ1RW9Eb05OWW9jR25XZmRKajJIZ2t5WWxIQU82bEZ4MU5ZQ0JxU3J4U21PQQpTY3k3K0cyckFhMWFaVktpL1VWcEdtVXZxVTgyTHNZUXJ1SFFHcjlCTnNycEpxRXloa1BLai9OMjVITHc1R3NuZVNBbUErdHRlOEJrCjRYWXpPN0xpS0JUR3NNUGxtVW8wQmxyMnhhT1lXaUxlbXpoaTZuMzAzWlprQmhQY0pVVmNkZ3lzdGtRSm55SGNnWXhFcnY4WVFoLzEKR3FmQlF0bzk3QmJPNDFJdC8vVVVNOU1oZzFDR2lTUlJJZjZuUDJHZU9sVTZZYkJLRlUvY3UzUUNZcmtzbnRCZE9zR0dRNldQSmRHNgphRHFZRkI5TDhoN3M4Z3YyZ1NpbUR3T296ekNxd1B1MjdXQ1BEWjQ5L0FlTElGdVRBTDFsNENWQnZVS2x6RVAxQURrWm5RTnNrYVRDClB4c3V3ZEVwa0IxSTJ3YnRlZ01tanRQZWhxZU96c2R6a0M4aEt6WDhkQkZGdWdMSjFxREJUaHR0QkRiQWl6S1dod2Y2Z05ucERWTFcKZU12TFA3aExaeEs2ay9BdkRtRllMNTV3bHNrazVTWGREV0tqOXNpZE5ZUk9yNVo1NmFzZlhSaXMyYmV6NWFmWW43M0NrNk1XenZFdgo4WFVlWk9pWVJHOFFZRU9SUVg3QlJEckNzc3E3bDY2YWFPU2hYbm4zTTJ6L2pxR0VoaS9vY3I3alRIVHBIWjBTd05PRTl3RDdLVWlCCktDYit3dURQUGcxeE9FVUwzMmVQOGZzWSt3bm5yejY4VTV5dFNlZ0grTFVVaFpXRmlUTCtocGk1OU1PeVZTcHV1Um9WQTMzQkNWZXYKd3E5UytmSnhTQU0yNXdzazZoZjRwL2NPb3c5Zk9QdUo0TDlYWHdUaGQwRnVORUQybWZFMHlGR25seSs0bzA2U0xOWTdVU2E0K1JmQwo1cE40R0hLb2o0MVQ5S2txeVA4ZjYvc2ZHK3ZiL2xmS2tBQ1RxZUQ0c0xpWjhjOGNEVllyK09adGZqcnY0QXVoWVc2KytOblV4ditaCkh3ejRBL1VmQnY2RC8wWmlEemdSZlNCQ0lmQkhDSDVibXhnYzZOMEgzUGxRQTd2TDBKODluQW8vMDlQUGRqTSsvT2NoRHIvcTFtdnQKU3VFaC9rQzlPd1R2Smg0Y1lEVFlFTHdOSGpuaFFlY1FqSEJvd0I2eTRIL2RmeHZPNEQvczRjV0FQV0QwQU9CLzNiRUJvMGNFM3ZvUAorT01KZlBnRlgvMzdBY2NlNmc4Zlg5akRESXk4MnpRRVlnOWVISC80b3o1Z0QydjBJZW9MRVRFd2t3RDRnTWRDNEl1SFFBVCtPelVFCjRQK3REYmd2R01FSUhQNkJVKzlqR0FFL0FoaFRBNDZBcnRIL0U3NVFNQWJlb2wveDRvR0hBUG9Yd0lxZ0R3QW5BRUE5aVZHL0lCN28KZ1UwTjM0WTJuSjh2QWdrS1VhQVpnYUdqMmMwTTRRZUg4Nkg3emxBQ3ZBZkhoZm5Da1ZnNEdrQWZNSUlnd0ljWWhvZURERmxFTk9LSQpnZEhFaU5HMGlJaHBFVUcwaUZDMGlQQnBFWUVFaUhDMGlOR2t3R2hTNEdKU0VJZ1VCRU1LZ2lNRlF3Q1dGQmhOaWhnOTNiWTBIOUg4CkFjakFYLzlMYWxtSDdHU3BqM0M2MUNlRkNZTVhxQ2xiaDRxVEJvL3BhVk9mRkNZT1FESlRCeDhWSm04ZHlvbE85bkFZVXgrQnZEeGsKejZmdFEzTjhQTTBQUC85Nzduend2NTBPUDVzRkpUMUFvbWJieVh5WXJjU0dMNVBqL1BDditXeFluZjluU0wxMDVBa1pEdDdkYkRjUApnWENBNWk4dHNzYnlFZUE0aW84SW5HWWtQQVlKRytYb2lzY1FZZkVZeFVwNGpNOUw0QytjL2czOFFPQVVMeEVFeFV0RVFFUlNJZ2hKCkN2NmxlQWw4WUhnSlBvbFJ2NEJvNmNIOXR3c1d3V2daZ3RFeWVGUk1FRXJONExTZXdRV0tCa2VhQnYwR0VZVFdNd1N0WndpeG5pR1EKbmlFWVBVTndlb1lJMEVUZ0VRVC9KOFFMVFpuK2lMSHlwVGh0SkdGbzRqd1JrNW82RWl3MGVlcVR3dlFwRVVNRVlFUk1qZ1QvdzRRcwpFS0I1S2tEUVBCWEFJSEVESEhFREdDSnVBS040S29EeGVTb0F3YUxmd0hkeEJBZHhWU0JBY1ZVZ0tDSnJJQVRKQ3Y2bHVBcDhZTGdxClFKRVIvb0loYVNEdzN5OW1BVWJ2QkJpOVE4UkVKQ0VvdlVQUWVvY1E2QjBDNlIzNEc0WWt0T1lKMEpvbklOWThBYVI1QW96bUNYQ2EKSnhDa3ljQWpDZkZQQ0JxYU5QMFJad1ZOY2VKSTBJaVlVTkNrSjQ4RUxFQXdvcVpFQUVyVUVBa1lVWk1qd3Y5dFVhdmxLRnNXV0xiSQo0dlFDLzlyNk9sN01XNGZ4enhwWXRvdmorRi96aC9GbXN6Mk5UL01kZVBLd09NeVBwKzFoL25CY2J2OE52d0UvWVY0SE52SUxhZmcvCndrbmVyZz09DQoJXV0+DQo8L2k6cGdmPg0KPC9zdmc+DQo=); + -webkit-background-size: cover; + -moz-background-size: cover; + background-size: cover; + position: relative; + display: inline-block; + vertical-align: top; + overflow: hidden; + vertical-align: middle; + width: 1.3rem; + height: 1.3rem; +} +#download-btn { + display: none; +} +/* Content */ +#content { + width: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 20px; +} +/* Code */ +#content section.code { + display: none; + background: #FFF; + border: 1px solid #E0E0E0; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 15px; + font-size: 12px; + -moz-border-radius: 1px; + -webkit-border-radius: 1px; + border-radius: 1px; + font-weight: 400; +} +article.component { + padding: 0 0 10px; +} +#content section.code h3 { + margin: 0; + font-size: 12px; + color: #000; + font-weight: 400; +} +#content header h2 { + font-weight: 300; + margin: 10px 0 25px; + font-size: 20px; + position: relative; + display: inline-block; + padding-right: 10px; +} +body.light #content header h2 { + background: #F4F4F4; +} +body.dark #content header h2 { + background: #4A4D4E; +} +#content header{ + position: relative; +} +#content header:before { + content: ''; + width: 100%; + display: block; + position: absolute; + left: 0; + top: 23px; +} +body.light #content header:before { + border-bottom: 1px solid #E0E0E0; +} +body.dark #content header:before { + border-bottom: 1px solid #58595A; +} +#content pre { + padding: 0; + margin: 2px 0 10px; +} +.showcode { + margin: 10px 0; +} +.showcode a, section.examples a { + color: #288edf; + text-decoration: none; +} +.showcode a:hover, section.examples a:hover { + text-decoration: underline; +} +section.examples ul { + margin: 0 0 20px; + padding: 0 0 0 20px; +} +section.examples h4 { + margin-bottom: 5px; +} +section.examples li { + color: #58595A; +} +/* Side Nav */ +#sideNav { + background: #4A4D4E; + position: absolute; + width: 100%; + z-index: 1; + height: 100%; + left: 0; +} +#sideNav ul { + list-style: none; + margin: 0; + padding: 0; +} +#sideNav li a { + color: #F0F1F1; + display: block; + height: 46px; + font-size: 16px; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 12px 0 0 20px; + text-decoration: none; +} +#sideNav nav.site, #sideNav .combo { + border-bottom: 1px solid #58595A; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 10px; + display: block; +} +#pageNav li { + border-bottom: 1px solid #58595A; +} + +select.docNav { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + background: #595B5B; + background-image: none; + box-shadow: 0 0 0 1px #303233; + border: none; + border-top: 2px solid #666767; + color: #FFF; + text-shadow: 0 -1px 0 #000; + overflow: hidden; + font-size: 14px; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 20px; + -webkit-appearance: none; + -moz-appearance: button; +} +@media screen and (min-width: 650px) { + #site.open { + transform: translate3d(0, 0, 0); + -webkit-transform: translate3d(0, 0, 0); + } + #main-header nav { + display: inline-block; + position: absolute; + right: 0; + top: 40px; + } + #main-header ul { + list-style: none; + } + #main-header nav li { + display: inline-block; + margin: 0 18px; + } + #main-header nav li#download-btn { + display: none; + } + #main-header nav li a { + text-decoration: none; + font-size: 20px; + color: #7F7F7F; + } + #main-header nav li.selected a { + color: #373435; + } + #slide-menu-button{ + display: none; + } + #main-header hgroup { + text-align: left; + position: absolute; + display: inline-block; + top: 24px; + } + #main-header hgroup h1 { + font-size: 60px; + } + #main-header hgroup p { + font-size: 15px; + } + #main-header { + color: #373435; + background: #fff; + height: 148px; + } + #content { + padding-left: 240px; + } + /* Side Nav */ + #sideNav { + background: transparent; + width: 220px; + z-index: 20; + left: 10px; + top: 150px; + height: auto; + } + #sideNav nav.site { + display: none; + } + #sideNav .combo { + border-bottom: none; + padding: 36px 0; + } + #sideNav li a { + padding: 12px 0 0 10px; + } + body.light #sideNav li a { + color: #797B7B; + } + body.light #pageNav li { + border-bottom: 1px solid #E0E0E0; + } + select.docNav { + background: #595B5B; + box-shadow: 0 0 0 1px #303233; + border: none; + border-top: 2px solid #666767; + color: #FFF; + text-shadow: 0 -1px 0 #000; + padding: 3px 20px 4px 8px; + -webkit-appearance: none; + } + body.light select.docNav { + box-shadow: 0 0 0 1px #949696; + background: #DDE1E1; + border-top: 1px solid #FFF; + color: #454545; + text-shadow: 0 -1px 0 #FFF; + width: 192px; + } +} +@media screen and (min-width: 880px) { + #content { + padding-left: 300px; + } + #sideNav li a { + display: block; + height: 60px; + padding: 22px 0 0 10px; + text-decoration: none; + } + #content header h2 { + font-size: 28px; + } + #content header:before { + top: 30px; + } + section.code div { + display: inline-block; + width: 48%; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + section.code div:first-child { + padding-right: 5px; + } + section.code div:last-child { + padding-left: 5px; + } + .max-width { + max-width: 1180px; + position: relative; + margin: 0 auto; + } + header#main-header .max-width { + top: -10px; + } + #main-header nav li a { + font-size: 22px; + } + #main-header nav { + display: inline-block; + } + + #main-header nav li { + margin: 0 25px; + } + #main-header nav li:last-child { + margin-right: 0; + } +} +@media screen and (min-width: 940px) { + #main-header nav li#download-btn { + display: inline-block; + } + #main-header nav li a#download-btn{ + position:relative; + top: -15px; + display:inline-block; + box-sizing:border-box; + -moz-box-sizing:border-box; + background-clip:padding-box; + font:inherit; + background:transparent; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + text-overflow:ellipsis; + white-space:nowrap; + overflow:hidden; + font-size:16px; + line-height:3rem; + letter-spacing:1px; + color:#454545; + text-shadow:0 1px #fff; + vertical-align:top; + background-color:#e5e9e8; + box-shadow:inset 0 1px #fff; + border:1px solid #a5a8a8; + border-radius:6px; + margin:0; + padding:0 1.25rem; + } + #main-header nav li a#download-btn, #main-header nav li a#download-btn:hover { + border:1px solid #143250; + background-color:#288edf; + box-shadow:inset 0 1px rgba(255,255,255,0.36); + color:#fff; + font-weight:500; + text-shadow:0 -1px rgba(0,0,0,0.36); + } + #main-header nav li a#download-btn:hover { + background-color:#2f9cf3; + } + #main-header nav li a#download-btn:active, #main-header nav li a#download-btn.is-active { + background-color:#0380e8; + box-shadow:inset 0 1px rgba(0,0,0,0.12); + } + #main-header nav li a#download-btn:disabled, #main-header nav li a#download-btn.is-disabled { + opacity:.3; + cursor:default; + pointer-events:none; + } +} + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/prism.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/prism.css new file mode 100644 index 0000000..b508b61 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/prism.css @@ -0,0 +1,168 @@ +/** + * prism.js Twilight theme + * Based (more or less) on the Twilight theme originally of Textmate fame. + * @author Remy Bach + */ +code[class*="language-"], +pre[class*="language-"] { + color: white; + direction: ltr; + font-family: source-code-pro, Consolas, Monaco, 'Andale Mono', monospace; + text-align: left; + text-shadow: 0 -.1em .2em black; + white-space: pre; + word-spacing: normal; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"], +:not(pre) > code[class*="language-"] { + background:#181818; +} + +/* Code blocks */ +pre[class*="language-"] { + margin: .5em 0; + overflow: auto; +} +pre[class*="language-"]::selection { /* Safari */ + background:hsl(200, 4%, 16%); /* #282A2B */ +} +pre[class*="language-"]::selection { /* Firefox */ + background:hsl(200, 4%, 16%); /* #282A2B */ +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + border-radius: .3em; + border: .13em solid hsl(0,0%,33%); /* #545454 */ + box-shadow: 1px 1px .3em -.1em black inset; + padding: .15em .2em .05em; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: hsl(0, 0%, 47%); /* #777777 */ +} + +.token.punctuation { + opacity: .7; +} + +.namespace { + opacity: .7; +} + +.token.tag, +.token.boolean, +.token.number { + color: hsl(14, 58%, 55%); /* #CF6A4C */ +} + +.token.keyword, +.token.property, +.token.selector { + color:hsl(53, 89%, 79%); /* #F9EE98 */ +} +.token.attr-name, +.token.attr-value, +.token.string, +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color:hsl(76, 21%, 52%); /* #8F9D6A */ +} + +.token.atrule { + color:hsl(218, 22%, 55%); /* #7587A6 */ +} + +.token.regex, +.token.important { + color: hsl(42, 75%, 65%); /* #E9C062 */ +} + +.token.important { + font-weight: bold; +} + +.token.entity { + cursor: help; +} +pre[data-line] { + padding: 1em 0 1em 3em; + position: relative; +} + +/* Markup */ +.language-markup .token.tag, +.language-markup .token.attr-name, +.language-markup .token.punctuation { + color: hsl(33, 33%, 52%); /* #AC885B */ +} + +/* Text Selection colour */ +::selection { + background: hsla(0,0%,93%,0.15); /* #EDEDED */ +} +::-moz-selection { + background: hsla(0,0%,93%,0.15); /* #EDEDED */ +} + +/* Make the tokens sit above the line highlight so the colours don't look faded. */ +.token { + position:relative; + z-index:1; +} +.line-highlight { + background: -moz-linear-gradient(left, hsla(0, 0%, 33%,.1) 70%, hsla(0, 0%, 33%,0)); /* #545454 */ + background: -o-linear-gradient(left, hsla(0, 0%, 33%,.1) 70%, hsla(0, 0%, 33%,0)); /* #545454 */ + background: -webkit-linear-gradient(left, hsla(0, 0%, 33%,.1) 70%, hsla(0, 0%, 33%,0)); /* #545454 */ + background: hsla(0, 0%, 33%, 0.25); /* #545454 */ + background: linear-gradient(left, hsla(0, 0%, 33%,.1) 70%, hsla(0, 0%, 33%,0)); /* #545454 */ + border-bottom:1px dashed hsl(0, 0%, 33%); /* #545454 */ + border-top:1px dashed hsl(0, 0%, 33%); /* #545454 */ + left: 0; + line-height: inherit; + margin-top: 0.75em; /* Same as .prism’s padding-top */ + padding: inherit 0; + pointer-events: none; + position: absolute; + right: 0; + white-space: pre; + z-index:0; +} +.line-highlight:before, +.line-highlight[data-end]:after { + background-color: hsl(215, 15%, 59%); /* #8794A6 */ + border-radius: 999px; + box-shadow: 0 1px white; + color: hsl(24, 20%, 95%); /* #F5F2F0 */ + content: attr(data-start); + font: bold 65%/1.5 sans-serif; + left: .6em; + min-width: 1em; + padding: 0 .5em; + position: absolute; + text-align: center; + text-shadow: none; + top: .4em; + vertical-align: .3em; +} +.line-highlight[data-end]:after { + bottom: .4em; + content: attr(data-end); + top: auto; +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/topcoat-desktop-light.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/topcoat-desktop-light.css new file mode 100644 index 0000000..6735055 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/topcoat-desktop-light.css @@ -0,0 +1,3700 @@ +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.button-bar { + display: table; + table-layout: fixed; + white-space: nowrap; + margin: 0; + padding: 0; +} + +.button-bar__item { + display: table-cell; + width: auto; + border-radius: 0; +} + +.button-bar__item > input { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.button-bar__button { + border-radius: inherit; +} + +.button-bar__item:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.button, +.topcoat-button, +.topcoat-button--quiet, +.topcoat-button--large, +.topcoat-button--large--quiet, +.topcoat-button--cta, +.topcoat-button--large--cta, +.topcoat-button-bar__button, +.topcoat-button-bar__button--large { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +.button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.button--disabled, +.topcoat-button:disabled, +.topcoat-button--quiet:disabled, +.topcoat-button--large:disabled, +.topcoat-button--large--quiet:disabled, +.topcoat-button--cta:disabled, +.topcoat-button--large--cta:disabled, +.topcoat-button-bar__button:disabled, +.topcoat-button-bar__button--large:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +.topcoat-button, +.topcoat-button--quiet, +.topcoat-button--large, +.topcoat-button--large--quiet, +.topcoat-button--cta, +.topcoat-button--large--cta, +.topcoat-button-bar__button, +.topcoat-button-bar__button--large { + padding: 0 1.25rem; + font-size: 16px; + line-height: 3rem; + letter-spacing: 1px; + color: #454545; + text-shadow: 0 1px #fff; + vertical-align: top; + background-color: #e5e9e8; + box-shadow: inset 0 1px #fff; + border: 1px solid #a5a8a8; + border-radius: 6px; +} + +.topcoat-button:hover, +.topcoat-button--quiet:hover, +.topcoat-button--large:hover, +.topcoat-button--large--quiet:hover, +.topcoat-button-bar__button:hover, +.topcoat-button-bar__button--large:hover { + background-color: #edf1f1; +} + +.topcoat-button:active, +.topcoat-button--large:active, +.topcoat-button-bar__button:active, +.topcoat-button-bar__button--large:active, +:checked + .topcoat-button-bar__button { + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +.topcoat-button:focus, +.topcoat-button--quiet:focus, +.topcoat-button--large:focus, +.topcoat-button--large--quiet:focus, +.topcoat-button--cta:focus, +.topcoat-button--large--cta:focus, +.topcoat-button-bar__button:focus, +.topcoat-button-bar__button--large:focus { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; + outline: 0; +} + +.topcoat-button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.topcoat-button--quiet:hover, +.topcoat-button--large--quiet:hover { + text-shadow: 0 1px #fff; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px #fff; +} + +.topcoat-button--quiet:active, +.topcoat-button--large--quiet:active { + color: #454545; + text-shadow: 0 1px #fff; + background-color: #d3d7d7; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +.topcoat-button--large, +.topcoat-button--large--quiet, +.topcoat-button-bar__button--large { + font-size: 1.3rem; + font-weight: 400; + line-height: 4.375rem; + padding: 0 1.25rem; +} + +.topcoat-button--large--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.topcoat-button--cta, +.topcoat-button--large--cta { + border: 1px solid #143250; + background-color: #288edf; + box-shadow: inset 0 1px rgba(255,255,255,0.36); + color: #fff; + font-weight: 500; + text-shadow: 0 -1px rgba(0,0,0,0.36); +} + +.topcoat-button--cta:hover, +.topcoat-button--large--cta:hover { + background-color: #509bef; +} + +.topcoat-button--cta:active, +.topcoat-button--large--cta:active { + background-color: #0380e8; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +.topcoat-button--large--cta { + font-size: 1.3rem; + font-weight: 400; + line-height: 4.375rem; + padding: 0 1.25rem; +} + +.button-bar, +.topcoat-button-bar { + display: table; + table-layout: fixed; + white-space: nowrap; + margin: 0; + padding: 0; +} + +.button-bar__item, +.topcoat-button-bar__item { + display: table-cell; + width: auto; + border-radius: 0; +} + +.button-bar__item > input, +.topcoat-button-bar__item > input { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.button-bar__button { + border-radius: inherit; +} + +.button-bar__item:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Button Bar + description: Component of grouped buttons + modifiers: + :disabled: Disabled state + markup: +
    +
    + +
    +
    + +
    +
    + +
    +
    + examples: + mobile button bar: http://codepen.io/Topcoat/pen/kdKyg + tags: + - desktop + - light + - dark + - mobile + - button + - group + - bar +*/ + +.topcoat-button-bar > .topcoat-button-bar__item:first-child { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +.topcoat-button-bar > .topcoat-button-bar__item:last-child { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +.topcoat-button-bar__item:first-child > .topcoat-button-bar__button, +.topcoat-button-bar__item:first-child > .topcoat-button-bar__button--large { + border-right: none; +} + +.topcoat-button-bar__item:last-child > .topcoat-button-bar__button, +.topcoat-button-bar__item:last-child > .topcoat-button-bar__button--large { + border-left: none; +} + +.topcoat-button-bar__button { + border-radius: inherit; +} + +.topcoat-button-bar__button:focus, +.topcoat-button-bar__button--large:focus { + z-index: 1; +} + +/* topdoc + name: Large Button Bar + description: A button bar, only larger + modifiers: + :disabled: Disabled state + markup: +
    +
    + +
    +
    + +
    +
    + +
    +
    + tags: + - desktop + - light + - dark + - mobile + - button + - group + - bar + - large +*/ + +.topcoat-button-bar__button--large { + border-radius: inherit; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.button { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +.button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.button--disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.button, +.topcoat-button, +.topcoat-button--quiet, +.topcoat-button--large, +.topcoat-button--large--quiet, +.topcoat-button--cta, +.topcoat-button--large--cta { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +.button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.button--disabled, +.topcoat-button:disabled, +.topcoat-button--quiet:disabled, +.topcoat-button--large:disabled, +.topcoat-button--large--quiet:disabled, +.topcoat-button--cta:disabled, +.topcoat-button--large--cta:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Button + description: A simple button + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + examples: + mobile button: http://codepen.io/Topcoat/pen/DpKtf + tags: + - desktop + - light + - mobile + - button +*/ + +.topcoat-button, +.topcoat-button--quiet, +.topcoat-button--large, +.topcoat-button--large--quiet, +.topcoat-button--cta, +.topcoat-button--large--cta { + padding: 0 1.25rem; + font-size: 16px; + line-height: 3rem; + letter-spacing: 1px; + color: #454545; + text-shadow: 0 1px #fff; + vertical-align: top; + background-color: #e5e9e8; + box-shadow: inset 0 1px #fff; + border: 1px solid #a5a8a8; + border-radius: 6px; +} + +.topcoat-button:hover, +.topcoat-button--quiet:hover, +.topcoat-button--large:hover, +.topcoat-button--large--quiet:hover { + background-color: #edf1f1; +} + +.topcoat-button:active, +.topcoat-button--large:active { + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +.topcoat-button:focus, +.topcoat-button--quiet:focus, +.topcoat-button--large:focus, +.topcoat-button--large--quiet:focus, +.topcoat-button--cta:focus, +.topcoat-button--large--cta:focus { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; + outline: 0; +} + +/* topdoc + name: Quiet Button + description: A simple, yet quiet button + modifiers: + :active: Quiet button active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - quiet +*/ + +.topcoat-button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.topcoat-button--quiet:hover, +.topcoat-button--large--quiet:hover { + text-shadow: 0 1px #fff; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px #fff; +} + +.topcoat-button--quiet:active, +.topcoat-button--large--quiet:active { + color: #454545; + text-shadow: 0 1px #fff; + background-color: #d3d7d7; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +/* topdoc + name: Large Button + description: A big ol button + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - large +*/ + +.topcoat-button--large, +.topcoat-button--large--quiet { + font-size: 1.3rem; + font-weight: 400; + line-height: 4.375rem; + padding: 0 1.25rem; +} + +/* topdoc + name: Large Quiet Button + description: A large, yet quiet button + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - large + - quiet +*/ + +.topcoat-button--large--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +/* topdoc + name: Call To Action Button + description: A CALL TO ARMS, er, ACTION! + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - call to action +*/ + +.topcoat-button--cta, +.topcoat-button--large--cta { + border: 1px solid #143250; + background-color: #288edf; + box-shadow: inset 0 1px rgba(255,255,255,0.36); + color: #fff; + font-weight: 500; + text-shadow: 0 -1px rgba(0,0,0,0.36); +} + +.topcoat-button--cta:hover, +.topcoat-button--large--cta:hover { + background-color: #509bef; +} + +.topcoat-button--cta:active, +.topcoat-button--large--cta:active { + background-color: #0380e8; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +/* topdoc + name: Large Call To Action Button + description: Like call to action, but bigger + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - large + - call to action +*/ + +.topcoat-button--large--cta { + font-size: 1.3rem; + font-weight: 400; + line-height: 4.375rem; + padding: 0 1.25rem; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +input[type="checkbox"] { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.checkbox { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.checkbox__label { + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.checkbox--disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +.checkbox:before, +.checkbox:after { + content: ''; + position: absolute; +} + +.checkbox:before { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +input[type="checkbox"] { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.checkbox, +.topcoat-checkbox__checkmark { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.checkbox__label, +.topcoat-checkbox { + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.checkbox--disabled, +input[type="checkbox"]:disabled + .topcoat-checkbox__checkmark { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +.checkbox:before, +.checkbox:after, +.topcoat-checkbox__checkmark:before, +.topcoat-checkbox__checkmark:after { + content: ''; + position: absolute; +} + +.checkbox:before, +.topcoat-checkbox__checkmark:before { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +/* topdoc + name: Checkbox + description: Default skin for Topcoat checkbox + modifiers: + :focus: Focus state + :disabled: Disabled state + markup: + +
    +
    + + examples: + mobile checkbox: http://codepen.io/Topcoat/pen/piHcs + tags: + - desktop + - light + - mobile + - checkbox +*/ + +.topcoat-checkbox__checkmark { + height: 2rem; +} + +input[type="checkbox"] { + height: 2rem; + width: 2rem; + margin-top: 0; + margin-right: -2rem; + margin-bottom: -2rem; + margin-left: 0; +} + +input[type="checkbox"]:checked + .topcoat-checkbox__checkmark:after { + opacity: 1; +} + +.topcoat-checkbox { + line-height: 2rem; +} + +.topcoat-checkbox__checkmark:before { + width: 2rem; + height: 2rem; + background: #e5e9e8; + border: 1px solid #a5a8a8; + border-radius: 3px; + box-shadow: inset 0 1px #fff; +} + +.topcoat-checkbox__checkmark { + width: 2rem; + height: 2rem; +} + +.topcoat-checkbox__checkmark:after { + top: 1px; + left: 2px; + opacity: 0; + width: 28px; + height: 11px; + background: transparent; + border: 7px solid #666; + border-width: 7px; + border-top: none; + border-right: none; + border-radius: 2px; + -webkit-transform: rotate(-50deg); + -ms-transform: rotate(-50deg); + transform: rotate(-50deg); +} + +input[type="checkbox"]:focus + .topcoat-checkbox__checkmark:before { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.button, +.topcoat-icon-button, +.topcoat-icon-button--quiet, +.topcoat-icon-button--large, +.topcoat-icon-button--large--quiet { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +.button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.button--disabled, +.topcoat-icon-button:disabled, +.topcoat-icon-button--quiet:disabled, +.topcoat-icon-button--large:disabled, +.topcoat-icon-button--large--quiet:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Icon Button + description: Like button, but it has an icon. + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - icon +*/ + +.topcoat-icon-button, +.topcoat-icon-button--quiet, +.topcoat-icon-button--large, +.topcoat-icon-button--large--quiet { + padding: 0 0.75rem; + line-height: 3rem; + letter-spacing: 1px; + color: #454545; + text-shadow: 0 1px #fff; + vertical-align: baseline; + background-color: #e5e9e8; + box-shadow: inset 0 1px #fff; + border: 1px solid #a5a8a8; + border-radius: 6px; +} + +.topcoat-icon-button:hover, +.topcoat-icon-button--quiet:hover, +.topcoat-icon-button--large:hover, +.topcoat-icon-button--large--quiet:hover { + background-color: #edf1f1; +} + +.topcoat-icon-button:active { + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +.topcoat-icon-button:focus, +.topcoat-icon-button--quiet:focus, +.topcoat-icon-button--quiet:hover:focus, +.topcoat-icon-button--large:focus, +.topcoat-icon-button--large--quiet:focus, +.topcoat-icon-button--large--quiet:hover:focus { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; + outline: 0; +} + +/* topdoc + name: Quiet Icon Button + description: Like quiet button, but it has an icon. + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - icon + - quiet +*/ + +.topcoat-icon-button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.topcoat-icon-button--quiet:hover, +.topcoat-icon-button--large--quiet:hover { + text-shadow: 0 1px #fff; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px #fff; +} + +.topcoat-icon-button--quiet:active, +.topcoat-icon-button--large--quiet:active { + color: #454545; + text-shadow: 0 1px #fff; + background-color: #d3d7d7; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +/* topdoc + name: Large Icon Button + description: Like large button, but it has an icon. + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - icon + - large +*/ + +.topcoat-icon-button--large, +.topcoat-icon-button--large--quiet { + width: 4.375rem; + height: 4.375rem; + line-height: 4.375rem; +} + +.topcoat-icon-button--large:active { + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +/* topdoc + name: Large Quiet Icon Button + description: Like large button, but it has an icon and this one is quiet. + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + markup: + + + tags: + - desktop + - light + - mobile + - button + - icon + - large + - quiet +*/ + +.topcoat-icon-button--large--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.topcoat-icon, +.topcoat-icon--large { + position: relative; + display: inline-block; + vertical-align: top; + overflow: hidden; + width: 1.62rem; + height: 1.62rem; + vertical-align: middle; + top: -1px; +} + +.topcoat-icon--large { + width: 2.499999998125rem; + height: 2.499999998125rem; + top: -2px; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.input { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + vertical-align: top; + outline: none; +} + +.input:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.list { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +.list__header { + margin: 0; +} + +.list__container { + padding: 0; + margin: 0; + list-style-type: none; +} + +.list__item { + margin: 0; + padding: 0; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.list, +.topcoat-list { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +.list__header, +.topcoat-list__header { + margin: 0; +} + +.list__container, +.topcoat-list__container { + padding: 0; + margin: 0; + list-style-type: none; +} + +.list__item, +.topcoat-list__item { + margin: 0; + padding: 0; +} + +/* topdoc + name: List + description: Topcoat default list skin + markup: +
    +

    Category

    +
      +
    • + Item +
    • +
    • + Item +
    • +
    • + Item +
    • +
    +
    + tags: + - mobile + - list +*/ + +.topcoat-list { + border-top: 1px solid #bcbfbf; + border-bottom: 1px solid #eff1f1; + background-color: #dfe2e2; +} + +.topcoat-list__header { + padding: 4px 20px; + font-size: 0.9em; + font-weight: 400; + background-color: #cccfcf; + color: #656565; + text-shadow: 0 1px 0 rgba(255,255,255,0.5); + border-top: 1px solid rgba(255,255,255,0.5); + border-bottom: 1px solid rgba(255,255,255,0.23); +} + +.topcoat-list__container { + border-top: 1px solid #bcbfbf; + color: #454545; +} + +.topcoat-list__item { + padding: 1.25rem; + border-top: 1px solid #eff1f1; + border-bottom: 1px solid #bcbfbf; +} + +.topcoat-list__item:first-child { + border-top: 1px solid rgba(0,0,0,0.05); +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.navigation-bar { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + white-space: nowrap; + overflow: hidden; + word-spacing: 0; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.navigation-bar__item { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; +} + +.navigation-bar__title { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.navigation-bar, +.topcoat-navigation-bar { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + white-space: nowrap; + overflow: hidden; + word-spacing: 0; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.navigation-bar__item, +.topcoat-navigation-bar__item { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; +} + +.navigation-bar__title, +.topcoat-navigation-bar__title { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/* topdoc + name: Navigation Bar + description: A place where navigation goes to drink + markup: +
    +
    +

    Header

    +
    +
    + tags: + - desktop + - light + - mobile + - navigation + - bar +*/ + +.topcoat-navigation-bar { + height: 4.375rem; + padding-left: 1rem; + padding-right: 1rem; + background: #e5e9e8; + color: #000; + box-shadow: inset 0 -1px #b9bcbc, 0 1px #d4d6d6; +} + +.topcoat-navigation-bar__item { + margin: 0; + line-height: 4.375rem; + vertical-align: top; +} + +.topcoat-navigation-bar__title { + font-size: 1.3rem; + font-weight: 400; + color: #000; +} + +/* +Copyright 2012 Adobe Systems Inc.; +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.notification { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +/* +Copyright 2012 Adobe Systems Inc.; +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.notification, +.topcoat-notification { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +/* topdoc + name: Notification + description: Notification badge + markup: + 1 + tags: + - desktop + - light + - mobile + - notification +*/ + +.topcoat-notification { + padding: 0.15em 0.5em 0.2em; + border-radius: 2px; + background-color: #ec514e; + color: #fff; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +input[type="radio"] { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.radio-button { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.radio-button__label { + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.radio-button:before, +.radio-button:after { + content: ''; + position: absolute; + border-radius: 100%; +} + +.radio-button:after { + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.radio-button:before { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +.radio-button--disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +input[type="radio"] { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.radio-button, +.topcoat-radio-button__checkmark { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.radio-button__label, +.topcoat-radio-button { + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.radio-button:before, +.radio-button:after, +.topcoat-radio-button__checkmark:before, +.topcoat-radio-button__checkmark:after { + content: ''; + position: absolute; + border-radius: 100%; +} + +.radio-button:after, +.topcoat-radio-button__checkmark:after { + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.radio-button:before, +.topcoat-radio-button__checkmark:before { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +.radio-button--disabled, +input[type="radio"]:disabled + .topcoat-radio-button__checkmark { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Radio Button + description: A button that can play music, but usually just plays ads. + modifiers: + markup: + + +
    +
    + + +
    +
    + + +
    +
    + + + examples: + Mobile Radio Button: http://codepen.io/Topcoat/pen/HDcJj + tags: + - desktop + - light + - mobile + - Radio +*/ + +input[type="radio"] { + height: 1.875rem; + width: 1.875rem; + margin-top: 0; + margin-right: -1.875rem; + margin-bottom: -1.875rem; + margin-left: 0; +} + +input[type="radio"]:checked + .topcoat-radio-button__checkmark:after { + opacity: 1; +} + +.topcoat-radio-button { + color: #454545; + line-height: 1.875rem; +} + +.topcoat-radio-button__checkmark:before { + width: 1.875rem; + height: 1.875rem; + background: #e5e9e8; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px #fff; +} + +.topcoat-radio-button__checkmark { + position: relative; + width: 1.875rem; + height: 1.875rem; +} + +.topcoat-radio-button__checkmark:after { + opacity: 0; + width: 0.875rem; + height: 0.875rem; + background: #666; + border: 1px solid rgba(0,0,0,0.1); + box-shadow: 0 1px rgba(255,255,255,0.5); + -webkit-transform: none; + -ms-transform: none; + transform: none; + top: 7px; + left: 7px; +} + +input[type="radio"]:focus + .topcoat-radio-button__checkmark:before { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +/* +Copyright 2012 Adobe Systems Inc.; +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* +Copyright 2012 Adobe Systems Inc.; +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.range { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + vertical-align: top; + outline: none; + -webkit-appearance: none; +} + +.range__thumb { + cursor: pointer; +} + +.range__thumb--webkit { + cursor: pointer; + -webkit-appearance: none; +} + +.range:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* +Copyright 2012 Adobe Systems Inc.; +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* +Copyright 2012 Adobe Systems Inc.; +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.range, +.topcoat-range { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + vertical-align: top; + outline: none; + -webkit-appearance: none; +} + +.range__thumb, +.topcoat-range::-moz-range-thumb { + cursor: pointer; +} + +.range__thumb--webkit, +.topcoat-range::-webkit-slider-thumb { + cursor: pointer; + -webkit-appearance: none; +} + +.range:disabled, +.topcoat-range:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Range + description: Range input + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + examples: + mobile range: http://codepen.io/Topcoat/pen/BskEn + tags: + - desktop + - mobile + - range +*/ + +.topcoat-range { + border-radius: 6px; + border: 1px solid #a5a8a8; + background-color: #d3d7d7; + height: 1rem; + border-radius: 30px; +} + +.topcoat-range::-moz-range-track { + border-radius: 6px; + border: 1px solid #a5a8a8; + background-color: #d3d7d7; + height: 1rem; + border-radius: 30px; +} + +.topcoat-range::-webkit-slider-thumb { + height: 3rem; + width: 2rem; + background-color: #e5e9e8; + border: 1px solid #a5a8a8; + border-radius: 6px; + box-shadow: inset 0 1px #fff; +} + +.topcoat-range::-moz-range-thumb { + height: 3rem; + width: 2rem; + background-color: #e5e9e8; + border: 1px solid #a5a8a8; + border-radius: 6px; + box-shadow: inset 0 1px #fff; +} + +.topcoat-range:focus::-webkit-slider-thumb { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +.topcoat-range:focus::-moz-range-thumb { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.search-input { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + vertical-align: top; + outline: none; + -webkit-appearance: none; +} + +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +.search-input:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.search-input, +.topcoat-search-input, +.topcoat-search-input--large { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + vertical-align: top; + outline: none; + -webkit-appearance: none; +} + +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +.search-input:disabled, +.topcoat-search-input:disabled, +.topcoat-search-input--large:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Search Input + description: A text input designed for searching. + modifiers: + :disabled: Disabled state + markup: + + + tags: + - desktop + - light + - mobile + - text + - input + - search + - form +*/ + +.topcoat-search-input, +.topcoat-search-input--large { + line-height: 3rem; + font-size: 16px; + border: 1px solid #a5a8a8; + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); + color: #454545; + padding: 0 0 0 2rem; + border-radius: 30px; + background-image: url("../img/search.svg"); + background-position: 1em center; + background-repeat: no-repeat; + background-size: 16px; +} + +.topcoat-search-input:focus, +.topcoat-search-input--large:focus { + background-image: url("../img/search_dark.svg"); + background-color: #edf1f1; + color: #000; + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +.topcoat-search-input::-webkit-search-cancel-button, +.topcoat-search-input::-webkit-search-decoration, +.topcoat-search-input--large::-webkit-search-cancel-button, +.topcoat-search-input--large::-webkit-search-decoration { + margin-right: 5px; +} + +.topcoat-search-input:focus::-webkit-input-placeholder, +.topcoat-search-input:focus::-webkit-input-placeholder { + color: #c6c8c8; +} + +.topcoat-search-input:disabled::-webkit-input-placeholder { + color: #000; +} + +.topcoat-search-input:disabled::-moz-placeholder { + color: #000; +} + +.topcoat-search-input:disabled:-ms-input-placeholder { + color: #000; +} + +/* topdoc + name: Large Search Input + description: A large text input designed for searching. + modifiers: + :disabled: Disabled state + markup: + + + tags: + - desktop + - light + - mobile + - text + - input + - search + - form + - large +*/ + +.topcoat-search-input--large { + line-height: 4.375rem; + font-size: 1.3rem; + font-weight: 200; + padding: 0 0 0 2.9rem; + border-radius: 40px; + background-position: 1.2em center; + background-size: 1.3rem; +} + +.topcoat-search-input--large:disabled { + color: #000; +} + +.topcoat-search-input--large:disabled::-webkit-input-placeholder { + color: #000; +} + +.topcoat-search-input--large:disabled::-moz-placeholder { + color: #000; +} + +.topcoat-search-input--large:disabled:-ms-input-placeholder { + color: #000; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.switch { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +.switch__input { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.switch__toggle { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.switch__toggle:before, +.switch__toggle:after { + content: ''; + position: absolute; + z-index: -1; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +.switch--disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.switch, +.topcoat-switch { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +.switch__input, +.topcoat-switch__input { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.switch__toggle, +.topcoat-switch__toggle { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.switch__toggle:before, +.switch__toggle:after, +.topcoat-switch__toggle:before, +.topcoat-switch__toggle:after { + content: ''; + position: absolute; + z-index: -1; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +.switch--disabled, +.topcoat-switch__input:disabled + .topcoat-switch__toggle { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Switch + description: Default skin for Topcoat switch + modifiers: + :focus: Focus state + :disabled: Disabled state + markup: + +
    +
    + +
    +
    + + examples: + mobile switch: http://codepen.io/Topcoat/pen/upxds + tags: + - desktop + - light + - mobile + - switch +*/ + +.topcoat-switch { + font-size: 16px; + padding: 0 1.25rem; + border-radius: 6px; + border: 1px solid #a5a8a8; + overflow: hidden; + width: 6rem; +} + +.topcoat-switch__toggle:before, +.topcoat-switch__toggle:after { + top: -1px; + width: 5rem; +} + +.topcoat-switch__toggle:before { + content: 'ON'; + color: #0083e8; + background-color: #e0f0fa; + right: 1rem; + padding-left: 1.5rem; +} + +.topcoat-switch__toggle { + line-height: 3rem; + height: 3rem; + width: 2rem; + border-radius: 6px; + color: #454545; + text-shadow: 0 1px #fff; + background-color: #e5e9e8; + border: 1px solid #a5a8a8; + margin-left: -1.3rem; + margin-bottom: -1px; + margin-top: -1px; + box-shadow: inset 0 1px #fff; + -webkit-transition: margin-left 0.05s ease-in-out; + transition: margin-left 0.05s ease-in-out; +} + +.topcoat-switch__toggle:after { + content: 'OFF'; + background-color: #d3d7d7; + left: 1rem; + padding-left: 2rem; +} + +.topcoat-switch__input:checked + .topcoat-switch__toggle { + margin-left: 2.7rem; +} + +.topcoat-switch__input:focus + .topcoat-switch__toggle { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +.topcoat-switch__input:disabled + .topcoat-switch__toggle:after, +.topcoat-switch__input:disabled + .topcoat-switch__toggle:before { + background: transparent; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.button, +.topcoat-tab-bar__button { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +.button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.button--disabled, +.topcoat-tab-bar__button:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +.button-bar, +.topcoat-tab-bar { + display: table; + table-layout: fixed; + white-space: nowrap; + margin: 0; + padding: 0; +} + +.button-bar__item, +.topcoat-tab-bar__item { + display: table-cell; + width: auto; + border-radius: 0; +} + +.button-bar__item > input, +.topcoat-tab-bar__item > input { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.button-bar__button { + border-radius: inherit; +} + +.button-bar__item:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Tab Bar + description: Component of tab buttons + modifiers: + :disabled: Disabled state + markup: +
    + + + +
    + examples: + mobile tab bar: http://codepen.io/Topcoat/pen/rJICF + tags: + - desktop + - light + - dark + - mobile + - tab + - group + - bar +*/ + +.topcoat-tab-bar__button { + padding: 0 1.25rem; + height: 3rem; + line-height: 3rem; + letter-spacing: 1px; + color: #454545; + text-shadow: 0 1px #fff; + vertical-align: top; + background-color: #e5e9e8; + box-shadow: inset 0 1px #fff; + border-top: 1px solid #a5a8a8; +} + +.topcoat-tab-bar__button:active, +.topcoat-tab-bar__button--large:active, +:checked + .topcoat-tab-bar__button { + color: #0083e8; + background-color: #e0f0fa; + box-shadow: inset 0 0 2px #c0ced8; +} + +.topcoat-tab-bar__button:focus, +.topcoat-tab-bar__button--large:focus { + z-index: 1; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.input, +.topcoat-text-input, +.topcoat-text-input--large { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + vertical-align: top; + outline: none; +} + +.input:disabled, +.topcoat-text-input:disabled, +.topcoat-text-input--large:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Text input + description: Topdoc text input + modifiers: + :disabled: Disabled state + :focus: Focused + :invalid: Hover state + markup: + +
    +
    + +
    +
    + + tags: + - desktop + - mobile + - text + - input +*/ + +.topcoat-text-input, +.topcoat-text-input--large { + line-height: 3rem; + font-size: 16px; + letter-spacing: 1px; + padding: 0 1.25rem; + border: 1px solid #a5a8a8; + border-radius: 6px; + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); + color: #454545; + vertical-align: top; +} + +.topcoat-text-input:focus, +.topcoat-text-input--large:focus { + background-color: #edf1f1; + color: #000; + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +.topcoat-text-input:disabled::-webkit-input-placeholder { + color: #000; +} + +.topcoat-text-input:disabled::-moz-placeholder { + color: #000; +} + +.topcoat-text-input:disabled:-ms-input-placeholder { + color: #000; +} + +.topcoat-text-input:invalid { + border: 1px solid #d83b75; +} + +/* topdoc + name: Large Text Input + description: A bigger input, still for text. + modifiers: + :disabled: Disabled state + :focus: Focused + :invalid: Hover state + markup: + +
    +
    + +
    +
    + + tags: + - desktop + - light + - mobile + - form + - input + - large +*/ + +.topcoat-text-input--large { + line-height: 4.375rem; + font-size: 1.3rem; +} + +.topcoat-text-input--large:disabled { + color: #000; +} + +.topcoat-text-input--large:disabled::-webkit-input-placeholder { + color: #000; +} + +.topcoat-text-input--large:disabled::-moz-placeholder { + color: #000; +} + +.topcoat-text-input--large:disabled:-ms-input-placeholder { + color: #000; +} + +.topcoat-text-input--large:invalid { + border: 1px solid #d83b75; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.textarea { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + vertical-align: top; + resize: none; + outline: none; +} + +.textarea:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.textarea, +.topcoat-textarea, +.topcoat-textarea--large { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + vertical-align: top; + resize: none; + outline: none; +} + +.textarea:disabled, +.topcoat-textarea:disabled, +.topcoat-textarea--large:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Textarea + description: A whole area, just for text. + modifiers: + :disabled: Disabled state + markup: + +
    +
    + + tags: + - desktop + - light + - mobile + - form + - input + - textarea +*/ + +.topcoat-textarea, +.topcoat-textarea--large { + padding: 2rem; + font-size: 2.5rem; + font-weight: 200; + border-radius: 6px; + line-height: 3rem; + border: 1px solid #a5a8a8; + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); + color: #454545; + letter-spacing: 1px; +} + +.topcoat-textarea:focus, +.topcoat-textarea--large:focus { + background-color: #edf1f1; + color: #000; + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +.topcoat-textarea:disabled::-webkit-input-placeholder { + color: #000; +} + +.topcoat-textarea:disabled::-moz-placeholder { + color: #000; +} + +.topcoat-textarea:disabled:-ms-input-placeholder { + color: #000; +} + +/* topdoc + name: Large Textarea + description: A whole area, just for text; now available in large. + modifiers: + :disabled: Disabled state + markup: + +
    +
    + + tags: + - desktop + - light + - mobile + - form + - input + - textarea +*/ + +.topcoat-textarea--large { + font-size: 3rem; + line-height: 4.375rem; +} + +.topcoat-textarea--large:disabled { + color: #000; +} + +.topcoat-textarea--large:disabled::-webkit-input-placeholder { + color: #000; +} + +.topcoat-textarea--large:disabled::-moz-placeholder { + color: #000; +} + +.topcoat-textarea--large:disabled:-ms-input-placeholder { + color: #000; +} + +@font-face { + font-family: "Source Sans"; + src: url("../font/SourceSansPro-Regular.otf"); +} + +@font-face { + font-family: "Source Sans"; + src: url("../font/SourceSansPro-Light.otf"); + font-weight: 200; +} + +@font-face { + font-family: "Source Sans"; + src: url("../font/SourceSansPro-Semibold.otf"); + font-weight: 600; +} + +body { + margin: 0; + padding: 0; + background: #dfe2e2; + color: #000; + font: 16px "Source Sans", helvetica, arial, sans-serif; + font-weight: 200; +} + +:focus { + outline-color: transparent; + outline-style: none; +} + +.topcoat-icon--menu-stack { + background: url("../img/hamburger_dark.svg") no-repeat; + background-size: cover; +} + +.quarter { + width: 25%; +} + +.half { + width: 50%; +} + +.three-quarters { + width: 75%; +} + +.third { + width: 33.333%; +} + +.two-thirds { + width: 66.666%; +} + +.full { + width: 100%; +} + +.left { + text-align: left; +} + +.center { + text-align: center; +} + +.right { + text-align: right; +} + +.reset-ui { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/* This file should include color and image variables corresponding to the dark theme */ + +/* Call To Action */ + +/* Icons */ + +/* Navigation Bar */ + +/* Text Input */ + +/* Search Input */ + +/* List */ + +/* Checkbox */ + +/* Overlay */ + +/* Progress bar */ + +/* Checkbox */ + +/* Radio Button */ + +/* Tab bar */ + +/* Switch */ + +/* Icon Button */ + +/* Navigation bar */ + +/* List */ + +/* Search Input */ + +/* Textarea */ + +/* Checkbox */ + +/* Radio */ + +/* Range input */ + +/* Search Input */ + +/* Switch */ + +/* This file should include color and image variables corresponding to the light theme */ + +/* Call To Action */ + +/* Icons */ + +/* Navigation Bar */ + +/* Text Input */ + +/* List */ + +/* Overlay */ + +/* Progress bar */ + +/* Checkbox */ + +/* Range input */ + +/* Radio Button */ + +/* Tab bar */ + +/* Switch */ + +/* Containers */ + +/* Icon Button */ + +/* Navigation bar */ + +/* List */ + +/* Search Input */ + +/* Text Area */ + +/* Checkbox */ + +/* Radio */ + +/* Range input */ + +/* Search Input */ + +/* Switch */ + +/* Text Input */ + +/* Radio input */ + +/* Overlay */ + +/* Textarea */ + +/* Progress bar container */ + +/* Progress bar progress */ + +/* Search input */ + +/* Switch */ + +/* Notification */ \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.eot b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..9e9e4de2601568908009b24f1cbc8adff31884ac GIT binary patch literal 23949 zcmafaWmFw8+wFmaySwYb5AJYqcPUWZ-Mv6@clY8}pt!qxad&quT1vlu@4EN>bAQ~- zO0u7woju9?m^EvX#2Ekpa{2%O^uG%R@UKROMFheCp`l@*0Etk5f1IK!JODuP5B@i$ zKmjQJH+X7RXZSDqUqA-X05}0W0ImQtfW<$d#J|Y=KS=c-=k!m922lSOTm94615EyL zfPY#0AL9ye1K9jiIR5L!4qyd<|CL~XAVBq>S^qyHrTBlw2>^&|$f*8zs{aQ70SV3k zffj&37l6MFYx*pD?2G-UacesV`v7Muw{v4=FJ=`-#)KPS@Up;AoU4^?F^FhgaWK)0^V?fR>0S!b@kdw;US{iux8omllE=Yh;5(x9_g(|38@ zyyi#?v4ha!4Y8`i&>TNKRjpF88rV0aL(RvpMKulbs}ZIp22>94J)bu5^^M$v_Ff0e z2>A`;LXZ{Wzz|iP*7d``CpoE*mHp~&Pgfu=eH_KDDI5is-sw~qIewk--eT$c35I2VDU4uueq=p zJ*jT`chYo+F!O@eAlz<;m6q4xK1?Mu0q+c=XrEF`BFgt~hO_hd?Cz#W;jMGoH2l@zqQAtgy zg!6nM;TI|Ip}?%{6|%Bup|uGBlw4T&&YMz?FeWICDr$z9Vge$X%F-sX)ccS|ohBd~ zv4Z7!k)p}?g#9LJ0-84*o<;YG@xIwHk3R?*j5p9g3KDvBE6D|j!?L2b{7tjWxIbe~ zJ96hb4JUC&KxEA&;|oacHp1O#7@5Hj{jQ-62IHSGTyAp7+)#(Da<({9IvG_#SbJr<0jh|p5B2SgB&RX~9&Y`%G zKXGF&%4+D!`Vby>T4oVX2hR^OW7^lZFsjMx6;FP%5NB_xDUC0!iMC-Zvu1ZWjb&$H zqSOb-B%R1Fo_1CX7eL9Y>EJWgL`P{>d43}q`i6oc(S)}pHqmUPZRUE6x-t?}uUuUv zT`ln5&Vqa7eDq0yEq0#Vk-1c7xItl!Vy>o-x+Yr1zRp4aTt#nRXLYL4Wx;jK=CM&H z1e%~&r!?KhoSmCUk?fBDXiJ8YF33}R62>hx8i+2>#eL*0aQ*JfDiV{X`m zO+zrY>nP^O%8R7VR zI+#zTDP~k;kmGWr*UD(J3@aHALG&(3(~!G$%)*r+nx@{{VzX>cd#Rn3F`z>wtza&B z#W(K>(}Tr1O~xxDxy&+(usk9UWsAS6uQT6z0$QplsjRY*<{6HSC2P5QjEOWuXt^2r zP20(V)^W3uzr&Kjl!6T5((+HO0{ddEd~7$A4mMcG;gmwz0AHbcR~lSJ5)X$l@rZ*U zKb)VLPUaqAn635s)-ono`1+4q6?G)L0!7>hZQF{(NA^8J5#szR73N3|?QuH$AXzF& zr?^2522+ZetW_ja&8e%5xtfaYAz@Sgv2-po!!=G$!Cy&I@NGIQ2!(&`=PKV*uf>xW zaaflnDbRWLhNbT=#_U@R{h+A|M;ArX^=#3$y z8abe(5Ri6EDHU*O4*Ww9V=_Tng5y_h#9rek6OdXT{)zDuL&6HjK)d8l63-I+*>N5G zg{SfBY1z-Bf?RHv6=MWUn<$HBCKp}@wV}3O5zbDU)l{gK8n^;1%0H+TmiB8{6)3i^ zLRBRLztA*FF?sx4#6e!u=%@+s{2~D@Q?-a9sPlaO=U9*YB4wFSQB+Y+i3;dMW_@zZ z0!F_p<7i%m=MM6Auf=sVOk{M2RZ>Msi1HqmCw|+|Wh#MzAJ&XAwrt{_Vuthk#w2*w zs#>@1GgXgWXDuQ&O|v@^1wR{{6x4#$9&$)Ni03NMV)NVBQd;Z!C~sv=|3I6VNu1R* zApYqv6d>svVHx-0L*#qtskbbF6PbHy&$RADdbk#N<;A=;FrXq?d)k6Jt5$;ZJFbsw znd`fQK*wuXMw&(or_0`ptfStpF5OIJ8E)8OmZEN3M|CXiC<%iefgL`3)zhWFr#beH zmqgoI6<&U1$_CJFoySb%ytn<<5KAC9tY1m-7zvd)h#5SR_K@QkcS*?CND14|I3V{L z(C}8ii1>0nYLa^|6hMbAlPJs)6j_D-i;$U=F_bsrE|HUe;)BTKy5!beKva@Dvr33K zoL(9#Mr2Fftb;eWPDM@wvRJo%1-HNC>qbU{=ZhIc1ifsm4X(}VOS8`WP*Oh{k;63c zFd#2GE~vKRR`kw(to8yjVvRu&y3dQ`G+=5{DdbLge^os%lzGlCjko=ea(Mf zqJKz#9-2>>;+`71@Q>PI!ijo@K~f+;#pwY}D@;R%g!>-kW$&TgPz_k9q0VU*{Wxq$ z@dsNRfhrnNR?N|K-1JDzQ~C0w>GVr|rk3(c6=$DzYy8~nK4qg0XEe=WL?mUg39AeG zX!s6%_q{}dl!RA&#}prB^Sm|GPZJx(2G4iXoE@!vIUx%+^It{Lk7AkA&P3q_qm}Jc zc6#v;3~b=XF0x)pQQZ%=$m`yeEGf$Ys&hhRFJ1x8sjMkmrej<0-K`SX=I^L_Fl1=B zk_Oq=naSDny3&DW<9^%=`ih&9c5_s5)K=7F^a+$$I4|30c!KE=Ct9^wrNrF(sKsw=2tH{TgcZzr`*+7=QIXIUMj^DO`xk3t;*nUx)ft&yBY`FQTmctS+o;of znWjZHwS#AgW`#)xtMiwBo@Vpn3D{GTk@a<_OSCc=SS6|tec3{);loaD@jw3r#g@>> zTq1V{lq6;3Vly|}Nv{w$xrsy^FXhq)_LoZqPiqwswWeAjneGq$$%k?WOp^P?=;U7hU z;nz@!^Jckj6Ln!^fPv%L-D=w_rSS7iWtN^Pk;K6{g9y!&B|8?f2z49cLyi`h`hCB) z6q`o6R{LqrnzXZnUwDLebJItvTmn(1SSx**mL#G#mFWRKSURD+h(E$q-{9bXha{%T z;+-5xUULQ}T=LNg%)<7d4Lsnk;WpmhaNYsR9H5=}c;3=^p@~ zv$Wot2K>>fQimO7Q{^iiJrm*l`U*6SLw5Y&Pm)-F??AA52`P|SOl`^@bzbXOv#o-% zdfby0iIm}#3#m{37SaqnKlasNlq!dAZLFUo(j3Ho&QzCvs0th4sx~R2E{2c4l)UkA z^*A+fw%JY#7x_Qh@R&(f7;)9_nc!=yFRH)-WN_VoW zzZkU}E>wNtP4z-mB|AZrMmOaDybX^wn}F5a{h(#%_sHjccVFoiuCh=&=jJF}E^3{VYiq2C^)21=BJ)K8i(`dpxO_Zl?-tDF*eloZXSpAgvSf5-q#Q_fx+EqY;CQql>i;^ z1xG)AIuAGL&-=189myLepcXL=i5-KLLBs>(S=l+_p(Wi2!|)5?l=Fr@rXurX_Q*5+ z%JPkFaX*0laq1!;DPb>4@dk0FCD-u16FSNK5LgF=A+~!&S=j({M1qiTNBf~P2Dmg^ zAQM^vxX$VCI)sv4RiA3vUKhSvGp*O%C0IjVLkh0D9xhZVp3|@};GWV}1dHoB%Uv{#u)S_GV5GS`_JkQWGUt>0@Ca z4S`p&0xrNIE;VzHawi8}nm28vc{N+V#H=!c%DsIWclurV3N6sN|7gLIm$bPYM-GPUF)9bkjPDWgHx> z6Ep^i{7slQ#~zRYkHN!v9GvYDfz=)rkB%|bWUI%C=r4%j+}ud%iiGc#NDK+M0{0?T zBkJU7oMuT~Qm_Kopm5QJ|30J}==k#aMT9-DrW0*0E*WC&1FP^lp3ua_hHKBcQ?Q-- zwTqt*|Jxo?Y@1wP+eP1M8un3nI8oMl1&rE(kOS62T?hWLE5=-Ae%7vR0-G??QKLe-1)4;ic z_;(R;4b-W0oiMO^7y-&E@5W!EPgxumJTgs-wfosNT?P;UR?N9W%j$&brwtf(mf0*( z(9i7 zgxKe+Kg~L;4OH7obAbZ;Rg1lDyqo6Jc>Gt98=$=-;}#v|>*idSAdeC3UT=qoE$#CrRccI>P(xbB=s&tbL5_dB!u+9qi6futk_v%z(s$f)li=rxZnH)2W%yTms zNMLF<5HVoA(KNds0WWQk)8`jbe;k$oy(+VfxAlRdRYA~$7C5l$)&2k%aA&sI(ZdlG zX1q+H<2ftWIk(pPc6sDp=_dT`+MUd71(|A4B7Gu)Pk$xQmfuXK2r5@i;87ICVv#T+ zmsXVcXM$d~aH;i<3I-X@k~rgF58O!&KVp`{gK=Jr>6#q{o$0L^Zy~mkTGW{8%)}$+ zSK>0Cf=F;s{R1>r0&E1fq^rM=+vV)4Ov&MCv1sa$Q#jD_hFfdpCUYbp+Qckjw<&S- z?Icj$VKiEuVC8{a3QLuI#Sl5pK7U(X?L(;%165L_LEYZv=j&)G9wd>WY8fFpfx`N#=Mu2(V&*my z9q(8JhmfqUg_i5RgON2pk`H3F=DO1uE`G!hs0#2fbKAP!r<*8_*|%z@lv=mdBRFb_ zfLadnu|dq~PPtAI!x7<9@=-%U{nNPmeS4>(f^g7zxzIFwm}*C%x(*%>W=@ob?YS@W zI_0Sv=SQh8_Ch8}YSRo=7;acZw&=gdc}0}`$t-L06=_c2!*qDNH8WWz3$na5#N4dKy6GUe)If)^m~S+h1k zGJly`SRG3(v!}l;g@lqS1i_o{0gLA)QAIC9oJqB>maQ7?mOhLL^$}gn?OVjOPD~L! z9y>uG=Ngw7MIhlCnixDok~`f8+Z{%w9ff&VUY%pq(Fi7vNtxa64{69!rXZJt*!~ia zQ2ZpN@0sRdwgjp8XT?_EObzE5*T~#iqy)TqQ@KPMpV}cSk7(z5AHNxi%#}mE^aA)K z2)?O^r>slHTHK}r;Zo-QjLBR~IT!hT2DMCOrY1fQk1(Wo?fW8JskeV35`LBSJP9*r zs;U-_q1|eJ{Q(cdmSaft&qZ-(0Rv6#Z{xUljBOXSlqf`t=eviWjE1frKd?skFuvvV%IgrfW7lPt#Sn`-{&|kak%(Gw-b<3uhcE#hjF{0qCZ_5s+GmLUe`U33JXZlR= z>g=xHdXIqXFya&-^;it3SkF_D8m`6R7yruUS~VStRHzueqeFw#R~=%jXpqzMA%xNk zQFr?H!oY{u`I?Ri=ad~c$#WgV~BRg=~ImMg&5O2Fi@49+Z*sdX)8%D$EFmHGCx!mLQOXi$an)=$5UY_mx#{FJU zUMEG@C~^GT%NRt%On||d`{vfV1goc#!y-#ebGc9+n;%!Ae;>a~eE6p!CFkC=1gzf3`;e2 zpGSV)Mh-IpSP6*>1vr+(Z|PFd(K(3;)1i!%=pK<0_Hz+`PCmX|N$W0F3^;Eix>*7km|(o5Kvwvy}4Jtyub{B4oo+cGwxH)Qg`TV!N`} z3>A?stP!-T^PW@eXNhBi1Z~oaB~k$8+L+~U)XJ;ufjrKt>|IhdbP|mdO19r(DEDN> z6&XauqI<%*s><2af{o@wFcl>Wh20f{h$L1zDP7Qi0Q9CYdLp<#5Zf?`3M@tZU)kfP zu2gg;pm4ixh%pF&QLwRd8RJvPSR>9L^>7?prNWhFRSav|^7cncv*3$_g?A+&xV|=7 zzBz(-HRQy@RvVR%el0jL5)S|AD$p0x#JT%rThUHvn>T zZdk&nl{YWy&8n8mxxi>wn8i%t@aR&!Lz79on#WQ{G?b4;MotNJNE~v~ zNmS68cucgbL)N$m`AaBwT@z?|R*K^5V1s+8BV16rmKAe8!F?^4X+X;a*XJ0A#-pM! zQz8dgr*D<$o@MT^&iPP=>#498E{OSHqAHOJt42ta=o734O2~eEgDbE_3XNKW15>w8 ziq{*hu3puo#n6X^k;)L}#J0o^(5<)NG`llF)r|m1wxnt1BK)f)qQ^bLp-a!)_j9G` z1n~!3EHLT7Ga(ccz&iB{`M(91S?q6mQ*MV&BuPUY^g|HbCqCsvGPmywITi+t-b-9K zU7CN@5>uS=UZ(d(TBsphXd?Ntr%OFcPcsqleIR#qZ>N6~tBVcJz{#J`O#d_3%n@n# zXWV3i+j=7fq4t-7`6?6Bg4}1H`69+rdL>9Nq&V{qyU6}~0r8|!;0Kwp_D?vxd_pCL zGzq#8vIX^iS-zQ5S2pUMD2i@%ra37u@I1N*;Rbyx>8!RIFS43(bprB~wQP~Kae0Ueq#VG#&k+Rz)AdFV2|DXpjEg!&`nWs4_SxYX8U zFU4EkqFaa<%{yK9bxejLdu$IgH0Ml2q$<%Lw_AI`Zx=dZ9v=89=fH4+V^W+Q@-*}U zTq$2y#`?A}NPp)+93Zay#UaNm2Yml!K$`4#8B`0&Wwft-`ET13qJ2N+Fm3^e~iKf%#7I8Db5 z6>gwUr~4qsF_Mh=rG%P5#r*3#muZ?wb=!x3N%G2`jpd5GNGAHh$L*ct5~7IA!3~U0 z8L7nY2=c10y?B*nUI;>ks@CV*$^45Z9HR95^mQ!B{2ayEr-qmzGmF5<^gLAYMFMoV z3N=l-paFoe3@neQzD%zt!vOtdcAje?HHExMO)0cm>(TE{Ctw`QoSBa@J1-k7@uKxc zgxEp3t0x_&_7R=?6Ey~$u1g$#1C@<91`>aKXThYmczG^!O`CD5cW+zw484w~cDp5a z)avDK>&-Z3QiWAUA4qtxEq_kJaU)9mPHoWGdA5?GXykikm`v90+Ucl@xeV@3U_<|0 z0YFF{WUpIdCINhN-0prx9uqyIh1gr2;PbtzxY*}F#euE z4x9h?FOh}|hvNjl!Wif6C?b@pBwWBhA`eneuaON6cgoV`T7>-#+@{L*xFES0JryIr zFK1AB&4>3;$1$)ZDfW3kuLgUg&iolK7TmS2tA#9YGbLNzv2V>1DCOy#RfpuDu=jPl5NgiDi9G8c(K|+(n`1t}9(b>{`RV=c zQn(f|#o19uFF+U8M!Qefxd043OLTqrX|vfsnZGI%xJ&=|Lld*~b&QHg*atn)60mY{ zF{rD5TOK*4Hun&hg-_bl-n0AN(zAE74nk1nY#cFEyR3*w8>{Lq6r*9M2_+IQEvMw6 zSuTiEZbj@U`;9MbSv;|V&p*`V^kJ^BQJ_)ZeiO7Ny{wZfj*h-uHts{|S+fLKC9mo6 zl9)`G19%chD^0!SMgsWfMFOiAYXI)2loF;3t`eW>cleFGS^}1bbw%t3Ynj1T6MZiQ zG9nG&j3;Wh&jNnMkY#~X_8##{2^`u9{6q1$3cqh&bS<6UIt5~iRYfMTUu3AYD;Z67 z=7|~Ldx4Q?EY&DpKwaez{{6mGIOK&~NJcU2s0e*BQ^RqLZJbZXVg-{d39=463``yB z&a8Qnyv)ec6f6+BJyS>G9+EIlAsdvdT(*dYDz9b3qk6nn;bfsE>_6l4@8?XAra5E@)Q0RRL@~RJ17i6}*+8aXM&%k@wAape;sIS3nst zW9@f<7kdV89HZcn3PexJsmi(v*6<~qF1E5@^2R@34=f9DeZf=U(a#$&@D5R)KPyAh zDGO<$5T87{y=0A}HhG6w>#E<(hJM<%3+=`6jLF(bqgKdCZu;vqhtqN_?Q0;N9l9`5 z%nQe%=+J(|7leeKQuca#w+L4d((y+I8?IZkFc4Y2($IL6mPKHVXm?58azJ~VU{lyp zqZhp=9~jm`7gCFY2eeq$p%>}|#V}A)i!fEFHPi}XF#+*lzv9Mi&@a>n>*m0tdQ?S^ zD5JnT%D`K7_A2Xy3Ivd~k`J&!TUGQ5lbfLFHtrORd6?R8sh%s(l<}_mWO&H=w@zCQ zwJA7CCK6iyuT9nmL_kZX@~LJ7X#?=7Yrg^vZ*Y)E&-cNs`TZ?cjtLns6m4`9Id)9$ z;pB!=f*;w6!|!I-b#@+1O$r4F8`Ww3(sQfDaCcF;zSiFXoPe(WL$^)uRTj$;907OC zzjLVP&i`z*$TOX(_Rp}RQdq^uq6H2G^OL2g}o zeS7gaOBQj*<@B~ohyu*3{IEyn`8EC--6@1^08?}M*IPAomq=-QJOBy|UGjOguT5PwPR0n{wx zW&RtsGq5~r@&{N7O4_W9o)b7#o$5!IPoN(#|QX^sjh z{<&&Wyp`c+&>`tu`cF`hDQh2+4slx%W)QCN7IPgdhNnNCh2TZ%v}axj7x7UF7c5Gy%O}ccA4j4| zgwDN3W4!;RlFxs0dZimG+CFGbXFvnxPi!CGkR9hh&V8K`q^sD;Y8Mu9nKyh-M?!GL%RXPJ+36Td0W=&0?^*M@?jHe1a2sGAo#TXAegHY~5bwG7 z1bpM??-NQji87$gaw)}#tN$dJyrtzLF8}A6mxnyt5iq7Gll#+UkY3&C1@9_;h7S!vXT$;PU-@<Ig1~2jk zEf9yTIzX%Kpwg{o6!l{r7U%0Y9Dl=57&~gj&{_vV&2aEihSBZ8X2#is{T0J{hBvr! zpZNPrQ+x>NEM#{l36by7cu}8_9iS<_Uj^0<2^xj2Hzj>Vc1#yeI!&ii`7@kb!S)D$1G@sHtk? z?{xKnTEl0qbv*Y8in0{mfAMg(#&sHA%lKv#9BI`D$uei7fVjV3on#r`d>oXXOzXR6 zZf6%f_JRx0ocf7PVINfHZp(OMCQ$;KCYNkDgN9q9_pJ3lX2qBIZlak9SQY!lp2b3y*d_FrltYC$v~ z6XsUNaxeNJ0&*^rk)R3W)g0=?Xf1{CzSztNR8}F!X#I%HRoVD{%sFJA%T`Qk zvQld1RCSlHRt&$9i+?Jqc6nuybJov>LLI6< zIY^}rc*9ztZm;W76qnQJ#S&I?tg7x#@hZUQQcuLXfVb)=QqHYaJ??mM6)UsYB@9yj zlrcG`MooU^-`F7VXitwA1g@fg9g-8LP<|c9{JzItM>m3%?UWZql8;o^l)8DG=Z$?~ z>z!jPZzqN$mda;CNxo^qKa;Joz-2YExWkb`k#`DLHWxl80_E_uho)|{YXbd} zM4(d>?pCbFp%EI0YiS$C+Po?pRocvXJ_LE! zF$KskeWBV&SAQ?76M4&WoS^p*%_Zqwn&KTYy^X4#>GtWQQk&|wS73_XSTVwgsyg;O zm*oMsYrM#JJ$MXx*Y-Ubw$+#WIRoh_9X~?px&F8iH8SHya;qkNn+C?so!3d z=I>PN#$)T7qC><#FruNU3((lYBL?Az7YbYa1VA{n&1~)IN6N00pSIGTv*vA{1?U)E z(6Y^o;;iY#Wz=E#v5si=&t|q3c0)PN8O0}m4w#BWzKwX8il+Fsg=V3O`}jsFv7)ER zp<{RILRCdZ*&-HcEVN#2AXykkcSU(aKT4e%j{01Pd+`LUSD|C;SUv(QhSt6yofhDD zekT-J*9Knw_I_NjLRBm|YFLU9Ue%D$Pm}?|N|x)#Ss=!6_9=H2(nPt40smzFe%S zgHTCSDHq`^^Gx$oL2!%K60P($B!#%~iTX~8fdz%8jlwhWcFx-iJn{kXD?B4?_PYTX z_0f{$EaVd6g@F;bzZ`{O`vLswC41qs*bIN(LZ_L>%oTF@;?gi=`$Hv^yKI&3?A7?X zcg>^A>VN#ctNswPdIPQX*Hm;wC2&Puu;&;@V-M@MFe65Xm}E>YS{w&|K5)!w1`-SE zQ8R~f<-KNK!>uf*DeCw-FXOlnsCj=nLb zc3q|ZYE9j&2X&D)ZF?R(GimOm)%%jznB3AdT|~e|rIXcLCDo$Ye&SB_L052JBsA3x=jhJ?8ThXjuNj6Xr4<^HCFX~lk<1AB|ifPxSHs?Amee+r2=^VoB3!BC?GNnGg0^j4}9jtEP}WX=AO9>PZ# zeg2Fz2ff_91JlyOF0yU@)Q;L;$rh>&R&_I^-Dk<*?aUzPFeqJ7l zNkPS2rMZ7&i&mpR2t>7y?9$_e9^0J(GY6@x1}WH>t?9C(pL*wCu%7}=hn2X=45B{! z5UU$Mf=#JlNAXU)ds)n0rul$<4_K6OCQ)%In08F&rm|#v$vX$X4v^)V~<5 ztr&5xC5YYaJv`|KUh;S*A+F=pF_P+U}AG ziM4ybb0uyiDwhIzUNlyA^_=Iuf9z$`^wW-^CekNfD>RzQL^jaJA#L8M2ADw=Q&5Y* z>ZjTJ26^`J{A{KD%yhSHdDkVo5;J~#=IXX9Egk=r_<3H0$e9_w;af-@706Pzq21V( z*TnLt9jQ^@XOTvN7mPBhKIt?JExJ(l$Uc@Lbybzdi?F@WAT`gxe8L!j=!!=QA!n89 z8JAA}MY-JrlDD#Xpvo*epc%S@gV3(Z^qc~1<0a6?W)8t%3o|kx(P?AE48UhxxIJT4 zt#BZe+~J9{mEjL{wu;Kf9)S{bMR0>013NhExux1-evgY?N#6LEoLJJCU%FO7FE~P6 zx1T2{>6rsg8C_STbdSMNU+>!iD)~q!6!eqG*98*8@Q1-#G5=NQMb1C*@iU1_lLRVn zX&nh0ot;R6BR?af8y$RFx?QIjo9P(9B~QuTovm5A`pXp+M76Z~wF8S0h;Dn?ywW2$ zgZt4O^iFP;zl*o2>XAs|Elu=3+eeN0eX7eMkTFk|kLwimw0k^Ao%mdF#*R4PMAafM zo%p(Mo0{-PT#@~->Smlmvas?FOvQ=q9~`kW6B00+lRpQ?a9xn<`dJ%eVC!M9=_-Yb_!gQ0pY0(aJppLz0#3Xj0 ztRF`XJea@bMVSlT9t|Wgbcuvhvkt=3qNdt8ld{y=?{A`Zi;Mqu#_1PeNUOJ>wx9QTmIRY()H7GP-_ma!q!S)6CqaOM> zt|^T5s=EN!T1=eX2wV%`e^2>c$bRFIQRCAZfHE^{86OdaAo&T05^pVJk0WQOco^Xg z(~+y?^TcbaCnyYp@v9MzAo%bHae)e|E14P^)UBo7n-dCyzMM;kBKR0n*HT9c4+}xD z&LvG>2c_m}@J~(SHLjSg>5k~7fxI=oe;rgPbZ~V%T34=P(zO4$O}8J^az6HL44ckf z0zVDX+aD$I2Mk4R!e!$-=>Ed=SFh$Qq_qa~zOKME*tAuebjU7sJU(FbunvJ9OiMG8 zgjBSSlIil`=S-)}qRwu1@*C}z_`w5vknqn0#O@0#=-rRrw`U{9Ai3Po=1GWx<(Xdl zWT^P$amh7JwI43#*7G*H9Vq^T(rl&U7{LvdxXK##8<0=z%B7=YG0$`dUubzFr1b=l z|5bbGZihV$N%QA&g*u%gFfNGIsXlmHm!+QY-~RU95Uet}KA?Xj#U#uk^ry(nX4dwF zm74ADumEV4*wwed_!Unmc_)$Jm*-fb^7#@xG2VTY#xmP4sN358CK)YMMy@mm;f+7m zSZjx0P;I--0ZO#1*LRf+^gi#z_=PZ}^?{q;8}59{>#+Vr2_^yqIl~ma z)W2A1>2_!(gxW6$3S?dg#2%<0v0C_TwYhP$;AT{QsKtd$uGvt`Yw+xIYg89^s;a1) zQYx{CGxbtYZtj4wbxJ;Q;YHm|a=h+W(YQv8>V%-!=)c*JSQM{=F-(w2lq=i1V5h2& zKo4WqZP*}Vv6q*db2sgfeD|4?`D)Vh0FTs3AJ0`1_&O@~vmd65DQ31~)cs(X(OI89 z<4hdF1}DsYX$l>2;6b)DHG-D|SZjh^tZ!)0q(-C=dK=gEQ9hO3A<^MdgWPc;r((9) zxUdo2BN}O$;t$zy5Md^?arP0W%)ci+;zH>*jx7{#NmRWz!YTcfsiOOnm8O+eYtD(7 zVqB9r=^2(UTi~EvpkX|9_uQ~{(_6F@OT49~4K~F#zHD0cm^m_-7Lwnta0pDgozYTX z0$XcSGkbMZZu?cLrtkcy?CPBviqQ#}kBP)H7HIcrZb$SbKvL5lZ@`0q1vot<@Aw^`*4P31TapWq!r&z^O6JWz=;7=v3`B`W*DrUD-VseR1>GM_mMzSMPC^V1AKOO6=0@`N3^X- za+fNl_EqjR3NmJmQSw4t1@ z#UQv`at=*4ql$y$ zUj2?oE!U!{O?Ntiy0SdH31*G*hjX*rv!p@jr72K}QQ&hnN!gktO%Zh1%0-S3o2^A= z6;|pm!A!2A-^^~R0D@iG889cYBO9UbURhPPVg;(g=M}MT;l=Gi?0_J;kM8xrQ0l)O zoh**X5Kj<~WM}fhAViyjJ%&8gpi$LPrGU8KM`k*v^wF0{}Plv>h8JQ*|`G?y9D?~O5F8?Def)i{P%)BhnAYUsqcaBaU7qV=-oQ4ApMxz zr7>0{Q%d*9f*1<-HeJ9_Y7%$JNXGd5Xs*J!Kp+w6RYOdd8)}{~hcOe$Y4BRQxd z`DbUQ89rEXZh~BR;cVM)#9@czb`qdYca*zS*0>D^R5t>UjL#xWI0i-L6HhFzBi)3jTHRl^K|5XanB}Kwd$_ z^sVFV{`&Eij{JxIjPb2;k?Tik017MW<{Q;^AI#QiVGT2s!zS<`iZjoUDM*a18cH7% z76AZ&0zw%BXgXLpuXFH{fykXX)w?cPu;Q7sn7VIN0vwUlS{VBfv8YuTW@0MW#c_$J z-@u023k&nD`mB!o0%Yw;6EXYkO*7~(;Q-fSreWfd#ZS6BvUUnp?OiI+@4s3+oY?z1 zq|bQdiiIus=!%Ldcil`(Ntt7kij?QNJKkCPleQq`a7`;Ib`jp$^H^T@z4J2512GV; z93~JCW#9Ri0LssOb!F=ShrU&Z5^N^>Tf%RuZFnJy_I1B9?CXc4t571)NnAS#xQI|& zE-v>^M81(ajsi8L1SxQ^6@`gYQfm{jhMcfG0afL^Jw+h2yx0 zx4K`W+ai7Pw)Ux=8J5^&ny(tlAD2VQ#)v6kEBZuup%qkV7@gooF4|KJhH@*Yxd`=p zzO9|Ox4u6dJVEsxFcS;P>L;1!sLS6C70oyY+h$fBa_!|wG+<4suc*1RX+}Un6&1H3 zps%DRSXj8x95iAs#1{H|k&J~L7~^P~mdF}2m#_xp7sC)Nx#89RDY`xV!SNVjK^EA_ zDjVcE)qcZ%Ma8gBHduP5{#mS>fwdOn71f-{t$12)M4!{px(KDEEPrl9+?cv#?UV?x zEiCpO$kPV5BSOR0vw7$v7IYO$F0|!Ji~v<*^95Yz^0FA@0~_nc)nhKPH;4?9IV^DR zXyG>7gJoUzgscKp7V_?5qsAs?RR*dTHdNRZb3hG6^C%lt{+RkCz%S;vFDUUQNa5u< zT*W(c%QWUPxd|2_Vot)KmkOlA2?cj-2R+-tOV$2!)lIRvw$U)$S?)})1S0@3eykx( znKmSN1`D{mU_r~pPw7VuCkfbmYH^yg2DvVuqZyFC;9>9}-r$Y|Lov7s_7Nxxw|0cm z(nbXuVdfxV+wqs(8SWHWqkMi~!_pJwk#jDGN$$$s#r;dvVx?dl7Sc8AsML|#A&^P12sHd z%9(^@4f4@89Img6#nw4F1ZROXU~Ypza-`8mx3+|0+}BXSzm!csUav`SVJsev;pcH5 z^n9CCBr1khZRmaK_%H}}C_1A_91f-QGDOJPI8sq zZjM#{1O3Ff#DmZ#qD(!!fv0|MrLu^mu&mGje*(-LGvfyfBqDoPzKnc0<=`3h)E(+} z%&{{G!z8T4ftiwG5V@)a0uFp;^)ZyK!VHrkFqJrfS5VfDA1#Je+_NopR^eu-OqsX#-XL~`E^Jrp{klHFUC$FTMRB6|7 zM9Bp3r35(!JfHw>0(fB9uRBZ`c@XkKx%vyt#fH+TmT+12}JA#h`4dT*}w^NGbKd z+Ck1$F5DHjmVsExEYx)wjdz$z;*7a(N~#9NWCtPx9(6;kMd-*nj>5J!Y&hVw;GXml zb`Zz_YjE6(3O?1@Yn82O#%-Q3Ae^_SF}Mw6N`ov|*&S{OC8iKu+*zXd`7uur2iGQJ zxZ!qV$XqTLU0xSUvMV^-(d=rUaKafjMUAJLR4JyN>dblG=lWQYyGS+5fqB z0cfPhFss1zde4_l_?wbVa?>M`r(&WL5e|ee6u7vi*8`?2l)whjtTrY_h$!tEG;{^a zQzkyRo}>DfRF!C{wS}Y(Mn!MfNI0#HL_yBWa*~nEeJIdvo%ZSm4t=UC*>9sVBJ@{n zA;JQ30R>OxojiOFA1-v7Um*WE`@ToCQ0p51vNjYw8I#06E&Z1|>PQ%SvDDVLsP~P9 zF;SMs)It0IK=S^x>U)4>FerbR`1QvPqg44Be9`cKZ)~4(E1OEe3MKf!md^qgaG~k4 zhEt9%^U47O@A4|4hOotLC*AaZNsD(0D$s)eMPtcr=6)i%qFM(KN)S}O^Ts(KfP9ck z5(*+vMtUcW@^)S`{R>g}bx)zUH4iDYNC)QaKKC6ioYydZ(U8L1F$@PS{kcL+QRXq%(~xUy%BN(?TU#hQ!8L>u2Hz; zf6?ke7++JB4VrF_Mt(#R9|)yiETqi)uOZghK!%NEqjyg9X96t99rc6&!}M&l#%mMv z?^lCyjipag2k1!Q+Y!Y07U}^Jk*@}r5|Y^lf=UCFi9k|vH&PT|WOoW<8aCPp4mO%d z5lx+-L%#?UO^SEYz^wU>hE%kf&@su7|BWXP9YT4iMn(fYmjoilL>cfyjd%YU39czq z8vz+TSh^oeo$Skx!g4WE3*|S+ZZ_u=Fs%0-tt&>FVdJ3IJQlf5r+aa%kE{ztT&OQp z28w>N;qLChZ@Qyw_+6Ip2HA~_Vf*06uoyQk!L~it{PMo(K133sYewcBnDlPZ($@v* zeXp}P<}^C?#ETGdqtQ#kBpYi=KWj?^7#_pwRz+|Mwdos6+G-Fr>@stxF3^MRGUvb$ zNxmu`;e)TGDf?s4n1Y_d@=k>PjUb04f>H0cu0Wd;=AmKI$l>n%z>IP)XVh^?o}*;agIe?koefYu*Dr!~q>KMJ}j8oNPN29_Qi}`Lze$7@>`rSv4C689Y7+ zbvTm?2M)o&eMjKJh8g?Rm-LCzYH5edvqUlqG{UVqx4n&ohf2AVVq0v@m^EW60v6VJ zbm+OzC=`x~#y6)9WcCVl>)t9@=wB-UK-BIt2D)8XR04ewCxrAN&eKCHB^E)k&E*q_ za?c|vuFRB?$(EhL=E|CT((SOQi8z<+?uSRkO{TaSNY+R=q_rK)V8oLHC&?&j94Nfr z9RXnYw3^of3ihB_Z0s_&MUJb^K@LbfmKgx~LD&0WOf5gFj>;qo*a{v}0g_d2nRtpEz7hr|Vm= z^>^BA^O=axuuhqx<^&WV%B~Lyd#;QGtuI&Ep&sWdZR*GXIGHyTH!&-@Koxy3AehEq zo0f$K5sR;rxJs{XETLliCU;u-l=!(q&M94rq+yvb6K4V@)sFD!AqE;iMqfnjN!>)U zzD_X#3_L)H;0_}OC5JLPDPC-7fkni6!uM7oil%m^0{&}K#KcqL0s`+A%iM_3srom$ zCurSJJ2naqmW%}xC1`PD*`lK|jZ{`ZtKKW7mKp-#PA>Di7pWe~5|0NN)7E!D89zPj zkLbyiml4?tRgRe`V#S2x{@mpb2pD=s)wbG5en*q{`9SKO1*WLdt9edT%>Cm;7?_JG zp9VTe>1WN5bzWf)6yveDUSj%2W@a`G(jB+>9}M77%L=Nr`t{WMYuio0otZZV`eu6c zDS~xeyzDD1jFpEdv0*;-_74s$pn96Q5x@$i>I%8Uq_!|;Og}$6^Th}GBt*~v{_O?1 zZ|ofxg4>>U4$i^k@33n24>us)@Bt~B=IkG(vgD8-{@$A|#=0;Xv~Mq@IPL;d;@RXVU|qrxoxvOYSHfG2WubPr(7A}>~kgiW^@ctBN)45l-Y zPzB`^7;uD;Jy8sLB&!AkL+bv1t0AFusJ*iIO`&5SY@M_)GogTqf`vb!u!sbHa+4P5 zVmbx@62s{ee_G@TyBQ#gp!g{>=0fg1P}Y-qlF*ulvLvrStTq^ey`PuV^l?w;WYs&# z>e6jzzbvry%Q)_&7_?$)ceX=9`@u-T*@dYA7KUBQ$^ryPaV;)!Db!vDW?*YAPzS6t zln@+{gefDjUk5u(qchuy9!f>4A&>-Crjy+7y}W#@vnY@uQ1NRQGaUsfVf6GScf+$* zO$uYt0?y#qsdB!d&wz$(ugf{HY#|OoED+7g8I*UTlA6lasyI}1;K}jA777Zfk2whT z%Ja-JjTkusvO>@XkTVGuNIf){fLTMQ9BN1MX}|2f?P?+_?m7`GXy4?KA zrw$Cw={GY?rv)#ke26~s>J>=yVwBltN`D4i0H$NyY#M|b(w_mLjA*9=-vNg}&@2yW znVyBIy!FHZM03sDi=W#BVLEIuJ`G}VQH806rwDI5Uw3ecaE&?GCFp=gJ^+uzi|FVD zH?p|nfGZkeH_QX5%u7)@%h{5}Gp>-yVr%E880O>`dEprRoS}n!P=MtvIN2*@1(oDn zlcoR>vs8?BA*`LCrJT_8sTU5^-0B9fmK!qybA4&PKvt1+{47SUquz z)LzdOFcY~`JR>LIb(6;>aymk#_6vFz`*GBASw~z1jj9}TjpwkFW0l=UG;R!_l z-i%`#m`#~pnOBvU>U3bYD(GYx>9cSz{uKI%Wj z8K8k(br^ zZ5nLHNrXMtV}vv}*C$0bzF8QzWJn(ovsO+hosZf{1X$gTA#6n-fSq z2u!i~zum3;{N({Red+myU)_r%l$3dl-~$pz!X~6;4KCY#vH8CuV-o*k_>d#UR3(p4 zwJpdFKZTo;R8Gc*9zddsjD(toSp@7@S-ff%ouvex!YkI{<}3|2R47P@@F0N^$r9v3 z2xJmS<-!sHHuFAE9N+76o0QK>|83Air~qT35D#X}8>~vgSOC!+%d4sSn1ww(pIs)D z?j)`2tQW3ZoR8gvZ!$lOdgLI3S^yVrGHq?ru^@q#!I7nC`0y@4$U^2 z>7I)kBSV@P6_qq)5Ku!buyrB2{A&uHhC%Y6KF`sWAjoc`0*NX997K~FSLs_kWXE0( zrqGm%h{LV!p%NY*^)e8Eu^aDa(SB^wWhj7U1T4aI2p2sAvkJbusHAB^XpU+IeO)JVZrSLU@X;oJ%A4ysl#C8s#lc!$4*uAJ~`7w){H* zN=m_TF12QAL`rU`NZrEq)e$WzV3avf$XCmAYVOr+?;80T0M7&0-ZW*btY$ zwbh4g!{$g}Xp}shkq1wmsuYod2h>bpA{6iZi7KuIkXyPlA%c{+pT zLar zd~zcBS0aLCS}52u#khdBl-??b1;ASc=BZRwYIrb)e3^7K19LUQg_-yHn_vL+)xHC| zwFZ4N*ZDKupCthdNr-4$Y<7WdvL4*G0g87ALA|=%|3Dj%)!9mwrVwD5LCfd%SdsLC z%qkG0SkVwYG_;0TI)KJOmACk0fhSHq`(G7drRG)C>kdUgf0kZMhT%U&Qe4bHUkyJCCx*rVq4@f*^T)SBBg?})b2=} z&2{!3a|{Dk#f&Y;Qy#t6WDqsks4j$-x_~TU=yhb}=zy!q^}^|6c;qyDy$8_lvV9<& zg+twSM*0niv74=D($IiIKxM*RAv+*L&{n8Nu;efJFrJFYy7n6}%&#`pIM=f}o+OOL zdnMsK*XV@nZ&6aI%At*s`Ei@2?<$JTJ z{vs{dhaSOXguC5hJVUm49PZRlai79+|HnL%JWD5o`i?`;`|l;CPm08#o&9vxh@5r% z5+_iWg1EyiwdvXOHF2_hXRkid5YN1EQDNeflkP`k@CzBO-TGBANOO+KOq;JIMi9FGtILLk%( zQ!(nOV+ZvLLtLr2C^dg}E4(=>$0}k*j}kb!Er`3$q`wXHo=EWv-?BU*yPSCga8lxY z;*?G7WdX@S9KNzU`Ke!G4%rCmB8jYG2?-St-0Z62W}vl&A}MNm3Xn(=rwsJf#iMaE zVHUXhJRtw4%3+4l3KygtT#LaAGAKagv&f+)5xsiXJ7Uv)J+@xO{nMvi5lLkRFz@=H ziyyZVO@Z!$mY842D_NisO}O=59)Nrz{U#cvvE&<@4K)!?95Hf5Bw;B;it8P7c20iD z3{5oqmdG+Zr5Q*U-b~SRS_l?XT)W@Ft?$JBRniH&BR15OuoypJWJH58V9UzK#;{SqLoU7PwX1hC*N*-HiZ6S1ExRMa>W+Dc&IH7P~?epWVfAprvM>R$1ebQI3N z2QOrIig~JaD5Ow)g9K10J+hR;NG{F|4r!o~Ksh~Fh`trYKR!-if~xTclfdFES%NuW zROkdLrB3J3d4!0UEhcgFnxD5GIn=s!$DkFM))mjaMnTL~iDv%&cUc^>o}*`;4~K>E zVg_)GRg^GEfy@b-Mxd!UcR-Hz=ho>C0xo$x-7f*x5kHZ^+0b^&2F!{-s2U`SG)W&K zm-ER3oErxHGAr+dQ8~((xWrI=$5a@ZTX2DNqk%Ln3*`Wag{X5DXBn@-KF$dt;>)LT znT-eFX1(3B4>Ip5D)qV$wTv{m_bnrre2a=Cmx4-OanrFNH@ptYhDXA+GoMdQX+GEG z#hy*GAA+wqNQYp)1AR_|X8^ zHS3S~=<~()1JK0}0p~Ttw(*pOj>oXbq=RG}N>});-NehGu!WbD^=*GNX&CN_n%yErg_Vjr;4)9KHvZnLi#lQ)JWOLK?Y_CT@l7T+)sF%1(_0n)C&8!mXLTFg0% zBsjo6=Z|`X=$25=Hj<^-q5JqC+>%Q@zY_N9RLg-4E+;j%Yk?<`5H`ln`zIrVafUBN za6H@a531v}sV~hqs$DJDV6ZGw!@Ga!At%(k3R~lZ*jc)cb3%SFQRUX>P?aFwh=v>? z12AgE{gc$)YXHJOdgl~GZMFvw^uc&VwssKoAZ+g5>akW(iP0sL0DJX=P1C0e8wyd|(8bT$8iWTwf=o>cG-90RM-0c313<~*yT zu$nUQOTnzk!KlK2Fn=t4wBAR^-#igd=99q?7h-DHgSNf=QJsSXg*_1%L8`%;)U&xa zi-bR0$#iiopR&=y&T4cUoG zP^=tLk!&5Pk^5ShRI$^Ft3jBRFd#=FO9BrxP$NG|F+x!*0!BPRGeHh$i8N>+^V6U) zGYb^sZfvKVP{uu1O+Ffm*(0z-Cv$aF^QU)vqx&q05&82Lf{Jn>ovEPuH^R@0G^JN> zTv*stZY(&O|cBwk;^OxHH;M_Y1Fn)SW| z&d~bj8cI?*m1=2J4!T-3SSVYD4~2uw^yq+MEjVJCfxwo%;nvQeRMLki^}O#89*e5) zdE85si5Lm~Ji?qRZjlHF1P3CGkw7BDN_JXH64Qo^jhZ|dM0$*D)41?u&~V)Mu)bcW z#&9r(xPK6Mmq<)RKA|@ECvc183ws`E(|3~uJ2+_fdZ7nEv85pD?>x5MsGbu6GwPlI zy^C!!I=nD$uo+BivUQK~ug;bn&25!!0>^Qi#eQJ8*Onc z0T*)+@r7K1!y+K!PSVaBVBrLv0fK4_DiKI9^GKBj6vQ!yWXIN{31OruPjP__K*iHc zYB_@l1`HHe4OnI&q33u%H=buJLftb~&_m3R0PikVnYzG1{6SC&q~G#*fpNf6`zA=o zLQoV;kYHdXE0F$80GG5H=Ud%yA*6UB0n(uIdTYvOtqv z2O_VAQbHgA?ZGZk1O!1b(a8gqiq&G_v!M=<@&Pz_WVnVlO4%=*DP_eGfJd*HiH^dJ zkR7xBOU)@xO%^Soh~sp)1bxisOa8`&^RVu9yQskfXY_|c3=&A6R!Nc!whDP9XmvV^ z=SqJY7vB$~Ujd8OYMf}3n^Ue{0vSiki3Uy_582^2>0K(V;b*Bz9uAR22*B(XQqluT zW2LrCcA~d?3Fu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.ttf b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6eb48e7d492e4290175c03218b5530a9d9220182 GIT binary patch literal 52660 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 Xh{gj8fogTf@X6E(R$0P<_m%o@fv!po literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.woff b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..2383f47354b74e261bb9874faa5d6d0fe38d507c GIT binary patch literal 27068 zcmY&;b95$8(C!=C-ehBJtc{(GZQHhOZ;UtC*tTukwr%I;_uc#bap#<8dg|%ws_LH8 zJ<~JgDk~xa00Dd-=IsFV|H_H_|11A@{r?|=0*b-_07&~c%li$v2*(6p5fLTnZ|?nD z#`_PZFysZILc$^d04VmiO#F>sAXorWQ8`(~Z;tz0X8(p5^CgX)sG_pqH|O*%uYKDH zf^d3El~tr?0sz3|zB#pT=$W_ti#4>?xBKRbzjeaCv70q5_{-46i4XvQVEESg_5~0@ zLxiU@u`{*)=G?w@YQF6nE7sE&nd&=!w}qnl)`9+iKsL2Bk1-~_n znX$gnx6Ac!9ma340xZ^)%)UtgKppv8Cin&^yf%c3nYGimef4j@AmQIJW&X~{M76Rt z{MOTG|K>)&F?)qM_H3>1_U%{eJ6-_ce*lF9$+OY7HvZ6fFCs= z-*@tVbqpBv>|ZcF`Lg^;YHy;k--%4O;TWk> zubt)Fm+$ojO@hR~`=2o}Q6FIU_fPT;t7 zO#Jk4AVnaNo5A)O172w0q5SF*13_a4z>IE~<{95j;Z4f*I0v0X{Urs21SAAx1jGfT z1$28Ph;;P-=FWnJY)O561y1ZhoN9JsgDX#D6J`_U5P~UN!>CR`D@{CqoqY{`A$`z4 zU)?=@ZK)zf^ReISeFb_Wx$rID==B92Af*uixA^j}6CWt&gN49ESRtD+MaT(zf+_*W z&X_8!E{HO8HuyTcJ|F@_`Y7^@_Aug<<~Zsc?hwLc#u&;h&Ir=9)<3m*yutpE7@{dM zJHkm)TjFYRc|wU&m}052xgyEZ+Y;#Veff1~Z^uqoUxy7B9|M=0pM!)#8XqSwN0<+3 zb?S{)W)G-Ut2F9dK3WlQ*=#pzt%n|Y+MX^Ae@Tc>v}@K>6TXS7WBwVU2{C{Sxp$~O zbFjcxIk%9S1gmkhydq<1kl}NBK5fu!s@hr}vAc%u+k-;N;xR35cMr`eC~9dc^X={L zESbYD98cv+-#M-k%r2xNgakM{g*$%F`8^0eKsX3Ez!~5P@C5_{VgShi8$dA#A|MnH z35Ww^0CEAvfO0@Jp#Hno3g8YX1Q-Ic0Kx!ifGWTQAP#}@-`vrbZP>0kJ3V8j)C0Bz3Z5Ep3=Lcs4Ygs@tLlbw?uCYGL>0!G_KV3#BxgUh%~l$19F1(Lq@Ej4)BzJcJ?=_J`hU7%H)33`Rx-9 zGJPhI%K~t~V@rvIBhBTnQD5{q^9~#G_D*oeg zU}49AfgvAQxJ$=ZsPNhJ`^aLfx*=|+J&+mYW#l)%qNO!>+UGpc!ks<3Wb9aB4J!~> z`$>w{6FlOitk^LAyxOB(TX(D%NHyUPwcMxT4v&wBM21~#8Z_i;~h$HUYoOEE#z-fk&DRGl4Z{%&MK@O^|^ zAK0)kWE2QSV#0`G=&(eEh?|TNzp!FLDh105;ToMajRv#1vWkaC4~&F8--?bY(gft# ztGCOq&n{nUCez8F70arQM~$wAM~yQ(ZnmJkXO3BLne8Yo*Ce~1PLw?0qp}!_nC~$z zid*x(5{Rv&8<)XvBeti%$n6Blb^94K9G1{oCC)^i^)ItQ)LnSQofAE(@vgq_0k+A7 zb|!TG>65}zc&gYKLX&iur~^1k&61@?w!K**>HVp&3*ar{;?Sk6EhRHHk_;FkKYb=C zF{z^U=4GmsQqfDJ!B+~>o^Kr%OhT#i%bL*(6w$GN&P** zh#6fJu)I<3mr&w(cDxs5T0eHezS3VY3U4gNwCk$Bxh-;x9LfY<+r|WL-p~F^2n22` z<5p4s)br&|lDtZHC%-&m?l3iEl&#(;1F$4&>*8ctTj6jaUf2A(^y@_&<6-E$CPgBr zP6ur*>piWnp=4e)3%hupalZy-zaT%Ai9b}Y|54UliU0MM{qZSn=y6WZeBH^=Jpwlj zS`^hTAuTy|yt(5$>Sv^e>MFkc(=V$!7J^UT*6$O1UHw`y?O-zEmpcOeqZS@%^z`ob zj#%cc#8iR)#o6?1=2{}Y1mUKW<0?Vq(dyBTGYXj?Fynce_DU`~cA$Ue{i^G6* zv>8rroOhb6MLMjT7R#R)e{ z<-mRCJG8{(^YFxnhtGEDRTZ=)4BTTfG5WC(AE+oVZGKT+DpQ3XIPJ2zQ21K~E+x?Q zL^F(nv~ZahbKcEfJSA?_zD_PQCI0la+IZ*bBadnEd~J75qCPuQRmtRQwmIR_Ew9W{ zR(4WsZm#~CegV7ubO*IJ`(jc?NL{FM8U^N}4CF-2Sc+OJ7+-kD+h#&*W-!~4@%a#4 zf~Yt3;>+&bHVal_HN`~k`;C_gSSBc-Dlu;l;3;if$D=DjSfa^G*gsJ>#-4&_vj4N7 zV#pmv3eZi2_2`CT^A=bD&ZF&s!~v99YETZsIgoLIhtU_7^s*0#73Vzu@W!=&qxjo}+Bv z%8kA@a38O>&IL&vjM>QObzCzlb2#VLLeR)d$74R?=yDVReHzf51 zjd_y9b;$C3c}XIyEbFFIa@SdGXn#L1wN~C&5=vk9I}<2gREPa3HU2g3Rh?aGby#3r zD{fo(WxeHV&_U%_A~l6ag8L;%h^S3KjnrLtFF1fPRNKli>L_@!r~h#D#P&DF6Z?Us zB1UMVL zGhTw3G?Sg8f;~Auok}@OK8~^%6UpjQH3x=b8QS3AmY};UrKKMMWM1FyqT*PzMU|7J zdFxLmq1MI8v_%fkZMeJ2rxFZLue5%&`yS18g?o7&#}%9ocYQriHfV<=A)a#*@|>}Ct$(py+}+KAB4N__?rww>Xkv+cv2WA)tn_+% zM5(E<>aC+j$J)NQz91FT$%0ASgw5^0!dZ-{V90cS2*FpupJ}8A`uZxZk!U6Ig5tO^ zOY+l|h-~91zGuuSpR!%cV2!8XeH;-KwtuWz+RDCwiSI+jNp_XHtE6wtmQT1h9;Q_L z1hs)~VT66r?ZjKye9*blrzA{KKlIq{VLbADy&n_O{dVWi%=^hQL0mKS4OWVIq43Vc2=SV1HCy&UPA&t@lvNaAv z{%peLRcDc;cZrBBH=C81i#I4VuSeQ;S&4>*7P86YeVl(%6k|@|LD2fA{D(TnWe?W^ zHQ2Em-6m1SE>dsw*dRw)|7;K+xKz!ke=z!a1`3ddv4?WxwzrGDmkZw={PSXkpbOc` z2zfg#o>j>Z><_N1G&|U%@X86&B=BbYUOUfp;)nO#c&Zi8=B!La z`#hlD-UgN2_U7%WetcTyN9V_;pmV>>G>SL>QJTQuY_oe5R8NHwmpTVIKfT>0O4GJivl z?vqic5gFcum^O=lBa>IdC0CtGR9#!HLHS?1SgS>%GSOP>sGn0;q<=<~E^sb{FX|t` zQzb*pzUDiLZQ}Ve`b$5G9u2$VNZua0PRLoG;QaoL7NExt%!K9X>3|;^i-hG%=m|s# zQ2B75Q)w#pk1O`n1#I6aUArN3KhrYZC{Az>hoL-)V)rwYfum!E?Ls)DKQ>{pRZ*}! z^tKF8_W7vk$PR5n8e)OyGB-172@TeujY~_UO-e zA`;T@E41Oxo2RW06mI$Jm#r1kt0djRPINTQ9Qfc4)KlZ56w?-}^1U+wz z5t-)4!W$QWN03CQejg{?#$GO$qc?fJ?n8~Lnchb8qw)!GFJ1LQpst&Yd)=)$4_#fJ zUs;)IoacvGC~KJ+0S-P7eXFnWnRSm-ZC`9nlf67cj&FK8ef-G^AYBuNpAl&=%wrJK zkj!vT0KC>W9rj;2mjpnQ^{CK{~^NS#FTyHg;byfAFs{%W7nzSgG~3 z;6cNxbt{$qI$z8t-u7*l3;7F>3%+5hOk||fQ;%(Hh-=okF(@PM^vLJ9wvrI?0`}rG zct)CXa{oDMvK%ZeLdBndJN*}6KEZ4>k*aZeY^Ok1Sh{I|&)`{nEK>pvPK;(Jdl^O# z`w-6U$%?3^a2+S0?M5z?3vpJiL^0p>n^l3E9`R0}^rMnpx+-f;9!i%;tG_NnDWdsW zKlpv@7N&1NmU`PyMf1Jxu24|$&P^ris5F>e8`^4_sl9H8 zyztl}CXp4a!h1JfLl`#%M#eAMv^``h6Y6UEL-F`SooIoKrhsv5n=De{?w480VMup} z364Tkih@|?_0bm2mbCqJN}(>PB~B^RuA5=rjxTNneId5; zz5b=_*V3EwDM-0N6NOPQFTUFP_@EpqyUu5EyQ!Mo*<`vJKLknBv+Z)@2w#<1k;j2a5FIO+)k(?H5c9wUXAww7(aIj9Cn3kl?fPoS7d2cb_anBfQRX zIXid(DO8@0_x^nLZY%mjo&JZ+fPXHTUldGFG&D7W8(p*CQKr#$i>^w?JW>bZA?j+F zbxfz5h!Yet`N4o0#d?!g%k|%9PE+u9MZxyxttKzWF~fJz&fI7={CN{#Jq}cAr3E2# zKfFHMUu81peMsVhk(S*G$iTnu zeERAAZqmk(;=#xrw)MuIoEa8}sxz-7%lz{=)(z-pA(of}2dk#z4rY1}A(Q4MEs{G* zX5xY?%YHVe3J21cf|C;>?I|B;k|$ETaEz|S&$eZUj5`RgjF!_kbi<5*4x^)u!C&85c~hv6=4b zU$kZMRA_UsI*%q|z)dCSJSnT#5__#OjkXEs$(|O##%6(El7}c@5aAJR{}V+Zk6wmT z27`r)wEqF(fb*|3jB9jB=+E~KhLMdiwFHyIOwWqpjKS~2FP5yij$arGeo$b)p>Dsy z>|b*I4fcvUW8t_Gqf}|LLo#>H!~vMC?#seKObMS|oIw%n@|*bf#Q2!-QZt*_S=&8d#!3!k&$xS_1|A~6hY zktOMjF20RKx9d-4tj6`Wm-JR;YOINzH%GYTNMi-s<#7hA8#z21kc%Kk#=OX6Aqu@a z){+rutqGXl?O@ysALw+{`+38l2l>(xjj=QRt-A&O%ql!Dr$<>`9{ZguqMapgAD!aw zAPNGDG9_B=GH=HckuE1QFGnW7`t#3lw=eLvD`1*63q3VVwrOJKhnq*~BoN$4B38sf z0>Ojik(62I+~ACr$tl3JyNR7LV8y{oNCgyfI!Zr2uSv3ed|v8A^IYxHcwTJs6^ z?t1-B%?Gtah{*9{sRvAAzxwgv>jLm^1CaW2LiZHN{Zsy9P4f?O67)?pu5ji-vZ3rWBgf`>(^3S|ZY3GV{MRUHR_UBf&Wi*IU!t zBK#AxDY^qqAj6z(D4T8wiZh21h82Z?JIK{D*XE!u$0JZEmstSc7KP6_G}C6_HiHRV ziYFuB9(>|vcfW)o2V?XL+Q@4foU5ZQPYL?+P#OzCbZ5N9Ae-?TUvw zL@opDui@FALRBj576+4tC3=V@3X@3@u*UlhDa$XzF0@C)hXi4lTg#SiH>e6v&p@> zOSiB0_3#9IzH#5SJog)*bXi&8nC2b?l>Q`ZW$2`#B6Uo-f$6RwP8p}268KH`{jI~G zl3a@kDq(=v4$z;Tqii7_Nq1(E1;n=KPS#TEPW?0Su|cKJK#76Jo;!-ne#7Y#_Ejfe zUKCs0&mGnY3p$frZ0BPzf5OV#s=SE}If{1j^a3LD z{I3+^56&bxY(!6<*F#^`Y>DVdpeSXg{6@$X#>;q#51a1;{AMyb$$H9UadiGwQV?^| zB!>4%;G0UYD=TdKF&+29(;0or3|D;J3?a_WWXr&p4_wEd3v26oZ5wi97Vw4t5DWxN z@B9{ey$|bouQ46Z%2}Ri+dZT0!6*d2`qph}`LpqI^K~ZpHnFcUM78Zw5yWgZrSAeM zrB!}3as!0A=c}##c4w{%o)wAvV^$_6=P{U)f&$m8nzPFHnP>~j=u3AkO!2M$0M?f9 zWYv>e!)kafuX_z}y*ME~<8HZN+>5t(({$=0pDHG17C{;(G)FjsLS}lO<+%@c35MiSHMwO7Ld`D50 zfl(S(R`#f)JVt1tY2v@B3GFcj+GdI!>0TTSJap7tz7!bPE-=#XUIH{iTr|wVa!wjy z9-Bk83Y7ZKHK?-(6_O`7dTOOs#vAY^WC_o9KI1*#m8g_^mu3(T6zNR+Jb?OQ^S@J7 z=x{-q9O2jc!&@!V#pfPgiDO+LC3dE2+-q)^mEvR(|K3*Ky@EK4b< zGM4{9NfArnAjnSFh_0cS6Z}KR>PVe^<9VzjFg38PPe?w2q=m|D;-Z3H!(lW^pFWQ4 zUI<^^vm+ke13AjExg0^`c<12GMhtC40u1FKg?R=(-<*^WVTSy{F%-e?SU=NJ?7NfY z{d^Cn$n?U;)(}t$eETYW#Ip9>3=+?*FrT^{C#M!yse7b5x#`1*FY<=IbH{yd4Z2+z z+nCj{EZIaXe{k;AKv6pjRmFk-XTjLJFLWrpT#>k-x6iMFa~{ixhfnBFiu%XcHX(5T z18hxfg5%$0_osNnsdvHDP6czRgVzE#OHZ z)=3|qEZFuQoHHk#<4yl+sqXQEt1Q|Z)$0#;`Xupdi`WIM$ zz(Y=@M_48lyaU)K*#%%dYtX#vSO0FHBxPg%*)8I4LA(Ha7CGY)H5_o;Ll1?qcVql0 zsJsU*e?CdT{fN!TZU3C^dW5gV2K)^dn6ArC!1Ecx(EdVpK`nh&_t^xG=GR0~Sy=n% zNoO$UOf*b5K4S$Fs%cGn!$R2~?kG=N9f7zp`%Cv{VRDEgRUoBOImoMK|5nlK#K$SYy<%Y9j1fa%uz#01GkF9+ zK?~nsb{Br!UWW+?F5g5mwZ~OP`tZAN;pu*t|K@GTmxGIqh;U4x*A-4 z_KM)^nZ#I}3VS7=89?8qD#h@UzWEn<8vS{h;xP6k(K55x66N1$5~B2k zVA)ABLrk@bYp=5>yAE@H;|W6z6-GxVO2Rm@@Fg|52`^oO z@YZZmJdlHxfi-B&$ZKp?sdjpH6+csy+CpFEumx3x!EQqwk9kujF-H+W-yEdwX}>DW z59fnF9U~U6u#4LxxO$~D7+&l-RItW#Ib!tGUYJ7fIp z#xDUuLb$1e1I5C{r8QGBGQyQ~P7(#tb@w%Qg((yfZZ9Atvc7^&GO^GvLxwTo_dY#o%RpI#h$*^pxx z5?5u_`Xd|whelb;Z^Lf=+gR8|4iFGZ82;;noSEl765C2A2$w$)7tOWZZb$H5;0r*a zsqHYm^!u=e87a!PflPiF5rCp>lvk}krf3Q&^SYLHXKO3X(C%n4R2I4@>#6Z^k+c%T zHyc~??$1K~7WH+Ul1dO-pFUdx0A6iJcc2d+n6y+ilr3*5zV5 z#zzp0Ur-ebqLbNdCLHzV8jsIhqalG7ccbsqa0uV!hYQ!s>m=M0ysz8M=u^zkj%J^c z&4w?%n=EJkz`$E(Fem-~=y#`qXK``yzR2ILsXT?M>@3-`)Xgv09(vmhNlet)p-OtJ!)tLAyRoz|=>pxne zPXe4xVUf)xTPS;0r6rVUX3mn;5UBQWM)iZ_sODCnXc1Bl32EUc;3`tccFi}xMHoj= zA`?KYpfVpuu^nb>?qFxBJ5y8M~bp_}HoeLy*;qH4qWb!y1R6~PoxGX*xQSHVvrALFOf3JdW8sH(1;$) z15120n9Y?3*ksp-v~O$kitt z@i4a#hStI}J&kU^6TGyXzYnoM{5=%wMa$te8vCEI*#=$t*n$=~b3-*H>%uu^05P==P{X9wD2M_j%AU_?ieg9oBk%YEg~ zuFV&*g{ZbcL`r+agRf@2xk8A$%M~H(@i9VNf#tSKH98o6s6sF_IVke_6Mi0YerLi# zu=3(BK(HaSAHEi@zb*{kUy%BfwsBI_*ptMl+c8n8gdZuft0a+2GRvF@3#%!LM;4Nr zE_ZuPwm58c#-!(M353YX3W*8qskm^^ejY!>5GkfJ5bB0|M~LA_!+%dH_4{RPTRFk9 zLJc=`h%@@FSr!qQD0gG0arm3?8|EtWWA372%idZ>!~a|;dODuzc#A^iC!Y%%*$?DR zO7iwVB0#(^pAM1pFyilH=7{j_Im#~L2TH}GDs>Q#5rcj~WyFW|Nc_V`lQV*dC=ch4 z8d_f$6@fRdO0+@3c8F}NM8aCCSCEvQ+7@BOs^TP6?h_uxi zsWdpe*jP@#;ngMA)S#a6a$VXPQf08;_v!G>FmQK7%TJ{ixE!f%%-U3iTW%|#`&m2*a*2d>ws zC{q1iDifB8d7nRvhMHBaN=XV1L&&jZk_3FJy33GVn65AY-&4D3ME|&T`*6s?gXSmm zRb!xJ#E{cQEw`7V>Q0?>UTL&6u=y)4S>ZF0DYulYxU2p`92k>cX0et~QP=YqrwLa% zGx%t?DK8x*rje|XQXjWJVckZP_n1N2YAvPLRFvy{6!^CaGVS`@tNAj=)9{f2XNkSx zVR-x?KL?B14>9WZi}rEE%1>0Dkvx%&b&E4K55ySOXwIvFmedeuWzBiE`M0vt%g_{B zWrV3XCE=ORTf9DkzN;3yqo20BXX&nZ9d0+rHBVcjQbp1^_e6z(-m9=jtILo;#C=9` z5PaOjJjFxzRYQ)L$#zzn6y!b!lo{gc@$lu*rd$qR)NoNpBu@CGDOr!b+2My!awJca zSavhfmya$Xh9c>>#(4ysD({bj)-5Z1j`}Ne>7AwrO5ZQ=0mp7rU}#{aH>Yb^rv6c= zyP6$7ycZCKaDYE_=nsV+6nxTrL=Fw%)OHZjd$lL>AAN-|2v=;eYJwPaR0FnEWTj^G zyis6{9fn`&221buvO|CSm#OMbQO}=b9d*fM;ivvSifdum8!Pz3o&Avh+}sLk{h@B) zI8y--Fb4=oSlSzMX&j+3Q-cw?IDYZ#TsWpo1ZXz!_Q*NAk69an6|g0JEHU?*es$Vd ze#*rBd6OIyU;fj^uOq4Vu9XOxW=@}$M$CkGH6)bAeTql12SOh?W(-EAjpD?)y6d2_ zl9d{0Mz~hs(f$k0hk;x^n!SC+4L31>f|orded*s7a{Atf+qEUM(Pe4o`)WuV!7`5e z?Raj?B)!Mi;pq_KR$ZxH@B65$tnUl%#hdgPBtqHGSyu=B(cv}7sx4LZR->K?u(`hA zmCE=D$+KV4f225t+d+X&IdnLU*g*-srMlg9Wze!nuMBMo__5Dwh_yb?$CeWUk2480 z1V3cz6fscE0whr__SN>6=;vrKyPa)ZFjo%=uE}m$<9Dhkbj`%a2-+Q;x4RAD2-1O} z$I;IXg%ui`flrtfXKS7>eayp9Qlf^R8N$y|j`l3Aq5Kqj(@nn+)S3;C{$TI-{n8vK zvy)2!^m&{3=a_5|5t@nrgn3O)RG&n>1NS?4i>7OJd=Es6wsHo>be8-iw|ohv9dfbC zWJr(sUBr@6JTp@)pF1U*YG5yDmBVg~>A;^Vf^kInCIw)b-$^$lOUB)rmR@+-URnG-{@$zeX$x=a4ng@Y;D@d4qjp3?5L&wT|vC}o` znMHRdL!@)9<Zj1W+l z(PnSMuUJ295~LSiLfzuL-e<;l`VM`vTUf>pyg%2d>H3-->u+|wu$P7~9Hi=L^aoJ- z-+6PNL9lkKYq)u27NLf=@ut-HpJ|f+sR|t8eWYX%xBv@Dy_$7#-D4g@Q98hO+UL+_ z{Xqy0C)CnkbYHwSk!;OFdD77~2}TY(&>Xq+-<#cj4mXRb3Em?NoVnbJY9hia)9$_0 zB|zAm?PJ)UFR`ofZ{v%&aKQW?1l^pT855 zLlzw5@k)$AdKn^YXQ?>glg1vXN;^M942Z66r{}+$3Zrt7<;HzbrJicw$y|A=}^W5`UJ!5-am|ny73R>mO_(WN>X6 zJ4~c=y%T&Ks!nL!Js%T5UgbIN!?8s3nQfcl$;1?v1ayUe9uFX8J3jZa{4m|^j2ytB zhbEBg^uu@}(tVG@g{V;@2B5Gg9z{BRr|y-sWCtq>S^$9Y_z_|tKjY;6;W@O45SHl}zH zKcaJ2$3$@46SwOxnB{-xe9|Y&t?4l322ODF^c*s(O4QB{IO@+*T3DD!AqQRlv(H_M zM@hJg7&4)?Y1{Alx?;&*D(2u}al_%kJu_~g^9V7ltJDtE}8RChbv2QW?@-H zqbXG5DKfBB{bgAPP;ZBUmddUHkT|1>Yv#~U5%bX|RW$RRlEBV|EG#18>M-ww zVwk=#(}GPB+q~@#&E-l{h4N$$RvaQ{j_I@DWT(-h-%M*jBP}Lt1WHH%TSWwa9a1SM zPDCrdv;HW|wy|{hh3?EKL1y_YD3c`HG$!*6ahbO_)tq#Ed)7Xqte*6|fXtNXcJUY? zai2K(ZVd5u0BZ>AytBh&_x#{a#LCB@Co&80tkx2)`^36~%GYkD(P~yc&(y8dX4Y`A z`=%qf+4d#Gv=!?WuwpY!0LyVfi0AnyyVXRr|Zd;-5tb5*rUsFN_|g4t~We z&95R}>3)eo)8;S9Hr%ydY3O<}nqh^VfwlthKwjLj1KJMvuN1K&0 zOF@izD2=|K7?%Cs+aUVFFxk{Bebe9(G7Z>jMB#Sg(tY#36bQPxlv6!uE^ie-B*hL-^vhskmUMl0R zKVOVhSX@W2&fTRy8qR1ab4}gpz8h|fKeW!IwuPerJ4V~5CCDwG(#QBW30WaNP>(8) z^1Op3NSPumdNv^9C_WxLSDr}p*Y4vqa*h>UzJaV^C_X{EB;rgtb5qd;JXOI54mykD zccK)J9kdD5m*%Y9Dl^MMJL%g!iZvR}Ktybe8B*NZwrNmeF3-Ow!JC3lBag9LoTrId znFOM`%XEKBjH0@~^}91cWr59CF?B*>%_#x$zg@=3~x; zQ|gn?Mi6!{4~X4=Q<>)u2#DMhLC*2uIY|Pc|J3I9J16>x2w@y9DE4naXQ=M=q$m?LPW{AlF0%8{)~FI|_MOrb7Otjf zG3T!~^>ripJc{xMGlj?dZH@e1_|o~|V};rj$lDk=LAQH~(-<=<6#y4#QQ06q0$)n0 zLX&61qkb+UJ8D3Skr6gt%z-#P+g+SmvPZaCu!bpJ4Yep=FHy@zM%xt|!tMYk(0Df^ z#%Jr&%oDEVp{mu7o)V8awl-J|CC%S!C6S^-?)D%qWzz){)Be!ZgrAz-kz;IWD`o5c z#zsrKnsIn>ban;gw0h1iDNEjDveD`aJ|pl*-TDB3+N&|2i~e{HdbG5LQB<($$vqN*K_Ty7BMv&T z=+Z7gJ*i$SWEa5W(Crz@oYoCY>h4A075XJoT_h2K7e{mHpg{qFJ}6WBpQ030L@VtnS_KjK-DD*-MKq-OD=(i1$lE^I>K@r56=*Pg<1fFZIr^ z|3P0WzK>i|KL4ZMuushR%vke--Zvtl`Y~Bqsh`TXfS~J+C^tx<_c^& z`gJ)elFlAh!V6@>53@0>9F#R}VAD9XT8aeAroLfT%+D3F5e`?u= zi^B&Um|{GR6+h+_l#`Xg*-1+wC$rNc8+mTo+gwZg$mTp%XRL7yY_;iPD_ zb847`E6dmCC>l$~|HxObdpZN8F>kG@D?Nb)I9P-kaRptMPt^V8B_nGbpQb^-o6@uH zgM%4=)$giOHTc1-szyGZvS^RV?`_CFfEUHNJb2UJh}`O0EN`Gp@Ou!?kdO+CgI9EB zE;(=c$5RX!Y40MOqbt4E{c`4$%TyT-x6^Ka&L8qHYFppuoi)|V^_E&xHM_a{6AxbA z#ZoxGIMcz}40DKB0|Y}9h8KGQzC);H)^lfj)w^&3Uppp7bf_QtZW;fm z5lew^w%IANlW`SC)C-8t=l&tqc>j}#$L*n%z>oIhW}Oj?UzqODc{fL-R3{780uzR8s%ema}5;~Q|j=iClgL2<)M6H3|kR7O<|#EHie?ayT-b701zR-;|j>CI&F5oyXa!iMMP(FWcuj;5B_yE^m5tUC)ef& zI?|%_93V3i^7{BDCe-7333gB4PMg=o==1c{a}d8omccqAN+;HI=1}77`^$0j&SA;> z*n~M0$xDH00}}tE>j%5=bI{=}hrOwxO4ly*+0J3{%w#GVdZ?)&io2i`SX-dt9I3$El%Xzyy~BCcY&;skaM+q1Qf57V&b>!tcTW&g2D# zO@2c#2jw1OU!VDM_3w=nnBb&kp4(rIGVc2d&AVv4dg2~X(2&0{H0?GfH*n_LEx)ad ztbb05QbQ`!)2hGSwKaf+lQ_0|1X^Xu35O z+nS@dsOl6Wr{AnMzsY^OG<5lLu72ZSY}2(MFX)$aSROkQnolbeFLCi-4^2_d*W#** zy~%G?;Bpt^;wZmB?ULLb70BWR`HTZ796(*sM|!44KAXKW6gT(HC>5gb%aJCX4k=Nb z4q=yq^G=geQfqgHB|U=F7(h|MRZxSGRIueJWaKpSDxnZ8`0{d<15D)9%a29UiZ8=% zVZteY=k=dOkQy5)-045fkb$}tI6&74E!k(Pp(<8)ffkODrcjgDxAJ%-qw=A23!9u3 zr@VQBk%4X^r6fW|9T-g@Uli+aKlegB#TuZlbJ%X4j^&#~Kk{#;tIW-N*K5Y8$s3M{ z^$gfPs>F7zzOHVxy|9^gWhOV-as`+NB)YaaZ8{&c+D{$h6pW~7aK(&v@f1Z=_D~x6 z!(FzTsf{PW!oyBSCGw}?i<%kA@$>eqp~c7FG3IACYe|6Q-Wpl0_N{4?`q^n=F#b`h zuI>VPL|1r3*BZdzC`2X!Cb{JWRK%>-lvvq()VAvPm5~Jslln{ym5)yZY9-qKR9{r+ z@>$8q91GbZ#gQ^dzaffI_>^zyTc5mB0FHr3tBgM!zB*#Hh+!Wf%4x>f)d$&Ec>Yol z+@m5BHi>F;saBrMJ{|f{6)20U7F>vKq{5+V4Y>yAjv7KBVhO6q7mSm`?xLCpd&WiF zF>VGta}k;>%uXLuxgS`tqb)C0-k&YSW+niEMqmrmI&jQFl-e_un)w@-xT2t z1P4wcniJk?)MPx-fNL!XLNnv$3G>`k1#XT~!jBaL9if?J__`{Y%yfCaORYO|S2Pz~ zMoJ&KJ4nsL7lHM8`-CSjpzVi$*~$ww$rDyrR#p7VM&X{0Ys{R~8Tf#KCXTDXO_Ji3 zjHRLjSEq`>A){7Iqf{?+O{`4I#bg*=xQT2ShZbcmQm`7=l*KetjldL9>D+S*1*6p# z>NI1~wl%XtjA?QT%RjqDqR}NxT=uN~C{jhvuJU;ll!3|uV-XO~s{?@%Gy8XEI3gbf z?bTC61MU$utESCXlLQPFMpuo!M{6nEtsajFzOM(iU&?j*3KxD6X{XP#M>%S*?M4st zSv=H;vta4fn&uysIrvt=EOcze4FOAwDm`Z>D0 zI^IvN`(Z^%BmhdsUiq@%!Ad5*T+kQ6byCjjG1UR8&3wHKV0dfvFb)!F&;0qmn*D{tX>JWx!TuSD`uD9HYa!} zp@N7%c(C?@Eh_N^K2i9 z6@%MlCtFILir+fcbF-VNe%qtv$OKR@IAFXC> zkk(yT;h!?NwWCCO=FR^n)D%0TyCMyRFypiWU{BCVMDbg;IM_b;}UfTT@aTwB8C1D-;l%1MyC)uK{<(>SI zG1?yo(;foaDB43Hz%7sKA&`YmUaYVjTcf1tE=ZU7x^kM><<}25K(RL_r(|Za#M!7h zLGXB~%JQVZ()cqG1pIUZf&@Y>ejf8@a=EK}5ghm^Z{3lN^78`+4gFmE{OX(k-60Xoo{nmM`~ucn8ZsCeE~zkcwwEn7`n+tF2D z&+Iy*Z6nZz6)0=3PaUSKXN02(Oa&*0V#O%eqSj{SOodSw)5B&O-jAlS(+28ZnDJE3 zTYl9f;;AeL7>aQ*z0s5aNbZC0$K0jr`lPL zb9_Gn6wA1t1T9qntzwM{P%8gNX#vrUr{!OOo?^5x$>iG6cLkn$)3KX0?iCN{Fh?pQg6aW#%zYfr+Ors0(Ui zBE6l?4Ui^qeG8Lh<2KC8?n=@2YVtom{xl%M*zz;XhpoY z2~U_fHbA`o(DdXVSUQ{s(}2-CO~;|EdlMSZ3mvFb$_M#h(XgH(O%q zBQ$#4s8R|Tf@#+!p)td1GPT0tbO1=LhX8u>gl=)o6VlOf_Gbh5%aCuRiGsj-KeYj3 znnu&HwE}ORTG@T_=#2Dk#_0ftb4K)}!1!7n7Z4SflprY1%Fikbqs-I(3$P!t|3V^H z*=Yxcq|Q1pB$<%d_%AOr`|&?YFKD#R>HQLP z+x6)+>V9H8y{XrrH?1>z)8pw)yit0oy6c?g{<`A(NxDHB#^~Ng=`Q59c0xBQJ#Sb| z1COz5S{K+uiLi$Oq^Cr=EV*J@i`IE_YE# z3Nr>NG@~e*$KK_&u?FLwDPG#`ou0L4$ru67b45%J*A4YOabLqybk3XsSKEy1GiJlp zhJoNd`ov?=Aw%>(>zYBcEK0G&kZisWMS=?a%JQvP0E5ROvrM3 z`~)2uw~w|%$(yoq9dPmGyO++~c!&1s=O;HU8DB=UNn4+MVa=p_pEwm3UwMUeLGGyVMCcgTo1 z+%%lfS(gmdy6rk;oCIatX}1h1_45DAv>--o-?d{3XwpuJ5lb&$ZbwUU=d`4BMoVfN zExv2=Mc09h!uy;9avq1ciB(Ucd zW9I@tYbnz8w#)0$mpcIoKq<#TDaoDkw#XC-uRT{_s ztcM&iVznuqN$e37g8t+az3nf}8Z0S}J(-0p`y1#mk^7S!Ch|ITn1~u|-s~?<8^vXh%0Fl#s81yoI=9FPs}-T>iNH4XU@V9nmW>c&iUM3H#Fyh zpPX}HhdCdobI#Qhs@*x||GU$6qo)6fspr4(@EaSqg6{vR>Hq3iT->^Eq&z6&p1%Pe z;4_i3!)gJ0C=hlV?goaTJf1JvU<%3@L@tZxQe%-b4cyIc?4xeMXpx>%(8|2t*nO-_ zb{#i(Q*vxnZ4_~O-}ZDF6O~*PLkhCOGo*8aJ0*s$<2})z;HA%eOI6n3?!9~iTr(__ z$7B!gUh2!rGhdIjRdd${@&n6my)#e{=ta*b7=L$D{uXj!?zJ1?FbG*F9L-^w$lZav z#qrz?fZ6TJ3~kqT-0exZTf{yp3PyXft2XYIpkhwc3;UHKSvAikIw zR!e)rs&vi1FseL--Gm$YS2EE z$GLKolIuj@5c!DxQ32ifX`+YfNoZ30!fS4;7VR!KO4dL=J-Y!woYf6E7?vZ>WSX|< zaYcNoX;foI)|F+CE^YYt`KwrJ@s7w*2WA?@Y^rz)1!zWCzaZDYob8am5NDZ2T@sZE{tD&oIG!1RCd+z=mK zcW#Y{jyjzixe&{#Z9l)$1n#uf4VHT++L?H?*wp(HM{ki8FJ(I`loF>BLtx zJfa<6XmcZ@Ilj3OEFm^EI{L!Nje0*Lei7^Khhs$kTgGsQ1sr4W$rE42dM5Ra$u}G4 z13Hc!p9j!k97kv4BlO5L_d+LmoKHySdcg*5gU?77%Q%W!)>LFMh4?7?g3_44fp)r60Y*&I$G!hIJ zr#rC=YuPWm=;Nd^5C(Y-n0P4*^mxGTj5Yh~f_9nDlk#%F68Zc&ej_J)IE;tKuudNB z`9chDPk*+&_?-6ZAW4|LYfR%^#1s4vQmFmc$M^hU>%OxO?mNWadwPEZIsZ<}#8E^% zx^H~_u*!wwr)?X*Ui(rT2zvasKkeB4@*iI4m)7t+>$yn#jBVuH;0-=>jjl#`dhZFV zsZ`)RQAJx0A9lA4~6w%VVNO|^hA_Nc1P zdLnh=(-=GSN#d=y+?+L}dx^KgJB_+9MWx`)T-7~EJQ(Mhac-sQE;6&-?H@QwypV6q->QnHj$aKl2? z$qu>JZC%Y+6@VUQtcg7W1(C%S;{1j^W{1AP_ zbQ?#~+T~#8!MkqkUAH!l;1lJtu`s|PCVSAo?3RbwBT|z0M)~6Eq+t14e6e(_W4<;^ zCbcVY7Ptm(ub3g$!j+v%e6d+lAZT6BTk z&EWF5rFw6w?AXer39S!CO!QFiANQEe!*V=nIM3q)Pcuh84vJSw$wY%@V+U=VnvG8j z#Sp()Z!gFT3y5dbce21(w{&B{(ng)mJxRByj6;R zQ3pcB=a{mNr!|?IdQDnWu1{;KPHQ93N>j=0vYOy4|4DLVin{~J4Y6Qvr&J^A6m+_G z1Kp`y7w+L}P>zHL!cia7N|+~}6Prn+N5JeM{hY6DT8-H@b8E^Mf|=}AoT|?jgAz#| z=HaEwm_%=OshNSFp6=D&Ooxfr(+v))=qBdBbQCW~Jc{L6Z!1_k*q5Dkw@L}Jg54YJ zZiSA;H9K650@L4Vmn(5ko9{vUKHE;aeO&gw>RJnI3KWKaJ&Ck~F*tT1nVyw|_Z5%#U`^UexYyQZZ zc?&u(cLOicU!LBPo9G{>wfe_NA?h6@UW%qN;Yf}5kExH42|hwZGWuE*L2h6LcwH*m zjMp{S<4S+@ZpauA7PJbTFU^0ob9#7g2+fxt#5uVntSF{7+)8`1va}f3IEpV6HCi0_ zJToI^ASbh0Dle_2qTPmNY~d2I()viNgz3FjGyQD?SCXa=8nLF7ll8QheA1RMpN%~? zXss_lgk%uH57Jhm_>iYt4z*~XDbGDySlG}&pHnk+hgOR@ykssJpfzhvV!rk-+64^u z{p&(Amj>3Z2UbO-(4IMAH4CdkLbNFr7R%(q+wP%gS4RrYr7OmASVSX3rq6H10F{H4 z;W?bt7+MpWXxyR;mNcXYpmH6sTuHQFLZeCc^woL1={vgCp4_s>sJTsR7muCR z=k_~iKH6>KnSH-{YRTLw%a%=RXP1g@we!d~-;l)hE5Fu$c(r$khF@=A{y9k` z2epI0yF_Z<)7~7k^p^0?fp08FV5445a##B-0R$;I;i$V^IStDiX!O|~rdVGX#TktH zSYm7{z0GtZtEIuD9XGH`P4(%WhSY33Minx0%CGz63*j0G5*-o{UcNd-;_7?^vHw;1 z5rou=yM@&fK2Nm}Yp)d{+**oHA7_D`CQKrGP!4;FGLlL3@CT{Y-3L~hPlFzW3=t0s zTftB8a)UUGaByMO1g?Oa7F_Fn*zl|M>S8Z_NSfY@f+AiE!dZbOjgU_8JQ>m{aKFl> zZP(9)YuByh|KKz35bqH4>1Y0{dZb9L`1O!*AN?1E%ZI-|^pk&|FRo*MPmb|#3l?b) z=%QZ8KkOq%7lic+u(GOs>`ZH=4QcUNh#*5I%&6lGdY2CDv(_dq&pvkGu*vtW-1D#DY;8_!J%tpm`M-J0#I%7` zY)oy}^7m|G2MwLnIwsGZgL!^S=a~hV4y7|AtTULJuIxA-$NHkAGD-sNIgVX+#d0Op z74cvbNPPtwIfLxi!&)5{A*bVwbC1`Ty^)ZTT2VD_(70R4`%l)Fy$NrTWgXV&-rMla z%HPHojOQ-$Z;OVud5Dkl;Uz~r2cH!hxsg{~Mo9wzZbJ=u5OmgXB!T?2F2TQ3AxT(nmYz-52@KZeg*`Hq#n zXfZP$v6x+t-ESlY=IAtj_j*dsg<-*>~v`feE8 z_1!SCz8l8Q`fij&uN*&qCCV?k_ZLSu-E-`hv|bl%dOg9MR4;JoCOuo%oe`#8%YaL& zBPkT3cl8^wVk7#v0jFxiZa#L3QSjk|srDvh91L9AY4uRNkr`CoukYCEKK-i6qt$ng z8+T_l*)z6pzv}9KeX2JOsi_$-I+uyNH^jrS#;vs21*#8u; zO$-5GTU^zgKs!RyPGSZ#o@j+av@f*Yho#f!=_wK`Fiv5XJ%v7jEh;n1uD6fw`}vpE z>&V`nQ%g-HlOJA@VBT5th$%t5vUF+7zjzz`+}U*KP*clh zlK6qPk<@*l{gv8w3>7jh(4<(6+F0KuoFXYds-h^1A9$L z#0D0rBI|vwI?}^!53tF)kq6l5(LgoRhL3<~bY>5uwktMJHuvT zJTNgOl@*2HqfR1bZ!*(_5tA<|){(TWGh-SFQ+{!}GbMn_xbXfR504v{-LH7t#fwMy zysF#BjJZAO2)0b$_tdjl8kiA3(S>Ry=5m%FQ<2DJx;Iu zNV3=M@)wj&op99*Tb7AUKUi|Qh;{O9AO-&qQv3HA0C?JCU}RumU}Wmo4BGlFp5Nvx zgFFWV2%NKZPl3_@zx`uiInEB^axgG~C;(C93%dXS0C?JCU}RumpZB*9NHYBY#=yXG zoB=3;0-gf^fXW5o0C?JM(=kYbK@`C8I}L)Skf1r7$}t)mTEsb8iiU(?M+NKp ztj5|N;ym_H!ht_W&URzTYX)U~$D=<-@^*VBA@5kgDAw5fq&bTZWSPtA`!2EX=iFT+ zpKYBlVi7O8Hmmb3(Z+OrPVYX4Zmep4d4Km%OwZqG*4}*So@IY$x8|H@gTxV{-04v3 zFZcf>rjgP)>R_i)<@d4A!`1uN_s>R|yTP!Mdi-eJ+i3i1FKPj$fWDSK1j)Uov=^=9 zZ0W<9*0PBX>$4YGp7Fb!gDpMcviltxa`$$=tSP@d)}yrt8Sb&nLn46FJ%A#0C?JCU|`UJ z!YYOpj6FZavF`r>!U~yupVwu5mg5?IQ8*2;eEjA~%DeMgF1?=lM3^ zJmPfV4CAce?BV>yHG}H`w+DA0_cE`!ymxELx4x1 zL12TxJHav`J|Q2WHlZy-PlP@RD+pT&2ML!5KNIm0=@a=O8Yj9=EJtjM*dOs2@d@JR zB+MilBrZsrNY0SFA>|~sKM zFhk*nVwU0^B?cu8B{!uP%3R7}%1e}gsKlt$s9aIyP&H9aQk|rFL-n899Ca%VHjN66 z6Pgm5IhtRzsY|&NI&C%VW$E4S!_d>r$|B8W*L5HD);WEP$Mh-@8 zMrVvAj3*dhGLbP^Vk&1k!%WKTlzEMXfyE?bDtBPx! z>kQXFZV7Hj+&;K_0bzmrH1}y93LYywws_ijt^)ud1(Zhs00031008I!L;wZ=00000 z0ssL30ss~O00962TL1t60C?KnT1jss#}%%Toy7_4+zg+B#snC90*a$q96RF^Em0%E z6e)|8$39YAJJal@*-gp%6FCL>5%~c*1UclG{HwhB-m9&%Xe*7K?!)@|Q6Dy{qmeCH~rv6M!APR@yz={Z2poMsh7SrL zMi)f!4bjtcrqr7d)hqRkTA$+cdr;Y3s!)=cxQwVjBI+ypuh%Uw?+x{3v|~hC7*p#C z^ZV+SRuq_}SDq5jn)8)f;+ris2IUk~=U8`1Pq7{AQ;TQv?kV*?!TJbt&Y`~ul-D$> zd5bZ-c`t6xsiozQ$evC5J`t*O`V=(xCGGx1-QceYE$|LaP+QPgK|3u)w@Yeker8x7 zkuBJ^4cmTpZ>@du7Cb%1jyKTjTrikJbJs%c7?{#Lc8S6QynGxW;A7}R`&t4DMykAq zUK5i1Z=>gZ^$UCkG>f@+I_iVtf;6fnaPn!7)AFX!hUQ?6J$VjjD;Vq-Gq8>K$|tNv#Kd<-DAE{62z44yoEi1^wcv7z*uy(9FB-pzAklb!jQJ6b z8?KhfV1JS_jU55=0@LIb)G} zB%CiGKgT4FEWY0{hs^u6)yELrX`UwD+|1fy3N2_ou{Ph>D0qWdFoKsF`85AJ(%y>q zYmLmsQsW>7EG#E}WL;uzL2btW9DeP`0~bllag#B03?Cc9iaPS-o)xMQ)90J@!(6Xr zMnjObrgm(57N}%mS{;|!CY^#1Ud;B2o3$ z&Rl@c1X|3I2?r&_F$Q8}v_#}EJEow-86!p%c4#-&=Jg}YHrlz8Op{oRXil#1G`4-) zbP;ApCz~JlnY+A_{XztfMHfS8$*fvcYK~M;oY&}fZSiomlSb`+j*p7l5fCOHDF zJk1(TSidXSbOKCNGrN(|uPIC&Xrf1mbe~^M`+LNW6|83B-&AZ-^@x>JPwb)P8l%1% z(6tro+DJA;TucPJS%ANc)~-EXT#Pi*=N7d^jove_;)&6&w}6WmN0gP0Dd%?SGoVio znOBcI+){Zx6m3i;{uoINPg-`DOQxtpSPNB)`d%E>*6%0c6?(5vXx-zTwQq1Zl08?V zcT)o!AIv3V=@@P>5(hEdj~f&5MptJ$2^$g>V)5g!Ci6Wbw6)8F&NdHsIx%drg+Z0? z?>T&9REpTX^!j-!=Xz(AQH@n{Tjd)W*fu`@Jy{Whi=Zdg>I6pBwsQg3 z087l6cu^^b=IbNzeQ@Z@dREDWyUDse`z)mPG5igYSzHXrfVi=ERUsn{8w<2uucSIE zAgx)uj~Y6xHq0tl*JN@I;n^^89yO>7_M@0rw<3)^1+?{n0z zBhl6k^k@9CdX`=aFPUe#NbanvSP#8yv#y%nNv2KF=!`N%ALq9o&TWt2DY|`B$sgz7 zXaR3?=Qob3%=JWU$Qnq6yGBrlo6`u_&NDfkhx!g>*LN9(WNBC7xfoVP=4R>LPHTHF zU~1r7sacpN*TNHzLstieb@J`jiqJo$a6OxBt+LlZYkAb&J>+jGEk_G;o-5;ID$zJY zb;_D$gpK8-l_B%Kw5WNCT-`-A;@4<*`)Dc{4B3yE1>(bIE__4AQvc6f(i-eI9t9iAn6C{;8Dj z8m>2199%)iQggY}e0}xjYW-X&`X{%ro*RQ#AETx!DrBF1*p89K5&8!?E%=q+92K2j zu`iYT*t^S{OOMGKey(*oSc*oMkloziEJTx>LF%Y4kpH=_klTzHm>gp_V@R^ z57tl)DSyD3E=Fx#c=@`J+oR={Y#8RhvR?T9ozL-08*SMZcU7t3S%zt_|A+N-YVTr} zBFChr8fQcY>Ze>)S8r=Mh@aNugz7-cRr@&Anyotkc+zTF2k3RYKW&9x!_!=j@6PkAkT1?}DzBTRdca^sjFU5-5mz9sK8eeJOB9ReHpMMn$#zOptb^J}Pu zHmJjZ+2IwWXhRql-rB8`kHoa3vyb}P$&ia zf#%;y!Fq1V_o0m*zKy$L!$WJ)9LB8?#!lN8f7U7+!iNoL_o4GIqQa6!t7< zp?;0Gn0dQI2&QHB4lQ_ux7;1!uy3_-H(iciZ~r@=C&;-o)MHJoUr_5c?vz|z%D>b) zMmFS{WQN}dJjd8`+E4#Z;3ZX_pWELCJ^wdg^qENj0C?JM&{uHGaS*`q?YLoRvb z(}9k3qBC9SN;kSwKo5G-i{A91Fa7Ax05o(A92DZDh+;}8WgvqX%n*h$jN!O&GlDWa zcp1qkMl*)7jAK0IOkg6Dn9LNWGL7lXU?#Je%^c=3kNGTMAr)fb2+g!`ode;Ewy=kt z9OM{BC5j!qV>A23DmHdYG~2kvdx_x?$N9+*e$mEB?sJz@EMhTxspKJ5+~WaHdBkI$ z@G<Vgno5#23DCl{1{>8gF zD<>q28{Cv^$zhk|N}l9feKn2se%%(T4QQHHX6n+EDt8-7htjDmZPy4lDs`oybSMjz zPGym@SXrX{H_v6NtGT*vuMYS^!K%uN2ESP{yrxdC#S;qFwI?36hu3ZH5!UzvjwPB3 z0C?Ix%{vmoP#DGWT#=_d<>4`7COYOe79mk+j4GKi_MlN~lq`Y`d{J3~U2%r%>(1{q z|EGALNnErw*_*l*;@Y&8DeEak&6?6J#;KW*DR;F-dQp-tm((rFhaPq07Y5M%!vu_% zf(4id1skyT3JzdP1s8DU3O&GG{2<6vK_9P&MyppxFaZ6G8G^x$8G+%78H3S`*$3k> oGXeV}W(p=lW(KBrW)5Zp<^as)pADt*13WujsQ>{|7nbAz0LO99>Hq)$ literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.eot b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..bda2005c0248244ab89377c7c8c04934b4c1a825 GIT binary patch literal 23716 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 literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.svg b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.svg new file mode 100644 index 0000000..e031390 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.svg @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.ttf b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0959ecefeed75716d0f3abf3b4b4db05ac27e574 GIT binary patch literal 51876 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.ttf b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e1662862ad90f40280557d27588b9a580c62cf6e GIT binary patch literal 52456 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 literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.eot b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..ddf5d1161fe34430599417adaff8b81e0d389fee GIT binary patch literal 23974 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 az1cE(_pEhtM`Eix*%hwY$Pr;>Pu6HLI=^QC literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.svg b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.svg new file mode 100644 index 0000000..317e536 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.svg @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.ttf b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6d97e7b25735500915d68a9f6b59091f2e8ea85e GIT binary patch literal 51960 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 BzAOL$ literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.woff b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..d8443157822bdeb5eaf31bdb9de6e5b569044f7e GIT binary patch literal 27048 zcmY&;V{|4>)a{drCpIUV*tTs>Z2O6Adt%$RZQHh;OzfNYyZ8HXtJm)8v)4YSx~f;z zsyeG(# zaL2b)IVCzq0030}n^XISo+VV~x}mkc?KfBQtqJ|cUiOS2xuLTo0RR9_|E&@K4+yC! z^(MBa*591#x2Epv z^xY)vw}$B(tUm(w(apZeZ;t=lCin(1d?a{{nYH70d^NrA_}~2i&B@|YOt7*s{MKot ze78IFjk$z-dqrz~*Y9?{^iTFZsV3 z1A0AMLp^)DJ81o#aS7^C!x#fSkZ`8=uW3M>m>8x@H~I z4G$uK7}C8iL`Xz*OcY)&Op(hOB>P8_u7`wD_`TH8qH#nSkDmgM{|{d8IDK<_V9e;% zgm?X2`syG^T_CJNCa_x0n_Ep5S{(ZLwg>Gv$9oEhDr4fB|3W~dR$&5D7UyOhzd1lL zcW@(ID;ghZ;&h4j>(pZ8k4JI}3LEa^l?owUxj|#o1-tzcn^vVlkI(Th_ok%iwLFqw z(&IqGu(+4929mWJjLZ~JI9dZj)!L-0TRw|}OU5T37NNwBW@@|Lh;$&wXtjFX9N&RL zpU;m(2)w)h855JwLDb%!v7SDQ3Hu~JKYjE-6VCCNp##W**430$^_0{UHB?N@6~BLx zu<|=6dk14VJw0#fVNtvIG1FZ^r`10|_l;t3@3>Sf2?~39U;$P*u)F__wVs}duO1eJ zC}@a-CjvT z9sQ`hIndy3>94PV$zAX>%^plJ<;fg^9D-Z|P-Saq)k&y7lh0r0U&CJrA9T;xcTZp2 zstAAi*zfhe0=y8M`BrZA`U4IT((qHZ`3i0l9w-)qgh54FAzIKyNeOxbs{kiX=qjwv z@UpZ(JRM$d5CKAcBn1XLXbB2)EOibya1jz?G-VbiI2ju2U)nrgphCY5QIwb*V5F!l zaWuI+AjQZ`F;v-H5aj4=@OAmVe0y?sVrFV?LPttYQdU}?1BHW|9;dEGnT}|58jM!w z4yjbDHR_!|+Td{5Y&PqxhaY*`pRNqaB_$?1G;3=J-Xzq~g@&nv4IqN=?Q72MEihFs zETpGEYaJ}FNmv?X`5d3m8a11%w^v4OZ=m}3ArZ29OiMc4LUId>Tbs*$`Ubj6=P`>W zQn}K1Pih5oiYN&n08Wl!4&QVB3Y-ft3Ih8*H_HIkfO7aT5*!)Nf#gfMX4{ zJ~d{@BNrTcU@^+Th%4w2%ACzUHo^`BpWjayZmk+CC$~U69fA-;+*6R35Shs`G>@5! ztKMNMl}TzWw#?SY%yNb7(3e$z=ZTN%FM51X$_Y4xj?vhXNM{kGhS57nvzoYNsQ7P zH0r3V)Hw0H)~j7tf1(#aIq3(v(y!tMiwBQDiaOU!JVp(N^k`5%0EHBf`;+5vWAw9t z|3w^ms6#@MYd^RVVkmaGCx=z8{);MCY4crYP%HutZ*#jsF%% z5CF*67XZO^t+Nwa@6X}`pZB##y-g~cC271hqdJryY$_o%;RUg;m0;)y=^H5*kwIkW z$eth)qDXmY3o3<(rwt=fp0a$YNcoaY_ug{Tl7VtsxY?pjH|@bK-|-e(yabe4clY+! za@qv?QKrXL>#^t5YbgI26w=XIH4za*oPAK7cz26}>W$kUhLf)iI@+H%3FJgwmBY>Z zqC(G}-Ry%;hKk~pKP7TG33X`-5K3SkRK32+IXBb6y5ewKY=b`~_~5!0WsBllVq@w8 zOMW|RV~FnJKw=&MpVz!6Gz@Fxb7aRa5Z2E?*m z{WYCI_tWP*VrwVa=36609Yvn5k7#Fn6-U2!KZ__Lk#|mXEWv2Lk_0!*65iA6k6JZp z(pdCpJ|?x3Xo^4EYeeF!96_JtF|$OR4tF=!JRR2bnin^$H5-acjN&$o$%9cUn#@1% z55*2Dl)?a}Qaz=Z=IVU|I)hQ9@0R&fTBPY2;Rw7p{}4KO-+Ru35jw0Cur(7AY2wT4 z{=#d0RmQuHQ;R`vJzRo$5}9&n22$s@SBMyO!#(3vEg8V4?1W9P8r-UHK3mf`SHpew zjCxC5G(-CAZ$GbY_jHdLef{iWN_o$^ICwhP*={%>{bEGe#(?AiM^fKOh*4eTXmvZx z{3Jsd>w_zeZ0)~6L0OGvoAB-fzLy3^i{k#gVvk7-t0 ztfI$@&q{=N*Mtrgn)hGNXM&i~Fa-(Z0oib=Bjl&#tgt!6ZSQt_zI~|@gReB2pR~vh z!!Tj1k;ZSAWFx64tuw`eiZtw1g3(;;){(;JcNP}m(KFgs)H7cMVu{Da`!Y;%uUa!@ z<7;~_d|Euk`F2u zP41+@p)eo`~$4*snvuTWFL zY9xd^x;jx>6eOXuI_R@2O#CIZ5WV3demL;6CwHpK!(guT=*gIU;3Ju84cJ-jJf9$_ zE0F%G^VZTrlLN=s-Ci~=1_s)PYXc9;KDZAvf7L%8dHyY=s%r4HS#R|n4lh-0YjBtX zjkEpsPbLV&1Bf>eY(XqDPR|T#Hk0wO00}k zMtYvhS628OIkXqO1?=0R20gAe8t(2-Gt95O5^n`&Xk?c7 zFw356MiB}Q3s3T#5PrmHf=W|tM3_eJU^g$aZvx|O#oDKdE_z;zW; zRKpfc9z3;o64S!;hyltkfqfY0{vbx0{96l@f08 z-}A2y>h=X+*Y72FCJ2?lV!(mBIscUy~rUcT_zN#Bby9EQVU{#-i0`jR5iG9}_6 zzQ-u)8KvrJ+!MSF*<*pmB~TzT(W~T@XmKIp5kmOI9qOrpfJq9^j4fdd2{w;3nL;bd z6rSp(jhs?p8WR|R^uFcmF1%962gWQzAP!|A66>JiNQqj4+;TMU@V4=VpsN*aqD~fX zuTGvEri8?^O~{{{bsdN<2(G{sj*1~*$jr~TQjT6C2K)6o)n_NyAH=k0`3g0^{Xh)# zMv-ff$ z**zI%*FU)4@#*+@;Uzn}=(fW*DiIY$vsGa%BtfDC=(8Z_@qLv%f^kMb>1JKfYU@`2^mHYO^Dc~^( zzkl>$j_9@^FQAX?fHv$z2**p0+S$!b-Gt)9;~pPl*j7Ii-TaP@B(a08&Ls4ogaE2( zup|^>?vw>ncO(e-mz!YSm?w=-_@XE<67K|U!fCLISr7(Sa98m|%2#nZ4V7VL_>F2Wf` zM?wLz(o3Wl2_heiJRzEBgN7vK`>MJDelvmOYs#w@d?7K6CfLH5J+IXloidv))rqIg z-feK01RBAHrv1>PxYnXK_9`PIw(WU3v7L6M)a|4GeHQq%jwn+3dztKUlX<($eC@iI zI{al=N8$4|DfaTp*4q<}DG`F`5lF4N@z9Yf(R-R(xi*XFvK& zgomF@WAaGdaYLu};2k4GIrT4>wA5?&K4;$TGt^A77?9w0gE)E;X%Lhf0)k7J7QILB zz!I4w`~4FWbmFglh!tOvD)F@o{HjwVxwEPphjlIJdAyhsG^Xz%mh1*314aocOPzYS z5{{K1_S0+@w$ugz2N6A=DnJ6+_g2c~O1;aef6f~PvWgt(Z%I~#M3m~L!)A^`GcN;L z&H0BWt8TZ2SBYaw%`MBrVqLg;^n|Xft%%Rg8>-rJIsw;9L8O+{o`9BmZmIGWo5?x{$)^;0}fm3eRrs062D!$qfXOh>>LYYM|7K4pcc|D#3@2g!AGE zYqFKe%Hn`RAZCQU+D}YDE@S}y*x;E~n$~dwFB9vP)$_;n5}J-GN;-RyoZrfEE|Ofg z)78!j4V#X(-C84XN_iZ8dW(Ew^JNib+>opJsbmVL%W=E0pRD5{9b@_-&E?u>?jsu5 z^4W%S6DbYy!U^(b8j?6fqt%8Qo_-WcFhjhv{$qL&yXtV)F}S|OBfQ1+tS#8A=vHd^ zx0utu&U)8BKA*e6Z65*C+4?_5u9XV&>E3g26+M*5PehObJ#A{j47r4*2CrO90SN?u zg91WayD_+@9Vt8clQpp@V;pY9e*`32=$V(|nITym=qN_8saXjQY3#C_5EvQ)RI>@) z%gbA|gp9uT)I)!N4Wc6U?^7nBCbO5U$5TDCyqLdJ-zMw+ayR`9wM_qfTQuD6_BwvY zVmnff#8I_og2mI;u5 zZlXF=W-|$F-0!V2Jo&th)Sr>bv2L|jiYYsuO5vR0Y!!I%>M+?)bPcz38a3&@aJ$sUM@^jTDW=r2O_qpnsFaqD01PPsK$CXtY3GU}^ zYW@xAwxf4pOB5})YfP6PdHFm`IhBXvJ3^I2vwXC>iZ%`KO|dB!R%jsh6f@`9gI7%rY>-65Ft1@0a+c=JYKFOK|PI86^Gxn`j$c*J}<+5ow9 zR32m|WLhM-4ttbcCmOe%i6PWa!#TEpArX+F8}e<;K(>vq$7*jrqp<_ZdCjJOLtz1= z(XHO1U*&fFPSpd6!yz_Wu9rhpq!${zE((qZ2_k%+<@$nt6RO7jK(Aj|!lJPr;#$!_ zJ-HtK4rb zwxdraVBPuHHLmC8qc;qGMoWnz#s*92Q@|ZwY5RwqCY$c_WYqjqXE*RGU~xLbUH;?s z5+^83$U;o6;-b|}g2d}WhVyRY@=WF|OhgQrxn}rY0%C~YeRo#u>{UOC+PLnGgaSSWwlYGw^ZM7GxAJ@F`w0s0Tjb(yP+X$BlV&Yw}!CI$dyx%9HhA6 z(WghUfZPa785>1SRrtYt_Q$bDSiwS>*m0m|7>HCdI z3nPlcBmKc__o?AD(-(3&Aikkb5|-H@{Bc|jRnPLqlBV}1POHwp zhgG7Td9>8xyBA{#lzH~T`Vn(9+@Cls?%@CTLCm;V$ z2`*xKlv{L_jzW}v*S<<>31rYW?yj&v-_M#R4CEOmi0U@CCGx5m@)UBpdgEp1mrwiG zy^VR$>!VF}!ICB$-rRE8^wf5`;m?arM@@si*l2H;oq+}D3-0L-TTwR6ZK&5AzOXl2 zxVX;5h=xV@KuD}zcs(Q5Gy2hC06A_iJ45?z&Z#zbxGlrM4qG1*Xs*3Eqq1yJYJJwb z*+-dbh_#yATl|-u{g)vdko|_Q*}KN3?Pf>EBGz;Yv(X{-byN4V$h+Bmm}(wg5oI1{ zWE;}2n{=kiiy42!YO&?K!5%V!-bRSkQU?)nv_p>UhivB%EfI%A2^h&1*3WCm<|2g5 z65hhk;oujW5A{rTeD>ev)1_hyWPg2LSiGWd!K!Gof-N;i#V3~;A}XafdJ1i1PFhD! zk!n^Hg>$lH;&c$+(I?ZUD>>FSMvwU32J@QY?;Fy{BIlMrRd{R_wY?PEuefZrnat3g zHyX|J8ix#fCs<=1Afv0p*nU)N#}Y;QJo< zcH}Hzt``Oe$jMmr{DPGzsgrj!;ahZn<9oC|ndhds{cNw^zOL!Jwx!}$!~hdf2nR5JTI2@2*;MN$9M8r<%M5p2#&RcQ^%JIMITa_%~})T zju!mW#EFI?;+li0bQ*{`B)&ri+x?V{Qa7Dx`KG43{#Y9G@By8hdnteB?uel!N1WU6 zF`ow!4z(T3_qxD##TPOb^tGO)M>fppr6{@we>C6Yjk((G!l(+tikpa~5P5=$oOTr2 z-dyLvlo1~EW16=O+6TmVhe|JT6o)^um_oV87YZl z=)WhPXM0m?X~EvgfXx^%#Qb9u;uVCY#Nkxz%;gMp*cZhkDAoFl^Q)=mNUD*-Dfn-H z<9$JhbFlCwY%M0iv6z<89MzdXVB}@wJ z>OV!YgZ{liutgOK)WqADAgT4@H2$*`xtYxEsO_L6@ielg#}P2Cz4UDi5KHU7niSvZ zRPQC`X(wtHzHYOx-Z;aPKT z9^Zn`S(U?PPP@dORLS9ppS=)s=rM#+LJ`oZ2uz{}nj{`(QKIYuBv$^MU_Tm6_}5bM%~Q9p2&nCnrDn zFFkO|^Oo#tqZK!I{@cCY9mlnulXZ4fCh-hebWO$x@nkm8EbIn)lvz|Duid`Bv+^TE z0>}iGD9wWO`C|TA^VwI)wAbBUR*26>UzV6R4YvT~EZQ0CL(6MkTNvv+Vew*h>BoJ@ zANj?CUjPyr>H(Qxv*PeofUOa-36%hhWs@^hxO%=upFfrgon+lQWg(7y3=n%pOS2)3 zZvM_CW9ub**!glLc&=h<^>gjd;%{6ti!O7#8G0EnX-cMVsv(e3X({WdKy>s8#6KIzLRii;rx0QL_ z3;1*#pL>zp5{|qJyoIds?TYNPfcow|QbkRcKZaE3Y8EX_ts04n{uMU(^Mnf$m|G2^ z1_ui2f$-3s6R*Nb)oZG&A>_lJnt|)9h&gAkxBZ3x^Hu2m{0gJl^kuaU({rc%)cI%W z@volcn<%^6#~2#Z4y@l-nFC<^w-I63lkn++pQC&11c9V!b?60W;lU5eDc??slpytdpTSinc870+a-e5~`VBd=Gi4f9*zt}==V~qHZ+?b$1AajuCv?g7M$HB{9v$w@TeYsFIQI@$hGF7m8ldx*A8t&|Mh$O zzw4id(#^rRtSJ@Fx&$T0gQo;cUAsXpb@NJxs3X3M9`-9|4)p%nqkqbqJ_&-zD0oA6 zHnAcN$nUGqsd+Ao^e(&Do)RCJ)!Wxqyz}dF{Qu~1MsN_MJg+$Vtga8m) z94KNy7gCfCz)ob&fEH_qmYD!BbJc3#+N?vp=tyV8A4Gq@j z>%W$>?P$?>(eGJd;P_HgBxAmt}u@EVA=On)jd z-QLrVA7EQPC9(VTBu2PYTIy*CtE?=Mn}8^MpO;N{9N5krd0D8UX9zuRc)m!@K(92EAH`Uz^8{)mfp7bzEYb)3lusSsLVWNRLQTX)OdWn^&0Y@YZ!)71(^ zcu4S$V+sm*YJggFx-o^$jk`Qtv_lTc+Hzdw$l&qEIRyN9d;@68on-eo?~x_ujFBO6 z{~MOD*uW|;nIWZ|8e|A-v?){pB+pzLS?S=6cZT3sAw$0Rm@D~Y{3V~7-F9y0%0$6R zSAM>z!4|Vfd)ubCrHq`$>dF+uw6N@uDIf82HNcrupM$e*xG8M~xc4)(P5`^cZO9=K z$LnK&H*Ba)W;Ad`lALDt5?S^vx_{fHzgtfJm)%KR3lE|AK%Vh0G)l()+43K<`YA~b zykzIm<<~^A>R``a*;76AeKf>Z!lMs4~v{(!$QBZuo+K+YFuNb-8Ea&61|6XPiDvxZ-6ImHlkPX1i1aPTWZU5ceJ1XqMji}wWYsKA ze?fyzR?+FVB$&v#agaZ6QwxU5{{;at)fw206r+|$6t-y)hm>?+V4mb3S5u1}A(&A! zr=5*;)ph;yg}HUFxBqt?HY=Q?d;8|IarykIRP(V~dHQod$>j>O71*`*JVAGollVTN zSEUDfp=v^TwcFsYFbJ-OI1i4w=uAK#5rj&AwJZ7ukBl@K{fXX!1@olGKGe6DiSM1%DZKdbGPZ;|e#8|ZG>AG-Jy<$3j~Ek=5UO`ibaM(u_? z;{gABM%tRPXpj_F$oatQ=*Cz>r zpn-HxagpNsJA9k=7A!a;N@4C15uSGNm`AcOMx0n{qhQw(&kD2KB85WBDK}=iuARbrP>BteeqbK?f#8Iifw-48jq_bu4^50*oiP(7lhYCf;ClQ z52zK_UqJ&sCE91|WLVG}B1S|;^rmhu8dgPpWvVXBmzSnBK}3|)lw%nfE6sP79zd3FbqBho4;4vFg8VAr5j*{WwCXH*8qvc+i6R~Fu!B6m9Ciemefs-G5DToSf4C{1vliO+<*OBn#$$A zkg>M&Xs3b& zRKcT%HXX!z`EG)ei6>T~Qp3Y}ff3PDEdqzLhW zjctQbzmEp4clv(UJ74tSoXcVX!TWZ@4P)p8U#WOzcxR1urX(L~{|6o%Qo$64LI!7* zq8n!Upk)o$7&0)+Yg|ys_td#Kx^TU6gN;cN&9gilyKvS#5f}Lp zyGpeCpnu7WHm^3=&O83lrtMZ6Dnvsh<<%y@BtG@`#_soo{ z(mz4R??j?`@KE_OIzYR}$GyPaoj!o8mY0-UxbzQ<)C1O%Ai-9$!Zymp5CE#cY6?l< z#h%b1%)eJ>F3of0zG~j(^MsQ>#K(NP3(1Gi0UUbBj>6{KcfZ}xjwT_M^|>=nSWK_d zUS}2dASh)5JGTRMmdPY+N;?pcqAPUr~AW_oN^U=S6rZ&O2@3SK^ zfiXUt9Gp<9>e-RvkU6DpkW~e8vwIEo%BbqJp6*1RLbCCCkIxx5Z?##S(%c`}0O%uE zZid*Z_dzQ?c5Zedy+1GXg9jIs+Zc!1aU)}DU=tAJ1tl>Pa^NE5H41? zL81K%%CAR*I1BZr$2?x=EQjMy+$*7Gi%j=dXvPh8rT&E^SAi|`Rw2Ag zG{U66PY`hYQeU)osj3y|_6ncz@ImT6*u^U}&ySF7{^Q&(4r!Dda429&I?w7s>2WAM z${fMV{(^@%7(6`lLo1mRx-OWx6;*YM59k^_$J-gar9qlync6sVSLCpj*90k12M_lk z44x{thlK9K);QD&>!d#`mM}Qgu;xg><=9AxO=V&IVJFdA^=nq|AoA5g#HZ@7Uq*|pQQpM* zy+GAbzmBI$%Q6+6+8L87Tkrd@dMtLx<5)I8`w>Y|2vUboQBsJIqt3A^7S1PdM;R{n zEaZw?6$|TVRc4NUERd#Ws@A zy@8Qnj4W*>7E%?L4kJz|B)ea^u@Jw(qsDL;dMwn_S?qW5gXCbLwP~Hsc z^aF}V6=Mvy-`E}i&lksQpX*No-L`k{jJ@F{{-X?puWUPOZjQv&cwru1tqhTSx%Tw! zJPeWhhsE)Jtxj?to7=wIULV8}`-e$f2RjTR*I%-%cwFx9?R0Pd*s~C}ra6mNWVTO@ z?`rcwi{2f`ymtU_6zzXcdpqMgZ=UcyUr-~iQ!{DM>o>KR42-+2pK)+Z-qm?sQ%Aia zZ=PmB?mpczKH{}ZrDTCK+UOzMmxR6So-%J#6OZc_dpFm&B7lrtY{ro)HjN8f9~Jsx zi*Z;-v+~>k;?7yvYj|?`ri`tg!9@sw`wVsKYZFG}W8LCUlqbnz@An9k-nGYVmf`|Drt0Zonfz;& zE}i#h(MGZ>ZTOK%m>QQ~`(X{`u6cx5a*;1yB_|LD$zm;F`(aqjA@F~;zyBz~NVQ6Q zOx-TI?mbV3NK7#hi2%p>I4QJ*gj6-|E;#!$Y*`L5g>#1;4KiuMcs|Tdv`Yq6pnR+5 zrZL|4uhR?!8VaV_QP_YqUt3-sH&(T_w-!qrR2SF&-YKn8VHng$>AKS6Dwi-|yzLlR zZWnRBH6 zl#w(zWyZLATd$X3Jg;Kr4Wf^Wqr~>d3iC$y>uV>2UK;o11?{^F9~e{!_0#@BR}1%F zl565j6gASO&Qc0rqaFUaMvH1(Sin)JSXUW#&_7?XhiwvbL$i9N7zrFIlU!2!an_aO z?gm@X`7hSZN=N4m!iU+&J>V@kii#@usR_1iFI*sLtDi~**wMSm-@PVEhJgM25*lK& zD(@pBbM8ABu|fKjCnCgG)oSwmn*J2Y$>cg>q;{>JI3o&*y_|8c;mIW`<#w2`gbg^m zyunLM8EGDMEu@dVH7AK3SG*mQ7akqvtQ7BCo+8_%SVfXau;n!tK?%x`;FxWxLgXm8 z0||jTme2jGZk`vYCf)(|97jiiPPMe^KQ$@%`OGn3>0*&OtTDQYxf8uTj;raaAUZ5s zC2oHdK2j%RsRcJ*%+|7GrQz)Q%))|?pgqu1=gMz6$?|{$baNdz28EO<>S-kmn2ua? zU>XDEq3a_1OR6)IR>zeG6}*HVza#oI)$_e?aNJ)^|9R_wO`AgRXIeS?^U!|KXciv8 zwI7rIl%UIF)HBmj9$e9R8v8Fy=xtv~f8G+j(;ba@lDikr^{b>U;1jwgIMpad6d6OH z1%rc}vC?Gs_wY`w;ZK5a=yJd{k0_IJ9Lj2gY}`0@}54zS=rG=w??>#sBcNjwfb z1Jzhwf^=HNEcsBD>y*mqO^viEjGYm9qlIqr(wwRmkuu0}O?tJOZEuxiaHFYi$H%c$ zG8{gi+gS#ShmFs}yd1i8Hf@Dl2)4uaYo+<=Uy!3FuJ0+PdBO1_>Wh6k5{*BFPI{a2 zB#3z1{D7ngB_4Mk`QzpU7KsB>X@a2EkDMQb1e8S`Nz#faS!}{y9mWDkxb))?LO|9b zvko6-0#i0LXB(sW<<`auGlFvHPgNACOm~6a1Hn=%IDZa|I5JqC(g}khFMO|KFqk{C z6AIpIoUO4_MGNRme+wty7vXhZD_e?>i>b+~n3&FXN3Pvgr-M^pAG@s)O92YJ@wrfgjgkQs#;wKZ6!l|D~RK2l0; zUm<4M8Zy)Dh(Qm&x+Yi=+W&`F@L5z5KYHGL44BE%w9wJCnl*g#@OU`D;e$XQxHov; zt_5YLa&5b-6j2U-XYc7#+gjCDu%?SPm_=h%b%Rq|TQ!h!)h@CWg;`r=K3+j*y1D7N z9*We=vdPogYW}*EDHBh+?Ye&;A=6;;(E*2ZTxqk#YP-{P^l--t^gUjOgjy9Qj0qb@+kNNpDL4b^(&%lwMLpgF>=FJ)+^Pdgl>lO zA!vFL;}r3^_VnZI{LJUPn8ZwZeW|F(GO`O%2X6e@~gcCO% zcS^%w021!*F^%VbE1>I=_mt^|KQN$Ql|ASPRWvf{JSM$23Z{pfj}W7H z=;UuS+aq|gHwYUWBrM6 z`A0#fKOu*=)p;GaDx<4AZA`MoXMMw0V(cdKpQg*RyKZ{|873njhT7oHlo?LO(yJ+O zR2D1OFiNVau~+K3yNlcDZf-m_4flvXXbr%lFbV58{5yN{s?dldh9N$rQLuX&S=no8 z6k`iiAZ8lEy{!dA(kO$Aw-L%Ov~{=J%d)B}HUH?UDytVyhr!{Xm*Woc`HJBcXSwZG z;8}8zDDuA=3^KnWLi5ENso1BC7*3;j<-t#Y-`h2ihI`Z$4`NnT8Ebn0Y1x6r$iXsE zw(Yof2G%^BU*wV>H}3%KQq+KV-nM71`^R6L)z=roERQg z>vR}_7ACdq56;)we4LC%<4n7^Jl~eZDp0Py z_V?qTWHVf^N6%F{y{|Xq9+|5ynJ&j}@6uJKt1K>9fOknB*YhyUl0l&J#rX2d4>S+& zx$5=s(5q+o*Opct*U@JlTsYXyWp4Z9?H#FaIWVRiILk-qDT$XCXU59~ANQXg!s`{v*B(7T6fB<&p~k?j#QP) zGCXF7!CB|}0*yKEp3km#z}At9nC30$^O^A=2TJtuRpRvs_1P$Z@L?^Z z0yUmktuL+s;xM=1An-UU{Tc~kjBV=p13j5xL*2{U!~E89HbBdf43+na3mssU60CtG z`^w|resuQ6(`kjS;wGI>Y1Y@_5~!;5r3$;T#Ac0nOG8PCU@{8dow?NeJk!`xQc~qQ zGV}w$OHW)||0{Bs)!LnFq1g9@xk1=P@S-|a*Z(BVmujxpW4(x0vg8Mrg&7 z=r3B@!=#=a@mvojN<~Kclryj`g?2Xzo!z~E>KL1#9r1HjW`zPEOFxe*OBHP6^lJ31 zVu>g@No2P2_9TY?;W72BiGvONMfbU%9)kaA!uGHzm-dIx^Pds0edeqG(;BJfcEjkH z`n;`IymQN!r@`(Q)y^Epgz+c?k*Gte%8h@LVmhu~_|PT%`wDFu(vN{(E6zM4euR|T z322b@!5SA^<~Cxp`S~UL^{h4ADWYK?e)_baH5<(NS2f2=$MO zA$VX(4$PvCa}5#BB8{WfrDzQFS&c#J(?E0{{i7OJW}p>i)Ldbig@AC;aF7be6jl6i zQd(_TXHtUgl5o3NQVm7ohIQFCJO5&-EUL9y&E_@;7xP2D^Otse;gHLVa^7c0tglBs91f>?(bC*u?3Z_Hx?OF zJ*OgB#j&>nBQfa+FT+6;_3w97*k#-#cPmtK%$QdwC%Uf7(h_(P!J#I)$kXK@NeUv&*%-y>qwRvhJNDiEU=6= z3Sl>iq?uTy7vbIL#BM9CaWz}r`bzM?c8KCmWewhd%}iSMlP3eM(?FRtO<2_idZKe; z6FsqKt@K+9dPnNPxuN z>}?6ve<7FO4F2WfW>o?5Kc^mxbg4*#7?j}`^zWPDQ{+tQNt^@0qtrgQop8Op?=GkD zv6(zqQf6JEkxY5rFIMuS-(Q!bC$t(Zjxx@xA>ES#I;*AD-YlBcWI7u{`KZOHu9dz7 zWS$4gy&thJQuiWJn$>bj<*vIJQxCxz_-PBm$Ovb=xjP*pn0 zI!bOppOxeuQ2E)P#)8oOFMN<$rr9L5vEb%itStYDkjiQ zU=wWCK|$o<=H$bTGbsl^HI3uL(m#lf^HXX1O&3l#8Q~d&s564*a>!)E1f?}%T4mzR zYMWaCit(?|)EDM45>Q|2XQjt48-<&c#jvIw{7wX1B&voU?|{gh^b@N2$B#&NBf|~)0gnJLBzf+fjJ}R1>VStVaQ-WM zH>lZ^2*+39y(?o`S9TRwi! zB*H_rzQp!surL!x4Q`#6ubZ$lge7VyvdWD41BW>+vugZlDSR=v>dg`kvh?OfM5d|l zE!)Q%De5!A+_7msWfd*Tj~TnN0uNl?CnjgzSf5 zwojM75Vlx+1206wk?+)px~Yakd_&$S%b@&e6Bv_c5hFyKwnCA^da~Z0(&9xa?{fo` zxV>A6nS(U7A#ppgTEXJ5`<^kIiI#q8E46K6(;vKJet8VTSa^^H0o9Lbi1obM!{x}) zsZ*eir6yyM*`JCfwwXjPB#g)EE!4_T6|HWLYId8emqzn{h4as~kk7lM0y`sZQ@FPU z>_1}Yag{1KE5tie5Jr!bE-HWa&dZCzv-^VDS?Ga8T1kuw)8pF@f_EnSp`XRNI>?1X zoBy@8zr2L(?!Q`AR#{wDRbH}|p?xoWC3(2fJ(CZ5Id(cOZ!C;ZYH*oz)pIO#y*W8_ z%^B?NiJ#?OrWGbihY?^!@Z@@?5)%u~K^Be$n8+g-ibf=0)#T~16N}s!;0d81PT>^N zBj|UR9u2o7*n7>lI)0p;E^pMhzeb)*#cTb1z}v+6l(H+e+v^KLsn)64@oXkeZn{6& zY!_2EE?nA1Py_eiRpU#Gk_ilRvTAc?w;mx20e`EuF8#D*mv~gFLzP*yp|>(ckGq`d z_?3RxxiY3mvvTuW@g^EBPr_B)v*yy~K2U>7csg4}6+eelL;tLqVlhpoxKs|xTYuI1 z%(TNrqtcM)ZqNuqqEULBBUZSo$(-c$*L-Lavl!|f$_pS@)84*6s09ZE8W*{Idip+& z1%pS)!B;t1D*3c*I%lJseD_L}p|z#|^J=+YhN($+pL4;*c9Y{_lUCyrAK~vsEtGcb zOIGYoiq%veOry8dE%S*c)rDw(v{N^ikKhxRCEo7|O2;$*V!f_8&fWD_|5eT`1J0E4 zsr$(HZecl7&K~B%`CAIL0y-tfoUCj9khkHNy%%UlSGq}zN!-GDRF2zGXl9{bBWpE; zED=A<*82^j2XIa$DA0~)t04II@egj&X7Mt3oh}Ykvdn_7gW82coo#yv!Mtb zc0N--TR&xwBI>5T{eJ??C^OeSMm>x=ECi*DAQ7>W6q6j396DZo4y5b*>Ad@1AiLq$ z$ba+u+#odgeY+1)axQTWw?q3v;ldgCzKI(4>&|Ca#LevcY&e666`o+s!-~O1Dj4)U z%PngAj&YZOw%?|6e51AR7B76lzIzX=@eW|E7_ah1m&MPfLrOXf{IKAig>}od=E9ZJAHzl=6 z-@A~?)Jx=T4cNceSPUqWEaKEEcB|H1=drdX1e-+%9+p3r5V-O4Mp>!2l{Hh?S;=bL z&T6RbesGYiOv78z6}9trWMi^PM?jG@O5Cfi)@FZ{Qpv4N|3G=H+1)+@MBR3d4*{WB z>Ziiml_sG+ISfQttJdK>5Vg69q~?+A0Bq+cJ#Z3ir;dKi!)L~nJV12a^NLJthOQif zh4f4|d9`HvF*DhN+w1nO|CRz9);@&z`=JPq)x}_RIhJH*flP)sTQP+hT_F`g@vfi#gEi@4fWo0FLj&u`g@R@yPzM(9rEMT zk{9fbJxA~&Gj*18Q!2+^ph9e#lg8W0|MYE zMXnhW9011${iJBEzrXkL+$idBf^-^B_As7=NKe$07jva7BIm`FBGB$xd~|sSUMM*d ztK`Oh(QfdxTRRtUczHn%ZhVGU{K-7%(q>NhcOD@>Mab>O+cNds~+VCRVNY+9XFY+ zOy%Y}v2+eAp#st~)M^)fVf+h&OEFpaJf33YB`+7kXRK7nPZ7PleT=&$leTU`HokYy zrnS48kdY^MtXmrqOp|YWUpnn*Fn1dRqMgIk0f)>Q-X|&L0#Oa-h(LewB=N)PBlPkKSC9^A9 z0v-600KRzqj3jLS?TS5`eoQ0lRSmgyMVO`oIcW4n;G8Bf;Y1wN}eXlS#01I2jdq}oqo8rXXz^#ifDW&ZRSAlqV4W? z@!=Kt+y-s$D?3ka@T4X;c(ut5Ejkn1?8^*qz=&a|0S*@KnRTAxAj*8tvG8IkU`+?? z`KYuBT$uMn@5hcE_egV28roogASg1 zm#VR;w>~iG-Q?h)chxzQw$H22S6k`3P0da7c~78jkNzm>P1b4@`Ej$eO|5dTh@!*5 zWhEn{H%MY{C#%^2f1|~2>awd2GiIR zcHGZKM`siMX)h^m^kiwxd#T$5@HuKP<* z+9NUzY?;q#X1gp*%9x4F;k`hj&rs!O|9*Ihg0uEVn)y>e8a zl0oHV6}40PM6Mb#czn;{lXq=79|D}?g zmw9$MApxscgRoxE(S8n;69%h?L9=8IOVC%T@1Eb1 z8k&&4_Iz0T?LTQcMA1)~4pH1`I>a-u@=!q`Upn>xWk_=Pe?2B5NMqvVM@5W2()!O! zj*AeBdDTMt`g2J)a##BL3p%X7xPAQ{h7uQDV*SYp#mT)dk`CkE2ZFgBSdjH^vH)l7 zuzbLeNWs1nFPwM+RQ=pbNrKLbEI4#1O&Z$yu?zT72D>HLUv;72UU4`7Fq1rPbr zmfWmT&;x~7rW4f$T4V1XqTuKy*o0H8d!(@`%Gi{ZTUeIPCM7?_Mp`>D3Mt`?3&kMv zZeXi)*#pxBUj8xGZMV%G+w+=Hfhx~h+q|)bS5(yasyro^fx>KB_X-K?luHI9(Xc(I0 z#v~(4;MLHfV5l!<={>#cS*h;%n&f$XDmE-xw43DXS*EkPgZ29DPtaN*rHOJL#EB&< z9Fyiv(`4wVm1%kJ4tlK@rpSx=Cmnc;)~+lB4D^IcQFy_o8L|+K%Q-Hkup6+nILYVS zOYvEWmBZ!~hiZO`+G|Hg?Kd5|yc%?_eqlBI*VKD-@7UPbr4?e!l;z8(OkTEZa?gJK zdPZt%HC>=TuQLD+jF2kwFrQO~;4jkxra#JhpyiC1qPMoPngMSP)@$@a6Q>w5lYzLKPnLsVVL{mf_QjrLUFuE~{;JNCR!Y+NSRA1aTEr)>ECSF}VSH*8@a~0q+e>ac z^8D{CZ9lg?xO`!A<39QAZ6{x4tn7DNpIlLQbe~X5_sy9#X)Sd;){=h$*f`_r!|J#1 z*LT15p0RtD9z2Nr9N1^r+(=--pKre7E}Z3~*0EVWMJykqjqs7PBZ-_2Ni^{CFl3m= zTLLg2gSoOiJD}0*oPsdFV?sjjw0QaLsVq4tPNqyPA9IOmKNn?Vgo{T1EWa;|C14)8 zcF3?JA9or7G{--hmxRq{1!9}Cs5^NtgIB<2dcjA?zj$&E&X>;OlXJ4PVN$`=A0S3SkJ5P6bqZ9%BqfmMFrAjx4c6Z zo3W`qAJrwp9;oY$j&1L{Q5whchk;dHQs0G$XKC#&Z3}^Q!UXLVi-ll7>oHd6o0e0e zm&hqmk@@Koo;PsO&mKNB{WBaa_roGSUI)H!HT?4bo8JfGVZ{>K)kpsE)wa)g6>;h- z!Dq)J-JbBB9r9H4l6fk}`~kkd4&x%sPrr(pH^D_B4Xa&~sWR=i#C`KDs?=PD9cL>6{?%64PwswYXa#In^f*V?qUN zs*eu@(8ueIa9z09KFY^xWJ?K9PF@dF)_H-;&G$(K61tx8v$6F#`45+v^P|rI>p3$u z>nEM|oHW`yP9!SmY9disn@E&!=yUTzT778#zcZVNnafMfCz^Qpv#&2Tqew6$`xesa z4**V^q|u*~q(6-G7c=@D@SPpk5avSk*- zGK-yZ5&Av6-&}S@5=H!3v6J0N)uPSh=}{!P4m-TTJbh_I+d-@)kCa|+2Rof3n)1rK zX2aFC+2E0n&a9Dcw#~V+$J8-dRZ_*JSaOyfts8EusF>Y0shuqxJ7|2#A*J9qUZ-&; zl;lhay8)FPjVWHx{yn11K?Hu}g0gqz;*F&k|#po0RDzp~YPMpv!PC@`jQs}pK=zSeV4vO#U z9%TJrL7dBAkARJCP2PMd5Wy%vOEv3G$JlY!GXb zYQaf6+Rb@?!eAxT{+)*_Jpst>q5(_#KXM)Uf0u5SQFD2`e(m1M8Em_JKTbDxon15( zDgX%bBEoe~GxeTMcMv=EEH>*_O49B#f|HsKsYW&VixclXoUPhpL ziB%lJ>Dhc8yVyLvQq<{Pt^}()gE1uphu8<&t9vRr=V8gYfYfP$av_Eeb5W^9ltQV~ zn#;5Sy=dNY5g7isV0D?A@4VhMn$xltJQ?1kf05i(C7bor{T4Pi3HB1JV)|Y@IVn3e zISDt*Y5~GAy8e?VD1q-FUUG_3yGsKS+RQ^Xb2SG&iqy=*v~h0I?t@KBNuDL zGAN7d7fOoGzyfx0Q!yL7TPi6fWi|iS26Zv(p`iGZTlP*pcb4mEGZ(ln_fIcfENZOp zpBPrNxex&|Ps0gTa6PW+@+MZ*MJuk;-!)c2qK=F?Ln zMyOcJQb#9f6{+{r*dM?7LOjYbpka#6Knh4XsU(|8Jb<25E*}kD9OaV-tudts>~AcZ zh)4m9m_!`O8<8quAU@3RJnG=FTTIpT3QMkM^;StiSJ>koR>NE_b*8)eQZrwk9S-ej_WzMgEZ)w|UdvN8V z=Ei-A1&3>I`Dpr+w~YMq=6MTlzInmCn}tW{f%!A1tfl{I2J^do{@j)7x9?XBV4>NS zbKf1Y@#IbSKl|+c4;(o%r1{Rfh^W;C@LGo=oNS(68G!9w{+N=ZOSQl7GJzJa-2tNR zgl%?4u-u^~i@lMbZ1})HKXoHZc%cImdpk?*<-6jRoN&!$?+YPzsX{vy8@ybHv4c9g zwvHDi*IitApsVPrj)^*TyTnEoS1DunY!_pxHgA5j2W^OfId!XBB$8@j73$O+l4L}M z)kb}<+r#F!xIug1AS+C_n4>L5QNrt#_iq082Ir6ez5b~7_p3w)J)qyf z?^ExHC?;KU(5f~OBW}O~cVe(6?^ADbX!mn)J8^Emw_O-ksWp=t47R>w$JCCVAbv${ zn-<2_OcLt*4jOwSuH{ZKL@`FnuBDG)>k_+`cuMQZiHkU@frzH$wXAy9`OCJX($IeY zSEv3?yi%VrBWuStULfL~sp~9JzuCmDrM^gCp|StXwfvX8*8AF}#;jSQe!Yq5WZ)sl zF7gng3^=elFNTa{+2(?-d5Jy2*fs9wANVEwz>kf<;Utq4!ppKdv$@DwbQ!+W{gl*9 zo?vkF89SY{rpQE21jsnqOG;;{n?9_y?Xm{J;}P(vFN& z9C2rbJ2c0Wm-MIRyE$sQ6f(foXN&yZLm zo9F0h6gg#xCA|E#DJr`niVdRxWh@-gJ&LzgjAyZtG+Eeuq034RPLhpLS?6R0Isn)5 z*q`L(g6Lt~DodwjT>+D%jEFWnxXAF3Wfpbx66v$rm2n!f4YQ^(Z*DWz{-XZDnJ zcU@=tj2b77Tz~E3_ucF)EcdV7{_y(dm(;(*c{2#DdY677$W@ShOmKvjNs2K$ZA8nQ z5shlkaiTDB@Vl>Nv!?#!K%A~_z=q;x>M)N98+Rpck#qP!;#az#&F2G#Go7;km}1TQ zPPQF8+V52IZM#!;98-Mx-^t!%cM{@iKx9=h!GIgl?roM*+eXy+@Wkc7|Ad*D?y;Jwl8ekr+ti+5|Y z4DvZE3upM$HI>Znb|p7bETW#b0t%Xo4mXvvdjCf&Ecgj1D4Zff{)u_<*-H;;MZ<5bE$=PxaCC0 zh0bC(pvZ}hXj*d7Qrq5czaz!}2WX7MeE+GAj3U|?Y6vemXJ=ZxpK`N|;A!2km1 zY~52~^#4Ww7}$;3g%}taI2f2fq5uMH31R?v+GAj3U|`?!mzjZqgW><8|3}!38Gs@v z-~|AOf(A@@+HI3hNK{c6#m{{AzGp;8v~r{tEh0k(8C(p*5TT74WG;q5h8kjshs10w zt)Rak(qfQS(O6(14Z#r6B1ED^xR^z>5(+}v6%kPp^p9+i*ZHn*z{JImbKm{Xa-Y&b}PE zO|m3O_CA(+yh$A(JIESJ-Vo}NLEU^sLg$z@ z)V*&cO-^$Dg43dHaQ-NUZ2`Srif1_-{`O1QYmXsrn&D4-6eB#xQ`X!~9pV4aTCn~g zw%_)kY^PB*Pgv_T3bq}2sUT&$c(x0uN(U}WXL#Qx*zQKve~zlXL;^RzYOkOmO|G9n zQr_c$oxqIwg}B#5(yU;Qw#^K^n?=8D$71yV{+9P_UnQqWkNT%`oNodCdaLw%8Cg?X z_fEa%UTLjcUO4XuWffU+h<$VR8tZw9ochi0i|nt<52Uz$+%J;5%S9omtFLKavk#7t*a9Hp99CYC*Huh|6LbkL+vKslIQ4KZLT&qWyoE1IT&l z2tScmw#+-(%3(8l$5ffcMl=hTHPv51$*&>rY6@aI)o)V)+I9ggl@oj;4U$*~@2F*J zz%hLX5#|j>{W140CP_u%o0=r56}iK^zKF-VR{EG}AI5cG)|ucP_swUv8@zK1Nc{ub ze%9@H+GAi~(1F4VhEn8TRMnCCDbV*bTq!&1P~$Fhs%3#%P#4eKQ~6Sfw% z59}%I6F4L|dN@vSa&RheI&nsE9^tCtI>xQVUB}&kUXmJnwiFc*A&Wc(3tk z@Ky2c;aB0W;Qu6`BoHMqL(o95NN|ndEg>Eu7ojSlDMD+6&IvmSFB5(z5+$-rltc7{ zn1Gm{*c`D7;!NUM;@c!RByuFKNQy~LkbEa)BUL3GAw5m{mJEkXgUlRR0a+g)oF@B4 zu0-yge3*QVf}BE(!av0v#XiLyir18ilqM+MQr1$gP=2Jsq!OXhqq0rqg{q8difV_N znA$S+4E1Xo8X8p^7c?U@Z)xRd9nm(@uF~G8!=uxpvqtBNE|YGQ?mj&qy=D4L`bqk4 z3MV&rEu!RVH8ober#7?UTaU1nxxugrVQzgfgt9J4gByk_~&O2aC` zYJ;_k^#bdEHgPt`Y=dlX*(umfvHM`}W52<{$f3#Mo@0jN38yHhD^CBM&2T^$=OE_< z=L+Wu&c~epxEQ%iaCztI<67l<1_(d6i2>mU4i8?f2Es_x~vE57hhnf0y=O)Q9{3l=ffM;r_o=Q_WSbBH|}eL$qpYs`@HbYw8=} zzE4jQl~JoleJOe(wNSCTqPw{os|&iH(u_HcT&X9jL3li;>sLhoSbd>d)beQ>icIgI zM33inG4oA%sTH{S8q#GnBBhzNfV&>eHa&;vnbD}6*3x6I?X!mZ6i*jK@io!YVv>oG z1lNE@G4~FmJ~++^Q7wU!Py3vfHvt-&gEiLVRSb`PlBP}nyRefapxh29XsuPnh$of& zg{vE$MzF(J_|fRjspkf?84;(QIsH%3x~3~el)9qdD6pO(IBu%1(9X&JY6V-&XjP5m z686ym_jCHMk)P7@F3oRS2@bxOKfSWkM316*2Xb|h7quqN$cJ@rpME##p+=OnFaHvA zBSLFMI@eZlD?WZm@%j6eQeQpt(H80KobpziTE=oXr>3HN|5#` z!RG277i)UTQ6u+cb8|=Fn(4A`BYHZK84i^pjWm%VrdAgdprCPLG+)~&c!O9lf|nZkH2*r%-ir5YL}sF?aS#I* zmJ>g+E-^NzHrxLUe(lEt7fFk8lWph(J~o6Fb>zuBEtDgs&o|@4T(4zBT`X%&?b!A# zXr#WM*hpvOVmVnaD^xdYn;#6ybD%SnD4If-=AJpd^{hLA#5KgqxkS}lJ8}U&=Rh$- zCL9zjj%^@DMw^QqX2k@QIAg?!!p_=_wt4;tqYXM&l4<4^5zWaJ?#8xn8x~=9bh7zz zpSjCQ*)O!dSVYP))>{*fUd0=Ya`hZ zad9rTn+Eom(%iMji;Iy)`pjBwUV(e+RXj1;)f#Z|;+V413FX`lT?4wh$h`W=!!4E9 zLqTIA@yAGFc+#@FTrxo&!YGtA>U(jmvVK1muh46KO!FS?jJ~nMk*v8A+)WK^d@z%Y zrDM3UkvNFqe%y$}8(p34B&qe8^? zrPucp+5bDOj4HH}*(%@2z`F7I@5+oAT+B=L++B8Lst~R(Or5}1wQXO(HNX-hA}=as zK)yN>-^UJpS|{5_Sra$);(*!v9i>qyYL0e;3W z%X{gi@RE9(tI4TV+15iZ+l*Di+sU*j8l6*y=wtuZ#lCGHo}$~wrTozYM+>+zYX*pV${an#bCK8QPRHuwATi953 zS}8K`3u`q`kgGeWM*JG>ZXZp=#>0pcO9Y5zO|E^{;v-dYsBWWKIRfztcg5{YG#KvX z!aWG{rS&!OeC8>nzyG?s>#oROd0+D1*@M*Y*o8#cz0U&gGck!h)ZdlzS;O_lii0cY zSZXe}o3F0^T&f5NPigH=!0J>w#;t2hn>=yjWZ-$Ca&p43Eee9j( z&7{X<4L{d943>iE60(~UoP{9C8KjE(0{Nf&ayiY2VUuI5X0&P6GZL6=%J#`8Xnw`M zd4HY?vf(-*&RproQg>ft;J7cizV@ZM0=w+*PH9dl{y|{vX!Ui9L&1iX2fzHO>~f z@T|n3li0TxY#mE`?vQM#IgGabz36iwYxd_!0r613yY3UyAmjK|Ts7TocEcxloRhL-v5QR^m;EA^ z(~#R8&olh$(5)0&;-(evIyd|OKPTH|mou=toDNyA+0Sf$-*<&-Ikjgj3EsTSJzZVX z(^$^-CmVOs#p*M{vK)s@o7kGAt z?;iB~sxHNuGn@+^Q;**H_T~9QSl}z{^iFBqC1^2?3;NZxzmazjHQejFFM;MU=C;(Y z<(*g`RJ+u!f!7}1{Iz79o}uNqgiIavlKQ@o^*S`myeT{fFU;wH`rWD_S7%t!aK^|S zkqrE_Nwm*EPxD^~Qo7x-e4YrWO<<%c5AdGy5?EiL_mckiXdJ({Y(i${wgVYX=sC;M z0tc)K=I99TLchU?m&DfqT=ZarJhBc6FYpzNp08K^61~h>SG0VAI>u0G2$sx;#{X-( zav$=y@s`L~NSTisG~LFk7tlgWuy4vcO&=Y`-dSKBUvxCV?@OzLBEN=OsDmmSFe|)- z6fNM<#^^pyD2_m>ZRhKm7w8{&G}*dY^KB2qBRRcjsjq0&mRL>`2!&FxA87ua6pV9I zevfSQ@O9h~9UfVYc413pR9?a3S{T)YKKd4g6L{&laDM68ku>4im3Gyaa zFH?L;@C?tM5qJ8Ff)`YyerCTSdiHOmwyr#Q+HKHRaLjQK!13=Um%HTBd)Gzh|Nmbu zMZc3fJ$kPp$=wl2TpXf>k?0I##v3Ey1*6wt@PN_VD1!&j`gp)A7yq9(`|_FHncdl4 zBKRA>eN^+m_y7_ikwju43M)3EiNQ`Ram15AB1t5ZLMmyblR+j~WRpWKdF0c9j&!0k zUFb?Tx>G<8deV#D^r0{P=+6K&bPOC6;-rXTN+@L@gBZ*ZhBA!dxNtLqGCX)0$tXrM zhOvxeJmpMaB9oZR6s9tb>C9jzvzW~s<}#1@EMOrOV&MqQv~ZmR;fuDghn*bc7)K?F z9lT>R`^73Yc1twdxW#*k;Sk69$q#(~X9)q8vWyyPIZPePsV7JSAy%-GReWMKYiMLG>siMYT4`bf z8`;DczHyZ^oaGvCcq?{^l{kr)1WA-6NtP5zl{87049Vmi=efjXZgYW)++iyxB#Rr| zlx)dim*h&G zqWm|{WvZ*Wx^Axy_(H*|%8CZRSu(t)POrri3f8qJ9<_(pZSE1)_ydk5nhF4T+BMES z4uU`s1>jv4mVa3j5-SbH&hY>qz@?!fRBYloY_+k}#G4FO#?F)BM2GHuFRyqnIbKoT zM1xV=4^rOUP;2PdXk3G3N8#d@sNvWPRFy>q2lOlZR0|J&2nhZJO$Z*0kf1w8Lk0a6#1 + + Slice 1 + Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search_dark.svg b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search_dark.svg new file mode 100644 index 0000000..cbfae91 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search_dark.svg @@ -0,0 +1,16 @@ + + + + + + +]> + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/js/prism.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/js/prism.js new file mode 100644 index 0000000..8f1a555 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/js/prism.js @@ -0,0 +1,9 @@ +/** + * Prism: Lightweight, robust, elegant syntax highlighting + * MIT license http://www.opensource.org/licenses/mit-license.php/ + * @author Lea Verou http://lea.verou.me + */(function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={util:{type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},clone:function(e){var n=t.util.type(e);switch(n){case"Object":var r={};for(var i in e)e.hasOwnProperty(i)&&(r[i]=t.util.clone(e[i]));return r;case"Array":return e.slice()}return e}},languages:{extend:function(e,n){var r=t.util.clone(t.languages[e]);for(var i in n)r[i]=n[i];return r},insertBefore:function(e,n,r,i){i=i||t.languages;var s=i[e],o={};for(var u in s)if(s.hasOwnProperty(u)){if(u==n)for(var a in r)r.hasOwnProperty(a)&&(o[a]=r[a]);o[u]=s[u]}return i[e]=o},DFS:function(e,n){for(var r in e){n.call(e,r,e[r]);t.util.type(e)==="Object"&&t.languages.DFS(e[r],n)}}},highlightAll:function(e,n){var r=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');for(var i=0,s;s=r[i++];)t.highlightElement(s,e===!0,n)},highlightElement:function(r,i,s){var o,u,a=r;while(a&&!e.test(a.className))a=a.parentNode;if(a){o=(a.className.match(e)||[,""])[1];u=t.languages[o]}if(!u)return;r.className=r.className.replace(e,"").replace(/\s+/g," ")+" language-"+o;a=r.parentNode;/pre/i.test(a.nodeName)&&(a.className=a.className.replace(e,"").replace(/\s+/g," ")+" language-"+o);var f=r.textContent;if(!f)return;f=f.replace(/&/g,"&").replace(/e.length)break e;if(p instanceof i)continue;a.lastIndex=0;var d=a.exec(p);if(d){l&&(c=d[1].length);var v=d.index-1+c,d=d[0].slice(c),m=d.length,g=v+m,y=p.slice(0,v+1),b=p.slice(g+1),w=[h,1];y&&w.push(y);var E=new i(u,f?t.tokenize(d,f):d);w.push(E);b&&w.push(b);Array.prototype.splice.apply(s,w)}}}return s},hooks:{all:{},add:function(e,n){var r=t.hooks.all;r[e]=r[e]||[];r[e].push(n)},run:function(e,n){var r=t.hooks.all[e];if(!r||!r.length)return;for(var i=0,s;s=r[i++];)s(n)}}},n=t.Token=function(e,t){this.type=e;this.content=t};n.stringify=function(e,r,i){if(typeof e=="string")return e;if(Object.prototype.toString.call(e)=="[object Array]")return e.map(function(t){return n.stringify(t,r,e)}).join("");var s={type:e.type,content:n.stringify(e.content,r,i),tag:"span",classes:["token",e.type],attributes:{},language:r,parent:i};s.type=="comment"&&(s.attributes.spellcheck="true");t.hooks.run("wrap",s);var o="";for(var u in s.attributes)o+=u+'="'+(s.attributes[u]||"")+'"';return"<"+s.tag+' class="'+s.classes.join(" ")+'" '+o+">"+s.content+""};if(!self.document){self.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language,i=n.code;self.postMessage(JSON.stringify(t.tokenize(i,t.languages[r])));self.close()},!1);return}var r=document.getElementsByTagName("script");r=r[r.length-1];if(r){t.filename=r.src;document.addEventListener&&!r.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)}})();; +Prism.languages.clike={comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|(^|[^:])\/\/.*?(\r?\n|$))/g,lookbehind:!0},string:/("|')(\\?.)*?\1/g,"class-name":{pattern:/((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/ig,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/g,"boolean":/\b(true|false)\b/g,"function":{pattern:/[a-z0-9_]+\(/ig,inside:{punctuation:/\(/}}, number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/g,operator:/[-+]{1,2}|!|<=?|>=?|={1,3}|(&){1,2}|\|?\||\?|\*|\/|\~|\^|\%/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g}; +; +Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(var|let|if|else|while|do|for|return|in|instanceof|function|new|with|typeof|try|throw|catch|finally|null|break|continue)\b/g,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?|NaN|-?Infinity)\b/g});Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0}});Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/(<|<)script[\w\W]*?(>|>)[\w\W]*?(<|<)\/script(>|>)/ig,inside:{tag:{pattern:/(<|<)script[\w\W]*?(>|>)|(<|<)\/script(>|>)/ig,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript}}}); +; \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/reference.html b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/reference.html new file mode 100644 index 0000000..eed4bdd --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/reference.html @@ -0,0 +1,14816 @@ + + + + + + + Snap.svg API Reference + + + + + + + + + + + + +

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

    Snap(…)

    +
    +
    +
    +
    + + + + +

    Creates a drawing surface or wraps existing SVG element. +

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

    Parameters

    +
      +
    1. width + number string + width of surface
    2. +
    3. height + number string + height of surface
    4. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. DOM + SVGElement + element to be wrapped into Snap structure
    2. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. array + array + array of elements (will return set of elements)
    2. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. query + string + CSS query selector
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.format(token, json)

    +
    +
    +
    +
    + + + + +

    Replaces construction of type {<name>} to the corresponding argument +

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

    Parameters

    +
      +
    1. token + string + string to format
    2. +
    3. json + object + object which properties are used as a replacement
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + formatted string +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    // this draws a rectangular shape equivalent to "M10,20h40v50h-40z"
    +paper.path(Snap.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z", {
    +    x: 10,
    +    y: 20,
    +    dim: {
    +        width: 40,
    +        height: 50,
    +        "negative width": -40
    +    }
    +}));
    + + + + + +
    +
    +
    + +
    +
    +

    Snap.rad(deg)

    +
    +
    +
    +
    + + + + +

    Transform angle to radians +

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

    Parameters

    +
      +
    1. deg + number + angle in degrees
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + angle in radians +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.deg(rad)

    +
    +
    +
    +
    + + + + +

    Transform angle to degrees +

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

    Parameters

    +
      +
    1. rad + number + angle in radians
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + angle in degrees +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.sin(angle)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.sin() only works with degrees, not radians. +

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

    Parameters

    +
      +
    1. angle + number + angle in degrees
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + sin +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.tan(angle)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.tan() only works with degrees, not radians. +

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

    Parameters

    +
      +
    1. angle + number + angle in degrees
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + tan +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.cos(angle)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.cos() only works with degrees, not radians. +

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

    Parameters

    +
      +
    1. angle + number + angle in degrees
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + cos +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.asin(num)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.asin() only works with degrees, not radians. +

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

    Parameters

    +
      +
    1. num + number + value
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + asin in degrees +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.acos(num)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.acos() only works with degrees, not radians. +

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

    Parameters

    +
      +
    1. num + number + value
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + acos in degrees +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.atan(num)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.atan() only works with degrees, not radians. +

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

    Parameters

    +
      +
    1. num + number + value
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + atan in degrees +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.atan2(num)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.atan2() only works with degrees, not radians. +

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

    Parameters

    +
      +
    1. num + number + value
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + atan2 in degrees +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.angle(x1, y1, x2, y2, [x3], [y3])

    +
    +
    +
    +
    + + + + +

    Returns an angle between two or three points +

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

    Parameters

    + + + + + + + + +
    +

    Parameters

    +
      +
    1. x1 + number + x coord of first point
    2. +
    3. y1 + number + y coord of first point
    4. +
    5. x2 + number + x coord of second point
    6. +
    7. y2 + number + y coord of second point
    8. +
    9. x3 + number + x coord of third point
    10. +
    11. y3 + number + y coord of third point
    12. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + angle in degrees +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.len(x1, y1, x2, y2)

    +
    +
    +
    +
    + + + + +

    Returns distance between two points +

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

    Parameters

    + + + + + + + + +
    +

    Parameters

    +
      +
    1. x1 + number + x coord of first point
    2. +
    3. y1 + number + y coord of first point
    4. +
    5. x2 + number + x coord of second point
    6. +
    7. y2 + number + y coord of second point
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + distance +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.len2(x1, y1, x2, y2)

    +
    +
    +
    +
    + + + + +

    Returns squared distance between two points +

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

    Parameters

    + + + + + + + + +
    +

    Parameters

    +
      +
    1. x1 + number + x coord of first point
    2. +
    3. y1 + number + y coord of first point
    4. +
    5. x2 + number + x coord of second point
    6. +
    7. y2 + number + y coord of second point
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + distance +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.closestPoint(path, x, y)

    +
    +
    +
    +
    + + + + +

    Returns closest point to a given one on a given path. +

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

    Parameters

    + + + + + + + + +
    +

    Parameters

    +
      +
    1. path + Element + path element
    2. +
    3. x + number + x coord of a point
    4. +
    5. y + number + y coord of a point
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + in format +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.is(o, type)

    +
    +
    +
    +
    + + + + +

    Handy replacement for the typeof operator +

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

    Parameters

    +
      +
    1. o + … + any object or primitive
    2. +
    3. type + string + name of the type, e.g., string, function, number, etc.
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + boolean + + true if given value is of given type +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.snapTo(values, value, [tolerance])

    +
    +
    +
    +
    + + + + +

    Snaps given value to given grid +

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

    Parameters

    +
      +
    1. values + array number + given array of values or step of the grid
    2. +
    3. value + number + value to adjust
    4. +
    5. tolerance + number + maximum distance to the target value that would trigger the snap. Default is 10.
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + adjusted value +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.getRGB(color)

    +
    +
    +
    +
    + + + + +

    Parses color string as RGB object +

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

    Parameters

    +
      +
    1. color + string + color string in one of the following formats:
    2. + +
    +
    + + + + + + + + + + +
      + + + + + + + + + + + +
    • Color name (red, green, cornflowerblue, etc)
    • + + + + + + + + + + + +
    • #••• — shortened HTML color: (#000, #fc0, etc.)
    • + + + + + + + + + + + +
    • #•••••• — full length HTML color: (#000000, #bd2300)
    • + + + + + + + + + + + +
    • rgb(•••, •••, •••) — red, green and blue channels values: (rgb(200, 100, 0))
    • + + + + + + + + + + + +
    • rgba(•••, •••, •••, •••) — also with opacity
    • + + + + + + + + + + + +
    • rgb(•••%, •••%, •••%) — same as above, but in %: (rgb(100%, 175%, 0%))
    • + + + + + + + + + + + +
    • rgba(•••%, •••%, •••%, •••%) — also with opacity
    • + + + + + + + + + + + +
    • hsb(•••, •••, •••) — hue, saturation and brightness values: (hsb(0.5, 0.25, 1))
    • + + + + + + + + + + + +
    • hsba(•••, •••, •••, •••) — also with opacity
    • + + + + + + + + + + + +
    • hsb(•••%, •••%, •••%) — same as above, but in %
    • + + + + + + + + + + + +
    • hsba(•••%, •••%, •••%, •••%) — also with opacity
    • + + + + + + + + + + + +
    • hsl(•••, •••, •••) — hue, saturation and luminosity values: (hsb(0.5, 0.25, 0.5))
    • + + + + + + + + + + + +
    • hsla(•••, •••, •••, •••) — also with opacity
    • + + + + + + + + + + + +
    • hsl(•••%, •••%, •••%) — same as above, but in %
    • + + + + + + + + + + + +
    • hsla(•••%, •••%, •••%, •••%) — also with opacity
    • + + + + + + + + + + + +
    + + + + + + + + + +

    Note that % can be used any time: rgb(20%, 255, 50%). +

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

    + Returns: + + object + + RGB object in the following format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + r + number + red, +
      2. + + + +
      3. + g + number + green, +
      4. + + + +
      5. + b + number + blue, +
      6. + + + +
      7. + hex + string + color in HTML/CSS format: #••••••, +
      8. + + + +
      9. + error + boolean + true if string can't be parsed +
      10. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.hsb(h, s, b)

    +
    +
    +
    +
    + + + + +

    Converts HSB values to a hex representation of the color +

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

    Parameters

    +
      +
    1. h + number + hue
    2. +
    3. s + number + saturation
    4. +
    5. b + number + value or brightness
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + hex representation of the color +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.hsl(h, s, l)

    +
    +
    +
    +
    + + + + +

    Converts HSL values to a hex representation of the color +

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

    Parameters

    +
      +
    1. h + number + hue
    2. +
    3. s + number + saturation
    4. +
    5. l + number + luminosity
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + hex representation of the color +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.rgb(r, g, b)

    +
    +
    +
    +
    + + + + +

    Converts RGB values to a hex representation of the color +

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

    Parameters

    +
      +
    1. r + number + red
    2. +
    3. g + number + green
    4. +
    5. b + number + blue
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + hex representation of the color +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.color(clr)

    +
    +
    +
    +
    + + + + +

    Parses the color string and returns an object featuring the color's component values +

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

    Parameters

    +
      +
    1. clr + string + color string in one of the supported formats (see Snap.getRGB)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Combined RGB/HSB object in the following format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + r + number + red, +
      2. + + + +
      3. + g + number + green, +
      4. + + + +
      5. + b + number + blue, +
      6. + + + +
      7. + hex + string + color in HTML/CSS format: #••••••, +
      8. + + + +
      9. + error + boolean + true if string can't be parsed, +
      10. + + + +
      11. + h + number + hue, +
      12. + + + +
      13. + s + number + saturation, +
      14. + + + +
      15. + v + number + value (brightness), +
      16. + + + +
      17. + l + number + lightness +
      18. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.hsb2rgb(h, s, v)

    +
    +
    +
    +
    + + + + +

    Converts HSB values to an RGB object +

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

    Parameters

    +
      +
    1. h + number + hue
    2. +
    3. s + number + saturation
    4. +
    5. v + number + value or brightness
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + RGB object in the following format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + r + number + red, +
      2. + + + +
      3. + g + number + green, +
      4. + + + +
      5. + b + number + blue, +
      6. + + + +
      7. + hex + string + color in HTML/CSS format: #•••••• +
      8. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.hsl2rgb(h, s, l)

    +
    +
    +
    +
    + + + + +

    Converts HSL values to an RGB object +

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

    Parameters

    +
      +
    1. h + number + hue
    2. +
    3. s + number + saturation
    4. +
    5. l + number + luminosity
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + RGB object in the following format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + r + number + red, +
      2. + + + +
      3. + g + number + green, +
      4. + + + +
      5. + b + number + blue, +
      6. + + + +
      7. + hex + string + color in HTML/CSS format: #•••••• +
      8. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.rgb2hsb(r, g, b)

    +
    +
    +
    +
    + + + + +

    Converts RGB values to an HSB object +

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

    Parameters

    +
      +
    1. r + number + red
    2. +
    3. g + number + green
    4. +
    5. b + number + blue
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + HSB object in the following format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + h + number + hue, +
      2. + + + +
      3. + s + number + saturation, +
      4. + + + +
      5. + b + number + brightness +
      6. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.rgb2hsl(r, g, b)

    +
    +
    +
    +
    + + + + +

    Converts RGB values to an HSL object +

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

    Parameters

    +
      +
    1. r + number + red
    2. +
    3. g + number + green
    4. +
    5. b + number + blue
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + HSL object in the following format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + h + number + hue, +
      2. + + + +
      3. + s + number + saturation, +
      4. + + + +
      5. + l + number + luminosity +
      6. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.parsePathString(pathString)

    +
    +
    +
    +
    + + + + +

    Utility method +Parses given path string into an array of arrays of path segments +

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

    Parameters

    +
      +
    1. pathString + string array + path string or array of segments (in the last case it is returned straight away)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + array + + array of segments +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.parseTransformString(TString)

    +
    +
    +
    +
    + + + + +

    Utility method +Parses given transform string into an array of transformations +

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

    Parameters

    +
      +
    1. TString + string array + transform string or array of transformations (in the last case it is returned straight away)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + array + + array of transformations +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.select(query)

    +
    +
    +
    +
    + + + + +

    Wraps a DOM element specified by CSS selector as Element +

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

    Parameters

    +
      +
    1. query + string + CSS selector of the element
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.selectAll(query)

    +
    +
    +
    +
    + + + + +

    Wraps DOM elements specified by CSS selector as set or array of Element +

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

    Parameters

    +
      +
    1. query + string + CSS selector of the element
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.node()

    +
    +
    +
    +
    + + + + +

    Gives you a reference to the DOM object, so you can assign event handlers or just mess around. +

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

    Usage

    + + + + + + + + + + + +
    // draw a circle at coordinate 10,10 with radius of 10
    +var c = paper.circle(10, 10, 10);
    +c.node.onclick = function () {
    +    c.attr("fill", "red");
    +};
    + + + + + +
    +
    +
    + +
    +
    +

    Element.type()

    +
    +
    +
    +
    + + + + +

    SVG tag name of the given element. +

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

    Element.attr(…)

    +
    +
    +
    +
    + + + + +

    Gets or sets given attributes of the element. +

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

    Parameters

    +
      +
    1. params + object + contains key-value pairs of attributes you want to set
    2. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. param + string + name of the attribute
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + + +

    or +

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

    + Returns: + + string + + value of attribute +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    el.attr({
    +    fill: "#fc0",
    +    stroke: "#000",
    +    strokeWidth: 2, // CamelCase...
    +    "fill-opacity": 0.5, // or dash-separated names
    +    width: "*=2" // prefixed values
    +});
    +console.log(el.attr("fill")); // #fc0
    + + + + + + +

    Prefixed values in format "+=10" supported. All four operations +(+, -, * and /) could be used. Optionally you can use units for + +and -: "+=2em". +

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

    Snap.parse(svg)

    +
    +
    +
    +
    + + + + +

    Parses SVG fragment and converts it into a Fragment +

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

    Parameters

    +
      +
    1. svg + string + SVG string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Fragment + + the Fragment +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.fragment(varargs)

    +
    +
    +
    +
    + + + + +

    Creates a DOM fragment from a given list of elements or strings +

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

    Parameters

    +
      +
    1. varargs + … + SVG string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Fragment + + the Fragment +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.el(name, attr)

    +
    +
    +
    +
    + + + + +

    Creates an element on paper with a given name and no attributes +

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

    Parameters

    +
      +
    1. name + string + tag name
    2. +
    3. attr + object + attributes
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var c = paper.circle(10, 10, 10); // is the same as...
    +var c = paper.el("circle").attr({
    +    cx: 10,
    +    cy: 10,
    +    r: 10
    +});
    +// and the same as
    +var c = paper.el("circle", {
    +    cx: 10,
    +    cy: 10,
    +    r: 10
    +});
    + + + + + +
    +
    +
    + +
    +
    +

    Element.children()

    +
    +
    +
    +
    + + + + +

    Returns array of all the children of the element. +

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

    + Returns: + + array + + array of Elements +

    + + + + +
    +
    +
    + +
    +
    +

    Element.toJSON()

    +
    +
    +
    +
    + + + + +

    Returns object representation of the given element and all its children. +

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

    + Returns: + + object + + in format +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + type + string + this.type, +
      2. + + + +
      3. + attr + object + attributes map, +
      4. + + + +
      5. + childNodes + array + optional array of children in the same format +
      6. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.ajax(…)

    +
    +
    +
    +
    + + + + +

    Simple implementation of Ajax +

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

    Parameters

    +
      +
    1. url + string + URL
    2. +
    3. postData + object string + data for post request
    4. +
    5. callback + function + callback
    6. +
    7. scope + object + scope of callback
    8. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. url + string + URL
    2. +
    3. callback + function + callback
    4. +
    5. scope + object + scope of callback
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + XMLHttpRequest + + the XMLHttpRequest object, just in case +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.load(url, callback, [scope])

    +
    +
    +
    +
    + + + + +

    Loads external SVG file as a Fragment (see Snap.ajax for more advanced AJAX) +

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

    Parameters

    +
      +
    1. url + string + URL
    2. +
    3. callback + function + callback
    4. +
    5. scope + object + scope of callback
    6. + +
    +
    + + + + + + + +
    +
    +
    + +
    +
    +

    Snap.getElementByPoint(x, y)

    +
    +
    +
    +
    + + + + +

    Returns you topmost element under given point. +

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

    + Returns: + + object + + Snap element object +

    + + + + + + +
    +

    Parameters

    +
      +
    1. x + number + x coordinate from the top left corner of the window
    2. +
    3. y + number + y coordinate from the top left corner of the window
    4. + +
    +
    + + + + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    Snap.getElementByPoint(mouseX, mouseY).attr({stroke: "#f00"});
    + + + + + +
    +
    +
    + +
    +
    +

    Snap.plugin(f)

    +
    +
    +
    +
    + + + + +

    Let you write plugins. You pass in a function with five arguments, like this: +

    + + + + + + + + + + + + + +
    Snap.plugin(function (Snap, Element, Paper, global, Fragment) {
    +    Snap.newmethod = function () {};
    +    Element.prototype.newmethod = function () {};
    +    Paper.prototype.newmethod = function () {};
    +});
    + + + + + + +

    Inside the function you have access to all main objects (and their +prototypes). This allow you to extend anything you want. +

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

    Parameters

    +
      +
    1. f + function + your plugin body
    2. + +
    +
    + + + + + + + +
    +
    +
    + +
    +
    +

    Element.getBBox()

    +
    +
    +
    +
    + + + + +

    Returns the bounding box descriptor for the given element +

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

    + Returns: + + object + + bounding box descriptor: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + cx: + number + x of the center, +
      2. + + + +
      3. + cy: + number + x of the center, +
      4. + + + +
      5. + h: + number + height, +
      6. + + + +
      7. + height: + number + height, +
      8. + + + +
      9. + path: + string + path command for the box, +
      10. + + + +
      11. + r0: + number + radius of a circle that fully encloses the box, +
      12. + + + +
      13. + r1: + number + radius of the smallest circle that can be enclosed, +
      14. + + + +
      15. + r2: + number + radius of the largest circle that can be enclosed, +
      16. + + + +
      17. + vb: + string + box as a viewbox command, +
      18. + + + +
      19. + w: + number + width, +
      20. + + + +
      21. + width: + number + width, +
      22. + + + +
      23. + x2: + number + x of the right side, +
      24. + + + +
      25. + x: + number + x of the left side, +
      26. + + + +
      27. + y2: + number + y of the bottom edge, +
      28. + + + +
      29. + y: + number + y of the top edge +
      30. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Element.transform(tstr)

    +
    +
    +
    +
    + + + + +

    Gets or sets transformation of the element +

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

    Parameters

    +
      +
    1. tstr + string + transform string in Snap or SVG format
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + + +

    or +

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

    + Returns: + + object + + transformation descriptor: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + string + string + transform string, +
      2. + + + +
      3. + globalMatrix + Matrix + matrix of all transformations applied to element or its parents, +
      4. + + + +
      5. + localMatrix + Matrix + matrix of transformations applied only to the element, +
      6. + + + +
      7. + diffMatrix + Matrix + matrix of difference between global and local transformations, +
      8. + + + +
      9. + global + string + global transformation as string, +
      10. + + + +
      11. + local + string + local transformation as string, +
      12. + + + +
      13. + toString + function + returns string property +
      14. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Element.parent()

    +
    +
    +
    +
    + + + + +

    Returns the element's parent +

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

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.append(el)

    +
    +
    +
    +
    + + + + +

    Appends the given element to current one +

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

    Parameters

    +
      +
    1. el + Element Set + element to append
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

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

    Element.appendTo(el)

    +
    +
    +
    +
    + + + + +

    Appends the current element to the given one +

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

    Parameters

    +
      +
    1. el + Element + parent element to append to
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the child element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.prepend(el)

    +
    +
    +
    +
    + + + + +

    Prepends the given element to the current one +

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

    Parameters

    +
      +
    1. el + Element + element to prepend
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.prependTo(el)

    +
    +
    +
    +
    + + + + +

    Prepends the current element to the given one +

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

    Parameters

    +
      +
    1. el + Element + parent element to prepend to
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the child element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.before(el)

    +
    +
    +
    +
    + + + + +

    Inserts given element before the current one +

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

    Parameters

    +
      +
    1. el + Element + element to insert
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.after(el)

    +
    +
    +
    +
    + + + + +

    Inserts given element after the current one +

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

    Parameters

    +
      +
    1. el + Element + element to insert
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.insertBefore(el)

    +
    +
    +
    +
    + + + + +

    Inserts the element after the given one +

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

    Parameters

    +
      +
    1. el + Element + element next to whom insert to
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.insertAfter(el)

    +
    +
    +
    +
    + + + + +

    Inserts the element after the given one +

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

    Parameters

    +
      +
    1. el + Element + element next to whom insert to
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.remove()

    +
    +
    +
    +
    + + + + +

    Removes element from the DOM +

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

    + Returns: + + Element + + the detached element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.select(query)

    +
    +
    +
    +
    + + + + +

    Gathers the nested Element matching the given set of CSS selectors +

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

    Parameters

    +
      +
    1. query + string + CSS selector
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + result of query selection +

    + + + + +
    +
    +
    + +
    +
    +

    Element.selectAll(query)

    +
    +
    +
    +
    + + + + +

    Gathers nested Element objects matching the given set of CSS selectors +

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

    Parameters

    +
      +
    1. query + string + CSS selector
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Set + + array + + result of query selection +

    + + + + +
    +
    +
    + +
    +
    +

    Element.asPX(attr, [value])

    +
    +
    +
    +
    + + + + +

    Returns given attribute of the element as a px value (not %, em, etc.) +

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

    Parameters

    +
      +
    1. attr + string + attribute name
    2. +
    3. value + string + attribute value
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + result of query selection +

    + + + + +
    +
    +
    + +
    +
    +

    Element.use()

    +
    +
    +
    +
    + + + + +

    Creates a <use> element linked to the current element +

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

    + Returns: + + Element + + the <use> element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.clone()

    +
    +
    +
    +
    + + + + +

    Creates a clone of the element and inserts it after the element +

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

    + Returns: + + Element + + the clone +

    + + + + +
    +
    +
    + +
    +
    +

    Element.toDefs()

    +
    +
    +
    +
    + + + + +

    Moves element to the shared <defs> area +

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

    + Returns: + + Element + + the element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.toPattern(x, y, width, height)

    +
    +
    +
    +
    + + + + +

    Creates a <pattern> element from the current element +To create a pattern you have to specify the pattern rect: +

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

    Parameters

    +
      +
    1. x + string number +
    2. +
    3. y + string number +
    4. +
    5. width + string number +
    6. +
    7. height + string number +
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the <pattern> element +

    + + + + + +

    You can use pattern later on as an argument for fill attribute: +

    + + + + + + + + + + + + + +
    var p = paper.path("M10-5-10,15M15,0,0,15M0-5-20,15").attr({
    +        fill: "none",
    +        stroke: "#bada55",
    +        strokeWidth: 5
    +    }).pattern(0, 0, 10, 10),
    +    c = paper.circle(200, 200, 100);
    +c.attr({
    +    fill: p
    +});
    + + + + + +
    +
    +
    + +
    +
    +

    Element.marker(x, y, width, height, refX, refY)

    +
    +
    +
    +
    + + + + +

    Creates a <marker> element from the current element +To create a marker you have to specify the bounding rect and reference point: +

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

    Parameters

    +
      +
    1. x + number +
    2. +
    3. y + number +
    4. +
    5. width + number +
    6. +
    7. height + number +
    8. +
    9. refX + number +
    10. +
    11. refY + number +
    12. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the <marker> element +

    + + + + + +

    You can specify the marker later as an argument for marker-start, marker-end, marker-mid, and marker attributes. The marker attribute places the marker at every point along the path, and marker-mid places them at every point except the start and end. +

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

    Snap.animation(attr, duration, [easing], [callback])

    +
    +
    +
    +
    + + + + +

    Creates an animation object +

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

    Parameters

    +
      +
    1. attr + object + attributes of final destination
    2. +
    3. duration + number + duration of the animation, in milliseconds
    4. +
    5. easing + function + one of easing functions of mina or custom one
    6. +
    7. callback + function + callback function that fires when animation ends
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + animation object +

    + + + + +
    +
    +
    + +
    +
    +

    Element.inAnim()

    +
    +
    +
    +
    + + + + +

    Returns a set of animations that may be able to manipulate the current element +

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

    + Returns: + + object + + in format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + anim + object + animation object, +
      2. + + + +
      3. + mina + object + mina object, +
      4. + + + +
      5. + curStatus + number + 0..1 — status of the animation: 0 — just started, 1 — just finished, +
      6. + + + +
      7. + status + function + gets or sets the status of the animation, +
      8. + + + +
      9. + stop + function + stops the animation +
      10. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.animate(from, to, setter, duration, [easing], [callback])

    +
    +
    +
    +
    + + + + +

    Runs generic animation of one number into another with a caring function +

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

    Parameters

    +
      +
    1. from + number array + number or array of numbers
    2. +
    3. to + number array + number or array of numbers
    4. +
    5. setter + function + caring function that accepts one number argument
    6. +
    7. duration + number + duration, in milliseconds
    8. +
    9. easing + function + easing function from mina or custom
    10. +
    11. callback + function + callback function to execute when animation ends
    12. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + animation object in mina format +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + id + string + animation id, consider it read-only, +
      2. + + + +
      3. + duration + function + gets or sets the duration of the animation, +
      4. + + + +
      5. + easing + function + easing, +
      6. + + + +
      7. + speed + function + gets or sets the speed of the animation, +
      8. + + + +
      9. + status + function + gets or sets the status of the animation, +
      10. + + + +
      11. + stop + function + stops the animation +
      12. + + + +
    2. }
    3. + + +
    + + + + + + + +
    var rect = Snap().rect(0, 0, 10, 10);
    +Snap.animate(0, 10, function (val) {
    +    rect.attr({
    +        x: val
    +    });
    +}, 1000);
    +// in given context is equivalent to
    +rect.animate({x: 10}, 1000);
    + + + + + +
    +
    +
    + +
    +
    +

    Element.stop()

    +
    +
    +
    +
    + + + + +

    Stops all the animations for the current element +

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

    + Returns: + + Element + + the current element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.animate(attrs, duration, [easing], [callback])

    +
    +
    +
    +
    + + + + +

    Animates the given attributes of the element +

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

    Parameters

    +
      +
    1. attrs + object + key-value pairs of destination attributes
    2. +
    3. duration + number + duration of the animation in milliseconds
    4. +
    5. easing + function + easing function from mina or custom
    6. +
    7. callback + function + callback function that executes when the animation ends
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.data(key, [value])

    +
    +
    +
    +
    + + + + +

    Adds or retrieves given value associated with given key. (Don’t confuse +with data- attributes) +

    See also Element.removeData +

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

    Parameters

    +
      +
    1. key + string + key to store data
    2. +
    3. value + any + value to store
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + + +

    or, if value is not specified: +

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

    + Returns: + + any + + value +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    for (var i = 0, i < 5, i++) {
    +    paper.circle(10 + 15 * i, 10, 10)
    +         .attr({fill: "#000"})
    +         .data("i", i)
    +         .click(function () {
    +            alert(this.data("i"));
    +         });
    +}
    + + + + + +
    +
    +
    + +
    +
    +

    Element.removeData([key])

    +
    +
    +
    +
    + + + + +

    Removes value associated with an element by given key. +If key is not provided, removes all the data of the element. +

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

    Parameters

    +
      +
    1. key + string + key
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.outerSVG()

    +
    +
    +
    +
    + + + + +

    Returns SVG code for the element, equivalent to HTML's outerHTML. +

    See also Element.innerSVG +

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

    + Returns: + + string + + SVG code for the element +

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

    Element.innerSVG()

    +
    +
    +
    +
    + + + + +

    Returns SVG code for the element's contents, equivalent to HTML's innerHTML +

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

    + Returns: + + string + + SVG code for the element +

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

    Matrix.add(…)

    +
    +
    +
    +
    + + + + +

    Adds the given matrix to existing one +

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

    Parameters

    +
      +
    1. a + number +
    2. +
    3. b + number +
    4. +
    5. c + number +
    6. +
    7. d + number +
    8. +
    9. e + number +
    10. +
    11. f + number +
    12. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. matrix + object + Matrix
    2. + +
    +
    + + + + + + + +
    +
    +
    + +
    +
    +

    Matrix.invert()

    +
    +
    +
    +
    + + + + +

    Returns an inverted version of the matrix +

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

    + Returns: + + object + + Matrix +

    + + + + +
    +
    +
    + +
    +
    +

    Matrix.clone()

    +
    +
    +
    +
    + + + + +

    Returns a copy of the matrix +

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

    + Returns: + + object + + Matrix +

    + + + + +
    +
    +
    + +
    +
    +

    Matrix.translate(x, y)

    +
    +
    +
    +
    + + + + +

    Translate the matrix +

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

    Parameters

    +
      +
    1. x + number + horizontal offset distance
    2. +
    3. y + number + vertical offset distance
    4. + +
    +
    + + + + + + + +
    +
    +
    + +
    +
    +

    Matrix.scale(x, [y], [cx], [cy])

    +
    +
    +
    +
    + + + + +

    Scales the matrix +

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

    Parameters

    +
      +
    1. x + number + amount to be scaled, with 1 resulting in no change
    2. +
    3. y + number + amount to scale along the vertical axis. (Otherwise x applies to both axes.)
    4. +
    5. cx + number + horizontal origin point from which to scale
    6. +
    7. cy + number + vertical origin point from which to scale
    8. + +
    +
    + + + + + + + + +

    Default cx, cy is the middle point of the element. +

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

    Matrix.rotate(a, x, y)

    +
    +
    +
    +
    + + + + +

    Rotates the matrix +

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

    Parameters

    +
      +
    1. a + number + angle of rotation, in degrees
    2. +
    3. x + number + horizontal origin point from which to rotate
    4. +
    5. y + number + vertical origin point from which to rotate
    6. + +
    +
    + + + + + + + +
    +
    +
    + +
    +
    +

    Matrix.x(x, y)

    +
    +
    +
    +
    + + + + +

    Returns x coordinate for given point after transformation described by the matrix. See also Matrix.y +

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

    Parameters

    +
      +
    1. x + number +
    2. +
    3. y + number +
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + x +

    + + + + +
    +
    +
    + +
    +
    +

    Matrix.y(x, y)

    +
    +
    +
    +
    + + + + +

    Returns y coordinate for given point after transformation described by the matrix. See also Matrix.x +

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

    Parameters

    +
      +
    1. x + number +
    2. +
    3. y + number +
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + y +

    + + + + +
    +
    +
    + +
    +
    +

    Matrix.determinant()

    +
    +
    +
    +
    + + + + +

    Finds determinant of the given matrix. +

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

    + Returns: + + number + + determinant +

    + + + + +
    +
    +
    + +
    +
    +

    Matrix.split()

    +
    +
    +
    +
    + + + + +

    Splits matrix into primitive transformations +

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

    + Returns: + + object + + in format: +

    + + + + + + + + + + + +
      + + +
    1. + dx + number + translation by x +
    2. + + + +
    3. + dy + number + translation by y +
    4. + + + +
    5. + scalex + number + scale by x +
    6. + + + +
    7. + scaley + number + scale by y +
    8. + + + +
    9. + shear + number + shear +
    10. + + + +
    11. + rotate + number + rotation in deg +
    12. + + + +
    13. + isSimple + boolean + could it be represented via simple transformations +
    14. + + +
    + + +
    +
    +
    + +
    +
    +

    Matrix.toTransformString()

    +
    +
    +
    +
    + + + + +

    Returns transform string that represents given matrix +

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

    + Returns: + + string + + transform string +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.Matrix()

    +
    +
    +
    +
    + + + + +

    Matrix constructor, extend on your own risk. +To create matrices use Snap.matrix. +

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

    Snap.matrix(…)

    +
    +
    +
    +
    + + + + +

    Utility method +Returns a matrix based on the given parameters +

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

    Parameters

    +
      +
    1. a + number +
    2. +
    3. b + number +
    4. +
    5. c + number +
    6. +
    7. d + number +
    8. +
    9. e + number +
    10. +
    11. f + number +
    12. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. svgMatrix + SVGMatrix +
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Matrix +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.rect(x, y, width, height, [rx], [ry])

    +
    +
    +
    +
    + + + + +

    Draws a rectangle +

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

    Parameters

    +
      +
    1. x + number + x coordinate of the top left corner
    2. +
    3. y + number + y coordinate of the top left corner
    4. +
    5. width + number + width
    6. +
    7. height + number + height
    8. +
    9. rx + number + horizontal radius for rounded corners, default is 0
    10. +
    11. ry + number + vertical radius for rounded corners, default is rx or 0
    12. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the rect element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    // regular rectangle
    +var c = paper.rect(10, 10, 50, 50);
    +// rectangle with rounded corners
    +var c = paper.rect(40, 40, 50, 50, 10);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.circle(x, y, r)

    +
    +
    +
    +
    + + + + +

    Draws a circle +

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

    Parameters

    +
      +
    1. x + number + x coordinate of the centre
    2. +
    3. y + number + y coordinate of the centre
    4. +
    5. r + number + radius
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the circle element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var c = paper.circle(50, 50, 40);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.image(src, x, y, width, height)

    +
    +
    +
    +
    + + + + +

    Places an image on the surface +

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

    Parameters

    +
      +
    1. src + string + URI of the source image
    2. +
    3. x + number + x offset position
    4. +
    5. y + number + y offset position
    6. +
    7. width + number + width of the image
    8. +
    9. height + number + height of the image
    10. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the image element +

    + + + + + +

    or +

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

    + Returns: + + object + + Snap element object with type image +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var c = paper.image("apple.png", 10, 10, 80, 80);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.ellipse(x, y, rx, ry)

    +
    +
    +
    +
    + + + + +

    Draws an ellipse +

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

    Parameters

    +
      +
    1. x + number + x coordinate of the centre
    2. +
    3. y + number + y coordinate of the centre
    4. +
    5. rx + number + horizontal radius
    6. +
    7. ry + number + vertical radius
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the ellipse element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var c = paper.ellipse(50, 50, 40, 20);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.path([pathString])

    +
    +
    +
    +
    + + + + +

    Creates a <path> element using the given string as the path's definition +

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

    Parameters

    +
      +
    1. pathString + string + path string in SVG format
    2. + +
    +
    + + + + + + + + +

    Path string consists of one-letter commands, followed by comma seprarated arguments in numerical form. Example: +

    + + + + + + + + + + + + + +
    "M10,20L30,40"
    + + + + + + +

    This example features two commands: M, with arguments (10, 20) and L with arguments (30, 40). Uppercase letter commands express coordinates in absolute terms, while lowercase commands express them in relative terms from the most recently declared coordinates. +

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

    Here is short list of commands available, for more details see SVG path string format or article about path strings at MDN.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandNameParameters
    Mmoveto(x y)+
    Zclosepath(none)
    Llineto(x y)+
    Hhorizontal linetox+
    Vvertical linetoy+
    Ccurveto(x1 y1 x2 y2 x y)+
    Ssmooth curveto(x2 y2 x y)+
    Qquadratic Bézier curveto(x1 y1 x y)+
    Tsmooth quadratic Bézier curveto(x y)+
    Aelliptical arc(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
    RCatmull-Rom curveto*x1 y1 (x y)+
    + + + + + + + + + +

  • Catmull-Rom curveto is a not standard SVG command and added to make life easier.
  • +Note: there is a special case when a path consists of only three commands: M10,10R…z. In this case the path connects back to its starting point. +

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

    Usage

    + + + + + + + + + + + +
    var c = paper.path("M10 10L90 90");
    +// draw a diagonal line:
    +// move to 10,10, line to 90,90
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.g([varargs])

    +
    +
    +
    +
    + + + + +

    Creates a group element +

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

    Parameters

    +
      +
    1. varargs + … + elements to nest within the group
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the g element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var c1 = paper.circle(),
    +    c2 = paper.rect(),
    +    g = paper.g(c2, c1); // note that the order of elements is different
    + + + + + + +

    or +

    + + + + + + + + + + + + + +
    var c1 = paper.circle(),
    +    c2 = paper.rect(),
    +    g = paper.g();
    +g.add(c2, c1);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.group()

    +
    +
    +
    +
    + + + + +

    See Paper.g +

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

    Paper.svg(x, y, width, height, vbx, vby, vbw, vbh)

    +
    +
    +
    +
    + + + + +

    Creates a nested SVG element. +

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

    Parameters

    +
      +
    1. x + number + optional X of the element
    2. +
    3. y + number + optional Y of the element
    4. +
    5. width + number + optional width of the element
    6. +
    7. height + number + optional height of the element
    8. +
    9. vbx + number + optional viewbox X
    10. +
    11. vby + number + optional viewbox Y
    12. +
    13. vbw + number + optional viewbox width
    14. +
    15. vbh + number + optional viewbox height
    16. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the svg element +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.mask()

    +
    +
    +
    +
    + + + + +

    Equivalent in behaviour to Paper.g, except it’s a mask. +

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

    + Returns: + + object + + the mask element +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.ptrn(x, y, width, height, vbx, vby, vbw, vbh)

    +
    +
    +
    +
    + + + + +

    Equivalent in behaviour to Paper.g, except it’s a pattern. +

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

    Parameters

    +
      +
    1. x + number + optional X of the element
    2. +
    3. y + number + optional Y of the element
    4. +
    5. width + number + optional width of the element
    6. +
    7. height + number + optional height of the element
    8. +
    9. vbx + number + optional viewbox X
    10. +
    11. vby + number + optional viewbox Y
    12. +
    13. vbw + number + optional viewbox width
    14. +
    15. vbh + number + optional viewbox height
    16. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the pattern element +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.use(…)

    +
    +
    +
    +
    + + + + +

    Creates a <use> element. +

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

    Parameters

    +
      +
    1. id + string + optional id of element to link
    2. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. id + Element + optional element to link
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the use element +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.symbol(vbx, vby, vbw, vbh)

    +
    +
    +
    +
    + + + + +

    Creates a <symbol> element. +

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

    Parameters

    +
      +
    1. vbx + number + optional viewbox X
    2. +
    3. vby + number + optional viewbox Y
    4. +
    5. vbw + number + optional viewbox width
    6. +
    7. vbh + number + optional viewbox height
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the symbol element +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.text(x, y, text)

    +
    +
    +
    +
    + + + + +

    Draws a text string +

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

    Parameters

    +
      +
    1. x + number + x coordinate position
    2. +
    3. y + number + y coordinate position
    4. +
    5. text + string array + The text string to draw or array of strings to nest within separate <tspan> elements
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the text element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var t1 = paper.text(50, 50, "Snap");
    +var t2 = paper.text(50, 50, ["S","n","a","p"]);
    +// Text path usage
    +t1.attr({textpath: "M10,10L100,100"});
    +// or
    +var pth = paper.path("M10,10L100,100");
    +t1.attr({textpath: pth});
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.line(x1, y1, x2, y2)

    +
    +
    +
    +
    + + + + +

    Draws a line +

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

    Parameters

    +
      +
    1. x1 + number + x coordinate position of the start
    2. +
    3. y1 + number + y coordinate position of the start
    4. +
    5. x2 + number + x coordinate position of the end
    6. +
    7. y2 + number + y coordinate position of the end
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the line element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var t1 = paper.line(50, 50, 100, 100);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.polyline(…)

    +
    +
    +
    +
    + + + + +

    Draws a polyline +

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

    Parameters

    +
      +
    1. points + array + array of points
    2. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. varargs + … + points
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the polyline element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var p1 = paper.polyline([10, 10, 100, 100]);
    +var p2 = paper.polyline(10, 10, 100, 100);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.polygon()

    +
    +
    +
    +
    + + + + +

    Draws a polygon. See Paper.polyline +

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

    Paper.gradient(gradient)

    +
    +
    +
    +
    + + + + +

    Creates a gradient element +

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

    Parameters

    +
      +
    1. gradient + string + gradient descriptor
    2. + +
    +
    + + + + + + + + + + + +

    Gradient Descriptor

    + + + + + + + +

    The gradient descriptor is an expression formatted as +follows: <type>(<coords>)<colors>. The <type> can be +either linear or radial. The uppercase L or R letters +indicate absolute coordinates offset from the SVG surface. +Lowercase l or r letters indicate coordinates +calculated relative to the element to which the gradient is +applied. Coordinates specify a linear gradient vector as +x1, y1, x2, y2, or a radial gradient as cx, cy, +r and optional fx, fy specifying a focal point away +from the center of the circle. Specify <colors> as a list +of dash-separated CSS color values. Each color may be +followed by a custom offset value, separated with a colon +character. +

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

    Examples

    + + + + + + + +

    Linear gradient, relative from top-left corner to bottom-right +corner, from black through red to white: +

    + + + + + + + + + + + + + +
    var g = paper.gradient("l(0, 0, 1, 1)#000-#f00-#fff");
    + + + + + + +

    Linear gradient, absolute from (0, 0) to (100, 100), from black +through red at 25% to white: +

    + + + + + + + + + + + + + +
    var g = paper.gradient("L(0, 0, 100, 100)#000-#f00:25-#fff");
    + + + + + + +

    Radial gradient, relative from the center of the element with radius +half the width, from black to white: +

    + + + + + + + + + + + + + +
    var g = paper.gradient("r(0.5, 0.5, 0.5)#000-#fff");
    + + + + + + +

    To apply the gradient: +

    + + + + + + + + + + + + + +
    paper.circle(50, 50, 40).attr({
    +    fill: g
    +});
    + + + + + + + + + + + +

    + Returns: + + object + + the gradient element +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.toString()

    +
    +
    +
    +
    + + + + +

    Returns SVG code for the Paper +

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

    + Returns: + + string + + SVG code for the Paper +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.toDataURL()

    +
    +
    +
    +
    + + + + +

    Returns SVG code for the Paper as Data URI string. +

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

    + Returns: + + string + + Data URI string +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.clear()

    +
    +
    +
    +
    + + + + +

    Removes all child nodes of the paper, except <defs>. +

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

    Element.addClass(value)

    +
    +
    +
    +
    + + + + +

    Adds given class name or list of class names to the element. +

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

    Parameters

    +
      +
    1. value + string + class name or space separated list of class names
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + original element. +

    + + + + +
    +
    +
    + +
    +
    +

    Element.removeClass(value)

    +
    +
    +
    +
    + + + + +

    Removes given class name or list of class names from the element. +

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

    Parameters

    +
      +
    1. value + string + class name or space separated list of class names
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + original element. +

    + + + + +
    +
    +
    + +
    +
    +

    Element.hasClass(value)

    +
    +
    +
    +
    + + + + +

    Checks if the element has a given class name in the list of class names applied to it. +

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

    Parameters

    +
      +
    1. value + string + class name
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + boolean + + true if the element has given class +

    + + + + +
    +
    +
    + +
    +
    +

    Element.toggleClass(value, flag)

    +
    +
    +
    +
    + + + + +

    Add or remove one or more classes from the element, depending on either +the class’s presence or the value of the flag argument. +

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

    Parameters

    +
      +
    1. value + string + class name or space separated list of class names
    2. +
    3. flag + boolean + value to determine whether the class should be added or removed
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + original element. +

    + + + + +
    +
    +
    + +
    +
    +

    mina(a, A, b, B, get, set, [easing])

    +
    +
    +
    +
    + + + + +

    Generic animation of numbers +

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

    Parameters

    +
      +
    1. a + number + start slave number
    2. +
    3. A + number + end slave number
    4. +
    5. b + number + start master number (start time in general case)
    6. +
    7. B + number + end master number (end time in gereal case)
    8. +
    9. get + function + getter of master number (see mina.time)
    10. +
    11. set + function + setter of slave number
    12. +
    13. easing + function + easing function, default is mina.linear
    14. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + animation descriptor +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + id + string + animation id, +
      2. + + + +
      3. + start + number + start slave number, +
      4. + + + +
      5. + end + number + end slave number, +
      6. + + + +
      7. + b + number + start master number, +
      8. + + + +
      9. + s + number + animation status (0..1), +
      10. + + + +
      11. + dur + number + animation duration, +
      12. + + + +
      13. + spd + number + animation speed, +
      14. + + + +
      15. + get + function + getter of master number (see mina.time), +
      16. + + + +
      17. + set + function + setter of slave number, +
      18. + + + +
      19. + easing + function + easing function, default is mina.linear, +
      20. + + + +
      21. + status + function + status getter/setter, +
      22. + + + +
      23. + speed + function + speed getter/setter, +
      24. + + + +
      25. + duration + function + duration getter/setter, +
      26. + + + +
      27. + stop + function + animation stopper +
      28. + + + +
      29. + pause + function + pauses the animation +
      30. + + + +
      31. + resume + function + resumes the animation +
      32. + + + +
      33. + update + function + calles setter with the right value of the animation +
      34. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    mina.time()

    +
    +
    +
    +
    + + + + +

    Returns the current time. Equivalent to: +

    + + + + + + + + + + + + + +
    function () {
    +    return (new Date).getTime();
    +}
    + + + + + +
    +
    +
    + +
    +
    +

    mina.getById(id)

    +
    +
    +
    +
    + + + + +

    Returns an animation by its id +

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

    Parameters

    +
      +
    1. id + string + animation's id
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + See mina +

    + + + + +
    +
    +
    + +
    +
    +

    mina.linear(n)

    +
    +
    +
    +
    + + + + +

    Default linear easing +

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

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.easeout(n)

    +
    +
    +
    +
    + + + + +

    Easeout easing +

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

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.easein(n)

    +
    +
    +
    +
    + + + + +

    Easein easing +

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

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.easeinout(n)

    +
    +
    +
    +
    + + + + +

    Easeinout easing +

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

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.backin(n)

    +
    +
    +
    +
    + + + + +

    Backin easing +

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

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.backout(n)

    +
    +
    +
    +
    + + + + +

    Backout easing +

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

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.elastic(n)

    +
    +
    +
    +
    + + + + +

    Elastic easing +

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

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.bounce(n)

    +
    +
    +
    +
    + + + + +

    Bounce easing +

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

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.filter(filstr)

    +
    +
    +
    +
    + + + + +

    Creates a <filter> element +

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

    Parameters

    +
      +
    1. filstr + string + SVG fragment of filter provided as a string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + + +

    Note: It is recommended to use filters embedded into the page inside an empty SVG element. +

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

    Usage

    + + + + + + + + + + + +
    var f = paper.filter(''),
    +    c = paper.circle(10, 10, 10).attr({
    +        filter: f
    +    });
    + + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.blur(x, [y])

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the blur filter +

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

    Parameters

    +
      +
    1. x + number + amount of horizontal blur, in pixels
    2. +
    3. y + number + amount of vertical blur, in pixels
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var f = paper.filter(Snap.filter.blur(5, 10)),
    +    c = paper.circle(10, 10, 10).attr({
    +        filter: f
    +    });
    + + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.shadow(…)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the shadow filter +

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

    Parameters

    +
      +
    1. dx + number + horizontal shift of the shadow, in pixels
    2. +
    3. dy + number + vertical shift of the shadow, in pixels
    4. +
    5. blur + number + amount of blur
    6. +
    7. color + string + color of the shadow
    8. +
    9. opacity + number + 0..1 opacity of the shadow
    10. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. dx + number + horizontal shift of the shadow, in pixels
    2. +
    3. dy + number + vertical shift of the shadow, in pixels
    4. +
    5. color + string + color of the shadow
    6. +
    7. opacity + number + 0..1 opacity of the shadow
    8. + +
    +
    + + + + + + + + +

    which makes blur default to 4. Or +

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

    Parameters

    +
      +
    1. dx + number + horizontal shift of the shadow, in pixels
    2. +
    3. dy + number + vertical shift of the shadow, in pixels
    4. +
    5. opacity + number + 0..1 opacity of the shadow
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var f = paper.filter(Snap.filter.shadow(0, 2, 3)),
    +    c = paper.circle(10, 10, 10).attr({
    +        filter: f
    +    });
    + + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.grayscale(amount)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the grayscale filter +

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

    Parameters

    +
      +
    1. amount + number + amount of filter (0..1)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.sepia(amount)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the sepia filter +

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

    Parameters

    +
      +
    1. amount + number + amount of filter (0..1)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.saturate(amount)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the saturate filter +

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

    Parameters

    +
      +
    1. amount + number + amount of filter (0..1)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.hueRotate(angle)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the hue-rotate filter +

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

    Parameters

    +
      +
    1. angle + number + angle of rotation
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.invert(amount)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the invert filter +

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

    Parameters

    +
      +
    1. amount + number + amount of filter (0..1)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.brightness(amount)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the brightness filter +

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

    Parameters

    +
      +
    1. amount + number + amount of filter (0..1)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.contrast(amount)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the contrast filter +

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

    Parameters

    +
      +
    1. amount + number + amount of filter (0..1)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Element.click(handler)

    +
    +
    +
    +
    + + + + +

    Adds a click event handler to the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unclick(handler)

    +
    +
    +
    +
    + + + + +

    Removes a click event handler from the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.dblclick(handler)

    +
    +
    +
    +
    + + + + +

    Adds a double click event handler to the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.undblclick(handler)

    +
    +
    +
    +
    + + + + +

    Removes a double click event handler from the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.mousedown(handler)

    +
    +
    +
    +
    + + + + +

    Adds a mousedown event handler to the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unmousedown(handler)

    +
    +
    +
    +
    + + + + +

    Removes a mousedown event handler from the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.mousemove(handler)

    +
    +
    +
    +
    + + + + +

    Adds a mousemove event handler to the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unmousemove(handler)

    +
    +
    +
    +
    + + + + +

    Removes a mousemove event handler from the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.mouseout(handler)

    +
    +
    +
    +
    + + + + +

    Adds a mouseout event handler to the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unmouseout(handler)

    +
    +
    +
    +
    + + + + +

    Removes a mouseout event handler from the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.mouseover(handler)

    +
    +
    +
    +
    + + + + +

    Adds a mouseover event handler to the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unmouseover(handler)

    +
    +
    +
    +
    + + + + +

    Removes a mouseover event handler from the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.mouseup(handler)

    +
    +
    +
    +
    + + + + +

    Adds a mouseup event handler to the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unmouseup(handler)

    +
    +
    +
    +
    + + + + +

    Removes a mouseup event handler from the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.touchstart(handler)

    +
    +
    +
    +
    + + + + +

    Adds a touchstart event handler to the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.untouchstart(handler)

    +
    +
    +
    +
    + + + + +

    Removes a touchstart event handler from the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.touchmove(handler)

    +
    +
    +
    +
    + + + + +

    Adds a touchmove event handler to the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.untouchmove(handler)

    +
    +
    +
    +
    + + + + +

    Removes a touchmove event handler from the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.touchend(handler)

    +
    +
    +
    +
    + + + + +

    Adds a touchend event handler to the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.untouchend(handler)

    +
    +
    +
    +
    + + + + +

    Removes a touchend event handler from the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.touchcancel(handler)

    +
    +
    +
    +
    + + + + +

    Adds a touchcancel event handler to the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.untouchcancel(handler)

    +
    +
    +
    +
    + + + + +

    Removes a touchcancel event handler from the element +

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

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.hover(f_in, f_out, [icontext], [ocontext])

    +
    +
    +
    +
    + + + + +

    Adds hover event handlers to the element +

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

    Parameters

    +
      +
    1. f_in + function + handler for hover in
    2. +
    3. f_out + function + handler for hover out
    4. +
    5. icontext + object + context for hover in handler
    6. +
    7. ocontext + object + context for hover out handler
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unhover(f_in, f_out)

    +
    +
    +
    +
    + + + + +

    Removes hover event handlers from the element +

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

    Parameters

    +
      +
    1. f_in + function + handler for hover in
    2. +
    3. f_out + function + handler for hover out
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.drag(onmove, onstart, onend, [mcontext], [scontext], [econtext])

    +
    +
    +
    +
    + + + + +

    Adds event handlers for an element's drag gesture +

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

    Parameters

    +
      +
    1. onmove + function + handler for moving
    2. +
    3. onstart + function + handler for drag start
    4. +
    5. onend + function + handler for drag end
    6. +
    7. mcontext + object + context for moving handler
    8. +
    9. scontext + object + context for drag start handler
    10. +
    11. econtext + object + context for drag end handler
    12. + +
    +
    + + + + + + + + +

    Additionaly following drag events are triggered: drag.start.<id> on start, +drag.end.<id> on end and drag.move.<id> on every move. When element is dragged over another element +drag.over.<id> fires as well. +

    Start event and start handler are called in specified context or in context of the element with following parameters: +

    + + + + + + + + + + + + + + + +
      + + +
    1. + x + number + x position of the mouse +
    2. + + + +
    3. + y + number + y position of the mouse +
    4. + + + +
    5. + event + object + DOM event object +
    6. + + +
    + + + +

    Move event and move handler are called in specified context or in context of the element with following parameters: +

    + + + + + + + + + + + + + + + +
      + + +
    1. + dx + number + shift by x from the start point +
    2. + + + +
    3. + dy + number + shift by y from the start point +
    4. + + + +
    5. + x + number + x position of the mouse +
    6. + + + +
    7. + y + number + y position of the mouse +
    8. + + + +
    9. + event + object + DOM event object +
    10. + + +
    + + + +

    End event and end handler are called in specified context or in context of the element with following parameters: +

    + + + + + + + + + + + + + + + +
      + + +
    1. + event + object + DOM event object +
    2. + + +
    + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.undrag()

    +
    +
    +
    +
    + + + + +

    Removes all drag event handlers from the given element +

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

    Snap.path.getTotalLength(path)

    +
    +
    +
    +
    + + + + +

    Returns the length of the given path in pixels +

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

    Parameters

    +
      +
    1. path + string + SVG path string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + length +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.getPointAtLength(path, length)

    +
    +
    +
    +
    + + + + +

    Returns the coordinates of the point located at the given length along the given path +

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

    Parameters

    +
      +
    1. path + string + SVG path string
    2. +
    3. length + number + length, in pixels, from the start of the path, excluding non-rendering jumps
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + representation of the point: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + x: + number + x coordinate, +
      2. + + + +
      3. + y: + number + y coordinate, +
      4. + + + +
      5. + alpha: + number + angle of derivative +
      6. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.path.getSubpath(path, from, to)

    +
    +
    +
    +
    + + + + +

    Returns the subpath of a given path between given start and end lengths +

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

    Parameters

    +
      +
    1. path + string + SVG path string
    2. +
    3. from + number + length, in pixels, from the start of the path to the start of the segment
    4. +
    5. to + number + length, in pixels, from the start of the path to the end of the segment
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + path string definition for the segment +

    + + + + +
    +
    +
    + +
    +
    +

    Element.getTotalLength()

    +
    +
    +
    +
    + + + + +

    Returns the length of the path in pixels (only works for path elements) +

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

    + Returns: + + number + + length +

    + + + + +
    +
    +
    + +
    +
    +

    Element.getPointAtLength(length)

    +
    +
    +
    +
    + + + + +

    Returns coordinates of the point located at the given length on the given path (only works for path elements) +

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

    Parameters

    +
      +
    1. length + number + length, in pixels, from the start of the path, excluding non-rendering jumps
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + representation of the point: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + x: + number + x coordinate, +
      2. + + + +
      3. + y: + number + y coordinate, +
      4. + + + +
      5. + alpha: + number + angle of derivative +
      6. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Element.getSubpath(from, to)

    +
    +
    +
    +
    + + + + +

    Returns subpath of a given element from given start and end lengths (only works for path elements) +

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

    Parameters

    +
      +
    1. from + number + length, in pixels, from the start of the path to the start of the segment
    2. +
    3. to + number + length, in pixels, from the start of the path to the end of the segment
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + path string definition for the segment +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t)

    +
    +
    +
    +
    + + + + +

    Utility method +Finds dot coordinates on the given cubic beziér curve at the given t +

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

    Parameters

    +
      +
    1. p1x + number + x of the first point of the curve
    2. +
    3. p1y + number + y of the first point of the curve
    4. +
    5. c1x + number + x of the first anchor of the curve
    6. +
    7. c1y + number + y of the first anchor of the curve
    8. +
    9. c2x + number + x of the second anchor of the curve
    10. +
    11. c2y + number + y of the second anchor of the curve
    12. +
    13. p2x + number + x of the second point of the curve
    14. +
    15. p2y + number + y of the second point of the curve
    16. +
    17. t + number + position on the curve (0..1)
    18. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + point information in format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + x: + number + x coordinate of the point, +
      2. + + + +
      3. + y: + number + y coordinate of the point, +
      4. + + + +
      5. m: {
          + + + +
        1. + x: + number + x coordinate of the left anchor, +
        2. + + + +
        3. + y: + number + y coordinate of the left anchor +
        4. + + + +
      6. },
      7. + + + +
      8. n: {
          + + + +
        1. + x: + number + x coordinate of the right anchor, +
        2. + + + +
        3. + y: + number + y coordinate of the right anchor +
        4. + + + +
      9. },
      10. + + + +
      11. start: {
          + + + +
        1. + x: + number + x coordinate of the start of the curve, +
        2. + + + +
        3. + y: + number + y coordinate of the start of the curve +
        4. + + + +
      12. },
      13. + + + +
      14. end: {
          + + + +
        1. + x: + number + x coordinate of the end of the curve, +
        2. + + + +
        3. + y: + number + y coordinate of the end of the curve +
        4. + + + +
      15. },
      16. + + + +
      17. + alpha: + number + angle of the curve derivative at the point +
      18. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.path.bezierBBox(…)

    +
    +
    +
    +
    + + + + +

    Utility method +Returns the bounding box of a given cubic beziér curve +

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

    Parameters

    +
      +
    1. p1x + number + x of the first point of the curve
    2. +
    3. p1y + number + y of the first point of the curve
    4. +
    5. c1x + number + x of the first anchor of the curve
    6. +
    7. c1y + number + y of the first anchor of the curve
    8. +
    9. c2x + number + x of the second anchor of the curve
    10. +
    11. c2y + number + y of the second anchor of the curve
    12. +
    13. p2x + number + x of the second point of the curve
    14. +
    15. p2y + number + y of the second point of the curve
    16. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. bez + array + array of six points for beziér curve
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + bounding box +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + x: + number + x coordinate of the left top point of the box, +
      2. + + + +
      3. + y: + number + y coordinate of the left top point of the box, +
      4. + + + +
      5. + x2: + number + x coordinate of the right bottom point of the box, +
      6. + + + +
      7. + y2: + number + y coordinate of the right bottom point of the box, +
      8. + + + +
      9. + width: + number + width of the box, +
      10. + + + +
      11. + height: + number + height of the box +
      12. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.path.isPointInsideBBox(bbox, x, y)

    +
    +
    +
    +
    + + + + +

    Utility method +Returns true if given point is inside bounding box +

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

    Parameters

    +
      +
    1. bbox + string + bounding box
    2. +
    3. x + string + x coordinate of the point
    4. +
    5. y + string + y coordinate of the point
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + boolean + + true if point is inside +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.isBBoxIntersect(bbox1, bbox2)

    +
    +
    +
    +
    + + + + +

    Utility method +Returns true if two bounding boxes intersect +

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

    Parameters

    +
      +
    1. bbox1 + string + first bounding box
    2. +
    3. bbox2 + string + second bounding box
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + boolean + + true if bounding boxes intersect +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.intersection(path1, path2)

    +
    +
    +
    +
    + + + + +

    Utility method +Finds intersections of two paths +

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

    Parameters

    +
      +
    1. path1 + string + path string
    2. +
    3. path2 + string + path string
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + array + + dots of intersection +

    + + + + + + + + + + + +
      + + +
    1. [
    2. + + + +
    3. {
        + + + +
      1. + x: + number + x coordinate of the point, +
      2. + + + +
      3. + y: + number + y coordinate of the point, +
      4. + + + +
      5. + t1: + number + t value for segment of path1, +
      6. + + + +
      7. + t2: + number + t value for segment of path2, +
      8. + + + +
      9. + segment1: + number + order number for segment of path1, +
      10. + + + +
      11. + segment2: + number + order number for segment of path2, +
      12. + + + +
      13. + bez1: + array + eight coordinates representing beziér curve for the segment of path1, +
      14. + + + +
      15. + bez2: + array + eight coordinates representing beziér curve for the segment of path2 +
      16. + + + +
    4. }
    5. + + + +
    6. ]
    7. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.path.isPointInside(path, x, y)

    +
    +
    +
    +
    + + + + +

    Utility method +Returns true if given point is inside a given closed path. +

    Note: fill mode doesn’t affect the result of this method. +

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

    Parameters

    +
      +
    1. path + string + path string
    2. +
    3. x + number + x of the point
    4. +
    5. y + number + y of the point
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + boolean + + true if point is inside the path +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.getBBox(path)

    +
    +
    +
    +
    + + + + +

    Utility method +Returns the bounding box of a given path +

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

    Parameters

    +
      +
    1. path + string + path string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + bounding box +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + x: + number + x coordinate of the left top point of the box, +
      2. + + + +
      3. + y: + number + y coordinate of the left top point of the box, +
      4. + + + +
      5. + x2: + number + x coordinate of the right bottom point of the box, +
      6. + + + +
      7. + y2: + number + y coordinate of the right bottom point of the box, +
      8. + + + +
      9. + width: + number + width of the box, +
      10. + + + +
      11. + height: + number + height of the box +
      12. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.path.toRelative(path)

    +
    +
    +
    +
    + + + + +

    Utility method +Converts path coordinates into relative values +

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

    Parameters

    +
      +
    1. path + string + path string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + array + + path string +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.toAbsolute(path)

    +
    +
    +
    +
    + + + + +

    Utility method +Converts path coordinates into absolute values +

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

    Parameters

    +
      +
    1. path + string + path string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + array + + path string +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.toCubic(pathString)

    +
    +
    +
    +
    + + + + +

    Utility method +Converts path to a new path where all segments are cubic beziér curves +

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

    Parameters

    +
      +
    1. pathString + string array + path string or array of segments
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + array + + array of segments +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.map(path, matrix)

    +
    +
    +
    +
    + + + + +

    Transform the path string with the given matrix +

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

    Parameters

    +
      +
    1. path + string + path string
    2. +
    3. matrix + object + see Matrix
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + transformed path string +

    + + + + +
    +
    +
    + +
    +
    +

    Set.push()

    +
    +
    +
    +
    + + + + +

    Adds each argument to the current set +

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

    + Returns: + + object + + original element +

    + + + + +
    +
    +
    + +
    +
    +

    Set.pop()

    +
    +
    +
    +
    + + + + +

    Removes last element and returns it +

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

    + Returns: + + object + + element +

    + + + + +
    +
    +
    + +
    +
    +

    Set.forEach(callback, thisArg)

    +
    +
    +
    +
    + + + + +

    Executes given function for each element in the set +

    If the function returns false, the loop stops running. +

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

    Parameters

    +
      +
    1. callback + function + function to run
    2. +
    3. thisArg + object + context object for the callback
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Set object +

    + + + + +
    +
    +
    + +
    +
    +

    Set.animate(…)

    +
    +
    +
    +
    + + + + +

    Animates each element in set in sync. +

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

    Parameters

    +
      +
    1. attrs + object + key-value pairs of destination attributes
    2. +
    3. duration + number + duration of the animation in milliseconds
    4. +
    5. easing + function + easing function from mina or custom
    6. +
    7. callback + function + callback function that executes when the animation ends
    8. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. animation + array + array of animation parameter for each element in set in format [attrs, duration, easing, callback]
    2. + +
    +
    + + + + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    // animate all elements in set to radius 10
    +set.animate({r: 10}, 500, mina.easein);
    +// or
    +// animate first element to radius 10, but second to radius 20 and in different time
    +set.animate([{r: 10}, 500, mina.easein], [{r: 20}, 1500, mina.easein]);
    + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + +
    +
    +
    + +
    +
    +

    Set.bind(…)

    +
    +
    +
    +
    + + + + +

    Specifies how to handle a specific attribute when applied +to a set. +

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

    Parameters

    +
      +
    1. attr + string + attribute name
    2. +
    3. callback + function + function to run
    4. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. attr + string + attribute name
    2. +
    3. element + Element + specific element in the set to apply the attribute to
    4. + +
    +
    + + + + + + + + +

    or +

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

    Parameters

    +
      +
    1. attr + string + attribute name
    2. +
    3. element + Element + specific element in the set to apply the attribute to
    4. +
    5. eattr + string + attribute on the element to bind the attribute to
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Set object +

    + + + + +
    +
    +
    + +
    +
    +

    Set.clear()

    +
    +
    +
    +
    + + + + +

    Removes all elements from the set +

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

    Set.splice(index, count, [insertion…])

    +
    +
    +
    +
    + + + + +

    Removes range of elements from the set +

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

    Parameters

    +
      +
    1. index + number + position of the deletion
    2. +
    3. count + number + number of element to remove
    4. +
    5. insertion… + object + elements to insert
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + set elements that were deleted +

    + + + + +
    +
    +
    + +
    +
    +

    Set.exclude(element)

    +
    +
    +
    +
    + + + + +

    Removes given element from the set +

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

    Parameters

    +
      +
    1. element + object + element to remove
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + boolean + + true if object was found and removed from the set +

    + + + + +
    +
    +
    + +
    +
    +
    +
    + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dr.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dr.json new file mode 100644 index 0000000..da75abb --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dr.json @@ -0,0 +1,39 @@ +{ + "title": "Snap.svg", + "output": "doc/reference.html", + "template": "template.dot", + "files": [{ + "url": "src/svg.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js" + }, { + "url": "src/element.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/element.js" + }, { + "url": "src/matrix.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/matrix.js" + }, { + "url": "src/paper.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/paper.js" + }, { + "url": "src/class.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/class.js" + }, { + "url": "src/equal.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/equal.js" + }, { + "url": "src/mina.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/mina.js" + }, { + "url": "src/filter.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/filter.js" + }, { + "url": "src/mouse.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/mouse.js" + }, { + "url": "src/path.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/path.js" + }, { + "url": "src/set.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/set.js" + }] +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/history.md b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/history.md new file mode 100644 index 0000000..51c18ea --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/history.md @@ -0,0 +1,49 @@ +#0.4.1 + +* Bug fixes. + +#0.4.0 + +* Moved class and element related code into separate plugins +* Added `Element.align()` and `Element.getAlign()` methods +* Added animation support for `viewBox` +* Added support for `` +* Added method `Paper.toDataURL()` +* Added method `Snap.closest()` +* Added methods to work with degrees instead of radians: `Snap.sin()`, `Snap.cos()`, `Snap.tan()`, `Snap.asin()`, `Snap.acos()`, `Snap.atan()` and `Snap.atan2()` +* Added methods `Snap.len()`, `Snap.len2()` and `Snap.closestPoint()` +* Added methods `Element.children()` and `Element.toJSON()` +* Various bug fixes + +#0.3.0 + +* Added `.addClass()`, `.removeClass()`, `.toggleClass()` and `.hasClass()` APIs +* Added `Paper.mask()`, `Paper.ptrn()`, `Paper.use()`, `Paper.svg()` +* Mask & pattern elements are sharing paper methods (just like group) +* Added `Set.bind()` method +* Added syncronisation for `Set.animate()` +* Added opacity to the shadow filter +* Added ability to specify attributes as `"+=10"` or `"-=1em"` or `"*=2"` +* Fix negative scale +* Fix for `path2curve` +* Fixed shared `` issue +* Various bug fixes + +#0.2.0 + +* Added support for text path +* Added `getBBox` method to the paper object +* Added `Element.appendTo()` and `Element.prependTo()` +* Added `getElementByPoint()` +* Added `Set.remove()` method +* Get rid of internal SVG parser in favor of the browser +* Fix for `xlink:href` setting for images +* Fix `Element.animate()` +* Fix for animate and stroke-dashoffset +* Absolute transforms fix +* Fix for animation of SVG transformations, matrices and polygon points +* Various bug fixes + +#0.1.0 + +* Initial release \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/package.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/package.json new file mode 100644 index 0000000..d3794c4 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/package.json @@ -0,0 +1,24 @@ +{ + "name": "snapsvg", + "version": "0.4.1", + "description": "JavaScript Vector Library", + "main": "./dist/snap.svg.js", + "repository": { + "type": "git", + "url": "git@github.com:adobe-webplatform/Snap.svg.git" + }, + "author": "Dmitry Baranovskiy", + "license": "Apache License v2", + "dependencies": { + "eve": "~0.4.2" + }, + "devDependencies": { + "grunt": "~0.4.1", + "grunt-contrib-uglify": "~0.2.0", + "grunt-contrib-concat": "~0.3.0", + "grunt-exec": "~0.4.2", + "mocha": "*", + "expect.js": "*", + "dr.js": "~0.1.0" + } +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/template.dot b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/template.dot new file mode 100644 index 0000000..f92c011 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/template.dot @@ -0,0 +1,157 @@ + + + + + + + Snap.svg API Reference + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + {{~it.out :item:index}} +
    +
    +

    {{=item[0].name}}

    +
    +
    +
    +
    + {{~item :line:i}} + {{ if (i > 0) { }} + {{ if (line.text) { }}

    {{=line.text.join("

    ")}}

    {{ } }} + {{ if (line.attr) { }}
    +

    Parameters

    +
      + {{~line.attr :attr:j}}
    1. {{=attr.name}} + {{~attr.type :type:k}}{{=type}} {{~}} + {{=attr.desc}}
    2. + {{~}} +
    +
    {{ } }} + {{ if (line.html) { }}{{=line.html}} + {{ } }} + {{ if (line.head) { }}

    {{=line.head}}

    + {{ } }} + {{ if (line.code) { }}
    {{=line.code.join("\n")}}
    + {{ } }} + {{ if (line.rtrn) { }}

    + Returns: + {{~line.rtrn.type :type:k}} + {{=type}} + {{~}} + {{=line.rtrn.desc}} +

    + {{ } }} + {{ if (line.json) { }}
      + {{~line.json :a:j}} + {{ if (a.key) { }} +
    1. + {{=a.key}} + {{~a.type :type:k}}{{=type}} {{~}} + {{=a.desc}} +
    2. + {{ } else if (a.start) { }} +
    3. {{=a.start}}
        + {{ } else if (a.end) { }} +
    4. {{=a.end}}
    5. + {{ } else { }} +
    6. {{=a}}
    7. + {{ } }} + {{~}} +
    {{ } }} + {{ } }} + {{~}} +
    +
    +
    + {{~}} +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/test.html b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/test.html new file mode 100644 index 0000000..a7a5f21 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/test.html @@ -0,0 +1,17 @@ + + + + + Test + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.bower.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.bower.json new file mode 100644 index 0000000..d9fc38c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.bower.json @@ -0,0 +1,30 @@ +{ + "name": "bpmn-js", + "version": "0.10.3", + "authors": [ + "bpmn.io" + ], + "description": "A BPMN 2.0 renderer and web modeler", + "main": "dist/bpmn-viewer.js", + "keywords": [ + "models", + "diagram", + "renderer", + "modeler", + "bpmn" + ], + "ignore": [ + "test/*" + ], + "homepage": "http://bpmn.io", + "_release": "0.10.3", + "_resolution": { + "type": "version", + "tag": "v0.10.3", + "commit": "8417ce12aa78ada7577338b33a9364fd35a126b2" + }, + "_source": "git://github.com/bpmn-io/bower-bpmn-js.git", + "_target": "~0.10.3", + "_originalSource": "bpmn-js", + "_direct": true +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.gitignore b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.gitignore new file mode 100644 index 0000000..7559d42 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.gitignore @@ -0,0 +1 @@ +bower_components/ \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/LICENSE b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/LICENSE new file mode 100644 index 0000000..38500c2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2014 camunda services GmbH + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +The source code responsible for displaying the bpmn.io logo (two green cogwheels in +a box) that links back to http://bpmn.io as part of rendered diagrams MUST NOT be +removed or changed. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/README.md b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/README.md new file mode 100644 index 0000000..a767a20 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/README.md @@ -0,0 +1,46 @@ +# bpmn-js Bower Package + +This is a packaged version of [bpmn-js](https://github.com/bpmn-io/bpmn-js) for usage via [bower](http://bower.io). + + +## Usage + +Install the dependency via + +``` +bower install bpmn-js +``` + +Include the file into your project + +```html + + + + + + +``` + + +Checkout the [examples repository](https://github.com/bpmn-io/bpmn-js-examples) for a complete example of [how to use bpmn-js with bower](https://github.com/bpmn-io/bpmn-js-examples/tree/master/simple-bower). + + +## License + +Use under the terms of the [bpmn-js license](http://bpmn.io/license). \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/bower.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/bower.json new file mode 100644 index 0000000..bccfc96 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/bower.json @@ -0,0 +1,20 @@ +{ + "name": "bpmn-js", + "version": "0.10.3", + "authors": [ + "bpmn.io" + ], + "description": "A BPMN 2.0 renderer and web modeler", + "main": "dist/bpmn-viewer.js", + "keywords": [ + "models", + "diagram", + "renderer", + "modeler", + "bpmn" + ], + "ignore": [ + "test/*" + ], + "homepage": "http://bpmn.io" +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css new file mode 100644 index 0000000..11e91f4 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css @@ -0,0 +1,150 @@ +@font-face { + font-family: 'bpmn'; + src: url('../font/bpmn.eot?5069274'); + src: url('../font/bpmn.eot?5069274#iefix') format('embedded-opentype'), + url('../font/bpmn.svg?5069274#bpmn') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'bpmn'; + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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AgMCAwIIAZwFBAQBBwocCwcSBAsEBwQEBwQIBBAIBAMCAgEEBAMEBQwFDQQFBAUIBSYECQQEBAQEBAEEAwEDAQMEBAgECQQCAgECBgMEBf5EBAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQISBQQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgB+v7IATgxWj66un0B8gEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHCAEEBAEDBAMBAwwDAQMBAwEIBAQEAQQEBAEEDRcFBQQBBAEJBQoFDAQFBAQDBAECBQcMHggECQQUBwgHBAMEAwQDBwYEAwcFBAQJBAQDBAECAgUMBQkEAwYCAQEBAQECAgcCAgMCAgIBAgMDCAUJCAMFAgECAQIBAgICCQIBAQEnAgMFAgQBAg8DAgECCQwJAQkEAwMBAwMBAwsHBwkJBAMEBAEBBAMMAwQGAwMCAwMDAwMDAgMDAgMCAwIDAgMEAxYDAwgJCQcDBDsBAgMDBA0FCwIDAwMDAwMCAwMKIwMHAwcEDgsDBwMIAwMCAQEDAgQICQQCBAkEBAQEBAUDAQMBAwQBAxAEAwEDCAMBCgEDAwEDAwEDAwEGBAkBAwIDA6kBBAQDBAgEBAkFBAkNBBsFDQkEBAkEAQQiBAUBBAQDAwIBAgIDBAgJBQQSBAsEBwQEBwQIBB4ECAQHBAQHBAQJBAQEAwQtAQQIBAQEBB4FCgUFBQUJBScFBAUJCgQyBAUECAQGAgIGCAoFGQEEARQGBQUFCwYmBQYFCwYLBhYGCQgDAwQQAgYICAkGEQUGBQYLBSEGCwUFCgYPAQQBGQUKAQQGAgEBAwIECAkIASkEBQUEBQUJBSIFCQUFBQUKBRcFBAcCAjkBAgMDCAcEBwQaAwsLBwYEAwcUDwMHAQgFBAUIAwMCAgICBwEDFQEDCwEHEAQEDAQEBAQEBAkEJgUFCAQEAwSgAQQDAwQJCQkGAQwBBgwGBQMDAgEEAQQBAgUEAgIBAQEEAQEBBgEBAQIBAQIDBwUEBQQIAwMJAgEGAxADBgMCAwIDAgMCAwYCAwMDAwMHSgECAQMGDAMDBQMCAQEBBAMDBAkFBAgDAwIBAQEBAgkCAgIBAgECAQEBAgICAQEBBAEBAQUEAwUEBQgIAwIBJwEBAwYECQUEBAQCBQMECQEGCQMCAQIDAgECAwQDCgIIAQIBAgIDAQIDAwgFBAkEAwMDBAIBAgECAQIBEBAGAgMFCQMKAQICAg8CAwUGDBQBAgECAQIBAgYCBgkEBQQEBAMDAgEBAQICAgECAQgMAwQDAgECAwIBAhIBCQQDBQQEBAUJBAMDBAAAAAUAAP+HA78DIgAPAB4AJgAqAC8AAAEOAhIWBDc+ATc2JicuAQcyFhcWBgcGJCcmAjc+ARcGBxc1FxEHJxQVJyUUFSYnAfSJ4mkwugECfoGkCAeJeC9mNIfXJiJUaXD+8WpnPzMwyWppaNHKyhiPAVlHSAMiAZb5/vbCPiwu3ImH6D0XGDGjgnvxS08LVlYBA3twhv9KSpSPjwEoj2BkZWRlZGYzMgAAAAkAAP+iA7gDIAALABcAUgC7AUQBoQHoAjICngAAARUjFTMVMzUzNSM1BzMVMxUjFSM1IzUzEysBByMHIwcVDwUVHwUzPwMzNzM3MzczFzMXMxczHwEzPwM1LwQjNSMnIycXDwYVHwozHwYVHwIzHw0zPwQ1LwE1JyMvBiMvATUjLwsjLwEjLwcjNSc1LwQjBQ8BIw8EFQ8EFQcjBxUPAyMVBxUHIxUPBBUHIw8BFQ8CFQ8CIw8DFQ8DFQcVDwoVBxUfBD8EMz8ENT8mNS8DAQ8FFRcVBxUHFQcVBxUHFQcVBxUHFQcVBxUHFQ8HFR8EPwUzPwEzPwE1PwEzNzM3NTc1MzU3NTc1NzU3NTc1NzU3NTc1JzUvBAUPBRUXFRcVFzMfBTMfARUXFRcVFxUzFxUXFR8EPwQ1Lw01JzUnNSc1LwMBDxcfBD8EMz8DMzczNzM3MzczNzU3Mzc1NzM/AjM3MzU/AzUvBAUPBRUfAxUfATMfAjMfAhUfATMfARUfATMXMxczFzMfAjMXMxcVMx8HMxcVFzMVMxczPwQ1LwQjJyMnIycjLwojLwQjLwUjAa59fYx9fXVefX1efX0zBw0GDQ0HJw0OBAMDBAECAwMJBAUGDAYXBgsGBgYGKQYGBgYGBR8EBQwDAwICBgMKJwYHBg0H6QUEBAMDAQICAgYCAgMGBQQDCAEOAggCBgIEAQICAQIDAgMFBAMEAwoFBgMJBAkEBAMEAgQGAQQDAgMCAwIBAggBBQMEAgQCAgUCBwICAQIJAQICAwcDAgMCAQIDAgYCCgX98wUHAQIDAgMCAwIDAgMEAQICAwIEAQQEAQICAgICAgECAgIEAgIEAQEBAgMCAgoBAgICAQQBAgECAQIBAgIBBAQDDgQIBAMBAQIDAQICAgECAQIBAgECAgMCAQIIAgECAgIBBAIEAQYCCgIGAwoDBgMFAwIBBAYIBQKyBAUDBgIBAQEBAQEBAQIBAwUDBQMEAwIGAwECAwYECQkEBAMCAQEDAgECAwMCAQUBDAMBAgEBAQEBAQEBBAMEBAj8pgQFAwQEAQEDAgEDAgEEAQoBBAMCAwIBAgMBAgQHCQkEBAMEAgQCAwIHBAEGAQIBAggBAQEBBQgIArEEBAkEBQoEDwUFCw8GBQsFIQYLEAgEBQICBAMEDQkGBhQFARIGBwUBBQEFAQUBHAELBQEFBQEFCw8BBAEDAwIBBAMEBAj93gQEBAMCAgECAwQNAgECAwIBAgMDCwIBCAMDBQECAQIBAgECAwMBAgECAQIEAwYDDQMdAgMNBAMNCQUIBQIBBAMEBAMECAMUAhEDCQURAgYFAwUFBQIBDwIFAgIBBAMEEQQEBQIhfYx9fYx9F31efX5dAZMBAgYBAgQCAwQICQUEBAMEAQICAgQCAQEBAQEFAQYEAwkFCAgCBAYBAQFPAQEDAwQEBAUJBAYBAgEGAwQCCA4DCAMGAwQBAgIDBAMEAwcHAwgDEgoIAgQCAgMDCAoHBwEMCAQEBAQEBAQLAQcDBgIGAgMFAwcDAgMJAwICBwICAgIBAQECAgQCBQwBBAICAgICAQICAgICAQQCAQICAwQBBAEEAQIDAgMCAQIDAgECBgIBAgYDAwIFAgECDwMCAQIBAgMGAwMDAwMDAwMBBAkFCAMDAwEEAwMEBgUDAgUBAgMCAwIDAgMDAgUCAwIMAgMCAwIDBAMEAwYDCgMGAgoBBgIFBAQECQkGBAH+xgECAggEBAQEMwMJAwYCBgMDAwMDAwYCAwMJAg4DCAENBQsFBgoHBAUJBAYCAgICAwMDAwYGBgUBBQcPJgMKAwMHAwMEAwMEAwMEAwcDDgMsBQkIBAIDAhMBAgMDCAQbBgcTBw0TBgcNBh8NBQEFAQUBBQEFAQUBAQQEBAICAgMDCQkIBgYFBhALBhEFBgYFLwYFBgYMBgcFBwYC/rIBAgYEBAYECQQDBQkCAwQDDAEEAwQDBwkJCAMDAwICAQYCBgMCAwIDAw8GAQMDAQMEBwwEAQMEBAQJCAQDAgICAQMCBAQJBAUEBAMBCgICAgICAgEBBwIFAQEBAwICAQIBAgEBAQEBAgICBAIJAQEEAQQBBAcFBAkIBAIDAQMHBgMDBgICAwEDAgMCCQIDAgEEAQQNAQIAAAABAAAAAAMxAqAAJwAAAQ4BBxQWFxYXBxc3NRUnNQcXJicuATU+ATceARcOAQcjFTM+ATcuAQH0h7MDMispN70CyCUKIjInKjADrYODrQMDrYMFBYezAwOzAqADsoVCcSspGCEKIwMByAUCuhcmKm4/gawDA6yBgawDCgOyhYWyAAUAAP/TA9QC6QAPAB8AOwBbAHYAABMOAQcRHgEXIT4BNxEuAScFIR4BFxEOAQchLgEnET4BFyMOARUeARcOAQcOAQcVITUuAScuASc+ATUuAQc2Fx4BNxYVFAYPARceARcOASImJz4BPwEnLgEnNT4BFxYXHgEXFSM1IxUjNTQiHQEjNT4BPwEeATI211JvAgJvUgI6U24CAm5T/cYCOjpMAQFMOv3GOkwBAUzFAygvARUNByASFiECAVwBIxcUIQgNEQEwQA0MHDAGARINBAQDGA8CNFA1AhEZAwQDDhYBBSKSCQkWIQE5BdgFNwIfFQsDOFI3AukCblL+blJuAgJuUgGSUm4CPAFLOv5uOksBAUs6AZI6S2QBMCUTIAwCDQoMHxV/fxIfDAsPAwwfEyUwMgEHDgsEBAQSIAsDAgEICCEtKyIICQEBAwwgEggGFHgEBQweD3paWloCAlp6Eh4LBiMsLQAAAAUAAAAAA4AChAAEAAgADAAQABQAABMZASERBTMVIzchFSEHMxUjNyEVIWgDGPztvb3CAkz9tMK9vcICTP20AoT+2v7bAkvChISEBfv7+wAAAwAAAAADNgK8AAMABwALAAATETMRMxEzETMRMxGygn+Cf4ICvP1EArz9RAK8/UQCvAAAAAkAAP+iA7wDIgADAAgAFgAiAC4APABKAFYAYwAAAQYHIQMWFyE2Ew4BBxY2FzYWFzYmByYXBhYXFhcWNicuAScFDgEHDgE3PgE3PgEBBhYHBgcUNjc+AScuAQUGFhceARcWJicmJy4BAQ4BBw4BFz4BNzYmIQYWFx4BFzYmJyYvAQH0YGABgMBLTP7STE8kVRIQRh4ePB0fSB8M7ik1Fi0fIA0WGT4o/fEmNBcUFysXKRwTJwKSHwoHCyA1BBcTBgIN/KQhDAMIFhUtGgsSAQIMAq4lRykdKiE5ZywKDP3TJTMbIkonISscTDwGAjKsrQEmh4eHAagDAyEfFgECCAIiGAIBTxA0EzI7EjYVKUgZChFBIRZKBSBFHRAt/tYMRh1BPCIKHjJtNggIEgtHHCNEHgNKHD0/CAv+sxMvDAEnFAozJQwbEjQNExwGEyYCFjMDAAARAAD/owO4AyIADQAaACkAbADCASABawGuAgYCUwKWAu4DRAOGA8sEFwRhAAABIg4BHgI3PgImJyYHMh4BBgcGLgI3PgEXBgcOARcWNjsBNSM2NyYnKwEVIw8DFR8EMzczNzMXMxczFzMXMxczHwYzPwU1LwIjLwkjJyMnIycjNQ8EIw8BFQcjDwEjBxUHIwcjByMHFQ8DIxUPARUPAiMPAR8FMz8dMz8DLwMjBQ8FHxYVHwQzPwQ1JzUvCDUnNS8EIycjJzUvASMnNSc1LwE1Iy8BNScjJzUvAjUvBAUPBRUjFQcVBxUjFQcVFxUzFRcVFxUXFR8JMz8ENS8CNSc1JzUnNSc1JzU3NTc1NzU3NTc1LwUFDwUVBxUPDxUfBT8CNT8BNTczNzU/AjM/CjU3LwQjBQ8FHwIVFxUXMxczHwIzHwEzFRcVFxUXMx8BMxczFxUXFR8BFR8CFR8CMz8FNS8dBQ8IIwcjByMHIwcjByMPBBUfBTM1MzczNzM3Mz8LMzczPwE1PwE1NzU/BDUvBCMDKwEHIwcjFSMHIw8HFR8EMzczNzM3MzczNzMXMxczFzMXMxczPwU1LwUjJyM1IycjJxcPBR8ZPwQ1LwMjJzUnNScjLwEjLwE1JyMnNS8BIy8BNSc1JyM1JyMnIy8BNS8BIyc1JyMvAgUPAhUHIw8BFQ8CFQcVBxUPASMPARUPAhUPASMPASMPARUHFQ8BIw8CFR8FMz8ZNS8EIwEPAxUHFxUHFQcVBxUHFQ8IFR8DMz8GNTc1Pwc1NzUzNTc1NzUnNS8DIwUPBBUXFRcVFxUXFR8HFRcVHwIzFR8DMz8ENS8LNSc1JzUnNSc1LwQjEw8EFR8FMx8BFRczFzMfARUfATMXFR8EMxczHwYzPwU1LxcFDxcVHwYzPwgzPwQ1NzM3Mzc1PwE1PwEzPwQ1LwQjAfRBbDEXWHs7Pk4GQzksMTxfHSwxNHhXDSEZTmQdHQ4EDAgPB1lZGx0KQwQODQoFBwYCAgMICAQBCAQmBAgDBAQEBwQIAxoDCAcHAwkFBAQEAwQBBAMHAQMFBAQEBAQJBCYECQUEBAUNsQUDBgcBAwgDARUDAQMDAQkBDAEJCQMDAgECAwMIBAEEAgICAwMIBAUECQMIAwIEAwIDAgMCAwIDAwMCAwMDAwMDAwMGAyMCAwQEAgIFBAgFAYQEBAQDAwMBBgMDAgMCAwIDAgMHFgEEAQQBBgMCAgQEAwQFCQQEBAMEAQICAgECAQIBAgICAQEBCAEBAQICBAECBwMCAQIDAgECBgMJAwMDBAn9xwQIAwMCAgECAQEBAQEBAgEIAgEBAQMDBAQEBQkEAwMEAQIFAwIBAQEBAQECAQECAwMJBAKNBQQEAwQCAgcCAwUCBAECAwwKAwQCBAEBBAMEBAkIBQcDDwIBBgUIAQEBBgECAQIBAgICCQECAgMECAX9rgQEBAMCAgIFBgwGAQwBBgcDAQMDAQcHAwEHBwEDAQMECAQEDAQEBAQJBAQEBQIBAQQEAxUDBAoHGQMKAgMDAwMDAwMCBgMCAwIDAggOAaUEBAEHChwLBxIECwQHBAQHBAgEEAgEAwICAQQEAwQFEQ0EBQQFCAUmBAkEBAQEBAQBBAMBAwEDBAQIBAkEAgIBAgYDBAUEpwUGBgsFDAUFBiYGCggEAgMBAQIGBAkEKwUJBQUFBQoFHgUKBQUFBQoEGAkFBAMEBAEBBAMEByYFBgULBgsG7wQFAwQEAgIIAgwHCAcEAwQDBAMHBgcPAgkCAxEEAwQJCQQEAwQBAgMCAQIDAgECEgEJBAYBAwQDAQMIBAMBAwEDAQgEBAQBBAgBBAoI/fQECAUEAQQEBAwEBAQIAwEDBAMEAwQJAQ8CAQIDAwUCAQQDAwECAwMIBAkFBwUFEAYCBgIPBwYHAwQDBAMEBwgEBAcCAQICAwQIBAKvBAgGAgEBAQEBAggCAQICBAEWAQEEAwwFCQQGBQQDCgIIAQIBAgICBwEBAQEBBAMECAT8pgQECAQCAQEBAgYCAgIBBAEGAgoDBAEDBgQFCQQEBAMEAgESAQIBAgECAgIHAgEBAQECBwMFBJQFBAYCAgECAwMFBAEEDQkBDQEEBQUEAQQFBQoFGQEEARQGBQUFCwoJBQQEAwQBAgMDBAcTBQQFBQQFBQQlHggEBAkMAw0NAhoEBQMBFAQECQgWLAUFBAUFBQQFGwQGBAEBAgMDBAQECQMGBQsFBQUGFAEeBQoFBQQBBAEEBRwNBAEEBQMCAQICAwQIBAI0SXd8Wx4VFmqCbRwVJ0lybB4fDld7NCUrMTU2AxoHBQkZMzMG7wECAgUMBQkEAwYCAQEBAQECAgcCAgMCAgIBAgMDCAUJCAMFAgECAQIBAgICCQIBAQEnAQEDBQIEAQIPAwIBAgkMCQEJBAMDAQMDAQMLBwcJCQQDBAQBAQQDDAMEBgMDAgMDAwMDAwIDAwIDAgMCAwIDBAMWAwMICQkHAwQ8AQEDAwQNBQsCAwMDAwMDAgMDCiMDBwMHBA4LAwcDCAMDAgEBAwIECAkEAgQJBAQEBAQFAwEDAQMEAQMQBAMBAwgDAQoBAwMBAwMBAwMBBgQJAQMCAwMCqwEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEEBAMDAgECAgMECAkFBBIECwQHBAQHBAgEHgQIBAcEBAcEBAkEBAQDBAF3AQIDAwgHBAcEGgMLCwcGBAMHFA8DBwEIBQQFCAMDAgICAgcBAxUBAwsBBxAEBAwEBAQEBAQJBCYFBQgEBAMEoQICAwMECQkJBgEMAQYMBgUDAwIBBAEEAQIFBAICAQEBBAEBAQYBAQECAQECAwcFBAUECAMDCQIBBgMQAwYDAgMCAwIDAgMGAgMDAwMDBwNNAQIBAwYMAwMFAwIBAQEEAwMECQUECAMDAgEBAQECCQICAgECAQIBAQECAgIBAQEEAQEBBQQDBQQFCAgDAgECzgEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHAgoBBAQBAwQDAQMM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AgMHFgEEAQQBBgMCAgQEAwQFCQQEBAMEAQICAgECAQIBAgICAQEBCAEBAQICBAECBwMCAQIDAgECBgMJAwMDBP3DBQQIAwMCAgECAQEBAQEBAgEIAgEBAQMDBAQEBQkEAwMEAQIFAwIBAQEBAQECAQECAwMJAu4FBAgGAgEBAQEBAggCAQICBAEWAQEEAwwFCQQGBQQDCgIIAQIBAgICBwEBAQEBBAMECPynBQgIBAIBAQECBgICAgEEAQYCCgMEAQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUC8AQFBAQDBAICBwIDBQIEAQIDDAoDBAIEAQEEAwQECQgFBwMPAgEGBQgBAQEGAQIBAgECAgIJAQICAwQI/a0ECAQDAgICBQYMBgEMAQYHAwEDAwEHBwMBBwcBAwEDBAgEBAwEBAQECQQEBAUCAQEEBAMVAwQKBxkDCgIDAwMDAwMDAgYDAgMCAwIIAZwFBAQBBwocCwcSBAsEBwQEBwQIBBAIBAMCAgEEBAMEBQwFDQQFBAUIBSYECQQEBAQEBAEEAwEDAQMEBAgECQQCAgECBgMEBf5EBAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQISBQQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgCIX2MfX2MfRd9Xn1+XQGVAQEBAQcCAgQDBAQECQQFBgMCCQIBAQEBAQECBQECAwMIBAUECQMDAwcBAQEBUwECAgQHCQkKAQkHBgcDBAMEAwQHCAcUBA0EBCADAwICAgIDAwgJBQYFBQQBBAEEBRwNBAEIBAEEBAQIAQMBAwEDBAgDAQMEAwEGBAcIAQQEAQMEAwEDDAMBAwEDAQgEBAQBBAQEAQQNFwUFBAEEAQkFCgUMBAUEBAMEAQIFBwweCAQJBBQHCAcEAwQDBAMHBgQDBwUEBAkEBAMEAQICBQwFCQQDBgIBAQEBAQICBwICAwICAgECAwMIBQkIAwUCAQIBAgECAgIJAgEBAScCAwUCBAECDwMCAQIJDAkBCQQDAwEDAwEDCwcHCQkEAwQEAQEEAwwDBAYDAwIDAwMDAwMCAwMCAwIDAgMCAwQDFgMDCAkJBwMEOwECAwMEDQULAgMDAwMDAwIDAwojAwcDBwQOCwMHAwgDAwIBAQMCBAgJBAIECQQEBAQEBQMBAwEDBAEDEAQDAQMIAwEKAQMDAQMDAQMDAQYECQEDAgMDqQEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEEBAMDAgECAgMECAkFBBIECwQHBAQHBAgEHgQIBAcEBAcEBAkEBAQDBC0BBAgEBAQEHgUKBQUFBQkFJwUEBQkKBDIEBQQIBAYCAgYICgUZAQQBFAYFBQULBiYFBgULBgsGFgYJCAMDBBACBggICQYRBQYFBgsFIQYLBQUKBg8BBAEZBQoBBAYCAQEDAgQICQgBKQQFBQQFBQkFIgUJBQUFBQoFFwUEBwICOQECAwMIBwQHBBoDCwsHBgQDBxQPAwcBCAUEBQgDAwICAgIHAQMVAQMLAQcQBAQMBAQEBAQECQQmBQUIBAQDBKABBAMDBAkJCQYBDAEGDAYFAwMCAQQBBAECBQQCAgEBAQQBAQEGAQEBAgEBAgMHBQQFBAgDAwkCAQYDEAMGAwIDAgMCAwIDBgIDAwMDAwdKAQIBAwYMAwMFAwIBAQEEAwMECQUECAMDAgEBAQECCQICAgECAQIBAQECAgIBAQEEAQEBBQQDBQQFCAgDAgEnAQEDBgQJBQQEBAIFAwQJAQYJAwIBAgMCAQIDBAMKAggBAgECAgMBAgMDCAUECQQDAwMEAgECAQIBAgEQEAYCAwUJAwoBAgICDwIDBQYMFAECAQIBAgECBgIGCQQFBAQEAwMCAQEBAgICAQIBCAwDBAMCAQIDAgECEgEJBAMFBAQEBQkEAwMEAAAAAAgAAP+aA7gDIgALABcAHAAgACQAKAAsADAAAAEOAQceARc+ATcuAQceARcOAQcuASc+ARcVESERBTMRIxMVMzUHFTM1BxUzNQcVMzUB9MD/BQX/wMD/BQX/wKzjBATjrKzjBATjFQEu/ur+/hrKysrKysrKAyIF/8DA/wUF/8DA/ywE46ys4wQE46ys49EM/pABfBj+tAEnGRlKGBhVGBhNGBgACgAA/6IDuAMgAA0AGgApAGQAzQFWAbMB+gJEArAAAAEiDgEeAjc+AiYnJgcyHgEGBwYuAjc+ARcGBw4BFxY2OwE1IzY3JgMrAQcjByMHFQ8FFR8FMz8DMzczNzM3MxczFzMXMx8BMz8DNS8EIzUjJyMnFw8GFR8KMx8GFR8CMx8NMz8ENS8BNScjLwYjLwE1Iy8LIy8BIy8HIzUnNS8EIwUPASMPBBUPBBUHIwcVDwMjFQcVByMVDwQVByMPARUPAhUPAiMPAxUPAxUHFQ8KFQcVHwQ/BDM/BDU/JjUvAwEPBRUXFQcVBxUHFQcVBxUHFQcVBxUHFQcVBxUPBxUfBD8FMz8BMz8BNT8BMzczNzU3NTM1NzU3NTc1NzU3NTc1NzU3NSc1LwQFDwUVFxUXFRczHwUzHwEVFxUXFRcVMxcVFxUfBD8ENS8NNSc1JzUnNS8DAQ8XHwQ/BDM/AzM3MzczNzM3Mzc1NzM3NTczPwIzNzM1PwM1LwQFDwUVHwMVHwEzHwIzHwIVHwEzHwEVHwEzFzMXMxczHwIzFzMXFTMfBzMXFRczFTMXMz8ENS8EIycjJyMnIy8KIy8EIy8FIwH0QWwxF1h7Oz5OBkM5LDE8Xx0sMTR4Vw0hGU5kHR0OBAwIDwdZWRsdCj8HDQYNDQcnDQ4EAwMEAQIDAwkEBQYMBhcGCwYGBgYpBgYGBgYFHwQFDAMDAgIGAwonBgcGDQfpBQQEAwMBAgICBgICAwYFBAMIAQ4CCAIGAgQBAgIBAgMCAwUEAwQDCgUGAwkECQQEAwQCBAYBBAMCAwIDAgECCAEFAwQCBAICBQIHAgIBAgkBAgIDBwMCAwIBAgMCBgIKBf3zBQcBAgMCAwIDAgMCAwQBAgIDAgQBBAQBAgICAgICAQICAgQCAgQBAQECAwICCgECAgIBBAECAQIBAgECAgEEBAMOBAgEAwEBAgMBAgICAQIBAgECAQICAwIBAggCAQICAgEEAgQBBgIKAgYDCgMGAwUDAgEEBggFArIEBQMGAgEBAQEBAQEBAgEDBQMFAwQDAgYDAQIDBgQJCQQEAwIBAQMCAQIDAwIBBQEMAwECAQEBAQEBAQEEAwQECPymBAUDBAQBAQMCAQMCAQQBCgEEAwIDAgECAwECBAcJCQQEAwQCBAIDAgcEAQYBAgECCAEBAQEFCAgCsQQECQQFCgQPBQULDwYFCwUhBgsQCAQFAgIEAwQNCQYGFAUBEgYHBQEFAQUBBQEcAQsFAQUFAQULDwEEAQMDAgEEAwQECP3eBAQEAwICAQIDBA0CAQIDAgECAwMLAgEIAwMFAQIBAgECAQIDAwECAQIBAgQDBgMNAx0CAw0EAw0JBQgFAgEEAwQEAwQIAxQCEQMJBRECBgUDBQUFAgEPAgUCAgEEAwQRBAQFAjRJd3xbHhUWaoJtHBUnSXJsHh8OV3s0JSsxNTYDGgcFCRkzMwYBSgECBgECBAIDBAgJBQQEAwQBAgICBAIBAQEBAQUBBgQDCQUICAIEBgEBAU8BAQMDBAQEBQkEBgECAQYDBAIIDgMIAwYDBAECAgMEAwQDBwcDCAMSCggCBAICAwMICgcHAQwIBAQEBAQEBAsBBwMGAgYCAwUDBwMCAwkDAgIHAgICAgEBAQICBAIFDAEEAgICAgIBAgICAgIBBAIBAgIDBAEEAQQBAgMCAwIBAgMCAQIGAgECBgMDAgUCAQIPAwIBAgECAwYDAwMDAwMDAwEECQUIAwMDAQQDAwQGBQMCBQECAwIDAgMCAwMCBQIDAgwCAwIDAgMEAwQDBgMKAwYCCgEGAgUEBAQJCQYEAf7GAQICCAQEBAQzAwkDBgIGAwMDAwMDBgIDAwkCDgMIAQ0FCwUGCgcEBQkEBgICAgIDAwMDBgYGBQEFBw8mAwoDAwcDAwQDAwQDAwQDBwMOAywFCQgEAgMCEwECAwMIBBsGBxMHDRMGBw0GHw0FAQUBBQEFAQUBBQEBBAQEAgICAwMJCQgGBgUGEAsGEQUGBgUvBgUGBgwGBwUHBgL+sgECBgQEBgQJBAMFCQIDBAMMAQQDBAMHCQkIAwMDAgIBBgIGAwIDAgMDDwYBAwMBAwQHDAQBAwQEBAkIBAMCAgIBAwIEBAkEBQQEAwEKAgICAgICAQEHAgUBAQEDAgIBAgECAQEBAQECAgIEAgkBAQQBBAEEBwUECQgEAgMBAwcGAwMGAgIDAQMCAwIJAgMCAQQBBA0BAgAAAwAAAAADUgKgAAMABwALAAATFSE1ARUhNQEVITWWArz9RAK8/UQCvAKggoL+/4KC/v+CggAAAAACAAAAAANvAoQAVQCrAAABIgc5AQYPAQYHOQEOARU5ARQWFzgBMR4BMxY3OQEyNjUxNiYrATUzMjY3NiYHIzUhPgE0JgchNTMxPgE1OQE0JisBByMiJyMiMDQHNj8CPgEnMSYnBzIXFhc5ARYGBzkBBg8CBgcGFhczFjM3MzEyFhQGKwEVITIWFAYjIRUhMTIWBzkBDgEjIRUzMhYVOQEOASMGJzkBIiYnOQEuATUxNDY3Njc+ATcxNgHMCwsrVHYrEggCAwUPTjrc2xIWARcSvfwTGQMGGRr+AS4YFRcW/tLiFhgYFmRyXhMLCwEBBQouEAsDCQoOBAIBCwoIAwoFChgXCgUBAgMNCxPQZBQVFBXnATMVExIW/s0BAxgVBQMVEv7/whIRARER29w5Sw8EAwIIEikjpyoLAoQIHDpRHzgdPh0VJRU/PwEBFRYXEhUOERsdARMBGS8XARMBGRgXGgEBAgEGCi4RECQOEAEEAQEODCEPBgoXFwsFBAUBAQEWLBcdEysXHRgZEAsfDxUUEgEBPT0VJBUdPhs3Hhd0HAcAAAADAAAAAAN4AoQAEgAVABsAABMwIjEGFREUMyEyNRE0JzgBMSEFIQUlBTMlESFzAQIDAwMCAv4f/ucC8f6H/oEBfgIBfv0CAoQBAv26AgICRgIBBeTi5+f9wQAAAAMAAP/dA3UC3wAEAAgAFAAAExURIREFIREhAREhFSERMxEhNSERcwMC/QgC7v0SAWP+6AEYKAEY/ugC3wX9AwMCCv0SAqP+6Cj+6AEYKAEYAAAAAAQAAP+HA78DIgAQACAALAA4AAABDgISFgQ3PgE3NiYnLgEjFx4BFxYGBwYkJyYCNz4BMwcVIxUzFTM1MzUjNQczFTMVIxUjNSM1MwHwh+BpMLoBAn6BpAgHiXgvZjQIhdIlIlRpcP7xamc/MzDJekZ9fYx9fXVefX1efX0DIgKW+P72wj4sLtyJh+g9FxgxA6KAe/FLTwtWVQEEe3CG0H2MfX2MfRd9Xn1+XQAEAAD/hwO/AyIADwAeACYALQAAAQ4CEhYENz4BNzYmJy4BBzIWFxYGBwYkJyYCNz4BBQYHJwM2NxcDFhc3BycHAfSJ4mkwugECfoGkCAeJeC9mNIfXJiJUaXD+8WpnPzMwyQEnMzOAdEFBhok9PR4dfDIDIgGW+f72wj4sLtyJh+g9Fxgxo4J78UtPC1ZWAQN7cIbSaGmm/qpTVJoBBk5MQ3SRTQAAAAAGAAD/jQPNAyIADgAdACwAOwA/AEQAAAEGBAcGFhcWJDYSAiYnJgc2FhcWBgcGJCcmEjc+ARciBgcGFhcWNjc2JicuAQceARcOAQcGJicmNjc+ARcGByEDFhchNgHzqv8AFhCGgXwBEc5HWtWHERed6REMkIKB/vxPTQdYOZ9hkNIHBJ+AeN04NSxcMXpDf7YCAZl2b74jH0teJFEqYGABgMBLTP7STAMiAuGpj/1BPCK4AQgBAqUKAjEB0JuK6jAtT29xARBpRE4ryJCDzx0XaG1t8FErMDABtH92sw8MdmtozTcVFmOsrQEmh4eHAAAGAAD/jQPNAyIADgAdACwAOwBDAEsAAAEGBAcGFhcWJDYSAiYnJgc2FhcWBgcGJCcmEjc+ARciBgcGFhcWNjc2JicuAQceARcOAQcGJicmNjc+ARcGBycDNjcXAxYXNwcnBgcB86r/ABYQhoF8ARHOR1rVhxEXnekRDJCCgf78T00HWDmfYZDSBwSfgHjdODUsXDF6Q3+2AgGZdm++Ix9LXiRR1zMzgHRBQYaJPT0eHXwaGAMiAuGpj/1BPCK4AQgBAqUKAjEB0JuK6jAtT29xARBpRE4ryJCDzx0XaG1t8FErMDABtH92sw8MdmtozTcVFnZoaab+qlNUmgEGTkxDdJEmJwAAAAADAAD/jQPMAyMADwAeACYAAAEOAQcGFhcWJDYSJy4BJyYHMhYXFgYHBiYnJjY3PgEXBgcXNRcRBwHrqfsUD4qCegEMzEorLNqLEwl9swYDjHFuxyknSGMkUBppaNHKygMiBeSnj/0/OiO0AQWBhKoJAY6tfXK1FhNqaWrYOhUWokpKlI+PASiPAAAAAAQAAP/wA6sCzAAPACMAJwA0AAATDgEHER4BFyE+ATcRLgEnBSEeARcRDgEHIxEhESMuAScRPgETIREhNx0BIxUzFTM1MzUjNdhCVwICV0ICOUFXAgJXQf3HAjktPAEBPC10/q5zLjsBATvAART+7HNNTS5NTQLMAldB/lhBVwICV0EBqEFXAjABPC3+WC08AQE0/swBPC0BqC08/pr+7O0XNi5NTS5NAAQAAP/wA6sCzAAPACMAJwArAAATDgEHER4BFyE+ATcRLgEnBSEeARcRDgEHIxEhESMuAScRPgETIREhNxUzNddBVwICV0ECOkFXAgJXQf3GAjotPAEBPC10/q50LTsBATvAART+7CXLAswCV0H+WEFXAgJXQQGoQVcCMAE8Lf5YLTwBATT+zAE8LQGoLTz+mv7rpy8vAAAAAgAA//ADqwLMAA8AHwAAEw4BBxEeARchPgE3ES4BJwUhHgEXEQ4BByEuAScRPgHXQVcCAldBAjpBVwICV0H9xgI6LTwBATwt/cYtOwEBOwLMAldB/lhBVwICV0EBqEFXAjABPC3+WC08AQE8LQGoLTwAAAADAAD/jQPMAyMADwAeACYAAAEOAQcGFhcWJDYSJy4BJyYHMhYXFgYHBiYnJjY3PgEXBgcnAzY3FwHrqfsUD4qCegEMzEorLNqLEwl9swYDjHFuxyknSGMkUNczM4B0QUGGAyIF5KeP/T86I7QBBYGEqgkBjq19crUWE2ppatg6FRZ1aGmm/qpTVJoAAAYAAP+NA80DIgAOAB0ALAA7AEQATQAAAQYEBwYWFxYkNhICJicmBzYWFxYGBwYkJyYSNz4BFyIGBwYWFxY2NzYmJy4BBx4BFw4BBwYmJyY2Nz4BFw4BBz4BNxcmJxYXJw4BNT4BAfOq/wAWEIaBfAERzkda1YcRF53pEQyQgoH+/E9NB1g5n2GQ0gcEn4B43Tg1LFwxekN/tgIBmXZvviMfS14kUSoiOCIgPCB9Pz0iIkQRMRIeAyIC4amP/UE8IrgBCAECpQoCMQHQm4rqMC1Pb3EBEGlETivIkIPPHRdobW3wUSswMAG0f3azDwx2a2jNNxUWb2PKYyFFIYfIdW1uShE6BzVrAAcAAP+VA8cDIgARACEAMgBDAFIAYABvAAABIiMOAQcGEhYENz4BJy4BJyYHMjMeARcWBgcGJCYCNz4BFyIjDgEHBhYXFjY3NiYnLgEHMjMeARcWBgcGJicmNjc+ARcOAh4CNz4CJicmIxceAgYHBi4CNz4BMxcGBw4BFxY2OwE1IzY3JgHzAQKc8iYeXeABE3ZxcRMWt4U2PQUFkN0bFnBzeP70vB5GN7RwBQWFxhIOgXZw5UhJCFIzjVADA3atDQp/bGrLNDMvWiliL0BqMBdYezs+TgZDOSwxBDtcHSwxNHhXDSEZTi03HR0OBAwIDwdZWRsdCgMiA8GWhf7/ogpJSfOGh8oiDjECu46B6z8/KccBD3VYZyoEsoR81iwoRGBl+186Qi8DoXVwux8dVmFl3kUgIWEBSHd8Wx4VFmqCbRwVJwFJcWweHw5XezQlKzE1NgMaBwUJGTMzBgAAAAAEAAD/hwO/AyIADwAeACcAMAAAAQ4CEhYENz4BNzYmJy4BBzIWFxYGBwYkJyYCNz4BFw4BBz4BNxcmJxYXJw4BNT4BAfSJ4mkwugECfoGkCAeJeC9mNIfXJiJUaXD+8WpnPzMwyXoiOCIgPCB9Pz0iIkQRMRIeAyIBlvn+9sI+LC7ciYfoPRcYMaOCe/FLTwtWVgEDe3CGy2PKYyFFIYfIdW1uShE6BzVrAAAABAAA/4cDvwMiAA8AHgAiACcAAAEOAhIWBDc+ATc2JicuAQcyFhcWBgcGJCcmAjc+ARcGByEDFhchNgH0ieJpMLoBAn6BpAgHiXgvZjSH1yYiVGlw/vFqZz8zMMl6YGABgMBLTP7STAMiAZb5/vbCPiwu3ImH6D0XGDGjgnvxS08LVlYBA3twhr+srQEmh4eHAAAAAAcAAP/TA9QC6QAPAB8AJAAoACwAMAA0AAATDgEHER4BFyE+ATcRLgEnBSEeARcRDgEHIS4BJxE+ARcdASERBTMVIzchFSEHMxUjNyEVIddSbwICb1ICOlNuAgJuU/3GAjo6TAEBTDr9xjpMAQFMFgH4/iGMjKUBIf7fpYyMpQEh/t8C6QJuUv5uUm4CAm5SAZJSbgI8AUs6/m46SwEBSzoBkjpLR76+AXyEQ0NDGYODgwAAAAYAAAAAAwUChAAYADIAOgBCAEoAUgAAAQcOAR4EBg8BIT4BNzYuBDY/AQUhBgcGHgQGByE+ATc2LgMnPgE3NhcGFBczNjQnBwYUFzM2NCcHBhQXMzY0JwcGFBczNjQnAYECVEgBLj0wCDhLEwGHJzQQHgkyPSwBRFMS/n8BWEcgJQIuPTAINkz+qCAsDh8LMjwsAQEPESIhBgbNBga5BQW8BQV9BgbQBganBQXQBgYChAEzVkxBPDo+SS0KFyoUJ0c9PD1DUTMLDCwnK0xBPDo+SC0UJREnRz08PSIQJRUpNQEJAQEJAXMBCgEBCgF0AQkBAQkBcwEKAQEKAQAAAAACAAAAAAN4AoQAAgAHAAATBSUFESERBXABhAGE/PgDCP58AoTW1mn+HQHjwQAAAAACAAD/0wPUAukADwAfAAATDgEHER4BFyE+ATcRLgEnBSEeARcRDgEHIS4BJxE+AedZeAICeFkCGll4AgJ4Wf3mAhosOAEBOCz95iw4AQE4AukCdlj+ilh2AgJ2WAF2WHYCbgE3Kv6KKjcBATcqAXYqNwAAAAUAAP+aA7gDIgALABcAJgA0AEMAAAEOAQceARc+ATcuAQceARcOAQcuASc+ARcOAh4CNz4CJicmIxceAgYHBi4CNz4BMxcGBw4BFxY2OwE1IzY3JgH0wP8FBf/AwP8FBf/ArOMEBOOsrOMEBOOoQGowF1h7Oz5OBkM5LDEEO1wdLDE0eFcNIRlOLTcdHQ4EDAgPB1lZGx0KAyIF/8DA/wUF/8DA/ywE46ys4wQE46ys47kBSHd8Wx4VFmqCbRwVJwFJcWweHw5XezQlKzE1NgMaBwUJGTMzBgAAAAAFAAD/hwO/AyIADwAeACMAKgAwAAABDgISFgQ3PgE3NiYnLgEHMhYXFgYHBiQnJgI3PgEHFBUhEQUyMw4BByY3FBUhNRcB9IniaTC6AQJ+gaQIB4l4L2Y0h9cmIlRpcP7xamc/MzDJUwGa/sFych49HjXY/sicAyIBlvn+9sI+LC7ciYfoPRcYMaOCe/FLTwtWVgEDe3CG95ycATgxFDoHKw5dXbp9AAAEAAD/jQPNAyIADwAeAC0APAAAAQ4BBwYWFxYkNhInLgEnJgceARcWBgcGJicmEjc+ARcOAQcUFhcWNjc2JicuAQceAQcOAQcGJicmNjc+AQHwqf4WEIaBfAERzkctLdKFFg2c5A4KloN//05NCFg6pU+PzAWjgHbZNzUsXTN/NYCyAQOZdG++Ix9LXyZTAyID4aiP/UE8IrgBCIJ+pgsCMQLVm4roLSlQbXEBEWlGTS0Fy5CCzBoVaGxu8FEtLjEEt4B0rg8MdmtozTcWFgAABgAA/40DzQMiAA4AHQAsADsAQwBLAAABBgQHBhYXFiQ2EgImJyYHNhYXFgYHBiQnJhI3PgEXIgYHBhYXFjY3NiYnLgEHHgEXDgEHBiYnJjY3PgEXFBUjFTMVNycWFwc1IzUzAfOq/wAWEIaBfAERzkda1YcRF53pEQyQgoH+/E9NB1g5n2GQ0gcEn4B43Tg1LFwxekN/tgIBmXZvviMfS14kUVzi4qWJMzNm398DIgLhqY/9QTwiuAEIAQKlCgIxAdCbiuowLU9vcQEQaUROK8iQg88dF2htbfBRKzAwAbR/drMPDHZraM03FRZ0MjK+ZMN6PD15NoUAAAAAAwAA/40DzAMjAA8AHgAnAAABDgEHBhYXFiQ2EicuAScmBzIWFxYGBwYmJyY2Nz4BFw4BBz4BNxcmAeup+xQPioJ6AQzMSiss2osTCX2zBgOMcW7HKSdIYyRQKiI4IiA8IH0/AyIF5KeP/T86I7QBBYGEqgkBjq19crUWE2ppatg6FRZuY8pjIUUhh8gAAAAABQAA/6wDtgMbAAgADAAQABQAGAAAARURITUjETM1AQcXNw8BFzcPARc3DwEXNwKlARHg4P6eSzxL00s8S9JMPEvSTDxMAxsZ/LExAwUy/n48SzwsPEs7LDtMPCw8SzsAAwAA/6wDrgMbAAsARwBTAAAFDgEnLgE3PgEXHgEBMRcHJzcGJwcnNxcmJwcnNxcmNyc3FxU2NyEOAQcRFwc2PwIXIxYXNxcHJxYfAgc1BgcXITI2NxEGJw4BJy4BNz4BFx4BAYQ3kjk2AzY4kjk2AQHBFVUpAy0wKFUUASYaTSNDAgcHRCNNEBX+RRgfATQBJywLWgwDLCg9QC4BGglNAk0KFyoBaBgfARQBIIpJSDgcIIpJSDkWNQM0OJI4NwI1N5IBW00jRAEJCUQjTQEbJRRVKAItLyhVEwQWEwEgGP6OJgEaCU0BTAkYLz8+AScrCloNAywoNSAZAb0Ufkg4HCCJSUg4HCCIAAAAAAQAAP+aA7gDIgAQABQAagBvAAABIgcBBhQXARYyNwE2NCcBJgcJAiUxDwMVLwIPBB8CIw8DFR8DMw8CHwQ/AhUfAzM/AzUfAj8ELwIzPwI1LwIjPwIvBA8CNS8CBzA5ATAB9A4M/mEKCgGfCx4LAZ8LC/5hCw8Bhv56/noBfQQEAgFjAwQEBA0CAQECY4wEAwIBAQIDBIxjAgEBAg0EBAQDYwECBAQSBAQCAWMDBAQEDQIBAQJjjAQDAwMDBIxjAgEBAg0EBAQDYwECBIsDIgv+YQseC/5hCgoBnwseCwGfCz7+ev56AYbGAQIDBIxjAgEBAg0EBAQDYwECBAQSBAQCAWMDBAQEDQIBAQJjjAQDAgEBAgMEjGMCAQECDQQEBARiAQIEGgQCAWMDBAQEDQIBAQJjjAQDAzAAAAAEAAD/mgO4AyIAEAAUABoAHwAAASIHAQYUFwEWMjcBNjQnASYHCQIlDwEXITcnFwcjJwH0Dgz+YQoKAZ8LHgsBnwsL/mELDwGG/nr+egGGB9BSAQpS17tI5kgDIgv+YQseC/5hCgoBnwseCwGfCz7+ev56AYbgBZf9/X6H3NwAAAIAAP+aA7gDIgAPABMAABMGFBcBFjI3ATY0JwEmIgcJAzsKCgGfCx4LAZ8LC/5hCx4L/pQBhgGG/noBeAseC/5hCgoBnwseCwGfCwv+RwGG/nr+egAAAAAEAAD/mgO4AyIAEAAUACAALAAAASIHAQYUFwEWMjcBNjQnASYHCQIlDgEHHgEXPgE3LgEHHgEXDgEHLgEnPgEB9A4M/mEKCgGfCx4LAZ8LC/5hCw8Bhv56/noBhll3AgJ3WVl3AgJ3WU9qAgJqT09qAgJqAyIL/mELHgv+YQoKAZ8LHgsBnws+/nr+egGG0gJ3WVl3AgJ3WVl3FQJqT09qAgJqT09qAAADAAD/jQPMAyMADwAeACoAAAEOAQcGFhcWJDYSJy4BJyYHMhYXFgYHBiYnJjY3PgEXDgEXHgE3PgEnLgEB66n7FA+KgnoBDMxKKyzaixMJfbMGA4xxbscpJ0hjJFAqdIcgJNhhXwhaHkoDIgXkp4/9PzojtAEFgYSqCQGOrX1ytRYTamlq2DoVFlEBuHBuS0BD5UkYGgAAAAMAAP+NA8wDIwAPAB4AIgAAAQ4BBwYWFxYkNhInLgEnJgcyFhcWBgcGJicmNjc+ARcGByEB66n7FA+KgnoBDMxKKyzaixMJfbMGA4xxbscpJ0hjJFAqYGABgAMiBeSnj/0/OiO0AQWBhKoJAY6tfXK1FhNqaWrYOhUWYqytAAAAAgAA/5YDxwMiAA8AHgAAAQ4BBwYSFxYEPgEnLgEnJgceARcWBgcGJicmNjc+AQHwnPQlHWJwbwEP5XMTFr6KMil0qw8MdWlozjg5Kl0qZQMiA8SYhv8AUE4Jj/SGi84fC44Cm3JuvCQhTF9l5kggIQAAAAADAAD/jQPMAyIADQAcACQAAAEOAQcGFhcWJDYSAiYnBzIWFxYGBwYmJyY2Nz4BFwYHFyE2NyYB66n7FA+KgXsBDMxKV9qLHH2zBgONcG7HKSdIYyNRKmtsUgEKKihrAyIF5KiP/D86I7MBBgEEqwmNrX1ztBYTamlq2DoVFlZOTv1/fk4AAAAABAAA/40DzAMjAA8AHgAjACkAAAEOAQcGFhcWJDYSJy4BJyYHMhYXFgYHBiYnJjY3PgEHFhc2NwUUFSERBwHrqfsUD4qCegEMzEorLNqLEwl9swYDjHFuxyknSGMkUH1WVVRW/oUBmskDIgXkp4/9PzojtAEFgYSqCQGOrX1ytRYTamlq2DoVFppFRUVFIIyMARKjAAMAAP+NA8wDIwAPAB4AJgAAAQ4BBwYWFxYkNhInLgEnJgcyFhcWBgcGJicmNjc+ARcUFSMVMxU3Aeup+xQPioJ6AQzMSiss2osTCX2zBgOMcW7HKSdIYyRQXOLipQMiBeSnj/0/OiO0AQWBhKoJAY6tfXK1FhNqaWrYOhUWczIyvmTDAAcAAP+NA80DIgAOAB0ALAA7AEAARwBNAAABBgQHBhYXFiQ2EgImJyYHNhYXFgYHBiQnJhI3PgEXIgYHBhYXFjY3NiYnLgEHHgEXDgEHBiYnJjY3PgEHFBUhEQUyMw4BByY3FBUhNRcB86r/ABYQhoF8ARHOR1rVhxEXnekRDJCCgf78T00HWDmfYZDSBwSfgHjdODUsXDF6Q3+2AgGZdm++Ix9LXiRRowGa/sFych49HjXY/sicAyIC4amP/UE8IrgBCAECpQoCMQHQm4rqMC1Pb3EBEGlETivIkIPPHRdobW3wUSswMAG0f3azDwx2a2jNNxUWm5ycATgxFDoHKw5dXbp9AAAAAAUAAP+NA80DIgAOAB0ALAA7AEMAAAEGBAcGFhcWJDYSAiYnJgc2FhcWBgcGJCcmEjc+ARciBgcGFhcWNjc2JicuAQceARcOAQcGJicmNjc+ARcGBxc1FxEHAfOq/wAWEIaBfAERzkda1YcRF53pEQyQgoH+/E9NB1g5n2GQ0gcEn4B43Tg1LFwxekN/tgIBmXZvviMfS14kURppaNHKygMiAuGpj/1BPCK4AQgBAqUKAjEB0JuK6jAtT29xARBpRE4ryJCDzx0XaG1t8FErMDABtH92sw8MdmtozTcVFqNKSpSPjwEojwAEAAD/hwO/AyIADwAeACYALQAAAQ4CEhYENz4BNzYmJy4BBzIWFxYGBwYkJyYCNz4BFwYHFyE2NyYnFhcHIyc2AfSJ4mkwugECfoGkCAeJeC9mNIfXJiJUaXD+8WpnPzMwyXprbFIBCiooa2xdXkjmSF4DIgGW+f72wj4sLtyJh+g9Fxgxo4J78UtPC1ZWAQN7cIazTk79f35OMENE3NxEAAAAAAUAAAAAAu4CpAANABMAFgAeACUAABMVFDERIREwMTUiMSc1BSEVMxEhARcjJx0BIxUzFTcnFwc1IzUz+gH0Aab+uAFDp/4WAUienpdwcFhTTExwcAKkAgH9dwHmAqICBaP+IQJ+mjUGM1c5ZFhYVzFNAAAABAAA/9MD1ALpAA8AHwBlALgAABMOAQcRHgEXIT4BNxEuAScFIR4BFxEOAQchLgEnET4BFzEiBzkBBg8BMQYHIw4BFTkBBhcwMR4BMyExMjc2NTE0JyYnMzI3NjcxNicmJzMyNi4BByM3NjU5ATQmKwE3PgInMSYnBzIxNhc5ARYGDwEGBwYfARYXFjEzMTIWFAYjBxUXMhYVFAYHIxUzMTIXFgc5AQYjBisBFTMeARU5AQ4BByExIiYnOQEuATUxNDY3NjcxPgE3NjLXUm8CAm9SAjpTbgICblP9xgI6OkwBAUw6/cY6TAEBTOILCRw3Th8MAQYBAQcKOSkBIA8LCQoDAxcNDAsDBQwDBQkSFQEWEB0HChUR1AsREwIICA0EAQQEAwEFGBEJBQMDAgQC5woICAqg0gwGBgzSsg0EBAICAwQLsYcLBAEECv7gJCsKAwICBAsZFm8cBAQC6QJuUv5uUm4CAm5SAZJSbgI8AUs6/m46SwEBSzoBkjpLRAYSJDMVJhQoEhgcKC0JCw8RCgMBBQgNFQ0DAxciFAEGDBERFgsQFhwMDAIUAQcFDwcYEQkHBQQCAQEIFggBIgEGCgwHASMFAg0IAyQBAwoLBAEiJAwXDRIlECAQD0kRAwAACgAAAAADHQKGAEsAfgCXAPEA9QD4AZsCMwI3AjsAAAEdAQYHOQEGBycHFwYHIxUzHgEXBxc3FTcWFxYXFRcHFzcWFxUzNTY3OQE2Nxc3JzY3MzUjJicxJic3Jwc1IyYvATUjMDE3JwcmJzUHMxUzFh8BNxcHFyMVLgEHDgEXMRYXIxUHJzcnJicxJi8BIzUzNTY/ASc3Fzc2NzE2PwEXMhYXFQYHOQEGBycHFwYHIyYnMSY2NzE2FzsBFQczFxYXMRYfATIfATcXBxcWFzEWFxUzFQ8BBg8BFwcnBw4BDwEVIzUjJi8BByc3My8CJicmNCMnNCYnNScmJzUwMSc1BzUzNzY/ASc3Fzc2NzE2NzM3FhUjFxUnByIjMTA5AiIxIxUiBw4BBzEwFDA5ATAxFTAxFTgBOQEGFTE4AzEVOAE5ARYVMTAVMRYVMTA5ATAUOQEwOQEUFzEwMRUUFzE4ATkBFBc5ARQxFxYVMTA5ARYVFzAUMRYXOAEUMR4BNz4BJyYnMTA5AiYjMTQxJzAxJzAxJyYjMTQrASY5ASInMTAxIzAnIyIxJzArATA5ASInMSIxIzAxBzEzMDsBMjkBFjMxMjEzMDMxMBcxMjEzMBczMjEXMjkBFjMxMDkBFjMVMTIXMTAxFzAxFzMyFTEyFTEWFxYGBzEGJic4AzEnOAEmMDEnMC4BMDEmNTE0MCY1MTAxNTgBOQEmPQEmNTE4ATQxJzAxNTQnMTgBPQE4AzkBNDcxMDkBOAIxNTgCOQE+ATcxNjMxNDMHMRUnFxYXJwGMEBAPDiY1JhIHNTUEDQknNiUhDAsCBQ4kNiYdIUsRDw8OJzUmEgc0NQMHBgolNiQgDAoHESQ2JB0gR0ICIh0CIy8kATUYSyYtIhINGiIlLyYBCQcHAwE0NAcTASUvJAIOEBEQAiAdMhARDxANJjUlEgcJHw4RISoVeDkJAQIJDAoRDQEBAQEkLyQBCgcGBDQzAQYUASYuJgINIRECQQIjHQEmLyQDAQIDBAMBAQIBAQEEAwI1NAEGFAElLiUCDhAREAJGAgI5EE0BAgEFEhIdJAQBAQEBAQECAQECAQMWUCosIhERIgECBAMEAQIBAgEDBAMBAwEDAQMBAgEEAwMBAgECAQEDAQIBAwECAQYBAgEBAwIBAwMBAgEgEBEhKihNFQMBAQEBAgEBAQEBAQQiHBERAaoFEwQGCgKGAzEEBgcJJTUlHSBMDyANJjUkDwEFAwoMIQEjNSYSBzY2BAYHCSY2JR0hSxAPEA0lNSQQBAMWHyU1JRMGNAUzBxMBJC4kASEgFg8UVC0fEjYkLiUCDhARDwJCAiIdASUuJAEKBgcDAUAbGQoDBwYKJTUlHCERIitQEwgOGxgCAwQGCQEBASQuJAINEQ8RAkEBAiEeASUvJQEJDgMBNTUIEgElLiMCAgYGBgICBAECAQIBCwoBBwMBQgIiHQIkLiQBCgYHBAoDAw0JCTIBCA0wHgEDAQMFCAQEAQECAQECAQEDAQIBBwEBAQIDAQQDASUcEBRVLCYSAQEBAgEBAQECAQEBBQEBAQIBAQEBAQIBAREkK1ATEBskBwEDAgIEAwECAQECAQECAQEDAQQDAQcEBAQcLwwIAZMCAikJCQEAAAMAAAAAAwsChAAiAEQAZQAAAQcOAQceARcOAQcGBw4BBxUzFjchNTQmJyYnLgEnPgE1LgEHMhceATcWFRQGDwEXHgEXDgEHLgEnPgE/AScuASc0Nz4BFxYXHgEXFhcVIzUjFSE1NCIHFSM1Njc+ATc2Nx4BFz4BAewFQEsBASIXDTIeIxsMEAFiAgEByRANHCQgNg0VGwFNZxQULkwKARwWBgcFJhoDVkFAVgMbKQYHBhckAQEIN+kPDxEhDBoBWgj+owcBVwIZDB8RCQoEWUFCWQKEAQFNPR0zFAQUERIaDR0QzAEBzA4bDBoTEhcFFDIdPU5RChcSBwYIHTISBQICDww2SAEBRjYNDwICBRMyHQgHCCC/BwkKFgsZF8SQkJAFBZDEHBgMFgkGBDdHAQFJAAAABQAA/9MD1ALpAA8AHwAzADcAPgAAEw4BBxEeARchPgE3ES4BJwUhHgEXEQ4BByEuAScRPgEXIjEiBhURFBYzITI2NRE0JiMwMQU7AQcnFxY/AREh11JvAgJvUgI6U24CAm5T/cYCOjpMAQFMOv3GOkwBAUwkAQUHCAUB9AUHBwX+O83Iyu7nBwbn/iUC6QJuUv5uUm4CAm5SAZJSbgI8AUs6/m46SwEBSzoBkjpLQgcF/psFCAgFAWUFBxl0a4QDA4T+vQAAAAADAAAAAALuAqQADgAUABcAABMVFDERIREwMTUiMSc1IRchFTMRIQEXI/oB9AGm/rYCAUOn/hYBSJ6eAqQCAf13AeYCogIFo/4hAn6aAAAAAAIAAP+HA78DIgAQACAAAAEOAhIWBDc+ATc2JicuASMXHgEXFgYHBiQnJgI3PgEzAfCH4GkwugECfoGkCAeJeC9mNAiF0iUiVGlw/vFqZz8zMMl6AyIClvj+9sI+LC7ciYfoPRcYMQOigHvxS08LVlYBA3twhgAAAAUAAP+NA80DIgAOAB0ALAA7AEQAAAEGBAcGFhcWJDYSAiYnJgc2FhcWBgcGJCcmEjc+ARciBgcGFhcWNjc2JicuAQceARcOAQcGJicmNjc+ARcOAQc+ATcXJgHzqv8AFhCGgXwBEc5HWtWHERed6REMkIKB/vxPTQdYOZ9hkNIHBJ+AeN04NSxcMXpDf7YCAZl2b74jH0teJFEqIjgiIDwgfT8DIgLhqY/9QTwiuAEIAQKlCgIxAdCbiuowLU9vcQEQaUROK8iQg88dF2htbfBRKzAwAbR/drMPDHZraM03FRZvY8pjIUUhh8gABgAA/40DzQMiAA4AHQAsADsAQwBKAAABBgQHBhYXFiQ2EgImJyYHNhYXFgYHBiQnJhI3PgEXIgYHBhYXFjY3NiYnLgEHHgEXDgEHBiYnJjY3PgEXBgcXITY3JicWFwcjJzYB86r/ABYQhoF8ARHOR1rVhxEXnekRDJCCgf78T00HWDmfYZDSBwSfgHjdODUsXDF6Q3+2AgGZdm++Ix9LXiRRKmtsUgEKKihrbF1eSOZIXgMiAuGpj/1BPCK4AQgBAqUKAjEB0JuK6jAtT29xARBpRE4ryJCDzx0XaG1t8FErMDABtH92sw8MdmtozTcVFldOTv1/fk4wQ0Tc3EQAABAAAP+gA7sDIgAIABEAHgAsADsASQBYAGYAdQCEAJMAogCvAL4AzADbAAABDgEHPgE3FyYnFhcnDgE1PgETDgEHBhY3NhcyNicmFyIGFx4BFxY2Jy4BJyYFDgEHDgEHBhY3PgE3NiY3IgYHBhY3NhYXFjYnJgcOAQcOAQcGFjc+ATc2JgUiBhceARcWNicuAScmBSIGBwYWFxY2Jy4BNzQmBSIGFxYGBwYWNz4BJy4BBSIGFx4BFxY2Jy4BNy4BBSIGFQ4BBwYWNz4BNy4BBQ4BFx4BFxY2JyYnJgUOAQcOAQcGFhc+ATc2JgUOARceARc+AScuAScmBQ4BBw4BBwYWNz4BNzYmAfQiOCIgPCB9Pz0iIkQRMRIeER89HRIPFWFjFAcSMssUChEnPRUNIwUYSS4D/fQQFwwgMREEIw0UPigJC/kQIQgFGA8mTCMUDxBF5xEfDhotDwUkDBc+JAsLAXkTCg8cJgsNIwQNLyIG/cURDAEFCA0LJQINBQgNAukQDAMBGRcFIw0dGwQCDfyjEA0DARkZDSIFFxcBAgwC7BAMCCEWByMOHSYGAQ39qBEIDB5KKxQNEE83BgGfESARGjYaEggUL1ooDAr+NxIIDypjNRQIEzFbJwYCGBAZDiBIJRENFTZkKgoMAiZjymMhRSGHyHVtbkoROgc1awGEAQcKDCQEGRYmCQxTJQodSysPERQzViECCgIXCx5IKBQPEC5PIAwbAQMPEBQEAw0PBCQMHycEFAoUMBwVEBAjNxQMHDoiDB1GJhEQFS1RIASqGw4pUycRDBQoUykKDi0ZDjNjLRQQDzZ5PggKEBkONGQtDxIULWIyCAs4GQ4kQR0UFBAlVi8JDqACIAsjNA8CJAsfQQZNBBIFCQcDCSUBARkYDB4mAiIKIi8KASYICywgAwMDFgcVGwkLJQILMCQMGwAAAAUAAP+NA80DIgAOAB0ALAA7AEMAAAEGBAcGFhcWJDYSAiYnJgc2FhcWBgcGJCcmEjc+ARciBgcGFhcWNjc2JicuAQceARcOAQcGJicmNjc+ARcUFSMVMxU3AfOq/wAWEIaBfAERzkda1YcRF53pEQyQgoH+/E9NB1g5n2GQ0gcEn4B43Tg1LFwxekN/tgIBmXZvviMfS14kUVzi4qUDIgLhqY/9QTwiuAEIAQKlCgIxAdCbiuowLU9vcQEQaUROK8iQg88dF2htbfBRKzAwAbR/drMPDHZraM03FRZ0MjK+ZMMAAA0AAP+iA7gDIAAEAAgADAAQABQAGABTALwBRQGiAekCMwKfAAABFREhEQUzESMTFTM1BxUzNQcVMzUHFTM1AysBByMHIwcVDwUVHwUzPwMzNzM3MzczFzMXMxczHwEzPwM1LwQjNSMnIycXDwYVHwozHwYVHwIzHw0zPwQ1LwE1JyMvBiMvATUjLwsjLwEjLwcjNSc1LwQjBQ8BIw8EFQ8EFQcjBxUPAyMVBxUHIxUPBBUHIw8BFQ8CFQ8CIw8DFQ8DFQcVDwoVBxUfBD8EMz8ENT8mNS8DAQ8FFRcVBxUHFQcVBxUHFQcVBxUHFQcVBxUHFQ8HFR8EPwUzPwEzPwE1PwEzNzM3NTc1MzU3NTc1NzU3NTc1NzU3NTc1JzUvBAUPBRUXFRcVFzMfBTMfARUXFRcVFxUzFxUXFR8EPwQ1Lw01JzUnNSc1LwMBDxcfBD8EMz8DMzczNzM3MzczNzU3Mzc1NzM/AjM3MzU/AzUvBAUPBRUfAxUfATMfAjMfAhUfATMfARUfATMXMxczFzMfAjMXMxcVMx8HMxcVFzMVMxczPwQ1LwQjJyMnIycjLwojLwQjLwUjAV0BLv7q/v4aysrKysrKymEHDQYNDQcnDQ4EAwMEAQIDAwkEBQYMBhcGCwYGBgYpBgYGBgYFHwQFDAMDAgIGAwonBgcGDQfpBQQEAwMBAgICBgICAwYFBAMIAQ4CCAIGAgQBAgIBAgMCAwUEAwQDCgUGAwkECQQEAwQCBAYBBAMCAwIDAgECCAEFAwQCBAICBQIHAgIBAgkBAgIDBwMCAwIBAgMCBgIKBf3zBQcBAgMCAwIDAgMCAwQBAgIDAgQBBAQBAgICAgICAQICAgQCAgQBAQECAwICCgECAgIBBAECAQIBAgECAgEEBAMOBAgEAwEBAgMBAgICAQIBAgECAQICAwIBAggCAQICAgEEAgQBBgIKAgYDCgMGAwUDAgEEBggFArIEBQMGAgEBAQEBAQEBAgEDBQMFAwQDAgYDAQIDBgQJCQQEAwIBAQMCAQIDAwIBBQEMAwECAQEBAQEBAQEEAwQECPymBAUDBAQBAQMCAQMCAQQBCgEEAwIDAgECAwECBAcJCQQEAwQCBAIDAgcEAQYBAgECCAEBAQEFCAgCsQQECQQFCgQPBQULDwYFCwUhBgsQCAQFAgIEAwQNCQYGFAUBEgYHBQEFAQUBBQEcAQsFAQUFAQULDwEEAQMDAgEEAwQECP3eBAQEAwICAQIDBA0CAQIDAgECAwMLAgEIAwMFAQIBAgECAQIDAwECAQIBAgQDBgMNAx0CAw0EAw0JBQgFAgEEAwQEAwQIAxQCEQMJBRECBgUDBQUFAgEPAgUCAgEEAwQRBAQFAhwM/pABfBj+tAEnGRlKGBhVGBhNGBgCLQECBgECBAIDBAgJBQQEAwQBAgICBAIBAQEBAQUBBgQDCQUICAIEBgEBAU8BAQMDBAQEBQkEBgECAQYDBAIIDgMIAwYDBAECAgMEAwQDBwcDCAMSCggCBAICAwMICgcHAQwIBAQEBAQEBAsBBwMGAgYCAwUDBwMCAwkDAgIHAgICAgEBAQICBAIFDAEEAgICAgIBAgICAgIBBAIBAgIDBAEEAQQBAgMCAwIBAgMCAQIGAgECBgMDAgUCAQIPAwIBAgECAwYDAwMDAwMDAwEECQUIAwMDAQQDAwQGBQMCBQECAwIDAgMCAwMCBQIDAgwCAwIDAgMEAwQDBgMKAwYCCgEGAgUEBAQJCQYEAf7GAQICCAQEBAQzAwkDBgIGAwMDAwMDBgIDAwkCDgMIAQ0FCwUGCgcEBQkEBgICAgIDAwMDBgYGBQEFBw8mAwoDAwcDAwQDAwQDAwQDBwMOAywFCQgEAgMCEwECAwMIBBsGBxMHDRMGBw0GHw0FAQUBBQEFAQUBBQEBBAQEAgICAwMJCQgGBgUGEAsGEQUGBgUvBgUGBgwGBwUHBgL+sgECBgQEBgQJBAMFCQIDBAMMAQQDBAMHCQkIAwMDAgIBBgIGAwIDAgMDDwYBAwMBAwQHDAQBAwQEBAkIBAMCAgIBAwIEBAkEBQQEAwEKAgICAgICAQEHAgUBAQED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AggBnAUEBAEHChwLBxIECwQHBAQHBAgEEAgEAwICAQQEAwQFDAUNBAUEBQgFJgQJBAQEBAQEAQQDAQMBAwQECAQJBAICAQIGAwQF/kQEBQQGAgIBAgMDBQQBBA0JAQ0BBAUFBAEEBQUKBRkBBAEUBgUFBQsKCQUEBAMEAQIDAwQHEwUEBQUEBQUEJR4IBAQJDAMNAhIFBAUDARQEBAkIFiwFBQQFBQUEBRsEBgQBAQIDAwQEBAkDBgULBQUFBhQBHgUKBQUEAQQBBAUcDQQBBAUDAgECAgMECAIcDP6QAXwY/rQBJxkZShgYVRgYTRgYAi8BAQEBBwICBAMEBAQJBAUGAwIJAgEBAQEBAQIFAQIDAwgEBQQJAwMDBwEBAQFTAQICBAcJCQoBCQcGBwMEAwQDBAcIBxQEDQQEIAMDAgICAgMDCAkFBgUFBAEEAQQFHA0EAQgEAQQEBAgBAwEDAQMECAMBAwQDAQYEBwgBBAQBAwQDAQMMAwEDAQMBCAQEBAEEBAQBBA0XBQUEAQQBCQUKBQwEBQQEAwQBAgUHDB4IBAkEFAcIBwQDBAMEAwcGBAMHBQQECQQEAwQBAgIFDAUJBAMGAgEBAQEBAgIHAgIDAgICAQIDAwgFCQgDBQIBAgECAQICAgkCAQEBJwIDBQIEAQIPAwIBAgkMCQEJBAMDAQMDAQMLBwcJCQQDBAQBAQQDDAMEBgMDAgMDAwMDAwIDAwIDAgMCAwIDBAMWAwMICQkHAwQ7AQIDAwQNBQsCAwMDAwMDAgMDCiMDBwMHBA4LAwcDCAMDAgEBAwIECAkEAgQJBAQEBAQFAwEDAQMEAQMQBAMBAwgDAQoBAwMBAwMBAwMBBgQJAQMCAwOpAQQEAwQIBAQJBQQJDQQbBQ0JBAQJBAEEIgQFAQQEAwMCAQICAwQICQUEEgQLBAcEBAcECAQeBAgEBwQEBwQECQQEBAMELQEECAQEBAQeBQoFBQUFCQUnBQQFCQoEMgQFBAgEBgICBggKBRkBBAEUBgUFBQsGJgUGBQsGCwYWBgkIAwMEEAIGCAgJBhEFBgUGCwUhBgsFBQoGDwEEARkFCgEEBgIBAQMCBAgJCAEpBAUFBAUFCQUiBQkFBQUFCgUXBQQHAgI5AQIDAwgHBAcEGgMLCwcGBAMHFA8DBwEIBQQFCAMDAgICAgcBAxUBAwsBBxAEBAwEBAQEBAQJBCYFBQgEBAMEoAEEAwMECQkJBgEMAQYMBgUDAwIBBAEEAQIFBAICAQEBBAEBAQYBAQECAQECAwcFBAUECAMDCQIBBgMQAwYDAgMCAwIDAgMGAgMDAwMDB0oBAgEDBgwDAwUDAgEBAQQDAwQJBQQIAwMCAQEBAQIJAgICAQIBAgEBAQICAgEBAQQBAQEFBAMFBAUICAMCAScBAQMGBAkFBAQEAgUDBAkBBgkDAgECAwIBAgMEAwoCCAECAQICAwECAwMIBQQJBAMDAwQCAQIBAgECARAQBgIDBQkDCgECAgIPAgMFBgwUAQIBAgECAQIGAgYJBAUEBAQDAwIBAQECAgIBAgEIDAMEAwIBAgMCAQISAQkEAwUEBAQFCQQDAwQAAAAAAwAAAAADuQKOAAMABwALAAATESERBxEhESMzESMvA4ox/WKMXl4Cjv2PAnEw/esCFf3rAAQAAP+cA8MDIAADAAcADgAVAAABETMRMxEzEQEHFzUzNSMlFQcVMxU3AW4mwyb+UKSkXV0CU15eowMg/HwDhPx8A4T+4aOjb2lubAFqb6MABgAA/54DlAMeAAYACQANABEAFQAZAAABBRcBFwEXJQUXJwcXNw8BFzcPARc3DwEXNwOU/mZA/hoZAeY+AQP+ZZeVPxk/lz4ZPp4/GT+XJhkmAx5tX/65JgFIXAVt4FgrJSovKiYrNSslKzAaJRoAAAkAAP+nA7IDHgADAAcACwARABUAGQAfACUAKQAAARUzNQUVMzUzFTM1FxUzFTM1BRUzNQUVMzUHFSMVMzUFFTM1IzUXFTM1AS9n/qHaoduCeyj9fWcB9Cgod5/9np934FIDHtra9mdnZ2ceKHWdaNran01NvnQonAGdKHV1KCgAAAASAN4AAQAAAAAAAAAVAAAAAQAAAAAAAQAEABUAAQAAAAAAAgAHABkAAQAAAAAAAwAEACAAAQAAAAAABAAEACQAAQAAAAAABQALACgAAQAAAAAABgAEADMAAQAAAAAACgArADcAAQAAAAAACwATAGIAAwABBAkAAAAqAHUAAwABBAkAAQAIAJ8AAwABBAkAAgAOAKcAAwABBAkAAwAIALUAAwABBAkABAAIAL0AAwABBAkABQAWAMUAAwABBAkABgAIANsAAwABBAkACgBWAOMAAwABBAkACwAmATljYW11bmRhIFNlcnZpY2VzIEdtYkhicG1uUmVndWxhcmJwbW5icG1uVmVyc2lvbiAxLjBicG1uR2VuZXJhdGVkIGJ5IHN2ZzJ0dGYgZnJvbSBGb250ZWxsbyBwcm9qZWN0Lmh0dHA6Ly9mb250ZWxsby5jb20AYwBhAG0AdQBuAGQAYQAgAFMAZQByAHYAaQBjAGUAcwAgAEcAbQBiAEgAYgBwAG0AbgBSAGUAZwB1AGwAYQByAGIAcABtAG4AYgBwAG0AbgBWAGUAcgBzAGkAbwBuACAAMQAuADAAYgBwAG0AbgBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhAAABAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgEzATQBNQE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEMc2NyZXctd3JlbmNoBXRyYXNoEGdhdGV3YXktcGFyYWxsZWwfaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWNhbmNlbDFpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1tZXNzYWdlGHN0YXJ0LWV2ZW50LWNvbXBlbnNhdGlvbi5zdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLXBhcmFsbGVsLW11bHRpcGxlC2xvb3AtbWFya2VyCXVzZXItdGFzaw1idXNpbmVzcy1ydWxlEnBhcmFsbGVsLW1pLW1hcmtlciNzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLXNpZ25hbC9pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy10aW1lcippbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtcGFyYWxsZWwtbXVsdGlwbGUlaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWNvbXBlbnNhdGlvbgtnYXRld2F5LXhvcgpjb25uZWN0aW9uEGVuZC1ldmVudC1jYW5jZWwiaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWNvbmRpdGlvbjtpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1wYXJhbGxlbC1tdWx0aXBsZRVzdGFydC1ldmVudC1jb25kaXRpb24ic3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy10aW1lchpzZXF1ZW50aWFsLW1pLW1hcmtlci1rb3BpZQZtYW51YWwHcmVjZWl2ZRJzdWItcHJvY2Vzcy1tYXJrZXIdc3RhcnQtZXZlbnQtcGFyYWxsZWwtbXVsdGlwbGURc3RhcnQtZXZlbnQtZXJyb3IfaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLXNpZ25hbB5pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtZXJyb3IWZW5kLWV2ZW50LWNvbXBlbnNhdGlvbhRzdWJwcm9jZXNzLWNvbGxhcHNlZBNzdWJwcm9jZXNzLWV4cGFuZGVkBHRhc2sPZW5kLWV2ZW50LWVycm9yI2ludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1lc2NhbGF0aW9uHmludGVybWVkaWF0ZS1ldmVudC1jYXRjaC10aW1lchZzdGFydC1ldmVudC1lc2NhbGF0aW9uEnN0YXJ0LWV2ZW50LXNpZ25hbBJidXNpbmVzcy1ydWxlLXRhc2sGc2NyaXB0BHNlbmQNY2FsbC1hY3Rpdml0eRFzdGFydC1ldmVudC10aW1lchNzdGFydC1ldmVudC1tZXNzYWdlF2ludGVybWVkaWF0ZS1ldmVudC1ub25lHWludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1saW5rFGVuZC1ldmVudC1lc2NhbGF0aW9uD3RleHQtYW5ub3RhdGlvbgdicG1uLWlvD2dhdGV3YXktY29tcGxleBJnYXRld2F5LWV2ZW50YmFzZWQMZ2F0ZXdheS1ub25lCmdhdGV3YXktb3ITZW5kLWV2ZW50LXRlcm1pbmF0ZRBlbmQtZXZlbnQtc2lnbmFsDmVuZC1ldmVudC1ub25lEmVuZC1ldmVudC1tdWx0aXBsZRFlbmQtZXZlbnQtbWVzc2FnZQ5lbmQtZXZlbnQtbGluayBpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbWVzc2FnZSVpbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctY29tcGVuc2F0aW9uFHN0YXJ0LWV2ZW50LW11bHRpcGxlCmRhdGEtaW5wdXQLbWFudWFsLXRhc2sHc2VydmljZQR1c2VyDHJlY2VpdmUtdGFzawtkYXRhLW9iamVjdBBzdGFydC1ldmVudC1ub25lI2ludGVybWVkaWF0ZS1ldmVudC10aHJvdy1lc2NhbGF0aW9uIWludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1tdWx0aXBsZTRpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1lc2NhbGF0aW9uHWludGVybWVkaWF0ZS1ldmVudC10aHJvdy1saW5rJnN0YXJ0LWV2ZW50LW5vbi1pbnRlcnJ1cHRpbmctY29uZGl0aW9uC2RhdGEtb3V0cHV0C3NjcmlwdC10YXNrCXNlbmQtdGFzawpkYXRhLXN0b3JlJ3N0YXJ0LWV2ZW50LW5vbi1pbnRlcnJ1cHRpbmctZXNjYWxhdGlvbiBpbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctbWVzc2FnZTJpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1tdWx0aXBsZTBpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1zaWduYWwhaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LW11bHRpcGxlJHN0YXJ0LWV2ZW50LW5vbi1pbnRlcnJ1cHRpbmctbWVzc2FnZQ1hZC1ob2MtbWFya2VyDHNlcnZpY2UtdGFzawl0YXNrLW5vbmUTY29tcGVuc2F0aW9uLW1hcmtlciVzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLW11bHRpcGxlH2ludGVybWVkaWF0ZS1ldmVudC10aHJvdy1zaWduYWwzaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctY29uZGl0aW9uC3BhcnRpY2lwYW50CnNwYWNlLXRvb2wQY29ubmVjdGlvbi1tdWx0aQpsYXNzby10b29sAAA=') format('truetype'); +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'bpmn'; + src: url('../font/bpmn.svg?5069274#bpmn') format('svg'); + } +} +*/ + + [class^="icon-"]:before, [class*=" icon-"]:before { + font-family: "bpmn"; + font-style: normal; + font-weight: normal; + speak: none; + + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: .2em; + text-align: center; + /* opacity: .8; */ + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: .2em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} +.icon-screw-wrench:before { content: '\e800'; } /* '' */ +.icon-trash:before { content: '\e801'; } /* '' */ +.icon-gateway-parallel:before { content: '\e802'; } /* '' */ +.icon-intermediate-event-catch-cancel:before { content: '\e803'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-message:before { content: '\e804'; } /* '' */ +.icon-start-event-compensation:before { content: '\e805'; } /* '' */ +.icon-start-event-non-interrupting-parallel-multiple:before { content: '\e806'; } /* '' */ +.icon-loop-marker:before { content: '\e807'; } /* '' */ +.icon-user-task:before { content: '\e808'; } /* '' */ +.icon-business-rule:before { content: '\e809'; } /* '' */ +.icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */ +.icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */ +.icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */ +.icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */ +.icon-gateway-xor:before { content: '\e80f'; } /* '' */ +.icon-connection:before { content: '\e810'; } /* '' */ +.icon-end-event-cancel:before { content: '\e811'; } /* '' */ +.icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */ +.icon-start-event-condition:before { content: '\e814'; } /* '' */ +.icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */ +.icon-sequential-mi-marker-kopie:before { content: '\e816'; } /* '' */ +.icon-manual:before { content: '\e817'; } /* '' */ +.icon-receive:before { content: '\e818'; } /* '' */ +.icon-sub-process-marker:before { content: '\e819'; } /* '' */ +.icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */ +.icon-start-event-error:before { content: '\e81b'; } /* '' */ +.icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */ +.icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */ +.icon-end-event-compensation:before { content: '\e81e'; } /* '' */ +.icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */ +.icon-subprocess-expanded:before { content: '\e820'; } /* '' */ +.icon-task:before { content: '\e821'; } /* '' */ +.icon-end-event-error:before { content: '\e822'; } /* '' */ +.icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */ +.icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */ +.icon-start-event-escalation:before { content: '\e825'; } /* '' */ +.icon-start-event-signal:before { content: '\e826'; } /* '' */ +.icon-business-rule-task:before { content: '\e827'; } /* '' */ +.icon-script:before { content: '\e828'; } /* '' */ +.icon-send:before { content: '\e829'; } /* '' */ +.icon-call-activity:before { content: '\e82a'; } /* '' */ +.icon-start-event-timer:before { content: '\e82b'; } /* '' */ +.icon-start-event-message:before { content: '\e82c'; } /* '' */ +.icon-intermediate-event-none:before { content: '\e82d'; } /* '' */ +.icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */ +.icon-end-event-escalation:before { content: '\e82f'; } /* '' */ +.icon-text-annotation:before { content: '\e830'; } /* '' */ +.icon-bpmn-io:before { content: '\e831'; } /* '' */ +.icon-gateway-complex:before { content: '\e832'; } /* '' */ +.icon-gateway-eventbased:before { content: '\e833'; } /* '' */ +.icon-gateway-none:before { content: '\e834'; } /* '' */ +.icon-gateway-or:before { content: '\e835'; } /* '' */ +.icon-end-event-terminate:before { content: '\e836'; } /* '' */ +.icon-end-event-signal:before { content: '\e837'; } /* '' */ +.icon-end-event-none:before { content: '\e838'; } /* '' */ +.icon-end-event-multiple:before { content: '\e839'; } /* '' */ +.icon-end-event-message:before { content: '\e83a'; } /* '' */ +.icon-end-event-link:before { content: '\e83b'; } /* '' */ +.icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */ +.icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */ +.icon-start-event-multiple:before { content: '\e83e'; } /* '' */ +.icon-data-input:before { content: '\e83f'; } /* '' */ +.icon-manual-task:before { content: '\e840'; } /* '' */ +.icon-service:before { content: '\e841'; } /* '' */ +.icon-user:before { content: '\e842'; } /* '' */ +.icon-receive-task:before { content: '\e843'; } /* '' */ +.icon-data-object:before { content: '\e844'; } /* '' */ +.icon-start-event-none:before { content: '\e845'; } /* '' */ +.icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */ +.icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */ +.icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */ +.icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */ +.icon-data-output:before { content: '\e84b'; } /* '' */ +.icon-script-task:before { content: '\e84c'; } /* '' */ +.icon-send-task:before { content: '\e84d'; } /* '' */ +.icon-data-store:before { content: '\e84e'; } /* '' */ +.icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */ +.icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */ +.icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */ +.icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */ +.icon-ad-hoc-marker:before { content: '\e855'; } /* '' */ +.icon-service-task:before { content: '\e856'; } /* '' */ +.icon-task-none:before { content: '\e857'; } /* '' */ +.icon-compensation-marker:before { content: '\e858'; } /* '' */ +.icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */ +.icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */ +.icon-participant:before { content: '\e85c'; } /* '' */ +.icon-space-tool:before { content: '\e85f'; } /* '' */ +.icon-connection-multi:before { content: '\e860'; } /* '' */ +.icon-lasso-tool:before { content: '\e862'; } /* '' */ \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css new file mode 100644 index 0000000..bbce9f2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css @@ -0,0 +1,152 @@ +@font-face { + font-family: 'bpmn'; + src: url('../font/bpmn.eot?8685581'); + src: url('../font/bpmn.eot?8685581#iefix') format('embedded-opentype'), + url('../font/bpmn.woff?8685581') format('woff'), + url('../font/bpmn.ttf?8685581') format('truetype'), + url('../font/bpmn.svg?8685581#bpmn') format('svg'); + font-weight: normal; + font-style: normal; +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'bpmn'; + src: url('../font/bpmn.svg?8685581#bpmn') format('svg'); + } +} +*/ + + [class^="icon-"]:before, [class*=" icon-"]:before { + font-family: "bpmn"; + font-style: normal; + font-weight: normal; + speak: none; + + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: .2em; + text-align: center; + /* opacity: .8; */ + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: .2em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ + + /* Font smoothing. That was taken from TWBS */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} + +.icon-screw-wrench:before { content: '\e800'; } /* '' */ +.icon-trash:before { content: '\e801'; } /* '' */ +.icon-gateway-parallel:before { content: '\e802'; } /* '' */ +.icon-intermediate-event-catch-cancel:before { content: '\e803'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-message:before { content: '\e804'; } /* '' */ +.icon-start-event-compensation:before { content: '\e805'; } /* '' */ +.icon-start-event-non-interrupting-parallel-multiple:before { content: '\e806'; } /* '' */ +.icon-loop-marker:before { content: '\e807'; } /* '' */ +.icon-user-task:before { content: '\e808'; } /* '' */ +.icon-business-rule:before { content: '\e809'; } /* '' */ +.icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */ +.icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */ +.icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */ +.icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */ +.icon-gateway-xor:before { content: '\e80f'; } /* '' */ +.icon-connection:before { content: '\e810'; } /* '' */ +.icon-end-event-cancel:before { content: '\e811'; } /* '' */ +.icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */ +.icon-start-event-condition:before { content: '\e814'; } /* '' */ +.icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */ +.icon-sequential-mi-marker-kopie:before { content: '\e816'; } /* '' */ +.icon-manual:before { content: '\e817'; } /* '' */ +.icon-receive:before { content: '\e818'; } /* '' */ +.icon-sub-process-marker:before { content: '\e819'; } /* '' */ +.icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */ +.icon-start-event-error:before { content: '\e81b'; } /* '' */ +.icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */ +.icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */ +.icon-end-event-compensation:before { content: '\e81e'; } /* '' */ +.icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */ +.icon-subprocess-expanded:before { content: '\e820'; } /* '' */ +.icon-task:before { content: '\e821'; } /* '' */ +.icon-end-event-error:before { content: '\e822'; } /* '' */ +.icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */ +.icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */ +.icon-start-event-escalation:before { content: '\e825'; } /* '' */ +.icon-start-event-signal:before { content: '\e826'; } /* '' */ +.icon-business-rule-task:before { content: '\e827'; } /* '' */ +.icon-script:before { content: '\e828'; } /* '' */ +.icon-send:before { content: '\e829'; } /* '' */ +.icon-call-activity:before { content: '\e82a'; } /* '' */ +.icon-start-event-timer:before { content: '\e82b'; } /* '' */ +.icon-start-event-message:before { content: '\e82c'; } /* '' */ +.icon-intermediate-event-none:before { content: '\e82d'; } /* '' */ +.icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */ +.icon-end-event-escalation:before { content: '\e82f'; } /* '' */ +.icon-text-annotation:before { content: '\e830'; } /* '' */ +.icon-bpmn-io:before { content: '\e831'; } /* '' */ +.icon-gateway-complex:before { content: '\e832'; } /* '' */ +.icon-gateway-eventbased:before { content: '\e833'; } /* '' */ +.icon-gateway-none:before { content: '\e834'; } /* '' */ +.icon-gateway-or:before { content: '\e835'; } /* '' */ +.icon-end-event-terminate:before { content: '\e836'; } /* '' */ +.icon-end-event-signal:before { content: '\e837'; } /* '' */ +.icon-end-event-none:before { content: '\e838'; } /* '' */ +.icon-end-event-multiple:before { content: '\e839'; } /* '' */ +.icon-end-event-message:before { content: '\e83a'; } /* '' */ +.icon-end-event-link:before { content: '\e83b'; } /* '' */ +.icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */ +.icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */ +.icon-start-event-multiple:before { content: '\e83e'; } /* '' */ +.icon-data-input:before { content: '\e83f'; } /* '' */ +.icon-manual-task:before { content: '\e840'; } /* '' */ +.icon-service:before { content: '\e841'; } /* '' */ +.icon-user:before { content: '\e842'; } /* '' */ +.icon-receive-task:before { content: '\e843'; } /* '' */ +.icon-data-object:before { content: '\e844'; } /* '' */ +.icon-start-event-none:before { content: '\e845'; } /* '' */ +.icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */ +.icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */ +.icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */ +.icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */ +.icon-data-output:before { content: '\e84b'; } /* '' */ +.icon-script-task:before { content: '\e84c'; } /* '' */ +.icon-send-task:before { content: '\e84d'; } /* '' */ +.icon-data-store:before { content: '\e84e'; } /* '' */ +.icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */ +.icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */ +.icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */ +.icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */ +.icon-ad-hoc-marker:before { content: '\e855'; } /* '' */ +.icon-service-task:before { content: '\e856'; } /* '' */ +.icon-task-none:before { content: '\e857'; } /* '' */ +.icon-compensation-marker:before { content: '\e858'; } /* '' */ +.icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */ +.icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */ +.icon-participant:before { content: '\e85c'; } /* '' */ +.icon-space-tool:before { content: '\e85f'; } /* '' */ +.icon-connection-multi:before { content: '\e860'; } /* '' */ +.icon-lasso-tool:before { content: '\e862'; } /* '' */ \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot new file mode 100644 index 0000000000000000000000000000000000000000..4339c7f87763347fdaa38dfede49ff0151b6cd27 GIT binary patch literal 40720 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 Y3=H(S#``m)FSqn{4G$0K&jjKB0libbS^xk5 literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg new file mode 100644 index 0000000..367205c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg @@ -0,0 +1,107 @@ + + + +camunda Services GmbH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f9406567838393420f1fbce1f6deb906c0eeabf5 GIT binary patch literal 40568 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 literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff new file mode 100644 index 0000000000000000000000000000000000000000..e43875642f64ec2e10eb13dec40b0360b8673292 GIT binary patch literal 13784 zcmY*=V{~Or6K-tVwsT@noQWqBoY=N~;!JEO6Wf~Dwryi#JGt|I_x`!H>RH`SbyaKa zKfAlyT}es`3>@sAaIJtL{8wgs{9pcG{r?xGpR9m?mivE@_y=`i#P8+CwuTO1VBoy} zxa7Z5tCbrf-Q330>|fm<42;DT3@kd!ZOUlC!qm_N42<>UpC9`_a6=yoQCj>nf`PFS z{o^G6Km{8J*=S+w;_=TW_>ZIi>m%6fUxbal@qd2G|7-*Q0WA{%W^3s2Z(Me)f1LCm z$iV%e?CcC}|Bc7a`7cfd3=BfZi`O;T!QR;g3=9wk1_r4F1_tkO5$J8}k!5UP0_x=r z2uKbHDvPj0g@hDG4L0-XF&G&c=;;~g8JqCOhAM0=X5;NJ@Q5EEx)+HgkI+od!=Rgh zOMnDJM@QoLuMYzQGk*ho7%3PuIPhD%ULPD7M6$`jp57j)U?f%}J*p0w*Dun-6X^a( z4>;|>AMf4IBBgqC1}4UMH(+4D%1{FSP23~v+y^m>NG;j@xA)oR;#GCIr|Xl8hRBi7 z{O0^7hvx(u#)$E)e{e9GXaLk588(wukGZ=4;18d z5Gml%xEKJVe0zV&u89ZMnSznsV1}swvGpWZf3bxdY|G6q(DhS2>i0G}w zkP28OQ8qGotMy|yhR7DQ)4u*ybBSKrlVV*Ryz_Ki z{W`mp`|;8oI8?Q)_j9$=B);Cs;SImJt1xW6rt2IRa0-z)g{hap!b{+oEz z5=FtT2J4S+Wd+t3A-^|+Aeq!yP?1njDlhci4R8A9zI}n|%~8EH*K7c|t)*@Wb0J!# zY5AUefAf4c)p(D#A(A^xWextG-t^iOk-TVNZQ0qx6nJ~xiLc-mKIh@ic7KdCo!464 z45xN=t<>FKo2rYZKHQ=nqwK; z2JjpklW#a#&ymz?4?r8v+euIm_9K)UQxAp_G4i;o52DQYR_mIZkvrmcTaMZ$U@&4( zootptAWZQOc%_2OvqvHvH&%G6{IA5xm?q7h-?om?$pN1A``Vs9XV}zIT}F4Lx7-yz zcw^5Fz+Ulyhm8i*fh)21Tzl%1uu>KD9TKLJa4!RPf_0vPms_{U}~2f&9CZ)RJ0!ZXj8GY54C1 zn%x|hK?igAI#F?AiU=?dRX_sMF6yCf0^P2Hn5q$7d0?zVf4~(jL7r&G4CewH1)A)J z5L5&;Wj&-_d00^dL)hzzcS5PG2YCd{B?Gixc4E$~PLo zjj^wtFm$8}8*N@?OPoe37Cx)0+JGzoNP<(oQx;wxAyy}p#Z84rCl|SL88u=jw*@Pq zHnc7i7_O?^7!G4Wa5&ks2A(;AnNVs-qql4!g#ySsE#cq`3qfHGooJINHYnWdiLg5 zltXk!kVwL&_lkLkNu+C8KzCeSkZXRM8lxcUT)}0Rh8RlyHd#X*e_`4QkT=N2@Iwl0Xh_|F8Nq{#C@wQvdMgDax~R!MmRMvdT7)sCdNhRo|y5DjUFxvC4eR_Pv+RN=ox!Pzy&Nl ztw8J5Y2I2@R*}(2h6|Ou(g|l%<*;vfs<=pN^3+mD)Ro6`(MJLbPK`)j$^m6bi=z~D z%Px)7l;fp%J;&uVus1AL?@*TsEN|@I1%*L$%LK(@?Tl3!NtLT$+G2lXVfenVsY=7W z1UtqlKv=ZN$V3`u4i*_BuF4RLv!iO|!R4r@+r3FV1W?ha7UC(u_H>6_&_TK4K}2qO zg)&hKsGlUo(tm7!le*ovfT_nvmD_>LiFkP2jf(=8psH9ZuUtm+v~&lruC#U*0suW^ z3ug8GoKCZX9>|{uqiY=0Ipop|#1??d-ONjna#e36O{_;R6Bfg!x29-jYEVQ89)rL^yh<1w-xh?eCxGMh)o zbiA)7)DtMV`azai^O8`$;h=dX{nq?Rl_+?c^^p8D^|9iRcjbMY?ffVr^5xUd>@c?B z$qC>5rE&Nr%(1X|cZ;mOon^^$aM|@3@g$YvptR}>G3w>Z0_cgS2JBlEg!Xj1xy2RnW{7bonU?P( zDLgXRv;S5|$K#+HL<@{aDBHuHpO??44+>G04k~DU%_Qro*drgnBdZfAolD1oUG8FR zjDSU#kumm*!y?06OEV>#@Trx3xh6kOQvvJKO}Gu*cu^A14ouy)0ZSg{#uD}JeDS)C&+9Bdvj^V$e<-)!*5hU z3wreVq0X=BxB?)CK%=V2SMami^ZE-x46xY7(b$!ctD!W>UY1G9H8Pz9`NYj=X5*Ap zVg9@_%8UhLv~VrdeK|1r9kOhqZI+4AfsHSm&zx3#2GM&s6$qM=sq7d8LQHV$v;eg( z6NuRQCCX5Wa@4BA^GA;6kBRC~mtW(64{Fr@VyFxdtqYGfmci4_;Zn!U-01vmz--=LvEiDWupjW4K~DY zMB$U*=eI3JBuWJ%)tsCVWwPbV566gXjOD<4gQ?CCj{OlUuIXbq zPaeJ531&#V4<&~lDy8du1s&KFEb!YR<{YhlVkrPa^v#UXt<}OTGGbC*58XEB z?1$KR;3>j~tt?i1Kx0o5+YE8D6lY1`)tqQE*KM%cy< zU$~%^IsX!hzOzWtlYWpiagP2MT63#N;g{H!SSBHEF(N4jH-Z@68G=zVd?oV=q$Yg; zu4qSkPb8U^?l5ez9L8s6IK|e`7kN*xO1-gi(*&FmL+0^!v+Gf|=>Ub^rCnV!OvfuF zsb2c}684c)P`wK=`B_SW<@gdtz1!+agUMQB2pD2Xw9xqUcAjmgfmiZUTr!yh1FsuZ zo>$O}d(^VUX(D-W?r-kr?_cne7&Zf+51M4u_Vb*K;6ZarMS$>368_po`7H|TRP`km z(?zC`^=m;$sbaMyMM7}Fe%pDerEmKD8&+sFb_0_Y)d+*gu{i`c4sEQlwvV|6!CFEq zvE>;jm-6K+hYJ?SWljeGP9pZN!wU5(3X{ddyfkUIwl-axpbsA|d~69(Y@|zi?7rxp zEdAo2ifQmgUc#B&=bs;#N`m4zF+#WU5AsrsA{FmhQGy)&{0tv2(|$+78iGk9`)Mj@ zzuyn^xjAPhrlGdy{dq5hmpgu8aB)yt*m zj?v*~zHr%A40tK+eN5)Aph2i2(#oSBZ4XE%On5JjnWXnXOq)B8q&Vb|xsBiFZ)Ah` zbv_nG`o`oCQwvjmK@1NYapd24I`02|%wHt7f6$5+w>7>peZ2_Vv}|q;Za8RasrJx{ z%qLC>cYjL7fKg*^XdeyYuniJS%U&nBkU;`f%JB?=(pWfYaZNCPGb5UhQ2Bj9#;vxw zGHys)QrNL$rrD6yQq7P~DWN7$JbFfZIjHw(k^LdTMRw5u*$|Qb=AtYczQs*arex}8m1>hIGG2sZ;?bX4^zuc^!=@u_uT?_3O74Iofnlv!nQqX zLvbt5`2^=R&?3_O8XG2z+~$zwzz0c_W@kuDo-89Ahj-Wlk|ibvrckp;}8m>pnNJ&v(4ZuvnlaDA(sZOgbtR z*1lI5On!ESN|&BXrt784(IXMn&*y&J?0=$;I5t~N+9BtA z9`HsNQs^c9ypoC7FRnCd=x2X46EVt<@Y>C{PNVtuz}!aDF1@u{IiiKRSn%j%V0Lw6TQs3Au0 zrqtn=9NxxF2MIXEh_qQ)WsBT?bZ1o%(Z)(IXz0C6Vg2qKc`ow|ag5<}6)8V6%qXXI z{lW|N?7O8OVw0e0=ekRL&-jU~182VtdU?DsFPvL%p5CrAjzC8!Vb=3GY_ip`vwnUL zoc05OXHw9=-552oX#jb-?9Q)Tvnen$9&f)Zg+sevUDa&~2%A3!>^qP7!d30lc{@6$ z4UE>V$c28dIiZE)M8){sfS4SZBRRj}04ebL18$Je&S1~Wza18S)-!j@p7wI-oyJ=) zuQ_hpxcj!N(IX0Zr}B@y{f+wPLqvA9{yPBAf4HqZR`VOE#>Y*|e7d3r=KWe#V_Gfe zK(ICavJgezny#fQwOp{a)vmZ{#-Wys#N&<8FXq|4m4W`5T`@B$|bmDh*P<|t$(XArq&4-FtWS=MCqnk5kThE$>`5LYi^@ zxp&Q1-SgqxIJDc9#5?5#B{W40b%c_7Jy#&%#$tjMA%czi)WDi9v!k(6dhZVsiF>&_968?%I~Iq^SWo+%ReT#X8xVq6wTdtyh$hCpRU)`oVUv5 zh`|YQMoMdB zIWDorS}XW$lx`qsaI2C8*ck5zhK3#@BS#VtD34h?J2eS6$a=sH&%&Mivjbu`WV)1s z?rmP(Eexel>b0CXF-|S0=DwC?3OjMiykcP}iIJuF38L=1+3_rMxca6^kfr$vVq7?h zPW_B|6LMpwGx1_<(6vI6WCN(PPcMtdumEF-g8&dVm_Fv64>9IZJS?eFz?SpAtuL-9iW0v|gONr>xjnE+ZAJ z{nC)BF)%E?Gd)G(w;%n11>g$OkQv1|GY3OOOw=;d!0n7ec)!+)05A6o?8 z;CH*VrKLg+`<7dNIiaD!jC$M#@WG*vllbc(A*g$z-4+?ebaHAk9i&qt+A0{qy>iIr z14ocW9nt0|a;X~>>udDskrT;BjsTj}_S%nRKmco|1FC(mSakNdHhL>2y@@%kAR z4c>f6hv{u$7O_d5e9#Q!ppMAWIE0}S^~&juOLk)&M`1qO8?KV~%P~3P`3z=zf3&Kd zP5C#aAWQA!RJ{fQf=Vu2U*7YZ9fLV<2$J$sVJw^2>ipY9LYv?4rOTL~y%}Nn?A!i< z_$ZpmxB=X07+m7XLes&4Xh@&$hrQ?`k9h=E?w1$WaXR727bsGk-?T^DjkCLDP5RJVf$emDYjuYecuErVN8Hz;wYJ}yX+H>4su9J~qLR6t zVZb~_(zu^z_$?sQveI4cqXxS-ceN=2TfIKyPDdRNQ%OZugTxaL9z`yRH5ISg){vR? zQTDLUn%@m>1syS}?9RR2J4f8VtJgQGHkFyCCReKb^Q;f)TO>4_TyyH5NUu9derc<_ zV*TwqmCC5E>o!MB#;V8b-Cu%3{QR+E_$hU_p#F1Xq@k=j-$h;`RlyP6)RoKQ{M*HE z<|z5r&O|Ro_2RYjob$yR1>~PLZ$rLqLW$Vr`_4w4R6pH23!5a=-NOfTU(1_moHT6J zD!8k+i}Wc4;&G%$5I$hTfv(Dtymkv#c*)=S5HKO%ONO)MM@EMedNt1ltVOcNJQP@7{!&E`;H~Er6kvQ?c(~9cnCJ~-?TTz|W)$8@|HQbB{F3+-mv=-d9 zZ?6}TJSKjeoC_lH#}DMRxW-$m-DXqI4~?$R2r25lhKSQ#TzGqX>uL)qYIJ}auioa^ zADK$_3>Mqf{McT0g9@wP7Ye(xp>$O+&mf~u`TFwdV=Uz<-)tWB{Fa8rno24s5+FyH z@T)RI&1n*y16!4C%2}^!Kp@w>mVu>XmR5s{z#Yya4-$RCZEqpRGKaR>%aKZ|HDMKJ z!Q5nOu3>RQ(&>J5Esb-bqm8cb4Hk~CWtj6Pm$!O%C-l{P+2D6HN<{{rA+T9;7ttbV z6Xv?zv!dH(>-rIYGakmDQWN>zK0-dI4fVAWFW2E*w>m1cE?%h=o5o$k-i}%hU5$BY zwiHTVwor;MtgmP#P|-B>uPz`EKY`yjT;_%1N;{mC9(2AW16q}Y;Wc8WvW41j+Rmz- zZ_pV8;MtuZV@fUi>iQsv)F2SUV#9g!45?DR2Ikmg;7w?@er{-Ujw?11)gcyrR^AGm zw}fVKqI#J&8j6J;-l&A^=&ox7^t zIUQuSp|N!9YxZfdK2Hz^*Bcqhruc&K)$w-cl>_Je+cW6vX2x}D>uQEyOxm}qK*9k; zeTcZSC(qZ{)vw|w!)m-e*>aM}=cH_1m^??cV+1c_!`3VCmeC0C&nC+9Z!DQ zq?#v-wy&9y%tI=yQPjh6@nuEFQp|Ymzk5P5pYvK^TYmM}LYk^DZNrdi9ZY~L^sD6Z z5o>NqwRx|n{E}ouszOdyG6S;LDqEirOT90b)!Z7L4lYS~P}HYmyF;?xe=V?0N!aYR zvUmyhEO$GBtR69N41pg|X@nNQ541EwdmtVSlh-J+z(CR*51cRT8(@Xz2i3oSC$3H# zN2dpcjdi6`k9jM%N5J%}6W3np?zz3kEAiaL`Qa{sHA0>`WVCM5(6YC z6QoZt?Kf6r#wH@ zdlnRJrL8pk?Q5=X$5B3WKR<)o{l=JvnHJDnP18BLBCv9^-g=z2i}cASVZ(EFZTM$+ z2r1v$gJ)IvD0gtD^lBi`&nXk$dGqR6SC(zzu<12}5m=%0xk{@A%(U0LYFg#1+wZt@ zlyPbNJ-p_-&D>tMi5i5ox7?UXy5e#}xj(5_=W(;5mWjJ;;vV=EGovR0NDCp7LlR$f zceB;1doRRJKHH7CT09FEi0SWM%Crld+5B}SPzLdEa;H+g=CdElY2_XUL9Br=Y|08Tudc(V6l@A*`Bjwhq~T zYrkeqd|NJw_6*&V9w)Q!ZpWR2*90C8h;OME@C|##_~&gl=@RWU^LSoB%2oj+FPoBYe1 zst0~jA5;aQZkWnvd9_)mwqoeFn^@;N5yd_6xo^(>kQbQlYVHw6jUQjPIaG05aWW%^ z@i|rbe(t^xb&G}np-P)tnMEN^nx&d^4gdNP+ zASM!~nrVC-1#}sCX&oCNz9X-qylbCYJS94nGH$uXoqrh^$DgmLA+6e=f=cl>AuvxCf^0IBZ_XxlE&Qlv>9+C6hmDN_#y*S4bfG6 z`Q**(eSBvlAm5NGjUTU-Xbza<_p->xL34<7rGs;9JNE%{!)yl9>qjOKK;g%cY?NY^ zZv;+2qb=qn-P$-Gkwl>^TLWm2!FW3G-}U5)Xs0}o75txhCzG@b36V^oUfC?r%vyyy-&c!-Xl=xDm;c>vP}7TmLM zx)DtwR%E`$c*-1nzc`hCc~UryR3NCEb)4i8w~XTKRHb}zCfT4oDWYjgD21wE;8a1h z&X8*UHT7tL-sa`$Peg&-MG_HG1_XbJL&n zSP{ho;VZ7WOYp?HqXulFVu>4ZELy$+{*p}Li!IckUN`&=3noxEm%m99Gr;l>FG*su z4LrzGZa7_q03W|+sU)(@U#5!p zlZ@#}4*Ed3oEADk*D&vfSw?my@RmNNXte3-(L-*<1NMWSl2 zA5|9uy{XpY42zMe2)TB;mhF8p zm8;3?D}lFM<}4kw_86g?B0tKl+S5BBc;C^#qz4{K)NOxQ$vxZ&z4(f3?<Xtg&Pi~STO3(3!T*Q_K&Z7a zYeYk*>{U+WAy|R0onN-$3=wa_8kII@5&qFE9#JWEM;?yW{UZa`!DsZ0Rs!L;pgg|` z^mEo_eBQ$EZAsfcxlp@%bIt&m!IW|gF;TPE4*#ZyHr6*o4tzFY8Qn8rdVF~_suc-h z_?{6XyVMj)4s<^xhfc_st(8;3Dg%5B9%uU8>osL`#lSi zV$`$Itm^oQ2wxmf?5-jsG2D>xT4mt!Opp;SV*RZ^ui?OqHb>517_825VCyFp@5e@ z+1-LZ>b}xz%UzaT`(WCT-+j}Y_}5#EMTWw(EUD*$`4%P!sWP9dP#^}67k{&-zqgyA~*QZIf>N8V)AFNci0NtF!a(!}_%zLi#6uln|>JOTWdG)Bi zwbt9zn+85+oCiG9K;j=_FSrz5Yy$K5{3`wLB>YW`2830uxhEc!;#wKag`3L{6+I-Q;6&v zHL12X-C;XCHcu2}nc!{`Xt(I+?Q20iD( zb!zWc4K==++!hjRDSytoE~WGhUEQg6SbcqD7UQ!%xi&wQ3*RO>{^DEQ7nw;?#((pY ztT|d2)e=(d&M6eU(Y&Q#r?Ny?oCAwSmSPf5@T%AN74`Sjswhb-VzrVSQplIS;Kgr1 zMA`X>C}1&%vi_2C$EN*pDxB9c#5Dbymk8FqSDRO3?XtR==vpDI;40&NaEpu2_R2ka ziuYA&be2a}_=J#}8PgPL6bxW*1&+Dh2?lSk~+2qH=o_Dn*AZ1^Sad_XOc9FLfG+8m>VV-;OB z<{)&wM-g515apxprssaSN1i~YlZx)7lbn({L$cjjBjdCuh;86LOgxYkN!dHqT|D@2om(}<~yg<`M4H8HXhej_^7Zc>hx;|?rU@F&)|?_ z@~(3_M*~O0)@JK;W#`lR`B2P7dgrrBg`4smXP#qNEkp8<8?_jLQ$-#HR#JXMM2QME zi59kU2B#}DMxda-R@vV}YE}tB2Tw2)3ROJ@Nl&ms1oB|%EN3%Y`*Tiur#jW~v-HhX z=c%mmD-MCF2Xlx7yfIrPUS1ZzP z%q*s4EFC~{CIQ-DyQdtS(999S>NGx7(B!_u+3-6-Yji3Wvxq7_Mv`QAYD@Vk;e{@g zpgzas58CL)Nbc|ky69dtn5_PtZxz0-c-Ga~d#(V3>D9AZ^mITGbe0}ayZlBTYP=-Q z;uYecYV3|9`^V>bcE?hU!vh;K*~mZX>KPXph+I0t0HUcWn%t2KpvLcCR?w_a;!QW| z6R7>g^hNo*(Hr(YIL$RgrPQkw_9Ls0@Z1Y)3#%Su9;5gg=7AqeX7KumA&3rD{h^W1 zsUznU{wGv}wV9HVXiB5%*DRow(#kU>Fr_?B0ttgER%Hbs6jvX8y-T59XJtw&H>yXO zm|<1sC8a3Y{r8YeLM~P>O_u83ru@5Tm>CL*JzKJ&4Q-{cWYwOD%q)~7!OP}%u{nBJ zhGgM{mb=%?&Yd0_bHjF;S{`^n+i^1w&)pi=$L1j}nq`G|uN|Az`a2shN;cFs%r
      j1H3w5yXL3CHc4lb_Vq`e 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 literal 0 HcmV?d00001 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/diagram-js.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/diagram-js.css new file mode 100644 index 0000000..e251216 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/diagram-js.css @@ -0,0 +1,457 @@ +/** + * outline styles + */ + +.djs-outline { + fill: none; + visibility: hidden; +} + +.djs-element.hover .djs-outline, +.djs-element.selected .djs-outline { + visibility: visible; + shape-rendering: crispEdges; + stroke-dasharray: 3,3; +} + +.djs-element.selected .djs-outline { + stroke: #8888FF; + stroke-width: 1px; +} + +.djs-element.hover .djs-outline { + stroke: #FF8888; + stroke-width: 1px; +} + +.djs-shape.connect-ok .djs-visual > :nth-child(1) { + fill: #54FF00 /* light-green */ !important; + fill-opacity: 0.2; +} + +.djs-shape.connect-not-ok .djs-visual > :nth-child(1), +.djs-shape.drop-not-ok .djs-visual > :nth-child(1) { + fill: #E56283 /* light-red */ !important; + fill-opacity: 0.2; +} + +svg.drop-not-ok { + background: rgba(229, 98, 131, 0.2) /* light-red */ !important; +} + +.djs-connection.connect-ok .djs-visual > :nth-child(1), +.djs-connection.drop-ok .djs-visual > :nth-child(1) { + stroke: #90DD5F /* light-green */ !important; +} + +.djs-connection.connect-not-ok .djs-visual > :nth-child(1), +.djs-connection.drop-not-ok .djs-visual > :nth-child(1) { + stroke: #E56283 /* light-red */ !important; +} + +.drop-not-ok, +.connect-not-ok { + cursor: not-allowed; +} + + +/** +* Selection box style +* +*/ +.djs-lasso-overlay { + fill: rgb(255, 116, 0); + fill-opacity: 0.1; + + stroke-dasharray: 5 1 3 1; + stroke: rgb(255, 116, 0); + + shape-rendering: crispEdges; + pointer-events: none; +} + +/** + * Resize styles + */ +.djs-resize-overlay { + fill: white; + fill-opacity: 0.8; + + stroke-dasharray: 5 1 3 1; + stroke: rgb(255, 116, 0); + + pointer-events: none; +} + +.djs-resizer-hit { + fill: none; + pointer-events: all; +} + +.djs-resizer-visual { + fill: white; + stroke-width: 1px; + stroke: black; + shape-rendering: crispEdges; + stroke-opacity: 0.2; +} + +.djs-cursor-resize-nwse, +.djs-resizer-nw, +.djs-resizer-se { + cursor: nwse-resize; +} + +.djs-cursor-resize-nesw, +.djs-resizer-ne, +.djs-resizer-sw { + cursor: nesw-resize; +} + +.djs-shape.djs-resizing > .djs-outline { + visibility: hidden !important; +} + +.djs-shape.djs-resizing > .djs-resizer { + visibility: hidden; +} + +.djs-dragger > .djs-resizer { + visibility: hidden; +} + +/** + * drag styles + */ +.djs-dragger { + fill: white; + fill-opacity: 0.6; + stroke: #333; +} + +.djs-dragger .djs-visual > :first-child { + stroke: rgb(255, 116, 0) !important; +} + +.djs-dragging { + opacity: 0.3; +} + +.djs-dragging, +.djs-dragging > * { + pointer-events: none !important; +} + +.djs-dragging .djs-context-pad, +.djs-dragging .djs-outline { + display: none !important; +} + +/** + * no pointer events for visual + */ +.djs-visual, +.djs-outline { + pointer-events: none; +} + +/** + * all pointer events for hit shape + */ +.djs-shape .djs-hit { + pointer-events: all; +} + +.djs-connection .djs-hit { + pointer-events: stroke; +} + +/** + * shape / connection basic styles + */ +.djs-connection .djs-visual { + stroke-width: 2px; + fill: none; +} + +.djs-cursor-grabbing { + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; +} + +.djs-cursor-crosshair { + cursor: crosshair; +} + +.djs-cursor-move { + cursor: move; +} + +.djs-cursor-resize-ns { + cursor: ns-resize; +} + +.djs-cursor-resize-ew { + cursor: ew-resize; +} + + +/** + * snapping + */ +.djs-snap-line { + stroke: rgb(255, 195, 66); + stroke: rgba(255, 195, 66, 0.50); + stroke-linecap: round; + stroke-width: 2px; + pointer-events: none; +} + +/** + * snapping + */ +.djs-crosshair { + stroke: #555; + stroke-linecap: round; + stroke-width: 1px; + pointer-events: none; + shape-rendering: crispEdges; + stroke-dasharray: 5, 5; +} + +/** + * palette + */ + +.djs-palette { + position: absolute; + left: 20px; + top: 20px; +} + +.djs-palette:not(.open) { + overflow: hidden; +} + +.djs-palette .entry, +.djs-palette .djs-palette-toggle { + width: 46px; + height: 46px; + line-height: 46px; +} + +.djs-palette .separator { + margin: 3px 5px 5px 5px; + border: solid 1px #DDD; + border-radius: 1px; +}; + +.djs-palette .entry:before { + vertical-align: middle; +} + +.djs-palette .djs-palette-toggle { + cursor: pointer; +} + +.djs-palette .entry, +.djs-palette .djs-palette-toggle { + color: #333; + font-size: 30px; + + text-align: center; +} + +.djs-palette.open .djs-palette-toggle { + height: 10px; +} + +.djs-palette:not(.open) .djs-palette-entries { + display: none; +} + +.djs-palette .djs-palette-toggle:hover { + background: #666; +} + +.djs-palette .entry:hover { + color: rgb(255, 116, 0); +} + +/** + * context-pad + */ +.djs-overlay-context-pad { + width: 72px; +} + +.djs-context-pad { + position: absolute; + display: none; + pointer-events: none; +} + +.djs-context-pad .entry { + width: 22px; + height: 22px; + text-align: center; + display: inline-block; + font-size: 22px; + margin: 0 2px 2px 0; + + border-radius: 3px; + + cursor: default; + + background-color: rgba(255,255,255, 0.85); + box-shadow: 0 0 2px 1px rgba(255,255,255, 0.85); + + pointer-events: all; +} + +.djs-context-pad .entry:before { + vertical-align: top; +} + +.djs-context-pad .entry:hover { + background: rgb(255, 252, 176); +} + +.djs-context-pad.open { + display: block; +} + +.djs-popup-entry { + font-size: 20px; + line-height: 20px; + padding: 2px 10px 2px 5px; + background-color: rgba(255,255,255, 0.85); + white-space: nowrap; +} + +.djs-popup-entry:hover { + background: rgb(255, 252, 176); +} + +.djs-popup-entry > span { + font-size: 14px; + margin-left: 5px; + + vertical-align: middle; +} + +.djs-popup-entry:before { + vertical-align: middle; +} + +/** + * popup / palette styles + */ +.djs-popup, .djs-palette { + background: #FAFAFA; + border: solid 1px #CCC; + border-radius: 2px; + box-shadow: 0 1px 4px rgba(0,0,0,0.3); +} + +/** + * touch + */ + +.djs-shape, +.djs-connection { + touch-action: none; +} + +.djs-bendpoint { + display: none; +} + +/** + * bendpoints + */ +.djs-bendpoint .djs-visual { + pointer-events: none; + fill: rgba(255, 255, 121, 0.8); + stroke-width: 1px; + stroke-opacity: 0.5; + stroke: black; +} + +.djs-bendpoint:hover, +.djs-bendpoints.hover .djs-bendpoint, +.djs-bendpoints.selected .djs-bendpoint { + display: block; +} + +.djs-bendpoints:not(.hover) .floating { + display: none; +} + +.djs-bendpoint:hover .djs-visual, +.djs-bendpoint.floating .djs-visual { + fill: yellow; +} + +.djs-bendpoint.floating .djs-hit { + pointer-events: none; +} + +.djs-bendpoint .djs-hit { + pointer-events: all; + fill: none; +} + +.djs-updating, +.djs-updating > * { + pointer-events: none !important; +} + +.djs-updating .djs-context-pad, +.djs-updating .djs-outline, +.djs-updating .djs-bendpoint, +.connect-ok .djs-bendpoint, +.connect-not-ok .djs-bendpoint, +.drop-ok .djs-bendpoint, +.drop-not-ok .djs-bendpoint { + display: none !important; +} + +.djs-bendpoint.djs-dragging { + display: block; + opacity: 1.0; +} + +.djs-bendpoint.djs-dragging .djs-visual { + fill: yellow; +} + + +/** + * tooltips + */ +.djs-tooltip-error { + font-size: 11px; + line-height: 18px; + text-align: left; + + padding: 5px; + + opacity: 0.7; +} + +.djs-tooltip-error > * { + width: 160px; + + background: rgb(252, 236, 240); + color: rgb(158, 76, 76); + padding: 3px 7px; + box-shadow: 0 1px 3px rgba(0,0,0, 0.2); + border-radius: 5px; + border-left: solid 5px rgb(174, 73, 73); +} + +.djs-tooltip-error:hover { + opacity: 1; +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-modeler.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-modeler.js new file mode 100644 index 0000000..85e7f04 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-modeler.js @@ -0,0 +1,43358 @@ +/*! + * bpmn-js - bpmn-modeler v0.10.3 + + * Copyright 2014, 2015 camunda Services GmbH and other contributors + * + * Released under the bpmn.io license + * http://bpmn.io/license + * + * Source Code: https://github.com/bpmn-io/bpmn-js + * + * Date: 2015-05-18 + */ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.BpmnJS=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + + +/** + * A modeler for BPMN 2.0 diagrams. + * + * + * ## Extending the Modeler + * + * In order to extend the viewer pass extension modules to bootstrap via the + * `additionalModules` option. An extension module is an object that exposes + * named services. + * + * The following example depicts the integration of a simple + * logging component that integrates with interaction events: + * + * + * ```javascript + * + * // logging component + * function InteractionLogger(eventBus) { + * eventBus.on('element.hover', function(event) { + * console.log() + * }) + * } + * + * InteractionLogger.$inject = [ 'eventBus' ]; // minification save + * + * // extension module + * var extensionModule = { + * __init__: [ 'interactionLogger' ], + * interactionLogger: [ 'type', InteractionLogger ] + * }; + * + * // extend the viewer + * var bpmnModeler = new Modeler({ additionalModules: [ extensionModule ] }); + * bpmnModeler.importXML(...); + * ``` + * + * + * ## Customizing / Replacing Components + * + * You can replace individual diagram components by redefining them in override modules. + * This works for all components, including those defined in the core. + * + * Pass in override modules via the `options.additionalModules` flag like this: + * + * ```javascript + * function CustomContextPadProvider(contextPad) { + * + * contextPad.registerProvider(this); + * + * this.getContextPadEntries = function(element) { + * // no entries, effectively disable the context pad + * return {}; + * }; + * } + * + * CustomContextPadProvider.$inject = [ 'contextPad' ]; + * + * var overrideModule = { + * contextPadProvider: [ 'type', CustomContextPadProvider ] + * }; + * + * var bpmnModeler = new Modeler({ additionalModules: [ overrideModule ]}); + * ``` + * + * @param {Object} [options] configuration options to pass to the viewer + * @param {DOMElement} [options.container] the container to render the viewer in, defaults to body. + * @param {String|Number} [options.width] the width of the viewer + * @param {String|Number} [options.height] the height of the viewer + * @param {Object} [options.moddleExtensions] extension packages to provide + * @param {Array} [options.modules] a list of modules to override the default modules + * @param {Array} [options.additionalModules] a list of modules to use with the default modules + */ +function Modeler(options) { + Viewer.call(this, options); +} + +inherits(Modeler, Viewer); + +Modeler.prototype.createDiagram = function(done) { + return this.importXML(initialDiagram, done); +}; + +Modeler.prototype.createModdle = function() { + var moddle = Viewer.prototype.createModdle.call(this); + + IdSupport.extend(moddle, new Ids([ 32, 36, 1 ])); + + return moddle; +}; + + +Modeler.prototype._interactionModules = [ + // non-modeling components + _dereq_(14), + _dereq_(173), + _dereq_(170), + _dereq_(171) +]; + +Modeler.prototype._modelingModules = [ + // modeling components + _dereq_(131), + _dereq_(91), + _dereq_(144), + _dereq_(158), + _dereq_(107), + _dereq_(10), + _dereq_(39), + _dereq_(30), + _dereq_(8), + _dereq_(34) +]; + + +// modules the modeler is composed of +// +// - viewer modules +// - interaction modules +// - modeling modules + +Modeler.prototype._modules = [].concat( + Modeler.prototype._modules, + Modeler.prototype._interactionModules, + Modeler.prototype._modelingModules); + + +module.exports = Modeler; + +},{"10":10,"107":107,"131":131,"14":14,"144":144,"158":158,"170":170,"171":171,"173":173,"193":193,"195":195,"2":2,"30":30,"34":34,"39":39,"50":50,"8":8,"91":91}],2:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325), + omit = _dereq_(329), + isString = _dereq_(322), + isNumber = _dereq_(319); + +var domify = _dereq_(343), + domQuery = _dereq_(346), + domRemove = _dereq_(347); + +var Diagram = _dereq_(73), + BpmnModdle = _dereq_(48); + +var Importer = _dereq_(42); + + +function initListeners(diagram, listeners) { + var events = diagram.get('eventBus'); + + listeners.forEach(function(l) { + events.on(l.event, l.handler); + }); +} + +function checkValidationError(err) { + + // check if we can help the user by indicating wrong BPMN 2.0 xml + // (in case he or the exporting tool did not get that right) + + var pattern = /unparsable content <([^>]+)> detected([\s\S]*)$/; + var match = pattern.exec(err.message); + + if (match) { + err.message = + 'unparsable content <' + match[1] + '> detected; ' + + 'this may indicate an invalid BPMN 2.0 diagram file' + match[2]; + } + + return err; +} + +var DEFAULT_OPTIONS = { + width: '100%', + height: '100%', + position: 'relative', + container: 'body' +}; + + +/** + * Ensure the passed argument is a proper unit (defaulting to px) + */ +function ensureUnit(val) { + return val + (isNumber(val) ? 'px' : ''); +} + +/** + * A viewer for BPMN 2.0 diagrams. + * + * Have a look at {@link NavigatedViewer} or {@link Modeler} for bundles that include + * additional features. + * + * + * ## Extending the Viewer + * + * In order to extend the viewer pass extension modules to bootstrap via the + * `additionalModules` option. An extension module is an object that exposes + * named services. + * + * The following example depicts the integration of a simple + * logging component that integrates with interaction events: + * + * + * ```javascript + * + * // logging component + * function InteractionLogger(eventBus) { + * eventBus.on('element.hover', function(event) { + * console.log() + * }) + * } + * + * InteractionLogger.$inject = [ 'eventBus' ]; // minification save + * + * // extension module + * var extensionModule = { + * __init__: [ 'interactionLogger' ], + * interactionLogger: [ 'type', InteractionLogger ] + * }; + * + * // extend the viewer + * var bpmnViewer = new Viewer({ additionalModules: [ extensionModule ] }); + * bpmnViewer.importXML(...); + * ``` + * + * @param {Object} [options] configuration options to pass to the viewer + * @param {DOMElement} [options.container] the container to render the viewer in, defaults to body. + * @param {String|Number} [options.width] the width of the viewer + * @param {String|Number} [options.height] the height of the viewer + * @param {Object} [options.moddleExtensions] extension packages to provide + * @param {Array} [options.modules] a list of modules to override the default modules + * @param {Array} [options.additionalModules] a list of modules to use with the default modules + */ +function Viewer(options) { + + this.options = options = assign({}, DEFAULT_OPTIONS, options || {}); + + var parent = options.container; + + // support jquery element + // unwrap it if passed + if (parent.get) { + parent = parent.get(0); + } + + // support selector + if (isString(parent)) { + parent = domQuery(parent); + } + + var container = this.container = domify('
      '); + parent.appendChild(container); + + assign(container.style, { + width: ensureUnit(options.width), + height: ensureUnit(options.height), + position: options.position + }); + + /** + * The code in the area + * must not be changed, see http://bpmn.io/license for more information + * + * + */ + + /* jshint -W101 */ + + // inlined ../resources/bpmnjs.png + var logoData = 'iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAMAAADypuvZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBQTFRFiMte9PrwldFwfcZPqtqN0+zEyOe1XLgjvuKncsJAZ70y6fXh3vDT////UrQV////G2zN+AAAABB0Uk5T////////////////////AOAjXRkAAAHDSURBVHjavJZJkoUgDEBJmAX8979tM8u3E6x20VlYJfFFMoL4vBDxATxZcakIOJTWSmxvKWVIkJ8jHvlRv1F2LFrVISCZI+tCtQx+XfewgVTfyY3plPiQEAzI3zWy+kR6NBhFBYeBuscJLOUuA2WVLpCjVIaFzrNQZArxAZKUQm6gsj37L9Cb7dnIBUKxENaaMJQqMpDXvSL+ktxdGRm2IsKgJGGPg7atwUG5CcFUEuSv+CwQqizTrvDTNXdMU2bMiDWZd8d7QIySWVRsb2vBBioxOFt4OinPBapL+neAb5KL5IJ8szOza2/DYoipUCx+CjO0Bpsv0V6mktNZ+k8rlABlWG0FrOpKYVo8DT3dBeLEjUBAj7moDogVii7nSS9QzZnFcOVBp1g2PyBQ3Vr5aIapN91VJy33HTJLC1iX2FY6F8gRdaAeIEfVONgtFCzZTmoLEdOjBDfsIOA6128gw3eu1shAajdZNAORxuQDJN5A5PbEG6gNIu24QJD5iNyRMZIr6bsHbCtCU/OaOaSvgkUyDMdDa1BXGf5HJ1To+/Ym6mCKT02Y+/Sa126ZKyd3jxhzpc1r8zVL6YM1Qy/kR4ABAFJ6iQUnivhAAAAAAElFTkSuQmCC'; + + /* jshint +W101 */ + + var linkMarkup = + '
      ' + + '' + + ''; + + container.appendChild(domify(linkMarkup)); + + /* */ +} + +Viewer.prototype.importXML = function(xml, done) { + + var self = this; + + this.moddle = this.createModdle(); + + this.moddle.fromXML(xml, 'bpmn:Definitions', function(err, definitions, context) { + + if (err) { + err = checkValidationError(err); + return done(err); + } + + var parseWarnings = context.warnings; + + self.importDefinitions(definitions, function(err, importWarnings) { + if (err) { + return done(err); + } + + done(null, parseWarnings.concat(importWarnings || [])); + }); + }); +}; + +Viewer.prototype.saveXML = function(options, done) { + + if (!done) { + done = options; + options = {}; + } + + var definitions = this.definitions; + + if (!definitions) { + return done(new Error('no definitions loaded')); + } + + this.moddle.toXML(definitions, options, done); +}; + +Viewer.prototype.createModdle = function() { + return new BpmnModdle(this.options.moddleExtensions); +}; + +Viewer.prototype.saveSVG = function(options, done) { + + if (!done) { + done = options; + options = {}; + } + + var canvas = this.get('canvas'); + + var contentNode = canvas.getDefaultLayer(), + defsNode = canvas._svg.select('defs'); + + var contents = contentNode.innerSVG(), + defs = (defsNode && defsNode.outerSVG()) || ''; + + var bbox = contentNode.getBBox(); + + var svg = + '\n' + + '\n' + + '\n' + + '' + + defs + contents + + ''; + + done(null, svg); +}; + +Viewer.prototype.get = function(name) { + + if (!this.diagram) { + throw new Error('no diagram loaded'); + } + + return this.diagram.get(name); +}; + +Viewer.prototype.invoke = function(fn) { + + if (!this.diagram) { + throw new Error('no diagram loaded'); + } + + return this.diagram.invoke(fn); +}; + +Viewer.prototype.importDefinitions = function(definitions, done) { + + // use try/catch to not swallow synchronous exceptions + // that may be raised during model parsing + try { + if (this.diagram) { + this.clear(); + } + + this.definitions = definitions; + + var diagram = this.diagram = this._createDiagram(this.options); + + this._init(diagram); + + Importer.importBpmnDiagram(diagram, definitions, done); + } catch (e) { + done(e); + } +}; + +Viewer.prototype._init = function(diagram) { + initListeners(diagram, this.__listeners || []); +}; + +Viewer.prototype._createDiagram = function(options) { + + var modules = [].concat(options.modules || this.getModules(), options.additionalModules || []); + + // add self as an available service + modules.unshift({ + bpmnjs: [ 'value', this ], + moddle: [ 'value', this.moddle ] + }); + + options = omit(options, 'additionalModules'); + + options = assign(options, { + canvas: { container: this.container }, + modules: modules + }); + + return new Diagram(options); +}; + + +Viewer.prototype.getModules = function() { + return this._modules; +}; + +/** + * Remove all drawn elements from the viewer. + * + * After calling this method the viewer can still + * be reused for opening another diagram. + */ +Viewer.prototype.clear = function() { + var diagram = this.diagram; + + if (diagram) { + diagram.destroy(); + } +}; + +/** + * Destroy the viewer instance and remove all its remainders + * from the document tree. + */ +Viewer.prototype.destroy = function() { + // clear underlying diagram + this.clear(); + + // remove container + domRemove(this.container); +}; + +/** + * Register an event listener on the viewer + * + * @param {String} event + * @param {Function} handler + */ +Viewer.prototype.on = function(event, handler) { + var diagram = this.diagram, + listeners = this.__listeners = this.__listeners || []; + + listeners.push({ event: event, handler: handler }); + + if (diagram) { + diagram.get('eventBus').on(event, handler); + } +}; + +// modules the viewer is composed of +Viewer.prototype._modules = [ + _dereq_(3), + _dereq_(151), + _dereq_(135) +]; + +module.exports = Viewer; + +},{"135":135,"151":151,"3":3,"319":319,"322":322,"325":325,"329":329,"343":343,"346":346,"347":347,"42":42,"48":48,"73":73}],3:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(6), + _dereq_(44) + ] +}; +},{"44":44,"6":6}],4:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195), + isArray = _dereq_(316), + isObject = _dereq_(320), + assign = _dereq_(325), + forEach = _dereq_(204), + every = _dereq_(201), + includes = _dereq_(206), + some = _dereq_(210); + +var DefaultRenderer = _dereq_(84), + TextUtil = _dereq_(184), + DiUtil = _dereq_(45); + +var createLine = DefaultRenderer.createLine; + + +function BpmnRenderer(events, styles, pathMap) { + + DefaultRenderer.call(this, styles); + + var TASK_BORDER_RADIUS = 10; + var INNER_OUTER_DIST = 3; + + var LABEL_STYLE = { + fontFamily: 'Arial, sans-serif', + fontSize: '12px' + }; + + var textUtil = new TextUtil({ + style: LABEL_STYLE, + size: { width: 100 } + }); + + var markers = {}; + + function addMarker(id, element) { + markers[id] = element; + } + + function marker(id) { + return markers[id]; + } + + function initMarkers(svg) { + + function createMarker(id, options) { + var attrs = assign({ + fill: 'black', + strokeWidth: 1, + strokeLinecap: 'round', + strokeDasharray: 'none' + }, options.attrs); + + var ref = options.ref || { x: 0, y: 0 }; + + var scale = options.scale || 1; + + // fix for safari / chrome / firefox bug not correctly + // resetting stroke dash array + if (attrs.strokeDasharray === 'none') { + attrs.strokeDasharray = [10000, 1]; + } + + var marker = options.element + .attr(attrs) + .marker(0, 0, 20, 20, ref.x, ref.y) + .attr({ + markerWidth: 20 * scale, + markerHeight: 20 * scale + }); + + return addMarker(id, marker); + } + + + createMarker('sequenceflow-end', { + element: svg.path('M 1 5 L 11 10 L 1 15 Z'), + ref: { x: 11, y: 10 }, + scale: 0.5 + }); + + createMarker('messageflow-start', { + element: svg.circle(6, 6, 3.5), + attrs: { + fill: 'white', + stroke: 'black' + }, + ref: { x: 6, y: 6 } + }); + + createMarker('messageflow-end', { + element: svg.path('m 1 5 l 0 -3 l 7 3 l -7 3 z'), + attrs: { + fill: 'white', + stroke: 'black', + strokeLinecap: 'butt' + }, + ref: { x: 8.5, y: 5 } + }); + + createMarker('data-association-end', { + element: svg.path('M 1 5 L 11 10 L 1 15'), + attrs: { + fill: 'white', + stroke: 'black' + }, + ref: { x: 11, y: 10 }, + scale: 0.5 + }); + + createMarker('conditional-flow-marker', { + element: svg.path('M 0 10 L 8 6 L 16 10 L 8 14 Z'), + attrs: { + fill: 'white', + stroke: 'black' + }, + ref: { x: -1, y: 10 }, + scale: 0.5 + }); + + createMarker('conditional-default-flow-marker', { + element: svg.path('M 1 4 L 5 16'), + attrs: { + stroke: 'black' + }, + ref: { x: -5, y: 10 }, + scale: 0.5 + }); + } + + function computeStyle(custom, traits, defaultStyles) { + if (!isArray(traits)) { + defaultStyles = traits; + traits = []; + } + + return styles.style(traits || [], assign(defaultStyles, custom || {})); + } + + function drawCircle(p, width, height, offset, attrs) { + + if (isObject(offset)) { + attrs = offset; + offset = 0; + } + + offset = offset || 0; + + attrs = computeStyle(attrs, { + stroke: 'black', + strokeWidth: 2, + fill: 'white' + }); + + var cx = width / 2, + cy = height / 2; + + return p.circle(cx, cy, Math.round((width + height) / 4 - offset)).attr(attrs); + } + + function drawRect(p, width, height, r, offset, attrs) { + + if (isObject(offset)) { + attrs = offset; + offset = 0; + } + + offset = offset || 0; + + attrs = computeStyle(attrs, { + stroke: 'black', + strokeWidth: 2, + fill: 'white' + }); + + return p.rect(offset, offset, width - offset * 2, height - offset * 2, r).attr(attrs); + } + + function drawDiamond(p, width, height, attrs) { + + var x_2 = width / 2; + var y_2 = height / 2; + + var points = [x_2, 0, width, y_2, x_2, height, 0, y_2 ]; + + attrs = computeStyle(attrs, { + stroke: 'black', + strokeWidth: 2, + fill: 'white' + }); + + return p.polygon(points).attr(attrs); + } + + function drawLine(p, waypoints, attrs) { + attrs = computeStyle(attrs, [ 'no-fill' ], { + stroke: 'black', + strokeWidth: 2, + fill: 'none' + }); + + return createLine(waypoints, attrs).appendTo(p); + } + + function drawPath(p, d, attrs) { + + attrs = computeStyle(attrs, [ 'no-fill' ], { + strokeWidth: 2, + stroke: 'black' + }); + + return p.path(d).attr(attrs); + } + + function as(type) { + return function(p, element) { + return handlers[type](p, element); + }; + } + + function renderer(type) { + return handlers[type]; + } + + function renderEventContent(element, p) { + + var event = getSemantic(element); + var isThrowing = isThrowEvent(event); + + if (isTypedEvent(event, 'bpmn:MessageEventDefinition')) { + return renderer('bpmn:MessageEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:TimerEventDefinition')) { + return renderer('bpmn:TimerEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:ConditionalEventDefinition')) { + return renderer('bpmn:ConditionalEventDefinition')(p, element); + } + + if (isTypedEvent(event, 'bpmn:SignalEventDefinition')) { + return renderer('bpmn:SignalEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:CancelEventDefinition') && + isTypedEvent(event, 'bpmn:TerminateEventDefinition', { parallelMultiple: false })) { + return renderer('bpmn:MultipleEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:CancelEventDefinition') && + isTypedEvent(event, 'bpmn:TerminateEventDefinition', { parallelMultiple: true })) { + return renderer('bpmn:ParallelMultipleEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:EscalationEventDefinition')) { + return renderer('bpmn:EscalationEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:LinkEventDefinition')) { + return renderer('bpmn:LinkEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:ErrorEventDefinition')) { + return renderer('bpmn:ErrorEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:CancelEventDefinition')) { + return renderer('bpmn:CancelEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:CompensateEventDefinition')) { + return renderer('bpmn:CompensateEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:TerminateEventDefinition')) { + return renderer('bpmn:TerminateEventDefinition')(p, element, isThrowing); + } + + return null; + } + + function renderLabel(p, label, options) { + return textUtil.createText(p, label || '', options).addClass('djs-label'); + } + + function renderEmbeddedLabel(p, element, align) { + var semantic = getSemantic(element); + return renderLabel(p, semantic.name, { box: element, align: align, padding: 5 }); + } + + function renderExternalLabel(p, element, align) { + var semantic = getSemantic(element); + + if (!semantic.name) { + element.hidden = true; + } + + return renderLabel(p, semantic.name, { box: element, align: align, style: { fontSize: '11px' } }); + } + + function renderLaneLabel(p, text, element) { + var textBox = renderLabel(p, text, { + box: { height: 30, width: element.height }, + align: 'center-middle' + }); + + var top = -1 * element.height; + textBox.transform( + 'rotate(270) ' + + 'translate(' + top + ',' + 0 + ')' + ); + } + + function createPathFromConnection(connection) { + var waypoints = connection.waypoints; + + var pathData = 'm ' + waypoints[0].x + ',' + waypoints[0].y; + for (var i = 1; i < waypoints.length; i++) { + pathData += 'L' + waypoints[i].x + ',' + waypoints[i].y + ' '; + } + return pathData; + } + + var handlers = { + 'bpmn:Event': function(p, element, attrs) { + return drawCircle(p, element.width, element.height, attrs); + }, + 'bpmn:StartEvent': function(p, element) { + var attrs = {}; + var semantic = getSemantic(element); + + if (!semantic.isInterrupting) { + attrs = { + strokeDasharray: '6', + strokeLinecap: 'round' + }; + } + + var circle = renderer('bpmn:Event')(p, element, attrs); + + renderEventContent(element, p); + + return circle; + }, + 'bpmn:MessageEventDefinition': function(p, element, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_MESSAGE', { + xScaleFactor: 0.9, + yScaleFactor: 0.9, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.235, + my: 0.315 + } + }); + + var fill = isThrowing ? 'black' : 'white'; + var stroke = isThrowing ? 'white' : 'black'; + + var messagePath = drawPath(p, pathData, { + strokeWidth: 1, + fill: fill, + stroke: stroke + }); + + return messagePath; + }, + 'bpmn:TimerEventDefinition': function(p, element) { + + var circle = drawCircle(p, element.width, element.height, 0.2 * element.height, { + strokeWidth: 2 + }); + + var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', { + xScaleFactor: 0.75, + yScaleFactor: 0.75, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.5, + my: 0.5 + } + }); + + drawPath(p, pathData, { + strokeWidth: 2, + strokeLinecap: 'square' + }); + + for(var i = 0;i < 12;i++) { + + var linePathData = pathMap.getScaledPath('EVENT_TIMER_LINE', { + xScaleFactor: 0.75, + yScaleFactor: 0.75, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.5, + my: 0.5 + } + }); + + var width = element.width / 2; + var height = element.height / 2; + + drawPath(p, linePathData, { + strokeWidth: 1, + strokeLinecap: 'square', + transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')' + }); + } + + return circle; + }, + 'bpmn:EscalationEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_ESCALATION', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.5, + my: 0.555 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:ConditionalEventDefinition': function(p, event) { + var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.5, + my: 0.222 + } + }); + + return drawPath(p, pathData, { + strokeWidth: 1 + }); + }, + 'bpmn:LinkEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_LINK', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.57, + my: 0.263 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:ErrorEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_ERROR', { + xScaleFactor: 1.1, + yScaleFactor: 1.1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.2, + my: 0.722 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:CancelEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', { + xScaleFactor: 1.0, + yScaleFactor: 1.0, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.638, + my: -0.055 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }).transform('rotate(45)'); + }, + 'bpmn:CompensateEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.201, + my: 0.472 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:SignalEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_SIGNAL', { + xScaleFactor: 0.9, + yScaleFactor: 0.9, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.5, + my: 0.2 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:MultipleEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', { + xScaleFactor: 1.1, + yScaleFactor: 1.1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.222, + my: 0.36 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:ParallelMultipleEventDefinition': function(p, event) { + var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', { + xScaleFactor: 1.2, + yScaleFactor: 1.2, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.458, + my: 0.194 + } + }); + + return drawPath(p, pathData, { + strokeWidth: 1 + }); + }, + 'bpmn:EndEvent': function(p, element) { + var circle = renderer('bpmn:Event')(p, element, { + strokeWidth: 4 + }); + + renderEventContent(element, p, true); + + return circle; + }, + 'bpmn:TerminateEventDefinition': function(p, element) { + var circle = drawCircle(p, element.width, element.height, 8, { + strokeWidth: 4, + fill: 'black' + }); + + return circle; + }, + 'bpmn:IntermediateEvent': function(p, element) { + var outer = renderer('bpmn:Event')(p, element, { strokeWidth: 1 }); + /* inner */ drawCircle(p, element.width, element.height, INNER_OUTER_DIST, { strokeWidth: 1, fill: 'none' }); + + renderEventContent(element, p); + + return outer; + }, + 'bpmn:IntermediateCatchEvent': as('bpmn:IntermediateEvent'), + 'bpmn:IntermediateThrowEvent': as('bpmn:IntermediateEvent'), + + 'bpmn:Activity': function(p, element, attrs) { + return drawRect(p, element.width, element.height, TASK_BORDER_RADIUS, attrs); + }, + + 'bpmn:Task': function(p, element, attrs) { + var rect = renderer('bpmn:Activity')(p, element, attrs); + renderEmbeddedLabel(p, element, 'center-middle'); + attachTaskMarkers(p, element); + return rect; + }, + 'bpmn:ServiceTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', { + abspos: { + x: 12, + y: 18 + } + }); + + /* service bg */ drawPath(p, pathDataBG, { + strokeWidth: 1, + fill: 'none' + }); + + var fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', { + abspos: { + x: 17.2, + y: 18 + } + }); + + /* service fill */ drawPath(p, fillPathData, { + strokeWidth: 0, + stroke: 'none', + fill: 'white' + }); + + var pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', { + abspos: { + x: 17, + y: 22 + } + }); + + /* service */ drawPath(p, pathData, { + strokeWidth: 1, + fill: 'white' + }); + + return task; + }, + 'bpmn:UserTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var x = 15; + var y = 12; + + var pathData = pathMap.getScaledPath('TASK_TYPE_USER_1', { + abspos: { + x: x, + y: y + } + }); + + /* user path */ drawPath(p, pathData, { + strokeWidth: 0.5, + fill: 'none' + }); + + var pathData2 = pathMap.getScaledPath('TASK_TYPE_USER_2', { + abspos: { + x: x, + y: y + } + }); + + /* user2 path */ drawPath(p, pathData2, { + strokeWidth: 0.5, + fill: 'none' + }); + + var pathData3 = pathMap.getScaledPath('TASK_TYPE_USER_3', { + abspos: { + x: x, + y: y + } + }); + + /* user3 path */ drawPath(p, pathData3, { + strokeWidth: 0.5, + fill: 'black' + }); + + return task; + }, + 'bpmn:ManualTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', { + abspos: { + x: 17, + y: 15 + } + }); + + /* manual path */ drawPath(p, pathData, { + strokeWidth: 0.25, + fill: 'white', + stroke: 'black' + }); + + return task; + }, + 'bpmn:SendTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: 21, + containerHeight: 14, + position: { + mx: 0.285, + my: 0.357 + } + }); + + /* send path */ drawPath(p, pathData, { + strokeWidth: 1, + fill: 'black', + stroke: 'white' + }); + + return task; + }, + 'bpmn:ReceiveTask' : function(p, element) { + var semantic = getSemantic(element); + + var task = renderer('bpmn:Task')(p, element); + var pathData; + + if (semantic.instantiate) { + drawCircle(p, 28, 28, 20 * 0.22, { strokeWidth: 1 }); + + pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', { + abspos: { + x: 7.77, + y: 9.52 + } + }); + } else { + + pathData = pathMap.getScaledPath('TASK_TYPE_SEND', { + xScaleFactor: 0.9, + yScaleFactor: 0.9, + containerWidth: 21, + containerHeight: 14, + position: { + mx: 0.3, + my: 0.4 + } + }); + } + + /* receive path */ drawPath(p, pathData, { + strokeWidth: 1 + }); + + return task; + }, + 'bpmn:ScriptTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', { + abspos: { + x: 15, + y: 20 + } + }); + + /* script path */ drawPath(p, pathData, { + strokeWidth: 1 + }); + + return task; + }, + 'bpmn:BusinessRuleTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', { + abspos: { + x: 8, + y: 8 + } + }); + + var businessHeaderPath = drawPath(p, headerPathData); + businessHeaderPath.attr({ + strokeWidth: 1, + fill: 'AAA' + }); + + var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', { + abspos: { + x: 8, + y: 8 + } + }); + + var businessPath = drawPath(p, headerData); + businessPath.attr({ + strokeWidth: 1 + }); + + return task; + }, + 'bpmn:SubProcess': function(p, element, attrs) { + var rect = renderer('bpmn:Activity')(p, element, attrs); + + var semantic = getSemantic(element); + + var expanded = DiUtil.isExpanded(semantic); + + var isEventSubProcess = !!semantic.triggeredByEvent; + if (isEventSubProcess) { + rect.attr({ + strokeDasharray: '1,2' + }); + } + + renderEmbeddedLabel(p, element, expanded ? 'center-top' : 'center-middle'); + + if (expanded) { + attachTaskMarkers(p, element); + } else { + attachTaskMarkers(p, element, ['SubProcessMarker']); + } + + return rect; + }, + 'bpmn:AdHocSubProcess': function(p, element) { + return renderer('bpmn:SubProcess')(p, element); + }, + 'bpmn:Transaction': function(p, element) { + var outer = renderer('bpmn:SubProcess')(p, element); + + var innerAttrs = styles.style([ 'no-fill', 'no-events' ]); + + /* inner path */ drawRect(p, element.width, element.height, TASK_BORDER_RADIUS - 2, INNER_OUTER_DIST, innerAttrs); + + return outer; + }, + 'bpmn:CallActivity': function(p, element) { + return renderer('bpmn:Task')(p, element, { + strokeWidth: 5 + }); + }, + 'bpmn:Participant': function(p, element) { + + var lane = renderer('bpmn:Lane')(p, element, { + fill: 'White' + }); + + var expandedPool = DiUtil.isExpanded(element); + + if (expandedPool) { + drawLine(p, [ + { x: 30, y: 0 }, + { x: 30, y: element.height } + ]); + var text = getSemantic(element).name; + renderLaneLabel(p, text, element); + } else { + // Collapsed pool draw text inline + var text2 = getSemantic(element).name; + renderLabel(p, text2, { box: element, align: 'center-middle' }); + } + + var participantMultiplicity = !!(getSemantic(element).participantMultiplicity); + + if(participantMultiplicity) { + renderer('ParticipantMultiplicityMarker')(p, element); + } + + return lane; + }, + 'bpmn:Lane': function(p, element, attrs) { + var rect = drawRect(p, element.width, element.height, 0, attrs || { + fill: 'none' + }); + + var semantic = getSemantic(element); + + if (semantic.$type === 'bpmn:Lane') { + var text = semantic.name; + renderLaneLabel(p, text, element); + } + + return rect; + }, + 'bpmn:InclusiveGateway': function(p, element) { + var diamond = drawDiamond(p, element.width, element.height); + + /* circle path */ + drawCircle(p, element.width, element.height, element.height * 0.24, { + strokeWidth: 2.5, + fill: 'none' + }); + + return diamond; + }, + 'bpmn:ExclusiveGateway': function(p, element) { + var diamond = drawDiamond(p, element.width, element.height); + + var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', { + xScaleFactor: 0.4, + yScaleFactor: 0.4, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.32, + my: 0.3 + } + }); + + if (!!(getDi(element).isMarkerVisible)) { + drawPath(p, pathData, { + strokeWidth: 1, + fill: 'black' + }); + } + + return diamond; + }, + 'bpmn:ComplexGateway': function(p, element) { + var diamond = drawDiamond(p, element.width, element.height); + + var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', { + xScaleFactor: 0.5, + yScaleFactor:0.5, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.46, + my: 0.26 + } + }); + + /* complex path */ drawPath(p, pathData, { + strokeWidth: 1, + fill: 'black' + }); + + return diamond; + }, + 'bpmn:ParallelGateway': function(p, element) { + var diamond = drawDiamond(p, element.width, element.height); + + var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', { + xScaleFactor: 0.6, + yScaleFactor:0.6, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.46, + my: 0.2 + } + }); + + /* parallel path */ drawPath(p, pathData, { + strokeWidth: 1, + fill: 'black' + }); + + return diamond; + }, + 'bpmn:EventBasedGateway': function(p, element) { + + var semantic = getSemantic(element); + + var diamond = drawDiamond(p, element.width, element.height); + + /* outer circle path */ drawCircle(p, element.width, element.height, element.height * 0.20, { + strokeWidth: 1, + fill: 'none' + }); + + var type = semantic.eventGatewayType; + var instantiate = !!semantic.instantiate; + + function drawEvent() { + + var pathData = pathMap.getScaledPath('GATEWAY_EVENT_BASED', { + xScaleFactor: 0.18, + yScaleFactor: 0.18, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.36, + my: 0.44 + } + }); + + /* event path */ drawPath(p, pathData, { + strokeWidth: 2, + fill: 'none' + }); + } + + if (type === 'Parallel') { + + var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', { + xScaleFactor: 0.4, + yScaleFactor:0.4, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.474, + my: 0.296 + } + }); + + var parallelPath = drawPath(p, pathData); + parallelPath.attr({ + strokeWidth: 1, + fill: 'none' + }); + } else if (type === 'Exclusive') { + + if (!instantiate) { + var innerCircle = drawCircle(p, element.width, element.height, element.height * 0.26); + innerCircle.attr({ + strokeWidth: 1, + fill: 'none' + }); + } + + drawEvent(); + } + + + return diamond; + }, + 'bpmn:Gateway': function(p, element) { + return drawDiamond(p, element.width, element.height); + }, + 'bpmn:SequenceFlow': function(p, element) { + var pathData = createPathFromConnection(element); + var path = drawPath(p, pathData, { + strokeLinejoin: 'round', + markerEnd: marker('sequenceflow-end') + }); + + var sequenceFlow = getSemantic(element); + var source = element.source.businessObject; + + // conditional flow marker + if (sequenceFlow.conditionExpression && source.$instanceOf('bpmn:Task')) { + path.attr({ + markerStart: marker('conditional-flow-marker') + }); + } + + // default marker + if (source.default && source.$instanceOf('bpmn:Gateway') && source.default === sequenceFlow) { + path.attr({ + markerStart: marker('conditional-default-flow-marker') + }); + } + + return path; + }, + 'bpmn:Association': function(p, element, attrs) { + + attrs = assign({ + strokeDasharray: '1,6', + strokeLinecap: 'round', + strokeLinejoin: 'round' + }, attrs || {}); + + // TODO(nre): style according to directed state + return drawLine(p, element.waypoints, attrs); + }, + 'bpmn:DataInputAssociation': function(p, element) { + return renderer('bpmn:Association')(p, element, { + markerEnd: marker('data-association-end') + }); + }, + 'bpmn:DataOutputAssociation': function(p, element) { + return renderer('bpmn:Association')(p, element, { + markerEnd: marker('data-association-end') + }); + }, + 'bpmn:MessageFlow': function(p, element) { + + var semantic = getSemantic(element), + di = getDi(element); + + var pathData = createPathFromConnection(element); + var path = drawPath(p, pathData, { + markerEnd: marker('messageflow-end'), + markerStart: marker('messageflow-start'), + strokeDasharray: '10, 12', + strokeLinecap: 'round', + strokeLinejoin: 'round', + strokeWidth: '1.5px' + }); + + if (semantic.messageRef) { + var midPoint = path.getPointAtLength(path.getTotalLength() / 2); + + var markerPathData = pathMap.getScaledPath('MESSAGE_FLOW_MARKER', { + abspos: { + x: midPoint.x, + y: midPoint.y + } + }); + + var messageAttrs = { strokeWidth: 1 }; + + if (di.messageVisibleKind === 'initiating') { + messageAttrs.fill = 'white'; + messageAttrs.stroke = 'black'; + } else { + messageAttrs.fill = '#888'; + messageAttrs.stroke = 'white'; + } + + drawPath(p, markerPathData, messageAttrs); + } + + return path; + }, + 'bpmn:DataObject': function(p, element) { + var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.474, + my: 0.296 + } + }); + + var elementObject = drawPath(p, pathData, { fill: 'white' }); + + var semantic = getSemantic(element); + + if (isCollection(semantic)) { + renderDataItemCollection(p, element); + } + + return elementObject; + }, + 'bpmn:DataObjectReference': as('bpmn:DataObject'), + 'bpmn:DataInput': function(p, element) { + + var arrowPathData = pathMap.getRawPath('DATA_ARROW'); + + // page + var elementObject = renderer('bpmn:DataObject')(p, element); + + /* input arrow path */ drawPath(p, arrowPathData, { strokeWidth: 1 }); + + return elementObject; + }, + 'bpmn:DataOutput': function(p, element) { + var arrowPathData = pathMap.getRawPath('DATA_ARROW'); + + // page + var elementObject = renderer('bpmn:DataObject')(p, element); + + /* output arrow path */ drawPath(p, arrowPathData, { + strokeWidth: 1, + fill: 'black' + }); + + return elementObject; + }, + 'bpmn:DataStoreReference': function(p, element) { + var DATA_STORE_PATH = pathMap.getScaledPath('DATA_STORE', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0, + my: 0.133 + } + }); + + var elementStore = drawPath(p, DATA_STORE_PATH, { + strokeWidth: 2, + fill: 'white' + }); + + return elementStore; + }, + 'bpmn:BoundaryEvent': function(p, element) { + + var semantic = getSemantic(element), + cancel = semantic.cancelActivity; + + var attrs = { + strokeLinecap: 'round', + strokeWidth: 1 + }; + + if (!cancel) { + attrs.strokeDasharray = '6'; + } + + var outer = renderer('bpmn:Event')(p, element, attrs); + /* inner path */ drawCircle(p, element.width, element.height, INNER_OUTER_DIST, attrs); + + renderEventContent(element, p); + + return outer; + }, + 'bpmn:Group': function(p, element) { + return drawRect(p, element.width, element.height, TASK_BORDER_RADIUS, { + strokeWidth: 1, + strokeDasharray: '8,3,1,3', + fill: 'none', + pointerEvents: 'none' + }); + }, + 'label': function(p, element) { + return renderExternalLabel(p, element, ''); + }, + 'bpmn:TextAnnotation': function(p, element) { + var style = { + 'fill': 'none', + 'stroke': 'none' + }; + var textElement = drawRect(p, element.width, element.height, 0, 0, style); + var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.0, + my: 0.0 + } + }); + drawPath(p, textPathData); + + var text = getSemantic(element).text || ''; + renderLabel(p, text, { box: element, align: 'left-middle', padding: 5 }); + + return textElement; + }, + 'ParticipantMultiplicityMarker': function(p, element) { + var subProcessPath = pathMap.getScaledPath('MARKER_PARALLEL', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2) / element.width), + my: (element.height - 15) / element.height + } + }); + + drawPath(p, subProcessPath); + }, + 'SubProcessMarker': function(p, element) { + var markerRect = drawRect(p, 14, 14, 0, { + strokeWidth: 1 + }); + + // Process marker is placed in the middle of the box + // therefore fixed values can be used here + markerRect.transform('translate(' + (element.width / 2 - 7.5) + ',' + (element.height - 20) + ')'); + + var subProcessPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', { + xScaleFactor: 1.5, + yScaleFactor: 1.5, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: (element.width / 2 - 7.5) / element.width, + my: (element.height - 20) / element.height + } + }); + + drawPath(p, subProcessPath); + }, + 'ParallelMarker': function(p, element, position) { + var subProcessPath = pathMap.getScaledPath('MARKER_PARALLEL', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.parallel) / element.width), + my: (element.height - 20) / element.height + } + }); + drawPath(p, subProcessPath); + }, + 'SequentialMarker': function(p, element, position) { + var sequentialPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.seq) / element.width), + my: (element.height - 19) / element.height + } + }); + drawPath(p, sequentialPath); + }, + 'CompensationMarker': function(p, element, position) { + var compensationPath = pathMap.getScaledPath('MARKER_COMPENSATION', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.compensation) / element.width), + my: (element.height - 13) / element.height + } + }); + drawPath(p, compensationPath, { strokeWidth: 1 }); + }, + 'LoopMarker': function(p, element, position) { + var loopPath = pathMap.getScaledPath('MARKER_LOOP', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.loop) / element.width), + my: (element.height - 7) / element.height + } + }); + + drawPath(p, loopPath, { + strokeWidth: 1, + fill: 'none', + strokeLinecap: 'round', + strokeMiterlimit: 0.5 + }); + }, + 'AdhocMarker': function(p, element, position) { + var loopPath = pathMap.getScaledPath('MARKER_ADHOC', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.adhoc) / element.width), + my: (element.height - 15) / element.height + } + }); + + drawPath(p, loopPath, { + strokeWidth: 1, + fill: 'black' + }); + } + }; + + function attachTaskMarkers(p, element, taskMarkers) { + var obj = getSemantic(element); + + var subprocess = includes(taskMarkers, 'SubProcessMarker'); + var position; + + if (subprocess) { + position = { + seq: -21, + parallel: -22, + compensation: -42, + loop: -18, + adhoc: 10 + }; + } else { + position = { + seq: -3, + parallel: -6, + compensation: -27, + loop: 0, + adhoc: 10 + }; + } + + forEach(taskMarkers, function(marker) { + renderer(marker)(p, element, position); + }); + + if (obj.$type === 'bpmn:AdHocSubProcess') { + renderer('AdhocMarker')(p, element, position); + } + if (obj.loopCharacteristics && obj.loopCharacteristics.isSequential === undefined) { + renderer('LoopMarker')(p, element, position); + return; + } + if (obj.loopCharacteristics && + obj.loopCharacteristics.isSequential !== undefined && + !obj.loopCharacteristics.isSequential) { + renderer('ParallelMarker')(p, element, position); + } + if (obj.loopCharacteristics && !!obj.loopCharacteristics.isSequential) { + renderer('SequentialMarker')(p, element, position); + } + if (!!obj.isForCompensation) { + renderer('CompensationMarker')(p, element, position); + } + } + + function drawShape(parent, element) { + var type = element.type; + var h = handlers[type]; + + /* jshint -W040 */ + if (!h) { + return DefaultRenderer.prototype.drawShape.apply(this, [ parent, element ]); + } else { + return h(parent, element); + } + } + + function drawConnection(parent, element) { + var type = element.type; + var h = handlers[type]; + + /* jshint -W040 */ + if (!h) { + return DefaultRenderer.prototype.drawConnection.apply(this, [ parent, element ]); + } else { + return h(parent, element); + } + } + + function renderDataItemCollection(p, element) { + + var yPosition = (element.height - 16) / element.height; + + var pathData = pathMap.getScaledPath('DATA_OBJECT_COLLECTION_PATH', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.451, + my: yPosition + } + }); + + /* collection path */ drawPath(p, pathData, { + strokeWidth: 2 + }); + } + + function isCollection(element, filter) { + return element.isCollection || + (element.elementObjectRef && element.elementObjectRef.isCollection); + } + + function getDi(element) { + return element.businessObject.di; + } + + function getSemantic(element) { + return element.businessObject; + } + + /** + * Checks if eventDefinition of the given element matches with semantic type. + * + * @return {boolean} true if element is of the given semantic type + */ + function isTypedEvent(event, eventDefinitionType, filter) { + + function matches(definition, filter) { + return every(filter, function(val, key) { + + // we want a == conversion here, to be able to catch + // undefined == false and friends + /* jshint -W116 */ + return definition[key] == val; + }); + } + + return some(event.eventDefinitions, function(definition) { + return definition.$type === eventDefinitionType && matches(event, filter); + }); + } + + function isThrowEvent(event) { + return (event.$type === 'bpmn:IntermediateThrowEvent') || (event.$type === 'bpmn:EndEvent'); + } + + + /////// cropping path customizations ///////////////////////// + + function componentsToPath(elements) { + return elements.join(',').replace(/,?([A-z]),?/g, '$1'); + } + + function getCirclePath(shape) { + + var cx = shape.x + shape.width / 2, + cy = shape.y + shape.height / 2, + radius = shape.width / 2; + + var circlePath = [ + ['M', cx, cy], + ['m', 0, -radius], + ['a', radius, radius, 0, 1, 1, 0, 2 * radius], + ['a', radius, radius, 0, 1, 1, 0, -2 * radius], + ['z'] + ]; + + return componentsToPath(circlePath); + } + + function getRoundRectPath(shape) { + + var radius = TASK_BORDER_RADIUS, + x = shape.x, + y = shape.y, + width = shape.width, + height = shape.height; + + var roundRectPath = [ + ['M', x + radius, y], + ['l', width - radius * 2, 0], + ['a', radius, radius, 0, 0, 1, radius, radius], + ['l', 0, height - radius * 2], + ['a', radius, radius, 0, 0, 1, -radius, radius], + ['l', radius * 2 - width, 0], + ['a', radius, radius, 0, 0, 1, -radius, -radius], + ['l', 0, radius * 2 - height], + ['a', radius, radius, 0, 0, 1, radius, -radius], + ['z'] + ]; + + return componentsToPath(roundRectPath); + } + + function getDiamondPath(shape) { + + var width = shape.width, + height = shape.height, + x = shape.x, + y = shape.y, + halfWidth = width / 2, + halfHeight = height / 2; + + var diamondPath = [ + ['M', x + halfWidth, y], + ['l', halfWidth, halfHeight], + ['l', -halfWidth, halfHeight], + ['l', -halfWidth, -halfHeight], + ['z'] + ]; + + return componentsToPath(diamondPath); + } + + function getRectPath(shape) { + var x = shape.x, + y = shape.y, + width = shape.width, + height = shape.height; + + var rectPath = [ + ['M', x, y], + ['l', width, 0], + ['l', 0, height], + ['l', -width, 0], + ['z'] + ]; + + return componentsToPath(rectPath); + } + + function getShapePath(element) { + var obj = getSemantic(element); + + if (obj.$instanceOf('bpmn:Event')) { + return getCirclePath(element); + } + + if (obj.$instanceOf('bpmn:Activity')) { + return getRoundRectPath(element); + } + + if (obj.$instanceOf('bpmn:Gateway')) { + return getDiamondPath(element); + } + + return getRectPath(element); + } + + + // hook onto canvas init event to initialize + // connection start/end markers on svg + events.on('canvas.init', function(event) { + initMarkers(event.svg); + }); + + this.drawShape = drawShape; + this.drawConnection = drawConnection; + + this.getShapePath = getShapePath; +} + +inherits(BpmnRenderer, DefaultRenderer); + + +BpmnRenderer.$inject = [ 'eventBus', 'styles', 'pathMap' ]; + +module.exports = BpmnRenderer; + +},{"184":184,"195":195,"201":201,"204":204,"206":206,"210":210,"316":316,"320":320,"325":325,"45":45,"84":84}],5:[function(_dereq_,module,exports){ +'use strict'; + +var Snap = _dereq_(188); + +/** + * Map containing SVG paths needed by BpmnRenderer. + */ + +function PathMap() { + + /** + * Contains a map of path elements + * + *

      Path definition

      + * A parameterized path is defined like this: + *
      +   * 'GATEWAY_PARALLEL': {
      +   *   d: 'm {mx},{my} {e.x0},0 0,{e.x1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +
      +          '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',
      +   *   height: 17.5,
      +   *   width:  17.5,
      +   *   heightElements: [2.5, 7.5],
      +   *   widthElements: [2.5, 7.5]
      +   * }
      +   * 
      + *

      It's important to specify a correct height and width for the path as the scaling + * is based on the ratio between the specified height and width in this object and the + * height and width that is set as scale target (Note x,y coordinates will be scaled with + * individual ratios).

      + *

      The 'heightElements' and 'widthElements' array must contain the values that will be scaled. + * The scaling is based on the computed ratios. + * Coordinates on the y axis should be in the heightElement's array, they will be scaled using + * the computed ratio coefficient. + * In the parameterized path the scaled values can be accessed through the 'e' object in {} brackets. + *

        + *
      • The values for the y axis can be accessed in the path string using {e.y0}, {e.y1}, ....
      • + *
      • The values for the x axis can be accessed in the path string using {e.x0}, {e.x1}, ....
      • + *
      + * The numbers x0, x1 respectively y0, y1, ... map to the corresponding array index. + *

      + */ + this.pathMap = { + 'EVENT_MESSAGE': { + d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}', + height: 36, + width: 36, + heightElements: [6, 14], + widthElements: [10.5, 21] + }, + 'EVENT_SIGNAL': { + d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z', + height: 36, + width: 36, + heightElements: [18], + widthElements: [10, 20] + }, + 'EVENT_ESCALATION': { + d: 'm {mx},{my} c -{e.x1},{e.y0} -{e.x3},{e.y1} -{e.x5},{e.y4} {e.x1},-{e.y3} {e.x3},-{e.y5} {e.x5},-{e.y6} ' + + '{e.x0},{e.y3} {e.x2},{e.y5} {e.x4},{e.y6} -{e.x0},-{e.y0} -{e.x2},-{e.y1} -{e.x4},-{e.y4} z', + height: 36, + width: 36, + heightElements: [2.382, 4.764, 4.926, 6.589333, 7.146, 13.178667, 19.768], + widthElements: [2.463, 2.808, 4.926, 5.616, 7.389, 8.424] + }, + 'EVENT_CONDITIONAL': { + d: 'M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z ' + + 'M {e.x2},{e.y3} l {e.x0},0 ' + + 'M {e.x2},{e.y4} l {e.x0},0 ' + + 'M {e.x2},{e.y5} l {e.x0},0 ' + + 'M {e.x2},{e.y6} l {e.x0},0 ' + + 'M {e.x2},{e.y7} l {e.x0},0 ' + + 'M {e.x2},{e.y8} l {e.x0},0 ', + height: 36, + width: 36, + heightElements: [8.5, 14.5, 18, 11.5, 14.5, 17.5, 20.5, 23.5, 26.5], + widthElements: [10.5, 14.5, 12.5] + }, + 'EVENT_LINK': { + d: 'm {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z', + height: 36, + width: 36, + heightElements: [4.4375, 6.75, 7.8125], + widthElements: [9.84375, 13.5] + }, + 'EVENT_ERROR': { + d: 'm {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z', + height: 36, + width: 36, + heightElements: [0.023, 8.737, 8.151, 16.564, 10.591, 8.714], + widthElements: [0.085, 6.672, 6.97, 4.273, 5.337, 6.636] + }, + 'EVENT_CANCEL_45': { + d: 'm {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 ' + + '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z', + height: 36, + width: 36, + heightElements: [4.75, 8.5], + widthElements: [4.75, 8.5] + }, + 'EVENT_COMPENSATION': { + d: 'm {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x0},0 {e.x0},-{e.y0} 0,{e.y1} z', + height: 36, + width: 36, + heightElements: [5, 10], + widthElements: [10] + }, + 'EVENT_TIMER_WH': { + d: 'M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} ', + height: 36, + width: 36, + heightElements: [10, 2], + widthElements: [3, 7] + }, + 'EVENT_TIMER_LINE': { + d: 'M {mx},{my} ' + + 'm {e.x0},{e.y0} l -{e.x1},{e.y1} ', + height: 36, + width: 36, + heightElements: [10, 3], + widthElements: [0, 0] + }, + 'EVENT_MULTIPLE': { + d:'m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z', + height: 36, + width: 36, + heightElements: [6.28099, 12.56199], + widthElements: [3.1405, 9.42149, 12.56198] + }, + 'EVENT_PARALLEL_MULTIPLE': { + d:'m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' + + '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z', + height: 36, + width: 36, + heightElements: [2.56228, 7.68683], + widthElements: [2.56228, 7.68683] + }, + 'GATEWAY_EXCLUSIVE': { + d:'m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} ' + + '{e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} ' + + '{e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z', + height: 17.5, + width: 17.5, + heightElements: [8.5, 6.5312, -6.5312, -8.5], + widthElements: [6.5, -6.5, 3, -3, 5, -5] + }, + 'GATEWAY_PARALLEL': { + d:'m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 ' + + '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z', + height: 30, + width: 30, + heightElements: [5, 12.5], + widthElements: [5, 12.5] + }, + 'GATEWAY_EVENT_BASED': { + d:'m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z', + height: 11, + width: 11, + heightElements: [-6, 6, 12, -12], + widthElements: [9, -3, -12] + }, + 'GATEWAY_COMPLEX': { + d:'m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} ' + + '{e.x2},0 -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} ' + + '{e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} ' + + '-{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z', + height: 17.125, + width: 17.125, + heightElements: [4.875, 3.4375, 2.125, 3], + widthElements: [3.4375, 2.125, 4.875, 3] + }, + 'DATA_OBJECT_PATH': { + d:'m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0', + height: 61, + width: 51, + heightElements: [10, 50, 60], + widthElements: [10, 40, 50, 60] + }, + 'DATA_OBJECT_COLLECTION_PATH': { + d:'m {mx}, {my} ' + + 'm 0 15 l 0 -15 ' + + 'm 4 15 l 0 -15 ' + + 'm 4 15 l 0 -15 ', + height: 61, + width: 51, + heightElements: [12], + widthElements: [1, 6, 12, 15] + }, + 'DATA_ARROW': { + d:'m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z', + height: 61, + width: 51, + heightElements: [], + widthElements: [] + }, + 'DATA_STORE': { + d:'m {mx},{my} ' + + 'l 0,{e.y2} ' + + 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0 ' + + 'l 0,-{e.y2} ' + + 'c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0' + + 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0 ' + + 'm -{e.x2},{e.y0}' + + 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0' + + 'm -{e.x2},{e.y0}' + + 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0', + height: 61, + width: 61, + heightElements: [7, 10, 45], + widthElements: [2, 58, 60] + }, + 'TEXT_ANNOTATION': { + d: 'm {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0', + height: 30, + width: 10, + heightElements: [30], + widthElements: [10] + }, + 'MARKER_SUB_PROCESS': { + d: 'm{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0', + height: 10, + width: 10, + heightElements: [], + widthElements: [] + }, + 'MARKER_PARALLEL': { + d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10', + height: 10, + width: 10, + heightElements: [], + widthElements: [] + }, + 'MARKER_SEQUENTIAL': { + d: 'm{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0', + height: 10, + width: 10, + heightElements: [], + widthElements: [] + }, + 'MARKER_COMPENSATION': { + d: 'm {mx},{my} 8,-5 0,10 z m 9,0 8,-5 0,10 z', + height: 10, + width: 21, + heightElements: [], + widthElements: [] + }, + 'MARKER_LOOP': { + d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' + + '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' + + '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' + + 'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902', + height: 13.9, + width: 13.7, + heightElements: [], + widthElements: [] + }, + 'MARKER_ADHOC': { + d: 'm {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 ' + + '3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 ' + + '1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 ' + + '-3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 ' + + '-2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z', + height: 4, + width: 15, + heightElements: [], + widthElements: [] + }, + 'TASK_TYPE_SEND': { + d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}', + height: 14, + width: 21, + heightElements: [6, 14], + widthElements: [10.5, 21] + }, + 'TASK_TYPE_SCRIPT': { + d: 'm {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 ' + + 'c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z ' + + 'm -7,-12 l 5,0 ' + + 'm -4.5,3 l 4.5,0 ' + + 'm -3,3 l 5,0' + + 'm -4,3 l 5,0', + height: 15, + width: 12.6, + heightElements: [6, 14], + widthElements: [10.5, 21] + }, + 'TASK_TYPE_USER_1': { + d: 'm {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 ' + + '-4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 ' + + '0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 ' + + 'h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 z' + + 'm -8,6 l 0,5.5 m 11,0 l 0,-5' + }, + 'TASK_TYPE_USER_2': { + d: 'm {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 ' + + '-2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 ' + }, + 'TASK_TYPE_USER_3': { + d: 'm {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 ' + + '4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 ' + + '-4.20799998,3.36699999 -4.20699998,4.34799999 z' + }, + 'TASK_TYPE_MANUAL': { + d: 'm {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 ' + + '-0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 ' + + '0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 ' + + '-1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 ' + + '0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 ' + + '-10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 ' + + '2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 ' + + '-0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 ' + + '-1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 ' + + '-0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 ' + + '0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 ' + + '-5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z' + }, + 'TASK_TYPE_INSTANTIATING_SEND': { + d: 'm {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6' + }, + 'TASK_TYPE_SERVICE': { + d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' + + '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' + + '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' + + 'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' + + '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' + + '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' + + 'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' + + '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' + + 'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' + + 'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' + + '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' + + 'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' + + 'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' + + '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' + + '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z' + }, + 'TASK_TYPE_SERVICE_FILL': { + d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' + + '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' + + '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z' + }, + 'TASK_TYPE_BUSINESS_RULE_HEADER': { + d: 'm {mx},{my} 0,4 20,0 0,-4 z' + }, + 'TASK_TYPE_BUSINESS_RULE_MAIN': { + d: 'm {mx},{my} 0,12 20,0 0,-12 z' + + 'm 0,8 l 20,0 ' + + 'm -13,-4 l 0,8' + }, + 'MESSAGE_FLOW_MARKER': { + d: 'm {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6' + } + }; + + this.getRawPath = function getRawPath(pathId) { + return this.pathMap[pathId].d; + }; + + /** + * Scales the path to the given height and width. + *

      Use case

      + *

      Use case is to scale the content of elements (event, gateways) based + * on the element bounding box's size. + *

      + *

      Why not transform

      + *

      Scaling a path with transform() will also scale the stroke and IE does not support + * the option 'non-scaling-stroke' to prevent this. + * Also there are use cases where only some parts of a path should be + * scaled.

      + * + * @param {String} pathId The ID of the path. + * @param {Object} param

      + * Example param object scales the path to 60% size of the container (data.width, data.height). + *

      +   *   {
      +   *     xScaleFactor: 0.6,
      +   *     yScaleFactor:0.6,
      +   *     containerWidth: data.width,
      +   *     containerHeight: data.height,
      +   *     position: {
      +   *       mx: 0.46,
      +   *       my: 0.2,
      +   *     }
      +   *   }
      +   *   
      + *
        + *
      • targetpathwidth = xScaleFactor * containerWidth
      • + *
      • targetpathheight = yScaleFactor * containerHeight
      • + *
      • Position is used to set the starting coordinate of the path. M is computed: + *
          + *
        • position.x * containerWidth
        • + *
        • position.y * containerHeight
        • + *
        + * Center of the container
         position: {
        +   *       mx: 0.5,
        +   *       my: 0.5,
        +   *     }
        + * Upper left corner of the container + *
         position: {
        +   *       mx: 0.0,
        +   *       my: 0.0,
        +   *     }
        + *
      • + *
      + *

      + * + */ + this.getScaledPath = function getScaledPath(pathId, param) { + var rawPath = this.pathMap[pathId]; + + // positioning + // compute the start point of the path + var mx, my; + + if(!!param.abspos) { + mx = param.abspos.x; + my = param.abspos.y; + } else { + mx = param.containerWidth * param.position.mx; + my = param.containerHeight * param.position.my; + } + + var coordinates = {}; //map for the scaled coordinates + if(param.position) { + + // path + var heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor; + var widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor; + + + //Apply height ratio + for (var heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) { + coordinates['y' + heightIndex] = rawPath.heightElements[heightIndex] * heightRatio; + } + + //Apply width ratio + for (var widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) { + coordinates['x' + widthIndex] = rawPath.widthElements[widthIndex] * widthRatio; + } + } + + //Apply value to raw path + var path = Snap.format( + rawPath.d, { + mx: mx, + my: my, + e: coordinates + } + ); + return path; + }; +} + +module.exports = PathMap; + +},{"188":188}],6:[function(_dereq_,module,exports){ +module.exports = { + renderer: [ 'type', _dereq_(4) ], + pathMap: [ 'type', _dereq_(5) ] +}; +},{"4":4,"5":5}],7:[function(_dereq_,module,exports){ +'use strict'; + + +var assign = _dereq_(325), + forEach = _dereq_(204); + + +/** + * A provider for BPMN 2.0 elements context pad + */ +function ContextPadProvider(contextPad, modeling, elementFactory, + connect, create, bpmnReplace, + canvas) { + + contextPad.registerProvider(this); + + this._contextPad = contextPad; + + this._modeling = modeling; + + this._elementFactory = elementFactory; + this._connect = connect; + this._create = create; + this._bpmnReplace = bpmnReplace; + this._canvas = canvas; +} + +ContextPadProvider.$inject = [ + 'contextPad', + 'modeling', + 'elementFactory', + 'connect', + 'create', + 'bpmnReplace', + 'canvas' +]; + +ContextPadProvider.prototype.getContextPadEntries = function(element) { + + var contextPad = this._contextPad, + modeling = this._modeling, + + elementFactory = this._elementFactory, + connect = this._connect, + create = this._create, + bpmnReplace = this._bpmnReplace, + canvas = this._canvas; + + var actions = {}; + + if (element.type === 'label') { + return actions; + } + + var bpmnElement = element.businessObject; + + function startConnect(event, element, autoActivate) { + connect.start(event, element, autoActivate); + } + + function removeElement(e) { + if (element.waypoints) { + modeling.removeConnection(element); + } else { + modeling.removeShape(element); + } + } + + function getReplaceMenuPosition(element) { + + var Y_OFFSET = 5; + + var diagramContainer = canvas.getContainer(), + pad = contextPad.getPad(element).html; + + var diagramRect = diagramContainer.getBoundingClientRect(), + padRect = pad.getBoundingClientRect(); + + var top = padRect.top - diagramRect.top; + var left = padRect.left - diagramRect.left; + + var pos = { + x: left, + y: top + padRect.height + Y_OFFSET + }; + + return pos; + } + + + function appendAction(type, className, options) { + + function appendListener(event, element) { + + var shape = elementFactory.createShape(assign({ type: type }, options)); + create.start(event, shape, element); + } + + var shortType = type.replace(/^bpmn\:/, ''); + + return { + group: 'model', + className: className, + title: 'Append ' + shortType, + action: { + dragstart: appendListener, + click: appendListener + } + }; + } + + if (bpmnElement.$instanceOf('bpmn:FlowNode')) { + + if (!bpmnElement.$instanceOf('bpmn:EndEvent') && + !bpmnElement.$instanceOf('bpmn:EventBasedGateway') && + !isEventType(bpmnElement, 'bpmn:IntermediateThrowEvent', 'bpmn:LinkEventDefinition')) { + + assign(actions, { + 'append.end-event': appendAction('bpmn:EndEvent', 'icon-end-event-none'), + 'append.gateway': appendAction('bpmn:ExclusiveGateway', 'icon-gateway-xor'), + 'append.append-task': appendAction('bpmn:Task', 'icon-task'), + 'append.intermediate-event': appendAction('bpmn:IntermediateThrowEvent', + 'icon-intermediate-event-none') + }); + } + + if (bpmnElement.$instanceOf('bpmn:EventBasedGateway')) { + + assign(actions, { + 'append.receive-task': appendAction('bpmn:ReceiveTask', 'icon-receive-task'), + 'append.message-intermediate-event': appendAction('bpmn:IntermediateCatchEvent', + 'icon-intermediate-event-catch-message', + { _eventDefinitionType: 'bpmn:MessageEventDefinition'}), + 'append.timer-intermediate-event': appendAction('bpmn:IntermediateCatchEvent', + 'icon-intermediate-event-catch-timer', + { _eventDefinitionType: 'bpmn:TimerEventDefinition'}), + 'append.condtion-intermediate-event': appendAction('bpmn:IntermediateCatchEvent', + 'icon-intermediate-event-catch-condition', + { _eventDefinitionType: 'bpmn:ConditionalEventDefinition'}), + 'append.signal-intermediate-event': appendAction('bpmn:IntermediateCatchEvent', + 'icon-intermediate-event-catch-signal', + { _eventDefinitionType: 'bpmn:SignalEventDefinition'}) + }); + } + + + // Replace menu entry + if (!bpmnElement.$instanceOf('bpmn:SubProcess')) { + assign(actions, { + 'replace': { + group: 'edit', + className: 'icon-screw-wrench', + title: 'Change type', + action: { + click: function(event, element) { + bpmnReplace.openChooser(getReplaceMenuPosition(element), element); + } + } + } + }); + } + } + + if (bpmnElement.$instanceOf('bpmn:FlowNode') || + bpmnElement.$instanceOf('bpmn:InteractionNode')) { + + assign(actions, { + 'append.text-annotation': appendAction('bpmn:TextAnnotation', 'icon-text-annotation'), + + 'connect': { + group: 'connect', + className: 'icon-connection-multi', + title: 'Connect using Sequence/MessageFlow', + action: { + click: startConnect, + dragstart: startConnect + } + } + }); + } + + // Delete Element Entry + assign(actions, { + 'delete': { + group: 'edit', + className: 'icon-trash', + title: 'Remove', + action: { + click: removeElement, + dragstart: removeElement + } + } + }); + + return actions; +}; + +function isEventType(eventBo, type, definition) { + + var isType = eventBo.$instanceOf(type); + var isDefinition = false; + + var definitions = eventBo.eventDefinitions || []; + forEach(definitions, function(def) { + if (def.$type === definition) { + isDefinition = true; + } + }); + + return isType && isDefinition; +} + + +module.exports = ContextPadProvider; + +},{"204":204,"325":325}],8:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(70), + _dereq_(97), + _dereq_(151), + _dereq_(95), + _dereq_(99), + _dereq_(37) + ], + __init__: [ 'contextPadProvider' ], + contextPadProvider: [ 'type', _dereq_(7) ] +}; +},{"151":151,"37":37,"7":7,"70":70,"95":95,"97":97,"99":99}],9:[function(_dereq_,module,exports){ +'use strict'; + + +function BpmnKeyBindings(keyboard, spaceTool, lassoTool, directEditing, selection) { + + keyboard.addListener(function(key, modifiers) { + + if (keyboard.hasModifier(modifiers)) { + return; + } + + // S -> activate space tool + if (key === 83) { + spaceTool.activateSelection(); + + return true; + } + + // L -> activate lasso tool + if (key === 108) { + lassoTool.activateSelection(); + + return true; + } + + var currentSelection = selection.get(); + + // E -> activate direct editing + if (key === 69) { + if (currentSelection.length) { + directEditing.activate(currentSelection[0]); + } + + return true; + } + }); +} + +BpmnKeyBindings.$inject = [ 'keyboard', 'spaceTool', 'lassoTool', 'directEditing', 'selection' ]; + +module.exports = BpmnKeyBindings; +},{}],10:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(105) + ], + __init__: [ 'bpmnKeyBindings' ], + bpmnKeyBindings: [ 'type', _dereq_(9) ] +}; +},{"105":105,"9":9}],11:[function(_dereq_,module,exports){ +'use strict'; + +var UpdateLabelHandler = _dereq_(13); + +var LabelUtil = _dereq_(12); + +var is = _dereq_(47).is, + isExpanded = _dereq_(45).isExpanded; + + +var MIN_BOUNDS = { + width: 150, + height: 50 +}; + + +function LabelEditingProvider(eventBus, canvas, directEditing, commandStack, injector) { + + directEditing.registerProvider(this); + commandStack.registerHandler('element.updateLabel', UpdateLabelHandler); + + // listen to dblclick on non-root elements + eventBus.on('element.dblclick', function(event) { + directEditing.activate(event.element); + }); + + // complete on followup canvas operation + eventBus.on([ 'element.mousedown', 'drag.activate', 'canvas.viewbox.changed' ], function(event) { + directEditing.complete(); + }); + + // cancel on command stack changes + eventBus.on([ 'commandStack.changed' ], function() { + directEditing.cancel(); + }); + + + // activate direct editing for activities and text annotations + + + if ('ontouchstart' in document.documentElement) { + // we deactivate automatic label editing on mobile devices + // as it breaks the user interaction workflow + + // TODO(nre): we should temporarily focus the edited element here + // and release the focused viewport after the direct edit operation is finished + } else { + eventBus.on('create.end', 500, function(e) { + + var element = e.shape, + canExecute = e.context.canExecute; + + if (!canExecute) { + return; + } + + if (is(element, 'bpmn:Task') || is(element, 'bpmn:TextAnnotation') || + (is(element, 'bpmn:SubProcess') && !isExpanded(element))) { + + directEditing.activate(element); + } + }); + } + + this._canvas = canvas; + this._commandStack = commandStack; +} + +LabelEditingProvider.$inject = [ 'eventBus', 'canvas', 'directEditing', 'commandStack', 'injector' ]; + +module.exports = LabelEditingProvider; + + +LabelEditingProvider.prototype.activate = function(element) { + + var text = LabelUtil.getLabel(element); + + if (text === undefined) { + return; + } + + var bbox = this.getEditingBBox(element); + + // adjust for expanded pools AND lanes + if ((is(element, 'bpmn:Participant') && isExpanded(element)) || is(element, 'bpmn:Lane')) { + + bbox.width = MIN_BOUNDS.width; + bbox.height = MIN_BOUNDS.height; + + bbox.x = bbox.x + 10 - bbox.width / 2; + bbox.y = bbox.mid.y - bbox.height / 2; + } + + // adjust for expanded sub processes + if (is(element, 'bpmn:SubProcess') && isExpanded(element)) { + + bbox.height = MIN_BOUNDS.height; + + bbox.x = bbox.mid.x - bbox.width / 2; + bbox.y = bbox.y + 10 - bbox.height / 2; + } + + return { bounds: bbox, text: text }; +}; + + +LabelEditingProvider.prototype.getEditingBBox = function(element, maxBounds) { + + var target = element.label || element; + + var bbox = this._canvas.getAbsoluteBBox(target); + + var mid = { + x: bbox.x + bbox.width / 2, + y: bbox.y + bbox.height / 2 + }; + + // external label + if (target.labelTarget) { + bbox.width = Math.max(bbox.width, MIN_BOUNDS.width); + bbox.height = Math.max(bbox.height, MIN_BOUNDS.height); + + bbox.x = mid.x - bbox.width / 2; + } + + bbox.mid = mid; + + return bbox; +}; + + +LabelEditingProvider.prototype.update = function(element, newLabel) { + this._commandStack.execute('element.updateLabel', { + element: element, + newLabel: newLabel + }); +}; +},{"12":12,"13":13,"45":45,"47":47}],12:[function(_dereq_,module,exports){ +'use strict'; + +function getLabelAttr(semantic) { + if (semantic.$instanceOf('bpmn:FlowElement') || + semantic.$instanceOf('bpmn:Participant') || + semantic.$instanceOf('bpmn:Lane') || + semantic.$instanceOf('bpmn:SequenceFlow') || + semantic.$instanceOf('bpmn:MessageFlow')) { + return 'name'; + } + + if (semantic.$instanceOf('bpmn:TextAnnotation')) { + return 'text'; + } +} + +module.exports.getLabel = function(element) { + var semantic = element.businessObject, + attr = getLabelAttr(semantic); + + if (attr) { + return semantic[attr] || ''; + } +}; + + +module.exports.setLabel = function(element, text) { + var semantic = element.businessObject, + attr = getLabelAttr(semantic); + + if (attr) { + semantic[attr] = text; + } + + var label = element.label || element; + + // show label + label.hidden = false; + + return label; +}; +},{}],13:[function(_dereq_,module,exports){ +'use strict'; + +var LabelUtil = _dereq_(12); + + +/** + * A handler that updates the text of a BPMN element. + * + * @param {EventBus} eventBus + */ +function UpdateTextHandler(eventBus) { + + function setText(element, text) { + var label = LabelUtil.setLabel(element, text); + + eventBus.fire('element.changed', { element: label }); + } + + function execute(ctx) { + ctx.oldLabel = LabelUtil.getLabel(ctx.element); + return setText(ctx.element, ctx.newLabel); + } + + function revert(ctx) { + return setText(ctx.element, ctx.oldLabel); + } + + + function canExecute(ctx) { + return true; + } + + // API + + this.execute = execute; + this.revert = revert; + + this.canExecute = canExecute; +} + + +UpdateTextHandler.$inject = [ 'eventBus' ]; + +module.exports = UpdateTextHandler; +},{"12":12}],14:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(77), + _dereq_(93), + _dereq_(70) + ], + __init__: [ 'labelEditingProvider' ], + labelEditingProvider: [ 'type', _dereq_(11) ] +}; +},{"11":11,"70":70,"77":77,"93":93}],15:[function(_dereq_,module,exports){ +'use strict'; + +var map = _dereq_(207), + assign = _dereq_(325), + pick = _dereq_(330); + + +function BpmnFactory(moddle) { + this._model = moddle; +} + +BpmnFactory.$inject = [ 'moddle' ]; + + +BpmnFactory.prototype._needsId = function(element) { + return element.$instanceOf('bpmn:RootElement') || + element.$instanceOf('bpmn:FlowElement') || + element.$instanceOf('bpmn:MessageFlow') || + element.$instanceOf('bpmn:Artifact') || + element.$instanceOf('bpmn:Participant') || + element.$instanceOf('bpmn:Process') || + element.$instanceOf('bpmn:Collaboration') || + element.$instanceOf('bpmndi:BPMNShape') || + element.$instanceOf('bpmndi:BPMNEdge') || + element.$instanceOf('bpmndi:BPMNDiagram') || + element.$instanceOf('bpmndi:BPMNPlane'); +}; + +BpmnFactory.prototype._ensureId = function(element) { + + // generate semantic ids for elements + // bpmn:SequenceFlow -> SequenceFlow_ID + var prefix = (element.$type || '').replace(/^[^:]*:/g, '') + '_'; + + if (!element.id && this._needsId(element)) { + element.id = this._model.ids.nextPrefixed(prefix, element); + } +}; + + +BpmnFactory.prototype.create = function(type, attrs) { + var element = this._model.create(type, attrs || {}); + + this._ensureId(element); + + return element; +}; + + +BpmnFactory.prototype.createDiLabel = function() { + return this.create('bpmndi:BPMNLabel', { + bounds: this.createDiBounds() + }); +}; + + +BpmnFactory.prototype.createDiShape = function(semantic, bounds, attrs) { + + return this.create('bpmndi:BPMNShape', assign({ + bpmnElement: semantic, + bounds: this.createDiBounds(bounds) + }, attrs)); +}; + + +BpmnFactory.prototype.createDiBounds = function(bounds) { + return this.create('dc:Bounds', bounds); +}; + + +BpmnFactory.prototype.createDiWaypoints = function(waypoints) { + return map(waypoints, function(pos) { + return this.createDiWaypoint(pos); + }, this); +}; + +BpmnFactory.prototype.createDiWaypoint = function(point) { + return this.create('dc:Point', pick(point, [ 'x', 'y' ])); +}; + + +BpmnFactory.prototype.createDiEdge = function(semantic, waypoints, attrs) { + return this.create('bpmndi:BPMNEdge', assign({ + bpmnElement: semantic + }, attrs)); +}; + +BpmnFactory.prototype.createDiPlane = function(semantic) { + return this.create('bpmndi:BPMNPlane', { + bpmnElement: semantic + }); +}; + +module.exports = BpmnFactory; + +},{"207":207,"325":325,"330":330}],16:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195); + +var assign = _dereq_(325); + +var BaseLayouter = _dereq_(164), + LayoutUtil = _dereq_(166), + ManhattanLayout = _dereq_(167); + +var is = _dereq_(47).is; + + +function BpmnLayouter() {} + +inherits(BpmnLayouter, BaseLayouter); + +module.exports = BpmnLayouter; + + +function getAttachment(waypoints, idx, shape) { + var point = waypoints && waypoints[idx]; + + return point ? (point.original || point) : LayoutUtil.getMidPoint(shape); +} + + +BpmnLayouter.prototype.layoutConnection = function(connection, hints) { + var source = connection.source, + target = connection.target, + waypoints = connection.waypoints, + start, + end; + + var layoutManhattan, + updatedWaypoints; + + start = getAttachment(waypoints, 0, source); + end = getAttachment(waypoints, waypoints && waypoints.length - 1, target); + + // manhattan layout sequence / message flows + if (is(connection, 'bpmn:MessageFlow')) { + layoutManhattan = { + preferStraight: true, + preferVertical: true + }; + } + + if (is(connection, 'bpmn:SequenceFlow')) { + layoutManhattan = {}; + } + + if (layoutManhattan) { + + layoutManhattan = assign(layoutManhattan, hints); + + updatedWaypoints = + ManhattanLayout.repairConnection( + source, target, start, end, + waypoints, + layoutManhattan); + } + + return updatedWaypoints || [ start, end ]; +}; +},{"164":164,"166":166,"167":167,"195":195,"325":325,"47":47}],17:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325), + forEach = _dereq_(204), + inherits = _dereq_(195); + +var Collections = _dereq_(175), + Model = _dereq_(168); + +var CommandInterceptor = _dereq_(75); + + +/** + * A handler responsible for updating the underlying BPMN 2.0 XML + DI + * once changes on the diagram happen + */ +function BpmnUpdater(eventBus, bpmnFactory, connectionDocking) { + + CommandInterceptor.call(this, eventBus); + + this._bpmnFactory = bpmnFactory; + + var self = this; + + + + ////// connection cropping ///////////////////////// + + // crop connection ends during create/update + function cropConnection(e) { + var context = e.context, + connection; + + if (!context.cropped) { + connection = context.connection; + connection.waypoints = connectionDocking.getCroppedWaypoints(connection); + context.cropped = true; + } + } + + this.executed([ + 'connection.layout', + 'connection.create', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], cropConnection); + + this.reverted([ 'connection.layout' ], function(e) { + delete e.context.cropped; + }); + + + + ////// BPMN + DI update ///////////////////////// + + + // update parent + function updateParent(e) { + self.updateParent(e.context.shape || e.context.connection); + } + + this.executed([ 'shape.move', + 'shape.create', + 'shape.delete', + 'connection.create', + 'connection.move', + 'connection.delete' ], updateParent); + this.reverted([ 'shape.move', + 'shape.create', + 'shape.delete', + 'connection.create', + 'connection.move', + 'connection.delete' ], updateParent); + + /* + * ## Updating Parent + * + * When morphing a Process into a Collaboration or vice-versa, + * make sure that both the *semantic* and *di* parent of each element + * is updated. + * + */ + function updateRoot(event) { + var context = event.context, + oldRoot = context.oldRoot, + children = oldRoot.children; + + forEach(children, function(child) { + self.updateParent(child); + }); + } + + this.executed([ 'canvas.updateRoot' ], updateRoot); + this.reverted([ 'canvas.updateRoot' ], updateRoot); + + + // update bounds + function updateBounds(e) { + self.updateBounds(e.context.shape); + } + + this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], updateBounds); + this.reverted([ 'shape.move', 'shape.create', 'shape.resize' ], updateBounds); + + + // attach / detach connection + function updateConnection(e) { + self.updateConnection(e.context.connection); + } + + this.executed([ + 'connection.create', + 'connection.move', + 'connection.delete', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], updateConnection); + + this.reverted([ + 'connection.create', + 'connection.move', + 'connection.delete', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], updateConnection); + + + // update waypoints + function updateConnectionWaypoints(e) { + self.updateConnectionWaypoints(e.context.connection); + } + + this.executed([ + 'connection.layout', + 'connection.move', + 'connection.updateWaypoints', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], updateConnectionWaypoints); + + this.reverted([ + 'connection.layout', + 'connection.move', + 'connection.updateWaypoints', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], updateConnectionWaypoints); +} + +inherits(BpmnUpdater, CommandInterceptor); + +module.exports = BpmnUpdater; + +BpmnUpdater.$inject = [ 'eventBus', 'bpmnFactory', 'connectionDocking']; + + +/////// implementation ////////////////////////////////// + + +BpmnUpdater.prototype.updateParent = function(element) { + + // do not update BPMN 2.0 label parent + if (element instanceof Model.Label) { + return; + } + + var parentShape = element.parent; + + var businessObject = element.businessObject, + parentBusinessObject = parentShape && parentShape.businessObject, + parentDi = parentBusinessObject && parentBusinessObject.di; + + this.updateSemanticParent(businessObject, parentBusinessObject); + + this.updateDiParent(businessObject.di, parentDi); +}; + + +BpmnUpdater.prototype.updateBounds = function(shape) { + + var di = shape.businessObject.di; + + var bounds = (shape instanceof Model.Label) ? this._getLabel(di).bounds : di.bounds; + + assign(bounds, { + x: shape.x, + y: shape.y, + width: shape.width, + height: shape.height + }); +}; + + +BpmnUpdater.prototype.updateDiParent = function(di, parentDi) { + + if (parentDi && !parentDi.$instanceOf('bpmndi:BPMNPlane')) { + parentDi = parentDi.$parent; + } + + if (di.$parent === parentDi) { + return; + } + + var planeElements = (parentDi || di.$parent).get('planeElement'); + + if (parentDi) { + planeElements.push(di); + di.$parent = parentDi; + } else { + Collections.remove(planeElements, di); + di.$parent = null; + } +}; + +function getDefinitions(element) { + while (element && !element.$instanceOf('bpmn:Definitions')) { + element = element.$parent; + } + + return element; +} + +BpmnUpdater.prototype.updateSemanticParent = function(businessObject, newParent) { + + var containment; + + if (businessObject.$parent === newParent) { + return; + } + + if (businessObject.$instanceOf('bpmn:FlowElement')) { + + if (newParent && newParent.$instanceOf('bpmn:Participant')) { + newParent = newParent.processRef; + } + + containment = 'flowElements'; + + } else + + if (businessObject.$instanceOf('bpmn:Artifact')) { + + while (newParent && + !newParent.$instanceOf('bpmn:Process') && + !newParent.$instanceOf('bpmn:SubProcess') && + !newParent.$instanceOf('bpmn:Collaboration')) { + + if (newParent.$instanceOf('bpmn:Participant')) { + newParent = newParent.processRef; + break; + } else { + newParent = newParent.$parent; + } + } + + containment = 'artifacts'; + } else + + if (businessObject.$instanceOf('bpmn:MessageFlow')) { + containment = 'messageFlows'; + + } else + + if (businessObject.$instanceOf('bpmn:Participant')) { + containment = 'participants'; + + // make sure the participants process is properly attached / detached + // from the XML document + + var process = businessObject.processRef, + definitions; + + if (process) { + definitions = getDefinitions(businessObject.$parent || newParent); + + if (businessObject.$parent) { + Collections.remove(definitions.get('rootElements'), process); + process.$parent = null; + } + + if (newParent) { + Collections.add(definitions.get('rootElements'), process); + process.$parent = definitions; + } + } + } + + if (!containment) { + throw new Error('no parent for ', businessObject, newParent); + } + + var children; + + if (businessObject.$parent) { + // remove from old parent + children = businessObject.$parent.get(containment); + Collections.remove(children, businessObject); + } + + if (!newParent) { + businessObject.$parent = null; + } else { + // add to new parent + children = newParent.get(containment); + children.push(businessObject); + businessObject.$parent = newParent; + } +}; + + +BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) { + + connection.businessObject.di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints)); +}; + + +BpmnUpdater.prototype.updateConnection = function(connection) { + + var businessObject = connection.businessObject, + newSource = connection.source && connection.source.businessObject, + newTarget = connection.target && connection.target.businessObject; + + var inverseSet = businessObject.$instanceOf('bpmn:SequenceFlow'); + + if (businessObject.sourceRef !== newSource) { + if (inverseSet) { + Collections.remove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject); + + if (newSource) { + newSource.get('outgoing').push(businessObject); + } + } + + businessObject.sourceRef = newSource; + } + if (businessObject.targetRef !== newTarget) { + if (inverseSet) { + Collections.remove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject); + + if (newTarget) { + newTarget.get('incoming').push(businessObject); + } + } + + businessObject.targetRef = newTarget; + } + + businessObject.di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints)); +}; + + +/////// helpers ///////////////////////////////////////// + +BpmnUpdater.prototype._getLabel = function(di) { + if (!di.label) { + di.label = this._bpmnFactory.createDiLabel(); + } + + return di.label; +}; +},{"168":168,"175":175,"195":195,"204":204,"325":325,"75":75}],18:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325), + inherits = _dereq_(195); + +var BaseElementFactory = _dereq_(79), + LabelUtil = _dereq_(46); + + +/** + * A bpmn-aware factory for diagram-js shapes + */ +function ElementFactory(bpmnFactory, moddle) { + BaseElementFactory.call(this); + + this._bpmnFactory = bpmnFactory; + this._moddle = moddle; +} + +inherits(ElementFactory, BaseElementFactory); + + +ElementFactory.$inject = [ 'bpmnFactory', 'moddle' ]; + +module.exports = ElementFactory; + +ElementFactory.prototype.baseCreate = BaseElementFactory.prototype.create; + +ElementFactory.prototype.create = function(elementType, attrs) { + + // no special magic for labels, + // we assume their businessObjects have already been created + // and wired via attrs + if (elementType === 'label') { + return this.baseCreate(elementType, assign({ type: 'label' }, LabelUtil.DEFAULT_LABEL_SIZE, attrs)); + } + + attrs = attrs || {}; + + var businessObject = attrs.businessObject, + size; + + if (!businessObject) { + if (!attrs.type) { + throw new Error('no shape type specified'); + } + + businessObject = this._bpmnFactory.create(attrs.type); + } + + if (!businessObject.di) { + if (elementType === 'root') { + businessObject.di = this._bpmnFactory.createDiPlane(businessObject, [], { + id: businessObject.id + '_di' + }); + } else + if (elementType === 'connection') { + businessObject.di = this._bpmnFactory.createDiEdge(businessObject, [], { + id: businessObject.id + '_di' + }); + } else { + businessObject.di = this._bpmnFactory.createDiShape(businessObject, {}, { + id: businessObject.id + '_di' + }); + } + } + + if (!!attrs.isExpanded) { + businessObject.di.isExpanded = attrs.isExpanded; + } + + if (businessObject.$instanceOf('bpmn:ExclusiveGateway')) { + businessObject.di.isMarkerVisible = true; + } + + if (attrs._eventDefinitionType) { + var eventDefinitions = businessObject.get('eventDefinitions') || [], + newEventDefinition = this._moddle.create(attrs._eventDefinitionType); + + eventDefinitions.push(newEventDefinition); + businessObject.eventDefinitions = eventDefinitions; + } + + size = this._getDefaultSize(businessObject); + + attrs = assign({ + businessObject: businessObject, + id: businessObject.id + }, size, attrs); + + return this.baseCreate(elementType, attrs); +}; + + +ElementFactory.prototype._getDefaultSize = function(semantic) { + + if (semantic.$instanceOf('bpmn:SubProcess')) { + var isExpanded = semantic.di.isExpanded === true; + + if (isExpanded) { + return { width: 350, height: 200 }; + } else { + return { width: 100, height: 80 }; + } + } + + if (semantic.$instanceOf('bpmn:Task')) { + return { width: 100, height: 80 }; + } + + if (semantic.$instanceOf('bpmn:Gateway')) { + return { width: 50, height: 50 }; + } + + if (semantic.$instanceOf('bpmn:Event')) { + return { width: 36, height: 36 }; + } + + if (semantic.$instanceOf('bpmn:Participant')) { + return { width: 600, height: 250 }; + } + + return { width: 100, height: 80 }; +}; + + +ElementFactory.prototype.createParticipantShape = function(collapsed) { + + var participantShape = this.createShape({ type: 'bpmn:Participant' }); + + if (!collapsed) { + participantShape.businessObject.processRef = this._bpmnFactory.create('bpmn:Process'); + } + + return participantShape; +}; +},{"195":195,"325":325,"46":46,"79":79}],19:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325), + forEach = _dereq_(204); + +var LabelUtil = _dereq_(46); + +var hasExternalLabel = LabelUtil.hasExternalLabel, + getExternalLabelMid = LabelUtil.getExternalLabelMid; + + +function LabelSupport(eventBus, modeling, bpmnFactory) { + + // create external labels on shape creation + + eventBus.on([ + 'commandStack.shape.create.postExecute', + 'commandStack.connection.create.postExecute' + ], function(e) { + var context = e.context; + + var element = context.shape || context.connection, + businessObject = element.businessObject; + + var position; + + if (hasExternalLabel(businessObject)) { + position = getExternalLabelMid(element); + modeling.createLabel(element, position, { + id: businessObject.id + '_label', + businessObject: businessObject + }); + } + }); + + + // indicate label is dragged during move + + // we need to add labels to the list of selected + // shapes before the visuals get drawn. + // + // Hence this awesome magic number. + // + eventBus.on('shape.move.start', function(e) { + + var context = e.context, + shapes = context.shapes; + + var labels = []; + + forEach(shapes, function(element) { + var label = element.label; + + if (label && !label.hidden && context.shapes.indexOf(label) === -1) { + labels.push(label); + } + }); + + forEach(labels, function(label) { + shapes.push(label); + }); + }); + + + // move labels with shapes + + eventBus.on([ + 'commandStack.shapes.move.postExecute' + ], function(e) { + + var context = e.context, + closure = context.closure, + enclosedElements = closure.enclosedElements; + + // ensure we move all labels with their respective elements + // if they have not been moved already + + forEach(enclosedElements, function(e) { + if (e.label && !enclosedElements[e.label.id]) { + modeling.moveShape(e.label, context.delta, e.parent); + } + }); + }); + + + // update di information on label movement and creation + + eventBus.on([ + 'commandStack.label.create.executed', + 'commandStack.shape.moved.executed' + ], function(e) { + + var element = e.context.shape, + businessObject = element.businessObject, + di = businessObject.di; + + // we want to trigger on real labels only + if (!element.labelTarget) { + return; + } + + if (!di.label) { + di.label = bpmnFactory.create('bpmndi:BPMNLabel', { + bounds: bpmnFactory.create('dc:Bounds') + }); + } + + assign(di.label.bounds, { + x: element.x, + y: element.y, + width: element.width, + height: element.height + }); + }); +} + +LabelSupport.$inject = [ 'eventBus', 'modeling', 'bpmnFactory' ]; + +module.exports = LabelSupport; + +},{"204":204,"325":325,"46":46}],20:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195); + +var BaseModeling = _dereq_(108); + +var UpdatePropertiesHandler = _dereq_(29), + UpdateCanvasRootHandler = _dereq_(28); + + +/** + * BPMN 2.0 modeling features activator + * + * @param {EventBus} eventBus + * @param {ElementFactory} elementFactory + * @param {CommandStack} commandStack + * @param {BpmnRules} bpmnRules + */ +function Modeling(eventBus, elementFactory, commandStack, bpmnRules) { + BaseModeling.call(this, eventBus, elementFactory, commandStack); + + this._bpmnRules = bpmnRules; +} + +inherits(Modeling, BaseModeling); + +Modeling.$inject = [ 'eventBus', 'elementFactory', 'commandStack', 'bpmnRules' ]; + +module.exports = Modeling; + + +Modeling.prototype.getHandlers = function() { + var handlers = BaseModeling.prototype.getHandlers.call(this); + + handlers['element.updateProperties'] = UpdatePropertiesHandler; + handlers['canvas.updateRoot'] = UpdateCanvasRootHandler; + + return handlers; +}; + + +Modeling.prototype.updateLabel = function(element, newLabel) { + this._commandStack.execute('element.updateLabel', { + element: element, + newLabel: newLabel + }); +}; + + +var getSharedParent = _dereq_(21).getSharedParent; + +Modeling.prototype.connect = function(source, target, attrs) { + + var bpmnRules = this._bpmnRules; + + if (!attrs) { + if (bpmnRules.canConnectMessageFlow(source, target)) { + attrs = { + type: 'bpmn:MessageFlow' + }; + } else + if (bpmnRules.canConnectSequenceFlow(source, target)) { + attrs = { + type: 'bpmn:SequenceFlow' + }; + } else { + attrs = { + type: 'bpmn:Association' + }; + } + } + + return this.createConnection(source, target, attrs, getSharedParent(source, target)); +}; + + +Modeling.prototype.updateProperties = function(element, properties) { + this._commandStack.execute('element.updateProperties', { + element: element, + properties: properties + }); +}; + + +/** + * Transform the current diagram into a collaboration. + * + * @return {djs.model.Root} the new root element + */ +Modeling.prototype.makeCollaboration = function() { + + var collaborationElement = this._create('root', { + type: 'bpmn:Collaboration' + }); + + var context = { + newRoot: collaborationElement + }; + + this._commandStack.execute('canvas.updateRoot', context); + + return collaborationElement; +}; + +/** + * Transform the current diagram into a process. + * + * @return {djs.model.Root} the new root element + */ +Modeling.prototype.makeProcess = function() { + + var processElement = this._create('root', { + type: 'bpmn:Process' + }); + + var context = { + newRoot: processElement + }; + + this._commandStack.execute('canvas.updateRoot', context); +}; +},{"108":108,"195":195,"21":21,"28":28,"29":29}],21:[function(_dereq_,module,exports){ +'use strict'; + +var find = _dereq_(203); + + +function getParents(element) { + + var parents = []; + + while (element) { + element = element.parent; + + if (element) { + parents.push(element); + } + } + + return parents; +} + +module.exports.getParents = getParents; + + +function getSharedParent(a, b) { + + var parentsA = getParents(a), + parentsB = getParents(b); + + return find(parentsA, function(parent) { + return parentsB.indexOf(parent) !== -1; + }); +} + +module.exports.getSharedParent = getSharedParent; +},{"203":203}],22:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195); + +var is = _dereq_(47).is; + +var CommandInterceptor = _dereq_(75); + + +function AppendBehavior(eventBus, elementFactory, bpmnRules) { + + CommandInterceptor.call(this, eventBus); + + // assign correct shape position unless already set + + this.preExecute('shape.append', function(context) { + + var source = context.source, + shape = context.shape; + + if (!context.position) { + + if (is(shape, 'bpmn:TextAnnotation')) { + context.position = { + x: source.x + source.width / 2 + 75, + y: source.y - (50) - shape.height / 2 + }; + } else { + context.position = { + x: source.x + source.width + 80 + shape.width / 2, + y: source.y + source.height / 2 + }; + } + } + }, true); +} + + +AppendBehavior.$inject = [ 'eventBus', 'elementFactory', 'bpmnRules' ]; + +inherits(AppendBehavior, CommandInterceptor); + +module.exports = AppendBehavior; +},{"195":195,"47":47,"75":75}],23:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195); + +var CommandInterceptor = _dereq_(75); + +var is = _dereq_(47).is; + +/** + * BPMN specific create behavior + */ +function CreateBehavior(eventBus, modeling) { + + CommandInterceptor.call(this, eventBus); + + + /** + * morph process into collaboration before adding + * participant onto collaboration + */ + + this.preExecute('shape.create', function(context) { + + var parent = context.parent, + shape = context.shape, + position = context.position; + + if (is(parent, 'bpmn:Process') && is(shape, 'bpmn:Participant')) { + + // this is going to detach the process root + // and set the returned collaboration element + // as the new root element + var collaborationElement = modeling.makeCollaboration(); + + // monkey patch the create context + // so that the participant is being dropped + // onto the new collaboration root instead + context.position = position; + context.parent = collaborationElement; + + context.processRoot = parent; + } + }, true); + + this.execute('shape.create', function(context) { + + var processRoot = context.processRoot, + shape = context.shape; + + if (processRoot) { + context.oldProcessRef = shape.businessObject.processRef; + + // assign the participant processRef + shape.businessObject.processRef = processRoot.businessObject; + } + }, true); + + this.revert('shape.create', function(context) { + var processRoot = context.processRoot, + shape = context.shape; + + if (processRoot) { + // assign the participant processRef + shape.businessObject.processRef = context.oldProcessRef; + } + }, true); + + this.postExecute('shape.create', function(context) { + + var processRoot = context.processRoot, + shape = context.shape; + + if (processRoot) { + // process root is already detached at this point + var processChildren = processRoot.children.slice(); + modeling.moveShapes(processChildren, { x: 0, y: 0 }, shape); + } + }, true); + +} + +CreateBehavior.$inject = [ 'eventBus', 'modeling' ]; + +inherits(CreateBehavior, CommandInterceptor); + +module.exports = CreateBehavior; +},{"195":195,"47":47,"75":75}],24:[function(_dereq_,module,exports){ +'use strict'; + +var forEach = _dereq_(204), + inherits = _dereq_(195); + +var CommandInterceptor = _dereq_(75); + +var is = _dereq_(47).is, + getSharedParent = _dereq_(21).getSharedParent; + + +function DropBehavior(eventBus, modeling, bpmnRules) { + + CommandInterceptor.call(this, eventBus); + + // remove sequence flows that should not be allowed + // after a move operation + + this.postExecute('shapes.move', function(context) { + + var closure = context.closure, + allConnections = closure.allConnections; + + forEach(allConnections, function(c) { + + var source = c.source, + target = c.target; + + var replacementType, + remove; + + /** + * Check if incoming or outgoing connections + * can stay or could be substituted with an + * appropriate replacement. + * + * This holds true for SequenceFlow <> MessageFlow. + */ + + if (is(c, 'bpmn:SequenceFlow')) { + if (!bpmnRules.canConnectSequenceFlow(source, target)) { + remove = true; + } + + if (bpmnRules.canConnectMessageFlow(source, target)) { + replacementType = 'bpmn:MessageFlow'; + } + } + + // transform message flows into sequence flows, if possible + + if (is(c, 'bpmn:MessageFlow')) { + + if (!bpmnRules.canConnectMessageFlow(source, target)) { + remove = true; + } + + if (bpmnRules.canConnectSequenceFlow(source, target)) { + replacementType = 'bpmn:SequenceFlow'; + } + } + + if (is(c, 'bpmn:Association') && !bpmnRules.canConnectAssociation(source, target)) { + remove = true; + } + + + // remove invalid connection + if (remove) { + modeling.removeConnection(c); + } + + // replace SequenceFlow <> MessageFlow + + if (replacementType) { + modeling.createConnection(source, target, { + type: replacementType, + waypoints: c.waypoints.slice() + }, getSharedParent(source, target)); + } + }); + }, true); +} + +inherits(DropBehavior, CommandInterceptor); + +DropBehavior.$inject = [ 'eventBus', 'modeling', 'bpmnRules' ]; + +module.exports = DropBehavior; +},{"195":195,"204":204,"21":21,"47":47,"75":75}],25:[function(_dereq_,module,exports){ +'use strict'; + +var is = _dereq_(47).is; + + +function ModelingFeedback(eventBus, tooltips) { + + function showError(position, message) { + tooltips.add({ + position: { + x: position.x + 5, + y: position.y + 5 + }, + type: 'error', + timeout: 2000, + html: '
      ' + message + '
      ' + }); + } + + eventBus.on([ 'shape.move.rejected', 'create.rejected' ], function(event) { + + var context = event.context, + shape = context.shape, + target = context.target; + + if (is(target, 'bpmn:Collaboration') && is(shape, 'bpmn:FlowNode')) { + showError(event, 'flow elements must be children of pools/participants'); + } + }); + +} + + +ModelingFeedback.$inject = [ 'eventBus', 'tooltips' ]; + +module.exports = ModelingFeedback; +},{"47":47}],26:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195); + +var CommandInterceptor = _dereq_(75); + +var is = _dereq_(47).is; + + +/** + * BPMN specific remove behavior + */ +function RemoveBehavior(eventBus, modeling) { + + CommandInterceptor.call(this, eventBus); + + + /** + * morph collaboration diagram into process diagram + * after the last participant has been removed + */ + + this.preExecute('shape.delete', function(context) { + + var shape = context.shape, + parent = shape.parent; + + // activate the behavior if the shape to be removed + // is a participant + if (is(shape, 'bpmn:Participant')) { + context.collaborationRoot = parent; + } + }, true); + + this.postExecute('shape.delete', function(context) { + + var collaborationRoot = context.collaborationRoot; + + if (collaborationRoot && !collaborationRoot.businessObject.participants.length) { + // replace empty collaboration with process diagram + modeling.makeProcess(); + } + }, true); + +} + +RemoveBehavior.$inject = [ 'eventBus', 'modeling' ]; + +inherits(RemoveBehavior, CommandInterceptor); + +module.exports = RemoveBehavior; +},{"195":195,"47":47,"75":75}],27:[function(_dereq_,module,exports){ +module.exports = { + __init__: [ + 'appendBehavior', + 'createBehavior', + 'dropBehavior', + 'removeBehavior', + 'modelingFeedback' + ], + appendBehavior: [ 'type', _dereq_(22) ], + dropBehavior: [ 'type', _dereq_(24) ], + createBehavior: [ 'type', _dereq_(23) ], + removeBehavior: [ 'type', _dereq_(26) ], + modelingFeedback: [ 'type', _dereq_(25) ] +}; +},{"22":22,"23":23,"24":24,"25":25,"26":26}],28:[function(_dereq_,module,exports){ +'use strict'; + +var Collections = _dereq_(175); + + +function UpdateCanvasRootHandler(canvas, modeling) { + this._canvas = canvas; + this._modeling = modeling; +} + +UpdateCanvasRootHandler.$inject = [ 'canvas', 'modeling' ]; + +module.exports = UpdateCanvasRootHandler; + + +UpdateCanvasRootHandler.prototype.execute = function(context) { + + var canvas = this._canvas; + + var newRoot = context.newRoot, + newRootBusinessObject = newRoot.businessObject, + oldRoot = canvas.getRootElement(), + oldRootBusinessObject = oldRoot.businessObject, + bpmnDefinitions = oldRootBusinessObject.$parent, + diPlane = oldRootBusinessObject.di; + + // (1) replace process old <> new root + canvas.setRootElement(newRoot, true); + + // (2) update root elements + Collections.add(bpmnDefinitions.rootElements, newRootBusinessObject); + newRootBusinessObject.$parent = bpmnDefinitions; + + Collections.remove(bpmnDefinitions.rootElements, oldRootBusinessObject); + oldRootBusinessObject.$parent = null; + + // (3) wire di + oldRootBusinessObject.di = null; + + diPlane.bpmnElement = newRootBusinessObject; + newRootBusinessObject.di = diPlane; + + context.oldRoot = oldRoot; +}; + + +UpdateCanvasRootHandler.prototype.revert = function(context) { + + var canvas = this._canvas; + + var newRoot = context.newRoot, + newRootBusinessObject = newRoot.businessObject, + oldRoot = context.oldRoot, + oldRootBusinessObject = oldRoot.businessObject, + bpmnDefinitions = newRootBusinessObject.$parent, + diPlane = newRootBusinessObject.di; + + // (1) replace process old <> new root + canvas.setRootElement(oldRoot, true); + + // (2) update root elements + Collections.remove(bpmnDefinitions.rootElements, newRootBusinessObject); + newRootBusinessObject.$parent = null; + + Collections.add(bpmnDefinitions.rootElements, oldRootBusinessObject); + oldRootBusinessObject.$parent = bpmnDefinitions; + + // (3) wire di + newRootBusinessObject.di = null; + + diPlane.bpmnElement = oldRootBusinessObject; + oldRootBusinessObject.di = diPlane; +}; +},{"175":175}],29:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325), + pick = _dereq_(330), + keys = _dereq_(326); + +var DEFAULT_FLOW = 'default', + NAME = 'name', + ID = 'id'; + + +/** + * A handler that implements a BPMN 2.0 property update. + * + * This should be used to set simple properties on elements with + * an underlying BPMN business object. + * + * Use respective diagram-js provided handlers if you would + * like to perform automated modeling. + */ +function UpdatePropertiesHandler(elementRegistry) { + this._elementRegistry = elementRegistry; +} + +UpdatePropertiesHandler.$inject = [ 'elementRegistry' ]; + +module.exports = UpdatePropertiesHandler; + + +////// api ///////////////////////////////////////////// + +/** + * Updates a BPMN element with a list of new properties + * + * @param {Object} context + * @param {djs.model.Base} context.element the element to update + * @param {Object} context.properties a list of properties to set on the element's + * businessObject (the BPMN model element) + * + * @return {Array} the updated element + */ +UpdatePropertiesHandler.prototype.execute = function(context) { + + var element = context.element, + changed = [ element ]; + + if (!element) { + throw new Error('element required'); + } + + var elementRegistry = this._elementRegistry; + + var businessObject = element.businessObject, + properties = context.properties, + oldProperties = context.oldProperties || pick(businessObject, keys(properties)); + + if (ID in properties) { + elementRegistry.updateId(element, properties[ID]); + } + + // correctly indicate visual changes on default flow updates + if (DEFAULT_FLOW in properties) { + + if (properties[DEFAULT_FLOW]) { + changed.push(elementRegistry.get(properties[DEFAULT_FLOW].id)); + } + + if (businessObject[DEFAULT_FLOW]) { + changed.push(elementRegistry.get(businessObject[DEFAULT_FLOW].id)); + } + } + + if (NAME in properties && element.label) { + changed.push(element.label); + } + + // update properties + assign(businessObject, properties); + + + // store old values + context.oldProperties = oldProperties; + context.changed = changed; + + // indicate changed on objects affected by the update + return changed; +}; + +/** + * Reverts the update on a BPMN elements properties. + * + * @param {Object} context + * + * @return {djs.mode.Base} the updated element + */ +UpdatePropertiesHandler.prototype.revert = function(context) { + + var element = context.element, + oldProperties = context.oldProperties, + businessObject = element.businessObject, + elementRegistry = this._elementRegistry; + + assign(businessObject, context.oldProperties); + + if (ID in oldProperties) { + elementRegistry.updateId(element, oldProperties[ID]); + } + + return context.changed; +}; +},{"325":325,"326":326,"330":330}],30:[function(_dereq_,module,exports){ +module.exports = { + __init__: [ 'modeling', 'bpmnUpdater', 'labelSupport' ], + __depends__: [ + _dereq_(14), + _dereq_(32), + _dereq_(27), + _dereq_(77), + _dereq_(160), + _dereq_(93) + ], + bpmnFactory: [ 'type', _dereq_(15) ], + bpmnUpdater: [ 'type', _dereq_(17) ], + elementFactory: [ 'type', _dereq_(18) ], + modeling: [ 'type', _dereq_(20) ], + labelSupport: [ 'type', _dereq_(19) ], + layouter: [ 'type', _dereq_(16) ], + connectionDocking: [ 'type', _dereq_(165) ] +}; + +},{"14":14,"15":15,"16":16,"160":160,"165":165,"17":17,"18":18,"19":19,"20":20,"27":27,"32":32,"77":77,"93":93}],31:[function(_dereq_,module,exports){ +'use strict'; + +var groupBy = _dereq_(205), + size = _dereq_(209), + find = _dereq_(203), + inherits = _dereq_(195); + +var getParents = _dereq_(21).getParents, + is = _dereq_(47).is, + getBusinessObject = _dereq_(47).getBusinessObject, + isExpanded = _dereq_(45).isExpanded; + + +var RuleProvider = _dereq_(145); + +/** + * BPMN specific modeling rule + */ +function BpmnRules(eventBus) { + RuleProvider.call(this, eventBus); +} + +inherits(BpmnRules, RuleProvider); + +BpmnRules.$inject = [ 'eventBus' ]; + +module.exports = BpmnRules; + +BpmnRules.prototype.init = function() { + + this.addRule('connection.create', function(context) { + var source = context.source, + target = context.target; + + return canConnect(source, target); + }); + + this.addRule('connection.reconnectStart', function(context) { + + var connection = context.connection, + source = context.hover || context.source, + target = connection.target; + + return canConnect(source, target, connection); + }); + + this.addRule('connection.reconnectEnd', function(context) { + + var connection = context.connection, + source = connection.source, + target = context.hover || context.target; + + return canConnect(source, target, connection); + }); + + this.addRule('connection.updateWaypoints', function(context) { + // OK! but visually ignore + return null; + }); + + this.addRule('shape.resize', function(context) { + + var shape = context.shape, + newBounds = context.newBounds; + + return canResize(shape, newBounds); + }); + + this.addRule('shapes.move', function(context) { + + var target = context.newParent, + shapes = context.shapes; + + return canMove(shapes, target); + }); + + this.addRule([ 'shape.create', 'shape.append' ], function(context) { + var target = context.parent, + shape = context.shape, + source = context.source; + + return canCreate(shape, target, source); + }); + +}; + +BpmnRules.prototype.canConnectMessageFlow = canConnectMessageFlow; + +BpmnRules.prototype.canConnectSequenceFlow = canConnectSequenceFlow; + +BpmnRules.prototype.canConnectAssociation = canConnectAssociation; + +BpmnRules.prototype.canMove = canMove; + +BpmnRules.prototype.canDrop = canDrop; + +BpmnRules.prototype.canCreate = canCreate; + +BpmnRules.prototype.canConnect = canConnect; + +BpmnRules.prototype.canResize = canResize; + +/** + * Utility functions for rule checking + */ + +function nonExistantOrLabel(element) { + return !element || isLabel(element); +} + +function isSame(a, b) { + return a === b; +} + +function getOrganizationalParent(element) { + + var bo = getBusinessObject(element); + + while (bo && !is(bo, 'bpmn:Process')) { + if (is(bo, 'bpmn:Participant')) { + return bo.processRef || bo; + } + + bo = bo.$parent; + } + + return bo; +} + +function isSameOrganization(a, b) { + var parentA = getOrganizationalParent(a), + parentB = getOrganizationalParent(b); + + return parentA === parentB; +} + +function isMessageFlowSource(element) { + return is(element, 'bpmn:InteractionNode') && ( + !is(element, 'bpmn:Event') || ( + is(element, 'bpmn:ThrowEvent') && + hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition') + ) + ); +} + +function isMessageFlowTarget(element) { + return is(element, 'bpmn:InteractionNode') && ( + !is(element, 'bpmn:Event') || ( + is(element, 'bpmn:CatchEvent') && + hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition') + ) + ); +} + +function getScopeParent(element) { + + var bo = getBusinessObject(element); + + if (is(bo, 'bpmn:Participant')) { + return null; + } + + while (bo) { + bo = bo.$parent; + + if (is(bo, 'bpmn:FlowElementsContainer')) { + return bo; + } + } + + return bo; +} + +function isSameScope(a, b) { + var scopeParentA = getScopeParent(a), + scopeParentB = getScopeParent(b); + + return scopeParentA && (scopeParentA === scopeParentB); +} + +function hasEventDefinition(element, eventDefinition) { + var bo = getBusinessObject(element); + + return !!find(bo.eventDefinitions || [], function(definition) { + return is(definition, eventDefinition); + }); +} + +function hasEventDefinitionOrNone(element, eventDefinition) { + var bo = getBusinessObject(element); + + return (bo.eventDefinitions || []).every(function(definition) { + return is(definition, eventDefinition); + }); +} + +function isSequenceFlowSource(element) { + return is(element, 'bpmn:FlowNode') && !is(element, 'bpmn:EndEvent') && !( + is(element, 'bpmn:IntermediateThrowEvent') && + hasEventDefinition(element, 'bpmn:LinkEventDefinition') + ); +} + +function isSequenceFlowTarget(element) { + return is(element, 'bpmn:FlowNode') && !is(element, 'bpmn:StartEvent') && !( + is(element, 'bpmn:IntermediateCatchEvent') && + hasEventDefinition(element, 'bpmn:LinkEventDefinition') + ); +} + +function isEventBasedTarget(element) { + return is(element, 'bpmn:ReceiveTask') || ( + is(element, 'bpmn:IntermediateCatchEvent') && ( + hasEventDefinition(element, 'bpmn:MessageEventDefinition') || + hasEventDefinition(element, 'bpmn:TimerEventDefinition') || + hasEventDefinition(element, 'bpmn:ConditionalEventDefinition') || + hasEventDefinition(element, 'bpmn:SignalEventDefinition') + ) + ); +} + +function isLabel(element) { + return element.labelTarget; +} + +function isConnection(element) { + return element.waypoints; +} + +function isParent(possibleParent, element) { + var allParents = getParents(element); + return allParents.indexOf(possibleParent) !== -1; +} + +function canConnect(source, target, connection) { + + if (nonExistantOrLabel(source) || nonExistantOrLabel(target)) { + return null; + } + + // See https://github.com/bpmn-io/bpmn-js/issues/178 + // as a workround we disallow connections with same + // target and source element. + // This rule must be removed if a auto layout for this + // connections is implemented. + if (isSame(source, target)) { + return false; + } + + if (canConnectMessageFlow(source, target) || + canConnectSequenceFlow(source, target)) { + + return true; + } + + if (is(connection, 'bpmn:Association')) { + return canConnectAssociation(source, target); + } + + return false; +} + +/** + * Can an element be dropped into the target element + * + * @return {Boolean} + */ +function canDrop(element, target) { + + // can move labels everywhere + if (isLabel(element) && !isConnection(target)) { + return true; + } + + // allow to create new participants on + // on existing collaboration and process diagrams + if (is(element, 'bpmn:Participant')) { + return is(target, 'bpmn:Process') || is(target, 'bpmn:Collaboration'); + } + + // drop flow elements onto flow element containers + // and participants + if (is(element, 'bpmn:FlowElement')) { + if (is(target, 'bpmn:FlowElementsContainer')) { + return isExpanded(target) !== false; + } + + return is(target, 'bpmn:Participant'); + } + + if (is(element, 'bpmn:Artifact')) { + return is(target, 'bpmn:Collaboration') || + is(target, 'bpmn:Participant') || + is(target, 'bpmn:Process'); + } + + if (is(element, 'bpmn:MessageFlow')) { + return is(target, 'bpmn:Collaboration'); + } + + return false; +} + +function canMove(elements, target) { + + // only move if they have the same parent + var sameParent = size(groupBy(elements, function(s) { return s.parent && s.parent.id; })) === 1; + + if (!sameParent) { + return false; + } + + if (!target) { + return true; + } + + return elements.every(function(element) { + return canDrop(element, target); + }); +} + +function canCreate(shape, target, source) { + + if (!target) { + return false; + } + + if (isLabel(target)) { + return null; + } + + if (isSame(source, target)) { + return false; + } + + // ensure we do not drop the element + // into source + if (source && isParent(source, target)) { + return false; + } + + return canDrop(shape, target); +} + +function canResize(shape, newBounds) { + if (is(shape, 'bpmn:SubProcess')) { + return isExpanded(shape) && ( + !newBounds || (newBounds.width >= 100 && newBounds.height >= 80) + ); + } + + if (is(shape, 'bpmn:Participant')) { + return !newBounds || (newBounds.width >= 100 && newBounds.height >= 80); + } + + if (is(shape, 'bpmn:TextAnnotation')) { + return true; + } + + return false; +} + +function canConnectAssociation(source, target) { + + // do not connect connections + if (isConnection(source) || isConnection(target)) { + return false; + } + + // connect if different parent + return !isParent(target, source) && + !isParent(source, target); +} + +function canConnectMessageFlow(source, target) { + + return isMessageFlowSource(source) && + isMessageFlowTarget(target) && + !isSameOrganization(source, target); +} + +function canConnectSequenceFlow(source, target) { + + return isSequenceFlowSource(source) && + isSequenceFlowTarget(target) && + isSameScope(source, target) && + !(is(source, 'bpmn:EventBasedGateway') && !isEventBasedTarget(target)); +} +},{"145":145,"195":195,"203":203,"205":205,"209":209,"21":21,"45":45,"47":47}],32:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(147) + ], + __init__: [ 'bpmnRules' ], + bpmnRules: [ 'type', _dereq_(31) ] +}; + +},{"147":147,"31":31}],33:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325); + +/** + * A palette provider for BPMN 2.0 elements. + */ +function PaletteProvider(palette, create, elementFactory, spaceTool, lassoTool) { + + this._create = create; + this._elementFactory = elementFactory; + this._spaceTool = spaceTool; + this._lassoTool = lassoTool; + + palette.registerProvider(this); +} + +module.exports = PaletteProvider; + +PaletteProvider.$inject = [ 'palette', 'create', 'elementFactory', 'spaceTool', 'lassoTool' ]; + + +PaletteProvider.prototype.getPaletteEntries = function(element) { + + var actions = {}, + create = this._create, + elementFactory = this._elementFactory, + spaceTool = this._spaceTool, + lassoTool = this._lassoTool; + + + function createAction(type, group, className, title, options) { + + function createListener(event) { + var shape = elementFactory.createShape(assign({ type: type }, options)); + + if (options) { + shape.businessObject.di.isExpanded = options.isExpanded; + } + + create.start(event, shape); + } + + var shortType = type.replace(/^bpmn\:/, ''); + + return { + group: group, + className: className, + title: title || 'Create ' + shortType, + action: { + dragstart: createListener, + click: createListener + } + }; + } + + function createParticipant(event, collapsed) { + create.start(event, elementFactory.createParticipantShape(collapsed)); + } + + assign(actions, { + 'lasso-tool': { + group: 'tools', + className: 'icon-lasso-tool', + title: 'Activate the lasso tool', + action: { + click: function(event) { + lassoTool.activateSelection(event); + } + } + }, + 'space-tool': { + group: 'tools', + className: 'icon-space-tool', + title: 'Activate the create/remove space tool', + action: { + click: function(event) { + spaceTool.activateSelection(event); + } + } + }, + 'tool-separator': { + group: 'tools', + separator: true + }, + 'create.start-event': createAction( + 'bpmn:StartEvent', 'event', 'icon-start-event-none' + ), + 'create.intermediate-event': createAction( + 'bpmn:IntermediateThrowEvent', 'event', 'icon-intermediate-event-none' + ), + 'create.end-event': createAction( + 'bpmn:EndEvent', 'event', 'icon-end-event-none' + ), + 'create.exclusive-gateway': createAction( + 'bpmn:ExclusiveGateway', 'gateway', 'icon-gateway-xor' + ), + 'create.task': createAction( + 'bpmn:Task', 'activity', 'icon-task' + ), + 'create.subprocess-collapsed': createAction( + 'bpmn:SubProcess', 'activity', 'icon-subprocess-collapsed', 'Create collapsed Sub Process', + { isExpanded: false } + ), + 'create.subprocess-expanded': createAction( + 'bpmn:SubProcess', 'activity', 'icon-subprocess-expanded', 'Create expanded SubProcess', + { isExpanded: true } + ), + 'create.participant-expanded': { + group: 'collaboration', + className: 'icon-participant', + title: 'Create Pool/Participant', + action: { + dragstart: createParticipant, + click: createParticipant + } + } + }); + + return actions; +}; + +},{"325":325}],34:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(137), + _dereq_(99) + ], + __init__: [ 'paletteProvider' ], + paletteProvider: [ 'type', _dereq_(33) ] +}; + +},{"137":137,"33":33,"99":99}],35:[function(_dereq_,module,exports){ +'use strict'; + +var forEach = _dereq_(204), + filter = _dereq_(202); + +var REPLACE_OPTIONS = _dereq_(36); + +var startEventReplace = REPLACE_OPTIONS.START_EVENT, + intermediateEventReplace = REPLACE_OPTIONS.INTERMEDIATE_EVENT, + endEventReplace = REPLACE_OPTIONS.END_EVENT, + gatewayReplace = REPLACE_OPTIONS.GATEWAY, + taskReplace = REPLACE_OPTIONS.TASK; + + +/** + * A replace menu provider that gives users the controls to choose + * and replace BPMN elements with each other. + * + * @param {BpmnFactory} bpmnFactory + * @param {Moddle} moddle + * @param {PopupMenu} popupMenu + * @param {Replace} replace + */ +function BpmnReplace(bpmnFactory, moddle, popupMenu, replace, selection) { + + /** + * Prepares a new business object for the replacement element + * and triggers the replace operation. + * + * @param {djs.model.Base} element + * @param {Object} target + * @return {djs.model.Base} the newly created element + */ + function replaceElement(element, target) { + + var type = target.type, + oldBusinessObject = element.businessObject, + businessObject = bpmnFactory.create(type); + + var newElement = { + type: type, + businessObject: businessObject + }; + + // initialize custom BPMN extensions + + if (target.eventDefinition) { + var eventDefinitions = businessObject.get('eventDefinitions'), + eventDefinition = moddle.create(target.eventDefinition); + + eventDefinitions.push(eventDefinition); + } + + if (target.instantiate !== undefined) { + businessObject.instantiate = target.instantiate; + } + + if (target.eventGatewayType !== undefined) { + businessObject.eventGatewayType = target.eventGatewayType; + } + + // copy size (for activities only) + if (oldBusinessObject.$instanceOf('bpmn:Activity')) { + + // TODO: need also to respect min/max Size + + newElement.width = element.width; + newElement.height = element.height; + } + + // TODO: copy other elligable properties from old business object + businessObject.name = oldBusinessObject.name; + + newElement = replace.replaceElement(element, newElement); + + selection.select(newElement); + + return newElement; + } + + + function getReplaceOptions(element) { + + var menuEntries = []; + var businessObject = element.businessObject; + + if (businessObject.$instanceOf('bpmn:StartEvent')) { + addEntries(startEventReplace, filterEvents); + } else + + if (businessObject.$instanceOf('bpmn:IntermediateCatchEvent') || + businessObject.$instanceOf('bpmn:IntermediateThrowEvent')) { + + addEntries(intermediateEventReplace, filterEvents); + } else + + if (businessObject.$instanceOf('bpmn:EndEvent')) { + + addEntries(endEventReplace, filterEvents); + } else + + if (businessObject.$instanceOf('bpmn:Gateway')) { + + addEntries(gatewayReplace, function(entry) { + + return entry.target.type !== businessObject.$type; + }); + } else + + if (businessObject.$instanceOf('bpmn:FlowNode')) { + addEntries(taskReplace, function(entry) { + return entry.target.type !== businessObject.$type; + }); + } + + function filterEvents(entry) { + + var target = entry.target; + + var eventDefinition = businessObject.eventDefinitions && businessObject.eventDefinitions[0].$type; + var isEventDefinitionEqual = target.eventDefinition == eventDefinition; + var isEventTypeEqual = businessObject.$type == target.type; + + return ((!isEventDefinitionEqual && isEventTypeEqual) || + !isEventTypeEqual) || + !(isEventDefinitionEqual && isEventTypeEqual); + } + + function addEntries(entries, filterFun) { + // Filter selected type from the array + var filteredEntries = filter(entries, filterFun); + + // Add entries to replace menu + forEach(filteredEntries, function(definition) { + + var entry = addMenuEntry(definition); + menuEntries.push(entry); + }); + } + + function addMenuEntry(definition) { + + return { + label: definition.label, + className: definition.className, + action: { + name: definition.actionName, + handler: function() { + replaceElement(element, definition.target); + } + } + }; + } + + return menuEntries; + } + + + // API + + this.openChooser = function(position, element) { + var entries = this.getReplaceOptions(element); + + popupMenu.open('replace-menu', position, entries); + }; + + this.getReplaceOptions = getReplaceOptions; + + this.replaceElement = replaceElement; +} + +BpmnReplace.$inject = [ 'bpmnFactory', 'moddle', 'popupMenu', 'replace', 'selection' ]; + +module.exports = BpmnReplace; +},{"202":202,"204":204,"36":36}],36:[function(_dereq_,module,exports){ +'use strict'; + +module.exports.START_EVENT = [ + { + label: 'Start Event', + actionName: 'replace-with-none-start', + className: 'icon-start-event-none', + target: { + type: 'bpmn:StartEvent' + } + }, + { + label: 'Intermediate Throw Event', + actionName: 'replace-with-intermediate-throwing', + className: 'icon-intermediate-event-none', + target: { + type: 'bpmn:IntermediateThrowEvent' + } + }, + { + label: 'End Event', + actionName: 'replace-with-message-end', + className: 'icon-end-event-none', + target: { + type: 'bpmn:EndEvent' + } + }, + { + label: 'Message Start Event', + actionName: 'replace-with-message-start', + className: 'icon-start-event-message', + target: { + type: 'bpmn:StartEvent', + eventDefinition: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Timer Start Event', + actionName: 'replace-with-timer-start', + className: 'icon-start-event-timer', + target: { + type: 'bpmn:StartEvent', + eventDefinition: 'bpmn:TimerEventDefinition' + } + }, + { + label: 'Conditional Start Event', + actionName: 'replace-with-conditional-start', + className: 'icon-start-event-condition', + target: { + type: 'bpmn:StartEvent', + eventDefinition: 'bpmn:ConditionalEventDefinition' + } + }, + { + label: 'Signal Start Event', + actionName: 'replace-with-signal-start', + className: 'icon-start-event-signal', + target: { + type: 'bpmn:StartEvent', + eventDefinition: 'bpmn:SignalEventDefinition' + } + } +]; + +module.exports.INTERMEDIATE_EVENT = [ + { + label: 'Start Event', + actionName: 'replace-with-none-start', + className: 'icon-start-event-none', + target: { + type: 'bpmn:StartEvent' + } + }, + { + label: 'Intermediate Throw Event', + actionName: 'replace-with-message-intermediate-throw', + className: 'icon-intermediate-event-none', + target: { + type: 'bpmn:IntermediateThrowEvent' + } + }, + { + label: 'End Event', + actionName: 'replace-with-message-end', + className: 'icon-end-event-none', + target: { + type: 'bpmn:EndEvent' + } + }, + { + label: 'Message Intermediate Catch Event', + actionName: 'replace-with-intermediate-catch', + className: 'icon-intermediate-event-catch-message', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinition: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Message Intermediate Throw Event', + actionName: 'replace-with-intermediate-throw', + className: 'icon-intermediate-event-throw-message', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinition: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Timer Intermediate Catch Event', + actionName: 'replace-with-timer-intermediate-catch', + className: 'icon-intermediate-event-catch-timer', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinition: 'bpmn:TimerEventDefinition' + } + }, + { + label: 'Escalation Intermediate Catch Event', + actionName: 'replace-with-escalation-catch', + className: 'icon-intermediate-event-catch-escalation', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinition: 'bpmn:EscalationEventDefinition' + } + }, + { + label: 'Conditional Intermediate Catch Event', + actionName: 'replace-with-conditional-intermediate-catch', + className: 'icon-intermediate-event-catch-condition', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinition: 'bpmn:ConditionalEventDefinition' + } + }, + { + label: 'Link Intermediate Catch Event', + actionName: 'replace-with-link-intermediate-catch', + className: 'icon-intermediate-event-catch-link', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinition: 'bpmn:LinkEventDefinition' + } + }, + { + label: 'Link Intermediate Throw Event', + actionName: 'replace-with-link-intermediate-throw', + className: 'icon-intermediate-event-throw-link', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinition: 'bpmn:LinkEventDefinition' + } + }, + { + label: 'Compensation Intermediate Throw Event', + actionName: 'replace-with-compensation-intermediate-throw', + className: 'icon-intermediate-event-throw-compensation', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinition: 'bpmn:CompensateEventDefinition' + } + }, + { + label: 'Signal Throw Catch Event', + actionName: 'replace-with-throw-intermediate-catch', + className: 'icon-intermediate-event-catch-signal', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinition: 'bpmn:SignalEventDefinition' + } + }, + { + label: 'Signal Intermediate Throw Event', + actionName: 'replace-with-signal-intermediate-throw', + className: 'icon-intermediate-event-throw-signal', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinition: 'bpmn:SignalEventDefinition' + } + } +]; + +module.exports.END_EVENT = [ + { + label: 'Start Event', + actionName: 'replace-with-none-start', + className: 'icon-start-event-none', + target: { + type: 'bpmn:StartEvent' + } + }, + { + label: 'Intermediate Throw Event', + actionName: 'replace-with-message-intermediate-throw', + className: 'icon-intermediate-event-none', + target: { + type: 'bpmn:IntermediateThrowEvent' + } + }, + { + label: 'End Event', + actionName: 'replace-with-none-end', + className: 'icon-end-event-none', + target: { + type: 'bpmn:EndEvent' + } + }, + { + label: 'Message End Event', + actionName: 'replace-with-message-end', + className: 'icon-end-event-message', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Escalation End Event', + actionName: 'replace-with-escalation-end', + className: 'icon-end-event-escalation', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:EscalationEventDefinition' + } + }, + { + label: 'Error End Event', + actionName: 'replace-with-error-end', + className: 'icon-end-event-error', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:ErrorEventDefinition' + } + }, + { + label: 'Cancel End Event', + actionName: 'replace-with-cancel-end', + className: 'icon-end-event-cancel', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:CancelEventDefinition' + } + }, + { + label: 'Compensation End Event', + actionName: 'replace-with-compensation-end', + className: 'icon-end-event-compensation', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:CompensateEventDefinition' + } + }, + { + label: 'Signal End Event', + actionName: 'replace-with-signal-end', + className: 'icon-end-event-signal', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:SignalEventDefinition' + } + }, + { + label: 'Terminate End Event', + actionName: 'replace-with-terminate-end', + className: 'icon-end-event-terminate', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:TerminateEventDefinition' + } + } +]; + +module.exports.GATEWAY = [ + { + label: 'Exclusive Gateway', + actionName: 'replace-with-exclusive-gateway', + className: 'icon-gateway-xor', + target: { + type: 'bpmn:ExclusiveGateway' + } + }, + { + label: 'Parallel Gateway', + actionName: 'replace-with-parallel-gateway', + className: 'icon-gateway-parallel', + target: { + type: 'bpmn:ParallelGateway' + } + }, + { + label: 'Inclusive Gateway', + actionName: 'replace-with-inclusive-gateway', + className: 'icon-gateway-or', + target: { + type: 'bpmn:InclusiveGateway' + } + }, + { + label: 'Complex Gateway', + actionName: 'replace-with-complex-gateway', + className: 'icon-gateway-complex', + target: { + type: 'bpmn:ComplexGateway' + } + }, + { + label: 'Event based Gateway', + actionName: 'replace-with-event-based-gateway', + className: 'icon-gateway-eventbased', + target: { + type: 'bpmn:EventBasedGateway', + instantiate: false, + eventGatewayType: 'Exclusive' + } + } + // Gateways deactivated until https://github.com/bpmn-io/bpmn-js/issues/194 + // { + // label: 'Event based instantiating Gateway', + // actionName: 'replace-with-exclusive-event-based-gateway', + // className: 'icon-exclusive-event-based', + // target: { + // type: 'bpmn:EventBasedGateway' + // }, + // options: { + // businessObject: { instantiate: true, eventGatewayType: 'Exclusive' } + // } + // }, + // { + // label: 'Parallel Event based instantiating Gateway', + // actionName: 'replace-with-parallel-event-based-instantiate-gateway', + // className: 'icon-parallel-event-based-instantiate-gateway', + // target: { + // type: 'bpmn:EventBasedGateway' + // }, + // options: { + // businessObject: { instantiate: true, eventGatewayType: 'Parallel' } + // } + // } +]; + + +module.exports.TASK = [ + { + label: 'Task', + actionName: 'replace-with-task', + className: 'icon-task', + target: { + type: 'bpmn:Task' + } + }, + { + label: 'Send Task', + actionName: 'replace-with-send-task', + className: 'icon-send', + target: { + type: 'bpmn:SendTask' + } + }, + { + label: 'Receive Task', + actionName: 'replace-with-receive-task', + className: 'icon-receive', + target: { + type: 'bpmn:ReceiveTask' + } + }, + { + label: 'User Task', + actionName: 'replace-with-user-task', + className: 'icon-user', + target: { + type: 'bpmn:UserTask' + } + }, + { + label: 'Manual Task', + actionName: 'replace-with-manual-task', + className: 'icon-manual', + target: { + type: 'bpmn:ManualTask' + } + }, + { + label: 'Business Rule Task', + actionName: 'replace-with-rule-task', + className: 'icon-business-rule', + target: { + type: 'bpmn:BusinessRuleTask' + } + }, + { + label: 'Service Task', + actionName: 'replace-with-service-task', + className: 'icon-service', + target: { + type: 'bpmn:ServiceTask' + } + }, + { + label: 'Script Task', + actionName: 'replace-with-script-task', + className: 'icon-script', + target: { + type: 'bpmn:ScriptTask' + } + } +]; +},{}],37:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(139), + _dereq_(141), + _dereq_(151) + ], + bpmnReplace: [ 'type', _dereq_(35) ] +}; +},{"139":139,"141":141,"151":151,"35":35}],38:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195); + +var forEach = _dereq_(204); + +var getBoundingBox = _dereq_(177).getBBox; +var is = _dereq_(21).is; + +var Snapping = _dereq_(154), + SnapUtil = _dereq_(153); + +var is = _dereq_(47).is; + +var mid = SnapUtil.mid, + topLeft = SnapUtil.topLeft, + bottomRight = SnapUtil.bottomRight; + +var round = Math.round; + + +/** + * BPMN specific snapping functionality + * + * * snap on process elements if a pool is created inside a + * process diagram + * + * @param {EventBus} eventBus + * @param {Canvas} canvas + */ +function BpmnSnapping(eventBus, canvas) { + + // instantiate super + Snapping.call(this, eventBus, canvas); + + + /** + * Drop participant on process <> process elements snapping + */ + + function initParticipantSnapping(context, shape, elements) { + + if (!elements.length) { + return; + } + + var snapBox = getBoundingBox(elements.filter(function(e) { + return !e.labelTarget && !e.waypoints; + })); + + snapBox.x -= 50; + snapBox.y -= 20; + snapBox.width += 70; + snapBox.height += 40; + + // adjust shape height to include bounding box + shape.width = Math.max(shape.width, snapBox.width); + shape.height = Math.max(shape.height, snapBox.height); + + context.participantSnapBox = snapBox; + } + + function snapParticipant(snapBox, shape, event) { + + var shapeHalfWidth = shape.width / 2 - 30, + shapeHalfHeight = shape.height / 2; + + var currentTopLeft = { + x: event.x - shapeHalfWidth - 30, + y: event.y - shapeHalfHeight + }; + + var currentBottomRight = { + x: event.x + shapeHalfWidth + 30, + y: event.y + shapeHalfHeight + }; + + var snapTopLeft = snapBox, + snapBottomRight = bottomRight(snapBox); + + if (currentTopLeft.x >= snapTopLeft.x) { + event.x = snapTopLeft.x + 30 + shapeHalfWidth; + event.snapped = true; + } else + if (currentBottomRight.x <= snapBottomRight.x) { + event.x = snapBottomRight.x - 30 - shapeHalfWidth; + event.snapped = true; + } + + if (currentTopLeft.y >= snapTopLeft.y) { + event.y = snapTopLeft.y + shapeHalfHeight; + event.snapped = true; + } else + if (currentBottomRight.y <= snapBottomRight.y) { + event.y = snapBottomRight.y - shapeHalfHeight; + event.snapped = true; + } + } + + eventBus.on('create.start', function(event) { + + var context = event.context, + shape = context.shape, + rootElement = canvas.getRootElement(); + + // snap participant around existing elements (if any) + if (is(shape, 'bpmn:Participant') && is(rootElement, 'bpmn:Process')) { + + initParticipantSnapping(context, shape, rootElement.children); + } + }); + + eventBus.on([ 'create.move', 'create.end' ], 1500, function(event) { + + var context = event.context, + shape = context.shape, + participantSnapBox = context.participantSnapBox; + + if (!event.snapped && participantSnapBox) { + snapParticipant(participantSnapBox, shape, event); + } + }); + + eventBus.on('resize.start', 1500, function(event) { + var context = event.context, + shape = context.shape; + + if (is(shape, 'bpmn:SubProcess')) { + context.minDimensions = { width: 140, height: 120 }; + } + + if (is(shape, 'bpmn:Participant')) { + context.minDimensions = { width: 400, height: 200 }; + } + + if (is(shape, 'bpmn:TextAnnotation')) { + context.minDimensions = { width: 50, height: 50 }; + } + }); + +} + +inherits(BpmnSnapping, Snapping); + +BpmnSnapping.$inject = [ 'eventBus', 'canvas' ]; + +module.exports = BpmnSnapping; + + +BpmnSnapping.prototype.initSnap = function(event) { + + var context = event.context, + shape = context.shape, + shapeMid, + shapeBounds, + shapeTopLeft, + shapeBottomRight, + snapContext; + + + snapContext = Snapping.prototype.initSnap.call(this, event); + + if (is(shape, 'bpmn:Participant')) { + // assign higher priority for outer snaps on participants + snapContext.setSnapLocations([ 'top-left', 'bottom-right', 'mid' ]); + } + + + if (shape) { + + shapeMid = mid(shape, event); + + shapeBounds = { + width: shape.width, + height: shape.height, + x: isNaN(shape.x) ? round(shapeMid.x - shape.width / 2) : shape.x, + y: isNaN(shape.y) ? round(shapeMid.y - shape.height / 2) : shape.y, + }; + + shapeTopLeft = topLeft(shapeBounds); + shapeBottomRight = bottomRight(shapeBounds); + + snapContext.setSnapOrigin('top-left', { + x: shapeTopLeft.x - event.x, + y: shapeTopLeft.y - event.y + }); + + snapContext.setSnapOrigin('bottom-right', { + x: shapeBottomRight.x - event.x, + y: shapeBottomRight.y - event.y + }); + + + forEach(shape.outgoing, function(c) { + var docking = c.waypoints[0]; + + docking = docking.original || docking; + + snapContext.setSnapOrigin(c.id + '-docking', { + x: docking.x - event.x, + y: docking.y - event.y + }); + }); + + forEach(shape.incoming, function(c) { + var docking = c.waypoints[c.waypoints.length - 1]; + + docking = docking.original || docking; + + snapContext.setSnapOrigin(c.id + '-docking', { + x: docking.x - event.x, + y: docking.y - event.y + }); + }); + + } + + var source = context.source; + + if (source) { + snapContext.addDefaultSnap('mid', mid(source)); + } +}; + + +BpmnSnapping.prototype.addTargetSnaps = function(snapPoints, shape, target) { + + var siblings = this.getSiblings(shape, target); + + + forEach(siblings, function(s) { + snapPoints.add('mid', mid(s)); + + if (is(s, 'bpmn:Participant')) { + snapPoints.add('top-left', topLeft(s)); + snapPoints.add('bottom-right', bottomRight(s)); + } + }); + + forEach(shape.incoming, function(c) { + + if (siblings.indexOf(c.source) === -1) { + snapPoints.add('mid', mid(c.source)); + + var docking = c.waypoints[0]; + snapPoints.add(c.id + '-docking', docking.original || docking); + } + }); + + + forEach(shape.outgoing, function(c) { + + if (siblings.indexOf(c.target) === -1) { + snapPoints.add('mid', mid(c.target)); + + var docking = c.waypoints[c.waypoints.length - 1]; + snapPoints.add(c.id + '-docking', docking.original || docking); + } + }); + +}; +},{"153":153,"154":154,"177":177,"195":195,"204":204,"21":21,"47":47}],39:[function(_dereq_,module,exports){ +module.exports = { + __init__: [ 'snapping' ], + snapping: [ 'type', _dereq_(38) ] +}; +},{"38":38}],40:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325), + map = _dereq_(207); + +var LabelUtil = _dereq_(46); + +var hasExternalLabel = LabelUtil.hasExternalLabel, + getExternalLabelBounds = LabelUtil.getExternalLabelBounds, + isExpanded = _dereq_(45).isExpanded, + elementToString = _dereq_(43).elementToString; + + +function elementData(semantic, attrs) { + return assign({ + id: semantic.id, + type: semantic.$type, + businessObject: semantic + }, attrs); +} + +function collectWaypoints(waypoints) { + return map(waypoints, function(p) { + return { x: p.x, y: p.y }; + }); +} + + +/** + * An importer that adds bpmn elements to the canvas + * + * @param {EventBus} eventBus + * @param {Canvas} canvas + * @param {ElementFactory} elementFactory + * @param {ElementRegistry} elementRegistry + */ +function BpmnImporter(eventBus, canvas, elementFactory, elementRegistry) { + this._eventBus = eventBus; + this._canvas = canvas; + + this._elementFactory = elementFactory; + this._elementRegistry = elementRegistry; +} + +BpmnImporter.$inject = [ 'eventBus', 'canvas', 'elementFactory', 'elementRegistry' ]; + +module.exports = BpmnImporter; + + +/** + * Add bpmn element (semantic) to the canvas onto the + * specified parent shape. + */ +BpmnImporter.prototype.add = function(semantic, parentElement) { + + var di = semantic.di, + element; + + // ROOT ELEMENT + // handle the special case that we deal with a + // invisible root element (process or collaboration) + if (di.$instanceOf('bpmndi:BPMNPlane')) { + + // add a virtual element (not being drawn) + element = this._elementFactory.createRoot(elementData(semantic)); + + this._canvas.setRootElement(element); + } + + // SHAPE + else if (di.$instanceOf('bpmndi:BPMNShape')) { + + var collapsed = !isExpanded(semantic); + var hidden = parentElement && (parentElement.hidden || parentElement.collapsed); + + var bounds = semantic.di.bounds; + + element = this._elementFactory.createShape(elementData(semantic, { + collapsed: collapsed, + hidden: hidden, + x: Math.round(bounds.x), + y: Math.round(bounds.y), + width: Math.round(bounds.width), + height: Math.round(bounds.height) + })); + + this._canvas.addShape(element, parentElement); + } + + // CONNECTION + else if (di.$instanceOf('bpmndi:BPMNEdge')) { + + var source = this._getSource(semantic), + target = this._getTarget(semantic); + + element = this._elementFactory.createConnection(elementData(semantic, { + source: source, + target: target, + waypoints: collectWaypoints(semantic.di.waypoint) + })); + + this._canvas.addConnection(element, parentElement); + } else { + throw new Error('unknown di ' + elementToString(di) + ' for element ' + elementToString(semantic)); + } + + // (optional) LABEL + if (hasExternalLabel(semantic)) { + this.addLabel(semantic, element); + } + + + this._eventBus.fire('bpmnElement.added', { element: element }); + + return element; +}; + + +/** + * add label for an element + */ +BpmnImporter.prototype.addLabel = function(semantic, element) { + var bounds = getExternalLabelBounds(semantic, element); + + var label = this._elementFactory.createLabel(elementData(semantic, { + id: semantic.id + '_label', + labelTarget: element, + type: 'label', + hidden: element.hidden, + x: Math.round(bounds.x), + y: Math.round(bounds.y), + width: Math.round(bounds.width), + height: Math.round(bounds.height) + })); + + return this._canvas.addShape(label, element.parent); +}; + +/** + * Return the drawn connection end based on the given side. + * + * @throws {Error} if the end is not yet drawn + */ +BpmnImporter.prototype._getEnd = function(semantic, side) { + + var element, + refSemantic, + type = semantic.$type; + + refSemantic = semantic[side + 'Ref']; + + // handle mysterious isMany DataAssociation#sourceRef + if (side === 'source' && type === 'bpmn:DataInputAssociation') { + refSemantic = refSemantic && refSemantic[0]; + } + + // fix source / target for DataInputAssociation / DataOutputAssociation + if (side === 'source' && type === 'bpmn:DataOutputAssociation' || + side === 'target' && type === 'bpmn:DataInputAssociation') { + + refSemantic = semantic.$parent; + } + + element = refSemantic && this._getElement(refSemantic); + + if (element) { + return element; + } + + if (refSemantic) { + throw new Error( + 'element ' + elementToString(refSemantic) + ' referenced by ' + + elementToString(semantic) + '#' + side + 'Ref not yet drawn'); + } else { + throw new Error(elementToString(semantic) + '#' + side + 'Ref not specified'); + } +}; + +BpmnImporter.prototype._getSource = function(semantic) { + return this._getEnd(semantic, 'source'); +}; + +BpmnImporter.prototype._getTarget = function(semantic) { + return this._getEnd(semantic, 'target'); +}; + + +BpmnImporter.prototype._getElement = function(semantic) { + return this._elementRegistry.get(semantic.id); +}; + +},{"207":207,"325":325,"43":43,"45":45,"46":46}],41:[function(_dereq_,module,exports){ +'use strict'; + +var filter = _dereq_(202), + find = _dereq_(203), + forEach = _dereq_(204); + +var Refs = _dereq_(356); + +var elementToString = _dereq_(43).elementToString; + +var diRefs = new Refs({ name: 'bpmnElement', enumerable: true }, { name: 'di' }); + +/** + * Returns true if an element has the given meta-model type + * + * @param {ModdleElement} element + * @param {String} type + * + * @return {Boolean} + */ +function is(element, type) { + return element.$instanceOf(type); +} + + +/** + * Find a suitable display candidate for definitions where the DI does not + * correctly specify one. + */ +function findDisplayCandidate(definitions) { + return find(definitions.rootElements, function(e) { + return is(e, 'bpmn:Process') || is(e, 'bpmn:Collaboration'); + }); +} + + +function BpmnTreeWalker(handler) { + + // list of containers already walked + var handledProcesses = []; + + // list of elements to handle deferred to ensure + // prerequisites are drawn + var deferred = []; + + ///// Helpers ///////////////////////////////// + + function contextual(fn, ctx) { + return function(e) { + fn(e, ctx); + }; + } + + function visit(element, ctx) { + + var gfx = element.gfx; + + // avoid multiple rendering of elements + if (gfx) { + throw new Error('already rendered ' + elementToString(element)); + } + + // call handler + return handler.element(element, ctx); + } + + function visitRoot(element, diagram) { + return handler.root(element, diagram); + } + + function visitIfDi(element, ctx) { + try { + return element.di && visit(element, ctx); + } catch (e) { + logError(e.message, { element: element, error: e }); + + console.error('failed to import ' + elementToString(element)); + console.error(e); + } + } + + function logError(message, context) { + handler.error(message, context); + } + + ////// DI handling //////////////////////////// + + function registerDi(di) { + var bpmnElement = di.bpmnElement; + + if (bpmnElement) { + if (bpmnElement.di) { + logError('multiple DI elements defined for ' + elementToString(bpmnElement), { element: bpmnElement }); + } else { + diRefs.bind(bpmnElement, 'di'); + bpmnElement.di = di; + } + } else { + logError('no bpmnElement referenced in ' + elementToString(di), { element: di }); + } + } + + function handleDiagram(diagram) { + handlePlane(diagram.plane); + } + + function handlePlane(plane) { + registerDi(plane); + + forEach(plane.planeElement, handlePlaneElement); + } + + function handlePlaneElement(planeElement) { + registerDi(planeElement); + } + + + ////// Semantic handling ////////////////////// + + function handleDefinitions(definitions, diagram) { + // make sure we walk the correct bpmnElement + + var diagrams = definitions.diagrams; + + if (diagram && diagrams.indexOf(diagram) === -1) { + throw new Error('diagram not part of bpmn:Definitions'); + } + + if (!diagram && diagrams && diagrams.length) { + diagram = diagrams[0]; + } + + // no diagram -> nothing to import + if (!diagram) { + return; + } + + // load DI from selected diagram only + handleDiagram(diagram); + + + var plane = diagram.plane; + + if (!plane) { + throw new Error('no plane for ' + elementToString(diagram)); + } + + + var rootElement = plane.bpmnElement; + + // ensure we default to a suitable display candidate (process or collaboration), + // even if non is specified in DI + if (!rootElement) { + rootElement = findDisplayCandidate(definitions); + + if (!rootElement) { + return logError('no process or collaboration present to display'); + } else { + + logError('correcting missing bpmnElement on ' + elementToString(plane) + ' to ' + elementToString(rootElement)); + + // correct DI on the fly + plane.bpmnElement = rootElement; + registerDi(plane); + } + } + + + var ctx = visitRoot(rootElement, plane); + + if (is(rootElement, 'bpmn:Process')) { + handleProcess(rootElement, ctx); + } else if (is(rootElement, 'bpmn:Collaboration')) { + handleCollaboration(rootElement, ctx); + + // force drawing of everything not yet drawn that is part of the target DI + handleUnhandledProcesses(definitions.rootElements, ctx); + } else { + throw new Error('unsupported bpmnElement for ' + elementToString(plane) + ' : ' + elementToString(rootElement)); + } + + // handle all deferred elements + handleDeferred(deferred); + } + + function handleDeferred(deferred) { + forEach(deferred, function(d) { d(); }); + } + + function handleProcess(process, context) { + handleFlowElementsContainer(process, context); + handleIoSpecification(process.ioSpecification, context); + + handleArtifacts(process.artifacts, context); + + // log process handled + handledProcesses.push(process); + } + + function handleUnhandledProcesses(rootElements) { + + // walk through all processes that have not yet been drawn and draw them + // if they contain lanes with DI information. + // we do this to pass the free-floating lane test cases in the MIWG test suite + var processes = filter(rootElements, function(e) { + return is(e, 'bpmn:Process') && e.laneSets && handledProcesses.indexOf(e) === -1; + }); + + processes.forEach(contextual(handleProcess)); + } + + function handleMessageFlow(messageFlow, context) { + visitIfDi(messageFlow, context); + } + + function handleMessageFlows(messageFlows, context) { + forEach(messageFlows, contextual(handleMessageFlow, context)); + } + + function handleDataAssociation(association, context) { + visitIfDi(association, context); + } + + function handleDataInput(dataInput, context) { + visitIfDi(dataInput, context); + } + + function handleDataOutput(dataOutput, context) { + visitIfDi(dataOutput, context); + } + + function handleArtifact(artifact, context) { + + // bpmn:TextAnnotation + // bpmn:Group + // bpmn:Association + + visitIfDi(artifact, context); + } + + function handleArtifacts(artifacts, context) { + + forEach(artifacts, function(e) { + if (is(e, 'bpmn:Association')) { + deferred.push(function() { + handleArtifact(e, context); + }); + } else { + handleArtifact(e, context); + } + }); + } + + function handleIoSpecification(ioSpecification, context) { + + if (!ioSpecification) { + return; + } + + forEach(ioSpecification.dataInputs, contextual(handleDataInput, context)); + forEach(ioSpecification.dataOutputs, contextual(handleDataOutput, context)); + } + + function handleSubProcess(subProcess, context) { + handleFlowElementsContainer(subProcess, context); + handleArtifacts(subProcess.artifacts, context); + } + + function handleFlowNode(flowNode, context) { + var childCtx = visitIfDi(flowNode, context); + + if (is(flowNode, 'bpmn:SubProcess')) { + handleSubProcess(flowNode, childCtx || context); + } + } + + function handleSequenceFlow(sequenceFlow, context) { + visitIfDi(sequenceFlow, context); + } + + function handleDataElement(dataObject, context) { + visitIfDi(dataObject, context); + } + + function handleBoundaryEvent(dataObject, context) { + visitIfDi(dataObject, context); + } + + function handleLane(lane, context) { + var newContext = visitIfDi(lane, context); + + if (lane.childLaneSet) { + handleLaneSet(lane.childLaneSet, newContext || context); + } else { + var filterList = filter(lane.flowNodeRef, function(e) { + return e.$type !== 'bpmn:BoundaryEvent'; + }); + handleFlowElements(filterList, newContext || context); + } + } + + function handleLaneSet(laneSet, context) { + forEach(laneSet.lanes, contextual(handleLane, context)); + } + + function handleLaneSets(laneSets, context) { + forEach(laneSets, contextual(handleLaneSet, context)); + } + + function handleFlowElementsContainer(container, context) { + + if (container.laneSets) { + handleLaneSets(container.laneSets, context); + handleNonFlowNodes(container.flowElements); + } else { + handleFlowElements(container.flowElements, context); + } + } + + function handleNonFlowNodes(flowElements, context) { + forEach(flowElements, function(e) { + if (is(e, 'bpmn:SequenceFlow')) { + deferred.push(function() { + handleSequenceFlow(e, context); + }); + } else if (is(e, 'bpmn:BoundaryEvent')) { + deferred.unshift(function() { + handleBoundaryEvent(e, context); + }); + } else if (is(e, 'bpmn:DataObject')) { + // SKIP (assume correct referencing via DataObjectReference) + } else if (is(e, 'bpmn:DataStoreReference')) { + handleDataElement(e, context); + } else if (is(e, 'bpmn:DataObjectReference')) { + handleDataElement(e, context); + } + }); + } + + function handleFlowElements(flowElements, context) { + forEach(flowElements, function(e) { + if (is(e, 'bpmn:SequenceFlow')) { + deferred.push(function() { + handleSequenceFlow(e, context); + }); + } else if (is(e, 'bpmn:BoundaryEvent')) { + deferred.unshift(function() { + handleBoundaryEvent(e, context); + }); + } else if (is(e, 'bpmn:FlowNode')) { + handleFlowNode(e, context); + + if (is(e, 'bpmn:Activity')) { + + handleIoSpecification(e.ioSpecification, context); + + // defer handling of associations + deferred.push(function() { + forEach(e.dataInputAssociations, contextual(handleDataAssociation, context)); + forEach(e.dataOutputAssociations, contextual(handleDataAssociation, context)); + }); + } + } else if (is(e, 'bpmn:DataObject')) { + // SKIP (assume correct referencing via DataObjectReference) + } else if (is(e, 'bpmn:DataStoreReference')) { + handleDataElement(e, context); + } else if (is(e, 'bpmn:DataObjectReference')) { + handleDataElement(e, context); + } else { + logError( + 'unrecognized flowElement ' + elementToString(e) + ' in context ' + + (context ? elementToString(context.businessObject) : null), + { element: e, context: context }); + } + }); + } + + function handleParticipant(participant, context) { + var newCtx = visitIfDi(participant, context); + + var process = participant.processRef; + if (process) { + handleProcess(process, newCtx || context); + } + } + + function handleCollaboration(collaboration) { + + forEach(collaboration.participants, contextual(handleParticipant)); + + handleArtifacts(collaboration.artifacts); + + // handle message flows latest in the process + deferred.push(function() { + handleMessageFlows(collaboration.messageFlows); + }); + } + + + ///// API //////////////////////////////// + + return { + handleDefinitions: handleDefinitions + }; +} + +module.exports = BpmnTreeWalker; +},{"202":202,"203":203,"204":204,"356":356,"43":43}],42:[function(_dereq_,module,exports){ +'use strict'; + +var BpmnTreeWalker = _dereq_(41); + + +/** + * Import the definitions into a diagram. + * + * Errors and warnings are reported through the specified callback. + * + * @param {Diagram} diagram + * @param {ModdleElement} definitions + * @param {Function} done the callback, invoked with (err, [ warning ]) once the import is done + */ +function importBpmnDiagram(diagram, definitions, done) { + + var importer = diagram.get('bpmnImporter'), + eventBus = diagram.get('eventBus'); + + var error, + warnings = []; + + function parse(definitions) { + + var visitor = { + + root: function(element) { + return importer.add(element); + }, + + element: function(element, parentShape) { + return importer.add(element, parentShape); + }, + + error: function(message, context) { + warnings.push({ message: message, context: context }); + } + }; + + var walker = new BpmnTreeWalker(visitor); + + // import + walker.handleDefinitions(definitions); + } + + eventBus.fire('import.start'); + + try { + parse(definitions); + } catch (e) { + error = e; + } + + eventBus.fire(error ? 'import.error' : 'import.success', { error: error, warnings: warnings }); + done(error, warnings); +} + +module.exports.importBpmnDiagram = importBpmnDiagram; +},{"41":41}],43:[function(_dereq_,module,exports){ +'use strict'; + +module.exports.elementToString = function(e) { + if (!e) { + return ''; + } + + return '<' + e.$type + (e.id ? ' id="' + e.id : '') + '" />'; +}; +},{}],44:[function(_dereq_,module,exports){ +module.exports = { + bpmnImporter: [ 'type', _dereq_(40) ] +}; +},{"40":40}],45:[function(_dereq_,module,exports){ +'use strict'; + +var is = _dereq_(47).is, + getBusinessObject = _dereq_(47).getBusinessObject; + +module.exports.isExpanded = function(element) { + + if (is(element, 'bpmn:CallActivity')) { + return false; + } + + if (is(element, 'bpmn:SubProcess')) { + return getBusinessObject(element).di.isExpanded; + } + + if (is(element, 'bpmn:Participant')) { + return !!getBusinessObject(element).processRef; + } + + return true; +}; + +},{"47":47}],46:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325); + + +var DEFAULT_LABEL_SIZE = module.exports.DEFAULT_LABEL_SIZE = { + width: 90, + height: 20 +}; + + +/** + * Returns true if the given semantic has an external label + * + * @param {BpmnElement} semantic + * @return {Boolean} true if has label + */ +module.exports.hasExternalLabel = function(semantic) { + + return semantic.$instanceOf('bpmn:Event') || + semantic.$instanceOf('bpmn:Gateway') || + semantic.$instanceOf('bpmn:DataStoreReference') || + semantic.$instanceOf('bpmn:DataObjectReference') || + semantic.$instanceOf('bpmn:SequenceFlow') || + semantic.$instanceOf('bpmn:MessageFlow'); +}; + + +/** + * Get the middle of a number of waypoints + * + * @param {Array} waypoints + * @return {Point} the mid point + */ +var getWaypointsMid = module.exports.getWaypointsMid = function(waypoints) { + + var mid = waypoints.length / 2 - 1; + + var first = waypoints[Math.floor(mid)]; + var second = waypoints[Math.ceil(mid + 0.01)]; + + return { + x: first.x + (second.x - first.x) / 2, + y: first.y + (second.y - first.y) / 2 + }; +}; + + +var getExternalLabelMid = module.exports.getExternalLabelMid = function(element) { + + if (element.waypoints) { + return getWaypointsMid(element.waypoints); + } else { + return { + x: element.x + element.width / 2, + y: element.y + element.height + DEFAULT_LABEL_SIZE.height / 2 + }; + } +}; + +/** + * Returns the bounds of an elements label, parsed from the elements DI or + * generated from its bounds. + * + * @param {BpmnElement} semantic + * @param {djs.model.Base} element + */ +module.exports.getExternalLabelBounds = function(semantic, element) { + + var mid, + size, + bounds, + di = semantic.di, + label = di.label; + + if (label && label.bounds) { + bounds = label.bounds; + + size = { + width: Math.max(DEFAULT_LABEL_SIZE.width, bounds.width), + height: bounds.height + }; + + mid = { + x: bounds.x + bounds.width / 2, + y: bounds.y + bounds.height / 2 + }; + } else { + + mid = getExternalLabelMid(element); + + size = DEFAULT_LABEL_SIZE; + } + + return assign({ + x: mid.x - size.width / 2, + y: mid.y - size.height / 2 + }, size); +}; +},{"325":325}],47:[function(_dereq_,module,exports){ +'use strict'; + +/** + * Is an element of the given BPMN type? + * + * @param {djs.model.Base|ModdleElement} element + * @param {String} type + * + * @return {Boolean} + */ +function is(element, type) { + var bo = getBusinessObject(element); + + return bo && bo.$instanceOf(type); +} + +module.exports.is = is; + + +/** + * Return the business object for a given element. + * + * @param {djs.model.Base|ModdleElement} element + * + * @return {ModdleElement} + */ +function getBusinessObject(element) { + return (element && element.businessObject) || element; +} + +module.exports.getBusinessObject = getBusinessObject; + +},{}],48:[function(_dereq_,module,exports){ +module.exports = _dereq_(51); +},{"51":51}],49:[function(_dereq_,module,exports){ +'use strict'; + +var isString = _dereq_(322), + isFunction = _dereq_(317), + assign = _dereq_(325); + +var Moddle = _dereq_(57), + XmlReader = _dereq_(53), + XmlWriter = _dereq_(54); + +/** + * A sub class of {@link Moddle} with support for import and export of BPMN 2.0 xml files. + * + * @class BpmnModdle + * @extends Moddle + * + * @param {Object|Array} packages to use for instantiating the model + * @param {Object} [options] additional options to pass over + */ +function BpmnModdle(packages, options) { + Moddle.call(this, packages, options); +} + +BpmnModdle.prototype = Object.create(Moddle.prototype); + +module.exports = BpmnModdle; + + +/** + * Instantiates a BPMN model tree from a given xml string. + * + * @param {String} xmlStr + * @param {String} [typeName='bpmn:Definitions'] name of the root element + * @param {Object} [options] options to pass to the underlying reader + * @param {Function} done callback that is invoked with (err, result, parseContext) + * once the import completes + */ +BpmnModdle.prototype.fromXML = function(xmlStr, typeName, options, done) { + + if (!isString(typeName)) { + done = options; + options = typeName; + typeName = 'bpmn:Definitions'; + } + + if (isFunction(options)) { + done = options; + options = {}; + } + + var reader = new XmlReader(assign({ model: this, lax: true }, options)); + var rootHandler = reader.handler(typeName); + + reader.fromXML(xmlStr, rootHandler, done); +}; + + +/** + * Serializes a BPMN 2.0 object tree to XML. + * + * @param {String} element the root element, typically an instance of `bpmn:Definitions` + * @param {Object} [options] to pass to the underlying writer + * @param {Function} done callback invoked with (err, xmlStr) once the import completes + */ +BpmnModdle.prototype.toXML = function(element, options, done) { + + if (isFunction(options)) { + done = options; + options = {}; + } + + var writer = new XmlWriter(options); + try { + var result = writer.toXML(element); + done(null, result); + } catch (e) { + done(e); + } +}; + +},{"317":317,"322":322,"325":325,"53":53,"54":54,"57":57}],50:[function(_dereq_,module,exports){ +'use strict'; + +var ID_PATTERN = /^(.*:)?id$/; + +/** + * Extends the bpmn instance with id support. + * + * @example + * + * var moddle, ids; + * + * require('id-support').extend(moddle, ids); + * + * moddle.ids.next(); // create a next id + * moddle.ids; // ids instance + * + * // claims id as used + * moddle.create('foo:Bar', { id: 'fooobar1' }); + * + * + * @param {Moddle} model + * @param {Ids} ids + * + * @return {Moddle} the extended moddle instance + */ +module.exports.extend = function(model, ids) { + + var set = model.properties.set; + + // do not reinitialize setter + // unless it is already initialized + if (!model.ids) { + + model.properties.set = function(target, property, value) { + + // ensure we log used ids once they are assigned + // to model elements + if (ID_PATTERN.test(property)) { + + var assigned = model.ids.assigned(value); + if (assigned && assigned !== target) { + throw new Error('id <' + value + '> already used'); + } + + model.ids.claim(value, target); + } + + set.call(this, target, property, value); + }; + } + + model.ids = ids; + + return model; +}; +},{}],51:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325); + +var BpmnModdle = _dereq_(49); + +var packages = { + bpmn: _dereq_(66), + bpmndi: _dereq_(67), + dc: _dereq_(68), + di: _dereq_(69) +}; + +module.exports = function(additionalPackages, options) { + return new BpmnModdle(assign({}, packages, additionalPackages), options); +}; +},{"325":325,"49":49,"66":66,"67":67,"68":68,"69":69}],52:[function(_dereq_,module,exports){ +'use strict'; + +function capitalize(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} + +function lower(string) { + return string.charAt(0).toLowerCase() + string.slice(1); +} + +function hasLowerCaseAlias(pkg) { + return pkg.xml && pkg.xml.tagAlias === 'lowerCase'; +} + + +module.exports.aliasToName = function(alias, pkg) { + if (hasLowerCaseAlias(pkg)) { + return capitalize(alias); + } else { + return alias; + } +}; + +module.exports.nameToAlias = function(name, pkg) { + if (hasLowerCaseAlias(pkg)) { + return lower(name); + } else { + return name; + } +}; + +module.exports.DEFAULT_NS_MAP = { + 'xsi': 'http://www.w3.org/2001/XMLSchema-instance' +}; + +module.exports.XSI_TYPE = 'xsi:type'; +},{}],53:[function(_dereq_,module,exports){ +'use strict'; + +var reduce = _dereq_(208), + forEach = _dereq_(204), + find = _dereq_(203), + assign = _dereq_(325), + defer = _dereq_(215); + +var Stack = _dereq_(56), + SaxParser = _dereq_(55).parser, + Moddle = _dereq_(57), + parseNameNs = _dereq_(62).parseName, + Types = _dereq_(65), + coerceType = Types.coerceType, + isSimpleType = Types.isSimple, + common = _dereq_(52), + XSI_TYPE = common.XSI_TYPE, + XSI_URI = common.DEFAULT_NS_MAP.xsi, + aliasToName = common.aliasToName; + +function parseNodeAttributes(node) { + var nodeAttrs = node.attributes; + + return reduce(nodeAttrs, function(result, v, k) { + var name, ns; + + if (!v.local) { + name = v.prefix; + } else { + ns = parseNameNs(v.name, v.prefix); + name = ns.name; + } + + result[name] = v.value; + return result; + }, {}); +} + +function normalizeType(node, attr, model) { + var nameNs = parseNameNs(attr.value); + + var uri = node.ns[nameNs.prefix || ''], + localName = nameNs.localName, + pkg = uri && model.getPackage(uri), + typePrefix; + + if (pkg) { + typePrefix = pkg.xml && pkg.xml.typePrefix; + + if (typePrefix && localName.indexOf(typePrefix) === 0) { + localName = localName.slice(typePrefix.length); + } + + attr.value = pkg.prefix + ':' + localName; + } +} + +/** + * Normalizes namespaces for a node given an optional default namespace and a + * number of mappings from uris to default prefixes. + * + * @param {XmlNode} node + * @param {Model} model the model containing all registered namespaces + * @param {Uri} defaultNsUri + */ +function normalizeNamespaces(node, model, defaultNsUri) { + var uri, prefix; + + uri = node.uri || defaultNsUri; + + if (uri) { + var pkg = model.getPackage(uri); + + if (pkg) { + prefix = pkg.prefix; + } else { + prefix = node.prefix; + } + + node.prefix = prefix; + node.uri = uri; + } + + forEach(node.attributes, function(attr) { + + // normalize xsi:type attributes because the + // assigned type may or may not be namespace prefixed + if (attr.uri === XSI_URI && attr.local === 'type') { + normalizeType(node, attr, model); + } + + normalizeNamespaces(attr, model, null); + }); +} + + +/** + * A parse context. + * + * @class + * + * @param {Object} options + * @param {ElementHandler} options.parseRoot the root handler for parsing a document + * @param {boolean} [options.lax=false] whether or not to ignore invalid elements + */ +function Context(options) { + + /** + * @property {ElementHandler} parseRoot + */ + + /** + * @property {Boolean} lax + */ + + assign(this, options); + + var elementsById = this.elementsById = {}; + var references = this.references = []; + var warnings = this.warnings = []; + + this.addReference = function(reference) { + references.push(reference); + }; + + this.addElement = function(id, element) { + + if (!id || !element) { + throw new Error('[xml-reader] id or ctx must not be null'); + } + + elementsById[id] = element; + }; + + this.addWarning = function (w) { + warnings.push(w); + }; +} + +function BaseHandler() {} + +BaseHandler.prototype.handleEnd = function() {}; +BaseHandler.prototype.handleText = function() {}; +BaseHandler.prototype.handleNode = function() {}; + + +/** + * A simple pass through handler that does nothing except for + * ignoring all input it receives. + * + * This is used to ignore unknown elements and + * attributes. + */ +function NoopHandler() { } + +NoopHandler.prototype = new BaseHandler(); + +NoopHandler.prototype.handleNode = function() { + return this; +}; + +function BodyHandler() {} + +BodyHandler.prototype = new BaseHandler(); + +BodyHandler.prototype.handleText = function(text) { + this.body = (this.body || '') + text; +}; + +function ReferenceHandler(property, context) { + this.property = property; + this.context = context; +} + +ReferenceHandler.prototype = new BodyHandler(); + +ReferenceHandler.prototype.handleNode = function(node) { + + if (this.element) { + throw new Error('expected no sub nodes'); + } else { + this.element = this.createReference(node); + } + + return this; +}; + +ReferenceHandler.prototype.handleEnd = function() { + this.element.id = this.body; +}; + +ReferenceHandler.prototype.createReference = function() { + return { + property: this.property.ns.name, + id: '' + }; +}; + +function ValueHandler(propertyDesc, element) { + this.element = element; + this.propertyDesc = propertyDesc; +} + +ValueHandler.prototype = new BodyHandler(); + +ValueHandler.prototype.handleEnd = function() { + + var value = this.body, + element = this.element, + propertyDesc = this.propertyDesc; + + value = coerceType(propertyDesc.type, value); + + if (propertyDesc.isMany) { + element.get(propertyDesc.name).push(value); + } else { + element.set(propertyDesc.name, value); + } +}; + + +function BaseElementHandler() {} + +BaseElementHandler.prototype = Object.create(BodyHandler.prototype); + +BaseElementHandler.prototype.handleNode = function(node) { + var parser = this, + element = this.element, + id; + + if (!element) { + element = this.element = this.createElement(node); + id = element.id; + + if (id) { + this.context.addElement(id, element); + } + } else { + parser = this.handleChild(node); + } + + return parser; +}; + +/** + * @class XMLReader.ElementHandler + * + */ +function ElementHandler(model, type, context) { + this.model = model; + this.type = model.getType(type); + this.context = context; +} + +ElementHandler.prototype = new BaseElementHandler(); + +ElementHandler.prototype.addReference = function(reference) { + this.context.addReference(reference); +}; + +ElementHandler.prototype.handleEnd = function() { + + var value = this.body, + element = this.element, + descriptor = element.$descriptor, + bodyProperty = descriptor.bodyProperty; + + if (bodyProperty && value !== undefined) { + value = coerceType(bodyProperty.type, value); + element.set(bodyProperty.name, value); + } +}; + +/** + * Create an instance of the model from the given node. + * + * @param {Element} node the xml node + */ +ElementHandler.prototype.createElement = function(node) { + var attributes = parseNodeAttributes(node), + Type = this.type, + descriptor = Type.$descriptor, + context = this.context, + instance = new Type({}); + + forEach(attributes, function(value, name) { + + var prop = descriptor.propertiesByName[name]; + + if (prop && prop.isReference) { + context.addReference({ + element: instance, + property: prop.ns.name, + id: value + }); + } else { + if (prop) { + value = coerceType(prop.type, value); + } + + instance.set(name, value); + } + }); + + return instance; +}; + +ElementHandler.prototype.getPropertyForNode = function(node) { + + var nameNs = parseNameNs(node.local, node.prefix); + + var type = this.type, + model = this.model, + descriptor = type.$descriptor; + + var propertyName = nameNs.name, + property = descriptor.propertiesByName[propertyName], + elementTypeName, + elementType, + typeAnnotation; + + // search for properties by name first + + if (property) { + + if (property.serialize === XSI_TYPE) { + typeAnnotation = node.attributes[XSI_TYPE]; + + // xsi type is optional, if it does not exists the + // default type is assumed + if (typeAnnotation) { + + elementTypeName = typeAnnotation.value; + + // TODO: extract real name from attribute + elementType = model.getType(elementTypeName); + + return assign({}, property, { effectiveType: elementType.$descriptor.name }); + } + } + + // search for properties by name first + return property; + } + + + var pkg = model.getPackage(nameNs.prefix); + + if (pkg) { + elementTypeName = nameNs.prefix + ':' + aliasToName(nameNs.localName, descriptor.$pkg); + elementType = model.getType(elementTypeName); + + // search for collection members later + property = find(descriptor.properties, function(p) { + return !p.isVirtual && !p.isReference && !p.isAttribute && elementType.hasType(p.type); + }); + + if (property) { + return assign({}, property, { effectiveType: elementType.$descriptor.name }); + } + } else { + // parse unknown element (maybe extension) + property = find(descriptor.properties, function(p) { + return !p.isReference && !p.isAttribute && p.type === 'Element'; + }); + + if (property) { + return property; + } + } + + throw new Error('unrecognized element <' + nameNs.name + '>'); +}; + +ElementHandler.prototype.toString = function() { + return 'ElementDescriptor[' + this.type.$descriptor.name + ']'; +}; + +ElementHandler.prototype.valueHandler = function(propertyDesc, element) { + return new ValueHandler(propertyDesc, element); +}; + +ElementHandler.prototype.referenceHandler = function(propertyDesc) { + return new ReferenceHandler(propertyDesc, this.context); +}; + +ElementHandler.prototype.handler = function(type) { + if (type === 'Element') { + return new GenericElementHandler(this.model, type, this.context); + } else { + return new ElementHandler(this.model, type, this.context); + } +}; + +/** + * Handle the child element parsing + * + * @param {Element} node the xml node + */ +ElementHandler.prototype.handleChild = function(node) { + var propertyDesc, type, element, childHandler; + + propertyDesc = this.getPropertyForNode(node); + element = this.element; + + type = propertyDesc.effectiveType || propertyDesc.type; + + if (isSimpleType(type)) { + return this.valueHandler(propertyDesc, element); + } + + if (propertyDesc.isReference) { + childHandler = this.referenceHandler(propertyDesc).handleNode(node); + } else { + childHandler = this.handler(type).handleNode(node); + } + + var newElement = childHandler.element; + + // child handles may decide to skip elements + // by not returning anything + if (newElement !== undefined) { + + if (propertyDesc.isMany) { + element.get(propertyDesc.name).push(newElement); + } else { + element.set(propertyDesc.name, newElement); + } + + if (propertyDesc.isReference) { + assign(newElement, { + element: element + }); + + this.context.addReference(newElement); + } else { + // establish child -> parent relationship + newElement.$parent = element; + } + } + + return childHandler; +}; + + +function GenericElementHandler(model, type, context) { + this.model = model; + this.context = context; +} + +GenericElementHandler.prototype = Object.create(BaseElementHandler.prototype); + +GenericElementHandler.prototype.createElement = function(node) { + + var name = node.name, + prefix = node.prefix, + uri = node.ns[prefix], + attributes = node.attributes; + + return this.model.createAny(name, uri, attributes); +}; + +GenericElementHandler.prototype.handleChild = function(node) { + + var handler = new GenericElementHandler(this.model, 'Element', this.context).handleNode(node), + element = this.element; + + var newElement = handler.element, + children; + + if (newElement !== undefined) { + children = element.$children = element.$children || []; + children.push(newElement); + + // establish child -> parent relationship + newElement.$parent = element; + } + + return handler; +}; + +GenericElementHandler.prototype.handleText = function(text) { + this.body = this.body || '' + text; +}; + +GenericElementHandler.prototype.handleEnd = function() { + if (this.body) { + this.element.$body = this.body; + } +}; + +/** + * A reader for a meta-model + * + * @param {Object} options + * @param {Model} options.model used to read xml files + * @param {Boolean} options.lax whether to make parse errors warnings + */ +function XMLReader(options) { + + if (options instanceof Moddle) { + options = { + model: options + }; + } + + assign(this, { lax: false }, options); +} + + +XMLReader.prototype.fromXML = function(xml, rootHandler, done) { + + var model = this.model, + lax = this.lax, + context = new Context({ + parseRoot: rootHandler + }); + + var parser = new SaxParser(true, { xmlns: true, trim: true }), + stack = new Stack(); + + rootHandler.context = context; + + // push root handler + stack.push(rootHandler); + + + function resolveReferences() { + + var elementsById = context.elementsById; + var references = context.references; + + var i, r; + + for (i = 0; !!(r = references[i]); i++) { + var element = r.element; + var reference = elementsById[r.id]; + var property = element.$descriptor.propertiesByName[r.property]; + + if (!reference) { + context.addWarning({ + message: 'unresolved reference <' + r.id + '>', + element: r.element, + property: r.property, + value: r.id + }); + } + + if (property.isMany) { + var collection = element.get(property.name), + idx = collection.indexOf(r); + + if (!reference) { + // remove unresolvable reference + collection.splice(idx, 1); + } else { + // update reference + collection[idx] = reference; + } + } else { + element.set(property.name, reference); + } + } + } + + function handleClose(tagName) { + stack.pop().handleEnd(); + } + + function handleOpen(node) { + var handler = stack.peek(); + + normalizeNamespaces(node, model); + + try { + stack.push(handler.handleNode(node)); + } catch (e) { + + var line = this.line, + column = this.column; + + var message = + 'unparsable content <' + node.name + '> detected\n\t' + + 'line: ' + line + '\n\t' + + 'column: ' + column + '\n\t' + + 'nested error: ' + e.message; + + if (lax) { + context.addWarning({ + message: message, + error: e + }); + + console.warn('could not parse node'); + console.warn(e); + + stack.push(new NoopHandler()); + } else { + console.error('could not parse document'); + console.error(e); + + throw new Error(message); + } + } + } + + function handleText(text) { + stack.peek().handleText(text); + } + + parser.onopentag = handleOpen; + parser.oncdata = parser.ontext = handleText; + parser.onclosetag = handleClose; + parser.onend = resolveReferences; + + // deferred parse XML to make loading really ascnchronous + // this ensures the execution environment (node or browser) + // is kept responsive and that certain optimization strategies + // can kick in + defer(function() { + var error; + + try { + parser.write(xml).close(); + } catch (e) { + error = e; + } + + done(error, error ? undefined : rootHandler.element, context); + }); +}; + +XMLReader.prototype.handler = function(name) { + return new ElementHandler(this.model, name); +}; + +module.exports = XMLReader; +module.exports.ElementHandler = ElementHandler; +},{"203":203,"204":204,"208":208,"215":215,"325":325,"52":52,"55":55,"56":56,"57":57,"62":62,"65":65}],54:[function(_dereq_,module,exports){ +'use strict'; + +var map = _dereq_(207), + forEach = _dereq_(204), + isString = _dereq_(322), + filter = _dereq_(202), + assign = _dereq_(325); + +var Types = _dereq_(65), + parseNameNs = _dereq_(62).parseName, + common = _dereq_(52), + nameToAlias = common.nameToAlias; + +var XML_PREAMBLE = '\n', + ESCAPE_CHARS = /(<|>|'|"|&|\n\r|\n)/g, + DEFAULT_NS_MAP = common.DEFAULT_NS_MAP, + XSI_TYPE = common.XSI_TYPE; + + +function nsName(ns) { + if (isString(ns)) { + return ns; + } else { + return (ns.prefix ? ns.prefix + ':' : '') + ns.localName; + } +} + +function getElementNs(ns, descriptor) { + if (descriptor.isGeneric) { + return descriptor.name; + } else { + return assign({ localName: nameToAlias(descriptor.ns.localName, descriptor.$pkg) }, ns); + } +} + +function getPropertyNs(ns, descriptor) { + return assign({ localName: descriptor.ns.localName }, ns); +} + +function getSerializableProperties(element) { + var descriptor = element.$descriptor; + + return filter(descriptor.properties, function(p) { + var name = p.name; + + // do not serialize defaults + if (!element.hasOwnProperty(name)) { + return false; + } + + var value = element[name]; + + // do not serialize default equals + if (value === p.default) { + return false; + } + + return p.isMany ? value.length : true; + }); +} + +var ESCAPE_MAP = { + '\n': '10', + '\n\r': '10', + '"': '34', + '\'': '39', + '<': '60', + '>': '62', + '&': '38' +}; + +/** + * Escape a string attribute to not contain any bad values (line breaks, '"', ...) + * + * @param {String} str the string to escape + * @return {String} the escaped string + */ +function escapeAttr(str) { + + // ensure we are handling strings here + str = isString(str) ? str : '' + str; + + return str.replace(ESCAPE_CHARS, function(str) { + return '&#' + ESCAPE_MAP[str] + ';'; + }); +} + +function filterAttributes(props) { + return filter(props, function(p) { return p.isAttr; }); +} + +function filterContained(props) { + return filter(props, function(p) { return !p.isAttr; }); +} + + +function ReferenceSerializer(parent, ns) { + this.ns = ns; +} + +ReferenceSerializer.prototype.build = function(element) { + this.element = element; + return this; +}; + +ReferenceSerializer.prototype.serializeTo = function(writer) { + writer + .appendIndent() + .append('<' + nsName(this.ns) + '>' + this.element.id + '') + .appendNewLine(); +}; + +function BodySerializer() {} + +BodySerializer.prototype.serializeValue = BodySerializer.prototype.serializeTo = function(writer) { + var escape = this.escape; + + if (escape) { + writer.append(''); + } +}; + +BodySerializer.prototype.build = function(prop, value) { + this.value = value; + + if (prop.type === 'String' && ESCAPE_CHARS.test(value)) { + this.escape = true; + } + + return this; +}; + +function ValueSerializer(ns) { + this.ns = ns; +} + +ValueSerializer.prototype = new BodySerializer(); + +ValueSerializer.prototype.serializeTo = function(writer) { + + writer + .appendIndent() + .append('<' + nsName(this.ns) + '>'); + + this.serializeValue(writer); + + writer + .append( '') + .appendNewLine(); +}; + +function ElementSerializer(parent, ns) { + this.body = []; + this.attrs = []; + + this.parent = parent; + this.ns = ns; +} + +ElementSerializer.prototype.build = function(element) { + this.element = element; + + var otherAttrs = this.parseNsAttributes(element); + + if (!this.ns) { + this.ns = this.nsTagName(element.$descriptor); + } + + if (element.$descriptor.isGeneric) { + this.parseGeneric(element); + } else { + var properties = getSerializableProperties(element); + + this.parseAttributes(filterAttributes(properties)); + this.parseContainments(filterContained(properties)); + + this.parseGenericAttributes(element, otherAttrs); + } + + return this; +}; + +ElementSerializer.prototype.nsTagName = function(descriptor) { + var effectiveNs = this.logNamespaceUsed(descriptor.ns); + return getElementNs(effectiveNs, descriptor); +}; + +ElementSerializer.prototype.nsPropertyTagName = function(descriptor) { + var effectiveNs = this.logNamespaceUsed(descriptor.ns); + return getPropertyNs(effectiveNs, descriptor); +}; + +ElementSerializer.prototype.isLocalNs = function(ns) { + return ns.uri === this.ns.uri; +}; + +ElementSerializer.prototype.nsAttributeName = function(element) { + + var ns; + + if (isString(element)) { + ns = parseNameNs(element); + } else + if (element.ns) { + ns = element.ns; + } + + var effectiveNs = this.logNamespaceUsed(ns); + + // strip prefix if same namespace like parent + if (this.isLocalNs(effectiveNs)) { + return { localName: ns.localName }; + } else { + return assign({ localName: ns.localName }, effectiveNs); + } +}; + +ElementSerializer.prototype.parseGeneric = function(element) { + + var self = this, + body = this.body, + attrs = this.attrs; + + forEach(element, function(val, key) { + + if (key === '$body') { + body.push(new BodySerializer().build({ type: 'String' }, val)); + } else + if (key === '$children') { + forEach(val, function(child) { + body.push(new ElementSerializer(self).build(child)); + }); + } else + if (key.indexOf('$') !== 0) { + attrs.push({ name: key, value: escapeAttr(val) }); + } + }); +}; + +/** + * Parse namespaces and return a list of left over generic attributes + * + * @param {Object} element + * @return {Array} + */ +ElementSerializer.prototype.parseNsAttributes = function(element) { + var self = this; + + var genericAttrs = element.$attrs; + + var attributes = []; + + // parse namespace attributes first + // and log them. push non namespace attributes to a list + // and process them later + forEach(genericAttrs, function(value, name) { + var nameNs = parseNameNs(name); + + if (nameNs.prefix === 'xmlns') { + self.logNamespace({ prefix: nameNs.localName, uri: value }); + } else + if (!nameNs.prefix && nameNs.localName === 'xmlns') { + self.logNamespace({ uri: value }); + } else { + attributes.push({ name: name, value: value }); + } + }); + + return attributes; +}; + +ElementSerializer.prototype.parseGenericAttributes = function(element, attributes) { + + var self = this; + + forEach(attributes, function(attr) { + + // do not serialize xsi:type attribute + // it is set manually based on the actual implementation type + if (attr.name === XSI_TYPE) { + return; + } + + try { + self.addAttribute(self.nsAttributeName(attr.name), attr.value); + } catch (e) { + console.warn('[writer] missing namespace information for ', attr.name, '=', attr.value, 'on', element, e); + } + }); +}; + +ElementSerializer.prototype.parseContainments = function(properties) { + + var self = this, + body = this.body, + element = this.element; + + forEach(properties, function(p) { + var value = element.get(p.name), + isReference = p.isReference, + isMany = p.isMany; + + var ns = self.nsPropertyTagName(p); + + if (!isMany) { + value = [ value ]; + } + + if (p.isBody) { + body.push(new BodySerializer().build(p, value[0])); + } else + if (Types.isSimple(p.type)) { + forEach(value, function(v) { + body.push(new ValueSerializer(ns).build(p, v)); + }); + } else + if (isReference) { + forEach(value, function(v) { + body.push(new ReferenceSerializer(self, ns).build(v)); + }); + } else { + // allow serialization via type + // rather than element name + var asType = p.serialize === XSI_TYPE; + + forEach(value, function(v) { + var serializer; + + if (asType) { + serializer = new TypeSerializer(self, ns); + } else { + serializer = new ElementSerializer(self); + } + + body.push(serializer.build(v)); + }); + } + }); +}; + +ElementSerializer.prototype.getNamespaces = function() { + if (!this.parent) { + if (!this.namespaces) { + this.namespaces = { + prefixMap: {}, + uriMap: {}, + used: {} + }; + } + } else { + this.namespaces = this.parent.getNamespaces(); + } + + return this.namespaces; +}; + +ElementSerializer.prototype.logNamespace = function(ns) { + var namespaces = this.getNamespaces(); + + var existing = namespaces.uriMap[ns.uri]; + + if (!existing) { + namespaces.uriMap[ns.uri] = ns; + } + + namespaces.prefixMap[ns.prefix] = ns.uri; + + return ns; +}; + +ElementSerializer.prototype.logNamespaceUsed = function(ns) { + var element = this.element, + model = element.$model, + namespaces = this.getNamespaces(); + + // ns may be + // + // * prefix only + // * prefix:uri + + var prefix = ns.prefix; + var uri = ns.uri || DEFAULT_NS_MAP[prefix] || + namespaces.prefixMap[prefix] || (model ? (model.getPackage(prefix) || {}).uri : null); + + if (!uri) { + throw new Error('no namespace uri given for prefix <' + ns.prefix + '>'); + } + + ns = namespaces.uriMap[uri]; + + if (!ns) { + ns = this.logNamespace({ prefix: prefix, uri: uri }); + } + + if (!namespaces.used[ns.uri]) { + namespaces.used[ns.uri] = ns; + } + + return ns; +}; + +ElementSerializer.prototype.parseAttributes = function(properties) { + var self = this, + element = this.element; + + forEach(properties, function(p) { + self.logNamespaceUsed(p.ns); + + var value = element.get(p.name); + + if (p.isReference) { + value = value.id; + } + + self.addAttribute(self.nsAttributeName(p), value); + }); +}; + +ElementSerializer.prototype.addAttribute = function(name, value) { + var attrs = this.attrs; + + if (isString(value)) { + value = escapeAttr(value); + } + + attrs.push({ name: name, value: value }); +}; + +ElementSerializer.prototype.serializeAttributes = function(writer) { + var attrs = this.attrs, + root = !this.parent, + namespaces = this.namespaces; + + function collectNsAttrs() { + return map(namespaces.used, function(ns) { + var name = 'xmlns' + (ns.prefix ? ':' + ns.prefix : ''); + return { name: name, value: ns.uri }; + }); + } + + if (root) { + attrs = collectNsAttrs().concat(attrs); + } + + forEach(attrs, function(a) { + writer + .append(' ') + .append(nsName(a.name)).append('="').append(a.value).append('"'); + }); +}; + +ElementSerializer.prototype.serializeTo = function(writer) { + var hasBody = this.body.length, + indent = !(this.body.length === 1 && this.body[0] instanceof BodySerializer); + + writer + .appendIndent() + .append('<' + nsName(this.ns)); + + this.serializeAttributes(writer); + + writer.append(hasBody ? '>' : ' />'); + + if (hasBody) { + + if (indent) { + writer + .appendNewLine() + .indent(); + } + + forEach(this.body, function(b) { + b.serializeTo(writer); + }); + + if (indent) { + writer + .unindent() + .appendIndent(); + } + + writer.append(''); + } + + writer.appendNewLine(); +}; + +/** + * A serializer for types that handles serialization of data types + */ +function TypeSerializer(parent, ns) { + ElementSerializer.call(this, parent, ns); +} + +TypeSerializer.prototype = new ElementSerializer(); + +TypeSerializer.prototype.build = function(element) { + var descriptor = element.$descriptor; + + this.element = element; + + this.typeNs = this.nsTagName(descriptor); + + // add xsi:type attribute to represent the elements + // actual type + + var typeNs = this.typeNs, + pkg = element.$model.getPackage(typeNs.uri), + typePrefix = (pkg.xml && pkg.xml.typePrefix) || ''; + + this.addAttribute(this.nsAttributeName(XSI_TYPE), + (typeNs.prefix ? typeNs.prefix + ':' : '') + + typePrefix + descriptor.ns.localName); + + // do the usual stuff + return ElementSerializer.prototype.build.call(this, element); +}; + +TypeSerializer.prototype.isLocalNs = function(ns) { + return ns.uri === this.typeNs.uri; +}; + +function SavingWriter() { + this.value = ''; + + this.write = function(str) { + this.value += str; + }; +} + +function FormatingWriter(out, format) { + + var indent = ['']; + + this.append = function(str) { + out.write(str); + + return this; + }; + + this.appendNewLine = function() { + if (format) { + out.write('\n'); + } + + return this; + }; + + this.appendIndent = function() { + if (format) { + out.write(indent.join(' ')); + } + + return this; + }; + + this.indent = function() { + indent.push(''); + return this; + }; + + this.unindent = function() { + indent.pop(); + return this; + }; +} + +/** + * A writer for meta-model backed document trees + * + * @param {Object} options output options to pass into the writer + */ +function XMLWriter(options) { + + options = assign({ format: false, preamble: true }, options || {}); + + function toXML(tree, writer) { + var internalWriter = writer || new SavingWriter(); + var formatingWriter = new FormatingWriter(internalWriter, options.format); + + if (options.preamble) { + formatingWriter.append(XML_PREAMBLE); + } + + new ElementSerializer().build(tree).serializeTo(formatingWriter); + + if (!writer) { + return internalWriter.value; + } + } + + return { + toXML: toXML + }; +} + +module.exports = XMLWriter; +},{"202":202,"204":204,"207":207,"322":322,"325":325,"52":52,"62":62,"65":65}],55:[function(_dereq_,module,exports){ +(function (Buffer){ +// wrapper for non-node envs +;(function (sax) { + +sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } +sax.SAXParser = SAXParser +sax.SAXStream = SAXStream +sax.createStream = createStream + +// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. +// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), +// since that's the earliest that a buffer overrun could occur. This way, checks are +// as rare as required, but as often as necessary to ensure never crossing this bound. +// Furthermore, buffers are only tested at most once per write(), so passing a very +// large string into write() might have undesirable effects, but this is manageable by +// the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme +// edge case, result in creating at most one complete copy of the string passed in. +// Set to Infinity to have unlimited buffers. +sax.MAX_BUFFER_LENGTH = 64 * 1024 + +var buffers = [ + "comment", "sgmlDecl", "textNode", "tagName", "doctype", + "procInstName", "procInstBody", "entity", "attribName", + "attribValue", "cdata", "script" +] + +sax.EVENTS = // for discoverability. + [ "text" + , "processinginstruction" + , "sgmldeclaration" + , "doctype" + , "comment" + , "attribute" + , "opentag" + , "closetag" + , "opencdata" + , "cdata" + , "closecdata" + , "error" + , "end" + , "ready" + , "script" + , "opennamespace" + , "closenamespace" + ] + +function SAXParser (strict, opt) { + if (!(this instanceof SAXParser)) return new SAXParser(strict, opt) + + var parser = this + clearBuffers(parser) + parser.q = parser.c = "" + parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH + parser.opt = opt || {} + parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags + parser.looseCase = parser.opt.lowercase ? "toLowerCase" : "toUpperCase" + parser.tags = [] + parser.closed = parser.closedRoot = parser.sawRoot = false + parser.tag = parser.error = null + parser.strict = !!strict + parser.noscript = !!(strict || parser.opt.noscript) + parser.state = S.BEGIN + parser.ENTITIES = Object.create(sax.ENTITIES) + parser.attribList = [] + + // namespaces form a prototype chain. + // it always points at the current tag, + // which protos to its parent tag. + if (parser.opt.xmlns) parser.ns = Object.create(rootNS) + + // mostly just for error reporting + parser.trackPosition = parser.opt.position !== false + if (parser.trackPosition) { + parser.position = parser.line = parser.column = 0 + } + emit(parser, "onready") +} + +if (!Object.create) Object.create = function (o) { + function f () { this.__proto__ = o } + f.prototype = o + return new f +} + +if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) { + return o.__proto__ +} + +if (!Object.keys) Object.keys = function (o) { + var a = [] + for (var i in o) if (o.hasOwnProperty(i)) a.push(i) + return a +} + +function checkBufferLength (parser) { + var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) + , maxActual = 0 + for (var i = 0, l = buffers.length; i < l; i ++) { + var len = parser[buffers[i]].length + if (len > maxAllowed) { + // Text/cdata nodes can get big, and since they're buffered, + // we can get here under normal conditions. + // Avoid issues by emitting the text node now, + // so at least it won't get any bigger. + switch (buffers[i]) { + case "textNode": + closeText(parser) + break + + case "cdata": + emitNode(parser, "oncdata", parser.cdata) + parser.cdata = "" + break + + case "script": + emitNode(parser, "onscript", parser.script) + parser.script = "" + break + + default: + error(parser, "Max buffer length exceeded: "+buffers[i]) + } + } + maxActual = Math.max(maxActual, len) + } + // schedule the next check for the earliest possible buffer overrun. + parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual) + + parser.position +} + +function clearBuffers (parser) { + for (var i = 0, l = buffers.length; i < l; i ++) { + parser[buffers[i]] = "" + } +} + +function flushBuffers (parser) { + closeText(parser) + if (parser.cdata !== "") { + emitNode(parser, "oncdata", parser.cdata) + parser.cdata = "" + } + if (parser.script !== "") { + emitNode(parser, "onscript", parser.script) + parser.script = "" + } +} + +SAXParser.prototype = + { end: function () { end(this) } + , write: write + , resume: function () { this.error = null; return this } + , close: function () { return this.write(null) } + , flush: function () { flushBuffers(this) } + } + +try { + var Stream = _dereq_("stream").Stream +} catch (ex) { + var Stream = function () {} +} + + +var streamWraps = sax.EVENTS.filter(function (ev) { + return ev !== "error" && ev !== "end" +}) + +function createStream (strict, opt) { + return new SAXStream(strict, opt) +} + +function SAXStream (strict, opt) { + if (!(this instanceof SAXStream)) return new SAXStream(strict, opt) + + Stream.apply(this) + + this._parser = new SAXParser(strict, opt) + this.writable = true + this.readable = true + + + var me = this + + this._parser.onend = function () { + me.emit("end") + } + + this._parser.onerror = function (er) { + me.emit("error", er) + + // if didn't throw, then means error was handled. + // go ahead and clear error, so we can write again. + me._parser.error = null + } + + this._decoder = null; + + streamWraps.forEach(function (ev) { + Object.defineProperty(me, "on" + ev, { + get: function () { return me._parser["on" + ev] }, + set: function (h) { + if (!h) { + me.removeAllListeners(ev) + return me._parser["on"+ev] = h + } + me.on(ev, h) + }, + enumerable: true, + configurable: false + }) + }) +} + +SAXStream.prototype = Object.create(Stream.prototype, + { constructor: { value: SAXStream } }) + +SAXStream.prototype.write = function (data) { + if (typeof Buffer === 'function' && + typeof Buffer.isBuffer === 'function' && + Buffer.isBuffer(data)) { + if (!this._decoder) { + var SD = _dereq_('string_decoder').StringDecoder + this._decoder = new SD('utf8') + } + data = this._decoder.write(data); + } + + this._parser.write(data.toString()) + this.emit("data", data) + return true +} + +SAXStream.prototype.end = function (chunk) { + if (chunk && chunk.length) this.write(chunk) + this._parser.end() + return true +} + +SAXStream.prototype.on = function (ev, handler) { + var me = this + if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) { + me._parser["on"+ev] = function () { + var args = arguments.length === 1 ? [arguments[0]] + : Array.apply(null, arguments) + args.splice(0, 0, ev) + me.emit.apply(me, args) + } + } + + return Stream.prototype.on.call(me, ev, handler) +} + + + +// character classes and tokens +var whitespace = "\r\n\t " + // this really needs to be replaced with character classes. + // XML allows all manner of ridiculous numbers and digits. + , number = "0124356789" + , letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + // (Letter | "_" | ":") + , quote = "'\"" + , entity = number+letter+"#" + , attribEnd = whitespace + ">" + , CDATA = "[CDATA[" + , DOCTYPE = "DOCTYPE" + , XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace" + , XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/" + , rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } + +// turn all the string character sets into character class objects. +whitespace = charClass(whitespace) +number = charClass(number) +letter = charClass(letter) + +// http://www.w3.org/TR/REC-xml/#NT-NameStartChar +// This implementation works on strings, a single character at a time +// as such, it cannot ever support astral-plane characters (10000-EFFFF) +// without a significant breaking change to either this parser, or the +// JavaScript language. Implementation of an emoji-capable xml parser +// is left as an exercise for the reader. +var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + +var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/ + +quote = charClass(quote) +entity = charClass(entity) +attribEnd = charClass(attribEnd) + +function charClass (str) { + return str.split("").reduce(function (s, c) { + s[c] = true + return s + }, {}) +} + +function isRegExp (c) { + return Object.prototype.toString.call(c) === '[object RegExp]' +} + +function is (charclass, c) { + return isRegExp(charclass) ? !!c.match(charclass) : charclass[c] +} + +function not (charclass, c) { + return !is(charclass, c) +} + +var S = 0 +sax.STATE = +{ BEGIN : S++ +, TEXT : S++ // general stuff +, TEXT_ENTITY : S++ // & and such. +, OPEN_WAKA : S++ // < +, SGML_DECL : S++ // +, SCRIPT : S++ // ' + + }); + }); + +function restoreElement(index, type) { + bootbox.hideAll(); + //Nodes + if (type == 0) { + $("#nodeZone").addClass('drop-target'); + $("#nodeZone").css('cursor', 'crosshair'); + document.getElementById("titleBar").innerHTML = + '
      Click where to append then press okay
      '; + + document.getElementById("appendSpot").style.visibility = 'visible'; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + 250 + 'px, ' + 22 + 'px)'; + document.getElementById("appendSpot").setAttribute("x", 250); + document.getElementById("appendSpot").setAttribute("y", 22); + + $("#nodeZone").on('click', function(event) { + alert(this.attr('taska_id')); + window.tapX = event.pageX; + window.tapY = event.pageY; + var transposeX = Math.round((tapX) / 160) * 160 - 70; + var transposeY = 22; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + transposeX + 'px, ' + transposeY + 'px)'; + document.getElementById("appendSpot").setAttribute("x", transposeX); + }); + $(".nodeDraggable").on('click', function(event) { + alert(this.attr('taska_id')); + window.tapX = event.pageX; + window.tapY = event.pageY; + var transposeX = Math.round((tapX) / 160) * 160 - 70; + var transposeY = 22; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + transposeX + 'px, ' + transposeY + 'px)'; + document.getElementById("appendSpot").setAttribute("x", transposeX); + }); + document.getElementById("appendBtn").addEventListener("click", function() { + $("#nodeZone").removeClass('drop-target'); + $("#nodeZone").css('cursor', 'auto'); + document.getElementById("appendSpot").style.visibility = 'hidden'; + var transposeX = document.getElementById("appendSpot").getAttribute("x"); + var transposeY = document.getElementById("appendSpot").getAttribute("y"); + resetTitleBar(); + storeArray("nodeArr", i, guid(), deletedNodes[index][2], transposeX, + transposeY, deletedNodes[index][5], null, null, deletedNodes[index][10]); + deletedNodes.splice(index, 1); + if (deletedNodes.length + deletedArrows.length + deletedNotes.length == 0) { + document.getElementById("trash").src = "../images/trashCan.gif"; + } + }); + } + + //Arrows + else if (type == 1) { + $("#lines").addClass('drop-target'); + $("#lines").css('cursor', 'crosshair'); + document.getElementById("titleBar").innerHTML = + '
      Click where to append then press okay
      '; + document.getElementById("appendSpot").style.visibility = 'visible'; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + 300 + 'px, ' + 75 + 'px)'; + document.getElementById("appendSpot").setAttribute("x", 300); + document.getElementById("appendSpot").setAttribute("y", 75); + + $("#lines").on('click', function(event) { + window.gridTapX = event.pageX; + window.gridTapY = event.pageY; + var transposeX = Math.round((gridTapX) / 160) * 160 - 20; + var transposeY = Math.floor((gridTapY) / 42) * 42 - 50; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + transposeX + 'px, ' + transposeY + 'px)'; + document.getElementById("appendSpot").setAttribute("x", transposeX); + document.getElementById("appendSpot").setAttribute("y", parseInt( + transposeY) - 1); + }); + + document.getElementById("appendBtn").addEventListener("click", function() { + $("#lines").removeClass('drop-target'); + $("#lines").css('cursor', 'auto'); + document.getElementById("appendSpot").style.visibility = 'hidden'; + var transposeX = document.getElementById("appendSpot").getAttribute("x"); + var transposeY = parseInt(document.getElementById("appendSpot").getAttribute( + "y")) + 27; + resetTitleBar(); + storeArray("arrowArr", i, guid(), deletedArrows[index][2], transposeX, + transposeY, deletedArrows[index][5], deletedArrows[index][10], null); + warning(); + deletedArrows.splice(index, 1); + if (deletedNodes.length + deletedArrows.length + deletedNotes.length == 0) { + document.getElementById("trash").src = "../images/trashCan.gif"; + } + }); + } + + //Notes + else if (type == 2) { + $("#lines").addClass('drop-target'); + $("#lines").css('cursor', 'crosshair'); + document.getElementById("titleBar").innerHTML = + '
      Click where to append then press okay
      '; + document.getElementById("appendSpot").style.visibility = 'visible'; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + 300 + 'px, ' + 75 + 'px)'; + document.getElementById("appendSpot").setAttribute("x", 300); + document.getElementById("appendSpot").setAttribute("y", 75); + $("#lines").on('click', function(event) { + window.gridTapX = event.pageX; + window.gridTapY = event.pageY; + var transposeX = Math.round((gridTapX) / 160) * 160 - 20; + var transposeY = Math.floor((gridTapY) / 42) * 42 - 50; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + transposeX + 'px, ' + transposeY + 'px)'; + document.getElementById("appendSpot").setAttribute("x", transposeX); + document.getElementById("appendSpot").setAttribute("y", parseInt( + transposeY) - 1); + }); + document.getElementById("appendBtn").addEventListener("click", function() { + $("#lines").removeClass('drop-target'); + $("#lines").css('cursor', 'auto'); + document.getElementById("appendSpot").style.visibility = 'hidden'; + var transposeX = document.getElementById("appendSpot").getAttribute("x"); + var transposeY = parseInt(document.getElementById("appendSpot").getAttribute( + "y")) + 38; + resetTitleBar(); + storeArray("noteArr", i, guid(), deletedNotes[index][2], transposeX, + transposeY, deletedNotes[index][5], null, deletedNotes[index][7] - + deletedNotes[index][4]); + deletedNotes.splice(index, 1); + if (deletedNodes.length + deletedArrows.length + deletedNotes.length == 0) { + document.getElementById("trash").src = "../images/trashCan.gif"; + } + }); + } +} + + +/*DROPZONE TEMPLATE +interact('.dropzone').dropzone({ + // Require a 75% element overlap for a drop to be possible + overlap: 0.75, + + // listen for drop related events: + + ondropactivate: function (event) { + // add active dropzone feedback + event.target.classList.add('drop-active'); + }, + ondragenter: function (event) { + var draggableElement = event.relatedTarget, + dropzoneElement = event.target; + + // feedback the possibility of a drop + dropzoneElement.classList.add('drop-target'); + draggableElement.classList.add('can-drop'); + draggableElement.textContent = 'You can drop me anywhere!'; + + + var instruct = document.getElementById("instructions"); + instructions.textContent = ''; + + }, + ondragleave: function (event) { + // remove the drop feedback style + event.target.classList.remove('drop-target'); + event.relatedTarget.classList.remove('can-drop'); + event.relatedTarget.textContent = 'Dragged out'; + }, + ondrop: function (event) { + grabbedNode = event.relatedTarget + grabbedNode.textContent = 'Placed on diagram'; + var innerText = prompt("Please enter what you'd like displayed in this node", "<+->"); + if (innerText != null) { + grabbedNode.textContent = innerText; + } + }, + ondropdeactivate: function (event) { + // remove active dropzone feedback + event.target.classList.remove('drop-active'); + event.target.classList.remove('drop-target'); + } +}); +*/ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/elements_ase.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/elements_ase.js new file mode 100644 index 0000000..1236d75 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/elements_ase.js @@ -0,0 +1,76 @@ +var networkMap = [ + {'displayShortname': 'eNB', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.enodeb'}, + {'displayShortname': 'SIAD', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.siad'}, + {'displayShortname': 'NodeB', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.nb'}, + {'displayShortname': 'eMSC', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.emsc'}, + {'displayShortname': 'RNC', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.rnc'}, + {'displayShortname': 'MGW', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.mgw'}, + {'displayShortname': 'SS7 GPORT', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.ss7_gport'}, + {'displayShortname': 'MSN', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.msn'}, + {'displayShortname': 'E-SMLC', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.e_smlc'}, + {'displayShortname': 'SGSN-S4', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.sgsn_s4'}, + {'displayShortname': 'MME', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.mme'}, + {'displayShortname': 'P_LRF (RDF)', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.p_lrf'}, + {'displayShortname': 'GMLC', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.gmlc'}, + {'displayShortname': 'PCEF', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.pcef'}, + {'displayShortname': 'SDG', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.sdg'}, + {'displayShortname': 'P-GW', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.p_gw'}, + {'displayShortname': 'S-GW', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.s_gw'}, + {'displayShortname': 'PAS', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.pas'}, + {'displayShortname': 'PCRF', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.pcrf'}, + {'displayShortname': 'MIND', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.mind'}, + {'displayShortname': 'APN DNS', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.apn_dns'}, + {'displayShortname': 'DRA EPC', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.dra_epc'}, + {'displayShortname': 'HSS EPC', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.hss_epc'}, + {'displayShortname': 'HLR', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.hlr'}, + {'displayShortname': 'CPM', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.cpm'}, + {'displayShortname': 'P-LRF/RDF', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.p_lrf_sup'}, + {'displayShortname': 'SBC', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.sbc'}, + {'displayShortname': 'ATGW', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.atgw'}, + {'displayShortname': 'IWF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.iwf'}, + {'displayShortname': 'ATCF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.atcf'}, + {'displayShortname': 'P-CSCF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.p_cscf'}, + {'displayShortname': 'Transcoder', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.transcoder'}, + {'displayShortname': 'I-SBC', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.i_sbc'}, + {'displayShortname': 'SCC-AS', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.scc_as'}, + {'displayShortname': 'EATF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.eatf'}, + {'displayShortname': 'TAS', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.tas_cts'}, + {'displayShortname': 'S-CSCF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.s_cscf'}, + {'displayShortname': 'E-CSCF (911)', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.e_cscf'}, + {'displayShortname': 'I-CSCF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.i_cscf'}, + {'displayShortname': 'TF / BGCF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.tf_bgcf'}, + {'displayShortname': 'MGC-8', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.mgc8'}, + {'displayShortname': 'MRF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.mrf'}, + {'displayShortname': 'USP DNS', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.dns'}, + {'displayShortname': 'DRA IMS', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.dra_ims'}, + {'displayShortname': 'ENUM', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.enum'}, + {'displayShortname': 'HSS IMS', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.hss_ims'}, + {'displayShortname': 'CCF', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.ccf'}, + {'displayShortname': 'BGF', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.bgf'}, + {'displayShortname': 'vMS', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.ms'}, + {'displayShortname': 'vNS', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.ns'}, + {'displayShortname': 'vAS', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.as'}, + {'displayShortname': 'vA-SBG', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.a_sbg'}, + {'displayShortname': 'vDBE', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.dbe'}, + {'displayShortname': 'vN-SBG', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.n_sbg'}, + {'displayShortname': 'CCF', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.ccf'}, + {'displayShortname': 'BGF', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.bgf'}, + {'displayShortname': 'vMS', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.ms'}, + {'displayShortname': 'vNS', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.ns'}, + {'displayShortname': 'vAS', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.as'}, + {'displayShortname': 'vA-SBG', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.a_sbg'}, + {'displayShortname': 'vDBE', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.dbe'}, + {'displayShortname': 'vN-SBG', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.n_sbg'}, + {'displayShortname': 'PSX SIP', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.vni.sip_psx'}, + {'displayShortname': 'PSX Policy', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.vni.policy_psx'}, + {'displayShortname': 'IPBE', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.vni.ipbe'}, + {'displayShortname': 'GSX', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.vni.gsx'}, + {'displayShortname': 'BVoIP AS', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.vni.bvoip_as'}, + {'displayShortname': 'NGBE', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.vni.ngbe'}, + {'displayShortname': 'VoLTE UE', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ue'}, + {'displayShortname': '3G UE', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ue'}, + {'displayShortname': 'Trinity UE-A', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.ue'}, + {'displayShortname': 'Trinity UE-B', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.ue'}, + {'displayShortname': 'VNI UE', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.ue'}, + {'displayShortname': 'PSTN', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.ue'} + ]; \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootbox.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootbox.js new file mode 100644 index 0000000..fe5b720 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootbox.js @@ -0,0 +1,986 @@ +/** + * bootbox.js [v4.4.0] + * + * http://bootboxjs.com/license.txt + */ + +// @see https://github.com/makeusabrew/bootbox/issues/180 +// @see https://github.com/makeusabrew/bootbox/issues/186 +(function (root, factory) { + + "use strict"; + if (typeof define === "function" && define.amd) { + // AMD. Register as an anonymous module. + define(["jquery"], factory); + } else if (typeof exports === "object") { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(require("jquery")); + } else { + // Browser globals (root is window) + root.bootbox = factory(root.jQuery); + } + +}(this, function init($, undefined) { + + "use strict"; + + // the base DOM structure needed to create a modal + var templates = { + dialog: + "", + header: + "", + footer: + "", + closeButton: + "", + form: + "
      ", + //CUSTOM + inputs: { + text: + "", + textarea: + "", + email: + "", + select: + "", + checkbox: + "
      ", + date: + "", + time: + "", + number: + "", + password: + "" + } + }; + + var defaults = { + // default language + locale: "en", + // show backdrop or not. Default to static so user has to interact with dialog + backdrop: "static", + // animate the modal in/out + animate: true, + // additional class string applied to the top level dialog + className: null, + // whether or not to include a close button + closeButton: true, + // show the dialog immediately by default + show: true, + // dialog container + container: "body" + }; + + // our public object; augmented after our private API + var exports = {}; + + /** + * @private + */ + function _t(key) { + var locale = locales[defaults.locale]; + return locale ? locale[key] : locales.en[key]; + } + + function processCallback(e, dialog, callback) { + e.stopPropagation(); + e.preventDefault(); + + // by default we assume a callback will get rid of the dialog, + // although it is given the opportunity to override this + + // so, if the callback can be invoked and it *explicitly returns false* + // then we'll set a flag to keep the dialog active... + var preserveDialog = $.isFunction(callback) && callback.call(dialog, e) === false; + + // ... otherwise we'll bin it + if (!preserveDialog) { + dialog.modal("hide"); + } + } + + function getKeyLength(obj) { + // @TODO defer to Object.keys(x).length if available? + var k, t = 0; + for (k in obj) { + t ++; + } + return t; + } + + function each(collection, iterator) { + var index = 0; + $.each(collection, function(key, value) { + iterator(key, value, index++); + }); + } + + function sanitize(options) { + var buttons; + var total; + + if (typeof options !== "object") { + throw new Error("Please supply an object of options"); + } + + if (!options.message) { + throw new Error("Please specify a message"); + } + + // make sure any supplied options take precedence over defaults + options = $.extend({}, defaults, options); + + if (!options.buttons) { + options.buttons = {}; + } + + buttons = options.buttons; + + total = getKeyLength(buttons); + + each(buttons, function(key, button, index) { + + if ($.isFunction(button)) { + // short form, assume value is our callback. Since button + // isn't an object it isn't a reference either so re-assign it + button = buttons[key] = { + callback: button + }; + } + + // before any further checks make sure by now button is the correct type + if ($.type(button) !== "object") { + throw new Error("button with key " + key + " must be an object"); + } + + if (!button.label) { + // the lack of an explicit label means we'll assume the key is good enough + button.label = key; + } + + if (!button.className) { + if (total <= 2 && index === total-1) { + // always add a primary to the main option in a two-button dialog + button.className = "btn-primary"; + } else { + button.className = "btn-default"; + } + } + }); + + return options; + } + + /** + * map a flexible set of arguments into a single returned object + * if args.length is already one just return it, otherwise + * use the properties argument to map the unnamed args to + * object properties + * so in the latter case: + * mapArguments(["foo", $.noop], ["message", "callback"]) + * -> { message: "foo", callback: $.noop } + */ + function mapArguments(args, properties) { + var argn = args.length; + var options = {}; + + if (argn < 1 || argn > 2) { + throw new Error("Invalid argument length"); + } + + if (argn === 2 || typeof args[0] === "string") { + options[properties[0]] = args[0]; + options[properties[1]] = args[1]; + } else { + options = args[0]; + } + + return options; + } + + /** + * merge a set of default dialog options with user supplied arguments + */ + function mergeArguments(defaults, args, properties) { + return $.extend( + // deep merge + true, + // ensure the target is an empty, unreferenced object + {}, + // the base options object for this type of dialog (often just buttons) + defaults, + // args could be an object or array; if it's an array properties will + // map it to a proper options object + mapArguments( + args, + properties + ) + ); + } + + /** + * this entry-level method makes heavy use of composition to take a simple + * range of inputs and return valid options suitable for passing to bootbox.dialog + */ + function mergeDialogOptions(className, labels, properties, args) { + // build up a base set of dialog properties + var baseOptions = { + className: "bootbox-" + className, + buttons: createLabels.apply(null, labels) + }; + + // ensure the buttons properties generated, *after* merging + // with user args are still valid against the supplied labels + return validateButtons( + // merge the generated base properties with user supplied arguments + mergeArguments( + baseOptions, + args, + // if args.length > 1, properties specify how each arg maps to an object key + properties + ), + labels + ); + } + + /** + * from a given list of arguments return a suitable object of button labels + * all this does is normalise the given labels and translate them where possible + * e.g. "ok", "confirm" -> { ok: "OK, cancel: "Annuleren" } + */ + function createLabels() { + var buttons = {}; + + for (var i = 0, j = arguments.length; i < j; i++) { + var argument = arguments[i]; + var key = argument.toLowerCase(); + var value = argument.toUpperCase(); + + buttons[key] = { + label: _t(value) + }; + } + + return buttons; + } + + function validateButtons(options, buttons) { + var allowedButtons = {}; + each(buttons, function(key, value) { + allowedButtons[value] = true; + }); + + each(options.buttons, function(key) { + if (allowedButtons[key] === undefined) { + throw new Error("button key " + key + " is not allowed (options are " + buttons.join("\n") + ")"); + } + }); + + return options; + } + + exports.alert = function() { + var options; + + options = mergeDialogOptions("alert", ["ok"], ["message", "callback"], arguments); + + if (options.callback && !$.isFunction(options.callback)) { + throw new Error("alert requires callback property to be a function when provided"); + } + + /** + * overrides + */ + options.buttons.ok.callback = options.onEscape = function() { + if ($.isFunction(options.callback)) { + return options.callback.call(this); + } + return true; + }; + + return exports.dialog(options); + }; + + exports.confirm = function() { + var options; + + options = mergeDialogOptions("confirm", ["cancel", "confirm"], ["message", "callback"], arguments); + + /** + * overrides; undo anything the user tried to set they shouldn't have + */ + options.buttons.cancel.callback = options.onEscape = function() { + return options.callback.call(this, false); + }; + + options.buttons.confirm.callback = function() { + return options.callback.call(this, true); + }; + + // confirm specific validation + if (!$.isFunction(options.callback)) { + throw new Error("confirm requires a callback"); + } + + return exports.dialog(options); + }; + + exports.prompt = function() { + var options; + var defaults; + var dialog; + var form; + var input; + var shouldShow; + var inputOptions; + + // we have to create our form first otherwise + // its value is undefined when gearing up our options + // @TODO this could be solved by allowing message to + // be a function instead... + form = $(templates.form); + + // prompt defaults are more complex than others in that + // users can override more defaults + // @TODO I don't like that prompt has to do a lot of heavy + // lifting which mergeDialogOptions can *almost* support already + // just because of 'value' and 'inputType' - can we refactor? + defaults = { + className: "bootbox-prompt", + buttons: createLabels("cancel", "confirm"), + value: "", + inputType: "text" + }; + + options = validateButtons( + mergeArguments(defaults, arguments, ["title", "callback"]), + ["cancel", "confirm"] + ); + + // capture the user's show value; we always set this to false before + // spawning the dialog to give us a chance to attach some handlers to + // it, but we need to make sure we respect a preference not to show it + shouldShow = (options.show === undefined) ? true : options.show; + + /** + * overrides; undo anything the user tried to set they shouldn't have + */ + options.message = form; + + options.buttons.cancel.callback = options.onEscape = function() { + return options.callback.call(this, null); + }; + + options.buttons.confirm.callback = function() { + var value; + + switch (options.inputType) { + case "text": + case "textarea": + case "email": + case "select": + case "date": + case "time": + case "number": + case "password": + value = input.val(); + break; + + case "checkbox": + var checkedItems = input.find("input:checked"); + + // we assume that checkboxes are always multiple, + // hence we default to an empty array + value = []; + + each(checkedItems, function(_, item) { + value.push($(item).val()); + }); + break; + } + + return options.callback.call(this, value); + }; + + options.show = false; + + // prompt specific validation + if (!options.title) { + throw new Error("prompt requires a title"); + } + + if (!$.isFunction(options.callback)) { + throw new Error("prompt requires a callback"); + } + + if (!templates.inputs[options.inputType]) { + throw new Error("invalid prompt type"); + } + + // create the input based on the supplied type + input = $(templates.inputs[options.inputType]); + + switch (options.inputType) { + case "text": + case "textarea": + case "email": + case "date": + case "time": + case "number": + case "password": + input.val(options.value); + break; + + case "select": + var groups = {}; + inputOptions = options.inputOptions || []; + + if (!$.isArray(inputOptions)) { + throw new Error("Please pass an array of input options"); + } + + if (!inputOptions.length) { + throw new Error("prompt with select requires options"); + } + + each(inputOptions, function(_, option) { + + // assume the element to attach to is the input... + var elem = input; + + if (option.value === undefined || option.text === undefined) { + throw new Error("given options in wrong format"); + } + + // ... but override that element if this option sits in a group + + if (option.group) { + // initialise group if necessary + if (!groups[option.group]) { + groups[option.group] = $("").attr("label", option.group); + } + + elem = groups[option.group]; + } + + elem.append(""); + }); + + each(groups, function(_, group) { + input.append(group); + }); + + // safe to set a select's value as per a normal input + input.val(options.value); + break; + + case "checkbox": + var values = $.isArray(options.value) ? options.value : [options.value]; + inputOptions = options.inputOptions || []; + + if (!inputOptions.length) { + throw new Error("prompt with checkbox requires options"); + } + + if (!inputOptions[0].value || !inputOptions[0].text) { + throw new Error("given options in wrong format"); + } + + // checkboxes have to nest within a containing element, so + // they break the rules a bit and we end up re-assigning + // our 'input' element to this container instead + input = $("
      "); + + each(inputOptions, function(_, option) { + var checkbox = $(templates.inputs[options.inputType]); + + checkbox.find("input").attr("value", option.value); + checkbox.find("label").append(option.text); + + // we've ensured values is an array so we can always iterate over it + each(values, function(_, value) { + if (value === option.value) { + checkbox.find("input").prop("checked", true); + } + }); + + input.append(checkbox); + }); + break; + } + + // @TODO provide an attributes option instead + // and simply map that as keys: vals + if (options.placeholder) { + input.attr("placeholder", options.placeholder); + } + + if (options.pattern) { + input.attr("pattern", options.pattern); + } + + if (options.maxlength) { + input.attr("maxlength", options.maxlength); + } + + // now place it in our form + form.append(input); + + form.on("submit", function(e) { + e.preventDefault(); + // Fix for SammyJS (or similar JS routing library) hijacking the form post. + e.stopPropagation(); + // @TODO can we actually click *the* button object instead? + // e.g. buttons.confirm.click() or similar + dialog.find(".btn-primary").click(); + }); + + dialog = exports.dialog(options); + + // clear the existing handler focusing the submit button... + dialog.off("shown.bs.modal"); + + // ...and replace it with one focusing our input, if possible + dialog.on("shown.bs.modal", function() { + // need the closure here since input isn't + // an object otherwise + input.focus(); + }); + + if (shouldShow === true) { + dialog.modal("show"); + } + + return dialog; + }; + + exports.dialog = function(options) { + options = sanitize(options); + + var dialog = $(templates.dialog); + var innerDialog = dialog.find(".modal-dialog"); + var body = dialog.find(".modal-body"); + var buttons = options.buttons; + var buttonStr = ""; + var callbacks = { + onEscape: options.onEscape + }; + + if ($.fn.modal === undefined) { + throw new Error( + "$.fn.modal is not defined; please double check you have included " + + "the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ " + + "for more details." + ); + } + + each(buttons, function(key, button) { + + // @TODO I don't like this string appending to itself; bit dirty. Needs reworking + // can we just build up button elements instead? slower but neater. Then button + // can just become a template too + buttonStr += ""; + callbacks[key] = button.callback; + }); + + body.find(".bootbox-body").html(options.message); + + if (options.animate === true) { + dialog.addClass("fade"); + } + + if (options.className) { + dialog.addClass(options.className); + } + + if (options.size === "large") { + innerDialog.addClass("modal-lg"); + } else if (options.size === "small") { + innerDialog.addClass("modal-sm"); + } + + if (options.title) { + body.before(templates.header); + } + + if (options.closeButton) { + var closeButton = $(templates.closeButton); + + if (options.title) { + dialog.find(".modal-header").prepend(closeButton); + } else { + closeButton.css("margin-top", "-10px").prependTo(body); + } + } + + if (options.title) { + dialog.find(".modal-title").html(options.title); + } + + if (buttonStr.length) { + body.after(templates.footer); + dialog.find(".modal-footer").html(buttonStr); + } + + + /** + * Bootstrap event listeners; used handle extra + * setup & teardown required after the underlying + * modal has performed certain actions + */ + + dialog.on("hidden.bs.modal", function(e) { + // ensure we don't accidentally intercept hidden events triggered + // by children of the current dialog. We shouldn't anymore now BS + // namespaces its events; but still worth doing + if (e.target === this) { + dialog.remove(); + } + }); + + /* + dialog.on("show.bs.modal", function() { + // sadly this doesn't work; show is called *just* before + // the backdrop is added so we'd need a setTimeout hack or + // otherwise... leaving in as would be nice + if (options.backdrop) { + dialog.next(".modal-backdrop").addClass("bootbox-backdrop"); + } + }); + */ + + dialog.on("shown.bs.modal", function() { + dialog.find(".btn-primary:first").focus(); + }); + + /** + * Bootbox event listeners; experimental and may not last + * just an attempt to decouple some behaviours from their + * respective triggers + */ + + if (options.backdrop !== "static") { + // A boolean true/false according to the Bootstrap docs + // should show a dialog the user can dismiss by clicking on + // the background. + // We always only ever pass static/false to the actual + // $.modal function because with `true` we can't trap + // this event (the .modal-backdrop swallows it) + // However, we still want to sort of respect true + // and invoke the escape mechanism instead + dialog.on("click.dismiss.bs.modal", function(e) { + // @NOTE: the target varies in >= 3.3.x releases since the modal backdrop + // moved *inside* the outer dialog rather than *alongside* it + if (dialog.children(".modal-backdrop").length) { + e.currentTarget = dialog.children(".modal-backdrop").get(0); + } + + if (e.target !== e.currentTarget) { + return; + } + + dialog.trigger("escape.close.bb"); + }); + } + + dialog.on("escape.close.bb", function(e) { + if (callbacks.onEscape) { + processCallback(e, dialog, callbacks.onEscape); + } + }); + + /** + * Standard jQuery event listeners; used to handle user + * interaction with our dialog + */ + + dialog.on("click", ".modal-footer button", function(e) { + var callbackKey = $(this).data("bb-handler"); + + processCallback(e, dialog, callbacks[callbackKey]); + }); + + dialog.on("click", ".bootbox-close-button", function(e) { + // onEscape might be falsy but that's fine; the fact is + // if the user has managed to click the close button we + // have to close the dialog, callback or not + processCallback(e, dialog, callbacks.onEscape); + }); + + dialog.on("keyup", function(e) { + if (e.which === 27) { + dialog.trigger("escape.close.bb"); + } + }); + + // the remainder of this method simply deals with adding our + // dialogent to the DOM, augmenting it with Bootstrap's modal + // functionality and then giving the resulting object back + // to our caller + + $(options.container).append(dialog); + + dialog.modal({ + backdrop: options.backdrop ? "static": false, + keyboard: false, + show: false + }); + + if (options.show) { + dialog.modal("show"); + } + + // @TODO should we return the raw element here or should + // we wrap it in an object on which we can expose some neater + // methods, e.g. var d = bootbox.alert(); d.hide(); instead + // of d.modal("hide"); + + /* + function BBDialog(elem) { + this.elem = elem; + } + + BBDialog.prototype = { + hide: function() { + return this.elem.modal("hide"); + }, + show: function() { + return this.elem.modal("show"); + } + }; + */ + + return dialog; + + }; + + exports.setDefaults = function() { + var values = {}; + + if (arguments.length === 2) { + // allow passing of single key/value... + values[arguments[0]] = arguments[1]; + } else { + // ... and as an object too + values = arguments[0]; + } + + $.extend(defaults, values); + }; + + exports.hideAll = function() { + $(".bootbox").modal("hide"); + + return exports; + }; + + + /** + * standard locales. Please add more according to ISO 639-1 standard. Multiple language variants are + * unlikely to be required. If this gets too large it can be split out into separate JS files. + */ + var locales = { + bg_BG : { + OK : "Ок", + CANCEL : "Отказ", + CONFIRM : "Потвърждавам" + }, + br : { + OK : "OK", + CANCEL : "Cancelar", + CONFIRM : "Sim" + }, + cs : { + OK : "OK", + CANCEL : "Zrušit", + CONFIRM : "Potvrdit" + }, + da : { + OK : "OK", + CANCEL : "Annuller", + CONFIRM : "Accepter" + }, + de : { + OK : "OK", + CANCEL : "Abbrechen", + CONFIRM : "Akzeptieren" + }, + el : { + OK : "Εντάξει", + CANCEL : "Ακύρωση", + CONFIRM : "Επιβεβαίωση" + }, + en : { + OK : "OK", + CANCEL : "Cancel", + CONFIRM : "OK" + }, + es : { + OK : "OK", + CANCEL : "Cancelar", + CONFIRM : "Aceptar" + }, + et : { + OK : "OK", + CANCEL : "Katkesta", + CONFIRM : "OK" + }, + fa : { + OK : "قبول", + CANCEL : "لغو", + CONFIRM : "تایید" + }, + fi : { + OK : "OK", + CANCEL : "Peruuta", + CONFIRM : "OK" + }, + fr : { + OK : "OK", + CANCEL : "Annuler", + CONFIRM : "D'accord" + }, + he : { + OK : "אישור", + CANCEL : "ביטול", + CONFIRM : "אישור" + }, + hu : { + OK : "OK", + CANCEL : "Mégsem", + CONFIRM : "Megerősít" + }, + hr : { + OK : "OK", + CANCEL : "Odustani", + CONFIRM : "Potvrdi" + }, + id : { + OK : "OK", + CANCEL : "Batal", + CONFIRM : "OK" + }, + it : { + OK : "OK", + CANCEL : "Annulla", + CONFIRM : "Conferma" + }, + ja : { + OK : "OK", + CANCEL : "キャンセル", + CONFIRM : "確認" + }, + lt : { + OK : "Gerai", + CANCEL : "Atšaukti", + CONFIRM : "Patvirtinti" + }, + lv : { + OK : "Labi", + CANCEL : "Atcelt", + CONFIRM : "Apstiprināt" + }, + nl : { + OK : "OK", + CANCEL : "Annuleren", + CONFIRM : "Accepteren" + }, + no : { + OK : "OK", + CANCEL : "Avbryt", + CONFIRM : "OK" + }, + pl : { + OK : "OK", + CANCEL : "Anuluj", + CONFIRM : "Potwierdź" + }, + pt : { + OK : "OK", + CANCEL : "Cancelar", + CONFIRM : "Confirmar" + }, + ru : { + OK : "OK", + CANCEL : "Отмена", + CONFIRM : "Применить" + }, + sq : { + OK : "OK", + CANCEL : "Anulo", + CONFIRM : "Prano" + }, + sv : { + OK : "OK", + CANCEL : "Avbryt", + CONFIRM : "OK" + }, + th : { + OK : "ตกลง", + CANCEL : "ยกเลิก", + CONFIRM : "ยืนยัน" + }, + tr : { + OK : "Tamam", + CANCEL : "İptal", + CONFIRM : "Onayla" + }, + zh_CN : { + OK : "OK", + CANCEL : "取消", + CONFIRM : "确认" + }, + zh_TW : { + OK : "OK", + CANCEL : "取消", + CONFIRM : "確認" + } + }; + + exports.addLocale = function(name, values) { + $.each(["OK", "CANCEL", "CONFIRM"], function(_, v) { + if (!values[v]) { + throw new Error("Please supply a translation for '" + v + "'"); + } + }); + + locales[name] = { + OK: values.OK, + CANCEL: values.CANCEL, + CONFIRM: values.CONFIRM + }; + + return exports; + }; + + exports.removeLocale = function(name) { + delete locales[name]; + + return exports; + }; + + exports.setLocale = function(name) { + return exports.setDefaults("locale", name); + }; + + exports.init = function(_$) { + return init(_$ || $); + }; + + return exports; +})); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootstrap.min.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootstrap.min.js new file mode 100644 index 0000000..133aeec --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
      ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/contextMenu.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/contextMenu.js new file mode 100644 index 0000000..0bb048b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/contextMenu.js @@ -0,0 +1,1692 @@ +/*! + * jQuery contextMenu - Plugin for simple contextMenu handling + * + * Version: git-master + * + * Authors: Rodney Rehm, Addy Osmani (patches for FF) + * Web: http://medialize.github.com/jQuery-contextMenu/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * GPL v3 http://opensource.org/licenses/GPL-3.0 + * + */ + +(function($, undefined){ + + // TODO: - + // ARIA stuff: menuitem, menuitemcheckbox und menuitemradio + // create structure if $.support[htmlCommand || htmlMenuitem] and !opt.disableNative + +// determine html5 compatibility +$.support.htmlMenuitem = ('HTMLMenuItemElement' in window); +$.support.htmlCommand = ('HTMLCommandElement' in window); +$.support.eventSelectstart = ("onselectstart" in document.documentElement); +/* // should the need arise, test for css user-select +$.support.cssUserSelect = (function(){ + var t = false, + e = document.createElement('div'); + + $.each('Moz|Webkit|Khtml|O|ms|Icab|'.split('|'), function(i, prefix) { + var propCC = prefix + (prefix ? 'U' : 'u') + 'serSelect', + prop = (prefix ? ('-' + prefix.toLowerCase() + '-') : '') + 'user-select'; + + e.style.cssText = prop + ': text;'; + if (e.style[propCC] == 'text') { + t = true; + return false; + } + + return true; + }); + + return t; +})(); +*/ + +if (!$.ui || !$.ui.widget) { + // duck punch $.cleanData like jQueryUI does to get that remove event + // https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.widget.js#L16-24 + var _cleanData = $.cleanData; + $.cleanData = function( elems ) { + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + try { + $( elem ).triggerHandler( "remove" ); + // http://bugs.jquery.com/ticket/8235 + } catch( e ) {} + } + _cleanData( elems ); + }; +} + +var // currently active contextMenu trigger + $currentTrigger = null, + // is contextMenu initialized with at least one menu? + initialized = false, + // window handle + $win = $(window), + // number of registered menus + counter = 0, + // mapping selector to namespace + namespaces = {}, + // mapping namespace to options + menus = {}, + // custom command type handlers + types = {}, + // default values + defaults = { + // selector of contextMenu trigger + selector: null, + // where to append the menu to + appendTo: null, + // method to trigger context menu ["right", "left", "hover"] + trigger: "right", + // hide menu when mouse leaves trigger / menu elements + autoHide: false, + // ms to wait before showing a hover-triggered context menu + delay: 200, + // flag denoting if a second trigger should simply move (true) or rebuild (false) an open menu + // as long as the trigger happened on one of the trigger-element's child nodes + reposition: true, + // determine position to show menu at + determinePosition: function($menu) { + // position to the lower middle of the trigger element + if ($.ui && $.ui.position) { + // .position() is provided as a jQuery UI utility + // (...and it won't work on hidden elements) + $menu.css('display', 'block').position({ + my: "center top", + at: "center bottom", + of: this, + offset: "0 5", + collision: "fit" + }).css('display', 'none'); + } else { + // determine contextMenu position + var offset = this.offset(); + offset.top += this.outerHeight(); + offset.left += this.outerWidth() / 2 - $menu.outerWidth() / 2; + $menu.css(offset); + } + }, + // position menu + position: function(opt, x, y) { + var $this = this, + offset; + // determine contextMenu position + if (!x && !y) { + opt.determinePosition.call(this, opt.$menu); + return; + } else if (x === "maintain" && y === "maintain") { + // x and y must not be changed (after re-show on command click) + offset = opt.$menu.position(); + } else { + // x and y are given (by mouse event) + offset = {top: y, left: x}; + } + + // correct offset if viewport demands it + var bottom = $win.scrollTop() + $win.height(), + right = $win.scrollLeft() + $win.width(), + height = opt.$menu.height(), + width = opt.$menu.width(); + + if (offset.top + height > bottom) { + offset.top -= height; + } + + if (offset.top<0) { + offset.top = 0; + } + + if (offset.left + width > right) { + offset.left -= width; + } + + opt.$menu.css(offset); + }, + // position the sub-menu + positionSubmenu: function($menu) { + if ($.ui && $.ui.position) { + // .position() is provided as a jQuery UI utility + // (...and it won't work on hidden elements) + $menu.css('display', 'block').position({ + my: "left top", + at: "right top", + of: this, + collision: "flipfit fit" + }).css('display', ''); + } else { + // determine contextMenu position + var offset = { + top: 0, + left: this.outerWidth() + }; + $menu.css(offset); + } + }, + // offset to add to zIndex + zIndex: 1, + // show hide animation settings + animation: { + duration: 50, + show: 'slideDown', + hide: 'slideUp' + }, + // events + events: { + show: $.noop, + hide: $.noop + }, + // default callback + callback: null, + // list of contextMenu items + items: {} + }, + // mouse position for hover activation + hoveract = { + timer: null, + pageX: null, + pageY: null + }, + // determine zIndex + zindex = function($t) { + var zin = 0, + $tt = $t; + + while (true) { + zin = Math.max(zin, parseInt($tt.css('z-index'), 10) || 0); + $tt = $tt.parent(); + if (!$tt || !$tt.length || "html body".indexOf($tt.prop('nodeName').toLowerCase()) > -1 ) { + break; + } + } + + return zin; + }, + // event handlers + handle = { + // abort anything + abortevent: function(e){ + e.preventDefault(); + e.stopImmediatePropagation(); + }, + + // contextmenu show dispatcher + contextmenu: function(e) { + var $this = $(this); + + // disable actual context-menu if we are using the right mouse button as the trigger + if (e.data.trigger == 'right') { + e.preventDefault(); + e.stopImmediatePropagation(); + } + + // abort native-triggered events unless we're triggering on right click + if (e.data.trigger != 'right' && e.originalEvent) { + return; + } + + // abort event if menu is visible for this trigger + if ($this.hasClass('context-menu-active')) { + return; + } + + if (!$this.hasClass('context-menu-disabled')) { + // theoretically need to fire a show event at + // http://www.whatwg.org/specs/web-apps/current-work/multipage/interactive-elements.html#context-menus + // var evt = jQuery.Event("show", { data: data, pageX: e.pageX, pageY: e.pageY, relatedTarget: this }); + // e.data.$menu.trigger(evt); + + $currentTrigger = $this; + if (e.data.build) { + var built = e.data.build($currentTrigger, e); + // abort if build() returned false + if (built === false) { + return; + } + + // dynamically build menu on invocation + e.data = $.extend(true, {}, defaults, e.data, built || {}); + + // abort if there are no items to display + if (!e.data.items || $.isEmptyObject(e.data.items)) { + // Note: jQuery captures and ignores errors from event handlers + if (window.console) { + (console.error || console.log).call(console, "No items specified to show in contextMenu"); + } + + throw new Error('No Items specified'); + } + + // backreference for custom command type creation + e.data.$trigger = $currentTrigger; + + op.create(e.data); + } + // show menu + op.show.call($this, e.data, e.pageX, e.pageY); + } + }, + // contextMenu left-click trigger + click: function(e) { + e.preventDefault(); + e.stopImmediatePropagation(); + $(this).trigger($.Event("contextmenu", { data: e.data, pageX: e.pageX, pageY: e.pageY })); + }, + // contextMenu right-click trigger + mousedown: function(e) { + // register mouse down + var $this = $(this); + + // hide any previous menus + if ($currentTrigger && $currentTrigger.length && !$currentTrigger.is($this)) { + $currentTrigger.data('contextMenu').$menu.trigger('contextmenu:hide'); + } + + // activate on right click + if (e.button == 2) { + $currentTrigger = $this.data('contextMenuActive', true); + } + }, + // contextMenu right-click trigger + mouseup: function(e) { + // show menu + var $this = $(this); + if ($this.data('contextMenuActive') && $currentTrigger && $currentTrigger.length && $currentTrigger.is($this) && !$this.hasClass('context-menu-disabled')) { + e.preventDefault(); + e.stopImmediatePropagation(); + $currentTrigger = $this; + $this.trigger($.Event("contextmenu", { data: e.data, pageX: e.pageX, pageY: e.pageY })); + } + + $this.removeData('contextMenuActive'); + }, + // contextMenu hover trigger + mouseenter: function(e) { + var $this = $(this), + $related = $(e.relatedTarget), + $document = $(document); + + // abort if we're coming from a menu + if ($related.is('.context-menu-list') || $related.closest('.context-menu-list').length) { + return; + } + + // abort if a menu is shown + if ($currentTrigger && $currentTrigger.length) { + return; + } + + hoveract.pageX = e.pageX; + hoveract.pageY = e.pageY; + hoveract.data = e.data; + $document.on('mousemove.contextMenuShow', handle.mousemove); + hoveract.timer = setTimeout(function() { + hoveract.timer = null; + $document.off('mousemove.contextMenuShow'); + $currentTrigger = $this; + $this.trigger($.Event("contextmenu", { data: hoveract.data, pageX: hoveract.pageX, pageY: hoveract.pageY })); + }, e.data.delay ); + }, + // contextMenu hover trigger + mousemove: function(e) { + hoveract.pageX = e.pageX; + hoveract.pageY = e.pageY; + }, + // contextMenu hover trigger + mouseleave: function(e) { + // abort if we're leaving for a menu + var $related = $(e.relatedTarget); + if ($related.is('.context-menu-list') || $related.closest('.context-menu-list').length) { + return; + } + + try { + clearTimeout(hoveract.timer); + } catch(e) {} + + hoveract.timer = null; + }, + + // click on layer to hide contextMenu + layerClick: function(e) { + var $this = $(this), + root = $this.data('contextMenuRoot'), + button = e.button, + x = e.pageX, + y = e.pageY, + target, + offset; + + e.preventDefault(); + e.stopImmediatePropagation(); + + setTimeout(function() { + var $window; + var triggerAction = ((root.trigger == 'left' && button === 0) || (root.trigger == 'right' && button === 2)); + + // find the element that would've been clicked, wasn't the layer in the way + if (document.elementFromPoint) { + root.$layer.hide(); + target = document.elementFromPoint(x - $win.scrollLeft(), y - $win.scrollTop()); + root.$layer.show(); + } + + if (root.reposition && triggerAction) { + if (document.elementFromPoint) { + if (root.$trigger.is(target) || root.$trigger.has(target).length) { + root.position.call(root.$trigger, root, x, y); + return; + } + } else { + offset = root.$trigger.offset(); + $window = $(window); + // while this looks kinda awful, it's the best way to avoid + // unnecessarily calculating any positions + offset.top += $window.scrollTop(); + if (offset.top <= e.pageY) { + offset.left += $window.scrollLeft(); + if (offset.left <= e.pageX) { + offset.bottom = offset.top + root.$trigger.outerHeight(); + if (offset.bottom >= e.pageY) { + offset.right = offset.left + root.$trigger.outerWidth(); + if (offset.right >= e.pageX) { + // reposition + root.position.call(root.$trigger, root, x, y); + return; + } + } + } + } + } + } + + if (target && triggerAction) { + root.$trigger.one('contextmenu:hidden', function() { + $(target).contextMenu({x: x, y: y}); + }); + } + + root.$menu.trigger('contextmenu:hide'); + }, 50); + }, + // key handled :hover + keyStop: function(e, opt) { + if (!opt.isInput) { + e.preventDefault(); + } + + e.stopPropagation(); + }, + key: function(e) { + + var opt = {}; + + // Only get the data from $currentTrigger if it exists + if ($currentTrigger) { + opt = $currentTrigger.data('contextMenu') || {}; + } + + switch (e.keyCode) { + case 9: + case 38: // up + handle.keyStop(e, opt); + // if keyCode is [38 (up)] or [9 (tab) with shift] + if (opt.isInput) { + if (e.keyCode == 9 && e.shiftKey) { + e.preventDefault(); + opt.$selected && opt.$selected.find('input, textarea, select').blur(); + opt.$menu.trigger('prevcommand'); + return; + } else if (e.keyCode == 38 && opt.$selected.find('input, textarea, select').prop('type') == 'checkbox') { + // checkboxes don't capture this key + e.preventDefault(); + return; + } + } else if (e.keyCode != 9 || e.shiftKey) { + opt.$menu.trigger('prevcommand'); + return; + } + // omitting break; + + // case 9: // tab - reached through omitted break; + case 40: // down + handle.keyStop(e, opt); + if (opt.isInput) { + if (e.keyCode == 9) { + e.preventDefault(); + opt.$selected && opt.$selected.find('input, textarea, select').blur(); + opt.$menu.trigger('nextcommand'); + return; + } else if (e.keyCode == 40 && opt.$selected.find('input, textarea, select').prop('type') == 'checkbox') { + // checkboxes don't capture this key + e.preventDefault(); + return; + } + } else { + opt.$menu.trigger('nextcommand'); + return; + } + break; + + case 37: // left + handle.keyStop(e, opt); + if (opt.isInput || !opt.$selected || !opt.$selected.length) { + break; + } + + if (!opt.$selected.parent().hasClass('context-menu-root')) { + var $parent = opt.$selected.parent().parent(); + opt.$selected.trigger('contextmenu:blur'); + opt.$selected = $parent; + return; + } + break; + + case 39: // right + handle.keyStop(e, opt); + if (opt.isInput || !opt.$selected || !opt.$selected.length) { + break; + } + + var itemdata = opt.$selected.data('contextMenu') || {}; + if (itemdata.$menu && opt.$selected.hasClass('context-menu-submenu')) { + opt.$selected = null; + itemdata.$selected = null; + itemdata.$menu.trigger('nextcommand'); + return; + } + break; + + case 35: // end + case 36: // home + if (opt.$selected && opt.$selected.find('input, textarea, select').length) { + return; + } else { + (opt.$selected && opt.$selected.parent() || opt.$menu) + .children(':not(.disabled, .not-selectable)')[e.keyCode == 36 ? 'first' : 'last']() + .trigger('contextmenu:focus'); + e.preventDefault(); + return; + } + break; + + case 13: // enter + handle.keyStop(e, opt); + if (opt.isInput) { + if (opt.$selected && !opt.$selected.is('textarea, select')) { + e.preventDefault(); + return; + } + break; + } + opt.$selected && opt.$selected.trigger('mouseup'); + return; + + case 32: // space + case 33: // page up + case 34: // page down + // prevent browser from scrolling down while menu is visible + handle.keyStop(e, opt); + return; + + case 27: // esc + handle.keyStop(e, opt); + opt.$menu.trigger('contextmenu:hide'); + return; + + default: // 0-9, a-z + var k = (String.fromCharCode(e.keyCode)).toUpperCase(); + if (opt.accesskeys && opt.accesskeys[k]) { + // according to the specs accesskeys must be invoked immediately + opt.accesskeys[k].$node.trigger(opt.accesskeys[k].$menu + ? 'contextmenu:focus' + : 'mouseup' + ); + return; + } + break; + } + // pass event to selected item, + // stop propagation to avoid endless recursion + e.stopPropagation(); + opt.$selected && opt.$selected.trigger(e); + }, + + // select previous possible command in menu + prevItem: function(e) { + e.stopPropagation(); + var opt = $(this).data('contextMenu') || {}; + + // obtain currently selected menu + if (opt.$selected) { + var $s = opt.$selected; + opt = opt.$selected.parent().data('contextMenu') || {}; + opt.$selected = $s; + } + + var $children = opt.$menu.children(), + $prev = !opt.$selected || !opt.$selected.prev().length ? $children.last() : opt.$selected.prev(), + $round = $prev; + + // skip disabled + while ($prev.hasClass('disabled') || $prev.hasClass('not-selectable')) { + if ($prev.prev().length) { + $prev = $prev.prev(); + } else { + $prev = $children.last(); + } + if ($prev.is($round)) { + // break endless loop + return; + } + } + + // leave current + if (opt.$selected) { + handle.itemMouseleave.call(opt.$selected.get(0), e); + } + + // activate next + handle.itemMouseenter.call($prev.get(0), e); + + // focus input + var $input = $prev.find('input, textarea, select'); + if ($input.length) { + $input.focus(); + } + }, + // select next possible command in menu + nextItem: function(e) { + e.stopPropagation(); + var opt = $(this).data('contextMenu') || {}; + + // obtain currently selected menu + if (opt.$selected) { + var $s = opt.$selected; + opt = opt.$selected.parent().data('contextMenu') || {}; + opt.$selected = $s; + } + + var $children = opt.$menu.children(), + $next = !opt.$selected || !opt.$selected.next().length ? $children.first() : opt.$selected.next(), + $round = $next; + + // skip disabled + while ($next.hasClass('disabled') || $next.hasClass('not-selectable')) { + if ($next.next().length) { + $next = $next.next(); + } else { + $next = $children.first(); + } + if ($next.is($round)) { + // break endless loop + return; + } + } + + // leave current + if (opt.$selected) { + handle.itemMouseleave.call(opt.$selected.get(0), e); + } + + // activate next + handle.itemMouseenter.call($next.get(0), e); + + // focus input + var $input = $next.find('input, textarea, select'); + if ($input.length) { + $input.focus(); + } + }, + + // flag that we're inside an input so the key handler can act accordingly + focusInput: function(e) { + var $this = $(this).closest('.context-menu-item'), + data = $this.data(), + opt = data.contextMenu, + root = data.contextMenuRoot; + + root.$selected = opt.$selected = $this; + root.isInput = opt.isInput = true; + }, + // flag that we're inside an input so the key handler can act accordingly + blurInput: function(e) { + var $this = $(this).closest('.context-menu-item'), + data = $this.data(), + opt = data.contextMenu, + root = data.contextMenuRoot; + + root.isInput = opt.isInput = false; + }, + + // :hover on menu + menuMouseenter: function(e) { + var root = $(this).data().contextMenuRoot; + root.hovering = true; + }, + // :hover on menu + menuMouseleave: function(e) { + var root = $(this).data().contextMenuRoot; + if (root.$layer && root.$layer.is(e.relatedTarget)) { + root.hovering = false; + } + }, + + // :hover done manually so key handling is possible + itemMouseenter: function(e) { + var $this = $(this), + data = $this.data(), + opt = data.contextMenu, + root = data.contextMenuRoot; + + root.hovering = true; + + // abort if we're re-entering + if (e && root.$layer && root.$layer.is(e.relatedTarget)) { + e.preventDefault(); + e.stopImmediatePropagation(); + } + + // make sure only one item is selected + (opt.$menu ? opt : root).$menu + .children('.hover').trigger('contextmenu:blur'); + + if ($this.hasClass('disabled') || $this.hasClass('not-selectable')) { + opt.$selected = null; + return; + } + + $this.trigger('contextmenu:focus'); + }, + // :hover done manually so key handling is possible + itemMouseleave: function(e) { + var $this = $(this), + data = $this.data(), + opt = data.contextMenu, + root = data.contextMenuRoot; + + if (root !== opt && root.$layer && root.$layer.is(e.relatedTarget)) { + root.$selected && root.$selected.trigger('contextmenu:blur'); + e.preventDefault(); + e.stopImmediatePropagation(); + root.$selected = opt.$selected = opt.$node; + return; + } + + $this.trigger('contextmenu:blur'); + }, + // contextMenu item click + itemClick: function(e) { + var $this = $(this), + data = $this.data(), + opt = data.contextMenu, + root = data.contextMenuRoot, + key = data.contextMenuKey, + callback; + + // abort if the key is unknown or disabled or is a menu + if (!opt.items[key] || $this.is('.disabled, .context-menu-submenu, .context-menu-separator, .not-selectable')) { + return; + } + + e.preventDefault(); + e.stopImmediatePropagation(); + + if ($.isFunction(root.callbacks[key]) && Object.prototype.hasOwnProperty.call(root.callbacks, key)) { + // item-specific callback + callback = root.callbacks[key]; + } else if ($.isFunction(root.callback)) { + // default callback + callback = root.callback; + } else { + // no callback, no action + return; + } + + // hide menu if callback doesn't stop that + if (callback.call(root.$trigger, key, root) !== false) { + root.$menu.trigger('contextmenu:hide'); + } else if (root.$menu.parent().length) { + op.update.call(root.$trigger, root); + } + }, + // ignore click events on input elements + inputClick: function(e) { + e.stopImmediatePropagation(); + }, + + // hide + hideMenu: function(e, data) { + var root = $(this).data('contextMenuRoot'); + op.hide.call(root.$trigger, root, data && data.force); + }, + // focus + focusItem: function(e) { + e.stopPropagation(); + var $this = $(this), + data = $this.data(), + opt = data.contextMenu, + root = data.contextMenuRoot; + + $this.addClass('hover') + .siblings('.hover').trigger('contextmenu:blur'); + + // remember selected + opt.$selected = root.$selected = $this; + + // position sub-menu - do after show so dumb $.ui.position can keep up + if (opt.$node) { + root.positionSubmenu.call(opt.$node, opt.$menu); + } + }, + // blur + blurItem: function(e) { + e.stopPropagation(); + var $this = $(this), + data = $this.data(), + opt = data.contextMenu; + + $this.removeClass('hover'); + opt.$selected = null; + } + }, + // operations + op = { + show: function(opt, x, y) { + var $trigger = $(this), + css = {}; + + // hide any open menus + $('#context-menu-layer').trigger('mousedown'); + + // backreference for callbacks + opt.$trigger = $trigger; + + // show event + if (opt.events.show.call($trigger, opt) === false) { + $currentTrigger = null; + return; + } + + // create or update context menu + op.update.call($trigger, opt); + + // position menu + opt.position.call($trigger, opt, x, y); + + // make sure we're in front + if (opt.zIndex) { + css.zIndex = zindex($trigger) + opt.zIndex; + } + + // add layer + op.layer.call(opt.$menu, opt, css.zIndex); + + // adjust sub-menu zIndexes + opt.$menu.find('ul').css('zIndex', css.zIndex + 1); + + // position and show context menu + opt.$menu.css( css )[opt.animation.show](opt.animation.duration, function() { + $trigger.trigger('contextmenu:visible'); + }); + // make options available and set state + $trigger + .data('contextMenu', opt) + .addClass("context-menu-active"); + + // register key handler + $(document).off('keydown.contextMenu').on('keydown.contextMenu', handle.key); + // register autoHide handler + if (opt.autoHide) { + // mouse position handler + $(document).on('mousemove.contextMenuAutoHide', function(e) { + // need to capture the offset on mousemove, + // since the page might've been scrolled since activation + var pos = $trigger.offset(); + pos.right = pos.left + $trigger.outerWidth(); + pos.bottom = pos.top + $trigger.outerHeight(); + + if (opt.$layer && !opt.hovering && (!(e.pageX >= pos.left && e.pageX <= pos.right) || !(e.pageY >= pos.top && e.pageY <= pos.bottom))) { + // if mouse in menu... + opt.$menu.trigger('contextmenu:hide'); + } + }); + } + }, + hide: function(opt, force) { + var $trigger = $(this); + if (!opt) { + opt = $trigger.data('contextMenu') || {}; + } + + // hide event + if (!force && opt.events && opt.events.hide.call($trigger, opt) === false) { + return; + } + + // remove options and revert state + $trigger + .removeData('contextMenu') + .removeClass("context-menu-active"); + + if (opt.$layer) { + // keep layer for a bit so the contextmenu event can be aborted properly by opera + setTimeout((function($layer) { + return function(){ + $layer.remove(); + }; + })(opt.$layer), 10); + + try { + delete opt.$layer; + } catch(e) { + opt.$layer = null; + } + } + + // remove handle + $currentTrigger = null; + // remove selected + opt.$menu.find('.hover').trigger('contextmenu:blur'); + opt.$selected = null; + // unregister key and mouse handlers + //$(document).off('.contextMenuAutoHide keydown.contextMenu'); // http://bugs.jquery.com/ticket/10705 + $(document).off('.contextMenuAutoHide').off('keydown.contextMenu'); + // hide menu + opt.$menu && opt.$menu[opt.animation.hide](opt.animation.duration, function (){ + // tear down dynamically built menu after animation is completed. + if (opt.build) { + opt.$menu.remove(); + $.each(opt, function(key, value) { + switch (key) { + case 'ns': + case 'selector': + case 'build': + case 'trigger': + return true; + + default: + opt[key] = undefined; + try { + delete opt[key]; + } catch (e) {} + return true; + } + }); + } + + setTimeout(function() { + $trigger.trigger('contextmenu:hidden'); + }, 10); + }); + }, + create: function(opt, root) { + if (root === undefined) { + root = opt; + } + // create contextMenu + opt.$menu = $('
        ').addClass(opt.className || "").data({ + 'contextMenu': opt, + 'contextMenuRoot': root + }); + + $.each(['callbacks', 'commands', 'inputs'], function(i,k){ + opt[k] = {}; + if (!root[k]) { + root[k] = {}; + } + }); + + root.accesskeys || (root.accesskeys = {}); + + // create contextMenu items + $.each(opt.items, function(key, item){ + var $t = $('
      • ').addClass(item.className || ""), + $label = null, + $input = null; + + // iOS needs to see a click-event bound to an element to actually + // have the TouchEvents infrastructure trigger the click event + $t.on('click', $.noop); + + item.$node = $t.data({ + 'contextMenu': opt, + 'contextMenuRoot': root, + 'contextMenuKey': key + }); + + // register accesskey + // NOTE: the accesskey attribute should be applicable to any element, but Safari5 and Chrome13 still can't do that + if (item.accesskey) { + var aks = splitAccesskey(item.accesskey); + for (var i=0, ak; ak = aks[i]; i++) { + if (!root.accesskeys[ak]) { + root.accesskeys[ak] = item; + item._name = item.name.replace(new RegExp('(' + ak + ')', 'i'), '$1'); + break; + } + } + } + + if (typeof item == "string") { + $t.addClass('context-menu-separator not-selectable'); + } else if (item.type && types[item.type]) { + // run custom type handler + types[item.type].call($t, item, opt, root); + // register commands + $.each([opt, root], function(i,k){ + k.commands[key] = item; + if ($.isFunction(item.callback)) { + k.callbacks[key] = item.callback; + } + }); + } else { + // add label for input + if (item.type == 'html') { + $t.addClass('context-menu-html not-selectable'); + } else if (item.type) { + $label = $('').appendTo($t); + $('').text(item._name || item.name).appendTo($label); + $t.addClass('context-menu-input'); + opt.hasTypes = true; + $.each([opt, root], function(i,k){ + k.commands[key] = item; + k.inputs[key] = item; + }); + } else if (item.items) { + item.type = 'sub'; + } + + switch (item.type) { + case 'text': + $input = $('') + .attr('name', 'context-menu-input-' + key) + .val(item.value || "") + .appendTo($label); + break; + + case 'textarea': + $input = $('') + .attr('name', 'context-menu-input-' + key) + .val(item.value || "") + .appendTo($label); + + if (item.height) { + $input.height(item.height); + } + break; + + case 'checkbox': + $input = $('') + .attr('name', 'context-menu-input-' + key) + .val(item.value || "") + .prop("checked", !!item.selected) + .prependTo($label); + break; + + case 'radio': + $input = $('') + .attr('name', 'context-menu-input-' + item.radio) + .val(item.value || "") + .prop("checked", !!item.selected) + .prependTo($label); + break; + + case 'select': + $input = $(' + if (item.type && item.type != 'sub' && item.type != 'html') { + $input + .on('focus', handle.focusInput) + .on('blur', handle.blurInput); + + if (item.events) { + $input.on(item.events, opt); + } + } + + // add icons + if (item.icon) { + $t.addClass("icon icon-" + item.icon); + } + } + + // cache contained elements + item.$input = $input; + item.$label = $label; + + // attach item to menu + $t.appendTo(opt.$menu); + + // Disable text selection + if (!opt.hasTypes && $.support.eventSelectstart) { + // browsers support user-select: none, + // IE has a special event for text-selection + // browsers supporting neither will not be preventing text-selection + $t.on('selectstart.disableTextSelect', handle.abortevent); + } + }); + // attach contextMenu to (to bypass any possible overflow:hidden issues on parents of the trigger element) + if (!opt.$node) { + opt.$menu.css('display', 'none').addClass('context-menu-root'); + } + opt.$menu.appendTo(opt.appendTo || document.body); + }, + resize: function($menu, nested) { + // determine widths of submenus, as CSS won't grow them automatically + // position:absolute within position:absolute; min-width:100; max-width:200; results in width: 100; + // kinda sucks hard... + + // determine width of absolutely positioned element + $menu.css({position: 'absolute', display: 'block'}); + // don't apply yet, because that would break nested elements' widths + // add a pixel to circumvent word-break issue in IE9 - #80 + $menu.data('width', Math.ceil($menu.width()) + 1); + // reset styles so they allow nested elements to grow/shrink naturally + $menu.css({ + position: 'static', + minWidth: '0px', + maxWidth: '100000px' + }); + // identify width of nested menus + $menu.find('> li > ul').each(function() { + op.resize($(this), true); + }); + // reset and apply changes in the end because nested + // elements' widths wouldn't be calculatable otherwise + if (!nested) { + $menu.find('ul').addBack().css({ + position: '', + display: '', + minWidth: '', + maxWidth: '' + }).width(function() { + return $(this).data('width'); + }); + } + }, + update: function(opt, root) { + var $trigger = this; + if (root === undefined) { + root = opt; + op.resize(opt.$menu); + } + // re-check disabled for each item + opt.$menu.children().each(function(){ + var $item = $(this), + key = $item.data('contextMenuKey'), + item = opt.items[key], + disabled = ($.isFunction(item.disabled) && item.disabled.call($trigger, key, root)) || item.disabled === true; + + // dis- / enable item + $item[disabled ? 'addClass' : 'removeClass']('disabled'); + + if (item.type) { + // dis- / enable input elements + $item.find('input, select, textarea').prop('disabled', disabled); + + // update input states + switch (item.type) { + case 'text': + case 'textarea': + item.$input.val(item.value || ""); + break; + + case 'checkbox': + case 'radio': + item.$input.val(item.value || "").prop('checked', !!item.selected); + break; + + case 'select': + item.$input.val(item.selected || ""); + break; + } + } + + if (item.$menu) { + // update sub-menu + op.update.call($trigger, item, root); + } + }); + }, + layer: function(opt, zIndex) { + // add transparent layer for click area + // filter and background for Internet Explorer, Issue #23 + var $layer = opt.$layer = $('
        ') + .css({height: $win.height(), width: $win.width(), display: 'block'}) + .data('contextMenuRoot', opt) + .insertBefore(this) + .on('contextmenu', handle.abortevent) + .on('mousedown', handle.layerClick); + + // IE6 doesn't know position:fixed; + if (document.body.style.maxWidth === undefined) {//IE6 doesn't support maxWidth + $layer.css({ + 'position' : 'absolute', + 'height' : $(document).height() + }); + } + + return $layer; + } + }; + +// split accesskey according to http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#assigned-access-key +function splitAccesskey(val) { + var t = val.split(/\s+/), + keys = []; + + for (var i=0, k; k = t[i]; i++) { + k = k.charAt(0).toUpperCase(); // first character only + // theoretically non-accessible characters should be ignored, but different systems, different keyboard layouts, ... screw it. + // a map to look up already used access keys would be nice + keys.push(k); + } + + return keys; +} + +// handle contextMenu triggers +$.fn.contextMenu = function(operation) { + if (operation === undefined) { + this.first().trigger('contextmenu'); + } else if (operation.x && operation.y) { + this.first().trigger($.Event("contextmenu", {pageX: operation.x, pageY: operation.y})); + } else if (operation === "hide") { + var $menu = this.first().data('contextMenu') ? this.first().data('contextMenu').$menu : null; + $menu && $menu.trigger('contextmenu:hide'); + } else if (operation === "destroy") { + $.contextMenu("destroy", {context: this}); + } else if ($.isPlainObject(operation)) { + operation.context = this; + $.contextMenu("create", operation); + } else if (operation) { + this.removeClass('context-menu-disabled'); + } else if (!operation) { + this.addClass('context-menu-disabled'); + } + + return this; +}; + +// manage contextMenu instances +$.contextMenu = function(operation, options) { + if (typeof operation != 'string') { + options = operation; + operation = 'create'; + } + + if (typeof options == 'string') { + options = {selector: options}; + } else if (options === undefined) { + options = {}; + } + + // merge with default options + var o = $.extend(true, {}, defaults, options || {}); + var $document = $(document); + var $context = $document; + var _hasContext = false; + + if (!o.context || !o.context.length) { + o.context = document; + } else { + // you never know what they throw at you... + $context = $(o.context).first(); + o.context = $context.get(0); + _hasContext = o.context !== document; + } + + switch (operation) { + case 'create': + // no selector no joy + if (!o.selector) { + throw new Error('No selector specified'); + } + // make sure internal classes are not bound to + if (o.selector.match(/.context-menu-(list|item|input)($|\s)/)) { + throw new Error('Cannot bind to selector "' + o.selector + '" as it contains a reserved className'); + } + if (!o.build && (!o.items || $.isEmptyObject(o.items))) { + throw new Error('No Items specified'); + } + counter ++; + o.ns = '.contextMenu' + counter; + if (!_hasContext) { + namespaces[o.selector] = o.ns; + } + menus[o.ns] = o; + + // default to right click + if (!o.trigger) { + o.trigger = 'right'; + } + + if (!initialized) { + // make sure item click is registered first + $document + .on({ + 'contextmenu:hide.contextMenu': handle.hideMenu, + 'prevcommand.contextMenu': handle.prevItem, + 'nextcommand.contextMenu': handle.nextItem, + 'contextmenu.contextMenu': handle.abortevent, + 'mouseenter.contextMenu': handle.menuMouseenter, + 'mouseleave.contextMenu': handle.menuMouseleave + }, '.context-menu-list') + .on('mouseup.contextMenu', '.context-menu-input', handle.inputClick) + .on({ + 'mouseup.contextMenu': handle.itemClick, + 'contextmenu:focus.contextMenu': handle.focusItem, + 'contextmenu:blur.contextMenu': handle.blurItem, + 'contextmenu.contextMenu': handle.abortevent, + 'mouseenter.contextMenu': handle.itemMouseenter, + 'mouseleave.contextMenu': handle.itemMouseleave + }, '.context-menu-item'); + + initialized = true; + } + + // engage native contextmenu event + $context + .on('contextmenu' + o.ns, o.selector, o, handle.contextmenu); + + if (_hasContext) { + // add remove hook, just in case + $context.on('remove' + o.ns, function() { + $(this).contextMenu("destroy"); + }); + } + + switch (o.trigger) { + case 'hover': + $context + .on('mouseenter' + o.ns, o.selector, o, handle.mouseenter) + .on('mouseleave' + o.ns, o.selector, o, handle.mouseleave); + break; + + case 'left': + $context.on('click' + o.ns, o.selector, o, handle.click); + break; + /* + default: + // http://www.quirksmode.org/dom/events/contextmenu.html + $document + .on('mousedown' + o.ns, o.selector, o, handle.mousedown) + .on('mouseup' + o.ns, o.selector, o, handle.mouseup); + break; + */ + } + + // create menu + if (!o.build) { + op.create(o); + } + break; + + case 'destroy': + var $visibleMenu; + if (_hasContext) { + // get proper options + var context = o.context; + $.each(menus, function(ns, o) { + if (o.context !== context) { + return true; + } + + $visibleMenu = $('.context-menu-list').filter(':visible'); + if ($visibleMenu.length && $visibleMenu.data().contextMenuRoot.$trigger.is($(o.context).find(o.selector))) { + $visibleMenu.trigger('contextmenu:hide', {force: true}); + } + + try { + if (menus[o.ns].$menu) { + menus[o.ns].$menu.remove(); + } + + delete menus[o.ns]; + } catch(e) { + menus[o.ns] = null; + } + + $(o.context).off(o.ns); + + return true; + }); + } else if (!o.selector) { + $document.off('.contextMenu .contextMenuAutoHide'); + $.each(menus, function(ns, o) { + $(o.context).off(o.ns); + }); + + namespaces = {}; + menus = {}; + counter = 0; + initialized = false; + + $('#context-menu-layer, .context-menu-list').remove(); + } else if (namespaces[o.selector]) { + $visibleMenu = $('.context-menu-list').filter(':visible'); + if ($visibleMenu.length && $visibleMenu.data().contextMenuRoot.$trigger.is(o.selector)) { + $visibleMenu.trigger('contextmenu:hide', {force: true}); + } + + try { + if (menus[namespaces[o.selector]].$menu) { + menus[namespaces[o.selector]].$menu.remove(); + } + + delete menus[namespaces[o.selector]]; + } catch(e) { + menus[namespaces[o.selector]] = null; + } + + $document.off(namespaces[o.selector]); + } + break; + + case 'html5': + // if or are not handled by the browser, + // or options was a bool true, + // initialize $.contextMenu for them + if ((!$.support.htmlCommand && !$.support.htmlMenuitem) || (typeof options == "boolean" && options)) { + $('menu[type="context"]').each(function() { + if (this.id) { + $.contextMenu({ + selector: '[contextmenu=' + this.id +']', + items: $.contextMenu.fromMenu(this) + }); + } + }).css('display', 'none'); + } + break; + + default: + throw new Error('Unknown operation "' + operation + '"'); + } + + return this; +}; + +// import values into commands +$.contextMenu.setInputValues = function(opt, data) { + if (data === undefined) { + data = {}; + } + + $.each(opt.inputs, function(key, item) { + switch (item.type) { + case 'text': + case 'textarea': + item.value = data[key] || ""; + break; + + case 'checkbox': + item.selected = data[key] ? true : false; + break; + + case 'radio': + item.selected = (data[item.radio] || "") == item.value ? true : false; + break; + + case 'select': + item.selected = data[key] || ""; + break; + } + }); +}; + +// export values from commands +$.contextMenu.getInputValues = function(opt, data) { + if (data === undefined) { + data = {}; + } + + $.each(opt.inputs, function(key, item) { + switch (item.type) { + case 'text': + case 'textarea': + case 'select': + data[key] = item.$input.val(); + break; + + case 'checkbox': + data[key] = item.$input.prop('checked'); + break; + + case 'radio': + if (item.$input.prop('checked')) { + data[item.radio] = item.value; + } + break; + } + }); + + return data; +}; + +// find

      Log In