From 37789891e7496e1921334b4fe9e91da591f6a553 Mon Sep 17 00:00:00 2001 From: Dimuth Date: Sun, 1 Jan 2017 21:48:49 +0530 Subject: [PATCH 1/2] location-data-visualizer sample added to product-iots/modules/samples --- .../Samples/GadgetLocationData/artifact.xml | 4 + .../html_templates/view_fence_popup.html | 69 + ...Geo-ExecutionPlan-Proximity_alert.siddhiql | 140 + .../Geo-ExecutionPlan-Speed_alert.siddhiql | 20 + ...eo-ExecutionPlan-Stationery_alert.siddhiql | 89 + .../Geo-ExecutionPlan-Traffic_alert.siddhiql | 17 + .../Geo-ExecutionPlan-Within_alert.siddhiql | 20 + .../locationData/css/style.css | 97 + .../locationData/gadget.json | 26 + .../locationData/img/floor.jpg | Bin 0 -> 208415 bytes .../locationData/include/commons.jag | 31 + .../locationData/include/store_alerts.jag | 165 + .../GadgetLocationData/locationData/index.xml | 196 + .../locationData/js/RestCaller.js | 478 + .../locationData/js/graph.js | 111 + .../locationData/js/traffic.js | 130 + .../locationData/lib/css/bootstrap.css | 6757 ++++++++++ .../locationData/lib/js/bootstrap.js | 2377 ++++ .../locationData/lib/js/d3.js | 9554 ++++++++++++++ .../locationData/lib/js/d3tip.js | 352 + .../locationData/lib/js/jquery.js | 11009 ++++++++++++++++ ...bon.device.mgt.iot.location.analytics.data | 1 + .../build.xml | 19 + .../pom.xml | 73 + .../src/assembly/src.xml | 37 + .../carbonapps/locationTraker/artifacts.xml | 25 + .../artifact.xml | 22 + .../location-data-dashboard.json | 1 + .../artifact.xml | 22 + .../location-data-visualizer/css/style.css | 97 + .../location-data-visualizer/floor.jpg | Bin 0 -> 208415 bytes .../location-data-visualizer/gadget.json | 23 + .../location-data-visualizer/img/floor.jpg | Bin 0 -> 208415 bytes .../location-data-visualizer/index.jpg | Bin 0 -> 102007 bytes .../location-data-visualizer/index.xml | 209 + .../location-data-visualizer/js/RestCaller.js | 511 + .../location-data-visualizer/js/graph.js | 136 + .../location-data-visualizer/js/traffic.js | 153 + .../lib/css/bootstrap.css | 6757 ++++++++++ .../lib/js/bootstrap.js | 2377 ++++ .../location-data-visualizer/lib/js/d3.js | 9554 ++++++++++++++ .../location-data-visualizer/lib/js/d3tip.js | 352 + .../location-data-visualizer/lib/js/floor.jpg | Bin 0 -> 208415 bytes .../location-data-visualizer/lib/js/jquery.js | 11009 ++++++++++++++++ 44 files changed, 63020 insertions(+) create mode 100644 modules/analytics/Samples/GadgetLocationData/artifact.xml create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/assets/html_templates/view_fence_popup.html create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Traffic_alert.siddhiql create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Within_alert.siddhiql create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/css/style.css create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/gadget.json create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/img/floor.jpg create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/include/commons.jag create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/include/store_alerts.jag create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/index.xml create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/js/RestCaller.js create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/js/graph.js create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/js/traffic.js create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/lib/css/bootstrap.css create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/lib/js/bootstrap.js create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/lib/js/d3.js create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/lib/js/d3tip.js create mode 100644 modules/analytics/Samples/GadgetLocationData/locationData/lib/js/jquery.js create mode 160000 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics.data create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/build.xml create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/pom.xml create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/assembly/src.xml create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/artifacts.xml create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_dashboard/artifact.xml create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_dashboard/location-data-dashboard.json create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/artifact.xml create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/css/style.css create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/floor.jpg create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/gadget.json create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/img/floor.jpg create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/index.jpg create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/index.xml create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/js/RestCaller.js create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/js/graph.js create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/js/traffic.js create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/lib/css/bootstrap.css create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/lib/js/bootstrap.js create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/lib/js/d3.js create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/lib/js/d3tip.js create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/lib/js/floor.jpg create mode 100644 modules/samples/location-data-plugin/org.wso2.carbon.device.mgt.iot.location.analytics/src/main/resources/carbonapps/locationTraker/location_data_visualizer_gadget/location-data-visualizer/lib/js/jquery.js diff --git a/modules/analytics/Samples/GadgetLocationData/artifact.xml b/modules/analytics/Samples/GadgetLocationData/artifact.xml new file mode 100644 index 00000000..ab4deb36 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/artifact.xml @@ -0,0 +1,4 @@ + + + geo-dashboard + \ No newline at end of file diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/assets/html_templates/view_fence_popup.html b/modules/analytics/Samples/GadgetLocationData/locationData/assets/html_templates/view_fence_popup.html new file mode 100644 index 00000000..4284bb5e --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/assets/html_templates/view_fence_popup.html @@ -0,0 +1,69 @@ + + + + + + + + +
+
+
+ +
+ + +
+
+
+
+
+ Export +
+
+ Hide +
+
+
+
+
+
+
+
+ +
+ + +
+ + +
+
+
+
+
+ Export +
+
+ Hide +
+
+
+
+
+ + \ No newline at end of file diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql b/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql new file mode 100644 index 00000000..fb647203 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Proximity_alert.siddhiql @@ -0,0 +1,140 @@ +/* Enter a unique ExecutionPlan */ +@Plan:name('Geo-ExecutionPlan-Proximity_alert') + +/* Enter a unique description for ExecutionPlan */ +-- @Plan:description('ExecutionPlan') + +/* define streams/tables and write queries here ... */ + +@Import('org.wso2.geo.StandardSpatialEvents:1.0.0') +define stream dataIn (id string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, eventId string ); + +@Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') +define stream dataOut ( id string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, eventId string, state string, information string ); + +@IndexBy('id') +define table ProximityTable(id string, timeStamp long); + +@IndexBy('id') +define table AlertsTable(id string , proximityWith string, eventId string); + +from dataIn#geodashboard:subscribe() +select id, latitude, longitude, timeStamp, type, speed, heading, eventId +insert into initialStream; + +from initialStream[type == 'STOP'] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "" as proximityInfo ,"false" as isProximity +insert into dataOutStream; + +from initialStream[type != 'STOP'] +select * +insert into objectInitialStream; + +from objectInitialStream#geo:proximity(id,longitude,latitude, $proximityDistance) +select id, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith +insert into proxymityStream; + +from proxymityStream[AlertsTable.id == proxymityStream.id in AlertsTable] +select id, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith,true as inAlertTable +insert into innerStreamOne; + +from proxymityStream[not(AlertsTable.id == proxymityStream.id in AlertsTable)] +select id, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith,false as inAlertTable +insert into innerStreamOne; + +from proxymityStream[AlertsTable.id == proxymityStream.proximityWith in AlertsTable] +select id, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith,true as inAlertTable +insert into innerStreamSeven; + +from proxymityStream[not(AlertsTable.id == proxymityStream.proximityWith in AlertsTable)] +select id, latitude, longitude, timeStamp, type, speed, heading, eventId,inCloseProximity,proximityWith,false as inAlertTable +insert into innerStreamSeven; + +from innerStreamOne[inCloseProximity == true AND not(inAlertTable)] +select id,str:concat(",",proximityWith) as proximityWith , eventId +insert into AlertsTable; + +from innerStreamSeven[inCloseProximity == true AND not(inAlertTable)] +select proximityWith as id,str:concat(",",id) as proximityWith , eventId +insert into AlertsTable; + +from innerStreamOne[innerStreamOne.inCloseProximity == true AND inAlertTable]#window.length(0) join AlertsTable +on innerStreamOne.id == AlertsTable.id +select innerStreamOne.id as id, str:concat(",", innerStreamOne.proximityWith, AlertsTable.proximityWith) as proximityWith, innerStreamOne.eventId as eventId +insert into updateStream; + +from innerStreamSeven[innerStreamSeven.inCloseProximity == true AND inAlertTable]#window.length(0) join AlertsTable +on innerStreamSeven.proximityWith == AlertsTable.id +select innerStreamSeven.proximityWith as id, str:concat(",", innerStreamSeven.id, AlertsTable.proximityWith) as proximityWith, innerStreamSeven.eventId as eventId +insert into updateStream; + +from innerStreamOne[innerStreamOne.inCloseProximity == false AND inAlertTable]#window.length(0) join AlertsTable +on innerStreamOne.id == AlertsTable.id +select innerStreamOne.id as id, str:replaceAll(AlertsTable.proximityWith, str:concat(",", innerStreamOne.proximityWith), "") as proximityWith, innerStreamOne.eventId as eventId +insert into updateStream; + +from innerStreamSeven[innerStreamSeven.inCloseProximity == false AND inAlertTable]#window.length(0) join AlertsTable +on innerStreamSeven.proximityWith == AlertsTable.id +select innerStreamSeven.proximityWith as id, str:replaceAll(AlertsTable.proximityWith, str:concat(",", innerStreamSeven.id), "") as proximityWith, innerStreamSeven.eventId as eventId +insert into updateStream; + +from updateStream +select * +update AlertsTable + on id== AlertsTable.id; + +from updateStream[proximityWith == ""] +delete AlertsTable + on id== AlertsTable.id; + +from objectInitialStream[AlertsTable.id == objectInitialStream.id in AlertsTable] +select id, latitude, longitude, timeStamp, type, speed, heading, eventId, true as inAlertTable +insert into publishStream; + +from objectInitialStream[not(AlertsTable.id == objectInitialStream.id in AlertsTable)] +select id, latitude, longitude, timeStamp, type, speed, heading, eventId, false as inAlertTable +insert into publishStream; + +from publishStream[inAlertTable == true]#window.length(0) join AlertsTable +on publishStream.id== AlertsTable.id +select publishStream.id as id, publishStream.latitude as latitude, publishStream.longitude as longitude, publishStream.timeStamp as timeStamp, publishStream.type as type, publishStream.speed as speed, publishStream.heading as heading, publishStream.eventId as eventId, AlertsTable.proximityWith as proximityInfo +insert into innerStreamTwo; + +from publishStream[inAlertTable == false] +delete ProximityTable on ProximityTable.id==id; + +from publishStream[inAlertTable == false] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "" as proximityInfo ,"false" as isProximity +insert into dataOutStream; + +from innerStreamTwo[ProximityTable.id == innerStreamTwo.id in ProximityTable] +insert into innerStreamThree; + +from innerStreamThree#window.length(0) join ProximityTable +on innerStreamThree.id == ProximityTable.id +select innerStreamThree.id , innerStreamThree.latitude, innerStreamThree.longitude,innerStreamThree.timeStamp, innerStreamThree.type, innerStreamThree.speed, innerStreamThree.heading ,innerStreamThree.eventId, ProximityTable.timeStamp as storedTime, innerStreamThree.proximityInfo as proximityInfo +insert into innerStreamFour; + +from innerStreamFour[(timeStamp - storedTime) >= $proximityTime] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId ,proximityInfo,"true" as isProximity +insert into dataOutStream; + +from innerStreamFour[(timeStamp - storedTime) < $proximityTime] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , proximityInfo ,"false" as isProximity +insert into dataOutStream; + +from innerStreamTwo[not(ProximityTable.id == innerStreamTwo.id in ProximityTable)] +select innerStreamTwo.id, innerStreamTwo.timeStamp +insert into ProximityTable; + +from innerStreamTwo[not(ProximityTable.id == innerStreamTwo.id in ProximityTable)] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "" as proximityInfo ,"false" as isProximity +insert into dataOutStream; + +from dataOutStream[isProximity == 'true'] +select id, latitude, longitude, timeStamp, type, speed, heading, eventId,"WARNING" as state,str:concat("Proximity with "," ",proximityInfo) as information +insert into dataOut; + +from dataOutStream[isProximity == 'false'] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId ,"NORMAL" as state,"" as information +insert into dataOut; \ No newline at end of file diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql b/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql new file mode 100644 index 00000000..65dad468 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Speed_alert.siddhiql @@ -0,0 +1,20 @@ +/* Enter a unique ExecutionPlan */ +@Plan:name('Geo-ExecutionPlan-Speed---$deviceId_alert') + +/* Enter a unique description for ExecutionPlan */ +-- @Plan:description('ExecutionPlan') + +/* define streams/tables and write queries here ... */ + +@Import('org.wso2.geo.StandardSpatialEvents:1.0.0') +define stream dataIn (id string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, eventId string); + +@Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') +define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string, speed float, heading float, eventId string, state string, information string); + +from dataIn[speed >= $speedAlertValue and id == "$deviceId"]#geodashboard:subscribe() +select id , latitude, longitude,timeStamp, type ,speed, heading ,eventId , "ALERTED" as state, "This device movement is not normal!!" as information +insert into dataOut; +from dataIn[speed < $speedAlertValue and id == "$deviceId"] +select id , latitude, longitude,timeStamp, type ,speed, heading ,eventId , "NORMAL" as state, "This device movement is normal" as information +insert into dataOut; diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql b/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql new file mode 100644 index 00000000..46bfbfe2 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Stationery_alert.siddhiql @@ -0,0 +1,89 @@ +/* Enter a unique ExecutionPlan */ +@Plan:name('$executionPlanName') + +/* Enter a unique description for ExecutionPlan */ +-- @Plan:description('ExecutionPlan') + +/* define streams/tables and write queries here ... */ + +@Import('org.wso2.geo.StandardSpatialEvents:1.0.0') +define stream dataIn (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string); + + +@Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') +define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string, state string, information string); + +@IndexBy('id') +define table StationeryTable(id string, timeStamp long); + +@IndexBy('id') +define table AlertsTable(id string, stationary bool); + +from dataIn#geodashboard:subscribe() +select id, latitude, longitude, timeStamp, type, speed, heading, eventId,geo:within(longitude,latitude,"$geoFenceGeoJSON") as isWithin +insert into innerStreamOne; + +from innerStreamOne[isWithin == false] +delete StationeryTable on StationeryTable.id==id; + +from innerStreamOne[isWithin == false] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "false" as isStationary +insert into dataOutStream; + +from innerStreamOne[isWithin == true]#geo:stationary(id,longitude,latitude, $fluctuationRadius) +select id, latitude, longitude, timeStamp, type, speed, heading, eventId,stationary +insert into innerStreamTwo; + +from innerStreamTwo[innerStreamTwo.stationary == true] +select innerStreamTwo.id, innerStreamTwo.stationary +insert into AlertsTable; + +from innerStreamTwo[innerStreamTwo.stationary == false] +delete AlertsTable on AlertsTable.id==id; + +from innerStreamTwo[innerStreamTwo.stationary == false] +delete StationeryTable on StationeryTable.id==id; + +from innerStreamOne[isWithin == true AND not(AlertsTable.id == innerStreamOne.id in AlertsTable)] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "false" as isStationary +insert into dataOutStream; + +from innerStreamOne[isWithin == true AND AlertsTable.id == innerStreamOne.id in AlertsTable] +insert into innerStreamThree; + +from innerStreamThree#window.length(0) join AlertsTable +on innerStreamThree.id == AlertsTable.id +select innerStreamThree.id , innerStreamThree.latitude, innerStreamThree.longitude,innerStreamThree.timeStamp, innerStreamThree.type, innerStreamThree.speed, innerStreamThree.heading ,innerStreamThree.eventId +insert into innerStreamFour; + +from innerStreamFour[not(StationeryTable.id == innerStreamFour.id in StationeryTable)] +select innerStreamFour.id, innerStreamFour.timeStamp +insert into StationeryTable; + +from innerStreamOne[isWithin == true AND not(StationeryTable.id == innerStreamOne.id in StationeryTable)] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "false" as isStationary +insert into dataOutStream; + +from innerStreamOne[isWithin == true AND StationeryTable.id == innerStreamOne.id in StationeryTable] +insert into innerStreamFive; + +from innerStreamFive#window.length(0) join StationeryTable +on innerStreamFive.id == StationeryTable.id +select innerStreamFive.id , innerStreamFive.latitude, innerStreamFive.longitude,innerStreamFive.timeStamp, innerStreamFive.type, innerStreamFive.speed, innerStreamFive.heading ,innerStreamFive.eventId, StationeryTable.timeStamp as storedTime +insert into innerStreamSix; + +from innerStreamSix[(timeStamp - storedTime) >= $stationeryTime] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId ,"true" as isStationary +insert into dataOutStream; + +from innerStreamSix[(timeStamp - storedTime) < $stationeryTime] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId ,"false" as isStationary +insert into dataOutStream; + +from dataOutStream[isStationary == 'true'] +select id ,latitude, longitude,timeStamp, type, speed, heading ,eventId ,"ALERTED" as state, "This device is in $stationeryName area!!!" as information +insert into dataOut; + +from dataOutStream[isStationary == 'false'] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId ,"NORMAL" as state,"" as information +insert into dataOut; \ No newline at end of file diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Traffic_alert.siddhiql b/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Traffic_alert.siddhiql new file mode 100644 index 00000000..5e6bb5b1 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Traffic_alert.siddhiql @@ -0,0 +1,17 @@ +/* Enter a unique ExecutionPlan */ +@Plan:name('$executionPlanName') + +/* Enter a unique description for ExecutionPlan */ +-- @Plan:description('ExecutionPlan') + +/* define streams/tables and write queries here ... */ + +@Import('rawGeoStream:1.0.0') +define stream dataIn (id string, timeStamp long, geometry string, state string, information string); + +@Export('AlertsNotifications:1.0.0') +define stream dataOut (id string, state string, information string, timeStamp long, latitude double, longitude double); + +from dataIn[geo:intersects(geometry, "$geoFenceGeoJSON")==true and geodashboard:needToNotify(id, str:concat(information, state), "sendFirst") == true and id == $deviceId] +select id, state, str:concat("Traffic alert in $areaName. State: ", state, " ", information) as information, timeStamp, 0.0 as latitude, 0.0 as longitude +insert into dataOut \ No newline at end of file diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Within_alert.siddhiql b/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Within_alert.siddhiql new file mode 100644 index 00000000..b58fd59e --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/conf/alerts/Geo-ExecutionPlan-Within_alert.siddhiql @@ -0,0 +1,20 @@ +/* Enter a unique ExecutionPlan */ +@Plan:name('$executionPlanName') + +/* Enter a unique description for ExecutionPlan */ +-- @Plan:description('ExecutionPlan') + +/* define streams/tables and write queries here ... */ + +@Import('org.wso2.geo.StandardSpatialEvents:1.0.0') +define stream dataIn (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string); + +@Export('org.wso2.geo.ProcessedSpatialEvents:1.0.0') +define stream dataOut (id string, latitude double, longitude double, timeStamp long, type string ,speed float, heading float, eventId string, state string, information string); + +from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")==true and id == "$deviceId"]#geodashboard:subscribe() +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "ALERTED" as state, "This device is in $areaName restricted area!!!" as information +insert into dataOut; +from dataIn[geo:within(longitude,latitude,"$geoFenceGeoJSON")!=true and id == "$deviceId"] +select id , latitude, longitude,timeStamp, type, speed, heading ,eventId , "NORMAL" as state, "" as information +insert into dataOut; diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/css/style.css b/modules/analytics/Samples/GadgetLocationData/locationData/css/style.css new file mode 100644 index 00000000..0db6cfae --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/css/style.css @@ -0,0 +1,97 @@ +body { + font: 10px sans-serif; +} +.axis path, +.axis line { + fill: none; + stroke: #000; + shape-rendering: crispEdges; +} +.point { + stroke: #000; +} + +form { + margin-top: 25px; + text-align: center; +} +.slider { + width: 80%; + display: block; + margin: 0 auto; +} +output { + display: block; + margin: 25px auto; + font-size:2em; +} +div.tooltip { + position: absolute; + text-align: center; + width: 60px; + height: 28px; + padding: 2px; + font: 12px sans-serif; + background: lightsteelblue; + border: 0px; + border-radius: 8px; + pointer-events: none; +} +.axis path, +.axis line { + fill: none; + stroke: #000; + shape-rendering: crispEdges; +} + +.bar { + fill: orange; +} + +.bar:hover { + fill: orangered ; +} + +.x.axis path { + display: none; +} + +.d3-tip { + line-height: 1; + font-weight: bold; + padding: 12px; + background: rgba(0, 0, 0, 0.8); + color: #fff; + border-radius: 2px; + z-index: 1000; +} + +/* Creates a small triangle extender for the tooltip */ +.d3-tip:after { + box-sizing: border-box; + display: inline; + font-size: 10px; + width: 100%; + line-height: 1; + color: rgba(0, 0, 0, 0.8); + content: "\25BC"; + position: absolute; + text-align: center; +} + +/* Style northward tooltips differently */ +.d3-tip.n:after { + margin: -1px 0 0 0; + top: 100%; + left: 0; +} +.btn-space { + margin-right: 30px; + margin-bottom: 10px; + margin-top: 10px; +} +.element-space{ + margin-right: 30px; + margin-bottom: 10px; + margin-top: 10px; +} diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/gadget.json b/modules/analytics/Samples/GadgetLocationData/locationData/gadget.json new file mode 100644 index 00000000..52169849 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/gadget.json @@ -0,0 +1,26 @@ +{ + "id": "geo-dashboard", + "title": "Geo Dashboard", + "type": "widget", + "thumbnail": "gadget/geo-dashboard/img/thumbnail.png", + "settings": { + "personalize": true + }, + "data": { + "url": "gadget/geo-dashboard/index.xml" + }, + "styles": { + "borders": false, + "title": false + }, + "notify": { + "select": { + "type": "address", + "description": "This notifies selected state" + }, + "cancel": { + "type": "boolean", + "description": "This notifies cancellation of state selection" + } + } +} \ No newline at end of file diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/img/floor.jpg b/modules/analytics/Samples/GadgetLocationData/locationData/img/floor.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea795445b77c31ac7bc8dfa075b7e0c03b1cb8a9 GIT binary patch literal 208415 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

O=Y=pyMdR$y&5)!I*C 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 z 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%0AD*WK4Xt@(KDlh?tw z`RsF$ocXf_+#yCX95iKJvFN9a-xcoKxDUEird^PMAD7YzKj_H)zk2Bu#(DDKCA7th zcoipCr$%p{%FWaz#UfH`lE}3WQk(Hsstf7hpYYKIo11K{y2?L%m9?%dSYE&kURUSf zp_oCv{3zDzyEp4luRzzW%aV>vLi3QMcYz$A-fRu@bl^WQ*D~+_oj}JQ7{k9y1V#&u zzHs1s1}eTspS^%9wGgnAk&;E68e-B-_~K*#bVA_)s9m9=%R)H|G0^IQtnd|_RADpO z*Ob2tltPhB^;YEto2o42cB*V!k42*&ziqUsX-$&8zM1~s?bORASGkd#uI;e%sLv^{ zZpLOd2ZVE?N4y|uMfe>{lwuLlZIT@xC;zYt|_FQI& zq$);6svv6<=D2HVV$FrzlW6N}$N&M(Ja0>x(sRPQE83>p!8tIHC-AO=6eApcKANq;zN7{?T)Rg4 zW*rNl7o44mrV_$mHH?{Ska~j5GE<+IAF5ehz%x5B_0%ffYktdf^icp8+xAv?|MFrK ziil_c{e6>y3k}DjtpoC-jnub+dzZh}KFU1o5PExa!Hd~pGt>K$PR?y_wAOptm>b`o zf2kw)e)Wte&zI7t|1!gRp0&?{%99VaU(ZVrOnm)A+p^2oy(qPpubJ#=cBon|NSX0$ zpmx||RtPn3?w0#erOFKc(a;UfA4-Tkr3fz5>qjswZDtnC zQn~%g}JN@fbRT*cDis>cuXL?|tkFSR6s=qlAf*`NUgaU4%Vp!aXN$-I zk~Js4t+SN5p5uv=K?ay=7P-AJKhCXrASJIbxxuMnSJ$>D5p9xr}@x8Fz^SO%&iluk?FyYb5&zk^YnV2`DsNK z8K=C>fAT$Ry<~OF%d8{oq>+`b5mWWPd-&BR8)#rZ+`Ki5!8ljps1=^QJ>G24HDdDJ z&HMcezq{+Cy`%jbZfXK<6v0dU`M9T5wAD7IlC$RJvb-$O;L8h1FEM*>;|bfMB;S5q zRPOch%5YJEe&q};w-rAP!VdMqY*!Rf~a-g2i7E zS!kp35nXeu56Pof| zc^RffY=O_6izp3r?-6TQBz&7Jv0<(1jB@qSTkb3xMv8DaGU4J8%YGf{#N<;eDY`w0 z=k`38y|M|MS6Ed!@1nEd!7OrikShTEeb7p>RLw}}K4p$oylb!+Tf1bhuhLx$Gt%&w>@M9FEejIV$MeYPKl7&Ml_OcQz z%>T$HmmqyV1EC919p<%`=c8Zx1cSi=0L$mFpTi=l>8rVqb47N2zhEw+=BQyFhx_1u z_`LxB6zU9ob?InHCY0rZ6YN(e(e=SPj)KGuH-bYlOchqE1wIbE!-oR{yOw>rXt6-6 zZ~gyft^bgA1viunJYwSIn*Xrs#yAlMeTzt?g=2n|u|cl|A8 zRfxL!x@7KqaTr>VJ3wmaYx6{P4Tgx2bL2R1?az1UOfTS?-Y(&j* zzf)87UOj&EC$OE>fZLxu1H<)C{{e@)+X5x^6|U+8oWb3fv%dS?Vra}KwQR@HAM?SY$LyQ_7v|%XG=q6SY=?NGC3dZ#fIBf)FmQoeP|&Xu@xu9>U|m1|iedpBm>wNcl98`rA+3zA&)ib8RkleP_=dGcoUOf0rrqw& z)oJy&Pv=c*?8<3Cg9ESzNtZIUozM<|%9E$&eBE^tTu~(atu)YJsX?YVwty@@BrF&q z(zp-Df36hOTHKc}5fIhof#iY#B8~pg0G{}d7!W40Tj+y7@UcyF1(kNr3tC1AkXBCm z^R$xxGXx;fa)n zX5SIVSyWXTRhM0d<_`4fi^yT488J$lM0grZJx0zE%X^@30?P_~6`YeHmE187Yeh6| z|IS54vg%L=yNsUv&Uvy3?j8K(*TQ4<0VeTDnSzY8(gvOzsr5OoDYjGIu9ictn6nA; z;}hunD)@1xR!cYpxPk%J9HTbM%L$2Loswxv4xQk_PzA*ZXu`{xHPzV|UEUAoapQ3J z3eUwfQa5!vL)U|~3SXsg#L40!w+g}xs|ri=ptmtMb-sJ2v!u!S=S#mhd>pa*DEwTSqv?lLW0VDq5EizWR3qyaR$X}}X zL-$SzK$^(zZh+!Q17`;FXhrC^y2dIjAtWL4ZO-0kXe!(~J#C7{@+}(1mUBg3b4M&Q z9S+pj{nI3(YbB`0k<9UrVy8ZB#eS9>PM4awmy)Nk_1LfZ1|^G`E|rDW`Qazg+X3V$ zMHZR(`?spNibQI0>fRQi&X}Q&UE0M zfUrz4tMOL`z+fMps6l1`q||99BMWNGI(m~0@KnXj9=Z;Aay^%p3UwU-42$wy)d1u; zsidgH40DQga1pN|mv=6FT8IZ^&~fR;1jojKd&2`dt#98a&U<|`P`eO%>S*0pc|xhZWWIPOV8jFbW%jg0C4Nw(OAWL+8d!2ElYkhaSH!|4&#oDI{_I?_{a} z%YTxfg!&%+MCG;Q5U*?GP;4~{M9={Xa)bT~ujNag)~68*TV9ySNM#Ma$g+QL5DoGj zGwKBBHy|KeQ?`bv=Z_zzM6{j2xe8Y)s+^wjj5-&P!7%KFWZ~6rVe6w<(46X)EW7(2 zJ!}%8Sm8ayP%h(g5UBDIAkZ#U&jk??{#Cd)P@NrBxo973NKq0Luq!x90}T|Y&b3;Q za8i)fY9tB?*@~g%-n@<^FmhwyZ zdc{WO(aPlcxa&RUtpJ(^Ud4#)w67y(DVO4Dm}?cGExSyej&Uy}td%hY+*lZCgP1Hx z2uYqK6NWj^(@GwSldJ;i0_wurypBaDU#-}Y_vA;-4&OVH_*ECZBi6-R8arDA2OYWY zy~lZ%@wfweUuFIk#04N1AjB^p-}I=?WvVN-JgB_$3;ItfAYur%vug2I^sK0;MU&Tj;7pS5G z{!{W$B><0vMzc%`U}HN24z>7Op&qfEsoyWmH>!Yep^FJ5^D{&@{kh;c-7cu)wl~qg zKS#@9rtl+O1zqmnzD3Iy-oqomX_udJ^Py*VbaO_M|<-s`VC6;-5F0d&EB68egXu zwQ+89D>)B6U*v@K%H1G=nT4<39%x$GISwj$PL-!YW4(4jMtzZ!m=npiXc}7M9LU@E zIOlPI*_NuNp6{O)B)9FDc7f>~eZ%x)s+e15sNy321Fc{~5J_F8JR##p^8*+fy(JUy z_d-MJyiVoX2IU^HFq}LAdbl)k51ROk^VTKP0Eu>^e8d!##!LknTt7={rHBm`v<-eI_6# z7XVuK%a2<5ss|<7^!CT3@$v+TQ)AGJpWLtBAL`$+Ik&JO&&u?ym2Dcq4L<69{4fBG zH8y(H78>lZZFDXj8|L7abd_0kIZbKePgZ90!0}uW%!ZS}xZQ&z=Jv0^d@7Bo#vazg ziWv?eH+$NW<0j+>8`Rw&uqi&+yXB47!^Q)3!%;!KaBGvSUc_2{S5T1bJf!$ZtT9^n zrSH8f1U9@c=L~x?rWH$F0IcEaGy5>eTc+S~Rpv`&Q*TJD5zjCuY~*ZE0CyT5G1TU( z?|&k8sPGuaZ%waXTi}g%X+PY(=(guA&1TugF@0}byIvKj*#PtU^NN4rmZI(N-`9Vb zct7wk6a}Fth?c>%M*IrYJW9I- zP?9@7C)=zXP}X{hkC*XW@UT0+B^ENR)4Y=D%yWn~lu{Yh^s&rl5h+$_bayY)NkFW5 z6t@>ctE{!l5|t(!QbhyPyFF(&~_3kTX{oiSdzz(Wr;dE;ZngMi1*Q7 z`h{}Toaq*rlv98v+|BQ3cRzgOMuu@&3h5d+`4)!AtCjjYh{>k6&pdw5ebC(RmodKT z2L^i#PPAyOzT{o)Srp8Bq_l(c`4BVY>&A~y6+70~51X~V9w^vdcJ%s4P15xdaAyqU zlUX)0dY`-Ed*;zCc(^EV(?@qzJm1%Bk*O8gu-hoaj+Dt-AoD(dWIbcT&AE>p9_^jG zG3sp5g*z!Z8f;*0WTJ9+(4or0xZi>T16ti9?m0s0;iE#EF}-RSekUZz z9IKkq;l~gWDD-FqPQ{;JqN2{4(NR?#2)MQgbIsTtdp8^`NS^i0wSDnRt5cSoPq}{d z^cGqkdm_7L8N2qGgp1F2>eH8zB@{#zC(K1n#^@T^kd6#hZ< zJo;#_TV$vW9%hm`+qWPQjkp9^iTj1}cVG3TYp8}lZ_D4B z!x`j3KUcO8(x9d27{w37>vhBxwNM}=2wwr2+_@Nzh*%&i4L?DA?EhEe3{cj8pn4ml z&$l6gB*iigJ|Fr#FMHs+Ig%U5;eV~WS3uo;i)d9dQ@~WL0e~9d{#^L$knrzHK;(#I zQ+Qbb`zJ)s=0Bnn#ad;-iUfKne==*l!j+j?u^la=QXI4uYy7xV`CbEU`ttp%6xKFb zTe~!&BG#!Yc?q^on46!Ypy8CwwN&jFim!Uw%y{SWVrUVAI8te7V#akSsQm-U)# zc_N*7uYJp7)qC*4nGB)fF8Z7T8Srhgd>=iZMC3GAY*IA+*)tl7`_+U4r1iZ`5G>ZE zx!ukG`|Qxlw9<1amT)Er#W#WnCwD5-?rWk6`w*sjBFScai^)0g4>;+1*t%G9tSTd` zV^1p@z)Y4VV{^1MK#1mF0jU{ z-&R=WxumYo!BI?`!E|(QfGUom-))ke86{1QW zhl=$4pmgD5q;gcljkUb7XpM+&s@#xJ{gBD4DqNX_Nhni&3!75CBrzRJT&!0HW*d)C zke$FjhW0Fofy&&?r@&0#^5%K>1^X=fG88BFzNhO3)6cFH3W)iPb0_A*qwe)Q!`A+Rp%*V)=!!-}R}pNdux(qe z2Sa{Kbw^)ZT_M!PN8r}*sAHI`OF{p^GL)DPR`5Z%yBO9p^TZlGT5GTTj`Bg$?`z2yB>gQ(-xDBNzZg zOzv5V`!|=%JEw*RaVPZzoG3A~zwwdoA5u^l+oIJSqFiM~Ofn7*(1WUMT({~{*+Tsl zj#x-}{$PAt1~tfV+orXa7x_BMuVwC@u+u_q&@w9ra<*^s9E{gztgvH-?8TaL((uTy z8-o~;ZEWtz+r5dlN|WS-%of@qFJH=HUVq?+lq*x$)h%3odd^K%Y6*qiz&60Ifb0hM zbS~wb^)1#~=m9M27EUS(5i!CwtK3Keu0GC{QoyvE4c;-uvdO+~SI$%CVBB)QB27uQ z{svi?zo)r-zvGIELS{O<|TD4=jbxKB=kxoBH0|PE~gmcK#MX6 zTzoh<&q$7SX z(y8vVY4644)ws9JRbr$xSPlMuR*W{sYPtp-A^h*jt-kNQ%96+9tE3csBbkSJG9=3ZI6o2t2oG~GIdq(&yRf`^p$>8F2wn2wfBU+9Y;a;{}vuDYis%_KdgG{ zR!x&d3I;;Wr$ugb4?HQSMtrdHBaA>rz@y{&`yKS2<`A7bv>?po=AOy}P4bb%+phcv zfX7!+J~>EVJe+3vI~K1upj#F)es&Rpnb}c`6T5pBg*N20VUwSsk)Hj z`G@JBmZR<3#H#>#C_qP>CGVjHP{|*3M@3h-!(!RVUp4m7ck)uu!(Y?-wkf_pJ;_q; zu1fh@L(dtRROF_iMh7*frkCt_Q{*FpvQ7zTK&bm}96$gQ+4%ko*JSK~_Rabp^~3I2 zUpe(X%`EjUEO=0u?9QzC@MFRi-EsFGcAeDt8rgmaNN}I@iOG|IC~2fPjJDol*Q2B9 zMSdP7NeXM?Wp;*NpD-t*^itLHHxH4CCFD!aq05~u1+8%EtW#6`PBi zs}L>zeo9-r$fz6%=Z^hcJHBh6&R`jUiyr4Jf2xge8u47H&2r@R5M%Kp;u|Z25*<2>jzzFq zB?3(16MW0V$N>s&IUzL_*r&rlRiw$?aQ!>X{k`(EFi{(myHRyLh-S>%R@cv7sGO`y zAjnX4khOn?x@kaHx%HuJNt%=w6)!KDT!5noMqhI!1Jj)D_UNv?^US(M)ye}=s{F*A z&E<4_!Qw(;3<$HD*}>fi{gHS@%;#1o>of$t3aBKs63Q704Q6sfmFM)@JpN>SU_-Og zSsc(YN9a*ov?dETt!ncuzPsD4$0RaLxy|q7%1HK@=dDb%)IRt|I@e19&|=x4{(JWV zQ*v?&XsuTAGYiLO-*X;cw5T2wz|Edl>djdg;xl{gL9a`PK!pZ6V;rZ?eVwQ{NFrf) zta%R^ds<=+oMcZ_beoQYIEE$c4mS?&Ata$a6qv@MC>=SiaqwE}ugSJVGyRcI-)zYM zKEFU|&@4^ACh9*5C;Ckr1P<CYZpZv*CjtZDc* zDQRpA9QGa60=hnK-&IZ+)(1{WtYFW|YvkqmeK@>NwNQ^n>DKQt);cv7< zzmI9}9ni$Le2@>2e8yiM6WRP>~C9yU@%iv|VV6q#!|zb$8HF`g-lDK|I3NEIYqI&=cdR+W(O1A==@ z$1+rl(8NR5hpl^rsp2Ek(h|yH{+fC--LEMz?`>OS=gpM`cZd(l`9R-s#Ttlbpe29~ z&usA3lzxSXE|IZKisSnq1Be;QU<(WjrfrOKf7{M}&K+m{A@E&vSmm1H3hG4Xlw?b= z2f7s$ztF(L%)^mXG8AjEsn+JkinX=5?PjLy>TG(gEjHBKJl(k1=9Sf^hQM1n4Y?im zRgH7D5(4o&%?CZU_QVjbQxV|bb3YjzDfQyRVZZTZU}=1{_f@&>P4#e`g0WaxTT0* z#?kFyZO4qx744XiB{`)j@d3s3Y_uv_r}k$f`>9Dh)@rO#9(O9x`%bT`o6)&>dAW}j zJHuYw`DToKK)KwtS~%(qBz;J-;B7w(p4Vfkgt3)$Ks6T%oOgi8ps+;hA^Bsv{w8Pf zj7~;-VC4b;4w)A|KS9m$<=_W+9R3ijT{YOI10!(yF0hWpe<11eSa5*d<`Mv<0gf(8 zq^l^CKk3Wgskp>q7NSa~MHlT+90B2&nL+OKHf{NWP&AT1oi$Hk&_gA?@qVhx=ll2u z4)7@K$?TuVT1r-e+unNx@sl!eN!4?gt98Mv*KBzC%nxW6f7H1fp=8gAQ4608Kj!B(%)#JU!q^gz#mntc#d@X=ZhoJ)`}J zX8-Gs7uOH?4AAh6Hsn#A9x}fC5vXc3exhd*uy}H+)k?tQH>$u#<&<(fPLVw&bSW(e zF-gQ)z^1U40F$1FZ`i<>eIzC`ZOg<1__ssW0SY69k3!#xXd+%I?BpEzu4{4u(qhfx zr6c0EF!(|mU0Txu#e(ip5v;^&l$Rf~4p-9|;vUqBAz z`V*v(A4s@mq-usw-##GKJi*`;y6XR*dAkah#*>1l5Q|O&25gy^YpQj;fvp#)P#TU8AEI{dg316{8>7YvBdvn4;IK1Co z#*_Q1Zomw&K#Wwxo-FsY!~OgbU%D~-b)nORIB`{^y37%WzfP6VX0WzJRj6urF0PYS{YM0dkek0OX&Oby}`S7ByjAZ}WQ=mWR@%L%2SS;{?lwOM~p^8i64E!?Hr4MaCO?XZGK2k#UB0zy0qfoxZF zIy2IVc#B0w1@VoTv^~Vj#(u_Pejcc?7L(S=kjP-NMSr4YRM07kTf@QpH@OOzt6w8i z`hbai-VmzyzJ8E!nZ>T-PlJ4m+h!+!p-Mr#O|O<%G4$)~U>{pwkQj+*SOEEJi#~ zM#e3iA|c=Q^QGD;?NoOOEoP0lI*O`A2_p2~{EV>3t<6<(fR4b5yDwW2IV&8oXsnNK>mNenl=TZ`}1irXTRgKlZM(_Z?wd zal_i@jC4HR3`co3PFT$LJQuM6(;zkF%+f2J1GAB4i&myFvF%oO1a&vOQ z!`xby6`GCj5VUPcJ1#EPYXG^QpxCLBcbiviE@o7uAmZcS0?K} zz&tY~0UX?F0@v_Nx^jbEmS}aq2j6d?^?{$fgc7*2Ve1=xLBrcmN8VrBv%Ay7$+zCY zFz2T%{gXz@S;G7Qm2M3_&xe=-!V4eorA*=Degpbw{cbpC66m;ZHafaLZ;;ksDRJk{ zfDHgCm?$TCei5FD)kuS1XNhPrJW3@!?8GKt`V^MuA-*>f>gEp|g84`k*#3`! zgWOxHgdAN2R94>;9jyt@3MZvSn^P+t3uCwQhnx_oUhoxaLAuwEN>-|#9C8RqN6TjM zMY-{G-5@mlgjVbv%&9Wxz8`stqroQ7ZS9fNk{cn}ro~HM z@}e>trDuHdHZHlZK_yiA?%;4*v=+0d=8~wkOth?RWwi88zYQ8*%hHA>GT)r#EbGk1 z1kwrNOKyO4r4P_t4zXO)pzRb8=23_>@%>VKJB`B15;H1p1XM?7Fi$FU<)|0MfX)QM zU@`>{lW@=HC^yMC6{Iu#9M=okHm0PA0(3IVN(?IB6vPNV{@rLzxhq|_WZ^hjNR+MB zfSF&34WCoFWG2&PZG*+53pLI;#rzNaLl&Zq4w@p<8r=Z8K5LCsL5_m#ytJP#x_`## z9CeYKavNenN!t?C-RJgmzr?JR8_-?OTQ^E1O*R0vLbvLMsA}unvUvXW$(`T{3bXV-;tTBrw zBRiPSwr059cDrKF(3;|~R2F=5N3ZQ-HX9pWcqH3yb7R&wImyd&j;DLMk|OUvdbTf> zbf<`gy?JQ+{pHMUOcUnDefkwUvW5%KS$1bn-$p;cKCNyY{F#f;pLLJ_p8T~Rg7!tC zTqqCZ7qlpqE{f^gzY65SLjGkg`hcfO3h9T?oN3v&Q%!QfC%i?gp>7*)qpNi8nk4>% z148Y8SKU)fag$w2AKZ^Tq^S~VeE=NZJz55W%LPv7m1bg6npS@t)` z9Jd}XT7SRi#A4@+GT83VAvA^e>=5QAUTJ(}ec3+!$*rCo54~BOtxYyrmOt)&Z+K*L zzwlr6*O*5A{g_ZJtRT0U!Y2eu2gWcd)rR%Zhn*g@$684j2a+ltIN$bw)v*FLb4ur| z!un)0|0?;)hQq-^kd}0N{J?unHVIgIBIsT}HZFP#>;xxlo7yDG^d_Bl%Y7B=1utqu2}9N+_BA zPupvAIQ*Q(xB6`zEPs5((ZHiq;zw3ClXaE4Hb#aYEu3uh1@j-(y_oVa$7${lR&%3X zo=ao!4B9Q<<;g--x?3>*B2Yllu!TAk!39OowLG<-*?+rcEiU()Y#e zWt=T<9E|sk&n_DM2)-^d{7T?KXWI=}XJ}%|_3qKX6ew;2*2`&KY3mawKcKo%r@N;^ zDB=rtez$&H&I+=Q#@!UX-9KuKivvwZ;<+7vY|sF{fZv}b=7budlMb=$5pQzK%J(k> z!pRv}@cna3?h*5dPMSnJ#>29FN&K9Xd-7su4_~`g@Nrhc&W6O{D+Af*Q^;9>J!-I^ zfE*8iVw|?B0O_kk{1DX+Pa9rV5dYJJ9^tUm4~hv{^K&{l&3szQZ$C=B(w9T=(P%5( zG+F?a$B&0^0J~)+ca&zP;rT~z>?dS~zt%=P5Z-%2lU8gl5`nfr%D9bm#^ecpMZ&b{ zXRDHVHrDhi-Vez-^}$aA=q-x^Ex(f;&nbLR#L)I@ z3w8HoMyy`rxaDcW#)v_yzzyXg7Y3(I)h0|%kVm(mO8t*&t-{t`pygfS;C|g`&noz) zv>K%a;=?1(Z5kotd--|4YN%#rDD_E%O09z3)#{{NLWiaYabX8BDe_khb_vvJANx{B z7YHhzO6b$@xg4coLq(XhOHk7m7)%Zo=0((;2ROcuWt)!cSI&V6A^4cK()RB7WIdT{ zY|w&s!7JEDZ`ztG+Ad%6AN5eYjj@WjRNg$IWRvq{Cy3d*l&@X%-?i4fc>`~ zuJ(0W-)f-$l_~6j?K%8KBL_4!@K0#(Uy}uCzbS(M@u~lp{!ZRQltL){7b}N6!ifGw z;bsli7_6Dteo=7{ZH0=vY$c8G8Ne4s{k8LqfvCzAHH6lB7M`=M=~8?RKX*p{I~rO4 zpYYyfMw{v{JXNeBI!-LWj3S6d=ppd?p51_m-I!Iwc@KbNI{Z&chxB! z)7^2jV(gCe0DXG5Nyohtr(OwO-S*$8bG?JCT%iF0%MvXEt&Ar)6d1KJd()C*_5rz> zCzsU*(u}e4mLwV@+WaGpCA9?S`Q>K5jeY zI(9otWN3I_AH_1_T~~$4x@E;mIMpIN@Xe42-2w)rj8ZZcL`W;|Xx@Rxzb6l!9e}!+ zFha)jM|A_<3EOD`pEB6$P9%JBK?EZHmZ>E_ZsK%?y0nTqg=Jk*7fgvP(K6ycsxI@` z@f>?K5Lsj;I%Upetz&S`+j{wk&GcV@DQRBR;W_-m3#YucfpCwv@T_p?9Hrd}aCwDj z01QFhimc?7SpG#3AGbi1hBSejQF+Y_mR|kPz*yyhl|pUmEM~z*nee>QQeM-_5alUl zy`9#z>{-fPb;H+epT=aeHfOBiR3Q4+5i!|*iJL15H~$h|6PbIO)L7Fdb;1T>wEDV4 z{X425F((WHh*`LhJC5}Y?tW6_VdaVmqgb{WO-epLY#JM|Q#KOLqNleq-A2m5hW+rh zyN(%tj$0dlF3GK3(iJCg%jbKYe8+!aS;^32txJ$hp<2pns(A*lPKj#HA_gpdt!h(l zXu=9-EJkvftDA}+mztT7&yuII$<8V7OIA>)$R^2XXIY+wC23;uO<$|PH94N|$-W9N z3AvmXA)LXQgTzoqO*mzF~HL(YeIK zp@pxrRad-B(z4^;yAF)o*nBiMdEBG7?yoc7P2+8u;fr+Ehi`hm`|1m=#rCoO^wJWO zd;4~s7yEq|d%XM>r}0i9f0;w7IUXACN7LVute1S{&W_Be^RgrHW0~GF*ON}_yb8~r z=qhLo&)D_Vxy!u^RNEu-d%JI)8>z`qizgv7hsiA;<=^65H~_uzUMQH59C9g%+?yd^ zp}In~Sou(jgn`!c%2dmWNhPb;jpk-aRUbVAsN|w#hT$tQ~5nyQ4zXfK>6`&h}>Osz|e zkw>W>UPv5WTw0 zvk^M#5%k-r)nZ@}XsJxJ`k=oAxrhvYq%}J!zxeRiVtc*i!cTxaZ zqqTq#Izldrv^@B$D6{l!=OR_+uu$!g=4@0=3ngo^jr}gNUkeNN_Y`oaAbvDcmQQg} z=w^4hQ{1-rku5U2K0fx18P(lIfs))>1yj>9tySsSS@g}+8%x6d_DM)Bn;-ybv~zHr zOFV`A=w_bdj=g_hDg41B{hjmvU;PBeH|1X)K8xDruodGVr3j^wNBR6{O~_+H-5}UI zzec_#4F1GH1CVq}Be?rFMpXO~3y$&^u5voWt-o&_CLo6wnjH-^A+%V1iV}TGT4#o=cKCTJ^_l7k`tvj3 zp-~jJyf*D$HFny?WOV`b5A9CKBtv(h&5@M@D(_RfP9x5~f7Vr`@9IGZbsG4+RSnRS zlkzSD1(Z9u56$mVC0h1dLS+?Db!GT)!mk>$I#v@!fyhv@y+*MoMPbhh!V>ydVWwhI zzmCXyb;Sv%P{M{qg=tWZwjZ04+pySS+rFE4j!QvfZtrIHi}j7es`<^kBHDhjC=T1w zH0=IW*VG5}y;b94`wf%_m3weYnRJ`#40WQ?=CLZ~Lr~2Hx)#iQ(I9;ma$)EcA>zBk)joQxt!HZI1ugQumnYne&GnOxfYK~SE)Ae)-BGDk#f z@7+*mA$AmO_NS8=(?t1KY$-3o1pd9 zaQmPWb0UvH#CrgpfocQEhI-E}gadxqU#MDK_$iJsR-=MLVW%Kj*9#Ci{iBNtWR8+E=H4%!>!PC|RuwaT|a6pekXa|d5IfcqG$L(-vLh2eV`$oJ%kW{y2GOyD}29QhX* zV;p3Lr#vXR?v{V2_U$LvtfN!VLjENF&sUW2XFozkLY0$Eo5s-Za)1``w($$+9O{p^ zi+%8yV})0~g8wYFw6q@b1T~>Z&OkL1$RbOzRQ!4p0d`B<4(Zg6S!4k$a|53ZJAW*=H3hbBWG!(7g z_wJitH69OtqR5W!RNV^V7p3#YbDV}&vOlxN3mPatDd30bb}j$}Eh)ZhW z)=m@*l)nXdLNzvcP^-UDLT>ljs!G=3RiVJzc~ot(Uo zFVTEX-{|Px6KJ@Dt74IINgXBoL$E=9*w)0ZsuMx+E4R~*2aZ=&ENk5|M&a^hZyVRq zm0z;cyF5l||8Lk3|GQk6|H;>l8RmY`+J-I;R=_#+Y?xiil^;WM5{Ucc3C)UIwOXZQ z9YFaOqWN^yRYa-38#ZV;TDHsSv$mmK1(J)Lrj7-PHpHKfZ*f3mH2{d6<*Da&LXX{8 zK}_fO@f9vaJ=vQOr~t_kWsV&o^ni(ip5;#Gi*?{+&bJ18m-EO2zIe`HFu3LdjRY2d z9v_P2R74E(Qi(4<{JTQS z7vAm5AAt)*yguGNe{LSB3N}s7ZdC@*>esl+{Zv<2!3ryOEdUn8xVL`voHYgE&6UIg znCsV)svzVdCOzDoE0I+c%&Fd_1V5J=yoi(KCZIT+8U#PTD7^3zgHuh?iFKGMETFfk)F%H2=vn zUz39YfBL(@=$*U%k%{|fKSTU#3x^$&6aIwT-8pa=;lr`L@mNtYHrA-m=C1L;cDy*?)H4%4AmXf z2S#lQs)a2=dAjOSktH;xs_9eRlPfAyn|zdfo64c z{;Byk@vrTK!3^beFX@&TEK42<>u~1{*D_>A(H=Raoi4FE_cKgodSQ{(LcN!ASd8N& z@RBo3haN)|i|9U4(C)CcnY}2lX@|g2F`VhJFpbHrwDJu?bb5{APm}N2sAV>U=CHm~ z+3GMhk?%(#Lf)VP7E_yuRj3Ir6?0U#`JaSawcft@Z@l;+(bTCgGvc7$w6=iK&S~}F zj%UcMk)OnC#E5oxe8jxMCWtjir1{*sq0LKLGcL_Alx}^)v(BEqV)OKGoG(9{Gk-Vx zn9>gaB<8hQ!1jru&cwA!`R2JCL-vbgEt%_iV)bs;4p8K>RT>qjF(?bAJ~%?qH2m!f zIh7y|iqPJ`taE@^sOL)<7u0<){L5eJ8cjSy41>7m zx!6`-JGau!?kuPnENN=~t1O}KtJ_L&_LS1kmRQCI(9PMM&9sw&VxC#|=#reHw>Kp` z)49*nNp0ENvG!!ZlmXitx~{M{5SE7)obO8zfoDuTJSgLrZRp-zERJS)Fu`61+Lu$s@(uV8SE*M3%z{+vkh({Owd-CSSL~w z12s$k(jMg_coJM2GfZ?obyPY96Bfy(U=4Y8a3>G!?m0ZRI-FfX-RX? zi{U1v^_rhukI4&D%kH=nL-hadEPahKaV0DSA8my$+IyII{W)yG!hjw}+=e$QzAvri zJOOHzeHd6So%&Vde{;gW<%Cm_Ul#K7X{xIvrT({&5>~)s-2FKx6ps4@kd}gcN~JVJ%ZQuu$1$a6}%c zW<;C_Im_0=<6LC)vuxwu+x7~%ekMZkv ze%Z9(Zwfym(s}OSC34FS;#Gqj2c`_*G2WjIRE?2e=8_+9RY|=556GI6@)iGCrQt)o zPhTC$6WaM!UaU$pWt~{0MAp`_Ni1ZqyQW~9fwt*oF0wdM@;@U4ltJQ zz}E3EJeUeQf0+tim@{mp-N$~0Vzi4y*4u1f^lbXYM@5J4 z{^Y3PRHk;kMSRF-=(#W_=2VG{Qzwm~sFuTKDMC_u)G7B#DBI+Ll8yEY6#2{<$SM$KcqaK!cVo?s#S$z4P@X#^_U6sU?Q8-vIDXtJ?J%aIOx!Y zfwrt)HKscC0fbZ+O+UB|3|P4Z6v)89u$v)YtjdPHP10nSl5;&dQW^*3d8f`lFo!(=X^4(LNwxSnw8_s;guZ!=3yyVt(gzrf@$=PupRYv!PvUvu2O zV}o!Khf=9TZKnxFKkKjxBG$M;)tz_6803FLI(mcd^l176LEDSqG(S+|({p#==Z{-n zM6!OGYrS~sPyeUAcaLi7-uA_@K2Q)N@=_3@qEbajTR{{I7|NufK3Lx`pj0vSE5nRIcaa+N;?#AH($ovz?nr`O~4_uVY&)dRhxuC_69)Xavjo!7k{YP(`A|$VG3@_2$K0vaFD@%9OADG9vhA~( z=E>J66U^(3lb6$jHMDv`*LbA>;zWFrQ*zBjC6~WMBoihp%B-`nK$VS*Y7OCgMPh?6 zRXUYOiqnYgdDiI>C{U^yR4XDx$((9$r`mAkGHz4fy+@!L46v)Woj9bEShv30k9=Xo zfAo(L9!9|+Bp)dJ!!10Jd`!{JhrqPQQ21e73271s9WYr}_53I78;b~OjJWH!zccUu zT`m3Z+Jfzo`+>;!Y#1a!PPs7(;|9>J4`Bwx2je_VI_8t9(jf?x0bnurit)wGc&Fms zKMAFApYVwZFx@pw7lu79)%){y7)~b$yVKRDi}hcSps<4M7If28(t1CXbw?kTr7-7a zsS}|Ab#FFR7U77e?nWOgnr-05KyobMkPQxY;5dOg*?qlAe?69yQcr`(a4VCh*q&_~i^VG*@Y=+0{U4b2;FRkl=4 zak;~2{b$9{*jKR}uIFMu;ta@R>MyZJf0a;!`zG=MO4n^>{?;G?%=+RhC_QRKM?vZQ zpJ_8ffDLO+m9!%;*g~8|(Ht7DIq|Dxp5d@`cUx<7ov*}btz|Y1XZOeRI9T)CidN;jKj6)|9ZFKsW+))syPJy#LzgW7I^x%26 ziTPl~>$XT^&6pZW^RNkg;y5w60(Vkfhfd++g>Gn7N`-g=`8Z;npc%SZ?XM6kp1PYN z6S)GJE#){pSY3Kh?~6^!z7oQD-@BmmVyC0jw)k1@sP%^tzpDS81^g&)_YY~5k8*&Y zpa#XaE}x^^g>`^ZwFBS)a`;Vu<5Fb`2RA3Qc}S!GtN#^`CZsD;_p{;WxwpdE4b(E* zPzq)H7y~$&Zxe=BuQ^fhmxSfKMXr_0j+Jd=l-nmqSMLlbZ^Pl4g}ihGG7}J!R6E3c zb4zbW?E{Mk$oT(G9u(-J9JnUQn~^R!KyOFjpF5B`zvdC~S~vy2H6Y&!^=`s083c8& zQ#g;L-%I~kPQw>`2?&cw7=<1EQmQN}`s07WOaJlqNfDDXJav$CGvqL%sm9#EwY8l@ zpjzJ5qlrx8xu1{vB|qCQv~y%QO|tOmyF*T_Bm5|Ff{X7!_u~%phdGaIr-e$rc;ob| zpsFp!aD}-;p3a^|cgNJUnfynfoP->gtcYSmYGJp$J5u>QbL@NLm64gGJx=KvDFFZzT9q0x z>65Hz;dzyEt5jl{z#QL0nI6vdXpqdtocq6wE)VbS57p(mJoR4C{L{}>1bwF}(lDI@ z;1i6|OZ_h7ZT{FS1#vpv4lL6I+)=GKhEVvk6u6_V2#T<&nG(m_XzXEkN;Vsklul@3 z9XSt66{XVsH3Hn{Jl5PmOA9qVI#l^UYKpIH7`>jq^GdWX_KItET-0}w(j-m@srd&1 z?EILd;Rc2Uu@FCxZ3tKxevp|aoCa{_{gZRmVY4bPqOoa}O!H+qW`kibN`J1-?7#GQ z<)w;SVTotf#k`vG@)zR^o7g7`O%0XO?1O~ASee7d^M#h6 zAZCAge7_w3Ttu94(u%>yTp7ztZB5K{9?B#9@mzf%SFaf!o4hn}8=i#GzQ&z6YVi?j zxl~ZmMQ7=~h~N&1D{m0fR2~N#7^MEfOfOZZD_;Yyn$6o*ePb_pr&yc2 zyW6!jHpS6D_U|8ZTr~TAmSwD?pY4q(OKQh~UE97py=TI)q60HsJ*<3|thzUT{1^VE zh8OFIZ4y%VtrJy@wo=PmU}p>I9chs;RWp?VbkyO-aZj+*eDW8*0HBeH{B z4>DW+fsb5@17-X06cz0)g!E5Q+!${;m82tY7yMf@-T&L4=9TNe=Rd865THxg&};Wp zVoA10Cj8n8xsb-Z=Xv5L>S6W_i6y>&U?u{c(bw3?B9l!y#ed8&``t! z%rG&)Ac7JVavCuozoAo%p~~Sujiy8rE;K>m=eWHgMaS-TCQXhQQVnp-CM$*vSSvXL z(K0JI)NVEav!iTipkv5}6g}+jawya`%mPWZrKE{FBx?@n0pqKA#72nk_#GZHIZR5_ z9vX&mS9Qy!tg+8MPrAQ181a^V;yo>&c>SM4&C8j}BKEsTVHt~bk~dPwTrCy--(MS( zQ9zi&GAC^c_KGE7&O)N80>usE1}bQdAsk8uwcL1U5S6Qi;0CjiapaeTXH_T91+!>I zjNF(O+|1U^SbDwSMD_j@4LgJH`Q+UT*O~lrFQTh`3zkNcbIV%4zfheN+c!;WM)!cp zVjVC*Y?hM56l0WMQ@oIyvPLbx6aqzd$0=PL}fb!q}$n9zvEHo;)n8j#uO)Gp9}P4<9} zh86x)ul7r081tW!GYr{c21TyX3)A^tID3a$YQC2_nYl}F)D{W~Xml@CYzCi3*0s7L zmf_s}^03+)*wj&%jvMFua`TY>f)C09o;l={vvA6$=;tA-!*~?fE7<;zt;u`C|A%kb z-U?3Yv=9v_aN5*bd1$GQV)${$J-~6}jrNM#uUnNg*9YJ9&k}uj@SA0x6WfW<%HOJs?%77Q^mMOz|FG}ogGIZIM~(hx z%J(n>!ixKTpxjQ=dkA^}c(9NgwPS3!5pNIl1qsM{wl0=kB_<1zomWAqn|Wv1zw7sD z>-=A3LjL`L%zx%r{>4}33sW6r&T`Blt1vH<_2;MmcqTx@k^JyMAXC}mf{vIoPiBXJ| zy);AF%V86y3M|^#pvIOezKn_IQ>nCc!g@^cBx-Us6h%kj_ zH1;gmmQYS4Yhgq$=3~%rMMrub8A({!rDXY>`E8XOu|FL zLVKP)Z!CTB;DA?g`ZM88SLt)EqL4h5^;LPu94rs&{QPru^RAT4V0m)nx zjKBY7IPI8bJJyobDvh4QP@x1A2C{k zTHGI51Xbk8wziC9FDC7>%vkH%hFqP>+T8TdoGNO^*xEC@()@h?ppy3YV8z}6#Gx3D zLxrsk2^DB>DId7TpW)W7R~&Vig!!FtAMU!XPH+0t=$T>_E+~m|n2#ma4|hQhPURts zJ^G$>ZXsMQaKEH)jZ|j)sVJFC;=Lj_p~GqKoV|AHCxv?iwEYfME!w1l6_xqgz>N}! zA=0d{M8kZFZVb!I1gJMe(*u$*1#G6r2m+S9UVbd^_2J(EHx3_HR8T=wL6IKeict45 zjipfqJ5@A+WO_LMh`vZIoYXIwgHcl4q$!e_tm)7D4*DIh?03rw2pWC8uBuH`)fUr%0I}3Lb8D=6wkCk+O0dHHV1=oAaQtc-VGhY4hrhwWTrO1>em|M{ zOXAS3)f1*8yN8n}Oy|x?QGPesF`2T7y{Bar)eMpSf++KZ?*z1G9Qb6Kk_w+}`O#Oc z#+1h~em?A0FFbQ%pWL#V300yt{hL?+VE_E9C~2AE&Y(@&fVE%dE2m0yNq~I=Yj(`+ zyWbqUd;FTo73yAS=o)K;{EulU_WW0}i3`OLjDlhXWNuaj0(v(=-0@egfluDZg!S>9F;h7 zrFDgtm?Cu~+-a-yNu_)mUM_peJ)w<%5&KO?MXh&0?TK!%8?3yropF~2Y({wo8#!5tiU0IeTeuo)>^=x>r%->@UJ125i%cN;#vx`H{PKf61w; z{;{Lu_0j+Qs-4RxO(ONKh>VVda#w4DHaG&Y!E=BdJY2I9UFj>V%ORf}6f_KH2yJSZ zC>8jeskthx{J7R-4#pt@v1R$HQeS_uxwk6Yb8dp#RA4SnD-~{ox!cj7+9|tGkd)k(!#|7OQd_( zQHh#!lsy+}c9F1ccP9#(1u1i2PDmqV!nYI%&)Kdo!037tpj17qPERH$laHkpRoc}e zo&%P43e`7L&7oqPIg!2^?PzTd1>w4JyddZSmCVJ2&9u)VIH75|N_mFFw6^_vMeV%7 zHI=pPyPgJa&fnZxxsvk* zYdBXSO)j*@qYh~bY*eBKN|qS3^BVYOxJGlkfU>ELHwC@j>{)m!p`<_Ppx4We%<9$c z^V%z27Cy$uAF0GwqFIdy8br%JIGo9_<}Jq-R_)fCk@pH0mUTdwIUbMP)*eHLCY9mt z*Q~4t>*}^&dNHTa4j0B>bWnsKFIoUzwo z(7Pc`i}<|dydeebcerbKm`vh@Uaz|3bEQtdn*XdbuKy{!zq<0#Rknh{gEnr*K$gzq9rYo<&-N~OakN%c*KBHFfbT`k*d96ZqQ`v*?<($Lz5q|875#u;6I z<=1ady|C|bRh>Nf^YP;&SEMQ$Dm0im*u&QKf@{0yHm+sU_C5?bdhZVAm%f&6|x$$A=Ac8rX0z7e=`w5 zHw{1A7#iOF{3k;pglS)?d%2fBx7%hAe0|#dc8sy{tfrya@$RGM|CgqPj z6$}@aI|z;(!u#Y*%AlaB*6AY{f0?0N`dclmj59@~1)U!Xl<<`RWnoV3_;CCFKF4(Y zOL0#wxn8J)yIvk@I42zm>QR`hUJ>a_eB^y zL@;3~)UACYaYX8tx>JrK)}$TTE}ZU0n;z{jj&(#)&T0}I=6m3km$|pq!}a-;l-{XN zFFpl}oJmeciC3qOR2BiW8%61{xvWTgK8&&!`nr!#tr5 z?z0T6z}PDFAKnD!;E3KIblVmIN39?{6=(pJJTvj{V%jjYkTeO=+Y%d4m-H;S6DNcw z5@Y-)4&zI-DvM#x+Xq#|f%S+L!+|RUYk8blt)$v;!0|IIo$GQgd&+mFmOjbgZCXyQ42Dq)9JAo zt;v>|Tm!N*d|4yYs>VhY=Fc5**<+`T+=kJz+@O8FrIaS#M_Yf=JLWIr-nUzUFyS&| zEe$-j$WVo#gGiklGWsnb&u_ z_f3j=ITpwJidnV-PQ{&AJQ~5nO0Z*uG1FA40w0?SUSRS8%$Qj6mzYU#Uroo8(|4-m zcqvo01VBeHxv;VqR`t`r&gc`*vY7x*E%`Kgk7~|aaV>&7tgZqi-&L-r9IZ*zfJ;TD z^Cy!}gfsc$xnXKCe9w;Oj_og1D$M&Cb8evG##mcC=uL09_Zo;#eLCpw>PJa_?G>Ec zc6Vt(Ax@Q5M*4xwKY~fSa@|}Ai|!guA=q4rIYdS5^+=CY=aAtL!u(#^wPCp?=)ioW zo2r`Od+c!e%5v_V#aAycI0I4)KN=~=4|F@fP3|F0Xge@UGj&Fdi+&OLkZlKtmt{&U z?4&bQv{}4w4Fw>^0MmS~?!=%-#9Spl#!+Qc!th#s2yambZ*9^=d}ot`LvCoB8=Df| zx9ni?%g1SXHKW&0UG46Q|HNI{Xsq~g-UGWP&7yf&GnQPG(n89Wt9SiJ)VGG->3cWdSQ2B-9)DDZLZ!w;uDz zA||4&I>}eq!gQ4&wQzph{F|9E`#T_4gn5QWk7`L#tYvjPbk=d0pizq6Zct3U#*9Wl zrtz>rz@QRau~uT~6G)dP!begbp+$aJgJcRO6u1?@qR&41wQLy8RqJQwR&tD`?N=1*eZZ#$+ESnn`PAE$o4EkF#SrGC|Ra%9ebUGfU z$(2#2@7-VhnxG9^MpK`4dfv=YXWgFc9{Y>G{d-+}mFWT9iW#r(y$Robn18n=0(RES zU;ia=6-{H^SF*8Ump_g2Y?-Pn$R6hCa`_P|o+yF9?5+1IhhZP?9Rpy*AIDK07*nVF zuBKY@rmr?WZ>*1-VE+6EuumTYEn=7zE@Hpgdr)50EPr+lYAQuTIA_2V>9$Z>wfIt&eD4P4>Knm-ViV*Dlu^;o{#pxohmzBRm^3nDMyG+ zS82`6XHD973INBeJH#DNsXbx318eu?$phM4_f4!}xvibw#B_1k)_%rj<0@vrAn}`2 z`CjqI3f40gc{j0S+ZePGf_1zt%DzOEZ6V#dj#tqL})h2d3l(?!hKIv|Py<=!g z!XZyijQ6_siqfyUd-VZr*Y?e+xlxmBR}yleaDIYbL^{9*ObmdwzSDdKWRqbOc`%G1 zkA~yI76a~qs?ToC->W|N^FLI5T70PbWUE?Y;f>&yl23MX%Y(5;P;76fQ{2R=j=52$ z;rr;$510R6}Cj3L}8*CRl&w193a(_lG5dRap?l^9>d z$i2?#b!ufQ&$Fwn3)F0@g*ntry7vzKHsWA;Cw;BMkyx)wsSeVTFnn~SVTW6oe@TA$ zf&{y)Q>`)Aosu7VTb4QRgNy%6s=Ok7_oMtnoND2y%LFZ#>{Zmk5jZT}I0c+VBp^5F z&A9-WYz;EHXz&&aGd~r&Ie4PV#ilNgG9*U5H@CVuM}3qJKb(eFwM`1@FrIXQ5_9m9BY_g{^7SZ z+%;T~{-N0fimczk0lEYT$e#(viC8b_c7|GbcO#_SnD~-C1h4t#>X#y_bUXx70i`_1 zL`<|doMi5T=O^ot%Ai|-e7aI}+$WW_G-YR&*zM6yU)&k(fyvQ>zh0}$9BAHHhPK)4 z&;8P2XJPN&m)`e(aVIxOKl(gDHW@(sil8VSvEw4aXf7}kV;f+T#e=5GSrw0xWDF<6 zHNF?8m)h~J=Ty%RqJhz6C7Qw7m78xA@Iy*zF_)@NakDjpj?Dr4v6$G7^}J^7y4~ZkkYvh0<{avfY2h#@CQEutLUZ^Htn z@}CDse1(#!YMN;u!{t}QHHlY%I>tiA_@a$YE8$kjs(ovn1o>NA<7t-B5@R$-q;{G2 z_;-6|SR0+HN_w=Rci^>bbUkzg4beVzrTRW~*;jr182+nkaU&AkZXxvsRVFlZN{bhF z<*S$(?IU6)^4vx#85p7#SrYmQieQ8R12uMK)$ zx~+x<8w~yVy-n%#TmEZeN>y5>3XH=}WYkUCl@I5XSuZDdbBIVF!~e6EcAF4i6g-r! zcj6|IQ{;L+bXbFvhixA|KiEwL?e#5#whOC@2unQXQuHW8e2Hg*z4$%iY;B3_Uh@YnWE%vFSBPSrM@P>fUVDJkkBxXBOopy{4A`wx;;0eCR`QU zh3IY>t|7aHX?gO@C3Mh4o#3a=U|5iHrme)5x3m&-=}hHORfp`hc79J^6m?}VXw+Kh zDvnD^H2*ag>&N^EOOT~yX#`X8th$IXw+3eerjx`T2d%Ao(gl*dOb$&DF$a}rf?}W< zL$kKCW~JK2I0zf*JyqHl+IuQ75&jxqQB;BmhSj$>7QC$KXkBafFRXC?3k-o;>9v$2 z34c?m0A?(+GeFO%_zE7UdjpTs2)Z*#D6*y9#YL=*A3ly)OYDj7Fm}E4 zXySt%Ns&lW6z15(pDA2lR$X3IIswMOe>L1uU zHB=uRT`*D}kp<^u_93S3t>IR@(2Vd$_vPv%`R${zM;UG$z8eH?G!w`kRInQLOfzB| zMs3LYQpEeFlU&fZpZr3w9_y{ryzmN=HRXvjV-muKExRsPb~;H8Pq^MGW21ozd=Wc^ zzTzC0SqHT1Mnz9FwhBm`!)JHt!BmfZFR+cd6SM@h~hIVLF&@N zx78&kUJE+gr7_py^>%w*T;`fhBMquSKiRAELhk3 zM*aE1ck=OkIUDt7W+*Hfo;-V$J#=0_Z%{e|N|g*rcgWeGZ1KwQ6MdYhDkVXY!8d9d zYlv&9ghWq4TB_Q+6t`(O$f)UzuxwB0311G;wzQFI zTVtgUBU=lngI|-Q0{&2Y;@$+ z73%{!*S~l&#LR{V*`hTf1a3H!_o-t@JQIl@|qPIX2$zb>k^FC*lnZr z!DMSNW`h^2o}}JDg=q=Y*@L6ViI@?#wE~7dSMSMJ6_~tb-)?ht6Hxkfp38&_Bn43u zE54^AYZ8BE?UU3GpOZbda#~+8DIC)4- zv*AjcspBN$@VI)1nNQ-+IK185$@3Er_F9&=#D_bsznSs7xYBFG@7?zwPwq|1&}5rZ zu)$AQ`CCi}q;3s(?hA-z&0IAlU21{EB0c_U+F@RZh>@cfkH?2~#rR7wfyQ|Lx-&(O zE`f!Ln1gkkzcA>@6VHxaaJp!B-1kGr9+@w`XoQH*8_pui9|!ec`{|vj&)(~nQXPtM zcMt7E>Jg^uZ+tsKF}ak8HI|(nlMb1(YHUpUyhpe&b*veS)Nw`%-aneg2 z8&7m1ELzFqOdT-54Q$*IV2u}Y{13S0Cy=_YQ~b(ZoTeXV809K2`X>qZh(ilS7o*7e2xTut+!ggcNY^dvJGe6X%k4MM z?)nxE(MR#dVaB9ifi?w{HdrAYwcFx$@$~#3*M9i#!2Fzh^GCb_7W`We^H^T+Kk`3P zZ8HP_XQ89s5}@Qo@-cN(M7M*fBaz6xgRm{ZR8|iFWQCZpfQC#5CNvsB$@(w=n!1fr zWie^-B%Wo02a_g_`gkr!=3x8OO+mrqWQ9~isf4+=o09&{-uAKmO1~Dj0O|((NQ|gI z)c2IAC+t~NbxdlF_5Njl@#b)*Zv5t0>mTDefL6pN*ER}dVz6_ZGw2!{I^*J}G!Gg&%7XQu=`Ya#Qdm_KS$C1@n3tF_naxtt!@wGK3Z<9Hw7GD z#@sdh$7}t12-FUcz~CBYY(YNq;#Ts%0O-mSWzsIHZV$dysdc;qZB~w`u2WV$w{2IY z?W>enjo1F)--f_g4J{|AvnE{Qt)|#;i^4l9YgwB*+)I&$>Q|+u1EU2a?PL)Wmq7oq zDh4DhoRsMXb7?9YkEMfsxeuq3-4mVs){fS7mzzcCq9A^t(UG7SBIfU7gGTrV7=UP#9K%rW{1BCXln$c6}04353CPK_ZcHSF`zy*60nQDPJDg$FU? zG~OmvDZgH`u9Npqyp;=ht0Olt;nD!8j&tI6T-mn$c}Q>Aqgc0-H-`zYEYbvg``RT2 zDI_Jnf|ePQ+cu7D6QURRlaUrXd@C@jZ|j+aNX)<2#!bX4h++G}0-92N_kxUF?tnau(*0bJ_R1y=D(W zy#=l z3(-KT6>zg@bQXA#8HQ?}pGs`r?|C9cO{H)YmC|PIPVdeNukRkmFoRkWN}V?1M}F9G zHOjL%wXyL;k%%28k4%cBcXWR7U}~A85pvz*7*q=~yEZUWLvx$=g2Y=?JAE(U9QsOt zQPa5;-8N`(zO76=#&;QnBrxYvNR;P3ff7kW?D>H6@4NLban)P>O0egFlzwAvEul z$)Q=172i=7y%A@UCI#wYD|=H}we{KS_=CpL6IrV4=$P?!y|X(j`-d)8wO$PR(`b1T z8@lEQs~Jrl-S;1mCVqNeNLNUmS!r>xSevT%4(smj?rHj^rzb2-hMCVx?wx#cUfRr) zj+yRTe70^hc7}{you5>BzIOo@nOt)~&Fqou9(RJmRy*P2BoodWL@I5X&4L>XjdB`C zH}^#>fexrlee=>m2P?#K@3B1QvHY)Veu?3%+uAzf7`OMr^l@Ze?>xg%=6Awm&!8gg zZG)7;_?+;`Qu?N9sF`_u0k#qfe2b91W)4jn8952_x?Xa%PdZJql8C|(S-#YoVlu#= z_q4*rf6LSJzqYB1oLtA&04%uo=|>Q2&qYdA|<;lcIfoc097 z6wj)Upy3nI+&ZBJ&s-faXad!&{U)+&zAj`VH+(}*MOHs1U+;gHkj zo2TWQTHU=o->NM;5=RpZKevWPbcM@Yz)O_X(Kq`zo_{M(V^+m#rRWB)2wDpBCL}-5 z6SV1}_`2o@fl8n?!{Y928r&Z-4!xPLjQy-@pkKwd>36;oiqq;m87BcVOzG*Javpu1 zT2bmD8}$t7U$*S#Nh72zcPQgBAEtA@9=eC7=q`Q`Ft_u;<1lIc54fy;)TV)zA~bay zwt3e7*JzvWgFU!lJ*vmczrHE4=znu73&c}PzjxewCfsI8#ycnCtInZjAR}L+;84vd zz-N$=C4{#-wTGhnwOul;Ur~OuL?6g+sTK|yin>Fe^)o*kp=5)0ER8>{e}7Qig9A~K zBHmZGFuKH~tg`ZUVNwYvDQ3p!-~O5xb>W*I{r2oRrT>=f=(ed}D>3R5Ryt{IiipX# zZr!Z?6<<^gx!zn6F~9K5gWy(Tb!4K4EQw_yQ}*wRao0NecW6b2W)-Idx5gXRIr%?W zd7ubPVl>kZ$~CP(R!Wh=p2~|v6P1&)H1clKMu)}dm_Y9|W*ya35zc+k5HSTt21_%^ z#bs%l^=ORtgdnzvYh1^0>~u|FO@9$(>whnjQ?&Zfvf68Vt0T_8qLvqkh8F3AS^8Ci z3H*DCscwHDd*t0=>ewNX<^VkobyAL8X{RG-VW%unGPk{Ee)rdSwwPzdEp+~cY>>7$ zrIv1AYxTaTW`$@%>hDNnU^p(oD2)f9XOg!`BcFxmuq!(%Y34ngy!V;zk9KaW!lqT0 z*e7o5Jl8g2I+*n=p&)Ggo{j{U%_}-a^;`F}?Gv3w&z4-n*jiKUeRCp6R~0VDHCReh zsE}}iTu@`ImTE=#W1?eX;IsDPS1N8|egIH;8V$~J&|LGSZ`8hW)yLW5h7%$tDQpsl*FPM!~{QC8K*8gY-1 z%gCm@_`Km{{%o9CU)_+G(5w~fSF++n64Cj+9X8_KKe&`uly_IWnzF0v$Zy$spWg=s zLkOelwlS4gGS5RC5v)fRUpBcaz3Hc&VYOwdkrAGK*ho3<&TNxA7?ZGs{OelHA$!70 z0}@#tTB%z5S(w3QYmPU@gnY|ucFS)ttfdrUEA;n^qkDjzzU?G^Lif4YA4+C%pV(!? z6dX50P}3UPwNlZs@rEYO$5LqI_D}GB;-C4;`K{6lk=El%U+9NU0OAM3xezraE(Fen|i$EGa4L*wd(@1LoU|xC#GB KopS1*UH=0&^Kpg% literal 0 HcmV?d00001 diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/include/commons.jag b/modules/analytics/Samples/GadgetLocationData/locationData/include/commons.jag new file mode 100644 index 00000000..6c64ed85 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/include/commons.jag @@ -0,0 +1,31 @@ +<% +/* + ~ 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 escapeSiddhiql = function (s) { + XML_CHAR_MAP = { + '<': '<', + '>': '>', + '&': '&', + '"': '"', + "'": ''' + }; + return s.replace(/[<>&"']/g, function (ch) { + return XML_CHAR_MAP[ch]; + }); +}; +%> \ No newline at end of file diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/include/store_alerts.jag b/modules/analytics/Samples/GadgetLocationData/locationData/include/store_alerts.jag new file mode 100644 index 00000000..a42d43e5 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/include/store_alerts.jag @@ -0,0 +1,165 @@ +<% +/* + ~ 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. + */ + +// TODO: change the name of this jaggery file even thoe it says 'store_alerts' it is actually removing the alerts from the data store as well o.O wired +var log = new Log(); +var constants = require("../controllers/constants.jag"); + +var getRegistry = function() { + var carbon = require("carbon"); + var server = new carbon.server.Server(); + return new carbon.registry.Registry(server, { + system: true + }); +}; + +/** + * Get the registry path to save the alert + * @param {String} alert_type Type of the alert + * @param {String} id Id of the device + * @param {String} optional /optional identity + * @return {String} Registry Path to save teh alert + * */ +var registryPath = function (alert_type, id, optional) { + if (alert_type && id ) { + if (alert_type === constants.EXECUTION_PLAN_TYPE_SPEED || alert_type === constants + .EXECUTION_PLAN_TYPE_PROXIMITY) { + return constants.REGISTRY_PATH_FOR_ALERTS + alert_type + "/" + id; + } else { + return constants.REGISTRY_PATH_FOR_ALERTS + alert_type + "/" + id + "/" + optional; + } + } else { + throw "Alert type and ID are mandatory field to generate the relevant registry path"; + } +}; + + +/** + * To store the alerts for visualizing purposes + * @param resourceContents Value that need to saved + * @param executionPlan Type of the execution plan + * @param optional Optional parameters that are only specific to particular device types + * @param deviceId Id of the device + */ +function store(resourceContents, executionPlan, optional, deviceId) { + var registry = getRegistry(); + var pathToAddAlert = ""; + if (log.isDebugEnabled()) { + log.debug("DEBUG:*** resourceContents:" + resourceContents); + } + if (executionPlan === constants.EXECUTION_PLAN_TYPE_SPEED) { + pathToAddAlert = registryPath(constants.EXECUTION_PLAN_TYPE_SPEED, deviceId); + registry.put(pathToAddAlert, { + content: '{"speedLimit": ' + resourceContents + '}', + mediaType: 'application/json' + }); + if (log.isDebugEnabled()) { + log.debug("DEBUG:*** Current speed limit set to:" + currentLimit.content); + } + } + else if (executionPlan === constants.EXECUTION_PLAN_TYPE_WITHIN) { + pathToAddAlert = registryPath(constants.EXECUTION_PLAN_TYPE_WITHIN, deviceId, optional.queryName); + if (log.isDebugEnabled()) { + log.debug("DEBUG:****** resourceContents = " + String('{"geoJson": ' + resourceContents + '}')); + } + registry.put(pathToAddAlert, { + content: JSON.stringify(resourceContents), + mediaType: 'application/json', + properties : { + "queryName" : optional.queryName, + "areaName" : optional.customName + } + }); + } else if (executionPlan === constants.EXECUTION_PLAN_TYPE_PROXIMITY) { + pathToAddAlert = registryPath(constants.EXECUTION_PLAN_TYPE_PROXIMITY, deviceId); + if (log.isDebugEnabled()) { + log.debug("DEBUG:****** resourceContents = " + resourceContents); + } + registry.put(pathToAddAlert, { + content: "", + mediaType: 'application/json' + }); + registry.addProperty(pathToAddAlert, "proximityDistance", resourceContents.proximityDistance); + registry.addProperty(pathToAddAlert, "proximityTime", resourceContents.proximityTime); + } else if (executionPlan === constants.EXECUTION_PLAN_TYPE_STATIONARY) { + pathToAddAlert = registryPath(constants.EXECUTION_PLAN_TYPE_STATIONARY, deviceId, optional.queryName); + if (log.isDebugEnabled()) { + log.debug("DEBUG:****** resourceContents = " + resourceContents); + } + var registryResource = { + content: JSON.stringify(resourceContents.geoFenceGeoJSON), + mediaType: 'application/json', + properties: { + "queryName" : optional.queryName, + "stationeryName" : optional.customName, + "stationeryTime" : resourceContents.stationeryTime, + "fluctuationRadius" : resourceContents.fluctuationRadius + } + }; + registry.put(pathToAddAlert, registryResource); + } else if (executionPlan === constants.EXECUTION_PLAN_TYPE_TRAFFIC) { + pathToAddAlert = registryPath(constants.EXECUTION_PLAN_TYPE_TRAFFIC, deviceId, optional.queryName); + if (log.isDebugEnabled()) { + log.debug("DEBUG:****** resourceContents = " + resourceContents.geoFenceGeoJSON); + } + var registryResource = { + content: JSON.stringify(resourceContents), + mediaType: 'application/json', + properties: { + "queryName" : optional.queryName, + "stationeryName" : optional.customName, + "stationeryTime" : resourceContents.stationeryTime, + "fluctuationRadius" : resourceContents.fluctuationRadius + } + }; + registry.put(pathToAddAlert, { + content: JSON.stringify(resourceContents), + mediaType: 'application/json', + properties: { + "queryName" : optional.queryName, + "areaName" : optional.customName + } + }); + } +} + +/** + * To remove the registry resource + * @param queryName Name of the query that need to be removed + * @param executionPlanType type of the execution plan that need to be removed + * @param deviceId Id of the device + */ +function remove(queryName, executionPlanType, deviceId) { + var path = ""; + try { + if (executionPlanType === constants.EXECUTION_PLAN_TYPE_SPEED || executionPlanType === constants.EXECUTION_PLAN_TYPE_PROXIMITY) { + path = registryPath(executionPlanType, deviceId); + } else { + path = registryPath(executionPlanType, deviceId, queryName); + } + getRegistry().remove(path); + if (log.isDebugEnabled()) { + log.debug("Resource is removed from the path" + path); + } + } + catch (e) { + log.error("The requested resource " + path + " was not found on this server."); + } +} +%> \ No newline at end of file diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/index.xml b/modules/analytics/Samples/GadgetLocationData/locationData/index.xml new file mode 100644 index 00000000..069371da --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/index.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+
+

Select Time

+ + + + +
+ +
+

Select Duration

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

Typical Scenario

+ + + +
+
+
+

Upload Data file

+ + +
+
+

Change Image

+ + + + + +
+
+
+ + + + + + ]]> + + \ No newline at end of file diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/js/RestCaller.js b/modules/analytics/Samples/GadgetLocationData/locationData/js/RestCaller.js new file mode 100644 index 00000000..8f72c056 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/js/RestCaller.js @@ -0,0 +1,478 @@ +require("lib/js/d3.js"); +require("js/graph.js"); +require("js/traffic.js"); +require("lib/js/d3tip.js"); +var GetInitStartTime = function () { + $.ajax({ + url: 'http://localhost:8080/service/time/start', + type: 'GET', + dataType:'json', + success: function(data) { + var start =JSON.parse(JSON.stringify(data.stt)); + document.getElementById("stt").value=start; + var valueSlider =document.getElementById("valueSlider"); + valueSlider.innerHTML=start; + valueSlider.value=start; + valueSlider.min=parseInt(start); + setCalendarDate(start); + //alert(JSON.stringify(data)); + }, + error:function (jqXHR, textStatus, errorThrown) { + alert(errorThrown); + } + }); + }; +var GetEndTime = function () { + $.ajax({ + url: 'http://localhost:8080/service/time/end', + type: 'GET', + dataType:'json', + success: function(data) { + var end =JSON.parse(JSON.stringify(data.stt)); + document.getElementById("valueSlider").max =end; + show(); + //alert(JSON.stringify(data)); + }, + error:function (jqXHR, textStatus, errorThrown) { + alert(errorThrown); + } + + }); + }; +var show = function () { + var start = parseInt(document.getElementById('stt').value); + document.getElementById('valueSlider').value = start; + var end = start + parseInt(document.getElementById('gap').value); + var data2 = []; + $.ajax({ + url: 'http://localhost:8080/service/data', + type: 'GET', + data: 'start=' + start + '&end=' + end, // or $('#myform').serializeArray() + dataType: 'json', + success: function (data) { + var X = JSON.parse(JSON.stringify(data.map.X.myArrayList)); + + var Y = JSON.parse(JSON.stringify(data.map.Y.myArrayList)); + + for (i = 0; i < X.length; i++) { + + data2.push({x: X[i], y: Y[i]}); + } + draw(data2); + //alert(JSON.stringify(data)); + }, + error: function (jqXHR, textStatus, errorThrown) { + alert(errorThrown); + } + }); +}; +function sendFile() { + var file = document.getElementById('fileupload').files[0]; + var fd = new FormData(); + fd.append( 'file', file); + + $.ajax({ + url: 'http://localhost:8080/service/file/upload', + data: fd, + processData: false, + contentType: false, + type: 'POST', + + + + success: function(data) { + alert("file upload sucessfull"); + GetInitStartTime(); + GetEndTime(); + show(); + //alert(JSON.stringify(data)); + }, + error:function (jqXHR, textStatus, errorThrown) { + alert(errorThrown); + } + }); +} +function getDimension() { + var url; + var value; + + + + $.ajax({ + url: 'http://localhost:8080/service/get/dimension', + type: 'GET', + dataType: 'json', + success: function (data) { + Xmax = JSON.parse(JSON.stringify(data.maxX)); + Ymax = JSON.parse(JSON.stringify(data.maxY)); + Xmin = JSON.parse(JSON.stringify(data.minX)); + Ymin = JSON.parse(JSON.stringify(data.minY)); + + x.domain(d3.extent([Xmin,Xmax])).nice(); + y.domain(d3.extent([Ymin,Ymax])).nice(); + + return value; + + + }, + error: function (jqXHR, textStatus, errorThrown) { + alert(errorThrown); + } + }) + + x.domain(d3.extent([-50,50])).nice(); + y.domain(d3.extent([-100,100])).nice(); + +} +function play(start,chunk) { + var start=parseInt(document.getElementById('stt').value); + var chunk =parseInt(document.getElementById('gap').value) + var end = parseInt(start) + (500*parseInt(chunk)); + + // var data2 =[]; + var xList,yList,tList,cList; + $.ajax({ + + url: 'http://localhost:8080/service/data/chunk', + type: 'GET', + data: 'start='+start+'&end='+end, // or $('#myform').serializeArray() + dataType:'json', + + success: function(data) { + alert("data loaded"); + xList=JSON.parse(JSON.stringify(data.X)); + yList=JSON.parse(JSON.stringify(data.Y)); + tList=JSON.parse(JSON.stringify(data.T)); + cList=JSON.parse(JSON.stringify(data.C)); + var i=0; + while(i<500){ + var s=parseInt(start)+(i*1000); + doScaledTimeout(i,s,tList,chunk,xList,yList,cList); + i+=1; + } + + + }, + error:function (jqXHR, textStatus, errorThrown) { + alert(errorThrown); + } + }); +} +var draw=function (data) { + + svg.selectAll(".series").remove(); + svg.selectAll(".g").remove(); + var seriesNames = d3.keys(data[0]) + .filter(function(d) { return d !== "x"; }) + .sort(); + var series = seriesNames.map(function(series) { + return data.map(function(d) { + return {x: +parseFloat(d.x), y: +parseFloat(d.y),c:+parseFloat(d.c)}; + }); + }); + // Compute the scales’ domains. + + + // Add the x-axis. + svg.append("g") + .attr("class", "x axis") + .attr("transform", "translate(0," + height + ")") + .call(d3.svg.axis().scale(x).orient("bottom")) + + + // Add the y-axis. + svg.append("g") + .attr("class", "y axis") + .call(d3.svg.axis().scale(y).orient("left")); + + var div = d3.select("body").append("div") + .attr("class", "tooltip") + .style("opacity", 0); + + // Add the points! + svg.selectAll(".series") + .data(series) + .enter().append("g") + .attr("class", "series") + + + .selectAll(".point") + .data(function(d) { + + return d; }) + .enter().append("circle") + .attr("class", "point") + .style("fill", function (d) { + if(isNaN(d.c)){ + return colorRed(50); + } + return d3.rgb(255,d.c*255/100,d.c*255/100); + + }) + .attr("r", 4.5) + .attr("cx", function(d) { + return x(parseFloat(d.x));}) + .attr("cy", function(d) { + return y(parseFloat(d.y));}) + +}; +function require(script) { + $.ajax({ + url: script, + dataType: "script", + async: false, + success: function () { + + }, + error: function () { + throw new Error("Could not load script " + script); + } + }); +} +function showDensity() { + var start = parseInt(document.getElementById('stt').value); + document.getElementById('valueSlider').value = start; + var end = start + parseInt(document.getElementById('gap').value); + var data2 = []; + $.ajax({ + url: 'http://localhost:8080/service/data/density', + type: 'GET', + data: 'start=' + parseInt(document.getElementById('stt').value) + '&end=' +(parseInt(document.getElementById('stt').value)+ parseInt(document.getElementById('gap').value)), // or $('#myform').serializeArray() + dataType: 'json', + success: function (data) { + var X = JSON.parse(JSON.stringify(data.map.X.myArrayList)); + + var Y = JSON.parse(JSON.stringify(data.map.Y.myArrayList)); + + var D = JSON.parse(JSON.stringify(data.map.D.myArrayList)); + + var ID = JSON.parse(JSON.stringify(data.map.ID.myArrayList)); + for (i = 0; i < X.length; i++) { + + + data2.push({x: X[i], y: Y[i], c:parseInt(D[i]), id:ID[i]}); + } + var max=D[0]; + var min=D[0]; + for (j=1;jmax){ + max=D[j]; + } + if(D[j]20){ + return colorRed(d.c); + } + else if(d.c>10){ + return colorBlue(d.c); + } + else if(d.c>=0){ + return colorGreen(d.c); + } + else{ + return d3.rgb(255,255,255); + } + + + + + + + }) + .on("mouseover", function(d) { + tooltip.transition() + .duration(200) + .style("opacity", .9); + tooltip.html((d.c).toFixed(2) ) + .style("left", (x(parseInt(d.x)) + "px")) + .style("top", (y(parseInt(d.y)) + "px")); + }) + .on("mouseout", function(d) { + tooltip.transition() + .duration(500) + .style("opacity", 0); + }) + .attr("r", 4.5) + .attr("cx", function(d) { + return x(parseFloat(d.x));}) + .attr("cy", function(d) { + return y(parseFloat(d.y));}) + .on("click",function (d){ + var id=d.id; + getFrequency(id); + }); + +}; + +function getFrequency(id) { + + var start = parseInt(document.getElementById('stt').value); + document.getElementById('valueSlider').value = start; + var gap = parseInt(document.getElementById('gap').value); + var data1 = []; + $.ajax({ + url:'http://localhost:8080/service/data/count', + type: 'GET', + data: 'start=' + start + '&gap=' + gap + '&sensor=' + id, // or $('#myform').serializeArray() + dataType: 'json', + success: function (data) { + var count = JSON.parse(JSON.stringify(data.map.Count.myArrayList)); + for (i = 0; i < count.length; i++) { + var gap = parseInt(document.getElementById('gap').value); + + + data1.push({x: tsToCal(gap,(gap*i)+start+(gap/2.0)), y: count[i]}); + } + var seriesNames = d3.keys(data[0]) + .filter(function(d) { return d !== "x" && d!=="c" && d!="id"; }) + .sort(); + var series = seriesNames.map(function(series) { + return data.map(function(d) { + return {x: +i, y: d.y}; + }); + }); + var stt = parseInt(document.getElementById("stt").value); + var gap = parseInt(document.getElementById("gap").value); + + d3.select("#barChart").remove(); + var margin = {top: 40, right: 20, bottom: 30, left: 40}, + width = 960 - margin.left - margin.right, + height = 500 - margin.top - margin.bottom; + + + + var x = d3.scale.ordinal() + .rangeRoundBands([0, width], .1); + + var y = d3.scale.linear() + .range([height, 0]); + + var xAxis = d3.svg.axis() + .scale(x) + .orient("bottom"); + + + var yAxis = d3.svg.axis() + .scale(y) + .orient("left"); + var svg2 = d3.select("#modal_body").append("svg") + .attr("id","barChart") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + var tip = d3.tip() + .attr('class', 'd3-tip') + .offset([-10, 0]) + .html(function (d) { + return d.y; + + }); + svg2.call(tip); + + + x.domain(data1.map(function(d) { + + return d.x; })); + + y.domain([0, d3.max(data1, function(d) { + + return d.y; })]); + svg2.append("g") + .attr("class", "x axis") + .attr("transform", "translate(0," + height + ")") + .call(xAxis); + + svg2.append("g") + .attr("class", "y axis") + .call(yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", 6) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Frequency"); + + svg2.selectAll(".bar") + .data(data1) + .enter().append("rect") + .attr("class", "bar") + .attr("x", function(d) {return x(d.x); }) + .attr("width", x.rangeBand()) + .attr("y", function(d) {return y(d.y); }) + .attr("height", function(d) { return height - y(d.y); }) + .on('mouseover', tip.show) + .on('mouseout', tip.hide); + + + + function type(d) { + d.y = +d.y; + return d; + } + + + }, + error: function (jqXHR, textStatus, errorThrown) { + alert(errorThrown); + } + + + +}); + $("#frequency_view").modal("show"); +} + + diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/js/graph.js b/modules/analytics/Samples/GadgetLocationData/locationData/js/graph.js new file mode 100644 index 00000000..3af320de --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/js/graph.js @@ -0,0 +1,111 @@ +/** + * Created by dimuth on 10/25/16. + */ +function setCalendarDate(start){ + var calendarTime=timeStampToCalendarDate(start); + document.getElementById("calenderDate").innerHTML=calendarTime; +} +var showNext =function () { + var currentStart = parseInt(document.getElementById('stt').value); + var duration = parseInt(document.getElementById('gap').value); + document.getElementById("stt").value =currentStart+duration; + + show(); +}; +var showPrevious =function () { + var currentStart = parseInt(document.getElementById('stt').value); + var duration = parseInt(document.getElementById('gap').value); + document.getElementById("stt").value =currentStart-duration; + show(); +}; +function outputUpdate(num) { + document.querySelector('#output').value = num; + document.getElementById('stt').value =num; + setCalendarDate(num); + show(); +} +function changeStep() { + document.getElementById("valueSlider").step =document.getElementById("gap").value; +} +function timeStampToCalendarDate(time) { + + var date = new Date(parseInt(time)); + var Months =["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; + return date.getFullYear()+" "+Months[date.getMonth()]+" "+date.getDate()+" "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds(); +} +function showChunk(start,chunk,tList,xList,yList) { + var data2=[]; + var gap=document.getElementById("gap").value; + var e=parseInt(start)+parseInt(chunk); + for(i=0;iparseInt(start)){ + data2.push({x:xList[i] ,y:yList[i], c:((e-parseInt(tList[i]))*100/parseInt(gap))}); + } + } + return data2; +} +function doScaledTimeout(j,start,tList,chunk,xList,yList,cList) { + setTimeout(function() { + document.getElementById('stt').value=start; + document.getElementById('output').value=start; + setCalendarDate(start); + + var data2=showChunk(start,chunk,tList,xList,yList,cList); + + draw(data2); + }, j * 300); +} +colorRed = d3.scale.linear().domain([20,100]) + .interpolate(d3.interpolateHcl) + .range([d3.rgb('#F99FA2'),d3.rgb("#F72128"),]); + +colorBlue = d3.scale.linear().domain([10,20]) + .interpolate(d3.interpolateHcl) + .range([d3.rgb("#00C1FF"),d3.rgb('#6670AC')]); + +colorGreen = d3.scale.linear().domain([10,0]) + .interpolate(d3.interpolateHcl) + .range([d3.rgb("#0A7E03"),d3.rgb('#0FF300')]); + +var tooltip = d3.select("body").append("div") + .attr("class", "tooltip") + .style("opacity", 0); + + +function tsToCal(gap,time) { + var date = new Date(parseInt(time)); + var Months =["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; + if(gap < 60000){ + return date.getMinutes()+":"+date.getSeconds(); + + } + else if(gap <=7200000) { + return Months[date.getMonth()]+" "+date.getDate() + " " + date.getHours() + ":" + date.getMinutes(); + } + else{ + return date.getFullYear()+" "+Months[date.getMonth()]+" "+date.getDate(); + } + +} +function display() { + window.location.reload(); + +}; +function loadImage(x,y) { + var image = d3.select("g").append("svg:image") + .attr("xlink:href", "img/floor.jpg") + .attr("width", 1500) + .attr("height", 699) + .attr("x",x) + .attr("y",y); + +} +function changeImage(x,y) { + imageX=imageX+x; + imageY=imageY+y; + loadImage(imageX,imageY); + +} +colorData = d3.scale.linear().domain([10,0]) + .interpolate(d3.interpolateHcl) + .range([d3.rgb(125,0,0),d3.rgb(255,0,0)]); \ No newline at end of file diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/js/traffic.js b/modules/analytics/Samples/GadgetLocationData/locationData/js/traffic.js new file mode 100644 index 00000000..877377be --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/js/traffic.js @@ -0,0 +1,130 @@ +/** + * Created by dimuth on 11/2/16. + */ + + var drawScene=function (data) { + + svg.selectAll(".series").remove(); + svg.selectAll(".g").remove(); + var seriesNames = d3.keys(data[0]) + .filter(function(d) { return d !== "x" && d!=="c" && d!="id"; }) + .sort(); + var series = seriesNames.map(function(series) { + return data.map(function(d) { + return {x: +parseFloat(d.x), y: +parseFloat(d.y),c:+(parseFloat(d.c)), id:parseInt(d.id)}; + }); + }); + // Compute the scales’ domains. + x.domain(d3.extent([-71,40])).nice(); + y.domain(d3.extent([4,65])).nice(); + + // Add the x-axis. + svg.append("g") + .attr("class", "x axis") + .attr("transform", "translate(0," + height + ")") + .call(d3.svg.axis().scale(x).orient("bottom")); + // Add the y-axis. + svg.append("g") + .attr("class", "y axis") + .call(d3.svg.axis().scale(y).orient("left")); + // Add the points! + svg.selectAll(".series") + .data(series) + .enter().append("g") + .attr("class", "series") + + + .selectAll(".point") + .data(function(d) { + return d; }) + .enter().append("circle") + .attr("class", "point") + .style("fill", function (d) { + if(d.c==0){ + return d3.rgb(255,255,255); + } + else if(d.c>10){ + return colorRed(d.c); + } + else if(d.c>3){ + return colorBlue(d.c); + } + else if(d.c>=0){ + return colorGreen(d.c); + } + else{ + return d3.rgb(255,255,255); + } + + + + + + + }) + .on("mouseover", function(d) { + tooltip.transition() + .duration(200) + .style("opacity", .9); + tooltip.html((d.c).toFixed(2) ) + .style("left", (x(parseInt(d.x)) + "px")) + .style("top", (y(parseInt(d.y)) + "px")); + }) + .on("mouseout", function(d) { + tooltip.transition() + .duration(500) + .style("opacity", 0); + }) + .attr("r", 4.5) + .attr("cx", function(d) { + return x(parseFloat(d.x));}) + .attr("cy", function(d) { + return y(parseFloat(d.y));}); + + + }; +function showScene() { + var data2 = []; + $.ajax({ + url: 'http://localhost:8080/service/typical/scene', + type: 'GET', + data: 'hour=' + document.getElementById('time').value + '&day=' +document.getElementById('day').value, // or $('#myform').serializeArray() + dataType: 'json', + success: function (data) { + var X = JSON.parse(JSON.stringify(data.X)); + + var Y = JSON.parse(JSON.stringify(data.Y)); + + var C = JSON.parse(JSON.stringify(data.C)); + + var ID = JSON.parse(JSON.stringify(data.ID)); + for (i = 0; i < X.length; i++) { + + + data2.push({x: X[i], y: Y[i], c:C[i], id:ID[i]}); + } + + drawScene(data2); + //alert(JSON.stringify(data)); + }, + error: function (jqXHR, textStatus, errorThrown) { + alert(errorThrown); + } + }); + +}; +colorRed2 = d3.scale.linear().domain([10,100]) + .interpolate(d3.interpolateHcl) + .range([d3.rgb('#F99FA2'),d3.rgb("#F72128"),]); + +colorBlue2 = d3.scale.linear().domain([3,10]) + .interpolate(d3.interpolateHcl) + .range([d3.rgb("#00C1FF"),d3.rgb('#6670AC')]); + +colorGreen2 = d3.scale.linear().domain([3,0]) + .interpolate(d3.interpolateHcl) + .range([d3.rgb("#0A7E03"),d3.rgb('#0FF300')]); + + + + diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/lib/css/bootstrap.css b/modules/analytics/Samples/GadgetLocationData/locationData/lib/css/bootstrap.css new file mode 100644 index 00000000..6167622c --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/lib/css/bootstrap.css @@ -0,0 +1,6757 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/lib/js/bootstrap.js b/modules/analytics/Samples/GadgetLocationData/locationData/lib/js/bootstrap.js new file mode 100644 index 00000000..c9d4e3b5 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/lib/js/bootstrap.js @@ -0,0 +1,2377 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.7 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // css TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.7 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.7' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector === '#' ? [] : selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.7 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.7' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d).prop(d, true) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d).prop(d, false) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target).closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { + // Prevent double click on radios, and the double selections (so cancellation) on checkboxes + e.preventDefault() + // The target component still receive the focus + if ($btn.is('input,button')) $btn.trigger('focus') + else $btn.find('input:visible,button:visible').first().trigger('focus') + } + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.7 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.7' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.7 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + +/* jshint latedef: false */ + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.7' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.7 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.7' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger($.Event('shown.bs.dropdown', relatedTarget)) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.7 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.7' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (document !== e.target && + this.$element[0] !== e.target && + !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.7 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.7' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + } + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var isSvg = window.SVGElement && el instanceof window.SVGElement + // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. + // See https://github.com/twbs/bootstrap/issues/20280 + var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + that.$element = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.7 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.7' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.7 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.7' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.7 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.7' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.7 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.7' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/lib/js/d3.js b/modules/analytics/Samples/GadgetLocationData/locationData/lib/js/d3.js new file mode 100644 index 00000000..55eafc78 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/lib/js/d3.js @@ -0,0 +1,9554 @@ +!function() { + var d3 = { + version: "3.5.17" + }; + var d3_arraySlice = [].slice, d3_array = function(list) { + return d3_arraySlice.call(list); + }; + var d3_document = this.document; + function d3_documentElement(node) { + return node && (node.ownerDocument || node.document || node).documentElement; + } + function d3_window(node) { + return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView); + } + if (d3_document) { + try { + d3_array(d3_document.documentElement.childNodes)[0].nodeType; + } catch (e) { + d3_array = function(list) { + var i = list.length, array = new Array(i); + while (i--) array[i] = list[i]; + return array; + }; + } + } + if (!Date.now) Date.now = function() { + return +new Date(); + }; + if (d3_document) { + try { + d3_document.createElement("DIV").style.setProperty("opacity", 0, ""); + } catch (error) { + var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty; + d3_element_prototype.setAttribute = function(name, value) { + d3_element_setAttribute.call(this, name, value + ""); + }; + d3_element_prototype.setAttributeNS = function(space, local, value) { + d3_element_setAttributeNS.call(this, space, local, value + ""); + }; + d3_style_prototype.setProperty = function(name, value, priority) { + d3_style_setProperty.call(this, name, value + "", priority); + }; + } + } + d3.ascending = d3_ascending; + function d3_ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + d3.descending = function(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + }; + d3.min = function(array, f) { + var i = -1, n = array.length, a, b; + if (arguments.length === 1) { + while (++i < n) if ((b = array[i]) != null && b >= b) { + a = b; + break; + } + while (++i < n) if ((b = array[i]) != null && a > b) a = b; + } else { + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { + a = b; + break; + } + while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; + } + return a; + }; + d3.max = function(array, f) { + var i = -1, n = array.length, a, b; + if (arguments.length === 1) { + while (++i < n) if ((b = array[i]) != null && b >= b) { + a = b; + break; + } + while (++i < n) if ((b = array[i]) != null && b > a) a = b; + } else { + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { + a = b; + break; + } + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; + } + return a; + }; + d3.extent = function(array, f) { + var i = -1, n = array.length, a, b, c; + if (arguments.length === 1) { + while (++i < n) if ((b = array[i]) != null && b >= b) { + a = c = b; + break; + } + while (++i < n) if ((b = array[i]) != null) { + if (a > b) a = b; + if (c < b) c = b; + } + } else { + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { + a = c = b; + break; + } + while (++i < n) if ((b = f.call(array, array[i], i)) != null) { + if (a > b) a = b; + if (c < b) c = b; + } + } + return [ a, c ]; + }; + function d3_number(x) { + return x === null ? NaN : +x; + } + function d3_numeric(x) { + return !isNaN(x); + } + d3.sum = function(array, f) { + var s = 0, n = array.length, a, i = -1; + if (arguments.length === 1) { + while (++i < n) if (d3_numeric(a = +array[i])) s += a; + } else { + while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a; + } + return s; + }; + d3.mean = function(array, f) { + var s = 0, n = array.length, a, i = -1, j = n; + if (arguments.length === 1) { + while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j; + } else { + while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j; + } + if (j) return s / j; + }; + d3.quantile = function(values, p) { + var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h; + return e ? v + e * (values[h] - v) : v; + }; + d3.median = function(array, f) { + var numbers = [], n = array.length, a, i = -1; + if (arguments.length === 1) { + while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a); + } else { + while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a); + } + if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5); + }; + d3.variance = function(array, f) { + var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0; + if (arguments.length === 1) { + while (++i < n) { + if (d3_numeric(a = d3_number(array[i]))) { + d = a - m; + m += d / ++j; + s += d * (a - m); + } + } + } else { + while (++i < n) { + if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) { + d = a - m; + m += d / ++j; + s += d * (a - m); + } + } + } + if (j > 1) return s / (j - 1); + }; + d3.deviation = function() { + var v = d3.variance.apply(this, arguments); + return v ? Math.sqrt(v) : v; + }; + function d3_bisector(compare) { + return { + left: function(a, x, lo, hi) { + if (arguments.length < 3) lo = 0; + if (arguments.length < 4) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid; + } + return lo; + }, + right: function(a, x, lo, hi) { + if (arguments.length < 3) lo = 0; + if (arguments.length < 4) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1; + } + return lo; + } + }; + } + var d3_bisect = d3_bisector(d3_ascending); + d3.bisectLeft = d3_bisect.left; + d3.bisect = d3.bisectRight = d3_bisect.right; + d3.bisector = function(f) { + return d3_bisector(f.length === 1 ? function(d, x) { + return d3_ascending(f(d), x); + } : f); + }; + d3.shuffle = function(array, i0, i1) { + if ((m = arguments.length) < 3) { + i1 = array.length; + if (m < 2) i0 = 0; + } + var m = i1 - i0, t, i; + while (m) { + i = Math.random() * m-- | 0; + t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t; + } + return array; + }; + d3.permute = function(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) permutes[i] = array[indexes[i]]; + return permutes; + }; + d3.pairs = function(array) { + var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ]; + return pairs; + }; + d3.transpose = function(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = d3.min(matrix, d3_transposeLength), transpose = new Array(m); ++i < m; ) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) { + row[j] = matrix[j][i]; + } + } + return transpose; + }; + function d3_transposeLength(d) { + return d.length; + } + d3.zip = function() { + return d3.transpose(arguments); + }; + d3.keys = function(map) { + var keys = []; + for (var key in map) keys.push(key); + return keys; + }; + d3.values = function(map) { + var values = []; + for (var key in map) values.push(map[key]); + return values; + }; + d3.entries = function(map) { + var entries = []; + for (var key in map) entries.push({ + key: key, + value: map[key] + }); + return entries; + }; + d3.merge = function(arrays) { + var n = arrays.length, m, i = -1, j = 0, merged, array; + while (++i < n) j += arrays[i].length; + merged = new Array(j); + while (--n >= 0) { + array = arrays[n]; + m = array.length; + while (--m >= 0) { + merged[--j] = array[m]; + } + } + return merged; + }; + var abs = Math.abs; + d3.range = function(start, stop, step) { + if (arguments.length < 3) { + step = 1; + if (arguments.length < 2) { + stop = start; + start = 0; + } + } + if ((stop - start) / step === Infinity) throw new Error("infinite range"); + var range = [], k = d3_range_integerScale(abs(step)), i = -1, j; + start *= k, stop *= k, step *= k; + if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k); + return range; + }; + function d3_range_integerScale(x) { + var k = 1; + while (x * k % 1) k *= 10; + return k; + } + function d3_class(ctor, properties) { + for (var key in properties) { + Object.defineProperty(ctor.prototype, key, { + value: properties[key], + enumerable: false + }); + } + } + d3.map = function(object, f) { + var map = new d3_Map(); + if (object instanceof d3_Map) { + object.forEach(function(key, value) { + map.set(key, value); + }); + } else if (Array.isArray(object)) { + var i = -1, n = object.length, o; + if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o); + } else { + for (var key in object) map.set(key, object[key]); + } + return map; + }; + function d3_Map() { + this._ = Object.create(null); + } + var d3_map_proto = "__proto__", d3_map_zero = "\x00"; + d3_class(d3_Map, { + has: d3_map_has, + get: function(key) { + return this._[d3_map_escape(key)]; + }, + set: function(key, value) { + return this._[d3_map_escape(key)] = value; + }, + remove: d3_map_remove, + keys: d3_map_keys, + values: function() { + var values = []; + for (var key in this._) values.push(this._[key]); + return values; + }, + entries: function() { + var entries = []; + for (var key in this._) entries.push({ + key: d3_map_unescape(key), + value: this._[key] + }); + return entries; + }, + size: d3_map_size, + empty: d3_map_empty, + forEach: function(f) { + for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]); + } + }); + function d3_map_escape(key) { + return (key += "") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key; + } + function d3_map_unescape(key) { + return (key += "")[0] === d3_map_zero ? key.slice(1) : key; + } + function d3_map_has(key) { + return d3_map_escape(key) in this._; + } + function d3_map_remove(key) { + return (key = d3_map_escape(key)) in this._ && delete this._[key]; + } + function d3_map_keys() { + var keys = []; + for (var key in this._) keys.push(d3_map_unescape(key)); + return keys; + } + function d3_map_size() { + var size = 0; + for (var key in this._) ++size; + return size; + } + function d3_map_empty() { + for (var key in this._) return false; + return true; + } + d3.nest = function() { + var nest = {}, keys = [], sortKeys = [], sortValues, rollup; + function map(mapType, array, depth) { + if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array; + var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values; + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(object = array[i]))) { + values.push(object); + } else { + valuesByKey.set(keyValue, [ object ]); + } + } + if (mapType) { + object = mapType(); + setter = function(keyValue, values) { + object.set(keyValue, map(mapType, values, depth)); + }; + } else { + object = {}; + setter = function(keyValue, values) { + object[keyValue] = map(mapType, values, depth); + }; + } + valuesByKey.forEach(setter); + return object; + } + function entries(map, depth) { + if (depth >= keys.length) return map; + var array = [], sortKey = sortKeys[depth++]; + map.forEach(function(key, keyMap) { + array.push({ + key: key, + values: entries(keyMap, depth) + }); + }); + return sortKey ? array.sort(function(a, b) { + return sortKey(a.key, b.key); + }) : array; + } + nest.map = function(array, mapType) { + return map(mapType, array, 0); + }; + nest.entries = function(array) { + return entries(map(d3.map, array, 0), 0); + }; + nest.key = function(d) { + keys.push(d); + return nest; + }; + nest.sortKeys = function(order) { + sortKeys[keys.length - 1] = order; + return nest; + }; + nest.sortValues = function(order) { + sortValues = order; + return nest; + }; + nest.rollup = function(f) { + rollup = f; + return nest; + }; + return nest; + }; + d3.set = function(array) { + var set = new d3_Set(); + if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]); + return set; + }; + function d3_Set() { + this._ = Object.create(null); + } + d3_class(d3_Set, { + has: d3_map_has, + add: function(key) { + this._[d3_map_escape(key += "")] = true; + return key; + }, + remove: d3_map_remove, + values: d3_map_keys, + size: d3_map_size, + empty: d3_map_empty, + forEach: function(f) { + for (var key in this._) f.call(this, d3_map_unescape(key)); + } + }); + d3.behavior = {}; + function d3_identity(d) { + return d; + } + d3.rebind = function(target, source) { + var i = 1, n = arguments.length, method; + while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]); + return target; + }; + function d3_rebind(target, source, method) { + return function() { + var value = method.apply(source, arguments); + return value === source ? target : value; + }; + } + function d3_vendorSymbol(object, name) { + if (name in object) return name; + name = name.charAt(0).toUpperCase() + name.slice(1); + for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) { + var prefixName = d3_vendorPrefixes[i] + name; + if (prefixName in object) return prefixName; + } + } + var d3_vendorPrefixes = [ "webkit", "ms", "moz", "Moz", "o", "O" ]; + function d3_noop() {} + d3.dispatch = function() { + var dispatch = new d3_dispatch(), i = -1, n = arguments.length; + while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); + return dispatch; + }; + function d3_dispatch() {} + d3_dispatch.prototype.on = function(type, listener) { + var i = type.indexOf("."), name = ""; + if (i >= 0) { + name = type.slice(i + 1); + type = type.slice(0, i); + } + if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener); + if (arguments.length === 2) { + if (listener == null) for (type in this) { + if (this.hasOwnProperty(type)) this[type].on(name, null); + } + return this; + } + }; + function d3_dispatch_event(dispatch) { + var listeners = [], listenerByName = new d3_Map(); + function event() { + var z = listeners, i = -1, n = z.length, l; + while (++i < n) if (l = z[i].on) l.apply(this, arguments); + return dispatch; + } + event.on = function(name, listener) { + var l = listenerByName.get(name), i; + if (arguments.length < 2) return l && l.on; + if (l) { + l.on = null; + listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1)); + listenerByName.remove(name); + } + if (listener) listeners.push(listenerByName.set(name, { + on: listener + })); + return dispatch; + }; + return event; + } + d3.event = null; + function d3_eventPreventDefault() { + d3.event.preventDefault(); + } + function d3_eventSource() { + var e = d3.event, s; + while (s = e.sourceEvent) e = s; + return e; + } + function d3_eventDispatch(target) { + var dispatch = new d3_dispatch(), i = 0, n = arguments.length; + while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); + dispatch.of = function(thiz, argumentz) { + return function(e1) { + try { + var e0 = e1.sourceEvent = d3.event; + e1.target = target; + d3.event = e1; + dispatch[e1.type].apply(thiz, argumentz); + } finally { + d3.event = e0; + } + }; + }; + return dispatch; + } + d3.requote = function(s) { + return s.replace(d3_requote_re, "\\$&"); + }; + var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; + var d3_subclass = {}.__proto__ ? function(object, prototype) { + object.__proto__ = prototype; + } : function(object, prototype) { + for (var property in prototype) object[property] = prototype[property]; + }; + function d3_selection(groups) { + d3_subclass(groups, d3_selectionPrototype); + return groups; + } + var d3_select = function(s, n) { + return n.querySelector(s); + }, d3_selectAll = function(s, n) { + return n.querySelectorAll(s); + }, d3_selectMatches = function(n, s) { + var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, "matchesSelector")]; + d3_selectMatches = function(n, s) { + return d3_selectMatcher.call(n, s); + }; + return d3_selectMatches(n, s); + }; + if (typeof Sizzle === "function") { + d3_select = function(s, n) { + return Sizzle(s, n)[0] || null; + }; + d3_selectAll = Sizzle; + d3_selectMatches = Sizzle.matchesSelector; + } + d3.selection = function() { + return d3.select(d3_document.documentElement); + }; + var d3_selectionPrototype = d3.selection.prototype = []; + d3_selectionPrototype.select = function(selector) { + var subgroups = [], subgroup, subnode, group, node; + selector = d3_selection_selector(selector); + for (var j = -1, m = this.length; ++j < m; ) { + subgroups.push(subgroup = []); + subgroup.parentNode = (group = this[j]).parentNode; + for (var i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + subgroup.push(subnode = selector.call(node, node.__data__, i, j)); + if (subnode && "__data__" in node) subnode.__data__ = node.__data__; + } else { + subgroup.push(null); + } + } + } + return d3_selection(subgroups); + }; + function d3_selection_selector(selector) { + return typeof selector === "function" ? selector : function() { + return d3_select(selector, this); + }; + } + d3_selectionPrototype.selectAll = function(selector) { + var subgroups = [], subgroup, node; + selector = d3_selection_selectorAll(selector); + for (var j = -1, m = this.length; ++j < m; ) { + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j))); + subgroup.parentNode = node; + } + } + } + return d3_selection(subgroups); + }; + function d3_selection_selectorAll(selector) { + return typeof selector === "function" ? selector : function() { + return d3_selectAll(selector, this); + }; + } + var d3_nsXhtml = "http://www.w3.org/1999/xhtml"; + var d3_nsPrefix = { + svg: "http://www.w3.org/2000/svg", + xhtml: d3_nsXhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" + }; + d3.ns = { + prefix: d3_nsPrefix, + qualify: function(name) { + var i = name.indexOf(":"), prefix = name; + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return d3_nsPrefix.hasOwnProperty(prefix) ? { + space: d3_nsPrefix[prefix], + local: name + } : name; + } + }; + d3_selectionPrototype.attr = function(name, value) { + if (arguments.length < 2) { + if (typeof name === "string") { + var node = this.node(); + name = d3.ns.qualify(name); + return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name); + } + for (value in name) this.each(d3_selection_attr(value, name[value])); + return this; + } + return this.each(d3_selection_attr(name, value)); + }; + function d3_selection_attr(name, value) { + name = d3.ns.qualify(name); + function attrNull() { + this.removeAttribute(name); + } + function attrNullNS() { + this.removeAttributeNS(name.space, name.local); + } + function attrConstant() { + this.setAttribute(name, value); + } + function attrConstantNS() { + this.setAttributeNS(name.space, name.local, value); + } + function attrFunction() { + var x = value.apply(this, arguments); + if (x == null) this.removeAttribute(name); else this.setAttribute(name, x); + } + function attrFunctionNS() { + var x = value.apply(this, arguments); + if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x); + } + return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant; + } + function d3_collapse(s) { + return s.trim().replace(/\s+/g, " "); + } + d3_selectionPrototype.classed = function(name, value) { + if (arguments.length < 2) { + if (typeof name === "string") { + var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1; + if (value = node.classList) { + while (++i < n) if (!value.contains(name[i])) return false; + } else { + value = node.getAttribute("class"); + while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false; + } + return true; + } + for (value in name) this.each(d3_selection_classed(value, name[value])); + return this; + } + return this.each(d3_selection_classed(name, value)); + }; + function d3_selection_classedRe(name) { + return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g"); + } + function d3_selection_classes(name) { + return (name + "").trim().split(/^|\s+/); + } + function d3_selection_classed(name, value) { + name = d3_selection_classes(name).map(d3_selection_classedName); + var n = name.length; + function classedConstant() { + var i = -1; + while (++i < n) name[i](this, value); + } + function classedFunction() { + var i = -1, x = value.apply(this, arguments); + while (++i < n) name[i](this, x); + } + return typeof value === "function" ? classedFunction : classedConstant; + } + function d3_selection_classedName(name) { + var re = d3_selection_classedRe(name); + return function(node, value) { + if (c = node.classList) return value ? c.add(name) : c.remove(name); + var c = node.getAttribute("class") || ""; + if (value) { + re.lastIndex = 0; + if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name)); + } else { + node.setAttribute("class", d3_collapse(c.replace(re, " "))); + } + }; + } + d3_selectionPrototype.style = function(name, value, priority) { + var n = arguments.length; + if (n < 3) { + if (typeof name !== "string") { + if (n < 2) value = ""; + for (priority in name) this.each(d3_selection_style(priority, name[priority], value)); + return this; + } + if (n < 2) { + var node = this.node(); + return d3_window(node).getComputedStyle(node, null).getPropertyValue(name); + } + priority = ""; + } + return this.each(d3_selection_style(name, value, priority)); + }; + function d3_selection_style(name, value, priority) { + function styleNull() { + this.style.removeProperty(name); + } + function styleConstant() { + this.style.setProperty(name, value, priority); + } + function styleFunction() { + var x = value.apply(this, arguments); + if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority); + } + return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant; + } + d3_selectionPrototype.property = function(name, value) { + if (arguments.length < 2) { + if (typeof name === "string") return this.node()[name]; + for (value in name) this.each(d3_selection_property(value, name[value])); + return this; + } + return this.each(d3_selection_property(name, value)); + }; + function d3_selection_property(name, value) { + function propertyNull() { + delete this[name]; + } + function propertyConstant() { + this[name] = value; + } + function propertyFunction() { + var x = value.apply(this, arguments); + if (x == null) delete this[name]; else this[name] = x; + } + return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant; + } + d3_selectionPrototype.text = function(value) { + return arguments.length ? this.each(typeof value === "function" ? function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + } : value == null ? function() { + this.textContent = ""; + } : function() { + this.textContent = value; + }) : this.node().textContent; + }; + d3_selectionPrototype.html = function(value) { + return arguments.length ? this.each(typeof value === "function" ? function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + } : value == null ? function() { + this.innerHTML = ""; + } : function() { + this.innerHTML = value; + }) : this.node().innerHTML; + }; + d3_selectionPrototype.append = function(name) { + name = d3_selection_creator(name); + return this.select(function() { + return this.appendChild(name.apply(this, arguments)); + }); + }; + function d3_selection_creator(name) { + function create() { + var document = this.ownerDocument, namespace = this.namespaceURI; + return namespace === d3_nsXhtml && document.documentElement.namespaceURI === d3_nsXhtml ? document.createElement(name) : document.createElementNS(namespace, name); + } + function createNS() { + return this.ownerDocument.createElementNS(name.space, name.local); + } + return typeof name === "function" ? name : (name = d3.ns.qualify(name)).local ? createNS : create; + } + d3_selectionPrototype.insert = function(name, before) { + name = d3_selection_creator(name); + before = d3_selection_selector(before); + return this.select(function() { + return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null); + }); + }; + d3_selectionPrototype.remove = function() { + return this.each(d3_selectionRemove); + }; + function d3_selectionRemove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); + } + d3_selectionPrototype.data = function(value, key) { + var i = -1, n = this.length, group, node; + if (!arguments.length) { + value = new Array(n = (group = this[0]).length); + while (++i < n) { + if (node = group[i]) { + value[i] = node.__data__; + } + } + return value; + } + function bind(group, groupData) { + var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData; + if (key) { + var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue; + for (i = -1; ++i < n; ) { + if (node = group[i]) { + if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) { + exitNodes[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + keyValues[i] = keyValue; + } + } + for (i = -1; ++i < m; ) { + if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) { + enterNodes[i] = d3_selection_dataNode(nodeData); + } else if (node !== true) { + updateNodes[i] = node; + node.__data__ = nodeData; + } + nodeByKeyValue.set(keyValue, true); + } + for (i = -1; ++i < n; ) { + if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) { + exitNodes[i] = group[i]; + } + } + } else { + for (i = -1; ++i < n0; ) { + node = group[i]; + nodeData = groupData[i]; + if (node) { + node.__data__ = nodeData; + updateNodes[i] = node; + } else { + enterNodes[i] = d3_selection_dataNode(nodeData); + } + } + for (;i < m; ++i) { + enterNodes[i] = d3_selection_dataNode(groupData[i]); + } + for (;i < n; ++i) { + exitNodes[i] = group[i]; + } + } + enterNodes.update = updateNodes; + enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode; + enter.push(enterNodes); + update.push(updateNodes); + exit.push(exitNodes); + } + var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]); + if (typeof value === "function") { + while (++i < n) { + bind(group = this[i], value.call(group, group.parentNode.__data__, i)); + } + } else { + while (++i < n) { + bind(group = this[i], value); + } + } + update.enter = function() { + return enter; + }; + update.exit = function() { + return exit; + }; + return update; + }; + function d3_selection_dataNode(data) { + return { + __data__: data + }; + } + d3_selectionPrototype.datum = function(value) { + return arguments.length ? this.property("__data__", value) : this.property("__data__"); + }; + d3_selectionPrototype.filter = function(filter) { + var subgroups = [], subgroup, group, node; + if (typeof filter !== "function") filter = d3_selection_filter(filter); + for (var j = 0, m = this.length; j < m; j++) { + subgroups.push(subgroup = []); + subgroup.parentNode = (group = this[j]).parentNode; + for (var i = 0, n = group.length; i < n; i++) { + if ((node = group[i]) && filter.call(node, node.__data__, i, j)) { + subgroup.push(node); + } + } + } + return d3_selection(subgroups); + }; + function d3_selection_filter(selector) { + return function() { + return d3_selectMatches(this, selector); + }; + } + d3_selectionPrototype.order = function() { + for (var j = -1, m = this.length; ++j < m; ) { + for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) { + if (node = group[i]) { + if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + return this; + }; + d3_selectionPrototype.sort = function(comparator) { + comparator = d3_selection_sortComparator.apply(this, arguments); + for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator); + return this.order(); + }; + function d3_selection_sortComparator(comparator) { + if (!arguments.length) comparator = d3_ascending; + return function(a, b) { + return a && b ? comparator(a.__data__, b.__data__) : !a - !b; + }; + } + d3_selectionPrototype.each = function(callback) { + return d3_selection_each(this, function(node, i, j) { + callback.call(node, node.__data__, i, j); + }); + }; + function d3_selection_each(groups, callback) { + for (var j = 0, m = groups.length; j < m; j++) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) { + if (node = group[i]) callback(node, i, j); + } + } + return groups; + } + d3_selectionPrototype.call = function(callback) { + var args = d3_array(arguments); + callback.apply(args[0] = this, args); + return this; + }; + d3_selectionPrototype.empty = function() { + return !this.node(); + }; + d3_selectionPrototype.node = function() { + for (var j = 0, m = this.length; j < m; j++) { + for (var group = this[j], i = 0, n = group.length; i < n; i++) { + var node = group[i]; + if (node) return node; + } + } + return null; + }; + d3_selectionPrototype.size = function() { + var n = 0; + d3_selection_each(this, function() { + ++n; + }); + return n; + }; + function d3_selection_enter(selection) { + d3_subclass(selection, d3_selection_enterPrototype); + return selection; + } + var d3_selection_enterPrototype = []; + d3.selection.enter = d3_selection_enter; + d3.selection.enter.prototype = d3_selection_enterPrototype; + d3_selection_enterPrototype.append = d3_selectionPrototype.append; + d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; + d3_selection_enterPrototype.node = d3_selectionPrototype.node; + d3_selection_enterPrototype.call = d3_selectionPrototype.call; + d3_selection_enterPrototype.size = d3_selectionPrototype.size; + d3_selection_enterPrototype.select = function(selector) { + var subgroups = [], subgroup, subnode, upgroup, group, node; + for (var j = -1, m = this.length; ++j < m; ) { + upgroup = (group = this[j]).update; + subgroups.push(subgroup = []); + subgroup.parentNode = group.parentNode; + for (var i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j)); + subnode.__data__ = node.__data__; + } else { + subgroup.push(null); + } + } + } + return d3_selection(subgroups); + }; + d3_selection_enterPrototype.insert = function(name, before) { + if (arguments.length < 2) before = d3_selection_enterInsertBefore(this); + return d3_selectionPrototype.insert.call(this, name, before); + }; + function d3_selection_enterInsertBefore(enter) { + var i0, j0; + return function(d, i, j) { + var group = enter[j].update, n = group.length, node; + if (j != j0) j0 = j, i0 = 0; + if (i >= i0) i0 = i + 1; + while (!(node = group[i0]) && ++i0 < n) ; + return node; + }; + } + d3.select = function(node) { + var group; + if (typeof node === "string") { + group = [ d3_select(node, d3_document) ]; + group.parentNode = d3_document.documentElement; + } else { + group = [ node ]; + group.parentNode = d3_documentElement(node); + } + return d3_selection([ group ]); + }; + d3.selectAll = function(nodes) { + var group; + if (typeof nodes === "string") { + group = d3_array(d3_selectAll(nodes, d3_document)); + group.parentNode = d3_document.documentElement; + } else { + group = d3_array(nodes); + group.parentNode = null; + } + return d3_selection([ group ]); + }; + d3_selectionPrototype.on = function(type, listener, capture) { + var n = arguments.length; + if (n < 3) { + if (typeof type !== "string") { + if (n < 2) listener = false; + for (capture in type) this.each(d3_selection_on(capture, type[capture], listener)); + return this; + } + if (n < 2) return (n = this.node()["__on" + type]) && n._; + capture = false; + } + return this.each(d3_selection_on(type, listener, capture)); + }; + function d3_selection_on(type, listener, capture) { + var name = "__on" + type, i = type.indexOf("."), wrap = d3_selection_onListener; + if (i > 0) type = type.slice(0, i); + var filter = d3_selection_onFilters.get(type); + if (filter) type = filter, wrap = d3_selection_onFilter; + function onRemove() { + var l = this[name]; + if (l) { + this.removeEventListener(type, l, l.$); + delete this[name]; + } + } + function onAdd() { + var l = wrap(listener, d3_array(arguments)); + onRemove.call(this); + this.addEventListener(type, this[name] = l, l.$ = capture); + l._ = listener; + } + function removeAll() { + var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"), match; + for (var name in this) { + if (match = name.match(re)) { + var l = this[name]; + this.removeEventListener(match[1], l, l.$); + delete this[name]; + } + } + } + return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll; + } + var d3_selection_onFilters = d3.map({ + mouseenter: "mouseover", + mouseleave: "mouseout" + }); + if (d3_document) { + d3_selection_onFilters.forEach(function(k) { + if ("on" + k in d3_document) d3_selection_onFilters.remove(k); + }); + } + function d3_selection_onListener(listener, argumentz) { + return function(e) { + var o = d3.event; + d3.event = e; + argumentz[0] = this.__data__; + try { + listener.apply(this, argumentz); + } finally { + d3.event = o; + } + }; + } + function d3_selection_onFilter(listener, argumentz) { + var l = d3_selection_onListener(listener, argumentz); + return function(e) { + var target = this, related = e.relatedTarget; + if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) { + l.call(target, e); + } + }; + } + var d3_event_dragSelect, d3_event_dragId = 0; + function d3_event_dragSuppress(node) { + var name = ".dragsuppress-" + ++d3_event_dragId, click = "click" + name, w = d3.select(d3_window(node)).on("touchmove" + name, d3_eventPreventDefault).on("dragstart" + name, d3_eventPreventDefault).on("selectstart" + name, d3_eventPreventDefault); + if (d3_event_dragSelect == null) { + d3_event_dragSelect = "onselectstart" in node ? false : d3_vendorSymbol(node.style, "userSelect"); + } + if (d3_event_dragSelect) { + var style = d3_documentElement(node).style, select = style[d3_event_dragSelect]; + style[d3_event_dragSelect] = "none"; + } + return function(suppressClick) { + w.on(name, null); + if (d3_event_dragSelect) style[d3_event_dragSelect] = select; + if (suppressClick) { + var off = function() { + w.on(click, null); + }; + w.on(click, function() { + d3_eventPreventDefault(); + off(); + }, true); + setTimeout(off, 0); + } + }; + } + d3.mouse = function(container) { + return d3_mousePoint(container, d3_eventSource()); + }; + var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0; + function d3_mousePoint(container, e) { + if (e.changedTouches) e = e.changedTouches[0]; + var svg = container.ownerSVGElement || container; + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + if (d3_mouse_bug44083 < 0) { + var window = d3_window(container); + if (window.scrollX || window.scrollY) { + svg = d3.select("body").append("svg").style({ + position: "absolute", + top: 0, + left: 0, + margin: 0, + padding: 0, + border: "none" + }, "important"); + var ctm = svg[0][0].getScreenCTM(); + d3_mouse_bug44083 = !(ctm.f || ctm.e); + svg.remove(); + } + } + if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, + point.y = e.clientY; + point = point.matrixTransform(container.getScreenCTM().inverse()); + return [ point.x, point.y ]; + } + var rect = container.getBoundingClientRect(); + return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ]; + } + d3.touch = function(container, touches, identifier) { + if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches; + if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return d3_mousePoint(container, touch); + } + } + }; + d3.behavior.drag = function() { + var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, "mousemove", "mouseup"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, "touchmove", "touchend"); + function drag() { + this.on("mousedown.drag", mousedown).on("touchstart.drag", touchstart); + } + function dragstart(id, position, subject, move, end) { + return function() { + var that = this, target = d3.event.target.correspondingElement || d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = ".drag" + (dragId == null ? "" : "-" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId); + if (origin) { + dragOffset = origin.apply(that, arguments); + dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ]; + } else { + dragOffset = [ 0, 0 ]; + } + dispatch({ + type: "dragstart" + }); + function moved() { + var position1 = position(parent, dragId), dx, dy; + if (!position1) return; + dx = position1[0] - position0[0]; + dy = position1[1] - position0[1]; + dragged |= dx | dy; + position0 = position1; + dispatch({ + type: "drag", + x: position1[0] + dragOffset[0], + y: position1[1] + dragOffset[1], + dx: dx, + dy: dy + }); + } + function ended() { + if (!position(parent, dragId)) return; + dragSubject.on(move + dragName, null).on(end + dragName, null); + dragRestore(dragged); + dispatch({ + type: "dragend" + }); + } + }; + } + drag.origin = function(x) { + if (!arguments.length) return origin; + origin = x; + return drag; + }; + return d3.rebind(drag, event, "on"); + }; + function d3_behavior_dragTouchId() { + return d3.event.changedTouches[0].identifier; + } + d3.touches = function(container, touches) { + if (arguments.length < 2) touches = d3_eventSource().touches; + return touches ? d3_array(touches).map(function(touch) { + var point = d3_mousePoint(container, touch); + point.identifier = touch.identifier; + return point; + }) : []; + }; + var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π; + function d3_sgn(x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; + } + function d3_cross2d(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); + } + function d3_acos(x) { + return x > 1 ? 0 : x < -1 ? π : Math.acos(x); + } + function d3_asin(x) { + return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x); + } + function d3_sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; + } + function d3_cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; + } + function d3_tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); + } + function d3_haversin(x) { + return (x = Math.sin(x / 2)) * x; + } + var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4; + d3.interpolateZoom = function(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S; + if (d2 < ε2) { + S = Math.log(w1 / w0) / ρ; + i = function(t) { + return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ]; + }; + } else { + var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / ρ; + i = function(t) { + var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0)); + return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ]; + }; + } + i.duration = S * 1e3; + return i; + }; + d3.behavior.zoom = function() { + var view = { + x: 0, + y: 0, + k: 1 + }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = "mousedown.zoom", mousemove = "mousemove.zoom", mouseup = "mouseup.zoom", mousewheelTimer, touchstart = "touchstart.zoom", touchtime, event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"), x0, x1, y0, y1; + if (!d3_behavior_zoomWheel) { + d3_behavior_zoomWheel = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() { + return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1); + }, "wheel") : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() { + return d3.event.wheelDelta; + }, "mousewheel") : (d3_behavior_zoomDelta = function() { + return -d3.event.detail; + }, "MozMousePixelScroll"); + } + function zoom(g) { + g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + ".zoom", mousewheeled).on("dblclick.zoom", dblclicked).on(touchstart, touchstarted); + } + zoom.event = function(g) { + g.each(function() { + var dispatch = event.of(this, arguments), view1 = view; + if (d3_transitionInheritId) { + d3.select(this).transition().each("start.zoom", function() { + view = this.__chart__ || { + x: 0, + y: 0, + k: 1 + }; + zoomstarted(dispatch); + }).tween("zoom:zoom", function() { + var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]); + return function(t) { + var l = i(t), k = dx / l[2]; + this.__chart__ = view = { + x: cx - l[0] * k, + y: cy - l[1] * k, + k: k + }; + zoomed(dispatch); + }; + }).each("interrupt.zoom", function() { + zoomended(dispatch); + }).each("end.zoom", function() { + zoomended(dispatch); + }); + } else { + this.__chart__ = view; + zoomstarted(dispatch); + zoomed(dispatch); + zoomended(dispatch); + } + }); + }; + zoom.translate = function(_) { + if (!arguments.length) return [ view.x, view.y ]; + view = { + x: +_[0], + y: +_[1], + k: view.k + }; + rescale(); + return zoom; + }; + zoom.scale = function(_) { + if (!arguments.length) return view.k; + view = { + x: view.x, + y: view.y, + k: null + }; + scaleTo(+_); + rescale(); + return zoom; + }; + zoom.scaleExtent = function(_) { + if (!arguments.length) return scaleExtent; + scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ]; + return zoom; + }; + zoom.center = function(_) { + if (!arguments.length) return center; + center = _ && [ +_[0], +_[1] ]; + return zoom; + }; + zoom.size = function(_) { + if (!arguments.length) return size; + size = _ && [ +_[0], +_[1] ]; + return zoom; + }; + zoom.duration = function(_) { + if (!arguments.length) return duration; + duration = +_; + return zoom; + }; + zoom.x = function(z) { + if (!arguments.length) return x1; + x1 = z; + x0 = z.copy(); + view = { + x: 0, + y: 0, + k: 1 + }; + return zoom; + }; + zoom.y = function(z) { + if (!arguments.length) return y1; + y1 = z; + y0 = z.copy(); + view = { + x: 0, + y: 0, + k: 1 + }; + return zoom; + }; + function location(p) { + return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ]; + } + function point(l) { + return [ l[0] * view.k + view.x, l[1] * view.k + view.y ]; + } + function scaleTo(s) { + view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s)); + } + function translateTo(p, l) { + l = point(l); + view.x += p[0] - l[0]; + view.y += p[1] - l[1]; + } + function zoomTo(that, p, l, k) { + that.__chart__ = { + x: view.x, + y: view.y, + k: view.k + }; + scaleTo(Math.pow(2, k)); + translateTo(center0 = p, l); + that = d3.select(that); + if (duration > 0) that = that.transition().duration(duration); + that.call(zoom.event); + } + function rescale() { + if (x1) x1.domain(x0.range().map(function(x) { + return (x - view.x) / view.k; + }).map(x0.invert)); + if (y1) y1.domain(y0.range().map(function(y) { + return (y - view.y) / view.k; + }).map(y0.invert)); + } + function zoomstarted(dispatch) { + if (!zooming++) dispatch({ + type: "zoomstart" + }); + } + function zoomed(dispatch) { + rescale(); + dispatch({ + type: "zoom", + scale: view.k, + translate: [ view.x, view.y ] + }); + } + function zoomended(dispatch) { + if (!--zooming) dispatch({ + type: "zoomend" + }), center0 = null; + } + function mousedowned() { + var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that); + d3_selection_interrupt.call(that); + zoomstarted(dispatch); + function moved() { + dragged = 1; + translateTo(d3.mouse(that), location0); + zoomed(dispatch); + } + function ended() { + subject.on(mousemove, null).on(mouseup, null); + dragRestore(dragged); + zoomended(dispatch); + } + } + function touchstarted() { + var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = ".zoom-" + d3.event.changedTouches[0].identifier, touchmove = "touchmove" + zoomName, touchend = "touchend" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that); + started(); + zoomstarted(dispatch); + subject.on(mousedown, null).on(touchstart, started); + function relocate() { + var touches = d3.touches(that); + scale0 = view.k; + touches.forEach(function(t) { + if (t.identifier in locations0) locations0[t.identifier] = location(t); + }); + return touches; + } + function started() { + var target = d3.event.target; + d3.select(target).on(touchmove, moved).on(touchend, ended); + targets.push(target); + var changed = d3.event.changedTouches; + for (var i = 0, n = changed.length; i < n; ++i) { + locations0[changed[i].identifier] = null; + } + var touches = relocate(), now = Date.now(); + if (touches.length === 1) { + if (now - touchtime < 500) { + var p = touches[0]; + zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1); + d3_eventPreventDefault(); + } + touchtime = now; + } else if (touches.length > 1) { + var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1]; + distance0 = dx * dx + dy * dy; + } + } + function moved() { + var touches = d3.touches(that), p0, l0, p1, l1; + d3_selection_interrupt.call(that); + for (var i = 0, n = touches.length; i < n; ++i, l1 = null) { + p1 = touches[i]; + if (l1 = locations0[p1.identifier]) { + if (l0) break; + p0 = p1, l0 = l1; + } + } + if (l1) { + var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0); + p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ]; + l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ]; + scaleTo(scale1 * scale0); + } + touchtime = null; + translateTo(p0, l0); + zoomed(dispatch); + } + function ended() { + if (d3.event.touches.length) { + var changed = d3.event.changedTouches; + for (var i = 0, n = changed.length; i < n; ++i) { + delete locations0[changed[i].identifier]; + } + for (var identifier in locations0) { + return void relocate(); + } + } + d3.selectAll(targets).on(zoomName, null); + subject.on(mousedown, mousedowned).on(touchstart, touchstarted); + dragRestore(); + zoomended(dispatch); + } + } + function mousewheeled() { + var dispatch = event.of(this, arguments); + if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), + translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch); + mousewheelTimer = setTimeout(function() { + mousewheelTimer = null; + zoomended(dispatch); + }, 50); + d3_eventPreventDefault(); + scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k); + translateTo(center0, translate0); + zoomed(dispatch); + } + function dblclicked() { + var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2; + zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1); + } + return d3.rebind(zoom, event, "on"); + }; + var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel; + d3.color = d3_color; + function d3_color() {} + d3_color.prototype.toString = function() { + return this.rgb() + ""; + }; + d3.hsl = d3_hsl; + function d3_hsl(h, s, l) { + return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l); + } + var d3_hslPrototype = d3_hsl.prototype = new d3_color(); + d3_hslPrototype.brighter = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + return new d3_hsl(this.h, this.s, this.l / k); + }; + d3_hslPrototype.darker = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + return new d3_hsl(this.h, this.s, k * this.l); + }; + d3_hslPrototype.rgb = function() { + return d3_hsl_rgb(this.h, this.s, this.l); + }; + function d3_hsl_rgb(h, s, l) { + var m1, m2; + h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h; + s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s; + l = l < 0 ? 0 : l > 1 ? 1 : l; + m2 = l <= .5 ? l * (1 + s) : l + s - l * s; + m1 = 2 * l - m2; + function v(h) { + if (h > 360) h -= 360; else if (h < 0) h += 360; + if (h < 60) return m1 + (m2 - m1) * h / 60; + if (h < 180) return m2; + if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; + return m1; + } + function vv(h) { + return Math.round(v(h) * 255); + } + return new d3_rgb(vv(h + 120), vv(h), vv(h - 120)); + } + d3.hcl = d3_hcl; + function d3_hcl(h, c, l) { + return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l); + } + var d3_hclPrototype = d3_hcl.prototype = new d3_color(); + d3_hclPrototype.brighter = function(k) { + return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1))); + }; + d3_hclPrototype.darker = function(k) { + return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1))); + }; + d3_hclPrototype.rgb = function() { + return d3_hcl_lab(this.h, this.c, this.l).rgb(); + }; + function d3_hcl_lab(h, c, l) { + if (isNaN(h)) h = 0; + if (isNaN(c)) c = 0; + return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c); + } + d3.lab = d3_lab; + function d3_lab(l, a, b) { + return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b); + } + var d3_lab_K = 18; + var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883; + var d3_labPrototype = d3_lab.prototype = new d3_color(); + d3_labPrototype.brighter = function(k) { + return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); + }; + d3_labPrototype.darker = function(k) { + return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); + }; + d3_labPrototype.rgb = function() { + return d3_lab_rgb(this.l, this.a, this.b); + }; + function d3_lab_rgb(l, a, b) { + var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200; + x = d3_lab_xyz(x) * d3_lab_X; + y = d3_lab_xyz(y) * d3_lab_Y; + z = d3_lab_xyz(z) * d3_lab_Z; + return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z)); + } + function d3_lab_hcl(l, a, b) { + return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l); + } + function d3_lab_xyz(x) { + return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037; + } + function d3_xyz_lab(x) { + return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29; + } + function d3_xyz_rgb(r) { + return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055)); + } + d3.rgb = d3_rgb; + function d3_rgb(r, g, b) { + return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b); + } + function d3_rgbNumber(value) { + return new d3_rgb(value >> 16, value >> 8 & 255, value & 255); + } + function d3_rgbString(value) { + return d3_rgbNumber(value) + ""; + } + var d3_rgbPrototype = d3_rgb.prototype = new d3_color(); + d3_rgbPrototype.brighter = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + var r = this.r, g = this.g, b = this.b, i = 30; + if (!r && !g && !b) return new d3_rgb(i, i, i); + if (r && r < i) r = i; + if (g && g < i) g = i; + if (b && b < i) b = i; + return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k)); + }; + d3_rgbPrototype.darker = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + return new d3_rgb(k * this.r, k * this.g, k * this.b); + }; + d3_rgbPrototype.hsl = function() { + return d3_rgb_hsl(this.r, this.g, this.b); + }; + d3_rgbPrototype.toString = function() { + return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); + }; + function d3_rgb_hex(v) { + return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16); + } + function d3_rgb_parse(format, rgb, hsl) { + var r = 0, g = 0, b = 0, m1, m2, color; + m1 = /([a-z]+)\((.*)\)/.exec(format = format.toLowerCase()); + if (m1) { + m2 = m1[2].split(","); + switch (m1[1]) { + case "hsl": + { + return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100); + } + + case "rgb": + { + return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2])); + } + } + } + if (color = d3_rgb_names.get(format)) { + return rgb(color.r, color.g, color.b); + } + if (format != null && format.charAt(0) === "#" && !isNaN(color = parseInt(format.slice(1), 16))) { + if (format.length === 4) { + r = (color & 3840) >> 4; + r = r >> 4 | r; + g = color & 240; + g = g >> 4 | g; + b = color & 15; + b = b << 4 | b; + } else if (format.length === 7) { + r = (color & 16711680) >> 16; + g = (color & 65280) >> 8; + b = color & 255; + } + } + return rgb(r, g, b); + } + function d3_rgb_hsl(r, g, b) { + var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2; + if (d) { + s = l < .5 ? d / (max + min) : d / (2 - max - min); + if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4; + h *= 60; + } else { + h = NaN; + s = l > 0 && l < 1 ? 0 : h; + } + return new d3_hsl(h, s, l); + } + function d3_rgb_lab(r, g, b) { + r = d3_rgb_xyz(r); + g = d3_rgb_xyz(g); + b = d3_rgb_xyz(b); + var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z); + return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z)); + } + function d3_rgb_xyz(r) { + return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4); + } + function d3_rgb_parseNumber(c) { + var f = parseFloat(c); + return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; + } + var d3_rgb_names = d3.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 + }); + d3_rgb_names.forEach(function(key, value) { + d3_rgb_names.set(key, d3_rgbNumber(value)); + }); + function d3_functor(v) { + return typeof v === "function" ? v : function() { + return v; + }; + } + d3.functor = d3_functor; + d3.xhr = d3_xhrType(d3_identity); + function d3_xhrType(response) { + return function(url, mimeType, callback) { + if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, + mimeType = null; + return d3_xhr(url, mimeType, response, callback); + }; + } + function d3_xhr(url, mimeType, response, callback) { + var xhr = {}, dispatch = d3.dispatch("beforesend", "progress", "load", "error"), headers = {}, request = new XMLHttpRequest(), responseType = null; + if (this.XDomainRequest && !("withCredentials" in request) && /^(http(s)?:)?\/\//.test(url)) request = new XDomainRequest(); + "onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() { + request.readyState > 3 && respond(); + }; + function respond() { + var status = request.status, result; + if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) { + try { + result = response.call(xhr, request); + } catch (e) { + dispatch.error.call(xhr, e); + return; + } + dispatch.load.call(xhr, result); + } else { + dispatch.error.call(xhr, request); + } + } + request.onprogress = function(event) { + var o = d3.event; + d3.event = event; + try { + dispatch.progress.call(xhr, request); + } finally { + d3.event = o; + } + }; + xhr.header = function(name, value) { + name = (name + "").toLowerCase(); + if (arguments.length < 2) return headers[name]; + if (value == null) delete headers[name]; else headers[name] = value + ""; + return xhr; + }; + xhr.mimeType = function(value) { + if (!arguments.length) return mimeType; + mimeType = value == null ? null : value + ""; + return xhr; + }; + xhr.responseType = function(value) { + if (!arguments.length) return responseType; + responseType = value; + return xhr; + }; + xhr.response = function(value) { + response = value; + return xhr; + }; + [ "get", "post" ].forEach(function(method) { + xhr[method] = function() { + return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments))); + }; + }); + xhr.send = function(method, data, callback) { + if (arguments.length === 2 && typeof data === "function") callback = data, data = null; + request.open(method, url, true); + if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*"; + if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]); + if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType); + if (responseType != null) request.responseType = responseType; + if (callback != null) xhr.on("error", callback).on("load", function(request) { + callback(null, request); + }); + dispatch.beforesend.call(xhr, request); + request.send(data == null ? null : data); + return xhr; + }; + xhr.abort = function() { + request.abort(); + return xhr; + }; + d3.rebind(xhr, dispatch, "on"); + return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback)); + } + function d3_xhr_fixCallback(callback) { + return callback.length === 1 ? function(error, request) { + callback(error == null ? request : null); + } : callback; + } + function d3_xhrHasResponse(request) { + var type = request.responseType; + return type && type !== "text" ? request.response : request.responseText; + } + d3.dsv = function(delimiter, mimeType) { + var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0); + function dsv(url, row, callback) { + if (arguments.length < 3) callback = row, row = null; + var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback); + xhr.row = function(_) { + return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row; + }; + return xhr; + } + function response(request) { + return dsv.parse(request.responseText); + } + function typedResponse(f) { + return function(request) { + return dsv.parse(request.responseText, f); + }; + } + dsv.parse = function(text, f) { + var o; + return dsv.parseRows(text, function(row, i) { + if (o) return o(row, i - 1); + var a = new Function("d", "return {" + row.map(function(name, i) { + return JSON.stringify(name) + ": d[" + i + "]"; + }).join(",") + "}"); + o = f ? function(row, i) { + return f(a(row), i); + } : a; + }); + }; + dsv.parseRows = function(text, f) { + var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol; + function token() { + if (I >= N) return EOF; + if (eol) return eol = false, EOL; + var j = I; + if (text.charCodeAt(j) === 34) { + var i = j; + while (i++ < N) { + if (text.charCodeAt(i) === 34) { + if (text.charCodeAt(i + 1) !== 34) break; + ++i; + } + } + I = i + 2; + var c = text.charCodeAt(i + 1); + if (c === 13) { + eol = true; + if (text.charCodeAt(i + 2) === 10) ++I; + } else if (c === 10) { + eol = true; + } + return text.slice(j + 1, i).replace(/""/g, '"'); + } + while (I < N) { + var c = text.charCodeAt(I++), k = 1; + if (c === 10) eol = true; else if (c === 13) { + eol = true; + if (text.charCodeAt(I) === 10) ++I, ++k; + } else if (c !== delimiterCode) continue; + return text.slice(j, I - k); + } + return text.slice(j); + } + while ((t = token()) !== EOF) { + var a = []; + while (t !== EOL && t !== EOF) { + a.push(t); + t = token(); + } + if (f && (a = f(a, n++)) == null) continue; + rows.push(a); + } + return rows; + }; + dsv.format = function(rows) { + if (Array.isArray(rows[0])) return dsv.formatRows(rows); + var fieldSet = new d3_Set(), fields = []; + rows.forEach(function(row) { + for (var field in row) { + if (!fieldSet.has(field)) { + fields.push(fieldSet.add(field)); + } + } + }); + return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) { + return fields.map(function(field) { + return formatValue(row[field]); + }).join(delimiter); + })).join("\n"); + }; + dsv.formatRows = function(rows) { + return rows.map(formatRow).join("\n"); + }; + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + function formatValue(text) { + return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text; + } + return dsv; + }; + d3.csv = d3.dsv(",", "text/csv"); + d3.tsv = d3.dsv(" ", "text/tab-separated-values"); + var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, "requestAnimationFrame")] || function(callback) { + setTimeout(callback, 17); + }; + d3.timer = function() { + d3_timer.apply(this, arguments); + }; + function d3_timer(callback, delay, then) { + var n = arguments.length; + if (n < 2) delay = 0; + if (n < 3) then = Date.now(); + var time = then + delay, timer = { + c: callback, + t: time, + n: null + }; + if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer; + d3_timer_queueTail = timer; + if (!d3_timer_interval) { + d3_timer_timeout = clearTimeout(d3_timer_timeout); + d3_timer_interval = 1; + d3_timer_frame(d3_timer_step); + } + return timer; + } + function d3_timer_step() { + var now = d3_timer_mark(), delay = d3_timer_sweep() - now; + if (delay > 24) { + if (isFinite(delay)) { + clearTimeout(d3_timer_timeout); + d3_timer_timeout = setTimeout(d3_timer_step, delay); + } + d3_timer_interval = 0; + } else { + d3_timer_interval = 1; + d3_timer_frame(d3_timer_step); + } + } + d3.timer.flush = function() { + d3_timer_mark(); + d3_timer_sweep(); + }; + function d3_timer_mark() { + var now = Date.now(), timer = d3_timer_queueHead; + while (timer) { + if (now >= timer.t && timer.c(now - timer.t)) timer.c = null; + timer = timer.n; + } + return now; + } + function d3_timer_sweep() { + var t0, t1 = d3_timer_queueHead, time = Infinity; + while (t1) { + if (t1.c) { + if (t1.t < time) time = t1.t; + t1 = (t0 = t1).n; + } else { + t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n; + } + } + d3_timer_queueTail = t0; + return time; + } + function d3_format_precision(x, p) { + return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1); + } + d3.round = function(x, n) { + return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x); + }; + var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix); + d3.formatPrefix = function(value, precision) { + var i = 0; + if (value = +value) { + if (value < 0) value *= -1; + if (precision) value = d3.round(value, d3_format_precision(value, precision)); + i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10); + i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3)); + } + return d3_formatPrefixes[8 + i / 3]; + }; + function d3_formatPrefix(d, i) { + var k = Math.pow(10, abs(8 - i) * 3); + return { + scale: i > 8 ? function(d) { + return d / k; + } : function(d) { + return d * k; + }, + symbol: d + }; + } + function d3_locale_numberFormat(locale) { + var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) { + var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0; + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = locale_grouping[j = (j + 1) % locale_grouping.length]; + } + return t.reverse().join(locale_thousands); + } : d3_identity; + return function(specifier) { + var match = d3_format_re.exec(specifier), fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "-", symbol = match[4] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = "", suffix = "", integer = false, exponent = true; + if (precision) precision = +precision.substring(1); + if (zfill || fill === "0" && align === "=") { + zfill = fill = "0"; + align = "="; + } + switch (type) { + case "n": + comma = true; + type = "g"; + break; + + case "%": + scale = 100; + suffix = "%"; + type = "f"; + break; + + case "p": + scale = 100; + suffix = "%"; + type = "r"; + break; + + case "b": + case "o": + case "x": + case "X": + if (symbol === "#") prefix = "0" + type.toLowerCase(); + + case "c": + exponent = false; + + case "d": + integer = true; + precision = 0; + break; + + case "s": + scale = -1; + type = "r"; + break; + } + if (symbol === "$") prefix = locale_currency[0], suffix = locale_currency[1]; + if (type == "r" && !precision) type = "g"; + if (precision != null) { + if (type == "g") precision = Math.max(1, Math.min(21, precision)); else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision)); + } + type = d3_format_types.get(type) || d3_format_typeDefault; + var zcomma = zfill && comma; + return function(value) { + var fullSuffix = suffix; + if (integer && value % 1) return ""; + var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign === "-" ? "" : sign; + if (scale < 0) { + var unit = d3.formatPrefix(value, precision); + value = unit.scale(value); + fullSuffix = unit.symbol + suffix; + } else { + value *= scale; + } + value = type(value, precision); + var i = value.lastIndexOf("."), before, after; + if (i < 0) { + var j = exponent ? value.lastIndexOf("e") : -1; + if (j < 0) before = value, after = ""; else before = value.substring(0, j), after = value.substring(j); + } else { + before = value.substring(0, i); + after = locale_decimal + value.substring(i + 1); + } + if (!zfill && comma) before = formatGroup(before, Infinity); + var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : ""; + if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity); + negative += prefix; + value = before + after; + return (align === "<" ? negative + value + padding : align === ">" ? padding + negative + value : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix; + }; + }; + } + var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i; + var d3_format_types = d3.map({ + b: function(x) { + return x.toString(2); + }, + c: function(x) { + return String.fromCharCode(x); + }, + o: function(x) { + return x.toString(8); + }, + x: function(x) { + return x.toString(16); + }, + X: function(x) { + return x.toString(16).toUpperCase(); + }, + g: function(x, p) { + return x.toPrecision(p); + }, + e: function(x, p) { + return x.toExponential(p); + }, + f: function(x, p) { + return x.toFixed(p); + }, + r: function(x, p) { + return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p)))); + } + }); + function d3_format_typeDefault(x) { + return x + ""; + } + var d3_time = d3.time = {}, d3_date = Date; + function d3_date_utc() { + this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]); + } + d3_date_utc.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() { + d3_time_prototype.setUTCDate.apply(this._, arguments); + }, + setDay: function() { + d3_time_prototype.setUTCDay.apply(this._, arguments); + }, + setFullYear: function() { + d3_time_prototype.setUTCFullYear.apply(this._, arguments); + }, + setHours: function() { + d3_time_prototype.setUTCHours.apply(this._, arguments); + }, + setMilliseconds: function() { + d3_time_prototype.setUTCMilliseconds.apply(this._, arguments); + }, + setMinutes: function() { + d3_time_prototype.setUTCMinutes.apply(this._, arguments); + }, + setMonth: function() { + d3_time_prototype.setUTCMonth.apply(this._, arguments); + }, + setSeconds: function() { + d3_time_prototype.setUTCSeconds.apply(this._, arguments); + }, + setTime: function() { + d3_time_prototype.setTime.apply(this._, arguments); + } + }; + var d3_time_prototype = Date.prototype; + function d3_time_interval(local, step, number) { + function round(date) { + var d0 = local(date), d1 = offset(d0, 1); + return date - d0 < d1 - date ? d0 : d1; + } + function ceil(date) { + step(date = local(new d3_date(date - 1)), 1); + return date; + } + function offset(date, k) { + step(date = new d3_date(+date), k); + return date; + } + function range(t0, t1, dt) { + var time = ceil(t0), times = []; + if (dt > 1) { + while (time < t1) { + if (!(number(time) % dt)) times.push(new Date(+time)); + step(time, 1); + } + } else { + while (time < t1) times.push(new Date(+time)), step(time, 1); + } + return times; + } + function range_utc(t0, t1, dt) { + try { + d3_date = d3_date_utc; + var utc = new d3_date_utc(); + utc._ = t0; + return range(utc, t1, dt); + } finally { + d3_date = Date; + } + } + local.floor = local; + local.round = round; + local.ceil = ceil; + local.offset = offset; + local.range = range; + var utc = local.utc = d3_time_interval_utc(local); + utc.floor = utc; + utc.round = d3_time_interval_utc(round); + utc.ceil = d3_time_interval_utc(ceil); + utc.offset = d3_time_interval_utc(offset); + utc.range = range_utc; + return local; + } + function d3_time_interval_utc(method) { + return function(date, k) { + try { + d3_date = d3_date_utc; + var utc = new d3_date_utc(); + utc._ = date; + return method(utc, k)._; + } finally { + d3_date = Date; + } + }; + } + d3_time.year = d3_time_interval(function(date) { + date = d3_time.day(date); + date.setMonth(0, 1); + return date; + }, function(date, offset) { + date.setFullYear(date.getFullYear() + offset); + }, function(date) { + return date.getFullYear(); + }); + d3_time.years = d3_time.year.range; + d3_time.years.utc = d3_time.year.utc.range; + d3_time.day = d3_time_interval(function(date) { + var day = new d3_date(2e3, 0); + day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate()); + return day; + }, function(date, offset) { + date.setDate(date.getDate() + offset); + }, function(date) { + return date.getDate() - 1; + }); + d3_time.days = d3_time.day.range; + d3_time.days.utc = d3_time.day.utc.range; + d3_time.dayOfYear = function(date) { + var year = d3_time.year(date); + return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5); + }; + [ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ].forEach(function(day, i) { + i = 7 - i; + var interval = d3_time[day] = d3_time_interval(function(date) { + (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7); + return date; + }, function(date, offset) { + date.setDate(date.getDate() + Math.floor(offset) * 7); + }, function(date) { + var day = d3_time.year(date).getDay(); + return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i); + }); + d3_time[day + "s"] = interval.range; + d3_time[day + "s"].utc = interval.utc.range; + d3_time[day + "OfYear"] = function(date) { + var day = d3_time.year(date).getDay(); + return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7); + }; + }); + d3_time.week = d3_time.sunday; + d3_time.weeks = d3_time.sunday.range; + d3_time.weeks.utc = d3_time.sunday.utc.range; + d3_time.weekOfYear = d3_time.sundayOfYear; + function d3_locale_timeFormat(locale) { + var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths; + function d3_time_format(template) { + var n = template.length; + function format(date) { + var string = [], i = -1, j = 0, c, p, f; + while (++i < n) { + if (template.charCodeAt(i) === 37) { + string.push(template.slice(j, i)); + if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i); + if (f = d3_time_formats[c]) c = f(date, p == null ? c === "e" ? " " : "0" : p); + string.push(c); + j = i + 1; + } + } + string.push(template.slice(j, i)); + return string.join(""); + } + format.parse = function(string) { + var d = { + y: 1900, + m: 0, + d: 1, + H: 0, + M: 0, + S: 0, + L: 0, + Z: null + }, i = d3_time_parse(d, template, string, 0); + if (i != string.length) return null; + if ("p" in d) d.H = d.H % 12 + d.p * 12; + var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)(); + if ("j" in d) date.setFullYear(d.y, 0, d.j); else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "W" in d ? 1 : 0; + date.setFullYear(d.y, 0, 1); + date.setFullYear(d.y, 0, "W" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7); + } else date.setFullYear(d.y, d.m, d.d); + date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L); + return localZ ? date._ : date; + }; + format.toString = function() { + return template; + }; + return format; + } + function d3_time_parse(date, template, string, j) { + var c, p, t, i = 0, n = template.length, m = string.length; + while (i < n) { + if (j >= m) return -1; + c = template.charCodeAt(i++); + if (c === 37) { + t = template.charAt(i++); + p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t]; + if (!p || (j = p(date, string, j)) < 0) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + return j; + } + d3_time_format.utc = function(template) { + var local = d3_time_format(template); + function format(date) { + try { + d3_date = d3_date_utc; + var utc = new d3_date(); + utc._ = date; + return local(utc); + } finally { + d3_date = Date; + } + } + format.parse = function(string) { + try { + d3_date = d3_date_utc; + var date = local.parse(string); + return date && date._; + } finally { + d3_date = Date; + } + }; + format.toString = local.toString; + return format; + }; + d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti; + var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths); + locale_periods.forEach(function(p, i) { + d3_time_periodLookup.set(p.toLowerCase(), i); + }); + var d3_time_formats = { + a: function(d) { + return locale_shortDays[d.getDay()]; + }, + A: function(d) { + return locale_days[d.getDay()]; + }, + b: function(d) { + return locale_shortMonths[d.getMonth()]; + }, + B: function(d) { + return locale_months[d.getMonth()]; + }, + c: d3_time_format(locale_dateTime), + d: function(d, p) { + return d3_time_formatPad(d.getDate(), p, 2); + }, + e: function(d, p) { + return d3_time_formatPad(d.getDate(), p, 2); + }, + H: function(d, p) { + return d3_time_formatPad(d.getHours(), p, 2); + }, + I: function(d, p) { + return d3_time_formatPad(d.getHours() % 12 || 12, p, 2); + }, + j: function(d, p) { + return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3); + }, + L: function(d, p) { + return d3_time_formatPad(d.getMilliseconds(), p, 3); + }, + m: function(d, p) { + return d3_time_formatPad(d.getMonth() + 1, p, 2); + }, + M: function(d, p) { + return d3_time_formatPad(d.getMinutes(), p, 2); + }, + p: function(d) { + return locale_periods[+(d.getHours() >= 12)]; + }, + S: function(d, p) { + return d3_time_formatPad(d.getSeconds(), p, 2); + }, + U: function(d, p) { + return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2); + }, + w: function(d) { + return d.getDay(); + }, + W: function(d, p) { + return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2); + }, + x: d3_time_format(locale_date), + X: d3_time_format(locale_time), + y: function(d, p) { + return d3_time_formatPad(d.getFullYear() % 100, p, 2); + }, + Y: function(d, p) { + return d3_time_formatPad(d.getFullYear() % 1e4, p, 4); + }, + Z: d3_time_zone, + "%": function() { + return "%"; + } + }; + var d3_time_parsers = { + a: d3_time_parseWeekdayAbbrev, + A: d3_time_parseWeekday, + b: d3_time_parseMonthAbbrev, + B: d3_time_parseMonth, + c: d3_time_parseLocaleFull, + d: d3_time_parseDay, + e: d3_time_parseDay, + H: d3_time_parseHour24, + I: d3_time_parseHour24, + j: d3_time_parseDayOfYear, + L: d3_time_parseMilliseconds, + m: d3_time_parseMonthNumber, + M: d3_time_parseMinutes, + p: d3_time_parseAmPm, + S: d3_time_parseSeconds, + U: d3_time_parseWeekNumberSunday, + w: d3_time_parseWeekdayNumber, + W: d3_time_parseWeekNumberMonday, + x: d3_time_parseLocaleDate, + X: d3_time_parseLocaleTime, + y: d3_time_parseYear, + Y: d3_time_parseFullYear, + Z: d3_time_parseZone, + "%": d3_time_parseLiteralPercent + }; + function d3_time_parseWeekdayAbbrev(date, string, i) { + d3_time_dayAbbrevRe.lastIndex = 0; + var n = d3_time_dayAbbrevRe.exec(string.slice(i)); + return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseWeekday(date, string, i) { + d3_time_dayRe.lastIndex = 0; + var n = d3_time_dayRe.exec(string.slice(i)); + return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseMonthAbbrev(date, string, i) { + d3_time_monthAbbrevRe.lastIndex = 0; + var n = d3_time_monthAbbrevRe.exec(string.slice(i)); + return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseMonth(date, string, i) { + d3_time_monthRe.lastIndex = 0; + var n = d3_time_monthRe.exec(string.slice(i)); + return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseLocaleFull(date, string, i) { + return d3_time_parse(date, d3_time_formats.c.toString(), string, i); + } + function d3_time_parseLocaleDate(date, string, i) { + return d3_time_parse(date, d3_time_formats.x.toString(), string, i); + } + function d3_time_parseLocaleTime(date, string, i) { + return d3_time_parse(date, d3_time_formats.X.toString(), string, i); + } + function d3_time_parseAmPm(date, string, i) { + var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase()); + return n == null ? -1 : (date.p = n, i); + } + return d3_time_format; + } + var d3_time_formatPads = { + "-": "", + _: " ", + "0": "0" + }, d3_time_numberRe = /^\s*\d+/, d3_time_percentRe = /^%/; + function d3_time_formatPad(value, fill, width) { + var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); + } + function d3_time_formatRe(names) { + return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i"); + } + function d3_time_formatLookup(names) { + var map = new d3_Map(), i = -1, n = names.length; + while (++i < n) map.set(names[i].toLowerCase(), i); + return map; + } + function d3_time_parseWeekdayNumber(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 1)); + return n ? (date.w = +n[0], i + n[0].length) : -1; + } + function d3_time_parseWeekNumberSunday(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i)); + return n ? (date.U = +n[0], i + n[0].length) : -1; + } + function d3_time_parseWeekNumberMonday(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i)); + return n ? (date.W = +n[0], i + n[0].length) : -1; + } + function d3_time_parseFullYear(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 4)); + return n ? (date.y = +n[0], i + n[0].length) : -1; + } + function d3_time_parseYear(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1; + } + function d3_time_parseZone(date, string, i) { + return /^[+-]\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, + i + 5) : -1; + } + function d3_time_expandYear(d) { + return d + (d > 68 ? 1900 : 2e3); + } + function d3_time_parseMonthNumber(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.m = n[0] - 1, i + n[0].length) : -1; + } + function d3_time_parseDay(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.d = +n[0], i + n[0].length) : -1; + } + function d3_time_parseDayOfYear(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 3)); + return n ? (date.j = +n[0], i + n[0].length) : -1; + } + function d3_time_parseHour24(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.H = +n[0], i + n[0].length) : -1; + } + function d3_time_parseMinutes(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.M = +n[0], i + n[0].length) : -1; + } + function d3_time_parseSeconds(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 2)); + return n ? (date.S = +n[0], i + n[0].length) : -1; + } + function d3_time_parseMilliseconds(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.slice(i, i + 3)); + return n ? (date.L = +n[0], i + n[0].length) : -1; + } + function d3_time_zone(d) { + var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = abs(z) / 60 | 0, zm = abs(z) % 60; + return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2); + } + function d3_time_parseLiteralPercent(date, string, i) { + d3_time_percentRe.lastIndex = 0; + var n = d3_time_percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; + } + function d3_time_formatMulti(formats) { + var n = formats.length, i = -1; + while (++i < n) formats[i][0] = this(formats[i][0]); + return function(date) { + var i = 0, f = formats[i]; + while (!f[1](date)) f = formats[++i]; + return f[0](date); + }; + } + d3.locale = function(locale) { + return { + numberFormat: d3_locale_numberFormat(locale), + timeFormat: d3_locale_timeFormat(locale) + }; + }; + var d3_locale_enUS = d3.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" ] + }); + d3.format = d3_locale_enUS.numberFormat; + d3.geo = {}; + function d3_adder() {} + d3_adder.prototype = { + s: 0, + t: 0, + add: function(y) { + d3_adderSum(y, this.t, d3_adderTemp); + d3_adderSum(d3_adderTemp.s, this.s, this); + if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t; + }, + reset: function() { + this.s = this.t = 0; + }, + valueOf: function() { + return this.s; + } + }; + var d3_adderTemp = new d3_adder(); + function d3_adderSum(a, b, o) { + var x = o.s = a + b, bv = x - a, av = x - bv; + o.t = a - av + (b - bv); + } + d3.geo.stream = function(object, listener) { + if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) { + d3_geo_streamObjectType[object.type](object, listener); + } else { + d3_geo_streamGeometry(object, listener); + } + }; + function d3_geo_streamGeometry(geometry, listener) { + if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) { + d3_geo_streamGeometryType[geometry.type](geometry, listener); + } + } + var d3_geo_streamObjectType = { + Feature: function(feature, listener) { + d3_geo_streamGeometry(feature.geometry, listener); + }, + FeatureCollection: function(object, listener) { + var features = object.features, i = -1, n = features.length; + while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener); + } + }; + var d3_geo_streamGeometryType = { + Sphere: function(object, listener) { + listener.sphere(); + }, + Point: function(object, listener) { + object = object.coordinates; + listener.point(object[0], object[1], object[2]); + }, + MultiPoint: function(object, listener) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]); + }, + LineString: function(object, listener) { + d3_geo_streamLine(object.coordinates, listener, 0); + }, + MultiLineString: function(object, listener) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0); + }, + Polygon: function(object, listener) { + d3_geo_streamPolygon(object.coordinates, listener); + }, + MultiPolygon: function(object, listener) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) d3_geo_streamPolygon(coordinates[i], listener); + }, + GeometryCollection: function(object, listener) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) d3_geo_streamGeometry(geometries[i], listener); + } + }; + function d3_geo_streamLine(coordinates, listener, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + listener.lineStart(); + while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]); + listener.lineEnd(); + } + function d3_geo_streamPolygon(coordinates, listener) { + var i = -1, n = coordinates.length; + listener.polygonStart(); + while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1); + listener.polygonEnd(); + } + d3.geo.area = function(object) { + d3_geo_areaSum = 0; + d3.geo.stream(object, d3_geo_area); + return d3_geo_areaSum; + }; + var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder(); + var d3_geo_area = { + sphere: function() { + d3_geo_areaSum += 4 * π; + }, + point: d3_noop, + lineStart: d3_noop, + lineEnd: d3_noop, + polygonStart: function() { + d3_geo_areaRingSum.reset(); + d3_geo_area.lineStart = d3_geo_areaRingStart; + }, + polygonEnd: function() { + var area = 2 * d3_geo_areaRingSum; + d3_geo_areaSum += area < 0 ? 4 * π + area : area; + d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop; + } + }; + function d3_geo_areaRingStart() { + var λ00, φ00, λ0, cosφ0, sinφ0; + d3_geo_area.point = function(λ, φ) { + d3_geo_area.point = nextPoint; + λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), + sinφ0 = Math.sin(φ); + }; + function nextPoint(λ, φ) { + λ *= d3_radians; + φ = φ * d3_radians / 2 + π / 4; + var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ); + d3_geo_areaRingSum.add(Math.atan2(v, u)); + λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ; + } + d3_geo_area.lineEnd = function() { + nextPoint(λ00, φ00); + }; + } + function d3_geo_cartesian(spherical) { + var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ); + return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ]; + } + function d3_geo_cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + function d3_geo_cartesianCross(a, b) { + return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ]; + } + function d3_geo_cartesianAdd(a, b) { + a[0] += b[0]; + a[1] += b[1]; + a[2] += b[2]; + } + function d3_geo_cartesianScale(vector, k) { + return [ vector[0] * k, vector[1] * k, vector[2] * k ]; + } + function d3_geo_cartesianNormalize(d) { + var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l; + d[1] /= l; + d[2] /= l; + } + function d3_geo_spherical(cartesian) { + return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ]; + } + function d3_geo_sphericalEqual(a, b) { + return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε; + } + d3.geo.bounds = function() { + var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range; + var bound = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + bound.point = ringPoint; + bound.lineStart = ringStart; + bound.lineEnd = ringEnd; + dλSum = 0; + d3_geo_area.polygonStart(); + }, + polygonEnd: function() { + d3_geo_area.polygonEnd(); + bound.point = point; + bound.lineStart = lineStart; + bound.lineEnd = lineEnd; + if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90; + range[0] = λ0, range[1] = λ1; + } + }; + function point(λ, φ) { + ranges.push(range = [ λ0 = λ, λ1 = λ ]); + if (φ < φ0) φ0 = φ; + if (φ > φ1) φ1 = φ; + } + function linePoint(λ, φ) { + var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]); + if (p0) { + var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal); + d3_geo_cartesianNormalize(inflection); + inflection = d3_geo_spherical(inflection); + var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180; + if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) { + var φi = inflection[1] * d3_degrees; + if (φi > φ1) φ1 = φi; + } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) { + var φi = -inflection[1] * d3_degrees; + if (φi < φ0) φ0 = φi; + } else { + if (φ < φ0) φ0 = φ; + if (φ > φ1) φ1 = φ; + } + if (antimeridian) { + if (λ < λ_) { + if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ; + } else { + if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ; + } + } else { + if (λ1 >= λ0) { + if (λ < λ0) λ0 = λ; + if (λ > λ1) λ1 = λ; + } else { + if (λ > λ_) { + if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ; + } else { + if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ; + } + } + } + } else { + point(λ, φ); + } + p0 = p, λ_ = λ; + } + function lineStart() { + bound.point = linePoint; + } + function lineEnd() { + range[0] = λ0, range[1] = λ1; + bound.point = point; + p0 = null; + } + function ringPoint(λ, φ) { + if (p0) { + var dλ = λ - λ_; + dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ; + } else λ__ = λ, φ__ = φ; + d3_geo_area.point(λ, φ); + linePoint(λ, φ); + } + function ringStart() { + d3_geo_area.lineStart(); + } + function ringEnd() { + ringPoint(λ__, φ__); + d3_geo_area.lineEnd(); + if (abs(dλSum) > ε) λ0 = -(λ1 = 180); + range[0] = λ0, range[1] = λ1; + p0 = null; + } + function angle(λ0, λ1) { + return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1; + } + function compareRanges(a, b) { + return a[0] - b[0]; + } + function withinRange(x, range) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; + } + return function(feature) { + φ1 = λ1 = -(λ0 = φ0 = Infinity); + ranges = []; + d3.geo.stream(feature, bound); + var n = ranges.length; + if (n) { + ranges.sort(compareRanges); + for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) { + b = ranges[i]; + if (withinRange(b[0], a) || withinRange(b[1], a)) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + var best = -Infinity, dλ; + for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) { + b = merged[i]; + if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1]; + } + } + ranges = range = null; + return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ]; + }; + }(); + d3.geo.centroid = function(object) { + d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0; + d3.geo.stream(object, d3_geo_centroid); + var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z; + if (m < ε2) { + x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1; + if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0; + m = x * x + y * y + z * z; + if (m < ε2) return [ NaN, NaN ]; + } + return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ]; + }; + var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2; + var d3_geo_centroid = { + sphere: d3_noop, + point: d3_geo_centroidPoint, + lineStart: d3_geo_centroidLineStart, + lineEnd: d3_geo_centroidLineEnd, + polygonStart: function() { + d3_geo_centroid.lineStart = d3_geo_centroidRingStart; + }, + polygonEnd: function() { + d3_geo_centroid.lineStart = d3_geo_centroidLineStart; + } + }; + function d3_geo_centroidPoint(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians); + d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ)); + } + function d3_geo_centroidPointXYZ(x, y, z) { + ++d3_geo_centroidW0; + d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0; + d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0; + d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0; + } + function d3_geo_centroidLineStart() { + var x0, y0, z0; + d3_geo_centroid.point = function(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians); + x0 = cosφ * Math.cos(λ); + y0 = cosφ * Math.sin(λ); + z0 = Math.sin(φ); + d3_geo_centroid.point = nextPoint; + d3_geo_centroidPointXYZ(x0, y0, z0); + }; + function nextPoint(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + d3_geo_centroidW1 += w; + d3_geo_centroidX1 += w * (x0 + (x0 = x)); + d3_geo_centroidY1 += w * (y0 + (y0 = y)); + d3_geo_centroidZ1 += w * (z0 + (z0 = z)); + d3_geo_centroidPointXYZ(x0, y0, z0); + } + } + function d3_geo_centroidLineEnd() { + d3_geo_centroid.point = d3_geo_centroidPoint; + } + function d3_geo_centroidRingStart() { + var λ00, φ00, x0, y0, z0; + d3_geo_centroid.point = function(λ, φ) { + λ00 = λ, φ00 = φ; + d3_geo_centroid.point = nextPoint; + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians); + x0 = cosφ * Math.cos(λ); + y0 = cosφ * Math.sin(λ); + z0 = Math.sin(φ); + d3_geo_centroidPointXYZ(x0, y0, z0); + }; + d3_geo_centroid.lineEnd = function() { + nextPoint(λ00, φ00); + d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd; + d3_geo_centroid.point = d3_geo_centroidPoint; + }; + function nextPoint(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u); + d3_geo_centroidX2 += v * cx; + d3_geo_centroidY2 += v * cy; + d3_geo_centroidZ2 += v * cz; + d3_geo_centroidW1 += w; + d3_geo_centroidX1 += w * (x0 + (x0 = x)); + d3_geo_centroidY1 += w * (y0 + (y0 = y)); + d3_geo_centroidZ1 += w * (z0 + (z0 = z)); + d3_geo_centroidPointXYZ(x0, y0, z0); + } + } + function d3_geo_compose(a, b) { + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + if (a.invert && b.invert) compose.invert = function(x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + return compose; + } + function d3_true() { + return true; + } + function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) { + var subject = [], clip = []; + segments.forEach(function(segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n]; + if (d3_geo_sphericalEqual(p0, p1)) { + listener.lineStart(); + for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]); + listener.lineEnd(); + return; + } + var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false); + a.o = b; + subject.push(a); + clip.push(b); + a = new d3_geo_clipPolygonIntersection(p1, segment, null, false); + b = new d3_geo_clipPolygonIntersection(p1, null, a, true); + a.o = b; + subject.push(a); + clip.push(b); + }); + clip.sort(compare); + d3_geo_clipPolygonLinkCircular(subject); + d3_geo_clipPolygonLinkCircular(clip); + if (!subject.length) return; + for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) { + clip[i].e = entry = !entry; + } + var start = subject[0], points, point; + while (1) { + var current = start, isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + listener.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, listener); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, listener); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + listener.lineEnd(); + } + } + function d3_geo_clipPolygonLinkCircular(array) { + if (!(n = array.length)) return; + var n, i = 0, a = array[0], b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; + } + function d3_geo_clipPolygonIntersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; + this.e = entry; + this.v = false; + this.n = this.p = null; + } + function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) { + return function(rotate, listener) { + var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]); + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = d3.merge(segments); + var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon); + if (segments.length) { + if (!polygonStarted) listener.polygonStart(), polygonStarted = true; + d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener); + } else if (clipStartInside) { + if (!polygonStarted) listener.polygonStart(), polygonStarted = true; + listener.lineStart(); + interpolate(null, null, 1, listener); + listener.lineEnd(); + } + if (polygonStarted) listener.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function() { + listener.polygonStart(); + listener.lineStart(); + interpolate(null, null, 1, listener); + listener.lineEnd(); + listener.polygonEnd(); + } + }; + function point(λ, φ) { + var point = rotate(λ, φ); + if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ); + } + function pointLine(λ, φ) { + var point = rotate(λ, φ); + line.point(point[0], point[1]); + } + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + var segments; + var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring; + function pointRing(λ, φ) { + ring.push([ λ, φ ]); + var point = rotate(λ, φ); + ringListener.point(point[0], point[1]); + } + function ringStart() { + ringListener.lineStart(); + ring = []; + } + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringListener.lineEnd(); + var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length; + ring.pop(); + polygon.push(ring); + ring = null; + if (!n) return; + if (clean & 1) { + segment = ringSegments[0]; + var n = segment.length - 1, i = -1, point; + if (n > 0) { + if (!polygonStarted) listener.polygonStart(), polygonStarted = true; + listener.lineStart(); + while (++i < n) listener.point((point = segment[i])[0], point[1]); + listener.lineEnd(); + } + return; + } + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + segments.push(ringSegments.filter(d3_geo_clipSegmentLength1)); + } + return clip; + }; + } + function d3_geo_clipSegmentLength1(segment) { + return segment.length > 1; + } + function d3_geo_clipBufferListener() { + var lines = [], line; + return { + lineStart: function() { + lines.push(line = []); + }, + point: function(λ, φ) { + line.push([ λ, φ ]); + }, + lineEnd: d3_noop, + buffer: function() { + var buffer = lines; + lines = []; + line = null; + return buffer; + }, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + } + }; + } + function d3_geo_clipSort(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]); + } + var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]); + function d3_geo_clipAntimeridianLine(listener) { + var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean; + return { + lineStart: function() { + listener.lineStart(); + clean = 1; + }, + point: function(λ1, φ1) { + var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0); + if (abs(dλ - π) < ε) { + listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ); + listener.point(sλ0, φ0); + listener.lineEnd(); + listener.lineStart(); + listener.point(sλ1, φ0); + listener.point(λ1, φ0); + clean = 0; + } else if (sλ0 !== sλ1 && dλ >= π) { + if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε; + if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε; + φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1); + listener.point(sλ0, φ0); + listener.lineEnd(); + listener.lineStart(); + listener.point(sλ1, φ0); + clean = 0; + } + listener.point(λ0 = λ1, φ0 = φ1); + sλ0 = sλ1; + }, + lineEnd: function() { + listener.lineEnd(); + λ0 = φ0 = NaN; + }, + clean: function() { + return 2 - clean; + } + }; + } + function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) { + var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1); + return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2; + } + function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) { + var φ; + if (from == null) { + φ = direction * halfπ; + listener.point(-π, φ); + listener.point(0, φ); + listener.point(π, φ); + listener.point(π, 0); + listener.point(π, -φ); + listener.point(0, -φ); + listener.point(-π, -φ); + listener.point(-π, 0); + listener.point(-π, φ); + } else if (abs(from[0] - to[0]) > ε) { + var s = from[0] < to[0] ? π : -π; + φ = direction * s / 2; + listener.point(-s, φ); + listener.point(0, φ); + listener.point(s, φ); + } else { + listener.point(to[0], to[1]); + } + } + function d3_geo_pointInPolygon(point, polygon) { + var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0; + d3_geo_areaRingSum.reset(); + for (var i = 0, n = polygon.length; i < n; ++i) { + var ring = polygon[i], m = ring.length; + if (!m) continue; + var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1; + while (true) { + if (j === m) j = 0; + point = ring[j]; + var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ; + d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ))); + polarAngle += antimeridian ? dλ + sdλ * τ : dλ; + if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) { + var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point)); + d3_geo_cartesianNormalize(arc); + var intersection = d3_geo_cartesianCross(meridianNormal, arc); + d3_geo_cartesianNormalize(intersection); + var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]); + if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) { + winding += antimeridian ^ dλ >= 0 ? 1 : -1; + } + } + if (!j++) break; + λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point; + } + } + return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < -ε) ^ winding & 1; + } + function d3_geo_clipCircle(radius) { + var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians); + return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]); + function visible(λ, φ) { + return Math.cos(λ) * Math.cos(φ) > cr; + } + function clipLine(listener) { + var point0, c0, v0, v00, clean; + return { + lineStart: function() { + v00 = v0 = false; + clean = 1; + }, + point: function(λ, φ) { + var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0; + if (!point0 && (v00 = v0 = v)) listener.lineStart(); + if (v !== v0) { + point2 = intersect(point0, point1); + if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) { + point1[0] += ε; + point1[1] += ε; + v = visible(point1[0], point1[1]); + } + } + if (v !== v0) { + clean = 0; + if (v) { + listener.lineStart(); + point2 = intersect(point1, point0); + listener.point(point2[0], point2[1]); + } else { + point2 = intersect(point0, point1); + listener.point(point2[0], point2[1]); + listener.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + listener.lineStart(); + listener.point(t[0][0], t[0][1]); + listener.point(t[1][0], t[1][1]); + listener.lineEnd(); + } else { + listener.point(t[1][0], t[1][1]); + listener.lineEnd(); + listener.lineStart(); + listener.point(t[0][0], t[0][1]); + } + } + } + if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) { + listener.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function() { + if (v0) listener.lineEnd(); + point0 = null; + }, + clean: function() { + return clean | (v00 && v0) << 1; + } + }; + } + function intersect(a, b, two) { + var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b); + var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2; + if (!determinant) return !two && a; + var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2); + d3_geo_cartesianAdd(A, B); + var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1); + if (t2 < 0) return; + var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu); + d3_geo_cartesianAdd(q, A); + q = d3_geo_spherical(q); + if (!two) return q; + var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z; + if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z; + var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε; + if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z; + if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) { + var q1 = d3_geo_cartesianScale(u, (-w + t) / uu); + d3_geo_cartesianAdd(q1, A); + return [ q, d3_geo_spherical(q1) ]; + } + } + function code(λ, φ) { + var r = smallRadius ? radius : π - radius, code = 0; + if (λ < -r) code |= 1; else if (λ > r) code |= 2; + if (φ < -r) code |= 4; else if (φ > r) code |= 8; + return code; + } + } + function d3_geom_clipLine(x0, y0, x1, y1) { + return function(line) { + var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r; + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + if (t0 > 0) line.a = { + x: ax + t0 * dx, + y: ay + t0 * dy + }; + if (t1 < 1) line.b = { + x: ax + t1 * dx, + y: ay + t1 * dy + }; + return line; + }; + } + var d3_geo_clipExtentMAX = 1e9; + d3.geo.clipExtent = function() { + var x0, y0, x1, y1, stream, clip, clipExtent = { + stream: function(output) { + if (stream) stream.valid = false; + stream = clip(output); + stream.valid = true; + return stream; + }, + extent: function(_) { + if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ]; + clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]); + if (stream) stream.valid = false, stream = null; + return clipExtent; + } + }; + return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]); + }; + function d3_geo_clipExtent(x0, y0, x1, y1) { + return function(listener) { + var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring; + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + listener = bufferListener; + segments = []; + polygon = []; + clean = true; + }, + polygonEnd: function() { + listener = listener_; + segments = d3.merge(segments); + var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length; + if (inside || visible) { + listener.polygonStart(); + if (inside) { + listener.lineStart(); + interpolate(null, null, 1, listener); + listener.lineEnd(); + } + if (visible) { + d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener); + } + listener.polygonEnd(); + } + segments = polygon = ring = null; + } + }; + function insidePolygon(p) { + var wn = 0, n = polygon.length, y = p[1]; + for (var i = 0; i < n; ++i) { + for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) { + b = v[j]; + if (a[1] <= y) { + if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn; + } else { + if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn; + } + a = b; + } + } + return wn !== 0; + } + function interpolate(from, to, direction, listener) { + var a = 0, a1 = 0; + if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) { + do { + listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + } while ((a = (a + direction + 4) % 4) !== a1); + } else { + listener.point(to[0], to[1]); + } + } + function pointVisible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + function point(x, y) { + if (pointVisible(x, y)) listener.point(x, y); + } + var x__, y__, v__, x_, y_, v_, first, clean; + function lineStart() { + clip.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferListener.rejoin(); + segments.push(bufferListener.buffer()); + } + clip.point = point; + if (v_) listener.lineEnd(); + } + function linePoint(x, y) { + x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x)); + y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y)); + var v = pointVisible(x, y); + if (polygon) ring.push([ x, y ]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + listener.lineStart(); + listener.point(x, y); + } + } else { + if (v && v_) listener.point(x, y); else { + var l = { + a: { + x: x_, + y: y_ + }, + b: { + x: x, + y: y + } + }; + if (clipLine(l)) { + if (!v_) { + listener.lineStart(); + listener.point(l.a.x, l.a.y); + } + listener.point(l.b.x, l.b.y); + if (!v) listener.lineEnd(); + clean = false; + } else if (v) { + listener.lineStart(); + listener.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + return clip; + }; + function corner(p, direction) { + return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; + } + function compare(a, b) { + return comparePoints(a.x, b.x); + } + function comparePoints(a, b) { + var ca = corner(a, 1), cb = corner(b, 1); + return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0]; + } + } + function d3_geo_conic(projectAt) { + var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1); + p.parallels = function(_) { + if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ]; + return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180); + }; + return p; + } + function d3_geo_conicEqualArea(φ0, φ1) { + var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n; + function forward(λ, φ) { + var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n; + return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ]; + } + forward.invert = function(x, y) { + var ρ0_y = ρ0 - y; + return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ]; + }; + return forward; + } + (d3.geo.conicEqualArea = function() { + return d3_geo_conic(d3_geo_conicEqualArea); + }).raw = d3_geo_conicEqualArea; + d3.geo.albers = function() { + return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070); + }; + d3.geo.albersUsa = function() { + var lower48 = d3.geo.albers(); + var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]); + var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]); + var point, pointStream = { + point: function(x, y) { + point = [ x, y ]; + } + }, lower48Point, alaskaPoint, hawaiiPoint; + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + point = null; + (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y); + return point; + } + albersUsa.invert = function(coordinates) { + var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k; + return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates); + }; + albersUsa.stream = function(stream) { + var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream); + return { + point: function(x, y) { + lower48Stream.point(x, y); + alaskaStream.point(x, y); + hawaiiStream.point(x, y); + }, + sphere: function() { + lower48Stream.sphere(); + alaskaStream.sphere(); + hawaiiStream.sphere(); + }, + lineStart: function() { + lower48Stream.lineStart(); + alaskaStream.lineStart(); + hawaiiStream.lineStart(); + }, + lineEnd: function() { + lower48Stream.lineEnd(); + alaskaStream.lineEnd(); + hawaiiStream.lineEnd(); + }, + polygonStart: function() { + lower48Stream.polygonStart(); + alaskaStream.polygonStart(); + hawaiiStream.polygonStart(); + }, + polygonEnd: function() { + lower48Stream.polygonEnd(); + alaskaStream.polygonEnd(); + hawaiiStream.polygonEnd(); + } + }; + }; + albersUsa.precision = function(_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_); + alaska.precision(_); + hawaii.precision(_); + return albersUsa; + }; + albersUsa.scale = function(_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_); + alaska.scale(_ * .35); + hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + albersUsa.translate = function(_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point; + alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point; + hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point; + return albersUsa; + }; + return albersUsa.scale(1070); + }; + var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = { + point: d3_noop, + lineStart: d3_noop, + lineEnd: d3_noop, + polygonStart: function() { + d3_geo_pathAreaPolygon = 0; + d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart; + }, + polygonEnd: function() { + d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop; + d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2); + } + }; + function d3_geo_pathAreaRingStart() { + var x00, y00, x0, y0; + d3_geo_pathArea.point = function(x, y) { + d3_geo_pathArea.point = nextPoint; + x00 = x0 = x, y00 = y0 = y; + }; + function nextPoint(x, y) { + d3_geo_pathAreaPolygon += y0 * x - x0 * y; + x0 = x, y0 = y; + } + d3_geo_pathArea.lineEnd = function() { + nextPoint(x00, y00); + }; + } + var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1; + var d3_geo_pathBounds = { + point: d3_geo_pathBoundsPoint, + lineStart: d3_noop, + lineEnd: d3_noop, + polygonStart: d3_noop, + polygonEnd: d3_noop + }; + function d3_geo_pathBoundsPoint(x, y) { + if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x; + if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x; + if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y; + if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y; + } + function d3_geo_pathBuffer() { + var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = []; + var stream = { + point: point, + lineStart: function() { + stream.point = pointLineStart; + }, + lineEnd: lineEnd, + polygonStart: function() { + stream.lineEnd = lineEndPolygon; + }, + polygonEnd: function() { + stream.lineEnd = lineEnd; + stream.point = point; + }, + pointRadius: function(_) { + pointCircle = d3_geo_pathBufferCircle(_); + return stream; + }, + result: function() { + if (buffer.length) { + var result = buffer.join(""); + buffer = []; + return result; + } + } + }; + function point(x, y) { + buffer.push("M", x, ",", y, pointCircle); + } + function pointLineStart(x, y) { + buffer.push("M", x, ",", y); + stream.point = pointLine; + } + function pointLine(x, y) { + buffer.push("L", x, ",", y); + } + function lineEnd() { + stream.point = point; + } + function lineEndPolygon() { + buffer.push("Z"); + } + return stream; + } + function d3_geo_pathBufferCircle(radius) { + return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z"; + } + var d3_geo_pathCentroid = { + point: d3_geo_pathCentroidPoint, + lineStart: d3_geo_pathCentroidLineStart, + lineEnd: d3_geo_pathCentroidLineEnd, + polygonStart: function() { + d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart; + }, + polygonEnd: function() { + d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; + d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart; + d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd; + } + }; + function d3_geo_pathCentroidPoint(x, y) { + d3_geo_centroidX0 += x; + d3_geo_centroidY0 += y; + ++d3_geo_centroidZ0; + } + function d3_geo_pathCentroidLineStart() { + var x0, y0; + d3_geo_pathCentroid.point = function(x, y) { + d3_geo_pathCentroid.point = nextPoint; + d3_geo_pathCentroidPoint(x0 = x, y0 = y); + }; + function nextPoint(x, y) { + var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); + d3_geo_centroidX1 += z * (x0 + x) / 2; + d3_geo_centroidY1 += z * (y0 + y) / 2; + d3_geo_centroidZ1 += z; + d3_geo_pathCentroidPoint(x0 = x, y0 = y); + } + } + function d3_geo_pathCentroidLineEnd() { + d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; + } + function d3_geo_pathCentroidRingStart() { + var x00, y00, x0, y0; + d3_geo_pathCentroid.point = function(x, y) { + d3_geo_pathCentroid.point = nextPoint; + d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y); + }; + function nextPoint(x, y) { + var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); + d3_geo_centroidX1 += z * (x0 + x) / 2; + d3_geo_centroidY1 += z * (y0 + y) / 2; + d3_geo_centroidZ1 += z; + z = y0 * x - x0 * y; + d3_geo_centroidX2 += z * (x0 + x); + d3_geo_centroidY2 += z * (y0 + y); + d3_geo_centroidZ2 += z * 3; + d3_geo_pathCentroidPoint(x0 = x, y0 = y); + } + d3_geo_pathCentroid.lineEnd = function() { + nextPoint(x00, y00); + }; + } + function d3_geo_pathContext(context) { + var pointRadius = 4.5; + var stream = { + point: point, + lineStart: function() { + stream.point = pointLineStart; + }, + lineEnd: lineEnd, + polygonStart: function() { + stream.lineEnd = lineEndPolygon; + }, + polygonEnd: function() { + stream.lineEnd = lineEnd; + stream.point = point; + }, + pointRadius: function(_) { + pointRadius = _; + return stream; + }, + result: d3_noop + }; + function point(x, y) { + context.moveTo(x + pointRadius, y); + context.arc(x, y, pointRadius, 0, τ); + } + function pointLineStart(x, y) { + context.moveTo(x, y); + stream.point = pointLine; + } + function pointLine(x, y) { + context.lineTo(x, y); + } + function lineEnd() { + stream.point = point; + } + function lineEndPolygon() { + context.closePath(); + } + return stream; + } + function d3_geo_resample(project) { + var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16; + function resample(stream) { + return (maxDepth ? resampleRecursive : resampleNone)(stream); + } + function resampleNone(stream) { + return d3_geo_transformPoint(stream, function(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + }); + } + function resampleRecursive(stream) { + var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0; + var resample = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + stream.polygonStart(); + resample.lineStart = ringStart; + }, + polygonEnd: function() { + stream.polygonEnd(); + resample.lineStart = lineStart; + } + }; + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + function lineStart() { + x0 = NaN; + resample.point = linePoint; + stream.lineStart(); + } + function linePoint(λ, φ) { + var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ); + resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + function lineEnd() { + resample.point = point; + stream.lineEnd(); + } + function ringStart() { + lineStart(); + resample.point = ringPoint; + resample.lineEnd = ringEnd; + } + function ringPoint(λ, φ) { + linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resample.point = linePoint; + } + function ringEnd() { + resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream); + resample.lineEnd = lineEnd; + lineEnd(); + } + return resample; + } + function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy; + if (d2 > 4 * δ2 && depth--) { + var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { + resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream); + } + } + } + resample.precision = function(_) { + if (!arguments.length) return Math.sqrt(δ2); + maxDepth = (δ2 = _ * _) > 0 && 16; + return resample; + }; + return resample; + } + d3.geo.path = function() { + var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream; + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream); + d3.geo.stream(object, cacheStream); + } + return contextStream.result(); + } + path.area = function(object) { + d3_geo_pathAreaSum = 0; + d3.geo.stream(object, projectStream(d3_geo_pathArea)); + return d3_geo_pathAreaSum; + }; + path.centroid = function(object) { + d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0; + d3.geo.stream(object, projectStream(d3_geo_pathCentroid)); + return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ]; + }; + path.bounds = function(object) { + d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity); + d3.geo.stream(object, projectStream(d3_geo_pathBounds)); + return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ]; + }; + path.projection = function(_) { + if (!arguments.length) return projection; + projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity; + return reset(); + }; + path.context = function(_) { + if (!arguments.length) return context; + contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return reset(); + }; + path.pointRadius = function(_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + function reset() { + cacheStream = null; + return path; + } + return path.projection(d3.geo.albersUsa()).context(null); + }; + function d3_geo_pathProjectStream(project) { + var resample = d3_geo_resample(function(x, y) { + return project([ x * d3_degrees, y * d3_degrees ]); + }); + return function(stream) { + return d3_geo_projectionRadians(resample(stream)); + }; + } + d3.geo.transform = function(methods) { + return { + stream: function(stream) { + var transform = new d3_geo_transform(stream); + for (var k in methods) transform[k] = methods[k]; + return transform; + } + }; + }; + function d3_geo_transform(stream) { + this.stream = stream; + } + d3_geo_transform.prototype = { + point: function(x, y) { + this.stream.point(x, y); + }, + 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(); + } + }; + function d3_geo_transformPoint(stream, point) { + return { + point: point, + sphere: function() { + stream.sphere(); + }, + lineStart: function() { + stream.lineStart(); + }, + lineEnd: function() { + stream.lineEnd(); + }, + polygonStart: function() { + stream.polygonStart(); + }, + polygonEnd: function() { + stream.polygonEnd(); + } + }; + } + d3.geo.projection = d3_geo_projection; + d3.geo.projectionMutator = d3_geo_projectionMutator; + function d3_geo_projection(project) { + return d3_geo_projectionMutator(function() { + return project; + })(); + } + function d3_geo_projectionMutator(projectAt) { + var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) { + x = project(x, y); + return [ x[0] * k + δx, δy - x[1] * k ]; + }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream; + function projection(point) { + point = projectRotate(point[0] * d3_radians, point[1] * d3_radians); + return [ point[0] * k + δx, δy - point[1] * k ]; + } + function invert(point) { + point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k); + return point && [ point[0] * d3_degrees, point[1] * d3_degrees ]; + } + projection.stream = function(output) { + if (stream) stream.valid = false; + stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output)))); + stream.valid = true; + return stream; + }; + projection.clipAngle = function(_) { + if (!arguments.length) return clipAngle; + preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians); + return invalidate(); + }; + projection.clipExtent = function(_) { + if (!arguments.length) return clipExtent; + clipExtent = _; + postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity; + return invalidate(); + }; + projection.scale = function(_) { + if (!arguments.length) return k; + k = +_; + return reset(); + }; + projection.translate = function(_) { + if (!arguments.length) return [ x, y ]; + x = +_[0]; + y = +_[1]; + return reset(); + }; + projection.center = function(_) { + if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ]; + λ = _[0] % 360 * d3_radians; + φ = _[1] % 360 * d3_radians; + return reset(); + }; + projection.rotate = function(_) { + if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ]; + δλ = _[0] % 360 * d3_radians; + δφ = _[1] % 360 * d3_radians; + δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0; + return reset(); + }; + d3.rebind(projection, projectResample, "precision"); + function reset() { + projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project); + var center = project(λ, φ); + δx = x - center[0] * k; + δy = y + center[1] * k; + return invalidate(); + } + function invalidate() { + if (stream) stream.valid = false, stream = null; + return projection; + } + return function() { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return reset(); + }; + } + function d3_geo_projectionRadians(stream) { + return d3_geo_transformPoint(stream, function(x, y) { + stream.point(x * d3_radians, y * d3_radians); + }); + } + function d3_geo_equirectangular(λ, φ) { + return [ λ, φ ]; + } + (d3.geo.equirectangular = function() { + return d3_geo_projection(d3_geo_equirectangular); + }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular; + d3.geo.rotation = function(rotate) { + rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0); + function forward(coordinates) { + coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians); + return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates; + } + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians); + return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates; + }; + return forward; + }; + function d3_geo_identityRotation(λ, φ) { + return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ]; + } + d3_geo_identityRotation.invert = d3_geo_equirectangular; + function d3_geo_rotation(δλ, δφ, δγ) { + return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation; + } + function d3_geo_forwardRotationλ(δλ) { + return function(λ, φ) { + return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ]; + }; + } + function d3_geo_rotationλ(δλ) { + var rotation = d3_geo_forwardRotationλ(δλ); + rotation.invert = d3_geo_forwardRotationλ(-δλ); + return rotation; + } + function d3_geo_rotationφγ(δφ, δγ) { + var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ); + function rotation(λ, φ) { + var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ; + return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ]; + } + rotation.invert = function(λ, φ) { + var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ; + return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ]; + }; + return rotation; + } + d3.geo.circle = function() { + var origin = [ 0, 0 ], angle, precision = 6, interpolate; + function circle() { + var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = []; + interpolate(null, null, 1, { + point: function(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= d3_degrees, x[1] *= d3_degrees; + } + }); + return { + type: "Polygon", + coordinates: [ ring ] + }; + } + circle.origin = function(x) { + if (!arguments.length) return origin; + origin = x; + return circle; + }; + circle.angle = function(x) { + if (!arguments.length) return angle; + interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians); + return circle; + }; + circle.precision = function(_) { + if (!arguments.length) return precision; + interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians); + return circle; + }; + return circle.angle(90); + }; + function d3_geo_circleInterpolate(radius, precision) { + var cr = Math.cos(radius), sr = Math.sin(radius); + return function(from, to, direction, listener) { + var step = direction * precision; + if (from != null) { + from = d3_geo_circleAngle(cr, from); + to = d3_geo_circleAngle(cr, to); + if (direction > 0 ? from < to : from > to) from += direction * τ; + } else { + from = radius + direction * τ; + to = radius - .5 * step; + } + for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) { + listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]); + } + }; + } + function d3_geo_circleAngle(cr, point) { + var a = d3_geo_cartesian(point); + a[0] -= cr; + d3_geo_cartesianNormalize(a); + var angle = d3_acos(-a[1]); + return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI); + } + d3.geo.distance = function(a, b) { + var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t; + return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ); + }; + d3.geo.graticule = function() { + var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5; + function graticule() { + return { + type: "MultiLineString", + coordinates: lines() + }; + } + function lines() { + return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) { + return abs(x % DX) > ε; + }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) { + return abs(y % DY) > ε; + }).map(y)); + } + graticule.lines = function() { + return lines().map(function(coordinates) { + return { + type: "LineString", + coordinates: coordinates + }; + }); + }; + graticule.outline = function() { + return { + type: "Polygon", + coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ] + }; + }; + graticule.extent = function(_) { + if (!arguments.length) return graticule.minorExtent(); + return graticule.majorExtent(_).minorExtent(_); + }; + graticule.majorExtent = function(_) { + if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + graticule.minorExtent = function(_) { + if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + graticule.step = function(_) { + if (!arguments.length) return graticule.minorStep(); + return graticule.majorStep(_).minorStep(_); + }; + graticule.majorStep = function(_) { + if (!arguments.length) return [ DX, DY ]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + graticule.minorStep = function(_) { + if (!arguments.length) return [ dx, dy ]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + graticule.precision = function(_) { + if (!arguments.length) return precision; + precision = +_; + x = d3_geo_graticuleX(y0, y1, 90); + y = d3_geo_graticuleY(x0, x1, precision); + X = d3_geo_graticuleX(Y0, Y1, 90); + Y = d3_geo_graticuleY(X0, X1, precision); + return graticule; + }; + return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]); + }; + function d3_geo_graticuleX(y0, y1, dy) { + var y = d3.range(y0, y1 - ε, dy).concat(y1); + return function(x) { + return y.map(function(y) { + return [ x, y ]; + }); + }; + } + function d3_geo_graticuleY(x0, x1, dx) { + var x = d3.range(x0, x1 - ε, dx).concat(x1); + return function(y) { + return x.map(function(x) { + return [ x, y ]; + }); + }; + } + function d3_source(d) { + return d.source; + } + function d3_target(d) { + return d.target; + } + d3.geo.greatArc = function() { + var source = d3_source, source_, target = d3_target, target_; + function greatArc() { + return { + type: "LineString", + coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ] + }; + } + greatArc.distance = function() { + return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments)); + }; + greatArc.source = function(_) { + if (!arguments.length) return source; + source = _, source_ = typeof _ === "function" ? null : _; + return greatArc; + }; + greatArc.target = function(_) { + if (!arguments.length) return target; + target = _, target_ = typeof _ === "function" ? null : _; + return greatArc; + }; + greatArc.precision = function() { + return arguments.length ? greatArc : 0; + }; + return greatArc; + }; + d3.geo.interpolate = function(source, target) { + return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians); + }; + function d3_geo_interpolate(x0, y0, x1, y1) { + var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d); + var interpolate = d ? function(t) { + var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1; + return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ]; + } : function() { + return [ x0 * d3_degrees, y0 * d3_degrees ]; + }; + interpolate.distance = d; + return interpolate; + } + d3.geo.length = function(object) { + d3_geo_lengthSum = 0; + d3.geo.stream(object, d3_geo_length); + return d3_geo_lengthSum; + }; + var d3_geo_lengthSum; + var d3_geo_length = { + sphere: d3_noop, + point: d3_noop, + lineStart: d3_geo_lengthLineStart, + lineEnd: d3_noop, + polygonStart: d3_noop, + polygonEnd: d3_noop + }; + function d3_geo_lengthLineStart() { + var λ0, sinφ0, cosφ0; + d3_geo_length.point = function(λ, φ) { + λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ); + d3_geo_length.point = nextPoint; + }; + d3_geo_length.lineEnd = function() { + d3_geo_length.point = d3_geo_length.lineEnd = d3_noop; + }; + function nextPoint(λ, φ) { + var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t); + d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ); + λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ; + } + } + function d3_geo_azimuthal(scale, angle) { + function azimuthal(λ, φ) { + var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ); + return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ]; + } + azimuthal.invert = function(x, y) { + var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c); + return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ]; + }; + return azimuthal; + } + var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) { + return Math.sqrt(2 / (1 + cosλcosφ)); + }, function(ρ) { + return 2 * Math.asin(ρ / 2); + }); + (d3.geo.azimuthalEqualArea = function() { + return d3_geo_projection(d3_geo_azimuthalEqualArea); + }).raw = d3_geo_azimuthalEqualArea; + var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) { + var c = Math.acos(cosλcosφ); + return c && c / Math.sin(c); + }, d3_identity); + (d3.geo.azimuthalEquidistant = function() { + return d3_geo_projection(d3_geo_azimuthalEquidistant); + }).raw = d3_geo_azimuthalEquidistant; + function d3_geo_conicConformal(φ0, φ1) { + var cosφ0 = Math.cos(φ0), t = function(φ) { + return Math.tan(π / 4 + φ / 2); + }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n; + if (!n) return d3_geo_mercator; + function forward(λ, φ) { + if (F > 0) { + if (φ < -halfπ + ε) φ = -halfπ + ε; + } else { + if (φ > halfπ - ε) φ = halfπ - ε; + } + var ρ = F / Math.pow(t(φ), n); + return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ]; + } + forward.invert = function(x, y) { + var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y); + return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ]; + }; + return forward; + } + (d3.geo.conicConformal = function() { + return d3_geo_conic(d3_geo_conicConformal); + }).raw = d3_geo_conicConformal; + function d3_geo_conicEquidistant(φ0, φ1) { + var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0; + if (abs(n) < ε) return d3_geo_equirectangular; + function forward(λ, φ) { + var ρ = G - φ; + return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ]; + } + forward.invert = function(x, y) { + var ρ0_y = G - y; + return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ]; + }; + return forward; + } + (d3.geo.conicEquidistant = function() { + return d3_geo_conic(d3_geo_conicEquidistant); + }).raw = d3_geo_conicEquidistant; + var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) { + return 1 / cosλcosφ; + }, Math.atan); + (d3.geo.gnomonic = function() { + return d3_geo_projection(d3_geo_gnomonic); + }).raw = d3_geo_gnomonic; + function d3_geo_mercator(λ, φ) { + return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ]; + } + d3_geo_mercator.invert = function(x, y) { + return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ]; + }; + function d3_geo_mercatorProjection(project) { + var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto; + m.scale = function() { + var v = scale.apply(m, arguments); + return v === m ? clipAuto ? m.clipExtent(null) : m : v; + }; + m.translate = function() { + var v = translate.apply(m, arguments); + return v === m ? clipAuto ? m.clipExtent(null) : m : v; + }; + m.clipExtent = function(_) { + var v = clipExtent.apply(m, arguments); + if (v === m) { + if (clipAuto = _ == null) { + var k = π * scale(), t = translate(); + clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]); + } + } else if (clipAuto) { + v = null; + } + return v; + }; + return m.clipExtent(null); + } + (d3.geo.mercator = function() { + return d3_geo_mercatorProjection(d3_geo_mercator); + }).raw = d3_geo_mercator; + var d3_geo_orthographic = d3_geo_azimuthal(function() { + return 1; + }, Math.asin); + (d3.geo.orthographic = function() { + return d3_geo_projection(d3_geo_orthographic); + }).raw = d3_geo_orthographic; + var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) { + return 1 / (1 + cosλcosφ); + }, function(ρ) { + return 2 * Math.atan(ρ); + }); + (d3.geo.stereographic = function() { + return d3_geo_projection(d3_geo_stereographic); + }).raw = d3_geo_stereographic; + function d3_geo_transverseMercator(λ, φ) { + return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ]; + } + d3_geo_transverseMercator.invert = function(x, y) { + return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ]; + }; + (d3.geo.transverseMercator = function() { + var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate; + projection.center = function(_) { + return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]); + }; + projection.rotate = function(_) { + return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), + [ _[0], _[1], _[2] - 90 ]); + }; + return rotate([ 0, 0, 90 ]); + }).raw = d3_geo_transverseMercator; + d3.geom = {}; + function d3_geom_pointX(d) { + return d[0]; + } + function d3_geom_pointY(d) { + return d[1]; + } + d3.geom.hull = function(vertices) { + var x = d3_geom_pointX, y = d3_geom_pointY; + if (arguments.length) return hull(vertices); + function hull(data) { + if (data.length < 3) return []; + var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = []; + for (i = 0; i < n; i++) { + points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]); + } + points.sort(d3_geom_hullOrder); + for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]); + var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints); + var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = []; + for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]); + for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]); + return polygon; + } + hull.x = function(_) { + return arguments.length ? (x = _, hull) : x; + }; + hull.y = function(_) { + return arguments.length ? (y = _, hull) : y; + }; + return hull; + }; + function d3_geom_hullUpper(points) { + var n = points.length, hull = [ 0, 1 ], hs = 2; + for (var i = 2; i < n; i++) { + while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs; + hull[hs++] = i; + } + return hull.slice(0, hs); + } + function d3_geom_hullOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; + } + d3.geom.polygon = function(coordinates) { + d3_subclass(coordinates, d3_geom_polygonPrototype); + return coordinates; + }; + var d3_geom_polygonPrototype = d3.geom.polygon.prototype = []; + d3_geom_polygonPrototype.area = function() { + var i = -1, n = this.length, a, b = this[n - 1], area = 0; + while (++i < n) { + a = b; + b = this[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + return area * .5; + }; + d3_geom_polygonPrototype.centroid = function(k) { + var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c; + if (!arguments.length) k = -1 / (6 * this.area()); + while (++i < n) { + a = b; + b = this[i]; + c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + return [ x * k, y * k ]; + }; + d3_geom_polygonPrototype.clip = function(subject) { + var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d; + while (++i < n) { + input = subject.slice(); + subject.length = 0; + b = this[i]; + c = input[(m = input.length - closed) - 1]; + j = -1; + while (++j < m) { + d = input[j]; + if (d3_geom_polygonInside(d, a, b)) { + if (!d3_geom_polygonInside(c, a, b)) { + subject.push(d3_geom_polygonIntersect(c, d, a, b)); + } + subject.push(d); + } else if (d3_geom_polygonInside(c, a, b)) { + subject.push(d3_geom_polygonIntersect(c, d, a, b)); + } + c = d; + } + if (closed) subject.push(subject[0]); + a = b; + } + return subject; + }; + function d3_geom_polygonInside(p, a, b) { + return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]); + } + function d3_geom_polygonIntersect(c, d, a, b) { + var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21); + return [ x1 + ua * x21, y1 + ua * y21 ]; + } + function d3_geom_polygonClosed(coordinates) { + var a = coordinates[0], b = coordinates[coordinates.length - 1]; + return !(a[0] - b[0] || a[1] - b[1]); + } + var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = []; + function d3_geom_voronoiBeach() { + d3_geom_voronoiRedBlackNode(this); + this.edge = this.site = this.circle = null; + } + function d3_geom_voronoiCreateBeach(site) { + var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach(); + beach.site = site; + return beach; + } + function d3_geom_voronoiDetachBeach(beach) { + d3_geom_voronoiDetachCircle(beach); + d3_geom_voronoiBeaches.remove(beach); + d3_geom_voronoiBeachPool.push(beach); + d3_geom_voronoiRedBlackNode(beach); + } + function d3_geom_voronoiRemoveBeach(beach) { + var circle = beach.circle, x = circle.x, y = circle.cy, vertex = { + x: x, + y: y + }, previous = beach.P, next = beach.N, disappearing = [ beach ]; + d3_geom_voronoiDetachBeach(beach); + var lArc = previous; + while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) { + previous = lArc.P; + disappearing.unshift(lArc); + d3_geom_voronoiDetachBeach(lArc); + lArc = previous; + } + disappearing.unshift(lArc); + d3_geom_voronoiDetachCircle(lArc); + var rArc = next; + while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) { + next = rArc.N; + disappearing.push(rArc); + d3_geom_voronoiDetachBeach(rArc); + rArc = next; + } + disappearing.push(rArc); + d3_geom_voronoiDetachCircle(rArc); + var nArcs = disappearing.length, iArc; + for (iArc = 1; iArc < nArcs; ++iArc) { + rArc = disappearing[iArc]; + lArc = disappearing[iArc - 1]; + d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); + } + lArc = disappearing[0]; + rArc = disappearing[nArcs - 1]; + rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex); + d3_geom_voronoiAttachCircle(lArc); + d3_geom_voronoiAttachCircle(rArc); + } + function d3_geom_voronoiAddBeach(site) { + var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._; + while (node) { + dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x; + if (dxl > ε) node = node.L; else { + dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix); + if (dxr > ε) { + if (!node.R) { + lArc = node; + break; + } + node = node.R; + } else { + if (dxl > -ε) { + lArc = node.P; + rArc = node; + } else if (dxr > -ε) { + lArc = node; + rArc = node.N; + } else { + lArc = rArc = node; + } + break; + } + } + } + var newArc = d3_geom_voronoiCreateBeach(site); + d3_geom_voronoiBeaches.insert(lArc, newArc); + if (!lArc && !rArc) return; + if (lArc === rArc) { + d3_geom_voronoiDetachCircle(lArc); + rArc = d3_geom_voronoiCreateBeach(lArc.site); + d3_geom_voronoiBeaches.insert(newArc, rArc); + newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site); + d3_geom_voronoiAttachCircle(lArc); + d3_geom_voronoiAttachCircle(rArc); + return; + } + if (!rArc) { + newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site); + return; + } + d3_geom_voronoiDetachCircle(lArc); + d3_geom_voronoiDetachCircle(rArc); + var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = { + x: (cy * hb - by * hc) / d + ax, + y: (bx * hc - cx * hb) / d + ay + }; + d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex); + newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex); + rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex); + d3_geom_voronoiAttachCircle(lArc); + d3_geom_voronoiAttachCircle(rArc); + } + function d3_geom_voronoiLeftBreakPoint(arc, directrix) { + var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix; + if (!pby2) return rfocx; + var lArc = arc.P; + if (!lArc) return -Infinity; + site = lArc.site; + var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix; + if (!plby2) return lfocx; + var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2; + if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; + return (rfocx + lfocx) / 2; + } + function d3_geom_voronoiRightBreakPoint(arc, directrix) { + var rArc = arc.N; + if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix); + var site = arc.site; + return site.y === directrix ? site.x : Infinity; + } + function d3_geom_voronoiCell(site) { + this.site = site; + this.edges = []; + } + d3_geom_voronoiCell.prototype.prepare = function() { + var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge; + while (iHalfEdge--) { + edge = halfEdges[iHalfEdge].edge; + if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1); + } + halfEdges.sort(d3_geom_voronoiHalfEdgeOrder); + return halfEdges.length; + }; + function d3_geom_voronoiCloseCells(extent) { + var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end; + while (iCell--) { + cell = cells[iCell]; + if (!cell || !cell.prepare()) continue; + halfEdges = cell.edges; + nHalfEdges = halfEdges.length; + iHalfEdge = 0; + while (iHalfEdge < nHalfEdges) { + end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y; + start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y; + if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) { + halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? { + x: x0, + y: abs(x2 - x0) < ε ? y2 : y1 + } : abs(y3 - y1) < ε && x1 - x3 > ε ? { + x: abs(y2 - y1) < ε ? x2 : x1, + y: y1 + } : abs(x3 - x1) < ε && y3 - y0 > ε ? { + x: x1, + y: abs(x2 - x1) < ε ? y2 : y0 + } : abs(y3 - y0) < ε && x3 - x0 > ε ? { + x: abs(y2 - y0) < ε ? x2 : x0, + y: y0 + } : null), cell.site, null)); + ++nHalfEdges; + } + } + } + } + function d3_geom_voronoiHalfEdgeOrder(a, b) { + return b.angle - a.angle; + } + function d3_geom_voronoiCircle() { + d3_geom_voronoiRedBlackNode(this); + this.x = this.y = this.arc = this.site = this.cy = null; + } + function d3_geom_voronoiAttachCircle(arc) { + var lArc = arc.P, rArc = arc.N; + if (!lArc || !rArc) return; + var lSite = lArc.site, cSite = arc.site, rSite = rArc.site; + if (lSite === rSite) return; + var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by; + var d = 2 * (ax * cy - ay * cx); + if (d >= -ε2) return; + var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by; + var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle(); + circle.arc = arc; + circle.site = cSite; + circle.x = x + bx; + circle.y = cy + Math.sqrt(x * x + y * y); + circle.cy = cy; + arc.circle = circle; + var before = null, node = d3_geom_voronoiCircles._; + while (node) { + if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) { + if (node.L) node = node.L; else { + before = node.P; + break; + } + } else { + if (node.R) node = node.R; else { + before = node; + break; + } + } + } + d3_geom_voronoiCircles.insert(before, circle); + if (!before) d3_geom_voronoiFirstCircle = circle; + } + function d3_geom_voronoiDetachCircle(arc) { + var circle = arc.circle; + if (circle) { + if (!circle.P) d3_geom_voronoiFirstCircle = circle.N; + d3_geom_voronoiCircles.remove(circle); + d3_geom_voronoiCirclePool.push(circle); + d3_geom_voronoiRedBlackNode(circle); + arc.circle = null; + } + } + function d3_geom_voronoiClipEdges(extent) { + var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e; + while (i--) { + e = edges[i]; + if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) { + e.a = e.b = null; + edges.splice(i, 1); + } + } + } + function d3_geom_voronoiConnectEdge(edge, extent) { + var vb = edge.b; + if (vb) return true; + var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb; + if (ry === ly) { + if (fx < x0 || fx >= x1) return; + if (lx > rx) { + if (!va) va = { + x: fx, + y: y0 + }; else if (va.y >= y1) return; + vb = { + x: fx, + y: y1 + }; + } else { + if (!va) va = { + x: fx, + y: y1 + }; else if (va.y < y0) return; + vb = { + x: fx, + y: y0 + }; + } + } else { + fm = (lx - rx) / (ry - ly); + fb = fy - fm * fx; + if (fm < -1 || fm > 1) { + if (lx > rx) { + if (!va) va = { + x: (y0 - fb) / fm, + y: y0 + }; else if (va.y >= y1) return; + vb = { + x: (y1 - fb) / fm, + y: y1 + }; + } else { + if (!va) va = { + x: (y1 - fb) / fm, + y: y1 + }; else if (va.y < y0) return; + vb = { + x: (y0 - fb) / fm, + y: y0 + }; + } + } else { + if (ly < ry) { + if (!va) va = { + x: x0, + y: fm * x0 + fb + }; else if (va.x >= x1) return; + vb = { + x: x1, + y: fm * x1 + fb + }; + } else { + if (!va) va = { + x: x1, + y: fm * x1 + fb + }; else if (va.x < x0) return; + vb = { + x: x0, + y: fm * x0 + fb + }; + } + } + } + edge.a = va; + edge.b = vb; + return true; + } + function d3_geom_voronoiEdge(lSite, rSite) { + this.l = lSite; + this.r = rSite; + this.a = this.b = null; + } + function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) { + var edge = new d3_geom_voronoiEdge(lSite, rSite); + d3_geom_voronoiEdges.push(edge); + if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va); + if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb); + d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite)); + d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite)); + return edge; + } + function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) { + var edge = new d3_geom_voronoiEdge(lSite, null); + edge.a = va; + edge.b = vb; + d3_geom_voronoiEdges.push(edge); + return edge; + } + function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) { + if (!edge.a && !edge.b) { + edge.a = vertex; + edge.l = lSite; + edge.r = rSite; + } else if (edge.l === rSite) { + edge.b = vertex; + } else { + edge.a = vertex; + } + } + function d3_geom_voronoiHalfEdge(edge, lSite, rSite) { + var va = edge.a, vb = edge.b; + this.edge = edge; + this.site = lSite; + this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y); + } + d3_geom_voronoiHalfEdge.prototype = { + start: function() { + return this.edge.l === this.site ? this.edge.a : this.edge.b; + }, + end: function() { + return this.edge.l === this.site ? this.edge.b : this.edge.a; + } + }; + function d3_geom_voronoiRedBlackTree() { + this._ = null; + } + function d3_geom_voronoiRedBlackNode(node) { + node.U = node.C = node.L = node.R = node.P = node.N = null; + } + d3_geom_voronoiRedBlackTree.prototype = { + insert: function(after, node) { + var parent, grandpa, uncle; + if (after) { + node.P = after; + node.N = after.N; + if (after.N) after.N.P = node; + after.N = node; + if (after.R) { + after = after.R; + while (after.L) after = after.L; + after.L = node; + } else { + after.R = node; + } + parent = after; + } else if (this._) { + after = d3_geom_voronoiRedBlackFirst(this._); + node.P = null; + node.N = after; + after.P = after.L = node; + parent = after; + } else { + node.P = node.N = null; + this._ = node; + parent = null; + } + node.L = node.R = null; + node.U = parent; + node.C = true; + after = node; + while (parent && parent.C) { + grandpa = parent.U; + if (parent === grandpa.L) { + uncle = grandpa.R; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.R) { + d3_geom_voronoiRedBlackRotateLeft(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + d3_geom_voronoiRedBlackRotateRight(this, grandpa); + } + } else { + uncle = grandpa.L; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.L) { + d3_geom_voronoiRedBlackRotateRight(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + d3_geom_voronoiRedBlackRotateLeft(this, grandpa); + } + } + parent = after.U; + } + this._.C = false; + }, + remove: function(node) { + if (node.N) node.N.P = node.P; + if (node.P) node.P.N = node.N; + node.N = node.P = null; + var parent = node.U, sibling, left = node.L, right = node.R, next, red; + if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right); + if (parent) { + if (parent.L === node) parent.L = next; else parent.R = next; + } else { + this._ = next; + } + if (left && right) { + red = next.C; + next.C = node.C; + next.L = left; + left.U = next; + if (next !== right) { + parent = next.U; + next.U = node.U; + node = next.R; + parent.L = node; + next.R = right; + right.U = next; + } else { + next.U = parent; + parent = next; + node = next.R; + } + } else { + red = node.C; + node = next; + } + if (node) node.U = parent; + if (red) return; + if (node && node.C) { + node.C = false; + return; + } + do { + if (node === this._) break; + if (node === parent.L) { + sibling = parent.R; + if (sibling.C) { + sibling.C = false; + parent.C = true; + d3_geom_voronoiRedBlackRotateLeft(this, parent); + sibling = parent.R; + } + if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) { + if (!sibling.R || !sibling.R.C) { + sibling.L.C = false; + sibling.C = true; + d3_geom_voronoiRedBlackRotateRight(this, sibling); + sibling = parent.R; + } + sibling.C = parent.C; + parent.C = sibling.R.C = false; + d3_geom_voronoiRedBlackRotateLeft(this, parent); + node = this._; + break; + } + } else { + sibling = parent.L; + if (sibling.C) { + sibling.C = false; + parent.C = true; + d3_geom_voronoiRedBlackRotateRight(this, parent); + sibling = parent.L; + } + if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) { + if (!sibling.L || !sibling.L.C) { + sibling.R.C = false; + sibling.C = true; + d3_geom_voronoiRedBlackRotateLeft(this, sibling); + sibling = parent.L; + } + sibling.C = parent.C; + parent.C = sibling.L.C = false; + d3_geom_voronoiRedBlackRotateRight(this, parent); + node = this._; + break; + } + } + sibling.C = true; + node = parent; + parent = parent.U; + } while (!node.C); + if (node) node.C = false; + } + }; + function d3_geom_voronoiRedBlackRotateLeft(tree, node) { + var p = node, q = node.R, parent = p.U; + if (parent) { + if (parent.L === p) parent.L = q; else parent.R = q; + } else { + tree._ = q; + } + q.U = parent; + p.U = q; + p.R = q.L; + if (p.R) p.R.U = p; + q.L = p; + } + function d3_geom_voronoiRedBlackRotateRight(tree, node) { + var p = node, q = node.L, parent = p.U; + if (parent) { + if (parent.L === p) parent.L = q; else parent.R = q; + } else { + tree._ = q; + } + q.U = parent; + p.U = q; + p.L = q.R; + if (p.L) p.L.U = p; + q.R = p; + } + function d3_geom_voronoiRedBlackFirst(node) { + while (node.L) node = node.L; + return node; + } + function d3_geom_voronoi(sites, bbox) { + var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle; + d3_geom_voronoiEdges = []; + d3_geom_voronoiCells = new Array(sites.length); + d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree(); + d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree(); + while (true) { + circle = d3_geom_voronoiFirstCircle; + if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) { + if (site.x !== x0 || site.y !== y0) { + d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site); + d3_geom_voronoiAddBeach(site); + x0 = site.x, y0 = site.y; + } + site = sites.pop(); + } else if (circle) { + d3_geom_voronoiRemoveBeach(circle.arc); + } else { + break; + } + } + if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox); + var diagram = { + cells: d3_geom_voronoiCells, + edges: d3_geom_voronoiEdges + }; + d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null; + return diagram; + } + function d3_geom_voronoiVertexOrder(a, b) { + return b.y - a.y || b.x - a.x; + } + d3.geom.voronoi = function(points) { + var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent; + if (points) return voronoi(points); + function voronoi(data) { + var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1]; + d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) { + var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) { + var s = e.start(); + return [ s.x, s.y ]; + }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : []; + polygon.point = data[i]; + }); + return polygons; + } + function sites(data) { + return data.map(function(d, i) { + return { + x: Math.round(fx(d, i) / ε) * ε, + y: Math.round(fy(d, i) / ε) * ε, + i: i + }; + }); + } + voronoi.links = function(data) { + return d3_geom_voronoi(sites(data)).edges.filter(function(edge) { + return edge.l && edge.r; + }).map(function(edge) { + return { + source: data[edge.l.i], + target: data[edge.r.i] + }; + }); + }; + voronoi.triangles = function(data) { + var triangles = []; + d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) { + var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l; + while (++j < m) { + e0 = e1; + s0 = s1; + e1 = edges[j].edge; + s1 = e1.l === site ? e1.r : e1.l; + if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) { + triangles.push([ data[i], data[s0.i], data[s1.i] ]); + } + } + }); + return triangles; + }; + voronoi.x = function(_) { + return arguments.length ? (fx = d3_functor(x = _), voronoi) : x; + }; + voronoi.y = function(_) { + return arguments.length ? (fy = d3_functor(y = _), voronoi) : y; + }; + voronoi.clipExtent = function(_) { + if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent; + clipExtent = _ == null ? d3_geom_voronoiClipExtent : _; + return voronoi; + }; + voronoi.size = function(_) { + if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1]; + return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]); + }; + return voronoi; + }; + var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ]; + function d3_geom_voronoiTriangleArea(a, b, c) { + return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y); + } + d3.geom.delaunay = function(vertices) { + return d3.geom.voronoi().triangles(vertices); + }; + d3.geom.quadtree = function(points, x1, y1, x2, y2) { + var x = d3_geom_pointX, y = d3_geom_pointY, compat; + if (compat = arguments.length) { + x = d3_geom_quadtreeCompatX; + y = d3_geom_quadtreeCompatY; + if (compat === 3) { + y2 = y1; + x2 = x1; + y1 = x1 = 0; + } + return quadtree(points); + } + function quadtree(data) { + var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_; + if (x1 != null) { + x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2; + } else { + x2_ = y2_ = -(x1_ = y1_ = Infinity); + xs = [], ys = []; + n = data.length; + if (compat) for (i = 0; i < n; ++i) { + d = data[i]; + if (d.x < x1_) x1_ = d.x; + if (d.y < y1_) y1_ = d.y; + if (d.x > x2_) x2_ = d.x; + if (d.y > y2_) y2_ = d.y; + xs.push(d.x); + ys.push(d.y); + } else for (i = 0; i < n; ++i) { + var x_ = +fx(d = data[i], i), y_ = +fy(d, i); + if (x_ < x1_) x1_ = x_; + if (y_ < y1_) y1_ = y_; + if (x_ > x2_) x2_ = x_; + if (y_ > y2_) y2_ = y_; + xs.push(x_); + ys.push(y_); + } + } + var dx = x2_ - x1_, dy = y2_ - y1_; + if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy; + function insert(n, d, x, y, x1, y1, x2, y2) { + if (isNaN(x) || isNaN(y)) return; + if (n.leaf) { + var nx = n.x, ny = n.y; + if (nx != null) { + if (abs(nx - x) + abs(ny - y) < .01) { + insertChild(n, d, x, y, x1, y1, x2, y2); + } else { + var nPoint = n.point; + n.x = n.y = n.point = null; + insertChild(n, nPoint, nx, ny, x1, y1, x2, y2); + insertChild(n, d, x, y, x1, y1, x2, y2); + } + } else { + n.x = x, n.y = y, n.point = d; + } + } else { + insertChild(n, d, x, y, x1, y1, x2, y2); + } + } + function insertChild(n, d, x, y, x1, y1, x2, y2) { + var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right; + n.leaf = false; + n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode()); + if (right) x1 = xm; else x2 = xm; + if (below) y1 = ym; else y2 = ym; + insert(n, d, x, y, x1, y1, x2, y2); + } + var root = d3_geom_quadtreeNode(); + root.add = function(d) { + insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_); + }; + root.visit = function(f) { + d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_); + }; + root.find = function(point) { + return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_); + }; + i = -1; + if (x1 == null) { + while (++i < n) { + insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_); + } + --i; + } else data.forEach(root.add); + xs = ys = data = d = null; + return root; + } + quadtree.x = function(_) { + return arguments.length ? (x = _, quadtree) : x; + }; + quadtree.y = function(_) { + return arguments.length ? (y = _, quadtree) : y; + }; + quadtree.extent = function(_) { + if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ]; + if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], + y2 = +_[1][1]; + return quadtree; + }; + quadtree.size = function(_) { + if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ]; + if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1]; + return quadtree; + }; + return quadtree; + }; + function d3_geom_quadtreeCompatX(d) { + return d.x; + } + function d3_geom_quadtreeCompatY(d) { + return d.y; + } + function d3_geom_quadtreeNode() { + return { + leaf: true, + nodes: [], + point: null, + x: null, + y: null + }; + } + function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) { + if (!f(node, x1, y1, x2, y2)) { + var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes; + if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy); + if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy); + if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2); + if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2); + } + } + function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) { + var minDistance2 = Infinity, closestPoint; + (function find(node, x1, y1, x2, y2) { + if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return; + if (point = node.point) { + var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy; + if (distance2 < minDistance2) { + var distance = Math.sqrt(minDistance2 = distance2); + x0 = x - distance, y0 = y - distance; + x3 = x + distance, y3 = y + distance; + closestPoint = point; + } + } + var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym; + for (var i = below << 1 | right, j = i + 4; i < j; ++i) { + if (node = children[i & 3]) switch (i & 3) { + case 0: + find(node, x1, y1, xm, ym); + break; + + case 1: + find(node, xm, y1, x2, ym); + break; + + case 2: + find(node, x1, ym, xm, y2); + break; + + case 3: + find(node, xm, ym, x2, y2); + break; + } + } + })(root, x0, y0, x3, y3); + return closestPoint; + } + d3.interpolateRgb = d3_interpolateRgb; + function d3_interpolateRgb(a, b) { + a = d3.rgb(a); + b = d3.rgb(b); + var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab; + return function(t) { + return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t)); + }; + } + d3.interpolateObject = d3_interpolateObject; + function d3_interpolateObject(a, b) { + var i = {}, c = {}, k; + for (k in a) { + if (k in b) { + i[k] = d3_interpolate(a[k], b[k]); + } else { + c[k] = a[k]; + } + } + for (k in b) { + if (!(k in a)) { + c[k] = b[k]; + } + } + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; + } + d3.interpolateNumber = d3_interpolateNumber; + function d3_interpolateNumber(a, b) { + a = +a, b = +b; + return function(t) { + return a * (1 - t) + b * t; + }; + } + d3.interpolateString = d3_interpolateString; + function d3_interpolateString(a, b) { + var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = []; + a = a + "", b = b + ""; + while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) { + if ((bs = bm.index) > bi) { + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { + if (s[i]) s[i] += bm; else s[++i] = bm; + } else { + s[++i] = null; + q.push({ + i: i, + x: d3_interpolateNumber(am, bm) + }); + } + bi = d3_interpolate_numberB.lastIndex; + } + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; else s[++i] = bs; + } + return s.length < 2 ? q[0] ? (b = q[0].x, function(t) { + return b(t) + ""; + }) : function() { + return b; + } : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); + } + var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g"); + d3.interpolate = d3_interpolate; + function d3_interpolate(a, b) { + var i = d3.interpolators.length, f; + while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ; + return f; + } + d3.interpolators = [ function(a, b) { + var t = typeof b; + return (t === "string" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\(|hsl\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === "object" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b); + } ]; + d3.interpolateArray = d3_interpolateArray; + function d3_interpolateArray(a, b) { + var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i; + for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i])); + for (;i < na; ++i) c[i] = a[i]; + for (;i < nb; ++i) c[i] = b[i]; + return function(t) { + for (i = 0; i < n0; ++i) c[i] = x[i](t); + return c; + }; + } + var d3_ease_default = function() { + return d3_identity; + }; + var d3_ease = d3.map({ + linear: d3_ease_default, + poly: d3_ease_poly, + quad: function() { + return d3_ease_quad; + }, + cubic: function() { + return d3_ease_cubic; + }, + sin: function() { + return d3_ease_sin; + }, + exp: function() { + return d3_ease_exp; + }, + circle: function() { + return d3_ease_circle; + }, + elastic: d3_ease_elastic, + back: d3_ease_back, + bounce: function() { + return d3_ease_bounce; + } + }); + var d3_ease_mode = d3.map({ + "in": d3_identity, + out: d3_ease_reverse, + "in-out": d3_ease_reflect, + "out-in": function(f) { + return d3_ease_reflect(d3_ease_reverse(f)); + } + }); + d3.ease = function(name) { + var i = name.indexOf("-"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : "in"; + t = d3_ease.get(t) || d3_ease_default; + m = d3_ease_mode.get(m) || d3_identity; + return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1)))); + }; + function d3_ease_clamp(f) { + return function(t) { + return t <= 0 ? 0 : t >= 1 ? 1 : f(t); + }; + } + function d3_ease_reverse(f) { + return function(t) { + return 1 - f(1 - t); + }; + } + function d3_ease_reflect(f) { + return function(t) { + return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t)); + }; + } + function d3_ease_quad(t) { + return t * t; + } + function d3_ease_cubic(t) { + return t * t * t; + } + function d3_ease_cubicInOut(t) { + if (t <= 0) return 0; + if (t >= 1) return 1; + var t2 = t * t, t3 = t2 * t; + return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75); + } + function d3_ease_poly(e) { + return function(t) { + return Math.pow(t, e); + }; + } + function d3_ease_sin(t) { + return 1 - Math.cos(t * halfπ); + } + function d3_ease_exp(t) { + return Math.pow(2, 10 * (t - 1)); + } + function d3_ease_circle(t) { + return 1 - Math.sqrt(1 - t * t); + } + function d3_ease_elastic(a, p) { + var s; + if (arguments.length < 2) p = .45; + if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4; + return function(t) { + return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p); + }; + } + function d3_ease_back(s) { + if (!s) s = 1.70158; + return function(t) { + return t * t * ((s + 1) * t - s); + }; + } + function d3_ease_bounce(t) { + return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; + } + d3.interpolateHcl = d3_interpolateHcl; + function d3_interpolateHcl(a, b) { + a = d3.hcl(a); + b = d3.hcl(b); + var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al; + if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac; + if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360; + return function(t) { + return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + ""; + }; + } + d3.interpolateHsl = d3_interpolateHsl; + function d3_interpolateHsl(a, b) { + a = d3.hsl(a); + b = d3.hsl(b); + var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al; + if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as; + if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360; + return function(t) { + return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + ""; + }; + } + d3.interpolateLab = d3_interpolateLab; + function d3_interpolateLab(a, b) { + a = d3.lab(a); + b = d3.lab(b); + var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab; + return function(t) { + return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + ""; + }; + } + d3.interpolateRound = d3_interpolateRound; + function d3_interpolateRound(a, b) { + b -= a; + return function(t) { + return Math.round(a + b * t); + }; + } + d3.transform = function(string) { + var g = d3_document.createElementNS(d3.ns.prefix.svg, "g"); + return (d3.transform = function(string) { + if (string != null) { + g.setAttribute("transform", string); + var t = g.transform.baseVal.consolidate(); + } + return new d3_transform(t ? t.matrix : d3_transformIdentity); + })(string); + }; + function d3_transform(m) { + var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0; + if (r0[0] * r1[1] < r1[0] * r0[1]) { + r0[0] *= -1; + r0[1] *= -1; + kx *= -1; + kz *= -1; + } + this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees; + this.translate = [ m.e, m.f ]; + this.scale = [ kx, ky ]; + this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0; + } + d3_transform.prototype.toString = function() { + return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")"; + }; + function d3_transformDot(a, b) { + return a[0] * b[0] + a[1] * b[1]; + } + function d3_transformNormalize(a) { + var k = Math.sqrt(d3_transformDot(a, a)); + if (k) { + a[0] /= k; + a[1] /= k; + } + return k; + } + function d3_transformCombine(a, b, k) { + a[0] += k * b[0]; + a[1] += k * b[1]; + return a; + } + var d3_transformIdentity = { + a: 1, + b: 0, + c: 0, + d: 1, + e: 0, + f: 0 + }; + d3.interpolateTransform = d3_interpolateTransform; + function d3_interpolateTransformPop(s) { + return s.length ? s.pop() + "," : ""; + } + function d3_interpolateTranslate(ta, tb, s, q) { + if (ta[0] !== tb[0] || ta[1] !== tb[1]) { + var i = s.push("translate(", null, ",", null, ")"); + q.push({ + i: i - 4, + x: d3_interpolateNumber(ta[0], tb[0]) + }, { + i: i - 2, + x: d3_interpolateNumber(ta[1], tb[1]) + }); + } else if (tb[0] || tb[1]) { + s.push("translate(" + tb + ")"); + } + } + function d3_interpolateRotate(ra, rb, s, q) { + if (ra !== rb) { + if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360; + q.push({ + i: s.push(d3_interpolateTransformPop(s) + "rotate(", null, ")") - 2, + x: d3_interpolateNumber(ra, rb) + }); + } else if (rb) { + s.push(d3_interpolateTransformPop(s) + "rotate(" + rb + ")"); + } + } + function d3_interpolateSkew(wa, wb, s, q) { + if (wa !== wb) { + q.push({ + i: s.push(d3_interpolateTransformPop(s) + "skewX(", null, ")") - 2, + x: d3_interpolateNumber(wa, wb) + }); + } else if (wb) { + s.push(d3_interpolateTransformPop(s) + "skewX(" + wb + ")"); + } + } + function d3_interpolateScale(ka, kb, s, q) { + if (ka[0] !== kb[0] || ka[1] !== kb[1]) { + var i = s.push(d3_interpolateTransformPop(s) + "scale(", null, ",", null, ")"); + q.push({ + i: i - 4, + x: d3_interpolateNumber(ka[0], kb[0]) + }, { + i: i - 2, + x: d3_interpolateNumber(ka[1], kb[1]) + }); + } else if (kb[0] !== 1 || kb[1] !== 1) { + s.push(d3_interpolateTransformPop(s) + "scale(" + kb + ")"); + } + } + function d3_interpolateTransform(a, b) { + var s = [], q = []; + a = d3.transform(a), b = d3.transform(b); + d3_interpolateTranslate(a.translate, b.translate, s, q); + d3_interpolateRotate(a.rotate, b.rotate, s, q); + d3_interpolateSkew(a.skew, b.skew, s, q); + d3_interpolateScale(a.scale, b.scale, s, q); + a = b = null; + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + } + function d3_uninterpolateNumber(a, b) { + b = (b -= a = +a) || 1 / b; + return function(x) { + return (x - a) / b; + }; + } + function d3_uninterpolateClamp(a, b) { + b = (b -= a = +a) || 1 / b; + return function(x) { + return Math.max(0, Math.min(1, (x - a) / b)); + }; + } + d3.layout = {}; + d3.layout.bundle = function() { + return function(links) { + var paths = [], i = -1, n = links.length; + while (++i < n) paths.push(d3_layout_bundlePath(links[i])); + return paths; + }; + }; + function d3_layout_bundlePath(link) { + var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ]; + while (start !== lca) { + start = start.parent; + points.push(start); + } + var k = points.length; + while (end !== lca) { + points.splice(k, 0, end); + end = end.parent; + } + return points; + } + function d3_layout_bundleAncestors(node) { + var ancestors = [], parent = node.parent; + while (parent != null) { + ancestors.push(node); + node = parent; + parent = parent.parent; + } + ancestors.push(node); + return ancestors; + } + function d3_layout_bundleLeastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null; + while (aNode === bNode) { + sharedNode = aNode; + aNode = aNodes.pop(); + bNode = bNodes.pop(); + } + return sharedNode; + } + d3.layout.chord = function() { + var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords; + function relayout() { + var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j; + chords = []; + groups = []; + k = 0, i = -1; + while (++i < n) { + x = 0, j = -1; + while (++j < n) { + x += matrix[i][j]; + } + groupSums.push(x); + subgroupIndex.push(d3.range(n)); + k += x; + } + if (sortGroups) { + groupIndex.sort(function(a, b) { + return sortGroups(groupSums[a], groupSums[b]); + }); + } + if (sortSubgroups) { + subgroupIndex.forEach(function(d, i) { + d.sort(function(a, b) { + return sortSubgroups(matrix[i][a], matrix[i][b]); + }); + }); + } + k = (τ - padding * n) / k; + x = 0, i = -1; + while (++i < n) { + x0 = x, j = -1; + while (++j < n) { + var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k; + subgroups[di + "-" + dj] = { + index: di, + subindex: dj, + startAngle: a0, + endAngle: a1, + value: v + }; + } + groups[di] = { + index: di, + startAngle: x0, + endAngle: x, + value: groupSums[di] + }; + x += padding; + } + i = -1; + while (++i < n) { + j = i - 1; + while (++j < n) { + var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i]; + if (source.value || target.value) { + chords.push(source.value < target.value ? { + source: target, + target: source + } : { + source: source, + target: target + }); + } + } + } + if (sortChords) resort(); + } + function resort() { + chords.sort(function(a, b) { + return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2); + }); + } + chord.matrix = function(x) { + if (!arguments.length) return matrix; + n = (matrix = x) && matrix.length; + chords = groups = null; + return chord; + }; + chord.padding = function(x) { + if (!arguments.length) return padding; + padding = x; + chords = groups = null; + return chord; + }; + chord.sortGroups = function(x) { + if (!arguments.length) return sortGroups; + sortGroups = x; + chords = groups = null; + return chord; + }; + chord.sortSubgroups = function(x) { + if (!arguments.length) return sortSubgroups; + sortSubgroups = x; + chords = null; + return chord; + }; + chord.sortChords = function(x) { + if (!arguments.length) return sortChords; + sortChords = x; + if (chords) resort(); + return chord; + }; + chord.chords = function() { + if (!chords) relayout(); + return chords; + }; + chord.groups = function() { + if (!groups) relayout(); + return groups; + }; + return chord; + }; + d3.layout.force = function() { + var force = {}, event = d3.dispatch("start", "tick", "end"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges; + function repulse(node) { + return function(quad, x1, _, x2) { + if (quad.point !== node) { + var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy; + if (dw * dw / theta2 < dn) { + if (dn < chargeDistance2) { + var k = quad.charge / dn; + node.px -= dx * k; + node.py -= dy * k; + } + return true; + } + if (quad.point && dn && dn < chargeDistance2) { + var k = quad.pointCharge / dn; + node.px -= dx * k; + node.py -= dy * k; + } + } + return !quad.charge; + }; + } + force.tick = function() { + if ((alpha *= .99) < .005) { + timer = null; + event.end({ + type: "end", + alpha: alpha = 0 + }); + return true; + } + var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y; + for (i = 0; i < m; ++i) { + o = links[i]; + s = o.source; + t = o.target; + x = t.x - s.x; + y = t.y - s.y; + if (l = x * x + y * y) { + l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; + x *= l; + y *= l; + t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5); + t.y -= y * k; + s.x += x * (k = 1 - k); + s.y += y * k; + } + } + if (k = alpha * gravity) { + x = size[0] / 2; + y = size[1] / 2; + i = -1; + if (k) while (++i < n) { + o = nodes[i]; + o.x += (x - o.x) * k; + o.y += (y - o.y) * k; + } + } + if (charge) { + d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges); + i = -1; + while (++i < n) { + if (!(o = nodes[i]).fixed) { + q.visit(repulse(o)); + } + } + } + i = -1; + while (++i < n) { + o = nodes[i]; + if (o.fixed) { + o.x = o.px; + o.y = o.py; + } else { + o.x -= (o.px - (o.px = o.x)) * friction; + o.y -= (o.py - (o.py = o.y)) * friction; + } + } + event.tick({ + type: "tick", + alpha: alpha + }); + }; + force.nodes = function(x) { + if (!arguments.length) return nodes; + nodes = x; + return force; + }; + force.links = function(x) { + if (!arguments.length) return links; + links = x; + return force; + }; + force.size = function(x) { + if (!arguments.length) return size; + size = x; + return force; + }; + force.linkDistance = function(x) { + if (!arguments.length) return linkDistance; + linkDistance = typeof x === "function" ? x : +x; + return force; + }; + force.distance = force.linkDistance; + force.linkStrength = function(x) { + if (!arguments.length) return linkStrength; + linkStrength = typeof x === "function" ? x : +x; + return force; + }; + force.friction = function(x) { + if (!arguments.length) return friction; + friction = +x; + return force; + }; + force.charge = function(x) { + if (!arguments.length) return charge; + charge = typeof x === "function" ? x : +x; + return force; + }; + force.chargeDistance = function(x) { + if (!arguments.length) return Math.sqrt(chargeDistance2); + chargeDistance2 = x * x; + return force; + }; + force.gravity = function(x) { + if (!arguments.length) return gravity; + gravity = +x; + return force; + }; + force.theta = function(x) { + if (!arguments.length) return Math.sqrt(theta2); + theta2 = x * x; + return force; + }; + force.alpha = function(x) { + if (!arguments.length) return alpha; + x = +x; + if (alpha) { + if (x > 0) { + alpha = x; + } else { + timer.c = null, timer.t = NaN, timer = null; + event.end({ + type: "end", + alpha: alpha = 0 + }); + } + } else if (x > 0) { + event.start({ + type: "start", + alpha: alpha = x + }); + timer = d3_timer(force.tick); + } + return force; + }; + force.start = function() { + var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o; + for (i = 0; i < n; ++i) { + (o = nodes[i]).index = i; + o.weight = 0; + } + for (i = 0; i < m; ++i) { + o = links[i]; + if (typeof o.source == "number") o.source = nodes[o.source]; + if (typeof o.target == "number") o.target = nodes[o.target]; + ++o.source.weight; + ++o.target.weight; + } + for (i = 0; i < n; ++i) { + o = nodes[i]; + if (isNaN(o.x)) o.x = position("x", w); + if (isNaN(o.y)) o.y = position("y", h); + if (isNaN(o.px)) o.px = o.x; + if (isNaN(o.py)) o.py = o.y; + } + distances = []; + if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance; + strengths = []; + if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength; + charges = []; + if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge; + function position(dimension, size) { + if (!neighbors) { + neighbors = new Array(n); + for (j = 0; j < n; ++j) { + neighbors[j] = []; + } + for (j = 0; j < m; ++j) { + var o = links[j]; + neighbors[o.source.index].push(o.target); + neighbors[o.target.index].push(o.source); + } + } + var candidates = neighbors[i], j = -1, l = candidates.length, x; + while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x; + return Math.random() * size; + } + return force.resume(); + }; + force.resume = function() { + return force.alpha(.1); + }; + force.stop = function() { + return force.alpha(0); + }; + force.drag = function() { + if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart.force", d3_layout_forceDragstart).on("drag.force", dragmove).on("dragend.force", d3_layout_forceDragend); + if (!arguments.length) return drag; + this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag); + }; + function dragmove(d) { + d.px = d3.event.x, d.py = d3.event.y; + force.resume(); + } + return d3.rebind(force, event, "on"); + }; + function d3_layout_forceDragstart(d) { + d.fixed |= 2; + } + function d3_layout_forceDragend(d) { + d.fixed &= ~6; + } + function d3_layout_forceMouseover(d) { + d.fixed |= 4; + d.px = d.x, d.py = d.y; + } + function d3_layout_forceMouseout(d) { + d.fixed &= ~4; + } + function d3_layout_forceAccumulate(quad, alpha, charges) { + var cx = 0, cy = 0; + quad.charge = 0; + if (!quad.leaf) { + var nodes = quad.nodes, n = nodes.length, i = -1, c; + while (++i < n) { + c = nodes[i]; + if (c == null) continue; + d3_layout_forceAccumulate(c, alpha, charges); + quad.charge += c.charge; + cx += c.charge * c.cx; + cy += c.charge * c.cy; + } + } + if (quad.point) { + if (!quad.leaf) { + quad.point.x += Math.random() - .5; + quad.point.y += Math.random() - .5; + } + var k = alpha * charges[quad.point.index]; + quad.charge += quad.pointCharge = k; + cx += k * quad.point.x; + cy += k * quad.point.y; + } + quad.cx = cx / quad.charge; + quad.cy = cy / quad.charge; + } + var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity; + d3.layout.hierarchy = function() { + var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue; + function hierarchy(root) { + var stack = [ root ], nodes = [], node; + root.depth = 0; + while ((node = stack.pop()) != null) { + nodes.push(node); + if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) { + var n, childs, child; + while (--n >= 0) { + stack.push(child = childs[n]); + child.parent = node; + child.depth = node.depth + 1; + } + if (value) node.value = 0; + node.children = childs; + } else { + if (value) node.value = +value.call(hierarchy, node, node.depth) || 0; + delete node.children; + } + } + d3_layout_hierarchyVisitAfter(root, function(node) { + var childs, parent; + if (sort && (childs = node.children)) childs.sort(sort); + if (value && (parent = node.parent)) parent.value += node.value; + }); + return nodes; + } + hierarchy.sort = function(x) { + if (!arguments.length) return sort; + sort = x; + return hierarchy; + }; + hierarchy.children = function(x) { + if (!arguments.length) return children; + children = x; + return hierarchy; + }; + hierarchy.value = function(x) { + if (!arguments.length) return value; + value = x; + return hierarchy; + }; + hierarchy.revalue = function(root) { + if (value) { + d3_layout_hierarchyVisitBefore(root, function(node) { + if (node.children) node.value = 0; + }); + d3_layout_hierarchyVisitAfter(root, function(node) { + var parent; + if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0; + if (parent = node.parent) parent.value += node.value; + }); + } + return root; + }; + return hierarchy; + }; + function d3_layout_hierarchyRebind(object, hierarchy) { + d3.rebind(object, hierarchy, "sort", "children", "value"); + object.nodes = object; + object.links = d3_layout_hierarchyLinks; + return object; + } + function d3_layout_hierarchyVisitBefore(node, callback) { + var nodes = [ node ]; + while ((node = nodes.pop()) != null) { + callback(node); + if ((children = node.children) && (n = children.length)) { + var n, children; + while (--n >= 0) nodes.push(children[n]); + } + } + } + function d3_layout_hierarchyVisitAfter(node, callback) { + var nodes = [ node ], nodes2 = []; + while ((node = nodes.pop()) != null) { + nodes2.push(node); + if ((children = node.children) && (n = children.length)) { + var i = -1, n, children; + while (++i < n) nodes.push(children[i]); + } + } + while ((node = nodes2.pop()) != null) { + callback(node); + } + } + function d3_layout_hierarchyChildren(d) { + return d.children; + } + function d3_layout_hierarchyValue(d) { + return d.value; + } + function d3_layout_hierarchySort(a, b) { + return b.value - a.value; + } + function d3_layout_hierarchyLinks(nodes) { + return d3.merge(nodes.map(function(parent) { + return (parent.children || []).map(function(child) { + return { + source: parent, + target: child + }; + }); + })); + } + d3.layout.partition = function() { + var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ]; + function position(node, x, dx, dy) { + var children = node.children; + node.x = x; + node.y = node.depth * dy; + node.dx = dx; + node.dy = dy; + if (children && (n = children.length)) { + var i = -1, n, c, d; + dx = node.value ? dx / node.value : 0; + while (++i < n) { + position(c = children[i], x, d = c.value * dx, dy); + x += d; + } + } + } + function depth(node) { + var children = node.children, d = 0; + if (children && (n = children.length)) { + var i = -1, n; + while (++i < n) d = Math.max(d, depth(children[i])); + } + return 1 + d; + } + function partition(d, i) { + var nodes = hierarchy.call(this, d, i); + position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); + return nodes; + } + partition.size = function(x) { + if (!arguments.length) return size; + size = x; + return partition; + }; + return d3_layout_hierarchyRebind(partition, hierarchy); + }; + d3.layout.pie = function() { + var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0; + function pie(data) { + var n = data.length, values = data.map(function(d, i) { + return +value.call(pie, d, i); + }), a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === "function" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v; + if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) { + return values[j] - values[i]; + } : function(i, j) { + return sort(data[i], data[j]); + }); + index.forEach(function(i) { + arcs[i] = { + data: data[i], + value: v = values[i], + startAngle: a, + endAngle: a += v * k + pa, + padAngle: p + }; + }); + return arcs; + } + pie.value = function(_) { + if (!arguments.length) return value; + value = _; + return pie; + }; + pie.sort = function(_) { + if (!arguments.length) return sort; + sort = _; + return pie; + }; + pie.startAngle = function(_) { + if (!arguments.length) return startAngle; + startAngle = _; + return pie; + }; + pie.endAngle = function(_) { + if (!arguments.length) return endAngle; + endAngle = _; + return pie; + }; + pie.padAngle = function(_) { + if (!arguments.length) return padAngle; + padAngle = _; + return pie; + }; + return pie; + }; + var d3_layout_pieSortByValue = {}; + d3.layout.stack = function() { + var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY; + function stack(data, index) { + if (!(n = data.length)) return data; + var series = data.map(function(d, i) { + return values.call(stack, d, i); + }); + var points = series.map(function(d) { + return d.map(function(v, i) { + return [ x.call(stack, v, i), y.call(stack, v, i) ]; + }); + }); + var orders = order.call(stack, points, index); + series = d3.permute(series, orders); + points = d3.permute(points, orders); + var offsets = offset.call(stack, points, index); + var m = series[0].length, n, i, j, o; + for (j = 0; j < m; ++j) { + out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); + for (i = 1; i < n; ++i) { + out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); + } + } + return data; + } + stack.values = function(x) { + if (!arguments.length) return values; + values = x; + return stack; + }; + stack.order = function(x) { + if (!arguments.length) return order; + order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault; + return stack; + }; + stack.offset = function(x) { + if (!arguments.length) return offset; + offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero; + return stack; + }; + stack.x = function(z) { + if (!arguments.length) return x; + x = z; + return stack; + }; + stack.y = function(z) { + if (!arguments.length) return y; + y = z; + return stack; + }; + stack.out = function(z) { + if (!arguments.length) return out; + out = z; + return stack; + }; + return stack; + }; + function d3_layout_stackX(d) { + return d.x; + } + function d3_layout_stackY(d) { + return d.y; + } + function d3_layout_stackOut(d, y0, y) { + d.y0 = y0; + d.y = y; + } + var d3_layout_stackOrders = d3.map({ + "inside-out": function(data) { + var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) { + return max[a] - max[b]; + }), top = 0, bottom = 0, tops = [], bottoms = []; + for (i = 0; i < n; ++i) { + j = index[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + return bottoms.reverse().concat(tops); + }, + reverse: function(data) { + return d3.range(data.length).reverse(); + }, + "default": d3_layout_stackOrderDefault + }); + var d3_layout_stackOffsets = d3.map({ + silhouette: function(data) { + var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = []; + for (j = 0; j < m; ++j) { + for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; + if (o > max) max = o; + sums.push(o); + } + for (j = 0; j < m; ++j) { + y0[j] = (max - sums[j]) / 2; + } + return y0; + }, + wiggle: function(data) { + var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = []; + y0[0] = o = o0 = 0; + for (j = 1; j < m; ++j) { + for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; + for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { + for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { + s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; + } + s2 += s3 * data[i][j][1]; + } + y0[j] = o -= s1 ? s2 / s1 * dx : 0; + if (o < o0) o0 = o; + } + for (j = 0; j < m; ++j) y0[j] -= o0; + return y0; + }, + expand: function(data) { + var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = []; + for (j = 0; j < m; ++j) { + for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; + if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k; + } + for (j = 0; j < m; ++j) y0[j] = 0; + return y0; + }, + zero: d3_layout_stackOffsetZero + }); + function d3_layout_stackOrderDefault(data) { + return d3.range(data.length); + } + function d3_layout_stackOffsetZero(data) { + var j = -1, m = data[0].length, y0 = []; + while (++j < m) y0[j] = 0; + return y0; + } + function d3_layout_stackMaxIndex(array) { + var i = 1, j = 0, v = array[0][1], k, n = array.length; + for (;i < n; ++i) { + if ((k = array[i][1]) > v) { + j = i; + v = k; + } + } + return j; + } + function d3_layout_stackReduceSum(d) { + return d.reduce(d3_layout_stackSum, 0); + } + function d3_layout_stackSum(p, d) { + return p + d[1]; + } + d3.layout.histogram = function() { + var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges; + function histogram(data, i) { + var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x; + while (++i < m) { + bin = bins[i] = []; + bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); + bin.y = 0; + } + if (m > 0) { + i = -1; + while (++i < n) { + x = values[i]; + if (x >= range[0] && x <= range[1]) { + bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; + bin.y += k; + bin.push(data[i]); + } + } + } + return bins; + } + histogram.value = function(x) { + if (!arguments.length) return valuer; + valuer = x; + return histogram; + }; + histogram.range = function(x) { + if (!arguments.length) return ranger; + ranger = d3_functor(x); + return histogram; + }; + histogram.bins = function(x) { + if (!arguments.length) return binner; + binner = typeof x === "number" ? function(range) { + return d3_layout_histogramBinFixed(range, x); + } : d3_functor(x); + return histogram; + }; + histogram.frequency = function(x) { + if (!arguments.length) return frequency; + frequency = !!x; + return histogram; + }; + return histogram; + }; + function d3_layout_histogramBinSturges(range, values) { + return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); + } + function d3_layout_histogramBinFixed(range, n) { + var x = -1, b = +range[0], m = (range[1] - b) / n, f = []; + while (++x <= n) f[x] = m * x + b; + return f; + } + function d3_layout_histogramRange(values) { + return [ d3.min(values), d3.max(values) ]; + } + d3.layout.pack = function() { + var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius; + function pack(d, i) { + var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === "function" ? radius : function() { + return radius; + }; + root.x = root.y = 0; + d3_layout_hierarchyVisitAfter(root, function(d) { + d.r = +r(d.value); + }); + d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings); + if (padding) { + var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2; + d3_layout_hierarchyVisitAfter(root, function(d) { + d.r += dr; + }); + d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings); + d3_layout_hierarchyVisitAfter(root, function(d) { + d.r -= dr; + }); + } + d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h)); + return nodes; + } + pack.size = function(_) { + if (!arguments.length) return size; + size = _; + return pack; + }; + pack.radius = function(_) { + if (!arguments.length) return radius; + radius = _ == null || typeof _ === "function" ? _ : +_; + return pack; + }; + pack.padding = function(_) { + if (!arguments.length) return padding; + padding = +_; + return pack; + }; + return d3_layout_hierarchyRebind(pack, hierarchy); + }; + function d3_layout_packSort(a, b) { + return a.value - b.value; + } + function d3_layout_packInsert(a, b) { + var c = a._pack_next; + a._pack_next = b; + b._pack_prev = a; + b._pack_next = c; + c._pack_prev = b; + } + function d3_layout_packSplice(a, b) { + a._pack_next = b; + b._pack_prev = a; + } + function d3_layout_packIntersects(a, b) { + var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r; + return .999 * dr * dr > dx * dx + dy * dy; + } + function d3_layout_packSiblings(node) { + if (!(nodes = node.children) || !(n = nodes.length)) return; + var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n; + function bound(node) { + xMin = Math.min(node.x - node.r, xMin); + xMax = Math.max(node.x + node.r, xMax); + yMin = Math.min(node.y - node.r, yMin); + yMax = Math.max(node.y + node.r, yMax); + } + nodes.forEach(d3_layout_packLink); + a = nodes[0]; + a.x = -a.r; + a.y = 0; + bound(a); + if (n > 1) { + b = nodes[1]; + b.x = b.r; + b.y = 0; + bound(b); + if (n > 2) { + c = nodes[2]; + d3_layout_packPlace(a, b, c); + bound(c); + d3_layout_packInsert(a, c); + a._pack_prev = c; + d3_layout_packInsert(c, b); + b = a._pack_next; + for (i = 3; i < n; i++) { + d3_layout_packPlace(a, b, c = nodes[i]); + var isect = 0, s1 = 1, s2 = 1; + for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { + if (d3_layout_packIntersects(j, c)) { + isect = 1; + break; + } + } + if (isect == 1) { + for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { + if (d3_layout_packIntersects(k, c)) { + break; + } + } + } + if (isect) { + if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b); + i--; + } else { + d3_layout_packInsert(a, c); + b = c; + bound(c); + } + } + } + } + var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0; + for (i = 0; i < n; i++) { + c = nodes[i]; + c.x -= cx; + c.y -= cy; + cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y)); + } + node.r = cr; + nodes.forEach(d3_layout_packUnlink); + } + function d3_layout_packLink(node) { + node._pack_next = node._pack_prev = node; + } + function d3_layout_packUnlink(node) { + delete node._pack_next; + delete node._pack_prev; + } + function d3_layout_packTransform(node, x, y, k) { + var children = node.children; + node.x = x += k * node.x; + node.y = y += k * node.y; + node.r *= k; + if (children) { + var i = -1, n = children.length; + while (++i < n) d3_layout_packTransform(children[i], x, y, k); + } + } + function d3_layout_packPlace(a, b, c) { + var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y; + if (db && (dx || dy)) { + var da = b.r + c.r, dc = dx * dx + dy * dy; + da *= da; + db *= db; + var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc); + c.x = a.x + x * dx + y * dy; + c.y = a.y + x * dy - y * dx; + } else { + c.x = a.x + db; + c.y = a.y; + } + } + d3.layout.tree = function() { + var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null; + function tree(d, i) { + var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0); + d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z; + d3_layout_hierarchyVisitBefore(root1, secondWalk); + if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else { + var left = root0, right = root0, bottom = root0; + d3_layout_hierarchyVisitBefore(root0, function(node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1); + d3_layout_hierarchyVisitBefore(root0, function(node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + return nodes; + } + function wrapTree(root0) { + var root1 = { + A: null, + children: [ root0 ] + }, queue = [ root1 ], node1; + while ((node1 = queue.pop()) != null) { + for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) { + queue.push((children[i] = child = { + _: children[i], + parent: node1, + children: (child = children[i].children) && child.slice() || [], + A: null, + a: null, + z: 0, + m: 0, + c: 0, + s: 0, + t: null, + i: i + }).a = child); + } + } + return root1.children[0]; + } + function firstWalk(v) { + var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null; + if (children.length) { + d3_layout_treeShift(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + function apportion(v, w, ancestor) { + if (w) { + var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift; + while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { + vom = d3_layout_treeLeft(vom); + vop = d3_layout_treeRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !d3_layout_treeRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !d3_layout_treeLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + function sizeNode(node) { + node.x *= size[0]; + node.y = node.depth * size[1]; + } + tree.separation = function(x) { + if (!arguments.length) return separation; + separation = x; + return tree; + }; + tree.size = function(x) { + if (!arguments.length) return nodeSize ? null : size; + nodeSize = (size = x) == null ? sizeNode : null; + return tree; + }; + tree.nodeSize = function(x) { + if (!arguments.length) return nodeSize ? size : null; + nodeSize = (size = x) == null ? null : sizeNode; + return tree; + }; + return d3_layout_hierarchyRebind(tree, hierarchy); + }; + function d3_layout_treeSeparation(a, b) { + return a.parent == b.parent ? 1 : 2; + } + function d3_layout_treeLeft(v) { + var children = v.children; + return children.length ? children[0] : v.t; + } + function d3_layout_treeRight(v) { + var children = v.children, n; + return (n = children.length) ? children[n - 1] : v.t; + } + function d3_layout_treeMove(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; + } + function d3_layout_treeShift(v) { + var shift = 0, change = 0, children = v.children, i = children.length, w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } + } + function d3_layout_treeAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; + } + d3.layout.cluster = function() { + var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false; + function cluster(d, i) { + var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0; + d3_layout_hierarchyVisitAfter(root, function(node) { + var children = node.children; + if (children && children.length) { + node.x = d3_layout_clusterX(children); + node.y = d3_layout_clusterY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2; + d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) { + node.x = (node.x - root.x) * size[0]; + node.y = (root.y - node.y) * size[1]; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * size[0]; + node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1]; + }); + return nodes; + } + cluster.separation = function(x) { + if (!arguments.length) return separation; + separation = x; + return cluster; + }; + cluster.size = function(x) { + if (!arguments.length) return nodeSize ? null : size; + nodeSize = (size = x) == null; + return cluster; + }; + cluster.nodeSize = function(x) { + if (!arguments.length) return nodeSize ? size : null; + nodeSize = (size = x) != null; + return cluster; + }; + return d3_layout_hierarchyRebind(cluster, hierarchy); + }; + function d3_layout_clusterY(children) { + return 1 + d3.max(children, function(child) { + return child.y; + }); + } + function d3_layout_clusterX(children) { + return children.reduce(function(x, child) { + return x + child.x; + }, 0) / children.length; + } + function d3_layout_clusterLeft(node) { + var children = node.children; + return children && children.length ? d3_layout_clusterLeft(children[0]) : node; + } + function d3_layout_clusterRight(node) { + var children = node.children, n; + return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node; + } + d3.layout.treemap = function() { + var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5)); + function scale(children, k) { + var i = -1, n = children.length, child, area; + while (++i < n) { + area = (child = children[i]).value * (k < 0 ? 0 : k); + child.area = isNaN(area) || area <= 0 ? 0 : area; + } + } + function squarify(node) { + var children = node.children; + if (children && children.length) { + var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" ? rect.dy : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n; + scale(remaining, rect.dx * rect.dy / node.value); + row.area = 0; + while ((n = remaining.length) > 0) { + row.push(child = remaining[n - 1]); + row.area += child.area; + if (mode !== "squarify" || (score = worst(row, u)) <= best) { + remaining.pop(); + best = score; + } else { + row.area -= row.pop().area; + position(row, u, rect, false); + u = Math.min(rect.dx, rect.dy); + row.length = row.area = 0; + best = Infinity; + } + } + if (row.length) { + position(row, u, rect, true); + row.length = row.area = 0; + } + children.forEach(squarify); + } + } + function stickify(node) { + var children = node.children; + if (children && children.length) { + var rect = pad(node), remaining = children.slice(), child, row = []; + scale(remaining, rect.dx * rect.dy / node.value); + row.area = 0; + while (child = remaining.pop()) { + row.push(child); + row.area += child.area; + if (child.z != null) { + position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length); + row.length = row.area = 0; + } + } + children.forEach(stickify); + } + } + function worst(row, u) { + var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length; + while (++i < n) { + if (!(r = row[i].area)) continue; + if (r < rmin) rmin = r; + if (r > rmax) rmax = r; + } + s *= s; + u *= u; + return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity; + } + function position(row, u, rect, flush) { + var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o; + if (u == rect.dx) { + if (flush || v > rect.dy) v = rect.dy; + while (++i < n) { + o = row[i]; + o.x = x; + o.y = y; + o.dy = v; + x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0); + } + o.z = true; + o.dx += rect.x + rect.dx - x; + rect.y += v; + rect.dy -= v; + } else { + if (flush || v > rect.dx) v = rect.dx; + while (++i < n) { + o = row[i]; + o.x = x; + o.y = y; + o.dx = v; + y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0); + } + o.z = false; + o.dy += rect.y + rect.dy - y; + rect.x += v; + rect.dx -= v; + } + } + function treemap(d) { + var nodes = stickies || hierarchy(d), root = nodes[0]; + root.x = root.y = 0; + if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0; + if (stickies) hierarchy.revalue(root); + scale([ root ], root.dx * root.dy / root.value); + (stickies ? stickify : squarify)(root); + if (sticky) stickies = nodes; + return nodes; + } + treemap.size = function(x) { + if (!arguments.length) return size; + size = x; + return treemap; + }; + treemap.padding = function(x) { + if (!arguments.length) return padding; + function padFunction(node) { + var p = x.call(treemap, node, node.depth); + return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p); + } + function padConstant(node) { + return d3_layout_treemapPad(node, x); + } + var type; + pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ], + padConstant) : padConstant; + return treemap; + }; + treemap.round = function(x) { + if (!arguments.length) return round != Number; + round = x ? Math.round : Number; + return treemap; + }; + treemap.sticky = function(x) { + if (!arguments.length) return sticky; + sticky = x; + stickies = null; + return treemap; + }; + treemap.ratio = function(x) { + if (!arguments.length) return ratio; + ratio = x; + return treemap; + }; + treemap.mode = function(x) { + if (!arguments.length) return mode; + mode = x + ""; + return treemap; + }; + return d3_layout_hierarchyRebind(treemap, hierarchy); + }; + function d3_layout_treemapPadNull(node) { + return { + x: node.x, + y: node.y, + dx: node.dx, + dy: node.dy + }; + } + function d3_layout_treemapPad(node, padding) { + var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2]; + if (dx < 0) { + x += dx / 2; + dx = 0; + } + if (dy < 0) { + y += dy / 2; + dy = 0; + } + return { + x: x, + y: y, + dx: dx, + dy: dy + }; + } + d3.random = { + normal: function(µ, σ) { + var n = arguments.length; + if (n < 2) σ = 1; + if (n < 1) µ = 0; + return function() { + var x, y, r; + do { + x = Math.random() * 2 - 1; + y = Math.random() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r); + }; + }, + logNormal: function() { + var random = d3.random.normal.apply(d3, arguments); + return function() { + return Math.exp(random()); + }; + }, + bates: function(m) { + var random = d3.random.irwinHall(m); + return function() { + return random() / m; + }; + }, + irwinHall: function(m) { + return function() { + for (var s = 0, j = 0; j < m; j++) s += Math.random(); + return s; + }; + } + }; + d3.scale = {}; + function d3_scaleExtent(domain) { + var start = domain[0], stop = domain[domain.length - 1]; + return start < stop ? [ start, stop ] : [ stop, start ]; + } + function d3_scaleRange(scale) { + return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range()); + } + function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { + var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]); + return function(x) { + return i(u(x)); + }; + } + function d3_scale_nice(domain, nice) { + var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx; + if (x1 < x0) { + dx = i0, i0 = i1, i1 = dx; + dx = x0, x0 = x1, x1 = dx; + } + domain[i0] = nice.floor(x0); + domain[i1] = nice.ceil(x1); + return domain; + } + function d3_scale_niceStep(step) { + return step ? { + floor: function(x) { + return Math.floor(x / step) * step; + }, + ceil: function(x) { + return Math.ceil(x / step) * step; + } + } : d3_scale_niceIdentity; + } + var d3_scale_niceIdentity = { + floor: d3_identity, + ceil: d3_identity + }; + function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { + var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1; + if (domain[k] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + while (++j <= k) { + u.push(uninterpolate(domain[j - 1], domain[j])); + i.push(interpolate(range[j - 1], range[j])); + } + return function(x) { + var j = d3.bisect(domain, x, 1, k) - 1; + return i[j](u[j](x)); + }; + } + d3.scale.linear = function() { + return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false); + }; + function d3_scale_linear(domain, range, interpolate, clamp) { + var output, input; + function rescale() { + var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; + output = linear(domain, range, uninterpolate, interpolate); + input = linear(range, domain, uninterpolate, d3_interpolate); + return scale; + } + function scale(x) { + return output(x); + } + scale.invert = function(y) { + return input(y); + }; + scale.domain = function(x) { + if (!arguments.length) return domain; + domain = x.map(Number); + return rescale(); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + return rescale(); + }; + scale.rangeRound = function(x) { + return scale.range(x).interpolate(d3_interpolateRound); + }; + scale.clamp = function(x) { + if (!arguments.length) return clamp; + clamp = x; + return rescale(); + }; + scale.interpolate = function(x) { + if (!arguments.length) return interpolate; + interpolate = x; + return rescale(); + }; + scale.ticks = function(m) { + return d3_scale_linearTicks(domain, m); + }; + scale.tickFormat = function(m, format) { + return d3_scale_linearTickFormat(domain, m, format); + }; + scale.nice = function(m) { + d3_scale_linearNice(domain, m); + return rescale(); + }; + scale.copy = function() { + return d3_scale_linear(domain, range, interpolate, clamp); + }; + return rescale(); + } + function d3_scale_linearRebind(scale, linear) { + return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp"); + } + function d3_scale_linearNice(domain, m) { + d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2])); + d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2])); + return domain; + } + function d3_scale_linearTickRange(domain, m) { + if (m == null) m = 10; + var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step; + if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2; + extent[0] = Math.ceil(extent[0] / step) * step; + extent[1] = Math.floor(extent[1] / step) * step + step * .5; + extent[2] = step; + return extent; + } + function d3_scale_linearTicks(domain, m) { + return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); + } + function d3_scale_linearTickFormat(domain, m, format) { + var range = d3_scale_linearTickRange(domain, m); + if (format) { + var match = d3_format_re.exec(format); + match.shift(); + if (match[8] === "s") { + var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1]))); + if (!match[7]) match[7] = "." + d3_scale_linearPrecision(prefix.scale(range[2])); + match[8] = "f"; + format = d3.format(match.join("")); + return function(d) { + return format(prefix.scale(d)) + prefix.symbol; + }; + } + if (!match[7]) match[7] = "." + d3_scale_linearFormatPrecision(match[8], range); + format = match.join(""); + } else { + format = ",." + d3_scale_linearPrecision(range[2]) + "f"; + } + return d3.format(format); + } + var d3_scale_linearFormatSignificant = { + s: 1, + g: 1, + p: 1, + r: 1, + e: 1 + }; + function d3_scale_linearPrecision(value) { + return -Math.floor(Math.log(value) / Math.LN10 + .01); + } + function d3_scale_linearFormatPrecision(type, range) { + var p = d3_scale_linearPrecision(range[2]); + return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== "e") : p - (type === "%") * 2; + } + d3.scale.log = function() { + return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]); + }; + function d3_scale_log(linear, base, positive, domain) { + function log(x) { + return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base); + } + function pow(x) { + return positive ? Math.pow(base, x) : -Math.pow(base, -x); + } + function scale(x) { + return linear(log(x)); + } + scale.invert = function(x) { + return pow(linear.invert(x)); + }; + scale.domain = function(x) { + if (!arguments.length) return domain; + positive = x[0] >= 0; + linear.domain((domain = x.map(Number)).map(log)); + return scale; + }; + scale.base = function(_) { + if (!arguments.length) return base; + base = +_; + linear.domain(domain.map(log)); + return scale; + }; + scale.nice = function() { + var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative); + linear.domain(niced); + domain = niced.map(pow); + return scale; + }; + scale.ticks = function() { + var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base; + if (isFinite(j - i)) { + if (positive) { + for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k); + ticks.push(pow(i)); + } else { + ticks.push(pow(i)); + for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k); + } + for (i = 0; ticks[i] < u; i++) {} + for (j = ticks.length; ticks[j - 1] > v; j--) {} + ticks = ticks.slice(i, j); + } + return ticks; + }; + scale.tickFormat = function(n, format) { + if (!arguments.length) return d3_scale_logFormat; + if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== "function") format = d3.format(format); + var k = Math.max(1, base * n / scale.ticks().length); + return function(d) { + var i = d / pow(Math.round(log(d))); + if (i * base < base - .5) i *= base; + return i <= k ? format(d) : ""; + }; + }; + scale.copy = function() { + return d3_scale_log(linear.copy(), base, positive, domain); + }; + return d3_scale_linearRebind(scale, linear); + } + var d3_scale_logFormat = d3.format(".0e"), d3_scale_logNiceNegative = { + floor: function(x) { + return -Math.ceil(-x); + }, + ceil: function(x) { + return -Math.floor(-x); + } + }; + d3.scale.pow = function() { + return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]); + }; + function d3_scale_pow(linear, exponent, domain) { + var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent); + function scale(x) { + return linear(powp(x)); + } + scale.invert = function(x) { + return powb(linear.invert(x)); + }; + scale.domain = function(x) { + if (!arguments.length) return domain; + linear.domain((domain = x.map(Number)).map(powp)); + return scale; + }; + scale.ticks = function(m) { + return d3_scale_linearTicks(domain, m); + }; + scale.tickFormat = function(m, format) { + return d3_scale_linearTickFormat(domain, m, format); + }; + scale.nice = function(m) { + return scale.domain(d3_scale_linearNice(domain, m)); + }; + scale.exponent = function(x) { + if (!arguments.length) return exponent; + powp = d3_scale_powPow(exponent = x); + powb = d3_scale_powPow(1 / exponent); + linear.domain(domain.map(powp)); + return scale; + }; + scale.copy = function() { + return d3_scale_pow(linear.copy(), exponent, domain); + }; + return d3_scale_linearRebind(scale, linear); + } + function d3_scale_powPow(e) { + return function(x) { + return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); + }; + } + d3.scale.sqrt = function() { + return d3.scale.pow().exponent(.5); + }; + d3.scale.ordinal = function() { + return d3_scale_ordinal([], { + t: "range", + a: [ [] ] + }); + }; + function d3_scale_ordinal(domain, ranger) { + var index, range, rangeBand; + function scale(x) { + return range[((index.get(x) || (ranger.t === "range" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length]; + } + function steps(start, step) { + return d3.range(domain.length).map(function(i) { + return start + step * i; + }); + } + scale.domain = function(x) { + if (!arguments.length) return domain; + domain = []; + index = new d3_Map(); + var i = -1, n = x.length, xi; + while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi)); + return scale[ranger.t].apply(scale, ranger.a); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + rangeBand = 0; + ranger = { + t: "range", + a: arguments + }; + return scale; + }; + scale.rangePoints = function(x, padding) { + if (arguments.length < 2) padding = 0; + var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, + 0) : (stop - start) / (domain.length - 1 + padding); + range = steps(start + step * padding / 2, step); + rangeBand = 0; + ranger = { + t: "rangePoints", + a: arguments + }; + return scale; + }; + scale.rangeRoundPoints = function(x, padding) { + if (arguments.length < 2) padding = 0; + var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), + 0) : (stop - start) / (domain.length - 1 + padding) | 0; + range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step); + rangeBand = 0; + ranger = { + t: "rangeRoundPoints", + a: arguments + }; + return scale; + }; + scale.rangeBands = function(x, padding, outerPadding) { + if (arguments.length < 2) padding = 0; + if (arguments.length < 3) outerPadding = padding; + var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding); + range = steps(start + step * outerPadding, step); + if (reverse) range.reverse(); + rangeBand = step * (1 - padding); + ranger = { + t: "rangeBands", + a: arguments + }; + return scale; + }; + scale.rangeRoundBands = function(x, padding, outerPadding) { + if (arguments.length < 2) padding = 0; + if (arguments.length < 3) outerPadding = padding; + var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)); + range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step); + if (reverse) range.reverse(); + rangeBand = Math.round(step * (1 - padding)); + ranger = { + t: "rangeRoundBands", + a: arguments + }; + return scale; + }; + scale.rangeBand = function() { + return rangeBand; + }; + scale.rangeExtent = function() { + return d3_scaleExtent(ranger.a[0]); + }; + scale.copy = function() { + return d3_scale_ordinal(domain, ranger); + }; + return scale.domain(domain); + } + d3.scale.category10 = function() { + return d3.scale.ordinal().range(d3_category10); + }; + d3.scale.category20 = function() { + return d3.scale.ordinal().range(d3_category20); + }; + d3.scale.category20b = function() { + return d3.scale.ordinal().range(d3_category20b); + }; + d3.scale.category20c = function() { + return d3.scale.ordinal().range(d3_category20c); + }; + var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString); + var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString); + var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString); + var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString); + d3.scale.quantile = function() { + return d3_scale_quantile([], []); + }; + function d3_scale_quantile(domain, range) { + var thresholds; + function rescale() { + var k = 0, q = range.length; + thresholds = []; + while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); + return scale; + } + function scale(x) { + if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)]; + } + scale.domain = function(x) { + if (!arguments.length) return domain; + domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending); + return rescale(); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + return rescale(); + }; + scale.quantiles = function() { + return thresholds; + }; + scale.invertExtent = function(y) { + y = range.indexOf(y); + return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ]; + }; + scale.copy = function() { + return d3_scale_quantile(domain, range); + }; + return rescale(); + } + d3.scale.quantize = function() { + return d3_scale_quantize(0, 1, [ 0, 1 ]); + }; + function d3_scale_quantize(x0, x1, range) { + var kx, i; + function scale(x) { + return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; + } + function rescale() { + kx = range.length / (x1 - x0); + i = range.length - 1; + return scale; + } + scale.domain = function(x) { + if (!arguments.length) return [ x0, x1 ]; + x0 = +x[0]; + x1 = +x[x.length - 1]; + return rescale(); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + return rescale(); + }; + scale.invertExtent = function(y) { + y = range.indexOf(y); + y = y < 0 ? NaN : y / kx + x0; + return [ y, y + 1 / kx ]; + }; + scale.copy = function() { + return d3_scale_quantize(x0, x1, range); + }; + return rescale(); + } + d3.scale.threshold = function() { + return d3_scale_threshold([ .5 ], [ 0, 1 ]); + }; + function d3_scale_threshold(domain, range) { + function scale(x) { + if (x <= x) return range[d3.bisect(domain, x)]; + } + scale.domain = function(_) { + if (!arguments.length) return domain; + domain = _; + return scale; + }; + scale.range = function(_) { + if (!arguments.length) return range; + range = _; + return scale; + }; + scale.invertExtent = function(y) { + y = range.indexOf(y); + return [ domain[y - 1], domain[y] ]; + }; + scale.copy = function() { + return d3_scale_threshold(domain, range); + }; + return scale; + } + d3.scale.identity = function() { + return d3_scale_identity([ 0, 1 ]); + }; + function d3_scale_identity(domain) { + function identity(x) { + return +x; + } + identity.invert = identity; + identity.domain = identity.range = function(x) { + if (!arguments.length) return domain; + domain = x.map(identity); + return identity; + }; + identity.ticks = function(m) { + return d3_scale_linearTicks(domain, m); + }; + identity.tickFormat = function(m, format) { + return d3_scale_linearTickFormat(domain, m, format); + }; + identity.copy = function() { + return d3_scale_identity(domain); + }; + return identity; + } + d3.svg = {}; + function d3_zero() { + return 0; + } + d3.svg.arc = function() { + var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle; + function arc() { + var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1; + if (r1 < r0) rc = r1, r1 = r0, r0 = rc; + if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : "") + "Z"; + var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = []; + if (ap = (+padAngle.apply(this, arguments) || 0) / 2) { + rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments); + if (!cw) p1 *= -1; + if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap)); + if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap)); + } + if (r1) { + x0 = r1 * Math.cos(a0 + p1); + y0 = r1 * Math.sin(a0 + p1); + x1 = r1 * Math.cos(a1 - p1); + y1 = r1 * Math.sin(a1 - p1); + var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1; + if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) { + var h1 = (a0 + a1) / 2; + x0 = r1 * Math.cos(h1); + y0 = r1 * Math.sin(h1); + x1 = y1 = null; + } + } else { + x0 = y0 = 0; + } + if (r0) { + x2 = r0 * Math.cos(a1 - p0); + y2 = r0 * Math.sin(a1 - p0); + x3 = r0 * Math.cos(a0 + p0); + y3 = r0 * Math.sin(a0 + p0); + var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1; + if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) { + var h0 = (a0 + a1) / 2; + x2 = r0 * Math.cos(h0); + y2 = r0 * Math.sin(h0); + x3 = y3 = null; + } + } else { + x2 = y2 = 0; + } + if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) { + cr = r0 < r1 ^ cw ? 0 : 1; + var rc1 = rc, rc0 = rc; + if (da < π) { + var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = Math.min(rc, (r0 - lc) / (kc - 1)); + rc1 = Math.min(rc, (r1 - lc) / (kc + 1)); + } + if (x1 != null) { + var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw); + if (rc === rc1) { + path.push("M", t30[0], "A", rc1, ",", rc1, " 0 0,", cr, " ", t30[1], "A", r1, ",", r1, " 0 ", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), ",", cw, " ", t12[1], "A", rc1, ",", rc1, " 0 0,", cr, " ", t12[0]); + } else { + path.push("M", t30[0], "A", rc1, ",", rc1, " 0 1,", cr, " ", t12[0]); + } + } else { + path.push("M", x0, ",", y0); + } + if (x3 != null) { + var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw); + if (rc === rc0) { + path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t21[1], "A", r0, ",", r0, " 0 ", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), ",", 1 - cw, " ", t03[1], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]); + } else { + path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]); + } + } else { + path.push("L", x2, ",", y2); + } + } else { + path.push("M", x0, ",", y0); + if (x1 != null) path.push("A", r1, ",", r1, " 0 ", l1, ",", cw, " ", x1, ",", y1); + path.push("L", x2, ",", y2); + if (x3 != null) path.push("A", r0, ",", r0, " 0 ", l0, ",", 1 - cw, " ", x3, ",", y3); + } + path.push("Z"); + return path.join(""); + } + function circleSegment(r1, cw) { + return "M0," + r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + -r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + r1; + } + arc.innerRadius = function(v) { + if (!arguments.length) return innerRadius; + innerRadius = d3_functor(v); + return arc; + }; + arc.outerRadius = function(v) { + if (!arguments.length) return outerRadius; + outerRadius = d3_functor(v); + return arc; + }; + arc.cornerRadius = function(v) { + if (!arguments.length) return cornerRadius; + cornerRadius = d3_functor(v); + return arc; + }; + arc.padRadius = function(v) { + if (!arguments.length) return padRadius; + padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v); + return arc; + }; + arc.startAngle = function(v) { + if (!arguments.length) return startAngle; + startAngle = d3_functor(v); + return arc; + }; + arc.endAngle = function(v) { + if (!arguments.length) return endAngle; + endAngle = d3_functor(v); + return arc; + }; + arc.padAngle = function(v) { + if (!arguments.length) return padAngle; + padAngle = d3_functor(v); + return arc; + }; + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ; + return [ Math.cos(a) * r, Math.sin(a) * r ]; + }; + return arc; + }; + var d3_svg_arcAuto = "auto"; + function d3_svg_arcInnerRadius(d) { + return d.innerRadius; + } + function d3_svg_arcOuterRadius(d) { + return d.outerRadius; + } + function d3_svg_arcStartAngle(d) { + return d.startAngle; + } + function d3_svg_arcEndAngle(d) { + return d.endAngle; + } + function d3_svg_arcPadAngle(d) { + return d && d.padAngle; + } + function d3_svg_arcSweep(x0, y0, x1, y1) { + return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1; + } + function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) { + var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3; + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ]; + } + function d3_svg_line(projection) { + var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7; + function line(data) { + var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y); + function segment() { + segments.push("M", interpolate(projection(points), tension)); + } + while (++i < n) { + if (defined.call(this, d = data[i], i)) { + points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]); + } else if (points.length) { + segment(); + points = []; + } + } + if (points.length) segment(); + return segments.length ? segments.join("") : null; + } + line.x = function(_) { + if (!arguments.length) return x; + x = _; + return line; + }; + line.y = function(_) { + if (!arguments.length) return y; + y = _; + return line; + }; + line.defined = function(_) { + if (!arguments.length) return defined; + defined = _; + return line; + }; + line.interpolate = function(_) { + if (!arguments.length) return interpolateKey; + if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key; + return line; + }; + line.tension = function(_) { + if (!arguments.length) return tension; + tension = _; + return line; + }; + return line; + } + d3.svg.line = function() { + return d3_svg_line(d3_identity); + }; + var d3_svg_lineInterpolators = d3.map({ + linear: d3_svg_lineLinear, + "linear-closed": d3_svg_lineLinearClosed, + step: d3_svg_lineStep, + "step-before": d3_svg_lineStepBefore, + "step-after": d3_svg_lineStepAfter, + basis: d3_svg_lineBasis, + "basis-open": d3_svg_lineBasisOpen, + "basis-closed": d3_svg_lineBasisClosed, + bundle: d3_svg_lineBundle, + cardinal: d3_svg_lineCardinal, + "cardinal-open": d3_svg_lineCardinalOpen, + "cardinal-closed": d3_svg_lineCardinalClosed, + monotone: d3_svg_lineMonotone + }); + d3_svg_lineInterpolators.forEach(function(key, value) { + value.key = key; + value.closed = /-closed$/.test(key); + }); + function d3_svg_lineLinear(points) { + return points.length > 1 ? points.join("L") : points + "Z"; + } + function d3_svg_lineLinearClosed(points) { + return points.join("L") + "Z"; + } + function d3_svg_lineStep(points) { + var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; + while (++i < n) path.push("H", (p[0] + (p = points[i])[0]) / 2, "V", p[1]); + if (n > 1) path.push("H", p[0]); + return path.join(""); + } + function d3_svg_lineStepBefore(points) { + var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; + while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); + return path.join(""); + } + function d3_svg_lineStepAfter(points) { + var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; + while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); + return path.join(""); + } + function d3_svg_lineCardinalOpen(points, tension) { + return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension)); + } + function d3_svg_lineCardinalClosed(points, tension) { + return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), + points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension)); + } + function d3_svg_lineCardinal(points, tension) { + return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension)); + } + function d3_svg_lineHermite(points, tangents) { + if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) { + return d3_svg_lineLinear(points); + } + var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1; + if (quad) { + path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1]; + p0 = points[1]; + pi = 2; + } + if (tangents.length > 1) { + t = tangents[1]; + p = points[pi]; + pi++; + path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1]; + for (var i = 2; i < tangents.length; i++, pi++) { + p = points[pi]; + t = tangents[i]; + path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1]; + } + } + if (quad) { + var lp = points[pi]; + path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1]; + } + return path; + } + function d3_svg_lineCardinalTangents(points, tension) { + var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length; + while (++i < n) { + p0 = p1; + p1 = p2; + p2 = points[i]; + tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]); + } + return tangents; + } + function d3_svg_lineBasis(points) { + if (points.length < 3) return d3_svg_lineLinear(points); + var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0, "L", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ]; + points.push(points[n - 1]); + while (++i <= n) { + pi = points[i]; + px.shift(); + px.push(pi[0]); + py.shift(); + py.push(pi[1]); + d3_svg_lineBasisBezier(path, px, py); + } + points.pop(); + path.push("L", pi); + return path.join(""); + } + function d3_svg_lineBasisOpen(points) { + if (points.length < 4) return d3_svg_lineLinear(points); + var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ]; + while (++i < 3) { + pi = points[i]; + px.push(pi[0]); + py.push(pi[1]); + } + path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); + --i; + while (++i < n) { + pi = points[i]; + px.shift(); + px.push(pi[0]); + py.shift(); + py.push(pi[1]); + d3_svg_lineBasisBezier(path, px, py); + } + return path.join(""); + } + function d3_svg_lineBasisClosed(points) { + var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = []; + while (++i < 4) { + pi = points[i % n]; + px.push(pi[0]); + py.push(pi[1]); + } + path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ]; + --i; + while (++i < m) { + pi = points[i % n]; + px.shift(); + px.push(pi[0]); + py.shift(); + py.push(pi[1]); + d3_svg_lineBasisBezier(path, px, py); + } + return path.join(""); + } + function d3_svg_lineBundle(points, tension) { + var n = points.length - 1; + if (n) { + var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t; + while (++i <= n) { + p = points[i]; + t = i / n; + p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); + p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); + } + } + return d3_svg_lineBasis(points); + } + function d3_svg_lineDot4(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; + } + var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ]; + function d3_svg_lineBasisBezier(path, x, y) { + path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); + } + function d3_svg_lineSlope(p0, p1) { + return (p1[1] - p0[1]) / (p1[0] - p0[0]); + } + function d3_svg_lineFiniteDifferences(points) { + var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1); + while (++i < j) { + m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2; + } + m[i] = d; + return m; + } + function d3_svg_lineMonotoneTangents(points) { + var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1; + while (++i < j) { + d = d3_svg_lineSlope(points[i], points[i + 1]); + if (abs(d) < ε) { + m[i] = m[i + 1] = 0; + } else { + a = m[i] / d; + b = m[i + 1] / d; + s = a * a + b * b; + if (s > 9) { + s = d * 3 / Math.sqrt(s); + m[i] = s * a; + m[i + 1] = s * b; + } + } + } + i = -1; + while (++i <= j) { + s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i])); + tangents.push([ s || 0, m[i] * s || 0 ]); + } + return tangents; + } + function d3_svg_lineMonotone(points) { + return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); + } + d3.svg.line.radial = function() { + var line = d3_svg_line(d3_svg_lineRadial); + line.radius = line.x, delete line.x; + line.angle = line.y, delete line.y; + return line; + }; + function d3_svg_lineRadial(points) { + var point, i = -1, n = points.length, r, a; + while (++i < n) { + point = points[i]; + r = point[0]; + a = point[1] - halfπ; + point[0] = r * Math.cos(a); + point[1] = r * Math.sin(a); + } + return points; + } + function d3_svg_area(projection) { + var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7; + function area(data) { + var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() { + return x; + } : d3_functor(x1), fy1 = y0 === y1 ? function() { + return y; + } : d3_functor(y1), x, y; + function segment() { + segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z"); + } + while (++i < n) { + if (defined.call(this, d = data[i], i)) { + points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]); + points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]); + } else if (points0.length) { + segment(); + points0 = []; + points1 = []; + } + } + if (points0.length) segment(); + return segments.length ? segments.join("") : null; + } + area.x = function(_) { + if (!arguments.length) return x1; + x0 = x1 = _; + return area; + }; + area.x0 = function(_) { + if (!arguments.length) return x0; + x0 = _; + return area; + }; + area.x1 = function(_) { + if (!arguments.length) return x1; + x1 = _; + return area; + }; + area.y = function(_) { + if (!arguments.length) return y1; + y0 = y1 = _; + return area; + }; + area.y0 = function(_) { + if (!arguments.length) return y0; + y0 = _; + return area; + }; + area.y1 = function(_) { + if (!arguments.length) return y1; + y1 = _; + return area; + }; + area.defined = function(_) { + if (!arguments.length) return defined; + defined = _; + return area; + }; + area.interpolate = function(_) { + if (!arguments.length) return interpolateKey; + if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key; + interpolateReverse = interpolate.reverse || interpolate; + L = interpolate.closed ? "M" : "L"; + return area; + }; + area.tension = function(_) { + if (!arguments.length) return tension; + tension = _; + return area; + }; + return area; + } + d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter; + d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore; + d3.svg.area = function() { + return d3_svg_area(d3_identity); + }; + d3.svg.area.radial = function() { + var area = d3_svg_area(d3_svg_lineRadial); + area.radius = area.x, delete area.x; + area.innerRadius = area.x0, delete area.x0; + area.outerRadius = area.x1, delete area.x1; + area.angle = area.y, delete area.y; + area.startAngle = area.y0, delete area.y0; + area.endAngle = area.y1, delete area.y1; + return area; + }; + d3.svg.chord = function() { + var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle; + function chord(d, i) { + var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i); + return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z"; + } + function subgroup(self, f, d, i) { + var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ; + return { + r: r, + a0: a0, + a1: a1, + p0: [ r * Math.cos(a0), r * Math.sin(a0) ], + p1: [ r * Math.cos(a1), r * Math.sin(a1) ] + }; + } + function equals(a, b) { + return a.a0 == b.a0 && a.a1 == b.a1; + } + function arc(r, p, a) { + return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p; + } + function curve(r0, p0, r1, p1) { + return "Q 0,0 " + p1; + } + chord.radius = function(v) { + if (!arguments.length) return radius; + radius = d3_functor(v); + return chord; + }; + chord.source = function(v) { + if (!arguments.length) return source; + source = d3_functor(v); + return chord; + }; + chord.target = function(v) { + if (!arguments.length) return target; + target = d3_functor(v); + return chord; + }; + chord.startAngle = function(v) { + if (!arguments.length) return startAngle; + startAngle = d3_functor(v); + return chord; + }; + chord.endAngle = function(v) { + if (!arguments.length) return endAngle; + endAngle = d3_functor(v); + return chord; + }; + return chord; + }; + function d3_svg_chordRadius(d) { + return d.radius; + } + d3.svg.diagonal = function() { + var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection; + function diagonal(d, i) { + var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, { + x: p0.x, + y: m + }, { + x: p3.x, + y: m + }, p3 ]; + p = p.map(projection); + return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; + } + diagonal.source = function(x) { + if (!arguments.length) return source; + source = d3_functor(x); + return diagonal; + }; + diagonal.target = function(x) { + if (!arguments.length) return target; + target = d3_functor(x); + return diagonal; + }; + diagonal.projection = function(x) { + if (!arguments.length) return projection; + projection = x; + return diagonal; + }; + return diagonal; + }; + function d3_svg_diagonalProjection(d) { + return [ d.x, d.y ]; + } + d3.svg.diagonal.radial = function() { + var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection; + diagonal.projection = function(x) { + return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection; + }; + return diagonal; + }; + function d3_svg_diagonalRadialProjection(projection) { + return function() { + var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ; + return [ r * Math.cos(a), r * Math.sin(a) ]; + }; + } + d3.svg.symbol = function() { + var type = d3_svg_symbolType, size = d3_svg_symbolSize; + function symbol(d, i) { + return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i)); + } + symbol.type = function(x) { + if (!arguments.length) return type; + type = d3_functor(x); + return symbol; + }; + symbol.size = function(x) { + if (!arguments.length) return size; + size = d3_functor(x); + return symbol; + }; + return symbol; + }; + function d3_svg_symbolSize() { + return 64; + } + function d3_svg_symbolType() { + return "circle"; + } + function d3_svg_symbolCircle(size) { + var r = Math.sqrt(size / π); + return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z"; + } + var d3_svg_symbols = d3.map({ + circle: d3_svg_symbolCircle, + cross: function(size) { + var r = Math.sqrt(size / 5) / 2; + return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z"; + }, + diamond: function(size) { + var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30; + return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z"; + }, + square: function(size) { + var r = Math.sqrt(size) / 2; + return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z"; + }, + "triangle-down": function(size) { + var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2; + return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z"; + }, + "triangle-up": function(size) { + var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2; + return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z"; + } + }); + d3.svg.symbolTypes = d3_svg_symbols.keys(); + var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians); + d3_selectionPrototype.transition = function(name) { + var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || { + time: Date.now(), + ease: d3_ease_cubicInOut, + delay: 0, + duration: 250 + }; + for (var j = -1, m = this.length; ++j < m; ) { + subgroups.push(subgroup = []); + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) d3_transitionNode(node, i, ns, id, transition); + subgroup.push(node); + } + } + return d3_transition(subgroups, ns, id); + }; + d3_selectionPrototype.interrupt = function(name) { + return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name))); + }; + var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace()); + function d3_selection_interruptNS(ns) { + return function() { + var lock, activeId, active; + if ((lock = this[ns]) && (active = lock[activeId = lock.active])) { + active.timer.c = null; + active.timer.t = NaN; + if (--lock.count) delete lock[activeId]; else delete this[ns]; + lock.active += .5; + active.event && active.event.interrupt.call(this, this.__data__, active.index); + } + }; + } + function d3_transition(groups, ns, id) { + d3_subclass(groups, d3_transitionPrototype); + groups.namespace = ns; + groups.id = id; + return groups; + } + var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit; + d3_transitionPrototype.call = d3_selectionPrototype.call; + d3_transitionPrototype.empty = d3_selectionPrototype.empty; + d3_transitionPrototype.node = d3_selectionPrototype.node; + d3_transitionPrototype.size = d3_selectionPrototype.size; + d3.transition = function(selection, name) { + return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection); + }; + d3.transition.prototype = d3_transitionPrototype; + d3_transitionPrototype.select = function(selector) { + var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node; + selector = d3_selection_selector(selector); + for (var j = -1, m = this.length; ++j < m; ) { + subgroups.push(subgroup = []); + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + d3_transitionNode(subnode, i, ns, id, node[ns][id]); + subgroup.push(subnode); + } else { + subgroup.push(null); + } + } + } + return d3_transition(subgroups, ns, id); + }; + d3_transitionPrototype.selectAll = function(selector) { + var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition; + selector = d3_selection_selectorAll(selector); + for (var j = -1, m = this.length; ++j < m; ) { + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + transition = node[ns][id]; + subnodes = selector.call(node, node.__data__, i, j); + subgroups.push(subgroup = []); + for (var k = -1, o = subnodes.length; ++k < o; ) { + if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition); + subgroup.push(subnode); + } + } + } + } + return d3_transition(subgroups, ns, id); + }; + d3_transitionPrototype.filter = function(filter) { + var subgroups = [], subgroup, group, node; + if (typeof filter !== "function") filter = d3_selection_filter(filter); + for (var j = 0, m = this.length; j < m; j++) { + subgroups.push(subgroup = []); + for (var group = this[j], i = 0, n = group.length; i < n; i++) { + if ((node = group[i]) && filter.call(node, node.__data__, i, j)) { + subgroup.push(node); + } + } + } + return d3_transition(subgroups, this.namespace, this.id); + }; + d3_transitionPrototype.tween = function(name, tween) { + var id = this.id, ns = this.namespace; + if (arguments.length < 2) return this.node()[ns][id].tween.get(name); + return d3_selection_each(this, tween == null ? function(node) { + node[ns][id].tween.remove(name); + } : function(node) { + node[ns][id].tween.set(name, tween); + }); + }; + function d3_transition_tween(groups, name, value, tween) { + var id = groups.id, ns = groups.namespace; + return d3_selection_each(groups, typeof value === "function" ? function(node, i, j) { + node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j))); + } : (value = tween(value), function(node) { + node[ns][id].tween.set(name, value); + })); + } + d3_transitionPrototype.attr = function(nameNS, value) { + if (arguments.length < 2) { + for (value in nameNS) this.attr(value, nameNS[value]); + return this; + } + var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS); + function attrNull() { + this.removeAttribute(name); + } + function attrNullNS() { + this.removeAttributeNS(name.space, name.local); + } + function attrTween(b) { + return b == null ? attrNull : (b += "", function() { + var a = this.getAttribute(name), i; + return a !== b && (i = interpolate(a, b), function(t) { + this.setAttribute(name, i(t)); + }); + }); + } + function attrTweenNS(b) { + return b == null ? attrNullNS : (b += "", function() { + var a = this.getAttributeNS(name.space, name.local), i; + return a !== b && (i = interpolate(a, b), function(t) { + this.setAttributeNS(name.space, name.local, i(t)); + }); + }); + } + return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween); + }; + d3_transitionPrototype.attrTween = function(nameNS, tween) { + var name = d3.ns.qualify(nameNS); + function attrTween(d, i) { + var f = tween.call(this, d, i, this.getAttribute(name)); + return f && function(t) { + this.setAttribute(name, f(t)); + }; + } + function attrTweenNS(d, i) { + var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); + return f && function(t) { + this.setAttributeNS(name.space, name.local, f(t)); + }; + } + return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween); + }; + d3_transitionPrototype.style = function(name, value, priority) { + var n = arguments.length; + if (n < 3) { + if (typeof name !== "string") { + if (n < 2) value = ""; + for (priority in name) this.style(priority, name[priority], value); + return this; + } + priority = ""; + } + function styleNull() { + this.style.removeProperty(name); + } + function styleString(b) { + return b == null ? styleNull : (b += "", function() { + var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i; + return a !== b && (i = d3_interpolate(a, b), function(t) { + this.style.setProperty(name, i(t), priority); + }); + }); + } + return d3_transition_tween(this, "style." + name, value, styleString); + }; + d3_transitionPrototype.styleTween = function(name, tween, priority) { + if (arguments.length < 3) priority = ""; + function styleTween(d, i) { + var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name)); + return f && function(t) { + this.style.setProperty(name, f(t), priority); + }; + } + return this.tween("style." + name, styleTween); + }; + d3_transitionPrototype.text = function(value) { + return d3_transition_tween(this, "text", value, d3_transition_text); + }; + function d3_transition_text(b) { + if (b == null) b = ""; + return function() { + this.textContent = b; + }; + } + d3_transitionPrototype.remove = function() { + var ns = this.namespace; + return this.each("end.transition", function() { + var p; + if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this); + }); + }; + d3_transitionPrototype.ease = function(value) { + var id = this.id, ns = this.namespace; + if (arguments.length < 1) return this.node()[ns][id].ease; + if (typeof value !== "function") value = d3.ease.apply(d3, arguments); + return d3_selection_each(this, function(node) { + node[ns][id].ease = value; + }); + }; + d3_transitionPrototype.delay = function(value) { + var id = this.id, ns = this.namespace; + if (arguments.length < 1) return this.node()[ns][id].delay; + return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { + node[ns][id].delay = +value.call(node, node.__data__, i, j); + } : (value = +value, function(node) { + node[ns][id].delay = value; + })); + }; + d3_transitionPrototype.duration = function(value) { + var id = this.id, ns = this.namespace; + if (arguments.length < 1) return this.node()[ns][id].duration; + return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { + node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j)); + } : (value = Math.max(1, value), function(node) { + node[ns][id].duration = value; + })); + }; + d3_transitionPrototype.each = function(type, listener) { + var id = this.id, ns = this.namespace; + if (arguments.length < 2) { + var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId; + try { + d3_transitionInheritId = id; + d3_selection_each(this, function(node, i, j) { + d3_transitionInherit = node[ns][id]; + type.call(node, node.__data__, i, j); + }); + } finally { + d3_transitionInherit = inherit; + d3_transitionInheritId = inheritId; + } + } else { + d3_selection_each(this, function(node) { + var transition = node[ns][id]; + (transition.event || (transition.event = d3.dispatch("start", "end", "interrupt"))).on(type, listener); + }); + } + return this; + }; + d3_transitionPrototype.transition = function() { + var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition; + for (var j = 0, m = this.length; j < m; j++) { + subgroups.push(subgroup = []); + for (var group = this[j], i = 0, n = group.length; i < n; i++) { + if (node = group[i]) { + transition = node[ns][id0]; + d3_transitionNode(node, i, ns, id1, { + time: transition.time, + ease: transition.ease, + delay: transition.delay + transition.duration, + duration: transition.duration + }); + } + subgroup.push(node); + } + } + return d3_transition(subgroups, ns, id1); + }; + function d3_transitionNamespace(name) { + return name == null ? "__transition__" : "__transition_" + name + "__"; + } + function d3_transitionNode(node, i, ns, id, inherit) { + var lock = node[ns] || (node[ns] = { + active: 0, + count: 0 + }), transition = lock[id], time, timer, duration, ease, tweens; + function schedule(elapsed) { + var delay = transition.delay; + timer.t = delay + time; + if (delay <= elapsed) return start(elapsed - delay); + timer.c = start; + } + function start(elapsed) { + var activeId = lock.active, active = lock[activeId]; + if (active) { + active.timer.c = null; + active.timer.t = NaN; + --lock.count; + delete lock[activeId]; + active.event && active.event.interrupt.call(node, node.__data__, active.index); + } + for (var cancelId in lock) { + if (+cancelId < id) { + var cancel = lock[cancelId]; + cancel.timer.c = null; + cancel.timer.t = NaN; + --lock.count; + delete lock[cancelId]; + } + } + timer.c = tick; + d3_timer(function() { + if (timer.c && tick(elapsed || 1)) { + timer.c = null; + timer.t = NaN; + } + return 1; + }, 0, time); + lock.active = id; + transition.event && transition.event.start.call(node, node.__data__, i); + tweens = []; + transition.tween.forEach(function(key, value) { + if (value = value.call(node, node.__data__, i)) { + tweens.push(value); + } + }); + ease = transition.ease; + duration = transition.duration; + } + function tick(elapsed) { + var t = elapsed / duration, e = ease(t), n = tweens.length; + while (n > 0) { + tweens[--n].call(node, e); + } + if (t >= 1) { + transition.event && transition.event.end.call(node, node.__data__, i); + if (--lock.count) delete lock[id]; else delete node[ns]; + return 1; + } + } + if (!transition) { + time = inherit.time; + timer = d3_timer(schedule, 0, time); + transition = lock[id] = { + tween: new d3_Map(), + time: time, + timer: timer, + delay: inherit.delay, + duration: inherit.duration, + ease: inherit.ease, + index: i + }; + inherit = null; + ++lock.count; + } + } + d3.svg.axis = function() { + var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_; + function axis(g) { + g.each(function() { + var g = d3.select(this); + var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy(); + var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(".tick").data(ticks, scale1), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", ε), tickExit = d3.transition(tick.exit()).style("opacity", ε).remove(), tickUpdate = d3.transition(tick.order()).style("opacity", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform; + var range = d3_scaleRange(scale1), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"), + d3.transition(path)); + tickEnter.append("line"); + tickEnter.append("text"); + var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text"), sign = orient === "top" || orient === "left" ? -1 : 1, x1, x2, y1, y2; + if (orient === "bottom" || orient === "top") { + tickTransform = d3_svg_axisX, x1 = "x", y1 = "y", x2 = "x2", y2 = "y2"; + text.attr("dy", sign < 0 ? "0em" : ".71em").style("text-anchor", "middle"); + pathUpdate.attr("d", "M" + range[0] + "," + sign * outerTickSize + "V0H" + range[1] + "V" + sign * outerTickSize); + } else { + tickTransform = d3_svg_axisY, x1 = "y", y1 = "x", x2 = "y2", y2 = "x2"; + text.attr("dy", ".32em").style("text-anchor", sign < 0 ? "end" : "start"); + pathUpdate.attr("d", "M" + sign * outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + sign * outerTickSize); + } + lineEnter.attr(y2, sign * innerTickSize); + textEnter.attr(y1, sign * tickSpacing); + lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize); + textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing); + if (scale1.rangeBand) { + var x = scale1, dx = x.rangeBand() / 2; + scale0 = scale1 = function(d) { + return x(d) + dx; + }; + } else if (scale0.rangeBand) { + scale0 = scale1; + } else { + tickExit.call(tickTransform, scale1, scale0); + } + tickEnter.call(tickTransform, scale0, scale1); + tickUpdate.call(tickTransform, scale1, scale1); + }); + } + axis.scale = function(x) { + if (!arguments.length) return scale; + scale = x; + return axis; + }; + axis.orient = function(x) { + if (!arguments.length) return orient; + orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient; + return axis; + }; + axis.ticks = function() { + if (!arguments.length) return tickArguments_; + tickArguments_ = d3_array(arguments); + return axis; + }; + axis.tickValues = function(x) { + if (!arguments.length) return tickValues; + tickValues = x; + return axis; + }; + axis.tickFormat = function(x) { + if (!arguments.length) return tickFormat_; + tickFormat_ = x; + return axis; + }; + axis.tickSize = function(x) { + var n = arguments.length; + if (!n) return innerTickSize; + innerTickSize = +x; + outerTickSize = +arguments[n - 1]; + return axis; + }; + axis.innerTickSize = function(x) { + if (!arguments.length) return innerTickSize; + innerTickSize = +x; + return axis; + }; + axis.outerTickSize = function(x) { + if (!arguments.length) return outerTickSize; + outerTickSize = +x; + return axis; + }; + axis.tickPadding = function(x) { + if (!arguments.length) return tickPadding; + tickPadding = +x; + return axis; + }; + axis.tickSubdivide = function() { + return arguments.length && axis; + }; + return axis; + }; + var d3_svg_axisDefaultOrient = "bottom", d3_svg_axisOrients = { + top: 1, + right: 1, + bottom: 1, + left: 1 + }; + function d3_svg_axisX(selection, x0, x1) { + selection.attr("transform", function(d) { + var v0 = x0(d); + return "translate(" + (isFinite(v0) ? v0 : x1(d)) + ",0)"; + }); + } + function d3_svg_axisY(selection, y0, y1) { + selection.attr("transform", function(d) { + var v0 = y0(d); + return "translate(0," + (isFinite(v0) ? v0 : y1(d)) + ")"; + }); + } + d3.svg.brush = function() { + var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0]; + function brush(g) { + g.each(function() { + var g = d3.select(this).style("pointer-events", "all").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart); + var background = g.selectAll(".background").data([ 0 ]); + background.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair"); + g.selectAll(".extent").data([ 0 ]).enter().append("rect").attr("class", "extent").style("cursor", "move"); + var resize = g.selectAll(".resize").data(resizes, d3_identity); + resize.exit().remove(); + resize.enter().append("g").attr("class", function(d) { + return "resize " + d; + }).style("cursor", function(d) { + return d3_svg_brushCursor[d]; + }).append("rect").attr("x", function(d) { + return /[ew]$/.test(d) ? -3 : null; + }).attr("y", function(d) { + return /^[ns]/.test(d) ? -3 : null; + }).attr("width", 6).attr("height", 6).style("visibility", "hidden"); + resize.style("display", brush.empty() ? "none" : null); + var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range; + if (x) { + range = d3_scaleRange(x); + backgroundUpdate.attr("x", range[0]).attr("width", range[1] - range[0]); + redrawX(gUpdate); + } + if (y) { + range = d3_scaleRange(y); + backgroundUpdate.attr("y", range[0]).attr("height", range[1] - range[0]); + redrawY(gUpdate); + } + redraw(gUpdate); + }); + } + brush.event = function(g) { + g.each(function() { + var event_ = event.of(this, arguments), extent1 = { + x: xExtent, + y: yExtent, + i: xExtentDomain, + j: yExtentDomain + }, extent0 = this.__chart__ || extent1; + this.__chart__ = extent1; + if (d3_transitionInheritId) { + d3.select(this).transition().each("start.brush", function() { + xExtentDomain = extent0.i; + yExtentDomain = extent0.j; + xExtent = extent0.x; + yExtent = extent0.y; + event_({ + type: "brushstart" + }); + }).tween("brush:brush", function() { + var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y); + xExtentDomain = yExtentDomain = null; + return function(t) { + xExtent = extent1.x = xi(t); + yExtent = extent1.y = yi(t); + event_({ + type: "brush", + mode: "resize" + }); + }; + }).each("end.brush", function() { + xExtentDomain = extent1.i; + yExtentDomain = extent1.j; + event_({ + type: "brush", + mode: "resize" + }); + event_({ + type: "brushend" + }); + }); + } else { + event_({ + type: "brushstart" + }); + event_({ + type: "brush", + mode: "resize" + }); + event_({ + type: "brushend" + }); + } + }); + }; + function redraw(g) { + g.selectAll(".resize").attr("transform", function(d) { + return "translate(" + xExtent[+/e$/.test(d)] + "," + yExtent[+/^s/.test(d)] + ")"; + }); + } + function redrawX(g) { + g.select(".extent").attr("x", xExtent[0]); + g.selectAll(".extent,.n>rect,.s>rect").attr("width", xExtent[1] - xExtent[0]); + } + function redrawY(g) { + g.select(".extent").attr("y", yExtent[0]); + g.selectAll(".extent,.e>rect,.w>rect").attr("height", yExtent[1] - yExtent[0]); + } + function brushstart() { + var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset; + var w = d3.select(d3_window(target)).on("keydown.brush", keydown).on("keyup.brush", keyup); + if (d3.event.changedTouches) { + w.on("touchmove.brush", brushmove).on("touchend.brush", brushend); + } else { + w.on("mousemove.brush", brushmove).on("mouseup.brush", brushend); + } + g.interrupt().selectAll("*").interrupt(); + if (dragging) { + origin[0] = xExtent[0] - origin[0]; + origin[1] = yExtent[0] - origin[1]; + } else if (resizing) { + var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing); + offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ]; + origin[0] = xExtent[ex]; + origin[1] = yExtent[ey]; + } else if (d3.event.altKey) center = origin.slice(); + g.style("pointer-events", "none").selectAll(".resize").style("display", null); + d3.select("body").style("cursor", eventTarget.style("cursor")); + event_({ + type: "brushstart" + }); + brushmove(); + function keydown() { + if (d3.event.keyCode == 32) { + if (!dragging) { + center = null; + origin[0] -= xExtent[1]; + origin[1] -= yExtent[1]; + dragging = 2; + } + d3_eventPreventDefault(); + } + } + function keyup() { + if (d3.event.keyCode == 32 && dragging == 2) { + origin[0] += xExtent[1]; + origin[1] += yExtent[1]; + dragging = 0; + d3_eventPreventDefault(); + } + } + function brushmove() { + var point = d3.mouse(target), moved = false; + if (offset) { + point[0] += offset[0]; + point[1] += offset[1]; + } + if (!dragging) { + if (d3.event.altKey) { + if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ]; + origin[0] = xExtent[+(point[0] < center[0])]; + origin[1] = yExtent[+(point[1] < center[1])]; + } else center = null; + } + if (resizingX && move1(point, x, 0)) { + redrawX(g); + moved = true; + } + if (resizingY && move1(point, y, 1)) { + redrawY(g); + moved = true; + } + if (moved) { + redraw(g); + event_({ + type: "brush", + mode: dragging ? "move" : "resize" + }); + } + } + function move1(point, scale, i) { + var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max; + if (dragging) { + r0 -= position; + r1 -= size + position; + } + min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i]; + if (dragging) { + max = (min += position) + size; + } else { + if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min)); + if (position < min) { + max = min; + min = position; + } else { + max = position; + } + } + if (extent[0] != min || extent[1] != max) { + if (i) yExtentDomain = null; else xExtentDomain = null; + extent[0] = min; + extent[1] = max; + return true; + } + } + function brushend() { + brushmove(); + g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null); + d3.select("body").style("cursor", null); + w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null); + dragRestore(); + event_({ + type: "brushend" + }); + } + } + brush.x = function(z) { + if (!arguments.length) return x; + x = z; + resizes = d3_svg_brushResizes[!x << 1 | !y]; + return brush; + }; + brush.y = function(z) { + if (!arguments.length) return y; + y = z; + resizes = d3_svg_brushResizes[!x << 1 | !y]; + return brush; + }; + brush.clamp = function(z) { + if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null; + if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z; + return brush; + }; + brush.extent = function(z) { + var x0, x1, y0, y1, t; + if (!arguments.length) { + if (x) { + if (xExtentDomain) { + x0 = xExtentDomain[0], x1 = xExtentDomain[1]; + } else { + x0 = xExtent[0], x1 = xExtent[1]; + if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1); + if (x1 < x0) t = x0, x0 = x1, x1 = t; + } + } + if (y) { + if (yExtentDomain) { + y0 = yExtentDomain[0], y1 = yExtentDomain[1]; + } else { + y0 = yExtent[0], y1 = yExtent[1]; + if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1); + if (y1 < y0) t = y0, y0 = y1, y1 = t; + } + } + return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ]; + } + if (x) { + x0 = z[0], x1 = z[1]; + if (y) x0 = x0[0], x1 = x1[0]; + xExtentDomain = [ x0, x1 ]; + if (x.invert) x0 = x(x0), x1 = x(x1); + if (x1 < x0) t = x0, x0 = x1, x1 = t; + if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ]; + } + if (y) { + y0 = z[0], y1 = z[1]; + if (x) y0 = y0[1], y1 = y1[1]; + yExtentDomain = [ y0, y1 ]; + if (y.invert) y0 = y(y0), y1 = y(y1); + if (y1 < y0) t = y0, y0 = y1, y1 = t; + if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ]; + } + return brush; + }; + brush.clear = function() { + if (!brush.empty()) { + xExtent = [ 0, 0 ], yExtent = [ 0, 0 ]; + xExtentDomain = yExtentDomain = null; + } + return brush; + }; + brush.empty = function() { + return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1]; + }; + return d3.rebind(brush, event, "on"); + }; + var d3_svg_brushCursor = { + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" + }; + var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ]; + var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat; + var d3_time_formatUtc = d3_time_format.utc; + var d3_time_formatIso = d3_time_formatUtc("%Y-%m-%dT%H:%M:%S.%LZ"); + d3_time_format.iso = Date.prototype.toISOString && +new Date("2000-01-01T00:00:00.000Z") ? d3_time_formatIsoNative : d3_time_formatIso; + function d3_time_formatIsoNative(date) { + return date.toISOString(); + } + d3_time_formatIsoNative.parse = function(string) { + var date = new Date(string); + return isNaN(date) ? null : date; + }; + d3_time_formatIsoNative.toString = d3_time_formatIso.toString; + d3_time.second = d3_time_interval(function(date) { + return new d3_date(Math.floor(date / 1e3) * 1e3); + }, function(date, offset) { + date.setTime(date.getTime() + Math.floor(offset) * 1e3); + }, function(date) { + return date.getSeconds(); + }); + d3_time.seconds = d3_time.second.range; + d3_time.seconds.utc = d3_time.second.utc.range; + d3_time.minute = d3_time_interval(function(date) { + return new d3_date(Math.floor(date / 6e4) * 6e4); + }, function(date, offset) { + date.setTime(date.getTime() + Math.floor(offset) * 6e4); + }, function(date) { + return date.getMinutes(); + }); + d3_time.minutes = d3_time.minute.range; + d3_time.minutes.utc = d3_time.minute.utc.range; + d3_time.hour = d3_time_interval(function(date) { + var timezone = date.getTimezoneOffset() / 60; + return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5); + }, function(date, offset) { + date.setTime(date.getTime() + Math.floor(offset) * 36e5); + }, function(date) { + return date.getHours(); + }); + d3_time.hours = d3_time.hour.range; + d3_time.hours.utc = d3_time.hour.utc.range; + d3_time.month = d3_time_interval(function(date) { + date = d3_time.day(date); + date.setDate(1); + return date; + }, function(date, offset) { + date.setMonth(date.getMonth() + offset); + }, function(date) { + return date.getMonth(); + }); + d3_time.months = d3_time.month.range; + d3_time.months.utc = d3_time.month.utc.range; + function d3_time_scale(linear, methods, format) { + function scale(x) { + return linear(x); + } + scale.invert = function(x) { + return d3_time_scaleDate(linear.invert(x)); + }; + scale.domain = function(x) { + if (!arguments.length) return linear.domain().map(d3_time_scaleDate); + linear.domain(x); + return scale; + }; + function tickMethod(extent, count) { + var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target); + return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) { + return d / 31536e6; + }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i]; + } + scale.nice = function(interval, skip) { + var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" && tickMethod(extent, interval); + if (method) interval = method[0], skip = method[1]; + function skipped(date) { + return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length; + } + return scale.domain(d3_scale_nice(domain, skip > 1 ? { + floor: function(date) { + while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1); + return date; + }, + ceil: function(date) { + while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1); + return date; + } + } : interval)); + }; + scale.ticks = function(interval, skip) { + var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" ? tickMethod(extent, interval) : !interval.range && [ { + range: interval + }, skip ]; + if (method) interval = method[0], skip = method[1]; + return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip); + }; + scale.tickFormat = function() { + return format; + }; + scale.copy = function() { + return d3_time_scale(linear.copy(), methods, format); + }; + return d3_scale_linearRebind(scale, linear); + } + function d3_time_scaleDate(t) { + return new Date(t); + } + var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ]; + var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ]; + var d3_time_scaleLocalFormat = d3_time_format.multi([ [ ".%L", function(d) { + return d.getMilliseconds(); + } ], [ ":%S", function(d) { + return d.getSeconds(); + } ], [ "%I:%M", function(d) { + return d.getMinutes(); + } ], [ "%I %p", function(d) { + return d.getHours(); + } ], [ "%a %d", function(d) { + return d.getDay() && d.getDate() != 1; + } ], [ "%b %d", function(d) { + return d.getDate() != 1; + } ], [ "%B", function(d) { + return d.getMonth(); + } ], [ "%Y", d3_true ] ]); + var d3_time_scaleMilliseconds = { + range: function(start, stop, step) { + return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate); + }, + floor: d3_identity, + ceil: d3_identity + }; + d3_time_scaleLocalMethods.year = d3_time.year; + d3_time.scale = function() { + return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); + }; + var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) { + return [ m[0].utc, m[1] ]; + }); + var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ ".%L", function(d) { + return d.getUTCMilliseconds(); + } ], [ ":%S", function(d) { + return d.getUTCSeconds(); + } ], [ "%I:%M", function(d) { + return d.getUTCMinutes(); + } ], [ "%I %p", function(d) { + return d.getUTCHours(); + } ], [ "%a %d", function(d) { + return d.getUTCDay() && d.getUTCDate() != 1; + } ], [ "%b %d", function(d) { + return d.getUTCDate() != 1; + } ], [ "%B", function(d) { + return d.getUTCMonth(); + } ], [ "%Y", d3_true ] ]); + d3_time_scaleUtcMethods.year = d3_time.year.utc; + d3_time.scale.utc = function() { + return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat); + }; + d3.text = d3_xhrType(function(request) { + return request.responseText; + }); + d3.json = function(url, callback) { + return d3_xhr(url, "application/json", d3_json, callback); + }; + function d3_json(request) { + return JSON.parse(request.responseText); + } + d3.html = function(url, callback) { + return d3_xhr(url, "text/html", d3_html, callback); + }; + function d3_html(request) { + var range = d3_document.createRange(); + range.selectNode(d3_document.body); + return range.createContextualFragment(request.responseText); + } + d3.xml = d3_xhrType(function(request) { + return request.responseXML; + }); + if (typeof define === "function" && define.amd) this.d3 = d3, define(d3); else if (typeof module === "object" && module.exports) module.exports = d3; else this.d3 = d3; +}(); diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/lib/js/d3tip.js b/modules/analytics/Samples/GadgetLocationData/locationData/lib/js/d3tip.js new file mode 100644 index 00000000..43337de3 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/lib/js/d3tip.js @@ -0,0 +1,352 @@ +/** + * d3.tip + * Copyright (c) 2013 Justin Palmer + * + * Tooltips for d3.js SVG visualizations + */ +// eslint-disable-next-line no-extra-semi +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module with d3 as a dependency. + define([ + 'd3-collection', + 'd3-selection' + ], factory) + } else if (typeof module === 'object' && module.exports) { + /* eslint-disable global-require */ + // CommonJS + var d3Collection = require('d3-collection'), + d3Selection = require('d3-selection') + module.exports = factory(d3Collection, d3Selection) + /* eslint-enable global-require */ + } else { + // Browser global. + var d3 = root.d3 + // eslint-disable-next-line no-param-reassign + root.d3.tip = factory(d3, d3) + } +}(this, function(d3Collection, d3Selection) { + // Public - contructs a new tooltip + // + // Returns a tip + return function() { + var direction = d3TipDirection, + offset = d3TipOffset, + html = d3TipHTML, + rootElement = document.body, + node = initNode(), + svg = null, + point = null, + target = null + + function tip(vis) { + svg = getSVGNode(vis) + if (!svg) return + point = svg.createSVGPoint() + rootElement.appendChild(node) + } + + // Public - show the tooltip on the screen + // + // Returns a tip + tip.show = function() { + var args = Array.prototype.slice.call(arguments) + if (args[args.length - 1] instanceof SVGElement) target = args.pop() + + var content = html.apply(this, args), + poffset = offset.apply(this, args), + dir = direction.apply(this, args), + nodel = getNodeEl(), + i = directions.length, + coords, + scrollTop = document.documentElement.scrollTop || + rootElement.scrollTop, + scrollLeft = document.documentElement.scrollLeft || + rootElement.scrollLeft + + nodel.html(content) + .style('opacity', 1).style('pointer-events', 'all') + + while (i--) nodel.classed(directions[i], false) + coords = directionCallbacks.get(dir).apply(this) + nodel.classed(dir, true) + .style('top', (coords.top + poffset[0]) + scrollTop + 'px') + .style('left', (coords.left + poffset[1]) + scrollLeft + 'px') + + return tip + } + + // Public - hide the tooltip + // + // Returns a tip + tip.hide = function() { + var nodel = getNodeEl() + nodel.style('opacity', 0).style('pointer-events', 'none') + return tip + } + + // Public: Proxy attr calls to the d3 tip container. + // Sets or gets attribute value. + // + // n - name of the attribute + // v - value of the attribute + // + // Returns tip or attribute value + // eslint-disable-next-line no-unused-vars + tip.attr = function(n, v) { + if (arguments.length < 2 && typeof n === 'string') { + return getNodeEl().attr(n) + } + + var args = Array.prototype.slice.call(arguments) + d3Selection.selection.prototype.attr.apply(getNodeEl(), args) + return tip + } + + // Public: Proxy style calls to the d3 tip container. + // Sets or gets a style value. + // + // n - name of the property + // v - value of the property + // + // Returns tip or style property value + // eslint-disable-next-line no-unused-vars + tip.style = function(n, v) { + if (arguments.length < 2 && typeof n === 'string') { + return getNodeEl().style(n) + } + + var args = Array.prototype.slice.call(arguments) + d3Selection.selection.prototype.style.apply(getNodeEl(), args) + return tip + } + + // Public: Set or get the direction of the tooltip + // + // v - One of n(north), s(south), e(east), or w(west), nw(northwest), + // sw(southwest), ne(northeast) or se(southeast) + // + // Returns tip or direction + tip.direction = function(v) { + if (!arguments.length) return direction + direction = v == null ? v : functor(v) + + return tip + } + + // Public: Sets or gets the offset of the tip + // + // v - Array of [x, y] offset + // + // Returns offset or + tip.offset = function(v) { + if (!arguments.length) return offset + offset = v == null ? v : functor(v) + + return tip + } + + // Public: sets or gets the html value of the tooltip + // + // v - String value of the tip + // + // Returns html value or tip + tip.html = function(v) { + if (!arguments.length) return html + html = v == null ? v : functor(v) + + return tip + } + + // Public: sets or gets the root element anchor of the tooltip + // + // v - root element of the tooltip + // + // Returns root node of tip + tip.rootElement = function(v) { + if (!arguments.length) return rootElement + rootElement = v == null ? v : functor(v) + + return tip + } + + // Public: destroys the tooltip and removes it from the DOM + // + // Returns a tip + tip.destroy = function() { + if (node) { + getNodeEl().remove() + node = null + } + return tip + } + + function d3TipDirection() { return 'n' } + function d3TipOffset() { return [0, 0] } + function d3TipHTML() { return ' ' } + + var directionCallbacks = d3Collection.map({ + n: directionNorth, + s: directionSouth, + e: directionEast, + w: directionWest, + nw: directionNorthWest, + ne: directionNorthEast, + sw: directionSouthWest, + se: directionSouthEast + }), + directions = directionCallbacks.keys() + + function directionNorth() { + var bbox = getScreenBBox() + return { + top: bbox.n.y - node.offsetHeight, + left: bbox.n.x - node.offsetWidth / 2 + } + } + + function directionSouth() { + var bbox = getScreenBBox() + return { + top: bbox.s.y, + left: bbox.s.x - node.offsetWidth / 2 + } + } + + function directionEast() { + var bbox = getScreenBBox() + return { + top: bbox.e.y - node.offsetHeight / 2, + left: bbox.e.x + } + } + + function directionWest() { + var bbox = getScreenBBox() + return { + top: bbox.w.y - node.offsetHeight / 2, + left: bbox.w.x - node.offsetWidth + } + } + + function directionNorthWest() { + var bbox = getScreenBBox() + return { + top: bbox.nw.y - node.offsetHeight, + left: bbox.nw.x - node.offsetWidth + } + } + + function directionNorthEast() { + var bbox = getScreenBBox() + return { + top: bbox.ne.y - node.offsetHeight, + left: bbox.ne.x + } + } + + function directionSouthWest() { + var bbox = getScreenBBox() + return { + top: bbox.sw.y, + left: bbox.sw.x - node.offsetWidth + } + } + + function directionSouthEast() { + var bbox = getScreenBBox() + return { + top: bbox.se.y, + left: bbox.se.x + } + } + + function initNode() { + var div = d3Selection.select(document.createElement('div')) + div + .style('position', 'absolute') + .style('top', 0) + .style('opacity', 0) + .style('pointer-events', 'none') + .style('box-sizing', 'border-box') + + return div.node() + } + + function getSVGNode(element) { + var svgNode = element.node() + if (!svgNode) return null + if (svgNode.tagName.toLowerCase() === 'svg') return svgNode + return svgNode.ownerSVGElement + } + + function getNodeEl() { + if (node == null) { + node = initNode() + // re-add node to DOM + rootElement.appendChild(node) + } + return d3Selection.select(node) + } + + // Private - gets the screen coordinates of a shape + // + // Given a shape on the screen, will return an SVGPoint for the directions + // n(north), s(south), e(east), w(west), ne(northeast), se(southeast), + // nw(northwest), sw(southwest). + // + // +-+-+ + // | | + // + + + // | | + // +-+-+ + // + // Returns an Object {n, s, e, w, nw, sw, ne, se} + function getScreenBBox() { + var targetel = target || d3Selection.event.target + + while (targetel.getScreenCTM == null && targetel.parentNode == null) { + targetel = targetel.parentNode + } + + var bbox = {}, + matrix = targetel.getScreenCTM(), + tbbox = targetel.getBBox(), + width = tbbox.width, + height = tbbox.height, + x = tbbox.x, + y = tbbox.y + + point.x = x + point.y = y + bbox.nw = point.matrixTransform(matrix) + point.x += width + bbox.ne = point.matrixTransform(matrix) + point.y += height + bbox.se = point.matrixTransform(matrix) + point.x -= width + bbox.sw = point.matrixTransform(matrix) + point.y -= height / 2 + bbox.w = point.matrixTransform(matrix) + point.x += width + bbox.e = point.matrixTransform(matrix) + point.x -= width / 2 + point.y -= height / 2 + bbox.n = point.matrixTransform(matrix) + point.y += height + bbox.s = point.matrixTransform(matrix) + + return bbox + } + + // Private - replace D3JS 3.X d3.functor() function + function functor(v) { + return typeof v === 'function' ? v : function() { + return v + } + } + + return tip + } +// eslint-disable-next-line semi +})); diff --git a/modules/analytics/Samples/GadgetLocationData/locationData/lib/js/jquery.js b/modules/analytics/Samples/GadgetLocationData/locationData/lib/js/jquery.js new file mode 100644 index 00000000..04f4e2b5 --- /dev/null +++ b/modules/analytics/Samples/GadgetLocationData/locationData/lib/js/jquery.js @@ -0,0 +1,11009 @@ +/*! + * jQuery JavaScript Library v1.12.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-05-20T17:17Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var deletedIds = []; + +var document = window.document; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.12.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type( obj ) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + } catch ( e ) { + + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( !support.ownFirst ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[ j ] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // init accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt( 0 ) === "<" && + selector.charAt( selector.length - 1 ) === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[ 2 ] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof root.ready !== "undefined" ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[ 0 ], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.uniqueSort( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = true; + if ( !memory ) { + self.disable(); + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || + window.event.type === "load" || + document.readyState === "complete" ) { + + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE6-10 + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + + // If IE event model is used + } else { + + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch ( e ) {} + + if ( top && top.doScroll ) { + ( function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll( "left" ); + } catch ( e ) { + return window.setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + } )(); + } + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownFirst = i === "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery( function() { + + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== "undefined" ) { + + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +} ); + + +( function() { + var div = document.createElement( "div" ); + + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch ( e ) { + support.deleteExpando = false; + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); +var acceptData = function( elem ) { + var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute( "classid" ) === noData; +}; + + + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && + data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } else { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[ i ] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, undefined + } else { + cache[ id ] = undefined; + } +} + +jQuery.extend( { + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + jQuery.data( this, key ); + } ); + } + + return arguments.length > 1 ? + + // Sets one value + this.each( function() { + jQuery.data( this, key, value ); + } ) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each( function() { + jQuery.removeData( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, + // or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); + + +( function() { + var shrinkWrapBlocksVal; + + support.shrinkWrapBlocks = function() { + if ( shrinkWrapBlocksVal != null ) { + return shrinkWrapBlocksVal; + } + + // Will be changed later if needed. + shrinkWrapBlocksVal = false; + + // Minified: var b,c,d + var div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Test fired too early or in an unsupported environment, exit. + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + if ( typeof div.style.zoom !== "undefined" ) { + + // Reset CSS: box-sizing; display; margin; border + div.style.cssText = + + // Support: Firefox<29, Android 2.3 + // Vendor-prefix box-sizing + "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + + "box-sizing:content-box;display:block;margin:0;border:0;" + + "padding:1px;width:1px;zoom:1"; + div.appendChild( document.createElement( "div" ) ).style.width = "5px"; + shrinkWrapBlocksVal = div.offsetWidth !== 3; + } + + body.removeChild( container ); + + return shrinkWrapBlocksVal; + }; + +} )(); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( + elems[ i ], + key, + raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[ 0 ], key ) : emptyGet; +}; +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + +var rleadingWhitespace = ( /^\s+/ ); + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + + "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + + +( function() { + var div = document.createElement( "div" ), + fragment = document.createDocumentFragment(), + input = document.createElement( "input" ); + + // Setup + div.innerHTML = "
a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input = document.createElement( "input" ); + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ + support.noCloneEvent = !!div.addEventListener; + + // Support: IE<9 + // Since attributes and properties are the same in IE, + // cleanData must set properties to undefined rather than use removeAttribute + div[ jQuery.expando ] = 1; + support.attributes = !div.getAttribute( jQuery.expando ); +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + + // Support: IE8 + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] +}; + +// Support: IE8-IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; + ( elem = elems[ i ] ) != null; + i++ + ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + jQuery._data( + elem, + "globalEval", + !refElements || jQuery._data( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/, + rtbody = / from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[ 1 ] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && + !tbody.childNodes.length ) { + + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; +} + + +( function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) + for ( i in { submit: true, change: true, focusin: true } ) { + eventName = "on" + i; + + if ( !( support[ i ] = eventName in window ) ) { + + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && + ( !e || jQuery.event.triggered !== e.type ) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + + // Add elem as a property of the handle fn to prevent a memory leak + // with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && + jQuery._data( cur, "handle" ); + + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( + ( !special._default || + special._default.apply( eventPath.pop(), data ) === false + ) && acceptData( elem ) + ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Safari 6-8+ + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY fromElement offsetX offsetY " + + "pageX pageY screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? + original.toElement : + fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + // Piggyback on a donor event to simulate a different one + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + + // Previously, `originalEvent: {}` was set here, so stopPropagation call + // would not be triggered on donor event, since in our own + // jQuery.event.stopPropagation function we had a check for existence of + // originalEvent.stopPropagation method, so, consequently it would be a noop. + // + // Guard for simulated events was moved to jQuery.event.stopPropagation function + // since `originalEvent` should point to the original event for the + // constancy with other events and for more focused logic + } + ); + + jQuery.event.trigger( e, null, elem ); + + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, + // to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( !e || this.isSimulated ) { + return; + } + + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +// IE submit delegation +if ( !support.submit ) { + + jQuery.event.special.submit = { + setup: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? + + // Support: IE <=8 + // We use jQuery.prop instead of elem.form + // to allow fixing the IE8 delegated submit issue (gh-2332) + // by 3rd party polyfills/workarounds. + jQuery.prop( elem, "form" ) : + undefined; + + if ( form && !jQuery._data( form, "submit" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submitBubble = true; + } ); + jQuery._data( form, "submit", true ); + } + } ); + + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + + // If form was submitted by the user, bubble the event up the tree + if ( event._submitBubble ) { + delete event._submitBubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event ); + } + } + }, + + teardown: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.change ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._justChanged = true; + } + } ); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._justChanged && !event.isTrigger ) { + this._justChanged = false; + } + + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event ); + } ); + } + return false; + } + + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event ); + } + } ); + jQuery._data( elem, "change", true ); + } + } ); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || + ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { + + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Support: Firefox +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome, Safari +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + } ); +} + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + }, + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + return elem; +} + +function cloneCopyEvent( src, dest ) { + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( + ( node.text || node.textContent || node.innerHTML || "" ) + .replace( rcleanScript, "" ) + ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + elems = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = elems[ i ] ) != null; i++ ) { + + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc( elem ) || + !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( ( !support.noCloneEvent || !support.noCloneChecked ) && + ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { + + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[ i ] ) { + fixCloneNodeIssues( node, destElements[ i ] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { + cloneCopyEvent( node, destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + cleanData: function( elems, /* internal */ forceAcceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + attributes = support.attributes, + special = jQuery.event.special; + + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( forceAcceptData || acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // Support: IE<9 + // IE does not allow us to delete expando properties from nodes + // IE creates expando attributes along with the property + // IE does not have a removeAttribute function on Document nodes + if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { + elem.removeAttribute( internalKey ); + + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + } else { + elem[ internalKey ] = undefined; + } + + deletedIds.push( id ); + } + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( + ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) + ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + + // Remove element nodes and prevent memory leaks + elem = this[ i ] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( " +{{! + 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. +}} + +
+
+

Temperature

+
+
+
+
+
+
+
+
+
+
+

Coffee Level

+
+
+
+
+
+
+
+
+
+
{{#zone "bottomJs"}} {{js "js/connectedcup.js"}} diff --git a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.analytics-view/analytics-view.js b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.analytics-view/analytics-view.js index c70c6d0c..d651ba0b 100644 --- a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.analytics-view/analytics-view.js +++ b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.analytics-view/analytics-view.js @@ -17,30 +17,26 @@ */ function onRequest(context) { - var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); - var devices = context.unit.params.devices; var deviceType = context.uriParams.deviceType; - var deviceId = request.getParameter('deviceId'); + var deviceId = request.getParameter("deviceId"); if (devices) { return { - 'devices': stringify(devices), - 'backendApiUri': devicemgtProps['httpsURL'] + '/connectedcup/stats/', - 'dashboardserverURL': devicemgtProps['dashboardserverURL'] + "devices": stringify(devices), + "backendApiUri": "/connectedcup/stats/" }; - } else if (deviceType && deviceId) { - var deviceModule = require('/app/modules/device.js').deviceModule; + } else if (deviceType != null && deviceType != undefined && deviceId != null && deviceId != undefined) { + var deviceModule = require("/app/modules/business-controllers/device.js")["deviceModule"]; var device = deviceModule.viewDevice(deviceType, deviceId); - if (device && device.status != 'error') { + if (device && device.status != "error") { return { - 'device': device.content, - 'backendApiUri': devicemgtProps['httpsURL'] + '/connectedcup/stats/' + deviceId, - 'dashboardserverURL': devicemgtProps['dashboardserverURL'] + "device": device.content, + "backendApiUri": "/connectedcup/stats/" + deviceId }; } else { - response.sendError(404, 'Device Id ' + deviceId + ' of type ' + deviceType + ' cannot be found!'); + response.sendError(404, "Device Id " + deviceId + " of type " + deviceType + " cannot be found!"); exit(); } } -} +} \ No newline at end of file diff --git a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.analytics-view/public/js/connectedcup.js b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.analytics-view/public/js/connectedcup.js index ebd48673..02e4a6d3 100644 --- a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.analytics-view/public/js/connectedcup.js +++ b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.analytics-view/public/js/connectedcup.js @@ -224,7 +224,8 @@ function drawGraph_connectedcup(from, to) { if (devices) { getData(); } else { - var backendApiUrl = $('#connectedcup-div-chart').data('backend-api-url') + '/sensors/temperature' + '?from=' + from + '&to=' + to; + var backendApiUrl = $('#connectedcup-div-chart').data('backend-api-url') + '/sensors/temperature' + + '?from=' + from + '&to=' + to; var successCallback = function (data) { if (data) { drawTemperatureLineGraph(JSON.parse(data)); @@ -249,8 +250,7 @@ function drawGraph_connectedcup(from, to) { return; } var backendApiUrl = $('#connectedcup-div-chart').data('backend-api-url') + devices[deviceIndex].deviceIdentifier - + '/sensors/temperature' - + '?from=' + from + '&to=' + to; + + '/sensors/temperature?from=' + from + '&to=' + to; var successCallback = function (data) { if (data) { drawTemperatureLineGraph(JSON.parse(data)); @@ -264,7 +264,7 @@ function drawGraph_connectedcup(from, to) { getData(); }); var coffeeLevelApiUrl = $('#connectedcup-div-chart').data('backend-api-url') + devices[deviceIndex].deviceIdentifier - + '/sensors/coffeelevel' + '?from=' + from + '&to=' + to; + + '/sensors/coffeelevel?from=' + from + '&to=' + to; var successCallbackCoffeeLevel = function (data) { if (data) { diff --git a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.hbs b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.hbs index 304e8ba9..89403d3e 100644 --- a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.hbs +++ b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.hbs @@ -24,49 +24,43 @@ {{/zone}} -{{#zone "device-detail-properties"}} -
- -
-
+{{#zone "device-view-tabs"}} +
  • Device + Statistics +
  • +
  • Operations Log
  • +{{/zone}} -
    -
    Device Statistics
    - {{unit "cdmf.unit.device.type.connectedcup.realtime.analytics-view" device=device}} -
    -
    -
    Operations Log
    -
    - -
    -
    - Not available yet -
    -
    -
    -
    +{{#zone "device-view-tab-contents"}} + +
    +
    Device Statistics
    + {{unit "cdmf.unit.device.type.connectedcup.realtime.analytics-view" device=device}} +
    + +
    +
    Operations Log
    +
    + +
    +
    + Not available yet
    +
    diff --git a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.js b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.js index b4fa71bc..63ebf3d2 100644 --- a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.js +++ b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.device-view/device-view.js @@ -18,26 +18,23 @@ function onRequest(context) { - var log = new Log('detail.js'); var deviceType = context.uriParams.deviceType; var deviceId = request.getParameter('id'); - var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); - if (deviceType && deviceId) { - var deviceModule = require('/app/modules/device.js').deviceModule; - var device = deviceModule.viewDevice(deviceType, deviceId); + var deviceModule = require("/app/modules/business-controllers/device.js").deviceModule; + var deviceData = deviceModule.viewDevice(deviceType, deviceId); - if (device && device.status != 'error') { + if (deviceData && deviceData.status != 'error') { + var device = deviceData.content; var constants = require('/app/modules/constants.js'); - var tokenPair = session.get(constants.ACCESS_TOKEN_PAIR_IDENTIFIER); - var token = ''; + var tokenPair = JSON.parse(session.get(constants.TOKEN_PAIR)); if (tokenPair) { - token = tokenPair.accessToken; + device.accessToken = tokenPair.accessToken; } - device.accessToken = token; + var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; device.ip = devicemgtProps['httpsWebURL']; - return {'device': device.content}; + return {'device': deviceData.content}; } } } diff --git a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.realtime.analytics-view/analytics-view.hbs b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.realtime.analytics-view/analytics-view.hbs index 656ad5fc..0a7848a4 100644 --- a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.realtime.analytics-view/analytics-view.hbs +++ b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.realtime.analytics-view/analytics-view.hbs @@ -1,8 +1,25 @@ +{{! + 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. +}} {{unit "cdmf.unit.lib.rickshaw-graph"}}
    -
    Temperature
    +
    Temperature
    diff --git a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.realtime.analytics-view/analytics-view.js b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.realtime.analytics-view/analytics-view.js index 51e51b99..e54cef4e 100644 --- a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.realtime.analytics-view/analytics-view.js +++ b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.realtime.analytics-view/analytics-view.js @@ -17,16 +17,28 @@ */ function onRequest(context) { + var log = new Log("stats.js"); + var carbonServer = require("carbon").server; var device = context.unit.params.device; - var devicemgtProps = require('/app/conf/devicemgt-props.js').config(); - var constants = require('/app/modules/constants.js'); - var websocketEndpoint = devicemgtProps['wssURL'].replace('https', 'wss'); - var tokenPair = session.get(constants.ACCESS_TOKEN_PAIR_IDENTIFIER); - var token = ''; - if (tokenPair) { - token = tokenPair.accessToken; + var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"]; + var constants = require("/app/modules/constants.js"); + var websocketEndpoint = devicemgtProps["wssURL"].replace("https", "wss"); + var jwtService = carbonServer.osgiService( + 'org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService'); + var jwtClient = jwtService.getJWTClient(); + var encodedClientKeys = session.get(constants["ENCODED_TENANT_BASED_WEB_SOCKET_CLIENT_CREDENTIALS"]); + var token = ""; + if (encodedClientKeys) { + var tokenUtil = require("/app/modules/oauth/token-handler-utils.js")["utils"]; + var resp = tokenUtil.decode(encodedClientKeys).split(":"); + var tokenPair = jwtClient.getAccessToken(resp[0], resp[1], context.user.username,"default", {}); + if (tokenPair) { + token = tokenPair.accessToken; + } + websocketEndpoint = websocketEndpoint + "/secured-websocket/org.wso2.iot.devices.temperature/1.0.0?" + + "deviceId=" + device.deviceIdentifier + "&deviceType=" + device.type; + var websocketToken= {'name':'websocket-token','value': token, 'path':'/', "maxAge":18000}; + response.addCookie(websocketToken); } - websocketEndpoint = websocketEndpoint + '/secured-outputui/org.wso2.iot.connectedcup/1.0.0?' + - 'token=' + token + '&deviceId=' + device.deviceIdentifier; - return {'device': device, 'websocketEndpoint': websocketEndpoint}; -} + return {"device": device, "websocketEndpoint": websocketEndpoint}; +} \ No newline at end of file diff --git a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.realtime.analytics-view/public/js/device-stats.js b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.realtime.analytics-view/public/js/device-stats.js index 1eaca7d9..2805d0c4 100644 --- a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.realtime.analytics-view/public/js/device-stats.js +++ b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.realtime.analytics-view/public/js/device-stats.js @@ -18,41 +18,30 @@ var ws; var graph; -var temperatureData = []; -var coffeeData = []; -var temperature = 0; -var coffeelevel = 0; -var lastTime = 0; -var palette = new Rickshaw.Color.Palette({scheme: 'classic9'}); +var chartData = []; +var palette = new Rickshaw.Color.Palette({scheme: "classic9"}); $(window).load(function () { var tNow = new Date().getTime() / 1000; for (var i = 0; i < 30; i++) { - temperatureData.push({ - x: tNow - (30 - i) * 15, - y: parseFloat(0) - }); - coffeeData.push({ - x: tNow - (30 - i) * 15, - y: parseFloat(0) - }); + chartData.push({ + x: tNow - (30 - i) * 15, + y: parseFloat(0) + }); } graph = new Rickshaw.Graph({ - element: document.getElementById('chart'), - width: $('#div-chart').width() - 50, + element: document.getElementById("chart"), + width: $("#div-chart").width() - 50, height: 300, - renderer: 'line', + renderer: "line", + interpolation: "linear", padding: {top: 0.2, left: 0.0, right: 0.0, bottom: 0.2}, xScale: d3.time.scale(), series: [{ 'color': palette.color(), - 'data': coffeeData, - 'name': 'Coffee Level' - }, { - 'color': palette.color(), - 'data': temperatureData, - 'name': 'Temperature' + 'data': chartData, + 'name': "Temperature" }] }); @@ -77,11 +66,11 @@ $(window).load(function () { formatter: function (series, x, y) { var date = '' + moment(x * 1000).format('Do MMM YYYY h:mm:ss a') + ''; var swatch = ''; - return swatch + series.name + ': ' + parseInt(y) + '
    ' + date; + return swatch + series.name + ": " + parseInt(y) + '
    ' + date; } }); - var websocketUrl = $('#div-chart').data('websocketurl'); + var websocketUrl = $("#div-chart").data("websocketurl"); connect(websocketUrl) }); @@ -101,25 +90,12 @@ function connect(target) { if (ws) { ws.onmessage = function (event) { var dataPoint = JSON.parse(event.data); - if (lastTime < parseInt(dataPoint[4]) / 1000) { - lastTime = parseInt(dataPoint[4]) / 1000; - if (dataPoint[3] == 'temperature') { - temperature = parseFloat(dataPoint[5]); - } else if (dataPoint[3] == 'coffeelevel') { - coffeelevel = parseFloat(dataPoint[6]); - } - temperatureData.push({ - x: lastTime, - y: temperature - }); - temperatureData.shift(); - coffeeData.push({ - x: lastTime, - y: coffeelevel - }); - coffeeData.shift(); - graph.update(); - } + chartData.push({ + x: parseInt(dataPoint[4]) / 1000, + y: parseFloat(dataPoint[5]) + }); + chartData.shift(); + graph.update(); }; } } diff --git a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/css/styles.css b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/css/styles.css new file mode 100644 index 00000000..4783af75 --- /dev/null +++ b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/css/styles.css @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2017, 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. + */ +.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; +} + +.doc-link{ + background: none; + color: #000; + padding: 10px 0px; +} +.doc-link a { + color: #006eff; +} diff --git a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/js/download.js b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/js/download.js index 1508597b..edafe562 100644 --- a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/js/download.js +++ b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/public/js/download.js @@ -16,13 +16,13 @@ * under the License. */ -var modalPopup = '.wr-modalpopup'; -var modalPopupContainer = modalPopup + ' .modalpopup-container'; -var modalPopupContent = modalPopup + ' .modalpopup-content'; -var body = 'body'; +var modalPopup = ".modal"; +var modalPopupContainer = modalPopup + " .modal-content"; +var modalPopupContent = modalPopup + " .modal-content"; +var body = "body"; /* - * set popup maximum height function. + * Set popup maximum height function. */ function setPopupMaxHeight() { $(modalPopupContent).css('max-height', ($(body).height() - ($(body).height() / 100 * 30))); @@ -33,36 +33,14 @@ function setPopupMaxHeight() { * show popup function. */ function showPopup() { - $(modalPopup).show(); + $(modalPopup).modal('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 = ''; + var deviceType = ""; $('.deviceType').each(function () { if (this.value != '') { deviceType = this.value; } }); - if (deviceType == 'digitaldisplay') { - $('.sketchType').remove(); - $('input[name="sketchType"][value="digitaldisplay"]').prop('checked', true); - $('label[for="digitaldisplay"]').text('Simple Agent'); - } else { - $('.sketchTypes').remove(); - } } /* @@ -72,7 +50,7 @@ function hidePopup() { $('label[for=deviceName]').remove(); $('.control-group').removeClass('success').removeClass('error'); $(modalPopupContent).html(''); - $(modalPopup).hide(); + $(modalPopup).modal('hide'); } /* @@ -88,46 +66,9 @@ function attachEvents() { * 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}; + $("a.download-link").click(function () { $(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(); - }); - }); } @@ -141,33 +82,40 @@ function downloadAgent() { values[this.name] = $(this).val(); }); - var payload = {}; - payload.name = $inputs[0].value; - payload.owner = $inputs[1].value; - - var connectedCupRegisterURL = '/connectedcup/device/register?name=' + encodeURI(payload.name); - - invokerUtil.post( - connectedCupRegisterURL, - payload, - function (data, textStatus, jqxhr) { - hidePopup(); - }, - function (data) { - hidePopup(); - } - ); - - var deviceName; + var deviceName = $inputs[0].value; $('.new-device-name').each(function () { if (this.value != '') { deviceName = this.value; } }); - if (deviceName && deviceName.length >= 4) { - setTimeout(function () { - hidePopup(); - }, 1000); + var deviceNameFormat = /^[^~?!#$:;%^*`+={}\[\]\\()|<>,'"]{1,30}$/; + if (deviceName && deviceName.length < 4) { + $("#invalid-username-error-msg span").text("Device name should be more than 3 letters!"); + $("#invalid-username-error-msg").removeClass("hidden"); + } else if (deviceName && deviceNameFormat.test(deviceName)) { + var payload = {}; + payload.name = $inputs[0].value; + payload.owner = $inputs[1].value; + var connectedCupRegisterURL = '/connectedcup/device/register?name=' + encodeURI(payload.name); + invokerUtil.post( + connectedCupRegisterURL, + payload, + function (data, textStatus, jqxhr) { + $(modalPopupContent).html($('#device-created-content').html()); + $('#device-created-link').click(function () { + hidePopup(); + }); + setTimeout(function () { + hidePopup(); + }, 1000); + }, + function (data) { + doAction(data) + } + ); + } else { + $("#invalid-username-error-msg span").text("Invalid device name"); + $("#invalid-username-error-msg").removeClass("hidden"); } } @@ -202,4 +150,4 @@ function doAction(data) { hidePopup(); }); } -} +} \ No newline at end of file diff --git a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/type-view.hbs b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/type-view.hbs index 6025acd6..8082fe39 100644 --- a/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/type-view.hbs +++ b/modules/distribution/src/resources/samples/connectedcup/component/ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.connectedcup.type-view/type-view.hbs @@ -1,16 +1,28 @@ -
    +{{! + 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. +}} +

    Connected Cup


    -
    +
    -
    - -
    -
    +

    What it Does


    Connected cup is a virtual simulation of a smart coffee cup from the IOT Hardware @@ -18,35 +30,36 @@ around with the temperature and Coffee level. And the information will be relayed back to the IoTServer and summarized.

    -

    The device supports communication via HTTPS only.


    -

    What You Need


      -
    • STEP 01   Go ahead and - [Crete an Instance] of the Device. +
    • + STEP 01 + Go ahead and [Download] the Device.
    • -
    • STEP 02   Give a name to your - Connected Cup instance. +
    • + STEP 02 + Proceed to [Prepare] section.
    • -
    • STEP 03   Read - [Try Out] section - to further experiment with the device. +
    • + STEP 03 + Read [Try Out] section to further experiment with the device.

    - View API   - Create an Instance - + class="btn-operations" + target="_blank"> View API + + + Create an instance