From 5da3c09a182c8b750b6fae6b0d8b8d1fd84bc6ed Mon Sep 17 00:00:00 2001 From: GPrathap Date: Mon, 6 Jun 2016 06:00:19 +0530 Subject: [PATCH] removing droneanalyzer old sample --- .../droneanalyzer/component/api/pom.xml | 281 ---- .../api/DroneControllerService.java | 46 - .../api/DroneControllerServiceImpl.java | 55 - .../api/DroneManagerService.java | 69 - .../api/DroneManagerServiceImpl.java | 259 ---- .../api/DroneRealTimeService.java | 125 -- .../api/exception/DroneAnalyzerException.java | 32 - .../transport/DroneAnalyzerXMPPConnector.java | 160 --- .../api/trasformer/MessageTransformer.java | 134 -- .../droneanalyzer/api/util/APIUtil.java | 55 - .../api/util/DroneAnalyzerServiceUtils.java | 95 -- .../src/main/webapp/META-INF/permissions.xml | 89 -- .../webapp/META-INF/webapp-classloading.xml | 33 - .../src/main/webapp/WEB-INF/cxf-servlet.xml | 44 - .../api/src/main/webapp/WEB-INF/web.xml | 49 - .../droneanalyzer/component/plugin/pom.xml | 120 -- .../plugin/constants/DroneConstants.java | 41 - .../plugin/constants/MessageConfig.java | 40 - .../plugin/controller/DroneController.java | 34 - .../controller/impl/DroneControllerImpl.java | 74 - ...DroneAnalyzerDeviceMgtPluginException.java | 56 - .../plugin/impl/DroneAnalyzerManager.java | 256 ---- .../impl/DroneAnalyzerManagerService.java | 106 -- .../plugin/impl/dao/DroneAnalyzerDAO.java | 127 -- .../dao/impl/DroneAnalyzerDeviceDAOImpl.java | 195 --- .../feature/DroneAnalyzerFeatureManager.java | 58 - .../impl/util/DeviceSchemaInitializer.java | 50 - .../plugin/impl/util/DroneAnalyzerUtils.java | 109 -- ...oneAnalyzerManagementServiceComponent.java | 89 -- .../samples/droneanalyzer/component/pom.xml | 59 - .../droneanalyzer/component/ui/pom.xml | 64 - .../component/ui/src/assembly/src.xml | 36 - .../device-view.hbs | 52 - .../device-view.js | 34 - .../device-view.json | 3 - .../public/images/drone-icon.png | Bin 46940 -> 0 bytes .../public/images/thumb.png | Bin 46940 -> 0 bytes .../public/images/devices_analytics.png | Bin 114202 -> 0 bytes .../public/images/drone-icon.png | Bin 46940 -> 0 bytes .../public/images/schematicsGuide.png | Bin 151933 -> 0 bytes .../public/images/thumb.png | Bin 48636 -> 0 bytes .../public/js/download.js | 184 --- .../public/js/jquery.validate.js | 1227 ----------------- .../type-view.hbs | 315 ----- .../type-view.json | 3 - .../public/css/main-app.css | 220 --- .../background_drone.png | Bin 26787 -> 0 bytes .../direction_drone.png | Bin 11617 -> 0 bytes .../drone_position_controller/pitch_drone.png | Bin 20046 -> 0 bytes .../public/images/no_video_preview.gif | Bin 2111 -> 0 bytes .../3dobject_controller/3dObjectControler.js | 206 --- .../js/3dobject_controller/Coordinates.js | 166 --- .../OrbitAndPanControls.js | 549 -------- .../js/3dobject_controller/three.min.js | 724 ---------- .../public/js/common/ajax_handler.js | 50 - .../public/js/common/general_handler | 101 -- .../public/js/common/websocket_api | 60 - .../public/js/config/config.js | 37 - .../public/js/d3.min.js | 23 - .../public/js/download.js | 174 --- .../public/js/initJs | 21 - .../public/js/jQueryRotate.js | 357 ----- .../public/js/jquery.validate.js | 1227 ----------------- .../public/js/mainHandler | 153 -- .../public/js/modules/controller.js | 29 - .../public/js/modules/flight_dynamics.js | 77 -- .../public/js/modules/realtime_plotting | 148 -- .../statistics.hbs | 250 ---- .../statistics.js | 25 - .../statistics.json | 3 - .../droneanalyzer/feature/feature/pom.xml | 213 --- .../resources/agent/deviceConfig.properties | 33 - .../main/resources/agent/sketch.properties | 2 - .../agent/src/IRIS+DroneStatistics.py | 73 - .../src/main/resources/agent/src/util.py | 40 - .../main/resources/agent/src/xmppClient.py | 66 - .../src/main/resources/agent/start_server.sh | 83 -- .../src/main/resources/build.properties | 1 - .../resources/configs/drone_analyzer.json | 6 - .../main/resources/configs/drone_analyzer.xml | 24 - .../drone_analyzer-datasources.xml | 50 - .../src/main/resources/dbscripts/h2.sql | 11 - .../src/main/resources/dbscripts/mysql.sql | 12 - .../feature/feature/src/main/resources/p2.inf | 26 - modules/samples/droneanalyzer/feature/pom.xml | 39 - modules/samples/droneanalyzer/pom.xml | 501 ------- 86 files changed, 10638 deletions(-) delete mode 100644 modules/samples/droneanalyzer/component/api/pom.xml delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneControllerService.java delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneControllerServiceImpl.java delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneManagerService.java delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneManagerServiceImpl.java delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneRealTimeService.java delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/exception/DroneAnalyzerException.java delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/transport/DroneAnalyzerXMPPConnector.java delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/trasformer/MessageTransformer.java delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/util/APIUtil.java delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/util/DroneAnalyzerServiceUtils.java delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/webapp/META-INF/permissions.xml delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/webapp/META-INF/webapp-classloading.xml delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/webapp/WEB-INF/cxf-servlet.xml delete mode 100644 modules/samples/droneanalyzer/component/api/src/main/webapp/WEB-INF/web.xml delete mode 100644 modules/samples/droneanalyzer/component/plugin/pom.xml delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/constants/DroneConstants.java delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/constants/MessageConfig.java delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/controller/DroneController.java delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/controller/impl/DroneControllerImpl.java delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/exception/DroneAnalyzerDeviceMgtPluginException.java delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/DroneAnalyzerManager.java delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/DroneAnalyzerManagerService.java delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/dao/DroneAnalyzerDAO.java delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/dao/impl/DroneAnalyzerDeviceDAOImpl.java delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/feature/DroneAnalyzerFeatureManager.java delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/util/DeviceSchemaInitializer.java delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/util/DroneAnalyzerUtils.java delete mode 100644 modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/internal/DroneAnalyzerManagementServiceComponent.java delete mode 100644 modules/samples/droneanalyzer/component/pom.xml delete mode 100644 modules/samples/droneanalyzer/component/ui/pom.xml delete mode 100644 modules/samples/droneanalyzer/component/ui/src/assembly/src.xml delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.hbs delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.json delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/images/drone-icon.png delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/images/thumb.png delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/images/devices_analytics.png delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/images/drone-icon.png delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/images/schematicsGuide.png delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/images/thumb.png delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/js/download.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/js/jquery.validate.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/type-view.hbs delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/type-view.json delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/css/main-app.css delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/background_drone.png delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/direction_drone.png delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/pitch_drone.png delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/no_video_preview.gif delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/3dObjectControler.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/Coordinates.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/OrbitAndPanControls.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/three.min.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/ajax_handler.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/general_handler delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/websocket_api delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/config/config.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/d3.min.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/download.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/initJs delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jQueryRotate.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jquery.validate.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/mainHandler delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/controller.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/flight_dynamics.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/realtime_plotting delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.hbs delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.js delete mode 100644 modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.json delete mode 100644 modules/samples/droneanalyzer/feature/feature/pom.xml delete mode 100644 modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/deviceConfig.properties delete mode 100644 modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/sketch.properties delete mode 100644 modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/src/IRIS+DroneStatistics.py delete mode 100644 modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/src/util.py delete mode 100644 modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/src/xmppClient.py delete mode 100755 modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/start_server.sh delete mode 100644 modules/samples/droneanalyzer/feature/feature/src/main/resources/build.properties delete mode 100644 modules/samples/droneanalyzer/feature/feature/src/main/resources/configs/drone_analyzer.json delete mode 100644 modules/samples/droneanalyzer/feature/feature/src/main/resources/configs/drone_analyzer.xml delete mode 100644 modules/samples/droneanalyzer/feature/feature/src/main/resources/datasources/drone_analyzer-datasources.xml delete mode 100644 modules/samples/droneanalyzer/feature/feature/src/main/resources/dbscripts/h2.sql delete mode 100644 modules/samples/droneanalyzer/feature/feature/src/main/resources/dbscripts/mysql.sql delete mode 100644 modules/samples/droneanalyzer/feature/feature/src/main/resources/p2.inf delete mode 100644 modules/samples/droneanalyzer/feature/pom.xml delete mode 100644 modules/samples/droneanalyzer/pom.xml diff --git a/modules/samples/droneanalyzer/component/api/pom.xml b/modules/samples/droneanalyzer/component/api/pom.xml deleted file mode 100644 index 28a61cdd..00000000 --- a/modules/samples/droneanalyzer/component/api/pom.xml +++ /dev/null @@ -1,281 +0,0 @@ - - - - - - org.homeautomation - droneanalyzer-component - 2.1.0-SNAPSHOT - ../pom.xml - - - 4.0.0 - ${groupId}.droneanalyzer.api - 2.1.0-SNAPSHOT - war - ${groupId}.droneanalyzer API - http://wso2.com - - - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.common - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.core - - - org.apache.axis2.wso2 - axis2-client - - - - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.analytics.data.publisher - - - org.apache.axis2.wso2 - axis2-client - - - - - - org.wso2.carbon.devicemgt - org.wso2.carbon.certificate.mgt.core - - - commons-codec.wso2 - commons-codec - - - - - - org.apache.commons - commons-collections4 - - - - - org.apache.cxf - cxf-rt-frontend-jaxws - - - org.apache.cxf - cxf-rt-frontend-jaxrs - - - org.apache.cxf - cxf-rt-transports-http - - - - - org.eclipse.paho - org.eclipse.paho.client.mqttv3 - - - - - org.apache.httpcomponents - httpasyncclient - - - org.wso2.carbon.devicemgt-plugins - org.wso2.carbon.device.mgt.iot - - - - - - org.codehaus.jackson - jackson-core-asl - - - org.codehaus.jackson - jackson-jaxrs - - - javax - javaee-web-api - - - javax.ws.rs - jsr311-api - - - commons-httpclient.wso2 - commons-httpclient - - - - org.wso2.carbon - org.wso2.carbon.utils - - - org.bouncycastle.wso2 - bcprov-jdk15on - - - org.wso2.carbon - org.wso2.carbon.user.api - - - org.wso2.carbon - org.wso2.carbon.queuing - - - org.wso2.carbon - org.wso2.carbon.base - - - org.apache.axis2.wso2 - axis2 - - - org.igniterealtime.smack.wso2 - smack - - - org.igniterealtime.smack.wso2 - smackx - - - jaxen - jaxen - - - commons-fileupload.wso2 - commons-fileupload - - - org.apache.ant.wso2 - ant - - - org.apache.ant.wso2 - ant - - - commons-httpclient.wso2 - commons-httpclient - - - org.eclipse.equinox - javax.servlet - - - org.wso2.carbon - org.wso2.carbon.registry.api - - - - - commons-codec - commons-codec - - - org.igniterealtime.smack.wso2 - smack - - - org.igniterealtime.smack.wso2 - smackx - - - org.wso2.carbon.devicemgt - org.wso2.carbon.apimgt.annotations - - - org.wso2.carbon.devicemgt - org.wso2.carbon.apimgt.webapp.publisher - - - org.homeautomation - org.homeautomation.droneanalyzer.plugin - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.extensions - - - org.wso2.carbon.devicemgt - org.wso2.carbon.apimgt.application.extension - - - org.wso2.carbon.devicemgt - org.wso2.carbon.identity.jwt.client.extension - - - org.wso2.carbon - org.wso2.carbon.user.api - - - org.json - json - - - javax.websocket - javax.websocket-api - - - - - ${basedir}/src/main/java - - - - - maven-compiler-plugin - - 1.7 - 1.7 - - 2.3.2 - - - maven-war-plugin - - drone_analyzer - - - - - - \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneControllerService.java b/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneControllerService.java deleted file mode 100644 index ba5457df..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneControllerService.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.api; - -import org.wso2.carbon.apimgt.annotations.api.API; -import org.wso2.carbon.device.mgt.extensions.feature.mgt.annotations.DeviceType; - -import javax.ws.rs.FormParam; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.core.Response; - -@API(name = "drone_analyzer", version = "1.0.0", context = "/drone_analyzer", tags = {"drone_analyzer"}) -@DeviceType(value = "drone_analyzer") -public interface DroneControllerService { - - @Path("device/register/{deviceId}/{ip}/{port}") - @POST - Response registerDeviceIP(@PathParam("deviceId") String deviceId, @PathParam("ip") String deviceIP, - @PathParam("port") String devicePort); - - @Path("device/{deviceId}/send_command") - @POST - /*@Feature( code="send_command", name="Send Command", type="operation", - description="Send Commands to Drone")*/ - Response droneController(@PathParam("deviceId") String deviceId, @FormParam("action") String action, - @FormParam("duration") String duration, @FormParam("speed") String speed); - -} \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneControllerServiceImpl.java b/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneControllerServiceImpl.java deleted file mode 100644 index a0be696c..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneControllerServiceImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.api; - -import org.apache.commons.logging.LogFactory; -import org.homeautomation.droneanalyzer.api.util.DroneAnalyzerServiceUtils; -import org.homeautomation.droneanalyzer.plugin.controller.DroneController; -import org.homeautomation.droneanalyzer.plugin.controller.impl.DroneControllerImpl; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import javax.ws.rs.core.Response; -import java.util.concurrent.ConcurrentHashMap; - -public class DroneControllerServiceImpl implements DroneControllerService { - - private static org.apache.commons.logging.Log log = LogFactory.getLog(DroneControllerServiceImpl.class); - private ConcurrentHashMap deviceToIpMap = new ConcurrentHashMap<>(); - private DroneController droneController = new DroneControllerImpl(); - - public Response registerDeviceIP(String deviceId, String deviceIP, String devicePort) { - String result; - String deviceHttpEndpoint = deviceIP + ":" + devicePort; - deviceToIpMap.put(deviceId, deviceHttpEndpoint); - result = "Device-IP Registered"; - if (log.isDebugEnabled()) { - log.debug(result); - } - return Response.ok(Response.Status.OK.getStatusCode()).build(); - } - - public Response droneController(String deviceId, String action, String duration, String speed) { - try { - DroneAnalyzerServiceUtils.sendControlCommand(droneController, deviceId, action, Double.valueOf(speed), - Double.valueOf(duration)); - return Response.status(Response.Status.ACCEPTED).build(); - } catch (DeviceManagementException e) { - log.error("Drone command didn't success. Try again, \n" + e); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); - } - } -} diff --git a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneManagerService.java b/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneManagerService.java deleted file mode 100644 index bedcfc1e..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneManagerService.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.api; - -import org.wso2.carbon.apimgt.annotations.api.API; -import org.wso2.carbon.device.mgt.extensions.feature.mgt.annotations.DeviceType; - -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Response; - -@API(name = "drone_analyzer_mgt", version = "1.0.0", context = "/drone_analyzer_mgt", tags = {"drone_analyzer"}) -@DeviceType(value = "drone_analyzer") -public interface DroneManagerService { - - @Path("devices/{device_id}") - @DELETE - Response removeDevice(@PathParam("device_id") String deviceId); - - @Path("devices/{device_id}") - @PUT - Response updateDevice(@PathParam("device_id") String deviceId, @QueryParam("name") String name); - - @Path("devices/{device_id}") - @GET - @Consumes("application/json") - @Produces("application/json") - Response getDevice(@PathParam("device_id") String deviceId); - - @Path("devices") - @GET - @Consumes("application/json") - @Produces("application/json") - Response getDroneDevices(); - - @Path("devices/{sketch_type}/download") - @GET - @Produces("application/octet-stream") - Response downloadSketch(@QueryParam("deviceName") String deviceName, @PathParam("sketch_type") String sketchType); - - @Path("devices/{sketch_type}/generate_link") - @GET - Response generateSketchLink(@QueryParam("deviceName") String deviceName, - @PathParam("sketch_type") String sketchType); - -} - diff --git a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneManagerServiceImpl.java b/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneManagerServiceImpl.java deleted file mode 100644 index 54f55de8..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneManagerServiceImpl.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.api; - -import org.apache.commons.logging.LogFactory; -import org.homeautomation.droneanalyzer.api.util.APIUtil; -import org.homeautomation.droneanalyzer.plugin.constants.DroneConstants; -import org.wso2.carbon.apimgt.application.extension.APIManagementProviderService; -import org.wso2.carbon.apimgt.application.extension.dto.ApiApplicationKey; -import org.wso2.carbon.apimgt.application.extension.exception.APIManagerException; -import org.wso2.carbon.context.PrivilegedCarbonContext; -import org.wso2.carbon.device.mgt.common.Device; -import org.wso2.carbon.device.mgt.common.DeviceIdentifier; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import org.wso2.carbon.device.mgt.common.EnrolmentInfo; -import org.wso2.carbon.device.mgt.iot.controlqueue.xmpp.XmppAccount; -import org.wso2.carbon.device.mgt.iot.controlqueue.xmpp.XmppConfig; -import org.wso2.carbon.device.mgt.iot.controlqueue.xmpp.XmppServerClient; -import org.wso2.carbon.device.mgt.iot.exception.DeviceControllerException; -import org.wso2.carbon.device.mgt.iot.util.ZipArchive; -import org.wso2.carbon.device.mgt.iot.util.ZipUtil; -import org.wso2.carbon.identity.jwt.client.extension.JWTClient; -import org.wso2.carbon.identity.jwt.client.extension.JWTClientManager; -import org.wso2.carbon.identity.jwt.client.extension.dto.AccessTokenInfo; -import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientException; -import org.wso2.carbon.user.api.UserStoreException; - -import javax.ws.rs.core.Response; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.UUID; - -public class DroneManagerServiceImpl implements DroneManagerService { - - private static org.apache.commons.logging.Log log = LogFactory.getLog(DroneManagerServiceImpl.class); - private static final String KEY_TYPE = "PRODUCTION"; - private static ApiApplicationKey apiApplicationKey; - - private boolean register(String deviceId, String name) { - try { - DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); - deviceIdentifier.setId(deviceId); - deviceIdentifier.setType(DroneConstants.DEVICE_TYPE); - if (APIUtil.getDeviceManagementService().isEnrolled(deviceIdentifier)) { - return false; - } - Device device = new Device(); - device.setDeviceIdentifier(deviceId); - EnrolmentInfo enrolmentInfo = new EnrolmentInfo(); - enrolmentInfo.setDateOfEnrolment(new Date().getTime()); - enrolmentInfo.setDateOfLastUpdate(new Date().getTime()); - enrolmentInfo.setStatus(EnrolmentInfo.Status.ACTIVE); - enrolmentInfo.setOwnership(EnrolmentInfo.OwnerShip.BYOD); - device.setName(name); - device.setType(DroneConstants.DEVICE_TYPE); - enrolmentInfo.setOwner(APIUtil.getAuthenticatedUser()); - device.setEnrolmentInfo(enrolmentInfo); - boolean added = APIUtil.getDeviceManagementService().enrollDevice(device); - return added; - } catch (DeviceManagementException e) { - return false; - } - } - - public Response removeDevice(String deviceId) { - try { - DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); - deviceIdentifier.setId(deviceId); - deviceIdentifier.setType(DroneConstants.DEVICE_TYPE); - boolean removed = APIUtil.getDeviceManagementService().disenrollDevice(deviceIdentifier); - if (removed) { - return Response.ok().build(); - } else { - return Response.status(Response.Status.NOT_ACCEPTABLE.getStatusCode()).build(); - } - } catch (DeviceManagementException e) { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build(); - } - } - - public Response updateDevice(String deviceId, String name) { - try { - DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); - deviceIdentifier.setId(deviceId); - deviceIdentifier.setType(DroneConstants.DEVICE_TYPE); - Device device = APIUtil.getDeviceManagementService().getDevice(deviceIdentifier); - device.setDeviceIdentifier(deviceId); - device.getEnrolmentInfo().setDateOfLastUpdate(new Date().getTime()); - device.setName(name); - device.setType(DroneConstants.DEVICE_TYPE); - boolean updated = APIUtil.getDeviceManagementService().modifyEnrollment(device); - if (updated) { - return Response.ok().build(); - } else { - return Response.status(Response.Status.NOT_ACCEPTABLE.getStatusCode()).build(); - } - } catch (DeviceManagementException e) { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build(); - } - } - - public Response getDevice(String deviceId) { - try { - DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); - deviceIdentifier.setId(deviceId); - deviceIdentifier.setType(DroneConstants.DEVICE_TYPE); - Device device = APIUtil.getDeviceManagementService().getDevice(deviceIdentifier); - return Response.ok().entity(device).build(); - } catch (DeviceManagementException e) { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build(); - } - } - - public Response getDroneDevices() { - try { - List userDevices = APIUtil.getDeviceManagementService().getDevicesOfUser(APIUtil.getAuthenticatedUser()); - ArrayList userDevicesforDrone = new ArrayList<>(); - for (Device device : userDevices) { - if (device.getType().equals(DroneConstants.DEVICE_TYPE) && - device.getEnrolmentInfo().getStatus().equals( - EnrolmentInfo.Status.ACTIVE)) { - userDevicesforDrone.add(device); - } - } - Device[] devices = userDevicesforDrone.toArray(new Device[]{}); - return Response.ok().entity(devices).build(); - } catch (DeviceManagementException e) { - return Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build(); - } - } - - public Response downloadSketch(String deviceName, String sketchType) { - - //create new device id - String deviceId = shortUUID(); - //create token - String token = UUID.randomUUID().toString(); - String refreshToken = UUID.randomUUID().toString(); - //adding registering data - boolean status = register(deviceId, deviceName); - if (!status) { - return Response.status(500).entity( - "Error occurred while registering the device with " + "id: " + deviceId + " owner:" + - APIUtil.getAuthenticatedUser()).build(); - - } - ZipUtil ziputil = new ZipUtil(); - ZipArchive zipFile; - try { - zipFile = ziputil.createZipFile(APIUtil.getAuthenticatedUser(), APIUtil.getTenantDomainOftheUser(), - sketchType, deviceId, deviceName, token, refreshToken); - } catch (DeviceManagementException ex) { - return Response.status(500).entity("Error occurred while creating zip file").build(); - } - Response.ResponseBuilder rb = Response.ok(zipFile.getZipFile()); - rb.header("Content-Disposition", "attachment; filename=\"" + zipFile.getFileName() + "\""); - return rb.build(); - - } - - public Response generateSketchLink(String deviceName, String sketchType) { - try { - ZipArchive zipFile = createDownloadFile(deviceName, sketchType); - Response.ResponseBuilder rb = Response.ok(zipFile.getDeviceId()); - return rb.build(); - } catch (IllegalArgumentException ex) { - return Response.status(400).entity(ex.getMessage()).build(); - } catch (DeviceManagementException ex) { - return Response.status(500).entity(ex.getMessage()).build(); - } catch (JWTClientException ex) { - return Response.status(500).entity(ex.getMessage()).build(); - } catch (DeviceControllerException ex) { - return Response.status(500).entity(ex.getMessage()).build(); - } catch (APIManagerException ex) { - return Response.status(500).entity(ex.getMessage()).build(); - } catch (UserStoreException ex) { - return Response.status(500).entity(ex.getMessage()).build(); - } - } - - private ZipArchive createDownloadFile(String deviceName, String sketchType) - throws DeviceManagementException, JWTClientException, APIManagerException, DeviceControllerException, - UserStoreException { - //create new device id - String deviceId = shortUUID(); - if (apiApplicationKey == null) { - String applicationUsername = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm().getRealmConfiguration() - .getAdminUserName(); - APIManagementProviderService apiManagementProviderService = APIUtil.getAPIManagementProviderService(); - String[] tags = {DroneConstants.DEVICE_TYPE}; - apiApplicationKey = apiManagementProviderService.generateAndRetrieveApplicationKeys( - DroneConstants.DEVICE_TYPE, tags, KEY_TYPE, applicationUsername, true); - } - JWTClient jwtClient = JWTClientManager.getInstance().getJWTClient(); - String owner = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); - String scopes = "device_type_" + DroneConstants.DEVICE_TYPE + " device_" + deviceId; - AccessTokenInfo accessTokenInfo = jwtClient.getAccessToken(apiApplicationKey.getConsumerKey(), - apiApplicationKey.getConsumerSecret(), owner, scopes); - //create token - String accessToken = accessTokenInfo.getAccess_token(); - String refreshToken = accessTokenInfo.getRefresh_token(); - //adding registering data - XmppAccount newXmppAccount = new XmppAccount(); - newXmppAccount.setAccountName(APIUtil.getAuthenticatedUser() + "_" + deviceId); - newXmppAccount.setUsername(deviceId); - newXmppAccount.setPassword(accessToken); - newXmppAccount.setEmail(deviceId + "@wso2.com"); - XmppServerClient xmppServerClient = new XmppServerClient(); - xmppServerClient.initControlQueue(); - boolean status; - if (XmppConfig.getInstance().isEnabled()) { - status = xmppServerClient.createXMPPAccount(newXmppAccount); - if (!status) { - String msg = "XMPP Account was not created for device - " + deviceId + " of owner - " + - APIUtil.getAuthenticatedUser() + ".XMPP might have been disabled in " + - "org.wso2.carbon.device.mgt.iot.common.config.server.configs"; - log.warn(msg); - throw new DeviceManagementException(msg); - } - } - //Register the device with CDMF - status = register(deviceId, deviceName); - if (!status) { - String msg = "Error occurred while registering the device with " + "id: " + deviceId - + " owner:" + APIUtil.getAuthenticatedUser(); - throw new DeviceManagementException(msg); - } - ZipUtil ziputil = new ZipUtil(); - ZipArchive zipFile = ziputil.createZipFile(APIUtil.getAuthenticatedUser(), APIUtil.getTenantDomainOftheUser(), - sketchType, deviceId, deviceName, accessToken, refreshToken); - zipFile.setDeviceId(deviceId); - return zipFile; - } - - private static String shortUUID() { - UUID uuid = UUID.randomUUID(); - long l = ByteBuffer.wrap(uuid.toString().getBytes(StandardCharsets.UTF_8)).getLong(); - return Long.toString(l, Character.MAX_RADIX); - } -} diff --git a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneRealTimeService.java b/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneRealTimeService.java deleted file mode 100644 index 2dd2671e..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/DroneRealTimeService.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.api; - - -import org.apache.commons.logging.LogFactory; -import org.homeautomation.droneanalyzer.api.transport.DroneAnalyzerXMPPConnector; -import org.homeautomation.droneanalyzer.api.trasformer.MessageTransformer; -import org.homeautomation.droneanalyzer.plugin.constants.DroneConstants; -import org.wso2.carbon.device.mgt.iot.controlqueue.xmpp.XmppConfig; -import org.wso2.carbon.device.mgt.iot.service.IoTServerStartupListener; - -import javax.websocket.OnClose; -import javax.websocket.OnError; -import javax.websocket.OnMessage; -import javax.websocket.OnOpen; -import javax.websocket.Session; -import javax.websocket.server.ServerEndpoint; -import java.io.IOException; - -@ServerEndpoint("/datastream/drone_status") -public class DroneRealTimeService { - - private static org.apache.commons.logging.Log log = LogFactory.getLog(DroneRealTimeService.class); - private MessageTransformer messageController; - private DroneAnalyzerXMPPConnector xmppConnector; - - public DroneRealTimeService() { - Runnable connector = new Runnable() { - public void run() { - if (waitForServerStartup()) { - return; - } - messageController = new MessageTransformer(); - xmppConnector = new DroneAnalyzerXMPPConnector(messageController); - if (XmppConfig.getInstance().isEnabled()){ - xmppConnector.connect(); - } else { - log.warn("XMPP disabled in 'devicemgt-config.xml'. Hence, DroneAnalyzerXMPPConnector not started."); - } - } - }; - Thread connectorThread = new Thread(connector); - connectorThread.setDaemon(true); - connectorThread.start(); - } - - private boolean waitForServerStartup() { - while (!IoTServerStartupListener.isServerReady()) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - return true; - } - } - return false; - } - - @OnOpen - public void onOpen(Session session){ - log.info(session.getId() + " has opened a connection"); - try { - session.getBasicRemote().sendText("Connection Established"); - } catch (IOException e) { - log.error( e.getMessage()+"\n"+ e); - } - } - - @OnMessage - public void onMessage(String message, Session session){ - while (true) { - try { - if (messageController != null && !messageController.isEmptyQueue()) { - String messageControllerMessage = messageController.getMessage(); - session.getBasicRemote().sendText(messageControllerMessage); - break; - } - Thread.sleep(DroneConstants.MINIMUM_TIME_DURATION); - } catch (IOException | InterruptedException ex) { - log.error(ex.getMessage(), ex); - break; - } - } - } - - @OnClose - public void onClose(Session session){ - try { - xmppConnector.disconnect(); - log.info("XMPP connection is disconnected"); - } - catch (Exception e) { - log.error(e.getMessage() + "\n" + e); - } - log.info("Session " + session.getId() + " has ended"); - } - - @OnError - public void onError(Session session, Throwable t) { - try { - session.getBasicRemote().sendText("Connection closed"); - xmppConnector.disconnect(); - log.info("XMPP connection is disconnected"); - } catch (Exception e) { - log.error(e.getMessage()+"\n"+ e); - } - log.info("Session " + session.getId() + " has ended"); - } - -} \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/exception/DroneAnalyzerException.java b/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/exception/DroneAnalyzerException.java deleted file mode 100644 index 57145ae4..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/exception/DroneAnalyzerException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.api.exception; - -public class DroneAnalyzerException extends Exception { - - private static final long serialVersionUID = 118512086958330189L; - - public DroneAnalyzerException(String errorMessage) { - super(errorMessage); - } - - public DroneAnalyzerException(String errorMessage, Throwable throwable) { - super(errorMessage, throwable); - } -} diff --git a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/transport/DroneAnalyzerXMPPConnector.java b/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/transport/DroneAnalyzerXMPPConnector.java deleted file mode 100644 index a295c995..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/transport/DroneAnalyzerXMPPConnector.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.api.transport; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.homeautomation.droneanalyzer.api.trasformer.MessageTransformer; -import org.homeautomation.droneanalyzer.plugin.constants.DroneConstants; -import org.jivesoftware.smack.packet.Message; -import org.wso2.carbon.device.mgt.iot.controlqueue.xmpp.XmppConfig; -import org.wso2.carbon.device.mgt.iot.transport.TransportHandlerException; -import org.wso2.carbon.device.mgt.iot.transport.xmpp.XMPPTransportHandler; - -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; - -public class DroneAnalyzerXMPPConnector extends XMPPTransportHandler { - private static Log log = LogFactory.getLog(DroneAnalyzerXMPPConnector.class); - - private static String xmppServerIP; - private static String xmppAdminUsername; - private static String xmppAdminPassword; - private static String xmppAdminAccountJID; - private MessageTransformer messageTransformer; - private ScheduledFuture connectorServiceHandler; - private ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); - - public DroneAnalyzerXMPPConnector(MessageTransformer messageTransformer) { - super(XmppConfig.getInstance().getXmppServerIP(), XmppConfig.getInstance().getSERVER_CONNECTION_PORT()); - this.messageTransformer = messageTransformer; - } - - @Override - public void connect() { - Runnable connector = new Runnable() { - @Override - public void run() { - if (!isConnected()) { - try { - initConnector(); - connectToServer(); - loginToServer(xmppAdminUsername, xmppAdminPassword, null); - setFilterOnReceiver(xmppAdminAccountJID); - } catch (TransportHandlerException e) { - if (log.isDebugEnabled()) { - log.warn("Connection/Login to XMPP server at: " + server + " as " + - xmppAdminUsername + " failed for device-type [" + - DroneConstants.DEVICE_TYPE + "].", e); - } - } - } - } - }; - connectorServiceHandler = service.scheduleAtFixedRate(connector, 0, timeoutInterval, TimeUnit.MILLISECONDS); - } - - public void initConnector() { - xmppServerIP = XmppConfig.getInstance().getXmppServerIP(); - xmppAdminUsername = XmppConfig.getInstance().getXmppUsername(); - xmppAdminPassword = XmppConfig.getInstance().getXmppPassword(); - xmppAdminAccountJID = xmppAdminUsername + "@" + xmppServerIP; - } - - @Override - public void processIncomingMessage(Message message) throws TransportHandlerException { - try { - String from = message.getFrom(); - String inboundMessage = message.getBody(); - int indexOfSlash = from.indexOf("/"); - if (indexOfSlash == 0) { - if (log.isDebugEnabled()) { - log.debug("Required resource not available."); - } - } else { - String resource = from.substring(indexOfSlash + 1, from.length()); - if ((inboundMessage != null) && (resource.equals(DroneConstants.MESSAGE_RESOURCE))) { - messageTransformer.messageTranslater(inboundMessage); - } else { - if (log.isDebugEnabled()) { - log.debug("Message is empty or it is not belongs to " + xmppAdminUsername); - } - } - } - } catch (ArrayIndexOutOfBoundsException e) { - log.error("Wrong message format: input message", e); - } catch (RuntimeException e) { - log.error("Unexpected error has been occurred, ", e); - } - } - - @Override - public void publishDeviceData(String... publishData) throws TransportHandlerException { - String xmppJID = publishData[0]; - String xmppMessage = publishData[1]; - String xmppSubject = publishData[2]; - sendXMPPMessage(xmppJID, xmppMessage, xmppSubject); - } - - public void disconnect() { - Runnable stopConnection = new Runnable() { - public void run() { - while (isConnected()) { - connectorServiceHandler.cancel(true); - closeConnection(); - if (log.isDebugEnabled()) { - log.warn("Unable to 'STOP' connection to XMPP server at: " + server + - " for user - " + xmppAdminUsername); - } - try { - Thread.sleep(timeoutInterval); - } catch (InterruptedException e1) { - log.error("XMPP-Terminator: Thread Sleep Interrupt Exception for " - + DroneConstants.DEVICE_TYPE + " type.", e1); - } - } - } - }; - Thread terminatorThread = new Thread(stopConnection); - terminatorThread.setDaemon(true); - terminatorThread.start(); - } - - @Override - public void processIncomingMessage() throws TransportHandlerException { - - } - - @Override - public void processIncomingMessage(Message message, String... messageParams) throws TransportHandlerException { - - } - - @Override - public void publishDeviceData() throws TransportHandlerException { - - } - - @Override - public void publishDeviceData(Message publishData) throws TransportHandlerException { - - } -} diff --git a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/trasformer/MessageTransformer.java b/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/trasformer/MessageTransformer.java deleted file mode 100644 index b3faf361..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/trasformer/MessageTransformer.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.api.trasformer; - - -import org.apache.commons.collections4.queue.CircularFifoQueue; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.JsonProcessingException; -import org.codehaus.jackson.map.ObjectMapper; -import org.homeautomation.droneanalyzer.plugin.constants.DroneConstants; -import org.homeautomation.droneanalyzer.plugin.constants.MessageConfig; - -import java.io.IOException; - - -public class MessageTransformer { - - private Log log = LogFactory.getLog(MessageTransformer.class); - private CircularFifoQueue sharedQueue; - - private String outboundMessageFormatForSimulator = "{\"quatanium_val\":[%f, %f, %f, %f]," + - "\"basicParam\":{\"velocity\":[%f, %f, %f], \"global_location\":[%f, %f, %f]},\"battery_level\":%f, \"device_type\":\"SIMULATOR\"}"; - private String outboundMessageFormatForIrisDrone = "{\"quatanium_val\":[%f, %f, %f]," + - "\"basicParam\":{\"velocity\":[%f, %f, %f], \"global_location\":[%f, %f, %f]},\"battery_level\":%f," + - "\"device_type\":\"IRIS_DRONE\"}"; - - public MessageTransformer(){ - sharedQueue = new CircularFifoQueue(DroneConstants.MAXIMUM_BUFFERE_SIZE_OF_SHARED_QUEUE); - } - - private void messageTranslaterForSimulator(JsonNode inbound_message){ - JsonNode node = inbound_message; - String outboundMessage; - try { - JsonNode velocity = node.get(MessageConfig.OUT_BASIC_PARAM_VAL).get(MessageConfig.OUT_BASIC_PARAM_VELOCITY); - JsonNode globalLocation = node.get(MessageConfig.OUT_BASIC_PARAM_VAL).get( - MessageConfig.OUT_BASIC_PARAM_GLOBAL_LOCATION); - JsonNode quataniumVals = node.get(MessageConfig.OUT_QUATANNIM_VAL); - JsonNode batteryLevel = node.get(MessageConfig.OUT_BATTERY_LEVEL); - outboundMessage = String.format(outboundMessageFormatForSimulator, sTd(quataniumVals.get(0)), - sTd(quataniumVals.get(1)), sTd(quataniumVals.get(2)), sTd(quataniumVals.get(0)), - sTd(velocity.get(0)), sTd(velocity.get(1)), sTd(velocity.get(2)), sTd(globalLocation.get(0)), - sTd(globalLocation.get(1)), sTd(globalLocation.get(2)), sTd(batteryLevel)); - sharedQueue.add(outboundMessage); - } catch (Exception e) { - log.error(e.getMessage()+",\n"+ e); - } - } - - private void messageTranslaterForIRISDrone(JsonNode inbound_message){ - JsonNode node = inbound_message; - String outboundMessage; - try { - - JsonNode velocity = node.get(MessageConfig.OUT_BASIC_PARAM_VAL).get(MessageConfig.OUT_BASIC_PARAM_VELOCITY); - JsonNode globalLocation = node.get(MessageConfig.OUT_BASIC_PARAM_VAL).get( - MessageConfig.OUT_BASIC_PARAM_GLOBAL_LOCATION); - JsonNode quataniumVals = node.get(MessageConfig.OUT_QUATANNIM_VAL); - JsonNode batteryLevel = node.get(MessageConfig.OUT_BATTERY_LEVEL); - outboundMessage = String.format(outboundMessageFormatForIrisDrone, sTd(quataniumVals.get(0)), - sTd(quataniumVals.get(1)), sTd(quataniumVals.get(2)), sTd(velocity.get(0)), - sTd(velocity.get(1)), sTd(velocity.get(2)), sTd(globalLocation.get(0)), - sTd(globalLocation.get(1)), sTd(globalLocation.get(2)), sTd(batteryLevel)); - sharedQueue.add(outboundMessage); - - }catch (Exception e) { - log.error(e.getMessage()+",\n"+ e); - } - } - - public void messageTranslater(String inbound_message){ - JsonNode actualMessage; - ObjectMapper objectMapper = new ObjectMapper(); - try { - actualMessage = objectMapper.readValue(inbound_message, JsonNode.class); - JsonNode deviceType = actualMessage.get(MessageConfig.IN_DEVICE_TYPE); - switch (deviceType.getTextValue()) { - case MessageConfig.IN_IRIS_DRONE: - messageTranslaterForIRISDrone(actualMessage); - break; - case MessageConfig.IN_SIMULATOR: - messageTranslaterForSimulator(actualMessage); - break; - default: - if(log.isDebugEnabled()){ - log.debug("Wrong message format"); - } - } - } catch (JsonProcessingException e) { - log.error("Incoming message might be corrupted, "+ e); - } catch (IOException e) { - log.error(e.getMessage(), e); - } - } - - private double sTd(JsonNode s) - { - return Double.parseDouble(s.toString()); - } - - public String getMessage() { - try{ - if(sharedQueue.isEmpty() || sharedQueue == null){ - return ""; - } - return sharedQueue.remove(); - }catch(Exception e) { - log.error("There is no more messages to send or internal server error has been occurred, \n"+ e ); - return ""; - } - } - - public boolean isEmptyQueue(){ - return sharedQueue != null? sharedQueue.isEmpty():false; - } - -} diff --git a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/util/APIUtil.java b/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/util/APIUtil.java deleted file mode 100644 index 6beb52b2..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/util/APIUtil.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.homeautomation.droneanalyzer.api.util; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.apimgt.application.extension.APIManagementProviderService; -import org.wso2.carbon.context.PrivilegedCarbonContext; -import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; - -/** - * This class provides utility functions used by REST-API. - */ -public class APIUtil { - - private static Log log = LogFactory.getLog(APIUtil.class); - - public static String getAuthenticatedUser() { - PrivilegedCarbonContext threadLocalCarbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext(); - String username = threadLocalCarbonContext.getUsername(); - String tenantDomain = threadLocalCarbonContext.getTenantDomain(); - if (username.endsWith(tenantDomain)) { - return username.substring(0, username.lastIndexOf("@")); - } - return username; - } - - public static String getTenantDomainOftheUser() { - PrivilegedCarbonContext threadLocalCarbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext(); - String tenantDomain = threadLocalCarbonContext.getTenantDomain(); - return tenantDomain; - } - - public static DeviceManagementProviderService getDeviceManagementService() { - PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); - DeviceManagementProviderService deviceManagementProviderService = - (DeviceManagementProviderService) ctx.getOSGiService(DeviceManagementProviderService.class, null); - if (deviceManagementProviderService == null) { - String msg = "Device Management service has not initialized."; - log.error(msg); - throw new IllegalStateException(msg); - } - return deviceManagementProviderService; - } - - public static APIManagementProviderService getAPIManagementProviderService() { - PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); - APIManagementProviderService apiManagementProviderService = - (APIManagementProviderService) ctx.getOSGiService(APIManagementProviderService.class, null); - if (apiManagementProviderService == null) { - String msg = "API management provider service has not initialized."; - log.error(msg); - throw new IllegalStateException(msg); - } - return apiManagementProviderService; - } -} diff --git a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/util/DroneAnalyzerServiceUtils.java b/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/util/DroneAnalyzerServiceUtils.java deleted file mode 100644 index 4272a375..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/java/org/homeautomation/droneanalyzer/api/util/DroneAnalyzerServiceUtils.java +++ /dev/null @@ -1,95 +0,0 @@ - -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.api.util; - -import org.apache.commons.logging.LogFactory; -import org.homeautomation.droneanalyzer.api.transport.DroneAnalyzerXMPPConnector; -import org.homeautomation.droneanalyzer.plugin.constants.DroneConstants; -import org.homeautomation.droneanalyzer.plugin.controller.DroneController; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import org.wso2.carbon.device.mgt.iot.controlqueue.xmpp.XmppConfig; -import org.wso2.carbon.device.mgt.iot.transport.TransportHandlerException; - -import java.io.File; - -public class DroneAnalyzerServiceUtils { - - private static org.apache.commons.logging.Log log = LogFactory.getLog(DroneAnalyzerServiceUtils.class); - - public static void sendCommandViaXMPP(String deviceOwner, String deviceId, String resource, - String state, DroneAnalyzerXMPPConnector droneXMPPConnector) - throws DeviceManagementException, TransportHandlerException { - - String xmppServerDomain = XmppConfig.getInstance().getXmppEndpoint(); - int indexOfChar = xmppServerDomain.lastIndexOf(File.separator); - if (indexOfChar != -1) { - xmppServerDomain = xmppServerDomain.substring((indexOfChar + 1), xmppServerDomain.length()); - } - indexOfChar = xmppServerDomain.indexOf(":"); - if (indexOfChar != -1) { - xmppServerDomain = xmppServerDomain.substring(0, indexOfChar); - } - String clientToConnect = deviceId + "@" + xmppServerDomain + File.separator + deviceOwner; - String message = resource.replace("/", "") + ":" + state; - droneXMPPConnector.publishDeviceData(clientToConnect, message, "CONTROL-REQUEST"); - } - - public static boolean sendControlCommand(DroneController controller, String deviceId, String action, - double speed, double duration) - throws DeviceManagementException { - boolean controlState = false; - try{ - switch (action){ - case DroneConstants.TAKE_OFF: - controlState = controller.takeoff(); - break; - case DroneConstants.LAND: - controlState = controller.land(); - break; - case DroneConstants.BACK: - controlState = controller.back(speed, duration); - break; - case DroneConstants.CLOCK_WISE: - controlState = controller.clockwise(speed, duration); - break; - case DroneConstants.COUNTER_CLOCKWISE: - controlState = controller.conterClockwise(speed, duration); - break; - case DroneConstants.DOWN: - controlState = controller.down(speed, duration); - break; - case DroneConstants.FRONT: - controlState = controller.back(speed, duration); - break; - case DroneConstants.FORWARD: - controlState = controller.clockwise(speed, duration); - break; - case DroneConstants.UP: - controlState = controller.up(speed, duration); - break; - default: - log.error("Invalid command"); - break; - } - }catch(Exception e){ - log.error(e.getMessage()+ "\n"+ e); - } - return controlState; - } -} diff --git a/modules/samples/droneanalyzer/component/api/src/main/webapp/META-INF/permissions.xml b/modules/samples/droneanalyzer/component/api/src/main/webapp/META-INF/permissions.xml deleted file mode 100644 index 65670d7c..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/webapp/META-INF/permissions.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - Get device - /device-mgt/user/devices/list - /devices/* - GET - drone_analyzer_user - - - Remove device - /device-mgt/user/devices/remove - /devices/* - DELETE - drone_analyzer_user - - - Download device - /device-mgt/user/devices/add - /devices/*/download - GET - drone_analyzer_user - - - Update device - /device-mgt/user/devices/update - /devices/* - POST - drone_analyzer_user - - - Get Devices - /device-mgt/user/devices - /devices - GET - drone_analyzer_user - - - Generate Link - /device-mgt/user/devices/generate_link - /devices/*/generate_link - GET - drone_analyzer_user - - - Register Device - /device-mgt/user/device/register - /device/register/*/*/* - POST - drone_analyzer_device - - - Send Command - /device-mgt/user/device/send_command - /device/*/send_command - POST - drone_analyzer_user - - - diff --git a/modules/samples/droneanalyzer/component/api/src/main/webapp/META-INF/webapp-classloading.xml b/modules/samples/droneanalyzer/component/api/src/main/webapp/META-INF/webapp-classloading.xml deleted file mode 100644 index fa446191..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/webapp/META-INF/webapp-classloading.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - false - - - CXF,Carbon - diff --git a/modules/samples/droneanalyzer/component/api/src/main/webapp/WEB-INF/cxf-servlet.xml b/modules/samples/droneanalyzer/component/api/src/main/webapp/WEB-INF/cxf-servlet.xml deleted file mode 100644 index 0115a898..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/webapp/WEB-INF/cxf-servlet.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/samples/droneanalyzer/component/api/src/main/webapp/WEB-INF/web.xml b/modules/samples/droneanalyzer/component/api/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 2a9646df..00000000 --- a/modules/samples/droneanalyzer/component/api/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - WSO2 IoT Server - WSO2 IoT Server - - CXFServlet - org.apache.cxf.transport.servlet.CXFServlet - 1 - - - CXFServlet - /* - - - - isAdminService - false - - - doAuthentication - false - - - - - managed-api-enabled - true - - - managed-api-owner - admin - - - managed-api-context-template - /drone_analyzer/{version} - - - managed-api-application - drone_analyzer - - - managed-api-isSecured - true - - diff --git a/modules/samples/droneanalyzer/component/plugin/pom.xml b/modules/samples/droneanalyzer/component/plugin/pom.xml deleted file mode 100644 index e6cbaf7e..00000000 --- a/modules/samples/droneanalyzer/component/plugin/pom.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - org.homeautomation - droneanalyzer-component - 2.1.0-SNAPSHOT - ../pom.xml - - - 4.0.0 - 2.1.0-SNAPSHOT - ${groupId}.droneanalyzer.plugin - bundle - ${groupId}.droneanalyzer.plugin for CDMF - http://wso2.org - - - - - org.apache.felix - maven-scr-plugin - - - org.apache.maven.plugins - maven-compiler-plugin - - UTF-8 - ${wso2.maven.compiler.source} - ${wso2.maven.compiler.target} - - - - org.apache.felix - maven-bundle-plugin - ${org.apache.felix.version} - true - - - ${groupId}.droneanalyzer.plugin - ${groupId}.droneanalyzer.plugin - 2.1.0-SNAPSHOT - IoT Server Impl Bundle - org.homeautomation.droneanalyzer.plugin.internal - - org.osgi.framework, - org.osgi.service.component, - org.apache.commons.logging, - javax.naming;resolution:=optional, - javax.sql;resolution:=optional, - org.wso2.carbon.device.mgt.common.*, - org.wso2.carbon.device.mgt.common, - org.wso2.carbon.device.mgt.iot.*, - org.wso2.carbon.device.mgt.extensions.feature.mgt.*, - org.wso2.carbon.utils.* - - - !org.homeautomation.droneanalyzer.plugin.internal, - org.homeautomation.droneanalyzer.plugin.* - - - - - - - - - - org.eclipse.osgi - org.eclipse.osgi - - - org.eclipse.osgi - org.eclipse.osgi.services - - - org.wso2.carbon - org.wso2.carbon.logging - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.common - - - org.wso2.carbon - org.wso2.carbon.ndatasource.core - - - org.wso2.carbon.devicemgt-plugins - org.wso2.carbon.device.mgt.iot - - - org.wso2.carbon - org.wso2.carbon.utils - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.extensions - - - - \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/constants/DroneConstants.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/constants/DroneConstants.java deleted file mode 100644 index 43fb1548..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/constants/DroneConstants.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.plugin.constants; - -public class DroneConstants { - - public final static String DEVICE_PLUGIN_DEVICE_NAME = "DEVICE_NAME"; - public final static String DEVICE_PLUGIN_DEVICE_ID = "DRONE_DEVICE_ID"; - public final static String MESSAGE_RESOURCE = "drone_current_status"; - public static final String DEVICE_TYPE = "drone_analyzer"; - public static final int MINIMUM_TIME_DURATION = 150; - public static final int MAXIMUM_BUFFERE_SIZE_OF_SHARED_QUEUE = 10; - public static final String DEVICE_ID = "drone_type1"; - public final static String TAKE_OFF = "takeoff"; - public final static String LAND = "land"; - public final static String UP = "up"; - public final static String DOWN = "down"; - public final static String BACK = "back"; - public final static String FORWARD = "forward"; - public final static String FRONT = "front"; - public final static String CLOCK_WISE = "clockwise"; - public final static String COUNTER_CLOCKWISE = "counterClockwise"; - public static final String DATA_SOURCE_NAME = "jdbc/DroneAnalyzerDM_DB"; - -} diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/constants/MessageConfig.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/constants/MessageConfig.java deleted file mode 100644 index 314c0815..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/constants/MessageConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.plugin.constants; - -public class MessageConfig { - - public static final String IN_QUATANNIM_VAL = "quatanium_val"; - public static final String IN_DEVICE_TYPE = "device_type"; - public static final String IN_IRIS_DRONE = "IRIS_DRONE"; - public static final String IN_SIMULATOR = "SIMULATOR"; - public static final String OUT_QUATANNIM_VAL = "quatanium_val"; - public static final String IN_ACCELETOMETER_VAL = "accelerometer"; - public static final String OUT_ACCELETOMETER_VAL = "accelerometer"; - public static final String IN_GYROSCOPE_VAL = "gyroscope"; - public static final String OUT_GYROSCOPE_VAL = "gyroscope"; - public static final String IN_MAGNETOMETER_VAL = "magnetometer"; - public static final String OUT_MAGNETOMETER_VAL = "magnetometer"; - public static final String IN_BASIC_PARAM_VAL = "basicParam"; - public static final String OUT_BASIC_PARAM_VAL = "basicParam"; - public static final String OUT_BASIC_PARAM_VELOCITY = "velocity"; - public static final String OUT_BASIC_PARAM_GLOBAL_LOCATION = "global_location"; - public static final String OUT_BATTERY_LEVEL = "battery_level"; - -} diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/controller/DroneController.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/controller/DroneController.java deleted file mode 100644 index 2d346255..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/controller/DroneController.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.plugin.controller; - -public interface DroneController { - - boolean takeoff(); - boolean land(); - boolean up(double speed, double duration); - boolean down(double speed, double duration); - boolean left(double speed, double duration); - boolean right(double speed, double duration); - boolean front(double speed, double duration); - boolean back(double speed, double duration); - boolean clockwise(double speed, double duration); - boolean conterClockwise(double speed, double duration); - -} diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/controller/impl/DroneControllerImpl.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/controller/impl/DroneControllerImpl.java deleted file mode 100644 index ba0af2cb..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/controller/impl/DroneControllerImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.plugin.controller.impl; - - -import org.homeautomation.droneanalyzer.plugin.controller.DroneController; - -public class DroneControllerImpl implements DroneController { - - @Override - public boolean takeoff() { - return false; - } - - @Override - public boolean land() { - return false; - } - - @Override - public boolean up(double speed, double duration) { - return false; - } - - @Override - public boolean down(double speed, double duration) { - return false; - } - - @Override - public boolean left(double speed, double duration) { - return false; - } - - @Override - public boolean right(double speed, double duration) { - return false; - } - - @Override - public boolean front(double speed, double duration) { - return false; - } - - @Override - public boolean back(double speed, double duration) { - return false; - } - - @Override - public boolean clockwise(double speed, double duration) { - return false; - } - - @Override - public boolean conterClockwise(double speed, double duration) { - return false; - } -} diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/exception/DroneAnalyzerDeviceMgtPluginException.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/exception/DroneAnalyzerDeviceMgtPluginException.java deleted file mode 100644 index e5c9f0c3..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/exception/DroneAnalyzerDeviceMgtPluginException.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.plugin.exception; - - -public class DroneAnalyzerDeviceMgtPluginException extends Exception{ - - private String errorMessage; - - public String getErrorMessage() { - return errorMessage; - } - - public void setErrorMessage(String errorMessage) { - this.errorMessage = errorMessage; - } - - public DroneAnalyzerDeviceMgtPluginException(String msg, Exception nestedEx) { - super(msg, nestedEx); - setErrorMessage(msg); - } - - public DroneAnalyzerDeviceMgtPluginException(String message, Throwable cause) { - super(message, cause); - setErrorMessage(message); - } - - public DroneAnalyzerDeviceMgtPluginException(String msg) { - super(msg); - setErrorMessage(msg); - } - - public DroneAnalyzerDeviceMgtPluginException() { - super(); - } - - public DroneAnalyzerDeviceMgtPluginException(Throwable cause) { - super(cause); - } - -} diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/DroneAnalyzerManager.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/DroneAnalyzerManager.java deleted file mode 100644 index 32aec36a..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/DroneAnalyzerManager.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.plugin.impl; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.homeautomation.droneanalyzer.plugin.exception.DroneAnalyzerDeviceMgtPluginException; -import org.homeautomation.droneanalyzer.plugin.impl.dao.DroneAnalyzerDAO; -import org.homeautomation.droneanalyzer.plugin.impl.feature.DroneAnalyzerFeatureManager; -import org.wso2.carbon.device.mgt.common.Device; -import org.wso2.carbon.device.mgt.common.DeviceIdentifier; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import org.wso2.carbon.device.mgt.common.DeviceManager; -import org.wso2.carbon.device.mgt.common.EnrolmentInfo; -import org.wso2.carbon.device.mgt.common.FeatureManager; -import org.wso2.carbon.device.mgt.common.configuration.mgt.TenantConfiguration; -import org.wso2.carbon.device.mgt.common.license.mgt.License; -import org.wso2.carbon.device.mgt.common.license.mgt.LicenseManagementException; -import java.util.List; - -/** - * This represents the Drone Analyzer service implementation of DeviceManagerService. - */ -public class DroneAnalyzerManager implements DeviceManager { - - private static final DroneAnalyzerDAO droneAnalyzerDAO = new DroneAnalyzerDAO(); - private static final Log log = LogFactory.getLog(DroneAnalyzerManager.class); - private FeatureManager droneFeatureManager = new DroneAnalyzerFeatureManager(); - @Override - public FeatureManager getFeatureManager() { - return droneFeatureManager; - } - - @Override - public boolean saveConfiguration(TenantConfiguration tenantConfiguration) - throws DeviceManagementException { - //TODO implement this - return false; - } - - @Override - public TenantConfiguration getConfiguration() throws DeviceManagementException { - //TODO implement this - return null; - } - - @Override - public boolean enrollDevice(Device device) throws DeviceManagementException { - boolean status; - try { - if (log.isDebugEnabled()) { - log.debug("Enrolling a new drone device : " + device.getDeviceIdentifier()); - } - DroneAnalyzerDAO.beginTransaction(); - status = droneAnalyzerDAO.getDeviceDAO().addDevice(device); - DroneAnalyzerDAO.commitTransaction(); - } catch (DroneAnalyzerDeviceMgtPluginException e) { - try { - DroneAnalyzerDAO.rollbackTransaction(); - } catch (DroneAnalyzerDeviceMgtPluginException iotDAOEx) { - String msg = "Error occurred while roll back the device enrol transaction :" + device.toString(); - log.warn(msg, iotDAOEx); - } - String msg = "Error while enrolling the drone device : " + device.getDeviceIdentifier(); - log.error(msg, e); - throw new DeviceManagementException(msg, e); - } - return status; - } - - @Override - public boolean modifyEnrollment(Device device) throws DeviceManagementException { - boolean status; - try { - if (log.isDebugEnabled()) { - log.debug("Modifying the Virtual Firealarm device enrollment data"); - } - DroneAnalyzerDAO.beginTransaction(); - status = droneAnalyzerDAO.getDeviceDAO().updateDevice(device); - DroneAnalyzerDAO.commitTransaction(); - } catch (DroneAnalyzerDeviceMgtPluginException e) { - try { - DroneAnalyzerDAO.rollbackTransaction(); - } catch (DroneAnalyzerDeviceMgtPluginException iotDAOEx) { - String msg = "Error occurred while roll back the update device transaction :" + device.toString(); - log.warn(msg, iotDAOEx); - } - String msg = "Error while updating the enrollment of the drone device : " + - device.getDeviceIdentifier(); - log.error(msg, e); - throw new DeviceManagementException(msg, e); - } - return status; - } - - @Override - public boolean disenrollDevice(DeviceIdentifier deviceId) throws DeviceManagementException { - boolean status; - try { - if (log.isDebugEnabled()) { - log.debug("Dis-enrolling drone device : " + deviceId); - } - DroneAnalyzerDAO.beginTransaction(); - status = droneAnalyzerDAO.getDeviceDAO().deleteIotDevice(deviceId.getId()); - DroneAnalyzerDAO.commitTransaction(); - } catch (DroneAnalyzerDeviceMgtPluginException e) { - try { - DroneAnalyzerDAO.rollbackTransaction(); - } catch (DroneAnalyzerDeviceMgtPluginException iotDAOEx) { - String msg = "Error occurred while roll back the device dis enrol transaction :" + deviceId.toString(); - log.warn(msg, iotDAOEx); - } - String msg = "Error while removing the drone device : " + deviceId.getId(); - log.error(msg, e); - throw new DeviceManagementException(msg, e); - } - return status; - } - - @Override - public boolean isEnrolled(DeviceIdentifier deviceId) throws DeviceManagementException { - boolean isEnrolled = false; - try { - if (log.isDebugEnabled()) { - log.debug("Checking the enrollment of Drone device : " + deviceId.getId()); - } - Device iotDevice = droneAnalyzerDAO.getDeviceDAO().getDevice(deviceId.getId()); - if (iotDevice != null) { - isEnrolled = true; - } - } catch (DroneAnalyzerDeviceMgtPluginException e) { - String msg = "Error while checking the enrollment status of Drone device : " + - deviceId.getId(); - log.error(msg, e); - throw new DeviceManagementException(msg, e); - } - return isEnrolled; - } - - @Override - public boolean isActive(DeviceIdentifier deviceId) throws DeviceManagementException { - return true; - } - - @Override - public boolean setActive(DeviceIdentifier deviceId, boolean status) - throws DeviceManagementException { - return true; - } - - @Override - public Device getDevice(DeviceIdentifier deviceId) throws DeviceManagementException { - Device device; - try { - if (log.isDebugEnabled()) { - log.debug("Getting the details of Drone device : " + deviceId.getId()); - } - device = droneAnalyzerDAO.getDeviceDAO().getDevice(deviceId.getId()); - } catch (DroneAnalyzerDeviceMgtPluginException e) { - String msg = "Error while fetching the Drone device : " + deviceId.getId(); - log.error(msg, e); - throw new DeviceManagementException(msg, e); - } - return device; - } - - @Override - public boolean setOwnership(DeviceIdentifier deviceId, String ownershipType) - throws DeviceManagementException { - return true; - } - - public boolean isClaimable(DeviceIdentifier deviceIdentifier) throws DeviceManagementException { - return false; - } - - @Override - public boolean setStatus(DeviceIdentifier deviceId, String currentOwner, - EnrolmentInfo.Status status) throws DeviceManagementException { - return false; - } - - @Override - public License getLicense(String s) throws LicenseManagementException { - return null; - } - - @Override - public void addLicense(License license) throws LicenseManagementException { - - } - - @Override - public boolean updateDeviceInfo(DeviceIdentifier deviceIdentifier, Device device) throws DeviceManagementException { - boolean status; - try { - if (log.isDebugEnabled()) { - log.debug( - "updating the details of Drone device : " + deviceIdentifier); - } - DroneAnalyzerDAO.beginTransaction(); - status = droneAnalyzerDAO.getDeviceDAO().updateDevice(device); - DroneAnalyzerDAO.commitTransaction(); - } catch (DroneAnalyzerDeviceMgtPluginException e) { - try { - DroneAnalyzerDAO.rollbackTransaction(); - } catch (DroneAnalyzerDeviceMgtPluginException iotDAOEx) { - String msg = "Error occurred while roll back the update device info transaction :" + device.toString(); - log.warn(msg, iotDAOEx); - } - String msg = - "Error while updating the Drone device : " + deviceIdentifier; - log.error(msg, e); - throw new DeviceManagementException(msg, e); - } - return status; - } - - @Override - public List getAllDevices() throws DeviceManagementException { - List devices = null; - try { - if (log.isDebugEnabled()) { - log.debug("Fetching the details of all Drone devices"); - } - devices = droneAnalyzerDAO.getDeviceDAO().getAllDevices(); - } catch (DroneAnalyzerDeviceMgtPluginException e) { - String msg = "Error while fetching all Drone devices."; - log.error(msg, e); - throw new DeviceManagementException(msg, e); - } - return devices; - } - - @Override - public boolean requireDeviceAuthorization() { - return true; - } - -} diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/DroneAnalyzerManagerService.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/DroneAnalyzerManagerService.java deleted file mode 100644 index 42e0a02c..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/DroneAnalyzerManagerService.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.plugin.impl; - -import org.homeautomation.droneanalyzer.plugin.constants.DroneConstants; -import org.wso2.carbon.device.mgt.common.DeviceIdentifier; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import org.wso2.carbon.device.mgt.common.DeviceManager; -import org.wso2.carbon.device.mgt.common.app.mgt.Application; -import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException; -import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManager; -import org.wso2.carbon.device.mgt.common.operation.mgt.Operation; -import org.wso2.carbon.device.mgt.common.spi.DeviceManagementService; -import java.util.List; - -public class DroneAnalyzerManagerService implements DeviceManagementService { - private DeviceManager deviceManager; - private final static String DEVICE_TYPE_PROVIDER_DOMAIN = "carbon.super"; - - @Override - public String getType() { - return DroneConstants.DEVICE_TYPE; - } - - @Override - public void init() throws DeviceManagementException { - this.deviceManager = new DroneAnalyzerManager(); - } - - @Override - public DeviceManager getDeviceManager() { - return deviceManager; - } - - @Override - public ApplicationManager getApplicationManager() { - return null; - } - - @Override - public void notifyOperationToDevices(Operation operation, List list) - throws DeviceManagementException { - - } - - @Override - public Application[] getApplications(String s, int i, int i1) throws ApplicationManagementException { - return new Application[0]; - } - - @Override - public void updateApplicationStatus(DeviceIdentifier deviceIdentifier, Application application, String s) - throws ApplicationManagementException { - - } - - @Override - public String getApplicationStatus(DeviceIdentifier deviceIdentifier, Application application) - throws ApplicationManagementException { - return null; - } - - @Override - public void installApplicationForDevices(Operation operation, List list) - throws ApplicationManagementException { - - } - - @Override - public void installApplicationForUsers(Operation operation, List list) - throws ApplicationManagementException { - - } - - @Override - public void installApplicationForUserRoles(Operation operation, List list) - throws ApplicationManagementException { - - } - - @Override - public String getProviderTenantDomain() { - return DEVICE_TYPE_PROVIDER_DOMAIN; - } - - @Override - public boolean isSharedWithAllTenants() { - return true; - } - -} diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/dao/DroneAnalyzerDAO.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/dao/DroneAnalyzerDAO.java deleted file mode 100644 index 44ed89ef..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/dao/DroneAnalyzerDAO.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.plugin.impl.dao; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.homeautomation.droneanalyzer.plugin.constants.DroneConstants; -import org.homeautomation.droneanalyzer.plugin.exception.DroneAnalyzerDeviceMgtPluginException; -import org.homeautomation.droneanalyzer.plugin.impl.dao.impl.DroneAnalyzerDeviceDAOImpl; - -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.SQLException; - - -public class DroneAnalyzerDAO { - - private static final Log log = LogFactory.getLog(DroneAnalyzerDAO.class); - static DataSource dataSource; - private static ThreadLocal currentConnection = new ThreadLocal(); - - public DroneAnalyzerDAO() { - initDroneAnalyzerDAO(); - } - - public static void initDroneAnalyzerDAO() { - try { - Context ctx = new InitialContext(); - dataSource = (DataSource) ctx.lookup(DroneConstants.DATA_SOURCE_NAME); - } catch (NamingException e) { - log.error("Error while looking up the data source: " + DroneConstants.DATA_SOURCE_NAME); - } - } - - public DroneAnalyzerDeviceDAOImpl getDeviceDAO() { - return new DroneAnalyzerDeviceDAOImpl(); - } - - public static void beginTransaction() throws DroneAnalyzerDeviceMgtPluginException { - try { - Connection conn = dataSource.getConnection(); - conn.setAutoCommit(false); - currentConnection.set(conn); - } catch (SQLException e) { - throw new DroneAnalyzerDeviceMgtPluginException("Error occurred while retrieving datasource connection", e); - } - } - - public static Connection getConnection() throws DroneAnalyzerDeviceMgtPluginException { - - if (currentConnection != null && currentConnection.get() == null) { - try { - currentConnection.set(dataSource.getConnection()); - } catch (SQLException e) { - throw new DroneAnalyzerDeviceMgtPluginException("Error occurred while retrieving data source connection", e); - } - } - return currentConnection.get(); - } - - public static void commitTransaction() throws DroneAnalyzerDeviceMgtPluginException { - try { - Connection conn = currentConnection.get(); - if (conn != null) { - conn.commit(); - } else { - if (log.isDebugEnabled()) { - log.debug("Datasource connection associated with the current thread is null, hence commit " - + "has not been attempted"); - } - } - } catch (SQLException e) { - throw new DroneAnalyzerDeviceMgtPluginException("Error occurred while committing the transaction", e); - } finally { - closeConnection(); - } - } - - public static void closeConnection() throws DroneAnalyzerDeviceMgtPluginException { - Connection con = currentConnection.get(); - if (con != null) { - try { - con.close(); - } catch (SQLException e) { - log.error("Error occurred while close the connection"); - } - } - currentConnection.remove(); - } - - public static void rollbackTransaction() throws DroneAnalyzerDeviceMgtPluginException { - try { - Connection conn = currentConnection.get(); - if (conn != null) { - conn.rollback(); - } else { - if (log.isDebugEnabled()) { - log.debug("Datasource connection associated with the current thread is null, hence rollback " - + "has not been attempted"); - } - } - } catch (SQLException e) { - throw new DroneAnalyzerDeviceMgtPluginException("Error occurred while rollback the transaction", e); - } finally { - closeConnection(); - } - } -} diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/dao/impl/DroneAnalyzerDeviceDAOImpl.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/dao/impl/DroneAnalyzerDeviceDAOImpl.java deleted file mode 100644 index 08b4f9b1..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/dao/impl/DroneAnalyzerDeviceDAOImpl.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.plugin.impl.dao.impl; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.homeautomation.droneanalyzer.plugin.constants.DroneConstants; -import org.homeautomation.droneanalyzer.plugin.exception.DroneAnalyzerDeviceMgtPluginException; -import org.homeautomation.droneanalyzer.plugin.impl.dao.DroneAnalyzerDAO; -import org.homeautomation.droneanalyzer.plugin.impl.util.DroneAnalyzerUtils; -import org.wso2.carbon.device.mgt.common.Device; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - -/** - * Implements CRUD for drone analyzer. - */ -public class DroneAnalyzerDeviceDAOImpl { - - private static final Log log = LogFactory.getLog(DroneAnalyzerDeviceDAOImpl.class); - - public Device getDevice(String deviceId) throws DroneAnalyzerDeviceMgtPluginException { - Connection conn = null; - PreparedStatement stmt = null; - Device device = null; - ResultSet resultSet = null; - try { - conn = DroneAnalyzerDAO.getConnection(); - if(conn == null){ - log.error("Database connection hasn't been created"); - } - String selectDBQuery = - "SELECT DRONE_DEVICE_ID, DEVICE_NAME FROM DRONE_DEVICE WHERE DRONE_DEVICE_ID = ?"; - stmt = conn.prepareStatement(selectDBQuery); - stmt.setString(1, deviceId); - resultSet = stmt.executeQuery(); - - if (resultSet.next()) { - device = new Device(); - if (log.isDebugEnabled()) { - log.debug("Drone device " + deviceId + " data has been fetched from " + - "Drone database."); - } - } - } catch (SQLException e) { - String msg = "Error occurred while fetching drone device : '" + deviceId + "'"; - log.error(msg, e); - throw new DroneAnalyzerDeviceMgtPluginException(msg, e); - } finally { - DroneAnalyzerUtils.cleanupResources(stmt, resultSet); - DroneAnalyzerDAO.closeConnection(); - } - return device; - } - - public boolean addDevice(Device device) throws DroneAnalyzerDeviceMgtPluginException { - boolean status = false; - Connection conn = null; - PreparedStatement stmt = null; - try { - conn = DroneAnalyzerDAO.getConnection(); - String createDBQuery = - "INSERT INTO DRONE_DEVICE(DRONE_DEVICE_ID, DEVICE_NAME) VALUES (?, ?)"; - stmt = conn.prepareStatement(createDBQuery); - stmt.setString(1, device.getDeviceIdentifier()); - stmt.setString(2, device.getName()); - int rows = stmt.executeUpdate(); - if (rows > 0) { - status = true; - if (log.isDebugEnabled()) { - log.debug("drone device " + device.getDeviceIdentifier() + " data has been" + - " added to the drone database."); - } - } - } catch (SQLException e) { - String msg = "Error occurred while adding the drone device '" + - device.getDeviceIdentifier() + "' to the drone db."; - log.error(msg, e); - throw new DroneAnalyzerDeviceMgtPluginException(msg, e); - } finally { - DroneAnalyzerUtils.cleanupResources(stmt, null); - } - return status; - } - - public boolean updateDevice(Device device) throws DroneAnalyzerDeviceMgtPluginException { - boolean status = false; - Connection conn = null; - PreparedStatement stmt = null; - try { - conn = DroneAnalyzerDAO.getConnection(); - String updateDBQuery = - "UPDATE DRONE_DEVICE SET DEVICE_NAME = ? WHERE DRONE_DEVICE_ID = ?"; - stmt = conn.prepareStatement(updateDBQuery); - stmt.setString(1, device.getName()); - stmt.setString(2, device.getDeviceIdentifier()); - int rows = stmt.executeUpdate(); - if (rows > 0) { - status = true; - if (log.isDebugEnabled()) { - log.debug("Drone device " + device.getDeviceIdentifier() + " data has been" + - " modified."); - } - } - } catch (SQLException e) { - String msg = "Error occurred while modifying the Drone device '" + device.getDeviceIdentifier() + "' data."; - log.error(msg, e); - throw new DroneAnalyzerDeviceMgtPluginException(msg, e); - } finally { - DroneAnalyzerUtils.cleanupResources(stmt, null); - } - return status; - } - - public boolean deleteIotDevice(String iotDeviceId) throws DroneAnalyzerDeviceMgtPluginException { - boolean status = false; - Connection conn = null; - PreparedStatement stmt = null; - try { - conn = DroneAnalyzerDAO.getConnection(); - System.out.println("delete device "); - String deleteDBQuery = - "DELETE FROM DRONE_DEVICE WHERE DRONE_DEVICE_ID = ?"; - stmt = conn.prepareStatement(deleteDBQuery); - stmt.setString(1, iotDeviceId); - int rows = stmt.executeUpdate(); - if (rows > 0) { - status = true; - if (log.isDebugEnabled()) { - log.debug("Drone device " + iotDeviceId + " data has deleted" + - " from the drone database."); - } - } - } catch (SQLException e) { - String msg = "Error occurred while deleting drone device " + iotDeviceId; - log.error(msg, e); - throw new DroneAnalyzerDeviceMgtPluginException(msg, e); - } finally { - DroneAnalyzerUtils.cleanupResources(stmt, null); - } - return status; - } - - public List getAllDevices() throws DroneAnalyzerDeviceMgtPluginException { - Connection conn = null; - PreparedStatement stmt = null; - ResultSet resultSet = null; - Device iotDevice; - List iotDevices = new ArrayList(); - try { - conn = DroneAnalyzerDAO.getConnection(); - String selectDBQuery = - "SELECT DRONE_DEVICE_ID, DEVICE_NAME " + - "FROM DRONE_DEVICE"; - stmt = conn.prepareStatement(selectDBQuery); - resultSet = stmt.executeQuery(); - while (resultSet.next()) { - iotDevice = new Device(); - iotDevice.setDeviceIdentifier(resultSet.getString(DroneConstants.DEVICE_PLUGIN_DEVICE_ID)); - iotDevice.setName(resultSet.getString(DroneConstants.DEVICE_PLUGIN_DEVICE_NAME)); - } - if (log.isDebugEnabled()) { - log.debug("All drone device details have fetched from drone database."); - } - return iotDevices; - } catch (SQLException e) { - String msg = "Error occurred while fetching all drone device data'"; - log.error(msg, e); - throw new DroneAnalyzerDeviceMgtPluginException(msg, e); - } finally { - DroneAnalyzerUtils.cleanupResources(stmt, resultSet); - DroneAnalyzerDAO.closeConnection(); - } - } -} diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/feature/DroneAnalyzerFeatureManager.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/feature/DroneAnalyzerFeatureManager.java deleted file mode 100644 index afcb9ec7..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/feature/DroneAnalyzerFeatureManager.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) 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. - */ -package org.homeautomation.droneanalyzer.plugin.impl.feature; - -import org.homeautomation.droneanalyzer.plugin.constants.DroneConstants; -import org.wso2.carbon.device.mgt.common.DeviceManagementException; -import org.wso2.carbon.device.mgt.common.Feature; -import org.wso2.carbon.device.mgt.common.FeatureManager; -import org.wso2.carbon.device.mgt.extensions.feature.mgt.GenericFeatureManager; - -import java.util.List; - -public class DroneAnalyzerFeatureManager implements FeatureManager { - @Override - public boolean addFeature(Feature feature) throws DeviceManagementException { - return false; - } - - @Override - public boolean addFeatures(List features) throws DeviceManagementException { - return false; - } - - @Override - public Feature getFeature(String name) throws DeviceManagementException { - GenericFeatureManager genericFeatureManager = GenericFeatureManager.getInstance(); - return genericFeatureManager.getFeature(DroneConstants.DEVICE_TYPE, name); - } - - @Override - public List getFeatures() throws DeviceManagementException { - GenericFeatureManager genericFeatureManager = GenericFeatureManager.getInstance(); - return genericFeatureManager.getFeatures(DroneConstants.DEVICE_TYPE); - } - - @Override - public boolean removeFeature(String name) throws DeviceManagementException { - return false; - } - - @Override - public boolean addSupportedFeaturesToDB() throws DeviceManagementException { - return false; - } -} diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/util/DeviceSchemaInitializer.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/util/DeviceSchemaInitializer.java deleted file mode 100644 index bca63d00..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/util/DeviceSchemaInitializer.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.plugin.impl.util; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.utils.CarbonUtils; -import org.wso2.carbon.utils.dbcreator.DatabaseCreator; - -import javax.sql.DataSource; -import java.io.File; - -/** - * Provides methods for initializing the database script. - */ -public class DeviceSchemaInitializer extends DatabaseCreator { - - private static final Log log = LogFactory.getLog(DeviceSchemaInitializer.class); - private static final String setupSQLScriptBaseLocation = CarbonUtils.getCarbonHome() + File.separator + "dbscripts" - + File.separator + "cdm" + File.separator + "plugins" + File.separator; - - public DeviceSchemaInitializer(DataSource dataSource) { - super(dataSource); - } - - @Override - protected String getDbScriptLocation(String databaseType) { - String scriptName = databaseType + ".sql"; - if (log.isDebugEnabled()) { - log.debug("Loading database script from :" + scriptName); - } - return setupSQLScriptBaseLocation.replaceFirst("DBTYPE", databaseType) + scriptName; - } -} diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/util/DroneAnalyzerUtils.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/util/DroneAnalyzerUtils.java deleted file mode 100644 index eb8bd81c..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/impl/util/DroneAnalyzerUtils.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.plugin.impl.util; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.homeautomation.droneanalyzer.plugin.constants.DroneConstants; -import org.homeautomation.droneanalyzer.plugin.exception.DroneAnalyzerDeviceMgtPluginException; -import org.wso2.carbon.device.mgt.common.Device; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -/** - * Contains utility methods used by Drone Analyzer plugin. - */ -public class DroneAnalyzerUtils { - private static Log log = LogFactory.getLog(DroneAnalyzerUtils.class); - - public static String getDeviceProperty(List deviceProperties, String propertyKey) { - String deviceProperty = ""; - for(Device.Property property :deviceProperties){ - if(propertyKey.equals(property.getName())){ - deviceProperty = property.getValue(); - } - } - return deviceProperty; - } - - public static Device.Property getProperty(String property, String value) { - if (property != null) { - Device.Property prop = new Device.Property(); - prop.setName(property); - prop.setValue(value); - return prop; - } - return null; - } - - public static void cleanupResources(Connection conn, PreparedStatement stmt, ResultSet rs) { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - log.warn("Error occurred while closing result set", e); - } - } - if (stmt != null) { - try { - stmt.close(); - } catch (SQLException e) { - log.warn("Error occurred while closing prepared statement", e); - } - } - if (conn != null) { - try { - conn.close(); - } catch (SQLException e) { - log.warn("Error occurred while closing database connection", e); - } - } - } - - public static void cleanupResources(PreparedStatement stmt, ResultSet rs) { - cleanupResources(null, stmt, rs); - } - - /** - * Creates the device management schema. - */ - public static void setupDeviceManagementSchema() throws DroneAnalyzerDeviceMgtPluginException { - try { - Context ctx = new InitialContext(); - DataSource dataSource = (DataSource) ctx.lookup(DroneConstants.DATA_SOURCE_NAME); - DeviceSchemaInitializer initializer = - new DeviceSchemaInitializer(dataSource); - log.info("Initializing device management repository database schema"); - initializer.createRegistryDatabase(); - - } catch (NamingException e) { - log.error("Error while looking up the data source: " + DroneConstants.DATA_SOURCE_NAME); - } catch (Exception e) { - throw new DroneAnalyzerDeviceMgtPluginException("Error occurred while initializing Iot Device " + - "Management database schema", e); - } - } - -} diff --git a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/internal/DroneAnalyzerManagementServiceComponent.java b/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/internal/DroneAnalyzerManagementServiceComponent.java deleted file mode 100644 index 2d73f359..00000000 --- a/modules/samples/droneanalyzer/component/plugin/src/main/java/org/homeautomation/droneanalyzer/plugin/internal/DroneAnalyzerManagementServiceComponent.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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.homeautomation.droneanalyzer.plugin.internal; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.homeautomation.droneanalyzer.plugin.impl.DroneAnalyzerManagerService; -import org.homeautomation.droneanalyzer.plugin.impl.util.DroneAnalyzerUtils; -import org.homeautomation.droneanalyzer.plugin.exception.DroneAnalyzerDeviceMgtPluginException; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceRegistration; -import org.osgi.service.component.ComponentContext; -import org.wso2.carbon.device.mgt.common.spi.DeviceManagementService; - -/** - * @scr.component name="org.homeautomation.droneanalyzer.plugin.DroneAnalyzerManagementServiceComponent - * immediate="true" - */ -public class DroneAnalyzerManagementServiceComponent { - private ServiceRegistration firealarmServiceRegRef; - - private static final Log log = LogFactory.getLog( - DroneAnalyzerManagementServiceComponent.class); - - protected void activate(ComponentContext ctx) { - if (log.isDebugEnabled()) { - log.debug("Activating Drone Analyzer Management Service Component"); - } - try { - BundleContext bundleContext = ctx.getBundleContext(); - firealarmServiceRegRef = - bundleContext.registerService(DeviceManagementService.class.getName(), - new DroneAnalyzerManagerService(), null); - String setupOption = System.getProperty("setup"); - if (setupOption != null) { - if (log.isDebugEnabled()) { - log.debug( - "-Dsetup is enabled. Iot Device management repository schema initialization is about " + - "to begin"); - } - try { - DroneAnalyzerUtils.setupDeviceManagementSchema(); - } catch (DroneAnalyzerDeviceMgtPluginException e) { - log.error("Exception occurred while initializing device management database schema", e); - } - } - if (log.isDebugEnabled()) { - log.debug( - "Drone Analyzer Device Management Service Component has been successfully activated"); - } - } catch (Throwable e) { - log.error("Error occurred while activating Drone Analyzer Device Management Service Component", e); - } - } - - protected void deactivate(ComponentContext ctx) { - if (log.isDebugEnabled()) { - log.debug("De-activating Drone Analyzer Device Management Service Component"); - } - try { - if (firealarmServiceRegRef != null) { - firealarmServiceRegRef.unregister(); - } - if (log.isDebugEnabled()) { - log.debug("Drone Analyzer Device Management Service Component has been successfully de-activated"); - } - } catch (Throwable e) { - log.error( - "Error occurred while de-activating Drone Analyzer Device Management bundle",e); - } - } - -} diff --git a/modules/samples/droneanalyzer/component/pom.xml b/modules/samples/droneanalyzer/component/pom.xml deleted file mode 100644 index e6d1141b..00000000 --- a/modules/samples/droneanalyzer/component/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - org.homeautomation - droneanalyzer - 2.1.0-SNAPSHOT - ../pom.xml - - 4.0.0 - 2.1.0-SNAPSHOT - droneanalyzer-component - WSO2 IoTS(Device Types) - Drone Analyzer Component - pom - - - - - org.apache.felix - maven-scr-plugin - ${maven-scr-plugin.version} - - - generate-scr-scrdescriptor - - scr - - - - - - - - - - plugin - api - ui - - - diff --git a/modules/samples/droneanalyzer/component/ui/pom.xml b/modules/samples/droneanalyzer/component/ui/pom.xml deleted file mode 100644 index a5b25ed6..00000000 --- a/modules/samples/droneanalyzer/component/ui/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - org.homeautomation - droneanalyzer-component - 2.1.0-SNAPSHOT - ../pom.xml - - - 4.0.0 - 2.1.0-SNAPSHOT - ${groupId}.droneanalyzer.ui - ${groupId}.droneanalyzer.ui - pom - http://wso2.org - - - - - maven-assembly-plugin - 2.5.5 - - ${project.artifactId}-${carbon.device.mgt.version} - false - - src/assembly/src.xml - - - - - create-archive - package - - single - - - - - - - - \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/assembly/src.xml b/modules/samples/droneanalyzer/component/ui/src/assembly/src.xml deleted file mode 100644 index 2797034e..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/assembly/src.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - src - - zip - - false - ${basedir}/src - - - ${basedir}/src/main/resources/jaggeryapps/devicemgt - / - true - - - \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.hbs b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.hbs deleted file mode 100644 index 1d32daed..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.hbs +++ /dev/null @@ -1,52 +0,0 @@ -{{#zone "device-thumbnail"}} - -{{/zone}} -{{#zone "device-opetations"}} -
- {{unit "iot.unit.device.operation-bar" device=device}} -
-
-
Device Statistics
- {{unit "iot.unit.device.droneanalyzer.statistics" device=device}} -
- -{{/zone}} -{{#zone "device-detail-properties"}} -
-
- -
-
- -
-
-
Operations Log
-
- -
-
- Not available yet -
-
-
-
-
-
-
-
-{{/zone}} \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.js deleted file mode 100644 index 1fcbacc5..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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. - */ -function onRequest(context) { - var log = new Log("device-view.js"); - var deviceType = context.uriParams.deviceType; - var deviceId = request.getParameter("id"); - - if (deviceType != null && deviceType != undefined && deviceId != null && deviceId != undefined) { - var deviceModule = require("/app/modules/device.js").deviceModule; - var device = deviceModule.viewDevice(deviceType, deviceId); - - if (device && device.status != "error") { - return {"device": device}; - } else { - response.sendError(404, "Device Id " + deviceId + "of type " + deviceType + " cannot be found!"); - exit(); - } - } -} diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.json b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.json deleted file mode 100644 index 9eecd8f5..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "version": "1.0.0" -} \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/images/drone-icon.png b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/images/drone-icon.png deleted file mode 100644 index 0c7744ff42d16a9761778c98749aa50ea93e5cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46940 zcmb??WmKHc(&yj=cb5SI!QEX$aCdiicXubq;4XpS?hXkq!QC~u>(2ka_rALy-m@R} z?3^=ap6=`k2m}ZK003F)o47In0HOcS7akH^BPz8e2mZl#mC$rm zaWHrFFmg5nh?qJUn*pWlj4aHQ&5TUFoPL|}0{~D?R;rq=nsTzdCJuItM*p;7^t5vX z_XYs?g*+XNOl-_tfyQPQR`vqq7acw1Kr2%Lat#hSW;sVOGfS&)-p*z!-twv@-ZmyY zrsP6`Kz>hNFabL=S0kXOovpnKucrX{zv%LUpZ}?5A_xAfiK~qO`F{zeDW?b&b8t2T zaxii*m@u=l0J(S=Svc5vSXk(RtjsKIOf1YytUL@XEWGSoyeyo+e}Blq+?-9#d6mV# z{+k!LBtUNI>gveL#N^@O!RW!p=-_O@#KObF!^F(W#LCJ5Zo%Nj|%xVZ|DgC+g1A=o*}$^AEBdzXJt6nM&*JdGTgSQwd^?Cky- z*S}i3xGJ0dZ!!MI)-I}Ej%G~CW-bnH&L-gZVNUU%&fvNGzcc!$Ay^t-1!pVpOEIz) zcQA3YGqZP<5*Hu`|HEi%Wy;ILYGlT0#=*wGY|3oLV9vqL%)n!8Y|Ox8&cefK#%^rP z!pZ#~I{#CDaTaEAW-ew?5e_c!JCNYu=8+JS5M%x-!o|wPA|@*GpT1J|F0MxQCT9QP zZ3X82@4h1c*S@@B&Splg4$i6$4z~Z%0!2#)R|gkM2S=co7?4`S%HGt$!-eLbH}qcv z7B_RYayK*m>g-?#{MQuoTKx~~&CHDc8J{TwvyqWGgBc6E8G|t!Hz$KRm$@-3m$8W% z3ky5>zx$j1zfK(!SSY4{^yL50oBvdSmGPg)|F!~f;lJ(3%pPn!&R{EvBV`%_02+d% z#6?s+SI+d{0x{JvH`YHd`doB9NO$phs})BD=LbSY=RZOfE(z09&u^d&iDH&ecX`A+ zcRg(Q)ck&T(5Y`5qiU0J{v8&3^=sXJw43W?g6rmBqPLU+SBzjL@+&(zeWW=&dm(z9 zWxfanxCWNs|7YPV`*c2-v^W&1uUTL1e!3~%AvswB-?vo(l*y36v$o^3OOOn zoO@ZDcSTb(gHR^}KjaH%T50==cC)&<;k#X*3$fkva%vOuUt+z#IePPMa(2Wy68jw3 z^LI_i6K3;nVP^9Tb~)_(Gl5~FQ3c)cF*&JSO>JR6l5$FZe9uV@s%|c6tILgV&aG~a z3!{14i=V8H&V&Wv8b;S0HX&1DH*wre%-_XrNjXU%^9)_?2IJOxr^lI*MOLLoHB_mY z=3AKN!}UVSsF<)}ilJmtj;%H~x&h)KJd-l@Qc~1Fpd?h`;_e@*r2+)SioqcK(^XJb z_;WkVQ!BJ5uU1AD0LrkuhHlK~{?_@FFw2G@6GE8(+ix#WvYxKKj*`mMe!+>r;>joE z=k^tfkWORr*N`r~SN47M7fZ!o-r`&Z0yGlqkS`90sOhFX6G z&X8^N2{P(4-bcR=W<*T1cm zb-z6@S?6OpE1=i`O_7%#2Djo!h6s%J>a^EYydCXxH`4FC9;a&)t;x~6$X|cS=$SVga9n+II4L`{4_{Bcxl0wgj#c1vTl*4UU^pWU$KUGg`xfXe&$$--F# z=G`XbI0?#B3A5BKCdz#^dd|wi_U5Xp5K;2MzJ=rgBf^tYu*zp<;(4|6YU_ZsGBddO zR)W8P>9-H3ktSrXdz^`y$c)qi;MF2vnIm1k#I1E&cXxdMyJb;Q@X1olSo^*TF3L;7 zY`*DEt?6!EKz9eql9cjMvpudri|{NWDv2x*iO%Ian$T2Tl8Aq9HK#hxigtFNAD3a< zJGYnHRM2n&QQT80_6^QtEXi%Zi-w1SnVX%rdtZ*ERFoCZyc;t1yj$Ev z)wm0TcY9PDtZM({FeD%}t4QxQaw`$wAj$ktIvmp7yH1Be-_QNNI4Q)3hZ#5BUcfUY#feFfvZpm$+a;W40%#6%Uc|oFwJfPs{y~w!C$iT3#O{;JA(vgsSK2j#|P4?pCcsqfNC)ahHazuSr7g3HYnvXm&>-+kV;zy+6Ce2Jzpajaf zw1R&3!!}n0;#j3x215lSJ3zwgVIL;V9O~=QT7Pm@-KQ^;1`4uccD7bzs-f;Z+d@XZ zqM`PpAZZPB7O8RoBDF+c?lt^s@JDpL7IQ7Nf;IOg;CDxP-S&>V(~zN5 zw}h;KZBv^%w~2n9?~=&<2CX;LPuCMKWlWolHPxs4*OrdLv1FSVKyE?B;lM$d@HQL( zG{*(C;68N}`c_#~l1OdM$l5Ur3x$|~E-VoxLuJL=-b+!$)S9Z6Nq+RSp_zT>{(M+W zZY0TcrS|GdP#O`h)B9IjNW(-(aiA7&?2MZx0M5@rNKja~kUlE0UD)>xtsL<_TT&P?tttp@eo?fiaMj5Iex(EW5J%#V{#$^`Jv<8!z7l=VaFi51sSSjUoer=H1-1L`AL)ljeSmYEo5doBd zJ``+pr~L1-SQsF5WerD5VD724i@8FSKC1(PVh#jyzk=ixMBMSwiPFVUNHvPZX{H1n zt}O9%C4lnv=5bjC*P+S7eLI8#q($^bV|m24_?9ENQjQ?UwUQu~|0lrLa%+3rnna$c zPl4por@RLa5NVN{ZEDRQXz1l`v^+fJ-;JFvuLu8=+@(r;`f~R5H)*xrXFow-JHOo; z$&Z)2nmJ1Bd3Ni-t)f^8$SddrF{lYw_!(%tWUTa)U2S1k+z?ms7g4Ay@t8PS0>W$DS?d#wKgh&uL_hEC_0fsXxdK_*@*eMkiZtv6PR{ockN`Y_ zh4}?ca)AND1*EMwUGRI|E%A}6Fjp{5r!fic zS$a*bDrt-f<}%*xdB3YcT)ddmEHF$9D+mI{s&-}^@crUkOc9DgfB{;@f94rO8--C= z%Q;IE6nHDKu)rtymNoZwDul~*@m^IKA)^}c(aP>ByWNjp!a7zxIvaF*$ejyE6EFZSWOCGDsol-Cd)Nmhy)Ntq!nQnr_ieH zJj}##7PTsX6Z8{SVw5LmuH3rV?mQoYLCnjf-|sN!&Z>1^eNc0gs}RQ4YDW`3~;-#@OdDv`Y{rLYBWHfPf8COqRKTn3KRnN=Wg+eXXU`u z!{CLUQpze}>wZT+;kowfqchy=CThXt6Du~DnTO;TM zuL4ARhBuD!4Q)idNGEEzDkAd z+a+GoI5|3NC&}_WR7!5i`rZ{+GPp`Z#X9{<_+fM%I+8qd0E<}A%jEa7SwjiW&3VyY zYL?*B&12a8q&>pva`18KbdWs&Ix;`BE!^rJyZ{O+@8PC@_}yzWr4yp>4VX(Y!@4gV zs0@d%d#42B3prD&^Bm>NTEgGByxe_X)Fb{$nVXTE(P6whBCN#Q;RCNjR!c&!YlW7r zvm=yRKq>1zXJ7>lF*7^5vWsiqOU+9=ZeV=xZlM2fH7NnLSX5n^5_&4?ilb;kP z!J(JQgG3k|3QRoD-5{)s`i-3x(R1_NARCy)L zAiy6d!u2{evR1Q$V&Fkk53sy+@p!a*A#6^==&WhJk8crrJJ_v3admY=B$C02Fc;IT zKtS+wK=Dr_NwR=IB>(FuZ*=?vk;`u_doBCyb5Th5WNJrLFlFm@AWCn7=M(<#R>!CN z5DA-&7@6PXL|-Gt1DX|qQUC;6!X)fZXr?$g(|b3ICg20T$yex@1a|zRV|hGm*If~5 z1{`%2NM33P0{(0}l=HPM+8@d~PFnM`T+P|7jw;#`N^fBTn$(qffAEODWUlhQcloaV z66WHcmL%srI<S)DNA^##nv<*N zeuh<+fxq@Ek1pdy7xAXw>wXXkBPtctI1zjS9Oz02q11<4u6Y`VshcHmtMIxahKn>F z{=Tk>757jJkMJwBXKuGQX(bm=;}LW5bbeXo-A!|o$$&2<#@M03rna(D2q9W`-tQpI z#{J($Kd8xN5$tN8TH)i> zaM*Z1HL$Q+OB_gG+TsM@S91o=;3c-L-pNf^RIlAUIOAM=gFFM2-rnB5bam-!W8nUj zpAI}G$45=SCs-mmJJ`xgk(?;Bmi0xh#84{+Z)OI|Bk();IaMc zYDo5LkELMo;*0tMCp<>G>L+4RKiz;A+nnm9=qUiMde`0Y)eTqVFY*8{j6z2dL#RJS z)iA?=($bEqhMU*B7ZJhgoteJ%-;@1=munLduhx)afhb~d$YY1{D~-mvk1i;=+#lCE zt2(P4mlAN#yv>fLB7W|e)9_#RV}m#AuVY*gV#*RQBT!bfwJCx-r*z|nw2LndDhMb{ zOpKfzN4&4b6yoFih%fpBA2Q2_Fx2jB>wCK zVI&6s9kamxJA*0GrGbx+SGt1`!p#HP6mcO1)cKdv^pr*6OGVReWEghMO#HXH-GGGy zs-0a#rs|K@s)iU>ZWt>>dUz!h33MxkZ(Y9`sV8Wtb4l1lk$62jc-&pxH)O_vw)8(C zv*`5$-hZo2$)+AjW_LSl;Nfx)N<$AJlesaP3~<3>2|Bj%uQfPghM))|e+_@kZuQJs zimSHFEqAm8Yz9o}Fnx_$_sL33YuamK5cd@cL=2rRFTf=Goh!^7;KxQ+Q(RDI<*drx zuS}=^R!N(qFLsR5t9ODJVJqX=q;!QKLskU5zdlk-G&; zRmam7ff9jI&`=0t*4Yp%js*SlFi0HQi&!Y2p`pV9J~j%Eg=6+(_lC=MC>*ajz-8;y zAR%fPM*MFZ876Py_w|`&w?m`R@87=?p0L^P-#<9hP}3+(FeQY{vx*$wah7-eHK z?jOo_I=fAk%k!1lhIGW{5pBKX#u@t?f}-fBBBT8EywhsN*qM?7s!Kt?eQs@~S~0g= z(Neg_+ruofrnU7{C(qaKdPhzKk_g8`H9)tvg)v6230U{D9fgZ(dK!*+IP~$%(<<0nBRyeKM=rokLRbNCh$*G)MXx@*PoxCk|g%k zcqH~4G1wf1Tzkt8LiS?YREAGju_|D{4sXuw*EB5F4dOZTT}~tCSEC#r+Svqlv*svn zF1@~21-_Bw zW!hPok(`}Q-a?Xkl*M)yj=y4PDvn!&ghL8)Cz| zzKjeJBnHI>Pcq!hKv$7`^5 zsbsFtQY8)-F>0f%qpK|c?F-Q8Xw`XbhzMiIWo5A-+EaYJ~mYa8#{H-zDBXk}P7hvyOZ!Z;C=F+o- z$nRxqY3FBR>`l_PQZ{)cJn8OZq48C|53HQBRt}}Z;eT_8J$7fY_SAvVt>Uv&$g8JQE@_chx@~2Pdc!0 zsRfPkwk*O@MrWibg~(}xDfn!o^JM7h`#ce`C4XH($?ibSM=v!ngg!?Ixz#Yb7TP%i z*7fhsmqyU{?RQ?kr;~MVA}ll!IY}i>al0KvK2AnV1Nz4Fv2~9}tn@MLElAo)&?WHk z`vppqGV<2Tm`lT#2sqFDa#2qzJ#r}iybSaq*T$x*w<0G0g3 zrx9Y18o@~7KmH~|qZ^9f{!rzF%(d1))n3#SH&X4}1${ zVjh~Rv>{ZteJyS(`mR4Aca4A*Jxo>V;pP!XN>gos9$cgKhl`W4_z>j*^3^y5Wv>V9 zxgQSqE)o^r)Y2xBx6oK@0&g@BHc#|wzrJ&5W@OO&l7}B#`kCBxi zD;-dXR4`1Eltw5RWb;k7IHTta@$$>q6@$Sm?fY)u()m)O@Dfk9TVU1;*qk=3ikEOW9zvDy>fgUS5#I!*Y?T)XpN!r{(&WvUMSnVCX9z|67tY*&^n!zVPb8 z(yLw}+>A-*`j%WC#$a8v)SFQpUN6~NP~(w7{Hu<>nxq@{XCP{6@+KvL6zIsPVB5oIDFyZB=V+)FDfv4H1}sFoQ6(!&h4 zn+qkt;L*3pR0wjbKQ|BM`{OU;8BQvhj5Uax7XT@*Usqk58q!p#QKuZ;=c!bN%jK!b zNE{Q`cYc2o@|T5rXo2XG4n`1ZiFw__ySHy8d+v}9-Fyb0Vx*R~TEN+wTxmn_8$UTD zKbeRisG=73w(ZLZ3$e|`(d%xW3;QUrs~U+-cj<1yIm&l?pzGzRRoI>(WEtu-Ozww_ zlGj9l#yLw42PgTjxn&fGHF|{ww5?<6Qu@apTnFRaqI`W!Rsb8|W(Gng5Rw84d+8)=A$DfYT@#qPBXE6g|@ z7>{y=F;{Xv6)?GLl;`}i4P*KnG85{sZlM33x1o3g1iNAvC<6^ z;v#;e^_@uKr%hx~$B_o@GyOuxwLF1D8oWYm$&g1tyu5bvC@wJ^^KN-;<$?BUVf}rJg7EC6q^FYespZDK#V!+ zdb_eNi9At-hVNbcMX&;jvy(mGI-VBqWe?XW4T7hzF zN#i!k@Ql;*FoI6UjB_*__VOs42aP#iAw3G&whWzm#Gv@xHuv-%6ou;HF?(3?f)KEY zR8O3=Oa=dx%L6GXs;Uo(V~j|^iu|D*+fn(2fUHgA4k9%%TB2(ql4ja50M!LkENP^-Y*XPI1-W#sA(=Xf zxp0aF*?wl&iWkn(-?_B~Cyun4GI+$>1>*+Osi+ie0(x0wzjdOF_>CBapr}Z!rcHTd z$V3?n1%Q7j`xT7W2=P!D5rTB3ay_EN6bod;qZdM=#W+ z`bIrSl7&{_zIUkcTV!`9#QFI?W$`|14#vqvP;Ysxmve8#$n{@5=y5j>RE=6C$Z(i2 zMeGn1WpA95RAh;-=_FK#%w~PsAp8!V6@+Tn+RsXyU@M3eMlB5qqr`@x#7^O2;crj1 zvT=$aP>5e%scy> z#IWlTYsyLS$x3|Q1rH9GDsOT5;24W=gM9Dg=2F|t%yF=d-mw$CG8o%gJl+ou&w?Z4 zOyjxK-7tuxxZ$G-M=>ab75v`poMGIT43;vX)XIryz^09O!YUJlwmxqQ`dM{I4^ss~3uA3Jj~o{MNyG z=rjhi$jN?~u1;l+wH7t@ZH%teJyNW~a@>(Myx&pOTfa8ph?#VuH#nB=w=jm;Q}Pz4 zQ)81MulJ!5YZ9tLT6*AM3YlW2EFOL>I7$i*VZWWOfhCk92%B&FO-n5|{wt5o>lXMR zNlkNEOre~t=F9i%SdT{c9ToTd7zpUcB$r2EgDRYc z5J^PUH=xbsJ6mdWb}cuEtcgg_*^G?JDw>D{)`YQ{Wa_M5P@2BqE0i!efdUVwLo5b%voG9@>s`dHUt)#Ufu*}al zWMdW9`bry0#OmB_o?Yhnd9|(8#!85;LIiE*WNlWB*|p=yNmu$y?^!XI`zG2W=6CmJYmxc z_pio{%+ryfk@4ePgw5H{@x5QT;qC&W+5IURT&}EVhb_!(EG(SGqAE~&bE0xccNy6u zV30?Bg?2YG-t676$lr!U{j;AF4}RB~ZFPdFG8N=UfyfRDOfA&~8BZJRUwW!oahQf! z#*?G1D`LqY#VQ({qwKXhrZ)$q^c`Bv9u#PMaUY8zs;eEWjg~CT%xx{p%Vd6x1xisl z_Ge&dW@>BG0odUS6RsyM@whz_TMKEr9(~$TOPiVE;n&Be;nX~}jepl~N+(wEUeWTf;Fsh$u6ujGGn})BR z)0i19Bq*r|=n%`KbOX=Mk0G*&QpqjO?*~5D6VMjA>H+vOSMS6oF|G@`G!C@hbcr$b9f^tzri9R3{5L)KG%Hidauz2Ws|W@dlKvSsVH z)QyEa8m54s)%F>jRK~0IRc*d7R}XC zfU49I3SpjuRWzikcbU{Qd3EcCK#_kw<(T^5YPK+ec1ty1X}eptD>pE^$KB(v4_~D< zVH6>sK+WUX-BQEix!=R@EZ!AuasyV{@y)eA#RVlfwq!xIss%qBC>uVa4B*XfVN2<# z!P`3+P5>ERzDF4T=s7ss&&@iWbxhxjrSEsxU{Y3d9YW#sV>v=z@A-Z=?)&i9NZ+WS zZhKi%MRgH;1bPUB7&{7fSNHtxA8JVVGr^@xOqYrW981i#u$N8V-rlLlzR{wrEckqZ zOr6i?lNIe>v*XEC6)f&I5AE&E+_iH4+O6vm0l(G4;j8;MI5_zoNf8^_xAAdDK%Uyc z&6VM)Gx7qQnp@lrC+F7NU&_D&DRpT`Db#kh8%@0UT*u&JijfC*{)+pHV9!b~AciGo zRW&YGAo3i~Dhl;(w4z-&Us9H?qpnqiAP>E6=-s}=Lj1P-xSaX?wVxvp4P_xe37JHD z>$k%Q(*aIew7ZB_WJ6cnmb+qHXj}8We5u$yXIh9l4jkbyU)7J2)NuF;=6wLcPf)P5 zmqba=yIZDpsMy^uw9CYS>L1RxD9YGq91S=^Vq4ra1WN7{wfP_)xjiz>p9$HQx0B_;e7K`2Y1*C4pMqDsOCn9Hxq@I3`=DE|Dd z@oianqf@j>_<>tjp30$7drwjDMtM&HooYsCio+t7_EsaiBI0`>xyHTE-2w_>w4)ksybel)U;Fc9}|qBZQ3IA=w`uh5q>-gdv%)!NT z(R7e)MR=_)@!!TKZX|nWCTT`}(L@Aj!d`(P%$`BU;smj*>%n47;W(tbyB9RQeMm72 z4G$KvV?@JS96^qZSP=PZwe{Y>=Gbxqk57GmBc!NWBxj(Fqv5%-jV$t!Kq{e!U@9Nmg*jvp1W#(gnK7(P&3{W7V zKiT8oE-%Y8_4Aedr(#7kcG)&Flm6@<%dId0(5ju|61`eTc>nC^&tT=!A~2lAfAdB@ zKLPO=sjwXEs6CNj>-M@ZW9i~2rL?$@YpwuDnezTw*dW`@8p8+=<>STAx(BZ>2wZYX z*1fO_#2xQI%ChpwizL3`xg=$pLo8&b!HKSn?&Q0c#*c4D}9}O`+QUuuk*gW(^aBSCDa6 zSO-l>DD7tf+Bv|HWo$(a7BXchzx5d-|1C1?ec1_XyVG7Az8`#Y*rK%IOWAz zKxYJBdGe!ZuRk6s(p}LZ03azObSLYLSXisLPlewJdLl$}Yj*@ETL^je?sbUbQ9PE)% zP$pKvXcfHZ?YM_>8&3-{va8W>P#nzstbaagE}EBrDEDI9AoQcL|NVPB^xX^g$Bdqy zfUFNMGV*Oz9TtUJhP{r=+<*^f9Q<{fi4ltc@!$1}p6;FHFEG6k6_D)Aya}F%d>Ivt zC^!U{Q*@Q4y3>#cSb2D=X{l;nzh{>*g#uhM2D_U=5^Dh$6b1o?7G_^pCkka#>sYxU z`L*^6W=Bs5wgCOFdWujg8STUBo#u_-ET;NiO$LjTvh}uS4%V7-(%>9*zY+_w5GmV8H69*Z^$fu zuBKSb%|07?$owkrf^?Mk{j9T#O-7S&HRPg`DHm+;*T6Ys6{R?gnJM?NMT@$Z2g(u9{XwIHR@-I}r}n@y|6&pemellkIVO zaZxT-&<-xDrxp6Vjk<2Gqsz(=tbfyfA_kZ_nmSU~#%7&pbgR^~TWq!moY zcIPq7=aGCC2UezJmhebuyX3|E*f$Sp);){jqK0f(q6c{)BvdoVu>TM(|DUQ707EzW43#QF6s7MKNx0DCZR9@c_Ii#B_K3GfmgQnys7>Onn)$Ck7do_A;&=SYV)=FVtBmbV}rI${<;R=yLXn;YB z>wlJ}M+S!ahG!Q>A;UbY?1&{wQupUMGXBJ$Ss3_z9C?sNz&%BJ4KN2xQ5e|j*E?Bw z$w4918Crge;r8rU(E$;}@c&t!Cnn63=E;MaTIz!uO;C0LZPpqjK@P#yaNc8^0@6)2K_|__F6eZgCvaIA(g~~$|k&XGFy0-3yfx*G-F0E=%}6AkE10@!izynq=Z9qd znn8S~YvqZ1XXK+uNJ{5mtod;t@hRnXSn+N4P>r9k`c?l6n+0}C5FA$4Ap5$(t20ve z)Alnq27inkU7PMk5T-^r9hSRWiQ*!u`C_6ECs*$B{c8#6BSH&`* zV+R84Ppy_4qudG3-^5Znm234ygeHN9JKc(WOF~we7aX-A#I0V>1PtpHf)#h7;DNsX z4WEUMgN}4FNv`ruh`G04ABI}YS{{84A3ab(Nscl6z&q*=KB^ThFB9fbR7;ImsVJy? zOLT%me*$JZ5fvvwe_=ny;NwYASqL#-q=T!6e=iq?;AD5S(fQLiwCcis0m=w0f=leA z=*(wb+n6MHh!i7PP>-Sl77Xf2%ng+krUBXsR~QXKHKuLFIiU=qkyR4R)}=v|v?CTT zyFkOiz@zG?BQ%mgFB~!a)JAp=q&t((^Qf3}zbm5f2E<{9m{|mTK;xdBWOMDmCk@+qp_>njG2zg17)_E`Dria{xx991{ycxmP!*$lyxd@B-0S z*gPeU5Y#f*qpE;Te2-3#Cy9ilXST!lUA{<%AO

J&TxbYUA`g6Fvzap%(O*Fj*K~ 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

J&TxbYUA`g6Fvzap%(O*Fj*K~ zDk;r9p4pH}?P?LJ`*w%qR^JaQiO5Qt?5fnY4|qPxrB&~5se#cbPCs~LzsN?#|1oX= zN(2LwdVq1HSL0(@pM*pM5%J6nlOU-2vdKl~4MTg_nSA3Td+yN#(4jjSg2Uu||oP;BB;B@k}~- z*lOU%WQ!Q(tbRiDXa$mIcl4Dr7Ky(3t`n7qy6`l>(meGq2)yk5X-Q*k!{SX*$c~OmfO7zKNsO&BR5O75TmS?W%M`6H4_qv!7^;eKz%6|fs^>Db#!bAWogKp znWO_s$yi+!QdY)G*5!iH_;`5IkuCFVPvs8 zm8Oo}T3Mo!Udo>2w|%W|At=2K-0cr`US2r6lF;JN%v2&Ie10%CS}5C5^7YGT&tY6m z%^z+DRCC*rz`Qym2sG5x^{U?2$aUo^N&c5nzUx~G)!BxvT1`A;qr~BZv;d~{@E^?t zrbx=+pZ(gfSbMugl)UctJ3h%;#KysAbMxZOVdu*J+y>`~c-ZQ4Zgo;U?FL)AmRCFU z)fasB!U3<}Jr_&V5#^twt3ACD=K8>%IZRx8#f{LPA~a-qkl`O)1Y@eS7{5-26bc3> z07?^Gu-G22f9KpVPU{W*p}U1dgIasXiHo%xJZSaSepbuQb!RZy>*{+XrT1{`LLVcq{Z(k#R$0jXGnGBeaLpd!3N~XhxAqM!r_b3X{ zJO=N)!qfaqN!!jE3@Lt{PE8r}j_zK8;d`ivHNSQ|_P1(MOHR=~N323|p@7d(fdtHV zB966n(3lwp$`C49#Bi=LjCnEh28o*K629-jolZeG_GDOaivtVI@i$!Ok`j+G4%=oH zb|l#60Z;b)`ZS0nMs2aJiOfqp^p!7@ao3)43{^K}5-jUTIHg}l zCf7d~?L(P1_a<<+iaGm@JpTC^R=HVKZiPp#yHyl&IT`A6Wu>R5w<{SIEdggLt*R-f z2i08(I5>^DCFQeHohD@BAHov#2Z7$VaeEX6{CW1^(e(EW!x(y2p_m~b%P1_!p}NHN z0gCBd`o7Q4A$wr#=m1RrH)$?j5Gk32uaV_bFuZH8yAj1wnA$uClUC2$^oB>s8~>mr zWst?y+VfQ9Nfumth|ee}@t>GvJe9?sey3C3xKpqZA)O18hNJ>+grNhjg%6!1p^S}- z31`+&qXb+(VdKNSGlUY;kDm6qYU&@G}XN^5BZ+VtYiW$-}XrCfGR~4U*Ztj zFtTDr5Y-`~Dfi{1AJM^P0N$p}{!Z@%qw&@%j?Bcl}yfX%94S2kPmIhJTvhQJP1j|V>rj1x`Tix(iccUDRUaWTM5#x7FKircD zx_n=15QdTY{HriS$)LMKncU#f@j@`1-%?^X_!4O7nuHh*x#Mg%9*5%hq^}v64y~S@ z+2FYwU(rr=>_z~(y?JSdW?K^i193~@Nb`E0fYT!;#;SXREZg9OA#jk9b)o-s-x=({ z9IH5~9;VWZk&~bJoyW_&cR0n#EW&wNQOXd|0mlYyn;k0C%}9ud2|iC@dg$Js_+WF~ zN%z965JxF+;nsSkEFzK+>U%$jET&5n4Jqmz|vxQ-qc zYACHLlBs1&{2axK9IQ)(&|M(rQU5E`I)0$V)$FU3OfJEcYhzbYQB{}A+zF*a z_p7d}DOxWK1(bj|#vyqptl%yMEyv6$N00~L!X)8EWNIpx+e{YEQPy`oX9-DwsZT9k zW1gz?urD}_-3iys!Oq?B(3?eP?8!g$+DRnE!ih^zjbO^ywfw@s!lAL*W4f?^r@N}H zt}kJA0i0ULmUDT$2xp8r8_F*UjbA=c&28BW_i3nGT3zHgrH*U?$*fi`7O5Avn@DtFjK$op zy*u%I3o>h@5U-KotHrd#=AXn}NR>4*vZ{^_pVx9U7N*&`8Q61uZFzJgsSwbSPi0;P zKd&Z|Vt3P9hdv{!@u&L)>EAP0J)$BVbiERg#y9&xn8uSjH?P^~BKnWYFbc}?P$#xF zWazk9**!q;0;#1I!k+P`z@H@IzLQd-`t$R9F`TdLI z*N3*O^)6ja{xVTAL=`cXi~`cLXC<@8VCZwls{^R0To`TwV#dA(Pwx{@i~1yKicRdj z)Av41lDb!6GMIZzq3923;sIX-))dJ1;5so^0Q26(ak7qTX0Fcop1R>FI^SZ%BMPRF zXgf#D(j{vh3C^ z2s$#2IL4`IEPOu3pOJ;2bwmYfGVOlWq|Q+p90H@Cm_Rs`^;%i9Pw2DWI3@#ccJvcN zJ~&09zLT41f3?7<+_%>&8*tii$S@2fB)np;Q;;|W5i#?&a~uDA9-wL0`6`e9-I!l! zop=O3C0n=-1O3SDWH#rZ*$H^wN_FFc-5&gRIzJBq5>`<5mU zx^ks+~e$(MVH8(E~AedyxU=LGS;I6BAhxY{lX zPi!@|8r#OiY|_|f!v>9Qr!ktwwrx9U*x0rke&_xEA*?7!Ig_ikh42chH8NJJj{vuO~Dlj&s!6Y_7y2?=O- zK<~0s6PW_$(d6R07LJo&F(7)<8XB6APEaHIrq=rER^wFe8X6U1P#{#+q7|3#M*nkj z_sMhA8etE@%pT1wE_xgvbsJGLl&VK~4F?F9hh!=rcVmL!on!?7=hZ z>#9pLT6!Ak>AFb?$(gEJfY(M{ODA1b8FE5LRo=!;iA7oa)rEvrnU}~&%y#3m7VPYG z+OlO_UOXP`_O|Wj>Z%tFb4+9>*q?@UttHx^5OFV1ov&h92E8F^r==6wkH{e7B z>PZLRo5@D6>jpU!2^D8UE5{yOn`jg~O{y_^8x6aajkQH`tu!)3tfl^oH*&&l;%8bbwufRm8!^Yav|MpJKF3v5m%?#^H zOA|)3WTH?b3B-haC~1^QU8xb)Q6VxWfLMHY=b|1H{7H1vGl^C@>GV|I#ekTwv(2Vv zWlR42b6op3Q3o%KaLbZnsN9awBAnM33bjeE4k@1Ck{z5F)+9aKc*5B_Su97*SKJEQr=xnnAU#vh-q_FD0Y zy-NN@#aAm$20}yezbb$6Kq{EOJ80Ucc?3Y{EUq8{)`9Tk<|jdK9;6 z7*d&*mhSTGggl1uqbTsjWja*$4d?kLz6ob_W9ZM^g7NE7&8#s5YLkZ1KtL+oOu#3T zInusE)HjH{wyN)oV~^i5S7LqM4AQV(C~>NMHTnL<-iX0r=|1${r$}Fr^o2?)J0;Mn z(Rq^}#m0;eoMk}WY!>RuFWQ00gX36O7o~&RVD<(Bupm+9nNUb#HHuPwKlEM+UfSFJ z{yog#+ZH@0G9>U`Ir?uUoJYu7<&1IO7#8NWkP#5uGDXLE-*-t|T+veLDrsiYk)|Wy z0*W5xpF^;HyvIw^8^uAPtK@!t0>^oFY4kdHBCjQn|)zc30n$wc>E`#Nl?=sCJvqHat0i1L7AN4UNQ!w#uH(5f% zEbBoM17Dxqu#{$+esRje51?I%(Z?c1{~qk^ybONw82dgC7%$^~x4|!4`~V|-rAEgo z!;)cvf>X`B#nT9vx#(dbQ8L%vf>3k>X3mp=G((eF!W&a7fiWI9=!AzD5|bc`JkIcP z8JTgNj)x%Q1L<%HICv_qlwp>_@#b%@m2-hM={z3uajOQ{-I_;(D5S&!&M4IF6v`+q z&mL4|En?&i$^nKho?m{pMu2%aJYb5fUSRk@r9h0XcFLlMkm9ce`@hZCe<_2 ztH&c`Cf@|hmD*T6zdv^K*uI=R{UdZmnS3geE=wk??FxZ!Tt3oN&YnmoC*4z~G~0K* zVKGZb-?226Kh0`U+p276Y;NaYIX*o>^u~;2M{d|4GDwx&U!p9Cll!!ZgHhThw#07Z zz1Mu%&1lh27@v*$dpU~B@t|45WUh&F)I$pk7KPIkdT%jkZ+1df8U6RF029BUP%~|F ziJo$|GCZ+ST_DQ9(pPuhCyaz8M&=DqJYozowrcH;*Z0Tt)Xfdwo4(1R18yg0=BN$t z5L6VkYLqp~{)ME4>I44D7BZOL0eSdIoPyIH8Nk)O-qPT_ba`y`9kOFRTeCLI!Jm8S_V6tj6O1INPngwm&&6-LdVNl{P792`ovdoo( zgTv+9z@7Gg$(PdzaMnHH)EYY7NXF>plo}DvKI-3Cp29{>^P)-^+rHhP*L5Ks8aou z(_=!{m#i$v3Ez$lB-GMdC6yEj6qO84D0Osx;j>})ndaHb&gM>SLP%-`?tC2eg z_(^{!d(W$iMQ9Dr>7DRsWH4GUWWWtw1YnAR=%_`NPo89F2GS5t@x_mSQ=X| zgk++1tP>I2RhGEGNnI%GZn|t!H;u@hewip*uJhc1Y^ie75PI9TiSloX61m;2_Wid# zotRWU0;kwC!Z~IPgVLbu-vV(#RX}ijECu@#?)Ozq!apt)!j14NYP^{=;1u!x5qcm^#u;6f z=Av^!FcKUR>U{PbG5QM`;j_*`RP|RO9T?1`l2X^_$vz$vHmNgmIHI!N{LlgMn z|74egVb10#EE@0n1}_~nzOUa&=#Wz^{<&#}qx9v3B2Xd@9`WW!cXra>KZ^($U&1}{ zgHjKa-XDTe_0K8`dP62xyMeG+#nVi_N=^Vt!ay=?GR}Vkm?EhVul5z1qC>8xhSEgm z>xsMCm!`_(mQ4R?To5yQgo4^9VYocW0<|FD$6U06)bB#vv-8TNj&Q!b33Q*2k4?~` z!FJ-RI`*|QkWZ|*mI6_o4xLZWw@N49Y-A&lXt%SjadRUoq|L&eUPC_-ShZ`EX7|(s z4@eUH9h&RHu8UYDMIwNGlkrQPOfeWIJfJSq}=*oz@YFxShu^d9{8v%sKfn zGYMb7zs(=u2d-o@?%s@$|L$6IeeamkVq|QU!(+1}<3^Kt_bc!DK!b}FHYz*(pYQ3( zh-fMM&f|r^-Nm6uf&r8yPH5Lb&x{zNCf>fCm6`QV$fLPu7zu0}Iyqzn_A4{_qH&on7QQ1_Uu6>NYl~%&tijLH(C>oXQ^& zWsw%J!FpsQs~tssCz%4yx54xC$q|;`NNHpxQ}mtPI-9v0KsHGjf&~((wj1x0U%=DQ zh1-GbIbbY)LAlW}X4(uvZZU62KJtw!RHW?iT5cZL;QGQ!A3O-?v^5%&zHSe{h5xLV zDbt7Y){^%?6*xS%McYL-AA|UH+a@ez$#UC(`O(1pB>FpLbZy^Gf}0i|kj*B+UXpiK|}lBmMvH$Ls(bY88*< z$j+SELp{6S7>EQ33;9$8RQ>RkHJ8_gQ;4!CDar%2-HsBXgV6P{qNu{y&2-@qLhb@oj=-`(vIc%ga9<0l3jg};ADi&_tt>l=Jcb^m{3+8R!3|N11GfnLtC|BmAU>+OF9foMAJHB_Jh08;)XNZP39Kbub~Zd3fpT!shGDo zVp4<1kzN7kvinn%TP=Gcx*)s@2>1$}?#?D{9#wmSq?5Wyou-bqZ8@yXW?oByzId&0 z&1ftY7zqQZSyvwBnkIzx57S3*2$OQ0t$n&l)*#P zt-}$c>^Pn(JaWmMAerNniwLE0`H2a?q?8vjzT&1_{8vflvVJimA$>a~%l6vbE@NN& zUg4@g1ue34z-eQ8Six9Yv5$LB_8t6F;5-zI_=>Knp1t+qkQqR%vC$=Rrf#|^C z=njEve7+EDz}~J$BF6z2}%cK|sItznq343aRj3t}=mSN>UOMbpiyg5u=ux(CJ z`dlRD4W{}=P=?G2uYjlyn?OHUJ_$|{5i(tmLV{Hr7yYbuh^1a|fMt%GgsnLb7z~#< zIRW+A)#b^t`t#lx2HgW~BY(>nrvHt8O)7%mPy4(KP zL?07>CZO@v$Yqa%l$q?#jZ%7D+|vOy z^+-u2=5zsl`L=zNg`~x%A3j3*MXOuohOu4kyVBn{s9NR4nC)iOXDUH)cGWBfx39Kc zB4ARSiux~JVGz!iFpc#8QA$;u@hSD!H4uCafI&jJ!toGuQ<`3RbTj57Fbh&mxv~&w z#0Ypa)Yk1bd-&YPa@s%AQ}E%jv(^k3%lCJ6c_jbnL0QgA`Vipl*gqYO8^->wsnu(}O5t;TCrN_^GOC zF9I1magO-{=_7I3BuI*U@czvlFOL<|#NCI z&{ns0-j1Z(3{UCbx-?}Aad|qa?Tsk=75W|5jS+0!>$Q1&>`cNbGF3jQ$D5(h;(%06IuXtVWWQAo-8!LSkA3gr#aL&(UbU`_5wFv382>4#U z!u-~@14&0CX+OyUH?mxJ>S$@GoISUA?O#WRp74LH$d9u>c_veUNh^U_<6W*W<;O{l~N_Q1TN^LPvY(ZUM?%b+oDBfppqyV?A3euH#w)CMbpfVyN7z1WcRqG2k{WvE45B`Z_B%p_ z7{j6DK|tm}AwyjFf0_{$V(p}>Dq&)-=JVJFz=`-LrvOp#xkUi#90Cigguoq`@5^Tox3> zqv;;#!SK&r$fR5e7=%4pzvF)|{av79rz24oVc{uW2}bVaCzY`6>^&stwID^0YnlJm zGJob1_A$3G%g)A*M~nlqSX-E#8u~LaG`7||6xnYqpY5`_vS_e5ucEr7tg36Mp-q^b zk({oXq^i8Owj$MnysSB#pnB{R3UI_q<`BpmNcQ`!x&QWSWJ7n+YitFxRJ8-Pq*z z>3?&9*`x9C@yaBFHbt3;Gauu-sH$n-9@2fn&%4OIG z64aD3bwIkHi$an1mTGCe*cz}DgM_ zM36WT8b*gM21C>zT>*X-1s*cCj>Eb7s-nXrZEsCJ7lU>OnjWUoQ93&HM^cAmniO~0* z%R(x6Aw&XB*cDw~iER6&DNYO?wHML?{2J%f;D6ZHBF@Or9exlYDBMDZxBZ%cSkzzj zrAf#3hb0T5>R!NNO?W8AQvuR6ixO)$7Jtt?i;6;X%{A@~hE>D&CuivUP*_-!fKwC{ zYFazdmwpI2noMswgxOAn+{ZAo+!VgRMLP;Nh|^Om4(!mqYj=;q{lJuZ^jF?(NIng| zko}&&rV%=&jkTOha|_3|$LMRfte*wv(P!7714pUsO<-lq$!uY-G*!cUc-QY*L#_DW zU#VkUV3fs)EX$jlW)G5KG0`Q+LqMoT7>nZbgkoZuA1}vn^^rNE-HO_bv*pEr(g_ec z`xLN!J7k~`HF-Ffc$%~_BD8vqYqfr89NbS*nU&K1@xbEaVl{9|$WZE|-@;VLwE1ZU zu6Unm=O|+#5)_{4;hjX!)%L#kpA~NYPMVDQ_5wl*=3U9)u*0i#u-&;<2E&~Ui{3t) zLZuFuJA6VxFXv> zISD<`T8;U_8^ebekka&HXmXJ^Nyt8K5$U$|(!!56$a)3!xmq4U!tlSZpu> z5tI<8Pq1G|IP(Hvv9WE&(Eb_{vE{HZuUvIW$>q zah`)1fP(elvXB_+`PWdahjWM3?nuc>Ho{^6pXT?UjajM`nSO$1T=TBSb_B6p2sjkZ zl5MSeJZW8N=_o6DCGn`?IIbFWaVUL@FTHoOG+UI@ap^|wRxAvyGTJZ<8OTylyQ8<7Ubb{;)%Sh_Q?yb1Yz<}C?|A))j+T6 zXdc#C)wDxn-Sk`*06u4C;zbA!>^qH@+i>;d1i;=WHN{qywZYEL`S;kz{%BwXFn*LB zdgp2ULFxT|_tUqQd_ld(UXd!^9 zW&j}eh)ypnXZKt1t!f+H8(=ICZbXKpVu~5H6x89wYvE)r%*^Yo&M3I3z)Sbfm$EAl=-iSC@_=10BC2Lt23Cs7@MNL|lVP-Yt*h)o;xijsL=%qJ@DU>RuI5AUf zZdX-EX>MsPMC$m$+$?aagTkRUlE?S4Q`B#-R`LMIwNU38AOZs7!B7eic(~}DYy`gD ze#ttm&}aUOSniFghukjvhsA@GA}JgTDI97k&$d4)c(5ms@p)xUwH-xWbxpZB4gAG5 zjKWOaMYXN@s&eN6^*7@^FX0tLr{~*eW|qnNYT$#ncy(D4Onr%UqKY@xRJmZ_Yb-d# zLR>Jx6ku%QCz4m)WfgH_u@u0CW6(uX)n!n%aaLtrQsDA>k@u3;v@>;9^ueq_1bQ6= z{C`FlH*)j=AxBguqZytk{hB~x7+|P$>YYhJd&0i75gebgNwyYXlMyZYqUlPFnS}Bo5 z++swkS=1H0(1`LEX7CB`hT-C#7$21oLJR%qn22PHWb62B+l;|9RotKQOIym9rocrl ze?!jZCK`(a5rxrFdPc9LU%GnQ`K33Uwi24s<4cpqwk4PIwdB92nluim5#M-o{N8_m z*}6WPurjigW3btsyZvJ52Oq5hHuN=t3}zS%uSaRCx%=yQt@n=l2DGO8|8$d56YAAbIr3?AxoT z+O(6cz<`%7Xkw5baQ>lw{RzgQ4t1R*=CyW@CPK79+Wr1BKtZ~C!$V?Wg<2m06Y5RY zRE#mmC&avGK5_3DUdw z-qn8H_Ep$lNTN;VLh;M$c73o|dn>T*Q^mtL`tJKN9Gz9ib1CTgKt1uNZ^g`XeUUVb z%iCr9uH>?*3daXovRLr(IjDd!5ACR=#y=fXN{~ZnW$2IE0yETU5^<{U+3Wdj^KPat zf2dc?u`x0V$rN{##n41Hf5ruRSrMqvBmURh+{fQ`)E??F7T?r@La$2%CcERDOqH<> zFWPVlab>ln&R=ANl0-Rqe%O*~5@3mV?FTDurb4gO3xJ(}@v%NZHL3sSEX8+`bD!C* z^=0F2~Oz*4{Y=z^G6~gHilX@h(#VD&9?i+&aSmH zRB(5O;jD>=hZjvKyf>L@iH3kzP@IMdMxksj0g|X*!_%8n6AZ_#>*b!GIfLQcnbU=S zJhZU>)y4ZZ8m=_XclV-g6w-C``k5LXU)arD1I)Kbof+1wcD_EcwR_-xp1Q7J(4S8; zz3G9~?RoqP$_@}ZZPU?N^@q70Ze2zD#O_HUddF&YMSRrZy)h8NA${8-#4FjHTl#lI zG&@4o`)$0G$&h65?9ehmm8^Y<(feiJnh{MaP8DRL^)c+nXz2X#1%KBD%X-LaOKO|DdckFP z;M=O28-KGkHMh4h-`=r0yg1o9JSN#XHMX`#tPwv>_1-#6T9AU3#}0NYh)=^i~))YYf65Whd0u913s>(XE`$cRE z+uHu@(dyOKN*j(vwZ8!8Cv-c0Y-304{qw@zXNGJTkA&0eRQI<3RcN34&;(P(v`5MN zo2{6RhpVEEE*uq3pRfyZ<3G`$Xy5?)0DGaap{o)7^GYcm zPFL7x81_hRAu0kh3bP~rS%2NIVOKW*ra{W-wKGB@P2kU2k_Zx zFKno~XH=~4aE@C2ZrO`+Jc}T-Oy~21>ox85J24ZJHEB1Vh%Twk5&($;CF4X-WYps=u{fUl$!cxXl^sCl${C}?aQ?Kn0){6b8Kb40mWDWfo+ z{xsHJnFTq&JJX&*|9pHyfp&>^c1&NaNRo;yy1n=BG${s@c#C8(dQ8m)!PG&3!-2nC zlxdrZ9I*w-J^17W0fX5l_$5C3Fz=9hI-PT@LEyEdu+i>gTNMD!RjHEY_$&xp9kEw1 zDLgpn@Z0F6osrU&mk2xUbazh~6iz@R!q@O%aXQLyQOMEarP171=P}_NVo8B55>VJ_Z$EFw~g73N=%bV&)XTILDsI(-Ql$D!uKm`=|T`N z2+TE;3R++8MJ>Y<)gFf;q>=F>i}#U`>KA1iSG6nfm~+MBfhX#&VvKUicVF>$Qzo0Jdf?F}(V=K1GlQ92>feY)LGyOr{$;&O(dMee|L-+*={zDjGOSe( z{(`E(WMyQ_@Uil;>YvZH&ise3h$|(3EGL{}B6_BI?1&4Hb_(R{Nm%(9;aoR4fI7|` zn1uUk)dN7zWA+m~R1JK-hn|5TMg~`eL1=7#s@ z#}KHnI3#cYB{h{EhG{?`l+;I}V42c{IaPyT2qP3cqI>^vNGKHf+;FIaK`radu=v9q zR+QVpW{?BF-BiG*}*4Xr*=x^Kg zXb68PCJuB`Y}zo`D#<=459mdmKuHruHC9gA5TYzSef7-aLvbwEbByFK&c zXGg3g6SI;p3HyUc8RXmT-LdGF6BYe}o2qXA^7`WT!!Ii(D=vp4e3C1bdwowYKPSQl z2GwJg&&0X%%4P15Km@`%SD76aBQdrMfbVxYJ_A3 z-6RL8cYbgMz!wyPFjj(s?Dk#2(2WKuX*0@GUvps~db#dV008pjC=25CZ2~=;k$ZbP zpqEKW4XViB3ZW3kPjj<)S!XDGMgAvgp813L^(oU30D~&`qYrvk&Cm~U1(c-c;7G*t zuS0Y9vNFP=0|}WA{iwS7rYn+V!xM}!SY&oC_7>j{1W0lM3Ah+AREzlwH?xQHyIHB% z;{1YN%jK$F_J?vD2fP|JEAN&QRZ!p$_wTg1EjMpI4VI9tP#sdAW|(tDd33fcH9+~&_-bzi&R+L24Y|+XbxNRG@|ZtYp<|JuGU|oS6pdPd;3-OuzpEVFAEkjD z+~9N>tdF+LO-kIDo+D~L6?w8~K+S-t-5xVS9GKGRU8gZW^nF}+FFNv^ChYgbh%z9z z6NF*D^%|}&y&CK6z&5^y${`2#d}WJ3DAhI%g~6A*wSZdfT_1dxQ)47~tNiAYLtjlE zF4#zqa_8E;{(LabAtk?FpI3I!IN9#U_Z{NCXlrh4w$}$SI0_;L=kTte6$cVp;vcw& zw!8wOC=Up$swrX4K!b?wg=J>K&vPKGmRnpNLJR8)FPa`tDKF3d6*YE3xq*M?yeBZ=8@U-Hw^JtVp051A=^nJ^Q+789D-1@?Sbgs-Zs9LpiM@cErg~O?YRB zn7iO1@%v{DOG69Gj(Y28Q6sOac3zdE5v=K-#rk%n=<9tuB>-&;x-n%qGRIR>J%nm? zU7!R~Ftf$yS1!~}^8jQum(w{SR2qsAOEC!}Sr2s$12zwX8V_LS%EWe-4#YFBxf^Y7hL*P(7 zegClPBF)v6WkhCp$|QpzsOQ~sZZkqSg#XrTEmkp9#mhs|FhF3T1%C_+536@XX0V| z7NisfZ)bvp(L;UX-`Y1qNH|&THD9c372QoEQ@ZkG`;uzhgUd#%#THQY`Ga)rePiRum6b44M}j0%xQHk$b}O)oNf^1iOwtj+J$ZR3a5hVtu6+S zL|K&OItt7VxVX500^1^Bx5giAStYT+!<|^JQ|2UF#!W})eV9*LoyBGWKQ1gnB+&W& zP*dVcMN`k;lZF{Y^4)eb)X327Vci6C?x5>E7U(ZR4AE9b2DjxIzFiDZ8+K=-Xa9a_ z$f>Bz7w`Jz;?HjXr3u0SY6z8BkbOY9tIKIWnQJbkqOzh&=zh1DJP1y<^`T$_h!Z8N zFPWxLuGx%#+ogMjgb2REfFRv=^L^MLtY%5;y@~j!+SIM{5J}N263eU9v2r(mSZ3Mu zi!l#7{mRDD*;!cF2{rVmJc7#(R*#i~8`=+oLQ(4AUJVSWb5C}go}~|Bwqhr*&BC#@RU!9K+eP|k;c@@Q z0h|W@Nd$x^y1?eXwDh!0+IrII-_^eFd#jt_E|l;;>gxI4Cm%r8>UKLSbvU-mni}d$ z;yMlsIMiGll*tP&a8>=2{-QkV3MGE17#{iQ#zjy~@TM3eW+mh89qxUlx}`~)@p zVP(VVv9*E04bPnNeo@>Pu>F@U*PL>pC)}&c(C0T^qQb^iLBI2hB7H;CMl0T@eNN71 zgSLBCih=2kp@aoWQw$PTTHq)HvL11_0u}m#yFGB@ov^%+tuTL1&o5qI2aH>`VIyF2 zd+xectp4a9%)K5`$C+h7no>dmB`~l!AuweBD#=?{4F&}W2Q^pf^d!i+Uloh^J)epQ z_QuNP2e*mlG=_`0f#gSYbWCVrBMNNSPLRf~4q;MNBJJIUQj$cc1A?Pq=*; zLcVvfv-7(8922N(Ck59->ATu&Kpz*bG^*F~oWFDPEtgFan+0qW*_foMF`a=vTc2ax zKLz!;s}g?a!HxmjO<{zj7ZZt(!M_~aXp<{MaJl7!u#75XHVL_m1j7By;4S`^7JS$6 z3lbr&;V4rY!P*qqI=4*?BG#17#5}Y|K!?`|*v?6SJ+B`|AtpJS6rD)PlTwd0d@s5C#%$mX(MjRx zs%I~2z8=`vzMD{(BOabToNd@~Xk}V8c?5FY&TlqM8mf^)2h-5ky4x`Rj3N{NTzl*r zpZ5KznS(J*r_nuD_(bqPRWYFy`O^S;Q)Ot!gjc+T{^GnO{!K7L#-2GK|q5ruKDt1$`IH7KfL4l#xo{Pb`WZlf& zgH_&Q5lVr_35;P}d@#~oUqP@g6(6PB&XrM7F}#0YZ}$7z`yg7X{RRso-O`}SGcxiW zmfm+zik-2nq|T3vYQOBw>wTr{4@cx*NB>Gq(=#SPz6~Can%>YjOjq*qiTOo{;$fko z7FQu*FfTQl6*bLG;qW(I-ZUDkGsZ$SxCPsgEn$Q|NTPjzA!EWgw4zHVT+RJL1$L(0 zqo4qa0taz@cjEfB^U{jIlY}vt3ZXk;m*C(F@`v%EToKuo09y8hRvSb>@IJp)`KJU6 z+}`JQ_^0X#{Fi@l3hdypseh|HABC6$XzcL<;^Nf?yr18p+bt=x`jD)^Y+-=gK<(veZ#04b4`ct3nJS( zb^P3d3o0IHhho0C$E9Z54iqKhb$?QV5Yu=UcYs^J zhvy*0e&5e7H|l=7>>iCpU0q~^RXE+6t%vuNse-iwI=(re;z^7|`aXIbwPc%!jT@XA zWMa6t-ooH!nr;Q-ZbB1H;CZ2gRrOPj;S?AsT?#5d2SUf@7MJH&S05UgB9QeDEQe1Y zLPa}%Zy0BxhY9c5cRC@=kQ-x&8mHIQS`XmaAaQ{srD*W!IDOa`x3 zOgA>S22+Qy3K7two?p;jQRaI+6c^|755g<18szY}`QTts^PX6D;(1q3&`1o5i-*DG zKIeDb8{orxtdG}^TK-JRKoZs?<3;na^>eO2(3^_DO7zQy7VGZ(K5g((X;g1yUqZEl z7%(hySWnPam_a8_tT{Z*FG&pUr)-yzIo*Y~NBJAg$xN5uQRmqgPSV2&ihJ6fLmAt~ z(BBU|n@4bwv^HOOJZfrzxd`f9_Vw{eaxw_2G8j3xFE0OYcr<9*S@b?t1u4XImGJDzZx#0m$vg$82qVeJ0AnE6^nb?)p&QB5akX=rbPB!uDCUF0&)3Ef2p zeJ8k+1E_r?pWxnj>3n)ub>-;G+QX0Rh%qTMHdVz4&lqgZ~FOB%|{RrUfCFoV4C_c3U!S_k!hJ9dT&K?VMShAgOS zdk87b|9lD4FNk_Lv0#Qq)vLtSw)csuvZCxxrg!r0W>Q{mt~+O+?`;zdTY;3l%I{9@2DJ2NlG zs4g0Lpht&95MMYQlgS>)rfK`wOL=YmSKkaKrPq)mWe)YuPRhJd;V8$#B4E)lo@x5I zuvs{X6jy?cqr1Rc&mE*n5}TNHe`#6O;C6*jro)-V6&UHGbo}Vs7Wv5EhBQSb zkD~73S5**;f<(%G}>#JYYU@r7e2PSQOKhjAUKMhZB9l$e{2I zat&>>mknrUWdxXx>@NlzH7|toJVX4#I-ORPZF#xCtw~iy$ISP(pL}y2&in}da(smK zi`OsHngv&SRhCjLJf0vgm*l z&39%`Nu~6hbe&(r?V8`^%TI8tR&PI3CBB)ub0!5fX5{7ich;z9Y+~$U7_#m_u2t%M zZo%&PcX`lX(Lqs^b)ZBV^=vv@Gg9?ajUX_z_ct?uqgT*XGVF*T@KQTME!M50@cwjk zbTuxb$?f;bq$8H-YHL{UKADhSCIts{llfjta{6(i9s^}@p9chf;Nk|;<6x)GXZHlO6Yy0i}r4OafjxN=L-No4j9M(_6Y`4NdO#Gulzs~pA zb|DvP3&U^Bh$Y8WTf>_y13>#Q$H$>Rm6nu#oB}&2vZO*_mbKEt#}GT=1mF9O-!W|D z(R6jwVhMJ}UD~>*4Xev4Y3y`bGoixs#lLD#MwPn(%TVN-iBUT&Eerbuk$Nbbs&&Y) zak($}uXeBN$9iG56~UH!z)y@)hfB2&G`+QK42JhTN4Mu9%Ls-ggRD<0m)wk#|1vp- z>Di4iMTdKP8Hg(K!NgFn{Pj1?6lFn`YM!9Uf(F$Ud}#5JoD0zgnP#5bxA1P{I^7J$P9KMgw#L_V(n~AePukW2cXNKecQ0$5=#Y#|JCK@W=M!Vw?EX} zIVl7cSf(&+zK7w^WvHc73h4!YdIj(rdR>_P4btv4)y%2oSnmkb`~z-ebBp86Bn@si z-wk08(za;#PmYe1^$cEiPW0>8q8=fZRB`xi-OW=NTWX9CQ^S(&S;9AvuTEbp(~1r> zBHHnePGd+2{I$a&VfaG&X8c8s-=nuL9!Y5cUk|*UJb}6TQGx!<_DHFWcG}>gI#RNU zK#rivhm`gXE+~$+yi6URSyU~mVcZR$D+1ssS8MtO*RW!5V*&a$F0R)Q|20rIQWC`% zWQ%>}B10e^D<{Mm-AYEj!7pL70E#gthso3s=~u>2-8pJ{IeZb3pfuIi>&H>^HI)w}n8wi-GCx{s}^hvisk z8eokpFvX(dBs0q%{~;bf$iR8|q)~oZs}I@p-?L}~8;jn9i@kX7Ot&hRIRMo~=K)<9 zK#geXppToA5m}Yj-(Q4MWRMFrxhK$;9=hNy-`WM?Bpk}058@112GrT!J1S>14^2rQ zLeN}A2zqX{gB3Uz?8sGIItbLJw-zGLnlnp{vDnW;?VgHMqTkJw7InM({}${XVqssr zKYzUH^UMG<##559M&g^IA6_9aZV|FmWu?`Lt=i!uAfgLc;UB!&*z)73M$Hw8bM=|J z>ocES5|n6v%17iuHy=bn!% z9Vo|k`;?@1gq>O<#Mn<_N+{c4Xg<;4?{%m#w4d8CMmO`~^v9WC(W1D58gikgupDv} ziD7|q^O+!`s%RA)rjq5`y>s-&jo=}K*{G~-C-PdBYw47#w!oy-aUKgzA~U`7?shjp zC`eah4X*uq%F#Q!*f+eog;b#hnXJBqlcH|H&sbeX(>_|M&uY3p4y)od$k)-M@|9`l zbo5tB^TXeg(BH`ZBu-sDIc?N=*M$UmkU*J-`C3>5VtfETws^D0|L(w$#&0GQ^bf%9 z$N+)FFEgnp_}wO;C9|U;YX#LEMIM6S_olBWAN5m%he0BXP(C5hqT!7@myM&oun-8} zdd}J9-#!rJ_aO{@iXac=VQ41mi%$epymPER4e9R{sJWz@oCL6e$`%bF8n_>xItYc{ zo&PF*;G2d+0iFoXPwO;nEwn5Yf3COVje`Y>_Mm=KEc^sfa)J?jX{fECfcn^+)XZ8n z%4aoF7rAhe86&&W>A9C{#4{@L#fWj8`h;V3~abw>V8Y8R=UnHQ}Lek!h-vdB|?7<)rhvZ-J(~YYDPhwQ5 zrmhI9YNG&=i;}f>b_pm$#vd&{!f8CKvx;UcoFk*tP)Xqjr8^|D>v{f4df(F}DV_a8 zyKB7*g1NEgk@G=zYQ`J;hXJi=%R^oDz5} z`C3TbL$Oap%TQzT!=aXy%hk1hgi)-mfbdfQ91IjSH1lUlhsm$>U+8M`l@XK6F(lj| zCQSye9Fu}j?f9W|W0h*Y3*XM)Hs(fKH)Q>!inc-bb`#}-ONCx%TbA#ggQSxTey-Lu z6K@bH<^T;j8^6VTP0A)A3tv^!(FUfNWUIfpSi$ov(t2@U+lBM60h`{GJ_&TtrkW?-u@BCOvqa~y({ zNHeZET36UK?twq(P+_nr7Os3gbcSW!i;}Eu<}Edx7hWp=_t0T4n791hxgP|%a+D5- zrvV?WA$2pGU_6+qY@_n4<(U<^f5`|^0me-!XUU@s-vpx-)lG0~j#8FT_`3NkjX#1~ zcYDQXd!3wXv7v(XSmKeiQNo_RBu(hgp~QB;_?H}o8xBj zmgJ5kPv`sw?MQR{OmW$xbM(WO^I#Gch9{M)A=$r`n5i>#N!ZTp;0!Aa()N67vs{vc zFGV-ffa%Non}NH1R!L?>&m&kg>^8hqH)aB#je(MdBK6`Zq9y#;rrGod7^11Mna!Sq ziz9_kX>IM-Y|X;T0`l*uCj9)-0yt`2GjXiI;ShK>?9O6OB@r794Tr$c^s>~Bijqvw z#P2?T0||*Rt2$Pfc8+M!N)ab>Dda|zm|zKlG1)gZ;LFwum!gpbOLZv1uk>xOQtu=n z8WBxo`2inphk&n#-}mnyP%r=R&nyU%SpCc`Jig(d3C*&V|7-ZZ){XA2xH-7SA!p2Mgkb68n8 z-D+Ec#CSj1zTOzUK$W(ltIXLO1_ufjgs%L@)5ld>C&Jq?i{jCsj0TKXQyo3!(5^BZ z3456HZ;wOkmg!x}!SHRy+B`PV^YKSI<&Jh1Iu*sq$ID_Wob$_=2yw&3)KUYF3T8mo zv7K9s%~!WC$Fj!g@Pa4AC(=s29AuE#08**HO+)4D9V4ErSJwM|k^xleCG%0Nr+aaf zqf^D!j=I@;Z>1j*L<3&Yq)I)LJjnAT$aq&2e+9`cbDd?UZ?&*0l%2ecahLVuI>knSwkMZk>ir`v=a0}iX2-jx0Pa0e&*%xtl-WU zVEb)c%=V*Z{Z@^kREL6rdEXD_vxs30$<}$Y8|`hx59pKEJH|=*bP~M4Qd6|qf7q^t zLLZwPpV6&L$!6-GB)BK_XQPo(LZ&*#h7$+%C_ZDEQZR`!357>2fk!3LW?R*xY5gRr zv{4XraTRac0y%s@f!0bRJFGK{v-nsTGLBbb-sH-fiGg{6)8OI3yS+K2&Ua!cvb9{v zUJhV}W5L_l*yN6ZCpJttiYX}e&`|7+YfDTlLyxEbDD0md2KOu`?wgOzd}S(fEI>Yp zhJu{PPG4@j9wtn%W%JV?w zTB4HyHRAf<+3>!K&G(TvvP3GHD|_Y0ta3M zR}Xic=YIBxQXhHs0+H<%U0tROj+oOlU`|!V-Aumbl3pFdDYp=b^Hhw;Wkv_h8SGP4 zF)`2S>^1qzegA0B)9Mk9K@vP@&*q^r$a$n8?j=s82>Q`<$;!v~RL;#XUrs#Ou2;@t zMN9vc!FaI#^4u_!%N|+m5uY?J_~+0vKp;6+`5jKcf>^fpEuBHpkFJ4Bhp0OY)q;+l zl^MMa;%AK|+05oj(ou>AG+Ys{`QMo+$zQQKfZFOTBkGzd`F%v&G+dC&8BaFsBe?b8 zY|VSYuZUwy1Hz7B$bD^X{gCqj25NZln-Afa_Fp#8h&83vQPSfuGU|I8z=2B0ztih1 z?HaI!nH{DQ5E8~9-{>-%Ch@T`v2${4i+tILY}Q-;8v-EUCm;xFpYtFks^G#5kU2Fh z5N@PIYH@m@(U%S?eFIPvC1BVt_pkP9%@;)iJbG~!O-FHa8zMTdO&3gA2=|~9lnHD zoU6Z!5Gje1fcCYH?J2^iU{6X?|6x<%@Le|)L7dH%8~|t4FkTUib3AO49RGu&GuIDD zk{W{5b44cE`&#K$M)ZXRFyKCWwuhx6e@wGARm=X+3eMm9fHk; z>wdd;oCV&9(+Vmjh)$mT6#Ld!F*G-?Fh6Wn*aY4h#Du^xHU%H~{oO;9E_~mKyMwc< z?!5`OiKY^?VQuS*RZQCpAk`RzR200bft^Rjnu~?Av7Q+_-9~=;shz5!xyqolvViF0 z@wVzk@fuDx|Gu7s|JP+@TF#VB+hTypOh8ubknN?JV}W=rSTx+;@Ga$6d_^V2)ynl+ zyZK$j7jgFQeVo06X0&6P`pW?pF=K@OO3N#1+Nxij6U*u_0L%qr21FHB&zZS75hI;| z&-t;C(kd2uC1Y!VmlqyxIe-Em?4hhAw(5nGeWN3kbtNKJWOqZJWoO9!&|KnV`q+uu ztCuOt8+bN9H}oU!vw5eGIqPHWsnp73!PYA)EeAs7Y z9rd4H@5b!~D08B!(#E}}pB<3Y`GII+NX_-$Ui3EPXHIPzlj*lq|BzrAdUku2540;v zt1V?lUBA^fVW(hX~;HwSCG*lHb9R+ z$fYFgw%u^5ZQ%4UPjk3d)5sMMEB#7`mf-ve4A=PnDKQ?g5-#cc94Oo>_-g{Pm)sOx z#@$iMwt}I?Qe8`pcKt*0>W{}A4W&fSzaD1F0U}BO0S%N!0m~21O`$d>jiMa^fm`@c zlH~XL?X17joKRV>7b7rATzx=I8g=R=8N#EHHPMa(DAbH>vCJ+K@=U`%H-NAEoClS}d z7B(Hd&OO50Ny`k?ZD08H{$yn9N`WFA29RJ-FaB8B8#94nva((~^XEd6CR-1pD?Erf zTAC$<6!>fH1$^Y|Vl}=(#g0H$#!@3YBdRLsdk-$nMHl%?>wL?8Et}U0kWnzEoBxK! zg{x~Dm48dnHt~~=^}h*KvZRrpIqIv+UT0wUR!F?Du)o3k7PLOmr6)fV{E?d4qS+y~ zpn_b-+m1B-4<=G!`JC2i+r!O?Z-;^{VJ7INN-K3_|9Ud;L&953Zy?A+E9MR~|%ri)Qye5mT|^y#D!PC)7Kpu+X@Ksw3=~cJo)J(+Q-U zk=KM}ZRG$!yKHT&u}GPGRv_bKYa=U~DiB*J8< zT{q^Qm2fj5JJnxKU%2?Ar^=n4J36vmLkItEUykrd7h{3D<{KvxW2SID4hKQj9!>+XBp6(HYs(uK2r1TD373m|Mdkrz%3>Z4w8k1$U zuH4XKf)q6Y(Nnhm4v=1`t#ZTz*Vv^!?BO?jNoC%gr2U0YaZsnq2XzySYQh!u)*2sm z%bKCV;qGT5;d$@ba>@EYXOGe?oyv-aAYHg=LVa33A@bk*fL*XNQZhm0xtUfhU{Dy= zhd=SN9eXh0x8X!w0tdqKynrzgLdh5is|0SY<09kVTdyICtAP1rp7kwKiI3B#@9kIo zG8PHYnlv4xh8`hCSUSlnWQe5K)M{crgn{*~5ANIqrn+fNpJj=Ujpi$rmR*J>hWj7)=Enmd2bhoK2qGC(5D+|q zo5_M{!A4u~cr9d+BuUOYv*<9sGaVP>{S3emKi|e;_sRs9d-SLE`TdEOxfu$kmCKU@ z!#pttnLo7tX9!+WdNxeR*p+UZKnDJxHb=&X6;)Sy4SqoLrl4+zMfJEWKujAN76>=H;VVthCdKN9 zPOC2uAZP=IL-Idq_Y_29ow=w($E4UfI0?A;@#JZQVd9Yb$<22${&~Y>NizQ}`IMt^ z8EI}pazrfw@Pg8sx1wXj`3UK)$mk=La(l=N_Rd!wzugu_s^t!Bdq^U@CM#a16V%7>=A&N~>Kb-+nL+FDd4!1^Op6&dyBF2HF(*y~$9 z!vj?72VgBfS!@m1`aRSz%xn+D$)aQA$!!b15Jco9;cz&a%MVr(#D0u4d2_yK@Ca{>`4_}_tABtY0VM>GNY4>q%h(<&fO;%^|w(4Bs6T7 zEVlhln(($4b51yAw6QDngt57MxZYow0!oe!@e9(=oCBOM{!-yh6Bm9)seP{CcXwVJ zqO=$)VYN77Oyk(PY&EV=5V8MT7Q% z#?_65f0siIq+$Vosde)38k9a00UVLk-}uvw96hCfU+=9B>i`@c2L63vMBD53oR_M! zJZX=IwLVEKx;ixAN4NQ{*ZFeLW;q7*pIqNlXw$q9K9n0_pd)+)SFOhl~i`Of>F(!IbO$!Y0TBsG!#FxgcN;XrR-k%;;vJ%<&$^L1C2*%o?# z$7(v`&d|?8FUmbtjQYLp+uN8J8NWNcd?XCz|CRl7T33Qf`hW7#NXU~&KdjK{BV}*H zhwMDw)WlNr18}txZNTL&OzM@%bXXul{P2FJmz~IgZ5V#>Y;~J(!XvrrIjnjDhV^WF z9)%0NN6Xo!HeaEJhcai=6+zNIkg~|i5??uDFmsSM;NR~ZEwy=xx|r=R(wx2{H01as zj|8rMp-a}jZr#8J6}u{%%jH9#`|UdAK5qZAG|QcC93UzA3LsvPRH2n*h0BH%oc~}B zdL<>fUu@gT`QYQ9IqJ7XK#$3gdFlPmyrT*1AWN3~>~C=a%S??5`o$*r%i31b@>o+S z2fcZ0hn5jCq(IFK{Gm8G`m%q)VNn^&ISOIA9F(1?MJB|X>xDD7!~oR=PjGUB z9w-;_G`A3+2sjh%?XB#duO7ck3HK#RCL3IQDjwhc%==&{s>(L+uR4P4XFZIkf+eNh z$jLc_W>GBx9e<9&dLa2X+t|SlA&mk=BjA1OD`L~E1W#KdAEr_TS3f(D+ViWr+Prf1 z;+zM9R=V-1Qp!Z!Q3Bp~DhQTHi5u)37`ug|ad~EDTX)aMx%_s+7H_TnR33*NnL#Sh z^6yWSht{`Ot9wj7S=GFpDsZm2PQ+Zs=n~;%=XpQRUfz4IqV$0 z$|jk}G4z8}HLbTDrk2{@^g8UWu8kaFB*V8PzmSgE;y@6kr40eM`{!W^9ZUjB45D6T zj~e~adLwNE?E+qH<2e|^&phhCeAcEi?A#F$7;JQPl~*Nun?Dk`Q|TPPO+i zjF8c84Vs(?CQ!p;vVn1PK^bH<=3+pC25rcm$g7OhcV5eW=0?NjLLd|XND};hPpH}8 za`{m2sTfq9Ghu(%Ea#6)P;V z%4yeKJDaM9f|p?`I>x_#Nnr&_!S~<*yX$SYWRhUbjFfEh)B@vk5 zNX|qK2f*b4!{Bz$b28*FYM33Cc>{?_mHm5jaeW37W?rG4{R!&2LOotWF&ZV&Us(9Z z9CPpTVm0ti?oD}h?M&8=HVxgOHYb%MD{HNS3MV(5cOe0Mlw1cY{)M~1v$L0bl~S4e zn+$?ZBqh}s4?v+UFZ8n(Upx{p{O~^8V+#fC7+kDhkFVs}O&?{%3MxuXkb%~nldIv3 z?(#s%e#&VB(!G+vG2qeumw+?(MECilugAfHI)qQZ^_5@ns06$mWETxW4q%fb#<-Z@ zo~35w`|!6j(N;&Pn&XMBbYNob1Bd_O{g>UN`Mo$1f+4%x>@E188beB8sf{$Jl9E0E zvYCVNW!^OQhn{|Kjk3NZiXM?pch$VCw6~+`=!x+AvZu6zvzkE|{^a9{;xx%f8{?e> zaSb(qg@oJMMTDCR6nOczd(lmxmN4lVwj1MmiAMCNjH^SBHxq<}K|enO=)I>gifCl~ z)K!U)e*&Hf39)N)P99MH-i?+o zA?3%*7p)>|`N zjN@dPZ;F}7=0cdEW7J6lfm`u!?d1~I%B=R$V}091dk{8dVeX#qye|s_r*m*IfHl1U zDL0Us=^jNM5Cqvq07H(trl#cqde0~y3x~UW*U~9z3~ESff?UFWg80->dkLar|4YrZ z?t4FF$^eb!LFZdvN!2CMUVVPp6=D)KICo_1R8=A@-#!jMEH=CX+#CBtet6xuHe>+P z1gSe7fN+V?AjVr zK>8f>?8`N%J;RhLZl3Jxf1Gv=F81U3{JWGam@Nm#jGr;zB7;BZ+7X$b=PxS6AS@Dy z>ap3_rt)JTriCJ?Q~P0ToKdUU*u&M9uMeN6)m4Vd1}r{9ss_8`q3SB@@;rY`6FalZ z@}o5~s;g%?fK9XD$?P)TAPSXvb^UXWENVLYChWhGSfr=zhn6&g>7D(aFCKy`06%*o z1Vyt|rX;I=HS%8w84Kd+))kY1!*974s7#aF(V51J*U3(k{txmPR5NJ7=eIoMqpb)K zVEhLnPi+2L5EFtxB5i{60_yRn&3YuGZuxjYA*&U75%$xN`C^m1ssxJh>gLqy*4WbR zS{F^0)`C%uI6M+QXS=pPTMzR;w}64~WTE5L$`%N?;K2Yi}MXXZXAF?8%i zWH^Dv^oyjXXkYn^Ruf!)MYF4F$cXOS!`c|SadXiw=PgC02n;| zo@7kp@yAOYFm53N6v#TJ4*l7@M>Jd4eUfjLpK+NE@jG3Pch^aL*ZOeLiM3U*N*DOm zSlAPQ)q&GP}APIjPAE@p+-mPBlf%RKJ$T2YA2R;^xlHBe*<2?jUztW0S8 z|L4S!6Ss=XR`=^o?A!K-FdXW+)xuD(4Nbq2ok)A2K~G+woq>l_*M2yxP8tD_?}a`T zu2TMcbqWxo-`2bDv)_nTJSN7z=rkS`^v}ukcgVHjsW}ptLlTH3Ax4`gYdg5=>HYuCRYzFvtYxM45WA>fcW`$9I0>Qv1EkBDrcjh1b4jzaOG zGdVN-ED+9H3q;=mARZn~5{rN0kE@g;JgUhPV3;_XKhTmv>rY%3J(~exdcYSAix$Sv zdi_4KO-B1=M578}J)xqwcjRgjX&H+)%}76l!$GDc=i)sC z6be3jZtnf8`EC5w0@m1E~a23Kw;eO{DhJyvCFJo5(e$r`FK2X0J`YviM>iDnlriuv(8`#~ik6Wxkx;PJmHfj@(htqw^I|o$ zA&pUs9Lw(T6}>W$5~Hz5<`M)GbjpA^Y!^OK&kS8yp13v%Z1tw)e3KwQ0l+uAB7}%s8)1|q zJrG>0UYAd7@1&EC@2JBGkMJWZxM?8^17`JYahk8^6~AvnB7QhXV?PLww^zjNRyr8=`>zmX}ve|Na^{R*$OVzw4mDX^T6((c@(u z*OD1c!gIU){ma%%VRK$O&Tuh{UVxg)q4bjQk{~8REvsHwTs3aEQA>~bVxxi$}{$tNtI8ti2fjAt*ZV)2R zMUv^jyqvYO%hPHV5a6psF)45d5?^2x=8`bM}sptA=d2GuuYn}>DbaiXe%AC7y%KM6=Ks-_mi z-<}dKiTfLn17QfB5rQ}79lZdve`3YWl76 zd$Pc{?(@;{uTM0rXOs8gblR{Pi|_!$m?Fr}Ae)7r+$k&MD-FUj~V@{y}z!VHzI4nPK zZhKg=n3o8ZBOvBxaEdb!+Pos({aci&EBI#U?~HFu;KWTH6hxRJ&=rTc6fYGm1r$77 ztzECVCQ7-^I{V+O}=1r4vgVOC@V3Z7aDuIgj_6n}+ctf>^n>>o1oc8EPl+YU;29d-- zb_O5GKnf%xTJlKa!7tN_Tb+C6mOg|$sEBsMFE`e+&elfNriu0Iyu4}!m~oIX%|_LI z(XpV%KYy$!wv`q1Tf5()2HHZY*fE7$Pzl}iCV8UP7 zmcA0zT;v4Yj1UxiSNlnw`9LcFIpN1yj6(gC9#=0^-$H0$S8{0Z&(J^MW97VVK=`?+ zoYX?Xs*R2Ltze{n^|Ad2Fz4vQz=D#OphxRYdPDi+|4qSyXGWkIZeT-6STdFCAcO z0vJZ<7~op0tgLFNx~!$YjZj?BTG`%|rNqsNQ%o&k^#dLZX)5Xm;9E#>G>(P=v?bHS z(ycbU$^KE-iek^({qF&ox$=X!h~8i^BncO9)9U!vvIrGqm_uA(RLs@+K9_b)Iy4Pg z8Tp#8e6qHzyRNOX9rZiXUpM#9c8mdk0k%1CzR*t3Z0FTl z*U1Pzg)9CdOVj6YQj*dB$6w(7?N5mfvC&Zi3>v9appl!zRg>h-I{d<06wBUuUT1! zA=op=;C}j66JBtXohV}n96?)v6=pEHgjhh!`g&AOCW}KW10 zRv?XnbF&aNpfO0yN{C%53D0B*luG!08uIH@cCFKIN>|l=VlpbIz#U<|+ui+->>ixW zg*gdM-5tyuSx+N|2MIn{@y+o7&gC%gx8k2Dy6=0HdBWZ04f{!a^yM}&Ig$Ji(?x(A zsJw{VuX;>}VXXqX5szSy3N9}RaaI)zV?{foi`nl2c>F`*JZ&#I7P#2;+r9qOG-y_D zc!|xyBY#4;6#fCi82vkm2U1Cb#OIaPih{xup+-jYcRu<@S1=$Sjnec$ZnCGUVA$@p z*JE3hyqKR0ewal+gV4%!4@eOWP8&3eSJvu9re=o$Lo~2WZrk?#k{$?pedb%Y9cys_ z!s}zc-g_6xuFLr|O0e}rSYn7sd0e!YkdNP{MLfFD5T=594eG2AaN*BS_rs=gSo%f^ zdM;S*%Zb}yhaQP(-khK3258ExhD=2uokEBuFOuEpT_cDZwc!84SfR(`$rQ~%Ld`QG zm{?l?kOMAbv6F?mfl9{7HochV9xGQ_TNRy$r*mZwVnMG@IWpu>Y5u6#8zL?W1ho9F z$oYIr`3PVo$2c-b1E9-Bjs$o2_|PJ^rsUmm>=*?2fS3$oyS*Qk0V-Je8ZQPc*ejLA z92{kKXl386s2Bo=6Ofw=Sx~k@E&AraE8JZW4hQ$_4b@gx&#ZdSH8DB{BrAGwGd%_9 z;Z_g;n$JQ7nHs#@IK0AV?)+Q`fdXU^I9rUDSXA@_y?q@>VTgA=zLl6L1Y(>E+=KJe z)1&;eKkC~0nMv7iC(<%*a{XN+WAcoQBCw=-Ry#^$RgFra*^o#A7zC8iFk`IO3q-ey zjl#rnge!f+h{*+>Lxl%iGY4S7@dGb z%8Y`3C=*~6L8?Yt8zHa?k8}$OlZPf&Lg-^^Y++|<4+#NP8q#Or@NFr@sQu^9PcCw9 zZr?N(7n0T0j&YL(6=c3&bJNw-HkNjZe0r&Yf}1%liV}nWOj=&*XUR z*P9a;RZtbx^|Pue^k-3eQ~^;Ov8bN_fcl1EWV2MLnMGJok@hmz^?~0(Fi&2TmuK`6 zFA^`p1}*_Z=GZ(>;wV-@a8+ZBVm~4f$eqME5I5kF#vu?w>d~p>xWpnt;`6#Q8-f9} zc~enaK~{1_K~`R1cU3a15y_jI`-Oew$vKe~jG8(}S^^NnEl$x00HD3&Uu=69pxMwn z!$UZxZcgA)7qu%U+!7r_-0F|(hO$8@}Tyj>V*V&?xs3@pb^r1=Ec&XSjVWjcf=#+G4*$m`RqP4Xg6y{o(gqIrSL5TWF-D#q`nlt++3=a%fMn7!eOV>e1H4dmCy;o(5GzB6GO6v zmOBk-*-yR_NPyABX-UOOMXhR*c*%#v;I#AFyFlil60}wybKwZ|%kX#-0UtcIA!C;| z^yB%6Vhx=5G`PjsndBIdXH<(fUR}yoV$4BtguHU-Fff6qd*o2)3qt+*A{290;q;kk zkp#b(k)x!Xww2%|jK0AL6V7-IUI>R2BcC`99<@)nMag|$B!$GeLC0VPXC7{GY<3zj zva`2g1R^4k`!@tYQO>%YK%u+koo12GB{D;W`nXizXb&|)IY`zA1r?sAz@W!z&3A3_ zEq7W z49IvfiS1MtN#}&lKqQ%|ar9koG?oM!r zgycfs@4NrM)?IgHWu3{KIWzlA_U!%aXU~MbSCV;zPlXQv03N-Qg{T4m7xg7HGo<~?lVXV2XxW7n0;l7haVM%!e@v6#hKcc6{qsM#xD=;vS>gVp~ zpB*i(+VLODY?IuV!0N*3OtXI+V)nP;t42y1mzQ6zF4I!IwV-d8P{^D8tVeVt*|=D2&3mdM?pNi7CgIH0SiRa36kC7~#y6 zig*(PTph9mJeIYF{5o>T4uG&w!5gGfD6p0C%7^D(oG_Z`#_!Q85KWc6Ks@fWZ43$q3!?PUcC(U4U(x*9uN=}` ztgz-3bIu@sxWdN(E<-$S|1v(n<{2%XxqSa-<(yq5-@~NM(91Z_7ZGGjGD9{$2U5Ji zu?#jsr(65HN%5+z1A_Ns_ubb@357f!X_mq3ouFRzZkiFtk^1AciY`6G#U1AsqY1G# zNsw}u!sk@4iTawO)+%PUOm+Ajzz>=RQx-)|5P?K2kjY1ad^Pj&&3DIaYzohP&il5# zR-oUem-Y5#*outz>Rd;})_)SEa`(XdMv%44)NP2p0c^e@_@-}y_p#cv!uJ})tt)Ej z2cL;EBd3T#WwOHK{31*3vn_pET|wimiuBf%8S8Wwu~kAEnlFT*%d zOO;BIcqRM(DY~PO>lUl2@5V$QGj8xBkRC0urN%3e@In32<3i*KP2}@{K=vqL%~AJ& zr3LA^h2`5fas@Bwm?VOh*1BQMS^*%R6;Sfa$EcgSQbGsUMfmA$cM;VD#g%K@o!ah( zQ6ACvj6Ts5#Js7ZxVn2^3VGHu@>Xb>*U+Fu?*{v()_gF z0hHE1yy~oG0!I_QZ-$<1)?kcNKSgaFaZ-wuVp3M;4hf&eO#6J6;%#YVvU3`cFRDzx zn@g~*|2#LKELOv8{j87a@ZWlV%pN3LC&>TiHJYHa1p?3Ew3~u0hDRxWUFoUGrbB0t z!#R_@=-R7uaj?^|_)l$a%OG)wE@kaMvD4}$n&rmY>e_M=iA(e;Q5Y%C z$y9-)yDsg|7#K2R<+NNVDo7|LBn;wu4jx&m3w)8Cb@{NB?rVLq!Dy-g`q*SXv`07- zAC0bpYXw@8!3M;cu(6(|Nfvb0eUFPZrmiiXi&n2CtwOXR4vE@4j>G+Vl#rX@AdrTk zga7Q%$+v%Itk{+4(Y66br=a5F!0rSJJ9 zm4f0dO`gS1_LT)2Q?`}$%=K-PB|6#X7gWlE@mPL-X6WEgdMYm+EU7D1dNXYrt^2NO zfQdHN!KVh>gZUmei$VT&xUcJ+*V{mDD^s57Wwb)2grXuOTIW+R!P9CY8m-gQCYa&L z3-fhq22#K3PgCq#0TqnQM2ofN^0QD@P{Ze1yQ)@f{8LV`iw#cStE+JJ$r%d~j7<%_ z*QVX_k&DL{+S6(`fs#u6+m00k4@y`eE$8aqhnv9%dAYg4qf+;N0GsRb6)}#5c2HMj zLd~Ryff%nfM!^yfaR&u-=6C~qqM=P|mlh(F^FuR-jSWCGA#menNdVZ-Y9^B2RG}W0A=#!ujwj?aDAY zB#VezOV=>f{RF2cd*j@`CK7!8H`;nuw!2(e$J3eTd2P$t+}VIC)2M1!9LIke$>i2O zbJFJK+xTGvV^5Y%0#A>Pu!Rm8)Q0BgIUl;mW65dl<`Hx?r?*GaO%*T%+W+6lS(1$7f&N+`=#iC^hbLqq%w^cmg+WV zBqwImt;P%zysgQu&qA8LEPK8uJkNfQUIV)!?v2NFpXQ^BGhwVwuywSO*LqBce}L6P zNB2VHk1587O{OTXmr0lOwBK2oFa%h#E7^BF)AA(o2jRlB-{&Z*nRz-RgyVz6UU-JQ z$P69BXp#J9M`!f@T89&0aHCs)Uqt!fC>Gf)C|oUP8|4ew2C~>@pv8UZma1luI7+oA z{>CInnv>H5B#zU7ptU<0TLS&9L*wMtffBrit_e11&zg^AL1p* z?BDnwd16Mn6-aC()%<7d`4->wNzhsSDLwNN)8PgKUtAtN1y+SCB^SZ!j|qq%ehg?f}zMEv+qP+f~{BI3l1^)Ct3|Li~*P4klHd#eAiO$b#) z^uJ~lFsq}teVW(X@16em*!^2j0TJi`3A7hiulh;-(9wv|Jozb(K1;9SfXTqZ|D1e> z3>v_VvR(B35j+kL6Us}e$c-*FPW!45B>ksp$zKoepTxD~FC^%(72iC;-D?HK`Ylx@ zYoViW6b78ceEpU4*Zr_X8b>4YpER&M;h;|Z64`S{Ws!)5vp4Akc8C5*xBsL*5W>O) z)_<14!)-dJG98s}GlQwGsFj)7+& zARD;WqVyAe>F+~Bmia%^n7$VVFoW)&UYT@Ym(E zInIMKyp_PEZ3`$|dezR*~EsPyliC?tY2y4JRGIF50mzJC=~@XK(m3uhad4o*(<%*)aeh zUFr~OuZ$>wtNl&wgFZ}wWLcdY=iy4ChI=!s!C`)j^)FjZ-TP*cmy>ZOP~3&C889nT z9VO{^!SWc=)MF*q^4!Y7ACi#&c|~|ENjN%-p$Gm<4EXe~ zCiQ*+iR+dvP~eTq8$aU-l3fKowQVM+1&cOHBwL)Sl#_?3j*}}r+l{|^tu;YRfBi&7 zw88IZt@SVqa`xa;_i2LsJLJL9Oe>HSvvsz$`Zy&6c6(O$@6U84o6h;%M1-{y7V3Qg z1C`42No0E6SdQEsRsZ^m{r9|L(2-U{E!g<&H6O&AoI-egOh_epl$J4?vZ&anuc!_Q3vVvZiWuB# zh8i`LhDe!V5L4?$0%WzGV*3Eb)X~Gz0o5kR9iFomCZk(z`H+s6fM1v-x$lj z!Dbm;_Hi76b1`m-K~lst?!dljf5Z*OOLtK;9CI)a;ZVE7OzY~R-RW-qy{Ot;z?X`60yjhO6h zuCQC@>Q!(VQ@jF;pauzsY2MkK)jnBnftN&jpMOQef7&|k(($G$f=aK^Y4&Gy|0%hi z8+@OQ)9nI8G(qEeKDV8oR@cp^H-%dy%7IZG5-S*q+-(h^!d^li$d@X~^w9WTce13* zt3MVoS<6slBNuNFu3w9Nr$sc~db74L6>X`Mw4d|y2z6Ce#GQTCF=5nGYi0F}$2|M4 ze=5@Z_8a}iTx}~1xg9AA%dXh0z$$A^AwA9J8F^i?edN_}5geIbn*7N^CX#{~*5LB3j+qiOgJ}e`6?0XdZ+o0p~Ysm>w9gQ z{o$_0P<~ol;YFuoL=kKFP@>RH{<|)2>jq-dJg=RNDA#58k)t$S&y&d`>J=OFFhcks z{EK_vM*AwG15Bg2Uep|GNO@SBHnb-=oXT^o_~c2g;N7_q+b4nSq8?q(!wSa2uVC@( zSTU!;6B#8+HJiFG6Z`8CjfiaGqgTrgmz2HXAWip$!ILcP$w6^1#KxSNqdb0Uw3?FW z?Kx!^{a@&hD^ZrTWBxL?{ews25sC3;OV|5_D+orM#p@WbCnK}IT_@&b{q3d9@=uQi zu4#RTZ%yXx5s9~}ummf) zRC~lARg!jnuKRg*AImc?`$UW8%}63^`V$1fcV%Ccx%8 zI}7k&+mQj5I^|3B5>8feHkMT(5nz)Kec$-P`)eVkn|-EwjrT#HO!@^fD^nZfTPOas z#+vL#hhv>8G(T{z+G|z1tRy1-_ug~~8zui`qKbXG+_0$49&AJmE~VBtT`GPV)KHce zwyEhb^i=@lX_~bS*A^&scPM}lMW(iH)J*elw8!UTlsg@su%tI#Z922G9c43(AZ&N= z^4{`uYLC8+h~}%AbpFWo8UiIA=+Bue|1z!KVq2- zzMHjdyF}VYF2R4Rf8=wwo2{LCYSim^G2nBVo&!Q$%lO<56%EwBsy97c+qA694M237 z6dn0m=xH0a2hKs%q`PvrbUy4(KP{C33)rp-hgV;R3xGUK?h>QA7Ue)xquH}mU~3+h9kYxlxp8lHA@D}|d+ipjj!B`m0`E1Yy>w|?43K53IucB9wR zbF~dztRy*HsXEkx0qd0pmUjc+1>)Ws*k^fPB#md9NVoai2|0p%zXW{ba=s_OjJmeA z6eL9bA|F<=>2YBnkB`Vvj@v6ah;Hv%o@#-cCf{sm|ao1@Ih%F2t zlgs4V!1?frWXQDY#!pU8J~My5vJ{9;>>xB9$|7fFX7x@xg7MGwoMt?JGoAWRJ36xg zH-i#F?z!n6ReZlc6ycSXyzv9ZovYq2n9LtZeL}~Tz(r7k)^J5%jdu9*b#0sUVYGe6M{C3_p%^9Ik z5*{m}m?g^`!^FhYjm93iWYiLjP9HN2_y!qdMwgt39+agAbX1Z719M^-A8$Fh)0fm^ z`G~_vUa~^{a1ASLTu@(gVCEe?0Fv|ky(Kq$;167G zLKr(`DpKQ$-`zBw z2i4K5nc2Wp<`=tLicQ+g#AuoK5rg@BlA@(gi=n%@`9i1N*C(T`FUX)eci|6uRwgL- z#fk`sH&9w?7smgL=m93;klsW7c^=3o$H0dLO=ET6rb&`6I0^IF6Yl%_#YfV=FHf$T zBD0Jymv8}SxOCedJ$4`ef!zxtIk|O@)pF$G!TS1(q?Wq!2rWgES=iOx^RUE!al|be zq~zjQk`GY+o!f44?M2c>Y|h5-QE8&{Pye{0i=IQ5GyB*6W|hNu4}6Fev>1sHp)pZ72|_oLRIZv5B)cvp13qJ zHGBfr7X2^gD_?DDaw`Bxa4~lTYhT^o?YrR$xqT@H(bF+8v^F`sxeJhorOVy;Go?sn zgyHr87^Gy36#x-NS(j>BWiP%Sy2ZAk?tPFS4~OOvCBu9?C-`Kd%98ts<-2=A4jJ}4 zT5)U8sHcXn?tOLkvnplL7P~>>s<*uze13irS8cA(PIzz)Vkxxol7 znFvyUSTbZ1G`ZhxJs*x0%Kj*6{(s`tf zpC~_^Io-`Ysi=QM$Z!R8=zAMDCA#ywcZAYmJHR#)MB!<_JGEEXA2T9oW0iEucfp^N z##QS}0g-7sYHq#UorfHep6++tn&$M7JW9~L_3>U zlNV9qu@fqwBnJP@&3S`5)VcI88qvDhA%&&LS(TQJB!-57Zd$u=8f@qUK>=J-A@=wB zAcnSK4&#~DRcW{x;zXSwzWFn2BwuGE&xY4$ z%zxy`(Ptoy^YLvq{n`mQ?7|-M9IKW|Uk{W-ugaed&>8SecQ=ubs7@caZ7ku7 zAqt}hClA{!O>w*Jg`Fu=2plDurfV%^#&QSyGEu^CvY`}Ku!%K zhp6(NZKg- z#pp!6X*1;lSrjtLH8`9mZn1i=;RYrj5}v}#Yf$|Z!Pcj_9Q>l1i^+s#y5~@*c6ZCl z!^?4xX8PJBrwTiMin6Rh9O}E1x&Ag`<#m*A177OXqh;j57{RcJf$C)Aw0hlR>JQo? zX2&}!eCuxsQ@JWn^K&(pbX!ffRJvjTk#KVgBX4RSyVJ1w?H01gH=&I}70NlPCvG~> zLn4#^<5C;cGEkMVRx?u$u<-Qj{kUyRfAvDR*0az*S9ct)S=QRwV#~Pm(Qm0C67*gp zYPA8(0J2ZitZy>jvEoViZ~Ir0QE;v#At+!txU%>x$v!6+HQ>cqEzUPu=4**bjIE-t zsm^NbpNSlc>c^PO%hCCb2CC8l&81cSV3xhLlAg5hw12>;2T0I-?7gVq&I68C7XQCCJXXx#Tkqg z;0-B2ZZBzuxmk!G+->2AicmxC9Z)-jz+N4wU_;~+|;6tR*QUwyk$20!6! zYZJr^mLO|UrvrAxTp@Q#6XJpbe3jF`rG%X#^F zClv5Jjs$vOS$&tZiV}kS6Z*})D!5=Us81?L&eQB8P2iiYJO=d2B0a=qdRohI^LVp{Ki=3Fp)Iti)r!(L1mf?fu7X;hL z(<|TkpXVWp;LYF>y*M-7lY#Wb#$utrZ&N(_dO1a`g`;N|b%-CUm^}&;~eiki~VN&ZgO9Cn+5{t863m%W6`?*Jq@?>x*q7{2Fm9O5A)p z=qu2O5fYcJ@9C|AIi&CFwVu2iwTzewXPLCQ+e}3b^0A|OTzwsXZ>FPm*}+tx=DUOR zMH#3Bb`)Txo-{(|04TI~aM;6_7ie#Mf*w1uqk~NBm{79kLwkm`m{S+}1wt()PIxu=T3EIAGy_ z!<^!^QEksN;(_W5ndJ1fT)j^hYTGvNZtanZd#nqzrKF(JL(;U4|1Q>zT;-xR;41YwRgU$MS(fwcioeCXMuSNa>e_A&&`b3aEwEX? z0bAQu`h+4#^x*i<`Ur>EUVnk|h_1(;vwmTF9fQfoSW7SS%_#yK#7utFRQ|}agO0q< zBEc1}c3cNBv9e0N6M!qt^2Xe!&F|Abr*HF}j0 z7cWelS6E5NV4@H2h}0;Vtv6J(WKeG?HK6%pruE_G$;Vot`tw4doJEiD&f;gbh79t&b2bM6ZoY683P0kVR7Bkv0Tl2!{0ncNGO-4DQ$gce( zV$~r4rRIJ4CpD<%qmDMj!8AC{qbH>8!k1j;FOaWj+`wABfblHJ|{BN>os#36M zmO~GR^+&ECEp~mjf@0);U7I!z0H9sVp8!x0-HrW?LSAmS@jXiMT6_PUAN~ShxcQOz z*L3NUMK~pimCr$)vOubkVTRb}iSXqc7eas^RV_14et9OgpAu@7yzWElX%fMgiGJDH zRhe|>euFx2ixuPG%Td1od6RJhBGGYC> zWPhhS>oMQ<@m&(yrUlQ@N5nitnbLSNeO3ZMmGP~dx+O%+D4vzYtT3v^RS7XsH%z6? zFtpEOdUw}o+2*yyl||lsPNvYjk*D7b`3UlH8d7e(ZE9#kZr^icW@XOW-b&BK-Bx#( z8xIH$GqcoNZ?nB8dci)EH;#vQM=W6P^-vz15znmxv|it9&vZeNSKYx3!r6pAr*V;O zKKm*)Pn6bgb8Oi;;d2L7bd7qsQ_Efh>0s~EuwNYq;M*aZ%`xq&N!^Ow6L+=|kZ9x9 zb{nE&v}XCdit?{!+e!iF(&dJ^X_`gDh2rHkWtLpPWRC6Ki2zF2Uh^{|n0%Aq6%nhAozUJi?@lL~ zuTF*mGGVkrE)&qc-a!f#_2t+km)no&O>4&f7Q^Ow%ube;Z$|_Vq9gUaM5Q#{De<~z zl2}rO9gVr;)Z)cHZ=Azg&%0UqRG@^3ye<$9nrHT>H+h4_^X0$nkAEA1FOrIIWWk?A zF0<7lTu*m@Mv>+zQt>$b-Z7U+d+qIJZX~bTZ2>+W9eKw8g3IoD292q+fJ)qYFSdeF zCX!NJ1pZsCu$+%_Cc%5{Ebke=*8*{GI23EBK&RMcj0Job^(!ZOd+!0}Jhmx?2}h_Q z93wT9(@v7zIlGNUZSoL`4`|!VG^U7>!N1-|e*OHcY?~tU{{yz=E)g}xg!rRej7yhI zUGV7Vm~VgD$8EGtUjY(6=nWp36ug* z09Y|yiv579xPb@hSV2FYF+5<}5W0xySsTd$m)a3B!=<&Rz?Ta_FHAf+owq;N@BBK9 zXKNI%^~RHWx|CUN^Rl_(dmYRzci#uA@#fY2%u$GB~CFNDoxPwC!PU&L}Trz(MVY934)#rz`(S!8eA+(AY{mhqID6f`P06T8u;a2c&h+ z2J!sA3F7|?iUV}G{^uc@W5P)*fkYn%Ip^0;1fS3Oh7UWk(PCb1Kko7fX)_DEAjkJ> zD=W@>oV!!iwgUQ4tL+wI5LVIh1}#sgJZ%)Bt=fS6s}_VIpE=b*GRiVOYc>1?e!UKi z%K2d8-sg|3_m+j1w&JL;&_Jbr#bO@1>8~NK&t;QJm3;nQZg-?ec zr&r{)8oSzEExFJ}Z2xHEY+IrhNztD5p> zyGyqrI7;>Vm9vxh#LnU^6?_!p<)X(JCahT)Kl(?Q>z*6@ZXfeJ^s$>rIs)6<4gO90 zf-)LyyCY=SmFQtp7B%{mvd~@Db`T$#%xBWxsX;C%9o*}ny`&qJB$(r|c@D9aL5qE1Nyf$eHF$4BWycZI0@?erH|9JqeeR|;OcnAMf~DIWx+nA(Pj;|C4aOfP z>h&@np-JSLkLwb(kU$uuEeiQdOWJn6U6rN4XXJF5#)kS*(gclO$`bFiRN>|CEF-bd z(3d%jC`DZ$H)llRiwaNjXhceVR@bh7RCHNpx|ioBeB++2TzF&*xfoEM0oM^2g>a+! zAzDm43D9LB4FViXj(PIR^!W7IK!c*Qq)t8J@WMB?Ey#7S=+8*?ZYw^oKYvf0Pd4Q> zh$sXO5u}kqchD~7bk)llp0b3gDgF{Y#D<7Ab_B)MC>!Vd64+L2^ZUmXyxjPJ&#bIi z=?8glkHK zz{s7hJVk14s*fjoKS|~X%+?_TG7-fQABa-L9C>eOk9NW;?j!)c3|5@PxUF1@Hh(v; z^*rl%WPcyyS4se(BxnGjB;B8g55vburMgFcXzhozlXtF&VZ9JpVcFcVk^+Tc0-#Fr zYpkb1z)UflxAgDNVNqdlm3qq@wHrJ&Q!khrNbprW;;w}Vj2w=4o3M~KQB4}$3Xad6 zni?vxaetFknbkWew3TR(Z8)0`guesLFfHKG5XDYl!2M;rv6vWXv5ztTU}>>d@z;=lK0X z!i`%+z$>uLda};uZocQ#ep=sUZpH2I%YM^{V%Ddqs&d}GEJ-APtnF-m@qybR{U6yI?JFD7AM4-OwMqJfPef`RJZ`N~avbGeG?5^uO z)J$ny$7JCLCiiN?G|n7e@cn2~DD8IJ{W-(6yYKnF(U-_bac7h-`NVf4Qz9Su?9E&# zvp|W@&1M{l!9ebXxiZwpjW`y%vhs|-V@C4(_L7k&8iSiZrMjB^`gP?rf32$48g)%Y zSzE)KxZfijb^Ns^%kN-)aVHKk-Qg%hBOj+X#bfFpqqnRT1^h(~%*>zck=JF{QKo#< z5QqHSraIM7E|agWMST9aRsZYBWWIi}vOu(`jqIDw%8>gWkyJSQ-Rk6I8y|0K5>n!H z_-*Z5*Y?#S)XPf6@3IRC>X9!^Uxcw3~wa5r0U!as{_;4Du+K5gQZY0u%J? zJ92^&!UZod0RXzMkvdl$$E^gz;HJA#dYKT^a@8+ST!0jAPPVEl%*RbBn<3WnC%jAs z?fpwU+qTv%MG`r!G2QYEE!LBMM&+-uF1%x)tfBJwu-M8wDQy%S(;G`8`3pRJO-;LY z8&hHmDj%FMtgVX*m`rkD5qkNHA%{snMH9IYeEu=UVn43Wl4Vk~snB5m*dl01Ch}S0 zTqC=hp7=!O`S`0g+oWt zd?B;G-oXNLM(RoAd2&Gy(KCj7IxNZ$qM229+_f<3W^ z-G$zoyT;k)K;hC)YEHlRt;R4Xruswz?mm(ENaYi*>2)!-K_kTsjuj zE~y>GiR?8(oFtRMMpm7}wcYI$zamN^5VjY&A~Ba0PbT?0>3#j42fSPpKy4`#rFbob z5e%nUZP$ulpXPpq@mKeM<4#4~w527P7b>N{=B+U~bL1S-{`mMl^nA^{{0O%};6{u- zGj{%aVNI{~0qXF$I)WMybvipfAW~_G1_%V|rsDxrgRhJXBeoX4)gS4w+r=Qc>CUYN^l92#UF znl{BoHHTcn=X;tWo@-+^NJXKE@yr1F_(Go&g6~z7c{oVv?3nJehgNsqB%tGha8sVG zJ=PU@TJ%bpFrQ<@m|vz4TRooXQ{e#p-&W?11dppH+}OwM;n9Q`W%OM*M3my!5(4+9 zL}&;F@3|bTU^;_UM)|tOKXu@DjM#9g()p>=^IHTIGIVA7=&9aqL`j3C+`b>(0d`62 zRB1Yk9Y)Ncd!)??n5*$iWp3QX5K3zl(SY|+V5;N0Wo^q;?g$kb3U<5oJ%s4G|Gmz~ zWyE!3Jf{-HaZs`Ou!p#7HxQ5Ytbi9m@jd$VkZlZX-ao6x5?SAX1%W6qPcV|idhP-7h8sI&Z%6soK5Wq`OActEeTYW?} z@TevAJ44M)_D`xU*1?-E@8pF!GA4PT$29`nk5z@~JN#4N+g(%K*R;-1jECfbm4LlIH;fhYJ$jDBYi|L08QfU(6S{szDSuU5 z*57F&o*3^|6a^5dLki`!;zoOkN zf8ViD(Y5S4w(mAE>&oLy{}qNKZBg|2oaG_Zx&=;-VBpn)1L3mnzi)5e#XLT5+#j~M zI`bBJRp@b>LYX&`RI$7i`yKiameJo!*hIg>l0EG_kJywZxZA+IVcRw#qQoeQ3fylBc*bz*jglxE`1KW<9gDMB zI;<&4L8%=dC;Qyv#GyOyz-k&_MtS7y^u~*q>i&S&?-_9wSvCjVx`u{^>go@2l(Ys! zKOZa2*LKnV#%N)fR|zrZHrG;r^;G1~Tr<(j{kb4f=})n46n3tVjfA0>z#^gUS}PI^$LR=$ITE zTN6|gr6uAFqg5DMnkFk14`E>$H9KFKzkl!NxL@^}3vFpQv_NFE?+C)Uf-pA?SBYp2 z6T|#pT;~s5My4U!+e|?g^)VqhYRgwSu{b6>bb&jU+RaTKGu%hB`=4OP!CXCOqL2-R zS>2hYCSiu)rpDMxSQVkOc;T5r>Vbf#iAG2SBkldh892lqN1OirVRapGROS9*ZvJRm zUKa~>$)k+erk{U;!$vXX4sUUytNHz;@G%*z72KZT>^C33wp%{&Q|j>pX7J&4gxm%| zMw&W0Y3hM7&QG?MLx_z93k#H)SoYaJS+Z_&%>81CRTYbju9*^n$7ON=GN!@iICb6? zMdVk0WSmLRY*iP5Jhs@82D%_ZqWvD=N@)ZP;?K1@UNhx~i2W0@e&EK}d_Us;^RUr0&kj8AgFa$(Io2>P zh=jz~u5F(;tdriL#9yVUdO@&j5o!kY<`D9TW*it1H^U{z`=?S)_h(!v86-x945c7B zu}5%`Cc;TRbrH=G<;y@5twom#YNHJKqPFc)J+J4SzkBEFSfkz-*7%G!QLACd{~o(| zB*hB&EBT(w?Dsph5dX{5R!PhO7fkG=VwNCCM*9!486RLgy1&HCDD-bD%rXqZ0KoL~ z-}dll2A*hQhNZg(*iA>F&l{~}ay*Kq*;F zYux*ToM;Ny+Kw4@bg*BGi<4bw&zmT&sc8p2U4y>C@42s?+JO!V#vC2wmZd9u1#@p5 z@}i-J36C0WZVVZepv&brr~p2aF`7alZ&u{{DmnGMGY@boG~vMZ_91igUd98J;cu=> zZiWRnJ8xuu#{vNB4W-Nw^w^5TM}TZT)x#w?680$3Yu4WA#iYZuewyZt1!Uz>+UvV6 zQ^m-aPgJ;digdKQ3S$#_tpETi3IX@sH|i0dyAICYIVSX8vTq^M0Ym{TMHV5|_Ty^04V*t}~;@5R$uIoDJ8b z&iSB8pEp2IP(RcK;yIM(czOwOx}sJNo~u&(1N>&=a*=AirZluaq-|!~lvP%%l zJ>8JF==#j#CIx#b=e9BRXzw#r*u^aR%F+P{#Fb)`_3m zXt`@0tVmYc?;fGznl3TMk>05FBjytM5iuKuq)jUNvl3s=m75^Nt-B*Id&OSg$bthZ zC;fWOgymh7IdZ%uQsM5;1v!yb)2b(mQ~#z5CX?rTIWnE^^`~Zg=o)rVcV})swA|+1 z_w%N#wc%a5@1cFk5#nmywfJ^)n#0`)c^Xwkq~Ep@4i>A)H{7|l97(;LF>PK{nLqgJf8e|LOktj}Iv#wt7a22r_j_N3sprQIhsO>-`r$-}i`^9yywz4q zeI{$+Y=i3+Hlnui4e{HukgW+CZ!4$W1C+Z_d%ZbG)VV+R%^B)) z5Z$!>m~A*s*CHxwA=$?VrsKUaL>}Shv^1x&^jaT2wdlyva=p)W86B65P3v-f?sk9B z&C_-8oRLG^OQrVc6h@4^HLsc) z(ddtJa1J#oQ*VAbemQ*geo3pXC+*zTE}Wp2x=|5;?<&rjY(13!GG=LR;%Ou+rtGHE z%XLcbQRv+oBj;8yt?#(O#g+KYuoj5Q9d_V4f;^Ui>3bateBd%0HySDIQnqnB8yP9S zzU}S`epH>-h&lv`#|gXEqeelz;tm5i@~Ma;pR+u;z+=Q;gC*1=A_1h&ZGQeoQU=7Y zutO)I@=3QbcO61;DQ2V=muKVFwg(t;hwM|+@E$BX z8JKjR9jQDGf{8mWstu?P%Gg_fS#~Y&&>|-LQG+kQBUH?;&s9a3(Z}~ z{L!Cz&_JnG^v$j9BC_2YlyX-kg7O~CF2YtM^CTKNfo=T5<1}aU;(~hl)AaS>{25H`%V*sS%Iy>fsN_O)RPHJ9b3+s2n+j#4(ErvrIMkCjML$;pRSre33*XA0}l)s#q zqd3Lj$*(o+hLyp)9)lfY-CasDJNVs~TP+{z?l`s>*i;t)q3g5xF@9 zp7w!IH@RmxzQ`^Ogsu5^pc&yoy}wJ1!W`Fn<~V7#NnFC)b^E+RQ9Z5uc>cS3eD6S3 z#MGzR_;SVgjsvUhka+wVsbNeet(%9?iDbJr*%kusQ3AvvwPLlBdJx*)CEv zeM{G@Q`&5^A8Ffs86Y!>JWdAtntk;6z2dLdL&)jOu-$reJ}bSyX{jA&q6oI~vRIs( zw5DX)${wG)`hVE^%BZNmaPMKLp@))&VF*DQX#|F0=#UZ-kdTlLY3US@1_|jBQMwxh z=?3YN2I+2i&;Q>0@jahrtywc`<~jT9{p?@u9Q*b1fnf=YyWW4KF=@_wGygX2s1WNJ zKaFONvvV+4Bc2}C-`r$no}SP9o$Smm-(0=AY;7bC84X=JJtCPaiS}0mRA~F59fZ?6 zYM|aN{&~GuZ%O6@1pSA@E41@u@6BlJ&C&|8>Vk2u zJ{2g{$KljZ_ig%*<^5LAtz!uT&8DPo&Sr_0kLUhz^@VG7C+T-TA1)}&a2)9LySf?> zFuf>d4?>yRa3^1eG4H^LMAoiI%f#|FzyI{T?YS0SaP0Qy@x7+tuQ_j4E~A>d7)*Qg z-T9U8Z6|ASHzqh*|G{J;aqpz-F-5$8sG(-!TV}mW-_zEcpGi?yJ3K0WH*Ydo5>v(kR>6aX1qpY`t=6N<*~h9{b?V>wZn`JeZw4K%w?q&#(y6_p)@FWAkoj zyW;x#lbwNqk&)hqh2I)Vw|(jKye9qCGxt&-#g7wAyUnIs6O{_()g(;U(f#hvhz?Tf z8ulaliIeFCz3uNe6=ct`)x;ZJJLk&0cV0`&%zxq$SH==eyy}>US!`3G6&I2;UJt`@ ztr@8&@Vg&b(4(jt8d4YAXcq09Dw})puJ><|`N5&#TbGqv3!-cS9!}k@>qf!U;msBm zp|n8{LXbaBl``Skg_$_{!N0CN)&G#?sPyBgtjB|K<&oNzM1}pfPejjxxLcaV=O;}@ z`0J0DCM+J>UK@sW<^Eap|E&FtJf_E8h?loHy5WE6c&U0n1w#9zc!GI7`<7$Utd^5> z*r?JzFYOOU`lKNX=LQ1->ivbE(%K|35}wP8etN7=d+HW%JG$e8$)lIVFLRas9EXUb zXzJ_-b{KtWt1p;Dcd>E)`&)mC+t7%dV`vga(Jdtq+5 z^R?z&$4WM}*G?tXM36jC;8X8C@&$dJUDNJ;SDe99X=wh0)ju{O?K^c!+WOM8Aq!^y?bFrpJ#r@^etkblNEY6LuKtyXyT)g82X#pXOD}`ctHdr9%<8 zsrEK=NnLS49QOupS~Av0-wcn2F)J)C%2e%@~7s z8;?C+(8nBpr2AiK#_=x#DSp?@N3Sn=>oR&HdF!@908Y~Q;G)P*vny<;ViJB`12B6BxT(R$guF&Lx+;Wj;jkG`SHsbjF0%j*)^ z>+(#iv}V|%N?iX#4xVU+8b<-H#z}yEOe@=y&$G2}|A@?A9;wM(c3i*t(6BJ(!ZugC4FEAuL3Tr!6Q5qgKvPr|)Juwk+u3DA)&uLpG; z9Q>QLb)!(0L5-XO1Dq$<41i=MLg-{O8>8EfecG)5#y0*kQ&7>__t6O3zBOE$0Ez8> z3gKeUy6h-Qhhkc`b)6Otem$*XikS?yywhgI_DA}s4Qv9)3!ECn+;3hrdqfZ64_G#I z?oY9W28T$WHW<`L6lsg4(?__(D&2-DWDdUG>ORkE1!r{cS)j8kw=TuO|flYMuM9l8no zekw{N_5>|zL#{UzM;3;!8*NW~tuWtlsPCOli zR=Ki5l%1z15+eTm2}^h=&+q7+vux9cz>5v?#io17Dv2gCu_>FL`TYUgtbkmPlf(=2 zQ=kPYE${1CpUY%R-y?6MZNxVYj5Zru-C|gXXBQM4#oHTqE^J<*K9PB&~k zVnn4JotBzwnY63vBhlrB;oiRtp+=yf%Ak}!ySC?hIx~{D5HyerK2`o|MNmkd%W+Q4 zM9=K;#l@Oia;Kl}S*zoMgA|e?s(-O{ucJ-8*{jFK^V7ezi`7!Y=5|8{MY7A}ip9#$ zbfrF5^6n$cA*=Rc53**rdLx$=5-(~mfY>qEHSY@AN2s&%OJJ`ZvTIB$=Gn(Math$FYa&gQ zxK-}t$=0}qsT<*!7ePnhvz+FiRWkB*r&Q-q`M%=9FgB9#V67N_H}z-ucOz!}8yg#8 zGl!vZ`<~o9a5*?J`-ZPL1L1RSJv}`j3`V3mw6n&CYhe;tIJuK|3!B7DC4$3BcP|e7 zyEXWCAcL5O9gL{V@2)qOUlLKSJDDa_8zDH z{{D-tTl&@f#A|O!&W|%~Zm!*KpY7&b4=-0kXj!Tj)hW$7XQYcf-r<=>PBk*T4P~`v z7;4!v8oy6}V({W44=r);{nuN)!nbswo3Ya2nS*~T>T9L{@c=nCHLz|%)(m9l>N`9i z1~{nMeI=is$4<)UA2PgRweEn&ZpqJ8Eb_AKZAQi7ca+jbV zD4hgju;zbQ<3o>VVkDgzP-_9|D7n0QvG4D?5;XzP98uPl>4Wi*VdAw4P0xxv$7~+p zbBo1M&Impopxt&g@sbvqYHM>)rElr^Kl0-L6V(CSr2k<|zz7P7DzS>dD12xWM$duaU0usO+e_wDZ6TgN|+2oGPi zK5hLpSyUL*UJM1AxlKbS_Ldseo3B+xfS1K>?4OEbg4KJd$D=O~8!lL$lHe3vC>llb znSB>MV$67=NuqxHew)cC;8O3i+EDB6d#w>+T;kbUx|kj!7j#~?SoPagkzqpO%&qIz zm#8M1amHL|%V7B7Ii6QZ%-z9(me+^z4{TXSmL&y=F;WjB$(d~%QNp_j3{4P}1hh)% zrMBWWWAN7f8JsQsgPS(v^6Yc=^j&h|@LFuMm7i|j!fd|Cx(LI`{igkLpHA@i!x|`W z=(`G(SjKf1kFSu=&6(rFO3UQt%6kW!fkn6ZS3h;~lS{%96RF2%j{BOdE*#I@#y2yB zhqyP#xCAVYog=6*#MPpfZfVA9X5A~<=P73P^~fFY;F|pxJ`y%l#S9Nen~oz3`gX%J zjLOn4TSp^Z->-E?4Gj&|+8x@@9!Z497bJ?`7A>8NUzEQ53=lh-{f5n^Wqt*Tnk{%k zAIPsuwQ0a@@S#jC#;(l7VOw&h+;gJ5+Qq=cF3Us>dxj1`;JyCtikiurzg3( zr=shAEesKi@vWXl7qW8e3)i5I>7k*fhN59Il7BqLvx{8m{@3V)=QA$b(v{oLfC*Ak z>i?Ri|DnN_nPjJWcm=amf%)CMPQ5A~9@)EFFTf!Qs5qZ@6SgZVmo4*on=B7B*fQXM z@*3S&um54_O;od`984FxZ&J$ly+%mRM%5%XzXk_ZwWZ!hP zYWh<2`fS8+1*?Fw2$ixG8K#6&gn{t*6&#j58g7sdYB5d1tgWq`oFZ&|xY@NB$!u}i z8DGBJ6vm_Aj_g^>`0y=?uk~>2)KK6bVoXu3rxY+uiv#OSc-Cb)37ddP`E_7SF;Z+FTb)PenU1J~yc}wwjV+3q9226Fw5~1cOO~D0b`jzZyLyd;qskU*N zY|4zddF+uXUy!g36z4!vnC9N7REv*b_SztGmU~F7(aktT;mfSjL~1dYtK_!3FNZ#d zO@O5>9H>C45LAOd^~`6vQu`S9^p#lm1-#3M4Ul)k8ZTH6u0-It@HNlOEl=OSUiR6l z2sv~s1e_nKzz6{$C`~Yk+0bfLlguM=@N>u3Z%Yr+a%Dp+J#!N6=4JjO_FdlUW}xAPPau5nC{5m6G9l@Rp^SK7-_fWh^=K9XlV`8 ztu;khW-7)o{m1m0GAS@Jx3F3ng14B%P}#&7xKITMGiGo_kzG(?@b_>5Fb0s?c~uIF zZ{U1WTf#X|%QYWCwj`k9M3|=!XDS%n_~7aqWHBQ7EJLlPy88FK@Z+_o(Ug4e0JvR= zy~Op{o+%h`;WrrQuq!svy7W@+3IcNRmZxH8MbQ#&j=Mo)2>G_XgL6lBI=pq0HVT$V&oHm%4o8rH0Xdsd}GlmoM zaDO5xZ9BZ(anWOcz5X-aDt-3Xxu+QALd#n^Xj|b*#dIjhovM#vlUX*!XUOIlZs7 z_6FovnK)py5KdCfB+M|3Un}-JA6E)Ao?`6_ zc2#S}nW{;37Ja9bygu^av``?8GZ+2*WYF(CRi5@~yh?#86qU!fBO-_Hj|MC77w|9~ zzC4X4jghO%x)h5h51%P18R||sIne|O$l+;(9d^$0;cmc&9`MH^;h@`}S$IZ{b zuoYH%&!4KIM?-`_4;I|}eL)-rnL8!OHpej;{4Q-S_=<%rrQB;44~w8ZiVN?-d9Qjb zbZ&$J3WHU+_ylFS3o1@uGG}k-`U9YiKY~QblFsb8U1nO09BDLZNOZ$}|GtCh!Vfz6%XXb6R8ED`By7}z!qO@j{Ep^||hga#q^QEDa z9=Lj1INOCa!FGUhjT8$kfQx|ylOW@Td?gPpDuY5}sC}>Eo@V(@rHeY-4ty1J(wq(< zlDPkK`ckUqDs$7tVxyA9Q^tMKN#6N1Np?V|u(r5j%_&?{HzE);j}1afX1To;e!>wh zm&fLh57n@;Vkfqu17$DLSZ=L$1X~0;} zlz8_OLK1|e|Kh0&zN(1OHQVeBMrzS%ne!E>dQ}rZ$UKZs-bdSI4KNvyqkHHMA;5aG z5jH{s<^>a@vD(|Y>d1%-N+Xy*q&iupX3kSMj!h#8F4IlfamE6it)hA!yoLt^~^I7m#-AmA-sAvr1_e5vnqx*Q5^~<&|pSJ z4gYL!es(&+)9p1i00a&veL5m~64vp@`j4w2IoV2f#p-3T%I}zTPYlptrr>ALW=qwP z6w$)vLf)ld9qU9%$#JD72o?l^exoXUt~l*XdW;fTho!d{@bbopAvDxvbHWazHBKZY zJeP9Dons6U7$8k0Q~bET&B{Kr{!4E#Q*a!RAp{t{#>GaZIW2}LrRp1*g)IDEu|}D{ zz$l73{=iML*TJJ-R(VN6+FWm{YFJVgoAhvFm7v7&P)kVU z)|Q@rkR>PmXSq)NSUP2xgTu9&-ICK&knswqKVNO#(YC~t*Re-BkPCLtQ=I#Xa?mCF z_4`}B{TrN+zxosL#BU*(&m%QLjWr2d71TL?~I*b`hNMRLyONeU7P3a#+CxEIJMwc{|+k+7oh~) zyX@lPg~~*}Z}mSb>n#kX>$Wx5-Z2cfyuLeVvb^3R7YkJQzCluJXwmv&^xhX$urt0=mLZi_3Z#I@NG z2dWk=WKnXTv74XQE}zu|D51>o&mED7|KMP)LNx&EXgX~5`@P1;h#o*Dr#D`?=z`T7 z`Sr!d9Y<-)$q9$GDIv(Rq(Wh2y5z_^x166x@pmJdAVs=UcTr*b&0nUNCAR_hDQ@ql zIvOEJIB|dzEft2LmX@ifr>6il0d^93a_!9QlUau^Pa?!?-N&fAY~Dpy*xh#E@%XNW zKdt@a5YYt>qsEir!MRJ{n&I`<-B`)vkduE)RsB)aasKn~^AqK&2(aF_yI6E~bU)s_I)KlKkE%;~5UM%tFTC%o4eU!C4Li z%~T8u9#}vz(9a)OkUzkDdmQl#P>->fNFHbRQ-7QJKC>-aU4rhp2tn>K# z?ApAPSZSgvr)B0fOGL@|^3Nu@pPB{s|3C|1aJjEw`&|?=betKtYiM_2|FNdY?H5u$ zY~jzJg_)VFYns-ha|d6pESvDIchcD*i2=KFNrLvM>#pRtp8aDz{#nBbBqpNkEkeS$ zweO*%Z%E3RkIS~UBu=&$y3aWXD3Qd&WNS0)jXP!}==(`YNwZ0$YOLc$qD?{{ws19jpQQ0$YtZ#=2yNqu(Cif@M(>7L71Ts?R%Emm8dy0@P0ANoChYB1O|dTcFg zZ0xV+#(D7&dAWSHmi3ZKhzwNC2iDkg@?P-l$~GN@#f{w@^=UnL+|r$H^3?BBNPWBk zf{~J6E1(FB_1&IjjLms(a2WahD|(vDV?+}3G;-ESa*MlSE?`k$(IPZ>OFMH5JK%cP z=+RpIqR!#wpw9lzS}6ImY;M37%e%PFr}!z)Uue#r9RzOG#^d~My~Pg;g#=ijihqa( zEgMh|`Z$|s*J$D@{BOO-E`T!Q_S2ONi0*_k(v?W z-?}`yNs}5F5f%3(Jo_F^V#=KO?s(6yi22fnfQDH#dUBz1KPhYBZpgt~Jb6Uo@yzr~ z!G^H+W0DPbn*sSv%%zi`C_FT8*4AJ2lPcZyXCpuM?AJ!#{n_fZ{T9wh5vjYC7z!>u zfyazG?5U|xQBVf!)WMlz4w3Cwx-9{m_ZnkdTzv-IT80`QE*ISa?9AuhM)+a-(=q{n zD!}@rOY(`eGiF@wPII20i$j#4!Ok=X&*c)r*qqM%*=U8%Hr(shqp%o567}oso3?X_ z3_Mn3mv5Kcxd!5qH{A}069@ME&IkF%w#ypriYmo*xC!6>b65gjoRoY=FVhq8QDDsV zzP8p3x~`EDaS~6k`+Di2Y1wEs@8jT01NZ%ntD3ULTg9C_j zcpLNL{?Aa>qqeg$$J}s?{X<`eEZ*aCnV;cXQCM1^Y;GLl7Bb@wUM+2OSt5nAChQn+ z+eJFej%ywRMY$MRK05!*Q-7BEKI?^@oa)=rq-hw)toRQS2?tdWiN``9(om~h|G&L@ zv~F|t4TtuIRXGiO6DO_C!%b)L18sMcBa_n(MWsJn)4wAGLUFw`l2LdI$HlC+pDWm8UhR9MHNK*T+hCj|9#kcl={-=8qdhE^~1(~+x5oZM!gbO{zJ3}Snzut|GaGBHo-$7&2wLdVOkqxUa7W&!hX4PzUhEwj=NRqRBO2{Gy#4CcY z{!m(5S)JcEL%-sKv!N+N7B8i?0?Yhvy-YvhTj3+%Ic)1`;6N<0+kGfkhl;r=x5(+> zjM3x6sL{dI{PLrQc(&Xwh&Xt(uQn+n;zv1&kqPxbwZi_8iJ)BkO&_vGS4kpvLk^UH z8Ad-q<*2Y~U?771A(Y!N`pl--|7AjvA&HnAu?%0I0m3VjyocT+vC#)8;qdJk9)(9Jdz)(U8CDd|? z7ZXhHYt&8b%u3q1)i!lhQ7>QOO*EMH*sgV_IAW!)E_6APzUxU8#Qu0rYh zG$A`1(pvJ;Iw5Hr8ynYi5WD&D!lw*LFL~khfCuJcbYe6BMbrdhFupR%geE2@%L9CH zE!x=Sy$UP9vkBSF{TUto`_WJYwnRy)7SyL-$)ld$4Wzwz?H&qMLcWk0Eh$%Yt|@_-^9sFDeupehz!kcbOjJg>Q};;9q zi!}!a58j>e`xVkl@eB49d#mcwqM}q@la9Z?f;wld#m(PPns&!97`2%XjGGSt|2iMd z?Dh?v!?2{ZQzYQk@XBT4U6NEPa}2`IY1e+1;Vw}C`31wtL4BC71?Hk}BR+eiW&*fx zTrla;zME~It#p2pxZ3>6ASJvGq_kv+9rL_S=eHkxMMU|E(NfC%*{9Sv^Cu5y@7tO$ z@`gB`w3y1$;VR&c=WFd~%X*UgAGmEMB0Kj!ec?Qi3XMMSW<)_TinOuff?>=c)c$q2 z!uq{DKK*wCBU1R+3!uk@VdSGv5h-IRz@YdLmzKX_XmCOEUggi!`EVH+J{!)gff#iZ zdqE(KExP(fw}k==I3y@k0m5gp`rAsYFexz+sv(qSXKf9b=#^O$^mYM!rn0i~$B!Q< zIN!VV-njtuWG?+$;}xWERFlYJ&Kzb3!{G@|b0esbXzj_?=q<<1i7eno-?4L)kV z`_8Ua*8K0^QN$i$MkgdxU1UQ`KKYASsV2+r*FYml^D^Db8#~wOC7`5kAj zGzttxAyfDpe+&cJ2!97PZnm~0!nCz{=8@tsidA~al< zfEcb6UZf5Dzh|7yZ|~xA)`A24MsFc9%mwNH4fi4~t^p<1grBd=4BJd(oV60RZuM+1 zpg^b*NB_Vld@6qXg?iw_RukU04K_A)S+_Qnd+be z9J1ErLm0x_o$mC9c-s5sBmZ3Wr!zUlL5uNj^%S|;qHow5(|fZmWm<3J_ID%UgI9?i z5VTN4HtvUm`W!*$?!=GO2qiQOa2!4^aZ6ZQJK(GEo#IlY20D9>d2vz`NFe5ksTSPnkFQ1x!`=dIW%8s{+X{^ z^VzCM^qMY^^sl8gG4IfJKlps4_)V3Zjl{>Z?M@;o19o!}o(2c#@BiZLYTq|<+=qs3 zdx?D+w3fjD<3LrR^@S~ufu_+SfsNWHU`P`=j@i!NI8u(i;-4%a2uy#x%0{Wx({H}a z&*@bE(l6RO8FbN^@*D$!l8@l=*-tZNRhhglhAM!N{z8V5S+A7H^*|BbJfQ{sV)S#L z?3RYan7(O=PM>!WnxW;Z#wwsJ@PV+fHyHc@gdeCzMUfwZ{QWUVaGi|7<|r6bJ7u1P zuxTJ|Heuv3SfV1{Lams|PK=ulirc$69^y&cX>>^UQVk!w5Bmw4WyvQ38X@0157WU$ z*WFC7hwG>`VUB^yL|hI%kUw822qRaszjnX7yBh$(Om@Z#GPj}tWOp!y?~fI?hnv4+ zvLvul#6|b3WxV4A3p5yX$MVE=^l^SD6?f~%KU}`cBT?48obKs#vKVV5^}DI4l1pZr z76wD1IRd#MmG)jas9EZ0TJpzMGZ0>uX%N|m;ZbB8Rw;nXPvk0^} z@l#i?JRX?`LhY8=hd{*M%dU%@5xn)xO!-s4_(-u-*e@lxq?^XZ`!(dVIM%+P-XRtt zIh<0-Lxp;(P*_B{!gA|l+5KA(nmY0?9-}d zP>^K414A(S_d-J`-f<3`1Q|cvUDF8L|Iv$~dj1W-f45WQL+KC^bwKvtK2GlbVnN6@ zl-Lzfnv4mVdmoF?M9c7-?D?srT*Ty8M`P0bM)CkiQt@0FlDhM{hUjC3#zG3RNvMjI zzdRfz``uZ+aoJv>c(c)Y*@=z6HhP)ida)os;(cDwp!voh3A>Sw9oYg7X%UiMSv#yd zHVgUKC+i>&>2O_aUuPj9@kgv(*N|_RVt>Jurj`cvb&j-J{Hb1h(jwsUYvM7*bMw>Y z!+p|^6)loU!TBj3WxK`g-DVIw1m|+6K*v-)n=fg9COpD>D#K&X^ZCoRM)Tdd$Hj*) z>`x7;~Od$r0EyI+Br=jZ1p*JcwHlZk-L!FRUOoSd9|#iMm| z(_$$bJAF0yKOUYm@01)65~D#yaWU-qun6hL@f~@xEbp!(jSDyh2u%9{Ufr-_zXQ`$h^Z-7atc*&W2LR+c@e3Y(yz#Bw_n* zvK;4dxTVZ`=C|&f8plZ-uOzDiu!X~SC@Y*4#rr7VTb^ZK$ z_%=&RNAzR2BFCnLo}`QBWNaLnBBd}L$4^Sh{rW04-A3>0+?t_hB#e2Oxk8z{8+78U zp7fwt#_g1~@Sa0D-EPVP?YD0;G_41cxOS&XI0n@}0~r7;=H})b6+QG#){{Q~QmDR^ zqk#GMk&67Y8h|^xxw+BElOrfD0hAIA-i9F|D>G=hS6~8QbT+8HP1D;o(7mnZ06?ln{2Za-~3lI$AF9NF?7ktH)( zAug%-_CoBZntCjDBH5ErQcX7O7b7FpvPuIMM#tB(FBj{McA82oISt=#z1Qsa2qw9- zGkb?0D-gQSj9_GgA_L5WaGGtg(4A*Iv-Gak7h{%h8g#AR$iAU1SEZBzVPJtyL`N!^ z!qgQWLJutP-rs7?m>B5jeN|wto=OvTaFZCRE$+wzW!FsU;W2hc)9Jr?)8KKu3bY3h z#t!sA#F>vDKxYME6GfxoKxJobpNOs6x*^yI0ZXi{10${ty$tj!^N+$A~apmYTy1g5)c9MaS@Ls#qe{u__r_Uc90;#;GBr}{* zFly7#$*D~D*-w6MYg>wQ+jvmp-t`X+eU?*H;#8qxt0QRKe2eyC1Au2hM5X@ z0Vp;!gON0WqDHlb(wH#0H)Ema95k<6#Cj~B^GC0{Sw*xwt>R{MG?cVZ>N&=LrC^H?@;hpKZ5 zK2Lp{tF+V9RR{x~2nq}*lr$OHaQz&IlykQC-&np14+AAYxKk%25G>o1!-mEV34~d` zeEE!vOJX&QNvF)P1sI0jk_;DOOz!~HpEV&I0LB!Kj0e%x=(fp?ft2&I?-nI!AjbTy z29#bH?*a?>xyirCcwO3$Zj20_t)u^Dw-_{zJHBf7zx-X?ZkrYR862cRl^?Wy$#989 zcr|XqKxf_mEsPGlanS*x8{k+#hq5-nk@eR5HBn7o7Poe6Drq13SSTKMN9s!6wsc3! zE84I~(~P8C6i1fYjXP&<0iw;!%P@+k2pZFTXaFI2nTrz!ql*!J<&+k=!^Rf{+T8Cs zoGZVYR2?wHp7%U&&9Z-cUOE-&{j=@5AVDkosD?N< zk4F^6Mw-;d{`z|2QyLBZZL=c{J}!S~FC`evYzl#P(4asHCRXpsf-NKYf`bD=QDa!K zp!v@X=+uGb_DB!EoZO?o5tS=UJqeJeAq~i%Rtk)Oy?BWReJWTOBb5dV- zuciNf3datkyponxv{g}kG5YQPg@0rvt#F3HVNIbON9Ocj<@eQ$ zbbD2g0#tBSGq3=47@3}#@qI^fRf%dX>0+aWw9w*{sBR4!Sb2>R&6oa)FqQgyOijtG zPP$V!5tarX$i&k~zJNoDq4J3+M|pz4>>oe=g{3|p7#Qd@i-bX{r)J_pe-Uz4_$f_1 z2hN`i00ANZ$HitwFoKNVv4xSTJCa`F<228!dQ)yW4=dk2`H_aZo8y{*_b8|RstY6a z#7P{FJkQ@{^tvft8{!=TdC)K<3|7yEfdu)Igdk85O^6=k_a612-4i4PpZA*Zs}5s+ zHmkr85`sb)6=Na7|Otn1U;ra`SRjxK;Ow_GhlbZui=vfebQ#aWKkU zK13VE{Dq|;m)8gT*R+L8&GY(a)E=z};>{|UwSRQ6`vcwK^Nv#$MpRvuiaWbOSdzJ* zkWj0HpRbm)^Ho8TW~i{pVlL0$$p02u{n&PxKOdUEjuM!P@ymQts({^G#Y7<(deH3G zdvKQ*0m1^UO-M;vZ4N7SY>_W@Acrdk`z+G#{lVP6}H#o zu9M72@tEyq;bGCAV@<#DtKKZVc4&Spc6`DpgN^0j%R&-W!tp3l&0S)D^OK7A{g;n^ zJGFi~zk`zEwS)x!;rbnCqp{d5jP*^`Dx7LP9i)_8Zx+YN17S)3nVjtE|9O%c8Oxt; z#hE-bYfe0q!=_*Mm57hCeW5eNSUy`ZA9zS!DluY!f$%{vE4~XnyCwRmo1O$1M3;R* zG&ATWYZF3equrbdq1^n9Qh&P2*P)W)6&Y5#b<@h=Ch?)rba~~rb<0yz=_$!^ykdd& z3hg)bS+P4Uh)K0!gWG=P#(?u|vF5Y%f8&*$>;;FnnY$7+qq=MA+$Z-P8mW6Md?#?w20P;bhP z*0*%u2ke8}eIAlmlX^4(+qcp)s#692PGx#kJv>D2)~5Kx)^?HKqJITJ6iCJ>D?SSx zU92DSN;mb~yM?SDM9+7bxSQyh>|NtCgpd($S5oiql zd2XlgZc;+M183{>+WXm;O1i?_+}x6y8m$XJszWpp_eGP7i|eOO39gO7Of)IIcqAXN zZLTZ^OcoYG4BIiT-?d)I2%2Iu@c-ds!^69`J3NOkIN=}=$Roa+7LA@}Lb}teRBuUn zGj&)X1Yl}%Z~n#jD%H3r9_S>5qG?wjRMWJzSWOoCRe314@|)Nc6-Pr;I}~R*6+_EK z*=#J)c=d3>oDQlq0kA}S`ymn?WvgCyV3JTsp@k^2vC~1R!cYWMN|=P8-+7^I@qB+# zsu+EgA1&UV^Z1?breQ@BuSr>}z@$Zx)gv*gAc!U+MRRrxtX^Niljd`)J%fZSUwV&_ zl0XpIjuH;zVQ5VKy!c9Ddd@xF%TAKV^bU3?IELxmn%>M3F|FE}bg(~bvD|c3N=^N` z^E5ervQ=CXh&mD`4P^JQAI=+%JH>am?O;bj;k0!WQF1?@aR}Saj9#C}$|J{a&Uasz z>U|m5;4GLU1!g-CF*ZJ>@w^*=kJ#C)v0eLXHRDi5ZB{&3X-oCcPBW32+xJ$xsk%jl z24uNkclj4Rhf%-im*8ZJ5igbLv})5?5|6`O@9V>tLC5{aRQ+;Cpmn4~n_K*2YG^;lsvMC>99vlbt5lahSNo)ym4s)m4xf zKr}6?-ux0QClbia`C4(mD?!TO=4|yx5``ZjA7VQnyVU%m#YE$Wua)E?t;d@a{zPSJ zTquCR#ezt{1t@kiLQGI>M0`X%Ig5Az(|cCdbX}p>&wuNs!kOJ3=Cotb_A zs#-?9rbWD}r5=+w7lMC7tygt2)kFOVjhWA4?E0N015`FORtNx)BiX?(PCWE@}AhBa==b6vbfr zl_oAD@M6jPbja-4mm#wb8)>L7M|el18RPHK9GSea?^~WgzoZpHqtrYE+ zl$8VIK5@)s1~#;PY!lnkfTr^HFdn(e%Bp(G7T6yuEzxY{t%!%7N1)LXXj*3lA1J7@ zGD{nqBCvdd%N5J7YP?P^FqG7x^#v?~ST0brFbo%3q<_$wB$G;`Zk_#NFb*lO3zv(g zta!JfRN^WED{E~vgqXb94=L@eVq-6u`U;Z6rxSDhivZ13TWM)&C9J=>ya7#i7PEKH zlxo~UxMw60ZO}Y22|SPs0tC~RSA_+a8p-4p-LI&{1ZTWoF@?ybnU^`}pLusCnWw69 zj9*&_WU7yUplzzwW`y9&1YZOkW0-Yt{KFDJ{$&ask%lVGkl3-<4-BZ&E94OWM} zgzx8!>i(z+GFixP8VHH#y^CX9_ujCtc2I*8WQRk7@n4iNYn(40F1;`_<|6B=Y|*c0 zbR@hToGl#m`p_lLov1WQcME>f^KHIxn}gcG$U{wiNz99)<-Zpy^Y`wz2+E^ z`p{pTV3F7=ezxv_tRBVy@25=Ne5rfly{9#;k1)FaM{r!9$BAa#F^5+!BhvbKV*&{* zAFqN|3T8C^>$iECphZ{S|d5%qi{w2jRS_h^z^xTFl^W%#^+j zJCkR*OJUEPhh|AL<~r3{x1E2uP$Cf7AjAwb^ZO9x3mCu2pN02X94ht2HSCEE+m-}X z`dOu~OAPA`WaM@)NIsb5Lp_&`8m((CD&urH*KXx*!6?RcpRz0oI4O)0WCD`)c$>Y( zh#1ugM<#%Tk51_spP{jVr5t)u+LG|%b~fVtG0GXk&{PN%0u@BdEf)hHXE@k{NH=wv zD02fg(A6Y%t0Sa4U7;X&HlNraC(!&9$-b5{iNPj(#NAfYu<{ z@U_|BKn5+q>M>iwg9{56iln^mnNd?ZEuL-zYYP?jAx(83w49nTJp)d zDP`b?L0k8J7sKL9rIr1+HWDLM14VUP-`wM4N4*>ZKuWJU*&xrJi3w?Q28lg!aXFjR zppvI^b@?-v!xn)_mhXrah5JN+foRo-KyvA4W_Lp8QFwTp(7ca&WjSEGO?N z-)@UPxj3AcYIb|GKSsGCYnKv+s#X{>KMJ?)O1QZzz-s4eG{}7oD2H z%tn!lmUm*G_wWStEBM-1niVy#C|t<w^(&+OTa#J75hCrpEz)0eT z1UjvC7fkF>J-1Lv;bqJkq4?bOV~ek9S0q*CTTu~voB~@xm?d!C-<)S|70uWjM=+Kq z(~?$U^YVeR5s46xp(yQwrs3(#(WZGw$%sybPq#;4l)924BeD6P-a%KU+j1bQ7wM0R zCHaD2|3zYnlh{iFdh?t>{c*~1*Jp`IYGz7kL`Aee)7|>?w`eLae%77yw3gp&wdXN`sM!vUqPV0G@)JV;(dp$zjsFfRQ7$br)WQ;*X-$-LXdzBMsR6DZP zMVDT7(j_0akW?xSvV{PU2&49NQN`W{B#Nkll`#;89A$V4j7pa6>k#rTCZ3s<5*Rt> zSr`&-!ae=eGy2xAALvMDQ}u0?N$0Znf6+`kD){krre{s!6F)>o>l^2{cdehEUM@~P6DAyj+K1Zh3f4O5 z=>QWQF#SjrYV^+PxkrLP%mTslz5o38Z=$b-6u=k+K(!0X09Y@Qu-|7s<~fO)uCHIe zzEmnrnlveqNTgD!bUIycEP{xU^O%S#l}dkq|CTLVOq8(~uL!(ih-1kyF)vJ%N-qRP z(bK}Px8{j~W%u@XuPEiW>ac=>mE+pVvTauhA%N>$XrWfol@WljUaBo>Q;R6Tl4vQk zB-j!yiAq`0wvzxU6E+V&UhaN4_wY|Px6gs$LSNU)ye*UIR9j1P+Qp^>HoGFDgu~1M zSF0vhr4f&cK9vHlX!bPwngfEsa7d^LG=X6b4Qm62!7vkX$Y=lnPyhoFBS+#(2v8Qf z7P=B01-3v-8f7J%HOoui|0n%V|9N7z!+Gg0g4YaN~cn(wD0@6+<(Er!_$s@<9Vkpa69HFC!Zj! zB#c()6#%e(*kdno)I^t=l(M99jq#;qjv7`2*X8Q|nfBsNWgR6Xl4tPE+mfxG42AE z<0$+QPVz(w4}C9B>JpX`Tgu$~WTPP&qY4S0V1-7zPQrDP0wfy{C?laP(URy`kci~69VVPia>Y{{e*3NT)n7d({z)DMcU*6k z2o`_@pfS}XUNliCxfIx4Iai9BB_0}l$z!@pjCS{607Aq-gAnShg$vI=f6>GV6VX)6 z;L^jUDLm*ZfbI2MM{8s6ZZ8Y~mO=tsO3Ip;#;9`eeoP~aj)!0=TL_C-SODt+dSdFS z{pTF_pCDnmsTq=aw`KD9H^Y=SZ&$HnQm*8vyLpJA#IBz?1X{1(6a<)rBR>HWfB_;O z6YTiH=zk5sMgzDT#Q}NrS}=o}{k}s}f`_A-7s8T2Ldb?qVvYRDBFb42Qu>~^wNmNt z@0UtNcbEVW1(mhdVHgTTDPOulAMLr_bbZYzvh!}t^OGRmy0Bnp20{6clUp!iO3iY+r1nDSaM|D z8EvJp?|<^S7NI3(W~HQ5qL%BXL#Metd*X?>l~52na*wOAF+eyfg?Fkm1A4Sfg<>H5 z#wnk5O@(C^1wc?2;<$?!)^}*j-5m_q6+XB40ZOW0UG^&*iF-4*oYbIa>6xd)0MwAjP ziAtc7U`ezDC`sDC~Zn>07w^?mT5E$lz{GdOQ_XN>xyzP3{mcKp?eT|}CvBEM z5^P{4P!ed(erS9n0tW)YcFDI#`l_8X(!ASkcwfUrZ8(@2kr4$`)KQ|A)mN!jU-}^s zzznZhvA(MkPID}#hNx)0Kyq!%hC&kn9FUmZQuxFLsngzd1!OZs22sFh^*4by#&f(o zRI8p+7Hv-r1fe9N80}kvqg}iA>70Wxwbm#?Ah3*zzyN?j(P6wfRlO2$bX3tm_i)Bx zSHikp8ZI&pGi}UH2LuQS2%m2*$Lw%V2Ez;)6V6L8O39--84;xvWK3hSW*km_WfEN% zDZ~y7HT8z6FZb|bo{PAvNKDLFYSkMMm)yVQ7oUH+xXsuy;W{nNO_>BXCq#=YQW6yb z_*AY^-ZKS{iUF4bDu-N+3=bx914C$7Ge#!h(QG-;#DnlO z`0-^{(gl(NMfA%rkPUlf3N`o^q&z=cDF(IiAMoGt_0rZ1ghCK884?ySgAjrYRVvkF zGV!AKAIk6q+C)G3d0DwVcR4`}eVbnAi>eVM+TF|jtDR*`E zq*5u^?z^ZhB99JcpF1uPL5OyD zEJR-uRi^vbcAYT0*>Rlu)JiF})(|BY)_mmgulg&O?FA!aUM0kiiaQErk*&m9#Bo)e21jB1FCMY_(l3I|{9wwyUDxQ6c0?$W;x# zPsNey){&s6X#yTJ**|4|<=AwAKsd@!8Xo3NVC-;++7 z&Vbh4w0gd_+1@~g1p*6MvtB5r^7;Iae)xl%Zn`O%OuU3OaRdO*nOf2*OO%Q2=-I{{ z))i`9B1iwQrCHpY{>9>^kG{TycFRjta?uejOWpL9ujtUXZ5M!vbkrGP$2r+=>;DMM zLa-3P07RThCja!uKb9sQ4aZ#shG5?ne?SHVs;#ErXz!AJ0I^QHzk2ZT{_p*%dnD&L z4zn>v8$*q?u^Y>t#KgqBbX5F-iiwFJVj+-$m)_s=yKk-RUmYghY|?2;K#MDzY)lE1 zn*FjVRVY_6!%;zrfGe7-n*AtMjvxrATJrPdVA$uPOd{HqloL1>O=uErts<3#_KY+j zD~Y2}W%9!#rDCO6sPy*q4Gk47>DZXDAb}{65kVje1S!$7A!Umsf->OyRPwpxb8)D; zxs2Q996oW;F{fVsrZ;pptEV6O!*Bog*S>9onUvZ(r;F%j>Wt{0VlBZ}4| zBF9k8^MJ^Xg?IgU|q2oB4HfR==awNv13%v0Bzrh-_L= zcB+_t9Ww@DphMk1uYv232*PWk9XQLB2;r#2GQvA$AzkRmb&lST`Rrd}1j=@?KlkUc05TzNg&Q zk~#b0_Z)umMUikLqG%PK3`r&KzkOxz>S`v{5|AfFU^p-k8VH!lfB*nSU8)ogKJ?H- zPnrS%ac_}2h*7m*WR^;bD3?!4%eLKOq0rje_F{J&ISM$xZDrZh!Wui_+dE1ClYzjX zk}RWYE6l_og&6GX`T76;-=`)|Ztv)fZU|q>nRa*gctN$Jtt||Iff0pL$`}JFYTL5|<_I0P5G9VNYGk|T`z}&co5Vg~cc|M{d)eY~8 zF^wv@Zmu8G%rdeTjjo+BgTU=;2hmm7{Xl+whxLc`V@1ypvlzXsjk~SaT5c?Hv)y5Z z7`>`Kp2kY*+y61T$1%f**_k+dFD9mDv{?5{|4%>l@amdw>s|Ngls~#20W^l;gsuDx<=gTAJxrd$nhS^8HJ}U?1&;!X}tE(JzQmi>& z3 zB-^C|q78^hnxrd)6wzle`rjy*@#P-tE0^ucvi?k?vwzexTw9^ovA`nKHbbn{IpliP zL}rjE8uIWk+MvGMhJ6E!1}36i2qCDU?+=XXEUvkWW4l|>`Tz}=~H!dF81nG1}vaKK?!O|S~T=J>x zQ9dd~9F>v?xoXfW>ES}y=g9$*14kbzE;zaUuvyu0&2}=q${X6IOPiCjYNwJRh~l7^ zF9gGRe|>ju>4r*>n7ilMGc=_$dktfPtP>O0>KbOp)sTVyYIO_zh%j{ zKXXOL@$YA*J-vL9wPV}1-aG$zXVP^dO{T+8DH;9TzUXs&Dbr2_fTWZVD1kMA0g!;G z3WFH>AYK!z>;l{eerFH$qU8V+6B{y0S@k)O%fRgpwFohQX3{_cP=OFaM7>!8HUw;e zkRa+V8UltWY|NmU5b$g{Wj*KDQqBelz-Xo>u+NfHAE#|Y>AcIv6ARO&B(`HSN?K@ezTl$6S{ zFuJ*l-#pJjtde66XqW*QwWiy?xol{IPNkDb5>YWwz-7&TKoy_M0hL3J{!t2`T;<_y z#q}yvO|?~~CP$`?Pfs3~%H{QvHHD65r!`w?N_4lirLAD zli%>>v(GutwzhXQLjk@QuKUMu!c73MW*-1DqBAL411eWJ?^7}0a^&;~!INkwvBSlt ziXN^6RWtI;;L=~X;fB^G$L{R#0~*@qjSP8P`imiHE%k3?bCNJd-AUX zLqoZuy>&1c-&TZ{qw_xhC+3d{RP~p!1TJpdzdK^egTbL+Fh|%J8RJwr;XboP) z4B8^~_G>Rvwjkm-jyy`O_F2>mO;OpcRWzhPrn*QTjcr@t6A!wiVIjepPe zKC4tJY5_f_B{cwhMz|up@DR_RdhMcVeIwpezgX7Ua#;W*lSv^&p-@mt&73*Yahz@2w&nAArPR`8 z%ksJ0+_`gGnwyz92*b|K&eqn}TrRh5+cqLfr_(JhEt4irY;SLmo{V}Fff>?mR!hw6iW`dQldTy zwnA64=X1WSt@c!A!O2r3Kiy(&a68)qp9gx&Bg0Gm9535gN}IX>(9M(#`I|b zaO|*S!5br=EWpkJ{#9>WsF#11XhlIliX}GzhdEYsHF{n>TKLaVj|y zQ+{!<;)T(rfd+dbMDbKcSJJh|^&fTFSJlDSC~x2csdua&eEP9%6Puhso6#j*=A?tS zE=^7T))znYrI|SXkwj-dQZXUDJ-r9&$}i?=wbkBM55O53pvJsF{p` z00dyPJYfs9VZFQbK}aNl34j@lQnpgc_x*Yuz%g<;W@iu}U^5@vju+#H*lQJT510N* zn_JjDM@|I*!<NtlX1e`)HM-ON63yLt~P_)$Cdl2TLTNkAP9~+>Zr5MI%{xnFqKLT z4i4UO%Pk8QESNH7$}P9t5@>z)Ip;XGednEbUU9`0*=)8@C}gwQd+xbs>C&Y$rcd9t zZCegxu;S`JSP0&F0dk z-pbZNuPNAJF}Lo^AL%ZRc$thcq#1}f zG!TaDg;epm=y5)0x;!3kmkUC!2#^{pm1^mb)2C0J-6YhR_N;u*(?1^?tZp6jR&`Z9 zYsSIHUU>ddC(W8Q9RN&dBFoyene(oE-xoJ7ynM}yhn3RfCm#giK|lT6s(<`(i)*Eu zQZ2xO84xwseu;^I8OVSp)FGF9a~t0D=F2|%xpxQ&{2Exr-g`8f{18!~5JCY;qqP(Y zK}uo%e*fQ3KIN1bQS1Uy0C0Y|&(jD%Ogn`OnJb|@D822nbB}cozLJ^P?dUxBYyZ6U zEg$&h(3Wy@$_fnC6qf)>IM#pMSDya;4_$J@|50j|cut|bL&t;Y90T9m+Pls7ecQ4P z6H%a)rIhsjV7sxBwnw}7<(x-B_U$=O0u`bnGJr-%Ks#k^U2Cmf=Fd44!rD0^ARsfL zi+}>F1|$LqFwCQgsECnI6!+cu5eXO>1pp%xg8()tC8s15LIzRGt{m;!0x~xs3d15Y z0DuN&*KxJhjk#QVs~7rf6$CKAE~ukK#|j>L!1T-(%@@g;OKEU{Xj33=F>3;#^W?Ns z#Kay`BH*Z#q>G9f1VAe|2A~5I!{ANFaW=^RGiy9Bb42rrIMGFQ22SeZ>Yr)jF=G65 z%+ABs+1T{B+4c+%Ou*FT@}MnTTnyCqMZ~KA&H-XwjlYi`K4N*V)+_1VOc0)nPbo+O!i- zJn@b@?pU^L+4Skt-}%mWu3o*Gh$7kD+uJ*5&YUZ*xMIzkHBl?Ok@WT(k`R1E# z+rH+SYi7)tA*Bq%P`WWNR1S||1=Y%s46B2bua@-}!gU3DghaaulT0Q)XOHVuNyry(h z{Y<5`{p(Lz;-LA5&p!C@#rO6+dHa@U{<=h$R9jQ01P56H0znusF_2+nIMnO~Tn?dJ zG}|@~Eq>>)$MLEaA(+7k`z8X7g1`h z>*+ybdI9e1X|MlVDQQ`D5PCu&kOoUyTQ;ix9{=D&A*l7t6JUt2L*l39i$2&zt1is_X!ln|u&4od;EzfrcImn#1l`n zw6tV08PD@tT3XhvTQ_IUoFz+^3=It>5{ZW&d1UUKITOZ@uU4zZ7(fiQo;r2v@bK`; zl`9j8#JY9smM&d7Wy+K=410Qdwrtsw$z)coTD57@rpc2hM}g-_6DMxiuwlZ)iI-h^ z>C&Z3@4D+Q9(6y*>=FfWJSgUXB#MNtdwQ@uM47B0V;Gph7!E`BHCKHu`&6uQu1o_t zUN=o1T z32aHr2|gEz!%$TGiaBWd^pjtAFd`^R06@#Mlg@p|QD=ITN+fgrG_&s{>w3q(tWQYj&nKn)N8SSW?_#Gfk1E@Y)@%O8kLd{Txd*pwCW z(pDTNX?7BR)sFx$-sbH7SSLYX0tOV2GcXi_(cVtMKxEntl*(GNKAqBQ_v3pmQo`lBd+TncGzK$KKf`=bMv&RQ;DdntE*5b zEL^y-zrR0|$*f+zy0f$M&_fS>{PD-j1T*_4oImdFGi1&6%@m z<;u>^&dHM}7mLO2?(T&P7tWtQf5nOwbLPyMI(6!!k3Kqe>Qu|J)~{cG_St98m@(t` zzyJNZb?egUbg@``xv$JC8U=CLn3w~Y{!JwzkeCPh5#fnyl88IcRQYyG+y)y$oktlk<VVT3-K_lO5OEw0x-N+0vGkrIFqW`*wMVio+p=U;^Y2!zv<3 zDU@w129Oq@V6VcSXdd6(k&w*}WE{*$Q~_5jX2j>R$Hjok0apSphoVx|xt_ub)mr$< z=RbGxWv}1UnxF?1+dDG@5V4dpl};3kJ|Z${OUdpn>wfUV|2Xl4lWfP`ZJ`{A_mtEOB>l7S+^uWetR&{Nvb@J-fUFE>^cdbZOmP|eR%2}se3&KHx zp$<1~T&E;42LOhc5fVx|zF!%wf>$#D?Bo2mv2zbmB^KgD()ELi)>;4%hbSn0-~ak2 zysmuec~GUuYXQKMZG5~eTO~|$xL0#Vh?BDLR1q#|;nz1q)qrGVv9G+zj2soMbp`(= zk2en>08g>_i7MPaL?7%#j{!*>o1(wv1t^sLU7|9~$uy7$NX)`gDP|@%Qpl)f=IGlg z{%k%c0+E=3!3V8@0GOD4&|n6~D?e}uL+3&%!zhMdw4i9gfEN6glf<-}Rs+ywRp zE-a@(g(xhmudnZKfBV}hr<`)oK?kK%smW8O{No@0AfnrDyX}fAu9z`n#%;IVHatB1 z&_fShbkRjuUww7HP?$Pp3L=JK==**c1d%U!-MV#;KmPcI7hG`6(MPwnwRLuOE?Kf< z)22;NKmGJ2mt1o6(MOLTKmO^bpMLh)XQxb=VvJe2a^<6sK00&e%-OSNpK-<+8#Zpd z>o0$Kxv$JCnmCpmbAS@P?MM2`h75r*9LdvAj~Xp}DtMGDa(6W-ESP-yXTJF1MAjl^ zH`Qi0XUW%v3g?T}p}eWYv$)}!`OhkQpts{>=>#(EG=-#wu$>V>0 z>ft{P4EL5jA!Z&l;ph(vrv;Hw3IOO?Kav|Pf(i{O1KP0G9BB462O;|blx<9B#CT$D zSo@sUIyj{Bgs`jQyYGB*aAOdZkOQftC4`nz2;oX0EUBa=RYnO=0xiKxq9xcukSeJR z1p#@kNJ+Gbxk~wp87Z3nDvkJ53b?GH8en-_enZvjJ^tL;@445sg-?j~PpY zFFDdH0s(E?7HAn0FtcHkO{X7z^wIn8|NEkIUsvx0@j@UI39G5pc5x~E_qr*$EH4CEHaYuaqcZbI0Am3sdQqh#6dR|5katEV5QXKk3YU~g{e69|>yG4dzxc&3X3w6TOeXKY?>^7>E9LTo4?U#A5D_O`G8`J#213Jr$kl)%FLJJ6ws>MB zYi6H%%sHKtT5Iip)6;qOhx(tqdE>feo40u@Hu+ZDk!Qa7ttXvwdLm%~fH5Rx?R!Tm zF@5&D>9gl8y!1_jeccH+)j44{fCT`CsQcOB2X9;V^j-bc5wIQQQyD=R4h=+sWZ!^q zIIywS+@wtXW$v4kICq*}xbjavAlP;?%jF(^wRFW)2 zX`?GZR!zQahD$V5F~e2LMG`sW%5b%(-&-?fLH6Sxc;D+@|2oT(arcntXGej^0B8(J z;Up62a(M(r6cm<0xp?dCw=6vSTp@Pfos0mmWQ#Lcwh|6ey%QLK5EzDZ?tfdr6 zqU|sOKH01O^_$=M&WuBs_FCWj-gmSPm8F7!q-3R}ZM!-&%mx7Ky%P3U_8vF(RY61s zB7+Gx<5zuRUn;>w!cHWXKTux%boJ|43 zt@ztZBBGTmR}zs@N(h07eh}2#@FMd}>Jkkg;+8F2Hf`Q4 zrF3kY0U~FGlu`)M)z!6O!v-OQQYz|E!lPyKV#W|>@5LO5Ffam^@?LJJ48jltL1;LL z>=pr(eJ)mbs0{rnY|F?=7N>;-03^eJEV6UQo%EGW<)3Waxa^#(-g?%VXEp9zN-Pzt z)x7b`R2&Q`WJHuIkw_mx0d5+oxM|$7e&nv7uIgP=35z1>rdkr&G_`CEm-7v5!4Mc`W}wJ#U8@oW z7_G=Fa4eDXC?9p(j#{PoRIc#gu-=fF9)9c{S6qJi8m0zDTzenCfp|;d-&%+|H;)?ziT&_@lYTD59f+fH1web5D4W!BuxK>ue-SA#2bjA zp3uUXV&yL@Wg|K_ZnBLU`JX3a9NLSVxl%_uKrBCJVBZm`ElH#SjG{A_FSz zWpDrYuzix5I9&vxk+Q7$3q1%7EaBcVS4so|Ytj{oqml1B(GZnIW&%hMha4asF$LawW56>5M7M=2QkC;PJ1@US|%j`04PQU0(ZRaiasfp zQkGKnXKKTf5=QTYqj$CAIQ1grL?j!U0!I5$mgP83v_Mqb8-Q)w_UPgQ0z@f#(QYlv zvTPdxqP2*)UeWUqJ1$}lT%;5Xh9D#+!9C?9;pU8oos7qN?VY$AStDEMYcCso;OA$d_#K+V1Z&1?t^18rB#ObiBKR0jY8pg^fP(Cmfm`CO{dP?-h-D2UL# z=A!H0{Ekxqz!(!nCSLAq^(vq-hBq4SWhtfOB!W;I6H0+nTKxlq|MC6ro^|F~)27eb zjc_s}Ad{|oexpei5kkXhEBwUO3m2U85oX>YNHqo&f{7-az3ApZ~Ai>K-Abc zl4k%+0)fnE^Il|4BG3?oVVhgcO8>gow{9zj_dNA@!cjy7Afz-}E5}Z09T*eVOCvYN zkN0!8f2{6a;vIQj=frub>^PO%R^7NH zw{>;7XGNvhM_wK!DnubrAW9`2se}@;rAY~t0;NO?Ng_*u3Ov!2omrs~!O{^~36|lo zN;w4Ctfok`%Vx03IUryl0YSj!5GoyVev6#paREsnK)}_2N{+|`Tn@P!vTxYe91v>) zLp7mnMjuA9yZ+sekpTmMJuZ}K(4!n-kP+jjTF0f`@elnZ-<({#=-Syr$oLy{HyLZp zjgsd89oGs1t5VU@0wR-0xP9Atzxbsue*4?sO{Fpb&nJ{4o3ZxG1AW_!VNg(C6BsT8 zi%yz-`TM?NH_v$C2D8!N=3IT%=Z@`mzWL)@A4s}RR2pK(!eQ(M7#LxTaDIo^)H?B+ zHy*d3EvF`)b>T;T>}g}$3Jo%X)*_Y83Lz>LztM>NveZA>$q!9ZVlrtL@_`|?1T!!u zlj%SGcQF01%4x3yj~JtlTF9dbmt%^2>_eqFs)@FD1jNyndy(D(1SU*~C`;!59|OO{deI=S4{ZqaFGhMH|N-*caq^-lDtwQ{#6jRVfDL5hKC2ElXKeQ?o=6*!V5SfPiF( z0SMWE5vU|u03fA>EHl_?Nr#y|E>&o_qz6hgSfzYORRj@vh^sVgIIu9CLJJs*W?NFW z0e~T2aU#TuA}7+vhC>6P;UHw+KwvnCY}N*X=uZeJQ3+uwv;feM5iAUcRUSdWglI{N z@d?q)gcUhRzP$H0eDdYf(k=G>De3hZps{u@MEV5~7?iY=$&@jgC`16QQ6k=b?_ch@ z=k7}`dE;)R@$vdKt5&ahR*Cu{sG{Y9PVfDvjMx@1Gr|ilnIa-E*v|N)-u1>)9(mxe zYldA{?O0ovxg5Zxtatc?>g-vwuDtr)iOHw5O*usC>c9QJZw>Ztb}W~f7||F4u#<^I z)vFS5)BvOLce>%<`~0o5D`}3v=sKw|p?$x?9GST-Yot4Q*H6PEP7YH|5E6{8ki0@d zuZ^KfR3fqX(bSTAFxAY&Aeb4o=B88%k%AzoZ(cw5{cmx34X~Sfad)DvyQ92!-e!#E ze!=75b8NheJ@1|-jurC@6078x1C%JzCzW{XCr(=arK!3FR%R|75u zobq(Zwb2p~R1%_`PN`%f>obr5g&?AJI^rmNYZ!=`2ncGnU}mN$P=p{5r2s@!Y0<7Z zD4BuA%sHP*J{R+5%Qn4)kvinT0tAC3Bn^Jq3 z1|9VsQ0Pds5S0rlA_#-98kWm`K7_KHw32o+f)HRUbcjvC^j2xa#jMRKWx0L*+}~A5 zx3ohnlXn;1Ie--9R4Jt_+o_a8DF_4zl#=+LZ~SD!b5XEwE%<)rCdec`qH3OJ;tN%r0bM%Jqd*I=&oTcR0b^4H?)%9+=de-R|UQ2B! zBs=B;Kp2KMeDc$`-TF(VWNqmf2>>(cv@yo_0wJ*8aj;=$b^rAKkf1xug=jpE>-s^U zwI`!A^+a>(>3iY3*N=SY+a{R-{R(NJzzOV1`!OCZM&}P zRw`v?s%2d5SW#qj+F$OIiHUg)5v$~w0~ZuX#GR9y-~P!{zxKh~(peV;q7f36V#mgm z&qSa#2LYD_Nn&k;MyVVtAw@cY9RO^=7!Eb~QRbhic^>qr=OL2ICd!|SgmQFn2F^h@ z0Q+2uTK#GAd@hw~V3^h$s2-hqTgc%+xGv;sWSKxfMs3*BQ1Q7CVi^zuDuqxn;0q8E zZ5NvnY$O|48bicHOjWL0X`SvcGv`h@;q(iGz`Ny_f8N%WcU4L-X!a2im;){aSaBh1 zi=^)deO<+whqv=S^=Q7P7&}k((6SK1b=)u@B42K`(>W!%z=RA%J#>DJ(VwD_oKodp#PFytaf@_Za<1d~BVC5i^ z5U3Q`1g-(C!4If{LLvxctQcunS41u?I+C)*r?StbkSZZpYbv=GPBt`}HW!KJC~0TA z>kI%v2$Y)rfXh|Nm#M$Pg9y+pCmrORGuu6@WCljmrV-s;<-AV?ja6oO1km887!GdKJ^K8V;82B$H4qhRj+@HUzGnC>BP(_Vs@~ z_UL1qnp<}9asWikE&Z>xPySIThl!ZMFj823^V{A%^Xwalj1Xcs7uh3EMt&r}b=Xfj zqMi!x8xe*fa#*b5lo_e)l%u;>KH;Xa9nK&FyOW61Z5mIMGIRw|iJJ#g#DA*aI|-p&;O=2~60NQ*{^ zThZ;qe$kxFzzW^rtsnGPJ~3_j9v{U<`IYOV@Uu1E_I!<9-w_odp3N6f68c$kuCZ|?P!!XPMBOhRDToCu~& za3_vet?kMd%3?((?CKfWHX>WvX0*0-FoO<5%eK}&HJH{@MbZz+9}RnJ0u2lSR|E*f zZZTg5h>ebWKwTp?nsnxLTEDW^rY2_geNPBc@A~#iNDLYi zQjKO(NK7Ve2FHZH0ELnR6SBdJOB<^OyodHcVsM8XgNFp&r~B@)S0Dpe{Kqfw1X)rz%pOw7I`R>?63 zJPgDvr8wct`OiKyvTZq6#I~{?1Vja{M9V-(psSoS6l(UYnl0G%xm2ZGt($bsbm0YD z4!9i2Wdk8I5rhB~31T4xvSfpS4p;>Ogd~fRn90E=8#5BzvKjEO;9!P<3j2;J2<`5$!4<8c2&l;a%ZdElC@F^%TdX6*20tpA(eCCz)*G7`u=CP zKx*RgM=yHglzE2}CV<$ot%v@&@_}2{WfN_Lekf}CUW2c}6A%I$FD$k zyo%tuFS&6wybcjDL&8mvF}`0_Qsjp7vuDr$*vD_U`R4CF{`dn|U3S4YzWZOoN!MN* zNuT`sho4$GP_a7FL=5FXWNmZN<=3V<<`5aN2X29ycX`uO|L0XJiDZhILW7f1rGLF< z+Np2-3Ur(?h;}w&R7!&haK*f=wm;;$8Gff~qao76Wzqz8cRZL4Cg@Ad} zv)O;5MEwi~K_ChS3b+(wE zOyK*~VlYgiBojgVq?VEXz$c%9El4Uz5Ezeh9s@8cbdsV~q7_oL!h?POv#HMTQy+Wp zIg8F|$~r;s!|Rqm`t#r3zi#tDDxo@>?MWT(#CEr%*&fd#91QvfybW7RE4#w%l+#YX z;?l#9JVw?7loJ2;n4IVNAkbyu5Su7SVc-{PikDkn2t6&iG z{4m%5<6Zr==9CpeCK4G$)j!ZXd-j|gKl{ZW|M>flJ$_$0ox1bhhu`>*r%yilw3^@> zedRIZE5ESmq?T=`CM+~6QB4@TU+brKmSST*j-z;diUI2op&~?6zdR`0z}~b z^oB=-&E$OF@1S(&Z?}w0{NB&>U;gj-&g-wg;l_Xd%nen)>e#kYc2l-F40R9$^`48+ zkgHeE5UmU7ID0Q9W-k)Ql4A~BB8eRO`sZJK?8)EtTbM{XDF@R@(Kf+8Y>IPikNFB@ztoy-V^rX|NfpFc{aH(NmutJmw$jCkyfCxbpsHezVWZ3k!g&%t3 z8_$h~ZB00hgDfY)k)Vzj41RRPe;PEpPtNmz?p(GsAAxwP+X}Lb(2(&p+|ZTH8qo;7Y)!9Gw2h z`>*8eL1YX7NGW~4`ps{A?HB+1KiO<{czE0AKljf!ef68=Qu)q1Z<{`SW+IU-my4kZ zG4dX5-}^4wTkQKlGS+JYk4Yb_$5xr64uUKM+P11ztxtUXGvhisKKI#ADO)nt-q-$YYEqa zgpEl8UC>)Y_L}4*7n>?HT%~-#WrJQomAs!TgadYZs5xyTNnfM1TbaQ4IpUmUfwIHt zR(mv{yXQMIdw*9;evzvM}nu8k974``UZ>7JX>7T z784 zA9KY@?rraS`+{R;#DV19XUDbxHR?TP8(h1!CbE}be)(^H^Xt3r`tyW|+l0YG=xreFN>XW#$9&4?_8OlLBE{XL(%@spqb!k3wO@zei6 ztcGDY8pGZm*BrC@-}vOdE@gF z-uHg%2h5qX&)#dVc-He!Iv5Pl1xFf7KpsBr&;fYSX_=sf$`~(yL*NYfjQkwtOn>~q z6dVGpkHE5>#^u!ztH`e`D9=bvMJSvSALm$4wZRGB&Pktgv#$yqL1 z@+*?Gm01UB?yb&IY+)E%rtuchiDsL-kM@~*6N5m6fOaF| z$en}wrToEFuYPBNW)kGy=N?hB;Cjm|=-D1_M1B~L8e{zPbcN6KBFuSWt0=)rHZsvq zO^(B`-l>1`#m(ia*t*>31`bwbfSLeq0!E((Jp~B(m)*y-?JS~}YCNZS({X_vkKWWyh*Ho$UdjJ{M8U3wn;+tXt;XblX7t zS!B-dbbW4gy}Y>Dbv*8LE8Lzw#A71{(O@(svFU?48BBD)0i$2mqk4Uxa#yy)83K>; zlhKnA%+%Db7hj%-|G7MxFGgTjGrDl;27TJ-Cf<3$5XzgC@X&b}oUdR>r6jK~_&a>_$8XzL4T(<8OVdONQF6W9+A*yLnORi#+K9(6Ii5$Ha)` zd3OD~+U2PIZybJFMSCXNH?L9Uzu?%AE34snFZU;9@p_(QZ!Pq(2N2*TiPi?9qcIob zTQXzKPr{4S*M-Wz$|$4rD&tc`iCKb>;&m3IwBO6v-MQDF-&_Wu>j-x{B#&y&*ph0k zlBs$;L+D1{-vk6wP*5PXq$P5+p7sZy?#!g2_knd$lKwC11^S z2oUf9tN4LmuhD;ok(>;0dLAyWp3QUmEXiuwZ#+^~nPS&2@S1Mvc$3kpvA)sK)rHsT zKBD^f8quCM9{xtecU`_JfTNZ@#&a&-w(f1HDG4g-%%ku6m`m6z3z5duOU6V+zfF|Oo;_D5FJbfW=61bvdf zK(S!kZOOKWHUZJ!k1KBq3_(okyGj|M2*0v*CKHp+RYH3DkX3mQnT>HS`yXB^UfNno zzYKh#{nH`&$|$t2RVi_MDBXQb$@hE`)FI0lA4^a^`gpMv22_F2lj7soG=yk43?azS z$0mu4ISg?)eVnyG4V;+yvKD15pKbGe5f^8#eE65~cH0*&Y9Ed)RzB zguNoi)Twc?3>Ph*-v3&k#tT0jnj)exm|twz%NAnNs*T1IP9OIoiZT{)FsbPYKMt^E z?cwqhV}wTfD?0)m_|{Yt9Hb8hQ?8D!%CWy8Apnql-d_|J#al+oZ=e{sYZ#6iWwY~N zZ6%g-3T{RT{>^Ei^4c3O$|IvN?SQ0gGLAT{g|t1Nu70eyy#^JF`&OP?Mp=K>Ne9Ke z`sp{ADvD_O9%~-6kvwd|$axa2;$dl4%xPOgQ$kPIYLvvZpQ2`OwUGuuoueAo#~j#i zrYg6MDprYu1`3jRCtxnu{RqD~!i9Z&AJBWV;G;t=F9Go*%KPpPy<&4P-^gUFCOF1# zx6R99(X--Z^;|HxBfFsGcz*inC7yk>gtFc&S09c8>F%l05YKGYht2$aq~w1 zQW(?I%Y%yh`eLVJ#gC}hK!AZ$^FrR~A7FNU7yw`-&+N9Qxt;6#>E&5GBePCcUaRO` z3_{e8ZZj;HEl~S z+OtN2g8V}}3*8OWhldN|dhbM>v4hD*nvU{(@7Er7N766>YK)l<_Pr!*Cl5Ze`B!NV zKmBo6=T&Wog*F${Q}E*#gPPx@$<;G(ihw83d*u*(F@tep=YJ|Q#QLKHQqUqS5W&Q> zMaA>sa%OIjQMIJV{nBK;Y~xPjc4)vs^BS0mVG`|oW%@-??9wQe?u8TXZsz$l+voQu zwR?F3D0aVK6D>RqC;i#wmKRcKb!(>NB7b_ERL${iJ30senk-bw)uZNF^6=cIJV3c9 zIkv3ZQbXp%u(gM65oUF`E2ktk~E4WkD&YzgGLmm_B902i09Qm9K1G{ ztIyX-Q2DIZwJRbj-=!){LUMk~lRsDbDLq!ifN|VIZas2}2#D%0WB{@6Ny6z%M`~G? zL6Wu4tmX;H$dgOw{dCl(P(42BM|ufl3)2Wy7sf?efy@`=)3P^4tUgSY3)r;1~1}C-ih7&pfJdmGE}klRv}DCrRmz_s01?7cJCwke(z!$zigz7N$TFgivf= z#<+P9Ek2xUT@xWd)hg+I;s`X97^ zze~|*s!KB~r)6}>`z%%qWyqZoeNY(C-&o)gymCHCw^sQTg9hlYot#SCTNRw) zm)DInosCSV*?4GmzR(`C2D+%eD=-)47Tw^&5C!$&qZ+Ss-+@&amOpkNh5^c`yW5kW8!C*E}pYv7myI!?ukIo`X zSh#DBsD(@$2aK?%Lt?kT$(`RUH zz;Aj+Kk9)<0@Fl`=@|ohQ?Nn8PT(V}lwKVPNL79B5k^nb)62bzsCyCm?28 zPWzCH^pg{}>o+(8jB$0l_CKr!1YPp)xKRnP{9>p|UuAwkHVL!AF&>W6D^_h)kfLjL zX{^4=uzPCn6}$UjagCwdoas5--uV`LA&TPbJ__W!nM@FBuwu3OeMD|FXY^(Aw9?Lb zV4H{@@oZ+sSmw!B`PPBI5wprvpk9AJVQB<9$z;1>Xwg{vk1=7=Y)G~0uHI15+!d95;(E_hhV zJ4(;fhZX|b8R8`z5#OqmYq|^;_FZi#o2}=dt!DSU*im$Sx_ZkZeL9or&{Uf4)bVlF z8Bn?7EH5z)jZl(>tbrBOlnwh=0i<^Qp$Z#!O4lon`YryTLUy~enU_^_MY%f-tR05%PNggt^Nm>Q-TK}={pGwiO zc+ui8!07z6_j=`f=}O%gk#3BqQrb0^?Ii)-erlJ1?ulFMo4io~B2A&T>yn#y|3Ol?JFLnlUa`r>5!pz2lx5?pz?2 zfK131OeTU4mEp`(CV0%WO@!DLRU}s&SWC%=h#pilTIV`6j8Hr2kJXK9Tor-Xx*rfUXp7Zw9%I%rB%W;J z$UZ;35NyBdBj);bMtV@)05EhYmCu?VytK3k)A0KSww;8l8^qGia`2Lw0{yMAYj6Qj zr?}9(&G#U6mZV5-0JU;^)OiEt-AYrt^fFN7qk>Guq9(7HRm+O|LT?1nsI;QtgM>_3 zAqs}FoE!@TqGO%wO>0C=gZ$kLkYprl@^LX1paRin?)LVs;TPpSJY!*9W#ZNLcX$UO zkMu_%?t|BFEoQpaO3~1=Q5^dR`ab%o_V|bN*Rwmq?Rgiz@raW_s#Fd zmY=o|L}HXUY=0X5R8efoY)1Z|&UQC*aYGDLZvB0c_x8^@n)kIONut=#s z&V=!N98;;ju^1IiU&_qcI+5RSL0+OnbFvBJz2FahrGbSdQvQ8CUqOHvzfVEri(lk) z>I0dvaKWQYynuFUKuSN5uF{AQ9+*X$E|zl(O;}ZyoShMq$v#1P(=9|x7nRpcsP6Ab zx7U&fa3VM7&E1@nc!WH@YRj=mn^{vJ8ynRoPDBuv01;#Rxp;mcOHd;rN)2AC{HXRr zLymH}qDFqzUU->B^HIW7LOaS-xI7I+V7#YUGW}bPfpqF^;PcxgmIJ!gehjMBzwl-$ z--Z^P$wK;4&EbH-k?Q^_HM7oL*uMw4YeC|Z5%D|3h2%PFmN$^*rIxn2v$#5fQ18aKFAXZRa9=guvvnY==@UqJ?UFbGaGz>xUGh0! z&Z<^lrdGXHnXs@?;rJSVf1rw-6Ba6E0((krT>Yyvhxrwz!mN1oo2`?&=if%kXn)#4 zJwRFWTmXR)`gc4(7KxZR3QTQ06DE#)#v1Z|mZ+ zf~#gRlp?ab2Irzxv<80*AIS&-0#W!0ufyE;K_4cWfwv;yc;j9~g65K(sVnM@LU^S? z4NC7vU#(9RIgS;Cg-ar}K>X?>t=X@ge8SnPI^!~$FlIWmB6j(C)lW15F^Ryh5wAPj ziPe(oBM0x{15@q_PF}lMHQY=vCF571s!d+l`@NBShuv>fn>HUoIjLNA;PCnCW9G@v zyz$&!rFArn7KGW{QJe1s_;@9Ve^dhjeU&lw&^*<82{`@VgbBY+8ugg-2feHd?i;w^ zQ>kl;_xl~ZcS92FkbhDV4C-fvZgMS9+mBw3)E1ZdM8lT{seQs=|8^i3MlJg%JhCi# z!UA@O&`3HjNQblPxBbRs`!2VXL@c9r;%ljE$#X2!R3sCmp-+;249d7<(H9Jp74tVm zdeC$kX>1K7gFYXYK5Rmmx3y7+-c7N9p-ay<%PSjFy(XLEd}q zEPB3Z!e#RBK0mA)2R|Q=Zy!9VKjfih}p1C<&e&BPf#I{_^z+N;~#r(%cvXB(* zon{GyZVC%IBB(QLgaO1zlgbg>(RbFq@Lk=yL!gud3kiu1kXEROuEFOPBqa%^Mw`EI zDq6!K=m6Wwd>=S`EqJ=Y7A1IHsLq28;I&i|zBev3>0Bpdw#K;`GF zgF^}|=RzAncR5RW&q+9Wet|+7WQ3l)w?8k9RH>3Owu`h%Y^C66?d@7d@#1;;!E)4J zw&>8QlT!1;)aVfZn1EM7aO^tF@GtU!W7jPXvPW}rp>*P1a5Hc-GFqGhT?^r`P&kbL zvpL?Z?`Cy>jZT)A(N)j1Xn@W<;U}UH><0}}8e;%4+J{Ph4U{_`A;RBs@6qZiu@Mm^ zOfe|@X=Yw|A$`~)yRO>}+_usx9phpg^<%+<)rrgzeGS-mi7sz7!YHAIImD+3HP$ zqk6<~;nN{+kUg?i3P?J8Vu0=RTFRXwHUj(+g7e%3+O9^kqlJ{5c9%&4&0H9T0tDGe z^dyKq{0&P!!MmC#nwXT~SbJc$pYLMx5T{?dI<|0{zB)4YX0;)HP zc{834-!gv9sV4oo1M7m9NOqjs_qM9?cI@rKzq7Jn!$j)!2@NduXu78XNxzzxJ6m2vj-Xp$HAoyh<5QuG$H1 zK_Mwt9|#Sofx~zB}R7+i7Jb-uL8AHeNtW#cQ5gq4r-6 zYxpcijAhzDPbt66>_W`!#J@fr^(aVR=5g<7)XfA9iKU)70I2)6h^iPkbujs=0Q}cdAP>ePC6NpX{oubO`X)2A#S~B2(&+d z%mKur6u2$)&nI&-AUOE_2b?NP)NbL(eG&jzK?jV@Hh`ZNhVNo|Dv80;3IKv88nqOV zj3rzsI#UeX^ES6F^6hBjK$msIr}PZ?WSLsNg3Gd5wz5(FZXt@MXSE8lxWFQVW^Oyu z+V0$`<8gSFHSy@nV4bJ9jj+u$5Ca7{oBdma;8x6CWy9+AxJrEg7E$XN3gGN%?1EKN zWHs+pZuw+i_ViJc+>uBnE0kOJ)UBjOCfLnCl9WLVS1Zw6VQyX!!63ts?*q^+(^7k8 zWaK`BI;fehnuV9l#S}UP zzL1Vi+C+-_gfqKIx%!i2kIxwv0UEGw`5z z7gpY4Gy}npPWGILy?C7>>O2r|ov(1vWbg^}lP(Z@*?Uw3w!YpyD%NV_?0O31Wx_8f z`0;+ke1!?L?-WTxYvD6uRGom|6(bk@DwQ@OpkGbkO%m{Ppx^3WI-6nZa#$7+gXnoxb4^zWx6lLO_ROsy52nBE8$$@5b+ezV=UohqR_;IICh_JjnuQP zxGXHb74d#9Wf{+^N$s@g1;AMtpQwiLOY3d>r$o)urZQ7_VyEx_Xo zmQYX_lFxk>3_A}F0ICjXJ)fYGI-G7??>~h0D1>IHp_`hR&`z`khkCf!+&?0jK5-jtggsY_hsyRtJYf$R@FWQq4~IBg*}@rLFWnh6X2W( zOOT@OOsTR2NCB1W-hMBI$7t@T*Hdr9>P;8MY}KYyaB_0eXHyk47V~W75OoK3$PG*E zd)^+nqloC=cKDlqYJD*7v3kQXh$q=)zmz=7&w0-#-GXOJ2_@)uaF+BOELgn=g8x4o z7ATF02{aFwV`p^x+)Ma!^@k}_tGd|J+BaK|FGvML!e2|?hS7pC4o|I|x2op2P--XL zdt%%&!|SrPAK&O*tyk9{-j@eMagRSKy*__;3@cU|`Qkqxhtpb*H+Z(H3woW@`rZ{Z zv_4;&QsW&W(%CorTqJr@dYoqlXL@*ar-G5_%sHuF5g;mue2s1Rl9;+z zNaN*ze|TJE}4id%cFmk<9s92(k2cUGf+E;ox9f47~nGDv`5O&z( zC&mxtry|cN70fIUSiz~Sr`87||M5}qHC+~U?a3P)5k4M}AI;!)rUe9KyVxA&&gwZ# zs9cCWSBSgY%rE5I2#xH8hr;t`LCf;P8B?1oIvYZ z+e2qfhi}`SQ{{o&Lh$s(;Q6S*=kiee@p#>k{kmKh~PBTx81~`^R_i>bT=(EmG-cEWO&--no#&=e9l~IKe=Vlk?-2GsrLdEK+49V=6{v+j2$L6|bp<+-C@!Pp+BHw)}O*EQ=)N}Y!Oe(HE%^zSd_dC^_ zFS$wdQxoU%=yEPKB;k?(kQw9lK|F7epQG&_77Z!g&go9QI#DY;eu8zgXXJ`Teb2xY zV8yJ*hAe~{)dL0$a~dwJNXW)wmd~sPQC9y@Hh-e(bn#6j)#JIRIIPUKF~-))cK@ph z#P0{4bqQUs!kLj`zgSe-G}H}K z6sgl@5Bl!ubLj&f7d~N=_ykPUf7^D(`OoQY78Hp=I*8~B_)zZzCXd5zjas5(EGM%dp?ohxG6yO7r>vh2vNiYlC#^0-fMs2 zW%M^SQs8+lKRVN6X?=m1|8k|FSq$wGe)v~yX#>$XCG}`&xyd%{UM^tejce~r(Exc6 z*X5hN2eGHC;g+8q$D3Mn0f=qGj;!npdii-1%Qikx$kNyi5cLmr$k1PY;=|cT$60j~WC8xry!702OkS6BA03eo< z>n}(w|9vEy1c*A4cgWDcj#3wD(g} z|M5?Qp)&g$!zCgVS_s=p!HW0(bkbY$guabL;ZyfRRPi?F%CRM}r~o9%Y_ER2ruCRE zKh?T==cS9=Fae)6Otu*tbvY|jNZiZmsWw5I36RmiS$#7Z)%--A8*U=L-J5usEu<~$jQ;vlJDW5mROWM%8 zQ@~0xB_&1tCA%TZ^L#yUgOW|2MLJu(=_noF&TZBlG}Nvdru*V{3bVTnBa$pGLJ25i zmuGEC^30({q~?b6e7)6eyDFo)8%V`omXj+}6iT>V*)2~Kh32aM1(DN)g#OpuRgPvQ zH$n;{WgBN^#jm6OQgFn|8eJr=l!%>krZr$&=q#Wm#NgdnxjTX+x>TD|*%C{9+Oa~- zcnqgc?}r*FeJ!AI6F>(2U9zlZm-9x8(F<2YCQN?~&SYNj#;ll6f_YKlQkN)>=vAwd zF9-F0ehqu6)vpVvRnf+AJOc-)b7^X-)@ri8#O}7C^^Y+$Z^ohrf^OLIOo7-R6Kd|D z@LwAWmuUB?)kEuY==L1l4j&O(=Q90-royUO@h~)-1fMjiuf=Dk$+`dP8CghPy^Ct6 z<+Pz$(RMy3W#Rdu9jnO9iW**!b6j0s5Gc%>>KRJo+g6)3pnSD*!dbyLpV9-|oJm z)&A*9)9`W77xvtel%>X;cpaSZ+Qo3e!W18k<}adC#ShONl^88(0(S2V?{Bga zMRJ$ue|5ER#%8Pkr41b#S|FD1@69rJo)b@`C-1faX#I*AcwWGH5S1*i& zoTp{AUO#E3YcdnuNP|)kY{`i{f8c-1__6=_=;4^dcJwVr?~!Oo?Xw5 zWpUXJ`feVK30y(Q8(`o2ho@-H{&#%5NBE(7wlRGwqB{(1vj$I9oH&sL9D`vVzwjJ+ zVzuh3Zi3sM)zq)G(CmlFhy>+`FVfxZLViVllVhs*eX9U40)QIt+U%B>gp)s+19E)o zjo7A_1)Q$1SG8)Y7FAVe1I|6gzIWff?wz&i+(Fr-{g}Ps|s{ z@YNx9dzkd5{NGBG8u`9|3mnI}9Ae2xVi$=bfe>uVT|Knja(vQdCJUSk|6%_wOz-Jd zn6q5o47wGUV7>bIOg3w~k~r`V*M_rm2vC0be2#PDY7Cpblx?&Qc3;nQ$&fmhrc2O?&gviEOk>6L$=e^}kw}VtZi*w8lv-LKPX&)E@ zh)alY^Hkd&7ELuqHB|xaIcm}0>^=v62!RR75vQUbb68UPG6R^Q4uKmKzTSQI@qQ|Z zwEVW<0GwkK3U>4uXXG(MI!RR6-x9 zc9zrje_q-;!F$CM2lq)?DQnJth^7Wt0;8%3cC%iP2n&7JDQ_jg0fYio(P)&9fYLr> z5&W$NzpajSS9~`YPQZ1{)#{aMgLsUe8&4+q(ugXwh??Sehf`h7hWay4k4p_va)^*+ zhSJ2q6Ypsy{erXfetT>ZGNqUSVG*;WIq)ef=%EX6fK_hC^U(dy1f2w^5;8vN{;fDA zg<{cXt?13-tDpo3;QK}_CZkI&vOkqfJUny$kGaHqpU8iNlPD9BzpJZh=>{US=Y}VN zDTrP41gyeuOkQySaZ7xZnKjO#a?_YtDxzUnxp?mL#m;uECp~q`-t#-x`ZBQy06zo> zq&v)Y6@M^iR;b>2hz50^Yi@fy^tMq7Cr*;s1km_WRUo>`Y`*DO@Idm9OkJNxmCI)0 zvE-fFZ0k$e?oPNgkNVXQuOd}uc&!T5MO2oMGGAXdtc#kZ(@F>kaX-i#`Dv+m?d{t( z-4pfi?r^WG$vR-55_A16VP*nwbNU;mT%$Y_j!7@$o&7|e&I|5vFQ9Z@C+THR77Yw3 z_wDUAw1V`FmitaV*y$~5gwuxWOUE8^`AOVORXcaFqae1A2am)ex-lgo;x{2tbgHsI2wwlcNCyZb#_ zdVDZg4^r78IymUH(YCtE&usONMc>pxFgh7x;Yi6VsH>$Q2J1wIWY2(yQ&QA~a)Xz3 zA7;QORp2DUGbbRn6i3eEdYaEu2AQQ&T3%!oBwfH!PM%*8Kke;!0kvNChm5vjvM;iqT|HL_+Q(p8)zL~kpf9U6r0o-oj^Db z!9g%jRLF5N+A&iA{Nt)ci`}}eK3#6_W{8xRktAco`#9GDbUWIKv?dJO)t0j@``$0j z_13!eP0sJa9uY130doD>dPOi-YLEPy7AQm7ghw!=SI95EIstPbowOXw-yZi4-C@-( zaCr@BNK)zY`3{cvx8)s51_oRvz1=Rl*S7unku-qhvGM!s@R7#N9bYl4l}lCVJ#9G< zi46)zfJG3XuwXdF2$AT|qy~7f|!s6-I{szxD| z+5E4~ay`6H#F7}2?H$Qm+Dlp28^@HS*~-KrC^0xoyiiIJHjU%|D67q?>Ep9V^>X2B zOGZ8-OA|r@p!D>(t2uU_-YgMkkuXe7a}KAr<4hN8fH&^U#Bm0_8JNyujwhTKkU ztZl5ScF~f18{%q3MfisFv6v3p`>q4u}Nb<=hf2NJiCOt(AQ>a=dZ?Qkaz z5h6rn%M@2-mcdDz_|{t=!aTAX{y(2jas56YW=RdK+SFp1jTEWwmSaFupFaN8vBeoraIE10J7RqMvqPhMx-X0N;DiWt7t2SMB|DFo@Xxt#<{N zm(GLq2S|a0&719o_CbrF#ZAoAOjmm$;sB4HseUFZZ#4M09BQ!4%DF!omD}Yv9R?zO5mDpq5qPw*XVD<@#C8uV4E z&bQXP=m-ITL}$|BOzbw~lPtKta1{)7K(UY3Rg}qTgR*4EGUP~!*Sp1cY3FBr=^TI|%abXSY(VK9D9<}&YS{93~`r7?=MC0gb|2!@j{ z0zme9;%JpKt+o&4!1kNYd#T=fx6$0cLw+HdM4%HZKr*+ps*KFT_i;}5`(N6Vllx{{ zdxh%WWt~JcU=j(q*nFLz5Uz|XOVuXrzmCGf)h#q~#Q?3``Aw0>2d6wI9^=TKgc~D) zA-Mr~u5(Mp1~1~K@$8@atkc=KEtBkKc})3wJ^$X1? ziVYn3u>r&LwWhkMvd5tYQXmU{P^>8ch37&gc&O>hQveZ(n#+-(ejOt1z`D>;N`2#WHRF7|ej@mzY z)u$w0$0^kS^gb>C?M7xgHXgiVGn^MUzNy-@5$rFqMTC3*KUXDqHn$svNmHqQb)MTz zD72ufCYv-wNerf2*J9Qb|64vN=5fU^L~dR{Vp_``^vU{XNNk+XVRv||`zER+1*xfv z_~$6N)|^8IJP`)?p>;dB(;LP}9u;nDqjAHFsB8x6)nF6Lw8ObtweZ&6tQci7!1GDu zsrwU2uXKM%2(gva&^U?oZpTp8(-|LCH^GmEFrM9caUzkWm_grWQ}!DKcvW=j@_!E}{D2>T}^NKrpA z%P)?XGg4Nm9#-u0{ABihKyIei*BQ%qC%j5PTA(BvA#%>4P`OIt&63x)JpRXn;$pQY zw?H0AA?RBe2g}=m+h4V%#ibKcplsV_vR!H;JyjKrFC-&U>8U`=h5_}0-XHs4JmTqFlkvG~N;0=9O?3TjffuC!Qj^C(3&WXfiByZN= zJ*HiR%XvKm8N1%mr~T`&$#D>c5=i0&aXj^ohDO?cd3wsFEL(w7W2qCC~=KL zk1$2JOvduK1!$0ee@5}QS*o{Q;;j$>L&nR^O#_T(Gnd{R){D5!R?3f_maB!~{@%?W zL|Dsy@kRh3;?Aue_cM!TBof4@0!__I7t0t$(s4+RAH)s9M0#fSU>g5tQj zwg2vie&07V1Q?m1@vu!)gzvA@TuuVNx5`>FPXGXZ09nunb+o;S`uQ8)#P(J9z8RfZ zsz&p%tttTo08|0kH!~zEuyoT^pYgC$u@Z&*eJz3;P7p0Jqn(d%NVj&yk=jn#HZ_ej|9lSAnOsidD2ySryxJU@}`?K`?1sT zZSN|k`G_Fyr{2U!E2YiEAyG6E_YB2evwtJM_%>8ar_*v2!~$DXatUBSWQu1=i;q7L zu(wi`uxLE(^hCU|H0DBSxc0pMlW{tsPxuC_>2RE4{(){2Zz+~LDuh@DR4dH-mX$G^ zr(H(ma=R+6dBjm+Dnm zh_5lE2F-R#-bGoXs(bE$h?tMn^k; zHrmu5?NtB}2!u#`;8(`4Ywow=P^sKn@R4~k7t@?hQ~#r?Ui9l>1V3OptnF)OJ-fEb zZEPx?{KNtWOrEV6Ykajr_n|8pO#_pHLl>>*(<}?3+f%HrH9Ze8-d#QVD5|qr6^xmd z9G4oA7SBip^~goWW-dk8>C(~D;T(mA9b%Z~_K+cks;=P~tpY)zBfu)k(BZR6Py8D2 z#uk3$lx(w0wQkXoNmBnkx{n2a5Ta2t2BuKc9Y0WO7`!|tqyhX?83!k}pI|D*RNScF z%ii4iuWO3cRz!)t~IKF=b@zSp$IcLYlGDq6m)@iXKEpXtp@K}!* zlV%TLhgTO`x0`6mDk2gmF01*RXVuLz9^)e2ce6d{*!xjce z6uhJ3t9o$9mfj8`$AfT=5%&TZ=PUih}jWH?MK}uPahP4$nO)x_81vo7$eBWS*||v z{!_gX9Q;EF`=m8ie-BuY~g;A(j9i4F!kf$AL~PlQs;P$($6`HxVxdheUvllD&fg#`krwG?kNI4N2O@?a2q|0%) zC;|X})Lu+aRHL{V5qE#>t83K#DlRI{KZMwS<{D>yaa<<_a6t~RHPh`9q~)%plx!n& zyAPw6gdY7sjB3y6zKcIcQCa%5Y~ZnK`Hn-q8Ewl&Ch;cteVb$y!B)6pC;XgkT3_i zn?J-gI$KwZHALkL0l*38)Kp^ECv)$g{_QlW363XMs3%k|-4{2jSR(M(Pfc-NUXC_D zS@unSbN3zox;|x5hbX2I%dQu{h$xBksVr1_(A=N?_=_&O+Aat11aYr4f_G0HlMb;^ zG%|qX`0H{?QD6vZRwe=2cD*UUm#fg~9x^}Zdb+5DW)X37vXpO^^u-|S^cRO|-aY}H z+i)fAWF;t5$n+VEBT6+TQPp%?m1e31SuVdyX_}4B@M^!31R8i=MlDuQC?Ef&G>Mk+ zQ`aDKkzW1UpjLo|Fr-sy;`yb#+iH`EtkyLr5KmFznIf5W9)7&H#G@*$|44p2-%@KK zi?COoZc7$&HL8gEc+#|34%>PVC)`eQ=Lj>Q|0RKjB6Z*`U~u2jXq-;q?fnm zLLYa0s*?6)cud1uO#Hb~jWbc5pe=e9?%|FD($dVIv=ALYRw76JY7Xvfc7Gfq!~h8C(4At5hZ zwm38a-24N6X$OC{R&~Teb(d?rNYCjgCM=$wcn<^A2;01D|cm}OJx$UfYB^gUIZr$b?L@Hn3 z*}3l}a2lk4H?H`M8o={I#^4Fh9~9!pReb%b_cg59I*l>HQIgBt=5|e$c1-pD zXL;bNlXR~CN7Pq_MfG>l4xtPo3?U5NDUGyrgMhSj3?bbhof0ynl%&#K0z)GpLxVI( zJ9Kx)9sl<}?>(P+W;kE@JuY`f}g@>ck*%FBH5*T;4EoME&@C$h712T4)Zx^v$Le;Q06n zS$b0dw;eNzVySte&Rh&ELtVqBWJjCJ?7$G|s9JSMfhAO9&;uUqu0%BP<*(fsmGt(B zpOaCYm!Xqu3X9Uuo4xpD>+rp4<@H2DCJa{1{WwHD-E40SOZCujbKrh~v#DQ!h5;{t zd-N+6s=RQpq@rBI)t?w&oc4M_D;x-N9IwgU_FclLmB!;1<|>Y1-I9|Hl$0M=T?U2> zoeyTv*kz|Sp~=Yq_&7H>=<$Xrj&QKK$0@tnaw(pV*f>aE!npV|d;9tClFIxX7Pc$> z%Fpc4`ohoRJ5J}t1WhuszdX$iQSZ-X9*Oh3ax?BG-eBttnhWC!I++N^_Vb!x-S`(< zXu^Mor%Axxvva98F>;E8^2G7{&EkV&b^&RX2p&SrT%}xH^?mf^bXW>7QC)=(coGk{ zfoTgH0CeQUG(fmnC=Z04pY`w)CcQKGilA`4vd>8{sl#>jnRL<2`^1--^ov=97XxrFrR0=x;E(WxjnqsLy8%%FPSWokBIw`KGj;6X{Jcg z&-740?%W~nk}xVD|3l-+mF=DY@{D}_^Im5%!2wyoo>D6aWrqQz!RBkt-knF&r8;i@ zP&M1Lh|+2?x4W816CHkIB6KApi_t&j-PysUH^yESzN$f%+Ra$vLYT_Fhq%f z&Ny!UI=zvD?BZai!|*QEl}7`qIBDSob%V)0q^^*9qb;|&J>_*%8_p)j?lUP$B16>) z*q0Xt5U6O@=!pJZWZYKmT zjr!vw1YHq?bjeM>)~Od^3~yfhdK?dD`y~W3s7w)mI>s=)x$iw8x!kpE!g&kk2X`Yk z?{1+Z?5d9zN`G|Z@VfV0E_DRU%W5Q9(tVaq<&g#`TCsOd!C*CRYZ(W*_pi%UC!ycd zF38<%pPJGYRcA5bS!W7IEz2KDdF(}zkz#=g89rT+;q(2^?Of!Bh|w;)292`47HfBX z5V6M~58U~Uui=xEBTFGTKcP(g&CNl;v%CL0P9LV27b zS%H6`0)?hsGwBYOS`8f~4!Kyhj7@1`{5ej3uw2UQ)8iFiy!*Q~3L<@jR;%J6C*kS< zY`8GS_F_x)konh!j~oC3ITVmoI?Y>9_l1TAsq1PIgU@}}e2i{`Q_>8#7^}l`xhOR7 zOPR;4R*xx}FA}#-zJazW4z-4qPV*Kdme}|V3{g?QDB$}9bfqK?;$8~`aEmB;)S%vX zK0~!u9r=yD9q>!gs}fwB+xP$V6VwF1 zzf(-L@_5&=%I5;^w`dT%m=WxJY>=f1pG{6eCL|UVcO=L{M+M3}D6StU=>Cx6e`0*qM`wn@{oKfp8;k^w!e((G ze9P8JM{l{RKP^`gcg*Vk8#1Oeiol{|w^1JHOz(XvVRN?>^@i5PwF%mbS&DEFew1Lz zpNhdd^<{pCcM@N%kQZGeh!Fb$AQ##`dzGKOVR03mo&ecS0Kk9zz4 zGAy)rGb(B`v^y~hCHJ-dIa_)#8*G|oXGCv8`Cc8@ehnOi&%NtEUU0qS_Ej2S15}|;k zi-yxB-0lm4aqFfB65pvmvi-}R|E?!F#iOZY@#1l==EIgG7GJdQ5?fsAs!>i$^&uM7 zoNV1b7r|7d1GRo`Snk-$tc7_jNrbO|(S-xyK&f}r$nTQZ+(&qu+;v~Cm16QBi)X+n zzj5c;8cFf+dm?=Dv6}E>r6FbXV4>h?3*%0X@`|>?{`f(OO$68xQ>4 zuvK1hOXn$ai+tS#1WSN5`P;RIBDmtIA6Fe`g${I8i$f(r(nyBrPAtBiprD_C(?0;! zQJA*#e|2#Xb>tmmZioLsWRK8$q8LFU3jULeihvu0!i$%3Qj?w`3FKTy-mXV#D~}zk znJXkt%PIN0+Nlhs@}{T9K^T(!PxJtIbJ5=Sga{tHtQ?__W>bKzi0?^UXOFVf>wGzi3cG!Xnp`c-~`&({jVfVF&&v56%@{%s^i0CnLJq;FD=UM9V$w!zEPzJjT?q%lg-~}Vor2`> zZ7RwPyxo;T=d>BGa#TQBkxE`L&wPEr6+Ks*D00_r>#I=3!Dxg3ve$pXEUw?SlFdyP zj0^*~X@0wlI`)D`6yAHQh7m>%KMVkplODxAz8ArVdU)G8dhc5T?{YjB>Kbh}4!AhE zN{_>(%j8+NjEJ5of$|pP!sq&ncA_Z_UT^=-GY?Dt2)WCsiV39wS+vOkdEh1=x5|^0 zon<}V$e_=r$v$7rG9+TGZaQrkD-Jx~2bZ`i^H5ZKDicEToyd8QXS&e54qm;7ao9gJ zR%H8KktFLT>-q8<>v`HWS+XP%k?*{P#@fvbHOQPjKgbk}ijM{gDoo00B*=arL_BO~ znws9NM}|(Y=~?1{Fn2k;bN&}bC_{2b>*y3h&`^ImdCO{~1nsZm1>U=N1@u(6?B7#; zW=9FG(vn2dYuOak0Y06afYmb$v5w$bYMgLssB5`gBU|01Q-gl;pAQnsqzEITC>G%N z1OrWzuUQ~_uy^WkQa+<#JU^6|My6(y|)I7@=C$ z>>uyWa&;XCwJQX?wb^CR=}|A3ul`|?e-{#u09PwmUPD0$quTdYa{9GCW4k9@*|SwU z7im|WCC;$*@b?gWxNsp3#PSE5K)Kts02q=n$}Nu$k>*BW;i%4PwY*SRdGtEtC&8n3 zV?|J)`9CdWv6-^)&WwEP7@VLCc1JFHudln^`l=#Q?=TFe2S17XogDp0Tl6`b4rpog zZl!=HMFau6`fXt%2Qxi_R=|J|v+x8O5MVA-?|5sGapgh4W&=)1fv+cv14PBJ*p&MZ zR3LFhsi~U%r`=9kiopmwJ(&u006^@Qc}kZJ4|Z-2!X=YVoy@S7?j-8oXaXM zn<%^hLe(;vCtsE`VQ%h7qU+Yvezwyu5{V%h;k^kErZ3##9c8w{KA*}3oHBoWoDO|S zez{44FI6YJ_&xzl2ZW$+dnm8}!J4)X;QbOr+7LhvuoG>bpZ@m{Ml~L99F2rt;S6|6 zMWHCjx-`)V*0V2crih+Q2(LM)#k8qzx!gLxZ~`?dEjJxgp2{^^oK@Fm{yo}=AiynouvlR z=vN64R(Pn@hEDUdUeT*{r-9)=U$ga$bW3@vSakI)+38Rf($V1C9(#xuE?m`Na|^da zNI2@OofZ83f&D*{^ox6(L9d%zlDg0)dm12)Ym2Q3)cYw@!7;eB5VheShka~!W|Y{UX^Ibfz*v# zg)yX~`Vb4r%}D=NYBEppQfev@%=)gQzh5zCM6EPOZ+B#Hfjgj!4BZI-nLYs&EQ`C? ze^(UoTBjI_hA*qHQBlPr4aDe1afPb=cmVI7|B$f^j~?iZXlcLwQ2pP#GWv3tEa^l^ z$4j*5>*`};0Q`4&6pOy>yaoShfvYkp1V#CQ3~d#NFN;3lq{A%_CbxnK)5L+yy7ARi zq0a!2^o6h4k=#<-Q>mNs!Qd@q!H3+6LLZut1nL1>Q3#p6W$0zncko)x;zN>F$)zF} zr9=P_aRLh)L9H2-dvmRfF$(3Imi3dkz`bJDV-Giv@C$HSI{ps!X4bzrHPDPxwzjS- z(W>L7N*Ei|Z2lkzrVRmr@^|4~VPI@Lw>3|pU>Xp8EEznCNB6yE1W*ciqU9i?0Nf%; zlNtGz2_lb15ki2fh*1|mhVZ}vs362QJSSY_kdRzgKZ&g@9%3LmQa5dDz;^@F+)HL3 za$_M9`G0k;CLSB)8@Sqp_gMUV6ouY0krD6{h#^CZB%8T~ zUl8D#uVaS`LEzOEIz;*CgWq!qJeOx)Z|&c*+Hv$Df%5DH60Y;*46K_fIqF^AJ#1`j z)YjI9(twSZ_K*Kzqb<4!i<7&DF0BWWHAvwf^mV$(Y3(*TW>K_4D4IXCJ+fw9Vms8M4Sp z3W4*!WBzba6C2DB9a&9=W!Ip@0~G($1zsXRa|s7QaN?@Hd5Jq-(1b%lF)}lV#oxOT zs?Wd(Amqm^l1}&pBKps7*}?QOy9_l}2rwAgrDFo4p(?W?t>?+^ zKf%$VG|{MC>9Z_bi=hN1wl+Oeva1x=rTp3MfbehT%5MNP;V3lBoj_U#a2ALrdm>}T zB|Jfr8=elr$o+BZOC^k(yfSdeiQPo!8x7lfe?^f+1H0}2Jaw1A+e8@ z$M$eAovvJwHoa_~o#M2xwAncb0fw$n)Bge^f@@d{##C{*zR8Hc`QwO>qza3Y$-Msd zlrHqx7pv|%g}X9f?>cKe8YSqnsf3<5a+i4SFCP?jaM-8jb$!#-LqE$1gz{)uDrw2! zfbz99h|COV3ecqGhf%l8J%_+(LNp$X`c)^Fzr$#YSa_$kW9yDLP|TuivfV<=1|<`% zj9=KECpb~Z#c+$ZBHw@gA^fA=wYyvME@QZ{@vJ8V_c#hH=uYoA9_@Cy*~ER1;;9^l zB-p2%bdnJHEbp%Yo5Nl5&3#Kl>Cehuu> zl}nYS6@^71H>Eufo*5y>qAR83P{W7vl+!iXC1C+jyTpUcOal|yRa!<-%Lawq=PPZa zF=HnQv^ze?b|z_d~Bp-L#&O#z3^eF=IQShJ_Wq z97TeJ0b42<^W8M{gq*&v;&lU!(r23Bs#|S44NGXqPR3w@fqtX^T}NH8ywrz zB}AwWK?xboj!`WOn3jX+9qaoF;^DSef`>|RF|6$DQOfYZrX0)$iChH`jpLM*gUJdGi(gr7bg@#JzG0lP5dK&Lc4D&(u5ZzG44A0J2HdOq zjkN{(L(hrDSmrrI1sx~p{~8p?x{c!h&49~lyuPiOwv+l98bX7{07`D4cUK7XQM6%w zLGGyrt2S=u>(KCp8mG$QrxQ;ITNng?R>Q6;o7v|zZeZi9l=~vo+K)od-O~O+L)MH) z2)jffP?7szx910iJ{`FL9(_BC4RV@GfE0+OuT)DQK=E^o8+JGa#2D^l>!V}s^*E?1x>fzB&HOIsGuv3|(jAt{tE9hqDBmFE zOwr@`z0}KmHQ9L}hxmwSMz)BlfYEu)J+PBrNb6hmb(TK-V=znBF&jnaPuoJ zeGchzr)}kjDs0;IsLgfc1fPg*adtuaVyQ~k$xXehgUqhMN29ctzhXb<`b(XIo8-7wD?cYv_jB;rAczvyOrue>_2eqC?EFw zg2YdLCQvg4_%D@@88be&=KN!&@^)|j=fmT|QH5)LYb|ZyLvgk`^iaa@a5sj)V(2VX zD#-KY`_@KfNXLYa{iP^9W!~zCtiR9Y$4;YVkvaE?OrfoOHhlAwc%a3;fc=pkRR>iM zK6^IY_#rA|H+Q%v*O+bocOR_|cBz4{+rCwRsBu7-Pqu+zlKm(dWEdFHgK<~L3u&Pg zl4lVZq$J-soG#sX=)rKDZ@7Xrmv=lty8ccZMwrZ`@gjlYNupIdi8}E%cGZ7!;vg@adi9qvd79`rkVP1Z?S9EQ!oaa#_#<^g*pUEG zeon8DOb+BK$1(cdsuxofdp0{leRnws-QAONUR>gSy<3y znD@#LGw+Q>$NYZ#qov=ij9d4hp)lH@_;q*xRpDdBM$6SGo>3j0Gi|@}pGPmyb)e;K z((i0^Tl0O+;An<_NXF(V&Qm&WPsa?UQwJw{dm`~ljU;T8q+E_>hjMd2n)}yJYNhfy z4;@0W%R?9H@(IY>PC9eFCO&9>MUE#-aBoyNZ?RBRp5N=-VrrK8(Rl7}WvK^^jz<_jIXOuCUOsanp-! z{%&2y^a?!Za}he-lhd&xc(AuKtzo-+_`>4Ksv1`}fJ%~?@96`wec`q%^f#%%@E| z|H|w4EdN{^hadvGp{ERoY7UJi3%6Nif!Mt>K#YfztXn!a8WjbgIZ5ted{v%7rpW`Z zV;@L*4-?LE&(b zwDx}FL8&;YV+S06!*a}gO*IZXxuv`rA|Ac5yex{*WP{yY2mhLDa}@sMlrhmZ4S`@( zQQhwbTDO;|{20cX-l(ZG{b7l1-*R)3h_`Zfor^6PQ|sE})N~m-BM?8zL)+2^b2x0X z?Hr~)yN`*T($Rw5P#=9wNNWw~=_o@wcI+D5%zGc3U!56qJQo*joSuk1DiOh0jSA~| z$-jH~UFq?Dx*SIAeEjBY=gZ%`F=o!Z7a5KF$-0!N37~h`U#B%kU*cl2@ry$!fV!QJ zD-i55a`mq#`=8^f{SUv}va^9Oq7U&Vb;vHsb7!Xcf-S7s+N6T2Yv zJhj2`?pLm!Zasy+DTzXHnxIFsgNwB1K%?aqOglp#5BdRK|230D#ES zL`o$xv1$RqJbwXbex8Tp-)}t-ia8xYdam7%C+Wrq2biPa$Z1ylEb2KqOu7_gtoVCS!0bX)0M%Z+i^xqpqkr);F%LthA~Q z;=3!wZzsHHt`2(G%TRWd&72}7w?_AP8A_n|dGq2U$EX5TOMqg%^S<8XZS2m(pLT}U zes7cbs@u(JY7RD1FB9#q47ysSFMs7?ByL+=6spp84dfbTsWruP#Kpi!{>+-S5jS?- zTl`kI)SnA~Atmj3hJbwn%xb<>D|zqkH3I53`O_=zr|_(2dmILNcNAKb-qO`6K$wTV zYy7;{Tf{^!X^mj5<|DuHYu9)&ZpPoaG(TZ^+#E+`g zDXP%%t~Kc1(I)?ljEQ*t$a$f{cIboW-yc7!DV7aq#WH`K4!wE&7I)t(JW1lrauQC5 z)}^felk#@~TPM@@@?hC#P-~5TPoaAZnzHmtPNk(W8vdY4Ir;0o*PE&08u%LH9;Szn z7WUo2y4^)exo^iz43^J66Lt8GR|vo21hZ@%y_fKVg#N2G!mOqZxIt{?RX|2LPh~pl zz!R-98;P!yWKB4!2;~*dzj7SW+f@EVL|6JPH{kWIA3}Yy+G+YV<+rtSTd{1`0hjdY zdElz3{A1o1(E>ha737Gz@;4n`BfL430f?VD2VFJjgmgf3fPmA&Mc*Q$JJJl)fkZfR z4Mlu3==4y`u5cPjWJwGzhPpDD5$!YzDy!^H79MPnoNv#3Px;Q}srt2X_xYCcqU&mMfXKO`1RD2Z@Zr8vE7xqn_d(0=>60H2(WPcv7UOVw$) zBxFJVo61;hbCHkye&wv`IF0a3VBgC`AZLr^H>z=#WrZ8B>OT5ishrf*0tXJK-#ej( zEsfT+5{O_m&p631zM<|^IM3xYD%uOlmUso)S;6x>a^B^{hxwHsKW@^PV3Z70N8_r& z-xWmtcHF?>3z;?3n06E^>KwZ4bRVn=+|hJMBJfc`Z7pz* z7;3bPPxEjf!_z){wwl+KW&+L~XJ>5rLw?NNcaYC%zf|Kht59%6;&kM>;W=wE*Tjw} ztMjy~N+up#l13eNo6XjH9j8L!-S1I{(SdH6bC1K5tHTB6S6)6-6-7nTX@ zL)6YYD5&I`zqQyTN^Wd-8y@g+Cma3rD7k&B;@5usbHsHVABjzy*POX+PRi7St^-Ds z_!(2Eq#5Qd5*aYfQOt3GC<=@Hul#9lco0zA3}UQL9{k&NhDhpH_&y`1s;Q=!U8!L{ zDz>NNsrhR8elxy5D$4gYGhyhfvbOjo;q_9#YQf8HAwgcTJG2m1K4SlyGw4h5MjwAE zDP1CcdFeoC942#XiFNmK;ma`*M$KPrCSju-%uLNG1V)k$jL znndEp^N=lbBorhbT}6Xc&{Xhug!!=P2(IFpO@_zZFvSMxTsgYBdnqSuNs{F*mkO&e zY5XXmmMT{6rNe?H1qh*WoUA>2u_c%SK>3T3yHd>Cx>Od$uzgmpScCQMKrb7YaaGT% zT(0|Dgmg}D+4~BCm=X*$9h4<=*e*&?u-h+TV#Y|ikL`gkFcZ~cR`w8i`!!K^+}qf$ zX)@o-BGB`m>qzO!{sP;CBycJvkzoxG&mWy&f9_?PpzeI!iO&usF4^_kN%6jP1ON%m z#DlmCG8-G*@u0OM)}qos`!v2K-}-kzEJG1lk<#BKY0Q4iqe}@f*f3)hfE;JCbVP?_ zKC=%dNphcR>-H50c9=`HzO%BD+`=uUw3n)mTg1iQHfZ1~n5&@Ujzy8Dpgq2mN$O=o zod)pe^yKx|gGd-ccBJAQQOhpNaU)fKEpB0ld%%U~_H}=2S0`HIn@1XB`aZl(F!uUt zYgfoj(~n#{|1m%+W?Gv6B@px3>lmGLA2ivcET+X36sM7Q7a>Up}nM!FHQr zNbRREHf=Z zdjb2kC-Hl)n_EYmDCCDTkaDB^Y}lxabtsLTzlhD4p`Zo8b@;c>e6n?KK0hwOV_T{m zW8eU@C*UI$@E%oaT2VOWspD<*zHGmPCK}==Qu+}sSyH6y8yW?I z25Z_`iWEUnXr#IGU;7)P0+5QPQ5FTDD*!5l0Mc{c((<;I;}=5F==gowNUiQAYYEg! zU7gL7-NHe%>3s6d<7;1CCAz@1F0f(>eEs0=ZZ}I$h87N59nr#4?tgs_wG6`ca{COg z{XE(TWiKHL=I=?*g89DS0_iQMraoGAM~POE_X}@}ynOce48tVwX%8lTSGq{(B4mv3 zg{=SvSp)Nrzf&PxdUn5}VZ=qVw9;A0U)+>?v#%VVbLg3JpDdf7@My^U!~xR~`CD)k z_mzT!`DadP2x=@VWINo>IZYsTCE%2^RR^>9Qig@O^LR&3;@0aAMJ#RWD+0o=^uze# zO-3{n8+zOkI=@f=t{RQW1S5p0n*?+%QttPB5UBl$BK(IxnX`qeCZeCnOE1DpEg{X$%f_f9`o(Qv30m z+{uV!ZSfn1FJown9;)=a;-^UCL+(&C897yaaYQt}EAa#kr#Kn-3_}KJzPdU5ui2wN z7`;5bmM;Dh$r3zq6nNVy=dSfco6n2CjV}MEtlhU_bIi zZ`isEwXlMb$;mvicV1-{J5s;%v53%Y{|tlcaIzGsft6=jUQ-pwnUnqwLXu*Q>lqN) zrqSGt@u!Ng-DF-q{?njj$l}}BNXh(7Ao33wHGNb^2MxGIV(xq?&(W419VE2>AxhtH z%`%qH3`%__>_k`tb^Zw)H*a^s6UxMpD*pTkoDxsjoKBAsM?CRP=1w6xkyJ>uc_{v) zDB{G`Oo)z#wuaekrth z`R)K4s=-}QnjvtWlvDi{j89EyK9wQ|bVS+>wwL1dZl+4+&?&k57}(>U^dSHggi#Vl z68lq!*~4K#e87Eolhc9WZZfJ29<=Qb2~hlMIUcw5K^rFw%40k`;$h45qzlE6?&%!4 zzKfFnr{DgyZiGVX0X-+_+r%kBN@ENA1aFH}`fysarWMyEHrYvq%{4y>65+obstLxI zVzzS>+a&DS~8UJ-R2izxEzo>gN35C}7k!-ItTxeaHI8O}`0&nccKO4d&wlKH7^cc*> zfoZ~_vSRw&@-3ra8>BRLBhH>HG{YAKU}kCZh2iAUu&SlWdke24m&ft340&Gw2BlC* zbm@e(=x!8%P~qE2Pn}5~Y1?QXJ>%a8aeL3n=Ck!j1s)5XO@r!fif82am#`5EPGf_{tpU|b*5!TKyl@KK$ey*5 zv==qZYHkRa5H-o zJdjHOsD%TQ`l=1Ho#K8a$Tyeq!C&eVeDZyl+CXrVf@x0uVKocHYXyG;9Y{gDb6Jfr zah{>MX;45W>ocn##MPOdZf7$UZ4;l_swHGu`J_jHU0&sk!klF~h^fb=KREm2;`}_% z0W6Rvrq=GO$w#+2hqRoPp8hF;!s%FGXkyt8Qa=pDhY~5(E$lPu z=j}tn0Su4(;5?^f2Vq&$9eLeOm#S|E)ejjZoH%_oH}me z7H#{lUmf-Ry;?_E|4v1FBnYc?7Y&BvxWFz`oD4G3HVE9J=ORw^F~T3Gh$)lz^R(l! zI}R4}`Q+@+Q#rT?V>y)=uyIhd9Q;rzD?stade~IJ?cTC=X}LhkAO^kzb+wrCk^jxj zxOPa+*?t$Haz&E1^)hvnBqc>xcMqAmXqhHbh)BLtP*YM7iO;s$i)L$@IV|?u2lqgn11nilgFa|5f$ze;&neE%t?B)eYhJ!P9GlMcHY6H2 zbg?|*>bxq26}Md_51CK09*oyc8_$})*$K;C;?#RcRW0p|{hFR-4BlD5yZM#e|6dQA zQ$dl{i!Mt%9vfOaM!i4NxKl!lW|vJ!6?7BUVCW_H>z6D0hh*knh4!mo*)KHzqI~nr zpGqWLIlh)5-e4HwimdF1wx6y>iSGV;w>jH4LTo(MKC_`Aa-LSVymRW=c(*7b-4jER ze9k)y2TKcwb$r-c)(rqEEu2jrUO31$md*v&^5{|vo@UteErM~LlUgxrwCBmwiFW#%zg^+1)K;BkRfWd5y+=2mgubD| zjYNb|+l-pDq=NFah$+`vt~Or@O<%LBKnH!Ywc$aX+%9~~wf`a%GARqAii`2fal<<# zYZM}_(=HGC!OZAsdb;X?cPeq{?5x3<81EQt{d7ldB*u6h>O~4kt`6^a)_HKtiGUG6 zaTKX|o(Wb+R_DKGiUe6;zHap5F=JkfMfYWzhB;##{GY!p8ai$^j#@7_Ay6n3otoN|sQLO1rFNrP>W#u%sb7vJ9{)DaFTO1r$L3p%+^U(PnzO~yjU z4sUy!P8RcXx6~$8SVdM)3%wlmpnlh zsg|uNL%fG1b9}NL1~J6fvv}oMMFUG6|L^gzaPtNIwpHR96Yc{p`O8Tt5ykROt-SqO z>$O)ERU(8t$5M^~1j)y@-8QrT)sW%JhwdaBFBYE_f9ZqzpTAJ2`Isd>h;+YQD#yP3 z`l+&CMLsT5oAP%hE{O~(Jly@Ar7*1NZ+3NY`{SH(mb}4g@-3nUn1MjPe9S>ng zR}IeA5js%b&J^O}Wtxt*?w#_hGAsQK#AZ1P0Q5Jj^JE9FFr}kEUFbQOb{MI?cVyJ* zFvsh--x$KXJg{yuS#^csJ`e6&zSm8B>0fY45ed1b>ys5i9;6D|#8?rg>cH!fNoRj1 zeahe(4dX0cC)h%2)mRp<{Z36e*OZ4HOy9XJZ)KN*8l`$G*(KtpO~`(hDSji=YXEK- zl8}-6?ec5UrVMeJCT2PNT(yB=k^D5L(%X1-B!>A1V}1}!F!L8))o2;|;r;V6j*v4* zh~CP}5%YAtOqqt{2IhB@C$S6s#Bk%l4i21EGZ8P*Iihh$#&aWd0) zDY7SXg9P-lq!4KPo3&KY>eiB~{N5_PsYT!f9>I<$t4ZUp+ zxX`3HuddIq2EDh44;S@nn5$Vj>j%kygYZ2WaFN8;_L?3K90=bNIQn>>q8{ZSmj~@O zl&5H7S3OaiU@Q>H%Ty4*3;t%Xw?Zpn71f88tDXw#wfG3OH%MGIM|Mabh z-FN%dO>_3^{zPAM(UFEGR88hh)Y)?#a;VTrv+xM)!sb|TP22ceeD^+AFFZifX^ z^=uuJ141io$)#Oi76*+g+~qfGg`Zvth8uGUQ3oxo+8njgf`K)V785Xmut@jKMhpZm zsh>LF?)TZzpl&1$`4|{u(Hgv^TW)pGDE1?*ieJrG(|`D8s{!*l>V@b8IXNN2JQHEI zW|3ad^}%9tW93xE#nGdXA3QaQbL7isx6{j%Yt6~Ltr3H|hPO`HIg;%gU%xJhXEx^f z6zejQr#=aJUqCOO9T@(4xa|v726$ZRUGpOq2|U8M$bn1uZh@hPUi|uGcu)5X()Xn0 zFTSinH3C=NeSdu~SvEowE^cv(^V-5d$4!k#8n7?}% z>rl36lqTwZ%FEt}OVI#+AGLYaCaURZq0r(s9a4u!E9=`?yggFmK#?R;)KHp-K6~}D z`~}oE1Ot}i>h!}vr5vrtF6`$0dlm`4TeulbKUgep@}Ez*oCH4QS^x1M|A;DZEnt2Z zWJON1c3d_KhUjc*JsOM(D+B|~%*I9uq@d%s_r^V4aYl{rpGil7*)YGwEWF-c`ql0^ z$!X}IyyA3l*8m;issSs(wMwHR{$2g&`!3Ud34OEkB1$y;x;-i)>uvAME;U- z@qM$d`c~}~{M~!4$s>=WCGd>CD%A%7pa0DI>yUW*Z7N!*x?&iO$DB6vRu-BxGf^{< zxHJ?WbyNt@o&F6imwKM?IK9sRR%NLA&QJC7;yAJa8);SP%K9dv_w$~}o-iEQ!6YmA z)nK2B3jpU2iwTzt9@Nb3D}0fokR)KFW4lrpmu2yOJok}d!N7!rA)&4Z*v7@l6KQ=b zZd<=&Y-71jbKTRH2^#5I<5?0>f?cav+%}g(Q^>sm07#pLuUk3Xw#y7i8i#}NNCS0M zoJNL^bP8%!REIpA6baglitL*2GBNm854?juFq#qg*-0z<^b+Fvso+`3c_Sa@1D!Yn?Bp$22 zN(Y z(K$`h^yc)+=UIvRSyLSr*Q7LU_E&G5FF}m*eYm2IG=SBzqFJV4;ieCE*H*@Ie&5hp zC623$c08d5YvWf@RUhCrad?&i^2IC(v%d<6aRI}fUh{*eG~lGfvl@rjRCDR$?W9~o z%PmfZPR22Asw)!Orf#F)t>Mg8mjSE>wIyoAAI(?pn;gc~(>HC60`Equ>;*=IAyC)V zEGMHDp;m@)Zq!5lc7Od8YxevqV*x>!@(b$85EX4>n48u2>P^HkryW;&OQ1dwQt(N7 z&0`OYrqk@YLuzuEM}GAN?qcYwZ?STg0yosG!D~p+Ncm^0umsCs>P%WvV>L?iZ6oomV^Y={TrI2gG zUFY_$q80?%2OB4LeQ8rSKs}7BEnrG2@@oASwlMo*V@S^3?-{XBQ z+!k|SJaN_}=q6a;MHRW5(u$X=Gr6x+F6V(0*_+j`qMXiPY6)XN0Gz*|3MkRvTmg4YO-{QcCd*K=n`!h{DivP7W6`Ss_MF!8~v z*TeNdT4Gx$J&yB|ucr zY+tYbPgas5H#}+=ZU99K-a^2Z=ibF}%XcM^IlYuGGY`bt7`uji&viAUs4sJV6gOSZF%TuJq)r~3d94Ttqv7;T4 zb7%euERm3 zF4Tr}TPAKoCb=J3lCMT z7?iJkS{KO@h_4k^oA{J?&o&|*@tFA$+@mW`f!1k_BNIt~J&ae{+*cm|o_gmr(oIXzyEnJ56r zBGt3s*RAW0u;G z%a9T~-4smv2~3T3dEM1653|Y=kjsh(vC9QG^i%g1nqlnChV!t=EvHgxN(1X~=?{`= z+j>Fo-LGOvIJ4RhPrDupcOP<9^>@u@mX{2D%h=ciow7Sb{WdPe(iZ)-l;<0LTG=MZ z1v^{Ru}P&aXQmAwT+=+&3Q^+q6a#mcnFv=*9>enOJbli?X5np*Yv-?)$yreZ#j@V2 z(au@OY?!v43}f{6_E6_0*9VP8b~^o*eSLj-_lbYSANFT*D;nGd6xQJ<^`f(@w z(=IXw)c>v{$qfwni8j`FQki}~of?>(Z!>IMzUOlAfS4*YZ9kjskU|qlyYsQAxZi2b z<^5LL?&P5Luyvib_2%Z+!!xTkjl744EmOAX255}Dakjz5DRU5GUzCsCAR>Nwjo5rc z{b=9C*ehVLj9lW+$;PXAHJ^uOhm5J_-Z*BefD1TtPR*-7g4N>s30lI3r3&7T?^7lF zF-!w&qGRS;t9{Q2;{~GYP=l8!ttM3h0}=TgRBS?Ii=IQhd>uYP>V*->(B&7(OyYNE zkO2vkB>}lB-}Q4R=f$A$NQC_3?N;dEr!!~26XUzZr}ooJ^;|Wo=nwNy{U4-8P1g&s zVy-_v2aba1UKIvey+>bK>=ko((zrNlk5lu(Pam8+Vh0HK@jRZ$pdbrtA`5hZ@}<>Inncq8zp5?}KA z8SiclH*SBrQF)=Yl2f?qH!{Dr6PQNJM#91D@Cd2<2LQic=}JU;`V<$K7Wa3Jl~%8o zP|(uyqm=a)!kYbq^v<=UBw^<@{8}{rDOi z?ULRc#edCY69O;@+WG~yG63Q@#$hj7Kir%%x;h%PykwGvwKYKq6+B(}0U~0glB#jN zn8}tRSCXsc6&9Gpe^9$jNntE6@P z?Bs_wU*vZ@ZM#o>(>hYA60I(^ADVHL2)GEeMcA8sTuYo@3Ft7}I9#N&8m1q+{;|n9 zh>0R;S#Nc>$!L%4C+rU|cQ~E=ACk^GDyr{m<3q_PHAqXB(p>`*B3;r*cXvw;Ak7HU z($dn>9TGzcNOyO4*L%Oemp@sv=B{<;o^#LM`*}W3n@ug3CsA#;0nbX%9~2=iO$|ej zYg+!=SlGR(frp2MvG!={VMv#>=*&=~&t04XDyV}oKcMGF-b51X8^`q1%ebL=i@$m) zOShfOFD@J=YZRxKP}ptKUcp~mo~_ujJ?~XE7i>uz{$s0}cs}&?Lv5>!kw83#}xg@4iuK3!KG0{eFQar&5*u&z-k@k1G_MNA)W`I2yEpP)r zDM?F%v=W=~WhI~Fn7dAUG67J5;6gwxZyWynQ2q!e+2YYF3>L&@hhtj@soX=>orYrP zEQr&P#b!R^A+6Vv0_9uOhj7kly?#c4CMmU#)S zQd*JKJgZcbf2y!tX+#6*Ib0?;pUbmQc`bdt3FnO85*2# zOZCn3J_L~y=VQLm^OwEKq4YP{C3o@KzHNV2r=HRCD4_}LA((E_pq21)%X1x!OCdcg zVR5Kmqybq5MC5(edxfugGnU3rn{+|P%vO@4sKXJW=zrAS&S2xhe&Jaq__o&wROj63% z>$0+y1Z{SoFZn+1=FpFeJU!L7ylQ8VeGOWN6tfM@Y5Cr7TvP76^}8R}Gr92!4k~u& zfpa3<27VB(0cqRzf;$9hg~Q86l{#cf=u&ioP~kZ?oi(*L@0!r)JEeRZ6KzcN5}J3> zVnm$o`+O+dnms2xv;0n`i|rqNe)$lu*2fsLlnb9NO9B@TebLp^IXXpqi5m^WFpjGF z1<$y6+7=z*!H-)#VFOD*z*6Cy2$C-FkU@>h%;N|dez_+Z)<(K1+&56!*cuJw1WN8A z-1JZ_rflKLflEpYknu$szvyFUdKt{4(C3`h^E<{x)_ny5JjA-qJpx}4#E2OyY!C+m z3)T%xolpPtAIoWy#vb-E$9^kBQvjx&RgpI9@c`yTBX$ougch*8&w3rw@x4dt9CD_q zo^ZcQO_2yxxZn#T*~F}{u87Xtx~^@s4+b7rb&nc|cj+kT8zl_Ox@)5!pUQ+h*mbJ? zv|=e~`xfe4Z4JB>KPoB=t3sSWV@1~DZU93~!pzRjZ5_^2_|dJIHitG{Q}#P5b*@)h zCga`su_B}LCKAzwb8>ms4Wjf)*e7$DM$S!e&P^sc{puot81xT?z%|KXh7z9?(NpkF z(m}7$!L;pogc7FzosxI2(_-FZb1!a)9tE^vXUK1>PXVIp$EMe2_ZOtC`&c+%(ON2R zwmT?l-@d*iPY+U~%hDFu2G=aKAP7?|X#>vP$WVRSTK6Zy`zP*C0ulU+-XF?vqAltfZM z4M}P_>${xhpuu5q;eKmX+k$`oIMAG%LeNUen=TK=9B`j@fbYdF_IE zU|UCaj$(M`!52S6=`d9M1fFu*GCoY^qP6p{EH*q;s9Mf{(0@HuwrnxMEi^8A1w&p< zSYp8ituN3-d6e|r%l7zopIOgcRiHgMej!f zK;5^KU=jfQFLEz{n?}%1QpEo<@^?A+M@<)mq>9@dYgnFz1StLMxJ3^!DZTi>K#9OM zv9Slup>g^=%Tyebp^7y<$O$`mQh&d5lg<8 zL=ni6-(J2vS*LrAsEq8Q(bNp1(MwurZ3K+x3qK1LT8euRinA)aSn(O(bvGiSoaKq_ z4FqjFg)n~Ekv^`FC-cWlL0?}+3P~-sRviEGOuLnaRjzdgE_%|27Kp8gPSga?>ifOoeNR{xsJa#AZbB zvdta&t{e&3dhmHaG>oE054G406T?;D{YjLDO}k$Yxh-HB0RmEmxlVs}16@17kr?k^ zX53jkKdp}a+-y?HnWEbaOQt+_GPri@(=ptGdzPnPk$#K()0pU=RX0A(lyPAAG^E}W zNFpunHoioDXf;>Uo?2^tf5{zFe>}@N*6!&U%Pgh+-rk~C5kG>tb*;W)nPGpT)_$$C zXMT+}QB={8d^eJ5axBM>)WDDbAFS`h&&y{~Q_y~nN7`QwZ^a9-cMV%FBf0b4 zZPlgX#_FF=&=l=FS?Bl<>-7Vi0((hb+0Pb7mAdR6%dZP|`%uEpHqYm-|LQ`gDezj? zuB{2YeVy)u8pSIYW89=&dK?Yk^QrBLTK#4se0bO|G$3>BI-yV>4|htBpLzQXUd8v( z16k_DNkmEVF_n1vA!&?D?k@|`Q`V3Gop3-@_IyPCtv=9bXQ|iV$^GsN(*9y7+zV^hC=OihZ7 z`(hB5glKa)!*FaljyO#5L0Z*^hGezeK;9CA*mfp2*A2HgI^NO62D$>nZ0k0$2B>Bf zO$73K;N4>_E+OkmS}T=M$=_zH`KP3$v3#M6&tzuEr3S6&v)!`&7zp2f?_J8@XF=U+0J&-5!>{7qx@tH$r z<*RhgQP)%1E5g?F`Y}#%V>S2I*4IWyRU!Ceu=nUaz{pBS(=V0i^au)l9YX5<6mhTC{D2Q!*r1+FayG!({2)!LmPD zT$ir?^$5>9V>cBXva=u!qkagFjO2<;%WNiIoIHwbw?Fu-5=YlPILNF#f0c|=ed8xW z6P~W7kM)9gXH0+0jg4v#qpGl3Z>Q`^IU4k(w|tTA%?av+2e}XyN&bHymP=RF$3kV? zos+*npYSI#`0&*~61BWULKQN}kS_xJz0U2ZE3r|;qLpp>iNwqA&#->e-iItXD5&Om zK|?%sx-iRgsbjC$rbycI%>@S0RV=3lBhIbwuaEC=Iitbjyeh9BMPP+W`W#qj8ss3) z-7z8j6T^x2Eciu$oFuZ~yKCmSHz%6+K^X@Alp!sXNCcp{nthHh2_eOS15E7iSeF}a zUgX^}GqsW#gOn*SeWdrC%;eZ<8=xgynL+sH8YJKO2B-Hxx7eK$e zGp=fLzYeA9@&3-u9s{HqWmm5=&@%aMoB{R82n-T%g8$Y~!LDz187?Cv zp?Yvy#R&!dix_YY4&ZdC*Cv2IurwI&4`<6JI;hIyV`q;X@hHmj4a>Z)~9>?Y>z{PHxMXh(@mx z4(NSRJmu}b3J&q6ay9So{0UUxV2HmH%?1iHWebUE^nN&%+rKLJj~0qbxV;MUBT%Zp z#Y=v-i#yRo8f7WEIs`unpsmC048$i|8XAfjf|qMi>;(z0#fRO5o^UlwOllFN75ca; zt3+(moSG5Q(Pj5_SKkIVMb2JHFY6pKIZNM7-Ec55ZDsLrtgSpw+A*)Kd~2e?Y4Mbj zptSueZM_lrwm}d5YBw4bKOP$Jk8$M3UlL0=07wX+kw*ri6hp&lgVi-kO0V7==>q!1 zjQRRh5l5_G<*+2IG(Lq*GDwgZ)yC`CQaQDk=D8H+|u-%?hOH?pI+k^F>NVT!aqEp=rdqX?tF2| zC2sQvx3*L2jmZ|>drad&*?oDThbAud#|zu5L6679m1#fH2_6=)rnb)$6B8$GOi&O2 zxD4K70v(rjR2`uT77I&wL4pRg-D1%hz1WMS&LFj4X!w91T&~}&sioD`zR9_@JQ`V@ zq{gm{Ujmb9NG|$WZxlk?} zm5ur=lKJA>tf%iHHhmp8JKzk}!0$aJeE5XPP#RMu8OjQBnSNB0d*BZFgW|Z8;!*_cDi?X;hPQzC?{EG}_2VJ7SK-N*)}#b@ z{gWntQs>IdzrJ59dy7j{`;ui*eXK-ldZ{cIIFHg8Dv(W-*khDzhe1i1$5NYsXbmN2 zUmG%z9_PkgT*t)weR{kXe9s5_?Wxx-JE`({XTq#LM025a5&p;3hJy>=GRd4J0d zah~Lww)WDR-;qSqKew;~F9I<3%4L{UUsQCPn54Oeon1Petos9vG6yjW6H{b(_^-RCt!pt0Bpv%!m= z#ekUzN~{Aqs6o#|me74zX@WWxg-G(Wc^5-k&-H^_uzVp8E92AcDeX5$lJ(GPeP4xy z`Ay7UO(wBQ3?*#adJvg}`Ik}#W*X-=534oiz+4S-^#uja+2u?qmQw^3_rg|0*Q4|@GdX702V;@+#|9ihnA*>LZOG0gC_S0 zR>UAKzdjNup|bAgTp2*4#ryfaVKcoKuebDcPuw|%zsD^U91z7hC=t$H9KVp}#k)|0@f`ivZ zR)OgOGIl^sq<-CFyV2-C%x6(#TnT1QtA*d36n&AzN^AzUdOT1q01u3eBv<707dIM= z3{>pOiqW^JRU3e0!jgy>lHSRskZu|z+$QF)LIQFMxcSl7-N2wftt4K~Ic(22&ktj1 z*?sEYuRlcYMiWOB=MWF+F-Hi8s(JvX>?{QeTeV;#4vA<_DT>{Mri{A08>jRSvfAce z`C(vm?EnFEr1dJfPu3y5H*~z5!`9V12^8Cp-;Bt>A@nYQ#Ea1!;SGErv1u+ey;5Vp z9=p+Xt->{FPT%3hP4IChcsHS-TUxp)Bh-(^6IRI%DZUN|C_3nfA4Upb1Tk)qY(s}I zg4h@^kD<~6s`{Bc!H|#lajD85gMSBbQmr$aFueRg1t2h?@5Dfu zgP6=@gJI7vVQA8af2A7b99*KEev0j!1}esI0(u?_TEnxV%LZ_XCyIx7xVO()-=q8 zdGoH_W!pMCEQFjyY$J0)zY<@ck^z)XP7Z_( zIkaJwFgn_2siS*i;wuEiz&Z4Ybwr;pj}#$&A^&2r1n->`8D4g|A=kFvc#RQ<)g677 zE(gHA7MwnBNCCzVH0gW22H1L#U;ySdQ1U*O4ISimJj3+1a}|I&$0=FLoXH2ZQ{UzEkP?LG@dahd&@l`w?!ld%y@GBOMbT-ukrGG=kr8;yRUG@1#^w#rR zCHoK?&_UcGgY$i+|Kc1MB8^w!aG~imOP)_Q&NohW$L5Us{0(kDu1r;Fk=23g zG0I8oM*zS4-=Z@6-=gxujN(G{QL5|mDjZGKF@lWXfJNGFc!8E#+9}5!lo=yF5%Z6I#izOE-hxbc*`>SWacyI#77)Z_|N3b2?7- zo?lB!e`Y83*0AZXD{N0)zG->V;?J&lu1V$8AGUfNDBF%QN-E`pHY*3Wr?gh~NND)H zZz}kZ(JP)jXkI@*a#5L<&V=o~^?dvX%8yL;yeOzT?fyCwiw_zG-J}3)d*U*+)BKjV zq5r$XsDXN3#xW%Fd``npl~zK^veBGuk#Vm$wiM5z$^O1GbFFdVO0Zit; z_wy-{J>EB_&Vb75y#K$OtTr8~M;mJ&5R8KM>-iL|M}P=z6~KOWfpm=VrKv*JS&~<~hu#o^h9*fq>5Wyk=B{PRsjtL zI{JR7I4bgR7U4WS<+uuxS>918D&eI&2UGi8!ed}REcQrA#WZCB zi&H^nsx3#hhSJW@&YpM)flX-A#(uWSJPey0uJd(4!OK6|bwGm)}g*&{;O! zK*opdbbGsK`1~-f@0G7vk~ld%83;l7PA7{(%)N^u#^KV3l>IQ8ckhsPlLY)a8(+^D z{wtJXVw`arf1!hnf_N35{f1S=P*-UO<$&6>+Hji%5CpRaFW`nD4+dUti~ijF*)$LMvMgn4@U^Lk#X{=3I|59_)pVy>nVHytfv z^kbDx)J}6v_54kEY?!XQHa%|#2~^CG<9H8KM;>(!j@ zx2C(G&1E1gR4fuRLRR(^ZIjafQr==)b2Cs`{MT89dHy51hb?WQ@ai|;-75?Zr%;7& zb}mQG5)nqxrO$E#;^2wH*?ih}3hC!tw4!Xs0>zHB2$FP}lrmSM+#5dAgWbZcOh6;X zfIraJ7yj*=2L9%9EZZAXJq?Y^E*#Mt-?ozSrad5ymA@17@8Io%q*$TIE|RI9%7(pm zBjDd?JsJ~9Rm!DZqieC4MrXI1hN=O={<%WV4w6vBWn*O6nbE8|&T2F$X>uP7Sdg zj^CzWDm$!z*hWf6LOb~7Btoxy=9 z=t^mPiujTo?B}k8zTR6_maFxi;!JO~K?+_A8uIu!*q&I8ZqD-wwDhVqL{qzFcaSZs0 zT7KvEzMvJjDO?JtooUQ^RK3h&FhR9h3<51QQeN4m zI)}-s3<3}&cFIMW)c&R+MhK@ll|AcrCyaZrV>$X-jLf+TcY=H3L52 zVYg^DQA^Z%GMdmA4jzC?{St&UjLH46ai7IsVm60qQ!x!#wk75 zgQ(_?$gexxX&*RaJ<81$_QJ>ri(JDf6g(POQA2U|-Fp(T>*bNZtQ7(5Oj^_+YZ-u= z3vFJ7)Bdezy*p|ya;S~FZe*AOTZxSKx<~2`LAMvyPxagch|X~#!BO6=-UA=rx;;})kT3uU{eJWQeWp| zQnr14Z4Lcrf^f{JDi);J-uKr}mZFcc0IBg0B{(TD3AYw$~lV7i!&eZ7PUNy94opfKUhb47nUJ zOy;w^ddVI(rYrAy8Wa!$_|EprR1EgL$v;lyMWtsgSEo1uk_z4NGEKhk!8r^xD^vw< zdzru>Tx~iqo@6(!lGk#1X=qeN|157d|Y>g+w(?D zruXAH2}aWLX$Tq+a0*#j($(;clO#IVezz>g6r8^^;I_#~ zU{V6A^!5>%bU1{J+V<@$$GW%sS-2>FphoJ|QeRTkrn&y}wA_WESkJUbN|mm+uh@P7 z;`Z2eYOGGzdK_CX2~8CsO44%y+}Ma8s&h5g33=C#H z01;feK%|+qiQRp-!KfO%fyS`obEMe-ud6r$W|KDSP8!S(Q@}M zyiSqZO%5#(KRHSCv^~ZxI)bjtnb;e;jg0$1{TRXDUV3!{*ZH?7ROjp5DWk7dRBnnI z{QXnm-^RW2chA?SBNCNSgg%cJH5^o^_bAyLH@`fy8n_1ze{5F%~u=N*3De~cH9x;liFJE$U zcW_I%$jUTPOj&$oU6hJcW{?Fe0pHGzNXE}O!Hs7RX0C|^M3(Pa|4Tfezg_;U-iZ#d zSr4+qD0EuBI6F9$$1blcP$u+8sEkA&&NyMmu@EF_iC&Do3pDCePFkGfhaDIBm?5Ek z-7EUd;0mGvV;AaHHj?A21lgGfxFHP4JkNPin$!j`VG$ARt?kCW6wTv9t6# zd=-{Zmftq1DZ#)D>on$r2(H!C(P}7G10dver1^C33nW;76a|UzAXXX~ML#=dIgw3Ae8{J>p z^+)F$ff(o@Qw8{1G8i|=SwNcL?S|vv-?Rzt=h!*BQ0m)?_NU_F;y0Wo!MI(X1vq;b z#yr6OSm|?pbli5&2KvEtn~su|xznmcysi|sUa?7<<-3lt&X=v`eS5p@cXH55m~!(K zNnELiK3JeL94wLG{vzQtxfiE>y(x;pG!*5u+3?}4hn-vhh#|D^lsFEDC(Jdh>-4A| z=FjV1CkD1m=M;IWqyDt)`H^a8+C4HN;5X>A#AmS|6BQDK;M3c$xNP&5@kb@B+MNP0 zr!yfyP3PJ~EAZWWdNa(3hr|Zn3_ni|q_ioCc?07{*p~iDpM>AmmQ3T$25`J}_nX9} zAvO($Z+6mG;L;#Wo}U5{8+wxGK2>LfNC72Ji;X>))NowB3odcu_2Rg=H6|=-H8G~4&0e3t?}h27p6bNNI3~u6f^sS$rRx+Zkk>#sMGDYc+?Qo zKSavrvcB7u^T$n3CJ16nJ*tiC*(gfCTfcr2=^Qu&N{zGh+e<0|(SFnaK(LP%NPKsk zJzwDmgei9b_;P&IASYq13n14yh*`J|zR}=lK*9gh(uX#O(Db2m-q81~%dJo-juw|g zWb%j*Obf>aF*7h>aCCq*l9Q6W-Gi}-p-1q2H zy;ZtIQ0lc|5xCa_*iPBcNCp!(whmY>UbLFaYuewrj)s=fu#@GpeU0c(3F3YM((v(Y z5jKaS|C6s;zB4us?5#GPKFZ&(ZVC8NVRE}ymgOgG-$UUjyR@{6!LJc~QF~q}e17PS zs0FTBF~Ed1qKx+FbG6B0n4Gdb${9LD%EvmZ831AG8`Q6-_1Ta1#mbFKKbRe?*H8&A zf?dv)i9TK2S1@0pfH2UwsxclCP&%qaVg3*MA;)c3!}6|Eu&deY5!l1MDZ76owa@mA ztYPbQKTeGQO)@s9AbY>2gM>RS^s(7d7x9b7ayWfpV8FO5l;n?$<=syueko$ZkxXG+ z@xf$veqWB^iw`O3pgfq4%}839X;<142Yq32F`caRc&U_v#{Y-@e3F@_35Foflgi{H zzgaC;ac-wOPtgfC8YWNadL9n`U1E=rpvr5bsRkq9=S&st=3NOmnT`9!7{lB(rBvU6 z{GTPRBWOFqtc3dj*Lkf<6%x))oLX(B2-rmcJw2l-=$Gw$LD`$a^4S*d_FsBQ^t7BC zqK+8iV&EzFy-Req_Z5poBQe&?Ie|bH8*%&NY)nk+S*(ex$*Agh`nsT~2<&7{B%`U$ zx^o8C!3+^w0 zihC%z0I+52`aVOcFt%vVtch?NoGm7Kn)+b0e1&zfH-<&u6xY6g9@2&uzch40T*^v2IqC7dSf`CMV* zHZ7P7YmrCGm4A*7eR9@wlkMhCXI$~bn~B(FTG|EMcC~OWd=Hc9i411CSRc^8`B{Rx za#Vz1Mt!~4%dmFKk<2ok+B^OtS@`MBXzqU}&!ffW=jjDj8_qYG@$uC*lg0m?1C}rD zGe7P$4MUUZc4wkO#Hj(>!V>C804oVFcmDu^5=x8SXT}y_nU?O?C|18{Z#$pq$}NA* zS$y^dX(ekWF_zOg;(IUUKX<{iy{GYI*ujH?y}KL~J@C6WhStLSt6ipco61HIZm`nW z*?_=j)}$Pl<8RmPzs)W!0wKfD{DUfg{pXvN{_Nxn@QaTkunqvuIL%uLAgV6Cm`R#RdI z8!kw%N>6{tm_-xv#6MhWT>Z*8=xzW!qvucQ{Lj5TLRXsvrmr71r=g^0uL>3KZKvWw zDtueN96vp<`pBQTU@!#*fLL&4DO>J0gcsNAj+spX2Q_BXDx$D_-#F2%UL#Ay{e$?u z5((QMHA3aq$=Ul7x)OrFDJFomSfZ$$HYnBvx90mWTBH2&)5owYhJ`8<^F){F$wzh@ zl6=+h$Zt+2?yxp~!J<`3a#f&G(kzJl8R8<}0um$Pv6|dXm1l=*RKqgsi{LbJwU20M zBX3~;sSzRcK-zdA9EARw>*4 zAMaXyuA|AIXYDLlSXi#No5>aW&A?!LGP(cn#zg?s$^V4|9H1!1b^qo8`j7^9D?)G} zYeaEcAA8=_H0<$ixO?#4W6Z5=Zr>Chn|iU{TWgI9BsFlNpWLB58U6BUE?92yeMbMZ z98XMIwA&;GroKrl;&vc=G|T@~Ex3UBs8(o<=y0ee(6|YU&Un~2jC%R!hmqp+c>H?1 zxAntzytJoX?CRyc-xCO(>fOIoof4FS1P!0Z^z%O`O`l-TmD0z=Ce;k7B6T2 z=r~ILKx%K0iI8>fO+?P;14d_D z*8D3r65k&3uT61P4~_et#{FxItYBw8&WE}G#rOEevEhArBsP3tX>m8p+PH9bE zX^x$}g}^K*g zjhx=>6&6M^>ts5XPpHB)NXo1sKCu_CczLsGCf@J z4q}{8br=U-g!l;dP-cVA4tK7j)ug~TP9+jNK>4bg<$akeZFnb!Vp7>G@cKkFrsQJ> zR3>icWw3u%E2_Z$Qg%KSxJe0DoRzc?i)1F(*v8i@-xB8B*h^#t$AiD5CeAhG0Y*Y{ zD1VeW@|q5&2Jbw)R|AdLr414xctvUhNT}jhL`e(6r}>_350h(7FKbhHlq6`ff_u?S z12|Jp_t|ZcV|Vj>!-#Z$F%9@S8t}fnEt-sN_rZy9Iviqy|K4?-IvSJ#_7&{SraaFa$(bgLp{3ZKwC8l7h#ZR($q1?+`yoQ#M5n-$`=V_hQH#mKa zp%2{&da_>!b~e1(pUxv5SSA^-$38Zn4XoptnxR_nGXBYV6qjob3)BDNKe!Qhwg=FE z`F<*{^Su;jl!$J<9kW79iyz=?~5C+2C(CHa8Vh zd3G_GuG8Sa*8{%mACnRf|pjydJr(ks)-Gt?3OOa z-Odaik9=+z*mAc7jh`Acg$ z#7(PUEwd?~6c#Ab&#c2nNm0P{$w-Pv#dHf?{lR9Q{ww{+^<5Pt- zy8>qqgrMKB>#560&Saj|V_#t*;#iTry-c>#@Qms1jbP5Erjc!CR#rthIWDH)$?2W8 zqY=@%hB@s0Si8@}PyT4bpw%kYlJ=QWQKv^Q(B<-oBLBuX<~Als>p=hhX}TJH`CK_( zrdwbejw=rIsIO1DaB#>4FAS9jW~@5LKZ#}}CSGnP8$My^sI$M@0E$=dyWPTM7HyN_ zjqy)Zke>;2hgYWTn)>>OP6F5({V@-`S_zxnzv2L$YsY#~o!ku&k0!P3qG+S~9(Xe7 ziAj8LP(L2ng^<<(IKuq${(QiW_%8 z0}VGS6=f?A4lpl2d++IHJ?rVMI!j78v1F?$ucKgAb6HL%CdyWpa{{?&mvi#^N!}L>oxG%SzP? zeESwuC`M130!IR1hx<*#v8y;QIv7n63%I7n(&)6FLI^}KODAt)62sS~)=Vw~wKjZC z1O$Pgm*e=*;f{b1pQ}hsNm2~c;tdzU!GFSCGq{2||MbapD1bR9&x*qKF<*XuUY?;Y zx#Vk2ld5gL*gC?ZfoHE8=Ei+PqJeiWM@04~ipF7l4#(eJ*G|8%HLL`Uh(5P? zoo{VHp+o64a)bgW+?2lqA?pjPPBy7`d)wm$Bf6Y6JM2uUUX_K{E&>D=NYsb zXX*O<@joIN?>849bO<8(;WZAEchNq+u>=PpT6Rm0%>W$j*cUKV9%^f*b&->FK|b_m zAg@WR27rDGaaB#=eL30u1O(Ns3iIPMtp!oAg^`0W)9UA~kEhDD>ph0x8tNKq?#0%E zoieY(=_1|pnEdIs`@FLrvcq1erq^9tV4`K_M_CE{0IA6UHa&;w6} zr(DSNrzAQ;myV3?_rJgZ<6vwn_F$W14&t=0m)0mRi9sj!pITvx+KKEE>uU#2Z)jwc z*h4-4crN=95fNF+nV|$j@+VfE=;-KJbZUNSS6f(smK%eVMdPcD%FK<2-6-b0Tm-hilCDWE$3s-$5hiyN+7xVqtgxaO!Uli5KlSGmj z(?tf+Mbu`Uzd?`FVYgGED!zKYIuhcDWP*Wiu3J-PGnagFLsOOWUyk7@t3#llKJ;{z z&j{~l6yB(P>Jh3m78()9g`md1mGtIM5ChYFN8as!+uVONeE;!dCzwzb4_nNY{2mR?F28AFO6YxtMP%V~DQ zHs7tkDMO2dW1p+0^rshw{&Co2r;nO(zELExlz%>sKNd}C=W3MiJV9!Gaj`c?&Bi3~ z&#;-e-ANHahX_Cc0pifizQ0R#{F}*TK6S@Jz6C!e3i&_#qBP`vLXgSfxCVq@ zb%bdtaLu)c`}_Nch9-C2@L^xxNYs30!CIOWzV4~50yTPrjs_B$GnBTwBk*u5C1WUV z$*s?cYE>uA&CQ3P9#*N}oWp z-05lKH|H$kMzhm1qzk5^(g**;=;LX-%WFQ#F!WyOklLsSFwRTx$@wW)8vI2oB&X9r z+oG(Gokb)g&GS9&es@uNDL2|?ot*3_iK0b2l_ToQ0IlisTp&Pg6W)mNZBv&)r22qLNK~E2N50+fUH7VQLKh9S$K^FHr6BT2;ek3qUjrIh3Z*ykYGyT z=Zx(NxUKzdn@|w@1A?M>ENy`UsUQN$Zh{#(-1jMu0nTQa+1_j_`;Qs)d5OQ65{g|$ zA(+W2Bcv(8#X(g>R8^Yf>a|=tFypjV?@^OAEKN~4aWqH0_!420N-IqqibSdA-uVK zmJA6~K+R1mW7x_#Je&dbr`W%<_edoMpG(lfK_JZRw~KjUcG%Q;)LMirquEQ5){Lv~ zHxDj^MwL{6S!o+Es>6DL;!bBc_Ddz#0QTr!X7JgyK7{A*xs;xsxMD*oZxYhF)99DI z^SVFd_XZ2JoHZ?7%6`8lYDgBJjcW<753p#0_5MPB?RDY%yx=N2{Tc^IZcS`RcFN$c zE$W)0Tk-UGC(OOeUx43*edx^PJw7dw?{kx~htXme$&;YCAqV z#QoD030vJy`(KkgIw>XW3rU2(Kh(yYV2s&MYw!jRz`pYZI)hHItqtca9nAZ2J!aSA zNYJ$sPtbf`PU}K!D6If$?%<})py!n^A&s|>&-8L&@nq@HpkV(a4a$(*{>>{~m3h)E zzpGhbH{W#=+>>b|-qzEY{Qdj)%F4=68vmyZ!NkzFJ|dsUlNEG=&iBTx9v>&2tFMBS zcv1p=7T`W-bWPGp$~6i){E|T(Kg{5=4s&}VAhgEDM$6$Tk$;fU-rnAkkr?mn_lmjR zu_2&gSDZ(e=SNucQSB`b7F-jpF353o(}gke>~6ne|MIT+s3|I_y~%3&_2b>;c+SR_ z1Ge>#g;&v^#uR=p*zoHpyhf3zE$v*j=d^kEvM_gmkuLYc)Dt7Bi#;fFP(}F&^Mbe8 zbcb-%Sg9{j%sIuBbvTv;2Ma?@qxR}6Zx;!p#1+rCTPfmohKYb15jBT58VA2W3_fE? zNU%y6RGRdpLtQ^7c#=y`9wk+AW- zbzifbEyDY1tGfozE7m!-(8K<-3gmtU>yV4<{IN^C#l3Vu$9rlx*KeXr+SOe-ZvPeK zq_EOpEU3-ir(ponqW*F6K3!$!Q7tdUgd%vwlAt08inIU#l?{1 zWc*DV$6$}H@0?|Oi8%~FXSn_Ts2Mo3z9t}$?77;@_H$co_CyazNJwy4Y#Qy|Ts3Rj zp;hcaLc00g#(DhUeKKY6f%IxqU&yPY>R8K6(`oZxO8HV1u03;d=}e;Ox_5j3SD`W> z{q07D>$m5x9jvPK}KFL@Bipd`S> ztppn0faO6o;b8R_dkPQQx*jOl{g9%?`m(N-QG>d2@iPCqOjzWp07=N>fcpaOil07r zkYFk5w4ZwX%rkt9 zFysvVHF9Hj%;C}x^be|cR|yAsfiItw2#`9=xcqKb!_xR20qtWK43j_-R~#rK%`N`> z!+yhKHJHS@y1I%_!ykIJiA^cud%iV7$57(8m|N4qvcTAnGzb_JfVYfBMYQ zBl2Wm!Cq0B`(nQ|MOTHhgrL_2Ly4gJ$M25L(t{eezk-SEki$*MuxdNC`*#nQS@ONZ zHzhHHN%}jH;M2A;PD6`LgktwDz0u_Nfb?np&?9$LhTB;Ohj!QEYhLxKb+ zxVw9BcXyY;EjYw*cbDKWxDC#m@4jF6$E}*GneLj?-PNc2oPE|>d+mDs+IZ!Ymy50Y zw9)jy2iJcXiynt%5&Y*rX`g0#!tYQPk2*b2UDHd?MfW3-FUzqBLK7FhbI@tvwYv@f zrj)FdqyU_b)?l@&Z^!vINkn|yT-#onsz4(G6<8ffEhO?}Yi5y=043~ z+}pw2X?Htk#4k5_(*QEX?csX8oFgQq5dglixj7&F?EE&P%r~cddsNr%Gdz=6RO0(J z$d`7Fy?p`gz2qmw{TfCl=7S;_eBfZ%l%7h^Z7#21I>Pm6d-WvuIye~C{w_aaP>F}M zVC6*QonvjqbU58;(^`k?0Tg^nAQQ=M3ijfRP99E^&_HmB;;KEv4bu9gCq$1djTp-j zei)$O3#%#T72(jc(wdT~<};E5aQ3wsRK}k+=NgCf2h6Nytt5do15G z4!wMGF~c0&>an$Hl4JY7@C>5>BET$*iepk{6QhGOR(_@<009t}ro@8bUktXiuR6}h zIfc>LY*p+!u3!+StHm|BZJBdL@Hp1LNLHmrg&!b-!-8GcE+k;7inC>AVp3FA=J^m8 zXGdyU0|Jd~Zi=z8svyJsY=LQ7A)cTAdfF2m6EizAqeSjMmbBzY0^E&R}@nWI7r}SgXOHtt4D>Q0?K04s3BB^Ro23_9hWck?+ z+hi)vQ*KNKEU()34zk;VC=_dqiFIuONA1OUVtX%>@xY?TpzT&N7>_!%j{>gyO0I#lf&7T=j!*TpYhJ56ld0+2WXj6m55%ws zMv4@jj@`~x*dk-4^WS2tKsJqEJKc_&?3SD8^SvZBHILQrlyW&hxJubj+l2L~z4doa z1JSCa0asyd7GtkxpNen*X;Km8+%J(zx*bQ@7%Y;s?amH}d+?F`q z0O7%VKqEDsWPHq%iale;Ox7c593}QLTZ=RNOsi`%*p-zd9EhgkBRrb#R?;K<6r|s~ z^BU3RqfIJ5$;do3%EmCuYCG{J-cDoixB@G$$LVu(7)Q(p3mkNJtj^eFKPB1&w8zxS zMaokfZMTc|^op2gYrPz`$Ut5h5*zR$;ncmFJO2Vo$X0PjxI^O(QWewaYpkSqONszm}o#GAa^45sW2? zCn;lWGko&)bnyg7tLERbFs-7Y2?HQ4)Sqx~M;W2b&$JkIVffxZh4j}&&-5UvYEWq4 z;_Ykm6A3m=;HRbPs1~%^5FbiTi2I+ftM)$M(pd2&e|Y^W{1WR`hD8LYw~^$Z^*EUC zy>uW359)8?^F!XGhbpr-{bQN^;tW%u=}5l(IlW}^(# zLE@lFx%wR`^XU`^yg-}z-d`G8otv%QM`W?fn7PCfrL^p552zejLFsUZ)z>Fb>(W7QLY zRAZ2y5l!n9;)t8XcIdMLYMQMbd?ET6lF%hXP-$tYW8aI%LX8eIsdZRV`xIv(DxbOPF7nNL1?68MS6`EkiQdui1IUFqY`<8 zxzw=3RSDa-{t4{ld;Q803VinP)-ryYM)`Isxg3vk)bV+$1ttuR?BS?lFVN^^57rdI zN{Tv5672hM53wOYWB>}A6lfsFlqwF7p5c(h-l#Ekojtb>HRR!&pMN}Sp9dAiD)b8c zE-6n*<78jXj22k5seHme3B`2h=ZlWb9p;4bBB38Iiuj&KQ?EIGbqTH=+dn1FBs|ye z_HaC?$R~ce9_b3?&8RsABd~k%13?pZtO~1ryNNpwM1hR+-+7<2+kFvm-=f-7Mck;! zLq*s`MmcKg4M!0Ze)0#2)c^fA-=*m1?K2jrnu~Z?$@G_r*j>CN#yeV<&l_%@~0RE8fCR;q609r27dZp?eFBaM3C+j zIf?NDAM%P;DIDc@ElS^F!=xSuYd2lm=V){B5|?^Lf7KF0$$a6R&aWv61qE5Fii%#w z`t7c(D>Fe^9N}Ctyj@URewXxB{rAz(3PLf}dfN6H?|pBg?hp|1%6>Gf-OSg^U3FwI z@Mjkgcx)arun`@1X~+P8t$L%X620lf)k{DlpR5*%h@aPHxrj&|n2rPw{NsE>eV0dY z;P#=jOgpVe7^+BMGW>VU{!|+8}O4X zLA?JKr2SM117|;mwQU;eigS%(ZA)nSQ+%=B@pEK8hjG$0Ho)#M_miheMkE4rbW#8u zEAO{+v^C#Xe(!mX{k~MJ0o)+cu#+bxWI-lCG|M&hj-p9wP@c}epdk`o&Z+CF`*X9Z zckVACMrNC(gjt5ZmM#Jn@bJ~_a}LZVB++pC;W?01JlQw)LmEDZMm*Ff zUXmqBwjzJsE$urBUA-;FrNlD5{=X#ulJ0Bw*GUmV_g(RY%+>OD7%T;Edf&cle*7p0 zR5G*~aRs=D#cU>!Tc$;XK7K@3o1$$@zo_Wmx=-?ZIRwj&_zdd~Fapdqg7YY-iN6O7 zR*%*#3nUz}@6-syJsHg-{&3hWH8}4K@IZJItL>p6mVki3qzFVGIt&nXKkVl~#r7R~ z>g30Ybjp^zSpatCwmCeI==KPZQWR&@7ihabR_r@aQ;vtj0f!NoM+dKbRGj#mtp{Uu z2Q0ikR)MDptc{l|5b77REVS~)@RPcvl{Vpp2Oh*Az0=NJL$73+<+Xn<-stua&3X3Q$ z9U2zy5qP?+Aa9unG}PXFpO0{cXGiip%=2Pq7B#soeydXdbIapDJWm8cRLLegU!4DR??(R*lvqM=u9B+Ngit#FZkx zoBj|CGGTrZ5fM5%S>lSA$XLbP4*Esj065z|G$6%{RX@(ALOj)6r(OT7<|OXL4D0)7 zZifaQKzNY*eI=3<4;vv^WuH$am#|<86QG%}!Nf_B+<`{H0)Z6+$9kWf9>m5&TNEUb zJv%T@Z>U4XJs-b8wP6$>)t|ZoWRT_Hu1QVU?_E#U*g=#Ors&Yfxda4zK!HUxyRe;1 zqnL~p%s~gfT{-s^8T>Xb0Rl0ypE;!7$sWchP32uT6 z`gARzW4F^b8f-zp3wSX>mn9KQ0D&|HEM>WrC4d##+I%~&vEFsK&}>r=Tk`5Mxu^_H zc5cvi3eo9(ZngiRkTUGFT#&V(Hvi8|aPO+*y=9pJCn0oo(-9ny8;#nvytZ^D!b2Q6 zp@77vf58LQD3XzhTF;b1M_QlhVi}c+lrAPrex|%+i6oexI+|677;)X`c<~CFmWcv@ zcv;VkvEAGvC5*=MsZR;EjlmpG^17ip_i-!ahd_H(qY$Wi2IZaT4HlrWY%f?c%oRw= zpg`A0@3|cE!-QF^Z-}n3RPFXpL>Nw0_!W2S)9i?#p0v2!*W3&z|>FR#h zsn1FodZ$`cW>VK?uRB?`@Toj5R|FzU!2QJ*rQw)BTN4jkQ?qtraV;ntVl&>NNN#zj zZB$Px_~Nm-U9uVYqI?wtA)b6E%nxcR#Cre&8BvNGNdj>qB}MD(PVh7ZSk*!1H)pUS!# z`dj3=$@}@;w*K(Epq7bR>+9^>(>+BFtN7Mbwzz$3C2;Ya{1rlPcnJ zAIVaN;N%&?*LUCV5qR;dD>$~MPWNCXKB;McRWUR9W`6qPxv9)l zdB|<@I0y6Z?P+(1OLN~ju)|jTsW2O(`|uj~r}wW*QrG#*zNJgI%j<0UWGH_4>lH-Q%A=O z_Ou-@xmZAVO-)VGc|T!wO$|B*hCQ}Bd>wqJeiyHUfF9HmWwfYNIt{()3IAsp`6pAu zIG80S5>v8!%VPI_IHQ^#^G`?%m8$QsiR7Ms*Atj)%iE;k#41n=Lh&3p?crdA(U+9h zIacANnvBBlFhV?z1B}fO$4TDa+wIdy;Y){qyGhuOh}$j$nd10_v%fA@DKQ(iyBDzuWMi=XNfulq%KamPQB*Y2*gmgiM-YgBn@_At6sqo>SeR*@U$926lTUr!T;L~+k8r-5+>l>e zPv>4&_o?769W@F=P8%8H!zSVq!~i$d&5HBvfEqvDt@yC6cY6ugX&_MNUzw+~j@!(V zVrJ(#BXR}iz>Bg6G5m-F%||-O8Sb{N2K1$7?Wm@rl45QXq!+tO_k3(4e{P?vAMpXF zu$?|^b;J##If6+IH~E%G{sYJiZc&;nB9}TEO?WOFE#tYVb{X4845&6XHvAuNIs}z( zudlmo&gYxhbtcA|253T0H@laun>~(26e>hELNiQAu%!fVF{+0A_CgH4yk12LQP^9_ z)DoXBA{a?-->=3+oTf1b&1537BW^J(2x)SfQJg({M`@c4N{~LcOw9Q#nn)H>Hu(m3 z-!#%2UZ|3s*Sj7_fCya5&qd9|r^tVg0Hl`l<@;YgA2+$6MmW7H=tR zDoi4wtDzOPcw%4CSuXU(iFl8J%;WbPzZyll`p@8qPQBj@I-eGv$d_`!L5RiPSiy2` zXE|6MK}8HBqM4JoR-=ZGQr|M@&$)}m>E`j$Y>5fG|3%_)cn=k7i+XwIndLuDNdqh& z3yJ?jt|dYcdtUBV`8K?EV%U1wUH5yogkS0(XgyWC9tO`B28r-uV+8i#?w@gH z6NqnayYmJ}HoU#~1D*;N={CKMhU?$xC1pQ#^wqACJ}fq_gWt|}k`X25tJ-?UvOG4? z%)uM}J4f_4>06fD&j5mDKF^;bl%05F=UJ*9T}u%NGXj8EY;*ov!b~CfaiFauM}BC& zeEmhg)6H65K5E(uSL1t=z4+hg=x8Fyn(M!)+u$h-bv(u$j5I7c_@I&Brsuu4It5~4 z0_B#-3(f>jzvl^&8qU_<^y+e39mlhq+JA`*(8HlxF}#Yy(`AMHksMeTb{>u5iQqy* zbiWx4x45K4ohUm=#fXqj@FrLCy~;<5$5TGRrr-g^{N1apaUmo`V;6G0idM|gl3xcpoW zDk1;^k?0Th`2R5x3RTWsfgJc+WKd>$NoD;u!0f_-C44$>!lNdCF>b%@ItbL~D<9+z zw>kZ(nM?zP!j-b#6A(ZSOA-R0+Oj?GWzlt6Fo)-O=lVeA&oQ2A6(n4}Xpa@ry3T=O zb{)q_MS}*noz^cF&(Gr-NW848ZX@ibx_>JQp0y_Z1f`2+iB(>HIP^~x`&x#HxKB2t zy<3LWe=vXbk3Q?&_?hSKj|V$l`SVT_EdfMI7PWTy2lO)Vy~lngi*3J~?jR0F^G>iX z1xq5`KxP!5x#cE1x#g^fwmQE1^->OLBdgU+?-6IG>ob%w;E@h6tny4O*lyUSVW9!?iqH53VkaK7b8`4YaM5= zmTXSLWl;scT5gE2PHhGT#?6@I&) zfb@R#Zc_8>5`4UQjO!=lJ4n-(-4L)9kKGGKNoo~U+I_#-=Ppr=e)kCk z-8)_Mz6Y;O93^#3`0(W^f2UJPEfto7-@1Q%q^zR>m!hR=zvd^;Rn!+y>AOpJ4bkYZ zthU;=!J*d+-M@C* z=RiD7DuKg#J6hHAcD#%3iB?@ZRcpayIOLZt7}RkUL!S);E`8Z1{0@IOvt}@k9;};4 zNZX65d3!^X3s+b5ay;3bFZsY_qP~T4NFQe*lcB{H#N1GZ?_e6aVyIki;KF+ z@;;a~AP;!B44}lNO~IE~oo8ZXL`6lVqM|a>anQZhV3E!g3w%}PTQ6l$aCOA*_|U@O z{cyDhRsLe4p>>&MMoLobr1fW!_d=j}mTKJTAsd!DvV5}7-O0lk*W{WHxHf}9GQ18| zFRkYAwsZ7wsWX`b6EsWtQMseDd6g+HP7ze-Pm-po5+b3kv&Vht9>kh99QTp=J7}~h z*w6w~^ANXR$J!OSoR4rfe1a3&vYiU0V#NHxWkNn4q@ZJ|Mw+JYm2PmL)vwfWjfUm4{VW=2~p}3=Q6h?Kmu>e+FoQ;0=tbO#Zi;w^)x1xc#1%}ozjNd z1o%|Esc_%DQnQt)Z<$M!7a7>bCiy*-Mp!;WiA&YY?lGo3AAGRELRhn9jh!KGjdfp0BH8TKJPrA_v$^)vdMVB{A{O@ z&xHd#P0e+z`$$J^LLi2E`0~lPGU~WtJlyZz!TeP3{dUR6=?1 zWjAtkFI&*v#?HmgI-1<{o~(z5G*klVFs4V?Q|sC z3{5OY(8bch1bX#XO^t<3})h zKRv_w;Y2Mu*N+pW4`Ta66ZUmOPI?Qkt>%<3i2YXDMdRyEE@ZWyOBT%{FE_I=Ffh>Q zL6y4BOwAo-z*}Q5e{w8;)IihlyTt@y84Ar`)8W_vzu~=Ej}PQ;K#(p%`clV7Vhmbp z`qDTPAP8i4b(WcHhph4AZ2f$Fg65}nn-;$TG-45LG<^!5gFAF9KizmQ;A5emh@!40 z*HrN@mwG$(;}@tz>H0wIO@M)6=${jJ>TQC26Fd-5q#n>pUdEPzrAqrHQ7QY(giKkAw711K$1eI!)Emf>3k*pA)}6t9FO~MQYy%w1n4oXkoZb z_~}ZQ_q)f_bk}e{q542cNlC26U){fXCiZ?67N|-J6UVhvXczXni0YcC$^KzMt_tG- z65$;31Rw0ap_~g^Sygy-G=ZmMh2M7d^f4=n+cI&@ry@Df36GTw6*9Q`F)Miv^1Lul zA#BjJ#yc_MJ}Sz;*TeUNmc^8{_*9+EVpqo}(PubNaZd7~lK2qqWn$%0BEzX8e2C+q zN^fhy-Br~?#rqFtHfIaTk1gYzSfMT0a}pAD0Mu1kclJ6{sEl8H<7m#;Vm#oWLJ3eq zFo?p2_E~8eR%IFjKCG>{yUAO&SWZ`Csi-n&B2qH4I*~aG%O%W8A1X+&=Y?FR8jO0F z~oG!c&VpFoW(t<1zmwpuW5lFV|?LaN+7q z?4z0kwvEvNcSC6xVnKx#G1QVI(Av>A^y1t~s znUK}-)*OaMY3N$%cruNA{UVr)ayYitnp`o;thKDB&c8^!G znkyMuogs9IDfsK zRb6$#-SMn`#5mfdA8Dgu^4HAvpJ}LT3MJNJGirjkeKfir|8XH^gj0l?YK1Or&DFAc z2o;(^O)R2|rxK%n1aZ)XMn*-UpreN>(l;3k=0WQj{3(x(OL*K)LsBJJ0SMQfssEa) z)A7&X>JAA#rdx-crtwBx++D%~=Tn)N-z5=&Eq|mqeNHEIOGZwE@hfOo>xRx%Yu6k0 z`0#k@MIwpA4-|s#!EfD08`isH&Mymoua8-g9IEKCcnlv3tf2jxHjF$sDv|wZ`pC~s zu;4h*Mdycxkw=zNYHxIlyCm|lj6(>kx|ar6JAM2`E-oT*36H$zUP^ZBI^m{ml@z}O zQ{4WH4o8wT?lE~7Z(0)Y$Wq0g!B-=v6i6slJY2v5Afw?{MuXbdq8~VKUw@$p;v#di zW?>~rH$#T-zA5`eV@a-1u(0fpd%o4)g=lX?0G@&}T}1Q}Nq~VcJ40 zw6`o{X#%BYiDa#Tm_Uq(K1NEXp%Fp_F2bi;~@bApb`Jx2G#I zrF-%bGOcoWBnS(gkliC-9ZT9wX|#0nCuTTEd_n*YOH!ji2mnH%z7>FAOk%nmo@9C{ z{l>H3bW|?fY%cfm{{s!~)3WJb5;{PxK#QbXayeyC;vc*)Y%J_oRS^R|3{M zx>;<6>{t%E#gT#p$;!xFS7`P6pr3>QmCe8UzY?12ddk~MXu&$Q7rMl7ENgb|eMokAc=%T~}x{tMFf9Q<2%)!o0^^vcb-jNafoijTkE?3qdg0E~-{ z3P;In2GFXCkKXe&$gzvLDumTpdD402e{oRYaV6X9uj<|-2EkVC7s#3X_ppl$u5m1# z)h%OIm6e(XlbanFu{w>Fz>a#qj@gI2PBur`H zS$I~x%nYH4h|bYT@;FwFmBVKIt~YHRo3$?Y(r%Z7T(lE^`OnQq+tOWKD<>lZr%e z{4xR|reT3!&w6W(YS)?^9DP2!tleR(a$QfT&MuCBav8h9R8eH-lHt#Nadjy19U0Xb-#Y&9i8Be?9ZI;fKkY z?;k#mWT{ivp>dNnE|Z*gx-}FitU7BEEz{#8aCV+i=O=Kub(n1y9`Vs391>>i#!B_o zF8L~`dwo+U;#^)_-ECL}aaawWS28v^U^jTO&Tk~%y@w;JnW zheMJX$3)A|`tK?ugYH{y6hZWs`K}Qj_FviFH*msZS$e_89@d8u)wL%k43U;NNZ5fZp65C30-_6 zdu5hw1>c8TSpbkmj)}*F6PG3@X9FT5kr9AC4~`Wk+!0OiT{(ig${G1b@LrIu4*?@vT&dNCQDv@E*Tdem#iL_#4inXbG*<&1!)%$< z#W=0y33o6fxXPs0t0;BOVE4@7>UnZ8giSg1vWv zl<@2xhNo+~wuTKC2=!6ARyDPO4%uR1L#1I7lx~PpIvc|WmVv@%k7L6UozbXzVXc0v zj~IGPaQ-q6ORLbAALWMW?vkq=6Rm%j83b!kagT+KS1Wi@2*Jc`m>S2CM1GKRMr9k) zEXO;rUFnRqHh-{cqh%q2-B~klCQ})OVcidGWmsQ(9k_coDsag5I7U`9rHGyUAm}&=8c6USr_PPET3oxhUSVPJ3u$qbg~^mDC_)o0e)2DZ zamA$*$7Dq)KExpsg^rl98LflJ1D3p+mdvJzZkm`!Q4f523}IoCP3DH7f>;s;B>k8W zXp{i!YH|KJs7IbgK>@<7m_2fvIYE^a#;PEZ48@vZ2GLg(YxyhZpv53Zqa#7ih1`Bf z);npoBkkByU$urMz1M3|inXRSvD=);>oR#!sYWA8iA4-4W{@pu?9h`#?nqQZ8J7=X z9pRCHN{T6ir_Eq-=k(S<$OlI_^go3vFD@($66Cq4Rhdwk_)~6AV&0qtNucstC(AG8 zmog~mvz7kX9`LgJ$V3DuW&CEer(|-KjGSl0g!{yVcgHzBZiqcU`m85Mnv^yd z)3Bh!8<7-L;q9#)@Ur6lGRfk7S#ltS3p!?{iI4l5-=dI;63<;or#1z?h3cH368R22 z=^=91^)H9;R3Fe0S@<1v=Zf8tHoSK(gd9mW)^cQokuzwZzQ$EthcM8B%20@{tvapp zEZp+F=O(60L0_miAe~4PFNtinl1M|TAw3`<1z=KO2^>fwpSlz7G@YC+TISj=@&i9R zN?%miN7gqHhm=X!hfyY?_zry0uj`!^F*;G#!^3k2&x; z_jYbIlzZhQj)Re7qe?#d`fn#o#nB2uEN)IxcA19+vvrK`(9Q_S|GgHfvro_l?I3-D zUGco0?MlEt)nVD)%e7^*99K5DyY~2p$NQ=(6~j3bB1G?#Csf)3CjBru_xK-Z(Xb-6 zmrSD$6;m=v&(*;dX~}7%$iJ@;Pn!#q+}%u43!`baR}^IFry4Iv%MNatX+7 z;}o(vX&^(?%F1ysR=OqUXjxn?5%MU@H*9{+K-%yXvjnR~#Pozi&cE8=V8e8#w)`fG zQm5xs8T?^eQO*CbhF1Ts<3M6>Xn~wBvv_aBq(X#VBt?F}0ZvYKYnT>{=|;|3{v|W4 z&O?_kt5gj8@{^y}Ng>gdg@JkH|^nfKn|;M<4W z+jsPDuYN*PzA}i}n5TkH2KC^&KDx8<1H;pR(Nlb_`{P`^Ntpq*$JdlXR{86V=Y#b? z-?A@3v7ZFo^;lFkS*%O5+l%)5LR;tv&W}SA@xMEx0Ka{2Oo?*vPnohsU&>#Y-h4lY z-rAg7R%`Tx{0Uzdeh9Y}Bw21$k3aJS&j~#ZW_p}0Z5#|dRgC9uF?^xAp#^*HseZtL zW;K+bEgI6pwf{V?(%#IT6AE}+VKedp+h%OcbjVpcR_y%q6zi!o=)W>b5Xi&SV1oMi znZ}+Cx0z`8Cg_vN=8cr5b@J=eg|=Xg(I)z~wP}>s>KbvI-EXD#i=`s{jmRl%ulcQI zXlPN(pW{0~Un8}5w62)p*ZMlO%)0J-s`Ic{tV-bHNj@V~egU4xyk6n*tMahH4};M?8rko2pYS<7!+plkLUKNw~y0PUmE7FZO1?qUM@A zmMM!6D&k4dh<#snn#M`;h3gREXo zJi0(2{Ft)WeyA5vcXzi9QVVBAUI>;XG9?Q+DrJy-E{Y}sbfH^Y{%(gPRD1x+t^zx; zuJIs7EE=5|vQ(OK&;h8c1Pg@qGxIO4G)$yq&N`Dkx|$}!PO@~GtgcX2uo?7Np)Ihw zf@YQSR{93W*K0;fAXYrs8agVAvwqsB`GAidj}GrmNdTL5T@xMzxldqOBQ8qltwyFK zC?0= z^twK^W=q)d{7KE}l7U`s-KX);lu?i_@% diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/images/drone-icon.png b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/images/drone-icon.png deleted file mode 100644 index 0c7744ff42d16a9761778c98749aa50ea93e5cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46940 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

J&TxbYUA`g6Fvzap%(O*Fj*K~ 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 diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/js/download.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/js/download.js deleted file mode 100644 index 0c22e509..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/js/download.js +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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 modalPopup = ".wr-modalpopup"; -var modalPopupContainer = modalPopup + " .modalpopup-container"; -var modalPopupContent = modalPopup + " .modalpopup-content"; -var body = "body"; - -/* - * set popup maximum height function. - */ -function setPopupMaxHeight() { - $(modalPopupContent).css('max-height', ($(body).height() - ($(body).height() / 100 * 30))); - $(modalPopupContainer).css('margin-top', (-($(modalPopupContainer).height() / 2))); -} - -/* - * show popup function. - */ -function showPopup() { - $(modalPopup).show(); - setPopupMaxHeight(); - $('#downloadForm').validate({ - rules: { - deviceName: { - minlength: 4, - required: true - } - }, - highlight: function (element) { - $(element).closest('.control-group').removeClass('success').addClass('error'); - }, - success: function (element) { - $(element).closest('.control-group').removeClass('error').addClass('success'); - $('label[for=deviceName]').remove(); - } - }); - var deviceType = ""; - $('.deviceType').each(function () { - if (this.value != "") { - deviceType = this.value; - } - }); -} - -/* - * hide popup function. - */ -function hidePopup() { - $('label[for=deviceName]').remove(); - $('.control-group').removeClass('success').removeClass('error'); - $(modalPopupContent).html(''); - $(modalPopup).hide(); -} - -/* - * DOM ready functions. - */ -$(document).ready(function () { - attachEvents(); -}); - -function attachEvents() { - /** - * Following click function would execute - * when a user clicks on "Download" link - * on Device Management page in WSO2 DC Console. - */ - $("a.download-link").click(function () { - var sketchType = $(this).data("sketchtype"); - var deviceType = $(this).data("devicetype"); - var downloadDeviceAPI = "/devicemgt/api/devices/sketch/generate_link"; - var payload = {"sketchType": sketchType, "deviceType": deviceType}; - $(modalPopupContent).html($('#download-device-modal-content').html()); - showPopup(); - var deviceName; - $("a#download-device-download-link").click(function () { - $('.new-device-name').each(function () { - if (this.value != "") { - deviceName = this.value; - } - }); - $('label[for=deviceName]').remove(); - if (deviceName && deviceName.length >= 4) { - payload.deviceName = deviceName; - invokerUtil.post( - downloadDeviceAPI, - payload, - function (data, textStatus, jqxhr) { - doAction(data); - }, - function (data) { - doAction(data); - } - ); - }else if(deviceName){ - $('.controls').append(''); - $('.control-group').removeClass('success').addClass('error'); - } else { - $('.controls').append(''); - $('.control-group').removeClass('success').addClass('error'); - } - }); - - $("a#download-device-cancel-link").click(function () { - hidePopup(); - }); - - }); -} - -function downloadAgent() { - var deviceName; - $('.new-device-name').each(function () { - if (this.value != "") { - deviceName = this.value; - } - }); - var deviceNameFormat = /^[^~?!#$:;%^*`+={}\[\]\\()|<>,'"]{1,30}$/; - if (deviceName && deviceNameFormat.test(deviceName)) { - $('#downloadForm').submit(); - hidePopup(); - $(modalPopupContent).html($('#device-agent-downloading-content').html()); - showPopup(); - setTimeout(function () { - hidePopup(); - }, 1000); - }else { - $("#invalid-username-error-msg span").text("Invalid device name"); - $("#invalid-username-error-msg").removeClass("hidden"); - } -} - -function doAction(data) { - //if it is saml redirection response - if (data.status == null) { - document.write(data); - } - - if (data.status == "200") { - $(modalPopupContent).html($('#download-device-modal-content-links').html()); - $("input#download-device-url").val(data.responseText); - $("input#download-device-url").focus(function () { - $(this).select(); - }); - showPopup(); - } else if (data.status == "401") { - $(modalPopupContent).html($('#device-401-content').html()); - $("#device-401-link").click(function () { - window.location = "/devicemgt/login"; - }); - showPopup(); - } else if (data == "403") { - $(modalPopupContent).html($('#device-403-content').html()); - $("#device-403-link").click(function () { - window.location = "/devicemgt/login"; - }); - showPopup(); - } else { - $(modalPopupContent).html($('#device-unexpected-error-content').html()); - $("a#device-unexpected-error-link").click(function () { - hidePopup(); - }); - } -} \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/js/jquery.validate.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/js/jquery.validate.js deleted file mode 100644 index fe7ecf07..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/public/js/jquery.validate.js +++ /dev/null @@ -1,1227 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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. - */ - -(function($) { - -$.extend($.fn, { - // http://docs.jquery.com/Plugins/Validation/validate - validate: function( options ) { - - // if nothing is selected, return nothing; can't chain anyway - if ( !this.length ) { - if ( options && options.debug && window.console ) { - console.warn( "Nothing selected, can't validate, returning nothing." ); - } - return; - } - - // check if a validator for this form was already created - var validator = $.data( this[0], "validator" ); - if ( validator ) { - return validator; - } - - // Add novalidate tag if HTML5. - this.attr( "novalidate", "novalidate" ); - - validator = new $.validator( options, this[0] ); - $.data( this[0], "validator", validator ); - - if ( validator.settings.onsubmit ) { - - this.validateDelegate( ":submit", "click", function( event ) { - if ( validator.settings.submitHandler ) { - validator.submitButton = event.target; - } - // allow suppressing validation by adding a cancel class to the submit button - if ( $(event.target).hasClass("cancel") ) { - validator.cancelSubmit = true; - } - }); - - // validate the form on submit - this.submit( function( event ) { - if ( validator.settings.debug ) { - // prevent form submit to be able to see console output - event.preventDefault(); - } - function handle() { - var hidden; - if ( validator.settings.submitHandler ) { - if ( validator.submitButton ) { - // insert a hidden input as a replacement for the missing submit button - hidden = $("").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); - } - validator.settings.submitHandler.call( validator, validator.currentForm, event ); - if ( validator.submitButton ) { - // and clean up afterwards; thanks to no-block-scope, hidden can be referenced - hidden.remove(); - } - return false; - } - return true; - } - - // prevent submit for invalid forms or custom submit handlers - if ( validator.cancelSubmit ) { - validator.cancelSubmit = false; - return handle(); - } - if ( validator.form() ) { - if ( validator.pendingRequest ) { - validator.formSubmitted = true; - return false; - } - return handle(); - } else { - validator.focusInvalid(); - return false; - } - }); - } - - return validator; - }, - // http://docs.jquery.com/Plugins/Validation/valid - valid: function() { - if ( $(this[0]).is("form")) { - return this.validate().form(); - } else { - var valid = true; - var validator = $(this[0].form).validate(); - this.each(function() { - valid &= validator.element(this); - }); - return valid; - } - }, - // attributes: space seperated list of attributes to retrieve and remove - removeAttrs: function( attributes ) { - var result = {}, - $element = this; - $.each(attributes.split(/\s/), function( index, value ) { - result[value] = $element.attr(value); - $element.removeAttr(value); - }); - return result; - }, - // http://docs.jquery.com/Plugins/Validation/rules - rules: function( command, argument ) { - var element = this[0]; - - if ( command ) { - var settings = $.data(element.form, "validator").settings; - var staticRules = settings.rules; - var existingRules = $.validator.staticRules(element); - switch(command) { - case "add": - $.extend(existingRules, $.validator.normalizeRule(argument)); - staticRules[element.name] = existingRules; - if ( argument.messages ) { - settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages ); - } - break; - case "remove": - if ( !argument ) { - delete staticRules[element.name]; - return existingRules; - } - var filtered = {}; - $.each(argument.split(/\s/), function( index, method ) { - filtered[method] = existingRules[method]; - delete existingRules[method]; - }); - return filtered; - } - } - - var data = $.validator.normalizeRules( - $.extend( - {}, - $.validator.classRules(element), - $.validator.attributeRules(element), - $.validator.dataRules(element), - $.validator.staticRules(element) - ), element); - - // make sure required is at front - if ( data.required ) { - var param = data.required; - delete data.required; - data = $.extend({required: param}, data); - } - - return data; - } -}); - -// Custom selectors -$.extend($.expr[":"], { - // http://docs.jquery.com/Plugins/Validation/blank - blank: function( a ) { return !$.trim("" + a.value); }, - // http://docs.jquery.com/Plugins/Validation/filled - filled: function( a ) { return !!$.trim("" + a.value); }, - // http://docs.jquery.com/Plugins/Validation/unchecked - unchecked: function( a ) { return !a.checked; } -}); - -// constructor for validator -$.validator = function( options, form ) { - this.settings = $.extend( true, {}, $.validator.defaults, options ); - this.currentForm = form; - this.init(); -}; - -$.validator.format = function( source, params ) { - if ( arguments.length === 1 ) { - return function() { - var args = $.makeArray(arguments); - args.unshift(source); - return $.validator.format.apply( this, args ); - }; - } - if ( arguments.length > 2 && params.constructor !== Array ) { - params = $.makeArray(arguments).slice(1); - } - if ( params.constructor !== Array ) { - params = [ params ]; - } - $.each(params, function( i, n ) { - source = source.replace( new RegExp("\\{" + i + "\\}", "g"), function() { - return n; - }); - }); - return source; -}; - -$.extend($.validator, { - - defaults: { - messages: {}, - groups: {}, - rules: {}, - errorClass: "error", - validClass: "valid", - errorElement: "label", - focusInvalid: true, - errorContainer: $([]), - errorLabelContainer: $([]), - onsubmit: true, - ignore: ":hidden", - ignoreTitle: false, - onfocusin: function( element, event ) { - this.lastActive = element; - - // hide error label and remove error class on focus if enabled - if ( this.settings.focusCleanup && !this.blockFocusCleanup ) { - if ( this.settings.unhighlight ) { - this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass ); - } - this.addWrapper(this.errorsFor(element)).hide(); - } - }, - onfocusout: function( element, event ) { - if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) { - this.element(element); - } - }, - onkeyup: function( element, event ) { - if ( event.which === 9 && this.elementValue(element) === "" ) { - return; - } else if ( element.name in this.submitted || element === this.lastElement ) { - this.element(element); - } - }, - onclick: function( element, event ) { - // click on selects, radiobuttons and checkboxes - if ( element.name in this.submitted ) { - this.element(element); - } - // or option elements, check parent select in that case - else if ( element.parentNode.name in this.submitted ) { - this.element(element.parentNode); - } - }, - highlight: function( element, errorClass, validClass ) { - if ( element.type === "radio" ) { - this.findByName(element.name).addClass(errorClass).removeClass(validClass); - } else { - $(element).addClass(errorClass).removeClass(validClass); - } - }, - unhighlight: function( element, errorClass, validClass ) { - if ( element.type === "radio" ) { - this.findByName(element.name).removeClass(errorClass).addClass(validClass); - } else { - $(element).removeClass(errorClass).addClass(validClass); - } - } - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults - setDefaults: function( settings ) { - $.extend( $.validator.defaults, settings ); - }, - - messages: { - required: "This field is required.", - remote: "Please fix this field.", - email: "Please enter a valid email address.", - url: "Please enter a valid URL.", - date: "Please enter a valid date.", - dateISO: "Please enter a valid date (ISO).", - number: "Please enter a valid number.", - digits: "Please enter only digits.", - creditcard: "Please enter a valid credit card number.", - equalTo: "Please enter the same value again.", - maxlength: $.validator.format("Please enter no more than {0} characters."), - minlength: $.validator.format("Please enter at least {0} characters."), - rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."), - range: $.validator.format("Please enter a value between {0} and {1}."), - max: $.validator.format("Please enter a value less than or equal to {0}."), - min: $.validator.format("Please enter a value greater than or equal to {0}.") - }, - - autoCreateRanges: false, - - prototype: { - - init: function() { - this.labelContainer = $(this.settings.errorLabelContainer); - this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm); - this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer ); - this.submitted = {}; - this.valueCache = {}; - this.pendingRequest = 0; - this.pending = {}; - this.invalid = {}; - this.reset(); - - var groups = (this.groups = {}); - $.each(this.settings.groups, function( key, value ) { - if ( typeof value === "string" ) { - value = value.split(/\s/); - } - $.each(value, function( index, name ) { - groups[name] = key; - }); - }); - var rules = this.settings.rules; - $.each(rules, function( key, value ) { - rules[key] = $.validator.normalizeRule(value); - }); - - function delegate(event) { - var validator = $.data(this[0].form, "validator"), - eventType = "on" + event.type.replace(/^validate/, ""); - if ( validator.settings[eventType] ) { - validator.settings[eventType].call(validator, this[0], event); - } - } - $(this.currentForm) - .validateDelegate(":text, [type='password'], [type='file'], select, textarea, " + - "[type='number'], [type='search'] ,[type='tel'], [type='url'], " + - "[type='email'], [type='datetime'], [type='date'], [type='month'], " + - "[type='week'], [type='time'], [type='datetime-local'], " + - "[type='range'], [type='color'] ", - "focusin focusout keyup", delegate) - .validateDelegate("[type='radio'], [type='checkbox'], select, option", "click", delegate); - - if ( this.settings.invalidHandler ) { - $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); - } - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/form - form: function() { - this.checkForm(); - $.extend(this.submitted, this.errorMap); - this.invalid = $.extend({}, this.errorMap); - if ( !this.valid() ) { - $(this.currentForm).triggerHandler("invalid-form", [this]); - } - this.showErrors(); - return this.valid(); - }, - - checkForm: function() { - this.prepareForm(); - for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { - this.check( elements[i] ); - } - return this.valid(); - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/element - element: function( element ) { - element = this.validationTargetFor( this.clean( element ) ); - this.lastElement = element; - this.prepareElement( element ); - this.currentElements = $(element); - var result = this.check( element ) !== false; - if ( result ) { - delete this.invalid[element.name]; - } else { - this.invalid[element.name] = true; - } - if ( !this.numberOfInvalids() ) { - // Hide error containers on last error - this.toHide = this.toHide.add( this.containers ); - } - this.showErrors(); - return result; - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/showErrors - showErrors: function( errors ) { - if ( errors ) { - // add items to error list and map - $.extend( this.errorMap, errors ); - this.errorList = []; - for ( var name in errors ) { - this.errorList.push({ - message: errors[name], - element: this.findByName(name)[0] - }); - } - // remove items from success list - this.successList = $.grep( this.successList, function( element ) { - return !(element.name in errors); - }); - } - if ( this.settings.showErrors ) { - this.settings.showErrors.call( this, this.errorMap, this.errorList ); - } else { - this.defaultShowErrors(); - } - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/resetForm - resetForm: function() { - if ( $.fn.resetForm ) { - $(this.currentForm).resetForm(); - } - this.submitted = {}; - this.lastElement = null; - this.prepareForm(); - this.hideErrors(); - this.elements().removeClass( this.settings.errorClass ).removeData( "previousValue" ); - }, - - numberOfInvalids: function() { - return this.objectLength(this.invalid); - }, - - objectLength: function( obj ) { - var count = 0; - for ( var i in obj ) { - count++; - } - return count; - }, - - hideErrors: function() { - this.addWrapper( this.toHide ).hide(); - }, - - valid: function() { - return this.size() === 0; - }, - - size: function() { - return this.errorList.length; - }, - - focusInvalid: function() { - if ( this.settings.focusInvalid ) { - try { - $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []) - .filter(":visible") - .focus() - // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find - .trigger("focusin"); - } catch(e) { - // ignore IE throwing errors when focusing hidden elements - } - } - }, - - findLastActive: function() { - var lastActive = this.lastActive; - return lastActive && $.grep(this.errorList, function( n ) { - return n.element.name === lastActive.name; - }).length === 1 && lastActive; - }, - - elements: function() { - var validator = this, - rulesCache = {}; - - // select all valid inputs inside the form (no submit or reset buttons) - return $(this.currentForm) - .find("input, select, textarea") - .not(":submit, :reset, :image, [disabled]") - .not( this.settings.ignore ) - .filter(function() { - if ( !this.name ) { - if ( window.console ) { - console.error( "%o has no name assigned", this ); - } - throw new Error( "Failed to validate, found an element with no name assigned. See console for element reference." ); - } - - // select only the first element for each name, and only those with rules specified - if ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) { - return false; - } - - rulesCache[this.name] = true; - return true; - }); - }, - - clean: function( selector ) { - return $(selector)[0]; - }, - - errors: function() { - var errorClass = this.settings.errorClass.replace(" ", "."); - return $(this.settings.errorElement + "." + errorClass, this.errorContext); - }, - - reset: function() { - this.successList = []; - this.errorList = []; - this.errorMap = {}; - this.toShow = $([]); - this.toHide = $([]); - this.currentElements = $([]); - }, - - prepareForm: function() { - this.reset(); - this.toHide = this.errors().add( this.containers ); - }, - - prepareElement: function( element ) { - this.reset(); - this.toHide = this.errorsFor(element); - }, - - elementValue: function( element ) { - var type = $(element).attr("type"), - val = $(element).val(); - - if ( type === "radio" || type === "checkbox" ) { - return $("input[name='" + $(element).attr("name") + "']:checked").val(); - } - - if ( typeof val === "string" ) { - return val.replace(/\r/g, ""); - } - return val; - }, - - check: function( element ) { - element = this.validationTargetFor( this.clean( element ) ); - - var rules = $(element).rules(); - var dependencyMismatch = false; - var val = this.elementValue(element); - var result; - - for (var method in rules ) { - var rule = { method: method, parameters: rules[method] }; - try { - - result = $.validator.methods[method].call( this, val, element, rule.parameters ); - - // if a method indicates that the field is optional and therefore valid, - // don't mark it as valid when there are no other rules - if ( result === "dependency-mismatch" ) { - dependencyMismatch = true; - continue; - } - dependencyMismatch = false; - - if ( result === "pending" ) { - this.toHide = this.toHide.not( this.errorsFor(element) ); - return; - } - - if ( !result ) { - this.formatAndAdd( element, rule ); - return false; - } - } catch(e) { - if ( this.settings.debug && window.console ) { - console.log( "Exception occured when checking element " + element.id + ", check the '" + rule.method + "' method.", e ); - } - throw e; - } - } - if ( dependencyMismatch ) { - return; - } - if ( this.objectLength(rules) ) { - this.successList.push(element); - } - return true; - }, - - // return the custom message for the given element and validation method - // specified in the element's HTML5 data attribute - customDataMessage: function( element, method ) { - return $(element).data("msg-" + method.toLowerCase()) || (element.attributes && $(element).attr("data-msg-" + method.toLowerCase())); - }, - - // return the custom message for the given element name and validation method - customMessage: function( name, method ) { - var m = this.settings.messages[name]; - return m && (m.constructor === String ? m : m[method]); - }, - - // return the first defined argument, allowing empty strings - findDefined: function() { - for(var i = 0; i < arguments.length; i++) { - if ( arguments[i] !== undefined ) { - return arguments[i]; - } - } - return undefined; - }, - - defaultMessage: function( element, method ) { - return this.findDefined( - this.customMessage( element.name, method ), - this.customDataMessage( element, method ), - // title is never undefined, so handle empty string as undefined - !this.settings.ignoreTitle && element.title || undefined, - $.validator.messages[method], - "Warning: No message defined for " + element.name + "" - ); - }, - - formatAndAdd: function( element, rule ) { - var message = this.defaultMessage( element, rule.method ), - theregex = /\$?\{(\d+)\}/g; - if ( typeof message === "function" ) { - message = message.call(this, rule.parameters, element); - } else if (theregex.test(message)) { - message = $.validator.format(message.replace(theregex, "{$1}"), rule.parameters); - } - this.errorList.push({ - message: message, - element: element - }); - - this.errorMap[element.name] = message; - this.submitted[element.name] = message; - }, - - addWrapper: function( toToggle ) { - if ( this.settings.wrapper ) { - toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) ); - } - return toToggle; - }, - - defaultShowErrors: function() { - var i, elements; - for ( i = 0; this.errorList[i]; i++ ) { - var error = this.errorList[i]; - if ( this.settings.highlight ) { - this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass ); - } - this.showLabel( error.element, error.message ); - } - if ( this.errorList.length ) { - this.toShow = this.toShow.add( this.containers ); - } - if ( this.settings.success ) { - for ( i = 0; this.successList[i]; i++ ) { - this.showLabel( this.successList[i] ); - } - } - if ( this.settings.unhighlight ) { - for ( i = 0, elements = this.validElements(); elements[i]; i++ ) { - this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass ); - } - } - this.toHide = this.toHide.not( this.toShow ); - this.hideErrors(); - this.addWrapper( this.toShow ).show(); - }, - - validElements: function() { - return this.currentElements.not(this.invalidElements()); - }, - - invalidElements: function() { - return $(this.errorList).map(function() { - return this.element; - }); - }, - - showLabel: function( element, message ) { - var label = this.errorsFor( element ); - if ( label.length ) { - // refresh error/success class - label.removeClass( this.settings.validClass ).addClass( this.settings.errorClass ); - - // check if we have a generated label, replace the message then - if ( label.attr("generated") ) { - label.html(message); - } - } else { - // create label - label = $("<" + this.settings.errorElement + "/>") - .attr({"for": this.idOrName(element), generated: true}) - .addClass(this.settings.errorClass) - .html(message || ""); - if ( this.settings.wrapper ) { - // make sure the element is visible, even in IE - // actually showing the wrapped element is handled elsewhere - label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent(); - } - if ( !this.labelContainer.append(label).length ) { - if ( this.settings.errorPlacement ) { - this.settings.errorPlacement(label, $(element) ); - } else { - label.insertAfter(element); - } - } - } - if ( !message && this.settings.success ) { - label.text(""); - if ( typeof this.settings.success === "string" ) { - label.addClass( this.settings.success ); - } else { - this.settings.success( label, element ); - } - } - this.toShow = this.toShow.add(label); - }, - - errorsFor: function( element ) { - var name = this.idOrName(element); - return this.errors().filter(function() { - return $(this).attr("for") === name; - }); - }, - - idOrName: function( element ) { - return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name); - }, - - validationTargetFor: function( element ) { - // if radio/checkbox, validate first element in group instead - if ( this.checkable(element) ) { - element = this.findByName( element.name ).not(this.settings.ignore)[0]; - } - return element; - }, - - checkable: function( element ) { - return (/radio|checkbox/i).test(element.type); - }, - - findByName: function( name ) { - return $(this.currentForm).find("[name='" + name + "']"); - }, - - getLength: function( value, element ) { - switch( element.nodeName.toLowerCase() ) { - case "select": - return $("option:selected", element).length; - case "input": - if ( this.checkable( element) ) { - return this.findByName(element.name).filter(":checked").length; - } - } - return value.length; - }, - - depend: function( param, element ) { - return this.dependTypes[typeof param] ? this.dependTypes[typeof param](param, element) : true; - }, - - dependTypes: { - "boolean": function( param, element ) { - return param; - }, - "string": function( param, element ) { - return !!$(param, element.form).length; - }, - "function": function( param, element ) { - return param(element); - } - }, - - optional: function( element ) { - var val = this.elementValue(element); - return !$.validator.methods.required.call(this, val, element) && "dependency-mismatch"; - }, - - startRequest: function( element ) { - if ( !this.pending[element.name] ) { - this.pendingRequest++; - this.pending[element.name] = true; - } - }, - - stopRequest: function( element, valid ) { - this.pendingRequest--; - // sometimes synchronization fails, make sure pendingRequest is never < 0 - if ( this.pendingRequest < 0 ) { - this.pendingRequest = 0; - } - delete this.pending[element.name]; - if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) { - $(this.currentForm).submit(); - this.formSubmitted = false; - } else if (!valid && this.pendingRequest === 0 && this.formSubmitted) { - $(this.currentForm).triggerHandler("invalid-form", [this]); - this.formSubmitted = false; - } - }, - - previousValue: function( element ) { - return $.data(element, "previousValue") || $.data(element, "previousValue", { - old: null, - valid: true, - message: this.defaultMessage( element, "remote" ) - }); - } - - }, - - classRuleSettings: { - required: {required: true}, - email: {email: true}, - url: {url: true}, - date: {date: true}, - dateISO: {dateISO: true}, - number: {number: true}, - digits: {digits: true}, - creditcard: {creditcard: true} - }, - - addClassRules: function( className, rules ) { - if ( className.constructor === String ) { - this.classRuleSettings[className] = rules; - } else { - $.extend(this.classRuleSettings, className); - } - }, - - classRules: function( element ) { - var rules = {}; - var classes = $(element).attr("class"); - if ( classes ) { - $.each(classes.split(" "), function() { - if ( this in $.validator.classRuleSettings ) { - $.extend(rules, $.validator.classRuleSettings[this]); - } - }); - } - return rules; - }, - - attributeRules: function( element ) { - var rules = {}; - var $element = $(element); - - for (var method in $.validator.methods) { - var value; - - // support for in both html5 and older browsers - if ( method === "required" ) { - value = $element.get(0).getAttribute(method); - // Some browsers return an empty string for the required attribute - // and non-HTML5 browsers might have required="" markup - if ( value === "" ) { - value = true; - } - // force non-HTML5 browsers to return bool - value = !!value; - } else { - value = $element.attr(method); - } - - if ( value ) { - rules[method] = value; - } else if ( $element[0].getAttribute("type") === method ) { - rules[method] = true; - } - } - - // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs - if ( rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength) ) { - delete rules.maxlength; - } - - return rules; - }, - - dataRules: function( element ) { - var method, value, - rules = {}, $element = $(element); - for (method in $.validator.methods) { - value = $element.data("rule-" + method.toLowerCase()); - if ( value !== undefined ) { - rules[method] = value; - } - } - return rules; - }, - - staticRules: function( element ) { - var rules = {}; - var validator = $.data(element.form, "validator"); - if ( validator.settings.rules ) { - rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {}; - } - return rules; - }, - - normalizeRules: function( rules, element ) { - // handle dependency check - $.each(rules, function( prop, val ) { - // ignore rule when param is explicitly false, eg. required:false - if ( val === false ) { - delete rules[prop]; - return; - } - if ( val.param || val.depends ) { - var keepRule = true; - switch (typeof val.depends) { - case "string": - keepRule = !!$(val.depends, element.form).length; - break; - case "function": - keepRule = val.depends.call(element, element); - break; - } - if ( keepRule ) { - rules[prop] = val.param !== undefined ? val.param : true; - } else { - delete rules[prop]; - } - } - }); - - // evaluate parameters - $.each(rules, function( rule, parameter ) { - rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter; - }); - - // clean number parameters - $.each(["minlength", "maxlength", "min", "max"], function() { - if ( rules[this] ) { - rules[this] = Number(rules[this]); - } - }); - $.each(["rangelength", "range"], function() { - var parts; - if ( rules[this] ) { - if ( $.isArray(rules[this]) ) { - rules[this] = [Number(rules[this][0]), Number(rules[this][1])]; - } else if ( typeof rules[this] === "string" ) { - parts = rules[this].split(/[\s,]+/); - rules[this] = [Number(parts[0]), Number(parts[1])]; - } - } - }); - - if ( $.validator.autoCreateRanges ) { - // auto-create ranges - if ( rules.min && rules.max ) { - rules.range = [rules.min, rules.max]; - delete rules.min; - delete rules.max; - } - if ( rules.minlength && rules.maxlength ) { - rules.rangelength = [rules.minlength, rules.maxlength]; - delete rules.minlength; - delete rules.maxlength; - } - } - - return rules; - }, - - // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true} - normalizeRule: function( data ) { - if ( typeof data === "string" ) { - var transformed = {}; - $.each(data.split(/\s/), function() { - transformed[this] = true; - }); - data = transformed; - } - return data; - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/addMethod - addMethod: function( name, method, message ) { - $.validator.methods[name] = method; - $.validator.messages[name] = message !== undefined ? message : $.validator.messages[name]; - if ( method.length < 3 ) { - $.validator.addClassRules(name, $.validator.normalizeRule(name)); - } - }, - - methods: { - - // http://docs.jquery.com/Plugins/Validation/Methods/required - required: function( value, element, param ) { - // check if dependency is met - if ( !this.depend(param, element) ) { - return "dependency-mismatch"; - } - if ( element.nodeName.toLowerCase() === "select" ) { - // could be an array for select-multiple or a string, both are fine this way - var val = $(element).val(); - return val && val.length > 0; - } - if ( this.checkable(element) ) { - return this.getLength(value, element) > 0; - } - return $.trim(value).length > 0; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/remote - remote: function( value, element, param ) { - if ( this.optional(element) ) { - return "dependency-mismatch"; - } - - var previous = this.previousValue(element); - if (!this.settings.messages[element.name] ) { - this.settings.messages[element.name] = {}; - } - previous.originalMessage = this.settings.messages[element.name].remote; - this.settings.messages[element.name].remote = previous.message; - - param = typeof param === "string" && {url:param} || param; - - if ( previous.old === value ) { - return previous.valid; - } - - previous.old = value; - var validator = this; - this.startRequest(element); - var data = {}; - data[element.name] = value; - $.ajax($.extend(true, { - url: param, - mode: "abort", - port: "validate" + element.name, - dataType: "json", - data: data, - success: function( response ) { - validator.settings.messages[element.name].remote = previous.originalMessage; - var valid = response === true || response === "true"; - if ( valid ) { - var submitted = validator.formSubmitted; - validator.prepareElement(element); - validator.formSubmitted = submitted; - validator.successList.push(element); - delete validator.invalid[element.name]; - validator.showErrors(); - } else { - var errors = {}; - var message = response || validator.defaultMessage( element, "remote" ); - errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message; - validator.invalid[element.name] = true; - validator.showErrors(errors); - } - previous.valid = valid; - validator.stopRequest(element, valid); - } - }, param)); - return "pending"; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/minlength - minlength: function( value, element, param ) { - var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); - return this.optional(element) || length >= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/maxlength - maxlength: function( value, element, param ) { - var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); - return this.optional(element) || length <= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/rangelength - rangelength: function( value, element, param ) { - var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); - return this.optional(element) || ( length >= param[0] && length <= param[1] ); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/min - min: function( value, element, param ) { - return this.optional(element) || value >= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/max - max: function( value, element, param ) { - return this.optional(element) || value <= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/range - range: function( value, element, param ) { - return this.optional(element) || ( value >= param[0] && value <= param[1] ); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/email - email: function( value, element ) { - // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/ - return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/url - url: function( value, element ) { - // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ - return this.optional(element) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/date - date: function( value, element ) { - return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString()); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/dateISO - dateISO: function( value, element ) { - return this.optional(element) || /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/number - number: function( value, element ) { - return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/digits - digits: function( value, element ) { - return this.optional(element) || /^\d+$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/creditcard - // based on http://en.wikipedia.org/wiki/Luhn - creditcard: function( value, element ) { - if ( this.optional(element) ) { - return "dependency-mismatch"; - } - // accept only spaces, digits and dashes - if ( /[^0-9 \-]+/.test(value) ) { - return false; - } - var nCheck = 0, - nDigit = 0, - bEven = false; - - value = value.replace(/\D/g, ""); - - for (var n = value.length - 1; n >= 0; n--) { - var cDigit = value.charAt(n); - nDigit = parseInt(cDigit, 10); - if ( bEven ) { - if ( (nDigit *= 2) > 9 ) { - nDigit -= 9; - } - } - nCheck += nDigit; - bEven = !bEven; - } - - return (nCheck % 10) === 0; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/equalTo - equalTo: function( value, element, param ) { - // bind to the blur event of the target in order to revalidate whenever the target field is updated - // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead - var target = $(param); - if ( this.settings.onfocusout ) { - target.unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { - $(element).valid(); - }); - } - return value === target.val(); - } - - } - -}); - -// deprecated, use $.validator.format instead -$.format = $.validator.format; - -}(jQuery)); - -// ajax mode: abort -// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); -// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() -(function($) { - var pendingRequests = {}; - // Use a prefilter if available (1.5+) - if ( $.ajaxPrefilter ) { - $.ajaxPrefilter(function( settings, _, xhr ) { - var port = settings.port; - if ( settings.mode === "abort" ) { - if ( pendingRequests[port] ) { - pendingRequests[port].abort(); - } - pendingRequests[port] = xhr; - } - }); - } else { - // Proxy ajax - var ajax = $.ajax; - $.ajax = function( settings ) { - var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode, - port = ( "port" in settings ? settings : $.ajaxSettings ).port; - if ( mode === "abort" ) { - if ( pendingRequests[port] ) { - pendingRequests[port].abort(); - } - return (pendingRequests[port] = ajax.apply(this, arguments)); - } - return ajax.apply(this, arguments); - }; - } -}(jQuery)); - -// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation -// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target -(function($) { - $.extend($.fn, { - validateDelegate: function( delegate, type, handler ) { - return this.bind(type, function( event ) { - var target = $(event.target); - if ( target.is(delegate) ) { - return handler.apply(target, arguments); - } - }); - } - }); -}(jQuery)); diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/type-view.hbs b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/type-view.hbs deleted file mode 100644 index d02b3354..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/type-view.hbs +++ /dev/null @@ -1,315 +0,0 @@ -

-
- -
-
- -
-
-

What it Does

-
-

Connect an - [IRIS+] Drone to - WSO2 IoT Server and visualize statistics. -

-
- -

What You Need

-
-
    -
  • - ITEM 01 -    IRIS+ Drone. -
  • -
  • - ITEM 02 -    USB to Micro USB cable or Telemetry Radio receiver. -
  • -
  • - STEP 03 -    Proceed to [Prepare] section. -
-
- View API
  - - Download Agent - -
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-

-
-
-

Prepare

-
-
    -
  • - 01 -    Connect your IRIS+ Drone to your computer using either USB to Micro - USB cable or Telemetry Radio receiver. -
  • -
  • - 02 -    Click on [Download Agent] button above to get IRIS+ Drone agent. -
  • -
  • - 03 -    Once you have downloaded the agent please run - "[startService.sh]" script with root privileges. -
  • -
  • - 04 -    Then you will be prompted to enter time interval (in seconds) between - successive Data-Pushes to the XMPP server, connection target and communication speed. So - below table will help you to find what is the correct connection target and - communication speed. -
  • -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    CONNECTION-TYPE
    -
    -
    CONNECTION-STRING
    -
    Linux computer connected to the vehicle via USB e.g. /dev/ttyUSB0
    Linux computer connected to the drone via Serial port e.g. /dev/ttyAMA0 (also set baud=57600)
    OSX computer connected to the drone via USBe.g. dev/cu.usbmodem1
    Windows computer connected to the drone via USB (in this case on COM14)e.g. com14
    Windows computer connected to the drone using a 3DR Telemetry Radio on - COM14 - e.g. com14 (also set baud=57600)
    -
    -
-
-
-
-

IRIS+ Drone Connected to a computer

-
-

Click on the image to zoom

-
- - - -
-
-
-
-

Try Out

-
-
    -
  • - 01 -    You can view all your connected devices at - [Device Management] page. -
  • -
  • - 02 -    Select one of connected devices and view stats which are published by - the device. -
  • -
-
-

Click on the image to zoom

-
- - - -
-
- -{{#zone "topCss"}} - -{{/zone}} - -{{#zone "bottomJs"}} - {{js "/js/download.js"}} - {{js "/js/jquery.validate.js"}} -{{/zone}} \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/type-view.json b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/type-view.json deleted file mode 100644 index 9eecd8f5..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/type-view.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "version": "1.0.0" -} \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/css/main-app.css b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/css/main-app.css deleted file mode 100644 index 9f752129..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/css/main-app.css +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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. - */ -.box { - margin-top: 10px; - margin-bottom: 10px; -} - -.box-inner { - border: 1px solid #DEDEDE; - border-radius: 3px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - box-shadow: 0 0 10px rgba(189, 189, 189, 0.4); - -webkit-box-shadow: 0 0 10px rgba(189, 189, 189, 0.4); - -moz-box-shadow: 0 0 10px rgba(189, 189, 189, 0.4); -} - -.box-header { - border: none; - padding-top: 5px; - border-bottom: 1px solid #DEDEDE; - border-radius: 3px 3px 0 0; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - height: 35px; - min-height: 35px !important; - margin-bottom: 0; - font-weight: bold; - font-size: 16px; - background: -moz-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.1) 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(0, 0, 0, 0.1))); - background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.1) 100%); - background: -o-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.1) 100%); - background: -ms-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.1) 100%); - background: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.1) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffffff', endColorstr='#1a000000', GradientType=0); - -} - -.box-header h2 { - font-size: 15px; - width: auto; - clear: none; - float: left; - line-height: 25px; - white-space: nowrap; - font-weight: bold; - margin-top: 0; - margin-bottom: 0; -} - -.box-header h3 { - font-size: 13px; - width: auto; - clear: none; - float: left; - line-height: 25px; - white-space: nowrap; -} - -.box-header h2 > i { - margin-top: 1px; -} - -.box-icon { - float: right; -} - -.box-icon a { - clear: none; - float: left; - margin: 0 2px; - height: 20px; - width: 5px; - margin-top: 1px; -} - -.box-icon a i { - margin-left: -6px; - top: -1px; -} - -.box-content { - padding: 10px; -} - -.btn-round { - border-radius: 40px; - -webkit-border-radius: 40px; - -moz-border-radius: 40px; - font-size: 12px; - padding-top: 4px; -} - -.navbar-brand { - font-family: 'Shojumaru', cursive, Arial, serif; - letter-spacing: 2px; - text-shadow: 1px 1px 5px rgba(0, 0, 0, 0.5); - width: 183px; - font-size: 17px; -} - -.navbar-brand img { - float: left; - height: 20px; - width: 20px; - margin-right: 5px; -} - -.navbar-brand span { - float: left; -} - -.navbar-search { - margin-left: 10px; - margin-top: 7px; -} - -.navbar-inner { - padding-top: 5px; - padding-bottom: 5px; - line-height: 30px; - height: 60px; -} - -.navbar-inner .btn-group { - margin: 7px 5px 0 5px; -} - -.bs-icons li { - list-style: none; -} - -.box-content .nav-tabs { - margin-right: -10px; - margin-left: -10px; -} - -.box-content.buttons { - min-height: 297px; -} - -.sidebar-nav .nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 18px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.navbar { - border-radius: 0; -} -.circle { - background: none repeat scroll 0 0 #191919; - border-radius: 50px; - height: 50px; - padding: 10px; - width: 50px; - color: #fff; -} - -.padding-top-double { - padding-top: 20px; -} -.padding-double { - padding: 20px; -} -.grey { - color: #333; -} -hr { - display: block; - height: 1px; - border: 0; - border-top: 1px solid #7f7f7f; - margin: 1em 0; - padding: 0; - opacity: 0.2; -} -.light-grey { - color: #7c7c7c; -} -.uppercase { - text-transform: uppercase; -} -.grey-bg { - background-color: #f6f4f4; -} - -path { - stroke: black; - stroke-width: 2; - fill: none; -} - -.axis path, .axis line { - fill: none; - stroke: #ccc; - stroke-width: 2; - shape-rendering: crispEdges; -} diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/background_drone.png b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/background_drone.png deleted file mode 100644 index c3ce7dc40d87da479b11193a13a91c2f68363547..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26787 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 diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/pitch_drone.png b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/pitch_drone.png deleted file mode 100644 index 84afb8f1888ebec0dbd5cb4b8c3bde86c3bc05de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20046 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 0 ) { - - this.dispatchEvent( changeEvent ); - - lastPosition.copy( this.object.position ); - - } - - }; - - - function getAutoRotationAngle() { - - return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; - - } - - function getZoomScale() { - - return Math.pow( 0.95, scope.zoomSpeed ); - - } - - function onMouseDown( event ) { - - if ( scope.enabled === false ) { return; } - event.preventDefault(); - - if ( event.button === 0 ) { - if ( scope.noRotate === true ) { return; } - - state = STATE.ROTATE; - - rotateStart.set( event.clientX, event.clientY ); - - } else if ( event.button === 1 ) { - if ( scope.noZoom === true ) { return; } - - state = STATE.DOLLY; - - dollyStart.set( event.clientX, event.clientY ); - - } else if ( event.button === 2 ) { - if ( scope.noPan === true ) { return; } - - state = STATE.PAN; - - panStart.set( event.clientX, event.clientY ); - - } - - document.addEventListener( 'mousemove', onMouseMove, false ); - document.addEventListener( 'mouseup', onMouseUp, false ); - - } - - function onMouseMove( event ) { - - if ( scope.enabled === false ) { return; } - - event.preventDefault(); - - if ( state === STATE.ROTATE ) { - if ( scope.noRotate === true ) { return; } - - rotateEnd.set( event.clientX, event.clientY ); - rotateDelta.subVectors( rotateEnd, rotateStart ); - - // rotating across whole screen goes 360 degrees around - scope.rotateLeft( 2 * Math.PI * rotateDelta.x / scope.domElement.width * scope.rotateSpeed ); - // rotating up and down along whole screen attempts to go 360, but limited to 180 - scope.rotateUp( 2 * Math.PI * rotateDelta.y / scope.domElement.height * scope.rotateSpeed ); - - rotateStart.copy( rotateEnd ); - - } else if ( state === STATE.DOLLY ) { - if ( scope.noZoom === true ) { return; } - - dollyEnd.set( event.clientX, event.clientY ); - dollyDelta.subVectors( dollyEnd, dollyStart ); - - if ( dollyDelta.y > 0 ) { - - scope.dollyIn(); - - } else { - - scope.dollyOut(); - - } - - dollyStart.copy( dollyEnd ); - - } else if ( state === STATE.PAN ) { - if ( scope.noPan === true ) { return; } - - panEnd.set( event.clientX, event.clientY ); - panDelta.subVectors( panEnd, panStart ); - - scope.pan( panDelta ); - - panStart.copy( panEnd ); - - } - - } - - function onMouseUp( /* event */ ) { - - if ( scope.enabled === false ) { return; } - - document.removeEventListener( 'mousemove', onMouseMove, false ); - document.removeEventListener( 'mouseup', onMouseUp, false ); - - state = STATE.NONE; - - } - - function onMouseWheel( event ) { - // this is needed when the program is inside an iframe - // to prevent scrolling the whole page - event.preventDefault(); - if ( scope.enabled === false ) { return; } - if ( scope.noZoom === true ) { return; } - - var delta = 0; - - if ( event.wheelDelta ) { // WebKit / Opera / Explorer 9 - - delta = event.wheelDelta; - - } else if ( event.detail ) { // Firefox - - delta = - event.detail; - - } - - if ( delta > 0 ) { - - scope.dollyOut(); - - } else { - - scope.dollyIn(); - - } - - } - - function onKeyDown( event ) { - - if ( scope.enabled === false ) { return; } - if ( scope.noKeys === true ) { return; } - if ( scope.noPan === true ) { return; } - - // pan a pixel - I guess for precise positioning? - switch ( event.keyCode ) { - - case scope.keys.UP: - scope.pan( new THREE.Vector2( 0, 1 ) ); - break; - case scope.keys.BOTTOM: - scope.pan( new THREE.Vector2( 0, -1 ) ); - break; - case scope.keys.LEFT: - scope.pan( new THREE.Vector2( 1, 0 ) ); - break; - case scope.keys.RIGHT: - scope.pan( new THREE.Vector2( -1, 0 ) ); - break; - } - - } - - function touchstart( event ) { - - if ( scope.enabled === false ) { return; } - - switch ( event.touches.length ) { - - case 1: // one-fingered touch: rotate - if ( scope.noRotate === true ) { return; } - - state = STATE.TOUCH_ROTATE; - - rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); - break; - - case 2: // two-fingered touch: dolly - if ( scope.noZoom === true ) { return; } - - state = STATE.TOUCH_DOLLY; - - var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; - var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; - var distance = Math.sqrt( dx * dx + dy * dy ); - dollyStart.set( 0, distance ); - break; - - case 3: // three-fingered touch: pan - if ( scope.noPan === true ) { return; } - - state = STATE.TOUCH_PAN; - - panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); - break; - - default: - state = STATE.NONE; - - } - } - - function touchmove( event ) { - - if ( scope.enabled === false ) { return; } - - event.preventDefault(); - event.stopPropagation(); - - switch ( event.touches.length ) { - - case 1: // one-fingered touch: rotate - if ( scope.noRotate === true ) { return; } - if ( state !== STATE.TOUCH_ROTATE ) { return; } - - rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); - rotateDelta.subVectors( rotateEnd, rotateStart ); - - // rotating across whole screen goes 360 degrees around - scope.rotateLeft( 2 * Math.PI * rotateDelta.x / scope.domElement.width * scope.rotateSpeed ); - // rotating up and down along whole screen attempts to go 360, but limited to 180 - scope.rotateUp( 2 * Math.PI * rotateDelta.y / scope.domElement.height * scope.rotateSpeed ); - - rotateStart.copy( rotateEnd ); - break; - - case 2: // two-fingered touch: dolly - if ( scope.noZoom === true ) { return; } - if ( state !== STATE.TOUCH_DOLLY ) { return; } - - var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; - var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; - var distance = Math.sqrt( dx * dx + dy * dy ); - - dollyEnd.set( 0, distance ); - dollyDelta.subVectors( dollyEnd, dollyStart ); - - if ( dollyDelta.y > 0 ) { - - scope.dollyOut(); - - } else { - - scope.dollyIn(); - - } - - dollyStart.copy( dollyEnd ); - break; - - case 3: // three-fingered touch: pan - if ( scope.noPan === true ) { return; } - if ( state !== STATE.TOUCH_PAN ) { return; } - - panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); - panDelta.subVectors( panEnd, panStart ); - - scope.pan( panDelta ); - - panStart.copy( panEnd ); - break; - - default: - state = STATE.NONE; - - } - - } - - function touchend( /* event */ ) { - - if ( scope.enabled === false ) { return; } - - state = STATE.NONE; - } - - this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false ); - this.domElement.addEventListener( 'mousedown', onMouseDown, false ); - this.domElement.addEventListener( 'mousewheel', onMouseWheel, false ); - this.domElement.addEventListener( 'DOMMouseScroll', onMouseWheel, false ); // firefox - - this.domElement.addEventListener( 'keydown', onKeyDown, false ); - - this.domElement.addEventListener( 'touchstart', touchstart, false ); - this.domElement.addEventListener( 'touchend', touchend, false ); - this.domElement.addEventListener( 'touchmove', touchmove, false ); - -}; diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/three.min.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/three.min.js deleted file mode 100644 index f088be7a..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/three.min.js +++ /dev/null @@ -1,724 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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. - */ - -// three.js - http://github.com/mrdoob/three.js -'use strict';var THREE=THREE||{REVISION:"56"};self.console=self.console||{info:function(){},log:function(){},debug:function(){},warn:function(){},error:function(){}};self.Int32Array=self.Int32Array||Array;self.Float32Array=self.Float32Array||Array;String.prototype.trim=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")}; -THREE.extend=function(a,b){if(Object.keys)for(var c=Object.keys(b),d=0,e=c.length;d>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSV:function(a,b,c){console.log("DEPRECATED: Color's .setHSV() will be removed. Use .setHSL( h, s, l ) instead.");return this.setHSL(a,b*c/(1>(a=(2-b)*c)?a:2-a),a/2)},setHSL:function(a, -b,c){if(0===b)this.r=this.g=this.b=c;else{var d=function(a,b,c){0>c&&(c+=1);1c?b:c<2/3?a+6*(b-a)*(2/3-c):a},b=0.5>=c?c*(1+b):c+b-c*b,c=2*c-b;this.r=d(c,b,a+1/3);this.g=d(c,b,a);this.b=d(c,b,a-1/3)}return this},setStyle:function(a){if(/^rgb\((\d+),(\d+),(\d+)\)$/i.test(a))return a=/^rgb\((\d+),(\d+),(\d+)\)$/i.exec(a),this.r=Math.min(255,parseInt(a[1],10))/255,this.g=Math.min(255,parseInt(a[2],10))/255,this.b=Math.min(255,parseInt(a[3],10))/255,this;if(/^rgb\((\d+)\%,(\d+)\%,(\d+)\%\)$/i.test(a))return a= -/^rgb\((\d+)\%,(\d+)\%,(\d+)\%\)$/i.exec(a),this.r=Math.min(100,parseInt(a[1],10))/100,this.g=Math.min(100,parseInt(a[2],10))/100,this.b=Math.min(100,parseInt(a[3],10))/100,this;if(/^\#([0-9a-f]{6})$/i.test(a))return a=/^\#([0-9a-f]{6})$/i.exec(a),this.setHex(parseInt(a[1],16)),this;if(/^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test(a))return a=/^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(a),this.setHex(parseInt(a[1]+a[1]+a[2]+a[2]+a[3]+a[3],16)),this;if(/^(\w+)$/i.test(a))return this.setHex(THREE.ColorKeywords[a]), -this},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255* -this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(){var a={h:0,s:0,l:0};return function(){var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===e)f=g=0;else{var i=e-f,f=0.5>=h?i/(e+f):i/(2-e-f);switch(e){case b:g=(c-d)/i+(cf&&c>b?(c=2*Math.sqrt(1+c-f-b),this.w=(i-g)/c,this.x=0.25*c,this.y=(a+e)/c,this.z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this.w=(d-h)/c,this.x=(a+e)/c,this.y=0.25*c,this.z=(g+i)/c):(c=2*Math.sqrt(1+b-c-f),this.w=(e-a)/c,this.x=(d+h)/c,this.y=(g+i)/c,this.z=0.25*c);return this},inverse:function(){this.conjugate().normalize(); -return this},conjugate:function(){this.x*=-1;this.y*=-1;this.z*=-1;return this},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=this.length();0===a?(this.z=this.y=this.x=0,this.w=1):(a=1/a,this.x*=a,this.y*=a,this.z*=a,this.w*=a);return this},multiply:function(a,b){return void 0!==b?(console.warn("DEPRECATED: Quaternion's .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."), -this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},multiplyQuaternions:function(a,b){var c=a.x,d=a.y,e=a.z,f=a.w,g=b.x,h=b.y,i=b.z,k=b.w;this.x=c*k+f*g+d*i-e*h;this.y=d*k+f*h+e*g-c*i;this.z=e*k+f*i+c*h-d*g;this.w=f*k-c*g-d*h-e*i;return this},multiplyVector3:function(a){console.warn("DEPRECATED: Quaternion's .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)},slerp:function(a,b){var c=this.x,d=this.y,e=this.z, -f=this.w,g=f*a.w+c*a.x+d*a.y+e*a.z;0>g?(this.w=-a.w,this.x=-a.x,this.y=-a.y,this.z=-a.z,g=-g):this.copy(a);if(1<=g)return this.w=f,this.x=c,this.y=d,this.z=e,this;var h=Math.acos(g),i=Math.sqrt(1-g*g);if(0.001>Math.abs(i))return this.w=0.5*(f+this.w),this.x=0.5*(c+this.x),this.y=0.5*(d+this.y),this.z=0.5*(e+this.z),this;g=Math.sin((1-b)*h)/i;h=Math.sin(b*h)/i;this.w=f*g+this.w*h;this.x=c*g+this.x*h;this.y=d*g+this.y*h;this.z=e*g+this.z*h;return this},equals:function(a){return a.x===this.x&&a.y=== -this.y&&a.z===this.z&&a.w===this.w},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}});THREE.Quaternion.slerp=function(a,b,c,d){return c.copy(a).slerp(b,d)};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0}; -THREE.extend(THREE.Vector2.prototype,{set:function(a,b){this.x=a;this.y=b;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!== -b)return console.warn("DEPRECATED: Vector2's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector2's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this}, -subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divideScalar:function(a){0!==a?(this.x/=a,this.y/=a):this.set(0,0);return this},min:function(a){this.x>a.x&&(this.x=a.x);this.y>a.y&&(this.y=a.y);return this},max:function(a){this.xb.x&&(this.x=b.x);this.yb.y&&(this.y=b.y);return this},negate:function(){return this.multiplyScalar(-1)}, -dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)* -b;this.y+=(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},toArray:function(){return[this.x,this.y]},clone:function(){return new THREE.Vector2(this.x,this.y)}});THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}; -THREE.extend(THREE.Vector3.prototype,{set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+ -a);}},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), -this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x* -b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z,a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12];this.y=a[1]*b+a[5]*c+a[9]*d+a[13];this.z=a[2]*b+a[6]*c+a[10]*d+a[14];return this},applyProjection:function(a){var b=this.x,c=this.y,d=this.z,a=a.elements,e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]); -this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z,a=a.w,h=a*b+f*d-g*c,i=a*c+g*b-e*d,k=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+i*-g-k*-f;this.y=i*a+b*-f+k*-e-h*-g;this.z=k*a+b*-g+h*-f-i*-e;return this},applyEuler:function(){var a=new THREE.Quaternion;return function(b,c){var d=a.setFromEuler(b,c);this.applyQuaternion(d);return this}}(),applyAxisAngle:function(){var a= -new THREE.Quaternion;return function(b,c){var d=a.setFromAxisAngle(b,c);this.applyQuaternion(d);return this}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z,a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;this.normalize();return this},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){0!==a?(this.x/=a,this.y/=a,this.z/=a):this.z=this.y=this.x=0;return this},min:function(a){this.x>a.x&&(this.x= -a.x);this.y>a.y&&(this.y=a.y);this.z>a.z&&(this.z=a.z);return this},max:function(a){this.xb.x&&(this.x=b.x);this.yb.y&&(this.y=b.y);this.zb.z&&(this.z=b.z);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y* -this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},cross:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."), -this.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},projectOnVector:function(){var a=new THREE.Vector3;return function(b){a.copy(b).normalize();b=this.dot(a);return this.copy(a).multiplyScalar(b)}}(),projectOnPlane:function(){var a=new THREE.Vector3;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(), -reflect:function(){var a=new THREE.Vector3;return function(b){a.copy(this).projectOnVector(b).multiplyScalar(2);return this.subVectors(a,this)}}(),angleTo:function(a){a=this.dot(a)/(this.length()*a.length());return Math.acos(THREE.Math.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y,a=this.z-a.z;return b*b+c*c+a*a},getPositionFromMatrix:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14]; -return this},setEulerFromRotationMatrix:function(a,b){function c(a){return Math.min(Math.max(a,-1),1)}var d=a.elements,e=d[0],f=d[4],g=d[8],h=d[1],i=d[5],k=d[9],l=d[2],m=d[6],d=d[10];void 0===b||"XYZ"===b?(this.y=Math.asin(c(g)),0.99999>Math.abs(g)?(this.x=Math.atan2(-k,d),this.z=Math.atan2(-f,e)):(this.x=Math.atan2(m,i),this.z=0)):"YXZ"===b?(this.x=Math.asin(-c(k)),0.99999>Math.abs(k)?(this.y=Math.atan2(g,d),this.z=Math.atan2(h,i)):(this.y=Math.atan2(-l,e),this.z=0)):"ZXY"===b?(this.x=Math.asin(c(m)), -0.99999>Math.abs(m)?(this.y=Math.atan2(-l,d),this.z=Math.atan2(-f,i)):(this.y=0,this.z=Math.atan2(h,e))):"ZYX"===b?(this.y=Math.asin(-c(l)),0.99999>Math.abs(l)?(this.x=Math.atan2(m,d),this.z=Math.atan2(h,e)):(this.x=0,this.z=Math.atan2(-f,i))):"YZX"===b?(this.z=Math.asin(c(h)),0.99999>Math.abs(h)?(this.x=Math.atan2(-k,i),this.y=Math.atan2(-l,e)):(this.x=0,this.y=Math.atan2(g,d))):"XZY"===b&&(this.z=Math.asin(-c(f)),0.99999>Math.abs(f)?(this.x=Math.atan2(m,i),this.y=Math.atan2(g,e)):(this.x=Math.atan2(-k, -d),this.y=0));return this},setEulerFromQuaternion:function(a,b){function c(a){return Math.min(Math.max(a,-1),1)}var d=a.x*a.x,e=a.y*a.y,f=a.z*a.z,g=a.w*a.w;void 0===b||"XYZ"===b?(this.x=Math.atan2(2*(a.x*a.w-a.y*a.z),g-d-e+f),this.y=Math.asin(c(2*(a.x*a.z+a.y*a.w))),this.z=Math.atan2(2*(a.z*a.w-a.x*a.y),g+d-e-f)):"YXZ"===b?(this.x=Math.asin(c(2*(a.x*a.w-a.y*a.z))),this.y=Math.atan2(2*(a.x*a.z+a.y*a.w),g-d-e+f),this.z=Math.atan2(2*(a.x*a.y+a.z*a.w),g-d+e-f)):"ZXY"===b?(this.x=Math.asin(c(2*(a.x*a.w+ -a.y*a.z))),this.y=Math.atan2(2*(a.y*a.w-a.z*a.x),g-d-e+f),this.z=Math.atan2(2*(a.z*a.w-a.x*a.y),g-d+e-f)):"ZYX"===b?(this.x=Math.atan2(2*(a.x*a.w+a.z*a.y),g-d-e+f),this.y=Math.asin(c(2*(a.y*a.w-a.x*a.z))),this.z=Math.atan2(2*(a.x*a.y+a.z*a.w),g+d-e-f)):"YZX"===b?(this.x=Math.atan2(2*(a.x*a.w-a.z*a.y),g-d+e-f),this.y=Math.atan2(2*(a.y*a.w-a.x*a.z),g+d-e-f),this.z=Math.asin(c(2*(a.x*a.y+a.z*a.w)))):"XZY"===b&&(this.x=Math.atan2(2*(a.x*a.w+a.y*a.z),g-d+e-f),this.y=Math.atan2(2*(a.x*a.z+a.y*a.w),g+d- -e-f),this.z=Math.asin(c(2*(a.z*a.w-a.x*a.y))));return this},getScaleFromMatrix:function(a){var b=this.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length(),a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a;return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},toArray:function(){return[this.x,this.y,this.z]},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}});THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}; -THREE.extend(THREE.Vector4.prototype,{set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y; -case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector4's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a, -b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector4's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b= -this.x,c=this.y,d=this.z,e=this.w,a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){0!==a?(this.x/=a,this.y/=a,this.z/=a,this.w/=a):(this.z=this.y=this.x=0,this.w=1);return this},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this}, -setAxisAngleFromRotationMatrix:function(a){var b,c,d,a=a.elements,e=a[0];d=a[4];var f=a[8],g=a[1],h=a[5],i=a[9];c=a[2];b=a[6];var k=a[10];if(0.01>Math.abs(d-g)&&0.01>Math.abs(f-c)&&0.01>Math.abs(i-b)){if(0.1>Math.abs(d+g)&&0.1>Math.abs(f+c)&&0.1>Math.abs(i+b)&&0.1>Math.abs(e+h+k-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;k=(k+1)/2;d=(d+g)/4;f=(f+c)/4;i=(i+b)/4;e>h&&e>k?0.01>e?(b=0,d=c=0.707106781):(b=Math.sqrt(e),c=d/b,d=f/b):h>k?0.01>h?(b=0.707106781,c=0,d=0.707106781):(c=Math.sqrt(h), -b=d/c,d=i/c):0.01>k?(c=b=0.707106781,d=0):(d=Math.sqrt(k),b=f/d,c=i/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-i)*(b-i)+(f-c)*(f-c)+(g-d)*(g-d));0.001>Math.abs(a)&&(a=1);this.x=(b-i)/a;this.y=(f-c)/a;this.z=(g-d)/a;this.w=Math.acos((e+h+k-1)/2);return this},min:function(a){this.x>a.x&&(this.x=a.x);this.y>a.y&&(this.y=a.y);this.z>a.z&&(this.z=a.z);this.w>a.w&&(this.w=a.w);return this},max:function(a){this.xb.x&&(this.x=b.x);this.yb.y&&(this.y=b.y);this.zb.z&&(this.z=b.z);this.wb.w&&(this.w=b.w);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+ -this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},toArray:function(){return[this.x, -this.y,this.z,this.w]},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}});THREE.Line3=function(a,b){this.start=void 0!==a?a:new THREE.Vector3;this.end=void 0!==b?b:new THREE.Vector3}; -THREE.extend(THREE.Line3.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},center:function(a){return(a||new THREE.Vector3).addVectors(this.start,this.end).multiplyScalar(0.5)},delta:function(a){return(a||new THREE.Vector3).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a, -b){var c=b||new THREE.Vector3;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=THREE.Math.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new THREE.Vector3;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a); -this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)},clone:function(){return(new THREE.Line3).copy(this)}});THREE.Box2=function(a,b){this.min=void 0!==a?a:new THREE.Vector2(Infinity,Infinity);this.max=void 0!==b?b:new THREE.Vector2(-Infinity,-Infinity)}; -THREE.extend(THREE.Box2.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){if(0this.max.x&&(this.max.x=b.x),b.ythis.max.y&&(this.max.y=b.y)}else this.makeEmpty();return this},setFromCenterAndSize:function(){var a=new THREE.Vector2;return function(b,c){var d=a.copy(c).multiplyScalar(0.5);this.min.copy(b).sub(d); -this.max.copy(b).add(d);return this}}(),copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},empty:function(){return this.max.xthis.max.x||a.ythis.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y?!0:!1},getParameter:function(a){return new THREE.Vector2((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/ -(this.max.y-this.min.y))},isIntersectionBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y?!1:!0},clampPoint:function(a,b){return(b||new THREE.Vector2).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new THREE.Vector2;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max); -return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)},clone:function(){return(new THREE.Box2).copy(this)}});THREE.Box3=function(a,b){this.min=void 0!==a?a:new THREE.Vector3(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new THREE.Vector3(-Infinity,-Infinity,-Infinity)}; -THREE.extend(THREE.Box3.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){if(0this.max.x&&(this.max.x=b.x),b.ythis.max.y&&(this.max.y=b.y),b.zthis.max.z&&(this.max.z=b.z)}else this.makeEmpty();return this},setFromCenterAndSize:function(){var a=new THREE.Vector3; -return function(b,c){var d=a.copy(c).multiplyScalar(0.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},empty:function(){return this.max.xthis.max.x||a.ythis.max.y||a.zthis.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<= -this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z?!0:!1},getParameter:function(a){return new THREE.Vector3((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},isIntersectionBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y||a.max.zthis.max.z?!1:!0},clampPoint:function(a,b){return(b||new THREE.Vector3).copy(a).clamp(this.min, -this.max)},distanceToPoint:function(){var a=new THREE.Vector3;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new THREE.Vector3;return function(b){b=b||new THREE.Sphere;b.center=this.center();b.radius=0.5*this.size(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new THREE.Vector3, -new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];return function(b){a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x, -this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.makeEmpty();this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)},clone:function(){return(new THREE.Box3).copy(this)}});THREE.Matrix3=function(a,b,c,d,e,f,g,h,i){this.elements=new Float32Array(9);this.set(void 0!==a?a:1,b||0,c||0,d||0,void 0!==e?e:1,f||0,g||0,h||0,void 0!==i?i:1)}; -THREE.extend(THREE.Matrix3.prototype,{set:function(a,b,c,d,e,f,g,h,i){var k=this.elements;k[0]=a;k[3]=b;k[6]=c;k[1]=d;k[4]=e;k[7]=f;k[2]=g;k[5]=h;k[8]=i;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[3],a[6],a[1],a[4],a[7],a[2],a[5],a[8]);return this},multiplyVector3:function(a){console.warn("DEPRECATED: Matrix3's .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(){var a= -new THREE.Vector3;return function(b){for(var c=0,d=b.length;c=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)- -this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new THREE.Vector3;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));return d},getBoundingBox:function(a){a=a||new THREE.Box3;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a); -this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius},clone:function(){return(new THREE.Sphere).copy(this)}});THREE.Frustum=function(a,b,c,d,e,f){this.planes=[void 0!==a?a:new THREE.Plane,void 0!==b?b:new THREE.Plane,void 0!==c?c:new THREE.Plane,void 0!==d?d:new THREE.Plane,void 0!==e?e:new THREE.Plane,void 0!==f?f:new THREE.Plane]}; -THREE.extend(THREE.Frustum.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements,a=c[0],d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],i=c[6],k=c[7],l=c[8],m=c[9],n=c[10],s=c[11],r=c[12],p=c[13],q=c[14],c=c[15];b[0].setComponents(f-a,k-g,s-l,c-r).normalize();b[1].setComponents(f+ -a,k+g,s+l,c+r).normalize();b[2].setComponents(f+d,k+h,s+m,c+p).normalize();b[3].setComponents(f-d,k-h,s-m,c-p).normalize();b[4].setComponents(f-e,k-i,s-n,c-q).normalize();b[5].setComponents(f+e,k+i,s+n,c+q).normalize();return this},intersectsObject:function(){var a=new THREE.Vector3;return function(b){var c=b.matrixWorld,d=this.planes,b=-b.geometry.boundingSphere.radius*c.getMaxScaleOnAxis();a.getPositionFromMatrix(c);for(c=0;6>c;c++)if(d[c].distanceToPoint(a)d;d++)if(b[d].distanceToPoint(c)c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0},clone:function(){return(new THREE.Frustum).copy(this)}});THREE.Plane=function(a,b){this.normal=void 0!==a?a:new THREE.Vector3(1,0,0);this.constant=void 0!==b?b:0}; -THREE.extend(THREE.Plane.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(), -copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return this.orthoPoint(a,b).sub(a).negate()},orthoPoint:function(a, -b){var c=this.distanceToPoint(a);return(b||new THREE.Vector3).copy(this.normal).multiplyScalar(c)},isIntersectionLine:function(a){var b=this.distanceToPoint(a.start),a=this.distanceToPoint(a.end);return 0>b&&0a&&0f||1c?c:a},clampBottom:function(a,b){return a=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a, -b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return 0>a?-1:0this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1: -f+2;k=this.points[c[0]];l=this.points[c[1]];m=this.points[c[2]];n=this.points[c[3]];h=g*g;i=g*h;d.x=b(k.x,l.x,m.x,n.x,g,h,i);d.y=b(k.y,l.y,m.y,n.y,g,h,i);d.z=b(k.z,l.z,m.z,n.z,g,h,i);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a=b.x+b.y}}(); -THREE.extend(THREE.Triangle.prototype,{constructor:THREE.Triangle,set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return 0.5*a.cross(b).length()}}(), -midpoint:function(a){return(a||new THREE.Vector3).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return THREE.Triangle.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new THREE.Plane).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return THREE.Triangle.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return THREE.Triangle.containsPoint(a,this.a,this.b,this.c)},equals:function(a){return a.a.equals(this.a)&& -a.b.equals(this.b)&&a.c.equals(this.c)},clone:function(){return(new THREE.Triangle).copy(this)}});THREE.Vertex=function(a){console.warn("THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.");return a};THREE.UV=function(a,b){console.warn("THREE.UV has been DEPRECATED. Use THREE.Vector2 instead.");return new THREE.Vector2(a,b)};THREE.Clock=function(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}; -THREE.extend(THREE.Clock.prototype,{start:function(){this.oldTime=this.startTime=void 0!==window.performance&&void 0!==window.performance.now?window.performance.now():Date.now();this.running=!0},stop:function(){this.getElapsedTime();this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=void 0!==window.performance&&void 0!==window.performance.now?window.performance.now():Date.now(), -a=0.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime+=a}return a}});THREE.EventDispatcher=function(){var a={};this.addEventListener=function(b,c){void 0===a[b]&&(a[b]=[]);-1===a[b].indexOf(c)&&a[b].push(c)};this.removeEventListener=function(b,c){var d=a[b].indexOf(c);-1!==d&&a[b].splice(d,1)};this.dispatchEvent=function(b){var c=a[b.type];if(void 0!==c){b.target=this;for(var d=0,e=c.length;dh.scale.x)return k;k.push({distance:i,point:h.position,face:null,object:h})}else if(h instanceof -a.Mesh){f.getPositionFromMatrix(h.matrixWorld);b.set(f,h.geometry.boundingSphere.radius*h.matrixWorld.getMaxScaleOnAxis());if(!i.ray.isIntersectionSphere(b))return k;var s=h.geometry,r=s.vertices,p=h.material instanceof a.MeshFaceMaterial,q=!0===p?h.material.materials:null,y=h.material.side,v,z,t,A=i.precision;h.matrixRotationWorld.extractRotation(h.matrixWorld);g.getInverse(h.matrixWorld);c.copy(i.ray).applyMatrix4(g);for(var I=0,C=s.faces.length;IG)){y=y.side;if(y!==a.DoubleSide&&(v=c.direction.dot(d.normal),!(y===a.FrontSide?0>v:0i.far)){e=c.at(G,e);if(x instanceof a.Face3){if(y=r[x.a],v=r[x.b],z=r[x.c],!a.Triangle.containsPoint(e,y,v,z))continue}else if(x instanceof a.Face4){if(y=r[x.a],v=r[x.b],z=r[x.c],t=r[x.d],!a.Triangle.containsPoint(e,y,v,t)&&!a.Triangle.containsPoint(e,v,z,t))continue}else throw Error("face type not supported"); -k.push({distance:G,point:i.ray.at(G),face:x,faceIndex:I,object:h})}}}}}},k=function(a,b,c){for(var a=a.getDescendants(),d=0,e=a.length;de&&0>f||0>g&&0>h)return!1;0>e?c=Math.max(c,e/(e-f)):0>f&&(d=Math.min(d,e/(e-f)));0>g?c=Math.max(c,g/(g-h)):0>h&&(d=Math.min(d,g/(g-h)));if(d< -c)return!1;a.lerp(b,c);b.lerp(a,1-d);return!0}var e,f,g=[],h=0,i,k,l=[],m=0,n,s,r=[],p=0,q,y=[],v=0,z,t,A=[],I=0,C,x,G=[],J=0,E={objects:[],sprites:[],lights:[],elements:[]},H=new THREE.Vector3,B=new THREE.Vector4,W=new THREE.Box3(new THREE.Vector3(-1,-1,-1),new THREE.Vector3(1,1,1)),F=new THREE.Box3,K=Array(3),L=Array(4),U=new THREE.Matrix4,fa=new THREE.Matrix4,Ca,$a=new THREE.Matrix4,M=new THREE.Matrix3,ca=new THREE.Matrix3,qa=new THREE.Vector3,ha=new THREE.Frustum,ra=new THREE.Vector4,N=new THREE.Vector4; -this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);fa.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);return a.applyProjection(fa)};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);fa.multiplyMatrices(b.matrixWorld,b.projectionMatrixInverse);return a.applyProjection(fa)};this.pickingRay=function(a,b){a.z=-1;var c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.sub(a).normalize();return new THREE.Raycaster(a, -c)};this.projectScene=function(g,h,m,Pa){var ta=!1,ka,aa,pa,Y,da,la,Z,oa,gb,nb,ia,Wa,ab;x=t=q=s=0;E.elements.length=0;g.updateMatrixWorld();void 0===h.parent&&h.updateMatrixWorld();U.copy(h.matrixWorldInverse.getInverse(h.matrixWorld));fa.multiplyMatrices(h.projectionMatrix,U);ca.getInverse(U);ca.transpose();ha.setFromMatrix(fa);f=0;E.objects.length=0;E.sprites.length=0;E.lights.length=0;var Fa=function(b){for(var c=0,d=b.children.length;ci.positionScreen.x||1i.positionScreen.y||1i.positionScreen.z||1(Z.positionScreen.x-Y.positionScreen.x)*(da.positionScreen.y-Y.positionScreen.y)-(Z.positionScreen.y-Y.positionScreen.y)*(da.positionScreen.x-Y.positionScreen.x),la===THREE.DoubleSide||ta===(la===THREE.FrontSide))s===p?(ia=new THREE.RenderableFace3,r.push(ia),p++,s++,n=ia):n=r[s++],n.v1.copy(Y),n.v2.copy(da),n.v3.copy(Z);else continue; -else continue;else if(aa instanceof THREE.Face4)if(Y=l[aa.a],da=l[aa.b],Z=l[aa.c],ia=l[aa.d],L[0]=Y.positionScreen,L[1]=da.positionScreen,L[2]=Z.positionScreen,L[3]=ia.positionScreen,!0===Y.visible||!0===da.visible||!0===Z.visible||!0===ia.visible||W.isIntersectionBox(F.setFromPoints(L)))if(ta=0>(ia.positionScreen.x-Y.positionScreen.x)*(da.positionScreen.y-Y.positionScreen.y)-(ia.positionScreen.y-Y.positionScreen.y)*(da.positionScreen.x-Y.positionScreen.x)||0>(da.positionScreen.x-Z.positionScreen.x)* -(ia.positionScreen.y-Z.positionScreen.y)-(da.positionScreen.y-Z.positionScreen.y)*(ia.positionScreen.x-Z.positionScreen.x),la===THREE.DoubleSide||ta===(la===THREE.FrontSide)){if(q===v){var ub=new THREE.RenderableFace4;y.push(ub);v++;q++;n=ub}else n=y[q++];n.v1.copy(Y);n.v2.copy(da);n.v3.copy(Z);n.v4.copy(ia)}else continue;else continue;n.normalModel.copy(aa.normal);!1===ta&&(la===THREE.BackSide||la===THREE.DoubleSide)&&n.normalModel.negate();n.normalModel.applyMatrix3(M).normalize();n.normalModelView.copy(n.normalModel).applyMatrix3(ca); -n.centroidModel.copy(aa.centroid).applyMatrix4(Ca);Z=aa.vertexNormals;Y=0;for(da=Z.length;YB.z&&(x===J?(ta=new THREE.RenderableParticle,G.push(ta),J++,x++,C=ta):C=G[x++],C.object=oa,C.x=B.x/B.w,C.y=B.y/B.w,C.z=B.z,C.rotation=oa.rotation.z,C.scale.x=oa.scale.x*Math.abs(C.x-(B.x+h.projectionMatrix.elements[0])/ -(B.w+h.projectionMatrix.elements[12])),C.scale.y=oa.scale.y*Math.abs(C.y-(B.y+h.projectionMatrix.elements[5])/(B.w+h.projectionMatrix.elements[13])),C.material=oa.material,E.elements.push(C)));!0===Pa&&E.elements.sort(c);return E}};THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=void 0!==f?f:0;this.centroid=new THREE.Vector3}; -THREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;be?-1:1,f.vertexTangents[d]=new THREE.Vector4(B.x,B.y,B.z,e)}this.hasTangents=!0},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;ci;i++)if(h[i]==h[(i+1)%3]){e.push(f);break}}else if(a instanceof THREE.Face4){a.a=c[a.a];a.b=c[a.b];a.c=c[a.c];a.d=c[a.d];h=[a.a,a.b,a.c,a.d];d=-1;for(i=0;4>i;i++)h[i]==h[(i+1)%4]&&(0<=d&&e.push(f),d=i);if(0<=d){h.splice(d,1);var l=new THREE.Face3(h[0],h[1],h[2],a.normal,a.color,a.materialIndex);h=0;for(i=this.faceVertexUvs.length;hb.max.x&&(b.max.x=c),db.max.y&&(b.max.y=d),eb.max.z&&(b.max.z=e)}if(void 0===a||0===a.length)this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere= -new THREE.Sphere);var a=this.attributes.position.array;if(a){for(var b,c=0,d,e,f=0,g=a.length;fc&&(c=b);this.boundingSphere.radius=Math.sqrt(c)}},computeVertexNormals:function(){if(this.attributes.position){var a,b,c,d;a=this.attributes.position.array.length;if(void 0===this.attributes.normal)this.attributes.normal={itemSize:3,array:new Float32Array(a),numItems:a};else{a=0;for(b=this.attributes.normal.array.length;aqa?-1:1;h[4*a]=U.x;h[4*a+1]=U.y;h[4*a+2]=U.z;h[4*a+3]=M}if(void 0===this.attributes.index||void 0===this.attributes.position|| -void 0===this.attributes.normal||void 0===this.attributes.uv)console.warn("Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()");else{var b=this.attributes.index.array,c=this.attributes.position.array,d=this.attributes.normal.array,e=this.attributes.uv.array,f=c.length/3;if(void 0===this.attributes.tangent){var g=4*f;this.attributes.tangent={itemSize:4,array:new Float32Array(g),numItems:g}}for(var h=this.attributes.tangent.array,i=[],k=[],g=0;ga.length?".":a.join("/"))+"/"},initMaterials:function(a,b){for(var c=[],d=0;da.opacity)i.transparent=a.transparent;void 0!==a.depthTest&&(i.depthTest=a.depthTest);void 0!==a.depthWrite&&(i.depthWrite=a.depthWrite);void 0!==a.visible&&(i.visible=a.visible);void 0!==a.flipSided&&(i.side=THREE.BackSide); -void 0!==a.doubleSided&&(i.side=THREE.DoubleSide);void 0!==a.wireframe&&(i.wireframe=a.wireframe);void 0!==a.vertexColors&&("face"===a.vertexColors?i.vertexColors=THREE.FaceColors:a.vertexColors&&(i.vertexColors=THREE.VertexColors));a.colorDiffuse?i.color=f(a.colorDiffuse):a.DbgColor&&(i.color=a.DbgColor);a.colorSpecular&&(i.specular=f(a.colorSpecular));a.colorAmbient&&(i.ambient=f(a.colorAmbient));a.transparency&&(i.opacity=a.transparency);a.specularCoef&&(i.shininess=a.specularCoef);a.mapDiffuse&& -b&&e(i,"map",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap,a.mapDiffuseAnisotropy);a.mapLight&&b&&e(i,"lightMap",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap,a.mapLightAnisotropy);a.mapBump&&b&&e(i,"bumpMap",a.mapBump,a.mapBumpRepeat,a.mapBumpOffset,a.mapBumpWrap,a.mapBumpAnisotropy);a.mapNormal&&b&&e(i,"normalMap",a.mapNormal,a.mapNormalRepeat,a.mapNormalOffset,a.mapNormalWrap,a.mapNormalAnisotropy);a.mapSpecular&&b&&e(i,"specularMap",a.mapSpecular,a.mapSpecularRepeat, -a.mapSpecularOffset,a.mapSpecularWrap,a.mapSpecularAnisotropy);a.mapBumpScale&&(i.bumpScale=a.mapBumpScale);a.mapNormal?(h=THREE.ShaderLib.normalmap,k=THREE.UniformsUtils.clone(h.uniforms),k.tNormal.value=i.normalMap,a.mapNormalFactor&&k.uNormalScale.value.set(a.mapNormalFactor,a.mapNormalFactor),i.map&&(k.tDiffuse.value=i.map,k.enableDiffuse.value=!0),i.specularMap&&(k.tSpecular.value=i.specularMap,k.enableSpecular.value=!0),i.lightMap&&(k.tAO.value=i.lightMap,k.enableAO.value=!0),k.uDiffuseColor.value.setHex(i.color), -k.uSpecularColor.value.setHex(i.specular),k.uAmbientColor.value.setHex(i.ambient),k.uShininess.value=i.shininess,void 0!==i.opacity&&(k.uOpacity.value=i.opacity),h=new THREE.ShaderMaterial({fragmentShader:h.fragmentShader,vertexShader:h.vertexShader,uniforms:k,lights:!0,fog:!0}),i.transparent&&(h.transparent=!0)):h=new THREE[h](i);void 0!==a.DbgName&&(h.name=a.DbgName);return h}};THREE.ImageLoader=function(){THREE.EventDispatcher.call(this);this.crossOrigin=null};THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b){var c=this;void 0===b&&(b=new Image);b.addEventListener("load",function(){c.dispatchEvent({type:"load",content:b})},!1);b.addEventListener("error",function(){c.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},!1);c.crossOrigin&&(b.crossOrigin=c.crossOrigin);b.src=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a);this.withCredentials=!1};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);THREE.JSONLoader.prototype.load=function(a,b,c){c=c&&"string"===typeof c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)}; -THREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(200===f.status||0===f.status){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn("THREE.JSONLoader: ["+b+"] seems to be unreachable or file there is empty");a.onLoadComplete()}else console.error("THREE.JSONLoader: Couldn't load ["+b+"] ["+f.status+"]");else f.readyState===f.LOADING?e&&(0===g&&(g=f.getResponseHeader("Content-Length")), -e({total:g,loaded:f.responseText.length})):f.readyState===f.HEADERS_RECEIVED&&(g=f.getResponseHeader("Content-Length"))};f.open("GET",b,!0);f.withCredentials=this.withCredentials;f.send(null)}; -THREE.JSONLoader.prototype.createModel=function(a,b,c){var d=new THREE.Geometry,e=void 0!==a.scale?1/a.scale:1,f,g,h,i,k,l,m,n,s,r,p,q,y,v,z,t=a.faces;r=a.vertices;var A=a.normals,I=a.colors,C=0;for(f=0;fF.parameters.opacity&& -(F.parameters.transparent=!0);F.parameters.normalMap?(E=THREE.ShaderLib.normalmap,B=THREE.UniformsUtils.clone(E.uniforms),q=F.parameters.color,W=F.parameters.specular,p=F.parameters.ambient,H=F.parameters.shininess,B.tNormal.value=x.textures[F.parameters.normalMap],F.parameters.normalScale&&B.uNormalScale.value.set(F.parameters.normalScale[0],F.parameters.normalScale[1]),F.parameters.map&&(B.tDiffuse.value=F.parameters.map,B.enableDiffuse.value=!0),F.parameters.envMap&&(B.tCube.value=F.parameters.envMap, -B.enableReflection.value=!0,B.uReflectivity.value=F.parameters.reflectivity),F.parameters.lightMap&&(B.tAO.value=F.parameters.lightMap,B.enableAO.value=!0),F.parameters.specularMap&&(B.tSpecular.value=x.textures[F.parameters.specularMap],B.enableSpecular.value=!0),F.parameters.displacementMap&&(B.tDisplacement.value=x.textures[F.parameters.displacementMap],B.enableDisplacement.value=!0,B.uDisplacementBias.value=F.parameters.displacementBias,B.uDisplacementScale.value=F.parameters.displacementScale), -B.uDiffuseColor.value.setHex(q),B.uSpecularColor.value.setHex(W),B.uAmbientColor.value.setHex(p),B.uShininess.value=H,F.parameters.opacity&&(B.uOpacity.value=F.parameters.opacity),s=new THREE.ShaderMaterial({fragmentShader:E.fragmentShader,vertexShader:E.vertexShader,uniforms:B,lights:!0,fog:!0})):s=new THREE[F.type](F.parameters);x.materials[K]=s}for(K in J.materials)if(F=J.materials[K],F.parameters.materials){L=[];for(q=0;qh.end&&(h.end=e);b||(b=g)}}a.firstAnimation=b}; -THREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){this.geometry.animations||(this.geometry.animations={});this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];c?(this.setFrameRange(c.start,c.end),this.duration=1E3*((c.end-c.start)/b),this.time=0):console.warn("animation["+a+"] undefined")}; -THREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time+=this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||0>this.time)this.direction*=-1,this.time>this.duration&&(this.time=this.duration,this.directionBackwards=!0),0>this.time&&(this.time=0,this.directionBackwards=!1)}else this.time%=this.duration,0>this.time&&(this.time+=this.duration);a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/b),0,this.length-1);a!==this.currentKeyframe&& -(this.morphTargetInfluences[this.lastKeyframe]=0,this.morphTargetInfluences[this.currentKeyframe]=1,this.morphTargetInfluences[a]=0,this.lastKeyframe=this.currentKeyframe,this.currentKeyframe=a);b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b}; -THREE.MorphAnimMesh.prototype.clone=function(a){void 0===a&&(a=new THREE.MorphAnimMesh(this.geometry,this.material));a.duration=this.duration;a.mirroredLoop=this.mirroredLoop;a.time=this.time;a.lastKeyframe=this.lastKeyframe;a.currentKeyframe=this.currentKeyframe;a.direction=this.direction;a.directionBackwards=this.directionBackwards;THREE.Mesh.prototype.clone.call(this,a);return a};THREE.Ribbon=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b};THREE.Ribbon.prototype=Object.create(THREE.Object3D.prototype);THREE.Ribbon.prototype.clone=function(a){void 0===a&&(a=new THREE.Ribbon(this.geometry,this.material));THREE.Object3D.prototype.clone.call(this,a);return a};THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=Object.create(THREE.Object3D.prototype);THREE.LOD.prototype.addLevel=function(a,b){void 0===b&&(b=0);for(var b=Math.abs(b),c=0;c=this.LODs[b].visibleAtDistance)this.LODs[b-1].object3D.visible=!1,this.LODs[b].object3D.visible=!0;else break;for(;bI&&t.clearRect(Ka.min.x|0,Ka.min.y|0,Ka.max.x-Ka.min.x|0,Ka.max.y-Ka.min.y|0),0=j||(j*=f.intensity,c.add(gb.multiplyScalar(j)))}else f instanceof THREE.PointLight&&(g=bb.getPositionFromMatrix(f.matrixWorld),j=b.dot(bb.subVectors(g,a).normalize()),0>=j||(j*=0==f.distance?1:1-Math.min(a.distanceTo(g)/f.distance,1),0!=j&&(j*=f.intensity,c.add(gb.multiplyScalar(j)))))}}function x(a,d,e,f,g,j,h,i){l.info.render.vertices+= -3;l.info.render.faces++;b(i.opacity);c(i.blending);M=a.positionScreen.x;ca=a.positionScreen.y;qa=d.positionScreen.x;ha=d.positionScreen.y;ra=e.positionScreen.x;N=e.positionScreen.y;y(M,ca,qa,ha,ra,N);(i instanceof THREE.MeshLambertMaterial||i instanceof THREE.MeshPhongMaterial)&&null===i.map?(Z.copy(i.color),oa.copy(i.emissive),i.vertexColors===THREE.FaceColors&&Z.multiply(h.color),!0===gc?!1===i.wireframe&&i.shading==THREE.SmoothShading&&3==h.vertexNormalsLength?(pa.copy(vb),Y.copy(vb),da.copy(vb), -q(h.v1.positionWorld,h.vertexNormalsModel[0],pa),q(h.v2.positionWorld,h.vertexNormalsModel[1],Y),q(h.v3.positionWorld,h.vertexNormalsModel[2],da),pa.multiply(Z).add(oa),Y.multiply(Z).add(oa),da.multiply(Z).add(oa),la.addColors(Y,da).multiplyScalar(0.5),Fa=E(pa,Y,da,la),G(M,ca,qa,ha,ra,N,0,0,1,0,0,1,Fa)):(aa.copy(vb),q(h.centroidModel,h.normalModel,aa),aa.multiply(Z).add(oa),!0===i.wireframe?C(aa,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):A(aa)):!0===i.wireframe?C(i.color,i.wireframeLinewidth, -i.wireframeLinecap,i.wireframeLinejoin):A(i.color)):i instanceof THREE.MeshBasicMaterial||i instanceof THREE.MeshLambertMaterial||i instanceof THREE.MeshPhongMaterial?null!==i.map?i.map.mapping instanceof THREE.UVMapping&&(Xa=h.uvs[0],F(M,ca,qa,ha,ra,N,Xa[f].x,Xa[f].y,Xa[g].x,Xa[g].y,Xa[j].x,Xa[j].y,i.map)):null!==i.envMap?i.envMap.mapping instanceof THREE.SphericalReflectionMapping&&(bb.copy(h.vertexNormalsModelView[f]),ub=0.5*bb.x+0.5,Ib=0.5*bb.y+0.5,bb.copy(h.vertexNormalsModelView[g]),Jb=0.5* -bb.x+0.5,fc=0.5*bb.y+0.5,bb.copy(h.vertexNormalsModelView[j]),Ab=0.5*bb.x+0.5,mc=0.5*bb.y+0.5,F(M,ca,qa,ha,ra,N,ub,Ib,Jb,fc,Ab,mc,i.envMap)):(aa.copy(i.color),i.vertexColors===THREE.FaceColors&&aa.multiply(h.color),!0===i.wireframe?C(aa,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):A(aa)):i instanceof THREE.MeshDepthMaterial?(Wa=p.near,ab=p.far,pa.r=pa.g=pa.b=1-k(a.positionScreen.z*a.positionScreen.w,Wa,ab),Y.r=Y.g=Y.b=1-k(d.positionScreen.z*d.positionScreen.w,Wa,ab),da.r=da.g=da.b= -1-k(e.positionScreen.z*e.positionScreen.w,Wa,ab),la.addColors(Y,da).multiplyScalar(0.5),Fa=E(pa,Y,da,la),G(M,ca,qa,ha,ra,N,0,0,1,0,0,1,Fa)):i instanceof THREE.MeshNormalMaterial&&(i.shading==THREE.FlatShading?(a=h.normalModelView,aa.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),!0===i.wireframe?C(aa,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):A(aa)):i.shading==THREE.SmoothShading&&(a=h.vertexNormalsModelView[f],pa.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),a= -h.vertexNormalsModelView[g],Y.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),a=h.vertexNormalsModelView[j],da.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),la.addColors(Y,da).multiplyScalar(0.5),Fa=E(pa,Y,da,la),G(M,ca,qa,ha,ra,N,0,0,1,0,0,1,Fa)))}function y(a,b,c,d,e,f){t.beginPath();t.moveTo(a,b);t.lineTo(c,d);t.lineTo(e,f);t.closePath()}function B(a,b,c,d,e,f,g,j){t.beginPath();t.moveTo(a,b);t.lineTo(c,d);t.lineTo(e,f);t.lineTo(g,j);t.closePath()}function C(a,b,c,j){d(b);e(c); -f(j);g(a.getStyle());t.stroke();Va.expandByScalar(2*b)}function A(a){h(a.getStyle());t.fill()}function F(a,b,c,d,e,f,g,j,i,wa,k,l,n){if(!(n instanceof THREE.DataTexture||void 0===n.image||0==n.image.width)){if(!0===n.needsUpdate){var m=n.wrapS==THREE.RepeatWrapping,hb=n.wrapT==THREE.RepeatWrapping;nb[n.id]=t.createPattern(n.image,!0===m&&!0===hb?"repeat":!0===m&&!1===hb?"repeat-x":!1===m&&!0===hb?"repeat-y":"no-repeat");n.needsUpdate=!1}void 0===nb[n.id]?h("rgba(0,0,0,1)"):h(nb[n.id]);var m=n.offset.x/ -n.repeat.x,hb=n.offset.y/n.repeat.y,p=n.image.width*n.repeat.x,q=n.image.height*n.repeat.y,g=(g+m)*p,j=(1-j+hb)*q,c=c-a,d=d-b,e=e-a,f=f-b,i=(i+m)*p-g,wa=(1-wa+hb)*q-j,k=(k+m)*p-g,l=(1-l+hb)*q-j,m=i*l-k*wa;0===m?(void 0===ia[n.id]&&(b=document.createElement("canvas"),b.width=n.image.width,b.height=n.image.height,b=b.getContext("2d"),b.drawImage(n.image,0,0),ia[n.id]=b.getImageData(0,0,n.image.width,n.image.height).data),b=ia[n.id],g=4*(Math.floor(g)+Math.floor(j)*n.image.width),aa.setRGB(b[g]/255, -b[g+1]/255,b[g+2]/255),A(aa)):(m=1/m,n=(l*c-wa*e)*m,wa=(l*d-wa*f)*m,c=(i*e-k*c)*m,d=(i*f-k*d)*m,a=a-n*g-c*j,g=b-wa*g-d*j,t.save(),t.transform(n,wa,c,d,a,g),t.fill(),t.restore())}}function G(a,b,c,d,e,f,g,j,i,h,wa,k,n){var l,m;l=n.width-1;m=n.height-1;g*=l;j*=m;c-=a;d-=b;e-=a;f-=b;i=i*l-g;h=h*m-j;wa=wa*l-g;k=k*m-j;m=1/(i*k-wa*h);l=(k*c-h*e)*m;h=(k*d-h*f)*m;c=(i*e-wa*c)*m;d=(i*f-wa*d)*m;a=a-l*g-c*j;b=b-h*g-d*j;t.save();t.transform(l,h,c,d,a,b);t.clip();t.drawImage(n,0,0);t.restore()}function E(a,b, -c,d){Ra[0]=255*a.r|0;Ra[1]=255*a.g|0;Ra[2]=255*a.b|0;Ra[4]=255*b.r|0;Ra[5]=255*b.g|0;Ra[6]=255*b.b|0;Ra[8]=255*c.r|0;Ra[9]=255*c.g|0;Ra[10]=255*c.b|0;Ra[12]=255*d.r|0;Ra[13]=255*d.g|0;Ra[14]=255*d.b|0;j.putImageData(yb,0,0);Sa.drawImage(xb,0,0);return cb}function I(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;0!==e&&(e=1/Math.sqrt(e),c*=e,d*=e,b.x+=c,b.y+=d,a.x-=c,a.y-=d)}if(!1===p instanceof THREE.Camera)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{!0=== -this.autoClear&&this.clear();t.setTransform(1,0,0,-1,v,z);l.info.render.vertices=0;l.info.render.faces=0;m=r.projectScene(a,p,this.sortObjects,this.sortElements);n=m.elements;s=m.lights;gc=0>1,nd=H.height>>1,Cb=wa.scale.x*v,Db=wa.scale.y*z,Bb=Cb*md,hb=Db*nd,Va.min.set(X.x-Bb,X.y-hb),Va.max.set(X.x+Bb,X.y+hb),!1!==pb.isIntersectionBox(Va)&&(t.save(),t.translate(X.x,X.y),t.rotate(-wa.rotation),t.scale(Cb,-Db),t.translate(-md,-nd),t.drawImage(H,0,0),t.restore())):P instanceof THREE.ParticleCanvasMaterial&&(Bb=wa.scale.x*v,hb=wa.scale.y*z,Va.min.set(X.x-Bb,X.y-hb),Va.max.set(X.x+Bb,X.y+hb),!1!==pb.isIntersectionBox(Va)&&(g(P.color.getStyle()), -h(P.color.getStyle()),t.save(),t.translate(X.x,X.y),t.rotate(-wa.rotation),t.scale(Bb,hb),P.program(t),t.restore()))}else if(H instanceof THREE.RenderableLine)K=H.v1,L=H.v2,K.positionScreen.x*=v,K.positionScreen.y*=z,L.positionScreen.x*=v,L.positionScreen.y*=z,Va.setFromPoints([K.positionScreen,L.positionScreen]),!0===pb.isIntersectionBox(Va)&&(X=K,wa=L,b(P.opacity),c(P.blending),t.beginPath(),t.moveTo(X.positionScreen.x,X.positionScreen.y),t.lineTo(wa.positionScreen.x,wa.positionScreen.y),P instanceof -THREE.LineBasicMaterial?(d(P.linewidth),e(P.linecap),f(P.linejoin),g(P.color.getStyle()),i(null,null),t.stroke(),Va.expandByScalar(2*P.linewidth)):P instanceof THREE.LineDashedMaterial&&(d(P.linewidth),e(P.linecap),f(P.linejoin),g(P.color.getStyle()),i(P.dashSize,P.gapSize),t.stroke(),Va.expandByScalar(2*P.linewidth)));else if(H instanceof THREE.RenderableFace3){K=H.v1;L=H.v2;U=H.v3;if(-1>K.positionScreen.z||1L.positionScreen.z||1 -U.positionScreen.z||1K.positionScreen.z|| -1L.positionScreen.z||1U.positionScreen.z||1fa.positionScreen.z||1 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_HEMI_LIGHTS > 0\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif", -lights_lambert_vertex:"vLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\nvLightBack = vec3( 0.0 );\n#endif\ntransformedNormal = normalize( transformedNormal );\n#if MAX_DIR_LIGHTS > 0\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( transformedNormal, dirVector );\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\n#ifdef DOUBLE_SIDED\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\n#endif\n}\n#endif\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\nfloat dotProduct = dot( transformedNormal, lVector );\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\n#ifdef DOUBLE_SIDED\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - worldPosition.xyz ) );\nif ( spotEffect > spotLightAngleCos[ i ] ) {\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\nfloat dotProduct = dot( transformedNormal, lVector );\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\n#ifdef DOUBLE_SIDED\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_HEMI_LIGHTS > 0\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\nvec3 lVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( transformedNormal, lVector );\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\nfloat hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;\nvLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n#ifdef DOUBLE_SIDED\nvLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\n#endif\n}\n#endif\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\n#ifdef DOUBLE_SIDED\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\n#endif", -lights_phong_pars_vertex:"#ifndef PHONG_PER_PIXEL\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\nvarying vec3 vWorldPosition;\n#endif", -lights_phong_vertex:"#ifndef PHONG_PER_PIXEL\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nvPointLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nvSpotLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\nvWorldPosition = worldPosition.xyz;\n#endif", -lights_phong_pars_fragment:"uniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_HEMI_LIGHTS > 0\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n#ifdef PHONG_PER_PIXEL\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#else\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n#ifdef PHONG_PER_PIXEL\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n#else\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\nvarying vec3 vWorldPosition;\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;", -lights_phong_fragment:"vec3 normal = normalize( vNormal );\nvec3 viewPosition = normalize( vViewPosition );\n#ifdef DOUBLE_SIDED\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n#endif\n#ifdef USE_NORMALMAP\nnormal = perturbNormal2Arb( -viewPosition, normal );\n#elif defined( USE_BUMPMAP )\nnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n#if MAX_POINT_LIGHTS > 0\nvec3 pointDiffuse = vec3( 0.0 );\nvec3 pointSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n#ifdef PHONG_PER_PIXEL\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#else\nvec3 lVector = normalize( vPointLight[ i ].xyz );\nfloat lDistance = vPointLight[ i ].w;\n#endif\nfloat dotProduct = dot( normal, lVector );\n#ifdef WRAP_AROUND\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n#else\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\n#endif\npointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\nvec3 pointHalfVector = normalize( lVector + viewPosition );\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\nfloat pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\n#else\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nvec3 spotDiffuse = vec3( 0.0 );\nvec3 spotSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n#ifdef PHONG_PER_PIXEL\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#else\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\nfloat lDistance = vSpotLight[ i ].w;\n#endif\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\nif ( spotEffect > spotLightAngleCos[ i ] ) {\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\nfloat dotProduct = dot( normal, lVector );\n#ifdef WRAP_AROUND\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\n#else\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\n#endif\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\nvec3 spotHalfVector = normalize( lVector + viewPosition );\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\nfloat spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\n#else\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec3 dirDiffuse = vec3( 0.0 );\nvec3 dirSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, dirVector );\n#ifdef WRAP_AROUND\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\n#else\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\n#endif\ndirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\nfloat dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\n#else\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_HEMI_LIGHTS > 0\nvec3 hemiDiffuse = vec3( 0.0 );\nvec3 hemiSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\nvec3 lVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, lVector );\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\nvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\nhemiDiffuse += diffuse * hemiColor;\nvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\nfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\nfloat hemiSpecularWeightSky = specularStrength * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );\nvec3 lVectorGround = -lVector;\nvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\nfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\nfloat hemiSpecularWeightGround = specularStrength * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat dotProductGround = dot( normal, lVectorGround );\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );\nvec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\nhemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\n#else\nhemiSpecular += specular * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;\n#endif\n}\n#endif\nvec3 totalDiffuse = vec3( 0.0 );\nvec3 totalSpecular = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\ntotalDiffuse += dirDiffuse;\ntotalSpecular += dirSpecular;\n#endif\n#if MAX_HEMI_LIGHTS > 0\ntotalDiffuse += hemiDiffuse;\ntotalSpecular += hemiSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalDiffuse += pointDiffuse;\ntotalSpecular += pointSpecular;\n#endif\n#if MAX_SPOT_LIGHTS > 0\ntotalDiffuse += spotDiffuse;\ntotalSpecular += spotSpecular;\n#endif\n#ifdef METAL\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\n#endif", -color_pars_fragment:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_fragment:"#ifdef USE_COLOR\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\n#endif",color_pars_vertex:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n#ifdef GAMMA_INPUT\nvColor = color * color;\n#else\nvColor = color;\n#endif\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n#ifdef BONE_TEXTURE\nuniform sampler2D boneTexture;\nmat4 getBoneMatrix( const in float i ) {\nfloat j = i * 4.0;\nfloat x = mod( j, N_BONE_PIXEL_X );\nfloat y = floor( j / N_BONE_PIXEL_X );\nconst float dx = 1.0 / N_BONE_PIXEL_X;\nconst float dy = 1.0 / N_BONE_PIXEL_Y;\ny = dy * ( y + 0.5 );\nvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\nvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\nvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\nvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\nmat4 bone = mat4( v1, v2, v3, v4 );\nreturn bone;\n}\n#else\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\nmat4 getBoneMatrix( const in float i ) {\nmat4 bone = boneGlobalMatrices[ int(i) ];\nreturn bone;\n}\n#endif\n#endif", -skinbase_vertex:"#ifdef USE_SKINNING\nmat4 boneMatX = getBoneMatrix( skinIndex.x );\nmat4 boneMatY = getBoneMatrix( skinIndex.y );\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n#ifdef USE_MORPHTARGETS\nvec4 skinVertex = vec4( morphed, 1.0 );\n#else\nvec4 skinVertex = vec4( position, 1.0 );\n#endif\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\nskinned \t += boneMatY * skinVertex * skinWeight.y;\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n#ifndef USE_MORPHNORMALS\nuniform float morphTargetInfluences[ 8 ];\n#else\nuniform float morphTargetInfluences[ 4 ];\n#endif\n#endif", -morphtarget_vertex:"#ifdef USE_MORPHTARGETS\nvec3 morphed = vec3( 0.0 );\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n#ifndef USE_MORPHNORMALS\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n#endif\nmorphed += position;\n#endif", -default_vertex:"vec4 mvPosition;\n#ifdef USE_SKINNING\nmvPosition = modelViewMatrix * skinned;\n#endif\n#if !defined( USE_SKINNING ) && defined( USE_MORPHTARGETS )\nmvPosition = modelViewMatrix * vec4( morphed, 1.0 );\n#endif\n#if !defined( USE_SKINNING ) && ! defined( USE_MORPHTARGETS )\nmvPosition = modelViewMatrix * vec4( position, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\nvec3 morphedNormal = vec3( 0.0 );\nmorphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\nmorphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\nmorphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\nmorphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\nmorphedNormal += normal;\n#endif", -skinnormal_vertex:"#ifdef USE_SKINNING\nmat4 skinMatrix = skinWeight.x * boneMatX;\nskinMatrix \t+= skinWeight.y * boneMatY;\n#ifdef USE_MORPHNORMALS\nvec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );\n#else\nvec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );\n#endif\n#endif",defaultnormal_vertex:"vec3 objectNormal;\n#ifdef USE_SKINNING\nobjectNormal = skinnedNormal.xyz;\n#endif\n#if !defined( USE_SKINNING ) && defined( USE_MORPHNORMALS )\nobjectNormal = morphedNormal;\n#endif\n#if !defined( USE_SKINNING ) && ! defined( USE_MORPHNORMALS )\nobjectNormal = normal;\n#endif\n#ifdef FLIP_SIDED\nobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;", -shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\nuniform float shadowDarkness[ MAX_SHADOWS ];\nuniform float shadowBias[ MAX_SHADOWS ];\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nfloat unpackDepth( const in vec4 rgba_depth ) {\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\nfloat depth = dot( rgba_depth, bit_shift );\nreturn depth;\n}\n#endif",shadowmap_fragment:"#ifdef USE_SHADOWMAP\n#ifdef SHADOWMAP_DEBUG\nvec3 frustumColors[3];\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\n#endif\n#ifdef SHADOWMAP_CASCADE\nint inFrustumCount = 0;\n#endif\nfloat fDepth;\nvec3 shadowColor = vec3( 1.0 );\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\nbool inFrustum = all( inFrustumVec );\n#ifdef SHADOWMAP_CASCADE\ninFrustumCount += int( inFrustum );\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\n#else\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n#endif\nbool frustumTest = all( frustumTestVec );\nif ( frustumTest ) {\nshadowCoord.z += shadowBias[ i ];\n#if defined( SHADOWMAP_TYPE_PCF )\nfloat shadow = 0.0;\nconst float shadowDelta = 1.0 / 9.0;\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\nfloat dx0 = -1.25 * xPixelOffset;\nfloat dy0 = -1.25 * yPixelOffset;\nfloat dx1 = 1.25 * xPixelOffset;\nfloat dy1 = 1.25 * yPixelOffset;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\nfloat shadow = 0.0;\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\nfloat dx0 = -1.0 * xPixelOffset;\nfloat dy0 = -1.0 * yPixelOffset;\nfloat dx1 = 1.0 * xPixelOffset;\nfloat dy1 = 1.0 * yPixelOffset;\nmat3 shadowKernel;\nmat3 depthKernel;\ndepthKernel[0][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\nif ( depthKernel[0][0] < shadowCoord.z ) shadowKernel[0][0] = 0.25;\nelse shadowKernel[0][0] = 0.0;\ndepthKernel[0][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\nif ( depthKernel[0][1] < shadowCoord.z ) shadowKernel[0][1] = 0.25;\nelse shadowKernel[0][1] = 0.0;\ndepthKernel[0][2] = unpackDepth( texture2D( shadowMap[ i], shadowCoord.xy + vec2( dx0, dy1 ) ) );\nif ( depthKernel[0][2] < shadowCoord.z ) shadowKernel[0][2] = 0.25;\nelse shadowKernel[0][2] = 0.0;\ndepthKernel[1][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\nif ( depthKernel[1][0] < shadowCoord.z ) shadowKernel[1][0] = 0.25;\nelse shadowKernel[1][0] = 0.0;\ndepthKernel[1][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\nif ( depthKernel[1][1] < shadowCoord.z ) shadowKernel[1][1] = 0.25;\nelse shadowKernel[1][1] = 0.0;\ndepthKernel[1][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\nif ( depthKernel[1][2] < shadowCoord.z ) shadowKernel[1][2] = 0.25;\nelse shadowKernel[1][2] = 0.0;\ndepthKernel[2][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\nif ( depthKernel[2][0] < shadowCoord.z ) shadowKernel[2][0] = 0.25;\nelse shadowKernel[2][0] = 0.0;\ndepthKernel[2][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\nif ( depthKernel[2][1] < shadowCoord.z ) shadowKernel[2][1] = 0.25;\nelse shadowKernel[2][1] = 0.0;\ndepthKernel[2][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\nif ( depthKernel[2][2] < shadowCoord.z ) shadowKernel[2][2] = 0.25;\nelse shadowKernel[2][2] = 0.0;\nvec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );\nshadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );\nshadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );\nvec4 shadowValues;\nshadowValues.x = mix( shadowKernel[0][1], shadowKernel[0][0], fractionalCoord.y );\nshadowValues.y = mix( shadowKernel[0][2], shadowKernel[0][1], fractionalCoord.y );\nshadowValues.z = mix( shadowKernel[1][1], shadowKernel[1][0], fractionalCoord.y );\nshadowValues.w = mix( shadowKernel[1][2], shadowKernel[1][1], fractionalCoord.y );\nshadow = dot( shadowValues, vec4( 1.0 ) );\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n#else\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\nfloat fDepth = unpackDepth( rgbaDepth );\nif ( fDepth < shadowCoord.z )\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\n#endif\n}\n#ifdef SHADOWMAP_DEBUG\n#ifdef SHADOWMAP_CASCADE\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\n#else\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\n#endif\n#endif\n}\n#ifdef GAMMA_OUTPUT\nshadowColor *= shadowColor;\n#endif\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\n#endif", -shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n}\n#endif",alphatest_fragment:"#ifdef ALPHATEST\nif ( gl_FragColor.a < ALPHATEST ) discard;\n#endif",linear_to_gamma_fragment:"#ifdef GAMMA_OUTPUT\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\n#endif"}; -THREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b dashSize ) {\ndiscard;\n}\ngl_FragColor = vec4( diffuse, opacity );",THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.fog_fragment,"}"].join("\n")},depth:{uniforms:{mNear:{type:"f",value:1},mFar:{type:"f",value:2E3},opacity:{type:"f", -value:1}},vertexShader:"void main() {\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"uniform float mNear;\nuniform float mFar;\nuniform float opacity;\nvoid main() {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\ngl_FragColor = vec4( vec3( color ), opacity );\n}"},normal:{uniforms:{opacity:{type:"f",value:1}},vertexShader:"varying vec3 vNormal;\nvoid main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\nvNormal = normalize( normalMatrix * normal );\ngl_Position = projectionMatrix * mvPosition;\n}", -fragmentShader:"uniform float opacity;\nvarying vec3 vNormal;\nvoid main() {\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\n}"},normalmap:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:"i",value:0},enableDiffuse:{type:"i",value:0},enableSpecular:{type:"i",value:0},enableReflection:{type:"i",value:0},enableDisplacement:{type:"i",value:0},tDisplacement:{type:"t",value:null},tDiffuse:{type:"t",value:null}, -tCube:{type:"t",value:null},tNormal:{type:"t",value:null},tSpecular:{type:"t",value:null},tAO:{type:"t",value:null},uNormalScale:{type:"v2",value:new THREE.Vector2(1,1)},uDisplacementBias:{type:"f",value:0},uDisplacementScale:{type:"f",value:1},uDiffuseColor:{type:"c",value:new THREE.Color(16777215)},uSpecularColor:{type:"c",value:new THREE.Color(1118481)},uAmbientColor:{type:"c",value:new THREE.Color(16777215)},uShininess:{type:"f",value:30},uOpacity:{type:"f",value:1},useRefract:{type:"i",value:0}, -uRefractionRatio:{type:"f",value:0.98},uReflectivity:{type:"f",value:0.5},uOffset:{type:"v2",value:new THREE.Vector2(0,0)},uRepeat:{type:"v2",value:new THREE.Vector2(1,1)},wrapRGB:{type:"v3",value:new THREE.Vector3(1,1,1)}}]),fragmentShader:["uniform vec3 uAmbientColor;\nuniform vec3 uDiffuseColor;\nuniform vec3 uSpecularColor;\nuniform float uShininess;\nuniform float uOpacity;\nuniform bool enableDiffuse;\nuniform bool enableSpecular;\nuniform bool enableAO;\nuniform bool enableReflection;\nuniform sampler2D tDiffuse;\nuniform sampler2D tNormal;\nuniform sampler2D tSpecular;\nuniform sampler2D tAO;\nuniform samplerCube tCube;\nuniform vec2 uNormalScale;\nuniform bool useRefract;\nuniform float uRefractionRatio;\nuniform float uReflectivity;\nvarying vec3 vTangent;\nvarying vec3 vBinormal;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nuniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_HEMI_LIGHTS > 0\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif\nvarying vec3 vWorldPosition;\nvarying vec3 vViewPosition;", -THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,"void main() {\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\nvec3 specularTex = vec3( 1.0 );\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\nnormalTex.xy *= uNormalScale;\nnormalTex = normalize( normalTex );\nif( enableDiffuse ) {\n#ifdef GAMMA_INPUT\nvec4 texelColor = texture2D( tDiffuse, vUv );\ntexelColor.xyz *= texelColor.xyz;\ngl_FragColor = gl_FragColor * texelColor;\n#else\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\n#endif\n}\nif( enableAO ) {\n#ifdef GAMMA_INPUT\nvec4 aoColor = texture2D( tAO, vUv );\naoColor.xyz *= aoColor.xyz;\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\n#endif\n}\nif( enableSpecular )\nspecularTex = texture2D( tSpecular, vUv ).xyz;\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\nvec3 finalNormal = tsb * normalTex;\n#ifdef FLIP_SIDED\nfinalNormal = -finalNormal;\n#endif\nvec3 normal = normalize( finalNormal );\nvec3 viewPosition = normalize( vViewPosition );\n#if MAX_POINT_LIGHTS > 0\nvec3 pointDiffuse = vec3( 0.0 );\nvec3 pointSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 pointVector = lPosition.xyz + vViewPosition.xyz;\nfloat pointDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\npointDistance = 1.0 - min( ( length( pointVector ) / pointLightDistance[ i ] ), 1.0 );\npointVector = normalize( pointVector );\n#ifdef WRAP_AROUND\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n#else\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\n#endif\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\n#else\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nvec3 spotDiffuse = vec3( 0.0 );\nvec3 spotSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 spotVector = lPosition.xyz + vViewPosition.xyz;\nfloat spotDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nspotDistance = 1.0 - min( ( length( spotVector ) / spotLightDistance[ i ] ), 1.0 );\nspotVector = normalize( spotVector );\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\nif ( spotEffect > spotLightAngleCos[ i ] ) {\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\n#ifdef WRAP_AROUND\nfloat spotDiffuseWeightFull = max( dot( normal, spotVector ), 0.0 );\nfloat spotDiffuseWeightHalf = max( 0.5 * dot( normal, spotVector ) + 0.5, 0.0 );\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\n#else\nfloat spotDiffuseWeight = max( dot( normal, spotVector ), 0.0 );\n#endif\nspotDiffuse += spotDistance * spotLightColor[ i ] * uDiffuseColor * spotDiffuseWeight * spotEffect;\nvec3 spotHalfVector = normalize( spotVector + viewPosition );\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\nfloat spotSpecularWeight = specularTex.r * max( pow( spotDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( spotVector, spotHalfVector ), 5.0 );\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;\n#else\nspotSpecular += spotDistance * spotLightColor[ i ] * uSpecularColor * spotSpecularWeight * spotDiffuseWeight * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec3 dirDiffuse = vec3( 0.0 );\nvec3 dirSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\n#ifdef WRAP_AROUND\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\n#else\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\n#endif\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\n#else\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_HEMI_LIGHTS > 0\nvec3 hemiDiffuse = vec3( 0.0 );\nvec3 hemiSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\nvec3 lVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, lVector );\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\nvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\nhemiDiffuse += uDiffuseColor * hemiColor;\nvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\nfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\nfloat hemiSpecularWeightSky = specularTex.r * max( pow( hemiDotNormalHalfSky, uShininess ), 0.0 );\nvec3 lVectorGround = -lVector;\nvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\nfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\nfloat hemiSpecularWeightGround = specularTex.r * max( pow( hemiDotNormalHalfGround, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat dotProductGround = dot( normal, lVectorGround );\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlickSky = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );\nvec3 schlickGround = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\nhemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\n#else\nhemiSpecular += uSpecularColor * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;\n#endif\n}\n#endif\nvec3 totalDiffuse = vec3( 0.0 );\nvec3 totalSpecular = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\ntotalDiffuse += dirDiffuse;\ntotalSpecular += dirSpecular;\n#endif\n#if MAX_HEMI_LIGHTS > 0\ntotalDiffuse += hemiDiffuse;\ntotalSpecular += hemiSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalDiffuse += pointDiffuse;\ntotalSpecular += pointSpecular;\n#endif\n#if MAX_SPOT_LIGHTS > 0\ntotalDiffuse += spotDiffuse;\ntotalSpecular += spotSpecular;\n#endif\n#ifdef METAL\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor + totalSpecular );\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor ) + totalSpecular;\n#endif\nif ( enableReflection ) {\nvec3 vReflect;\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\nif ( useRefract ) {\nvReflect = refract( cameraToVertex, normal, uRefractionRatio );\n} else {\nvReflect = reflect( cameraToVertex, normal );\n}\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\n#ifdef GAMMA_INPUT\ncubeColor.xyz *= cubeColor.xyz;\n#endif\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\n}", -THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,"}"].join("\n"),vertexShader:["attribute vec4 tangent;\nuniform vec2 uOffset;\nuniform vec2 uRepeat;\nuniform bool enableDisplacement;\n#ifdef VERTEX_TEXTURES\nuniform sampler2D tDisplacement;\nuniform float uDisplacementScale;\nuniform float uDisplacementBias;\n#endif\nvarying vec3 vTangent;\nvarying vec3 vBinormal;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vWorldPosition;\nvarying vec3 vViewPosition;", -THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,"void main() {",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.skinnormal_vertex,"#ifdef USE_SKINNING\nvNormal = normalize( normalMatrix * skinnedNormal.xyz );\nvec4 skinnedTangent = skinMatrix * vec4( tangent.xyz, 0.0 );\nvTangent = normalize( normalMatrix * skinnedTangent.xyz );\n#else\nvNormal = normalize( normalMatrix * normal );\nvTangent = normalize( normalMatrix * tangent.xyz );\n#endif\nvBinormal = normalize( cross( vNormal, vTangent ) * tangent.w );\nvUv = uv * uRepeat + uOffset;\nvec3 displacedPosition;\n#ifdef VERTEX_TEXTURES\nif ( enableDisplacement ) {\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\ndisplacedPosition = position + normalize( normal ) * df;\n} else {\n#ifdef USE_SKINNING\nvec4 skinVertex = vec4( position, 1.0 );\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\nskinned \t += boneMatY * skinVertex * skinWeight.y;\ndisplacedPosition = skinned.xyz;\n#else\ndisplacedPosition = position;\n#endif\n}\n#else\n#ifdef USE_SKINNING\nvec4 skinVertex = vec4( position, 1.0 );\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\nskinned \t += boneMatY * skinVertex * skinWeight.y;\ndisplacedPosition = skinned.xyz;\n#else\ndisplacedPosition = position;\n#endif\n#endif\nvec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );\nvec4 worldPosition = modelMatrix * vec4( displacedPosition, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\nvWorldPosition = worldPosition.xyz;\nvViewPosition = -mvPosition.xyz;\n#ifdef USE_SHADOWMAP\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n}\n#endif\n}"].join("\n")}, -cube:{uniforms:{tCube:{type:"t",value:null},tFlip:{type:"f",value:-1}},vertexShader:"varying vec3 vWorldPosition;\nvoid main() {\nvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\nvWorldPosition = worldPosition.xyz;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"uniform samplerCube tCube;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\nvoid main() {\ngl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n}"}, -depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,"void main() {",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.default_vertex,"}"].join("\n"),fragmentShader:"vec4 pack_depth( const in float depth ) {\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\nconst vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\nvec4 res = fract( depth * bit_shift );\nres -= res.xxyz * bit_mask;\nreturn res;\n}\nvoid main() {\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\n}"}};THREE.WebGLRenderer=function(a){function b(a){if(a.__webglCustomAttributesList)for(var b in a.__webglCustomAttributesList)j.deleteBuffer(a.__webglCustomAttributesList[b].buffer)}function c(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){void 0===a.__webglCustomAttributesList&&(a.__webglCustomAttributesList=[]);for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=!0;var g=1;"v2"===f.type?g=2:"v3"===f.type?g=3:"v4"===f.type? -g=4:"c"===f.type&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=j.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=!0}a.__webglCustomAttributesList.push(f)}}}function d(a,b){var c=b.geometry,d=a.faces3,h=a.faces4,i=3*d.length+4*h.length,k=1*d.length+2*h.length,h=3*d.length+4*h.length,d=e(b,a),n=g(d),l=f(d),m=d.vertexColors?d.vertexColors:!1;a.__vertexArray=new Float32Array(3*i);l&&(a.__normalArray=new Float32Array(3*i));c.hasTangents&&(a.__tangentArray=new Float32Array(4*i));m&& -(a.__colorArray=new Float32Array(3*i));if(n){if(0l;l++)N.autoScaleCubemaps&&!f?(m=k,r=l,t=c.image[l],y=gd,t.width<=y&&t.height<=y||(z=Math.max(t.width,t.height),v=Math.floor(t.width*y/z),y=Math.floor(t.height*y/z),z=document.createElement("canvas"),z.width=v,z.height=y,z.getContext("2d").drawImage(t,0,0,t.width,t.height,0,0,v,y),t=z),m[r]=t):k[l]=c.image[l];l=k[0];m=0===(l.width&l.width-1)&&0===(l.height&l.height-1);r=L(c.format); -t=L(c.type);W(j.TEXTURE_CUBE_MAP,c,m);for(l=0;6>l;l++)if(f){y=k[l].mipmaps;z=0;for(B=y.length;z=Mc&&console.warn("WebGLRenderer: trying to use "+ -a+" texture units while this GPU supports only "+Mc);Y+=1;return a}function C(a,b){a._modelViewMatrix.multiplyMatrices(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function x(a,b,c,d){a[b]=c.r*c.r*d;a[b+1]=c.g*c.g*d;a[b+2]=c.b*c.b*d}function G(a,b,c,d){a[b]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function J(a){a!==ub&&(j.lineWidth(a),ub=a)}function E(a,b,c){ab!==a&&(a?j.enable(j.POLYGON_OFFSET_FILL):j.disable(j.POLYGON_OFFSET_FILL),ab=a);if(a&& -(Fa!==b||Xa!==c))j.polygonOffset(b,c),Fa=b,Xa=c}function H(a){for(var a=a.split("\n"),b=0,c=a.length;bb;b++)j.deleteFramebuffer(a.__webglFramebuffer[b]),j.deleteRenderbuffer(a.__webglRenderbuffer[b]); -else j.deleteFramebuffer(a.__webglFramebuffer),j.deleteRenderbuffer(a.__webglRenderbuffer);N.info.memory.textures--},X=function(a){a=a.target;a.removeEventListener("dispose",X);Pc(a)},Pc=function(a){var b=a.program;if(void 0!==b){a.program=void 0;var c,d,e=!1,a=0;for(c=Ma.length;ad.numSupportedMorphTargets?(i.sort(n),i.length=d.numSupportedMorphTargets):i.length>d.numSupportedMorphNormals?i.sort(n):0===i.length&&i.push([0,0]);for(h=0;hxa;xa++)nc=ab[xa],Fb[kb]=nc.x,Fb[kb+1]=nc.y,Fb[kb+2]=nc.z,kb+=3;else for(xa=0;3>xa;xa++)Fb[kb]=Xa.x,Fb[kb+1]=Xa.y,Fb[kb+2]=Xa.z,kb+=3;D=0;for(V=va.length;Dxa;xa++)nc= -ab[xa],Fb[kb]=nc.x,Fb[kb+1]=nc.y,Fb[kb+2]=nc.z,kb+=3;else for(xa=0;4>xa;xa++)Fb[kb]=Xa.x,Fb[kb+1]=Xa.y,Fb[kb+2]=Xa.z,kb+=3;j.bindBuffer(j.ARRAY_BUFFER,sa.__webglNormalBuffer);j.bufferData(j.ARRAY_BUFFER,Fb,Pa)}if(Cc&&pd&&bb){D=0;for(V=ua.length;Dxa;xa++)Ab=pb[xa],Dc[ic]=Ab.x,Dc[ic+1]=Ab.y,ic+=2;D=0;for(V=va.length;Dxa;xa++)Ab=pb[xa],Dc[ic]=Ab.x,Dc[ic+1]=Ab.y,ic+=2;0xa;xa++)yc=ub[xa],Ec[jc]=yc.x,Ec[jc+1]=yc.y,jc+=2;D=0;for(V=va.length;Dxa;xa++)yc=ub[xa],Ec[jc]=yc.x,Ec[jc+1]=yc.y,jc+=2;0f;f++){a.__webglFramebuffer[f]=j.createFramebuffer();a.__webglRenderbuffer[f]=j.createRenderbuffer();j.texImage2D(j.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,i=j.TEXTURE_CUBE_MAP_POSITIVE_X+f;j.bindFramebuffer(j.FRAMEBUFFER, -a.__webglFramebuffer[f]);j.framebufferTexture2D(j.FRAMEBUFFER,j.COLOR_ATTACHMENT0,i,g.__webglTexture,0);F(a.__webglRenderbuffer[f],a)}c&&j.generateMipmap(j.TEXTURE_CUBE_MAP)}else a.__webglFramebuffer=j.createFramebuffer(),a.__webglRenderbuffer=a.shareDepthFrom?a.shareDepthFrom.__webglRenderbuffer:j.createRenderbuffer(),j.bindTexture(j.TEXTURE_2D,a.__webglTexture),W(j.TEXTURE_2D,a,c),j.texImage2D(j.TEXTURE_2D,0,d,a.width,a.height,0,d,e,null),d=j.TEXTURE_2D,j.bindFramebuffer(j.FRAMEBUFFER,a.__webglFramebuffer), -j.framebufferTexture2D(j.FRAMEBUFFER,j.COLOR_ATTACHMENT0,d,a.__webglTexture,0),a.shareDepthFrom?a.depthBuffer&&!a.stencilBuffer?j.framebufferRenderbuffer(j.FRAMEBUFFER,j.DEPTH_ATTACHMENT,j.RENDERBUFFER,a.__webglRenderbuffer):a.depthBuffer&&a.stencilBuffer&&j.framebufferRenderbuffer(j.FRAMEBUFFER,j.DEPTH_STENCIL_ATTACHMENT,j.RENDERBUFFER,a.__webglRenderbuffer):F(a.__webglRenderbuffer,a),c&&j.generateMipmap(j.TEXTURE_2D);b?j.bindTexture(j.TEXTURE_CUBE_MAP,null):j.bindTexture(j.TEXTURE_2D,null);j.bindRenderbuffer(j.RENDERBUFFER, -null);j.bindFramebuffer(j.FRAMEBUFFER,null)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,c=a.width,a=a.height,e=d=0):(b=null,c=fc,a=Ab,d=Ib,e=Jb);b!==Pa&&(j.bindFramebuffer(j.FRAMEBUFFER,b),j.viewport(d,e,c,a),Pa=b);mc=c;pb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};THREE.WebGLRenderTarget=function(a,b,c){THREE.EventDispatcher.call(this);this.width=a;this.height=b;c=c||{};this.wrapS=void 0!==c.wrapS?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==c.wrapT?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==c.magFilter?c.magFilter:THREE.LinearFilter;this.minFilter=void 0!==c.minFilter?c.minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=void 0!==c.anisotropy?c.anisotropy:1;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1); -this.format=void 0!==c.format?c.format:THREE.RGBAFormat;this.type=void 0!==c.type?c.type:THREE.UnsignedByteType;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.generateMipmaps=!0;this.shareDepthFrom=null}; -THREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.anisotropy=this.anisotropy;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;a.generateMipmaps=this.generateMipmaps;a.shareDepthFrom=this.shareDepthFrom;return a}; -THREE.WebGLRenderTarget.prototype.dispose=function(){this.dispatchEvent({type:"dispose"})};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};THREE.WebGLRenderTargetCube.prototype=Object.create(THREE.WebGLRenderTarget.prototype);THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=!0};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};THREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidModel=new THREE.Vector3;this.normalModel=new THREE.Vector3;this.normalModelView=new THREE.Vector3;this.vertexNormalsLength=0;this.vertexNormalsModel=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsModelView=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.material=this.color=null;this.uvs=[[]];this.z=null};THREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidModel=new THREE.Vector3;this.normalModel=new THREE.Vector3;this.normalModelView=new THREE.Vector3;this.vertexNormalsLength=0;this.vertexNormalsModel=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsModelView=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]; -this.material=this.color=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null};THREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=this.object=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};THREE.GeometryUtils={merge:function(a,b){var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,i=a.faces,k=f.faces,l=a.faceVertexUvs[0],f=f.faceVertexUvs[0];b instanceof THREE.Mesh&&(b.matrixAutoUpdate&&b.updateMatrix(),c=b.matrix,d=new THREE.Matrix3,d.getInverse(c),d.transpose());for(var m=0,n=h.length;ma?b(c,e-1):k[e]>8&255,i>>16&255,i>>24&255)),d}d.mipmapCount=1;h[2]&131072&&!1!==b&&(d.mipmapCount=Math.max(1,h[7]));d.isCubemap=h[28]&512?!0:!1;d.width=h[4];d.height=h[3];for(var h=h[1]+4,f=d.width,g=d.height,i=d.isCubemap? -6:1,k=0;km-1?0:m-1,s=m+1>e-1?e-1:m+1,r=0>l-1?0:l-1,p=l+1>d-1?d-1:l+1,q=[],y=[0,0,h[4*(m*d+l)]/255*b];q.push([-1,0,h[4*(m*d+r)]/255*b]);q.push([-1,-1,h[4*(n*d+r)]/255*b]);q.push([0,-1,h[4*(n*d+l)]/255*b]);q.push([1,-1,h[4*(n*d+p)]/255*b]);q.push([1,0,h[4*(m*d+p)]/255*b]);q.push([1,1,h[4*(s*d+p)]/255*b]);q.push([0,1,h[4*(s*d+l)]/255*b]);q.push([-1,1,h[4*(s*d+r)]/255*b]);n=[];r=q.length;for(s=0;se)return null;var f=[],g=[],h=[],i,k,l;if(0=m--){console.log("Warning, unable to triangulate polygon!");break}i=k;e<=i&&(i=0);k=i+1;e<=k&&(k=0);l=k+1;e<=l&&(l=0);var n;a:{var s=n=void 0,r=void 0,p=void 0,q=void 0,y=void 0,v=void 0,z=void 0,t= -void 0,s=a[g[i]].x,r=a[g[i]].y,p=a[g[k]].x,q=a[g[k]].y,y=a[g[l]].x,v=a[g[l]].y;if(1E-10>(p-s)*(v-r)-(q-r)*(y-s))n=!1;else{var A=void 0,I=void 0,C=void 0,x=void 0,G=void 0,J=void 0,E=void 0,H=void 0,B=void 0,W=void 0,B=H=E=t=z=void 0,A=y-p,I=v-q,C=s-y,x=r-v,G=p-s,J=q-r;for(n=0;ni)g=d+1;else if(0b&&(b=0);1d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b}; -THREE.EllipseCurve=function(a,b,c,d,e,f,g){this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=f;this.aClockwise=g};THREE.EllipseCurve.prototype=Object.create(THREE.Curve.prototype);THREE.EllipseCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;this.aClockwise||(a=1-a);b=this.aStartAngle+a*b;a=this.aX+this.xRadius*Math.cos(b);b=this.aY+this.yRadius*Math.sin(b);return new THREE.Vector2(a,b)}; -THREE.ArcCurve=function(a,b,c,d,e,f){THREE.EllipseCurve.call(this,a,b,c,c,d,e,f)};THREE.ArcCurve.prototype=Object.create(THREE.EllipseCurve.prototype); -THREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){var a=0.5*(c-a),d=0.5*(d-b),f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}}; -THREE.Curve.create=function(a,b){a.prototype=Object.create(THREE.Curve.prototype);a.prototype.getPoint=b;return a};THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b}); -THREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)}); -THREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)}); -THREE.SplineCurve3=THREE.Curve.create(function(a){this.points=void 0==a?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e,a=(d.length-1)*a;e=Math.floor(a);a-=e;c[0]=0==e?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],g=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,g.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,g.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,g.z,c.z,a);return b}); -THREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=void 0==a?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e-=a;a+=0=b)return b=c[a]-b,a=this.curves[a],b=1-b/a.getLength(),a.getPointAt(b);a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]}; -THREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;cb?b=h.x:h.xc?c=h.y:h.yd?d=h.z:h.zMath.abs(d.x-c[0].x)&&1E-10>Math.abs(d.y-c[0].y)&&c.splice(c.length-1,1);b&&c.push(c[0]);return c}; -THREE.Path.prototype.toShapes=function(){var a,b,c,d,e=[],f=new THREE.Path;a=0;for(b=this.actions.length;a -h&&(h+=c.length);h%=c.length;0>g&&(g+=k.length);g%=k.length;e=0<=h-1?h-1:c.length-1;f=0<=g-1?g-1:k.length-1;p=[k[g],c[h],c[e]];p=THREE.FontUtils.Triangulate.area(p);q=[k[g],k[f],c[h]];q=THREE.FontUtils.Triangulate.area(q);m+n>p+q&&(h=s,g=l,0>h&&(h+=c.length),h%=c.length,0>g&&(g+=k.length),g%=k.length,e=0<=h-1?h-1:c.length-1,f=0<=g-1?g-1:k.length-1);m=c.slice(0,h);n=c.slice(h);s=k.slice(g);l=k.slice(0,g);f=[k[g],k[f],c[h]];r.push([k[g],c[h],c[e]]);r.push(f);c=m.concat(s).concat(l).concat(n)}return{shape:c, -isolatedPts:r,allpoints:d}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),d=c.allpoints,e=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,!1),f,g,h,i,k={};f=0;for(g=d.length;fd;d++)i=h[d].x+":"+h[d].y,i=k[i],void 0!==i&&(h[d]=i)}f=0;for(g=e.length;fd;d++)i=h[d].x+":"+h[d].y,i=k[i],void 0!==i&&(h[d]=i)}return c.concat(e)}, -isClockWise:function(a){return 0>THREE.FontUtils.Triangulate.area(a)},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a,b)+this.b3p1(a,c)+this.b3p2(a,d)+ -this.b3p3(a,e)}};THREE.AnimationHandler=function(){var a=[],b={},c={update:function(b){for(var c=0;ca.hierarchy[c].keys[d].time&& -(a.hierarchy[c].keys[d].time=0),void 0!==a.hierarchy[c].keys[d].rot&&!(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)){var h=a.hierarchy[c].keys[d].rot;a.hierarchy[c].keys[d].rot=new THREE.Quaternion(h[0],h[1],h[2],h[3])}if(a.hierarchy[c].keys.length&&void 0!==a.hierarchy[c].keys[0].morphTargets){h={};for(d=0;ds;s++){c=b[s];g=i.prevKey[c];h=i.nextKey[c];if(h.time<=l){if(kd||1d?0:1;if("pos"===c)if(c=a.position,this.interpolationType===THREE.AnimationHandler.LINEAR)c.x=e[0]+(f[0]-e[0])*d,c.y=e[1]+(f[1]-e[1])*d,c.z=e[2]+ -(f[2]-e[2])*d;else{if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)this.points[0]=this.getPrevKeyWith("pos",m,g.index-1).pos,this.points[1]=e,this.points[2]=f,this.points[3]=this.getNextKeyWith("pos",m,h.index+1).pos,d=0.33*d+0.33,e=this.interpolateCatmullRom(this.points,d),c.x=e[0],c.y=e[1],c.z=e[2],this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD&&(d=this.interpolateCatmullRom(this.points,1.01*d), -this.target.set(d[0],d[1],d[2]),this.target.sub(c),this.target.y=0,this.target.normalize(),d=Math.atan2(this.target.x,this.target.z),a.rotation.set(0,d,0))}else"rot"===c?THREE.Quaternion.slerp(e,f,a.quaternion,d):"scl"===c&&(c=a.scale,c.x=e[0]+(f[0]-e[0])*d,c.y=e[1]+(f[1]-e[1])*d,c.z=e[2]+(f[2]-e[2])*d)}}}}; -THREE.Animation.prototype.interpolateCatmullRom=function(a,b){var c=[],d=[],e,f,g,h,i,k;e=(a.length-1)*b;f=Math.floor(e);e-=f;c[0]=0===f?f:f-1;c[1]=f;c[2]=f>a.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];h=a[c[1]];i=a[c[2]];k=a[c[3]];c=e*e;g=e*c;d[0]=this.interpolate(f[0],h[0],i[0],k[0],e,c,g);d[1]=this.interpolate(f[1],h[1],i[1],k[1],e,c,g);d[2]=this.interpolate(f[2],h[2],i[2],k[2],e,c,g);return d}; -THREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,g){a=0.5*(c-a);d=0.5*(d-b);return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c=g?b.interpolate(c,g):b.interpolate(c,c.time)}this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=!0}}if(this.JITCompile&&void 0===f[0][e]){this.hierarchy[0].updateMatrixWorld(!0);for(a=0;ag?(b=Math.atan2(b.y-a.y,b.x-a.x),a=Math.atan2(c.y-a.y,c.x-a.x),b>a&&(a+=2*Math.PI),c=(b+a)/2,a=-Math.cos(c),c=-Math.sin(c),new THREE.Vector2(a,c)):d.multiplyScalar(g).add(i).sub(a).clone()}function e(c,d){var e,f;for(M=c.length;0<=--M;){e=M;f=M-1;0>f&&(f=c.length-1);for(var g=0,i=s+2*l, -g=0;gMath.abs(c-i)?[new THREE.Vector2(b,1-e),new THREE.Vector2(d,1-f),new THREE.Vector2(k,1-g),new THREE.Vector2(m,1-a)]:[new THREE.Vector2(c,1-e),new THREE.Vector2(i,1-f),new THREE.Vector2(l,1-g),new THREE.Vector2(n,1-a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2; -THREE.ExtrudeGeometry.__v5=new THREE.Vector2;THREE.ExtrudeGeometry.__v6=new THREE.Vector2;THREE.ShapeGeometry=function(a,b){THREE.Geometry.call(this);!1===a instanceof Array&&(a=[a]);this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()};THREE.ShapeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ShapeGeometry.prototype.addShapeList=function(a,b){for(var c=0,d=a.length;cd?(d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()]),d.centroid.add(a).add(b).add(c).divideScalar(3),d.normal=d.centroid.clone().normalize(),i.faces.push(d),d=Math.atan2(d.centroid.z,-d.centroid.x),i.faceVertexUvs[0].push([h(a.uv, -a,d),h(b.uv,b,d),h(c.uv,c,d)])):(d-=1,f(a,g(a,b),g(a,c),d),f(g(a,b),b,g(b,c),d),f(g(a,c),g(b,c),c,d),f(g(a,b),g(b,c),g(a,c),d))}function g(a,b){m[a.index]||(m[a.index]=[]);m[b.index]||(m[b.index]=[]);var c=m[a.index][b.index];void 0===c&&(m[a.index][b.index]=m[b.index][a.index]=c=e((new THREE.Vector3).addVectors(a,b).divideScalar(2)));return c}function h(a,b,c){0>c&&1===a.x&&(a=new THREE.Vector2(a.x-1,a.y));0===b.x&&0===b.z&&(a=new THREE.Vector2(c/2/Math.PI+0.5,a.y));return a}THREE.Geometry.call(this); -for(var c=c||1,d=d||0,i=this,k=0,l=a.length;k=l){for(k=0;3>k;k++){l=[i[k],i[(k+1)%3]];m=!0;for(n=0;nh;h++)void 0===f[g[h]]&&(f[g[h]]=e++,this.vertices.push(a[g[h]])),g[h]=f[g[h]]}for(d=0;db.y?this.rotation.set(Math.PI,0,0):(a=THREE.ArrowHelper.__v2.set(b.z,0,-b.x).normalize(),b=Math.acos(b.y),a=THREE.ArrowHelper.__q1.setFromAxisAngle(a,b),this.rotation.setEulerFromQuaternion(a,this.eulerOrder))}; -THREE.ArrowHelper.prototype.setLength=function(a){this.scale.set(a,a,a)};THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.setHex(a);this.cone.material.color.setHex(a)};THREE.ArrowHelper.__v1=new THREE.Vector3;THREE.ArrowHelper.__v2=new THREE.Vector3;THREE.ArrowHelper.__q1=new THREE.Quaternion;THREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.geometry.vertices.push(new THREE.Vector3);d.geometry.colors.push(new THREE.Color(b));void 0===d.pointMap[a]&&(d.pointMap[a]=[]);d.pointMap[a].push(d.geometry.vertices.length-1)}THREE.Line.call(this);var d=this;this.geometry=new THREE.Geometry;this.material=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.type=THREE.LinePieces;this.matrixWorld=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap= -{};b("n1","n2",16755200);b("n2","n4",16755200);b("n4","n3",16755200);b("n3","n1",16755200);b("f1","f2",16755200);b("f2","f4",16755200);b("f4","f3",16755200);b("f3","f1",16755200);b("n1","f1",16755200);b("n2","f2",16755200);b("n3","f3",16755200);b("n4","f4",16755200);b("p","n1",16711680);b("p","n2",16711680);b("p","n3",16711680);b("p","n4",16711680);b("u1","u2",43775);b("u2","u3",43775);b("u3","u1",43775);b("c","t",16777215);b("p","c",3355443);b("cn1","cn2",3355443);b("cn3","cn4",3355443);b("cf1", -"cf2",3355443);b("cf3","cf4",3355443);this.camera=a;this.update(a)};THREE.CameraHelper.prototype=Object.create(THREE.Line.prototype); -THREE.CameraHelper.prototype.update=function(){function a(a,d,e,f){THREE.CameraHelper.__v.set(d,e,f);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);a=b.pointMap[a];if(void 0!==a){d=0;for(e=a.length;dh.end&&(h.end=f);c||(c=i)}}for(i in d)h=d[i],this.createAnimation(i,h.start,h.end,a);this.firstAnimation=c}; -THREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)}; -THREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b}; -THREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time=0,b.active=!0):console.warn("animation["+a+"] undefined")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1}; -THREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;bd.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=d.duration);var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/e),0,d.length-1),g=d.weight; -f!==d.currentFrame&&(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*g,this.morphTargetInfluences[f]=0,d.lastFrame=d.currentFrame,d.currentFrame=f);e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};THREE.LensFlarePlugin=function(){function a(a,c){var d=b.createProgram(),e=b.createShader(b.FRAGMENT_SHADER),f=b.createShader(b.VERTEX_SHADER),g="precision "+c+" float;\n";b.shaderSource(e,g+a.fragmentShader);b.shaderSource(f,g+a.vertexShader);b.compileShader(e);b.compileShader(f);b.attachShader(d,e);b.attachShader(d,f);b.linkProgram(d);return d}var b,c,d,e,f,g,h,i,k,l,m,n,s;this.init=function(r){b=r.context;c=r;d=r.getPrecision();e=new Float32Array(16);f=new Uint16Array(6);r=0;e[r++]=-1;e[r++]=-1; -e[r++]=0;e[r++]=0;e[r++]=1;e[r++]=-1;e[r++]=1;e[r++]=0;e[r++]=1;e[r++]=1;e[r++]=1;e[r++]=1;e[r++]=-1;e[r++]=1;e[r++]=0;e[r++]=1;r=0;f[r++]=0;f[r++]=1;f[r++]=2;f[r++]=0;f[r++]=2;f[r++]=3;g=b.createBuffer();h=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,g);b.bufferData(b.ARRAY_BUFFER,e,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,h);b.bufferData(b.ELEMENT_ARRAY_BUFFER,f,b.STATIC_DRAW);i=b.createTexture();k=b.createTexture();b.bindTexture(b.TEXTURE_2D,i);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16, -0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,k);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE); -b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);0>=b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)?(l=!1,m=a(THREE.ShaderFlares.lensFlare,d)):(l=!0,m=a(THREE.ShaderFlares.lensFlareVertexTexture,d));n={};s={};n.vertex=b.getAttribLocation(m,"position");n.uv=b.getAttribLocation(m,"uv");s.renderType=b.getUniformLocation(m,"renderType");s.map=b.getUniformLocation(m,"map");s.occlusionMap=b.getUniformLocation(m,"occlusionMap");s.opacity= -b.getUniformLocation(m,"opacity");s.color=b.getUniformLocation(m,"color");s.scale=b.getUniformLocation(m,"scale");s.rotation=b.getUniformLocation(m,"rotation");s.screenPosition=b.getUniformLocation(m,"screenPosition")};this.render=function(a,d,e,f){var a=a.__webglFlares,v=a.length;if(v){var z=new THREE.Vector3,t=f/e,A=0.5*e,I=0.5*f,C=16/f,x=new THREE.Vector2(C*t,C),G=new THREE.Vector3(1,1,0),J=new THREE.Vector2(1,1),E=s,C=n;b.useProgram(m);b.enableVertexAttribArray(n.vertex);b.enableVertexAttribArray(n.uv); -b.uniform1i(E.occlusionMap,0);b.uniform1i(E.map,1);b.bindBuffer(b.ARRAY_BUFFER,g);b.vertexAttribPointer(C.vertex,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(C.uv,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,h);b.disable(b.CULL_FACE);b.depthMask(!1);var H,B,W,F,K;for(H=0;Hx;x++)t[x]=new THREE.Vector3,v[x]=new THREE.Vector3;t=A.shadowCascadeNearZ[z];A=A.shadowCascadeFarZ[z];v[0].set(-1,-1,t);v[1].set(1,-1,t);v[2].set(-1, -1,t);v[3].set(1,1,t);v[4].set(-1,-1,A);v[5].set(1,-1,A);v[6].set(-1,1,A);v[7].set(1,1,A);C.originalCamera=n;v=new THREE.Gyroscope;v.position=p.shadowCascadeOffset;v.add(C);v.add(C.target);n.add(v);p.shadowCascadeArray[y]=C;console.log("Created virtualLight",C)}z=p;t=y;A=z.shadowCascadeArray[t];A.position.copy(z.position);A.target.position.copy(z.target.position);A.lookAt(A.target);A.shadowCameraVisible=z.shadowCameraVisible;A.shadowDarkness=z.shadowDarkness;A.shadowBias=z.shadowCascadeBias[t];v=z.shadowCascadeNearZ[t]; -z=z.shadowCascadeFarZ[t];A=A.pointsFrustum;A[0].z=v;A[1].z=v;A[2].z=v;A[3].z=v;A[4].z=z;A[5].z=z;A[6].z=z;A[7].z=z;I[q]=C;q++}else I[q]=p,q++;s=0;for(r=I.length;sz;z++)t=A[z],t.copy(v[z]),THREE.ShadowMapPlugin.__projector.unprojectVector(t,y),t.applyMatrix4(q.matrixWorldInverse),t.xk.x&&(k.x=t.x),t.yk.y&&(k.y=t.y),t.zk.z&& -(k.z=t.z);q.left=i.x;q.right=k.x;q.top=k.y;q.bottom=i.y;q.updateProjectionMatrix()}q=p.shadowMap;v=p.shadowMatrix;y=p.shadowCamera;y.position.getPositionFromMatrix(p.matrixWorld);l.getPositionFromMatrix(p.target.matrixWorld);y.lookAt(l);y.updateMatrixWorld();y.matrixWorldInverse.getInverse(y.matrixWorld);p.cameraHelper&&(p.cameraHelper.visible=p.shadowCameraVisible);p.shadowCameraVisible&&p.cameraHelper.update();v.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);v.multiply(y.projectionMatrix);v.multiply(y.matrixWorldInverse); -h.multiplyMatrices(y.projectionMatrix,y.matrixWorldInverse);g.setFromMatrix(h);b.setRenderTarget(q);b.clear();A=m.__webglObjects;p=0;for(q=A.length;p 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"}}; diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/ajax_handler.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/ajax_handler.js deleted file mode 100644 index 63d536fb..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/ajax_handler.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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 ajax_handler = function () { - var api = this; - api.response = "v"; - api.ajaxRequest = function (url, type, data, dataType, callback) { - var response; - $.ajax({ - url: url, - type: type, - dataType: dataType, - success: function (data, success) { - api.response = data; - console.log(" success " + JSON.stringify(success)); - console.log(" data " + JSON.stringify(data)); - callback(data, success); - }, - error: function (jqxhr, textStatus, error) { - var err = textStatus + ', ' + error; - console.log("Request Failed: " + err); - callback(data, error); - api.response = data; - }, - data: data - }); - return api.response; - }; - api.makeJSONObject = function () { - var object = {}; - for (var i = 0; i < arguments.length - 1; i = i + 2) { - object[arguments[i]] = arguments[i + 1]; - } - return object; - } -}; \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/general_handler b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/general_handler deleted file mode 100644 index 2e8f4b17..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/general_handler +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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. - */ - -$('.btn-minimize').click(function (e) { - e.preventDefault(); - var $target = $(this).parent().parent().next('.box-content'); - if ($target.is(':visible')) { - $('i', $(this)).removeClass('glyphicon-chevron-up').addClass('glyphicon-chevron-down'); - checkAndDisable($(this).parent().attr('id')); - - } - else { - $('i', $(this)).removeClass('glyphicon-chevron-down').addClass('glyphicon-chevron-up'); - checkAndEnable($(this).parent().attr('id')); - } - $target.slideToggle(); -}); - -function checkAndEnable(id) { - - //console.log("enable: " + id); - if (id === "RealtimePlotting") { - config_api.modules_status.realtimePlotting = true; - } - else if (id === "SensorReadings") { - config_api.modules_status.sensorReadings = true; - } else if (id === "AngleOfRotation_2") { - config_api.modules_status.angleOfRotation_2 = true; - } else if (id === "AngleOfRotation_1") { - config_api.modules_status.angleOfRotation_1 = true; - } -} - -function checkAndDisable(id) { - //console.log("disable: " + id); - if (id === "RealtimePlotting") { - config_api.modules_status.realtimePlotting = false; - } - else if (id === "SensorReadings") { - config_api.modules_status.sensorReadings = false; - } else if (id === "AngleOfRotation_2") { - config_api.modules_status.angleOfRotation_2 = false; - } else if (id === "AngleOfRotation_1") { - config_api.modules_status.angleOfRotation_1 = false; - } -} - -function isJSON(data) { - try { - return JSON.parse(data); - } - catch (error) { - return null; - } -} - -function Queue() { - var a = [], b = ''; - this.enqueue = function (b) { - a.push([this.getLength() - 1 <= 0 ? 0 : this.getLength() - 1, b]); - }; - this.dequeue = function () { - if (0 != a.length) { - var c = a[b]; - 2 * ++b >= a.length && (a = a.slice(b), b = 0); - return c - } - }; - this.getLength = function () { - return a.length - b; - }; - this.isEmpty = function () { - return 0 == a.length; - }; - - this.peek = function () { - return 0 < a.length ? a[b] : void 0 - }; - this.getData = function () { - return a; - }; - this.make_fixed_size = function (start, end) { - a = a.slice(start, end); - } -} - diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/websocket_api b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/websocket_api deleted file mode 100644 index 6dc690c6..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/websocket_api +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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 webSocket_api = function () { - var api = this; - api.wekSocket; - api.message = function (holder) { - return $("#" + holder + ""); - }, - api.openSocket = function (url, callback) { - if (api.wekSocket !== undefined && api.wekSocket.readyState !== WebSocket.CLOSED) { - console.log("WebSocket is already opened."); - - } else { - api.wekSocket = new WebSocket(url); - } - api.wekSocket.onopen = function (event) { - if (event.data === undefined) - return; - api.writeResponse(event.data); - callback(event.data); - }; - api.wekSocket.onmessage = function (event) { - api.writeResponse(event.data); - }; - - api.wekSocket.onclose = function (event) { - api.writeResponse(event.data); - }; - }, - api.send = function (message) { - api.wekSocket.send(message); - }, - - api.closeSocket = function () { - api.wekSocket.close(); - }, - - api.writeResponse = function (arg) { - console.log(arg); - } -} - - diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/config/config.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/config/config.js deleted file mode 100644 index fd234991..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/config/config.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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 config_api = function () { - var config_api = this; - var context_controller = "/drone_analyzer/controller/send_command"; - config_api.config_3dobject_holder = "#virtualDrone"; - config_api.realtime_plotting_update_interval = 30; - config_api.realtime_plotting_totalPoints = 30; - config_api.realtime_plotting_data_window = {}; - config_api.effectController = {uy: 70.0, uz: 15.0, ux: 10.0, fx: 2.0, fz: 15.0, Tmax: 1}; - config_api.drone_control = context_controller; - config_api.drone_controlType = "POST"; - config_api.drone_controlDataType = "json"; - config_api.web_socket_endpoint = "/drone_analyzer/datastream/drone_status"; - config_api.modules_status = { - "realtimePlotting": false, - "sensorReadings": false, - "angleOfRotation_2": false, - "angleOfRotation_1": false - }; -}; \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/d3.min.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/d3.min.js deleted file mode 100644 index be855941..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/d3.min.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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. - */ - -!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function a(n){return n.length}function o(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function s(n){return(n+="")===xa||n[0]===ba?ba+n:n}function f(n){return(n+="")[0]===ba?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=_a.length;r>e;++e){var u=_a[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++ue;e++)for(var u,i=n[e],a=0,o=i.length;o>a;a++)(u=i[a])&&t(u,a,e);return n}function Z(n){return Sa(n,za),n}function V(n){var t,e;return function(r,u,i){var a,o=n[i].update,l=o.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(a=o[t])&&++t0&&(n=n.slice(0,o));var c=La.get(n);return c&&(n=c,l=B),o?t?u:r:t?b:i}function $(n,t){return function(e){var r=oa.event;oa.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{oa.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Ta,u="click"+r,i=oa.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==qa&&(qa="onselectstart"in e?!1:x(e.style,"userSelect")),qa){var a=n(e).style,o=a[qa];a[qa]="none"}return function(n){if(i.on(r,null),qa&&(a[qa]=o),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Ra){var i=t(n);if(i.scrollX||i.scrollY){r=oa.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var a=r[0][0].getScreenCTM();Ra=!(a.f||a.e),r.remove()}}return Ra?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var o=n.getBoundingClientRect();return[e.clientX-o.left-n.clientLeft,e.clientY-o.top-n.clientTop]}function G(){return oa.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?ja:Math.acos(n)}function tn(n){return n>1?Ha:-1>n?-Ha:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function an(n){return(n=Math.sin(n/2))*n}function on(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(a-i)*n/60:180>n?a:240>n?i+(a-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,a;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+t):e+t-e*t,i=2*e-a,new yn(u(n+120),u(n),u(n-120))}function sn(n,t,e){return this instanceof sn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof sn?new sn(n.h,n.c,n.l):n instanceof hn?pn(n.l,n.a,n.b):pn((n=Sn((n=oa.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new sn(n,t,e)}function fn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Oa)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof sn?fn(n.h,n.c,n.l):Sn((n=yn(n)).r,n.g,n.b):new hn(n,t,e)}function gn(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=vn(u)*Ka,r=vn(r)*Qa,i=vn(i)*no,new yn(mn(3.2404542*u-1.5371385*r-.4985314*i),mn(-.969266*u+1.8760108*r+.041556*i),mn(.0556434*u-.2040259*r+1.0572252*i))}function pn(n,t,e){return n>0?new sn(Math.atan2(e,t)*Ia,Math.sqrt(t*t+e*e),n):new sn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function mn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function yn(n,t,e){return this instanceof yn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof yn?new yn(n.r,n.g,n.b):_n(""+n,yn,cn):new yn(n,t,e)}function Mn(n){return new yn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,u,i,a=0,o=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(Nn(u[0]),Nn(u[1]),Nn(u[2]))}return(i=ro.get(n))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(a=(3840&i)>>4,a=a>>4|a,o=240&i,o=o>>4|o,l=15&i,l=l<<4|l):7===n.length&&(a=(16711680&i)>>16,o=(65280&i)>>8,l=255&i)),t(a,o,l))}function wn(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),a=Math.max(n,t,e),o=a-i,l=(a+i)/2;return o?(u=.5>l?o/(a+i):o/(2-a-i),r=n==a?(t-e)/o+(e>t?6:0):t==a?(e-n)/o+2:(n-t)/o+4,r*=60):(r=NaN,u=l>0&&1>l?0:r),new ln(r,u,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/Ka),u=dn((.2126729*n+.7151522*t+.072175*e)/Qa),i=dn((.0193339*n+.119192*t+.9503041*e)/no);return hn(116*u-16,500*(r-u),200*(u-i))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function u(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(i,l)}catch(r){return void a.error.call(i,r)}a.load.call(i,n)}else a.error.call(i,l)}var i={},a=oa.dispatch("beforesend","progress","load","error"),o={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=u:l.onreadystatechange=function(){l.readyState>3&&u()},l.onprogress=function(n){var t=oa.event;oa.event=n;try{a.progress.call(i,l)}finally{oa.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?o[n]:(null==t?delete o[n]:o[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(c=n,i):c},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ca(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),l.open(e,n,!0),null==t||"accept"in o||(o.accept=t+",*/*"),l.setRequestHeader)for(var s in o)l.setRequestHeader(s,o[s]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),a.beforesend.call(i,l),l.send(null==r?null:r),i},i.abort=function(){return l.abort(),i},oa.rebind(i,a,"on"),null==r?i:i.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,n:null};return io?io.n=i:uo=i,io=i,ao||(oo=clearTimeout(oo),ao=1,lo(Tn)),i}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(oo),oo=setTimeout(Tn,t)),ao=0):(ao=1,lo(Tn))}function Rn(){for(var n=Date.now(),t=uo;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=uo,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Un(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],a=0,o=r[0],l=0;u>0&&o>0&&(l+o+1>t&&(o=Math.max(1,t-l)),i.push(n.substring(u-=o,u+o)),!((l+=o+1)>t));)o=r[a=(a+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=so.exec(n),r=e[1]||" ",a=e[2]||">",o=e[3]||"-",l=e[4]||"",c=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===a)&&(c=r="0",a="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===l&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=fo.get(g)||Fn;var M=c&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===o?"":o;if(0>p){var l=oa.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===a?u+n+k:">"===a?k+u+n:"^"===a?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new go(e-1)),1),e}function i(n,e){return t(n=new go(+n),e),n}function a(n,r,i){var a=u(n),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),t(a,1);else for(;r>a;)o.push(new Date(+a)),t(a,1);return o}function o(n,t,e){try{go=Hn;var r=new Hn;return r._=n,a(r,t,e)}finally{go=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=a;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(u),l.offset=In(i),l.range=o,n}function In(n){return function(t,e){try{go=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{go=Date}}}function Yn(n){function t(n){function t(t){for(var e,u,i,a=[],o=-1,l=0;++oo;){if(r>=c)return-1;if(u=t.charCodeAt(o++),37===u){if(a=t.charAt(o++),i=C[a in vo?t.charAt(o++):a],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{go=Hn;var t=new go;return t._=n,r(t)}finally{go=Date}}var r=t(n);return e.parse=function(n){try{go=Hn;var t=r.parse(n);return t&&t._}finally{go=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=oa.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(m),k=Xn(m),N=Vn(y),E=Xn(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ho.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ho.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ho.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:ot,"%":function(){return"%"}},C={a:r,A:u,b:i,B:a,c:o,d:tt,e:tt,H:rt,I:rt,j:et,L:at,m:nt,M:ut,p:s,S:it,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Vn(n){return new RegExp("^(?:"+n.map(oa.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e68?1900:2e3)}function nt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ut(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function it(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function at(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ot(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=Ma(t)/60|0,u=Ma(t)%60;return e+Zn(r,"0",2)+Zn(u,"0",2)}function lt(n,t,e){yo.lastIndex=0;var r=yo.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,o=a*e,l=Math.cos(t),c=Math.sin(t),s=i*c,f=u*l+s*Math.cos(o),h=s*a*Math.sin(o);So.add(Math.atan2(h,f)),r=n,u=l,i=c}var t,e,r,u,i;ko.point=function(a,o){ko.point=n,r=(t=a)*Oa,u=Math.cos(o=(e=o)*Oa/2+ja/4),i=Math.sin(o)},ko.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function mt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function yt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return Ma(n[0]-t[0])o;++o)u.point((e=n[o])[0],e[1]);return void u.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,i.push(l),a.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,i.push(l),a.push(c)}}),a.sort(t),qt(i),qt(a),i.length){for(var o=0,l=e,c=a.length;c>o;++o)a[o].e=l=!l;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var o=0,c=s.length;c>o;++o)u.point((f=s[o])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var o=s.length-1;o>=0;--o)u.point((f=s[o])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r0){for(b||(i.polygonStart(),b=!0),i.lineStart();++a1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Dt))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:a,lineStart:l,lineEnd:c,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=a,y.lineStart=l,y.lineEnd=c,g=oa.merge(g);var n=Ot(m,p);g.length?(b||(i.polygonStart(),b=!0),Lt(g,jt,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Pt(),x=t(M),b=!1;return y}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function jt(n,t){return((n=n.x)[0]<0?n[1]-Ha-Da:Ha-n[1])-((t=t.x)[0]<0?t[1]-Ha-Da:Ha-t[1])}function Ut(n){var t,e=NaN,r=NaN,u=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(i,a){var o=i>0?ja:-ja,l=Ma(i-e);Ma(l-ja)0?Ha:-Ha),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(o,r),n.point(i,r),t=0):u!==o&&l>=ja&&(Ma(e-u)Da?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*a)):(t+r)/2}function Ht(n,t,e,r){var u;if(null==n)u=e*Ha,r.point(-ja,u),r.point(0,u),r.point(ja,u),r.point(ja,0),r.point(ja,-u),r.point(0,-u),r.point(-ja,-u),r.point(-ja,0),r.point(-ja,u);else if(Ma(n[0]-t[0])>Da){var i=n[0]o;++o){var c=t[o],s=c.length;if(s)for(var f=c[0],h=f[0],g=f[1]/2+ja/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=c[d];var m=n[0],y=n[1]/2+ja/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>ja,k=p*M;if(So.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*Ua:b,S^h>=e^m>=e){var N=yt(dt(f),dt(n));bt(N);var E=yt(u,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(a+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Da>i||Da>i&&0>So)^1&a}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,l,c,s;return{lineStart:function(){c=l=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=a?v?0:u(f,h):v?u(f+(0>f?ja:-ja),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(g=r(e,p),(wt(e,g)||wt(p,g))&&(p[0]+=Da,p[1]+=Da,v=t(p[0],p[1]))),v!==l)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(o&&e&&a^v){var m;d&i||!(m=r(p,e,!0))||(s=0,a?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&wt(e,p)||n.point(p[0],p[1]),e=p,l=v,i=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return s|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),u=dt(t),a=[1,0,0],o=yt(r,u),l=mt(o,o),c=o[0],s=l-c*c;if(!s)return!e&&n;var f=i*l/s,h=-i*c/s,g=yt(a,o),p=xt(a,f),v=xt(o,h);Mt(p,v);var d=g,m=mt(p,d),y=mt(d,d),M=m*m-y*(mt(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-m-x)/y);if(Mt(b,p),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=Ma(E-ja)E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(Ma(b[0]-w)ja^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-m+x)/y);return Mt(z,p),[b,_t(z)]}}}function u(t,e){var r=a?n:ja-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),a=i>0,o=Ma(i)>Da,l=ve(n,6*Oa);return Rt(t,e,l,a?[0,-n]:[-ja,n-ja])}function Yt(n,t,e,r){return function(u){var i,a=u.a,o=u.b,l=a.x,c=a.y,s=o.x,f=o.y,h=0,g=1,p=s-l,v=f-c;if(i=n-l,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-l,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-c,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-c,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:l+h*p,y:c+h*v}),1>g&&(u.b={x:l+g*p,y:c+g*v}),u}}}}}}function Zt(n,t,e,r){function u(r,u){return Ma(r[0]-n)0?0:3:Ma(r[0]-e)0?2:1:Ma(r[1]-t)0?1:0:u>0?3:2}function i(n,t){return a(n.x,t.x)}function a(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(o){function l(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,a=1,o=d[u],l=o.length,c=o[0];l>a;++a)i=o[a],c[1]<=r?i[1]>r&&Q(c,i,n)>0&&++t:i[1]<=r&&Q(c,i,n)<0&&--t,c=i;return 0!==t}function c(i,o,l,c){var s=0,f=0;if(null==i||(s=u(i,l))!==(f=u(o,l))||a(i,o)<0^l>0){do c.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+l+4)%4)!==f)}else c.point(o[0],o[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&o.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=NaN}function g(){v&&(p(y,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=f,w&&o.lineEnd()}function p(n,t){n=Math.max(-Fo,Math.min(Fo,n)),t=Math.max(-Fo,Math.min(Fo,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(o.lineStart(),o.point(n,t));else if(e&&w)o.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(o.lineStart(),o.point(r.a.x,r.a.y)),o.point(r.b.x,r.b.y),e||o.lineEnd(),k=!1):e&&(o.lineStart(),o.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,N=o,E=Pt(),A=Yt(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){o=E,v=[],d=[],k=!0},polygonEnd:function(){o=N,v=oa.merge(v);var t=l([n,r]),e=k&&t,u=v.length;(e||u)&&(o.polygonStart(),e&&(o.lineStart(),c(null,null,1,o),o.lineEnd()),u&&Lt(v,i,t,c,o),o.polygonEnd()),v=d=m=null}};return C}}function Vt(n){var t=0,e=ja/3,r=oe(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*ja/180,e=n[1]*ja/180):[t/ja*180,e/ja*180]},u}function Xt(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),a-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(n,t){var e=a-t;return[Math.atan2(n,e)/u,tn((i-(n*n+e*e)*u*u)/(2*u))]},e}function $t(){function n(n,t){Oo+=u*n-r*t,r=n,u=t}var t,e,r,u;Xo.point=function(i,a){Xo.point=n,t=r=i,e=u=a},Xo.lineEnd=function(){n(t,e)}}function Bt(n,t){Io>n&&(Io=n),n>Zo&&(Zo=n),Yo>t&&(Yo=t),t>Vo&&(Vo=t)}function Wt(){function n(n,t){a.push("M",n,",",t,i)}function t(n,t){a.push("M",n,",",t),o.point=e}function e(n,t){a.push("L",n,",",t)}function r(){o.point=n}function u(){a.push("Z")}var i=Jt(4.5),a=[],o={point:n,lineStart:function(){o.point=t},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=n},pointRadius:function(n){return i=Jt(n),o},result:function(){if(a.length){var n=a.join("");return a=[],n}}};return o}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ao+=n,Co+=t,++zo}function Kt(){function n(n,r){var u=n-t,i=r-e,a=Math.sqrt(u*u+i*i);Lo+=a*(t+n)/2,qo+=a*(e+r)/2,To+=a,Gt(t=n,e=r)}var t,e;Bo.point=function(r,u){Bo.point=n,Gt(t=r,e=u)}}function Qt(){Bo.point=Gt}function ne(){function n(n,t){var e=n-r,i=t-u,a=Math.sqrt(e*e+i*i);Lo+=a*(r+n)/2,qo+=a*(u+t)/2,To+=a,a=u*n-r*t,Ro+=a*(r+n),Do+=a*(u+t),Po+=3*a,Gt(r=n,u=t)}var t,e,r,u;Bo.point=function(i,a){Bo.point=n,Gt(t=r=i,e=u=a)},Bo.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+a,e),n.arc(t,e,a,0,Ua)}function e(t,e){n.moveTo(t,e),o.point=r}function r(t,e){n.lineTo(t,e)}function u(){o.point=t}function i(){n.closePath()}var a=4.5,o={point:t,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=t},pointRadius:function(n){return a=n,o},result:b};return o}function ee(n){function t(n){return(o?r:e)(n)}function e(t){return ie(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=i,t.lineStart()}function i(e,r){var i=dt([e,r]),a=n(e,r);u(M,x,y,b,_,w,M=a[0],x=a[1],y=e,b=i[0],_=i[1],w=i[2],o,t),t.point(M,x)}function a(){S.point=e,t.lineEnd()}function l(){r(),S.point=c,S.lineEnd=s}function c(n,t){ -i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,o,t),S.lineEnd=a,a()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:a,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,o,l,c,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=o+g,_=l+p,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=Ma(Ma(w)-1)i||Ma((y*z+M*L)/x-.5)>.3||a>o*g+l*p+c*v)&&(u(t,e,r,o,l,c,A,C,N,b/=S,_/=S,w,d,m),m.point(A,C),u(A,C,N,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,a=Math.cos(30*Oa),o=16;return t.precision=function(n){return arguments.length?(o=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function re(n){var t=ee(function(t,e){return n([t*Ia,e*Ia])});return function(n){return le(t(n))}}function ue(n){this.stream=n}function ie(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ae(n){return oe(function(){return n})()}function oe(n){function t(n){return n=o(n[0]*Oa,n[1]*Oa),[n[0]*h+l,c-n[1]*h]}function e(n){return n=o.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Ia,n[1]*Ia]}function r(){o=Ct(a=fe(m,M,x),i);var n=i(v,d);return l=g-n[0]*h,c=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,a,o,l,c,s,f=ee(function(n,t){return n=i(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Uo,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=le(b(a,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Uo):It((w=+n)*Oa),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Oa,d=n[1]%360*Oa,r()):[v*Ia,d*Ia]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Oa,M=n[1]%360*Oa,x=n.length>2?n[2]%360*Oa:0,r()):[m*Ia,M*Ia,x*Ia]},oa.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function le(n){return ie(n,function(t,e){n.point(t*Oa,e*Oa)})}function ce(n,t){return[n,t]}function se(n,t){return[n>ja?n-Ua:-ja>n?n+Ua:n,t]}function fe(n,t,e){return n?t||e?Ct(ge(n),pe(t,e)):ge(n):t||e?pe(t,e):se}function he(n){return function(t,e){return t+=n,[t>ja?t-Ua:-ja>t?t+Ua:t,e]}}function ge(n){var t=he(n);return t.invert=he(-n),t}function pe(n,t){function e(n,t){var e=Math.cos(t),o=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),s=c*r+o*u;return[Math.atan2(l*i-s*a,o*r-c*u),tn(s*i+l*a)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),a=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),o=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),s=c*i-l*a;return[Math.atan2(l*i+c*a,o*r+s*u),tn(s*r-o*u)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,a,o){var l=a*t;null!=u?(u=de(e,u),i=de(e,i),(a>0?i>u:u>i)&&(u+=a*Ua)):(u=n+a*Ua,i=n-.5*l);for(var c,s=u;a>0?s>i:i>s;s-=l)o.point((c=_t([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Da)%(2*Math.PI)}function me(n,t,e){var r=oa.range(n,t-Da,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function ye(n,t,e){var r=oa.range(n,t-Da,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),a=Math.cos(r),o=Math.sin(r),l=u*Math.cos(n),c=u*Math.sin(n),s=a*Math.cos(e),f=a*Math.sin(e),h=2*Math.asin(Math.sqrt(an(r-t)+u*a*an(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*l+t*s,u=e*c+t*f,a=e*i+t*o;return[Math.atan2(u,r)*Ia,Math.atan2(a,Math.sqrt(r*r+u*u))*Ia]}:function(){return[n*Ia,t*Ia]};return p.distance=h,p}function _e(){function n(n,u){var i=Math.sin(u*=Oa),a=Math.cos(u),o=Ma((n*=Oa)-t),l=Math.cos(o);Wo+=Math.atan2(Math.sqrt((o=a*Math.sin(o))*o+(o=r*i-e*a*l)*o),e*i+r*a*l),t=n,e=i,r=a}var t,e,r;Jo.point=function(u,i){t=u*Oa,e=Math.sin(i*=Oa),r=Math.cos(i),Jo.point=n},Jo.lineEnd=function(){Jo.point=Jo.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(n*i,r*a),Math.asin(r&&e*i/r)]},e}function Se(n,t){function e(n,t){a>0?-Ha+Da>t&&(t=-Ha+Da):t>Ha-Da&&(t=Ha-Da);var e=a/Math.pow(u(t),i);return[e*Math.sin(i*n),a-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(ja/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),a=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=a-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(a/r,1/i))-Ha]},e):Ne}function ke(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return Ma(u)u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var u=n[0],i=e[0],a=t[0]-u,o=r[0]-i,l=n[1],c=e[1],s=t[1]-l,f=r[1]-c,h=(o*(l-c)-f*(u-i))/(f*a-o*s);return[u+h*a,l+h*s]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function je(n){var t=ll.pop()||new Pe;return t.site=n,t}function Ue(n){Be(n),il.remove(n),ll.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,a=n.N,o=[n];Ue(n);for(var l=i;l.circle&&Ma(e-l.circle.x)s;++s)c=o[s],l=o[s-1],nr(c.edge,l.site,c.site,u);l=o[0],c=o[f-1],c.edge=Ke(l.site,c.site,null,u),$e(l),$e(c)}function He(n){for(var t,e,r,u,i=n.x,a=n.y,o=il._;o;)if(r=Oe(o,a)-i,r>Da)o=o.L;else{if(u=i-Ie(o,a),!(u>Da)){r>-Da?(t=o.P,e=o):u>-Da?(t=o,e=o.N):t=e=o;break}if(!o.R){t=o;break}o=o.R}var l=je(n);if(il.insert(t,l),t||e){if(t===e)return Be(t),e=je(t.site),il.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,s=c.x,f=c.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};nr(e.edge,c,p,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,p,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var a=n.P;if(!a)return-(1/0);e=a.site;var o=e.x,l=e.y,c=l-t;if(!c)return o;var s=o-r,f=1/i-1/c,h=s/c;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*c)-l+c/2+u-i/2)))/f+r:(r+o)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,u,i,a,o,l,c,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=ul,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(o=i.edges,l=o.length,a=0;l>a;)s=o[a].end(),r=s.x,u=s.y,c=o[++a%l].start(),t=c.x,e=c.y,(Ma(r-t)>Da||Ma(u-e)>Da)&&(o.splice(a,0,new tr(Qe(i.site,s,Ma(r-f)Da?{x:f,y:Ma(t-f)Da?{x:Ma(e-p)Da?{x:h,y:Ma(t-h)Da?{x:Ma(e-g)=-Pa)){var g=l*l+c*c,p=s*s+f*f,v=(f*g-c*p)/h,d=(l*p-s*g)/h,f=d+o,m=cl.pop()||new Xe;m.arc=n,m.site=u,m.x=v+a,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=ol._;M;)if(m.yd||d>=o)return;if(h>p){if(i){if(i.y>=c)return}else i={x:d,y:l};e={x:d,y:c}}else{if(i){if(i.yr||r>1)if(h>p){if(i){if(i.y>=c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else{if(i){if(i.yg){if(i){if(i.x>=o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}else{if(i){if(i.xi||f>a||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(l>m){var y=Math.sqrt(l=m);r=t-y,u=e-y,i=t+y,a=e+y,o=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,s,f,x,b);break;case 1:c(n,x,f,h,b);break;case 2:c(n,s,b,x,g);break;case 3:c(n,x,b,h,g)}}}(n,r,u,i,a),o}function vr(n,t){n=oa.rgb(n),t=oa.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,a=t.g-r,o=t.b-u;return function(n){return"#"+bn(Math.round(e+i*n))+bn(Math.round(r+a*n))+bn(Math.round(u+o*n))}}function dr(n,t){var e,r={},u={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function mr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function yr(n,t){var e,r,u,i=fl.lastIndex=hl.lastIndex=0,a=-1,o=[],l=[];for(n+="",t+="";(e=fl.exec(n))&&(r=hl.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),o[a]?o[a]+=u:o[++a]=u),(e=e[0])===(r=r[0])?o[a]?o[a]+=r:o[++a]=r:(o[++a]=null,l.push({i:a,x:mr(e,r)})),i=hl.lastIndex;return ir;++r)o[(e=l[r]).i]=e.x(n);return o.join("")})}function Mr(n,t){for(var e,r=oa.interpolators.length;--r>=0&&!(e=oa.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],u=[],i=n.length,a=t.length,o=Math.min(n.length,t.length);for(e=0;o>e;++e)r.push(Mr(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;a>e;++e)u[e]=t[e];return function(n){for(e=0;o>e;++e)u[e]=r[e](n);return u}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Ha)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ua*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ua/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=oa.hcl(n),t=oa.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,a=t.c-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return fn(e+i*n,r+a*n,u+o*n)+""}}function Dr(n,t){n=oa.hsl(n),t=oa.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,a=t.s-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return cn(e+i*n,r+a*n,u+o*n)+""}}function Pr(n,t){n=oa.lab(n),t=oa.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,a=t.a-r,o=t.b-u;return function(n){return gn(e+i*n,r+a*n,u+o*n)+""}}function jr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Ur(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),u=Fr(t,e),i=Hr(Or(e,t,-u))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:mr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:mr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var u=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:u-4,x:mr(n[0],t[0])},{i:u-2,x:mr(n[1],t[1])})}else(1!==t[0]||1!==t[1])&&e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=oa.transform(n),t=oa.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,u=-1,i=r.length;++u=0;)e.push(u[r])}function au(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,a=-1;++ae;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function mu(n){return n.reduce(yu,0)}function yu(n,t){return n+t[1]}function Mu(n,t){return xu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function bu(n){return[oa.min(n),oa.max(n)]}function _u(n,t){return n.value-t.value}function wu(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Su(n,t){n._pack_next=t,t._pack_prev=n}function ku(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Nu(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(c=e.length)){var e,r,u,i,a,o,l,c,s=1/0,f=-(1/0),h=1/0,g=-(1/0);if(e.forEach(Eu),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(u=e[1],u.x=u.r,u.y=0,t(u),c>2))for(i=e[2],zu(r,u,i),t(i),wu(r,i),r._pack_prev=i,wu(i,u),u=r._pack_next,a=3;c>a;a++){zu(r,u,i=e[a]);var p=0,v=1,d=1;for(o=u._pack_next;o!==u;o=o._pack_next,v++)if(ku(o,i)){p=1;break}if(1==p)for(l=r._pack_prev;l!==o._pack_prev&&!ku(l,i);l=l._pack_prev,d++);p?(d>v||v==d&&u.ra;a++)i=e[a],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(Au)}}function Eu(n){n._pack_next=n._pack_prev=n}function Au(n){delete n._pack_next,delete n._pack_prev}function Cu(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,a=u.length;++i=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pu(n,t,e){return n.a.parent===t.parent?n.a:e}function ju(n){return 1+oa.max(n,function(n){return n.y})}function Uu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fu(n){var t=n.children;return t&&t.length?Fu(t[0]):n}function Hu(n){var t,e=n.children;return e&&(t=e.length)?Hu(e[t-1]):n}function Ou(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Iu(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Yu(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zu(n){return n.rangeExtent?n.rangeExtent():Yu(n.range())}function Vu(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Xu(n,t){var e,r=0,u=n.length-1,i=n[r],a=n[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),n[r]=t.floor(i),n[u]=t.ceil(a),n}function $u(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:wl}function Bu(n,t,e,r){var u=[],i=[],a=0,o=Math.min(n.length,t.length)-1;for(n[o]2?Bu:Vu,l=r?Wr:Br;return a=u(n,t,l,e),o=u(t,n,l,Mr),i}function i(n){return a(n)}var a,o;return i.invert=function(n){return o(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(jr)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Qu(n,t)},i.tickFormat=function(t,e){return ni(n,t,e)},i.nice=function(t){return Gu(n,t),u()},i.copy=function(){return Wu(n,t,e,r)},u()}function Ju(n,t){return oa.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gu(n,t){return Xu(n,$u(Ku(n,t)[2]))}function Ku(n,t){null==t&&(t=10);var e=Yu(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Qu(n,t){return oa.range.apply(oa,Ku(n,t))}function ni(n,t,e){var r=Ku(n,t);if(e){var u=so.exec(e);if(u.shift(),"s"===u[8]){var i=oa.formatPrefix(Math.max(Ma(r[0]),Ma(r[1])));return u[7]||(u[7]="."+ti(i.scale(r[2]))),u[8]="f",e=oa.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+ei(u[8],r)),e=u.join("")}else e=",."+ti(r[2])+"f";return oa.format(e)}function ti(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function ei(n,t){var e=ti(t[2]);return n in Sl?Math.abs(e-ti(Math.max(Ma(t[0]),Ma(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ri(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function a(t){return n(u(t))}return a.invert=function(t){return i(n.invert(t))},a.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),a):r},a.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),a):t},a.nice=function(){var t=Xu(r.map(u),e?Math:Nl);return n.domain(t),r=t.map(i),a},a.ticks=function(){var n=Yu(r),a=[],o=n[0],l=n[1],c=Math.floor(u(o)),s=Math.ceil(u(l)),f=t%1?2:t;if(isFinite(s-c)){if(e){for(;s>c;c++)for(var h=1;f>h;h++)a.push(i(c)*h);a.push(i(c))}else for(a.push(i(c));c++0;h--)a.push(i(c)*h);for(c=0;a[c]l;s--);a=a.slice(c,s)}return a},a.tickFormat=function(n,t){if(!arguments.length)return kl;arguments.length<2?t=kl:"function"!=typeof t&&(t=oa.format(t));var r,o=Math.max(.1,n/a.ticks().length),l=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(l(u(n)+r))<=o?t(n):""}},a.copy=function(){return ri(n.copy(),t,e,r)},Ju(a,n)}function ui(n,t,e){function r(t){return n(u(t))}var u=ii(t),i=ii(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Qu(e,n)},r.tickFormat=function(n,t){return ni(e,n,t)},r.nice=function(n){return r.domain(Gu(e,n))},r.exponent=function(a){return arguments.length?(u=ii(t=a),i=ii(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return ui(n.copy(),t,e)},Ju(r,n)}function ii(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ai(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):NaN))-1)%i.length]}function r(t,e){return oa.range(n.length).map(function(n){return t+e*n})}var u,i,a;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new c;for(var i,a=-1,o=r.length;++ae?[NaN,NaN]:[e>0?o[e-1]:n[0],et?NaN:t/i+n,[t,t+1/i]},r.copy=function(){return li(n,t,e)},u()}function ci(n,t){function e(e){return e>=e?t[oa.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return ci(n,t)},e}function si(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qu(n,t)},t.tickFormat=function(t,e){return ni(n,t,e)},t.copy=function(){return si(n)},t}function fi(){return 0}function hi(n){return n.innerRadius}function gi(n){return n.outerRadius}function pi(n){return n.startAngle}function vi(n){return n.endAngle}function di(n){return n&&n.padAngle}function mi(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function yi(n,t,e,r,u){var i=n[0]-t[0],a=n[1]-t[1],o=(u?r:-r)/Math.sqrt(i*i+a*a),l=o*a,c=-o*i,s=n[0]+l,f=n[1]+c,h=t[0]+l,g=t[1]+c,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(Math.max(0,M*M*y-x*x)),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,N=_-p,E=w-v,A=S-p,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mi(n){function t(t){function a(){c.push("M",i(n(s),o))}for(var l,c=[],s=[],f=-1,h=t.length,g=En(e),p=En(r);++f1?n.join("L"):n+"Z"}function bi(n){return n.join("L")+"Z"}function _i(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1&&u.push("H",r[0]),u.join("")}function wi(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1){o=t[1],i=n[l],l++,r+="C"+(u[0]+a[0])+","+(u[1]+a[1])+","+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1];for(var c=2;c9&&(u=3*t/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;++o<=l;)u=(n[Math.min(l,o+1)][0]-n[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function Fi(n){return n.length<3?xi(n):n[0]+Ai(n,Ui(n))}function Hi(n){for(var t,e,r,u=-1,i=n.length;++u=t?a(n-t):void(s.c=a)}function a(e){var u=p.active,i=p[u];i&&(i.timer.c=null,i.timer.t=NaN,--p.count,delete p[u],i.event&&i.event.interrupt.call(n,n.__data__,i.index));for(var a in p)if(r>+a){var c=p[a];c.timer.c=null,c.timer.t=NaN,--p.count,delete p[a]}s.c=o,qn(function(){return s.c&&o(e||1)&&(s.c=null,s.t=NaN),1},0,l),p.active=r,v.event&&v.event.start.call(n,n.__data__,t),g=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&g.push(r)}),h=v.ease,f=v.duration}function o(u){for(var i=u/f,a=h(i),o=g.length;o>0;)g[--o].call(n,a);return i>=1?(v.event&&v.event.end.call(n,n.__data__,t),--p.count?delete p[r]:delete n[e],1):void 0}var l,s,f,h,g,p=n[e]||(n[e]={active:0,count:0}),v=p[r];v||(l=u.time,s=qn(i,0,l),v=p[r]={tween:new c,time:l,timer:s,delay:u.delay,duration:u.duration,ease:u.ease,index:t},u=null,++p.count)}function na(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function ta(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function ea(n){return n.toISOString()}function ra(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=oa.bisect(Gl,u);return i==Gl.length?[t.year,Ku(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Gl[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=ua(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=ua(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yu(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],ua(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ra(n.copy(),t,e)},Ju(r,n)}function ua(n){return new Date(n)}function ia(n){return JSON.parse(n.responseText)}function aa(n){var t=sa.createRange();return t.selectNode(sa.body),t.createContextualFragment(n.responseText)}var oa={version:"3.5.10"},la=[].slice,ca=function(n){return la.call(n)},sa=this.document;if(sa)try{ca(sa.documentElement.childNodes)[0].nodeType}catch(fa){ca=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),sa)try{sa.createElement("DIV").style.setProperty("opacity",0,"")}catch(ha){var ga=this.Element.prototype,pa=ga.setAttribute,va=ga.setAttributeNS,da=this.CSSStyleDeclaration.prototype,ma=da.setProperty;ga.setAttribute=function(n,t){pa.call(this,n,t+"")},ga.setAttributeNS=function(n,t,e){va.call(this,n,t,e+"")},da.setProperty=function(n,t,e){ma.call(this,n,t+"",e)}}oa.ascending=e,oa.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},oa.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ur&&(e=r)}else{for(;++u=r){e=r;break}for(;++ur&&(e=r)}return e},oa.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ue&&(e=r)}else{for(;++u=r){e=r;break}for(;++ue&&(e=r)}return e},oa.extent=function(n,t){var e,r,u,i=-1,a=n.length;if(1===arguments.length){for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}else{for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}return[e,u]},oa.sum=function(n,t){var e,r=0,i=n.length,a=-1;if(1===arguments.length)for(;++a1?l/(s-1):void 0},oa.deviation=function(){var n=oa.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ya=i(e);oa.bisectLeft=ya.left,oa.bisect=oa.bisectRight=ya.right,oa.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},oa.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},oa.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},oa.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},oa.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=oa.min(arguments,a),e=new Array(t);++n=0;)for(r=n[u],t=r.length;--t>=0;)e[--a]=r[t];return e};var Ma=Math.abs;oa.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,u=[],i=o(Ma(e)),a=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++a)>t;)u.push(r/i);else for(;(r=n+e*++a)=i.length)return r?r.call(u,a):e?a.sort(e):a;for(var l,s,f,h,g=-1,p=a.length,v=i[o++],d=new c;++g=i.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],a=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(oa.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return a[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},oa.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(m,{has:h,add:function(n){return this._[s(n+="")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),oa.behavior={},oa.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},oa.event=null,oa.requote=function(n){return n.replace(wa,"\\$&")};var wa=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,Sa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ka=function(n,t){return t.querySelector(n)},Na=function(n,t){return t.querySelectorAll(n)},Ea=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ea=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(ka=function(n,t){return Sizzle(n,t)[0]||null},Na=Sizzle,Ea=Sizzle.matchesSelector),oa.selection=function(){return oa.select(sa.documentElement)};var Aa=oa.selection.prototype=[];Aa.select=function(n){var t,e,r,u,i=[];n=A(n);for(var a=-1,o=this.length;++a=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Ca.hasOwnProperty(e)?{space:Ca[e],local:n}:n}},Aa.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=oa.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Aa.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++uu){if("string"!=typeof n){2>u&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Aa.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(j(t,n[t]));return this}return this.each(j(n,t))},Aa.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Aa.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Aa.append=function(n){return n=U(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Aa.insert=function(n,t){return n=U(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Aa.remove=function(){return this.each(F)},Aa.data=function(n,t){function e(n,e){var r,u,i,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new c,y=new Array(a);for(r=-1;++rr;++r)p[r]=H(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,o.push(p),l.push(g),s.push(v)}var r,u,i=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++ii;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var o=0,l=e.length;l>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return E(u)},Aa.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},Aa.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},Aa.size=function(){var n=0;return Y(this,function(){++n}),n};var za=[];oa.selection.enter=Z,oa.selection.enter.prototype=za,za.append=Aa.append,za.empty=Aa.empty,za.node=Aa.node,za.call=Aa.call,za.size=Aa.size,za.select=function(n){for(var t,e,r,u,i,a=[],o=-1,l=this.length;++or){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var La=oa.map({mouseenter:"mouseover",mouseleave:"mouseout"});sa&&La.forEach(function(n){"on"+n in sa&&La.remove(n)});var qa,Ta=0;oa.mouse=function(n){return J(n,k())};var Ra=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;oa.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},oa.behavior.drag=function(){function n(){this.on("mousedown.drag",i).on("touchstart.drag",a)}function e(n,t,e,i,a){return function(){function o(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(m.on(i+d,null).on(a+d,null),y(p),g({type:"dragend"}))}var c,s=this,f=oa.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=oa.select(e(f)).on(i+d,o).on(a+d,l),y=W(f),M=t(h,v);u?(c=u.apply(s,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],g({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),u=null,i=e(b,oa.mouse,t,"mousemove","mouseup"),a=e(G,oa.touch,y,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},oa.rebind(n,r,"on")},oa.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ca(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Da=1e-6,Pa=Da*Da,ja=Math.PI,Ua=2*ja,Fa=Ua-Da,Ha=ja/2,Oa=ja/180,Ia=180/ja,Ya=Math.SQRT2,Za=2,Va=4;oa.interpolateZoom=function(n,t){var e,r,u=n[0],i=n[1],a=n[2],o=t[0],l=t[1],c=t[2],s=o-u,f=l-i,h=s*s+f*f;if(Pa>h)r=Math.log(c/a)/Ya,e=function(n){return[u+n*s,i+n*f,a*Math.exp(Ya*n*r)]};else{var g=Math.sqrt(h),p=(c*c-a*a+Va*h)/(2*a*Za*g),v=(c*c-a*a-Va*h)/(2*c*Za*g),d=Math.log(Math.sqrt(p*p+1)-p),m=Math.log(Math.sqrt(v*v+1)-v);r=(m-d)/Ya,e=function(n){var t=n*r,e=rn(d),o=a/(Za*g)*(e*un(Ya*t+d)-en(d));return[u+o*s,i+o*f,a*e/rn(Ya*t+d)]}}return e.duration=1e3*r,e},oa.behavior.zoom=function(){function n(n){n.on(L,f).on($a+".zoom",g).on("dblclick.zoom",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(A[0],Math.min(A[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function a(t,e,r,a){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,a)),i(d=e,r),t=oa.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function o(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){o(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||(n({type:"zoomend"}),d=null)}function f(){function n(){o=1,i(oa.mouse(u),h),c(a)}function r(){f.on(q,null).on(T,null),g(o),s(a)}var u=this,a=D.of(u,arguments),o=0,f=oa.select(t(u)).on(q,n).on(T,r),h=e(oa.mouse(u)),g=W(u);Ol.call(u),l(a)}function h(){function n(){var n=oa.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=oa.event.target;oa.select(t).on(x,r).on(b,o),_.push(t);for(var e=oa.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var s=l[0];a(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var s=l[0],f=l[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,a=oa.touches(p);Ol.call(p);for(var o=0,l=a.length;l>o;++o,r=null)if(e=a[o],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),c(v)}function o(){if(oa.event.touches.length){for(var t=oa.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}oa.selectAll(_).on(y,null),w.on(L,f).on(R,h),N(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=".zoom-"+oa.event.changedTouches[0].identifier,x="touchmove"+y,b="touchend"+y,_=[],w=oa.select(p),N=W(p);t(),l(v),w.on(L,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(Ol.call(this),v=e(d=m||oa.mouse(this)),l(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Xa())*k.k),i(d,v),c(n)}function p(){var n=oa.mouse(this),t=Math.log(k.k)/Math.LN2;a(this,n,e(n),oa.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Ba,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return $a||($a="onwheel"in sa?(Xa=function(){return-oa.event.deltaY*(oa.event.deltaMode?120:1)},"wheel"):"onmousewheel"in sa?(Xa=function(){return oa.event.wheelDelta},"mousewheel"):(Xa=function(){return-oa.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Fl?oa.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],u=d?d[0]:e/2,i=d?d[1]:r/2,a=oa.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=a(t),o=e/r[2];this.__chart__=k={x:u-r[0]*o,y:i-r[1]*o,k:o},c(n)}}).each("interrupt.zoom",function(){s(n)}).each("end.zoom",function(){s(n)}):(this.__chart__=k,l(n),c(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},o(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},u(+t),o(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Ba:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},oa.rebind(n,D,"on")};var Xa,$a,Ba=[0,1/0];oa.color=on,on.prototype.toString=function(){return this.rgb()+""},oa.hsl=ln;var Wa=ln.prototype=new on;Wa.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Wa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Wa.rgb=function(){return cn(this.h,this.s,this.l)},oa.hcl=sn;var Ja=sn.prototype=new on;Ja.brighter=function(n){return new sn(this.h,this.c,Math.min(100,this.l+Ga*(arguments.length?n:1)))},Ja.darker=function(n){return new sn(this.h,this.c,Math.max(0,this.l-Ga*(arguments.length?n:1)))},Ja.rgb=function(){return fn(this.h,this.c,this.l).rgb()},oa.lab=hn;var Ga=18,Ka=.95047,Qa=1,no=1.08883,to=hn.prototype=new on;to.brighter=function(n){return new hn(Math.min(100,this.l+Ga*(arguments.length?n:1)),this.a,this.b)},to.darker=function(n){return new hn(Math.max(0,this.l-Ga*(arguments.length?n:1)),this.a,this.b)},to.rgb=function(){return gn(this.l,this.a,this.b)},oa.rgb=yn;var eo=yn.prototype=new on;eo.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new yn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new yn(u,u,u)},eo.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new yn(n*this.r,n*this.g,n*this.b)},eo.hsl=function(){return wn(this.r,this.g,this.b)},eo.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ro=oa.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ro.forEach(function(n,t){ro.set(n,Mn(t))}),oa.functor=En,oa.xhr=An(y),oa.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var a=Cn(n,t,null==e?r:u(e),i);return a.row=function(n){return arguments.length?a.response(null==(e=n)?r:u(n)):e},a}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(a).join(n)}function a(n){return o.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var o=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=c)return a;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++s;){var r=n.charCodeAt(s++),o=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++o);else if(r!==l)continue;return n.slice(t,s-o)}return n.slice(t)}for(var r,u,i={},a={},o=[],c=n.length,s=0,f=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();t&&null==(h=t(h,f++))||o.push(h)}return o},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},oa.csv=oa.dsv(",","text/csv"),oa.tsv=oa.dsv(" ","text/tab-separated-values");var uo,io,ao,oo,lo=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};oa.timer=function(){qn.apply(this,arguments)},oa.timer.flush=function(){Rn(),Dn()},oa.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var co=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(jn);oa.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=oa.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),co[8+e/3]};var so=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,fo=oa.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=oa.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ho=oa.time={},go=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){po.setUTCDate.apply(this._,arguments)},setDay:function(){po.setUTCDay.apply(this._,arguments)},setFullYear:function(){po.setUTCFullYear.apply(this._,arguments)},setHours:function(){po.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){po.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){po.setUTCMinutes.apply(this._,arguments)},setMonth:function(){po.setUTCMonth.apply(this._,arguments)},setSeconds:function(){po.setUTCSeconds.apply(this._,arguments)},setTime:function(){po.setTime.apply(this._,arguments)}};var po=Date.prototype;ho.year=On(function(n){return n=ho.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ho.years=ho.year.range,ho.years.utc=ho.year.utc.range,ho.day=On(function(n){var t=new go(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ho.days=ho.day.range,ho.days.utc=ho.day.utc.range,ho.dayOfYear=function(n){var t=ho.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ho[n]=On(function(n){return(n=ho.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ho.year(n).getDay();return Math.floor((ho.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ho[n+"s"]=e.range,ho[n+"s"].utc=e.utc.range,ho[n+"OfYear"]=function(n){var e=ho.year(n).getDay();return Math.floor((ho.dayOfYear(n)+(e+t)%7)/7)}}),ho.week=ho.sunday,ho.weeks=ho.sunday.range,ho.weeks.utc=ho.sunday.utc.range,ho.weekOfYear=ho.sundayOfYear;var vo={"-":"",_:" ",0:"0"},mo=/^\s*\d+/,yo=/^%/;oa.locale=function(n){return{numberFormat:Un(n),timeFormat:Yn(n)}};var Mo=oa.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], -shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});oa.format=Mo.numberFormat,oa.geo={},st.prototype={s:0,t:0,add:function(n){ft(n,this.t,xo),ft(xo.s,this.s,this),this.s?this.t+=xo.t:this.s=xo.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var xo=new st;oa.geo.stream=function(n,t){n&&bo.hasOwnProperty(n.type)?bo[n.type](n,t):ht(n,t)};var bo={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++rn?4*ja+n:n,ko.lineStart=ko.lineEnd=ko.point=b}};oa.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=dt([t*Oa,e*Oa]);if(m){var u=yt(m,r),i=[u[1],-u[0],0],a=yt(i,u);bt(a),a=_t(a);var l=t-p,c=l>0?1:-1,v=a[0]*Ia*c,d=Ma(l)>180;if(d^(v>c*p&&c*t>v)){var y=a[1]*Ia;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>c*p&&c*t>v)){var y=-a[1]*Ia;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=Ma(r)>180?r+(r>0?360:-360):r}else v=n,d=e;ko.point(n,e),t(n,e)}function i(){ko.lineStart()}function a(){u(v,d),ko.lineEnd(),Ma(y)>Da&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function o(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nSo?(s=-(h=180),f=-(g=90)):y>Da?g=90:-Da>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],oa.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],c(e[0],u)||c(e[1],u)?(o(u[0],e[1])>o(u[0],u[1])&&(u[1]=e[1]),o(e[0],u[1])>o(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var a,e,p=-(1/0),t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(a=o(u[1],e[0]))>p&&(p=a,s=e[0],h=u[1])}return M=x=null,s===1/0||f===1/0?[[NaN,NaN],[NaN,NaN]]:[[s,f],[h,g]]}}(),oa.geo.centroid=function(n){No=Eo=Ao=Co=zo=Lo=qo=To=Ro=Do=Po=0,oa.geo.stream(n,jo);var t=Ro,e=Do,r=Po,u=t*t+e*e+r*r;return Pa>u&&(t=Lo,e=qo,r=To,Da>Eo&&(t=Ao,e=Co,r=zo),u=t*t+e*e+r*r,Pa>u)?[NaN,NaN]:[Math.atan2(e,t)*Ia,tn(r/Math.sqrt(u))*Ia]};var No,Eo,Ao,Co,zo,Lo,qo,To,Ro,Do,Po,jo={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){jo.lineStart=At},polygonEnd:function(){jo.lineStart=Nt}},Uo=Rt(zt,Ut,Ht,[-ja,-ja/2]),Fo=1e9;oa.geo.clipExtent=function(){var n,t,e,r,u,i,a={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(o){return arguments.length?(i=Zt(n=+o[0][0],t=+o[0][1],e=+o[1][0],r=+o[1][1]),u&&(u.valid=!1,u=null),a):[[n,t],[e,r]]}};return a.extent([[0,0],[960,500]])},(oa.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,oa.geo.albers=function(){return oa.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},oa.geo.albersUsa=function(){function n(n){var i=n[0],a=n[1];return t=null,e(i,a),t||(r(i,a),t)||u(i,a),t}var t,e,r,u,i=oa.geo.albers(),a=oa.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),o=oa.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?a:u>=.166&&.234>u&&r>=-.214&&-.115>r?o:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=a.stream(n),r=o.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),a.precision(t),o.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),a.scale(.35*t),o.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var c=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*c,f-.238*c],[s+.455*c,f+.238*c]]).stream(l).point,r=a.translate([s-.307*c,f+.201*c]).clipExtent([[s-.425*c+Da,f+.12*c+Da],[s-.214*c-Da,f+.234*c-Da]]).stream(l).point,u=o.translate([s-.205*c,f+.212*c]).clipExtent([[s-.214*c+Da,f+.166*c+Da],[s-.115*c-Da,f+.234*c-Da]]).stream(l).point,n},n.scale(1070)};var Ho,Oo,Io,Yo,Zo,Vo,Xo={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Oo=0,Xo.lineStart=$t},polygonEnd:function(){Xo.lineStart=Xo.lineEnd=Xo.point=b,Ho+=Ma(Oo/2)}},$o={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Bo={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Bo.lineStart=ne},polygonEnd:function(){Bo.point=Gt,Bo.lineStart=Kt,Bo.lineEnd=Qt}};oa.geo.path=function(){function n(n){return n&&("function"==typeof o&&i.pointRadius(+o.apply(this,arguments)),a&&a.valid||(a=u(i)),oa.geo.stream(n,a)),i.result()}function t(){return a=null,n}var e,r,u,i,a,o=4.5;return n.area=function(n){return Ho=0,oa.geo.stream(n,u(Xo)),Ho},n.centroid=function(n){return Ao=Co=zo=Lo=qo=To=Ro=Do=Po=0,oa.geo.stream(n,u(Bo)),Po?[Ro/Po,Do/Po]:To?[Lo/To,qo/To]:zo?[Ao/zo,Co/zo]:[NaN,NaN]},n.bounds=function(n){return Zo=Vo=-(Io=Yo=1/0),oa.geo.stream(n,u($o)),[[Io,Yo],[Zo,Vo]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||re(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Wt:new te(n),"function"!=typeof o&&i.pointRadius(o),t()):r},n.pointRadius=function(t){return arguments.length?(o="function"==typeof t?t:(i.pointRadius(+t),+t),n):o},n.projection(oa.geo.albersUsa()).context(null)},oa.geo.transform=function(n){return{stream:function(t){var e=new ue(t);for(var r in n)e[r]=n[r];return e}}},ue.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},oa.geo.projection=ae,oa.geo.projectionMutator=oe,(oa.geo.equirectangular=function(){return ae(ce)}).raw=ce.invert=ce,oa.geo.rotation=function(n){function t(t){return t=n(t[0]*Oa,t[1]*Oa),t[0]*=Ia,t[1]*=Ia,t}return n=fe(n[0]%360*Oa,n[1]*Oa,n.length>2?n[2]*Oa:0),t.invert=function(t){return t=n.invert(t[0]*Oa,t[1]*Oa),t[0]*=Ia,t[1]*=Ia,t},t},se.invert=ce,oa.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=fe(-n[0]*Oa,-n[1]*Oa,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ia,n[1]*=Ia}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Oa,u*Oa),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Oa,(u=+r)*Oa),n):u},n.angle(90)},oa.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Oa,u=n[1]*Oa,i=t[1]*Oa,a=Math.sin(r),o=Math.cos(r),l=Math.sin(u),c=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*a)*e+(e=c*s-l*f*o)*e),l*s+c*f*o)},oa.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return oa.range(Math.ceil(i/d)*d,u,d).map(h).concat(oa.range(Math.ceil(c/m)*m,l,m).map(g)).concat(oa.range(Math.ceil(r/p)*p,e,p).filter(function(n){return Ma(n%d)>Da}).map(s)).concat(oa.range(Math.ceil(o/v)*v,a,v).filter(function(n){return Ma(n%m)>Da}).map(f))}var e,r,u,i,a,o,l,c,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(l).slice(1),h(u).reverse().slice(1),g(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],c=+t[0][1],l=+t[1][1],i>u&&(t=i,i=u,u=t),c>l&&(t=c,c=l,l=t),n.precision(y)):[[i,c],[u,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],o=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),o>a&&(t=o,o=a,a=t),n.precision(y)):[[r,o],[e,a]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=me(o,a,90),f=ye(r,e,y),h=me(c,l,90),g=ye(i,u,y),n):y},n.majorExtent([[-180,-90+Da],[180,90-Da]]).minorExtent([[-180,-80-Da],[180,80+Da]])},oa.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=Me,u=xe;return n.distance=function(){return oa.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},oa.geo.interpolate=function(n,t){return be(n[0]*Oa,n[1]*Oa,t[0]*Oa,t[1]*Oa)},oa.geo.length=function(n){return Wo=0,oa.geo.stream(n,Jo),Wo};var Wo,Jo={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Go=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(oa.geo.azimuthalEqualArea=function(){return ae(Go)}).raw=Go;var Ko=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(oa.geo.azimuthalEquidistant=function(){return ae(Ko)}).raw=Ko,(oa.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(oa.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var Qo=we(function(n){return 1/n},Math.atan);(oa.geo.gnomonic=function(){return ae(Qo)}).raw=Qo,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ha]},(oa.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var nl=we(function(){return 1},Math.asin);(oa.geo.orthographic=function(){return ae(nl)}).raw=nl;var tl=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(oa.geo.stereographic=function(){return ae(tl)}).raw=tl,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ha]},(oa.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,oa.geom={},oa.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=En(e),i=En(r),a=n.length,o=[],l=[];for(t=0;a>t;t++)o.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(o.sort(qe),t=0;a>t;t++)l.push([o[t][0],-o[t][1]]);var c=Le(o),s=Le(l),f=s[0]===c[0],h=s[s.length-1]===c[c.length-1],g=[];for(t=c.length-1;t>=0;--t)g.push(n[o[c[t]][2]]);for(t=+f;t=r&&c.x<=i&&c.y>=u&&c.y<=a?[[r,a],[i,a],[i,u],[r,u]]:[];s.point=n[o]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Da)*Da,y:Math.round(a(n,t)/Da)*Da,i:t}})}var r=Ce,u=ze,i=r,a=u,o=sl;return n?t(n):(t.links=function(n){return or(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return or(e(n)).cells.forEach(function(e,r){for(var u,i,a=e.site,o=e.edges.sort(Ve),l=-1,c=o.length,s=o[c-1].edge,f=s.l===a?s.r:s.l;++l=c,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=hr()),f?u=c:o=c,h?a=s:l=s,i(n,t,e,r,u,a,o,l)}var s,f,h,g,p,v,d,m,y,M=En(o),x=En(l);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,a)for(g=0;p>g;++g)s=n[g],s.xm&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=hr();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){gr(n,k,v,d,m,y)},k.find=function(n){return pr(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=pl.get(e)||gl,r=vl.get(r)||y,br(r(e.apply(null,la.call(arguments,1))))},oa.interpolateHcl=Rr,oa.interpolateHsl=Dr,oa.interpolateLab=Pr,oa.interpolateRound=jr,oa.transform=function(n){var t=sa.createElementNS(oa.ns.prefix.svg,"g");return(oa.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Ur(e?e.matrix:dl)})(n)},Ur.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var dl={a:1,b:0,c:0,d:1,e:0,f:0};oa.interpolateTransform=$r,oa.layout={},oa.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++eo*o/m){if(v>l){var c=t.charge/l;n.px-=i*c,n.py-=a*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=i*c,n.py-=a*c}}return!t.charge}}function t(n){n.px=oa.event.x,n.py=oa.event.y,l.resume()}var e,r,u,i,a,o,l={},c=oa.dispatch("start","tick","end"),s=[1,1],f=.9,h=ml,g=yl,p=-30,v=Ml,d=.1,m=.64,M=[],x=[];return l.tick=function(){if((u*=.99)<.005)return e=null,c.end({type:"end",alpha:u=0}),!0;var t,r,l,h,g,v,m,y,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,g=l.target,y=g.x-h.x,b=g.y-h.y,(v=y*y+b*b)&&(v=u*a[r]*((v=Math.sqrt(v))-i[r])/v,y*=v,b*=v,g.x-=y*(m=h.weight+g.weight?h.weight/(h.weight+g.weight):.5),g.y-=b*m,h.x+=y*(m=1-m),h.y+=b*m);if((m=u*d)&&(y=s[0]/2,b=s[1]/2,r=-1,m))for(;++r<_;)l=M[r],l.x+=(y-l.x)*m,l.y+=(b-l.y)*m;if(p)for(ru(t=oa.geom.quadtree(M),u,o),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*f,l.y-=(l.py-(l.py=l.y))*f);c.tick({type:"tick",alpha:u})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(s=n,l):s},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.friction=function(n){return arguments.length?(f=+n,l):f},l.charge=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(m=n*n,l):Math.sqrt(m)},l.alpha=function(n){return arguments.length?(n=+n,u?n>0?u=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:u=0})):n>0&&(c.start({type:"start",alpha:u=n}),e=qn(l.tick)),l):u},l.start=function(){function n(n,r){if(!e){for(e=new Array(u),l=0;u>l;++l)e[l]=[];for(l=0;c>l;++l){var i=x[l];e[i.source.index].push(i.target),e[i.target.index].push(i.source)}}for(var a,o=e[t],l=-1,s=o.length;++lt;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;u>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",f)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(i=[],"function"==typeof h)for(t=0;c>t;++t)i[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)i[t]=h;if(a=[],"function"==typeof g)for(t=0;c>t;++t)a[t]=+g.call(this,x[t],t);else for(t=0;c>t;++t)a[t]=g;if(o=[],"function"==typeof p)for(t=0;u>t;++t)o[t]=+p.call(this,M[t],t);else for(t=0;u>t;++t)o[t]=p;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=oa.behavior.drag().origin(y).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",nu)),arguments.length?void this.on("mouseover.force",tu).on("mouseout.force",eu).call(r):r},oa.rebind(l,c,"on")};var ml=20,yl=1,Ml=1/0;oa.layout.hierarchy=function(){function n(u){var i,a=[u],o=[];for(u.depth=0;null!=(i=a.pop());)if(o.push(i),(c=e.call(n,i,i.depth))&&(l=c.length)){for(var l,c,s;--l>=0;)a.push(s=c[l]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=c}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return au(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),o}var t=cu,e=ou,r=lu;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(iu(t,function(n){n.children&&(n.value=0)}),au(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},oa.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(a=i.length)){var a,o,l,c=-1;for(r=t.value?r/t.value:0;++cf?-1:1),p=oa.sum(c),v=p?(f-l*g)/p:0,d=oa.range(l),m=[];return null!=e&&d.sort(e===xl?function(n,t){return c[t]-c[n]}:function(n,t){return e(a[n],a[t])}),d.forEach(function(n){m[n]={data:a[n],value:o=c[n],startAngle:s,endAngle:s+=o*v+g,padAngle:h}}),m}var t=Number,e=xl,r=0,u=Ua,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var xl={};oa.layout.stack=function(){function n(o,l){if(!(h=o.length))return o;var c=o.map(function(e,r){return t.call(n,e,r)}),s=c.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),a.call(n,t,e)]})}),f=e.call(n,s,l);c=oa.permute(c,f),s=oa.permute(s,f);var h,g,p,v,d=r.call(n,s,l),m=c[0].length;for(p=0;m>p;++p)for(u.call(n,c[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,c[g][p],v+=s[g-1][p][1],s[g][p][1]);return o}var t=y,e=pu,r=vu,u=gu,i=fu,a=hu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:bl.get(t)||pu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:_l.get(t)||vu,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(a=t,n):a},n.out=function(t){return arguments.length?(u=t,n):u},n};var bl=oa.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(du),i=n.map(mu),a=oa.range(r).sort(function(n,t){return u[n]-u[t]}),o=0,l=0,c=[],s=[];for(t=0;r>t;++t)e=a[t],l>o?(o+=i[e],c.push(e)):(l+=i[e],s.push(e));return s.reverse().concat(c)},reverse:function(n){return oa.range(n.length).reverse()},"default":pu}),_l=oa.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,a=[],o=0,l=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)l[e]=(o-a[e])/2;return l},wiggle:function(n){var t,e,r,u,i,a,o,l,c,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=l=c=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,o=f[e][0]-f[e-1][0];s>t;++t){for(r=0,a=(n[t][e][1]-n[t][e-1][1])/(2*o);t>r;++r)a+=(n[r][e][1]-n[r][e-1][1])/o;i+=a*n[t][e][1]}g[e]=l-=u?i/u*o:0,c>l&&(c=l)}for(e=0;h>e;++e)g[e]-=c;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:vu});oa.layout.histogram=function(){function n(n,i){for(var a,o,l=[],c=n.map(e,this),s=r.call(this,c,i),f=u.call(this,s,c,i),i=-1,h=c.length,g=f.length-1,p=t?1:1/h;++i0)for(i=-1;++i=s[0]&&o<=s[1]&&(a=l[oa.bisect(f,o,1,g)-1],a.y+=p,a.push(n[i]));return l}var t=!0,e=Number,r=bu,u=Mu;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return xu(n,t)}:En(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},oa.layout.pack=function(){function n(n,i){var a=e.call(this,n,i),o=a[0],l=u[0],c=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(o.x=o.y=0,au(o,function(n){n.r=+s(n.value)}),au(o,Nu),r){var f=r*(t?1:Math.max(2*o.r/l,2*o.r/c))/2;au(o,function(n){n.r+=f}),au(o,Nu),au(o,function(n){n.r-=f})}return Cu(o,l/2,c/2,t?1:1/Math.max(2*o.r/l,2*o.r/c)),a}var t,e=oa.layout.hierarchy().sort(_u),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},uu(n,e)},oa.layout.tree=function(){function n(n,u){var s=a.call(this,n,u),f=s[0],h=t(f);if(au(h,e),h.parent.m=-h.z,iu(h,r),c)iu(f,i);else{var g=f,p=f,v=f;iu(f,function(n){n.xp.x&&(p=n),n.depth>v.depth&&(v=n)});var d=o(g,p)/2-g.x,m=l[0]/(p.x+o(p,g)/2+d),y=l[1]/(v.depth||1);iu(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,a=0,o=i.length;o>a;++a)r.push((i[a]=u={_:i[a],parent:t,children:(u=i[a].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:a}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Du(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+o(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+o(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,a=t,l=u.parent.children[0],c=u.m,s=i.m,f=a.m,h=l.m;a=Tu(a),u=qu(u),a&&u;)l=qu(l),i=Tu(i),i.a=n,r=a.z+f-u.z-c+o(a._,u._),r>0&&(Ru(Pu(a,n,e),n,r),c+=r,s+=r),f+=a.m,c+=u.m,h+=l.m,s+=i.m;a&&!Tu(i)&&(i.t=a,i.m+=f-s),u&&!qu(l)&&(l.t=u,l.m+=c-h,e=n)}return e}function i(n){n.x*=l[0],n.y=n.depth*l[1]}var a=oa.layout.hierarchy().sort(null).value(null),o=Lu,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(o=t,n):o},n.size=function(t){return arguments.length?(c=null==(l=t)?i:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:i,n):c?l:null},uu(n,a)},oa.layout.cluster=function(){function n(n,i){var a,o=t.call(this,n,i),l=o[0],c=0;au(l,function(n){var t=n.children;t&&t.length?(n.x=Uu(t),n.y=ju(t)):(n.x=a?c+=e(n,a):0,n.y=0,a=n)});var s=Fu(l),f=Hu(l),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return au(l,u?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),o}var t=oa.layout.hierarchy().sort(null).value(null),e=Lu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},uu(n,t)},oa.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++ut?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var a,o,l,c=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?c.dx:"dice"===g?c.dy:"slice-dice"===g?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),s.area=0;(l=h.length)>0;)s.push(a=h[l-1]),s.area+=a.area,"squarify"!==g||(o=r(s,v))<=p?(h.pop(),p=o):(s.area-=s.pop().area,u(s,v,c,!1),v=Math.min(c.dx,c.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,c,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,a=f(t),o=r.slice(),l=[];for(n(o,a.dx*a.dy/t.value),l.area=0;i=o.pop();)l.push(i),l.area+=i.area,null!=i.z&&(u(l,i.z?a.dx:a.dy,a,!o.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,a=-1,o=n.length;++ae&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,a=n.length,o=e.x,c=e.y,s=t?l(n.area/t):0; -if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++ie.dx)&&(s=e.dx);++ie&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=oa.random.normal.apply(oa,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=oa.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},oa.scale={};var wl={floor:y,ceil:y};oa.scale.linear=function(){return Wu([0,1],[0,1],Mr,!1)};var Sl={s:1,g:1,p:1,r:1,e:1};oa.scale.log=function(){return ri(oa.scale.linear().domain([0,1]),10,!0,[1,10])};var kl=oa.format(".0e"),Nl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};oa.scale.pow=function(){return ui(oa.scale.linear(),1,[0,1])},oa.scale.sqrt=function(){return oa.scale.pow().exponent(.5)},oa.scale.ordinal=function(){return ai([],{t:"range",a:[[]]})},oa.scale.category10=function(){return oa.scale.ordinal().range(El)},oa.scale.category20=function(){return oa.scale.ordinal().range(Al)},oa.scale.category20b=function(){return oa.scale.ordinal().range(Cl)},oa.scale.category20c=function(){return oa.scale.ordinal().range(zl)};var El=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Al=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),Cl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),zl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);oa.scale.quantile=function(){return oi([],[])},oa.scale.quantize=function(){return li(0,1,[0,1])},oa.scale.threshold=function(){return ci([.5],[0,1])},oa.scale.identity=function(){return si([0,1])},oa.svg={},oa.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),s=a.apply(this,arguments)-Ha,f=o.apply(this,arguments)-Ha,h=Math.abs(f-s),g=s>f?0:1;if(n>c&&(p=c,c=n,n=p),h>=Fa)return t(c,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,N=0,E=0,A=[];if((m=(+l.apply(this,arguments)||0)/2)&&(d=i===Ll?Math.sqrt(n*n+c*c):+i.apply(this,arguments),g||(E*=-1),c&&(E=tn(d/c*Math.sin(m))),n&&(N=tn(d/n*Math.sin(m)))),c){y=c*Math.cos(s+E),M=c*Math.sin(s+E),x=c*Math.cos(f-E),b=c*Math.sin(f-E);var C=Math.abs(f-s-2*E)<=ja?0:1;if(E&&mi(y,M,x,b)===g^C){var z=(s+f)/2;y=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-N),w=n*Math.sin(f-N),S=n*Math.cos(s+N),k=n*Math.sin(s+N);var L=Math.abs(s-f+2*N)<=ja?0:1;if(N&&mi(_,w,S,k)===1-g^L){var q=(s+f)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Da&&(p=Math.min(Math.abs(c-n)/2,+u.apply(this,arguments)))>.001){v=c>n^g?0:1;var T=p,R=p;if(ja>h){var D=null==S?[_,w]:null==x?[y,M]:Re([y,M],[S,k],[x,b],[_,w]),P=y-D[0],j=M-D[1],U=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*U+j*F)/(Math.sqrt(P*P+j*j)*Math.sqrt(U*U+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(p,(n-O)/(H-1)),T=Math.min(p,(c-O)/(H+1))}if(null!=x){var I=yi(null==S?[_,w]:[S,k],[y,M],c,T,g),Y=yi([x,b],[_,w],c,T,g);p===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-g^mi(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",g," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",y,",",M);if(null!=S){var Z=yi([y,M],[S,k],n,-R,g),V=yi([_,w],null==x?[y,M]:[x,b],n,-R,g);p===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^mi(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",y,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",g," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-g," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hi,r=gi,u=fi,i=Ll,a=pi,o=vi,l=di;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=En(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==Ll?Ll:En(t),n):i},n.startAngle=function(t){return arguments.length?(a=En(t),n):a},n.endAngle=function(t){return arguments.length?(o=En(t),n):o},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+a.apply(this,arguments)+ +o.apply(this,arguments))/2-Ha;return[Math.cos(t)*n,Math.sin(t)*n]},n};var Ll="auto";oa.svg.line=function(){return Mi(y)};var ql=oa.map({linear:xi,"linear-closed":bi,step:_i,"step-before":wi,"step-after":Si,basis:zi,"basis-open":Li,"basis-closed":qi,bundle:Ti,cardinal:Ei,"cardinal-open":ki,"cardinal-closed":Ni,monotone:Fi});ql.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Tl=[0,2/3,1/3,0],Rl=[0,1/3,2/3,0],Dl=[0,1/6,2/3,1/6];oa.svg.line.radial=function(){var n=Mi(Hi);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wi.reverse=Si,Si.reverse=wi,oa.svg.area=function(){return Oi(y)},oa.svg.area.radial=function(){var n=Oi(Hi);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},oa.svg.chord=function(){function n(n,o){var l=t(this,i,n,o),c=t(this,a,n,o);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?u(l.r,l.p1,l.r,l.p0):u(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+u(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=o.call(n,u,r),a=l.call(n,u,r)-Ha,s=c.call(n,u,r)-Ha;return{r:i,a0:a,a1:s,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>ja)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=Me,a=xe,o=Ii,l=pi,c=vi;return n.radius=function(t){return arguments.length?(o=En(t),n):o},n.source=function(t){return arguments.length?(i=En(t),n):i},n.target=function(t){return arguments.length?(a=En(t),n):a},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},oa.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),a=e.call(this,n,u),o=(i.y+a.y)/2,l=[i,{x:i.x,y:o},{x:a.x,y:o},a];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yi;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},oa.svg.diagonal.radial=function(){var n=oa.svg.diagonal(),t=Yi,e=n.projection;return n.projection=function(n){return arguments.length?e(Zi(t=n)):t},n},oa.svg.symbol=function(){function n(n,r){return(Pl.get(t.call(this,n,r))||$i)(e.call(this,n,r))}var t=Xi,e=Vi;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Pl=oa.map({circle:$i,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Ul)),e=t*Ul;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});oa.svg.symbolTypes=Pl.keys();var jl=Math.sqrt(3),Ul=Math.tan(30*Oa);Aa.transition=function(n){for(var t,e,r=Fl||++Yl,u=Ki(n),i=[],a=Hl||{time:Date.now(),ease:Nr,delay:0,duration:250},o=-1,l=this.length;++oi;i++){u.push(t=[]);for(var e=this[i],o=0,l=e.length;l>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return Wi(u,this.namespace,this.id)},Il.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Il.attr=function(n,t){function e(){this.removeAttribute(o)}function r(){this.removeAttributeNS(o.space,o.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(o);return e!==n&&(t=a(e,n),function(n){this.setAttribute(o,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(o.space,o.local);return e!==n&&(t=a(e,n),function(n){this.setAttributeNS(o.space,o.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var a="transform"==n?$r:Mr,o=oa.ns.qualify(n);return Ji(this,"attr."+n,t,o.local?i:u)},Il.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=oa.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Il.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+="",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=Mr(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var a=arguments.length;if(3>a){if("string"!=typeof n){2>a&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ji(this,"style."+n,e,i)},Il.styleTween=function(n,e,r){function u(u,i){var a=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return a&&function(t){this.style.setProperty(n,a(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,u)},Il.text=function(n){return Ji(this,"text",n,Gi)},Il.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Il.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=oa.ease.apply(oa,arguments)),Y(this,function(r){r[e][t].ease=n}))},Il.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Il.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Il.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Hl,i=Fl;try{Fl=e,Y(this,function(t,u,i){Hl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Hl=u,Fl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=oa.dispatch("start","end","interrupt"))).on(n,t)});return this},Il.transition=function(){for(var n,t,e,r,u=this.id,i=++Yl,a=this.namespace,o=[],l=0,c=this.length;c>l;l++){o.push(n=[]);for(var t=this[l],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[a][u],Qi(e,s,a,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wi(o,a,i)},oa.svg.axis=function(){function n(n){n.each(function(){var n,c=oa.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==l?f.ticks?f.ticks.apply(f,o):f.domain():l,g=null==t?f.tickFormat?f.tickFormat.apply(f,o):y:t,p=c.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Da),d=oa.transition(p.exit()).style("opacity",Da).remove(),m=oa.transition(p.order()).style("opacity",1),M=Math.max(u,0)+a,x=Zu(f),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),oa.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=m.select("line"),C=p.select("text").text(g),z=v.select("text"),L=m.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=na,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*i+"V0H"+x[1]+"V"+q*i)):(n=ta,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*i+","+x[0]+"H0V"+x[1]+"H"+q*i)),E.attr(N,q*u),z.attr(k,q*M),A.attr(S,0).attr(N,q*u),L.attr(w,0).attr(k,q*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=oa.scale.linear(),r=Zl,u=6,i=6,a=3,o=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Vl?t+"":Zl,n):r},n.ticks=function(){return arguments.length?(o=ca(arguments),n):o},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(a=+t,n):a},n.tickSubdivide=function(){return arguments.length&&n},n};var Zl="bottom",Vl={top:1,right:1,bottom:1,left:1};oa.svg.brush=function(){function n(t){t.each(function(){var t=oa.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",i).on("touchstart.brush",i),a=t.selectAll(".background").data([0]);a.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var o=t.selectAll(".resize").data(v,y);o.exit().remove(),o.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Xl[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),o.style("display",n.empty()?"none":null);var l,f=oa.transition(t),h=oa.transition(a);c&&(l=Zu(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(f)),s&&(l=Zu(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),u(f)),e(f)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+f[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",f[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function u(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function i(){function i(){32==oa.event.keyCode&&(C||(M=null,L[0]-=f[1],L[1]-=h[1],C=2),S())}function v(){32==oa.event.keyCode&&2==C&&(L[0]+=f[1],L[1]+=h[1],C=0,S())}function d(){var n=oa.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(oa.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),L[0]=f[+(n[0]s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?o=null:a=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),oa.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=oa.select(oa.event.target),w=l.of(b,arguments),k=oa.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&s,C=_.classed("extent"),z=W(b),L=oa.mouse(b),q=oa.select(t(b)).on("keydown.brush",i).on("keyup.brush",v);if(oa.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",y):q.on("mousemove.brush",d).on("mouseup.brush",y),k.interrupt().selectAll("*").interrupt(),C)L[0]=f[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[f[1-T]-L[0],h[1-R]-L[1]],L[0]=f[T],L[1]=h[R]}else oa.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),oa.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var a,o,l=N(n,"brushstart","brush","brushend"),c=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=$l[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:f,y:h,i:a,j:o},e=this.__chart__||t;this.__chart__=t,Fl?oa.select(this).transition().each("start.brush",function(){a=e.i,o=e.j,f=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(f,t.x),r=xr(h,t.y);return a=o=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){a=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=$l[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,v=$l[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(g=!!t[0],p=!!t[1]):c?g=!!t:s&&(p=!!t),n):c&&s?[g,p]:c?g:s?p:null},n.extent=function(t){var e,r,u,i,l;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),a=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],c&&(u=u[1],i=i[1]),o=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(l=u,u=i,i=l),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(c&&(a?(e=a[0],r=a[1]):(e=f[0],r=f[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),s&&(o?(u=o[0],i=o[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(l=u,u=i,i=l))),c&&s?[[e,u],[r,i]]:c?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],a=o=null),n},n.empty=function(){return!!c&&f[0]==f[1]||!!s&&h[0]==h[1]},oa.rebind(n,l,"on")};var Xl={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},$l=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Bl=ho.format=Mo.timeFormat,Wl=Bl.utc,Jl=Wl("%Y-%m-%dT%H:%M:%S.%LZ");Bl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?ea:Jl,ea.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},ea.toString=Jl.toString,ho.second=On(function(n){return new go(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ho.seconds=ho.second.range,ho.seconds.utc=ho.second.utc.range,ho.minute=On(function(n){return new go(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ho.minutes=ho.minute.range,ho.minutes.utc=ho.minute.utc.range,ho.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new go(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ho.hours=ho.hour.range,ho.hours.utc=ho.hour.utc.range,ho.month=On(function(n){return n=ho.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ho.months=ho.month.range,ho.months.utc=ho.month.utc.range;var Gl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Kl=[[ho.second,1],[ho.second,5],[ho.second,15],[ho.second,30],[ho.minute,1],[ho.minute,5],[ho.minute,15],[ho.minute,30],[ho.hour,1],[ho.hour,3],[ho.hour,6],[ho.hour,12],[ho.day,1],[ho.day,2],[ho.week,1],[ho.month,1],[ho.month,3],[ho.year,1]],Ql=Bl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),nc={range:function(n,t,e){return oa.range(Math.ceil(n/e)*e,+t,e).map(ua)},floor:y,ceil:y};Kl.year=ho.year,ho.scale=function(){return ra(oa.scale.linear(),Kl,Ql)};var tc=Kl.map(function(n){return[n[0].utc,n[1]]}),ec=Wl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);tc.year=ho.year.utc,ho.scale.utc=function(){return ra(oa.scale.linear(),tc,ec)},oa.text=An(function(n){return n.responseText}),oa.json=function(n,t){return Cn(n,"application/json",ia,t)},oa.html=function(n,t){return Cn(n,"text/html",aa,t)},oa.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=oa,define(oa)):"object"==typeof module&&module.exports?module.exports=oa:this.d3=oa}(); \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/download.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/download.js deleted file mode 100644 index 11ed5778..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/download.js +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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 modalPopup = ".wr-modalpopup"; -var modalPopupContainer = modalPopup + " .modalpopup-container"; -var modalPopupContent = modalPopup + " .modalpopup-content"; -var body = "body"; - -/* - * set popup maximum height function. - */ -function setPopupMaxHeight() { - $(modalPopupContent).css('max-height', ($(body).height() - ($(body).height() / 100 * 30))); - $(modalPopupContainer).css('margin-top', (-($(modalPopupContainer).height() / 2))); -} - -/* - * show popup function. - */ -function showPopup() { - $(modalPopup).show(); - setPopupMaxHeight(); - $('#downloadForm').validate({ - rules: { - deviceName: { - minlength: 4, - required: true - } - }, - highlight: function (element) { - $(element).closest('.control-group').removeClass('success').addClass('error'); - }, - success: function (element) { - $(element).closest('.control-group').removeClass('error').addClass('success'); - $('label[for=deviceName]').remove(); - } - }); - var deviceType = ""; - $('.deviceType').each(function () { - if (this.value != "") { - deviceType = this.value; - } - }); -} - -/* - * hide popup function. - */ -function hidePopup() { - $('label[for=deviceName]').remove(); - $('.control-group').removeClass('success').removeClass('error'); - $(modalPopupContent).html(''); - $(modalPopup).hide(); -} - -/* - * DOM ready functions. - */ -$(document).ready(function () { - attachEvents(); -}); - -function attachEvents() { - /** - * Following click function would execute - * when a user clicks on "Download" link - * on Device Management page in WSO2 DC Console. - */ - $("a.download-link").click(function () { - var sketchType = $(this).data("sketchtype"); - var deviceType = $(this).data("devicetype"); - var downloadDeviceAPI = "/devicemgt/api/devices/sketch/generate_link"; - var payload = {"sketchType": sketchType, "deviceType": deviceType}; - $(modalPopupContent).html($('#download-device-modal-content').html()); - showPopup(); - var deviceName; - $("a#download-device-download-link").click(function () { - $('.new-device-name').each(function () { - if (this.value != "") { - deviceName = this.value; - } - }); - $('label[for=deviceName]').remove(); - if (deviceName && deviceName.length >= 4) { - payload.deviceName = deviceName; - invokerUtil.post( - downloadDeviceAPI, - payload, - function (data, textStatus, jqxhr) { - doAction(data); - }, - function (data) { - doAction(data); - } - ); - }else if(deviceName){ - $('.controls').append(''); - $('.control-group').removeClass('success').addClass('error'); - } else { - $('.controls').append(''); - $('.control-group').removeClass('success').addClass('error'); - } - }); - - $("a#download-device-cancel-link").click(function () { - hidePopup(); - }); - - }); -} - -function downloadAgent() { - $('#downloadForm').submit(); - - var deviceName; - $('.new-device-name').each(function () { - if (this.value != "") { - deviceName = this.value; - } - }); - if (deviceName && deviceName.length >= 4) { - setTimeout(function () { - hidePopup(); - }, 1000); - } -} - -function doAction(data) { - //if it is saml redirection response - if (data.status == null) { - document.write(data); - } - - if (data.status == "200") { - $(modalPopupContent).html($('#download-device-modal-content-links').html()); - $("input#download-device-url").val(data.responseText); - $("input#download-device-url").focus(function () { - $(this).select(); - }); - showPopup(); - } else if (data.status == "401") { - $(modalPopupContent).html($('#device-401-content').html()); - $("#device-401-link").click(function () { - window.location = "/devicemgt/login"; - }); - showPopup(); - } else if (data == "403") { - $(modalPopupContent).html($('#device-403-content').html()); - $("#device-403-link").click(function () { - window.location = "/devicemgt/login"; - }); - showPopup(); - } else { - $(modalPopupContent).html($('#device-unexpected-error-content').html()); - $("a#device-unexpected-error-link").click(function () { - hidePopup(); - }); - } -} \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/initJs b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/initJs deleted file mode 100644 index 57f70e56..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/initJs +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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 ajax_handler = new ajax_handler(); -var config_api = new config_api(); -var plotting = new plotting(); -var object_maker = new object_maker(); \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jQueryRotate.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jQueryRotate.js deleted file mode 100644 index e3a8fa9c..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jQueryRotate.js +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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. - */ - -// VERSION: 2.3 LAST UPDATE: 11.07.2013 -/* - * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php - * - * Made by Wilq32, wilq32@gmail.com, Wroclaw, Poland, 01.2009 - * Website: http://jqueryrotate.com - */ - -(function($) { - var supportedCSS,supportedCSSOrigin, styles=document.getElementsByTagName("head")[0].style,toCheck="transformProperty WebkitTransform OTransform msTransform MozTransform".split(" "); - for (var a = 0; a < toCheck.length; a++) if (styles[toCheck[a]] !== undefined) { supportedCSS = toCheck[a]; } - if (supportedCSS) { - supportedCSSOrigin = supportedCSS.replace(/[tT]ransform/,"TransformOrigin"); - if (supportedCSSOrigin[0] == "T") supportedCSSOrigin[0] = "t"; - } - - // Bad eval to preven google closure to remove it from code o_O - eval('IE = "v"=="\v"'); - - jQuery.fn.extend({ - rotate:function(parameters) - { - if (this.length===0||typeof parameters=="undefined") return; - if (typeof parameters=="number") parameters={angle:parameters}; - var returned=[]; - for (var i=0,i0=this.length;i this._parameters.duration; - - // TODO: Bug for animatedGif for static rotation ? (to test) - if (checkEnd && !this._parameters.animatedGif) - { - clearTimeout(this._timer); - } - else - { - if (this._canvas||this._vimage||this._img) { - var angle = this._parameters.easing(0, actualTime - this._animateStartTime, this._animateStartAngle, this._parameters.animateTo - this._animateStartAngle, this._parameters.duration); - this._rotate((~~(angle*10))/10); - } - if (this._parameters.step) { - this._parameters.step(this._angle); - } - var self = this; - this._timer = setTimeout(function() - { - self._animate.call(self); - }, 10); - } - - // To fix Bug that prevents using recursive function in callback I moved this function to back - if (this._parameters.callback && checkEnd){ - this._angle = this._parameters.animateTo; - this._rotate(this._angle); - this._parameters.callback.call(this._rootObj); - } - }, - - _rotate : (function() - { - var rad = Math.PI/180; - if (IE) - return function(angle) - { - this._angle = angle; - this._container.style.rotation=(angle%360)+"deg"; - this._vimage.style.top = -(this._rotationCenterY - this._imgHeight/2) + "px"; - this._vimage.style.left = -(this._rotationCenterX - this._imgWidth/2) + "px"; - this._container.style.top = this._rotationCenterY - this._imgHeight/2 + "px"; - this._container.style.left = this._rotationCenterX - this._imgWidth/2 + "px"; - - } - else if (supportedCSS) - return function(angle){ - this._angle = angle; - this._img.style[supportedCSS]="rotate("+(angle%360)+"deg)"; - this._img.style[supportedCSSOrigin]=this._parameters.center.join(" "); - } - else - return function(angle) - { - this._angle = angle; - angle=(angle%360)* rad; - // clear canvas - this._canvas.width = this._width;//+this._widthAdd; - this._canvas.height = this._height;//+this._heightAdd; - - // REMEMBER: all drawings are read from backwards.. so first function is translate, then rotate, then translate, translate.. - this._cnv.translate(this._imgWidth*this._aspectW,this._imgHeight*this._aspectH); // at least center image on screen - this._cnv.translate(this._rotationCenterX,this._rotationCenterY); // we move image back to its orginal - this._cnv.rotate(angle); // rotate image - this._cnv.translate(-this._rotationCenterX,-this._rotationCenterY); // move image to its center, so we can rotate around its center - this._cnv.scale(this._aspectW,this._aspectH); // SCALE - if needed ;) - this._cnv.drawImage(this._img, 0, 0); // First - we draw image - } - - })() - } - - if (IE) - { - Wilq32.PhotoEffect.prototype.createVMLNode=(function(){ - document.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)"); - try { - !document.namespaces.rvml && document.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"); - return function (tagName) { - return document.createElement(''); - }; - } catch (e) { - return function (tagName) { - return document.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">'); - }; - } - })(); - } - -})(jQuery); diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jquery.validate.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jquery.validate.js deleted file mode 100644 index fe7ecf07..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jquery.validate.js +++ /dev/null @@ -1,1227 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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. - */ - -(function($) { - -$.extend($.fn, { - // http://docs.jquery.com/Plugins/Validation/validate - validate: function( options ) { - - // if nothing is selected, return nothing; can't chain anyway - if ( !this.length ) { - if ( options && options.debug && window.console ) { - console.warn( "Nothing selected, can't validate, returning nothing." ); - } - return; - } - - // check if a validator for this form was already created - var validator = $.data( this[0], "validator" ); - if ( validator ) { - return validator; - } - - // Add novalidate tag if HTML5. - this.attr( "novalidate", "novalidate" ); - - validator = new $.validator( options, this[0] ); - $.data( this[0], "validator", validator ); - - if ( validator.settings.onsubmit ) { - - this.validateDelegate( ":submit", "click", function( event ) { - if ( validator.settings.submitHandler ) { - validator.submitButton = event.target; - } - // allow suppressing validation by adding a cancel class to the submit button - if ( $(event.target).hasClass("cancel") ) { - validator.cancelSubmit = true; - } - }); - - // validate the form on submit - this.submit( function( event ) { - if ( validator.settings.debug ) { - // prevent form submit to be able to see console output - event.preventDefault(); - } - function handle() { - var hidden; - if ( validator.settings.submitHandler ) { - if ( validator.submitButton ) { - // insert a hidden input as a replacement for the missing submit button - hidden = $("").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); - } - validator.settings.submitHandler.call( validator, validator.currentForm, event ); - if ( validator.submitButton ) { - // and clean up afterwards; thanks to no-block-scope, hidden can be referenced - hidden.remove(); - } - return false; - } - return true; - } - - // prevent submit for invalid forms or custom submit handlers - if ( validator.cancelSubmit ) { - validator.cancelSubmit = false; - return handle(); - } - if ( validator.form() ) { - if ( validator.pendingRequest ) { - validator.formSubmitted = true; - return false; - } - return handle(); - } else { - validator.focusInvalid(); - return false; - } - }); - } - - return validator; - }, - // http://docs.jquery.com/Plugins/Validation/valid - valid: function() { - if ( $(this[0]).is("form")) { - return this.validate().form(); - } else { - var valid = true; - var validator = $(this[0].form).validate(); - this.each(function() { - valid &= validator.element(this); - }); - return valid; - } - }, - // attributes: space seperated list of attributes to retrieve and remove - removeAttrs: function( attributes ) { - var result = {}, - $element = this; - $.each(attributes.split(/\s/), function( index, value ) { - result[value] = $element.attr(value); - $element.removeAttr(value); - }); - return result; - }, - // http://docs.jquery.com/Plugins/Validation/rules - rules: function( command, argument ) { - var element = this[0]; - - if ( command ) { - var settings = $.data(element.form, "validator").settings; - var staticRules = settings.rules; - var existingRules = $.validator.staticRules(element); - switch(command) { - case "add": - $.extend(existingRules, $.validator.normalizeRule(argument)); - staticRules[element.name] = existingRules; - if ( argument.messages ) { - settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages ); - } - break; - case "remove": - if ( !argument ) { - delete staticRules[element.name]; - return existingRules; - } - var filtered = {}; - $.each(argument.split(/\s/), function( index, method ) { - filtered[method] = existingRules[method]; - delete existingRules[method]; - }); - return filtered; - } - } - - var data = $.validator.normalizeRules( - $.extend( - {}, - $.validator.classRules(element), - $.validator.attributeRules(element), - $.validator.dataRules(element), - $.validator.staticRules(element) - ), element); - - // make sure required is at front - if ( data.required ) { - var param = data.required; - delete data.required; - data = $.extend({required: param}, data); - } - - return data; - } -}); - -// Custom selectors -$.extend($.expr[":"], { - // http://docs.jquery.com/Plugins/Validation/blank - blank: function( a ) { return !$.trim("" + a.value); }, - // http://docs.jquery.com/Plugins/Validation/filled - filled: function( a ) { return !!$.trim("" + a.value); }, - // http://docs.jquery.com/Plugins/Validation/unchecked - unchecked: function( a ) { return !a.checked; } -}); - -// constructor for validator -$.validator = function( options, form ) { - this.settings = $.extend( true, {}, $.validator.defaults, options ); - this.currentForm = form; - this.init(); -}; - -$.validator.format = function( source, params ) { - if ( arguments.length === 1 ) { - return function() { - var args = $.makeArray(arguments); - args.unshift(source); - return $.validator.format.apply( this, args ); - }; - } - if ( arguments.length > 2 && params.constructor !== Array ) { - params = $.makeArray(arguments).slice(1); - } - if ( params.constructor !== Array ) { - params = [ params ]; - } - $.each(params, function( i, n ) { - source = source.replace( new RegExp("\\{" + i + "\\}", "g"), function() { - return n; - }); - }); - return source; -}; - -$.extend($.validator, { - - defaults: { - messages: {}, - groups: {}, - rules: {}, - errorClass: "error", - validClass: "valid", - errorElement: "label", - focusInvalid: true, - errorContainer: $([]), - errorLabelContainer: $([]), - onsubmit: true, - ignore: ":hidden", - ignoreTitle: false, - onfocusin: function( element, event ) { - this.lastActive = element; - - // hide error label and remove error class on focus if enabled - if ( this.settings.focusCleanup && !this.blockFocusCleanup ) { - if ( this.settings.unhighlight ) { - this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass ); - } - this.addWrapper(this.errorsFor(element)).hide(); - } - }, - onfocusout: function( element, event ) { - if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) { - this.element(element); - } - }, - onkeyup: function( element, event ) { - if ( event.which === 9 && this.elementValue(element) === "" ) { - return; - } else if ( element.name in this.submitted || element === this.lastElement ) { - this.element(element); - } - }, - onclick: function( element, event ) { - // click on selects, radiobuttons and checkboxes - if ( element.name in this.submitted ) { - this.element(element); - } - // or option elements, check parent select in that case - else if ( element.parentNode.name in this.submitted ) { - this.element(element.parentNode); - } - }, - highlight: function( element, errorClass, validClass ) { - if ( element.type === "radio" ) { - this.findByName(element.name).addClass(errorClass).removeClass(validClass); - } else { - $(element).addClass(errorClass).removeClass(validClass); - } - }, - unhighlight: function( element, errorClass, validClass ) { - if ( element.type === "radio" ) { - this.findByName(element.name).removeClass(errorClass).addClass(validClass); - } else { - $(element).removeClass(errorClass).addClass(validClass); - } - } - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults - setDefaults: function( settings ) { - $.extend( $.validator.defaults, settings ); - }, - - messages: { - required: "This field is required.", - remote: "Please fix this field.", - email: "Please enter a valid email address.", - url: "Please enter a valid URL.", - date: "Please enter a valid date.", - dateISO: "Please enter a valid date (ISO).", - number: "Please enter a valid number.", - digits: "Please enter only digits.", - creditcard: "Please enter a valid credit card number.", - equalTo: "Please enter the same value again.", - maxlength: $.validator.format("Please enter no more than {0} characters."), - minlength: $.validator.format("Please enter at least {0} characters."), - rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."), - range: $.validator.format("Please enter a value between {0} and {1}."), - max: $.validator.format("Please enter a value less than or equal to {0}."), - min: $.validator.format("Please enter a value greater than or equal to {0}.") - }, - - autoCreateRanges: false, - - prototype: { - - init: function() { - this.labelContainer = $(this.settings.errorLabelContainer); - this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm); - this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer ); - this.submitted = {}; - this.valueCache = {}; - this.pendingRequest = 0; - this.pending = {}; - this.invalid = {}; - this.reset(); - - var groups = (this.groups = {}); - $.each(this.settings.groups, function( key, value ) { - if ( typeof value === "string" ) { - value = value.split(/\s/); - } - $.each(value, function( index, name ) { - groups[name] = key; - }); - }); - var rules = this.settings.rules; - $.each(rules, function( key, value ) { - rules[key] = $.validator.normalizeRule(value); - }); - - function delegate(event) { - var validator = $.data(this[0].form, "validator"), - eventType = "on" + event.type.replace(/^validate/, ""); - if ( validator.settings[eventType] ) { - validator.settings[eventType].call(validator, this[0], event); - } - } - $(this.currentForm) - .validateDelegate(":text, [type='password'], [type='file'], select, textarea, " + - "[type='number'], [type='search'] ,[type='tel'], [type='url'], " + - "[type='email'], [type='datetime'], [type='date'], [type='month'], " + - "[type='week'], [type='time'], [type='datetime-local'], " + - "[type='range'], [type='color'] ", - "focusin focusout keyup", delegate) - .validateDelegate("[type='radio'], [type='checkbox'], select, option", "click", delegate); - - if ( this.settings.invalidHandler ) { - $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); - } - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/form - form: function() { - this.checkForm(); - $.extend(this.submitted, this.errorMap); - this.invalid = $.extend({}, this.errorMap); - if ( !this.valid() ) { - $(this.currentForm).triggerHandler("invalid-form", [this]); - } - this.showErrors(); - return this.valid(); - }, - - checkForm: function() { - this.prepareForm(); - for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { - this.check( elements[i] ); - } - return this.valid(); - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/element - element: function( element ) { - element = this.validationTargetFor( this.clean( element ) ); - this.lastElement = element; - this.prepareElement( element ); - this.currentElements = $(element); - var result = this.check( element ) !== false; - if ( result ) { - delete this.invalid[element.name]; - } else { - this.invalid[element.name] = true; - } - if ( !this.numberOfInvalids() ) { - // Hide error containers on last error - this.toHide = this.toHide.add( this.containers ); - } - this.showErrors(); - return result; - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/showErrors - showErrors: function( errors ) { - if ( errors ) { - // add items to error list and map - $.extend( this.errorMap, errors ); - this.errorList = []; - for ( var name in errors ) { - this.errorList.push({ - message: errors[name], - element: this.findByName(name)[0] - }); - } - // remove items from success list - this.successList = $.grep( this.successList, function( element ) { - return !(element.name in errors); - }); - } - if ( this.settings.showErrors ) { - this.settings.showErrors.call( this, this.errorMap, this.errorList ); - } else { - this.defaultShowErrors(); - } - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/resetForm - resetForm: function() { - if ( $.fn.resetForm ) { - $(this.currentForm).resetForm(); - } - this.submitted = {}; - this.lastElement = null; - this.prepareForm(); - this.hideErrors(); - this.elements().removeClass( this.settings.errorClass ).removeData( "previousValue" ); - }, - - numberOfInvalids: function() { - return this.objectLength(this.invalid); - }, - - objectLength: function( obj ) { - var count = 0; - for ( var i in obj ) { - count++; - } - return count; - }, - - hideErrors: function() { - this.addWrapper( this.toHide ).hide(); - }, - - valid: function() { - return this.size() === 0; - }, - - size: function() { - return this.errorList.length; - }, - - focusInvalid: function() { - if ( this.settings.focusInvalid ) { - try { - $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []) - .filter(":visible") - .focus() - // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find - .trigger("focusin"); - } catch(e) { - // ignore IE throwing errors when focusing hidden elements - } - } - }, - - findLastActive: function() { - var lastActive = this.lastActive; - return lastActive && $.grep(this.errorList, function( n ) { - return n.element.name === lastActive.name; - }).length === 1 && lastActive; - }, - - elements: function() { - var validator = this, - rulesCache = {}; - - // select all valid inputs inside the form (no submit or reset buttons) - return $(this.currentForm) - .find("input, select, textarea") - .not(":submit, :reset, :image, [disabled]") - .not( this.settings.ignore ) - .filter(function() { - if ( !this.name ) { - if ( window.console ) { - console.error( "%o has no name assigned", this ); - } - throw new Error( "Failed to validate, found an element with no name assigned. See console for element reference." ); - } - - // select only the first element for each name, and only those with rules specified - if ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) { - return false; - } - - rulesCache[this.name] = true; - return true; - }); - }, - - clean: function( selector ) { - return $(selector)[0]; - }, - - errors: function() { - var errorClass = this.settings.errorClass.replace(" ", "."); - return $(this.settings.errorElement + "." + errorClass, this.errorContext); - }, - - reset: function() { - this.successList = []; - this.errorList = []; - this.errorMap = {}; - this.toShow = $([]); - this.toHide = $([]); - this.currentElements = $([]); - }, - - prepareForm: function() { - this.reset(); - this.toHide = this.errors().add( this.containers ); - }, - - prepareElement: function( element ) { - this.reset(); - this.toHide = this.errorsFor(element); - }, - - elementValue: function( element ) { - var type = $(element).attr("type"), - val = $(element).val(); - - if ( type === "radio" || type === "checkbox" ) { - return $("input[name='" + $(element).attr("name") + "']:checked").val(); - } - - if ( typeof val === "string" ) { - return val.replace(/\r/g, ""); - } - return val; - }, - - check: function( element ) { - element = this.validationTargetFor( this.clean( element ) ); - - var rules = $(element).rules(); - var dependencyMismatch = false; - var val = this.elementValue(element); - var result; - - for (var method in rules ) { - var rule = { method: method, parameters: rules[method] }; - try { - - result = $.validator.methods[method].call( this, val, element, rule.parameters ); - - // if a method indicates that the field is optional and therefore valid, - // don't mark it as valid when there are no other rules - if ( result === "dependency-mismatch" ) { - dependencyMismatch = true; - continue; - } - dependencyMismatch = false; - - if ( result === "pending" ) { - this.toHide = this.toHide.not( this.errorsFor(element) ); - return; - } - - if ( !result ) { - this.formatAndAdd( element, rule ); - return false; - } - } catch(e) { - if ( this.settings.debug && window.console ) { - console.log( "Exception occured when checking element " + element.id + ", check the '" + rule.method + "' method.", e ); - } - throw e; - } - } - if ( dependencyMismatch ) { - return; - } - if ( this.objectLength(rules) ) { - this.successList.push(element); - } - return true; - }, - - // return the custom message for the given element and validation method - // specified in the element's HTML5 data attribute - customDataMessage: function( element, method ) { - return $(element).data("msg-" + method.toLowerCase()) || (element.attributes && $(element).attr("data-msg-" + method.toLowerCase())); - }, - - // return the custom message for the given element name and validation method - customMessage: function( name, method ) { - var m = this.settings.messages[name]; - return m && (m.constructor === String ? m : m[method]); - }, - - // return the first defined argument, allowing empty strings - findDefined: function() { - for(var i = 0; i < arguments.length; i++) { - if ( arguments[i] !== undefined ) { - return arguments[i]; - } - } - return undefined; - }, - - defaultMessage: function( element, method ) { - return this.findDefined( - this.customMessage( element.name, method ), - this.customDataMessage( element, method ), - // title is never undefined, so handle empty string as undefined - !this.settings.ignoreTitle && element.title || undefined, - $.validator.messages[method], - "Warning: No message defined for " + element.name + "" - ); - }, - - formatAndAdd: function( element, rule ) { - var message = this.defaultMessage( element, rule.method ), - theregex = /\$?\{(\d+)\}/g; - if ( typeof message === "function" ) { - message = message.call(this, rule.parameters, element); - } else if (theregex.test(message)) { - message = $.validator.format(message.replace(theregex, "{$1}"), rule.parameters); - } - this.errorList.push({ - message: message, - element: element - }); - - this.errorMap[element.name] = message; - this.submitted[element.name] = message; - }, - - addWrapper: function( toToggle ) { - if ( this.settings.wrapper ) { - toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) ); - } - return toToggle; - }, - - defaultShowErrors: function() { - var i, elements; - for ( i = 0; this.errorList[i]; i++ ) { - var error = this.errorList[i]; - if ( this.settings.highlight ) { - this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass ); - } - this.showLabel( error.element, error.message ); - } - if ( this.errorList.length ) { - this.toShow = this.toShow.add( this.containers ); - } - if ( this.settings.success ) { - for ( i = 0; this.successList[i]; i++ ) { - this.showLabel( this.successList[i] ); - } - } - if ( this.settings.unhighlight ) { - for ( i = 0, elements = this.validElements(); elements[i]; i++ ) { - this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass ); - } - } - this.toHide = this.toHide.not( this.toShow ); - this.hideErrors(); - this.addWrapper( this.toShow ).show(); - }, - - validElements: function() { - return this.currentElements.not(this.invalidElements()); - }, - - invalidElements: function() { - return $(this.errorList).map(function() { - return this.element; - }); - }, - - showLabel: function( element, message ) { - var label = this.errorsFor( element ); - if ( label.length ) { - // refresh error/success class - label.removeClass( this.settings.validClass ).addClass( this.settings.errorClass ); - - // check if we have a generated label, replace the message then - if ( label.attr("generated") ) { - label.html(message); - } - } else { - // create label - label = $("<" + this.settings.errorElement + "/>") - .attr({"for": this.idOrName(element), generated: true}) - .addClass(this.settings.errorClass) - .html(message || ""); - if ( this.settings.wrapper ) { - // make sure the element is visible, even in IE - // actually showing the wrapped element is handled elsewhere - label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent(); - } - if ( !this.labelContainer.append(label).length ) { - if ( this.settings.errorPlacement ) { - this.settings.errorPlacement(label, $(element) ); - } else { - label.insertAfter(element); - } - } - } - if ( !message && this.settings.success ) { - label.text(""); - if ( typeof this.settings.success === "string" ) { - label.addClass( this.settings.success ); - } else { - this.settings.success( label, element ); - } - } - this.toShow = this.toShow.add(label); - }, - - errorsFor: function( element ) { - var name = this.idOrName(element); - return this.errors().filter(function() { - return $(this).attr("for") === name; - }); - }, - - idOrName: function( element ) { - return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name); - }, - - validationTargetFor: function( element ) { - // if radio/checkbox, validate first element in group instead - if ( this.checkable(element) ) { - element = this.findByName( element.name ).not(this.settings.ignore)[0]; - } - return element; - }, - - checkable: function( element ) { - return (/radio|checkbox/i).test(element.type); - }, - - findByName: function( name ) { - return $(this.currentForm).find("[name='" + name + "']"); - }, - - getLength: function( value, element ) { - switch( element.nodeName.toLowerCase() ) { - case "select": - return $("option:selected", element).length; - case "input": - if ( this.checkable( element) ) { - return this.findByName(element.name).filter(":checked").length; - } - } - return value.length; - }, - - depend: function( param, element ) { - return this.dependTypes[typeof param] ? this.dependTypes[typeof param](param, element) : true; - }, - - dependTypes: { - "boolean": function( param, element ) { - return param; - }, - "string": function( param, element ) { - return !!$(param, element.form).length; - }, - "function": function( param, element ) { - return param(element); - } - }, - - optional: function( element ) { - var val = this.elementValue(element); - return !$.validator.methods.required.call(this, val, element) && "dependency-mismatch"; - }, - - startRequest: function( element ) { - if ( !this.pending[element.name] ) { - this.pendingRequest++; - this.pending[element.name] = true; - } - }, - - stopRequest: function( element, valid ) { - this.pendingRequest--; - // sometimes synchronization fails, make sure pendingRequest is never < 0 - if ( this.pendingRequest < 0 ) { - this.pendingRequest = 0; - } - delete this.pending[element.name]; - if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) { - $(this.currentForm).submit(); - this.formSubmitted = false; - } else if (!valid && this.pendingRequest === 0 && this.formSubmitted) { - $(this.currentForm).triggerHandler("invalid-form", [this]); - this.formSubmitted = false; - } - }, - - previousValue: function( element ) { - return $.data(element, "previousValue") || $.data(element, "previousValue", { - old: null, - valid: true, - message: this.defaultMessage( element, "remote" ) - }); - } - - }, - - classRuleSettings: { - required: {required: true}, - email: {email: true}, - url: {url: true}, - date: {date: true}, - dateISO: {dateISO: true}, - number: {number: true}, - digits: {digits: true}, - creditcard: {creditcard: true} - }, - - addClassRules: function( className, rules ) { - if ( className.constructor === String ) { - this.classRuleSettings[className] = rules; - } else { - $.extend(this.classRuleSettings, className); - } - }, - - classRules: function( element ) { - var rules = {}; - var classes = $(element).attr("class"); - if ( classes ) { - $.each(classes.split(" "), function() { - if ( this in $.validator.classRuleSettings ) { - $.extend(rules, $.validator.classRuleSettings[this]); - } - }); - } - return rules; - }, - - attributeRules: function( element ) { - var rules = {}; - var $element = $(element); - - for (var method in $.validator.methods) { - var value; - - // support for in both html5 and older browsers - if ( method === "required" ) { - value = $element.get(0).getAttribute(method); - // Some browsers return an empty string for the required attribute - // and non-HTML5 browsers might have required="" markup - if ( value === "" ) { - value = true; - } - // force non-HTML5 browsers to return bool - value = !!value; - } else { - value = $element.attr(method); - } - - if ( value ) { - rules[method] = value; - } else if ( $element[0].getAttribute("type") === method ) { - rules[method] = true; - } - } - - // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs - if ( rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength) ) { - delete rules.maxlength; - } - - return rules; - }, - - dataRules: function( element ) { - var method, value, - rules = {}, $element = $(element); - for (method in $.validator.methods) { - value = $element.data("rule-" + method.toLowerCase()); - if ( value !== undefined ) { - rules[method] = value; - } - } - return rules; - }, - - staticRules: function( element ) { - var rules = {}; - var validator = $.data(element.form, "validator"); - if ( validator.settings.rules ) { - rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {}; - } - return rules; - }, - - normalizeRules: function( rules, element ) { - // handle dependency check - $.each(rules, function( prop, val ) { - // ignore rule when param is explicitly false, eg. required:false - if ( val === false ) { - delete rules[prop]; - return; - } - if ( val.param || val.depends ) { - var keepRule = true; - switch (typeof val.depends) { - case "string": - keepRule = !!$(val.depends, element.form).length; - break; - case "function": - keepRule = val.depends.call(element, element); - break; - } - if ( keepRule ) { - rules[prop] = val.param !== undefined ? val.param : true; - } else { - delete rules[prop]; - } - } - }); - - // evaluate parameters - $.each(rules, function( rule, parameter ) { - rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter; - }); - - // clean number parameters - $.each(["minlength", "maxlength", "min", "max"], function() { - if ( rules[this] ) { - rules[this] = Number(rules[this]); - } - }); - $.each(["rangelength", "range"], function() { - var parts; - if ( rules[this] ) { - if ( $.isArray(rules[this]) ) { - rules[this] = [Number(rules[this][0]), Number(rules[this][1])]; - } else if ( typeof rules[this] === "string" ) { - parts = rules[this].split(/[\s,]+/); - rules[this] = [Number(parts[0]), Number(parts[1])]; - } - } - }); - - if ( $.validator.autoCreateRanges ) { - // auto-create ranges - if ( rules.min && rules.max ) { - rules.range = [rules.min, rules.max]; - delete rules.min; - delete rules.max; - } - if ( rules.minlength && rules.maxlength ) { - rules.rangelength = [rules.minlength, rules.maxlength]; - delete rules.minlength; - delete rules.maxlength; - } - } - - return rules; - }, - - // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true} - normalizeRule: function( data ) { - if ( typeof data === "string" ) { - var transformed = {}; - $.each(data.split(/\s/), function() { - transformed[this] = true; - }); - data = transformed; - } - return data; - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/addMethod - addMethod: function( name, method, message ) { - $.validator.methods[name] = method; - $.validator.messages[name] = message !== undefined ? message : $.validator.messages[name]; - if ( method.length < 3 ) { - $.validator.addClassRules(name, $.validator.normalizeRule(name)); - } - }, - - methods: { - - // http://docs.jquery.com/Plugins/Validation/Methods/required - required: function( value, element, param ) { - // check if dependency is met - if ( !this.depend(param, element) ) { - return "dependency-mismatch"; - } - if ( element.nodeName.toLowerCase() === "select" ) { - // could be an array for select-multiple or a string, both are fine this way - var val = $(element).val(); - return val && val.length > 0; - } - if ( this.checkable(element) ) { - return this.getLength(value, element) > 0; - } - return $.trim(value).length > 0; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/remote - remote: function( value, element, param ) { - if ( this.optional(element) ) { - return "dependency-mismatch"; - } - - var previous = this.previousValue(element); - if (!this.settings.messages[element.name] ) { - this.settings.messages[element.name] = {}; - } - previous.originalMessage = this.settings.messages[element.name].remote; - this.settings.messages[element.name].remote = previous.message; - - param = typeof param === "string" && {url:param} || param; - - if ( previous.old === value ) { - return previous.valid; - } - - previous.old = value; - var validator = this; - this.startRequest(element); - var data = {}; - data[element.name] = value; - $.ajax($.extend(true, { - url: param, - mode: "abort", - port: "validate" + element.name, - dataType: "json", - data: data, - success: function( response ) { - validator.settings.messages[element.name].remote = previous.originalMessage; - var valid = response === true || response === "true"; - if ( valid ) { - var submitted = validator.formSubmitted; - validator.prepareElement(element); - validator.formSubmitted = submitted; - validator.successList.push(element); - delete validator.invalid[element.name]; - validator.showErrors(); - } else { - var errors = {}; - var message = response || validator.defaultMessage( element, "remote" ); - errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message; - validator.invalid[element.name] = true; - validator.showErrors(errors); - } - previous.valid = valid; - validator.stopRequest(element, valid); - } - }, param)); - return "pending"; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/minlength - minlength: function( value, element, param ) { - var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); - return this.optional(element) || length >= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/maxlength - maxlength: function( value, element, param ) { - var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); - return this.optional(element) || length <= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/rangelength - rangelength: function( value, element, param ) { - var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); - return this.optional(element) || ( length >= param[0] && length <= param[1] ); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/min - min: function( value, element, param ) { - return this.optional(element) || value >= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/max - max: function( value, element, param ) { - return this.optional(element) || value <= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/range - range: function( value, element, param ) { - return this.optional(element) || ( value >= param[0] && value <= param[1] ); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/email - email: function( value, element ) { - // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/ - return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/url - url: function( value, element ) { - // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ - return this.optional(element) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/date - date: function( value, element ) { - return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString()); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/dateISO - dateISO: function( value, element ) { - return this.optional(element) || /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/number - number: function( value, element ) { - return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/digits - digits: function( value, element ) { - return this.optional(element) || /^\d+$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/creditcard - // based on http://en.wikipedia.org/wiki/Luhn - creditcard: function( value, element ) { - if ( this.optional(element) ) { - return "dependency-mismatch"; - } - // accept only spaces, digits and dashes - if ( /[^0-9 \-]+/.test(value) ) { - return false; - } - var nCheck = 0, - nDigit = 0, - bEven = false; - - value = value.replace(/\D/g, ""); - - for (var n = value.length - 1; n >= 0; n--) { - var cDigit = value.charAt(n); - nDigit = parseInt(cDigit, 10); - if ( bEven ) { - if ( (nDigit *= 2) > 9 ) { - nDigit -= 9; - } - } - nCheck += nDigit; - bEven = !bEven; - } - - return (nCheck % 10) === 0; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/equalTo - equalTo: function( value, element, param ) { - // bind to the blur event of the target in order to revalidate whenever the target field is updated - // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead - var target = $(param); - if ( this.settings.onfocusout ) { - target.unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { - $(element).valid(); - }); - } - return value === target.val(); - } - - } - -}); - -// deprecated, use $.validator.format instead -$.format = $.validator.format; - -}(jQuery)); - -// ajax mode: abort -// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); -// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() -(function($) { - var pendingRequests = {}; - // Use a prefilter if available (1.5+) - if ( $.ajaxPrefilter ) { - $.ajaxPrefilter(function( settings, _, xhr ) { - var port = settings.port; - if ( settings.mode === "abort" ) { - if ( pendingRequests[port] ) { - pendingRequests[port].abort(); - } - pendingRequests[port] = xhr; - } - }); - } else { - // Proxy ajax - var ajax = $.ajax; - $.ajax = function( settings ) { - var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode, - port = ( "port" in settings ? settings : $.ajaxSettings ).port; - if ( mode === "abort" ) { - if ( pendingRequests[port] ) { - pendingRequests[port].abort(); - } - return (pendingRequests[port] = ajax.apply(this, arguments)); - } - return ajax.apply(this, arguments); - }; - } -}(jQuery)); - -// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation -// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target -(function($) { - $.extend($.fn, { - validateDelegate: function( delegate, type, handler ) { - return this.bind(type, function( event ) { - var target = $(event.target); - if ( target.is(delegate) ) { - return handler.apply(target, arguments); - } - }); - } - }); -}(jQuery)); diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/mainHandler b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/mainHandler deleted file mode 100644 index 28199109..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/mainHandler +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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. - */ - -object_maker.init(config_api.config_3dobject_holder, $("#objectHolder").width(), $("#objectHolder").width()/1.5); -object_maker.animate(); -var flight_dynamics = new flight_dynamics(); -$("#window_size").slider({ - range: "min", - value: 37, - min: 10, - max: 300, - slide: function (event, ui) { - $("#window_size_current_value").html($("#window_size").slider("value")); - - } -}); -$("#window_update").slider({ - range: "min", - value: 234, - min: 100, - max: 1000, - slide: function (event, ui) { - $("#window_update_value").html($("#window_update").slider("value")); - } -}); -$("#replotting").click(function () { - plotting.finishPlotting(function (status) { - if (status) { - plotting.initPlotting(function (status) { - d3.select("#realtimechart").select("svg").remove(); - plotting.realtime_plotting("#realtimechart", "#range_min", "#range_max", "#window_update_value", - 600, $("#realtimechart").height(), "#window_size_current_value", - '#plotting_attribute'); - }); - } else { - $("#realtimechart").html("There is no data to plot"); - } - }); -}); -$('.btn-minimize').click(function (e) { - e.preventDefault(); - var $target = $(this).parent().parent().next('.box-content'); - if ($target.is(':visible')) { - if ($(this).parent().attr('id') === "RealtimePlotting") { - plotting.forceToRedraw(function (status) { - d3.select("#realtimechart").select("svg").remove(); - plotting.realtime_plotting("#realtimechart", "#range_min", "#range_max", "#window_update_value", - 600, $("#realtimechart").height(), "#window_size_current_value", - '#plotting_attribute'); - }); - } - } else { - } -}); -$('#connectionOpen').on('click', function () { - $('#connectionOpen').toggleClass('active'); -}); -$("#xmppConnectionOpen").on('click', function () { - $('#xmppConnectionOpen').toggleClass('active'); - if ($('#xmppConnectionOpen').html() === "Start") { - sendMessage("Start the process", function(state){ - console.log("sending message to server..."+ state); - if(state<2){ - $('#xmppConnectionOpen').html("Stop"); - }else{ - $('#xmppConnectionOpen').html("Start"); - } - }); - - } else if ($('#xmppConnectionOpen').html() === "Stop") { - closeSocket(function(state){ - console.log("closing WebSocket..."+ state); - if(state<2){ - $('#xmppConnectionOpen').html("Stop"); - }else{ - $('#xmppConnectionOpen').html("Start"); - } - }); - $("#connectionOpen").html("Connect to XMPP Server").removeClass("btn btn-info").addClass("btn btn-primary"); - } -}); - -$('.btn-minimize').parent().parent().next('.box-content').hide(); -var webSocket; -config_api.realtime_plotting_data_window["attitude"] = new Queue(); -var current_status = {}; -function openSocket(wssAddress) { - if (webSocket !== undefined && webSocket.readyState == 1) { - writeResponse("WebSocket is already opened."); - } else { - webSocket = new WebSocket(wssAddress+config_api.web_socket_endpoint); - } - webSocket.onopen = function (event) { - if (event === undefined) { - writeResponse("WebSocket cant open " + event); - $("#connectionOpen").html("Connect to server").removeClass("btn btn-info").addClass("btn btn-primary"); - } else { - - if (event["isTrusted"] == true) { - $("#connectionOpen").html("Connected").removeClass("btn btn-primary").addClass("btn btn-info"); - } - writeResponse(JSON.stringify(event)); - - } - }; - webSocket.onmessage = function (event) { - var sender_message = event.data; - sender_message = isJSON(sender_message); - if (sender_message != null) { - flight_dynamics.processingMessage(sender_message); - } else { - writeResponse("Message has been corrupted."); - } - }; -} - -function sendMessage(message, callback) { - if(webSocket.readyState<2){ - webSocket.send(message); - } - callback(webSocket.readyState); -} - -function closeSocket(callback) { - if(webSocket.readyState<2){ - webSocket.close(); - } - callback(webSocket.readyState); -} - -function writeResponse(text) { - console.log(text); -} - -window.onbeforeunload = function () { - webSocket.close(); -}; - diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/controller.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/controller.js deleted file mode 100644 index 5381923a..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/controller.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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. - */ -$("#module_control button").click(function (index) { - console.log("Asking Server to send the " + $(this).attr('id') + " command to Ar Drone"); - var url = config_api.drone_control; - ajax_handler.ajaxRequest(url, config_api.drone_controlType, {action: $(this).attr('id'), speed: 7, duration: 7}, - config_api.drone_controlDataType, function (data, status) { - console.log(JSON.stringify(data)); - } - ); -}); - - - diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/flight_dynamics.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/flight_dynamics.js deleted file mode 100644 index 64814b6a..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/flight_dynamics.js +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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 flight_dynamics = function () { - var api = this; - api.processingMessage = function (sender_message) { - if(sender_message.battery_level!= undefined){ - $("#battery_level_holder").width( parseInt(sender_message.battery_level)+"%" ); - $("#battery_level").html(sender_message.battery_level+"%"); - } - if (sender_message.quatanium_val != undefined) { - current_status = object_maker.get_heading_attitude_bank(sender_message.quatanium_val); - object_maker.set_heading_attitude_bank(current_status); - $("#imageTop").animate({rotate: '' + (180 / Math.PI) * 2.890456 + 'deg'}, 2); - } - if (config_api.modules_status.angleOfRotation_2 || config_api.modules_status.angleOfRotation_1) { - console.log(JSON.stringify(current_status)); - object_maker.set_bank("#imageTop", current_status.bank); - object_maker.set_heading("#imageBackSecond", current_status.heading); - - } - if (config_api.modules_status.realtimePlotting) { - if (current_status[$('#plotting_attribute').val()] != undefined) { - plotting.pushData(current_status[$('#plotting_attribute').val()]); - } - } - if (sender_message.basicParam != undefined) { - if (sender_message.basicParam.velocity != undefined) { - var velocity = sender_message.basicParam.velocity; - if (velocity.length == 3) { - $("#velocityx").html(velocity[0]); - $("#velocityy").html(velocity[1]); - $("#velocityz").html(velocity[2]); - } - } else { - $("#velocityx").html(NaN); - $("#velocityy").html(NaN); - $("#velocityz").html(NaN); - } - if (sender_message.basicParam.global_location != undefined) { - var location = sender_message.basicParam.global_location; - if (location.length == 3) { - $("#locationLog").html(location[0]); - $("#locationAlt").html(location[1]); - $("#locationLat").html(location[2]); - } - } else { - $("#locationLog").html(NaN); - $("#locationAlt").html(NaN); - $("#locationLat").html(NaN); - } - } - if (sender_message.battery_voltage != undefined) { - $("#battery_voltage").html(sender_message.battery_voltage); - } else { - $("#battery_voltage").html(NaN); - } - } - -}; - - diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/realtime_plotting b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/realtime_plotting deleted file mode 100644 index 064ff2e1..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/realtime_plotting +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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 plotting = function () { - var api = this; - api.isDone = false; - api.current_value = 0; - api.finishPlotting = function (callBack) { - api.isDone = true; - callBack(true); - }, - api.initPlotting = function (callback) { - api.isDone = false; - callback(true); - }, - api.forceToRedraw = function (callback) { - api.isDone == true; - callback(true); - }, - api.pushData = function (new_value) { - console.log(new_value); - api.current_value = new_value; - }, - api.realtime_plotting = function (holder, y_min_hollder, y_max_holder, update_interval_holder, holder_width, - holder_height, window_size_holder, title) { - $(holder).html(); - var init_window = function () { - return 0; - } - api.data = d3.range(parseInt($(window_size_holder).html())).map(init_window); - var margin = {top: 20, right: 20, bottom: 20, left: 40}, - width = holder_width - margin.left - margin.right, - height = holder_height - margin.top - margin.bottom; - var x = d3.scale.linear() - .domain([1, parseInt($(window_size_holder).html()) - 2]) - .range([0, width]); - - var y = d3.scale.linear() - .domain([parseInt($(y_min_hollder).val()), parseInt($(y_max_holder).val())]) - .range([height, 0]); - var line = d3.svg.line() - .interpolate("basis") - .x(function (d, i) { - return x(i); - }) - .y(function (d, i) { - return y(d); - }); - - var svg = d3.select(holder).append("svg") - .attr("width", width + margin.left + margin.right) - .attr("height", height + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); - svg.append("defs").append("clipPath") - .attr("id", "clip") - .append("rect") - .attr("width", width) - .attr("height", height); - var axis_x = svg.append("g") - .attr("class", "x_axis") - .attr("transform", "translate(0," + y(0) + ")") - .call(d3.svg.axis().scale(x).orient("bottom")); - var axis_y = svg.append("g") - .attr("class", "y_axis") - .call(d3.svg.axis().scale(y).orient("left")); - var path = svg.append("g") - .attr("clip-path", "url(#clip)") - .append("path") - .datum(api.data) - .attr("class", "line") - .attr("d", line); - svg.append("text") - .attr("class", "yaxis_label") - .attr("transform", "rotate(-90)") - .attr("y", 0 - margin.left - 4) - .attr("x", (0 - (height / 2))) - .attr("dy", "1em") - .style("text-anchor", "middle") - .text($(title).val()); - svg.append("text") - .attr("class", "xaixs_label") - .attr("transform", - "translate(" + (width / 2) + " ," + - (height + margin.bottom) + ")") - .style("text-anchor", "middle") - .text("Window Size"); - svg.append("text") - .attr("class", "title_label") - .attr("x", (width / 2)) - .attr("y", 0 - (margin.top / 4)) - .attr("text-anchor", "middle") - .style("font-size", "16px") - .style("text-decoration", "underline") - .text($(title).val() + " variation within last " + $(window_size_holder).html() + " frames"); - - updateAgain(); - - function updateAgain() { - if (api.isDone)return; - api.data.push(api.current_value); - path - .attr("d", line) - .attr("transform", null) - .transition() - .duration($(update_interval_holder).html()) - .ease("linear") - .attr("transform", "translate(" + x(0) + ",0)") - .each("end", updateAgain); - api.data.shift(); - } - - function rescale() { - y.domain([parseInt($(y_min_hollder).val()), parseInt($(y_max_holder).val())]) - - svg.select(".title_label") - .text($(title).val() + " variation within last " + $(window_size_holder).html() + " frames"); - svg.select(".yaxis_label") - .text($(title).val()); - - } - - function rescale_x() { - x.domain([1, parseInt($(window_size_holder).html()) - 2]).range([0, width]) - svg.select(".x_axis").transition().call(axis_x); - } - - $("#plotting_attribute").change(function () { - rescale(); - }); - - } -} - diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.hbs b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.hbs deleted file mode 100644 index 2f004fd7..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.hbs +++ /dev/null @@ -1,250 +0,0 @@ -{{#zone "topCss"}} - {{css "css/main-app.css" }} -{{/zone}} -

-
-
-
- -
-
- -
-
-

Battery Level

-
-
-
-
-

0%

-
-
-
-
-
-
- -
-
-
-
-
-

Angle of Rotation

- -
- -
-
-
-
- -
-
-
-
-
-
-
- -
- -
-
-
-
- - - -
-
-
-
-
-
-
- -
- -
-
-
-
- - - -
-
-
-
- -
-
-
-

Live Video Stream

- -
- -
-
-
- video stream -
-
-
-
-
- -
-
-
-
-
-

Sensor Readings

-
- -
-
-
-
-

Location
latitude:
- longitude:
- altitudes:

-

Velocity:
x :
- y :
- z :

-

Battery Voltage:

-
-
-
-
-
-
-
-

Realtime Plotting

- -
- -
-
-
-
-
-
- Window size : -

- Update period : -
-

-
Y-axis: -
-

-
- -
-
-
-
-
-
-
-
-
-{{#zone "bottomJs"}} - {{js "/js/d3.min.js" }} - {{js "/js/3dobject_controller/three.min.js" }} - {{js "/js/3dobject_controller/Coordinates.js" }} - {{js "/js/3dobject_controller/OrbitAndPanControls.js" }} - {{js "/js/3dobject_controller/3dObjectControler.js" }} - {{js "/js/jQueryRotate.js" }} - {{js "/js/config/config.js" }} - {{js "/js/common/ajax_handler.js" }} - {{js "/js/modules/realtime_plotting" }} - {{js "/js/initJs" }} - {{js "/js/common/general_handler" }} - {{js "/js/common/websocket_api" }} - {{js "/js/modules/controller.js" }} - {{js "/js/modules/flight_dynamics.js" }} - {{js "/js/mainHandler" }} -{{/zone}} - diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.js b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.js deleted file mode 100644 index 550edded..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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. - */ -function onRequest (context) { - var log = new Log("statistics.js"); - var serverAddress = require("/app/modules/serverAddress.js").serverAddress; - var wssAddress = serverAddress.getWSSAddress(); - var httpsAddress = serverAddress.getHPPSTSAddress(); - var device = context.unit.params.device; - return { "device": device, "wssAddress": wssAddress, "httpsAddress": httpsAddress}; -} \ No newline at end of file diff --git a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.json b/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.json deleted file mode 100644 index 688e9398..00000000 --- a/modules/samples/droneanalyzer/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "version": "1.0.0" -} \ No newline at end of file diff --git a/modules/samples/droneanalyzer/feature/feature/pom.xml b/modules/samples/droneanalyzer/feature/feature/pom.xml deleted file mode 100644 index 1ae38ad7..00000000 --- a/modules/samples/droneanalyzer/feature/feature/pom.xml +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - org.homeautomation - droneanalyzer-feature - 2.1.0-SNAPSHOT - ../pom.xml - - - 4.0.0 - 2.1.0-SNAPSHOT - ${groupId}.droneanalyzer.feature - pom - ${project.artifactId} - http://wso2.org - - - - UTF-8 - - - - org.homeautomation - org.homeautomation.droneanalyzer.plugin - ${carbon.device.mgt.plugin.version} - - - org.homeautomation - org.homeautomation.droneanalyzer.api - ${carbon.device.mgt.plugin.version} - war - - - com.h2database.wso2 - h2-database-engine - 1.2.140.wso2v3 - - - - - - maven-resources-plugin - - - copy-resources - generate-resources - - copy-resources - - - src/main/resources - - - resources - - build.properties - p2.inf - - - - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - unpack - package - - unpack - - - - - org.homeautomation - org.homeautomation.droneanalyzer.ui - - ${project.version} - zip - true - - ${project.build.directory}/maven-shared-archive-resources/jaggeryapps/devicemgt - - **/* - - - - - - copy-jaxrs-war - package - - copy - - - - - org.homeautomation - org.homeautomation.droneanalyzer.api - - war - true - - ${project.build.directory}/maven-shared-archive-resources/webapps/ - - drone_analyzer.war - - - - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - - create-drone-analyzer-plugin-mgt-schema - package - - run - - - - - - - - - - - - - - - - - - - - - - - - - - - org.wso2.maven - carbon-p2-plugin - - - p2-feature-generation - package - - p2-feature-gen - - - org.homeautomation.droneanalyzer - ../../../features/etc/feature.properties - - - org.wso2.carbon.p2.category.type:server - org.eclipse.equinox.p2.type.group:true - - - - - org.homeautomation:org.homeautomation.droneanalyzer.plugin:${carbon.device.mgt.plugin.version} - - - - org.wso2.carbon.core.server:${carbon.kernel.version} - - org.wso2.carbon.device.mgt.server:${carbon.device.mgt.version} - - - - - - - - - diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/deviceConfig.properties b/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/deviceConfig.properties deleted file mode 100644 index 50d1d9d8..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/deviceConfig.properties +++ /dev/null @@ -1,33 +0,0 @@ -# -# Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) 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. -# -# - -[Device-Configurations] -owner=${DEVICE_OWNER} -deviceId=${DEVICE_ID} -device-name=${DEVICE_NAME} -controller-context=/drone_analyzer/controller -https-ep=${HTTPS_EP} -http-ep=${HTTP_EP} -apim-ep=${APIM_EP} -mqtt-ep=${MQTT_EP} -xmpp-ep=${XMPP_EP} -auth-method=token -auth-token=${DEVICE_TOKEN} -refresh-token=${DEVICE_REFRESH_TOKEN} -push-interval=15 - - diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/sketch.properties b/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/sketch.properties deleted file mode 100644 index 7492fd63..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/sketch.properties +++ /dev/null @@ -1,2 +0,0 @@ -templates=deviceConfig.properties -zipfilename=drone_analyzer.zip diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/src/IRIS+DroneStatistics.py b/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/src/IRIS+DroneStatistics.py deleted file mode 100644 index f6d896df..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/src/IRIS+DroneStatistics.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python -""" -/** -* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. -* -* WSO2 Inc. licenses this file to you 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. -**/ -""" - -#This script can be used to observe drone attribute (state) changes and push those status changes to xmpp server. - -import argparse -import time - -from dronekit import connect, VehicleMode -import xmppClient - -CONNECTION_TARGET = "/dev/ttyACM0" -PUSH_INTERVAL = 1 -BAUD = 57600 - - -parser = argparse.ArgumentParser(description='Connects to drone on ') -parser.add_argument("-c", "--connect", default='/dev/ttyACM0',help="vehicle connection target. Default '/dev/ttyACM0'") -parser.add_argument("-b", '--baud', type=int ,default=57600,help="Serial communication speed. Default 57600") -parser.add_argument("-i", "--push_interval", type=int, default=1,help="This is the interval which is used to push drone" - " status to xmpp server") -args = parser.parse_args() - -if args.connect: - CONNECTION_TARGET = args.connect - -if args.push_interval: - PUSH_INTERVAL = args.push_interval - -if args.baud: - BAUD = args.baud - -isConnected = xmppClient.connectToXMPPServer() -if isConnected: - print "\nConnecting to vehicle on: %s" % CONNECTION_TARGET - print "----------------------------------------------------------------------" - vehicle = connect(CONNECTION_TARGET, wait_ready=True, baud=BAUD) - while (True): - print " Attitude: %s" % vehicle.attitude.yaw - current_state = "{\"quatanium_val\":["+str(vehicle.attitude.yaw)+","+str(vehicle.attitude.pitch)+ \ - ", "+str(vehicle.attitude.roll)+"],\"basicParam\":{\"velocity\":["+str(vehicle.velocity[0])+"," \ - +str(vehicle.velocity[1])+","+str(vehicle.velocity[2])+"],\"global_location\":["+ \ - str(vehicle.location.global_relative_frame.alt)+","+str(vehicle.location.global_relative_frame.lat)+ \ - ","+str(vehicle.location.global_relative_frame.lon)+"]},\"battery_level\":"+ \ - str(vehicle.battery.level)+",\"battery_voltage\":"+str(vehicle.battery.voltage)+ \ - ",\"device_type\":\"IRIS_DRONE\"}"; - #current_state = "{\"quatanium_val\":[0.345, 0.567, 0.456, 0.6345],\"basicParam\":{\"velocity\":[3, 2, 1], " \ - #"\"global_location\":[0.567, 2.345, 0.456]},\"battery_level\":56,\"battery_voltage\":34,\"device_type\":\"SIMULATOR\"}"; - xmppClient.sendMessage(current_state) - time.sleep(PUSH_INTERVAL) - print "-------------------------------------------------------------------------------------------------" - -print "\nClose vehicle object" -vehicle.close() -print("Completed") \ No newline at end of file diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/src/util.py b/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/src/util.py deleted file mode 100644 index 33a84fea..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/src/util.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python - -""" -/** -* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. -* -* WSO2 Inc. licenses this file to you 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. -**/ -""" -import ConfigParser, os - -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# Device specific info when pushing data to server -# Read from a file "deviceConfig.properties" in the same folder level -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -configParser = ConfigParser.RawConfigParser() -configFilePath = r'./deviceConfig.properties' -configParser.read(configFilePath) - -DEVICE_OWNER = configParser.get('Device-Configurations', 'owner') -DEVICE_ID = configParser.get('Device-Configurations', 'deviceId') -XMPP_EP = configParser.get('Device-Configurations', 'xmpp-ep') -AUTH_TOKEN = configParser.get('Device-Configurations', 'auth-token') -DEVICE_PASSWORD = configParser.get('Device-Configurations', 'auth-token') -CONTROLLER_CONTEXT = configParser.get('Device-Configurations', 'controller-context') -HTTPS_EP = configParser.get('Device-Configurations', 'https-ep') -HTTP_EP = configParser.get('Device-Configurations', 'http-ep') -### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/src/xmppClient.py b/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/src/xmppClient.py deleted file mode 100644 index 30434d60..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/src/xmppClient.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -/** -* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. -* -* WSO2 Inc. licenses this file to you 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. -**/ -""" -import xmpp -import util - -XMPP_ENDPOINT = util.XMPP_EP.split(":") -XMPP_IP = XMPP_ENDPOINT[1].replace('//', '') -XMPP_PORT = int(XMPP_ENDPOINT[2]) -MESSAGE_TO = util.DEVICE_OWNER -XMPP_PWD = util.DEVICE_PASSWORD -XMPP_OWN = util.DEVICE_ID - -XMPP_RESOURCE = "drone_current_status" -XMPP_JID = MESSAGE_TO + "@" + XMPP_IP + "/" + XMPP_RESOURCE - - -global droneClient -droneClient = xmpp.Client(XMPP_IP, debug=[]) - -def loginToXMPPServer(): - auth = droneClient.auth(XMPP_OWN, XMPP_PWD, resource=XMPP_RESOURCE) - if not auth: - print 'could not authenticate!' - return 0 - print 'authenticated using', auth - droneClient.sendInitPresence() - return 1 - - -def connectToXMPPServer(): - connection = droneClient.connect(server=(XMPP_IP, XMPP_PORT)) - if not connection: - print 'could not connect to xmpp server at ' + str(XMPP_IP) - return 0 - - print 'connected with', connection - response = loginToXMPPServer() - if response: - return 1 - else: - return 0 - - -def sendMessage(message): - xmpp_message = xmpp.Message(XMPP_JID, message) - xmpp_message.setAttr('type', 'chat') - droneClient.send(xmpp_message) - print message - diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/start_server.sh b/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/start_server.sh deleted file mode 100755 index cc62706d..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/agent/start_server.sh +++ /dev/null @@ -1,83 +0,0 @@ - -#/** -#* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. -#* -#* WSO2 Inc. licenses this file to you 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. -#**/ - -#!/bin/bash - -echo "----------------------------------------------------------------" -echo "| WSO2 IOT Sample " -echo "| Drone Analyzer " -echo "| ---------------- " -echo "| ....initializing startup-script " -echo "----------------------------------------------------------------" - -currentDir=$PWD - - -while true; do - read -p "Do you wish to run 'apt-get update' and continue? [Yes/No] " yn - case $yn in - [Yy]* ) sudo apt-get update; - break;; - [Nn]* ) echo "Continuing without apt-get update..."; - break;; - * ) echo "Please answer yes or no."; - esac -done - -for f in ./deviceConfig.properties; do - if [ -e "$f" ]; then - echo "Configuration file found......" - else - echo "'deviceConfig.properties' file does not exist in current path. \nExiting installation..."; - exit; - fi - break -done - -#installing dependencies -sudo apt-get install python-pip python-dev -sudo pip install dronekit -sudo apt-get install python-xmpp - -while true; do - read -p "Whats the time-interval (in seconds) between successive Data-Pushes to the XMPP server (ex: '60' indicates 1 minute) > " push_interval - read -p "Vehicle connection target. Default '/dev/ttyACM0' :" connection_target - read -p "Serial communication speed. Default 57600 :" baud - - if [ $input -eq $input 2>/dev/null ] - then - echo "Setting data-push interval to $push_interval seconds." - break - else - echo "Input needs to be an integer indicating the number seconds between successive data-pushes." - fi - -done - -cp deviceConfig.properties ./src -python ./src/IRIS+DroneStatistics.py -i $push_interval -b $baud -c $connection_target - -if [ $? -ne 0 ]; then - echo "Could not start the service..." - exit; -fi - -echo "--------------------------------------------------------------------------" -echo "| Successfully Started " -echo "---------------------------------------------------------------------------" diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/build.properties b/modules/samples/droneanalyzer/feature/feature/src/main/resources/build.properties deleted file mode 100644 index 9c86577d..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/build.properties +++ /dev/null @@ -1 +0,0 @@ -custom = true diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/configs/drone_analyzer.json b/modules/samples/droneanalyzer/feature/feature/src/main/resources/configs/drone_analyzer.json deleted file mode 100644 index 731a4fb8..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/configs/drone_analyzer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "deviceType": { - "label": "Drone Analyzer", - "category": "iot" - } -} \ No newline at end of file diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/configs/drone_analyzer.xml b/modules/samples/droneanalyzer/feature/feature/src/main/resources/configs/drone_analyzer.xml deleted file mode 100644 index 9904e26b..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/configs/drone_analyzer.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - jdbc/DroneAnalyzerDM_DB - - diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/datasources/drone_analyzer-datasources.xml b/modules/samples/droneanalyzer/feature/feature/src/main/resources/datasources/drone_analyzer-datasources.xml deleted file mode 100644 index 43c84873..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/datasources/drone_analyzer-datasources.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - org.wso2.carbon.ndatasource.rdbms.RDBMSDataSourceReader - - - - - DroneAnalyzerDM_DB - The datasource used for the Drone Analyzer database - - jdbc/DroneAnalyzerDM_DB - - - - jdbc:h2:repository/database/DroneAnalyzerDM_DB;DB_CLOSE_ON_EXIT=FALSE - - wso2carbon - wso2carbon - org.h2.Driver - 50 - 60000 - true - SELECT 1 - 30000 - - - - - - - - diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/dbscripts/h2.sql b/modules/samples/droneanalyzer/feature/feature/src/main/resources/dbscripts/h2.sql deleted file mode 100644 index f7dac408..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/dbscripts/h2.sql +++ /dev/null @@ -1,11 +0,0 @@ - --- ----------------------------------------------------- --- Table `DRONE_DEVICE` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `DRONE_DEVICE` ( - `DRONE_DEVICE_ID` VARCHAR(45) NOT NULL , - `DEVICE_NAME` VARCHAR(100) NULL DEFAULT NULL, - PRIMARY KEY (`DRONE_DEVICE_ID`) ); - - - diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/dbscripts/mysql.sql b/modules/samples/droneanalyzer/feature/feature/src/main/resources/dbscripts/mysql.sql deleted file mode 100644 index 52519045..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/dbscripts/mysql.sql +++ /dev/null @@ -1,12 +0,0 @@ --- ----------------------------------------------------- --- Table `DRONE_DEVICE` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `DRONE_DEVICE` ( - `DRONE_DEVICE_ID` VARCHAR(45) NOT NULL , - `DEVICE_NAME` VARCHAR(100) NULL DEFAULT NULL, - PRIMARY KEY (`DRONE_DEVICE_ID`) ) -ENGINE = InnoDB; - - - - diff --git a/modules/samples/droneanalyzer/feature/feature/src/main/resources/p2.inf b/modules/samples/droneanalyzer/feature/feature/src/main/resources/p2.inf deleted file mode 100644 index ac1257cf..00000000 --- a/modules/samples/droneanalyzer/feature/feature/src/main/resources/p2.inf +++ /dev/null @@ -1,26 +0,0 @@ -instructions.configure = \ -org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../conf/device-types/);\ -org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.homeautomation.droneanalyzer_${feature.version}/configs/,target:${installFolder}/../../conf/device-types/,overwrite:true);\ -org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/webapps/);\ -org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.homeautomation.droneanalyzer_${feature.version}/webapps/,target:${installFolder}/../../deployment/server/webapps/,overwrite:true);\ -org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../resources/sketches/);\ -org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../resources/sketches/drone_analyzer/);\ -org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.homeautomation.droneanalyzer_${feature.version}/agent/,target:${installFolder}/../../resources/sketches/drone_analyzer/,overwrite:true);\ -org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.homeautomation.droneanalyzer_${feature.version}/dbscripts/,target:${installFolder}/../../../dbscripts/cdm/plugins/drone_analyzer,overwrite:true);\ -org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../deployment/server/jaggeryapps/);\ -org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.homeautomation.droneanalyzer_${feature.version}/jaggeryapps/,target:${installFolder}/../../deployment/server/jaggeryapps/,overwrite:true);\ -org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.homeautomation.droneanalyzer_${feature.version}/datasources/,target:${installFolder}/../../conf/datasources/,overwrite:true);\ -org.eclipse.equinox.p2.touchpoint.natives.mkdir(path:${installFolder}/../../database/);\ -org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.homeautomation.droneanalyzer_${feature.version}/database/,target:${installFolder}/../../database/,overwrite:true);\ - -instructions.unconfigure = \ -org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../conf/device-types/drone_analyzer.json);\ -org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../conf/device-types/drone_analyzer.xml);\ -org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/drone_analyzer.war);\ -org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/webapps/drone_analyzer);\ -org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../../dbscripts/cdm/plugins/drone_analyzer);\ -org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../resources/sketches/drone_analyzer);\ -org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../conf/datasources/drone_analyzer-datasources.xml);\ -org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../database/DroneAnalyzerDM_DB.h2.db);\ -org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view);\ -org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/../../deployment/server/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view);\ diff --git a/modules/samples/droneanalyzer/feature/pom.xml b/modules/samples/droneanalyzer/feature/pom.xml deleted file mode 100644 index 61478833..00000000 --- a/modules/samples/droneanalyzer/feature/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - org.homeautomation - droneanalyzer - 2.1.0-SNAPSHOT - ../pom.xml - - - droneanalyzer-feature - 4.0.0 - pom - 2.1.0-SNAPSHOT - - - feature - - \ No newline at end of file diff --git a/modules/samples/droneanalyzer/pom.xml b/modules/samples/droneanalyzer/pom.xml deleted file mode 100644 index 277dc374..00000000 --- a/modules/samples/droneanalyzer/pom.xml +++ /dev/null @@ -1,501 +0,0 @@ - - - - - - org.wso2 - wso2 - 1 - - - org.homeautomation - droneanalyzer - 2.1.0-SNAPSHOT - pom - 4.0.0 - http://wso2.com - - - component - feature - - - - - - org.eclipse.osgi - org.eclipse.osgi - ${eclipse.osgi.version} - provided - - - org.eclipse.equinox - org.eclipse.equinox.common - ${eclipse.equinox.common.version} - provided - - - org.testng - testng - ${testng.version} - - - junit - junit - - - org.beanshell - bsh - - - org.yaml - snakeyaml - - - provided - - - org.eclipse.osgi - org.eclipse.osgi.services - 3.3.100.v20120522-1822 - provided - - - org.wso2.carbon - org.wso2.carbon.logging - ${carbon.kernel.version} - - - org.apache.log4j.wso2 - log4j - - - commons-logging - commons-logging - - - org.wso2.carbon - org.wso2.carbon.bootstrap - - - provided - - - - org.apache.cxf - cxf-rt-frontend-jaxws - ${cxf.version} - - - - org.apache.cxf - cxf-rt-frontend-jaxrs - ${cxf.version} - - - - org.apache.cxf - cxf-rt-transports-http - ${cxf.version} - - - - org.eclipse.paho - org.eclipse.paho.client.mqttv3 - ${paho.mqtt.version} - provided - - - org.codehaus.jackson - jackson-core-asl - ${jackson.version} - - - org.codehaus.jackson - jackson-jaxrs - ${jackson.version} - - - javax - javaee-web-api - 6.0 - provided - - - javax.ws.rs - jsr311-api - ${javax.ws.rs.version} - - - - org.apache.httpcomponents - httpasyncclient - 4.1 - provided - - - org.json - json - 20140107 - provided - - - javax.websocket - javax.websocket-api - 1.1 - provided - - - org.apache.commons - commons-collections4 - 4.0 - provided - - - org.homeautomation - org.homeautomation.droneanalyzer.plugin - ${carbon.device.mgt.plugin.version} - provided - - - org.wso2.carbon.devicemgt - org.wso2.carbon.apimgt.webapp.publisher - ${carbon.device.mgt.version} - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.apimgt.webapp.publisher_${carbon.device.mgt.jar.version}.jar - - - - - org.wso2.carbon - org.wso2.carbon.ndatasource.core - ${carbon.kernel.version} - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.ndatasource.core_${carbon.kernel.version}.jar - - - - org.wso2.carbon.devicemgt-plugins - org.wso2.carbon.device.mgt.iot - ${carbon.device.mgt.plugin.version} - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.device.mgt.iot_${carbon.iot.device.mgt.jar.version}.jar - - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.core - ${carbon.device.mgt.version} - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.device.mgt.core_${carbon.device.mgt.jar.version}.jar - - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.common - ${carbon.device.mgt.version} - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.device.mgt.common_${carbon.device.mgt.jar.version}.jar - - - - org.wso2.carbon.devicemgt - org.wso2.carbon.certificate.mgt.core - ${carbon.device.mgt.version} - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.certificate.mgt.core_${carbon.device.mgt.jar.version}.jar - - - - org.wso2.carbon.devicemgt - org.wso2.carbon.apimgt.annotations - ${carbon.device.mgt.version} - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.apimgt.annotations_${carbon.device.mgt.jar.version}.jar - - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.analytics.data.publisher - ${carbon.device.mgt.version} - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.device.mgt.analytics.data.publisher_${carbon.device.mgt.jar.version}.jar - - - - commons-httpclient.wso2 - commons-httpclient - ${commons-httpclient.orbit.version} - system - - ${basedir}/../../../../repository/components/plugins/commons-httpclient_3.1.0.wso2v2.jar - - - - org.wso2.carbon - org.wso2.carbon.utils - ${carbon.kernel.version} - - - org.bouncycastle.wso2 - bcprov-jdk15on - - - org.wso2.carbon - org.wso2.carbon.user.api - - - org.wso2.carbon - org.wso2.carbon.queuing - - - org.wso2.carbon - org.wso2.carbon.base - - - org.apache.axis2.wso2 - axis2 - - - org.igniterealtime.smack.wso2 - smack - - - org.igniterealtime.smack.wso2 - smackx - - - jaxen - jaxen - - - commons-fileupload.wso2 - commons-fileupload - - - org.apache.ant.wso2 - ant - - - org.apache.ant.wso2 - ant - - - commons-httpclient.wso2 - commons-httpclient - - - org.eclipse.equinox - javax.servlet - - - org.wso2.carbon - org.wso2.carbon.registry.api - - - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.utils_${carbon.kernel.version}.jar - - - - org.igniterealtime.smack.wso2 - smack - ${smack.wso2.version} - system - - ${basedir}/../../../../repository/components/plugins/smack_3.0.4.wso2v1.jar - - - - org.igniterealtime.smack.wso2 - smackx - ${smackx.wso2.version} - system - - ${basedir}/../../../../repository/components/plugins/smackx_3.0.4.wso2v1.jar - - - - org.json.wso2 - json - ${commons-json.version} - system - - ${basedir}/../../../../repository/components/plugins/json_3.0.0.wso2v1.jar - - - - commons-codec - commons-codec - 1.4.0.wso2v1 - system - - ${basedir}/../../../../repository/components/plugins/commons-codec_1.4.0.wso2v1.jar - - - - org.wso2.carbon.devicemgt - org.wso2.carbon.device.mgt.extensions - ${carbon.device.mgt.version} - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.device.mgt.extensions_${carbon.device.mgt.jar.version}.jar - - - - org.wso2.carbon.devicemgt - org.wso2.carbon.apimgt.application.extension - ${carbon.device.mgt.version} - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.apimgt.application.extension_${carbon.device.mgt.jar.version}.jar - - - - org.wso2.carbon.devicemgt - org.wso2.carbon.identity.jwt.client.extension - ${carbon.device.mgt.jar.version} - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.identity.jwt.client.extension_${carbon.device.mgt.jar.version}.jar - - - - org.wso2.carbon - org.wso2.carbon.user.api - ${carbon.kernel.version} - system - - ${basedir}/../../../../repository/components/plugins/org.wso2.carbon.user.api_${carbon.kernel.version}.jar - - - - - - - - wso2.releases - WSO2 internal Repository - http://maven.wso2.org/nexus/content/repositories/releases/ - - true - daily - ignore - - - - - wso2.snapshots - Apache Snapshot Repository - http://maven.wso2.org/nexus/content/repositories/snapshots/ - - true - daily - - - false - - - - wso2-nexus - WSO2 internal Repository - http://maven.wso2.org/nexus/content/groups/wso2-public/ - - true - daily - ignore - - - - - - - - wso2-nexus - WSO2 internal Repository - http://maven.wso2.org/nexus/content/groups/wso2-public/ - - true - daily - ignore - - - - wso2.releases - WSO2 internal Repository - http://maven.wso2.org/nexus/content/repositories/releases/ - - true - daily - ignore - - - - - - - 4.4.3 - 1.1.0-SNAPSHOT - 1.1.0.SNAPSHOT - 1.0.2 - 3.0.0.wso2v1 - 3.8.1.v20120830-144521 - 2.1.0-SNAPSHOT - 2.1.0.SNAPSHOT - 1.1.1 - - - 3.0.4.wso2v1 - 3.0.4.wso2v1 - 2.6.1 - 1.9.0 - 3.1.0.wso2v2 - 3.0.0.wso2v1 - 3.6.100.v20120522-1841 - - - 1.7 - 1.7 - org.homeautomation.droneanalyzer - 3.8.1 - 1.4.0 - 2.4.1 - 2.3.2 - 2.6 - 1.8 - 1.7.2 - - - -