aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHuabingZhao <zhao.huabing@zte.com.cn>2017-07-25 15:18:33 +0800
committerHuabingZhao <zhao.huabing@zte.com.cn>2017-07-25 18:11:59 +0800
commit672f3d40be83d9e380fd7be4b674d5e8d5fa36de (patch)
tree43105e1d5e2ba8e8accea8648e57e1cf87db3f00
parent41d3db15a8e1a0496f9c2a5e15db2998a32bb9bf (diff)
Divide the MSB source codes into two repos
Change-Id: Ie76d545b214a8ce5191f215350a623e1529983d9 Issue-id: MSB-5 Signed-off-by: HuabingZhao <zhao.huabing@zte.com.cn>
-rw-r--r--.gitattributes1
-rw-r--r--.gitignore10
-rw-r--r--.gitreview4
-rw-r--r--License.txt473
-rw-r--r--README.md19
-rw-r--r--apiroute/apiroute-service/dependency-reduced-pom.xml121
-rw-r--r--apiroute/apiroute-service/pom.xml174
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/ApiRouteApp.java131
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/ApiRouteAppConfig.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteAppConfig.java)46
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/SyncDataManager.java135
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/ApiRouteInfo.java107
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/CustomDateSerializer.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomDateSerializer.java)4
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/CustomRouteInfo.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MetricsUtil.java)11
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/DiscoverInfo.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/DiscoverInfo.java)10
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/IuiRouteInfo.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotSupportedException.java)16
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/MicroServiceFullInfo.java195
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/Node.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Node.java)39
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/PublishFullAddress.java48
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/RouteInfo.java179
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/RouteServer.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/RouteServer.java)19
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/exception/ExtendedInternalServerErrorException.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedInternalServerErrorException.java)4
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/exception/ExtendedNotFoundException.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotFoundException.java)4
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/exception/UnprocessableEntityException.java18
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/ApiRouteHealthCheck.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/health/ApiRouteHealthCheck.java)33
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/ConsulLinkHealthCheck.java132
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/OpenRestyHealthCheck.java39
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/RedisHealthCheck.java160
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/resources/ApiRouteResource.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ApiRouteResource.java)113
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/resources/CustomRouteResource.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/CustomRouteResource.java)58
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/resources/IuiRouteResource.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/IuiRouteResource.java)67
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/resources/MicroServiceResource.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MicroServiceResource.java)135
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/ApiRouteServiceWrapper.java273
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/CustomRouteServiceWrapper.java217
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/InitRouteServiceWrapper.java416
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/IuiRouteServiceWrapper.java221
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/MicroServiceWrapper.java398
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/CatalogClient.java87
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/Consul.java97
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/HealthClient.java112
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/async/ConsulResponseCallback.java33
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/async/ConsulResponseHeader.java27
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/async/OriginalConsulResponse.java27
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ConsulCache.java301
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServiceHealthCache.java65
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServicesCatalogCache.java39
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckServiceDataEmptyAndAutoStopWatchFilter.java98
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckTagAndAutoStopWatchFilter.java96
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ConsulIndexFilter.java48
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ServiceModifyIndexFilter.java121
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchCatalogServicesTask.java90
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchServiceHealthTask.java128
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchTask.java87
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WriteBufferHandler.java36
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/Service.java39
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/ServiceHealth.java30
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/util/Http.java281
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/DAOConstants.java6
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/DAOFactory.java18
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/RedisAccessWrapper.java133
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/IRouteDAO.java18
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/RouteDAOImpl.java63
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/Metadata.java48
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/Node.java32
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/RouteInfo.java79
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/Spec.java52
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/IServiceDAO.java17
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/ServiceDAOImpl.java59
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/Metadata.java50
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/Node.java32
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/ServiceInfo.java76
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/Spec.java44
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/BaseQueue.java36
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/QueueManager.java65
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceConsumer.java167
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceData.java53
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceListCache.java35
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceListConsumer.java209
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceListQueue.java59
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceQueue.java45
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/ApiRouteService.java159
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/CustomRouteService.java152
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/IuiRouteService.java151
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/MicroServiceFullService.java220
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/serviceListener/IMicroServiceChangeListener.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/IMicroServiceChangeListener.java)22
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/serviceListener/MicroServiceChangeListener.java779
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/serviceListener/RouteNotify.java77
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/CommonUtil.java76
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/ConfigUtil.java446
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/FileUtil.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/FileUtil.java)23
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/HttpClientUtil.java117
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/HttpGetResult.java19
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/Jackson.java28
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/JacksonJsonUtil.java110
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/JedisUtil.java208
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/MicroServiceUtil.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceUtil.java)51
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/RegExpTestUtil.java (renamed from msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RegExpTestUtil.java)47
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/RouteUtil.java345
-rw-r--r--apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/ServiceFilter.java515
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/META-INF/MANIFEST.MF (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/META-INF/MANIFEST.MF)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/WEB-INF/web.xml40
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/css/reset.css (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/reset.css)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/css/screen.css (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/screen.css)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.eot (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.eot)bin22924 -> 22924 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.svg (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.svg)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.ttf (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.ttf)bin40516 -> 40516 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff)bin25992 -> 25992 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff2 (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff2)bin11480 -> 11480 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.eot (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.eot)bin22008 -> 22008 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.svg (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.svg)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.ttf (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.ttf)bin39072 -> 39072 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff)bin24868 -> 24868 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff2 (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff2)bin11304 -> 11304 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/images/explorer_icons.png (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/explorer_icons.png)bin5763 -> 5763 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/images/logo_small.png (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/logo_small.png)bin770 -> 770 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/images/pet_store_api.png (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/pet_store_api.png)bin824 -> 824 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/images/throbber.gif (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/throbber.gif)bin9257 -> 9257 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/images/wordnik_api.png (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/wordnik_api.png)bin980 -> 980 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/index.html (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/index.html)241
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/iframeResizer/iframeResizer.contentWindow.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/iframeResizer/iframeResizer.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/js/tools.js1054
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/backbone-min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/backbone-min.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/handlebars-2.0.0.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/handlebars-2.0.0.js)1
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/highlight.7.3.pack.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/highlight.7.3.pack.js)1
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery-1.8.0.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery-1.8.0.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.ba-bbq.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.ba-bbq.min.js)8
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.slideto.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.slideto.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.wiggle.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.wiggle.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/marked.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/marked.js)22
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/shred.bundle.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/shred.bundle.js)1
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/shred/content.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/shred/content.js)19
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-client.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-client.js)1
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-oauth.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-oauth.js)1
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/lib/underscore-min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/underscore-min.js)1
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/o2c.html20
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/banner.txt5
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/css/animate.min.css (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/css/animate.min.css)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/css/base.css54
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/css/chart.css16
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/css/newRoute.css (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/css/newRoute.css)613
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/css/route.css (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/css/route.css)1285
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/default.html177
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js)9
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties166
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties160
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-checked.png (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-checked.png)bin3053 -> 3053 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-init.png (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-init.png)bin2833 -> 2833 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/img/details_close.png (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/details_close.png)bin3300 -> 3300 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/img/details_open.png (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/details_open.png)bin3304 -> 3304 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/img/down.png (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/down.png)bin2938 -> 2938 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/img/loading-spinner-grey.gif (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/img/loading-spinner-grey.gif)bin5203 -> 5203 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/img/logo.pngbin0 -> 4762 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/img/sidebar-toggler-grey.jpg (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/sidebar-toggler-grey.jpg)bin14801 -> 14801 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/img/throbber.gif (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/img/throbber.gif)bin9257 -> 9257 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/img/up.png (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/up.png)bin2926 -> 2926 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/img/zte_logo_16.gif (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/zte_logo_16.gif)bin583 -> 583 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/index.html (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/index.html)2066
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/avalon.js)1
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/bootbox/bootbox.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootbox/bootbox.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap-growl.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap-growl.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/css/bootstrap-dt.css)6
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css)6
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap.js)6
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap.min.js)10
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap2-typeahead.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap2-typeahead.min.js)1
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.css (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/dataTables/dataTables.bootstrap.css)1
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/dataTables/dataTables.bootstrap.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/jquery.dataTables.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/dataTables/jquery.dataTables.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/echarts/echarts.common.min.js29
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/echarts/macarons.js540
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/css/font-awesome.css)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css.map (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/css/font-awesome.css.map)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.min.css (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/css/font-awesome.min.css)3
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/FontAwesome.otf (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/FontAwesome.otf)bin106260 -> 106260 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.eot (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.eot)bin68875 -> 68875 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.svg (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.svg)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.ttf (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.ttf)bin138204 -> 138204 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.woff)bin81284 -> 81284 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff2 (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.woff2)bin64464 -> 64464 bytes
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/animated.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/animated.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/bordered-pulled.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/bordered-pulled.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/core.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/core.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/fixed-width.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/fixed-width.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/font-awesome.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/font-awesome.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/icons.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/icons.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/larger.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/larger.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/list.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/list.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/mixins.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/mixins.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/path.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/path.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/rotated-flipped.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/rotated-flipped.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/stacked.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/stacked.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/variables.less (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/variables.less)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_animated.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_animated.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_bordered-pulled.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_bordered-pulled.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_core.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_core.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_fixed-width.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_fixed-width.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_icons.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_icons.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_larger.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_larger.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_list.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_list.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_mixins.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_mixins.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_path.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_path.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_rotated-flipped.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_rotated-flipped.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_stacked.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_stacked.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_variables.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_variables.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/font-awesome.scss (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/font-awesome.scss)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.contentWindow.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.contentWindow.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.js)20
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.js)1
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.js)18
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.js22
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.js22
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.js22
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.js19
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.js19
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery.i18n/jquery.i18n.properties-1.0.9.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery.i18n/jquery.i18n.properties-1.0.9.js)1
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/jquery/jquery-1.10.2.min.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/jquery/jquery-1.10.2.min.js)0
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/routeController.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/routeController.js)3771
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/routeFunc.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/routeFunc.js)1294
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/routeUtil.js (renamed from msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/routeUtil.js)118
-rw-r--r--apiroute/apiroute-service/src/main/resources/iui-route/js/statusUtil.js428
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/SyncDataManagerTest.java56
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/ApiRouteHealthCheckTest.java69
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/ConsulLinkHealthCheckTest.java103
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/OpenRestyHealthCheckTest.java77
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/RedisHealthCheckTest.java77
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/ApiRouteServiceWrapperTest.java252
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/CustomRouteServiceWrapperTest.java208
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/InitRouteServiceWrapperTest.java241
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/IuiRouteServiceWrapperTest.java212
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/MicroServiceWrapperTest.java294
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/ConsulTest.java149
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServiceHealthCacheTest.java24
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServicesCatalogCacheTest.java15
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckServiceDataEmptyAndAutoStopWatchFilterTest.java53
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckTagAndAutoStopWatchFilterTest.java70
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ConsulIndexFilterTest.java42
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ServiceModifyIndexFilterTest.java114
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchCatalogServicesTaskTest.java138
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchServiceHealthTaskTest.java156
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WriteBufferHandlerTest.java46
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/ServiceHealthTest.java54
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/ServiceTest.java32
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/util/HttpTest.java80
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/queue/QueueManagerTest.java178
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/ApiRouteServiceTest.java251
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/CustomRouteServiceTest.java241
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/IuiRouteServiceTest.java221
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/MicroServiceFullServiceTest.java413
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/serviceListener/MicroServiceChangeListenerTest.java666
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/CommonUtilTest.java61
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/ConfigUtilTest.java214
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/HttpClientUtilTest.java29
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/JacksonJsonUtilTest.java94
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/JedisUtilTest.java20
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/MicroServiceUtilTest.java45
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/RegExpTestUtilTest.java96
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/RouteUtilTest.java373
-rw-r--r--apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/ServiceFilterTest.java210
-rw-r--r--apiroute/apiroute-service/src/test/resources/ext/initApiGatewayConfig/initApiGatewayConfig.json3
-rw-r--r--apiroute/apiroute-service/src/test/resources/ext/initRouteLabels/initRouteLabelsMatches.json12
-rw-r--r--apiroute/apiroute-service/src/test/resources/ext/initRouteLabels/initRouteLabelsMatches.json.sample12
-rw-r--r--apiroute/apiroute-service/src/test/resources/ext/initRouteLabels/readme.txt17
-rw-r--r--apiroute/apiroute-service/src/test/resources/ext/initRouteWay/initRouteWay.json3
-rw-r--r--apiroute/apiroute-service/src/test/resources/ext/initRouteWay/readme.txt5
-rw-r--r--apiroute/apiroute-service/src/test/resources/ext/initServices/msb.json (renamed from msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initServices/msb.json)97
-rw-r--r--apiroute/apiroute-service/src/test/resources/ext/initServices/readme.txt (renamed from msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initServices/readme.txt)143
-rw-r--r--apiroute/apiroute-service/src/test/resources/ext/initSwaggerJson/api-doc1.json (renamed from msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initSwaggerJson/api-doc1.json)0
-rw-r--r--apiroute/apiroute-service/src/test/resources/ext/initSwaggerJson/api-doc2.json (renamed from msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initSwaggerJson/api-doc2.json)0
-rw-r--r--apiroute/apiroute-service/src/test/resources/ext/initUrlRootPath/initUrlRootPath.json4
-rw-r--r--apiroute/apiroute-service/src/test/resources/ext/redisConf/redis.properties18
-rw-r--r--apiroute/apiroute-service/src/test/resources/org/onap/msb/apiroute/wrapper/consulextend/util/serviceslist.json1
-rw-r--r--apiroute/apiroute-standalone/pom.xml (renamed from msb-core/apiroute/apiroute-standalone/pom.xml)53
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/conf/apiroute.yml47
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initApiGatewayConfig/initApiGatewayConfig.json3
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteLabels/initRouteLabelsMatches.json7
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteLabels/initRouteLabelsMatches.json.sample12
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteLabels/readme.txt17
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteWay/initRouteWay.json3
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteWay/readme.txt5
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initServices/msb.json31
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initServices/readme.txt63
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initSwaggerJson/api-doc1.json1
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initSwaggerJson/api-doc2.json1
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initUrlRootPath/initUrlRootPath.json4
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/redisConf/redis.properties18
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/run.sh (renamed from msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/run.sh)52
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/setenv.sh10
-rw-r--r--apiroute/apiroute-standalone/src/assembly/resources/apiroute/stop.sh59
-rw-r--r--apiroute/pom.xml (renamed from msb-parent/msbparent/pom.xml)218
-rw-r--r--build4docker.sh55
-rw-r--r--ci/build_docker_image.sh36
-rw-r--r--distributions/msb-apigateway/pom.xml191
-rw-r--r--distributions/msb-apigateway/src/assembly/resources/shutdown.sh (renamed from msb-core/distributions/standalone/src/assembly/resource/stop.sh)16
-rw-r--r--distributions/msb-apigateway/src/assembly/resources/startup.sh (renamed from msb-core/distributions/standalone/src/assembly/resource/startup.sh)28
-rw-r--r--distributions/msb-apigateway/src/assembly/resources/startup4docker.sh36
-rw-r--r--distributions/msb-apigateway/src/main/docker/Dockerfile6
-rw-r--r--distributions/pom.xml27
-rw-r--r--msb-core/apiroute/apiroute-service/pom.xml165
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java549
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ConsulClientApp.java451
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ApiRouteInfo.java136
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ConsulInfo.java38
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomRouteInfo.java102
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/IuiRouteInfo.java102
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MetricsInfo.java191
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceFullInfo.java44
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceInfo.java38
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/NodeInfo.java74
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Service.java104
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ServiceAccessInfo.java88
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MetricsResource.java48
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ServiceAccessResource.java64
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ApiRouteServiceWrapper.java565
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/CustomRouteServiceWrapper.java415
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/IuiRouteServiceWrapper.java392
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MetricsServiceWrapper.java91
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MicroServiceWrapper.java515
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ServiceAccessWrapper.java171
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/CatalogClient.java300
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/Consul.java314
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/ConsulException.java57
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/HealthClient.java262
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/async/ConsulResponseCallback.java57
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/CatalogCache.java69
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache.java245
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache4Map.java257
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/HealthCache.java69
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ServiceCache.java49
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/ConsulResponse.java95
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogNode.java56
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogService.java67
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogNode.java305
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogService.java625
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ServiceInfo.java62
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableNode.java265
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableService.java477
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Node.java50
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Service.java63
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ServiceHealth.java88
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/CatalogOptions.java54
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ConsistencyMode.java36
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableCatalogOptions.java250
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableQueryOptions.java530
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/Options.java44
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ParamAdder.java38
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/QueryOptions.java115
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Base64EncodingDeserializer.java60
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ClientUtil.java261
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Jackson.java49
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ObjectMapperContextResolver.java50
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsDeserializer.java58
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsSerializer.java49
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/UnsignedLongDeserializer.java52
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java291
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JacksonJsonUtil.java119
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JedisUtil.java220
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceDB.java428
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RouteUtil.java134
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/api-doc/WEB-INF/web.xml44
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js9
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js8
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/api-doc/o2c.html40
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/banner.txt24
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/css/metrics.css159
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/loadi18nApp_iui-metrics_view.js46
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/msb-iui-metrics-i18n-en-US.properties85
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/msb-iui-metrics-i18n-zh-CN.properties81
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/img/netnumenLogo.pngbin5639 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/index.html259
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/css/bootstrap.min.css1
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap2-typeahead.min.js20
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/echarts/echarts-all.js36
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/images/sort_both.pngbin5639 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/jquery.i18n/jquery.i18n.properties-1.0.9.js480
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsChart.js420
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsController.js230
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsUtil.js49
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/css/animate.min.css6
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/default.html144
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties168
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties163
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/conductor-logo.pngbin4907 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/loading-spinner-grey.gifbin5203 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/logo.pngbin4907 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/netnumenLogo.pngbin5639 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/openo_logo_16.pngbin988 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/throbber.gifbin9257 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js5820
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css5798
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js1945
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.min.js7
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.css309
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.min.js8
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/jquery.dataTables.min.js160
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css2026
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css.map7
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.min.css1
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/FontAwesome.otfbin106260 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.eotbin68875 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.svg640
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.ttfbin138204 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woffbin81284 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff2bin64464 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/animated.less34
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/bordered-pulled.less25
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/core.less12
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/fixed-width.less6
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/font-awesome.less17
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/icons.less677
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/larger.less13
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/list.less19
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/mixins.less26
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/path.less15
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/rotated-flipped.less20
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/stacked.less20
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/variables.less688
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_animated.scss34
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_bordered-pulled.scss25
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_core.scss12
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_fixed-width.scss6
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_icons.scss677
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_larger.scss13
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_list.scss19
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_mixins.scss26
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_path.scss15
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_rotated-flipped.scss20
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_stacked.scss20
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_variables.scss688
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/font-awesome.scss17
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.js40
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.js40
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.js40
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.js37
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.js37
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery/jquery-1.10.2.min.js4
-rw-r--r--msb-core/apiroute/apiroute-service/src/main/resources/swagger.properties51
-rw-r--r--msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/ApiRouteServiceWrapperTest.java164
-rw-r--r--msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/CustomRouteServiceWrapperTest.java137
-rw-r--r--msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/IuiRouteServiceWrapperTest.java137
-rw-r--r--msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/MicroServiceWrapperTest.java148
-rw-r--r--msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/util/JacksonJsonUtilTest.java48
-rw-r--r--msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/util/RegExpTestUtilTest.java86
-rw-r--r--msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/util/RouteUtilTest.java64
-rw-r--r--msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/apirouteService.exebin59392 -> 0 bytes
-rw-r--r--msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/apirouteService.xml33
-rw-r--r--msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/conf/apiroute.yml71
-rw-r--r--msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initUrlRootPath/initUrlRootPath.json4
-rw-r--r--msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initVisualRange/initVisualRangeMatches.json3
-rw-r--r--msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initVisualRange/readme.txt33
-rw-r--r--msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/find_kill_process.bat27
-rw-r--r--msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/run.bat59
-rw-r--r--msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/stop.bat38
-rw-r--r--msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/stop.sh47
-rw-r--r--msb-core/apiroute/pom.xml39
-rw-r--r--msb-core/distributions/pom.xml43
-rw-r--r--msb-core/distributions/standalone/pom.xml250
-rw-r--r--msb-core/distributions/standalone/src/assembly/resource/servicesInstall.bat38
-rw-r--r--msb-core/distributions/standalone/src/assembly/resource/servicesRestart.bat38
-rw-r--r--msb-core/distributions/standalone/src/assembly/resource/servicesStatus.bat38
-rw-r--r--msb-core/distributions/standalone/src/assembly/resource/servicesUninstall.bat41
-rw-r--r--msb-core/distributions/standalone/src/assembly/resource/startup.bat46
-rw-r--r--msb-core/distributions/standalone/src/assembly/resource/stop.bat44
-rw-r--r--msb-core/eag-openresty-ext/pom.xml119
-rw-r--r--msb-core/eag-openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/openomsb.conf181
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/lualib/resty/http.lua850
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/lualib/resty/http_headers.lua62
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/nginx/conf/nginx.conf72
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua187
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoadminrouter.lua110
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapijsonrouter.lua110
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapirouter.lua117
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua115
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/auth.lua171
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/driver_manager.lua127
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/openomsb.conf181
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/run.bat55
-rw-r--r--msb-core/openresty-ext/src/assembly/resources/openresty/stop.bat54
-rw-r--r--msb-core/pom.xml47
-rw-r--r--msb-parent/README.md17
-rw-r--r--msb-parent/msbparent-lite/pom.xml240
-rw-r--r--msb-parent/pom.xml56
-rw-r--r--openresty-ext/pom.xml (renamed from msb-core/openresty-ext/pom.xml)83
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/conf/mime.types94
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/conf/nginx.conf72
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/html/cert/ca.crt22
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/logs/placeholder.txt (renamed from msb-core/openresty-ext/src/assembly/resources/openresty/nginx/logs/placeholder.txt)0
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/msbinit.lua58
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/svcconf.lua34
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/dao.lua123
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/db_access.lua85
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/redis_db.lua199
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/tools/db_cache.lua54
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/tools/rr_cache.lua40
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/error_handler.lua48
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/log_util.lua (renamed from msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/setnocacheflag.lua)57
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/str_util.lua (renamed from msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/execute_auth.lua)55
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/svc_util.lua96
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/table_util.lua30
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/balancer.lua50
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/baseupstream.lua66
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/peerwatcher.lua107
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy/roundrobin.lua68
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/log/logger.lua24
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/msb.lua90
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/base_plugin.lua35
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/config_custom.lua (renamed from msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/msbconf.lua)17
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/config_default.lua (renamed from msb-core/eag-openresty-ext/src/assembly/resources/openresty/nginx/luaext/msbconf.lua)19
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/redirect-transformer/handler.lua42
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/sampleplugin/handler.lua50
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/commonrewrite.lua138
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/customrewrite.lua203
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/vendor/classic.lua68
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/luaext/vendor/shcache.lua440
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-default/msblocations.conf218
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext-mount/README.md4
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/README.md11
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/cert.conf19
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/defaultpage.conf9
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/homepage.conf20
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/msb.conf67
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/msbhttps.conf22
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled-mount/README.md4
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/README.md15
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/addPortTemplate21
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/sampleplugin41
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/ssl/cert/cert.crt21
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/ssl/cert/cert.key27
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/ssl/dh-pubkey/dhparams.pem8
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/stream-enabled/placeholder.txt (renamed from msb-core/openresty-ext/src/assembly/resources/openresty/nginx/temp/placeholder.txt)0
-rw-r--r--openresty-ext/src/assembly/resources/openresty/nginx/temp/placeholder.txt0
-rw-r--r--openresty-ext/src/assembly/resources/openresty/reload.sh (renamed from msb-core/openresty-ext/src/assembly/resources/openresty/reload.sh)7
-rw-r--r--openresty-ext/src/assembly/resources/openresty/run.sh (renamed from msb-core/openresty-ext/src/assembly/resources/openresty/run.sh)10
-rw-r--r--openresty-ext/src/assembly/resources/openresty/run4docker.sh39
-rw-r--r--openresty-ext/src/assembly/resources/openresty/stop.sh (renamed from msb-core/openresty-ext/src/assembly/resources/openresty/stop.sh)8
-rw-r--r--pom.xml196
-rw-r--r--redis-ext/pom.xml (renamed from msb-core/redis-ext/pom.xml)81
-rw-r--r--redis-ext/src/assembly/resources/linux/redis/BGREWRITEAOF.sh (renamed from msb-core/redis-ext/src/assembly/resources/linux/redis/BGREWRITEAOF.sh)0
-rw-r--r--redis-ext/src/assembly/resources/linux/redis/conf/redis.conf (renamed from msb-core/redis-ext/src/assembly/resources/linux/redis/conf/redis.conf)4
-rw-r--r--redis-ext/src/assembly/resources/linux/redis/logs/placeholder.txt0
-rw-r--r--redis-ext/src/assembly/resources/linux/redis/run.sh (renamed from msb-core/redis-ext/src/assembly/resources/linux/redis/run.sh)10
-rw-r--r--redis-ext/src/assembly/resources/linux/redis/run4docker.sh46
-rw-r--r--redis-ext/src/assembly/resources/linux/redis/stop.sh (renamed from msb-core/redis-ext/src/assembly/resources/linux/redis/stop.sh)11
648 files changed, 27611 insertions, 45041 deletions
diff --git a/.gitattributes b/.gitattributes
index 13e92ef..bb0dee2 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,2 +1,3 @@
*.java text eol=lf
*.xml text eol=lf
+*.sh text eol=lf
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c6355b1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+.project
+.classpath
+.settings/
+target/
+.vagrant
+/archives/
+*.jar
+*.zip
+*.tar
+*.gz
diff --git a/.gitreview b/.gitreview
deleted file mode 100644
index bb6d75f..0000000
--- a/.gitreview
+++ /dev/null
@@ -1,4 +0,0 @@
-[gerrit]
-host=gerrit.open-o.org
-port=29418
-project=common-services-microservice-bus.git
diff --git a/License.txt b/License.txt
deleted file mode 100644
index dd08487..0000000
--- a/License.txt
+++ /dev/null
@@ -1,473 +0,0 @@
-THIS LICENSE FILE CONTAINS THE LICENSE APPLICABLE DEPENDING ON THE TYPE OF CONTRIBUTIONS.
-
-APACHE LICENSE 2 IS APPLICABLE FOR SOURCE CODE, CREATIVE COMMONS ATTRIBUTION 4.0 INTERNATIONAL FOR DOCUMENTATION
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-
-Apache License
-Version 2.0, January 2004
-http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
-
-"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
-
-2. Grant of Copyright License.
-
-Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License.
-
-Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
-
-4. Redistribution.
-
-You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
-
-You must give any other recipients of the Work or Derivative Works a copy of this License; and
-You must cause any modified files to carry prominent notices stating that You changed the files; and
-You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
-If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
-You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
-
-5. Submission of Contributions.
-
-Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
-
-6. Trademarks.
-
-This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty.
-
-Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability.
-
-In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability.
-
-While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-Attribution 4.0 International
-
-https://creativecommons.org/licenses/by/4.0/legalcode
-
----------------------------------------------------------------------------------------
-
-Creative Commons Corporation ("Creative Commons") is not a law firm and
-does not provide legal services or legal advice. Distribution of
-Creative Commons public licenses does not create a lawyer-client or
-other relationship. Creative Commons makes its licenses and related
-information available on an "as-is" basis. Creative Commons gives no
-warranties regarding its licenses, any material licensed under their
-terms and conditions, or any related information. Creative Commons
-disclaims all liability for damages resulting from their use to the
-fullest extent possible.
-
-Using Creative Commons Public Licenses
-
-Creative Commons public licenses provide a standard set of terms and
-conditions that creators and other rights holders may use to share
-original works of authorship and other material subject to copyright
-and certain other rights specified in the public license below. The
-following considerations are for informational purposes only, are not
-exhaustive, and do not form part of our licenses.
-
- Considerations for licensors: Our public licenses are
- intended for use by those authorized to give the public
- permission to use material in ways otherwise restricted by
- copyright and certain other rights. Our licenses are
- irrevocable. Licensors should read and understand the terms
- and conditions of the license they choose before applying it.
- Licensors should also secure all rights necessary before
- applying our licenses so that the public can reuse the
- material as expected. Licensors should clearly mark any
- material not subject to the license. This includes other CC-
- licensed material, or material used under an exception or
- limitation to copyright. More considerations for licensors:
- wiki.creativecommons.org/Considerations_for_licensors
-
- Considerations for the public: By using one of our public
- licenses, a licensor grants the public permission to use the
- licensed material under specified terms and conditions. If
- the licensor's permission is not necessary for any reason--for
- example, because of any applicable exception or limitation to
- copyright--then that use is not regulated by the license. Our
- licenses grant only permissions under copyright and certain
- other rights that a licensor has authority to grant. Use of
- the licensed material may still be restricted for other
- reasons, including because others have copyright or other
- rights in the material. A licensor may make special requests,
- such as asking that all changes be marked or described.
- Although not required by our licenses, you are encouraged to
- respect those requests where reasonable. More_considerations
- for the public:
- wiki.creativecommons.org/Considerations_for_licensees
-
----------------------------------------------------------------------------------------
-
-Creative Commons Attribution 4.0 International Public License
-
-By exercising the Licensed Rights (defined below), You accept and agree
-to be bound by the terms and conditions of this Creative Commons
-Attribution 4.0 International Public License ("Public License"). To the
-extent this Public License may be interpreted as a contract, You are
-granted the Licensed Rights in consideration of Your acceptance of
-these terms and conditions, and the Licensor grants You such rights in
-consideration of benefits the Licensor receives from making the
-Licensed Material available under these terms and conditions.
-
-
-Section 1 -- Definitions.
-
- a. Adapted Material means material subject to Copyright and Similar
- Rights that is derived from or based upon the Licensed Material
- and in which the Licensed Material is translated, altered,
- arranged, transformed, or otherwise modified in a manner requiring
- permission under the Copyright and Similar Rights held by the
- Licensor. For purposes of this Public License, where the Licensed
- Material is a musical work, performance, or sound recording,
- Adapted Material is always produced where the Licensed Material is
- synched in timed relation with a moving image.
-
- b. Adapter's License means the license You apply to Your Copyright
- and Similar Rights in Your contributions to Adapted Material in
- accordance with the terms and conditions of this Public License.
-
- c. Copyright and Similar Rights means copyright and/or similar rights
- closely related to copyright including, without limitation,
- performance, broadcast, sound recording, and Sui Generis Database
- Rights, without regard to how the rights are labeled or
- categorized. For purposes of this Public License, the rights
- specified in Section 2(b)(1)-(2) are not Copyright and Similar
- Rights.
-
- d. Effective Technological Measures means those measures that, in the
- absence of proper authority, may not be circumvented under laws
- fulfilling obligations under Article 11 of the WIPO Copyright
- Treaty adopted on December 20, 1996, and/or similar international
- agreements.
-
- e. Exceptions and Limitations means fair use, fair dealing, and/or
- any other exception or limitation to Copyright and Similar Rights
- that applies to Your use of the Licensed Material.
-
- f. Licensed Material means the artistic or literary work, database,
- or other material to which the Licensor applied this Public
- License.
-
- g. Licensed Rights means the rights granted to You subject to the
- terms and conditions of this Public License, which are limited to
- all Copyright and Similar Rights that apply to Your use of the
- Licensed Material and that the Licensor has authority to license.
-
- h. Licensor means the individual(s) or entity(ies) granting rights
- under this Public License.
-
- i. Share means to provide material to the public by any means or
- process that requires permission under the Licensed Rights, such
- as reproduction, public display, public performance, distribution,
- dissemination, communication, or importation, and to make material
- available to the public including in ways that members of the
- public may access the material from a place and at a time
- individually chosen by them.
-
- j. Sui Generis Database Rights means rights other than copyright
- resulting from Directive 96/9/EC of the European Parliament and of
- the Council of 11 March 1996 on the legal protection of databases,
- as amended and/or succeeded, as well as other essentially
- equivalent rights anywhere in the world.
-
- k. You means the individual or entity exercising the Licensed Rights
- under this Public License. Your has a corresponding meaning.
-
-
-Section 2 -- Scope.
-
- a. License grant.
-
- 1. Subject to the terms and conditions of this Public License,
- the Licensor hereby grants You a worldwide, royalty-free,
- non-sublicensable, non-exclusive, irrevocable license to
- exercise the Licensed Rights in the Licensed Material to:
-
- a. reproduce and Share the Licensed Material, in whole or
- in part; and
-
- b. produce, reproduce, and Share Adapted Material.
-
- 2. Exceptions and Limitations. For the avoidance of doubt, where
- Exceptions and Limitations apply to Your use, this Public
- License does not apply, and You do not need to comply with
- its terms and conditions.
-
- 3. Term. The term of this Public License is specified in Section
- 6(a).
-
- 4. Media and formats; technical modifications allowed. The
- Licensor authorizes You to exercise the Licensed Rights in
- all media and formats whether now known or hereafter created,
- and to make technical modifications necessary to do so. The
- Licensor waives and/or agrees not to assert any right or
- authority to forbid You from making technical modifications
- necessary to exercise the Licensed Rights, including
- technical modifications necessary to circumvent Effective
- Technological Measures. For purposes of this Public License,
- simply making modifications authorized by this Section 2(a)
- (4) never produces Adapted Material.
-
- 5. Downstream recipients.
-
- a. Offer from the Licensor -- Licensed Material. Every
- recipient of the Licensed Material automatically
- receives an offer from the Licensor to exercise the
- Licensed Rights under the terms and conditions of this
- Public License.
-
- b. No downstream restrictions. You may not offer or impose
- any additional or different terms or conditions on, or
- apply any Effective Technological Measures to, the
- Licensed Material if doing so restricts exercise of the
- Licensed Rights by any recipient of the Licensed
- Material.
-
- 6. No endorsement. Nothing in this Public License constitutes or
- may be construed as permission to assert or imply that You
- are, or that Your use of the Licensed Material is, connected
- with, or sponsored, endorsed, or granted official status by,
- the Licensor or others designated to receive attribution as
- provided in Section 3(a)(1)(A)(i).
-
- b. Other rights.
-
- 1. Moral rights, such as the right of integrity, are not
- licensed under this Public License, nor are publicity,
- privacy, and/or other similar personality rights; however, to
- the extent possible, the Licensor waives and/or agrees not to
- assert any such rights held by the Licensor to the limited
- extent necessary to allow You to exercise the Licensed
- Rights, but not otherwise.
-
- 2. Patent and trademark rights are not licensed under this
- Public License.
-
- 3. To the extent possible, the Licensor waives any right to
- collect royalties from You for the exercise of the Licensed
- Rights, whether directly or through a collecting society
- under any voluntary or waivable statutory or compulsory
- licensing scheme. In all other cases the Licensor expressly
- reserves any right to collect such royalties.
-
-
-Section 3 -- License Conditions.
-
-Your exercise of the Licensed Rights is expressly made subject to the
-following conditions.
-
- a. Attribution.
-
- 1. If You Share the Licensed Material (including in modified
- form), You must:
-
- a. retain the following if it is supplied by the Licensor
- with the Licensed Material:
-
- i. identification of the creator(s) of the Licensed
- Material and any others designated to receive
- attribution, in any reasonable manner requested by
- the Licensor (including by pseudonym if
- designated);
-
- ii. a copyright notice;
-
- iii. a notice that refers to this Public License;
-
- iv. a notice that refers to the disclaimer of
- warranties;
-
- v. a URI or hyperlink to the Licensed Material to the
- extent reasonably practicable;
-
- b. indicate if You modified the Licensed Material and
- retain an indication of any previous modifications; and
-
- c. indicate the Licensed Material is licensed under this
- Public License, and include the text of, or the URI or
- hyperlink to, this Public License.
-
- 2. You may satisfy the conditions in Section 3(a)(1) in any
- reasonable manner based on the medium, means, and context in
- which You Share the Licensed Material. For example, it may be
- reasonable to satisfy the conditions by providing a URI or
- hyperlink to a resource that includes the required
- information.
-
- 3. If requested by the Licensor, You must remove any of the
- information required by Section 3(a)(1)(A) to the extent
- reasonably practicable.
-
- 4. If You Share Adapted Material You produce, the Adapter's
- License You apply must not prevent recipients of the Adapted
- Material from complying with this Public License.
-
-
-Section 4 -- Sui Generis Database Rights.
-
-Where the Licensed Rights include Sui Generis Database Rights that
-apply to Your use of the Licensed Material:
-
- a. for the avoidance of doubt, Section 2(a)(1) grants You the right
- to extract, reuse, reproduce, and Share all or a substantial
- portion of the contents of the database;
-
- b. if You include all or a substantial portion of the database
- contents in a database in which You have Sui Generis Database
- Rights, then the database in which You have Sui Generis Database
- Rights (but not its individual contents) is Adapted Material; and
-
- c. You must comply with the conditions in Section 3(a) if You Share
- all or a substantial portion of the contents of the database.
-
-For the avoidance of doubt, this Section 4 supplements and does not
-replace Your obligations under this Public License where the Licensed
-Rights include other Copyright and Similar Rights.
-
-
-Section 5 -- Disclaimer of Warranties and Limitation of Liability.
-
- a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
- EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
- AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
- ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
- IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
- WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
- PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
- ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
- KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
- ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
-
- b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
- TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
- NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
- INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
- COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
- USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
- ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
- DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
- IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
-
- c. The disclaimer of warranties and limitation of liability provided
- above shall be interpreted in a manner that, to the extent
- possible, most closely approximates an absolute disclaimer and
- waiver of all liability.
-
-
-Section 6 -- Term and Termination.
-
- a. This Public License applies for the term of the Copyright and
- Similar Rights licensed here. However, if You fail to comply with
- this Public License, then Your rights under this Public License
- terminate automatically.
-
- b. Where Your right to use the Licensed Material has terminated under
- Section 6(a), it reinstates:
-
- 1. automatically as of the date the violation is cured, provided
- it is cured within 30 days of Your discovery of the
- violation; or
-
- 2. upon express reinstatement by the Licensor.
-
- For the avoidance of doubt, this Section 6(b) does not affect any
- right the Licensor may have to seek remedies for Your violations
- of this Public License.
-
- c. For the avoidance of doubt, the Licensor may also offer the
- Licensed Material under separate terms or conditions or stop
- distributing the Licensed Material at any time; however, doing so
- will not terminate this Public License.
-
- d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
- License.
-
-
-Section 7 -- Other Terms and Conditions.
-
- a. The Licensor shall not be bound by any additional or different
- terms or conditions communicated by You unless expressly agreed.
-
- b. Any arrangements, understandings, or agreements regarding the
- Licensed Material not stated herein are separate from and
- independent of the terms and conditions of this Public License.
-
-
-Section 8 -- Interpretation.
-
- a. For the avoidance of doubt, this Public License does not, and
- shall not be interpreted to, reduce, limit, restrict, or impose
- conditions on any use of the Licensed Material that could lawfully
- be made without permission under this Public License.
-
- b. To the extent possible, if any provision of this Public License is
- deemed unenforceable, it shall be automatically reformed to the
- minimum extent necessary to make it enforceable. If the provision
- cannot be reformed, it shall be severed from this Public License
- without affecting the enforceability of the remaining terms and
- conditions.
-
- c. No term or condition of this Public License will be waived and no
- failure to comply consented to unless expressly agreed to by the
- Licensor.
-
- d. Nothing in this Public License constitutes or may be interpreted
- as a limitation upon, or waiver of, any privileges and immunities
- that apply to the Licensor or You, including from the legal
- processes of any jurisdiction or authority.
-
----------------------------------------------------------------------------------------
-
-Creative Commons is not a party to its public
-licenses. Notwithstanding, Creative Commons may elect to apply one of
-its public licenses to material it publishes and in those instances
-will be considered the "Licensor." The text of the Creative Commons
-public licenses is dedicated to the public domain under the CC0 Public
-Domain Dedication. Except for the limited purpose of indicating that
-material is shared under a Creative Commons public license or as
-otherwise permitted by the Creative Commons policies published at
-creativecommons.org/policies, Creative Commons does not authorize the
-use of the trademark "Creative Commons" or any other trademark or logo
-of Creative Commons without its prior written consent including,
-without limitation, in connection with any unauthorized modifications
-to any of its public licenses or any other arrangements,
-understandings, or agreements concerning use of licensed material. For
-the avoidance of doubt, this paragraph does not form part of the
-public licenses.
-
-Creative Commons may be contacted at creativecommons.org.
diff --git a/README.md b/README.md
index dc836cc..6218077 100644
--- a/README.md
+++ b/README.md
@@ -1,21 +1,8 @@
-##Microservice Bus
-Within the OPEN-O architecture, there are a lot of microservices, e.g., Catalog, Res Mgr., LCM Mgr., Drivers. These microservices are distributed on multiple hosts, that make the communicate between them complex because the consumers need to know the addresses of all the service providers. Besides, some services may have multiple instances, which make the consumer even harder to locate the service provider. Microservice bus provides a service registration/ discovery and routing mechanism to simply the communications between services. The consumers only need to talk with microservice bus without any address information of individual service providers.
-##Runtime Requirements
-* Java 7
-
-##Run
-
-1. Install 1.7 or higer version of JDK
-1. export JAVA_HOME= "$JAVA_INSTALLATION_PATH" , please replace $JAVA_INSTALLATION_PATH with the JDK installation directory on your host
-1. Compile form source or download the latest snapshot from https://nexus.open-o.org/content/repositories/snapshots/org/openo/common-services/microservice-bus/msb-core-standalone/1.0.0-SNAPSHOT/
-1. tar -xzf msb-standalone-1.0.0-SNAPSHOT-linux64.tar.gz
-1. sudo -E ./startup.sh
-
-The default port is 80.
+msb-apigateway
+===============
+Service API gateway provides client request routing, client request load balancing, transformation, authentication & authorization for service request with plugin of auth service provider,service request logging,service request rate-limiting,service monitoring,request result cache,solve cross-domain issue for web application and other functionalities with the pluggable architecture capability.
## License
The Microservice Bus is released under version 2.0 of the [Apache License][].
[Apache License]: http://www.apache.org/licenses/LICENSE-2.0
-
- \ No newline at end of file
diff --git a/apiroute/apiroute-service/dependency-reduced-pom.xml b/apiroute/apiroute-service/dependency-reduced-pom.xml
new file mode 100644
index 0000000..63e1139
--- /dev/null
+++ b/apiroute/apiroute-service/dependency-reduced-pom.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <artifactId>apiroute-parent</artifactId>
+ <groupId>org.onap.msb.apigateway.apiroute</groupId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.onap.msb.apigateway.apiroute</groupId>
+ <artifactId>apiroute-service</artifactId>
+ <name>onap/msb/apigateway/apiroute/apiroute-service</name>
+ <version>0.0.1-SNAPSHOT</version>
+ <build>
+ <resources>
+ <resource>
+ <directory>src/main/java</directory>
+ <includes>
+ <include>**/*.properties</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.4</version>
+ <configuration>
+ <archive>
+ <manifest>
+ <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+ </manifest>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-shade-plugin</artifactId>
+ <version>2.3</version>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>shade</goal>
+ </goals>
+ <configuration>
+ <transformers>
+ <transformer />
+ <transformer>
+ <mainClass>org.onap.msb.apiroute.ApiRouteApp</mainClass>
+ </transformer>
+ </transformers>
+ </configuration>
+ </execution>
+ </executions>
+ <configuration>
+ <createDependencyReducedPom>true</createDependencyReducedPom>
+ <filters>
+ <filter>
+ <artifact>*:*</artifact>
+ <excludes>
+ <exclude>META-INF/*.SF</exclude>
+ <exclude>META-INF/*.DSA</exclude>
+ <exclude>META-INF/*.RSA</exclude>
+ </excludes>
+ </filter>
+ </filters>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.11</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <artifactId>hamcrest-core</artifactId>
+ <groupId>org.hamcrest</groupId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module-junit4</artifactId>
+ <version>1.5.5</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <artifactId>powermock-module-junit4-common</artifactId>
+ <groupId>org.powermock</groupId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito</artifactId>
+ <version>1.5.5</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <artifactId>mockito-all</artifactId>
+ <groupId>org.mockito</groupId>
+ </exclusion>
+ <exclusion>
+ <artifactId>powermock-api-support</artifactId>
+ <groupId>org.powermock</groupId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.fiftyonred</groupId>
+ <artifactId>mock-jedis</artifactId>
+ <version>0.4.0</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
+
diff --git a/apiroute/apiroute-service/pom.xml b/apiroute/apiroute-service/pom.xml
new file mode 100644
index 0000000..2a3c3e0
--- /dev/null
+++ b/apiroute/apiroute-service/pom.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+ 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. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.onap.msb.apigateway.apiroute</groupId>
+ <artifactId>apiroute-parent</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.onap.msb.apigateway.apiroute</groupId>
+ <artifactId>apiroute-service</artifactId>
+ <name>onap/msb/apigateway/apiroute/apiroute-service</name>
+ <packaging>jar</packaging>
+ <version>0.0.1-SNAPSHOT</version>
+
+
+ <dependencies>
+ <dependency>
+ <groupId>io.dropwizard</groupId>
+ <artifactId>dropwizard-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.dropwizard</groupId>
+ <artifactId>dropwizard-assets</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.dropwizard</groupId>
+ <artifactId>dropwizard-client</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.swagger</groupId>
+ <artifactId>swagger-jersey2-jaxrs</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <!-- add by wangyg:增加redisçš„java客户端jedisä¾èµ– -->
+ <dependency>
+ <groupId>redis.clients</groupId>
+ <artifactId>jedis</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module-junit4</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.orbitz.consul</groupId>
+ <artifactId>consul-client</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpasyncclient</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.immutables</groupId>
+ <artifactId>value</artifactId>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fiftyonred</groupId>
+ <artifactId>mock-jedis</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ </dependency>
+
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.4</version>
+ <configuration>
+ <archive>
+ <manifest>
+ <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+ </manifest>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-shade-plugin</artifactId>
+ <version>2.3</version>
+ <configuration>
+ <createDependencyReducedPom>true</createDependencyReducedPom>
+ <filters>
+ <filter>
+ <artifact>*:*</artifact>
+ <excludes>
+ <exclude>META-INF/*.SF</exclude>
+ <exclude>META-INF/*.DSA</exclude>
+ <exclude>META-INF/*.RSA</exclude>
+ </excludes>
+ </filter>
+ </filters>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>shade</goal>
+ </goals>
+ <configuration>
+ <transformers>
+ <transformer
+ implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
+ <transformer
+ implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+ <mainClass>org.onap.msb.apiroute.ApiRouteApp</mainClass>
+ </transformer>
+ </transformers>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ <resources>
+ <resource>
+ <directory>src/main/java</directory>
+ <includes>
+ <include>**/*.properties</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ </resource>
+ </resources>
+ </build>
+</project>
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/ApiRouteApp.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/ApiRouteApp.java
new file mode 100644
index 0000000..5c3096f
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/ApiRouteApp.java
@@ -0,0 +1,131 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.msb.apiroute;
+import io.dropwizard.Application;
+import io.dropwizard.assets.AssetsBundle;
+import io.dropwizard.server.SimpleServerFactory;
+import io.dropwizard.setup.Bootstrap;
+import io.dropwizard.setup.Environment;
+import io.swagger.jaxrs.config.BeanConfig;
+import io.swagger.jaxrs.listing.ApiListingResource;
+
+import org.onap.msb.apiroute.health.ApiRouteHealthCheck;
+import org.onap.msb.apiroute.resources.ApiRouteResource;
+import org.onap.msb.apiroute.resources.CustomRouteResource;
+import org.onap.msb.apiroute.resources.IuiRouteResource;
+import org.onap.msb.apiroute.resources.MicroServiceResource;
+import org.onap.msb.apiroute.wrapper.InitRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+public class ApiRouteApp extends Application<ApiRouteAppConfig> {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ApiRouteApp.class);
+
+ public static void main(String[] args) throws Exception {
+ new ApiRouteApp().run(args);
+
+ InitRouteServiceWrapper.getInstance().initFilterConfig();
+
+ InitRouteServiceWrapper.getInstance().initDataSynchro();
+
+ InitRouteServiceWrapper.getInstance().initHealthCheck();
+ }
+
+
+ @Override
+ public String getName() {
+ return " MicroService Bus ";
+ }
+
+ @Override
+ public void initialize(Bootstrap<ApiRouteAppConfig> bootstrap) {
+ super.initialize(bootstrap);
+
+ }
+
+ @Override
+ public void run(ApiRouteAppConfig configuration, Environment environment) throws Exception {
+
+
+ ConfigUtil.getInstance().initRootPath();
+
+
+ String iuiRootPath=ConfigUtil.getInstance().getIUI_ROOT_PATH();
+
+ // new AssetsBundle("/iui-metrics", "/"+iuiRootPath+"/microservices/metrics","index.html", "iui-metrics").run(environment);
+
+ new AssetsBundle("/iui-route", "/"+iuiRootPath+"/microservices", "index.html","iui-microservices").run(environment);
+
+ new AssetsBundle("/api-doc", "/"+iuiRootPath+"/microservices/api-doc","index.html", "api-doc").run(environment);
+
+ new AssetsBundle("/ext", "/"+iuiRootPath+"/microservices/ext","index.html", "ext").run(environment);
+
+
+
+
+ final ApiRouteHealthCheck healthCheck =new ApiRouteHealthCheck();
+ environment.healthChecks().register("consulCheck", healthCheck);
+
+ environment.jersey().register(new ApiRouteResource());
+ environment.jersey().register(new IuiRouteResource());
+ environment.jersey().register(new CustomRouteResource());
+ environment.jersey().register(new MicroServiceResource());
+
+ // initSwaggerConfig(environment, configuration);
+
+ ConfigUtil.getInstance().initConsulIp();
+ ConfigUtil.getInstance().initDiscoverInfo(configuration);
+ // InitRouteServiceWrapper.getInstance().initMetricsConfig(configuration);
+
+
+ }
+
+
+
+
+
+
+ private void initSwaggerConfig(Environment environment, ApiRouteAppConfig configuration) {
+
+ environment.jersey().register(new ApiListingResource());
+ environment.getObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
+
+ BeanConfig config = new BeanConfig();
+ config.setTitle("ApiRoute RESTful API");
+ config.setVersion("1.0.0");
+ config.setResourcePackage("org.onap.msb.apiroute.resources");
+ SimpleServerFactory simpleServerFactory =(SimpleServerFactory) configuration.getServerFactory();
+ String basePath = simpleServerFactory.getApplicationContextPath();
+ String rootPath = simpleServerFactory.getJerseyRootPath();
+
+ rootPath = rootPath.substring(0, rootPath.indexOf("/*"));
+
+ basePath = basePath.equals("/") ? rootPath : (new StringBuilder()).append(basePath).append(rootPath).toString();
+
+ LOGGER.warn("getApplicationContextPath: " + basePath);
+ config.setBasePath(basePath);
+ config.setScan(true);
+ }
+
+
+
+
+}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteAppConfig.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/ApiRouteAppConfig.java
index 8338ceb..4c998e0 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteAppConfig.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/ApiRouteAppConfig.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,15 +29,14 @@
* limitations under the License.
*/
-package org.openo.msb;
+package org.onap.msb.apiroute;
import io.dropwizard.Configuration;
import javax.validation.Valid;
import org.hibernate.validator.constraints.NotEmpty;
-import org.openo.msb.api.ConsulInfo;
-import org.openo.msb.api.DiscoverInfo;
+import org.onap.msb.apiroute.api.DiscoverInfo;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -47,47 +46,12 @@ public class ApiRouteAppConfig extends Configuration {
@NotEmpty
private String defaultName = "Stranger";
-
- @NotEmpty
- private String propertiesName="redis.properties";
-
- @NotEmpty
- private String propertiesDir="conf";
-
+
@Valid
private DiscoverInfo discoverInfo;
- @Valid
- private ConsulInfo consulInfo;
-
- @JsonProperty
- public ConsulInfo getConsulInfo() {
- return consulInfo;
- }
-
- @JsonProperty
- public void setConsulInfo(ConsulInfo consulInfo) {
- this.consulInfo = consulInfo;
- }
-
-
- public String getPropertiesDir() {
- return propertiesDir;
- }
-
- public void setPropertiesDir(String propertiesDir) {
- this.propertiesDir = propertiesDir;
- }
-
- public String getPropertiesName() {
- return propertiesName;
- }
-
- public void setPropertiesName(String propertiesName) {
- this.propertiesName = propertiesName;
- }
-
+
@JsonProperty
public String getDefaultWorkspace() {
return defaultWorkspace;
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/SyncDataManager.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/SyncDataManager.java
new file mode 100644
index 0000000..865778e
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/SyncDataManager.java
@@ -0,0 +1,135 @@
+package org.onap.msb.apiroute;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.http.HttpEntity;
+import org.onap.msb.apiroute.wrapper.consulextend.Consul;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.CheckServiceDataEmptyAndAutoStopWatchFilter;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.CheckTagAndAutoStopWatchFilter;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.ServiceModifyIndexFilter;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.WatchCatalogServicesTask;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.WatchServiceHealthTask;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.WriteBufferHandler;
+import org.onap.msb.apiroute.wrapper.queue.ServiceConsumer;
+import org.onap.msb.apiroute.wrapper.queue.ServiceData;
+import org.onap.msb.apiroute.wrapper.queue.ServiceListConsumer;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SyncDataManager {
+ private static Consul consul;
+ private static WatchCatalogServicesTask serviceListWatchTask;
+ private final static Map<String, WatchServiceHealthTask> serviceWatchTaskMap = new ConcurrentHashMap<String, WatchServiceHealthTask>();
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(SyncDataManager.class);
+
+ private SyncDataManager() {
+ }
+
+ public static void initSyncTask(final String ip, final int port) {
+ consul = Consul.builder().withHostAndPort(ip, port).build();
+ startWatchServiceList();
+ startQueueConsumer();
+ }
+
+ public static void startWatchServiceList() {
+
+ LOGGER.info("===========start to WatchServiceList============");
+
+ // create service list watch task
+ serviceListWatchTask = new WatchCatalogServicesTask(
+ consul.catalogClient(), RouteUtil.WATCH_SECOND);
+
+ // first,write data to serviceListQueue buffer.
+ // second,async thread will read data from serviceListQueue buffer.
+ serviceListWatchTask.addHandler(new WriteBufferHandler<HttpEntity>(
+ ServiceData.DataType.service_list));
+
+ // start watch
+ serviceListWatchTask.startWatch();
+ }
+
+ public static void startQueueConsumer() {
+ LOGGER.info("===========start to QueueConsumer Thread============");
+
+ // start ServiceListConsumer
+ new Thread(new ServiceListConsumer(), "ServiceListConsumerThread")
+ .start();
+
+ // start Service Consumer
+ int serviceQueneNum = RouteUtil.SERVICE_DATA_QUEUE_NUM;
+ for (int i = 0; i < serviceQueneNum; i++) {
+ new Thread(new ServiceConsumer(i), "ServiceConsumerThread" + i)
+ .start();
+ }
+
+ }
+
+ public static void startWatchService(final String serviceName) {
+
+ LOGGER.info("===========start to Watch Service[" + serviceName
+ + "]============");
+ // create service watch task
+ WatchServiceHealthTask serviceWatchTask = new WatchServiceHealthTask(
+ consul.healthClient(), serviceName, RouteUtil.WATCH_SECOND);
+
+ // 1.service Data Empty filter
+ serviceWatchTask
+ .addFilter(new CheckServiceDataEmptyAndAutoStopWatchFilter(
+ serviceName));
+
+ // 2.service change filter
+ serviceWatchTask.addFilter(new ServiceModifyIndexFilter());
+
+ // 3.apigateway tag filter:check tag and auto stop watch
+ serviceWatchTask.addFilter(new CheckTagAndAutoStopWatchFilter(
+ serviceName));
+
+ // start watch
+ serviceWatchTask.startWatch();
+
+ // save
+ serviceWatchTaskMap.put(serviceName, serviceWatchTask);
+ }
+
+ public static void stopWatchServiceList() {
+ if (serviceListWatchTask != null) {
+ serviceListWatchTask.removeAllFilter();
+ serviceListWatchTask.removeAllHandler();
+ serviceListWatchTask.stopWatch();
+ }
+ }
+
+ public static void stopWatchService(String serviceName) {
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("stop " + serviceName + " service watch!");
+ }
+
+ WatchServiceHealthTask watchTask = serviceWatchTaskMap.get(serviceName);
+ if (watchTask != null) {
+ watchTask.removeAllFilter();
+ watchTask.removeAllHandler();
+ watchTask.stopWatch();
+ }
+ serviceWatchTaskMap.remove(serviceName);
+ }
+
+ public static boolean resetIndex(String serviceName) {
+
+ WatchServiceHealthTask watchTask = serviceWatchTaskMap.get(serviceName);
+
+ if (watchTask != null) {
+ return watchTask.resetIndex();
+ }
+
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("reset modify index.did not find:" + serviceName);
+ }
+
+ return false;
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/ApiRouteInfo.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/ApiRouteInfo.java
new file mode 100644
index 0000000..1465000
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/ApiRouteInfo.java
@@ -0,0 +1,107 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.msb.apiroute.api;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Objects;
+
+
+public class ApiRouteInfo extends RouteInfo {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(example = "v1", required = true)
+ private String version;
+
+
+ private String apiJson=""; //swagger json Path
+
+ @ApiModelProperty(value = "[apiJson Type] 0:local file 1: remote file", allowableValues = "0,1", example = "1")
+ private String apiJsonType="1";
+ private String metricsUrl="";
+
+
+
+ public String getVersion() {
+ return version;
+ }
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getApiJson() {
+ return apiJson;
+ }
+ public void setApiJson(String apiJson) {
+ this.apiJson = apiJson;
+ }
+
+
+
+
+ public String getApiJsonType() {
+ return apiJsonType;
+ }
+ public void setApiJsonType(String apiJsonType) {
+ this.apiJsonType = apiJsonType;
+ }
+ public String getMetricsUrl() {
+ return metricsUrl;
+ }
+ public void setMetricsUrl(String metricsUrl) {
+ this.metricsUrl = metricsUrl;
+ }
+
+
+
+
+ @Override
+ public Object clone() throws CloneNotSupportedException
+ {
+ return super.clone();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ApiRouteInfo that = (ApiRouteInfo) o;
+ return Objects.equals(isEnable_ssl(), that.isEnable_ssl()) &&
+ Objects.equals(getServiceName(), that.getServiceName()) &&
+ Objects.equals(version, that.version) &&
+ Objects.equals(getUrl(), that.getUrl()) &&
+ Objects.equals(apiJson, that.apiJson) &&
+ Objects.equals(apiJsonType, that.apiJsonType) &&
+ Objects.equals(metricsUrl, that.metricsUrl) &&
+ Objects.equals(getControl(), that.getControl()) &&
+ Objects.equals(getStatus(), that.getStatus()) &&
+ Objects.equals(getVisualRange(), that.getVisualRange()) &&
+ Objects.equals(getUseOwnUpstream(), that.getUseOwnUpstream()) &&
+ Arrays.equals(getServers(), that.getServers()) &&
+ Objects.equals(getHost(), that.getHost()) &&
+ Objects.equals(getNamespace(), that.getNamespace()) &&
+ Objects.equals(getPublish_port(), that.getPublish_port()) &&
+ Objects.equals(getConsulServiceName(), that.getConsulServiceName()) &&
+ Objects.equals(getPublishProtocol(), that.getPublishProtocol());
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getServiceName(), version, getUrl(), apiJson, apiJsonType, metricsUrl, getControl(), getStatus(), getVisualRange(), getServers(), getHost(), getNamespace(), getPublish_port(), isEnable_ssl(), getConsulServiceName(), getPublishProtocol());
+ }
+}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomDateSerializer.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/CustomDateSerializer.java
index e7d46d4..709a995 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomDateSerializer.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/CustomDateSerializer.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.api;
+package org.onap.msb.apiroute.api;
import java.io.IOException;
import java.text.SimpleDateFormat;
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MetricsUtil.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/CustomRouteInfo.java
index df21f3e..788ce00 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MetricsUtil.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/CustomRouteInfo.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,11 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.wrapper.util;
+package org.onap.msb.apiroute.api;
-public class MetricsUtil {
- public static String adminContextPath = "http://127.0.0.1:8086/admin/metrics";
+public class CustomRouteInfo extends RouteInfo{
+
+ private static final long serialVersionUID = 1L;
+
- public static final int SC_OK = 200;
}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/DiscoverInfo.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/DiscoverInfo.java
index 5e71b29..4a4708b 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/DiscoverInfo.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/DiscoverInfo.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.api;
+package org.onap.msb.apiroute.api;
import java.io.Serializable;
@@ -42,6 +42,12 @@ public class DiscoverInfo implements Serializable{
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
+
+ @Override
+ public String toString() {
+ // TODO Auto-generated method stub
+ return this.ip+":"+this.port;
+ }
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotSupportedException.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/IuiRouteInfo.java
index 3d8c90e..b3f3cf6 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotSupportedException.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/IuiRouteInfo.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,15 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.api.exception;
+package org.onap.msb.apiroute.api;
-import javax.ws.rs.NotSupportedException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-public class ExtendedNotSupportedException extends NotSupportedException {
- public ExtendedNotSupportedException(final String message) {
- super(Response.status(Response.Status.UNSUPPORTED_MEDIA_TYPE).entity(message).type(MediaType.TEXT_PLAIN).build());
- }
+public class IuiRouteInfo extends RouteInfo{
+
+ private static final long serialVersionUID = 1L;
+
+
}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/MicroServiceFullInfo.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/MicroServiceFullInfo.java
new file mode 100644
index 0000000..ca0b235
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/MicroServiceFullInfo.java
@@ -0,0 +1,195 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.msb.apiroute.api;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Objects;
+import java.util.Set;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class MicroServiceFullInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+
+ @ApiModelProperty(required = true)
+ private String serviceName;
+
+ @ApiModelProperty(example = "v1")
+ private String version="";
+
+ @ApiModelProperty(value = "Target Service URL,start with /",example = "/api/serviceName/v1", required = true)
+ private String url="";
+
+ @ApiModelProperty(value = "Service Protocol", allowableValues = "REST,UI, MQ, FTP,SNMP,TCP,UDP", example = "REST",required = true)
+ private String protocol = "";
+
+ @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")
+ private String visualRange = "1";
+
+ @ApiModelProperty(value = "lb policy", allowableValues = "round-robin,hash,least_conn", example = "hash")
+ private String lb_policy="";
+
+ private String namespace="";
+
+ private String host="";
+
+ private String path="";
+
+ private String publish_port="";
+
+ @ApiModelProperty(value = "enable ssl", allowableValues = "true,false", example = "false")
+ private boolean enable_ssl=false; //true:https:å¼€å¯SSL加密, false:http
+
+ private String custom; //PORTALå议标志
+
+ private Set<Node> nodes;
+
+ @ApiModelProperty(value = "Service Status", allowableValues = "0,1", example = "1")
+ private String status = "1"; //0:disable 1:enable
+
+
+
+
+ public String getServiceName() {
+ return serviceName;
+ }
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+ public String getVersion() {
+ return version;
+ }
+ public void setVersion(String version) {
+ this.version = version;
+ }
+ public String getUrl() {
+ return url;
+ }
+ public void setUrl(String url) {
+ this.url = url;
+ }
+ public String getProtocol() {
+ return protocol;
+ }
+ public void setProtocol(String protocol) {
+ this.protocol = protocol;
+ }
+
+ public String getVisualRange() {
+ return visualRange;
+ }
+
+ public void setVisualRange(String visualRange) {
+ this.visualRange = visualRange;
+ }
+
+
+ public String getLb_policy() {
+ return lb_policy;
+ }
+
+ public void setLb_policy(String lb_policy) {
+ this.lb_policy = lb_policy;
+ }
+
+ public String getNamespace() {
+ return namespace;
+ }
+
+ public void setNamespace(String namespace) {
+ this.namespace = namespace;
+ }
+
+
+ public String getHost() {
+ return host;
+ }
+ public void setHost(String host) {
+ this.host = host;
+ }
+ public String getPath() {
+ return path;
+ }
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+
+
+ public Set<Node> getNodes() {
+ return nodes;
+ }
+
+ public void setNodes(Set<Node> nodes) {
+ this.nodes = nodes;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+ public void setStatus(String status) {
+ this.status = status;
+ }
+ public String getPublish_port() {
+ return publish_port;
+ }
+ public void setPublish_port(String publish_port) {
+ this.publish_port = publish_port;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ MicroServiceFullInfo that = (MicroServiceFullInfo) o;
+ return Objects.equals(serviceName, that.serviceName) &&
+ Objects.equals(version, that.version) &&
+ Objects.equals(url, that.url) &&
+ Objects.equals(protocol, that.protocol) &&
+ Objects.equals(visualRange, that.visualRange) &&
+ Objects.equals(lb_policy, that.lb_policy) &&
+ Objects.equals(namespace, that.namespace) &&
+ Objects.equals(host, that.host) &&
+ Objects.equals(path, that.path) &&
+ Objects.equals(publish_port, that.publish_port) &&
+ Objects.equals(enable_ssl, that.enable_ssl) &&
+ Objects.equals(nodes, that.nodes) &&
+ Objects.equals(status, that.status);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(serviceName, version, url, protocol, visualRange, lb_policy, namespace, host, path, publish_port, enable_ssl, nodes, status);
+ }
+ public boolean isEnable_ssl() {
+ return enable_ssl;
+ }
+ public void setEnable_ssl(boolean enable_ssl) {
+ this.enable_ssl = enable_ssl;
+ }
+ public String getCustom() {
+ return custom;
+ }
+ public void setCustom(String custom) {
+ this.custom = custom;
+ }
+
+
+} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Node.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/Node.java
index 6273ea1..c515820 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Node.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/Node.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,15 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.api;
+package org.onap.msb.apiroute.api;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
-import java.util.Date;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import java.util.Objects;
public class Node implements Serializable {
private static final long serialVersionUID = 1L;
@@ -32,10 +29,17 @@ public class Node implements Serializable {
@ApiModelProperty(required = true)
private String port;
+ private String status="passing"; //实例å¥åº·æ£€æŸ¥çŠ¶æ€
+
private int ttl=-1;
+ public String getStatus() {
+ return status;
+ }
-
+ public void setStatus(String status) {
+ this.status = status;
+ }
public String getIp() {
return ip;
@@ -71,5 +75,24 @@ public class Node implements Serializable {
this.ttl = ttl;
}
-
+ public Node(String ip,String port){
+ this.ip = ip;
+ this.port = port;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Node node = (Node) o;
+ return Objects.equals(ttl, node.ttl) &&
+ Objects.equals(ip, node.ip) &&
+ Objects.equals(port, node.port) &&
+ Objects.equals(status, node.status);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ip, port, status, ttl);
+ }
}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/PublishFullAddress.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/PublishFullAddress.java
new file mode 100644
index 0000000..3f62897
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/PublishFullAddress.java
@@ -0,0 +1,48 @@
+package org.onap.msb.apiroute.api;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PublishFullAddress implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+
+ private String ip;
+
+ private String port;
+
+
+ private String publish_protocol;
+
+ public String getPublish_protocol() {
+ return publish_protocol;
+ }
+
+ public void setPublish_protocol(String publish_protocol) {
+ this.publish_protocol = publish_protocol;
+ }
+
+
+ public String getIp() {
+ return ip;
+ }
+
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+
+ public String getPort() {
+ return port;
+ }
+
+ public void setPort(String port) {
+ this.port = port;
+ }
+
+ public PublishFullAddress(){
+
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/RouteInfo.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/RouteInfo.java
new file mode 100644
index 0000000..5e36b9d
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/RouteInfo.java
@@ -0,0 +1,179 @@
+package org.onap.msb.apiroute.api;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Objects;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class RouteInfo implements Serializable,Cloneable {
+ private static final long serialVersionUID = 1L;
+ @ApiModelProperty(required = true)
+ private String serviceName;
+
+ @ApiModelProperty(value = "Target Service URL,start with /",example = "/test", required = true)
+ private String url;
+
+ @ApiModelProperty(value = "[control Range] 0:default 1:readonly 2:hidden ", allowableValues = "0,1,2", example = "0")
+ private String control="0";
+
+ @ApiModelProperty(value = "[status] 1:abled 0:disabled ", allowableValues = "0,1", example = "1")
+ private String status="1";
+
+ @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")
+ private String visualRange = "1";
+
+ @ApiModelProperty(value = "[LB Policy]non_ip_hash:0,ip_hash:1", allowableValues = "0,1", example = "0")
+ private String useOwnUpstream="0"; //lb policy
+
+ @ApiModelProperty(required = true)
+ private RouteServer servers[];
+
+ private String host="";
+
+ private String namespace="";
+
+ private String publish_port="";
+
+ private boolean enable_ssl=false; //true:https:å¼€å¯SSL加密, false:http
+
+ private String consulServiceName="";
+
+ private String publishProtocol="http";
+
+
+
+ public String getPublish_port() {
+ return publish_port;
+ }
+ public void setPublish_port(String publish_port) {
+ this.publish_port = publish_port;
+ }
+
+
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+
+public String getServiceName() {
+ return serviceName;
+ }
+
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public RouteServer[] getServers() {
+ return servers.clone();
+ }
+
+ public void setServers(RouteServer[] servers) {
+ this.servers = servers.clone();
+ }
+
+ public String getControl() {
+ return control;
+ }
+
+ public void setControl(String control) {
+ this.control = control;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getVisualRange() {
+ return visualRange;
+ }
+
+ public void setVisualRange(String visualRange) {
+ this.visualRange = visualRange;
+ }
+
+ public String getUseOwnUpstream() {
+ return useOwnUpstream;
+ }
+
+ public void setUseOwnUpstream(String useOwnUpstream) {
+ this.useOwnUpstream = useOwnUpstream;
+ }
+
+ public String getNamespace() {
+ return namespace;
+ }
+
+ public void setNamespace(String namespace) {
+ this.namespace = namespace;
+ }
+ public String getConsulServiceName() {
+ return consulServiceName;
+ }
+ public void setConsulServiceName(String consulServiceName) {
+ this.consulServiceName = consulServiceName;
+ }
+
+ @Override
+ public Object clone() throws CloneNotSupportedException
+ {
+ return super.clone();
+ }
+ public String getPublishProtocol() {
+ return publishProtocol;
+ }
+ public void setPublishProtocol(String publishProtocol) {
+ this.publishProtocol = publishProtocol;
+ }
+ public boolean isEnable_ssl() {
+ return enable_ssl;
+ }
+ public void setEnable_ssl(boolean enable_ssl) {
+ this.enable_ssl = enable_ssl;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ RouteInfo that = (RouteInfo) o;
+ return Objects.equals(enable_ssl, that.enable_ssl) &&
+ Objects.equals(serviceName, that.serviceName) &&
+ Objects.equals(url, that.url) &&
+ Objects.equals(control, that.control) &&
+ Objects.equals(status, that.status) &&
+ Objects.equals(visualRange, that.visualRange) &&
+ Objects.equals(useOwnUpstream, that.useOwnUpstream) &&
+ Arrays.equals(servers, that.servers) &&
+ Objects.equals(host, that.host) &&
+ Objects.equals(namespace, that.namespace) &&
+ Objects.equals(publish_port, that.publish_port) &&
+ Objects.equals(consulServiceName, that.consulServiceName) &&
+ Objects.equals(publishProtocol, that.publishProtocol);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(serviceName, url, control, status, visualRange, useOwnUpstream, servers, host, namespace, publish_port, enable_ssl, consulServiceName, publishProtocol);
+ }
+}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/RouteServer.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/RouteServer.java
index 0a38c7f..310e623 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/RouteServer.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/RouteServer.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,11 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.api;
+package org.onap.msb.apiroute.api;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
+import java.util.Objects;
public class RouteServer implements Serializable{
@@ -65,4 +66,18 @@ public class RouteServer implements Serializable{
this.port = port;
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ RouteServer that = (RouteServer) o;
+ return Objects.equals(weight, that.weight) &&
+ Objects.equals(ip, that.ip) &&
+ Objects.equals(port, that.port);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ip, port, weight);
+ }
}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedInternalServerErrorException.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/exception/ExtendedInternalServerErrorException.java
index f30cde5..de0d47a 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedInternalServerErrorException.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/exception/ExtendedInternalServerErrorException.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.api.exception;
+package org.onap.msb.apiroute.api.exception;
import javax.ws.rs.InternalServerErrorException;
import javax.ws.rs.core.MediaType;
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotFoundException.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/exception/ExtendedNotFoundException.java
index 92956d1..34439d9 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/exception/ExtendedNotFoundException.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/exception/ExtendedNotFoundException.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.api.exception;
+package org.onap.msb.apiroute.api.exception;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.core.MediaType;
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/exception/UnprocessableEntityException.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/exception/UnprocessableEntityException.java
new file mode 100644
index 0000000..28cfd17
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/api/exception/UnprocessableEntityException.java
@@ -0,0 +1,18 @@
+package org.onap.msb.apiroute.api.exception;
+
+import javax.ws.rs.ClientErrorException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.http.HttpStatus;
+
+public class UnprocessableEntityException extends ClientErrorException{
+ private static final long serialVersionUID = -8266622745725405656L;
+
+ public UnprocessableEntityException(final String message) {
+ super(Response.status(HttpStatus.SC_UNPROCESSABLE_ENTITY).entity(message).type(MediaType.TEXT_PLAIN).build());
+ }
+
+
+
+}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/health/ApiRouteHealthCheck.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/ApiRouteHealthCheck.java
index e4f0135..82b5f21 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/health/ApiRouteHealthCheck.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/ApiRouteHealthCheck.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,23 +28,38 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.health;
+package org.onap.msb.apiroute.health;
+
+import org.onap.msb.apiroute.api.DiscoverInfo;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.onap.msb.apiroute.wrapper.util.HttpClientUtil;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
import com.codahale.metrics.health.HealthCheck;
public class ApiRouteHealthCheck extends HealthCheck {
- private final String template;
- public ApiRouteHealthCheck(String template) {
- this.template = template;
+
+ public ApiRouteHealthCheck() {
}
@Override
protected Result check() throws Exception {
- final String saying = String.format(template, "TEST");
- if (!saying.contains("TEST")) {
- return Result.unhealthy("template doesn't include a name");
- }
+ DiscoverInfo discoverInfo=ConfigUtil.getInstance().getDiscoverInfo();
+
+ String checkUrl =
+ (new StringBuilder().append("http://").append(discoverInfo.toString())
+ .append(RouteUtil.MSB_CHECK_URL)).toString();
+
+ int resultStatus = HttpClientUtil.httpGetStatus(checkUrl);
+
+ if(resultStatus==200){
return Result.healthy();
+ }
+ else{
+ return Result.unhealthy("check consul fail:[status]"+resultStatus);
+ }
+
+
}
} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/ConsulLinkHealthCheck.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/ConsulLinkHealthCheck.java
new file mode 100644
index 0000000..916d2f8
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/ConsulLinkHealthCheck.java
@@ -0,0 +1,132 @@
+package org.onap.msb.apiroute.health;
+
+import org.apache.commons.lang3.StringUtils;
+import org.onap.msb.apiroute.ApiRouteApp;
+import org.onap.msb.apiroute.wrapper.InitRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.onap.msb.apiroute.wrapper.util.HttpClientUtil;
+import org.onap.msb.apiroute.wrapper.util.HttpGetResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.codahale.metrics.health.HealthCheck;
+
+public class ConsulLinkHealthCheck extends HealthCheck implements Runnable {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(ConsulLinkHealthCheck.class);
+
+ private final static String CONSUL_IP_ENV = ConfigUtil.getInstance().getConsul_ip();
+
+ private static int failedLoopCheckNum = 12;
+ private static int failedTimer = 5 * 1000;
+
+ private static int normalTimer = 20 * 1000;
+ private static Result result = Result.healthy();
+
+ private String CHECK_IP = "127.0.0.1";
+ private String CHECK_PORT = "8500";
+ private String CHECK_URL = "http://" + CHECK_IP + ":" + CHECK_PORT
+ + "/v1/status/leader";
+
+ public static Result getResult() {
+ return result;
+ }
+
+ @Override
+ protected Result check() {
+ // TODO Auto-generated method stub
+
+ if (!StringUtils.isBlank(CONSUL_IP_ENV)) {
+ CHECK_IP = CONSUL_IP_ENV;
+ CHECK_URL = "http://" + CHECK_IP + ":" + CHECK_PORT
+ + "/v1/status/leader";
+
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("check consul URL:" + CHECK_URL);
+ }
+
+ try {
+
+ HttpGetResult result = HttpClientUtil
+ .httpGetStatusAndBody(CHECK_URL);
+
+ //response format:"127.0.0.1:8300"
+ if (result.getStatusCode() == 200 && result.getBody() != null
+ && result.getBody().contains(":8300")) {
+ return Result.healthy();
+ } else {
+ return Result.unhealthy("check consul link " + CHECK_URL
+ + " fail:" + result.getStatusCode()+":"+result.getBody());
+ }
+
+ } catch (Exception e) {
+ LOGGER.warn(
+ "ConsulLinkHealthCheck:" + CHECK_URL + " execption", e);
+ return Result.unhealthy("check consul link " + CHECK_URL
+ + " exception:{}");
+ }
+
+ }
+
+ return Result.healthy();
+ }
+
+ @Override
+ public void run() {
+ // TODO Auto-generated method stub
+ while (true) {
+
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("consul link check starttime:"
+ + System.currentTimeMillis());
+ }
+
+ result = checkWithPolicy();
+
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("consul link check result:" + result.isHealthy()
+ + " message:" + result.getMessage());
+
+ LOGGER.debug("consul link check endtime:"
+ + System.currentTimeMillis());
+ }
+
+ try {
+ Thread.sleep(normalTimer);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ LOGGER.warn("loop check consul,thread sleep excepiton", e);
+ }
+ }
+ }
+
+ private Result checkWithPolicy() {
+ int failedNum = 0;
+ Result temp = Result.healthy();
+
+ do {
+ // check again
+ temp = check();
+
+ // healthy break;
+ if (temp.isHealthy()) {
+ break;
+ }
+
+ // unhealthy go on
+ failedNum++;
+
+ try {
+ Thread.sleep(failedTimer);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ LOGGER.warn("loop check consul,thread sleep excepiton", e);
+ }
+
+ } while (failedNum <= failedLoopCheckNum);
+
+ return temp;
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/OpenRestyHealthCheck.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/OpenRestyHealthCheck.java
new file mode 100644
index 0000000..fb0379f
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/OpenRestyHealthCheck.java
@@ -0,0 +1,39 @@
+package org.onap.msb.apiroute.health;
+
+import org.apache.commons.lang3.StringUtils;
+import org.onap.msb.apiroute.wrapper.util.HttpClientUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.codahale.metrics.health.HealthCheck;
+
+public class OpenRestyHealthCheck extends HealthCheck {
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(OpenRestyHealthCheck.class);
+ private String CHECK_IP="127.0.0.1";
+ private String CHECK_PORT="80";
+ private String CHECK_URL = "http://"+CHECK_IP+":"+CHECK_PORT+"/api/microservices/v1/apiRoute/discoverInfo";
+
+ @Override
+ protected Result check() throws Exception {
+ // TODO Auto-generated method stub
+
+ if(!StringUtils.isBlank(System.getenv("HTTP_OVERWRITE_PORT")))
+ {
+ CHECK_PORT=System.getenv("HTTP_OVERWRITE_PORT");
+ CHECK_URL = "http://"+CHECK_IP+":"+CHECK_PORT+"/api/microservices/v1/apiRoute/discoverInfo";
+ LOGGER.info("check openresty URL:"+CHECK_URL);
+ }
+
+ int resultStatus = HttpClientUtil.httpGetStatus(CHECK_URL);
+
+ if (resultStatus == 200) {
+ return Result.healthy();
+ } else {
+ return Result
+ .unhealthy("check openresty fail:" + resultStatus);
+ }
+
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/RedisHealthCheck.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/RedisHealthCheck.java
new file mode 100644
index 0000000..7cef3d0
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/RedisHealthCheck.java
@@ -0,0 +1,160 @@
+package org.onap.msb.apiroute.health;
+
+import java.text.SimpleDateFormat;
+
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Jedis;
+
+import com.codahale.metrics.health.HealthCheck;
+
+public class RedisHealthCheck extends HealthCheck implements Runnable {
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(RedisHealthCheck.class);
+
+ public static boolean writeCheckFlag = true;
+ private static Result result = Result.healthy();
+
+ private static int failedLoopCheckNum = 12;
+ private static int failedTimer = 5 * 1000;
+
+ private static int normalTimer = 20 * 1000;
+
+ public static Result getResult() {
+ return result;
+ }
+
+ @Override
+ protected Result check() {
+
+ // check write
+ if (writeCheckFlag) {
+ Result writeCheckResult = checkWrite();
+ if (writeCheckResult.isHealthy()) {
+ writeCheckFlag = false;
+ }
+
+ // write failed
+ if (!writeCheckResult.isHealthy()) {
+ return writeCheckResult;
+ }
+ }
+
+ // check read
+ Result readCheckResult = checkRead();
+
+ // read failed
+ if (!readCheckResult.isHealthy()) {
+ return readCheckResult;
+ }
+
+ return Result.healthy();
+ }
+
+ private Result checkRead() {
+ Jedis jedisHandle = null;
+
+ Result healthRst = Result.healthy();
+ try {
+
+ jedisHandle = JedisUtil.borrowJedisInstance();
+ jedisHandle.get("healthchek:checktime");
+
+ } catch (Exception e) {
+ LOGGER.warn("RedisHealthCheck exception", e);
+ healthRst = Result.unhealthy(e);
+ } finally {
+ JedisUtil.returnJedisInstance(jedisHandle);
+ }
+
+ return healthRst;
+ }
+
+ private Result checkWrite() {
+ Jedis jedisHandle = null;
+
+ Result healthRst = Result.healthy();
+ try {
+
+ long currentTime = System.currentTimeMillis();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ String date = sdf.format(currentTime);
+
+ jedisHandle = JedisUtil.borrowJedisInstance();
+ String statusCode = jedisHandle.set("healthchek:checktime", date);
+
+ if (statusCode != null && statusCode.equals("OK")) {
+ healthRst = Result.healthy("check redis:" + statusCode);
+ } else {
+ healthRst = Result.unhealthy("check redis:" + statusCode);
+ }
+
+ } catch (Exception e) {
+ LOGGER.warn("RedisHealthCheck exception", e);
+ healthRst = Result.unhealthy(e);
+ } finally {
+ JedisUtil.returnJedisInstance(jedisHandle);
+ }
+
+ return healthRst;
+ }
+
+ @Override
+ public void run() {
+ // TODO Auto-generated method stub
+ while (true) {
+
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("redis check starttime:"
+ + System.currentTimeMillis());
+ }
+
+ result = checkWithPolicy();
+
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("redis check result:" + result.isHealthy()
+ + " message:" + result.getMessage());
+
+ LOGGER.debug("redis check endtime:"
+ + System.currentTimeMillis());
+ }
+
+ try {
+ Thread.sleep(normalTimer);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ LOGGER.warn("loop check redis,thread sleep excepiton", e);
+ }
+ }
+ }
+
+ private Result checkWithPolicy() {
+ int failedNum = 0;
+ Result temp = Result.healthy();
+
+ do {
+ // check again
+ temp = check();
+
+ // healthy break;
+ if (temp.isHealthy()) {
+ break;
+ }
+
+ // unhealthy go on
+ failedNum++;
+
+ try {
+ Thread.sleep(failedTimer);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ LOGGER.warn("loop check redis,thread sleep excepiton", e);
+ }
+
+ } while (failedNum <= failedLoopCheckNum);
+
+ return temp;
+ }
+}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ApiRouteResource.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/resources/ApiRouteResource.java
index a71b978..e969e7a 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ApiRouteResource.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/resources/ApiRouteResource.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.resources;
+package org.onap.msb.apiroute.resources;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -22,6 +22,7 @@ import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.net.URI;
+import java.util.List;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
@@ -31,6 +32,7 @@ import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@@ -38,13 +40,14 @@ import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.UriInfo;
import org.apache.http.HttpStatus;
-import org.openo.msb.api.ApiRouteInfo;
-import org.openo.msb.api.DiscoverInfo;
-import org.openo.msb.wrapper.ApiRouteServiceWrapper;
-import org.openo.msb.wrapper.CustomRouteServiceWrapper;
-import org.openo.msb.wrapper.IuiRouteServiceWrapper;
-import org.openo.msb.wrapper.util.JacksonJsonUtil;
-import org.openo.msb.wrapper.util.RouteUtil;
+import org.onap.msb.apiroute.api.ApiRouteInfo;
+import org.onap.msb.apiroute.api.DiscoverInfo;
+import org.onap.msb.apiroute.wrapper.ApiRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.CustomRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.IuiRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.util.CommonUtil;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.onap.msb.apiroute.wrapper.util.JacksonJsonUtil;
import com.codahale.metrics.annotation.Timed;
@@ -62,25 +65,24 @@ public class ApiRouteResource {
@ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get ApiRouteInfo List fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
- public ApiRouteInfo[] getApiRoutes() {
- return ApiRouteServiceWrapper.getInstance().getAllApiRouteInstances();
+ public List<ApiRouteInfo> getApiRoutes(@ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
+ return ApiRouteServiceWrapper.getInstance().getAllApiRouteInstances(routeWay);
}
@POST
@Path("/")
@ApiOperation(value = "add one ApiRoute ", code = HttpStatus.SC_CREATED,response = ApiRouteInfo.class)
@ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "add ApiRouteInfo fail", response = String.class),
@ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable ApiRouteInfo JSON REQUEST", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public Response addApiRoute(
- @ApiParam(value = "ApiRoute Instance Info", required = true) ApiRouteInfo apiRouteInfo) {
- ApiRouteInfo new_apiRouteInfo = ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfo,"");
- URI returnURI =
- uriInfo.getAbsolutePathBuilder()
- .path("/" + new_apiRouteInfo.getServiceName()+"/version/"+new_apiRouteInfo.getVersion()).build();
+ @ApiParam(value = "ApiRoute Instance Info", required = true) ApiRouteInfo apiRouteInfo,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
+ ApiRouteInfo new_apiRouteInfo = ApiRouteServiceWrapper.getInstance().saveApiRouteInstance4Rest(apiRouteInfo,routeWay);
+ URI returnURI = uriInfo.getAbsolutePathBuilder().path("/" + new_apiRouteInfo.getServiceName()+"/version/"+new_apiRouteInfo.getVersion()).build();
return Response.created(returnURI).entity(new_apiRouteInfo).build();
}
@@ -90,15 +92,18 @@ public class ApiRouteResource {
@ApiOperation(value = "get one ApiRoute ",code = HttpStatus.SC_OK, response = ApiRouteInfo.class)
@ApiResponses(value = {
@ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "ApiRouteInfo not found", response = String.class),
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get ApiRouteInfo fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public ApiRouteInfo getApiRoute(
@ApiParam(value = "ApiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
- @ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version) {
+ @ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,
+ @ApiParam(value = "ApiRoute host", required = false) @QueryParam("host") String host,
+ @ApiParam(value = "ApiRoute Publish port", required = false) @QueryParam("publish_port") @DefaultValue("")String publish_port,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
- return ApiRouteServiceWrapper.getInstance().getApiRouteInstance(serviceName,version);
+ return ApiRouteServiceWrapper.getInstance().getApiRouteInstance(serviceName,version,host,publish_port,routeWay);
}
@@ -106,7 +111,7 @@ public class ApiRouteResource {
@Path("/{serviceName}/version/{version}")
@ApiOperation(value = "update one ApiRoute by serviceName and version", code = HttpStatus.SC_CREATED,response = ApiRouteInfo.class)
@ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update ApiRouteInfo fail", response = String.class),
@ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable ApiRouteInfo JSON REQUEST", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@@ -114,12 +119,11 @@ public class ApiRouteResource {
public Response updateApiRoute(
@ApiParam(value = "ApiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
@ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,
- @ApiParam(value = "ApiRoute Instance Info", required = true) ApiRouteInfo apiRouteInfo) {
+ @ApiParam(value = "ApiRoute Instance Info", required = true) ApiRouteInfo apiRouteInfo,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
- ApiRouteInfo new_apiRouteInfo = ApiRouteServiceWrapper.getInstance().updateApiRouteInstance(serviceName,version,apiRouteInfo,"");
- URI returnURI =
- uriInfo.getAbsolutePathBuilder()
- .path("/" + new_apiRouteInfo.getServiceName()+"/version/"+new_apiRouteInfo.getVersion()).build();
+ ApiRouteInfo new_apiRouteInfo = ApiRouteServiceWrapper.getInstance().saveApiRouteInstance4Rest(apiRouteInfo,routeWay);
+ URI returnURI =uriInfo.getAbsolutePathBuilder().path("/" + new_apiRouteInfo.getServiceName()+"/version/"+new_apiRouteInfo.getVersion()).build();
return Response.created(returnURI).entity(new_apiRouteInfo).build();
}
@@ -137,11 +141,12 @@ public class ApiRouteResource {
@Timed
public void deleteApiRoute(
@ApiParam(value = "ApiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
- @ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version) {
-
-
- ApiRouteServiceWrapper.getInstance().deleteApiRoute(serviceName, version,"*","");
+ @ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,
+ @ApiParam(value = "ApiRoute host", required = false) @QueryParam("host") String host,
+ @ApiParam(value = "ApiRoute Publish port", required = false) @QueryParam("publish_port") @DefaultValue("")String publish_port,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
+ ApiRouteServiceWrapper.getInstance().deleteApiRoute(serviceName, version,host,publish_port,routeWay);
}
@@ -153,22 +158,9 @@ public class ApiRouteResource {
@Timed
public String[] getApiDocs() {
- String[] apiDocs = ApiRouteServiceWrapper.getInstance().getAllApiDocs();
- return apiDocs;
-
+ return ApiRouteServiceWrapper.getInstance().getAllApiDocs();
}
-
- @GET
- @Path("/apiGatewayPort")
- @ApiOperation(value = "get apiGateway Port ", code = HttpStatus.SC_OK, response = String.class)
- @ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get apiGateway Port fail", response = String.class)})
- @Produces(MediaType.TEXT_PLAIN)
- @Timed
- public String getApiGatewayPort() {
-
- return ApiRouteServiceWrapper.getInstance().getApiGatewayPort();
- }
@GET
@Path("/discoverInfo")
@@ -178,14 +170,14 @@ public class ApiRouteResource {
@Timed
public DiscoverInfo getServiceDiscoverInfo() {
- return ApiRouteServiceWrapper.getInstance().getServiceDiscoverInfo();
+ return ConfigUtil.getInstance().getDiscoverInfo();
}
@PUT
@Path("/{serviceName}/version/{version}/status/{status}")
@ApiOperation(value = "update one ApiRoute status by serviceName and version", code = HttpStatus.SC_CREATED,response = ApiRouteInfo.class)
@ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable ApiRouteInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "ApiRouteInfo not found", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update status fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@@ -193,9 +185,12 @@ public class ApiRouteResource {
public Response updateApiRouteStatus(
@ApiParam(value = "ApiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
@ApiParam(value = "ApiRoute version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,
- @ApiParam(value = "ApiRoute status,1:abled 0:disabled", required = true) @PathParam("status") String status) {
+ @ApiParam(value = "ApiRoute status,1:abled 0:disabled", required = true) @PathParam("status") String status,
+ @ApiParam(value = "ApiRoute host", required = false) @QueryParam("host") String host,
+ @ApiParam(value = "ApiRoute Publish port", required = false) @QueryParam("publish_port") @DefaultValue("")String publish_port,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
- ApiRouteInfo new_apiRouteInfo = ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName,version,status);
+ ApiRouteInfo new_apiRouteInfo = ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName,version,host,publish_port,status,routeWay);
return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(new_apiRouteInfo).build();
}
@@ -207,24 +202,10 @@ public class ApiRouteResource {
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "export fail", response = String.class),
@ApiResponse(code = HttpStatus.SC_NOT_ACCEPTABLE, message = " not Acceptable client-side", response = String.class)})
@Produces(MediaType.TEXT_PLAIN)
- public Response exportService() throws Exception {
-
-
- Object[] apirouteArray= ApiRouteServiceWrapper.getInstance().getAllApiRouteInstances();
- Object[] iuirouteArray= IuiRouteServiceWrapper.getInstance().getAllIuiRouteInstances();
- Object[] customrouteArray= CustomRouteServiceWrapper.getInstance().getAllCustomRouteInstances();
-
- Object[] temprouteArray =RouteUtil.concat(apirouteArray, iuirouteArray);
- Object[] allrouteArray=RouteUtil.concat(temprouteArray, customrouteArray);
-
-
- String allrouteJson=JacksonJsonUtil.beanToJson(allrouteArray);
-
- ResponseBuilder response = Response.ok(allrouteJson);
- response.header("Content-Disposition",
- "attachment; filename=\"RouteService.json\"");
- return response.build();
-
+ public Response exportService(@ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) throws Exception {
+
+ ResponseBuilder response = Response.ok( ApiRouteServiceWrapper.getInstance().getAllrouteByJson(routeWay));
+ return response.header("Content-Disposition", "attachment; filename=\"RouteService.json\"").build();
}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/CustomRouteResource.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/resources/CustomRouteResource.java
index 01a4291..92b3408 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/CustomRouteResource.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/resources/CustomRouteResource.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.resources;
+package org.onap.msb.apiroute.resources;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -22,8 +22,10 @@ import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.net.URI;
+import java.util.List;
import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
@@ -36,8 +38,8 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.apache.http.HttpStatus;
-import org.openo.msb.api.CustomRouteInfo;
-import org.openo.msb.wrapper.CustomRouteServiceWrapper;
+import org.onap.msb.apiroute.api.CustomRouteInfo;
+import org.onap.msb.apiroute.wrapper.CustomRouteServiceWrapper;
import com.codahale.metrics.annotation.Timed;
@@ -55,25 +57,24 @@ public class CustomRouteResource {
@ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get CustomRouteInfo List fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
- public CustomRouteInfo[] getCustomRoutes() {
- return CustomRouteServiceWrapper.getInstance().getAllCustomRouteInstances();
+ public List<CustomRouteInfo> getCustomRoutes(@ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
+ return CustomRouteServiceWrapper.getInstance().getAllCustomRouteInstances(routeWay);
}
@POST
@Path("/instance")
@ApiOperation(value = "add one CustomRoute ", code = HttpStatus.SC_CREATED,response = CustomRouteInfo.class)
@ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable CustomRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable CustomRouteInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "add CustomRouteInfo fail", response = String.class),
@ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable CustomRouteInfo JSON REQUEST", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public Response addCustomRoute(
- @ApiParam(value = "CustomRoute Instance Info", required = true) CustomRouteInfo customRouteInfo) {
- CustomRouteInfo new_customRouteInfo = CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfo,"");
- URI returnURI =
- uriInfo.getAbsolutePathBuilder()
- .path("/instance?serviceName=" + new_customRouteInfo.getServiceName()).build();
+ @ApiParam(value = "CustomRoute Instance Info", required = true) CustomRouteInfo customRouteInfo,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
+ CustomRouteInfo new_customRouteInfo = CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance4Rest(customRouteInfo,routeWay);
+ URI returnURI =uriInfo.getAbsolutePathBuilder().path("/instance?serviceName=" + new_customRouteInfo.getServiceName()).build();
return Response.created(returnURI).entity(new_customRouteInfo).build();
}
@@ -83,15 +84,18 @@ public class CustomRouteResource {
@ApiOperation(value = "get one CustomRoute ",code = HttpStatus.SC_OK, response = CustomRouteInfo.class)
@ApiResponses(value = {
@ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "CustomRoute not found", response = String.class),
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable CustomRoute Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable CustomRoute Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get CustomRoute fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public CustomRouteInfo getCustomRoute(
- @ApiParam(value = "CustomRoute serviceName", required = false) @QueryParam("serviceName") String serviceName) {
+ @ApiParam(value = "CustomRoute serviceName", required = false) @QueryParam("serviceName") String serviceName,
+ @ApiParam(value = "CustomRoute host", required = false) @QueryParam("host") String host,
+ @ApiParam(value = "CustomRoute Publish port", required = false) @QueryParam("publish_port") @DefaultValue("")String publish_port,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
- return CustomRouteServiceWrapper.getInstance().getCustomRouteInstance(serviceName);
+ return CustomRouteServiceWrapper.getInstance().getCustomRouteInstance(serviceName,host,publish_port,routeWay);
}
@@ -99,16 +103,18 @@ public class CustomRouteResource {
@Path("/instance")
@ApiOperation(value = "update one CustomRoute by serviceName", code = HttpStatus.SC_CREATED,response = CustomRouteInfo.class)
@ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable CustomRoute Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable CustomRoute Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update CustomRoute fail", response = String.class),
@ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable CustomRoute JSON REQUEST", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public Response updateCustomRoute(
@ApiParam(value = "CustomRoute serviceName", required = true) @QueryParam("serviceName") String serviceName,
- @ApiParam(value = "CustomRoute Instance Info", required = true) CustomRouteInfo customRoute) {
+ @ApiParam(value = "CustomRoute Instance Info", required = true) CustomRouteInfo customRoute,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay
+ ) {
- CustomRouteInfo new_customRouteInfo= CustomRouteServiceWrapper.getInstance().updateCustomRouteInstance(serviceName,customRoute,"");
+ CustomRouteInfo new_customRouteInfo= CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance4Rest(customRoute,routeWay);
return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(new_customRouteInfo).build();
@@ -124,9 +130,12 @@ public class CustomRouteResource {
@Produces(MediaType.APPLICATION_JSON)
@Timed
public void deleteCustomRoute(
- @ApiParam(value = "CustomRoute serviceName", required = true) @QueryParam("serviceName") String serviceName) {
+ @ApiParam(value = "CustomRoute serviceName", required = true) @QueryParam("serviceName") String serviceName,
+ @ApiParam(value = "CustomRoute host", required = false) @QueryParam("host") String host,
+ @ApiParam(value = "CustomRoute Publish port", required = false) @QueryParam("publish_port") @DefaultValue("")String publish_port,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
- CustomRouteServiceWrapper.getInstance().deleteCustomRoute(serviceName,"*","");
+ CustomRouteServiceWrapper.getInstance().deleteCustomRoute(serviceName,host,publish_port,routeWay);
}
@@ -134,16 +143,19 @@ public class CustomRouteResource {
@Path("/status")
@ApiOperation(value = "update one CustomRoute status by serviceName ",code = HttpStatus.SC_CREATED, response = CustomRouteInfo.class)
@ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable customRoute Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable customRoute Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "customRoute not found", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update status fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public Response updateCustomRouteStatus(
@ApiParam(value = "CustomRoute serviceName", required = true) @QueryParam("serviceName") String serviceName,
- @ApiParam(value = "CustomRoute status,1:abled 0:disabled", required = true) @QueryParam("status") String status) {
+ @ApiParam(value = "CustomRoute host", required = false) @QueryParam("host") String host,
+ @ApiParam(value = "CustomRoute status,1:abled 0:disabled", required = true) @QueryParam("status") String status,
+ @ApiParam(value = "CustomRoute Publish port", required = false) @QueryParam("publish_port") @DefaultValue("")String publish_port,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
- CustomRouteInfo new_customRouteInfo = CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName,status);
+ CustomRouteInfo new_customRouteInfo = CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName,host,publish_port,status,routeWay);
return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(new_customRouteInfo).build();
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/IuiRouteResource.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/resources/IuiRouteResource.java
index 057d15d..fea6645 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/IuiRouteResource.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/resources/IuiRouteResource.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.resources;
+
+package org.onap.msb.apiroute.resources;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -22,22 +23,25 @@ import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.net.URI;
+import java.util.List;
import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.apache.http.HttpStatus;
-import org.openo.msb.api.IuiRouteInfo;
-import org.openo.msb.wrapper.IuiRouteServiceWrapper;
+import org.onap.msb.apiroute.api.IuiRouteInfo;
+import org.onap.msb.apiroute.wrapper.IuiRouteServiceWrapper;
import com.codahale.metrics.annotation.Timed;
@@ -55,25 +59,24 @@ public class IuiRouteResource {
@ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get iuiRouteInfo List fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
- public IuiRouteInfo[] getIuiRoutes() {
- return IuiRouteServiceWrapper.getInstance().getAllIuiRouteInstances();
+ public List<IuiRouteInfo> getIuiRoutes(@ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
+ return IuiRouteServiceWrapper.getInstance().getAllIuiRouteInstances(routeWay);
}
@POST
@Path("/")
@ApiOperation(value = "add one iuiRoute ", code = HttpStatus.SC_CREATED,response = IuiRouteInfo.class)
@ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable iuiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable iuiRouteInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "add iuiRouteInfo fail", response = String.class),
@ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable iuiRouteInfo JSON REQUEST", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public Response addIuiRoute(
- @ApiParam(value = "iuiRoute Instance Info", required = true) IuiRouteInfo iuiRouteInfo) {
- IuiRouteInfo new_iuiRouteInfo = IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);
- URI returnURI =
- uriInfo.getAbsolutePathBuilder()
- .path("/" + new_iuiRouteInfo.getServiceName()).build();
+ @ApiParam(value = "iuiRoute Instance Info", required = true) IuiRouteInfo iuiRouteInfo,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
+ IuiRouteInfo new_iuiRouteInfo = IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance4Rest(iuiRouteInfo,routeWay);
+ URI returnURI =uriInfo.getAbsolutePathBuilder().path("/" + new_iuiRouteInfo.getServiceName()).build();
return Response.created(returnURI).entity(new_iuiRouteInfo).build();
}
@@ -83,14 +86,17 @@ public class IuiRouteResource {
@ApiOperation(value = "get one iuiRoute ",code = HttpStatus.SC_OK, response = IuiRouteInfo.class)
@ApiResponses(value = {
@ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "IuiRouteInfo not found", response = String.class),
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable IuiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable IuiRouteInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get IuiRouteInfo fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public IuiRouteInfo getIuiRoute(
- @ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName) {
+ @ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "iuiRoute host", required = false) @QueryParam("host") String host,
+ @ApiParam(value = "iuiRoute Publish port", required = false) @QueryParam("publish_port") @DefaultValue("")String publish_port,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
- return IuiRouteServiceWrapper.getInstance().getIuiRouteInstance(serviceName);
+ return IuiRouteServiceWrapper.getInstance().getIuiRouteInstance(serviceName,host,publish_port,routeWay);
}
@@ -98,19 +104,18 @@ public class IuiRouteResource {
@Path("/{serviceName}")
@ApiOperation(value = "update one iuiRoute by serviceName", code = HttpStatus.SC_CREATED,response = IuiRouteInfo.class)
@ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable IuiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable IuiRouteInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update IuiRouteInfo fail", response = String.class),
@ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable IuiRouteInfo JSON REQUEST", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public Response updateIuiRoute(
@ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
- @ApiParam(value = "iuiRoute Instance Info", required = true) IuiRouteInfo iuiRouteInfo) {
+ @ApiParam(value = "iuiRoute Instance Info", required = true) IuiRouteInfo iuiRouteInfo,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
- IuiRouteInfo new_iuiRouteInfo = IuiRouteServiceWrapper.getInstance().updateIuiRouteInstance(serviceName,iuiRouteInfo);
- URI returnURI =
- uriInfo.getAbsolutePathBuilder()
- .path("/" + serviceName).build();
+ IuiRouteInfo new_iuiRouteInfo = IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance4Rest(iuiRouteInfo,routeWay);
+ URI returnURI =uriInfo.getAbsolutePathBuilder().path("/" + serviceName).build();
return Response.created(returnURI).entity(new_iuiRouteInfo).build();
}
@@ -124,9 +129,12 @@ public class IuiRouteResource {
@Produces(MediaType.APPLICATION_JSON)
@Timed
public void deleteIuiRoute(
- @ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName) {
+ @ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
+ @ApiParam(value = "iuiRoute host", required = false) @QueryParam("host") String host,
+ @ApiParam(value = "iuiRoute Publish port", required = false) @QueryParam("publish_port") @DefaultValue("")String publish_port,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
- IuiRouteServiceWrapper.getInstance().deleteIuiRoute(serviceName,"*");
+ IuiRouteServiceWrapper.getInstance().deleteIuiRoute(serviceName,host,publish_port,routeWay);
}
@@ -134,19 +142,20 @@ public class IuiRouteResource {
@Path("/{serviceName}/status/{status}")
@ApiOperation(value = "update one iuiRoute status by serviceName ",code = HttpStatus.SC_CREATED, response = IuiRouteInfo.class)
@ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable IuiRouteInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable IuiRouteInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "IuiRouteInfo not found", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update IuiRouteInfo status fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public Response updateIuiRouteStatus(
@ApiParam(value = "iuiRoute serviceName", required = true) @PathParam("serviceName") String serviceName,
- @ApiParam(value = "iuiRoute status,1:abled 0:disabled", required = true) @PathParam("status") String status) {
+ @ApiParam(value = "iuiRoute host", required = false) @QueryParam("host") String host,
+ @ApiParam(value = "iuiRoute status,1:abled 0:disabled", required = true) @PathParam("status") String status,
+ @ApiParam(value = "iuiRoute Publish port", required = false) @QueryParam("publish_port") @DefaultValue("")String publish_port,
+ @ApiParam(value = "Route Way", required = false) @QueryParam("routeWay") @DefaultValue("ip")String routeWay) {
- IuiRouteInfo new_iuiRouteInfo = IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName,status);
- URI returnURI =
- uriInfo.getAbsolutePathBuilder()
- .path("/" + serviceName).build();
+ IuiRouteInfo new_iuiRouteInfo = IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName,host,publish_port,status,routeWay);
+ URI returnURI =uriInfo.getAbsolutePathBuilder().path("/" + serviceName).build();
return Response.created(returnURI).entity(new_iuiRouteInfo).build();
}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MicroServiceResource.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/resources/MicroServiceResource.java
index dd560ff..5beb209 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MicroServiceResource.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/resources/MicroServiceResource.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.resources;
+
+package org.onap.msb.apiroute.resources;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -22,6 +23,7 @@ import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.net.URI;
+import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.DELETE;
@@ -38,35 +40,36 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
-import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpStatus;
-import org.openo.msb.api.MicroServiceFullInfo;
-import org.openo.msb.api.MicroServiceInfo;
-import org.openo.msb.wrapper.MicroServiceWrapper;
-import org.openo.msb.wrapper.util.MicroServiceUtil;
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.api.exception.ExtendedInternalServerErrorException;
+import org.onap.msb.apiroute.health.ConsulLinkHealthCheck;
+import org.onap.msb.apiroute.health.RedisHealthCheck;
+import org.onap.msb.apiroute.wrapper.MicroServiceWrapper;
+import org.onap.msb.apiroute.wrapper.util.MicroServiceUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.codahale.metrics.annotation.Timed;
+import com.codahale.metrics.health.HealthCheck.Result;
@Path("/services")
-@Api(tags = {"MSB-Service Resource"})
+// @Api(tags = {"MSB-Service Resource"})
@Produces(MediaType.APPLICATION_JSON)
public class MicroServiceResource {
+ private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceResource.class);
+
@Context
UriInfo uriInfo; // actual uri info
-
- private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceResource.class);
-
@GET
@Path("/")
@ApiOperation(value = "get all microservices ", code = HttpStatus.SC_OK, response = MicroServiceFullInfo.class, responseContainer = "List")
@ApiResponses(value = {@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get microservice List fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
- public MicroServiceFullInfo[] getMicroService() {
+ public List<MicroServiceFullInfo> getMicroService() {
return MicroServiceWrapper.getInstance().getAllMicroServiceInstances();
}
@@ -74,26 +77,21 @@ public class MicroServiceResource {
@Path("/")
@ApiOperation(value = "add one microservice ", code = HttpStatus.SC_CREATED, response = MicroServiceFullInfo.class)
@ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "add microservice fail", response = String.class),
@ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable MicroServiceInfo JSON REQUEST", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public Response addMicroService(
- @ApiParam(value = "MicroServiceInfo Instance Info", required = true) MicroServiceInfo microServiceInfo,
+ @ApiParam(value = "MicroServiceInfo Instance Info", required = true) MicroServiceFullInfo microServiceInfo,
@Context HttpServletRequest request,
@ApiParam(value = "createOrUpdate", required = false) @QueryParam("createOrUpdate") @DefaultValue("true") boolean createOrUpdate,
@ApiParam(value = "port", required = false) @QueryParam("port") @DefaultValue("") String port) {
String ip=MicroServiceUtil.getRealIp(request);
- MicroServiceFullInfo microServiceFullInfo =
- MicroServiceWrapper.getInstance().saveMicroServiceInstance(microServiceInfo,
- createOrUpdate,ip,port);
- URI returnURI =
- uriInfo.getAbsolutePathBuilder()
- .path("/" + microServiceInfo.getServiceName() + "/version/"
- + microServiceInfo.getVersion()).build();
+ MicroServiceFullInfo microServiceFullInfo =MicroServiceWrapper.getInstance().saveMicroServiceInstance(microServiceInfo,createOrUpdate,ip,port);
+ URI returnURI =uriInfo.getAbsolutePathBuilder().path("/" + microServiceInfo.getServiceName() + "/version/"+ microServiceInfo.getVersion()).build();
return Response.created(returnURI).entity(microServiceFullInfo).build();
}
@@ -104,17 +102,16 @@ public class MicroServiceResource {
@ApiOperation(value = "get one microservice ", code = HttpStatus.SC_OK, response = MicroServiceFullInfo.class)
@ApiResponses(value = {
@ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "microservice not found", response = String.class),
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "get microservice fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public MicroServiceFullInfo getMicroService(
@ApiParam(value = "microservice serviceName") @PathParam("serviceName") String serviceName,
- @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"") @PathParam("version") @DefaultValue("") String version,
- @ApiParam(value = "port", required = false) @QueryParam("port") @DefaultValue("") String port) {
+ @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"") @PathParam("version") @DefaultValue("") String version) {
- return MicroServiceWrapper.getInstance().getMicroServiceInstance(serviceName, version,port);
+ return MicroServiceWrapper.getInstance().getMicroServiceInstance(serviceName, version);
}
@@ -123,7 +120,7 @@ public class MicroServiceResource {
@Path("/{serviceName}/version/{version}")
@ApiOperation(value = "update one microservice by serviceName and version", code = HttpStatus.SC_CREATED, response = MicroServiceFullInfo.class)
@ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update microservice fail", response = String.class),
@ApiResponse(code = HttpStatus.SC_BAD_REQUEST, message = "Unprocessable MicroServiceInfo JSON REQUEST", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@@ -131,35 +128,16 @@ public class MicroServiceResource {
public Response updateMicroService(
@ApiParam(value = "microservice serviceName") @PathParam("serviceName") String serviceName,
@ApiParam(value = "microservice version,if the version is empty, please enter \"null\"") @PathParam("version") @DefaultValue("") String version,
- @ApiParam(value = "microservice Instance Info", required = true) MicroServiceInfo microServiceInfo) {
+ @ApiParam(value = "microservice Instance Info", required = true) MicroServiceFullInfo microServiceInfo,
+ @Context HttpServletRequest request) {
- MicroServiceFullInfo microServiceFullInfo = MicroServiceWrapper.getInstance().updateMicroServiceInstance(serviceName, version,
- microServiceInfo);
+ String ip=MicroServiceUtil.getRealIp(request);
+ MicroServiceFullInfo microServiceFullInfo = MicroServiceWrapper.getInstance().saveMicroServiceInstance(microServiceInfo,
+ false,ip,"");
return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(microServiceFullInfo).build();
}
- @PUT
- @Path("/{serviceName}/version/{version}/nodes/{ip}/{port}")
- @ApiOperation(value = "update single node by serviceName and version and node", code = HttpStatus.SC_CREATED, response = MicroServiceFullInfo.class)
- @ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
- @ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "microservice not found", response = String.class),
- @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update node fail", response = String.class)})
- @Produces(MediaType.APPLICATION_JSON)
- @Timed
- public Response updateNode(
- @ApiParam(value = "microservice serviceName", required = true) @PathParam("serviceName") String serviceName,
- @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,
- @ApiParam(value = "ip") @PathParam("ip") String ip,
- @ApiParam(value = "port") @PathParam("port") String port,
- @ApiParam(value = "ttl") @QueryParam("ttl") int ttl) {
-
- MicroServiceFullInfo microServiceFullInfo = MicroServiceWrapper.getInstance().updateMicroServiceNode(serviceName, version, ip,port, ttl);
-
- return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(microServiceFullInfo).build();
-
- }
@@ -169,7 +147,7 @@ public class MicroServiceResource {
@ApiResponses(value = {
@ApiResponse(code = HttpStatus.SC_NO_CONTENT, message = "delete node succeed "),
@ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "node not found", response = String.class),
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "delete node fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
@@ -190,17 +168,15 @@ public class MicroServiceResource {
@ApiResponses(value = {
@ApiResponse(code = HttpStatus.SC_NO_CONTENT, message = "delete microservice succeed "),
@ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "microservice not found", response = String.class),
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "delete microservice fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@Timed
public void deleteMicroService(
@ApiParam(value = "microservice serviceName", required = true) @PathParam("serviceName") String serviceName,
- @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version,
- @ApiParam(value = "port", required = false) @QueryParam("port") @DefaultValue("") String port) {
-
+ @ApiParam(value = "microservice version,if the version is empty, please enter \"null\"", required = false) @PathParam("version") @DefaultValue("") String version) {
- MicroServiceWrapper.getInstance().deleteMicroService(serviceName, version,port);
+ MicroServiceWrapper.getInstance().deleteMicroService(serviceName, version);
}
@@ -208,7 +184,7 @@ public class MicroServiceResource {
@Path("/{serviceName}/version/{version}/status/{status}")
@ApiOperation(value = "update microservice status by serviceName and version", code = HttpStatus.SC_CREATED, response = MicroServiceFullInfo.class)
@ApiResponses(value = {
- @ApiResponse(code = HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
+ @ApiResponse(code = HttpStatus.SC_UNPROCESSABLE_ENTITY, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
@ApiResponse(code = HttpStatus.SC_NOT_FOUND, message = "microservice not found", response = String.class),
@ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "update status fail", response = String.class)})
@Produces(MediaType.APPLICATION_JSON)
@@ -223,24 +199,31 @@ public class MicroServiceResource {
return Response.created(uriInfo.getAbsolutePathBuilder().build()).entity(microServiceFullInfo).build();
}
+
+ @GET
+ @Path("/health")
+ @ApiOperation(value = "apigateway healthy check ", code = HttpStatus.SC_OK, response = String.class)
+ @ApiResponses(value = { @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = "check fail", response = String.class) })
+ @Produces(MediaType.TEXT_PLAIN)
+ @Timed
+ public Response health() {
+
+ // redis
+ Result rst = RedisHealthCheck.getResult();
+ if (!rst.isHealthy()) {
+ LOGGER.warn("health check failed:"+rst.getMessage());
+ throw new ExtendedInternalServerErrorException(rst.getMessage());
+ }
+
+ //consul
+ rst = ConsulLinkHealthCheck.getResult();
+ if (!rst.isHealthy()) {
+ LOGGER.warn("health check failed:"+rst.getMessage());
+ throw new ExtendedInternalServerErrorException(rst.getMessage());
+ }
+
+ return Response.ok("apigateway healthy check:ok").build();
+ }
+
-// @PUT
-// @Path("/ttl")
-// @ApiOperation(value = "test json date iso8601 ", code = 200, response = String.class)
-// @Produces(MediaType.APPLICATION_JSON)
-// @Timed
-// public String testIso8601(
-// @ApiParam(value = "microservice Instance Info", required = true) MicroServiceFullInfo microServiceInfo) {
-// Set<NodeInfo> nodes=microServiceInfo.getNodes();
-// String rtn="rtn:";
-// for(NodeInfo node:nodes){
-// Date date=node.getExpiration();
-// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
-// String datettl=sdf.format(date);
-// rtn+=datettl;
-// }
-//
-//
-// return rtn;
-// }
}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/ApiRouteServiceWrapper.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/ApiRouteServiceWrapper.java
new file mode 100644
index 0000000..80dc607
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/ApiRouteServiceWrapper.java
@@ -0,0 +1,273 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.msb.apiroute.wrapper;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.util.List;
+
+import org.onap.msb.apiroute.api.ApiRouteInfo;
+import org.onap.msb.apiroute.api.exception.ExtendedInternalServerErrorException;
+import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
+import org.onap.msb.apiroute.wrapper.service.ApiRouteService;
+import org.onap.msb.apiroute.wrapper.util.CommonUtil;
+import org.onap.msb.apiroute.wrapper.util.FileUtil;
+import org.onap.msb.apiroute.wrapper.util.JacksonJsonUtil;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+
+public class ApiRouteServiceWrapper {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ApiRouteServiceWrapper.class);
+
+
+ private static ApiRouteServiceWrapper instance = new ApiRouteServiceWrapper();
+
+ private ApiRouteServiceWrapper() {}
+
+ public static ApiRouteServiceWrapper getInstance() {
+ return instance;
+ }
+
+
+ public List<ApiRouteInfo> getAllApiRouteInstances(String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ try {
+ String apiRedisKey=RouteUtil.getMutiRedisKey(RouteUtil.APIROUTE, routeWay);
+
+ return ApiRouteService.getInstance().getMultiApiRouteInstances(apiRedisKey);
+
+ } catch (Exception e) {
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+ }
+
+
+
+ /**
+ * @Title: getApiRouteInstance
+ * @Description: TODO(Through the name + version for a single service object information)
+ * @param: @param serviceName
+ * @param: @param version
+ * @param: @return
+ * @return: ApiRouteInfo
+ */
+ public ApiRouteInfo getApiRouteInstance(String serviceName, String version, String host,String publish_port,String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ if ("null".equals(version)) {
+ version = "";
+ }
+
+ RouteUtil.checkServiceNameAndVersion(serviceName,version);
+
+ String apiRedisPrefixedKey=RouteUtil.getAPIRedisPrefixedKey(serviceName, version, host, publish_port, routeWay);
+
+ ApiRouteInfo apiRouteInfo;
+ try {
+ apiRouteInfo = ApiRouteService.getInstance().getApiRouteInstance(apiRedisPrefixedKey);
+ } catch (Exception e) {
+ LOGGER.error("get ApiRouteInstance throw exception", e);
+ throw new ExtendedInternalServerErrorException("get ApiRouteInstance throw exception" + e.getMessage());
+ }
+
+
+
+ if (null == apiRouteInfo) {
+ throw new ExtendedNotFoundException("Api RouteInfo not found");
+ }
+
+ return apiRouteInfo;
+
+ }
+
+
+
+ /**
+ * @Title updateApiRouteStatus
+ * @Description TODO(update ApiRoute Status)
+ * @param serviceName
+ * @param version
+ * @param status
+ * @return
+ * @return RouteResult
+ */
+ public synchronized ApiRouteInfo updateApiRouteStatus(String serviceName, String version,String host,String publish_port,
+ String status,String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ if ("null".equals(version)) {
+ version = "";
+ }
+
+ RouteUtil.checkServiceNameAndVersion(serviceName,version);
+
+ RouteUtil.checkServiceStatus(status);
+
+
+ String apiRedisPrefixedKey=RouteUtil.getAPIRedisPrefixedKey(serviceName, version, host, publish_port, routeWay);
+
+ try {
+ ApiRouteService.getInstance().updateApiRouteStatus2Redis(apiRedisPrefixedKey, status);
+ } catch (Exception e) {
+ LOGGER.error("update ApiRoute status throw exception", e);
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+ ApiRouteInfo new_apiRouteInfo = getApiRouteInstance(serviceName, version,host,publish_port,routeWay);
+ return new_apiRouteInfo;
+ }
+
+
+ /**
+ * @Title: saveApiRouteInstance
+ * @Description: TODO(save ApiRouteInstance)
+ * @param: @param apiRouteInfo
+ * @param: @return
+ * @return: ApiRouteInfo
+ */
+ public synchronized ApiRouteInfo saveApiRouteInstance4Rest(ApiRouteInfo apiRouteInfo,String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ RouteUtil.checkRouterInfoFormat(apiRouteInfo);
+
+ try {
+ saveApiRouteInstance(apiRouteInfo,routeWay);
+ } catch (Exception e) {
+ throw new ExtendedInternalServerErrorException("save apiRouteInfo fail: [serviceName]"+apiRouteInfo.getServiceName()+"[version]"+apiRouteInfo.getVersion()+" [routeWay]"+routeWay+e.getMessage());
+ }
+
+ return apiRouteInfo;
+ }
+
+
+
+ public synchronized void saveApiRouteInstance(ApiRouteInfo apiRouteInfo,String routeWay) throws Exception {
+ try {
+ String apiRedisPrefixedKey=RouteUtil.getAPIRedisPrefixedKey(apiRouteInfo.getServiceName(), apiRouteInfo.getVersion(), apiRouteInfo.getHost(), apiRouteInfo.getPublish_port(), routeWay);
+
+ ApiRouteService.getInstance().saveApiRouteService2Redis(apiRouteInfo, apiRedisPrefixedKey);
+ LOGGER.info("save apiRouteInfo [serviceName]"+apiRouteInfo.getServiceName()+"[version]"+apiRouteInfo.getVersion()+" [routeWay]"+routeWay+" success");
+ } catch (Exception e) {
+ LOGGER.error("save apiRouteInfo [serviceName]"+apiRouteInfo.getServiceName()+"[version]"+apiRouteInfo.getVersion()+" [routeWay]"+routeWay+" throw exception", e);
+ throw e;
+ }
+
+
+ }
+
+
+
+ /**
+ * @Title: deleteApiRoute
+ * @Description: TODO(delete one ApiRoute)
+ * @param: @param type
+ * @param: @param serviceName
+ * @param: @param version
+ * @param: @param delKey
+ * @param: @return
+ * @return: void
+ */
+ public synchronized void deleteApiRoute(String serviceName, String version, String host,String publish_port,String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ if ("null".equals(version)) {
+ version = "";
+ }
+
+ RouteUtil.checkServiceNameAndVersion(serviceName,version);
+
+ String apiRedisPrefixedKey=RouteUtil.getAPIRedisPrefixedKey(serviceName, version, host, publish_port, routeWay);
+
+
+ try {
+ ApiRouteService.getInstance()
+ .deleteApiRouteService2Redis(apiRedisPrefixedKey);
+ LOGGER.info("delete apiRouteInfo [serviceName]"+serviceName+"[version]"+version+" [host]"+host +" [publish_port]"+publish_port+" [routeWay]"+routeWay+" success");
+
+ }
+ catch (ExtendedNotFoundException e) {
+ throw e;
+ }catch (Exception e) {
+ LOGGER.error("delete apiRouteInfo [serviceName]"+serviceName+"[version]"+version+" [host]"+host +" [publish_port]"+publish_port+" [routeWay]"+routeWay+" throw exception", e);
+
+ throw new ExtendedInternalServerErrorException("delete apiRouteInfo [serviceName]"+serviceName+"[version]"+version+e.getMessage());
+ }
+
+
+ }
+
+
+ /**
+ * @Title: getAllApiDocs
+ * @Description: TODO(For local ext\initSwaggerJson directory of all the json file directory)
+ * @param: @return
+ * @return: String[]
+ */
+ public String[] getAllApiDocs() {
+ URL apiDocsPath = ApiRouteServiceWrapper.class.getResource("/ext/initSwaggerJson");
+ if (apiDocsPath != null) {
+ String path = apiDocsPath.getPath();
+
+ try {
+ return FileUtil.readfile(path);
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read ApiDocs Files throw FileNotFoundException", e);
+ throw new ExtendedInternalServerErrorException("read ApiDocs Files throw FileNotFoundException:" + e.getMessage());
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read ApiDocs Files throw IOexception", e);
+ throw new ExtendedInternalServerErrorException("read ApiDocs Files throw IOexception:" + e.getMessage());
+ }
+
+ }
+
+ return null;
+ }
+
+ public String getAllrouteByJson(String routeWay){
+
+ Object[] apirouteArray= ApiRouteServiceWrapper.getInstance().getAllApiRouteInstances(routeWay).toArray();
+ Object[] iuirouteArray= IuiRouteServiceWrapper.getInstance().getAllIuiRouteInstances(routeWay).toArray();
+ Object[] customrouteArray= CustomRouteServiceWrapper.getInstance().getAllCustomRouteInstances(routeWay).toArray();
+
+ Object[] temprouteArray =CommonUtil.concat(apirouteArray, iuirouteArray);
+ Object[] allrouteArray=CommonUtil.concat(temprouteArray, customrouteArray);
+
+
+ String allrouteJson;
+ try {
+ allrouteJson = JacksonJsonUtil.beanToJson(allrouteArray);
+ } catch (Exception e) {
+ LOGGER.error("exportService beanToJson throw Exception", e);
+ throw new ExtendedInternalServerErrorException("exportService beanToJson throw Exception:"+ e.getMessage());
+ }
+ return allrouteJson;
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/CustomRouteServiceWrapper.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/CustomRouteServiceWrapper.java
new file mode 100644
index 0000000..50747b6
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/CustomRouteServiceWrapper.java
@@ -0,0 +1,217 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.msb.apiroute.wrapper;
+
+import java.util.List;
+
+import org.onap.msb.apiroute.api.CustomRouteInfo;
+import org.onap.msb.apiroute.api.exception.ExtendedInternalServerErrorException;
+import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
+import org.onap.msb.apiroute.wrapper.service.CustomRouteService;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CustomRouteServiceWrapper {
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomRouteServiceWrapper.class);
+
+ private static CustomRouteServiceWrapper instance = new CustomRouteServiceWrapper();
+
+ private CustomRouteServiceWrapper() {}
+
+ public static CustomRouteServiceWrapper getInstance() {
+ return instance;
+ }
+
+
+ /**
+ * @Title: getAllCustomRouteService
+ * @Description: TODO(get AllCustomRoute Service)
+ * @param: @return
+ * @return: CustomRouteInfo[]
+ */
+ public List<CustomRouteInfo> getAllCustomRouteInstances(String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ try {
+ String customRedisKey = RouteUtil.getMutiRedisKey(RouteUtil.CUSTOMROUTE, routeWay);
+ return CustomRouteService.getInstance().getMultiCustomRouteInstances(customRedisKey);
+
+ } catch (Exception e) {
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+
+ }
+
+
+
+ /**
+ * @Title: getCustomRouteInstance
+ * @Description: TODO(get CustomRouteInstance by serviceName)
+ * @param: @param serviceName
+ * @param: @return
+ * @return: CustomRouteInfo
+ */
+ public CustomRouteInfo getCustomRouteInstance(String serviceName, String host,
+ String publish_port, String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ String customRedisPrefixedKey =
+ RouteUtil.getRedisPrefixedKey(RouteUtil.CUSTOMROUTE, serviceName, host, publish_port,
+ routeWay);
+
+ CustomRouteInfo customRouteInfo;
+ try {
+ customRouteInfo =
+ CustomRouteService.getInstance().getCustomRouteInstance(customRedisPrefixedKey);
+ } catch (Exception e) {
+ LOGGER.error("get customRouteInstance throw exception", e);
+ throw new ExtendedInternalServerErrorException("get customRouteInstance throw exception"+ e.getMessage());
+ }
+
+
+ if (null == customRouteInfo) {
+ throw new ExtendedNotFoundException("customRoute Info not found");
+
+ }
+
+ return customRouteInfo;
+
+ }
+
+
+ /**
+ * @Title updateCustomRouteStatus
+ * @Description TODO(update one CustomRoute Status)
+ * @param serviceName
+ * @param status
+ * @return
+ * @return RouteResult
+ */
+ public synchronized CustomRouteInfo updateCustomRouteStatus(String serviceName, String host,
+ String publish_port, String status, String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ RouteUtil.checkServiceStatus(status);
+
+ String customRedisPrefixedKey =
+ RouteUtil.getRedisPrefixedKey(RouteUtil.CUSTOMROUTE, serviceName, host, publish_port,
+ routeWay);
+
+
+ try {
+ CustomRouteService.getInstance()
+ .updateCustomRouteStatus2Redis(customRedisPrefixedKey, status);
+ } catch (Exception e) {
+ LOGGER.error("update CustomRoute status throw exception", e);
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+ CustomRouteInfo new_customRouteInfo =
+ getCustomRouteInstance(serviceName, host, publish_port, routeWay);
+
+ return new_customRouteInfo;
+ }
+
+ /**
+ * @Title: saveCustomRouteInstance
+ * @Description: TODO(save one CustomRouteInstance)
+ * @param: @param CustomRouteInfo
+ * @param: @return
+ * @return: CustomRouteInfo
+ */
+ public synchronized CustomRouteInfo saveCustomRouteInstance4Rest(CustomRouteInfo customRouteInfo,
+ String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ RouteUtil.checkRouterInfoFormat(customRouteInfo);
+
+ try {
+ saveCustomRouteInstance(customRouteInfo, routeWay);
+
+ } catch (Exception e) {
+
+ throw new ExtendedInternalServerErrorException("save CustomRouteInfo fail: [serviceName]"+customRouteInfo.getServiceName()+e.getMessage());
+ }
+
+ return customRouteInfo;
+
+ }
+
+
+ public synchronized CustomRouteInfo saveCustomRouteInstance(CustomRouteInfo customRouteInfo,
+ String routeWay) throws Exception {
+ try {
+ String customRedisPrefixedKey =
+ RouteUtil.getRedisPrefixedKey(RouteUtil.CUSTOMROUTE, customRouteInfo.getServiceName(),
+ customRouteInfo.getHost(), customRouteInfo.getPublish_port(), routeWay);;
+
+
+ CustomRouteService.getInstance().saveCustomRouteService2Redis(customRouteInfo,
+ customRedisPrefixedKey);
+ LOGGER.info("save CustomRouteInfo [serviceName]"+customRouteInfo.getServiceName()+" [host]"+customRouteInfo.getHost() +" [publish_port]"+customRouteInfo.getPublish_port()+" [routeWay]"+routeWay+" success");
+
+ } catch (Exception e) {
+ LOGGER.error("save CustomRouteInfo [serviceName]"+customRouteInfo.getServiceName()+" [host]"+customRouteInfo.getHost() +" [publish_port]"+customRouteInfo.getPublish_port()+" [routeWay]"+routeWay+" throw exception", e);
+
+ throw e;
+ }
+
+ return customRouteInfo;
+
+ }
+
+
+ /**
+ * @Title: deleteCustomRoute
+ * @Description: TODO(delete one CustomRoute)
+ * @param: @param type
+ * @param: @param serviceName
+ * @param: @param delKey
+ * @param: @return
+ * @return: void
+ */
+ public synchronized void deleteCustomRoute(String serviceName, String host, String publish_port,
+ String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ String customRedisPrefixedKey =
+ RouteUtil.getRedisPrefixedKey(RouteUtil.CUSTOMROUTE, serviceName, host, publish_port,
+ routeWay);
+
+ try {
+ CustomRouteService.getInstance().deleteCustomRouteService2Redis(customRedisPrefixedKey);
+ LOGGER.info("delete CustomRouteInfo [serviceName]"+serviceName+" [host]"+host +" [publish_port]"+publish_port+" [routeWay]"+routeWay+" success");
+
+ } catch (ExtendedNotFoundException e) {
+ throw e;
+ } catch (Exception e) {
+ LOGGER.error("delete CustomRouteInfo [serviceName]"+serviceName+" [host]"+host +" [publish_port]"+publish_port+" [routeWay]"+routeWay+" throw exception", e);
+ throw new ExtendedInternalServerErrorException("delete CustomRouteInfo [serviceName]"+serviceName+e.getMessage());
+ }
+
+
+
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/InitRouteServiceWrapper.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/InitRouteServiceWrapper.java
new file mode 100644
index 0000000..76be3d2
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/InitRouteServiceWrapper.java
@@ -0,0 +1,416 @@
+package org.onap.msb.apiroute.wrapper;
+
+import io.dropwizard.jetty.HttpConnectorFactory;
+import io.dropwizard.server.SimpleServerFactory;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.net.URL;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.onap.msb.apiroute.ApiRouteApp;
+import org.onap.msb.apiroute.ApiRouteAppConfig;
+import org.onap.msb.apiroute.SyncDataManager;
+import org.onap.msb.apiroute.api.ApiRouteInfo;
+import org.onap.msb.apiroute.api.CustomRouteInfo;
+import org.onap.msb.apiroute.api.DiscoverInfo;
+import org.onap.msb.apiroute.api.IuiRouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
+import org.onap.msb.apiroute.health.ConsulLinkHealthCheck;
+import org.onap.msb.apiroute.health.RedisHealthCheck;
+import org.onap.msb.apiroute.wrapper.serviceListener.MicroServiceChangeListener;
+import org.onap.msb.apiroute.wrapper.serviceListener.RouteNotify;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.onap.msb.apiroute.wrapper.util.FileUtil;
+import org.onap.msb.apiroute.wrapper.util.JacksonJsonUtil;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.onap.msb.apiroute.wrapper.util.RegExpTestUtil;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Jedis;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+public class InitRouteServiceWrapper {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(InitRouteServiceWrapper.class);
+
+
+ private static InitRouteServiceWrapper instance = new InitRouteServiceWrapper();
+
+ private InitRouteServiceWrapper() {}
+
+ public static InitRouteServiceWrapper getInstance() {
+ return instance;
+ }
+
+
+ /**
+ * The listener registration service changes
+ */
+ public void registerServiceChangeListener() {
+
+ RouteNotify.getInstance().addServiceChangeListener(new MicroServiceChangeListener());
+
+ }
+
+ public void initFilterConfig(){
+ //route init
+ ConfigUtil.getInstance().initRouteWay();
+ ConfigUtil.getInstance().initApiGatewayPort();
+ ConfigUtil.getInstance().initRouteNameSpaceMatches();
+ ConfigUtil.getInstance().initRouteLabelsMatches();
+ ConfigUtil.getInstance().initNodeMetaQueryParam();
+
+ }
+
+ public void initDataSynchro(){
+
+ registerServiceChangeListener();
+
+ boolean ifRedisConnect=startCheckRedisConnect();
+
+ if(ifRedisConnect){
+ initRouteInfoFromJson();
+ runConsulClientApp();
+ }
+ }
+
+ public void initHealthCheck()
+ {
+ LOGGER.info("start check consul link thread");
+ Thread tConsul= new Thread(new ConsulLinkHealthCheck(),"_healthcheck_consul_");
+ tConsul.setDaemon(true);
+ tConsul.start();
+
+ LOGGER.info("start check redis thread");
+ Thread tRedies= new Thread(new RedisHealthCheck(),"_healthcheck_redis_");
+ tRedies.setDaemon(true);
+ tRedies.start();
+ }
+
+
+
+
+ public boolean startCheckRedisConnect() {
+
+ int n = 0;
+ while (true) {
+ if (!checkRedisConnect()) {
+ n++;
+ LOGGER.warn(n + "/10 : Initial Route Configuration——redis connection fail...");
+
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException e) {
+ LOGGER.error("Thread.sleep throw except:" + e.getMessage());
+ }
+
+
+ if (n >= 10) {
+ LOGGER.error("Initial Route Configuration——redis connection fail,timeout exit...");
+ return false;
+ }
+ } else {
+ LOGGER.warn(" Initial Route Configuration——redis connection success...");
+ return true;
+ }
+ }
+
+
+ }
+
+
+ // Open the consul to monitor subscription service
+ public void runConsulClientApp() {
+
+ String consulIP;
+ int consulPort;
+ String consulConfSource="Default";
+
+
+ DiscoverInfo discoverInfo = ConfigUtil.getInstance().getDiscoverInfo();
+
+ if (discoverInfo.isEnabled()) {
+ LOGGER.warn("starting to initial consul Configuration");
+ String[] routeWay = ConfigUtil.getInstance().getRouteWay();
+ try {
+ String sys_consulIp=ConfigUtil.getInstance().getConsul_ip();
+ if (StringUtils.isNotBlank(sys_consulIp)) {
+ consulIP = sys_consulIp.trim();
+ consulPort = RouteUtil.consulDeafultPort;
+ consulConfSource="env:CONSUL_IP";
+ } else {
+ consulIP = discoverInfo.getIp();
+ consulPort = discoverInfo.getPort();
+ consulConfSource="init discoverInfo";
+ }
+
+ LOGGER.warn("init consul sync Address from [ "+consulConfSource+" ]:" + consulIP + ":" + consulPort);
+
+ // Registration service discovery routing
+ // api
+ ApiRouteInfo discoverApiService = new ApiRouteInfo();
+ discoverApiService.setServiceName("msdiscover");
+ discoverApiService.setUrl("/api/microservices/v1");
+ discoverApiService.setVersion("v1");
+ discoverApiService.setMetricsUrl("/admin/metrics");
+ discoverApiService.setApiJson("/api/microservices/v1/swagger.json");
+ discoverApiService.setHost("msb");
+
+ RouteServer[] servers = new RouteServer[1];
+ servers[0] = new RouteServer(discoverInfo.getIp(), String.valueOf(discoverInfo.getPort()));
+ discoverApiService.setServers(servers);
+
+
+ for (int i = 0; i < routeWay.length; i++) {
+ ApiRouteServiceWrapper.getInstance().saveApiRouteInstance4Rest(discoverApiService,
+ routeWay[i]);
+ }
+
+
+
+ // iui
+ IuiRouteInfo discoverIUIService = new IuiRouteInfo();
+ discoverIUIService.setServiceName("msdiscover");
+ discoverIUIService.setUrl("/iui/microservices");
+ discoverIUIService.setHost("msb");
+ discoverIUIService.setServers(servers);
+
+ for (int i = 0; i < routeWay.length; i++) {
+ IuiRouteServiceWrapper.getInstance()
+ .saveIuiRouteInstance(discoverIUIService, routeWay[i]);
+ }
+
+
+ /*
+ * ConsulClientApp consulClientApp = new ConsulClientApp(consulIP, consulPort);
+ * consulClientApp.startServiceListen();
+ */
+
+ // SyncDataManager syncDataManager = new SyncDataManager();
+ // Monitor serviceList change
+ SyncDataManager.initSyncTask(consulIP, consulPort);
+
+
+ LOGGER.warn("start monitor consul service--" + consulIP + ":" + consulPort);
+ } catch (Exception e) {
+ LOGGER.error("start monitor consul service fail:" + e.getMessage());
+ }
+ }
+
+
+
+ }
+
+
+
+ /**
+ * @Title: initRouteInfoFromJson
+ * @Description: TODO(According to the JSON file configuration initialization route data)
+ * @return: void
+ */
+ public void initRouteInfoFromJson() {
+ LOGGER.info("starting to initial Route Configuration");
+ URL apiDocsPath = InitRouteServiceWrapper.class.getResource("/ext/initServices");
+ if (apiDocsPath != null) {
+ String path = apiDocsPath.getPath();
+
+ LOGGER.info("read JsonFilefolder:" + path);
+
+ try {
+ File[] files = FileUtil.readFileFolder(path);
+ for (int i = 0; i < files.length; i++) {
+ File file = files[i];
+ if (file.isFile() && file.getName().endsWith(".json")) {
+ LOGGER.info("read JsonFile:" + file.getPath());
+ String fileContent = FileUtil.readFile(file.getPath());
+ saveInitService2redis(fileContent);
+ } else {
+ LOGGER.warn(file.getName() + " is not a right file");
+ }
+ }
+
+
+
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read initServices Files throw FileNotFoundException", e);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read initServices Files throw IOexception", e);
+ }
+
+ }
+
+
+
+ }
+
+
+
+ private void saveInitService2redis(String fileContent) {
+
+ String[] routeWay = ConfigUtil.getInstance().getRouteWay();
+ String iuiRootPath = ConfigUtil.getInstance().getIUI_ROOT_PATH();
+
+ try {
+ List<ApiRouteInfo> routeList =
+ JacksonJsonUtil.jsonToListBean(fileContent, new TypeReference<List<ApiRouteInfo>>() {});
+ for (ApiRouteInfo route : routeList) {
+ String url = route.getUrl();
+
+ if (RegExpTestUtil.urlRegExpTest(route.getServiceName())) {
+
+ for (int i = 0; i < routeWay.length; i++) {
+ try {
+
+ CustomRouteServiceWrapper.getInstance().getCustomRouteInstance(
+ route.getServiceName(), route.getHost(), "", routeWay[i]);
+
+ } catch (ExtendedNotFoundException e) {
+
+ LOGGER.info("initCustomRoute: ServiceName--" + route.getServiceName());
+
+ CustomRouteInfo customRouteInfo = new CustomRouteInfo();
+ customRouteInfo.setControl(route.getControl());
+ customRouteInfo.setServers(route.getServers());
+ customRouteInfo.setServiceName(route.getServiceName());
+ customRouteInfo.setStatus(route.getStatus());
+ customRouteInfo.setUrl(route.getUrl());
+ customRouteInfo.setHost(route.getHost());
+
+
+
+ CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfo,
+ routeWay[i]);
+
+ }
+ }
+ } else {
+
+ if (RegExpTestUtil.apiRouteUrlRegExpTest(url) || url.startsWith("/api/microservices/") || url.startsWith("/admin/microservices/")) {
+
+ for (int i = 0; i < routeWay.length; i++) {
+ try {
+
+ ApiRouteServiceWrapper.getInstance().getApiRouteInstance(route.getServiceName(),
+ route.getVersion(), route.getHost(), route.getPublish_port(), routeWay[i]);
+
+ } catch (ExtendedNotFoundException e) {
+ LOGGER.info("initapiRoute: ServiceName--" + route.getServiceName());
+
+ if (url.startsWith("/api/microservices")) {
+ if (StringUtils.isNotBlank(System.getenv("dwApp_server_connector_port"))) {
+ replaceApigatewayPort(route.getServers(),
+ System.getenv("dwApp_server_connector_port"));
+ }
+ }
+
+ if (url.startsWith("/admin/microservices")) {
+ replaceApigatewayPort(route.getServers(),ConfigUtil.getInstance().getServerPort());
+ }
+
+ ApiRouteServiceWrapper.getInstance().saveApiRouteInstance4Rest(route, routeWay[i]);
+
+ }
+ }
+
+
+ } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(url) || url.equals("/iui/microservices")) {
+
+ for (int i = 0; i < routeWay.length; i++) {
+ try {
+
+ IuiRouteServiceWrapper.getInstance().getIuiRouteInstance(route.getServiceName(),
+ route.getHost(), "", routeWay[i]);
+
+ } catch (ExtendedNotFoundException e) {
+
+ LOGGER.info(" initiuiRoute: ServiceName--" + route.getServiceName());
+ IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
+ iuiRouteInfo.setControl(route.getControl());
+ iuiRouteInfo.setServers(route.getServers());
+ iuiRouteInfo.setServiceName(route.getServiceName());
+ iuiRouteInfo.setStatus(route.getStatus());
+ iuiRouteInfo.setHost(route.getHost());
+
+
+ if (url.equals("/iui/microservices")) {
+ iuiRouteInfo.setUrl("/" + iuiRootPath + "/microservices");
+ if (StringUtils.isNotBlank(System.getenv("dwApp_server_connector_port"))) {
+ replaceApigatewayPort(iuiRouteInfo.getServers(),
+ System.getenv("dwApp_server_connector_port"));
+ }
+ } else {
+ iuiRouteInfo.setUrl(route.getUrl());
+ }
+
+ IuiRouteServiceWrapper.getInstance()
+ .saveIuiRouteInstance(iuiRouteInfo, routeWay[i]);
+
+
+ }
+ }
+
+ } else {
+ LOGGER.error("init Service throw exception——serviceName: " + route.getServiceName()
+ + ",url:" + url);
+ }
+ }
+
+
+
+ }
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read initServices Files throw exception", e);
+ }
+
+ }
+
+ private void replaceApigatewayPort(RouteServer[] servers, String apigatewayPort) {
+ for (int i = 0; i < servers.length; i++) {
+ servers[i].setPort(apigatewayPort);
+ }
+ }
+
+ public void initMetricsConfig(ApiRouteAppConfig configuration) {
+
+ SimpleServerFactory simpleServerFactory =
+ (SimpleServerFactory) configuration.getServerFactory();
+ HttpConnectorFactory httpConnectorFactory =
+ (HttpConnectorFactory) simpleServerFactory.getConnector();
+ String metricsUrl =
+ "http://127.0.0.1:" + httpConnectorFactory.getPort()
+ + simpleServerFactory.getAdminContextPath() + "/metrics";
+ ConfigUtil.getInstance().setMetricsUrl(metricsUrl);
+ }
+
+
+ private boolean checkRedisConnect() {
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ return true;
+ } catch (Exception e) {
+ LOGGER.error("checkRedisConnect call redis throw exception", e);
+ }finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+
+ return false;
+ }
+
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/IuiRouteServiceWrapper.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/IuiRouteServiceWrapper.java
new file mode 100644
index 0000000..d66de21
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/IuiRouteServiceWrapper.java
@@ -0,0 +1,221 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.msb.apiroute.wrapper;
+
+import java.util.List;
+
+import org.onap.msb.apiroute.api.IuiRouteInfo;
+import org.onap.msb.apiroute.api.exception.ExtendedInternalServerErrorException;
+import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
+import org.onap.msb.apiroute.wrapper.service.IuiRouteService;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class IuiRouteServiceWrapper {
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(IuiRouteServiceWrapper.class);
+
+ private static IuiRouteServiceWrapper instance = new IuiRouteServiceWrapper();
+
+ private IuiRouteServiceWrapper() {}
+
+ public static IuiRouteServiceWrapper getInstance() {
+ return instance;
+ }
+
+
+
+ /**
+ * @Title: getAllIuiRouteService
+ * @Description: TODO(get All IuiRouteServices)
+ * @param: @return
+ * @return: IuiRouteInfo[]
+ */
+ public List<IuiRouteInfo> getAllIuiRouteInstances(String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ try {
+ String iuiRedisKey = RouteUtil.getMutiRedisKey(RouteUtil.IUIROUTE, routeWay);
+
+ return IuiRouteService.getInstance().getMultiIuiRouteInstances(iuiRedisKey);
+
+ } catch (Exception e) {
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+
+ }
+
+
+
+ /**
+ * @Title: getIuiRouteInstance
+ * @Description: TODO(get one IuiRouteInstance by serviceName)
+ * @param: @param serviceName
+ * @param: @return
+ * @return: IuiRouteInfo
+ */
+ public IuiRouteInfo getIuiRouteInstance(String serviceName, String host, String publish_port,
+ String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ String iuiRedisPrefixedKey =
+ RouteUtil
+ .getRedisPrefixedKey(RouteUtil.IUIROUTE, serviceName, host, publish_port, routeWay);
+
+ IuiRouteInfo iuiRouteInfo;
+ try {
+ iuiRouteInfo = IuiRouteService.getInstance().getIuiRouteInstance(iuiRedisPrefixedKey);
+ } catch (Exception e) {
+ LOGGER.error("get IuiRouteInstance throw exception", e);
+ throw new ExtendedInternalServerErrorException("get IuiRouteInstance throw exception"
+ + e.getMessage());
+ }
+
+
+
+ if (null == iuiRouteInfo) {
+ throw new ExtendedNotFoundException("iui RouteInfo not found");
+ }
+
+ return iuiRouteInfo;
+ }
+
+
+
+ /**
+ * @Title updateIuiRouteStatus
+ * @Description TODO(update one IuiRoute Status)
+ * @param serviceName
+ * @param status
+ * @return
+ * @return RouteResult
+ */
+ public synchronized IuiRouteInfo updateIuiRouteStatus(String serviceName, String host,
+ String publish_port, String status, String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ RouteUtil.checkServiceStatus(status);
+
+ try {
+ String iuiRedisPrefixedKey =
+ RouteUtil.getRedisPrefixedKey(RouteUtil.IUIROUTE, serviceName, host, publish_port,
+ routeWay);
+
+ IuiRouteService.getInstance().updateIuiRouteStatus2Redis(iuiRedisPrefixedKey, status);
+
+
+ } catch (Exception e) {
+ LOGGER.error("update IuiRoute status throw exception", e);
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+ IuiRouteInfo new_iuiRouteInfo = getIuiRouteInstance(serviceName, host, publish_port, routeWay);
+
+ return new_iuiRouteInfo;
+ }
+
+ /**
+ * @Title: saveIuiRouteInstance
+ * @Description: TODO(save one IuiRouteInstance)
+ * @param: @param IuiRouteInfo
+ * @param: @return
+ * @return: IuiRouteInfo
+ */
+ public synchronized IuiRouteInfo saveIuiRouteInstance4Rest(IuiRouteInfo iuiRouteInfo,
+ String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ RouteUtil.checkRouterInfoFormat(iuiRouteInfo);
+
+
+ try {
+ saveIuiRouteInstance(iuiRouteInfo, routeWay);
+ } catch (Exception e) {
+ throw new ExtendedInternalServerErrorException("save iuiRouteInfo fail: [serviceName]"
+ + iuiRouteInfo.getServiceName() + e.getMessage());
+ }
+
+ return iuiRouteInfo;
+ }
+
+
+ public synchronized void saveIuiRouteInstance(IuiRouteInfo iuiRouteInfo, String routeWay)
+ throws Exception {
+ try {
+ String iuiRedisPrefixedKey =
+ RouteUtil.getRedisPrefixedKey(RouteUtil.IUIROUTE, iuiRouteInfo.getServiceName(),
+ iuiRouteInfo.getHost(), iuiRouteInfo.getPublish_port(), routeWay);
+
+ IuiRouteService.getInstance().saveIuiRouteService2Redis(iuiRouteInfo, iuiRedisPrefixedKey);
+ LOGGER.info("save iuiRouteInfo [serviceName]" + iuiRouteInfo.getServiceName() + " [host]"
+ + iuiRouteInfo.getHost() + " [publish_port]" + iuiRouteInfo.getPublish_port()
+ + " [routeWay]" + routeWay + " success");
+
+ } catch (Exception e) {
+ LOGGER.error("save iuiRouteInfo [serviceName]" + iuiRouteInfo.getServiceName() + " [host]"
+ + iuiRouteInfo.getHost() + " [publish_port]" + iuiRouteInfo.getPublish_port()
+ + " [routeWay]" + routeWay + " throw exception", e);
+ throw e;
+ }
+ }
+
+
+
+ /**
+ * @Title: deleteIuiRoute
+ * @Description: TODO(delete one IuiRoute)
+ * @param: @param type
+ * @param: @param serviceName
+ * @param: @param delKey
+ * @param: @return
+ * @return: void
+ */
+ public synchronized void deleteIuiRoute(String serviceName, String host, String publish_port,
+ String routeWay) {
+
+ RouteUtil.checkRouteWay(routeWay);
+
+ String iuiRedisPrefixedKey =
+ RouteUtil
+ .getRedisPrefixedKey(RouteUtil.IUIROUTE, serviceName, host, publish_port, routeWay);
+
+ try {
+ IuiRouteService.getInstance().deleteIuiRouteService2Redis(iuiRedisPrefixedKey);
+ LOGGER.info("delete iuiRouteInfo [serviceName]" + serviceName + " [host]" + host
+ + " [publish_port]" + publish_port + " [routeWay]" + routeWay + " success");
+
+ } catch (ExtendedNotFoundException e) {
+ throw e;
+ } catch (Exception e) {
+ LOGGER.error("delete iuiRouteInfo [serviceName]" + serviceName + " [host]" + host
+ + " [publish_port]" + publish_port + " [routeWay]" + routeWay + " throw exception", e);
+ throw new ExtendedInternalServerErrorException("delete iuiRouteInfo [serviceName]" + serviceName +e.getMessage());
+ }
+
+
+
+ }
+
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/MicroServiceWrapper.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/MicroServiceWrapper.java
new file mode 100644
index 0000000..a30151e
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/MicroServiceWrapper.java
@@ -0,0 +1,398 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.msb.apiroute.wrapper;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.api.Node;
+import org.onap.msb.apiroute.api.exception.ExtendedInternalServerErrorException;
+import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
+import org.onap.msb.apiroute.api.exception.UnprocessableEntityException;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.service.MicroServiceFullService;
+import org.onap.msb.apiroute.wrapper.serviceListener.RouteNotify;
+import org.onap.msb.apiroute.wrapper.util.MicroServiceUtil;
+import org.onap.msb.apiroute.wrapper.util.RegExpTestUtil;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MicroServiceWrapper {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceWrapper.class);
+
+ private static MicroServiceWrapper instance = new MicroServiceWrapper();
+
+
+ private MicroServiceWrapper() {}
+
+ public static MicroServiceWrapper getInstance() {
+ return instance;
+ }
+
+
+
+
+ /**
+ * @Title: getAllMicroServiceInstances
+ * @Description: getAllMicroServiceInstances
+ * @param: @return
+ * @return: Response
+ * @throws Exception
+ */
+ public List<MicroServiceFullInfo> getAllMicroServiceInstances() {
+
+ try {
+ return MicroServiceFullService.getInstance().getAllMicroServiceInstances();
+
+ } catch (Exception e) {
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+ }
+
+ public Set<String> getAllMicroServiceKey() {
+ int failedNum = 0;
+ int retryCount=3;
+ int failedTimer = 5 * 1000;
+
+ Set<String> serviceKeys=null;
+
+ do {
+
+ try {
+ serviceKeys= MicroServiceFullService.getInstance().getAllMicroServiceKey();
+ break;
+
+ } catch (Exception e) {
+
+ LOGGER.error(failedNum + "/"+retryCount+" : get AllMicroServiceKey fail"+e);
+ failedNum++;
+
+ try {
+ Thread.sleep(failedTimer);
+ } catch (InterruptedException ex) {
+ LOGGER.warn("get AllMicroServiceKey Thread.sleep throw except:" + ex.getMessage());
+ }
+ }
+
+ }while (failedNum <= retryCount);
+
+
+ return serviceKeys;
+
+ }
+
+
+
+
+ /**
+ * @Title: getMicroServiceInstance
+ * @Description: (getMicroServiceInstance)
+ * @param: @param serviceName
+ * @param: @param version
+ * @param: @return
+ * @return: ApiRouteInfo
+ */
+ public MicroServiceFullInfo getMicroServiceInstance(String serviceName, String version) {
+ if ("null".equals(version)) {
+ version = "";
+ }
+ serviceName = serviceName.replace("*", "/");
+
+ RouteUtil.checkServiceNameAndVersion(serviceName, version);
+
+ MicroServiceFullInfo microServiceInfo;
+ try {
+ microServiceInfo =
+ MicroServiceFullService.getInstance().getMicroServiceInstance(serviceName, version);
+
+ } catch (Exception e) {
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+ if (null == microServiceInfo) {
+ String errInfo = "microservice not found: serviceName-" + serviceName + ",version-" + version;
+ throw new ExtendedNotFoundException(errInfo);
+
+ }
+
+ return microServiceInfo;
+ }
+
+
+
+ /**
+ * @Title updateMicroServiceStatus
+ * @Description updateMicroServiceStatus
+ * @param serviceName
+ * @param version
+ * @param status
+ * @return
+ * @return RouteResult
+ */
+
+ public synchronized MicroServiceFullInfo updateMicroServiceStatus(String serviceName,
+ String version, String status) {
+
+ if ("null".equals(version)) {
+ version = "";
+ }
+ serviceName = serviceName.replace("*", "/");
+
+ RouteUtil.checkServiceNameAndVersion(serviceName, version);
+
+ RouteUtil.checkServiceStatus(status);
+
+ try {
+
+ MicroServiceFullService.getInstance().updateMicroServiceStatus(serviceName, version, status);
+
+ MicroServiceFullInfo newMicroServiceInfo =
+ MicroServiceFullService.getInstance().getMicroServiceInstance(serviceName, version);
+
+ // Notify the listeners
+ RouteNotify.getInstance().noticeUpdateStatusListener(newMicroServiceInfo, status);
+
+
+ return newMicroServiceInfo;
+ } catch (NullPointerException e) {
+ throw new ExtendedNotFoundException(e.getMessage());
+ } catch (Exception e) {
+ LOGGER.error("update MicroServiceNode throw exception", e);
+ throw new ExtendedInternalServerErrorException(e.getMessage());
+ }
+
+
+ }
+
+
+ public synchronized MicroServiceFullInfo saveMicroServiceInstance(
+ MicroServiceFullInfo microServiceInfo, boolean createOrUpdate, String requestIP,
+ String serverPort) {
+
+ RouteUtil.checkMicroServiceInfoFormat(microServiceInfo, requestIP);
+
+ try {
+
+ if (createOrUpdate == false) {
+ deleteServiceAndnoticeRoute(microServiceInfo);
+ }
+
+ saveServiceAndnoticeRoute(microServiceInfo);
+
+
+ MicroServiceFullInfo newMicroServiceInfo =
+ MicroServiceFullService.getInstance().getMicroServiceInstance(
+ microServiceInfo.getServiceName(), microServiceInfo.getVersion());
+
+
+ return newMicroServiceInfo;
+
+ } catch (UnprocessableEntityException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new ExtendedInternalServerErrorException("save MicroServiceInfo fail :[serviceName]" + microServiceInfo.getServiceName()
+ + "[version]" + microServiceInfo.getVersion()+ e.getMessage());
+ }
+
+ }
+
+
+ public synchronized void deleteMicroService4AllVersion(String serviceName) {
+ try {
+
+ List<MicroServiceFullInfo> microServiceList4AllVersion =
+ MicroServiceFullService.getInstance().getAllVersionsOfTheService(serviceName);
+
+ if (microServiceList4AllVersion.size() == 0) {
+ LOGGER.info("delete MicroServiceInfo for All Version Fail:serviceName-" + serviceName
+ + " not fond");
+ } else {
+ for (MicroServiceFullInfo microServiceInfo : microServiceList4AllVersion) {
+ deleteServiceAndnoticeRoute(microServiceInfo);
+ }
+ }
+
+ } catch (Exception e) {
+ LOGGER.error("delete MicroServiceInfo for all version :serviceName-" + serviceName +" throw exception", e);
+
+ }
+ }
+
+
+ public synchronized void deleteMicroService(String serviceName, String version) {
+ if ("null".equals(version)) {
+ version = "";
+ }
+ serviceName = serviceName.replace("*", "/");
+
+ RouteUtil.checkServiceNameAndVersion(serviceName, version);
+
+ try {
+
+ MicroServiceFullInfo microServiceInfo =
+ MicroServiceFullService.getInstance().getMicroServiceInstance(serviceName, version);
+
+ if (microServiceInfo == null) {
+ LOGGER.error("delete MicroServiceInfo FAIL:serviceName-" + serviceName + ",version-"+ version + " not fond ");
+ } else {
+
+ deleteServiceAndnoticeRoute(microServiceInfo);
+ }
+
+
+ } catch (ExtendedNotFoundException e) {
+ throw e;
+ } catch (Exception e) {
+
+ throw new ExtendedInternalServerErrorException("delete MicroServiceInfo serviceName-" + serviceName + ",version-" + version+e.getMessage());
+
+ }
+
+
+ }
+
+ public synchronized void deleteMicroServiceInstance(String serviceName, String version,
+ String ip, String port) {
+ if ("null".equals(version)) {
+ version = "";
+ }
+ serviceName = serviceName.replace("*", "/");
+
+ RouteUtil.checkServiceNameAndVersion(serviceName, version);
+
+ if (!RegExpTestUtil.ipRegExpTest(ip)) {
+ throw new UnprocessableEntityException("delete MicroServiceInfo FAIL:IP(" + ip+ ")is not a valid IP address");
+ }
+
+ if (!RegExpTestUtil.portRegExpTest(port)) {
+ throw new UnprocessableEntityException("delete MicroServiceInfo FAIL:Port(" + port + ")is not a valid Port address");
+ }
+
+
+ try {
+ MicroServiceFullInfo microServiceInfo =
+ MicroServiceFullService.getInstance().getMicroServiceInstance(serviceName, version);
+
+ if (microServiceInfo == null) {
+ throw new UnprocessableEntityException("delete MicroServiceInfo FAIL:serviceName-"+ serviceName + ",version-" + version + " not fond ");
+ }
+
+ Set<Node> nodes = microServiceInfo.getNodes();
+
+ boolean ifFindBNode = false;
+
+ for (Node node : nodes) {
+ if (node.getIp().equals(ip) && node.getPort().equals(port)) {
+ ifFindBNode = true;
+ nodes.remove(node);
+
+ if (nodes.isEmpty()) {
+ // delete MicroService
+ deleteServiceAndnoticeRoute(microServiceInfo);
+ } else {
+ // delete Node
+ MicroServiceFullService.getInstance().saveMicroServiceInfo2Redis(microServiceInfo);
+ RouteNotify.getInstance().noticeRouteListener4Update(serviceName, version,
+ microServiceInfo);
+ }
+
+ break;
+ }
+ }
+
+ if (!ifFindBNode) {
+ throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL:serviceName-"+ serviceName + ",version-" + version +",node-" + ip + ":" + port + " not fond ");
+ }
+
+
+ } catch (ExtendedNotFoundException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new ExtendedInternalServerErrorException("delete MicroServiceInfo :serviceName-"+ serviceName + ",version-" + version+",node-" + ip + ":" + port +"throw exception"+e.getMessage());
+
+ }
+
+ }
+
+
+ public void deleteServiceAndnoticeRoute(MicroServiceFullInfo service) throws Exception {
+
+ try {
+ // Delete the redis record
+ MicroServiceFullService.getInstance().deleteMicroService(service.getServiceName(),
+ service.getVersion());
+ LOGGER.info("delete MicroServiceInfo And notice to Route success:[serviceName]"+ service.getServiceName() + "[version]" + service.getVersion());
+
+ // Notify the listeners
+ RouteNotify.getInstance().noticeRouteListener4Delete(service);
+
+ } catch (Exception e) {
+ LOGGER.error("delete MicroService And synchro to Route:[serviceName]"+ service.getServiceName() + "[version]" + service.getVersion()+" throw exception", e);
+ throw e;
+ }
+ }
+
+ public void saveServiceAndnoticeRoute(MicroServiceFullInfo service) throws Exception {
+
+ try {
+ // save the redis record
+ MicroServiceFullService.getInstance().saveMicroServiceInfo2Redis(service);
+
+ LOGGER.info("save MicroServiceInfo And notice to Route success:[serviceName]"+ service.getServiceName() + "[version]" + service.getVersion());
+
+ // Notify the listeners
+ RouteNotify.getInstance().noticeRouteListener4Add(service);
+
+
+ } catch (Exception e) {
+ LOGGER.error("save MicroServiceInfo And synchro to Route fail :[serviceName]" + service.getServiceName()+ "[version]" + service.getVersion() + " throw exception", e);
+ throw e;
+ }
+ }
+
+ public Set<String> getAllVersion(String serviceName) {
+ Set<String> serviceVersionSet = new HashSet<String>();
+ try {
+ String pattern = MicroServiceUtil.getServiceKey(serviceName, "*");
+ Set<String> serviceKeySet = RedisAccessWrapper.filterKeys(pattern);
+
+
+ Pattern serviceKeyRegexPattern = MicroServiceUtil.getServiceKeyRegexPattern();
+ for (String serviceKey : serviceKeySet) {
+ Matcher matcher = serviceKeyRegexPattern.matcher(serviceKey);
+ if (matcher.matches()) {
+ serviceVersionSet.add(matcher.group("version"));
+ }
+ }
+ } catch (Exception e) {
+ LOGGER.error("getAllVersion [serviceName]:" + serviceName + " throw exception", e);
+ }
+
+ return serviceVersionSet;
+
+ }
+
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/CatalogClient.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/CatalogClient.java
new file mode 100644
index 0000000..94a709d
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/CatalogClient.java
@@ -0,0 +1,87 @@
+package org.onap.msb.apiroute.wrapper.consulextend;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseCallback;
+import org.onap.msb.apiroute.wrapper.consulextend.util.Http;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.orbitz.consul.option.CatalogOptions;
+import com.orbitz.consul.option.QueryOptions;
+
+/**
+ * HTTP Client for /v1/catalog/ endpoints.
+ */
+public class CatalogClient {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(CatalogClient.class);
+
+ private static final TypeReference<HttpEntity> TYPE_SERVICES_MAP = new TypeReference<HttpEntity>() {
+ };
+
+
+ private static final String CATALOG_URI_8500 = "/v1/catalog";
+ private static final String CATAlOG_URI_10081 = "/api/catalog/v1";
+
+ private static final String GET_SERVICES_URI = "/services";
+
+ private static final Http httpClient = Http.getInstance();
+
+ private HttpHost targetHost = null;
+ private String catalogUri = CATAlOG_URI_10081;
+
+ CatalogClient(final HttpHost targetHost) {
+ this.targetHost = targetHost;
+ if (targetHost.getPort() == 8500) {
+ catalogUri = CATALOG_URI_8500;
+ }
+ }
+
+ /**
+ * Retrieves all services for a given datacenter with
+ * {@link com.orbitz.consul.option.QueryOptions}.
+ *
+ * GET /v1/catalog/services?dc={datacenter}
+ *
+ * @param catalogOptions
+ * Catalog specific options to use.
+ * @param queryOptions
+ * The Query Options to use.
+ * @return A {@link com.orbitz.consul.model.ConsulResponse} containing a map
+ * of service name to list of tags.
+ */
+ public void getServices(CatalogOptions catalogOptions,
+ QueryOptions queryOptions,
+ ConsulResponseCallback<HttpEntity> callback) {
+
+ // prepare access path
+ // path:10081 vs 8500
+ String path = targetHost.toString() + catalogUri + GET_SERVICES_URI;
+
+ // params:wait,index,dc......
+ String params = Http.optionsFrom(catalogOptions, queryOptions);
+
+ // node meta: ns,external,internal.....
+ String node_meta = ConfigUtil.getInstance().getNodeMetaQueryParam();
+
+ // add params
+ path = (params != null && !params.isEmpty()) ? path += "?" + params
+ : path;
+
+ // add node_meta
+ if (node_meta != null && !node_meta.isEmpty()) {
+ path = path.contains("?") ? path +"&"+ node_meta : path + "?"
+ + node_meta;
+ }
+
+ // async watch services
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("get all services:" + path);
+ }
+ httpClient.asyncGetDelayHandle(path, TYPE_SERVICES_MAP, callback);
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/Consul.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/Consul.java
new file mode 100644
index 0000000..cf8196a
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/Consul.java
@@ -0,0 +1,97 @@
+package org.onap.msb.apiroute.wrapper.consulextend;
+
+import org.apache.http.HttpHost;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+
+public class Consul {
+ /**
+ * Default Consul HTTP API host.
+ */
+ public static final String DEFAULT_HTTP_HOST = "localhost";
+
+ /**
+ * Default Consul HTTP API port.
+ */
+ public static final int DEFAULT_HTTP_PORT = 8500;
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(Consul.class);
+
+ private final CatalogClient catalogClient;
+ private final HealthClient healthClient;
+
+ private Consul(CatalogClient catalogClient, HealthClient healthClient) {
+ this.catalogClient = catalogClient;
+ this.healthClient = healthClient;
+ }
+
+ /**
+ * Get the Catalog HTTP client.
+ * <p>
+ * /v1/catalog
+ *
+ * @return The Catalog HTTP client.
+ */
+ public CatalogClient catalogClient() {
+ return catalogClient;
+ }
+
+ /**
+ * Get the Health HTTP client.
+ * <p>
+ * /v1/health
+ *
+ * @return The Health HTTP client.
+ */
+ public HealthClient healthClient() {
+ return healthClient;
+ }
+
+ /**
+ * Creates a new {@link Builder} object.
+ *
+ * @return A new Consul builder.
+ */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ /**
+ * Used to create a default Consul client.
+ *
+ * @return A default {@link Consul} client.
+ */
+ @VisibleForTesting
+ public static Consul newClient() {
+ return builder().build();
+ }
+
+ public static class Builder {
+
+ private HttpHost targetHost;
+
+ {
+ targetHost = new HttpHost(DEFAULT_HTTP_HOST, DEFAULT_HTTP_PORT);
+ }
+
+ Builder() {
+
+ }
+
+ public Builder withHostAndPort(String hostname, int port) {
+ this.targetHost = new HttpHost(hostname, port);
+ return this;
+ }
+
+ public Consul build() {
+ LOGGER.info("********build consul:"+targetHost.toString()+"****************");
+ CatalogClient catalogClient = new CatalogClient(targetHost);
+ HealthClient healthClient = new HealthClient(targetHost);
+ return new Consul(catalogClient,healthClient);
+ }
+
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/HealthClient.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/HealthClient.java
new file mode 100644
index 0000000..899a57a
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/HealthClient.java
@@ -0,0 +1,112 @@
+package org.onap.msb.apiroute.wrapper.consulextend;
+
+import java.util.List;
+
+import org.apache.http.HttpHost;
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseCallback;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.consulextend.util.Http;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.orbitz.consul.option.CatalogOptions;
+import com.orbitz.consul.option.QueryOptions;
+
+/**
+ * HTTP Client for /v1/health/ endpoints.
+ */
+public class HealthClient {
+ private final static Logger LOGGER = LoggerFactory
+ .getLogger(HealthClient.class);
+
+ private static final TypeReference<List<ServiceHealth>> TYPE_SERVICE_HEALTH_LIST = new TypeReference<List<ServiceHealth>>() {
+ };
+
+ private static final String HEALTH_URI_10081 = "/api/health/v1";
+ private static final String HEALTH_URI_8500 = "/v1/health";
+ private static final String GET_HEALTH_SERVICE_URI = "/service";
+
+// private static final String GET_HEALTH_SERVICE_URI = "/v1/health/service";
+
+// private static final String GET_HEALTH_SERVICE_URI = "/api/health/v1/service";
+
+ private final static Http httpClient = Http.getInstance();
+
+ private HttpHost targetHost = null;
+ private String healthUri = HEALTH_URI_10081;
+
+ HealthClient(final HttpHost targetHost) {
+ this.targetHost = targetHost;
+
+ if(targetHost.getPort() == 8500)
+ {
+ healthUri = HEALTH_URI_8500;
+ }
+ }
+
+ /**
+ * Asynchronously retrieves the healthchecks for all healthy service
+ * instances in a given datacenter with
+ * {@link com.orbitz.consul.option.QueryOptions}.
+ *
+ * GET /v1/health/service/{service}?dc={datacenter}&amp;passing
+ *
+ * Experimental.
+ *
+ * @param service
+ * The service to query.
+ * @param catalogOptions
+ * The catalog specific options to use.
+ * @param queryOptions
+ * The Query Options to use.
+ * @param callback
+ * Callback implemented by callee to handle results.
+ */
+ public void getHealthyServiceInstances(String service,
+ CatalogOptions catalogOptions, QueryOptions queryOptions,
+ ConsulResponseCallback<List<ServiceHealth>> callback) {
+ // prepare access path
+ String path = targetHost.toString() + healthUri + GET_HEALTH_SERVICE_URI + "/"+ service;
+
+ String params = Http.optionsFrom(catalogOptions, queryOptions);
+ path = (params != null && !params.isEmpty()) ? path += "?"
+ + params : path; //query all nodes without filter for health
+
+ // async watch
+// LOGGER.info("get health paasing service:" + path);
+ httpClient.asyncGetDelayHandle(path, TYPE_SERVICE_HEALTH_LIST, callback);
+ }
+
+ /**
+ * Asynchronously retrieves the healthchecks for all nodes in a given
+ * datacenter with {@link com.orbitz.consul.option.QueryOptions}.
+ *
+ * GET /v1/health/service/{service}?dc={datacenter}
+ *
+ * Experimental.
+ *
+ * @param service
+ * The service to query.
+ * @param catalogOptions
+ * The catalog specific options to use.
+ * @param queryOptions
+ * The Query Options to use.
+ * @param callback
+ * Callback implemented by callee to handle results.
+ */
+ public void getAllServiceInstances(String service,
+ CatalogOptions catalogOptions, QueryOptions queryOptions,
+ ConsulResponseCallback<List<ServiceHealth>> callback) {
+
+ // prepare access path
+ String path = targetHost.toString() + healthUri + GET_HEALTH_SERVICE_URI + "/"+ service;
+ String params = Http.optionsFrom(catalogOptions, queryOptions);
+ path = (params != null && !params.isEmpty()) ? path += "?" + params
+ : path;
+
+ // async watch
+// LOGGER.debug("get service:" + path);
+ httpClient.asyncGetDelayHandle(path, TYPE_SERVICE_HEALTH_LIST, callback);
+ }
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/async/ConsulResponseCallback.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/async/ConsulResponseCallback.java
new file mode 100644
index 0000000..ab5b74a
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/async/ConsulResponseCallback.java
@@ -0,0 +1,33 @@
+package org.onap.msb.apiroute.wrapper.consulextend.async;
+
+import com.orbitz.consul.model.ConsulResponse;
+
+/**
+ * For API calls that support long-polling, this callback is used to handle
+ * the result on success or failure for an async HTTP call.
+ *
+ * @param <T> The Response type.
+ */
+public interface ConsulResponseCallback<T> {
+
+ /**
+ * Callback for a successful {@link com.orbitz.consul.model.ConsulResponse}.
+ *
+ * @param consulResponse The Consul response.
+ */
+ void onComplete(ConsulResponse<T> consulResponse);
+
+ /**
+ * Callback for a successful {@link com.orbitz.consul.model.ConsulResponse}.
+ *
+ * @param consulResponse The Consul response.
+ */
+ void onDelayComplete(OriginalConsulResponse<T> originalConsulResponse);
+
+ /**
+ * Callback for an unsuccessful request.
+ *
+ * @param throwable The exception thrown.
+ */
+ void onFailure(Throwable throwable);
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/async/ConsulResponseHeader.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/async/ConsulResponseHeader.java
new file mode 100644
index 0000000..ae8291a
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/async/ConsulResponseHeader.java
@@ -0,0 +1,27 @@
+package org.onap.msb.apiroute.wrapper.consulextend.async;
+
+import java.math.BigInteger;
+
+public class ConsulResponseHeader {
+ private final long lastContact;
+ private final boolean knownLeader;
+ private final BigInteger index;
+
+ public ConsulResponseHeader(long lastContact, boolean knownLeader, BigInteger index) {
+ this.lastContact = lastContact;
+ this.knownLeader = knownLeader;
+ this.index = index;
+ }
+
+ public long getLastContact() {
+ return lastContact;
+ }
+
+ public boolean isKnownLeader() {
+ return knownLeader;
+ }
+
+ public BigInteger getIndex() {
+ return index;
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/async/OriginalConsulResponse.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/async/OriginalConsulResponse.java
new file mode 100644
index 0000000..dbad13b
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/async/OriginalConsulResponse.java
@@ -0,0 +1,27 @@
+package org.onap.msb.apiroute.wrapper.consulextend.async;
+
+import org.apache.http.HttpResponse;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+public class OriginalConsulResponse<T> {
+ final HttpResponse response;
+ final TypeReference<T> responseType;
+
+ public OriginalConsulResponse(HttpResponse response, TypeReference<T> responseType) {
+ this.response = response;
+ this.responseType = responseType;
+
+ }
+
+ public HttpResponse getResponse() {
+ return response;
+ }
+
+ public TypeReference<T> getResponseType() {
+ return responseType;
+ }
+
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ConsulCache.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ConsulCache.java
new file mode 100644
index 0000000..809a8dc
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ConsulCache.java
@@ -0,0 +1,301 @@
+package org.onap.msb.apiroute.wrapper.consulextend.cache;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+
+import java.math.BigInteger;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseCallback;
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseHeader;
+import org.onap.msb.apiroute.wrapper.consulextend.async.OriginalConsulResponse;
+import org.onap.msb.apiroute.wrapper.consulextend.util.Http;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+import com.orbitz.consul.ConsulException;
+import com.orbitz.consul.model.ConsulResponse;
+import com.orbitz.consul.option.ImmutableQueryOptions;
+import com.orbitz.consul.option.QueryOptions;
+
+/**
+ * A cache structure that can provide an up-to-date read-only map backed by
+ * consul data
+ *
+ * @param <V>
+ */
+public class ConsulCache<T> {
+
+ enum State {
+ latent, starting, started, stopped
+ }
+
+ private final static Logger LOGGER = LoggerFactory
+ .getLogger(ConsulCache.class);
+
+ @VisibleForTesting
+ static final String BACKOFF_DELAY_PROPERTY = "com.orbitz.consul.cache.backOffDelay";
+ private static final long BACKOFF_DELAY_QTY_IN_MS = getBackOffDelayInMs(System
+ .getProperties());
+
+ private final AtomicReference<BigInteger> latestIndex = new AtomicReference<BigInteger>(
+ null);
+ private final AtomicReference<State> state = new AtomicReference<State>(
+ State.latent);
+ private final CountDownLatch initLatch = new CountDownLatch(1);
+ private final ScheduledExecutorService executorService = Executors
+ .newSingleThreadScheduledExecutor();
+ private final CopyOnWriteArrayList<Listener<T>> listeners = new CopyOnWriteArrayList<Listener<T>>();
+
+ private final CallbackConsumer<T> callBackConsumer;
+ private final ConsulResponseCallback<T> responseCallback;
+
+ ConsulCache(CallbackConsumer<T> callbackConsumer) {
+
+ this.callBackConsumer = callbackConsumer;
+
+ this.responseCallback = new ConsulResponseCallback<T>() {
+ @Override
+ public void onComplete(ConsulResponse<T> consulResponse) {
+
+ if (consulResponse.isKnownLeader()) {
+ if (!isRunning()) {
+ return;
+ }
+ updateIndex(consulResponse);
+
+ for (Listener<T> l : listeners) {
+ l.notify(consulResponse);
+ }
+
+ if (state.compareAndSet(State.starting, State.started)) {
+ initLatch.countDown();
+ }
+
+ runCallback();
+ } else {
+ onFailure(new ConsulException(
+ "Consul cluster has no elected leader"));
+ }
+ }
+
+ @Override
+ public void onDelayComplete(
+ OriginalConsulResponse<T> originalConsulResponse) {
+
+ try {
+ // get header
+ ConsulResponseHeader consulResponseHeader = Http
+ .consulResponseHeader(originalConsulResponse
+ .getResponse());
+
+ if (consulResponseHeader.isKnownLeader()) {
+ if (!isRunning()) {
+ return;
+ }
+
+ boolean isConuslIndexChanged = isConuslIndexChanged(consulResponseHeader
+ .getIndex());
+ // consul index different
+ if (isConuslIndexChanged) {
+
+ updateIndex(consulResponseHeader.getIndex());
+
+ // get T type data
+ ConsulResponse<T> consulResponse = Http
+ .consulResponse(originalConsulResponse
+ .getResponseType(),
+ originalConsulResponse
+ .getResponse());
+
+ // notify customer to custom T data
+ for (Listener<T> l : listeners) {
+ l.notify(consulResponse);
+ }
+ }
+
+ if (state.compareAndSet(State.starting, State.started)) {
+ initLatch.countDown();
+ }
+
+ runCallback();
+
+ } else {
+ onFailure(new ConsulException(
+ "Consul cluster has no elected leader"));
+ }
+ } catch (Exception e) {
+ onFailure(e);
+ }
+
+ }
+
+ @Override
+ public void onFailure(Throwable throwable) {
+
+ if (!isRunning()) {
+ return;
+ }
+ LOGGER.error(
+ String.format(
+ "Error getting response from consul. will retry in %d %s",
+ BACKOFF_DELAY_QTY_IN_MS, TimeUnit.MILLISECONDS),
+ throwable);
+
+ executorService.schedule(new Runnable() {
+ @Override
+ public void run() {
+ runCallback();
+ }
+ }, BACKOFF_DELAY_QTY_IN_MS, TimeUnit.MILLISECONDS);
+ }
+ };
+ }
+
+ @VisibleForTesting
+ static long getBackOffDelayInMs(Properties properties) {
+ String backOffDelay = null;
+ try {
+ backOffDelay = properties.getProperty(BACKOFF_DELAY_PROPERTY);
+ if (!Strings.isNullOrEmpty(backOffDelay)) {
+ return Long.parseLong(backOffDelay);
+ }
+ } catch (Exception ex) {
+ LOGGER.warn(
+ backOffDelay != null ? String.format(
+ "Error parsing property variable %s: %s",
+ BACKOFF_DELAY_PROPERTY, backOffDelay) : String
+ .format("Error extracting property variable %s",
+ BACKOFF_DELAY_PROPERTY), ex);
+ }
+ return TimeUnit.SECONDS.toMillis(10);
+ }
+
+ public void start() throws Exception {
+ checkState(state.compareAndSet(State.latent, State.starting),
+ "Cannot transition from state %s to %s", state.get(),
+ State.starting);
+ runCallback();
+ }
+
+ public void stop() throws Exception {
+ State previous = state.getAndSet(State.stopped);
+ if (previous != State.stopped) {
+ executorService.shutdownNow();
+ }
+ }
+
+ private void runCallback() {
+ if (isRunning()) {
+ callBackConsumer.consume(latestIndex.get(), responseCallback);
+ }
+ }
+
+ private boolean isRunning() {
+ return state.get() == State.started || state.get() == State.starting;
+ }
+
+ public boolean awaitInitialized(long timeout, TimeUnit unit)
+ throws InterruptedException {
+ return initLatch.await(timeout, unit);
+ }
+
+ private void updateIndex(ConsulResponse<T> consulResponse) {
+ if (consulResponse != null && consulResponse.getIndex() != null) {
+ this.latestIndex.set(consulResponse.getIndex());
+ }
+ }
+
+ public void updateIndex(BigInteger index) {
+ if (index != null) {
+ this.latestIndex.set(index);
+ }
+ }
+
+ protected static QueryOptions watchParams(final BigInteger index,
+ final int blockSeconds, QueryOptions queryOptions) {
+ checkArgument(!queryOptions.getIndex().isPresent()
+ && !queryOptions.getWait().isPresent(),
+ "Index and wait cannot be overridden");
+
+ return ImmutableQueryOptions.builder()
+ .from(watchDefaultParams(index, blockSeconds))
+ .token(queryOptions.getToken())
+ .consistencyMode(queryOptions.getConsistencyMode())
+ .near(queryOptions.getNear()).build();
+ }
+
+ private static QueryOptions watchDefaultParams(final BigInteger index,
+ final int blockSeconds) {
+ if (index == null) {
+ return QueryOptions.BLANK;
+ } else {
+ return QueryOptions.blockSeconds(blockSeconds, index).build();
+ }
+ }
+
+ /**
+ * passed in by creators to vary the content of the cached values
+ *
+ * @param <V>
+ */
+ protected interface CallbackConsumer<T> {
+ void consume(BigInteger index, ConsulResponseCallback<T> callback);
+ }
+
+ /**
+ * Implementers can register a listener to receive a new map when it changes
+ *
+ * @param <V>
+ */
+ public interface Listener<T> {
+ void notify(ConsulResponse<T> newValues);
+ }
+
+ public boolean addListener(Listener<T> listener) {
+ boolean added = listeners.add(listener);
+ return added;
+ }
+
+ public List<Listener<T>> getListeners() {
+ return Collections.unmodifiableList(listeners);
+ }
+
+ public boolean removeListener(Listener<T> listener) {
+ return listeners.remove(listener);
+ }
+
+ @VisibleForTesting
+ protected State getState() {
+ return state.get();
+ }
+
+ private boolean isConuslIndexChanged(final BigInteger index) {
+
+ if (index != null && !index.equals(latestIndex.get())) {
+
+ if (LOGGER.isDebugEnabled()) {
+ // 第一次ä¸æ‰“å°
+ if (latestIndex.get() != null) {
+ LOGGER.debug("consul index compare:new-" + index + " old-"
+ + latestIndex.get());
+ }
+
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServiceHealthCache.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServiceHealthCache.java
new file mode 100644
index 0000000..b46ffce
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServiceHealthCache.java
@@ -0,0 +1,65 @@
+package org.onap.msb.apiroute.wrapper.consulextend.cache;
+
+import java.math.BigInteger;
+import java.util.List;
+
+import org.onap.msb.apiroute.wrapper.consulextend.HealthClient;
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseCallback;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+
+import com.orbitz.consul.option.CatalogOptions;
+import com.orbitz.consul.option.QueryOptions;
+
+public class ServiceHealthCache extends ConsulCache<List<ServiceHealth>> {
+ private ServiceHealthCache(CallbackConsumer<List<ServiceHealth>> callbackConsumer) {
+ super(callbackConsumer);
+ }
+
+ /**
+ * Factory method to construct a string/{@link ServiceHealth} map for a particular service.
+ * <p/>
+ * Keys will be a {@link HostAndPort} object made up of the service's address/port combo
+ *
+ * @param healthClient the {@link HealthClient}
+ * @param serviceName the name of the service
+ * @param passing include only passing services?
+ * @return a cache object
+ */
+ public static ServiceHealthCache newCache(
+ final HealthClient healthClient,
+ final String serviceName,
+ final boolean passing,
+ final CatalogOptions catalogOptions,
+ final int watchSeconds,
+ final QueryOptions queryOptions) {
+
+ CallbackConsumer<List<ServiceHealth>> callbackConsumer = new CallbackConsumer<List<ServiceHealth>>() {
+ @Override
+ public void consume(BigInteger index,
+ ConsulResponseCallback<List<ServiceHealth>> callback) {
+ // TODO Auto-generated method stub
+ QueryOptions params = watchParams(index, watchSeconds, queryOptions);
+ if (passing) {
+ healthClient.getHealthyServiceInstances(serviceName, catalogOptions, params, callback);
+ } else {
+ healthClient.getAllServiceInstances(serviceName, catalogOptions, params, callback);
+ }
+ }
+ };
+
+ return new ServiceHealthCache(callbackConsumer);
+ }
+
+ public static ServiceHealthCache newCache(
+ final HealthClient healthClient,
+ final String serviceName,
+ final boolean passing,
+ final CatalogOptions catalogOptions,
+ final int watchSeconds) {
+ return newCache(healthClient, serviceName, passing, catalogOptions, watchSeconds, QueryOptions.BLANK);
+ }
+
+ public static ServiceHealthCache newCache(final HealthClient healthClient, final String serviceName) {
+ return newCache(healthClient, serviceName, true, CatalogOptions.BLANK, 10);
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServicesCatalogCache.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServicesCatalogCache.java
new file mode 100644
index 0000000..08c7369
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServicesCatalogCache.java
@@ -0,0 +1,39 @@
+package org.onap.msb.apiroute.wrapper.consulextend.cache;
+
+import java.math.BigInteger;
+
+import org.apache.http.HttpEntity;
+import org.onap.msb.apiroute.wrapper.consulextend.CatalogClient;
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseCallback;
+
+import com.orbitz.consul.option.CatalogOptions;
+import com.orbitz.consul.option.QueryOptions;
+
+public class ServicesCatalogCache extends ConsulCache<HttpEntity> {
+
+ private ServicesCatalogCache(CallbackConsumer<HttpEntity> callbackConsumer) {
+ super(callbackConsumer);
+ }
+
+ public static ServicesCatalogCache newCache(
+ final CatalogClient catalogClient,
+ final CatalogOptions catalogOptions,
+ final QueryOptions queryOptions,
+ final int watchSeconds) {
+
+ CallbackConsumer<HttpEntity> callbackConsumer = new CallbackConsumer<HttpEntity>() {
+ @Override
+ public void consume(BigInteger index, ConsulResponseCallback<HttpEntity> callback) {
+ QueryOptions params = watchParams(index, watchSeconds, queryOptions);
+ catalogClient.getServices(catalogOptions, params,callback);
+ }
+ };
+
+ return new ServicesCatalogCache(callbackConsumer);
+
+ }
+
+ public static ServicesCatalogCache newCache(final CatalogClient catalogClient) {
+ return newCache(catalogClient, CatalogOptions.BLANK, QueryOptions.BLANK, 10);
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckServiceDataEmptyAndAutoStopWatchFilter.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckServiceDataEmptyAndAutoStopWatchFilter.java
new file mode 100644
index 0000000..01b5168
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckServiceDataEmptyAndAutoStopWatchFilter.java
@@ -0,0 +1,98 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onap.msb.apiroute.SyncDataManager;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableService;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableServiceHealth;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.Service;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.queue.QueueManager;
+import org.onap.msb.apiroute.wrapper.queue.ServiceData;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.orbitz.consul.model.ConsulResponse;
+import com.orbitz.consul.model.health.ImmutableNode;
+
+
+
+public class CheckServiceDataEmptyAndAutoStopWatchFilter implements
+ WatchTask.Filter<List<ServiceHealth>> {
+
+ private final static Logger LOGGER = LoggerFactory
+ .getLogger(CheckServiceDataEmptyAndAutoStopWatchFilter.class);
+ private final String serviceName;
+
+ public CheckServiceDataEmptyAndAutoStopWatchFilter(
+ final String serviceName) {
+ this.serviceName = serviceName;
+ }
+
+ @Override
+ public boolean filter(ConsulResponse<List<ServiceHealth>> object) {
+ // TODO Auto-generated method stub
+ boolean result = check(object);
+
+ if (!result) {
+ // create delete
+ writeServiceToQueue4Del();
+ // stop watch
+ SyncDataManager.stopWatchService(serviceName);
+ }
+
+ return result;
+ }
+
+ // when:
+ // 1)service had been deleted
+ // 2)service Health check was not passing
+ // single service return [],size==0
+ // stop this service watching task and create delete event
+ private boolean check(ConsulResponse<List<ServiceHealth>> object) {
+ boolean result = true;
+
+ if (object == null || object.getResponse() == null
+ || object.getResponse().size() == 0) {
+ LOGGER.info("check service-{},its data is empty",
+ serviceName);
+ return false;
+ }
+
+ return result;
+ }
+
+ private void writeServiceToQueue4Del() {
+ ServiceData<List<ServiceHealth>> data = new ServiceData<List<ServiceHealth>>();
+ data.setDataType(ServiceData.DataType.service);
+ data.setOperate(ServiceData.Operate.delete);
+
+ // tell the subsequent operation the service name which will be deleted
+ Service service = ImmutableService.builder().id("").port(0).address("")
+ .service(serviceName).addTags("").createIndex(0).modifyIndex(0).build();
+ ServiceHealth serviceHealth = ImmutableServiceHealth.builder()
+ .service(service)
+ .node(ImmutableNode.builder().node("").address("").build())
+ .build();
+ List<ServiceHealth> serviceHealthList = new ArrayList<ServiceHealth>();
+ serviceHealthList.add(serviceHealth);
+
+ data.setData(serviceHealthList);
+
+ LOGGER.info("put delete service["
+ + serviceName
+ + "] to service queue :because of deleted ");
+
+ try {
+ QueueManager.getInstance().putIn(data);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ LOGGER.warn(
+ "put delete service["
+ + serviceName
+ + "] to service queue interrupted because of deleted:",
+ e);
+ }
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckTagAndAutoStopWatchFilter.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckTagAndAutoStopWatchFilter.java
new file mode 100644
index 0000000..311edce
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckTagAndAutoStopWatchFilter.java
@@ -0,0 +1,96 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onap.msb.apiroute.SyncDataManager;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.queue.QueueManager;
+import org.onap.msb.apiroute.wrapper.queue.ServiceData;
+import org.onap.msb.apiroute.wrapper.queue.ServiceData.Operate;
+import org.onap.msb.apiroute.wrapper.util.ServiceFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.orbitz.consul.model.ConsulResponse;
+
+public class CheckTagAndAutoStopWatchFilter implements
+ WatchTask.Filter<List<ServiceHealth>> {
+
+ private final static Logger LOGGER = LoggerFactory
+ .getLogger(CheckTagAndAutoStopWatchFilter.class);
+
+ private final String serviceName;
+
+ public CheckTagAndAutoStopWatchFilter(final String serviceName) {
+ this.serviceName = serviceName;
+ }
+
+ // from consul,the response data:List<ServiceHealth>
+ // filter ServiceHealth list and find the ServiceHealths which satisfy the
+ // tags conditions
+ // 1)if all ServiceHealth don't satisfy,create delete event and stop watch
+ // 2)if have some ServiceHealths satisfy the tags conditions,create update
+ // event and send these ServiceHealths
+ @Override
+ public boolean filter(ConsulResponse<List<ServiceHealth>> object) {
+ // TODO Auto-generated method stub
+
+ // find #ServiceHealth# which satisfy the tag conditions
+ List<ServiceHealth> satisfyList = getSatisfyList(object);
+
+ // no satisfied ServiceHealth
+ if (satisfyList.isEmpty()) {
+
+ LOGGER.info("put delete service["
+ + serviceName
+ + "] to service queue :because of NO tag meet the conditions");
+
+ // create delete
+ writeServiceToQueue(object.getResponse(),
+ ServiceData.Operate.delete);
+ // stop watch
+ //SyncDataManager.stopWatchService(serviceName);
+ return false;
+ }
+
+ LOGGER.info("put update service["
+ + serviceName
+ + "] to service queue :which tags meet the conditions");
+
+ // put the satisfy list to queue
+ writeServiceToQueue(satisfyList, ServiceData.Operate.update);
+
+ return true;
+ }
+
+ private List<ServiceHealth> getSatisfyList(
+ ConsulResponse<List<ServiceHealth>> object) {
+ List<ServiceHealth> satisfyList = new ArrayList<ServiceHealth>();
+ for (ServiceHealth health : object.getResponse()) {
+
+ if (ServiceFilter.getInstance().isFilterCheck(health)) {
+ satisfyList.add(health);
+ }
+ }
+
+ return satisfyList;
+ }
+
+ private void writeServiceToQueue(List<ServiceHealth> serviceData,
+ Operate operate) {
+ ServiceData<List<ServiceHealth>> data = new ServiceData<List<ServiceHealth>>();
+ data.setOperate(operate);
+ data.setDataType(ServiceData.DataType.service);
+ data.setData(serviceData);
+
+
+ try {
+ QueueManager.getInstance().putIn(data);
+ } catch (InterruptedException e) {
+ LOGGER.warn("put " + operate + " service[" + serviceName
+ + "] to service queue interrupted ", e);
+ }
+
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ConsulIndexFilter.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ConsulIndexFilter.java
new file mode 100644
index 0000000..14ab2c7
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ConsulIndexFilter.java
@@ -0,0 +1,48 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.math.BigInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.orbitz.consul.model.ConsulResponse;
+
+public class ConsulIndexFilter<T> implements WatchTask.Filter<T> {
+
+ private final static Logger LOGGER = LoggerFactory
+ .getLogger(ConsulIndexFilter.class);
+
+ private final AtomicReference<BigInteger> latestIndex = new AtomicReference<BigInteger>(
+ null);
+
+ @Override
+ public boolean filter(final ConsulResponse<T> object) {
+ // TODO Auto-generated method stub
+ return isChanged(object);
+ }
+
+ private boolean isChanged(final ConsulResponse<T> consulResponse) {
+
+ if (consulResponse != null && consulResponse.getIndex() != null
+ && !consulResponse.getIndex().equals(latestIndex.get())) {
+
+ if(LOGGER.isDebugEnabled()){
+ //第一次ä¸æ‰“å°
+ if (latestIndex.get()!=null) {
+ LOGGER.debug("consul index compare:new-"
+ + consulResponse.getIndex() + " old-"
+ + latestIndex.get());
+ }
+
+ }
+
+ this.latestIndex.set(consulResponse.getIndex());
+ return true;
+ }
+
+ return false;
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ServiceModifyIndexFilter.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ServiceModifyIndexFilter.java
new file mode 100644
index 0000000..38fb7c6
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ServiceModifyIndexFilter.java
@@ -0,0 +1,121 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.Service;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.util.ServiceFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ImmutableList;
+import com.orbitz.consul.model.ConsulResponse;
+import com.orbitz.consul.model.health.HealthCheck;
+
+public class ServiceModifyIndexFilter implements WatchTask.Filter<List<ServiceHealth>> {
+
+ private final AtomicReference<ImmutableList<ServiceHealth>> lastResponse =
+ new AtomicReference<ImmutableList<ServiceHealth>>(ImmutableList.<ServiceHealth>of());
+
+ private final static Logger LOGGER = LoggerFactory.getLogger(ServiceModifyIndexFilter.class);
+
+
+ @Override
+ public boolean filter(ConsulResponse<List<ServiceHealth>> object) {
+ // TODO Auto-generated method stub
+
+ List<ServiceHealth> newList=object.getResponse();
+ if(realFilter(newList)){
+ lastResponse.set(ImmutableList.copyOf(newList));
+ return true;
+ }
+
+ return false;
+ }
+
+ private boolean realFilter(List<ServiceHealth> newList) {
+ // 1)判断listçš„size,ä¸ç­‰åˆ™æ”¹å˜
+ if (newList.size() != lastResponse.get().size()) {
+ // 第一次ä¸æ‰“å°
+ if (lastResponse.get().size() != 0) {
+ LOGGER.info(newList.get(0).getService().getService()
+ + " instance count is different.new_count:" + newList.size() + " old_count:"
+ + lastResponse.get().size());
+ }
+
+ return true;
+ }
+
+
+ // 2)循环æœåŠ¡å®žä¾‹åˆ¤æ–­æœåŠ¡å†…容和å¥åº·æ£€æŸ¥æ˜¯å¦æ”¹å˜
+ for (ServiceHealth newData : newList) {
+ ServiceHealth sameIdOldData = findSameIdInOldList(newData);
+ // 若在oldlist中ä¸å­˜åœ¨ï¼Œåˆ™æ”¹å˜
+ if (sameIdOldData == null) {
+
+ LOGGER.info(newData.getService().getId()
+ + " is a new service instance.the createindex:"
+ + newData.getService().getCreateIndex()
+ + " the modifyIndex:"
+ + newData.getService().getModifyIndex());
+
+ return true;
+ }
+
+ // 若在oldlist中存在,则比较ModifyIndex的值和å¥åº·æ£€æŸ¥çŠ¶æ€.ä¸ç­‰åˆ™æ”¹å˜
+ if(!compareService(newData,sameIdOldData)){
+ LOGGER.info(newData.getService().getId() +" instance is change because of modifyIndex or health check" );
+ return true;
+ }
+ }
+
+ return false;
+
+
+ }
+
+
+ private boolean compareService(ServiceHealth oldData,ServiceHealth newData) {
+
+ return compareServiceInfo(oldData.getService(),newData.getService()) &&
+ compareServiceHealthStatus(oldData.getChecks(),newData.getChecks());
+
+ }
+
+
+
+ private boolean compareServiceInfo(Service oldServiceInfo, Service newServiceInfo) {
+ if (oldServiceInfo.getModifyIndex() != newServiceInfo.getModifyIndex()) {
+ LOGGER.info(newServiceInfo.getId() + " new_modifyIndex:"
+ + newServiceInfo.getModifyIndex() + " old_modifyIndex:"
+ + oldServiceInfo.getModifyIndex());
+ return false;
+ }
+ return true;
+ }
+
+ private boolean compareServiceHealthStatus(List<HealthCheck> oldData, List<HealthCheck> newData) {
+ boolean oldHealthCheck=ServiceFilter.getInstance().isFilterHealthCheck(oldData);
+ boolean newHealthCheck=ServiceFilter.getInstance().isFilterHealthCheck(newData);
+ return oldHealthCheck==newHealthCheck;
+
+ }
+
+
+ private ServiceHealth findSameIdInOldList(ServiceHealth newData) {
+ for (ServiceHealth oldData : lastResponse.get()) {
+ if (oldData.getService().getId().equals(newData.getService().getId())) {
+ return oldData;
+ }
+ }
+
+ return null;
+ }
+
+ public boolean resetModifyIndex() {
+ // clear last response
+ lastResponse.set(ImmutableList.<ServiceHealth>of());
+ return true;
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchCatalogServicesTask.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchCatalogServicesTask.java
new file mode 100644
index 0000000..c21295f
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchCatalogServicesTask.java
@@ -0,0 +1,90 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import org.apache.http.HttpEntity;
+import org.onap.msb.apiroute.wrapper.consulextend.CatalogClient;
+import org.onap.msb.apiroute.wrapper.consulextend.cache.ServicesCatalogCache;
+import org.onap.msb.apiroute.wrapper.consulextend.cache.ConsulCache.Listener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.orbitz.consul.option.CatalogOptions;
+import com.orbitz.consul.option.QueryOptions;
+
+public class WatchCatalogServicesTask extends WatchTask<HttpEntity> {
+
+ private final static Logger LOGGER = LoggerFactory
+ .getLogger(WatchCatalogServicesTask.class);
+
+ private ServicesCatalogCache servicesCache = null;
+
+ public WatchCatalogServicesTask(
+ final CatalogClient catalogClient,
+ final CatalogOptions catalogOptions,
+ final QueryOptions queryOptions,
+ final int watchSeconds)
+ {
+ initCache(catalogClient,catalogOptions,queryOptions,watchSeconds);
+ }
+
+ public WatchCatalogServicesTask(
+ final CatalogClient catalogClient,
+ final int watchSeconds)
+ {
+ initCache(catalogClient,CatalogOptions.BLANK,QueryOptions.BLANK,watchSeconds);
+ }
+
+ public WatchCatalogServicesTask(
+ final CatalogClient catalogClient)
+ {
+ initCache(catalogClient,CatalogOptions.BLANK,QueryOptions.BLANK,10);
+ }
+
+ private ServicesCatalogCache initCache(final CatalogClient catalogClient,
+ final CatalogOptions catalogOptions,
+ final QueryOptions queryOptions,
+ final int watchSeconds) {
+ LOGGER.info("************create all services watch task*****************");
+ servicesCache = ServicesCatalogCache.newCache(catalogClient,
+ catalogOptions, queryOptions, watchSeconds);
+
+ servicesCache
+ .addListener((Listener<HttpEntity>) new InternalListener());
+
+ return servicesCache;
+ }
+
+ @Override
+ public boolean startWatch() {
+ // TODO Auto-generated method stub
+ if(servicesCache!=null)
+ {
+ try {
+ servicesCache.start();
+ LOGGER.info("************start all services watch task*****************");
+ return true;
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.warn("start service list watch failed:", e);
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean stopWatch() {
+ // TODO Auto-generated method stub
+ if (servicesCache != null) {
+ try {
+ servicesCache.stop();
+ LOGGER.info("************stop all services watch task*****************");
+ return true;
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.warn("stop service list watch failed:", e);
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchServiceHealthTask.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchServiceHealthTask.java
new file mode 100644
index 0000000..b0d64a7
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchServiceHealthTask.java
@@ -0,0 +1,128 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.math.BigInteger;
+import java.util.List;
+
+import org.onap.msb.apiroute.wrapper.consulextend.HealthClient;
+import org.onap.msb.apiroute.wrapper.consulextend.cache.ServiceHealthCache;
+import org.onap.msb.apiroute.wrapper.consulextend.cache.ConsulCache.Listener;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.orbitz.consul.option.CatalogOptions;
+import com.orbitz.consul.option.QueryOptions;
+
+public class WatchServiceHealthTask extends WatchTask<List<ServiceHealth>> {
+ private final static Logger LOGGER = LoggerFactory
+ .getLogger(WatchServiceHealthTask.class);
+
+ private ServiceHealthCache serviceHealthCache = null;
+ private String serviceName="";
+
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ public WatchServiceHealthTask(final HealthClient healthClient,
+ final String serviceName,final boolean passing,
+ final CatalogOptions catalogOptions, final int watchSeconds,
+ final QueryOptions queryOptions) {
+ initCache(healthClient, serviceName, passing, catalogOptions,
+ watchSeconds, queryOptions);
+ }
+
+ public WatchServiceHealthTask(final HealthClient healthClient,
+ final String serviceName,final boolean passing,
+ final int watchSeconds)
+
+ {
+ initCache(healthClient, serviceName, passing, CatalogOptions.BLANK,
+ watchSeconds, QueryOptions.BLANK);
+ }
+
+ public WatchServiceHealthTask(final HealthClient healthClient,
+ final String serviceName, final int watchSeconds)
+
+ {
+ initCache(healthClient, serviceName, true, CatalogOptions.BLANK,
+ watchSeconds, QueryOptions.BLANK);
+ }
+
+ private ServiceHealthCache initCache(final HealthClient healthClient,
+ final String serviceName,final boolean passing,
+ final CatalogOptions catalogOptions, final int watchSeconds,
+ final QueryOptions queryOptions) {
+// LOGGER.info("************create {} watch task*****************",serviceName);
+ this.serviceName = serviceName;
+ serviceHealthCache = ServiceHealthCache.newCache(healthClient,
+ serviceName, passing, catalogOptions, watchSeconds,
+ queryOptions);
+
+ serviceHealthCache
+ .addListener((Listener<List<ServiceHealth>>) new InternalListener());
+
+ return serviceHealthCache;
+ }
+
+ public boolean startWatch() {
+
+ if(serviceHealthCache!=null)
+ {
+ try {
+ serviceHealthCache.start();
+ LOGGER.info("************start {} watch task*****************",serviceName);
+ return true;
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.warn("start service watch failed:", e);
+ }
+ }
+
+ return false;
+
+ }
+
+ public boolean stopWatch(){
+ if (serviceHealthCache != null) {
+ try {
+ serviceHealthCache.stop();
+ LOGGER.info("************stop {} watch task*****************",serviceName);
+ return true;
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.warn("stop service watch failed:", e);
+ }
+ }
+
+ return false;
+ }
+
+
+ public boolean resetIndex()
+ {
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("reset " + serviceName + " consul index");
+ }
+
+ //reset consul index
+ serviceHealthCache.updateIndex(BigInteger.valueOf(0));
+
+
+ //reset modify index
+ for (WatchTask.Filter<List<ServiceHealth>> filter : getAllFilters()) {
+ if (filter instanceof ServiceModifyIndexFilter) {
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("reset " + serviceName + " modify index");
+ }
+ return ((ServiceModifyIndexFilter) filter).resetModifyIndex();
+ }
+ }
+
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("reset modify index.did not find filter:" + serviceName);
+ }
+
+ return false;
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchTask.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchTask.java
new file mode 100644
index 0000000..2ada19d
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchTask.java
@@ -0,0 +1,87 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.onap.msb.apiroute.wrapper.consulextend.cache.ConsulCache;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.orbitz.consul.model.ConsulResponse;
+
+public abstract class WatchTask<T> {
+ private final CopyOnWriteArrayList<Filter<T>> filters = new CopyOnWriteArrayList<Filter<T>>();
+ private final CopyOnWriteArrayList<Handler<T>> handlers = new CopyOnWriteArrayList<Handler<T>>();
+ private final static Logger LOGGER = LoggerFactory
+ .getLogger(WatchTask.class);
+
+ //start
+ public abstract boolean startWatch();
+
+ //stop
+ public abstract boolean stopWatch();
+
+ // filters
+ public interface Filter<T> {
+ public boolean filter(final ConsulResponse<T> object);
+ }
+
+ public boolean addFilter(Filter<T> filter) {
+ boolean added = filters.add(filter);
+ return added;
+ }
+
+ public void removeAllFilter() {
+ filters.clear();
+ }
+
+
+ public final CopyOnWriteArrayList<Filter<T>> getAllFilters(){
+ return filters;
+ }
+
+ // handlers
+ public interface Handler<T> {
+ void handle(final ConsulResponse<T> object);
+ }
+
+ public boolean addHandler(Handler<T> handler) {
+ boolean added = handlers.add(handler);
+ return added;
+ }
+
+ public void removeAllHandler() {
+ handlers.clear();
+ }
+
+ // internal listener
+ protected class InternalListener implements ConsulCache.Listener<T> {
+ @Override
+ public void notify(ConsulResponse<T> newValues) {
+
+ long startTime = System.currentTimeMillis();
+
+ // filter
+ for (Filter<T> f : filters) {
+ // false,return
+ if (!f.filter(newValues)) {
+ return;
+ }
+ }
+
+ // handle
+ for (Handler<T> h : handlers) {
+ h.handle(newValues);
+ }
+
+ long endTime = System.currentTimeMillis();
+
+ if(endTime-startTime > 10*1000)
+ {
+ LOGGER.info("WatchTask THEAD WORK TIMEOUT");
+ }
+ }
+
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WriteBufferHandler.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WriteBufferHandler.java
new file mode 100644
index 0000000..6df10e3
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WriteBufferHandler.java
@@ -0,0 +1,36 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import org.onap.msb.apiroute.wrapper.queue.QueueManager;
+import org.onap.msb.apiroute.wrapper.queue.ServiceData;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.orbitz.consul.model.ConsulResponse;
+
+public class WriteBufferHandler<T> implements WatchTask.Handler<T> {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(WriteBufferHandler.class);
+ private final ServiceData.DataType dataType;
+
+
+ public WriteBufferHandler(final ServiceData.DataType dataType) {
+ this.dataType =dataType;
+ }
+
+ @Override
+ public void handle(ConsulResponse<T> object) {
+ // TODO Auto-generated method stub
+ ServiceData<T> data = new ServiceData<T>();
+ data.setDataType(dataType);
+ data.setData(object.getResponse());
+
+ try {
+ QueueManager.getInstance().putIn(data);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ LOGGER.warn("put data to buffer interrupted:", e);
+ }
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/Service.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/Service.java
new file mode 100644
index 0000000..fd7f3fa
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/Service.java
@@ -0,0 +1,39 @@
+package org.onap.msb.apiroute.wrapper.consulextend.model.health;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.google.common.collect.ImmutableList;
+import org.immutables.value.Value;
+
+import java.util.List;
+
+@Value.Immutable
+@JsonSerialize(as = ImmutableService.class)
+@JsonDeserialize(as = ImmutableService.class)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public abstract class Service {
+
+ @JsonProperty("ID")
+ public abstract String getId();
+
+ @JsonProperty("Service")
+ public abstract String getService();
+
+ @JsonProperty("Tags")
+ @JsonDeserialize(as = ImmutableList.class, contentAs = String.class)
+ public abstract List<String> getTags();
+
+ @JsonProperty("Address")
+ public abstract String getAddress();
+
+ @JsonProperty("Port")
+ public abstract int getPort();
+
+ @JsonProperty("CreateIndex")
+ public abstract int getCreateIndex();
+
+ @JsonProperty("ModifyIndex")
+ public abstract int getModifyIndex();
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/ServiceHealth.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/ServiceHealth.java
new file mode 100644
index 0000000..a739b4b
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/ServiceHealth.java
@@ -0,0 +1,30 @@
+package org.onap.msb.apiroute.wrapper.consulextend.model.health;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.google.common.collect.ImmutableList;
+import com.orbitz.consul.model.health.HealthCheck;
+import com.orbitz.consul.model.health.Node;
+
+import org.immutables.value.Value;
+
+import java.util.List;
+@Value.Immutable
+@JsonSerialize(as = ImmutableServiceHealth.class)
+@JsonDeserialize(as = ImmutableServiceHealth.class)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public abstract class ServiceHealth {
+
+ @JsonProperty("Node")
+ public abstract Node getNode();
+
+ @JsonProperty("Service")
+ public abstract Service getService();
+
+ @JsonProperty("Checks")
+ @JsonDeserialize(as = ImmutableList.class, contentAs = HealthCheck.class)
+ public abstract List<HealthCheck> getChecks();
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/util/Http.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/util/Http.java
new file mode 100644
index 0000000..9f0980c
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/util/Http.java
@@ -0,0 +1,281 @@
+package org.onap.msb.apiroute.wrapper.consulextend.util;
+
+import java.io.IOException;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.math.BigInteger;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.concurrent.FutureCallback;
+import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
+import org.apache.http.impl.nio.client.HttpAsyncClients;
+import org.eclipse.jetty.http.HttpStatus;
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseCallback;
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseHeader;
+import org.onap.msb.apiroute.wrapper.consulextend.async.OriginalConsulResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+import com.orbitz.consul.ConsulException;
+import com.orbitz.consul.model.ConsulResponse;
+import com.orbitz.consul.option.CatalogOptions;
+import com.orbitz.consul.option.QueryOptions;
+import com.orbitz.consul.util.Jackson;
+
+public class Http {
+ private static final Logger LOGGER = LoggerFactory.getLogger(Http.class);
+
+ private final static CloseableHttpAsyncClient httpAsyncClient = HttpAsyncClients
+ .custom().setMaxConnTotal(Integer.MAX_VALUE)
+ .setMaxConnPerRoute(Integer.MAX_VALUE).build();
+
+ private static Http instance = null;
+
+ private Http() {
+ }
+
+ public static Http getInstance() {
+ if (instance == null) {
+ instance = new Http();
+ httpAsyncClient.start();
+ }
+
+ return instance;
+ }
+
+ // async get data from consul,and handle response immediately
+ public <T> void asyncGet(String requestURI,
+ final TypeReference<T> responseType,
+ final ConsulResponseCallback<T> callback, final Integer... okCodes) {
+ // LOGGER.info("Async request:"+requestURI);
+
+ httpAsyncClient.execute(new HttpGet(requestURI),
+ new FutureCallback<HttpResponse>() {
+
+ public void completed(final HttpResponse response) {
+ callback.onComplete(consulResponse(responseType,
+ response));
+ }
+
+ public void failed(final Exception ex) {
+ callback.onFailure(ex);
+ }
+
+ public void cancelled() {
+ LOGGER.warn("cancelled async request");
+ }
+ });
+ }
+
+ // async get data from consul,and handle response delay
+ public <T> void asyncGetDelayHandle(String requestURI,
+ final TypeReference<T> responseType,
+ final ConsulResponseCallback<T> callback, final Integer... okCodes) {
+
+ httpAsyncClient.execute(new HttpGet(requestURI),
+ new FutureCallback<HttpResponse>() {
+
+ public void completed(final HttpResponse response) {
+ OriginalConsulResponse<T> originalConsulResponse = new OriginalConsulResponse<T>(
+ response, responseType);
+
+ //handle not 2xx code
+ if (!isSuccessful(response)) {
+
+ LOGGER.warn("response statuscode:"
+ + response.getStatusLine().getStatusCode());
+
+ callback.onFailure(new ConsulException(
+ "response statuscode:"
+ + response.getStatusLine()
+ .getStatusCode()));
+ } else {
+ callback.onDelayComplete(originalConsulResponse);
+ }
+
+ }
+
+ public void failed(final Exception ex) {
+ callback.onFailure(ex);
+ }
+
+ public void cancelled() {
+ LOGGER.warn("cancelled async request");
+ }
+ });
+ }
+
+ public static ConsulResponseHeader consulResponseHeader(
+ HttpResponse response) {
+ String indexHeaderValue = response.getFirstHeader("X-Consul-Index")
+ .getValue();
+ String lastContactHeaderValue = response.getFirstHeader(
+ "X-Consul-Lastcontact").getValue();
+ String knownLeaderHeaderValue = response.getFirstHeader(
+ "X-Consul-Knownleader").getValue();
+
+ BigInteger index = indexHeaderValue == null ? new BigInteger("0")
+ : new BigInteger(indexHeaderValue);
+ long lastContact = lastContactHeaderValue == null ? 0 : Long
+ .parseLong(lastContactHeaderValue);
+ boolean knownLeader = knownLeaderHeaderValue == null ? false : Boolean
+ .parseBoolean(knownLeaderHeaderValue);
+
+ return new ConsulResponseHeader(lastContact, knownLeader, index);
+ }
+
+ public static <T> ConsulResponse<T> consulResponse(
+ TypeReference<T> responseType, HttpResponse response) {
+
+ String indexHeaderValue = response.getFirstHeader("X-Consul-Index")
+ .getValue();
+ String lastContactHeaderValue = response.getFirstHeader(
+ "X-Consul-Lastcontact").getValue();
+ String knownLeaderHeaderValue = response.getFirstHeader(
+ "X-Consul-Knownleader").getValue();
+
+ BigInteger index = indexHeaderValue == null ? new BigInteger("0")
+ : new BigInteger(indexHeaderValue);
+ long lastContact = lastContactHeaderValue == null ? 0 : Long
+ .parseLong(lastContactHeaderValue);
+ boolean knownLeader = knownLeaderHeaderValue == null ? false : Boolean
+ .parseBoolean(knownLeaderHeaderValue);
+
+ ConsulResponse<T> consulResponse = new ConsulResponse<T>(readResponse(
+ response, responseType), lastContact, knownLeader, index);
+ return consulResponse;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public static <T> T readResponse(HttpResponse response,
+ TypeReference<T> responseType) {
+
+ // read streamed entity
+ T object;
+
+ // HttpEntity,read original data.
+ Type _type = responseType.getType();
+ if (_type instanceof Class
+ && (((Class) _type).isAssignableFrom(HttpEntity.class))) {
+ object = (T) response.getEntity();
+ return object;
+ }
+
+ // String,read original data.
+ if (_type instanceof Class
+ && (((Class) _type).isAssignableFrom(String.class))) {
+
+ try {
+
+ object = (T) IOUtils
+ .toString(response.getEntity().getContent());
+ response.getEntity().getContent().close();
+
+ } catch (UnsupportedOperationException e) {
+ object = (T) "";
+ LOGGER.warn("covert streamed entity to String exception:", e);
+ } catch (IOException e) {
+ object = (T) "";
+ LOGGER.warn("covert streamed entity to String exception:", e);
+ }
+
+ return object;
+ }
+
+ // change data type
+ try {
+ object = Jackson.MAPPER.readValue(
+ response.getEntity().getContent(), responseType);
+ } catch (IOException e) {
+ LOGGER.warn("covert streamed entity to object exception:", e);
+ object = readDefaultResponse(responseType);
+ }
+
+ return object;
+ }
+
+ @SuppressWarnings("unchecked")
+ public static <T> T readDefaultResponse(TypeReference<T> responseType) {
+ Type _type = responseType.getType();
+ if (_type instanceof ParameterizedType
+ && ((ParameterizedType) _type).getRawType() == List.class) {
+ return (T) ImmutableList.of();
+ } else if (_type instanceof ParameterizedType
+ && ((ParameterizedType) _type).getRawType() == Map.class) {
+ return (T) ImmutableMap.of();
+ } else {
+ // Not sure if this case will be reached, but if it is it'll be nice
+ // to know
+ throw new IllegalStateException(
+ "Cannot determine empty representation for " + _type);
+ }
+ }
+
+ public static boolean isSuccessful(HttpResponse response,
+ Integer... okCodes) {
+ return HttpStatus.isSuccess(response.getStatusLine().getStatusCode())
+ || Sets.newHashSet(okCodes).contains(
+ response.getStatusLine().getStatusCode());
+ }
+
+ public static String optionsFrom(CatalogOptions catalogOptions,
+ QueryOptions queryOptions) {
+ String params = "";
+
+ if (catalogOptions != null) {
+ Map<String, Object> options = catalogOptions.toQuery();
+
+ if (options.containsKey("dc")) {
+ params += "dc=" + options.get("dc");
+ }
+ if (options.containsKey("tag")) {
+ params += params.isEmpty() ? "" : "&";
+ params += "tag=" + options.get("tag");
+ }
+ }
+
+ if (queryOptions != null) {
+ Map<String, Object> options = queryOptions.toQuery();
+
+ if (options.containsKey("consistent")) {
+ params += params.isEmpty() ? "" : "&";
+ params += "consistent=" + options.get("consistent");
+ }
+ if (options.containsKey("stale")) {
+ params += params.isEmpty() ? "" : "&";
+ params += "stale=" + options.get("stale");
+ }
+ if (options.containsKey("wait")) {
+ params += params.isEmpty() ? "" : "&";
+ params += "wait=" + options.get("wait");
+ }
+
+ if (options.containsKey("index")) {
+ params += params.isEmpty() ? "" : "&";
+ params += "index=" + options.get("index");
+ }
+ if (options.containsKey("token")) {
+ params += params.isEmpty() ? "" : "&";
+ params += "token=" + options.get("token");
+ }
+ if (options.containsKey("near")) {
+ params += params.isEmpty() ? "" : "&";
+ params += "near=" + options.get("near");
+ }
+ if (options.containsKey("dc")) {
+ params += params.isEmpty() ? "" : "&";
+ params += "dc=" + options.get("dc");
+ }
+ }
+ return params;
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/DAOConstants.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/DAOConstants.java
new file mode 100644
index 0000000..ab3b3f1
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/DAOConstants.java
@@ -0,0 +1,6 @@
+package org.onap.msb.apiroute.wrapper.dao;
+
+public class DAOConstants {
+ public static final String ROUTE_KIND = "route";
+ public static final String SERVICE_KIND = "service";
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/DAOFactory.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/DAOFactory.java
new file mode 100644
index 0000000..0fb3e14
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/DAOFactory.java
@@ -0,0 +1,18 @@
+package org.onap.msb.apiroute.wrapper.dao;
+
+import org.onap.msb.apiroute.wrapper.dao.route.IRouteDAO;
+import org.onap.msb.apiroute.wrapper.dao.route.RouteDAOImpl;
+import org.onap.msb.apiroute.wrapper.dao.service.IServiceDAO;
+import org.onap.msb.apiroute.wrapper.dao.service.ServiceDAOImpl;
+
+public class DAOFactory {
+ private static final IRouteDAO routeDAO = new RouteDAOImpl();
+ private static final IServiceDAO serviceDAO = new ServiceDAOImpl();
+
+ public static IRouteDAO getRouteDAO(){
+ return routeDAO;
+ }
+ public static IServiceDAO getServiceDAO(){
+ return serviceDAO;
+ }
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/RedisAccessWrapper.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/RedisAccessWrapper.java
new file mode 100644
index 0000000..06799b1
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/RedisAccessWrapper.java
@@ -0,0 +1,133 @@
+package org.onap.msb.apiroute.wrapper.dao;
+
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.ScanParams;
+import redis.clients.jedis.ScanResult;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class RedisAccessWrapper {
+ private static final Logger LOGGER = LoggerFactory.getLogger(RedisAccessWrapper.class);
+ //An iteration starts when the cursor is set to 0
+ private static final String REDIS_SCAN_POINTER_NEW_ITERATION = "0";
+ //An iteration terminated when the cursor returned by the server is 0
+ private static final String REDIS_SCAN_POINTER_ITERATION_END = "0";
+ private static final int REDIS_SCAN_COUNT = 50;
+
+
+ public static void save(String key,String value) throws Exception {
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ jedis.set(key,value);
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+ }
+
+ public static String query(String key) throws Exception {
+ Jedis jedis = null;
+ String value = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ value = jedis.get(key);
+ }finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+ return value;
+ }
+
+ public static long delete(String key) throws Exception {
+ Jedis jedis = null;
+ long reply = 0L;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ reply = jedis.del(key);
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+ return reply;
+ }
+
+ public static boolean isExist(String key) throws Exception {
+ boolean isExist = false;
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ isExist = jedis.exists(key);
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+ return isExist;
+ }
+
+ public static List<String> queryMultiKeys(String keyPattern) throws Exception {
+ Set<String> keySet = filterKeys(keyPattern);
+ List<String> valueList = new ArrayList<>();
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ for(String key : keySet){
+ String value = jedis.get(key);
+ if(value !=null && !"".equals(value)){
+ valueList.add(value);
+ }
+ }
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+ return valueList;
+ }
+
+ public static long deleteMultiKeys(String keyPattern) throws Exception {
+ Set<String> keySet = filterKeys(keyPattern);
+ long replySum = 0L;
+ Jedis jedis = null;
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ for(String key : keySet){
+ long reply = jedis.del(key);
+ replySum = replySum + reply;
+ }
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+ return replySum;
+ }
+
+ /**
+ * filter the keys according to the given pattern
+ * using "scan" instead of using "keys", incrementally iterate the keys space
+ * @param pattern the input filter pattern
+ * @return the matched keys set
+ */
+ public static Set<String> filterKeys(String pattern) throws Exception{
+ long start = System.currentTimeMillis();
+ Jedis jedis = null;
+ Set<String> filteredKeys = new HashSet<>();
+ ScanParams scanParams = new ScanParams();
+ scanParams.match(pattern);
+ scanParams.count(REDIS_SCAN_COUNT);
+ try {
+ jedis = JedisUtil.borrowJedisInstance();
+ ScanResult<String> scanResult = jedis.scan(REDIS_SCAN_POINTER_NEW_ITERATION,scanParams);
+ filteredKeys.addAll(scanResult.getResult());
+ while(!scanResult.getStringCursor().equals(REDIS_SCAN_POINTER_ITERATION_END)){
+ scanResult = jedis.scan(scanResult.getStringCursor(),scanParams);
+ filteredKeys.addAll(scanResult.getResult());
+ }
+ } finally {
+ JedisUtil.returnJedisInstance(jedis);
+ }
+ long end = System.currentTimeMillis();
+ long costTime = end-start;
+ LOGGER.info("filterKeys " + pattern + " count:" + filteredKeys.size() + " cost: " + costTime);
+ return filteredKeys;
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/IRouteDAO.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/IRouteDAO.java
new file mode 100644
index 0000000..f2f51c1
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/IRouteDAO.java
@@ -0,0 +1,18 @@
+package org.onap.msb.apiroute.wrapper.dao.route;
+
+import java.util.List;
+
+import org.onap.msb.apiroute.wrapper.dao.route.bean.RouteInfo;
+
+public interface IRouteDAO {
+ public void saveRoute(String key, RouteInfo routeInfo) throws Exception;
+
+ public RouteInfo queryRoute(String key) throws Exception;
+
+ public List<RouteInfo> queryMultiRoute(String keyPattern) throws Exception;
+
+ public long deleteRoute(String key) throws Exception;
+
+ public long deleteMultiRoute(String keyPattern) throws Exception;
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/RouteDAOImpl.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/RouteDAOImpl.java
new file mode 100644
index 0000000..83e868b
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/RouteDAOImpl.java
@@ -0,0 +1,63 @@
+package org.onap.msb.apiroute.wrapper.dao.route;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.RouteInfo;
+import org.onap.msb.apiroute.wrapper.util.Jackson;
+
+public class RouteDAOImpl implements IRouteDAO{
+ public void saveRoute(String key, RouteInfo routeInfo) throws Exception {
+ String routeInfoStr = null;
+ // change orginal url from “/†to empty string accord to the rewrite rule while forwarding
+ if("/".equals(routeInfo.getSpec().getUrl())){
+ routeInfo.getSpec().setUrl("");
+ }
+ try {
+ routeInfoStr = Jackson.MAPPER.writeValueAsString(routeInfo);
+ } catch (JsonProcessingException e) {
+ throw new Exception("error occurred while parsing RouteInfo to json data",e);
+ }
+ RedisAccessWrapper.save(key, routeInfoStr);
+ }
+
+ public RouteInfo queryRoute(String key) throws Exception {
+ RouteInfo routeInfo = null;
+ String routeInfoStr = RedisAccessWrapper.query(key);
+ if (null == routeInfoStr || "".equals(routeInfoStr))
+ return null;
+ try {
+ routeInfo = Jackson.MAPPER.readValue(routeInfoStr, RouteInfo.class);
+ } catch (IOException e) {
+ throw new Exception("error occurred while parsing the redis json data to RouteInfo",e);
+ }
+ return routeInfo;
+ }
+
+ public List<RouteInfo> queryMultiRoute(String keyPattern) throws Exception {
+ List<String> routeInfoStrList = RedisAccessWrapper.queryMultiKeys(keyPattern);
+ List<RouteInfo> routeInfoList = new ArrayList<>();
+ for (String routeInfoStr : routeInfoStrList) {
+ RouteInfo routeInfo = null;
+ try {
+ routeInfo = Jackson.MAPPER.readValue(routeInfoStr, RouteInfo.class);
+ routeInfoList.add(routeInfo);
+ } catch (IOException e) {
+ throw new Exception("error occurred while parsing the redis json data to RouteInfo",e);
+ }
+ }
+ return routeInfoList;
+ }
+
+ public long deleteRoute(String key) throws Exception {
+ return RedisAccessWrapper.delete(key);
+ }
+
+ public long deleteMultiRoute(String keyPattern) throws Exception{
+ return RedisAccessWrapper.deleteMultiKeys(keyPattern);
+ }
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/Metadata.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/Metadata.java
new file mode 100644
index 0000000..3e11fcc
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/Metadata.java
@@ -0,0 +1,48 @@
+package org.onap.msb.apiroute.wrapper.dao.route.bean;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter @Setter
+public class Metadata {
+ private String name;
+ private String namespace;
+ private String uid = "";
+ //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+ //private Date creationTimestamp;
+ @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+ private Date updateTimestamp;
+ private Map labels = new HashMap();
+ private String[] annotations = null;
+
+ /*
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Metadata metadata = (Metadata) o;
+ return Objects.equals(name, metadata.name) &&
+ Objects.equals(namespace, metadata.namespace) &&
+ Objects.equals(uid, metadata.uid) &&
+ //Objects.equals(creationTimestamp, metadata.creationTimestamp) &&
+ Objects.equals(updateTimestamp, metadata.updateTimestamp) &&
+ Objects.equals(labels, metadata.labels) &&
+ Objects.equals(annotations, metadata.annotations);
+ }
+
+ @Override
+ public int hashCode() {
+ //return Objects.hash(name, namespace, uid, creationTimestamp, updateTimestamp, labels, annotations);
+ return Objects.hash(name, namespace, uid, updateTimestamp, labels, annotations);
+ }
+ */
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/Node.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/Node.java
new file mode 100644
index 0000000..a328c3c
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/Node.java
@@ -0,0 +1,32 @@
+package org.onap.msb.apiroute.wrapper.dao.route.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter @Setter
+public class Node {
+ private String ip;
+ private int port;
+ private int weight=0;
+
+ /*
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Node node = (Node) o;
+ return Objects.equals(port, node.port) &&
+ Objects.equals(weight, node.weight) &&
+ Objects.equals(ip, node.ip);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ip, port, weight);
+ }
+ */
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/RouteInfo.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/RouteInfo.java
new file mode 100644
index 0000000..e5ab7bf
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/RouteInfo.java
@@ -0,0 +1,79 @@
+package org.onap.msb.apiroute.wrapper.dao.route.bean;
+
+import org.onap.msb.apiroute.wrapper.dao.DAOConstants;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@Setter
+public class RouteInfo {
+ private String kind = DAOConstants.ROUTE_KIND;
+ private String apiVersion = "";
+ private String status = "";
+ private Metadata metadata;
+ private Spec spec;
+
+ /**
+ Example route:
+ {
+ "kind" : "route",
+ "apiVersion" : "v1",
+ "status" : "1"
+ "metadata" : {
+ "name" : "kubernetes",
+ "namespace" : "default",
+ "uid" : "0b6f198e-c6ab-11e6-86aa-fa163ee2118b",
+ "creationTimestamp" : "2016-12-20T11:54:21Z",
+ "updateTimestamp" : "",
+ "labels" : {
+ "component" : "apiserver",
+ "provider" : "kubernetes"
+ },
+ "annotations" : {}
+ },
+ "spec" : {
+ "visualRange" : 0,
+ "url" : "",
+ "publish_port" : "",
+ "host" : "",
+ "apijson" : "",
+ "apijsontype" : ""
+ "metricsUrl" : ""
+ "consulServiceName" : ""
+ "useOwnUpstream" : "" //是å¦ä½¿ç”¨è¯¥æœåŠ¡ç‹¬ç«‹çš„upstream转å‘
+ "publishProtocol" : "", //å‘布地å€ä½¿ç”¨http还是httpåè®®
+ "enable_ssl" : "0|1", //转å‘时,使用http还是http转å‘。http:0/https:1
+ "controll" : "", //是å¦å¯ä»¥ä¿®æ”¹
+ "nodes" : [{
+ "ip" : 10.10.10.2,
+ "port" : 8080,
+ "weight" : ""
+ }
+ ],
+ }
+}
+ */
+ /*
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ RouteInfo that = (RouteInfo) o;
+ return Objects.equals(kind, that.kind) &&
+ Objects.equals(apiVersion, that.apiVersion) &&
+ Objects.equals(status, that.status) &&
+ Objects.equals(metadata, that.metadata) &&
+ Objects.equals(spec, that.spec);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(kind, apiVersion, status, metadata, spec);
+ }
+ */
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/Spec.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/Spec.java
new file mode 100644
index 0000000..8e9a54b
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/route/bean/Spec.java
@@ -0,0 +1,52 @@
+package org.onap.msb.apiroute.wrapper.dao.route.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter @Setter
+public class Spec {
+ private String visualRange = "";
+ private String url = "";
+ private String publish_port;
+ private String host = "";
+ private String apijson = "";
+ private String apijsontype = "";
+ private String metricsUrl = "";
+ private String consulServiceName = "";
+ private String useOwnUpstream = "";
+ private String publish_protocol = "";
+ private boolean enable_ssl = false;
+ private String control = "";
+ private Node[] nodes;
+
+ /*
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Spec spec = (Spec) o;
+ return Objects.equals(enable_ssl, spec.enable_ssl) &&
+ Objects.equals(visualRange, spec.visualRange) &&
+ Objects.equals(url, spec.url) &&
+ Objects.equals(publish_port, spec.publish_port) &&
+ Objects.equals(host, spec.host) &&
+ Objects.equals(apijson, spec.apijson) &&
+ Objects.equals(apijsontype, spec.apijsontype) &&
+ Objects.equals(metricsUrl, spec.metricsUrl) &&
+ Objects.equals(consulServiceName, spec.consulServiceName) &&
+ Objects.equals(useOwnUpstream, spec.useOwnUpstream) &&
+ Objects.equals(publish_protocol, spec.publish_protocol) &&
+ Objects.equals(control, spec.control) &&
+ Arrays.equals(nodes, spec.nodes);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(visualRange, url, publish_port, host, apijson, apijsontype, metricsUrl, consulServiceName, useOwnUpstream, publish_protocol, enable_ssl, control, nodes);
+ }
+ */
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/IServiceDAO.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/IServiceDAO.java
new file mode 100644
index 0000000..d63f656
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/IServiceDAO.java
@@ -0,0 +1,17 @@
+package org.onap.msb.apiroute.wrapper.dao.service;
+
+import java.util.List;
+
+import org.onap.msb.apiroute.wrapper.dao.service.bean.ServiceInfo;
+
+public interface IServiceDAO {
+ public void saveService(String key, ServiceInfo serviceInfo) throws Exception;
+
+ public ServiceInfo queryService(String key) throws Exception;
+
+ public List<ServiceInfo> queryMultiService(String keyPattern) throws Exception;
+
+ public long deleteService(String key) throws Exception;
+
+ public long deleteMultiService(String keyPattern) throws Exception;
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/ServiceDAOImpl.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/ServiceDAOImpl.java
new file mode 100644
index 0000000..e9f4586
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/ServiceDAOImpl.java
@@ -0,0 +1,59 @@
+package org.onap.msb.apiroute.wrapper.dao.service;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.dao.service.bean.ServiceInfo;
+import org.onap.msb.apiroute.wrapper.util.Jackson;
+
+public class ServiceDAOImpl implements IServiceDAO{
+ public void saveService(String key, ServiceInfo serviceInfo) throws Exception {
+ String serviceInfoStr = null;
+ try {
+ serviceInfoStr = Jackson.MAPPER.writeValueAsString(serviceInfo);
+ } catch (JsonProcessingException e) {
+ throw new Exception("error occurred while parsing ServiceInfo to json data",e);
+ }
+ RedisAccessWrapper.save(key, serviceInfoStr);
+ }
+
+ public ServiceInfo queryService(String key) throws Exception {
+ ServiceInfo serviceInfo = null;
+ String serviceInfoStr = RedisAccessWrapper.query(key);
+ if (null == serviceInfoStr || "".equals(serviceInfoStr))
+ return null;
+ try {
+ serviceInfo = Jackson.MAPPER.readValue(serviceInfoStr, ServiceInfo.class);
+ } catch (IOException e) {
+ throw new Exception("error occurred while parsing the redis json data to ServiceInfo",e);
+ }
+ return serviceInfo;
+ }
+
+ public List<ServiceInfo> queryMultiService(String keyPattern) throws Exception {
+ List<String> serviceInfoStrList = RedisAccessWrapper.queryMultiKeys(keyPattern);
+ List<ServiceInfo> routeInfoList = new ArrayList<>();
+ for (String serviceInfoStr : serviceInfoStrList) {
+ ServiceInfo serviceInfo = null;
+ try {
+ serviceInfo = Jackson.MAPPER.readValue(serviceInfoStr, ServiceInfo.class);
+ routeInfoList.add(serviceInfo);
+ } catch (IOException e) {
+ throw new Exception("error occurred while parsing the redis json data to ServiceInfo",e);
+ }
+ }
+ return routeInfoList;
+ }
+
+ public long deleteService(String key) throws Exception {
+ return RedisAccessWrapper.delete(key);
+ }
+
+ public long deleteMultiService(String keyPattern) throws Exception{
+ return RedisAccessWrapper.deleteMultiKeys(keyPattern);
+ }
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/Metadata.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/Metadata.java
new file mode 100644
index 0000000..6ce6126
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/Metadata.java
@@ -0,0 +1,50 @@
+package org.onap.msb.apiroute.wrapper.dao.service.bean;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter @Setter
+public class Metadata {
+ private String name;
+ private String namespace;
+ private String uid = "";
+ //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+ //private Date creationTimestamp;
+ // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+ @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+ private Date updateTimestamp;
+ private Map labels = new HashMap();
+ //private String[] annotations = new String[]{};
+ private String[] annotations = null;
+
+ /*
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Metadata metadata = (Metadata) o;
+ return Objects.equals(name, metadata.name) &&
+ Objects.equals(namespace, metadata.namespace) &&
+ Objects.equals(uid, metadata.uid) &&
+ //Objects.equals(creationTimestamp, metadata.creationTimestamp) &&
+ Objects.equals(updateTimestamp, metadata.updateTimestamp) &&
+ Objects.equals(labels, metadata.labels) &&
+ Objects.equals(annotations, metadata.annotations);
+ }
+
+ @Override
+ public int hashCode() {
+ //return Objects.hash(name, namespace, uid, creationTimestamp, updateTimestamp, labels, annotations);
+ return Objects.hash(name, namespace, uid, updateTimestamp, labels, annotations);
+ }
+ */
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/Node.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/Node.java
new file mode 100644
index 0000000..fecf4bd
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/Node.java
@@ -0,0 +1,32 @@
+package org.onap.msb.apiroute.wrapper.dao.service.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter @Setter
+public class Node {
+ private String ip;
+ private String port;
+ private int ttl=-1;
+
+ /*
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Node node = (Node) o;
+ return Objects.equals(port, node.port) &&
+ Objects.equals(ttl, node.ttl) &&
+ Objects.equals(ip, node.ip);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ip, port, ttl);
+ }
+ */
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/ServiceInfo.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/ServiceInfo.java
new file mode 100644
index 0000000..01ab3a9
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/ServiceInfo.java
@@ -0,0 +1,76 @@
+package org.onap.msb.apiroute.wrapper.dao.service.bean;
+
+import org.onap.msb.apiroute.wrapper.dao.DAOConstants;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@Setter
+public class ServiceInfo {
+ private String kind = DAOConstants.SERVICE_KIND;
+ private String apiVersion = "";
+ private String status = "";
+ private Metadata metadata;
+ private Spec spec;
+
+ /**
+ Example Service:
+ {
+ "kind" : "service",
+ "apiVersion" : "v1",
+ "metadata" : {
+ "name" : "kubernetes",
+ "namespace" : "default",
+ "uid" : "0b6f198e-c6ab-11e6-86aa-fa163ee2118b",
+ "creationTimestamp" : "2016-12-20T11:54:21Z",
+ "labels" : {
+ "component" : "apiserver",
+ "provider" : "kubernetes"
+ },
+ "annotations" : {}
+ },
+ "spec" : {
+ "visualRange" : 0,
+ "url" : "",
+ "path" : "",
+ "publish_port" : "",
+ "host" : "",
+ "protocol" : "",
+ "lb_policy" : "",
+ "enable_ssl" : "0|1", //转å‘时,使用http还是http转å‘。http:0/https:1
+ "nodes" : [{
+ "ip" : 10.10.10.2,
+ "port" : 8080,
+ "ttl" :
+ }
+ ],
+ }
+ "status" : ""
+ }
+
+ */
+
+ /*
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ServiceInfo that = (ServiceInfo) o;
+ return Objects.equals(kind, that.kind) &&
+ Objects.equals(apiVersion, that.apiVersion) &&
+ Objects.equals(status, that.status) &&
+ Objects.equals(metadata, that.metadata) &&
+ Objects.equals(spec, that.spec);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(kind, apiVersion, status, metadata, spec);
+ }
+ */
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/Spec.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/Spec.java
new file mode 100644
index 0000000..65e769b
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/dao/service/bean/Spec.java
@@ -0,0 +1,44 @@
+package org.onap.msb.apiroute.wrapper.dao.service.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter @Setter
+public class Spec {
+ private String visualRange = "";
+ private String url = "";
+ private String path = "";
+ private String publish_port;
+ private String host = "";
+ private String protocol = "";
+ private String lb_policy = "";
+ private boolean enable_ssl = false;
+ private Node[] nodes;
+
+ /*
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Spec spec = (Spec) o;
+ return Objects.equals(enable_ssl, spec.enable_ssl) &&
+ Objects.equals(visualRange, spec.visualRange) &&
+ Objects.equals(url, spec.url) &&
+ Objects.equals(path, spec.path) &&
+ Objects.equals(publish_port, spec.publish_port) &&
+ Objects.equals(host, spec.host) &&
+ Objects.equals(protocol, spec.protocol) &&
+ Objects.equals(lb_policy, spec.lb_policy) &&
+ Arrays.equals(nodes, spec.nodes);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(visualRange, url, path, publish_port, host, protocol, lb_policy, enable_ssl, nodes);
+ }
+ */
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/BaseQueue.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/BaseQueue.java
new file mode 100644
index 0000000..dce3b12
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/BaseQueue.java
@@ -0,0 +1,36 @@
+package org.onap.msb.apiroute.wrapper.queue;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public abstract class BaseQueue<T> {
+
+ private final List<BlockingQueue<ServiceData<T>>> queueArray= new ArrayList<BlockingQueue<ServiceData<T>>>();
+
+ public BaseQueue(int queueNum,int queueCapacity)
+ {
+ for(int i=0;queueNum>0 && i<queueNum;i++)
+ {
+ queueArray.add(new LinkedBlockingQueue<ServiceData<T>>(queueCapacity));
+ }
+ }
+
+ public int getQueneNum(){
+ return queueArray.size();
+ }
+
+ protected BlockingQueue<ServiceData<T>> getQueue(int index)
+ {
+ return queueArray.get(index);
+ }
+
+ public abstract void put(final ServiceData<T> data) throws InterruptedException;
+
+ public abstract ServiceData<T> take(final int queueIndex) throws InterruptedException;
+
+
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/QueueManager.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/QueueManager.java
new file mode 100644
index 0000000..20525c8
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/QueueManager.java
@@ -0,0 +1,65 @@
+package org.onap.msb.apiroute.wrapper.queue;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.http.HttpEntity;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+
+public class QueueManager {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(QueueManager.class);
+
+ private final BaseQueue<HttpEntity> serviceListQueue;
+ private final BaseQueue<List<ServiceHealth>> serviceQueue;
+
+ private volatile static QueueManager instance = null;
+
+ public static QueueManager getInstance() {
+ if (instance == null) {
+ synchronized (QueueManager.class) {
+ if (instance == null) {
+ instance = new QueueManager();
+ }
+ }
+ }
+ return instance;
+ }
+
+ private QueueManager() {
+ serviceListQueue = new ServiceListQueue(
+ RouteUtil.SERVICE_LIST_QUEUE_CAPACITY);
+ serviceQueue = new ServiceQueue(RouteUtil.SERVICE_DATA_QUEUE_NUM,
+ RouteUtil.SERVICE_QUEUE_CAPACITY);
+ }
+
+ public ServiceData<HttpEntity> takeFromServiceListQueue(
+ int queueIndex) throws InterruptedException {
+ return serviceListQueue.take(queueIndex);
+ }
+
+ public ServiceData<List<ServiceHealth>> takeFromServiceQueue(int queueIndex)
+ throws InterruptedException {
+ return serviceQueue.take(queueIndex);
+ }
+
+
+ @SuppressWarnings("unchecked")
+ public <T> void putIn(ServiceData<T> data) throws InterruptedException {
+
+ if (data.getDataType() == ServiceData.DataType.service_list) {
+ LOGGER.debug("putIn service_list queue success");
+ serviceListQueue.put((ServiceData<HttpEntity>) data);
+ } else if (data.getDataType() == ServiceData.DataType.service) {
+ serviceQueue.put((ServiceData<List<ServiceHealth>>) data);
+ } else {
+ LOGGER.warn("DATA TYPE NOT SUPPORT:"+data.getDataType());
+ }
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceConsumer.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceConsumer.java
new file mode 100644
index 0000000..29d705f
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceConsumer.java
@@ -0,0 +1,167 @@
+package org.onap.msb.apiroute.wrapper.queue;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.onap.msb.apiroute.SyncDataManager;
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.health.RedisHealthCheck;
+import org.onap.msb.apiroute.wrapper.MicroServiceWrapper;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.util.CommonUtil;
+import org.onap.msb.apiroute.wrapper.util.ServiceFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ServiceConsumer implements Runnable {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceConsumer.class);
+
+ private boolean isRunning = true;
+
+ private int index;
+
+
+ private static final int retryCount=3;
+
+ //缓存æœåŠ¡ä¿¡æ¯ï¼škey:æœåŠ¡å 和对应的版本列表Set<String>
+ private final Map<String, Set<String>> lastVersionResponse = new HashMap<String, Set<String>>();
+
+ public ServiceConsumer(final int index) {
+ this.index = index;
+ }
+
+
+ public void run() {
+
+ LOGGER.info("run Service Consumer Thread [" + index + "]");
+
+ while (isRunning) {
+ try {
+ ServiceData<List<ServiceHealth>> serviceData;
+
+ serviceData = QueueManager.getInstance().takeFromServiceQueue(index);
+
+ // LOGGER.info("Service Consumer Thread [" + index +
+ // "] take out serviceData from Queue successfully");
+
+ if (serviceData.getOperate() == ServiceData.Operate.delete) {
+ // 删除æœåŠ¡
+ deleteMicroService(serviceData);
+ } else {
+ // æ›´æ–°æœåŠ¡
+ updateMicroService(serviceData);
+ }
+ } catch (InterruptedException e) {
+ LOGGER.error("ServiceConsumer throw InterruptedException: ", e);
+ Thread.currentThread().interrupt();
+ }
+
+ }
+ }
+
+
+
+ private void deleteMicroService(ServiceData<List<ServiceHealth>> serviceData) {
+ String serviceName = null;
+ try {
+ if (serviceData.getData() == null || serviceData.getData().size() == 0) {
+ throw new Exception("sysn deleteMicroService is wrong:serviceData is empty");
+ }
+
+ serviceName = serviceData.getData().get(0).getService().getService();
+// LOGGER.info("Service Consumer [" + index + "] start to delete MicroService:[serviceName] "
+// + serviceName);
+
+ //ServiceListCache.removeService(serviceName);
+ MicroServiceWrapper.getInstance().deleteMicroService4AllVersion(serviceName);
+
+ } catch (Exception e) {
+ LOGGER.error("delete MicroServiceInfo 4AllVersion fail from consul:[serviceName]" + serviceName, e);
+ //删除失败,é‡è¯•ä¸‰æ¬¡
+ for(int i=0;i<retryCount;i++){
+
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException ex) {
+ LOGGER.error("delete MicroServiceInfo 4AllVersion Thread.sleep throw except:" + ex.getMessage());
+ }
+ if(reDeleteMicroService(serviceName)){
+ LOGGER.info((i+1) + "/"+retryCount+" : retry to delete MicroServiceInfo success [serviceName]" + serviceName);
+ break;
+ }
+ else{
+ LOGGER.error((i+1) + "/"+retryCount+" : retry to delete MicroServiceInfo still fail [serviceName]" + serviceName);
+ }
+ }
+ }
+ }
+
+ private boolean reDeleteMicroService(String serviceName){
+ try {
+ MicroServiceWrapper.getInstance().deleteMicroService4AllVersion(serviceName);
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ private void updateMicroService(ServiceData<List<ServiceHealth>> serviceData) {
+
+ if (serviceData.getData() == null || serviceData.getData().size() == 0) {
+ LOGGER.warn("sysn updateMicroService is wrong:serviceData is empty ");
+ return;
+ }
+
+ String serviceName = "";
+
+ try {
+
+ serviceName = serviceData.getData().get(0).getService().getService();
+ List<ServiceHealth> serviceNodeList = serviceData.getData();
+
+
+ Map<String, MicroServiceFullInfo> microServiceInfo4version =
+ ServiceFilter.getInstance().transMicroServiceInfoFromConsul(serviceNodeList);
+
+ // 删除数æ®åº“中已ä¸å­˜åœ¨çš„版本å·æœåŠ¡ä¿¡æ¯
+ Set<String> newAllVersion = microServiceInfo4version.keySet();
+
+ if (lastVersionResponse.containsKey(serviceName)) {
+ Set<String> dbAllVersionSet = lastVersionResponse.get(serviceName);
+ // Set<String> dbAllVersionSet=MicroServiceWrapper.getInstance().getAllVersion(serviceName);
+ Set<String> delVersionList = CommonUtil.getDiffrent(newAllVersion, dbAllVersionSet);
+
+ if (delVersionList.size() > 0) {
+
+ LOGGER.info("MicroService version is change from consul:[serviceName]" + serviceName
+ + "[version]" + delVersionList);
+
+
+ for (String version : delVersionList) {
+ MicroServiceWrapper.getInstance().deleteMicroService(serviceName, version);
+ }
+
+ }
+ }
+
+ lastVersionResponse.put(serviceName, newAllVersion);
+
+ for (Map.Entry<String, MicroServiceFullInfo> entry : microServiceInfo4version.entrySet()) {
+ MicroServiceFullInfo new_microServiceFullInfo = entry.getValue();
+ MicroServiceWrapper.getInstance().saveServiceAndnoticeRoute(new_microServiceFullInfo);
+
+ }
+
+
+ } catch (Exception e) {
+ LOGGER.error("update MicroServiceInfo fail from consul:[serviceName]" + serviceName);
+ //更新失败,é‡ç½®ä»»åŠ¡æœåŠ¡çš„modifyIndex,等待é‡æ–°æ›´æ–°
+ RedisHealthCheck.writeCheckFlag = true;
+ SyncDataManager.resetIndex(serviceName);
+ }
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceData.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceData.java
new file mode 100644
index 0000000..aaadbe9
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceData.java
@@ -0,0 +1,53 @@
+package org.onap.msb.apiroute.wrapper.queue;
+
+public class ServiceData<T> {
+ public static enum Type {
+ consul
+ };
+
+ public static enum Operate {
+ update, delete
+ };
+
+ public static enum DataType {
+ service_list, service
+ }
+
+ private Type type = Type.consul;
+ private DataType dataType;
+ private T data;
+ private Operate operate = Operate.update;
+
+ public Type getType() {
+ return type;
+ }
+
+ public void setType(Type type) {
+ this.type = type;
+ }
+
+ public DataType getDataType() {
+ return dataType;
+ }
+
+ public void setDataType(DataType dataType) {
+ this.dataType = dataType;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+
+ public Operate getOperate() {
+ return operate;
+ }
+
+ public void setOperate(Operate operate) {
+ this.operate = operate;
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceListCache.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceListCache.java
new file mode 100644
index 0000000..59be2e4
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceListCache.java
@@ -0,0 +1,35 @@
+package org.onap.msb.apiroute.wrapper.queue;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ServiceListCache {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceListCache.class);
+
+ private final static AtomicReference<Set<String>> serviceNameList4Cache = new AtomicReference<Set<String>>(new HashSet<String>());
+
+ public static Set<String> getLatestServiceNamelist() {
+ return serviceNameList4Cache.get();
+ }
+
+ public static void setLatestServiceNamelist(Set<String> newServicenamelist){
+ serviceNameList4Cache.set(newServicenamelist);
+ LOGGER.info("------current total Watch Service Num :"+ newServicenamelist.size());
+ }
+
+ public synchronized static void removeService(String serviceName){
+
+ Set<String> servicenamelist=serviceNameList4Cache.get();
+ servicenamelist.remove(serviceName);
+ serviceNameList4Cache.set(servicenamelist);
+ LOGGER.info("------current total Watch Service Num :"+ servicenamelist.size());
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceListConsumer.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceListConsumer.java
new file mode 100644
index 0000000..e3a8aa7
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceListConsumer.java
@@ -0,0 +1,209 @@
+package org.onap.msb.apiroute.wrapper.queue;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.http.HttpEntity;
+import org.onap.msb.apiroute.SyncDataManager;
+import org.onap.msb.apiroute.wrapper.MicroServiceWrapper;
+import org.onap.msb.apiroute.wrapper.util.CommonUtil;
+import org.onap.msb.apiroute.wrapper.util.ServiceFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonToken;
+
+
+public class ServiceListConsumer implements Runnable {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(ServiceListConsumer.class);
+
+ private boolean isRunning = true;
+
+ private int index;
+
+
+ public ServiceListConsumer() {
+ this.index = 0;
+ }
+
+ public void run() {
+ LOGGER.info("run ServiceList Consumer Thread [" + index + "]");
+
+ while (isRunning) {
+ try {
+ // å–最新一æ¡è®°å½•
+ ServiceData<HttpEntity> serviceData = QueueManager
+ .getInstance().takeFromServiceListQueue(index);
+ LOGGER.debug("ServiceList Consumer Thread [" + index +
+ "] take out serviceData from Queue successfully");
+
+ HttpEntity newValues = serviceData.getData();
+
+ Set<String> newServiceNameList = filterServiceList(newValues);
+
+ if (ServiceListCache.getLatestServiceNamelist().size() == 0) {
+ boolean initSuccess=initServiceList(newServiceNameList);
+ if(initSuccess){
+ ServiceListCache.setLatestServiceNamelist(newServiceNameList);
+ }
+ } else {
+ updateServiceList(newServiceNameList);
+ ServiceListCache.setLatestServiceNamelist(newServiceNameList);
+ }
+
+
+ } catch (Exception e) {
+ LOGGER.error(
+ "ServiceListConsumer throw Exception: ", e);
+ }
+ }
+ }
+
+ private void startWatchService(String serviceName) {
+ // start to Watch service nodes
+
+ SyncDataManager.startWatchService(serviceName);
+ }
+
+ private void updateServiceList(Set<String> newServiceNameList) {
+ Set<String> registerServiceNameList = CommonUtil.getDiffrent(
+ ServiceListCache.getLatestServiceNamelist(), newServiceNameList);
+
+ if (registerServiceNameList.size() > 0) {
+ LOGGER.info("***need to start Watch Service num from consul :"
+ + registerServiceNameList.size());
+
+ for (String serviceName : registerServiceNameList) {
+ startWatchService(serviceName);
+ }
+ }
+ }
+
+ private boolean initServiceList(Set<String> newServiceNameList) {
+ LOGGER.info("***start to initialize service List when System startup ***");
+
+ Set<String> dbServiceNameList = MicroServiceWrapper
+ .getInstance().getAllMicroServiceKey();
+
+ if(dbServiceNameList==null){
+ LOGGER.error("init ServiceList from redis fail ");
+ return false;
+ }
+
+
+ // 对比删除redisè„æ•°æ®
+ Set<String> delServiceNameList = CommonUtil.getDiffrent(
+ newServiceNameList, dbServiceNameList);
+
+ LOGGER.info("***need to delete Service num from redis :"
+ + delServiceNameList.size());
+ for (String serviceName : delServiceNameList) {
+ try {
+ MicroServiceWrapper.getInstance()
+ .deleteMicroService4AllVersion(serviceName);
+ LOGGER.info("delete MicroService success from initialize:[serviceName]"
+ + serviceName);
+
+ } catch (Exception e) {
+ LOGGER.error(
+ "initialize serviceList :Delete MicroServiceInfo serviceName:"
+ + serviceName + " FAIL : ", e);
+ }
+ }
+
+ // å¯åŠ¨åŒæ­¥å¼€å¯ç›‘å¬å…¨éƒ¨æœåŠ¡åˆ—表
+ LOGGER.info("***need to start Watch Service num from initialize :"
+ + newServiceNameList.size());
+
+ for (String serviceName : newServiceNameList) {
+ startWatchService(serviceName);
+ }
+
+ return true;
+
+ }
+
+ /*private ImmutableSet<String> filterServiceList(
+ final Map<String, List<String>> serviceList) {
+ if (serviceList == null || serviceList.isEmpty()) {
+ return ImmutableSet.of();
+ }
+
+ final ImmutableSet.Builder<String> builder = ImmutableSet.builder();
+
+ for (Map.Entry<String, List<String>> entry : serviceList.entrySet()) {
+
+ String key = entry.getKey();
+ if (key != null && !"consul".equals(key)) {
+
+ List<String> value = entry.getValue();
+ if (ServiceFilter.getInstance().isFilterService(value)) {
+ builder.add(key);
+ }
+ }
+ }
+
+ LOGGER.info("consul all service num:" + serviceList.size());
+ LOGGER.info("consul filter service num:" + builder.build().size());
+
+ return builder.build();
+ }
+*/
+ private Set<String> filterServiceList(final HttpEntity serviceList) {
+
+ if (serviceList == null || serviceList.getContentLength() == 0) {
+ return new HashSet<String>();
+ }
+
+ final Set<String> builder = new HashSet<String>();
+
+ JsonFactory f = new JsonFactory();
+ JsonParser jp = null;
+ List<String> tagList = null;
+ int inputServiceNum = 0;
+ try {
+ jp = f.createParser(serviceList.getContent());
+ jp.nextToken();
+ while (jp.nextToken() != JsonToken.END_OBJECT) {
+ String serviceName = jp.getCurrentName();
+ inputServiceNum++;
+ jp.nextToken();
+ tagList = new ArrayList<>();
+ while (jp.nextToken() != JsonToken.END_ARRAY) {
+ tagList.add(jp.getText());
+ }
+
+ if (serviceName != null && !"consul".equals(serviceName)) {
+ if (ServiceFilter.getInstance().isFilterService(tagList)) {
+ builder.add(serviceName);
+ }
+ }
+ }
+ } catch (IOException e) {
+ LOGGER.warn("parse service list error",e);
+ return new HashSet<String>();
+ } finally {
+ try {
+ jp.close();
+ } catch (IOException e) {
+ LOGGER.warn("parse service list error",e);
+ return new HashSet<String>();
+ }
+ }
+
+ int latestServiceNum=ServiceListCache.getLatestServiceNamelist().size();
+// if(latestServiceNum!=builder.size()){
+ LOGGER.info("[consul] all service num:" + inputServiceNum+ ", filter service num: new——" + builder.size()+" old——"+latestServiceNum);
+// }
+
+ return builder;
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceListQueue.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceListQueue.java
new file mode 100644
index 0000000..84ea286
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceListQueue.java
@@ -0,0 +1,59 @@
+package org.onap.msb.apiroute.wrapper.queue;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.BlockingQueue;
+
+import org.apache.http.HttpEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ServiceListQueue extends BaseQueue<HttpEntity> {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceListQueue.class);
+
+
+ private static final int SERVICE_LIST_DATA_QUEUE_NUM = 1;
+ private static final int SERVICE_LIST_QUEUE_INDEX = 0;
+
+ public ServiceListQueue(final int queueCapacity) {
+ super(SERVICE_LIST_DATA_QUEUE_NUM,queueCapacity);
+ }
+
+ @Override
+ public void put(ServiceData<HttpEntity> data) throws InterruptedException {
+ BlockingQueue<ServiceData<HttpEntity>> queue=getQueue(SERVICE_LIST_QUEUE_INDEX);
+
+ int size=queue.size();
+// LOGGER.info("before put ServiceListQueue[size:"+size+"] success :[service num]"+data.getData().size());
+ //先清空队列
+ if(size>0){
+ queue.clear();
+ }
+ //æ’入记录
+ queue.put(data);
+
+ }
+
+ @Override
+ public ServiceData<HttpEntity> take(int queueIndex) throws InterruptedException {
+ BlockingQueue<ServiceData<HttpEntity>> queue = getQueue(queueIndex);
+ ServiceData<HttpEntity> serviceData = queue.take();
+ return serviceData;
+
+ /*//å–队列最新一æ¡æ•°æ®
+ if (queue.isEmpty()) {
+ LOGGER.info("take a single serviceData from ServiceListQueue ");
+ return serviceData;
+ } else {
+ List<ServiceData<Map<String, List<String>>>> serviceDataList =
+ new ArrayList<ServiceData<Map<String, List<String>>>>();
+ //一次性从BlockingQueue获å–所有数æ®
+ queue.drainTo(serviceDataList);
+ LOGGER.info("take multiple serviceDatas from ServiceListQueue :[num]"+serviceDataList.size());
+ return serviceDataList.get(serviceDataList.size() - 1);
+ }*/
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceQueue.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceQueue.java
new file mode 100644
index 0000000..6c179fc
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/queue/ServiceQueue.java
@@ -0,0 +1,45 @@
+package org.onap.msb.apiroute.wrapper.queue;
+
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ServiceQueue extends BaseQueue<List<ServiceHealth>> {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceQueue.class);
+
+ private int queneNum;
+
+ public ServiceQueue(final int queneNum,final int queueCapacity) {
+ super(queneNum,queueCapacity);
+ this.queneNum=queneNum;
+ }
+
+
+ @Override
+ public void put(final ServiceData<List<ServiceHealth>> data) throws InterruptedException {
+ if(data.getData()==null || data.getData().size()==0) return;
+
+ String serviceName = data.getData().get(0).getService().getService();
+ long serviceNameHashCode=serviceName.hashCode() & 0x7FFFFFFF;
+ int queneIndex=(int) (serviceNameHashCode % queneNum);
+
+// LOGGER.info("put ServiceQueue [serviceName.hashCode():"+serviceNameHashCode+",queneIndex:"+queneIndex+",queneNum:"+queneNum+"] :[serviceName]"+serviceName);
+
+ BlockingQueue<ServiceData<List<ServiceHealth>>> queue=getQueue(queneIndex);
+ queue.put(data);
+
+ LOGGER.info("put ServiceQueue[index:"+queneIndex+",size:"+queue.size()+"] success :[serviceName]"+serviceName);
+ }
+
+ @Override
+ public ServiceData<List<ServiceHealth>> take(final int queueIndex) throws InterruptedException {
+ return getQueue(queueIndex).take();
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/ApiRouteService.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/ApiRouteService.java
new file mode 100644
index 0000000..c8265b3
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/ApiRouteService.java
@@ -0,0 +1,159 @@
+package org.onap.msb.apiroute.wrapper.service;
+
+import org.onap.msb.apiroute.api.ApiRouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.wrapper.dao.DAOFactory;
+import org.onap.msb.apiroute.wrapper.dao.route.IRouteDAO;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.Metadata;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.Node;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.RouteInfo;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.Spec;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+
+public class ApiRouteService {
+ private static final Logger LOGGER = LoggerFactory.getLogger(ApiRouteService.class);
+ private static final ApiRouteService instance = new ApiRouteService();
+ private IRouteDAO routeDAO = DAOFactory.getRouteDAO();
+
+ private ApiRouteService() {
+ }
+
+ public static ApiRouteService getInstance() {
+ return instance;
+ }
+
+ public void saveApiRouteService2Redis(ApiRouteInfo apiRouteInfo, String routeKey) throws Exception {
+ if(apiRouteInfo ==null){
+ throw new Exception("input apiRouteInfo to be saved is null!");
+ }
+ RouteInfo routeInfo = APIRouteAdapter.toRouteInfo(apiRouteInfo);
+ routeDAO.saveRoute(routeKey, routeInfo);
+ }
+
+ public long deleteApiRouteService2Redis(String routeKey) throws Exception {
+ return routeDAO.deleteRoute(routeKey);
+ }
+
+ public long deleteMultiApiRouteService2Redis(String routeKeyPattern) throws Exception {
+ return routeDAO.deleteMultiRoute(routeKeyPattern);
+ }
+
+ public ApiRouteInfo getApiRouteInstance(String routeKey) throws Exception {
+ ApiRouteInfo apiRouteInfo = null;
+ RouteInfo routeInfo = null;
+ routeInfo = routeDAO.queryRoute(routeKey);
+ if(routeInfo!=null) {
+ apiRouteInfo = APIRouteAdapter.fromRouteInfo(routeInfo);
+ }
+ return apiRouteInfo;
+ }
+
+ public List<ApiRouteInfo> getMultiApiRouteInstances(String apiRedisKeyPattern) throws Exception {
+ List<ApiRouteInfo> apiRouteList = new ArrayList<>();
+ List<RouteInfo> routeInfoList = routeDAO.queryMultiRoute(apiRedisKeyPattern);
+ for (RouteInfo routeInfo : routeInfoList) {
+ if (routeInfo != null) {
+ ApiRouteInfo apiRouteInfo = APIRouteAdapter.fromRouteInfo(routeInfo);;
+ apiRouteList.add(apiRouteInfo);
+ }
+ }
+ return apiRouteList;
+ }
+
+ public void updateApiRouteStatus2Redis(String routeKey,String status) throws Exception {
+ RouteInfo routeInfo = routeDAO.queryRoute(routeKey);
+ if(routeInfo != null){
+ routeInfo.setStatus(status);
+ routeDAO.saveRoute(routeKey,routeInfo);
+ }else{
+ throw new Exception("service to be updated is not exist! Update failed");
+ }
+ }
+}
+
+class APIRouteAdapter {
+ public static RouteInfo toRouteInfo(ApiRouteInfo apiRouteInfo) {
+ RouteInfo routeInfo = new RouteInfo();
+ routeInfo.setApiVersion(apiRouteInfo.getVersion());
+ routeInfo.setStatus(apiRouteInfo.getStatus());
+
+
+ Spec spec = new Spec();
+ spec.setVisualRange(apiRouteInfo.getVisualRange());
+ spec.setUrl(apiRouteInfo.getUrl().trim());
+ spec.setPublish_port(apiRouteInfo.getPublish_port());
+ spec.setHost(apiRouteInfo.getHost());
+ spec.setApijson(apiRouteInfo.getApiJson());
+ spec.setApijsontype(apiRouteInfo.getApiJsonType());
+ spec.setMetricsUrl(apiRouteInfo.getMetricsUrl());
+ spec.setConsulServiceName(apiRouteInfo.getConsulServiceName());
+ spec.setUseOwnUpstream(apiRouteInfo.getUseOwnUpstream());
+ spec.setPublish_protocol(apiRouteInfo.getPublishProtocol());
+ spec.setEnable_ssl(apiRouteInfo.isEnable_ssl());
+ spec.setControl(apiRouteInfo.getControl());
+ RouteServer[] routeServers = apiRouteInfo.getServers();
+ List<Node> nodeList = new ArrayList<>();
+ for (RouteServer server: routeServers){
+ Node node = new Node();
+ node.setIp(server.getIp());
+ node.setPort(Integer.parseInt(server.getPort()));
+ node.setWeight(server.getWeight());
+ nodeList.add(node);
+ }
+ spec.setNodes(nodeList.toArray(new Node[]{}));
+ routeInfo.setSpec(spec);
+
+ Metadata metadata = new Metadata();
+ metadata.setName(apiRouteInfo.getServiceName());
+ metadata.setNamespace(apiRouteInfo.getNamespace());
+ Calendar now = Calendar.getInstance();
+ now.set(Calendar.MILLISECOND, 0);
+ metadata.setUpdateTimestamp(now.getTime());
+ routeInfo.setMetadata(metadata);
+
+ return routeInfo;
+ }
+
+ public static ApiRouteInfo fromRouteInfo(RouteInfo routeInfo) {
+ ApiRouteInfo apiRouteInfo = new ApiRouteInfo();
+
+ apiRouteInfo.setVersion(routeInfo.getApiVersion());
+ apiRouteInfo.setStatus(routeInfo.getStatus());
+
+ Spec spec = routeInfo.getSpec();
+ apiRouteInfo.setVisualRange(spec.getVisualRange());
+ apiRouteInfo.setUrl(spec.getUrl());
+ apiRouteInfo.setPublish_port(spec.getPublish_port());
+ apiRouteInfo.setHost(spec.getHost());
+ apiRouteInfo.setApiJson(spec.getApijson());
+ apiRouteInfo.setApiJsonType(spec.getApijsontype());
+ apiRouteInfo.setMetricsUrl(spec.getMetricsUrl());
+ apiRouteInfo.setConsulServiceName(spec.getConsulServiceName());
+ apiRouteInfo.setUseOwnUpstream(spec.getUseOwnUpstream());
+ apiRouteInfo.setPublishProtocol(spec.getPublish_protocol());
+ apiRouteInfo.setEnable_ssl(spec.isEnable_ssl());
+ apiRouteInfo.setControl(spec.getControl());
+ Node[] nodes = spec.getNodes();
+ List<RouteServer> routeServerList = new ArrayList<>();
+ for (Node node: nodes){
+ RouteServer routeServer = new RouteServer();
+ routeServer.setIp(node.getIp());
+ routeServer.setPort(String.valueOf(node.getPort()));
+ routeServer.setWeight(node.getWeight());
+ routeServerList.add(routeServer);
+ }
+ apiRouteInfo.setServers(routeServerList.toArray(new RouteServer[]{}));
+
+ Metadata metadata = routeInfo.getMetadata();
+ apiRouteInfo.setServiceName(metadata.getName());
+ apiRouteInfo.setNamespace(metadata.getNamespace());
+
+ return apiRouteInfo;
+ }
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/CustomRouteService.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/CustomRouteService.java
new file mode 100644
index 0000000..6ea680e
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/CustomRouteService.java
@@ -0,0 +1,152 @@
+package org.onap.msb.apiroute.wrapper.service;
+
+import org.onap.msb.apiroute.api.CustomRouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.wrapper.dao.DAOFactory;
+import org.onap.msb.apiroute.wrapper.dao.route.IRouteDAO;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.Metadata;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.Node;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.RouteInfo;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.Spec;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+
+public class CustomRouteService {
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomRouteService.class);
+
+ private static final CustomRouteService instance = new CustomRouteService();
+ private IRouteDAO routeDAO = DAOFactory.getRouteDAO();
+
+ private CustomRouteService() {
+ }
+
+ public static CustomRouteService getInstance() {
+ return instance;
+ }
+
+ public void saveCustomRouteService2Redis(CustomRouteInfo customRouteInfo, String routeKey) throws Exception {
+ if(customRouteInfo ==null){
+ throw new Exception("input customRouteInfo to be saved is null!");
+ }
+ RouteInfo routeInfo = CustomRouteAdapter.toRouteInfo(customRouteInfo);
+ routeDAO.saveRoute(routeKey, routeInfo);
+ }
+
+ public long deleteCustomRouteService2Redis(String routeKey) throws Exception {
+ return routeDAO.deleteRoute(routeKey);
+ }
+
+ public long deleteMultiCustomRouteService2Redis(String routeKeyPattern) throws Exception {
+ return routeDAO.deleteMultiRoute(routeKeyPattern);
+ }
+
+ public CustomRouteInfo getCustomRouteInstance(String routeKey) throws Exception {
+ CustomRouteInfo customRouteInfo = null;
+ RouteInfo routeInfo = null;
+ routeInfo = routeDAO.queryRoute(routeKey);
+ if(routeInfo!=null) {
+ customRouteInfo = CustomRouteAdapter.fromRouteInfo(routeInfo);
+ }
+ return customRouteInfo;
+ }
+
+ public List<CustomRouteInfo> getMultiCustomRouteInstances(String customRedisKeyPattern) throws Exception {
+ List<CustomRouteInfo> customRouteList = new ArrayList<>();
+ List<RouteInfo> routeInfoList = routeDAO.queryMultiRoute(customRedisKeyPattern);
+ for (RouteInfo routeInfo : routeInfoList) {
+ if (routeInfo != null) {
+ CustomRouteInfo customRouteInfo = CustomRouteAdapter.fromRouteInfo(routeInfo);;
+ customRouteList.add(customRouteInfo);
+ }
+ }
+ return customRouteList;
+ }
+
+ public void updateCustomRouteStatus2Redis(String routeKey,String status) throws Exception {
+ RouteInfo routeInfo = routeDAO.queryRoute(routeKey);
+ if(routeInfo != null){
+ routeInfo.setStatus(status);
+ routeDAO.saveRoute(routeKey,routeInfo);
+ }else{
+ throw new Exception("service to be updated is not exist! Update failed");
+ }
+ }
+
+}
+
+class CustomRouteAdapter {
+ public static RouteInfo toRouteInfo(CustomRouteInfo customRouteInfo) {
+ RouteInfo routeInfo = new RouteInfo();
+ routeInfo.setStatus(customRouteInfo.getStatus());
+
+
+ Spec spec = new Spec();
+ spec.setVisualRange(customRouteInfo.getVisualRange());
+ spec.setUrl(customRouteInfo.getUrl().trim());
+ spec.setPublish_port(customRouteInfo.getPublish_port());
+ spec.setHost(customRouteInfo.getHost());
+ spec.setConsulServiceName(customRouteInfo.getConsulServiceName());
+ spec.setUseOwnUpstream(customRouteInfo.getUseOwnUpstream());
+ spec.setPublish_protocol(customRouteInfo.getPublishProtocol());
+ spec.setEnable_ssl(customRouteInfo.isEnable_ssl());
+ spec.setControl(customRouteInfo.getControl());
+ RouteServer[] routeServers = customRouteInfo.getServers();
+ List<Node> nodeList = new ArrayList<>();
+ for (RouteServer server: routeServers){
+ Node node = new Node();
+ node.setIp(server.getIp());
+ node.setPort(Integer.parseInt(server.getPort()));
+ node.setWeight(server.getWeight());
+ nodeList.add(node);
+ }
+ spec.setNodes(nodeList.toArray(new Node[]{}));
+ routeInfo.setSpec(spec);
+
+ Metadata metadata = new Metadata();
+ metadata.setName(customRouteInfo.getServiceName());
+ metadata.setNamespace(customRouteInfo.getNamespace());
+ Calendar now = Calendar.getInstance();
+ now.set(Calendar.MILLISECOND, 0);
+ metadata.setUpdateTimestamp(now.getTime());
+ routeInfo.setMetadata(metadata);
+
+ return routeInfo;
+ }
+
+ public static CustomRouteInfo fromRouteInfo(RouteInfo routeInfo) {
+ CustomRouteInfo customRouteInfo = new CustomRouteInfo();
+ customRouteInfo.setStatus(routeInfo.getStatus());
+
+ Spec spec = routeInfo.getSpec();
+ customRouteInfo.setVisualRange(spec.getVisualRange());
+ customRouteInfo.setUrl(spec.getUrl());
+ customRouteInfo.setPublish_port(spec.getPublish_port());
+ customRouteInfo.setHost(spec.getHost());
+ customRouteInfo.setConsulServiceName(spec.getConsulServiceName());
+ customRouteInfo.setUseOwnUpstream(spec.getUseOwnUpstream());
+ customRouteInfo.setPublishProtocol(spec.getPublish_protocol());
+ customRouteInfo.setEnable_ssl(spec.isEnable_ssl());
+ customRouteInfo.setControl(spec.getControl());
+ Node[] nodes = spec.getNodes();
+ List<RouteServer> routeServerList = new ArrayList<>();
+ for (Node node: nodes){
+ RouteServer routeServer = new RouteServer();
+ routeServer.setIp(node.getIp());
+ routeServer.setPort(String.valueOf(node.getPort()));
+ routeServer.setWeight(node.getWeight());
+ routeServerList.add(routeServer);
+ }
+ customRouteInfo.setServers(routeServerList.toArray(new RouteServer[]{}));
+
+ Metadata metadata = routeInfo.getMetadata();
+ customRouteInfo.setServiceName(metadata.getName());
+ customRouteInfo.setNamespace(metadata.getNamespace());
+
+ return customRouteInfo;
+ }
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/IuiRouteService.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/IuiRouteService.java
new file mode 100644
index 0000000..c46cb75
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/IuiRouteService.java
@@ -0,0 +1,151 @@
+package org.onap.msb.apiroute.wrapper.service;
+
+import org.onap.msb.apiroute.api.IuiRouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.wrapper.dao.DAOFactory;
+import org.onap.msb.apiroute.wrapper.dao.route.IRouteDAO;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.Metadata;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.Node;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.RouteInfo;
+import org.onap.msb.apiroute.wrapper.dao.route.bean.Spec;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+
+public class IuiRouteService {
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomRouteService.class);
+
+ private static final IuiRouteService instance = new IuiRouteService();
+ private IRouteDAO routeDAO = DAOFactory.getRouteDAO();
+
+ private IuiRouteService() {
+ }
+
+ public static IuiRouteService getInstance() {
+ return instance;
+ }
+
+ public void saveIuiRouteService2Redis(IuiRouteInfo iuiRouteInfo, String routeKey) throws Exception {
+ if(iuiRouteInfo ==null){
+ throw new Exception("input apiRouteInfo to be saved is null!");
+ }
+ RouteInfo routeInfo = IuiRouteAdapter.toRouteInfo(iuiRouteInfo);
+ routeDAO.saveRoute(routeKey, routeInfo);
+ }
+
+ public long deleteIuiRouteService2Redis(String routeKey) throws Exception {
+ return routeDAO.deleteRoute(routeKey);
+ }
+
+ public long deleteMultiIuiRouteService2Redis(String routeKeyPattern) throws Exception {
+ return routeDAO.deleteMultiRoute(routeKeyPattern);
+ }
+
+ public IuiRouteInfo getIuiRouteInstance(String routeKey) throws Exception {
+ IuiRouteInfo iuiRouteInfo = null;
+ RouteInfo routeInfo = null;
+ routeInfo = routeDAO.queryRoute(routeKey);
+ if(routeInfo!=null) {
+ iuiRouteInfo = IuiRouteAdapter.fromRouteInfo(routeInfo);
+ }
+ return iuiRouteInfo;
+ }
+
+ public List<IuiRouteInfo> getMultiIuiRouteInstances(String apiRedisKeyPattern) throws Exception {
+ List<IuiRouteInfo> iuiRouteList = new ArrayList<>();
+ List<RouteInfo> routeInfoList = routeDAO.queryMultiRoute(apiRedisKeyPattern);
+ for (RouteInfo routeInfo : routeInfoList) {
+ if (routeInfo != null) {
+ IuiRouteInfo iuiRouteInfo = IuiRouteAdapter.fromRouteInfo(routeInfo);;
+ iuiRouteList.add(iuiRouteInfo);
+ }
+ }
+ return iuiRouteList;
+ }
+
+ public void updateIuiRouteStatus2Redis(String routeKey,String status) throws Exception {
+ RouteInfo routeInfo = routeDAO.queryRoute(routeKey);
+ if(routeInfo != null){
+ routeInfo.setStatus(status);
+ routeDAO.saveRoute(routeKey,routeInfo);
+ }else{
+ throw new Exception("service to be updated is not exist! Update failed");
+ }
+ }
+
+}
+
+class IuiRouteAdapter {
+ public static RouteInfo toRouteInfo(IuiRouteInfo iuiRouteInfo) {
+ RouteInfo routeInfo = new RouteInfo();
+ routeInfo.setStatus(iuiRouteInfo.getStatus());
+
+
+ Spec spec = new Spec();
+ spec.setVisualRange(iuiRouteInfo.getVisualRange());
+ spec.setUrl(iuiRouteInfo.getUrl().trim());
+ spec.setPublish_port(iuiRouteInfo.getPublish_port());
+ spec.setHost(iuiRouteInfo.getHost());
+ spec.setConsulServiceName(iuiRouteInfo.getConsulServiceName());
+ spec.setUseOwnUpstream(iuiRouteInfo.getUseOwnUpstream());
+ spec.setPublish_protocol(iuiRouteInfo.getPublishProtocol());
+ spec.setEnable_ssl(iuiRouteInfo.isEnable_ssl());
+ spec.setControl(iuiRouteInfo.getControl());
+ RouteServer[] routeServers = iuiRouteInfo.getServers();
+ List<Node> nodeList = new ArrayList<>();
+ for (RouteServer server: routeServers){
+ Node node = new Node();
+ node.setIp(server.getIp());
+ node.setPort(Integer.parseInt(server.getPort()));
+ node.setWeight(server.getWeight());
+ nodeList.add(node);
+ }
+ spec.setNodes(nodeList.toArray(new Node[]{}));
+ routeInfo.setSpec(spec);
+
+ Metadata metadata = new Metadata();
+ metadata.setName(iuiRouteInfo.getServiceName());
+ metadata.setNamespace(iuiRouteInfo.getNamespace());
+ Calendar now = Calendar.getInstance();
+ now.set(Calendar.MILLISECOND, 0);
+ metadata.setUpdateTimestamp(now.getTime());
+ routeInfo.setMetadata(metadata);
+ return routeInfo;
+ }
+
+ public static IuiRouteInfo fromRouteInfo(RouteInfo routeInfo) {
+ IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
+ iuiRouteInfo.setStatus(routeInfo.getStatus());
+
+ Spec spec = routeInfo.getSpec();
+ iuiRouteInfo.setVisualRange(spec.getVisualRange());
+ iuiRouteInfo.setUrl(spec.getUrl());
+ iuiRouteInfo.setPublish_port(spec.getPublish_port());
+ iuiRouteInfo.setHost(spec.getHost());
+ iuiRouteInfo.setConsulServiceName(spec.getConsulServiceName());
+ iuiRouteInfo.setUseOwnUpstream(spec.getUseOwnUpstream());
+ iuiRouteInfo.setPublishProtocol(spec.getPublish_protocol());
+ iuiRouteInfo.setEnable_ssl(spec.isEnable_ssl());
+ iuiRouteInfo.setControl(spec.getControl());
+ Node[] nodes = spec.getNodes();
+ List<RouteServer> routeServerList = new ArrayList<>();
+ for (Node node: nodes){
+ RouteServer routeServer = new RouteServer();
+ routeServer.setIp(node.getIp());
+ routeServer.setPort(String.valueOf(node.getPort()));
+ routeServer.setWeight(node.getWeight());
+ routeServerList.add(routeServer);
+ }
+ iuiRouteInfo.setServers(routeServerList.toArray(new RouteServer[]{}));
+
+ Metadata metadata = routeInfo.getMetadata();
+ iuiRouteInfo.setServiceName(metadata.getName());
+ iuiRouteInfo.setNamespace(metadata.getNamespace());
+
+ return iuiRouteInfo;
+ }
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/MicroServiceFullService.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/MicroServiceFullService.java
new file mode 100644
index 0000000..af005ae
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/service/MicroServiceFullService.java
@@ -0,0 +1,220 @@
+package org.onap.msb.apiroute.wrapper.service;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.wrapper.dao.DAOFactory;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.dao.service.IServiceDAO;
+import org.onap.msb.apiroute.wrapper.dao.service.bean.Metadata;
+import org.onap.msb.apiroute.wrapper.dao.service.bean.ServiceInfo;
+import org.onap.msb.apiroute.wrapper.dao.service.bean.Spec;
+import org.onap.msb.apiroute.wrapper.util.MicroServiceUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ImmutableSet;
+
+public class MicroServiceFullService {
+ private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceFullService.class);
+
+ private static MicroServiceFullService instance = new MicroServiceFullService();
+
+ private IServiceDAO serviceDAO = DAOFactory.getServiceDAO();
+
+ private MicroServiceFullService() {
+ }
+
+ public static MicroServiceFullService getInstance() {
+ return instance;
+ }
+
+ public List<MicroServiceFullInfo> getAllMicroServiceInstances() throws Exception {
+ String serviceKeyPattern = MicroServiceUtil.getPrefixedKey("*");
+
+ List<MicroServiceFullInfo> microServiceFullInfoList = new ArrayList<>();
+ List<ServiceInfo> serviceInfoList = serviceDAO.queryMultiService(serviceKeyPattern);
+ for (ServiceInfo serviceInfo : serviceInfoList) {
+ if (serviceInfo != null) {
+ MicroServiceFullInfo microServiceFullInfo = MicroServiceFullAdapter.fromServiceInfo(serviceInfo);
+ ;
+ microServiceFullInfoList.add(microServiceFullInfo);
+ }
+ }
+ return microServiceFullInfoList;
+ }
+
+ public Set<String> getAllMicroServiceKey() throws Exception {
+ final Set<String> builder = new HashSet<String>();
+
+ String serviceKeyPattern = MicroServiceUtil.getPrefixedKey("*");
+ Set<String> serviceKeySet = RedisAccessWrapper.filterKeys(serviceKeyPattern);
+
+ Pattern serviceKeyRegexPattern = MicroServiceUtil.getServiceKeyRegexPattern();
+ for (String serviceKey : serviceKeySet) {
+ Matcher matcher = serviceKeyRegexPattern.matcher(serviceKey);
+ if (matcher.matches()) {
+ builder.add(matcher.group("servicename"));
+ }
+ }
+ return builder;
+ }
+
+ public void saveMicroServiceInfo2Redis(MicroServiceFullInfo microServiceFullInfo) throws Exception {
+ if(microServiceFullInfo ==null){
+ throw new Exception("input microServiceInfo to be saved is null!");
+ }
+ ServiceInfo serviceInfo = MicroServiceFullAdapter.toServiceInfo(microServiceFullInfo);
+ String serviceKey = MicroServiceUtil.getServiceKey(microServiceFullInfo.getServiceName(),microServiceFullInfo.getVersion());
+ serviceDAO.saveService(serviceKey,serviceInfo);
+ }
+
+ public void updateMicroServiceStatus(String serviceName, String version, String status)
+ throws Exception {
+ if (null == version || "null".equals(version)) {
+ version = "";
+ }
+ String serviceKey = MicroServiceUtil.getServiceKey(serviceName, version);
+ ServiceInfo serviceInfo = serviceDAO.queryService(serviceKey);
+ if(serviceInfo != null){
+ serviceInfo.setStatus(status);
+ serviceDAO.saveService(serviceKey,serviceInfo);
+ }
+ }
+
+ public boolean existsMicroServiceInstance(String serviceName, String version)
+ throws Exception {
+ if (null == version || "null".equals(version)) {
+ version = "";
+ }
+ String serviceKey = MicroServiceUtil.getServiceKey(serviceName, version);
+ return RedisAccessWrapper.isExist(serviceKey);
+ }
+
+ public MicroServiceFullInfo getMicroServiceInstance(String serviceName, String version)
+ throws Exception {
+ if (null == version || "null".equals(version)) {
+ version = "";
+ }
+ String serviceKey = MicroServiceUtil.getServiceKey(serviceName, version);
+
+ MicroServiceFullInfo microServiceInfo = null;
+
+ ServiceInfo serviceInfo = null;
+ serviceInfo = serviceDAO.queryService(serviceKey);
+ if(serviceInfo!=null) {
+ microServiceInfo = MicroServiceFullAdapter.fromServiceInfo(serviceInfo);
+ }
+ return microServiceInfo;
+ }
+
+ /**
+ * query all the versions of the given ServiceName
+ * @param serviceName
+ * @return
+ * @throws Exception
+ */
+ public List<MicroServiceFullInfo> getAllVersionsOfTheService(String serviceName) throws Exception {
+ String serviceKeyPattern = MicroServiceUtil.getPrefixedKey(serviceName, "*");
+
+ List<MicroServiceFullInfo> microServiceFullInfoList = new ArrayList<>();
+ List<ServiceInfo> serviceInfoList = serviceDAO.queryMultiService(serviceKeyPattern);
+ for (ServiceInfo serviceInfo : serviceInfoList) {
+ if (serviceInfo != null) {
+ MicroServiceFullInfo microServiceFullInfo = MicroServiceFullAdapter.fromServiceInfo(serviceInfo);
+ microServiceFullInfoList.add(microServiceFullInfo);
+ }
+ }
+ return microServiceFullInfoList;
+ }
+
+ public void deleteMicroService(String serviceName, String version) throws Exception {
+ if (null == version || "null".equals(version)) {
+ version = "";
+ }
+ String serviceKey = MicroServiceUtil.getServiceKey(serviceName, version);
+ serviceDAO.deleteService(serviceKey);
+ }
+
+ public long deleteMultiMicroService(String keyPattern) throws Exception {
+ return serviceDAO.deleteMultiService(keyPattern);
+ }
+}
+
+class MicroServiceFullAdapter {
+ public static ServiceInfo toServiceInfo(MicroServiceFullInfo microServiceFullInfo) {
+ ServiceInfo serviceInfo = new ServiceInfo();
+ serviceInfo.setApiVersion(microServiceFullInfo.getVersion());
+ serviceInfo.setStatus(microServiceFullInfo.getStatus());
+
+
+ Spec spec = new Spec();
+ spec.setVisualRange(microServiceFullInfo.getVisualRange());
+ spec.setUrl(microServiceFullInfo.getUrl());
+ spec.setPublish_port(microServiceFullInfo.getPublish_port());
+ spec.setHost(microServiceFullInfo.getHost());
+ spec.setProtocol(microServiceFullInfo.getProtocol());
+ spec.setLb_policy(microServiceFullInfo.getLb_policy());
+ spec.setEnable_ssl(microServiceFullInfo.isEnable_ssl());
+ Set<org.onap.msb.apiroute.api.Node> nodeSet = microServiceFullInfo.getNodes();
+ List<org.onap.msb.apiroute.wrapper.dao.service.bean.Node> serviceNodeList = new ArrayList<>();
+ for (org.onap.msb.apiroute.api.Node node : nodeSet) {
+ org.onap.msb.apiroute.wrapper.dao.service.bean.Node serviceNode = new org.onap.msb.apiroute.wrapper.dao.service.bean.Node();
+ serviceNode.setIp(node.getIp());
+ serviceNode.setPort(node.getPort());
+ serviceNode.setTtl(node.getTtl());
+ serviceNodeList.add(serviceNode);
+ }
+ spec.setNodes(serviceNodeList.toArray(new org.onap.msb.apiroute.wrapper.dao.service.bean.Node[]{}));
+ serviceInfo.setSpec(spec);
+
+ Metadata metadata = new Metadata();
+ metadata.setName(microServiceFullInfo.getServiceName());
+ metadata.setNamespace(microServiceFullInfo.getNamespace());
+ Calendar now = Calendar.getInstance();
+ now.set(Calendar.MILLISECOND, 0);
+ metadata.setUpdateTimestamp(now.getTime());
+ serviceInfo.setMetadata(metadata);
+
+ return serviceInfo;
+ }
+
+ public static MicroServiceFullInfo fromServiceInfo(ServiceInfo serviceInfo) {
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+
+ microServiceFullInfo.setVersion(serviceInfo.getApiVersion());
+ microServiceFullInfo.setStatus(serviceInfo.getStatus());
+
+ Spec spec = serviceInfo.getSpec();
+ microServiceFullInfo.setVisualRange(spec.getVisualRange());
+ microServiceFullInfo.setUrl(spec.getUrl());
+ microServiceFullInfo.setPath(spec.getPath());
+ microServiceFullInfo.setPublish_port(spec.getPublish_port());
+ microServiceFullInfo.setHost(spec.getHost());
+ microServiceFullInfo.setProtocol(spec.getProtocol());
+ microServiceFullInfo.setLb_policy(spec.getLb_policy());
+ microServiceFullInfo.setEnable_ssl(spec.isEnable_ssl());
+ org.onap.msb.apiroute.wrapper.dao.service.bean.Node[] serviceNodes = spec.getNodes();
+ List<org.onap.msb.apiroute.api.Node> nodeList = new ArrayList<>();
+ for (org.onap.msb.apiroute.wrapper.dao.service.bean.Node serviceNode : serviceNodes) {
+ org.onap.msb.apiroute.api.Node node = new org.onap.msb.apiroute.api.Node();
+ node.setIp(serviceNode.getIp());
+ node.setPort(String.valueOf(serviceNode.getPort()));
+ node.setTtl(serviceNode.getTtl());
+ nodeList.add(node);
+ }
+ microServiceFullInfo.setNodes(new HashSet<org.onap.msb.apiroute.api.Node>(nodeList));
+
+ Metadata metadata = serviceInfo.getMetadata();
+ microServiceFullInfo.setServiceName(metadata.getName());
+ microServiceFullInfo.setNamespace(metadata.getNamespace());
+
+ return microServiceFullInfo;
+ }
+}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/IMicroServiceChangeListener.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/serviceListener/IMicroServiceChangeListener.java
index e37bb06..68e31f8 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/IMicroServiceChangeListener.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/serviceListener/IMicroServiceChangeListener.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,19 +13,25 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.wrapper.serviceListener;
-import org.openo.msb.api.MicroServiceInfo;
-import org.openo.msb.api.Service;
+
+package org.onap.msb.apiroute.wrapper.serviceListener;
+
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.api.Node;
public interface IMicroServiceChangeListener {
- public void onSave(Service microServiceInfo,String serverPort);
+ public void onSave(MicroServiceFullInfo microServiceInfo) throws Exception;
+
+ public void onDelete(MicroServiceFullInfo microServiceInfo) throws Exception;
- public void onChange(String serviceName,String version,Service microServiceInfo,String serverPort);
+ public void onChange(String serviceName,String version,MicroServiceFullInfo microServiceInfo) throws Exception;
- public void onStatusChange(String serviceName,String url,String version,String protocol,String status);
+ public void onStatusChange(String serviceName,String version,String host, String protocol,String publish_port,
+ String status);
- public void onDelete(String serviceName, String url,String version,String protocol,String serverPort);
+
+
}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/serviceListener/MicroServiceChangeListener.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/serviceListener/MicroServiceChangeListener.java
new file mode 100644
index 0000000..73b6a9c
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/serviceListener/MicroServiceChangeListener.java
@@ -0,0 +1,779 @@
+package org.onap.msb.apiroute.wrapper.serviceListener;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.onap.msb.apiroute.api.ApiRouteInfo;
+import org.onap.msb.apiroute.api.CustomRouteInfo;
+import org.onap.msb.apiroute.api.DiscoverInfo;
+import org.onap.msb.apiroute.api.IuiRouteInfo;
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.api.Node;
+import org.onap.msb.apiroute.api.PublishFullAddress;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.wrapper.ApiRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.CustomRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.IuiRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.util.CommonUtil;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.onap.msb.apiroute.wrapper.util.HttpClientUtil;
+import org.onap.msb.apiroute.wrapper.util.JacksonJsonUtil;
+import org.onap.msb.apiroute.wrapper.util.RegExpTestUtil;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+public class MicroServiceChangeListener implements IMicroServiceChangeListener {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceChangeListener.class);
+
+ @Override
+ public void onDelete(MicroServiceFullInfo microServiceInfo) throws Exception {
+
+ String path = microServiceInfo.getPath();
+
+ String[] routeWay = ConfigUtil.getInstance().getRouteWay();
+
+ for (int i = 0; i < routeWay.length; i++) {
+
+ if (StringUtils.isNotBlank(path) && !"/".equals(path)) {
+ // 1.按path优先判断类型
+ String host = getHost(microServiceInfo);
+ deleteServiceByUrl(path, host, microServiceInfo.getPublish_port(), routeWay[i]);
+ } else {
+ // 2.1 域å判断url
+ if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay[i]) && ifRootByDomain(microServiceInfo)) {
+ deleteServiceByDomain4Root(microServiceInfo);
+ } else {
+ // 2.2 按å议优先判断类型
+ deleteServiceByProtocol(microServiceInfo, routeWay[i]);
+ }
+
+ }
+
+
+ }
+
+ }
+
+
+ @Override
+ public void onSave(MicroServiceFullInfo microServiceInfo) throws Exception {
+
+ String path = microServiceInfo.getPath();
+ String[] routeWay = ConfigUtil.getInstance().getRouteWay();
+
+ for (int i = 0; i < routeWay.length; i++) {
+ // 1.按path优先判断类型
+ if (StringUtils.isNotBlank(path) && !"/".equals(path)) {
+ saveServiceByPath(microServiceInfo, routeWay[i]);
+ } else {
+ // 2.1 域å判断url
+ if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay[i]) && ifRootByDomain(microServiceInfo)) {
+ saveServiceByDomain4Root(microServiceInfo);
+ } else {
+ // 2.2 按å议优先判断类型
+ saveServiceByProtocol(microServiceInfo, routeWay[i]);
+ }
+ }
+ }
+
+ }
+
+
+ //判断按åè®®å‘布地å€æ˜¯å¦å’Œæ³¨å†Œçš„URL一致,如果一致å‘布地å€ä¿å­˜ä¸º/,å¦åˆ™ä¿å­˜ä¸ºå议类型的å‘布地å€
+ private boolean ifRootByDomain(MicroServiceFullInfo microServiceInfo){
+
+
+ if("/".equals(microServiceInfo.getUrl())) return true;
+
+ String protocol = microServiceInfo.getProtocol();
+ String routeName =
+ RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
+ microServiceInfo.getNamespace());
+ String publishUrl="";
+ String version = "";
+ if (StringUtils.isNotBlank(microServiceInfo.getVersion())) {
+ version = "/" + microServiceInfo.getVersion();
+ }
+
+ switch (protocol) {
+ case RouteUtil.PROTOCOL_UI:
+ publishUrl = "/iui/" + routeName;
+ break;
+ case RouteUtil.PROTOCOL_REST:
+ publishUrl = "/api/" + routeName + version;
+ break;
+ case RouteUtil.PROTOCOL_HTTP:
+ publishUrl = "/" + routeName + version;
+ break;
+ }
+ return publishUrl.equals(microServiceInfo.getUrl());
+
+ }
+
+
+ private void saveServiceByDomain4Root(MicroServiceFullInfo microServiceInfo) throws Exception {
+
+ CustomRouteInfo[] customRouteInfos =
+ this.buildCustomRouteInfo(microServiceInfo, "/", RouteUtil.ROUTEWAY_DOMAIN);
+ for (int i = 0; i < customRouteInfos.length; i++) {
+ customRouteInfos[i].setUrl("/");
+ CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
+ RouteUtil.ROUTEWAY_DOMAIN);
+ }
+ }
+
+ private void deleteServiceByDomain4Root(MicroServiceFullInfo microServiceInfo) throws Exception {
+
+ CustomRouteServiceWrapper.getInstance().deleteCustomRoute("/", getHost(microServiceInfo),
+ microServiceInfo.getPublish_port(), RouteUtil.ROUTEWAY_DOMAIN);
+ }
+
+ /**
+ * @Title saveServiceByProtocol
+ * @Description TODO(按用户注册åè®®ä¿å­˜æœåŠ¡)
+ * @param microServiceInfo
+ * @param routeWay
+ * @return void
+ * @throws Exception
+ */
+ private void saveServiceByProtocol(MicroServiceFullInfo microServiceInfo, String routeWay)
+ throws Exception {
+ String protocol = microServiceInfo.getProtocol();
+ String routeName =
+ RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
+ microServiceInfo.getNamespace());
+
+ switch (protocol) {
+ case RouteUtil.PROTOCOL_UI:
+ IuiRouteInfo[] iuiRouteInfos =
+ this.buildIuiRouteInfo(microServiceInfo, routeName, routeWay);
+ for (int i = 0; i < iuiRouteInfos.length; i++) {
+ IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfos[i], routeWay);
+ }
+ break;
+
+ case RouteUtil.PROTOCOL_REST:
+
+ ApiRouteInfo[] apiRouteInfos =
+ this.buildApiRouteInfo(microServiceInfo, routeName, microServiceInfo.getVersion(),
+ routeWay);
+ for (int i = 0; i < apiRouteInfos.length; i++) {
+ ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfos[i], routeWay);
+ }
+ break;
+ case RouteUtil.PROTOCOL_HTTP:
+ CustomRouteInfo[] customRouteInfos =
+ this.buildCustomRouteInfo(microServiceInfo,
+ getHttpName(routeName, microServiceInfo.getVersion()), routeWay);
+ for (int i = 0; i < customRouteInfos.length; i++) {
+ CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
+ routeWay);
+ }
+ break;
+ }
+ }
+
+ /**
+ * @Title deleteServiceByProtocol
+ * @Description TODO(按用户注册å议删除æœåŠ¡)
+ * @param microServiceInfo
+ * @param routeWay
+ * @return void
+ */
+ private void deleteServiceByProtocol(MicroServiceFullInfo microServiceInfo, String routeWay) {
+ String protocol = microServiceInfo.getProtocol();
+ String host = getHost(microServiceInfo);
+ String routeName =
+ RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
+ microServiceInfo.getNamespace());
+
+ if (RouteUtil.PROTOCOL_UI.equals(protocol)) {
+
+ if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
+ // two ports
+ String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
+ if (publishPorts.length == 2) {
+ IuiRouteServiceWrapper.getInstance().deleteIuiRoute(routeName, host, publishPorts[0],
+ routeWay);
+ IuiRouteServiceWrapper.getInstance().deleteIuiRoute(routeName, host, publishPorts[1],
+ routeWay);
+ return;
+ }
+ }
+
+ IuiRouteServiceWrapper.getInstance().deleteIuiRoute(routeName, host,
+ microServiceInfo.getPublish_port(), routeWay);
+ } else if (RouteUtil.PROTOCOL_REST.equals(protocol)) {
+
+ if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
+ // two ports
+ String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
+ if (publishPorts.length == 2) {
+ ApiRouteServiceWrapper.getInstance().deleteApiRoute(routeName,
+ microServiceInfo.getVersion(), host, publishPorts[0], routeWay);
+ ApiRouteServiceWrapper.getInstance().deleteApiRoute(routeName,
+ microServiceInfo.getVersion(), host, publishPorts[1], routeWay);
+ return;
+ }
+ }
+ ApiRouteServiceWrapper.getInstance().deleteApiRoute(routeName, microServiceInfo.getVersion(),
+ host, microServiceInfo.getPublish_port(), routeWay);
+ } else if (RouteUtil.PROTOCOL_HTTP.equals(protocol)) {
+
+ if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
+ // two ports
+ String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
+ if (publishPorts.length == 2) {
+ CustomRouteServiceWrapper.getInstance().deleteCustomRoute(
+ getHttpName(routeName, microServiceInfo.getVersion()), host, publishPorts[0],
+ routeWay);
+ CustomRouteServiceWrapper.getInstance().deleteCustomRoute(
+ getHttpName(routeName, microServiceInfo.getVersion()), host, publishPorts[1],
+ routeWay);
+ return;
+ }
+ }
+ CustomRouteServiceWrapper.getInstance().deleteCustomRoute(
+ getHttpName(routeName, microServiceInfo.getVersion()), host,
+ microServiceInfo.getPublish_port(), routeWay);
+ }
+ }
+
+ /**
+ * @Title saveServiceByUrl
+ * @Description TODO(按URL地å€åˆ¤æ–­æœåŠ¡å议并ä¿å­˜åˆ°è·¯ç”±è¡¨)
+ * @param url
+ * @param microServiceInfo
+ * @param routeWay
+ * @return void
+ * @throws Exception
+ */
+ private void saveServiceByPath(MicroServiceFullInfo microServiceInfo, String routeWay)
+ throws Exception {
+ String redis_serviceName;
+ String path=microServiceInfo.getPath();
+ if (RegExpTestUtil.apiRouteUrlRegExpTest(path)) {
+ // protocol:"REST"
+ String[] serviceKey = RegExpTestUtil.apiServiceNameMatch4URL(path);
+ if (serviceKey == null) {
+ LOGGER.error("save api Service ByUrl is error:[url]" + path);
+ return;
+ }
+ redis_serviceName = serviceKey[0];
+ String redis_serviceVersion = serviceKey[1];
+
+ ApiRouteInfo[] apiRouteInfos =
+ this.buildApiRouteInfo(microServiceInfo, redis_serviceName, redis_serviceVersion,
+ routeWay);
+ for (int i = 0; i < apiRouteInfos.length; i++) {
+ ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfos[i], routeWay);
+ }
+ } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(path)) {
+ // protocol:"UI"
+ // æ ¹æ®url获å–æœåŠ¡å
+ redis_serviceName = RegExpTestUtil.iuiServiceNameMatch4URL(path);
+ if (redis_serviceName == null) {
+ LOGGER.error("save iui Service ByUrl is error:[url]" + path);
+ return;
+ }
+ IuiRouteInfo[] iuiRouteInfos =
+ this.buildIuiRouteInfo(microServiceInfo, redis_serviceName, routeWay);
+ for (int i = 0; i < iuiRouteInfos.length; i++) {
+ IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfos[i], routeWay);
+ }
+ } else {
+ // protocol:"HTTP";
+ redis_serviceName = path;
+ CustomRouteInfo[] customRouteInfos =
+ this.buildCustomRouteInfo(microServiceInfo, redis_serviceName, routeWay);
+ for (int i = 0; i < customRouteInfos.length; i++) {
+ CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
+ routeWay);
+ }
+ }
+ }
+
+ /**
+ * @Title deleteServiceByUrl
+ * @Description TODO(按URL地å€åˆ¤æ–­æœåŠ¡å议并从路由表删除)
+ * @param url
+ * @param host
+ * @param publish_port
+ * @param routeWay
+ * @return void
+ */
+ private void deleteServiceByUrl(String url, String host, String publish_port, String routeWay) {
+ // æ ¹æ®Urlæ ¼å¼åˆ¤æ–­æœåŠ¡ç±»åž‹
+ String redis_serviceName;
+
+ if (RegExpTestUtil.apiRouteUrlRegExpTest(url)) {
+ // protocol:"REST"
+ String[] serviceKey = RegExpTestUtil.apiServiceNameMatch4URL(url);
+ if (serviceKey == null) {
+ LOGGER.error("delete api Service ByUrl is error:[url]" + url);
+ return;
+ }
+
+ redis_serviceName = serviceKey[0];
+ String redis_serviceVersion = serviceKey[1];
+
+ if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
+ // two ports
+ String[] publishPorts = StringUtils.split(publish_port, "|");
+ if (publishPorts.length == 2) {
+ ApiRouteServiceWrapper.getInstance().deleteApiRoute(redis_serviceName,
+ redis_serviceVersion, host, publishPorts[0], routeWay);
+ ApiRouteServiceWrapper.getInstance().deleteApiRoute(redis_serviceName,
+ redis_serviceVersion, host, publishPorts[1], routeWay);
+ return;
+ }
+ }
+
+ ApiRouteServiceWrapper.getInstance().deleteApiRoute(redis_serviceName, redis_serviceVersion,
+ host, publish_port, routeWay);
+
+
+
+ } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(url)) {
+ // protocol:"UI"
+ // æ ¹æ®url获å–æœåŠ¡å
+ redis_serviceName = RegExpTestUtil.iuiServiceNameMatch4URL(url);
+ if (redis_serviceName == null) {
+ LOGGER.error("delete iui Service ByUrl is error:[url]" + url);
+ return;
+ }
+
+ if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
+ // two ports
+ String[] publishPorts = StringUtils.split(publish_port, "|");
+ if (publishPorts.length == 2) {
+ IuiRouteServiceWrapper.getInstance().deleteIuiRoute(redis_serviceName, host,
+ publishPorts[0], routeWay);
+ IuiRouteServiceWrapper.getInstance().deleteIuiRoute(redis_serviceName, host,
+ publishPorts[1], routeWay);
+ return;
+ }
+ }
+
+ IuiRouteServiceWrapper.getInstance().deleteIuiRoute(redis_serviceName, host, publish_port,
+ routeWay);
+
+
+ } else {
+ // protocol:"HTTP";
+ redis_serviceName = url;
+
+ if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
+ // two ports
+ String[] publishPorts = StringUtils.split(publish_port, "|");
+ if (publishPorts.length == 2) {
+ CustomRouteServiceWrapper.getInstance().deleteCustomRoute(redis_serviceName, host,
+ publishPorts[0], routeWay);
+ CustomRouteServiceWrapper.getInstance().deleteCustomRoute(redis_serviceName, host,
+ publishPorts[1], routeWay);
+ return;
+ }
+ }
+
+ CustomRouteServiceWrapper.getInstance().deleteCustomRoute(redis_serviceName, host,
+ publish_port, routeWay);
+ }
+
+ }
+
+
+
+ /**
+ * @Title getCustomName
+ * @Description TODO(获å–HTTPæœåŠ¡è·¯ç”±å)
+ * @param routeName
+ * @param version
+ * @return
+ * @return String
+ */
+ private String getHttpName(String routeName, String version) {
+ if (!routeName.startsWith("/")) {
+ routeName = "/" + routeName;
+ }
+
+ if (StringUtils.isNotBlank(version)) {
+ routeName += "/" + version;
+ }
+ return routeName;
+ }
+
+
+ private String getHost(MicroServiceFullInfo microServiceInfo) {
+ String host;
+ if (StringUtils.isNotBlank(microServiceInfo.getHost())) {
+ host = microServiceInfo.getHost().toLowerCase();
+ } else {
+ // host为空,å–默认规则 æœåŠ¡å-ns
+ host = microServiceInfo.getServiceName().toLowerCase();
+ }
+
+ return host;
+ }
+
+
+
+ @Override
+ public void onChange(String serviceName, String version, MicroServiceFullInfo microServiceInfo)
+ throws Exception {
+ // TODO Auto-generated method stub
+
+ if (RouteUtil.PROTOCOL_UI.equals(microServiceInfo.getProtocol())) {
+ IuiRouteInfo[] iuiRouteInfos =
+ this.buildIuiRouteInfo(microServiceInfo, serviceName, RouteUtil.ROUTEWAY_IP);
+ for (int i = 0; i < iuiRouteInfos.length; i++) {
+ IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfos[i],
+ RouteUtil.ROUTEWAY_IP);
+ }
+ } else if (RouteUtil.PROTOCOL_REST.equals(microServiceInfo.getProtocol())) {
+ ApiRouteInfo[] apiRouteInfos =
+ this.buildApiRouteInfo(microServiceInfo, serviceName, version, RouteUtil.ROUTEWAY_IP);
+ for (int i = 0; i < apiRouteInfos.length; i++) {
+ ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfos[i],
+ RouteUtil.ROUTEWAY_IP);
+ }
+ } else if (RouteUtil.PROTOCOL_HTTP.equals(microServiceInfo.getProtocol())) {
+ if (!serviceName.startsWith("/")) {
+ serviceName = "/" + serviceName;
+ }
+ CustomRouteInfo[] customRouteInfos =
+ this.buildCustomRouteInfo(microServiceInfo, serviceName, RouteUtil.ROUTEWAY_IP);
+ for (int i = 0; i < customRouteInfos.length; i++) {
+ CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
+ RouteUtil.ROUTEWAY_IP);
+ }
+ }
+ }
+
+
+ @Override
+ public void onStatusChange(String serviceName, String version, String host, String protocol,
+ String publish_port, String status) {
+
+ // 获å–æœåŠ¡çš„host
+
+ if (StringUtils.isBlank(host)) {
+ host = serviceName.toLowerCase();
+ }
+
+ if (RouteUtil.PROTOCOL_UI.equals(protocol)) {
+
+ IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName, host, publish_port,
+ status, RouteUtil.ROUTEWAY_IP);
+
+ } else if (RouteUtil.PROTOCOL_REST.equals(protocol)) {
+ ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName, version, host,
+ publish_port, status, RouteUtil.ROUTEWAY_IP);
+
+ } else if (RouteUtil.PROTOCOL_HTTP.equals(protocol)) {
+ if (!serviceName.startsWith("/")) {
+ serviceName = "/" + serviceName;
+ }
+ CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName, host,
+ publish_port, status, RouteUtil.ROUTEWAY_IP);
+ }
+
+
+ }
+
+ private boolean buildRouteHttpProtocol(MicroServiceFullInfo microServiceInfo, String routeWay) {
+
+ // Portalå议处ç†
+ if (RouteUtil.CUSTOM_PORTAL.equals(microServiceInfo.getCustom())) {
+ if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ // 自定义开å¯SSL处ç†
+ return microServiceInfo.isEnable_ssl();
+
+ }
+
+ private RouteServer[] buildRouteNodes(MicroServiceFullInfo microServiceInfo, String routeWay) {
+
+ // 针对custom=portal场景的域å路由使用apigatewayå‘布地å€ä½œä¸ºnode
+ if (RouteUtil.CUSTOM_PORTAL.equals(microServiceInfo.getCustom())) {
+ if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay)) {
+
+ String discoverServiceName =
+ RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
+ microServiceInfo.getNamespace());
+ List<Node> publishNodes =
+ getPublishNodes(discoverServiceName, microServiceInfo.getVersion(),
+ microServiceInfo.getNamespace());
+ if (publishNodes != null && publishNodes.size() > 0) {
+ RouteServer[] routeServers = new RouteServer[publishNodes.size()];
+ int i = 0;
+ for (Node node : publishNodes) {
+ RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
+ routeServers[i] = routeServer;
+ i++;
+ }
+ return routeServers;
+ }
+ }
+ }
+
+
+ Set<Node> nodes = microServiceInfo.getNodes();
+ RouteServer[] routeServers = new RouteServer[nodes.size()];
+ int n = 0;
+ for (Node node : nodes) {
+ RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
+ routeServers[n] = routeServer;
+ n++;
+ }
+
+ return routeServers;
+
+ }
+
+ /**
+ * From MicroServiceInfo to ApiRouteInfo
+ *
+ * @param microServiceInfo
+ * @return
+ */
+ private ApiRouteInfo[] buildApiRouteInfo(MicroServiceFullInfo microServiceInfo,
+ String redis_serviceName, String redis_version, String routeWay) {
+
+ ApiRouteInfo apiRouteInfo = new ApiRouteInfo();
+ apiRouteInfo.setUrl(microServiceInfo.getUrl());
+
+ apiRouteInfo.setServers(buildRouteNodes(microServiceInfo, routeWay));
+
+ apiRouteInfo.setVisualRange(RouteUtil.getVisualRangeByRouter(microServiceInfo.getVisualRange()));
+
+
+ if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
+ apiRouteInfo.setUseOwnUpstream("1");
+ }
+
+ apiRouteInfo.setConsulServiceName(microServiceInfo.getServiceName());
+ apiRouteInfo.setServiceName(redis_serviceName);
+ apiRouteInfo.setVersion(redis_version);
+ apiRouteInfo.setApiJson(microServiceInfo.getUrl() + "/swagger.json");
+ apiRouteInfo.setMetricsUrl("/admin/metrics");
+ apiRouteInfo.setEnable_ssl(buildRouteHttpProtocol(microServiceInfo, routeWay));
+ // 默认 HttpProtocol和PublishProtocol=http
+ if (apiRouteInfo.isEnable_ssl()) {
+ apiRouteInfo.setPublishProtocol("https");
+ }
+
+ // 获å–æœåŠ¡çš„host
+ String host = getHost(microServiceInfo);
+
+ apiRouteInfo.setHost(host.toLowerCase());
+ apiRouteInfo.setNamespace(microServiceInfo.getNamespace());
+
+ if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
+
+ if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
+ apiRouteInfo.setPublishProtocol("https");
+ }
+
+ // 获å–æœåŠ¡çš„å‘布端å£(支æŒå¤šç«¯å£æ ¼å¼:https|http)
+ String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
+ if (publishPorts.length == 2) {
+ apiRouteInfo.setPublishProtocol("https");
+ apiRouteInfo.setPublish_port(publishPorts[0]);
+
+ try {
+ ApiRouteInfo apiRouteInfo_http = (ApiRouteInfo) apiRouteInfo.clone();
+ apiRouteInfo.setPublishProtocol("http");
+ apiRouteInfo.setPublish_port(publishPorts[1]);
+ return new ApiRouteInfo[] {apiRouteInfo, apiRouteInfo_http};
+ } catch (CloneNotSupportedException e) {
+ LOGGER.error("CLONE is wrong:" + apiRouteInfo);
+ return new ApiRouteInfo[] {apiRouteInfo};
+ }
+
+ }
+ }
+
+
+
+ apiRouteInfo.setPublish_port(microServiceInfo.getPublish_port());
+ return new ApiRouteInfo[] {apiRouteInfo};
+
+
+ }
+
+
+ /**
+ * From MicroServiceInfo to CustomRouteInfo
+ *
+ * @param microServiceInfo
+ * @return
+ */
+ private CustomRouteInfo[] buildCustomRouteInfo(MicroServiceFullInfo microServiceInfo,
+ String redis_serviceName, String routeWay) {
+
+ CustomRouteInfo customRouteInfo = new CustomRouteInfo();
+ customRouteInfo.setUrl(microServiceInfo.getUrl());
+
+
+ customRouteInfo.setServers(buildRouteNodes(microServiceInfo, routeWay));
+
+ customRouteInfo.setVisualRange(RouteUtil.getVisualRangeByRouter(microServiceInfo.getVisualRange()));
+
+ if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
+ customRouteInfo.setUseOwnUpstream("1");
+ }
+
+ customRouteInfo.setConsulServiceName(microServiceInfo.getServiceName());
+ customRouteInfo.setServiceName(redis_serviceName);
+
+ // 获å–æœåŠ¡çš„host
+ String host = getHost(microServiceInfo);
+
+ customRouteInfo.setHost(host.toLowerCase());
+ customRouteInfo.setNamespace(microServiceInfo.getNamespace());
+ customRouteInfo.setEnable_ssl(buildRouteHttpProtocol(microServiceInfo, routeWay));
+
+ if (customRouteInfo.isEnable_ssl()) {
+ customRouteInfo.setPublishProtocol("https");
+ }
+
+
+ if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
+ if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
+ customRouteInfo.setPublishProtocol("https");
+ }
+
+ String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
+ if (publishPorts.length == 2) {
+ // 获å–æœåŠ¡çš„å‘布端å£(支æŒå¤šç«¯å£æ ¼å¼:https|http)
+ customRouteInfo.setPublishProtocol("https");
+ customRouteInfo.setPublish_port(publishPorts[0]);
+
+ try {
+ CustomRouteInfo customRouteInfo_http = (CustomRouteInfo) customRouteInfo.clone();
+ customRouteInfo.setPublishProtocol("http");
+ customRouteInfo.setPublish_port(publishPorts[1]);
+ return new CustomRouteInfo[] {customRouteInfo, customRouteInfo_http};
+ } catch (CloneNotSupportedException e) {
+ LOGGER.error("CLONE is wrong:" + customRouteInfo);
+ return new CustomRouteInfo[] {customRouteInfo};
+ }
+
+ }
+ }
+
+
+ customRouteInfo.setPublish_port(microServiceInfo.getPublish_port());
+ return new CustomRouteInfo[] {customRouteInfo};
+ }
+
+
+ /**
+ * From MicroServiceInfo to IuiRouteInfo
+ *
+ * @param microServiceInfo
+ * @return
+ */
+ private IuiRouteInfo[] buildIuiRouteInfo(MicroServiceFullInfo microServiceInfo,
+ String redis_serviceName, String routeWay) {
+
+ IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
+ iuiRouteInfo.setUrl(microServiceInfo.getUrl());
+
+ iuiRouteInfo.setServers(buildRouteNodes(microServiceInfo, routeWay));
+
+ iuiRouteInfo.setVisualRange(RouteUtil.getVisualRangeByRouter(microServiceInfo.getVisualRange()));
+
+ if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
+ iuiRouteInfo.setUseOwnUpstream("1");
+ }
+
+
+ iuiRouteInfo.setConsulServiceName(microServiceInfo.getServiceName());
+ iuiRouteInfo.setServiceName(redis_serviceName);
+
+ // 获å–æœåŠ¡çš„host
+ String host = getHost(microServiceInfo);
+
+ iuiRouteInfo.setHost(host.toLowerCase());
+ iuiRouteInfo.setNamespace(microServiceInfo.getNamespace());
+ iuiRouteInfo.setEnable_ssl(buildRouteHttpProtocol(microServiceInfo, routeWay));
+ if (iuiRouteInfo.isEnable_ssl()) {
+ iuiRouteInfo.setPublishProtocol("https");
+ }
+
+ if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
+
+ if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
+ iuiRouteInfo.setPublishProtocol("https");
+ }
+
+ String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
+ if (publishPorts.length == 2) {
+ // 获å–æœåŠ¡çš„å‘布端å£(支æŒå¤šç«¯å£æ ¼å¼:https|http)
+ iuiRouteInfo.setPublishProtocol("https");
+ iuiRouteInfo.setPublish_port(publishPorts[0]);
+
+ try {
+ IuiRouteInfo iuiRouteInfo_http = (IuiRouteInfo) iuiRouteInfo.clone();
+ iuiRouteInfo.setPublishProtocol("http");
+ iuiRouteInfo.setPublish_port(publishPorts[1]);
+ return new IuiRouteInfo[] {iuiRouteInfo, iuiRouteInfo_http};
+ } catch (CloneNotSupportedException e) {
+ LOGGER.error("CLONE is wrong:" + iuiRouteInfo);
+ return new IuiRouteInfo[] {iuiRouteInfo};
+ }
+
+ }
+ }
+ iuiRouteInfo.setPublish_port(microServiceInfo.getPublish_port());
+ return new IuiRouteInfo[] {iuiRouteInfo};
+ }
+
+
+
+ private List<Node> getPublishNodes(String discoverServiceName, String version, String namespace) {
+ List<Node> nodes = new ArrayList<Node>();
+
+ if (StringUtils.isBlank(version)) {
+ version = "null";
+ }
+
+ DiscoverInfo discoverInfo = ConfigUtil.getInstance().getDiscoverInfo();
+
+ String allpublishaddressUrl =
+ (new StringBuilder().append("http://").append(discoverInfo.toString())
+ .append(RouteUtil.MSB_ROUTE_URL).append("/").append(discoverServiceName)
+ .append("/version/").append(version).append("/allpublishaddress?namespace=")
+ .append(namespace).append("&visualRange=0")).toString();
+
+ String resultJson = HttpClientUtil.httpGet(allpublishaddressUrl);
+ List<PublishFullAddress> publishFullAddressList =
+ JacksonJsonUtil
+ .jsonToListBean(resultJson, new TypeReference<List<PublishFullAddress>>() {});
+ if (publishFullAddressList != null && publishFullAddressList.size() > 0) {
+ for (PublishFullAddress publishFullAddress : publishFullAddressList) {
+ if (StringUtils.isNotBlank(publishFullAddress.getIp())
+ && "https".equals(publishFullAddress.getPublish_protocol())) {
+ nodes.add(new Node(publishFullAddress.getIp(), publishFullAddress.getPort()));
+ }
+
+ }
+ }
+
+ return nodes;
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/serviceListener/RouteNotify.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/serviceListener/RouteNotify.java
new file mode 100644
index 0000000..3cd2d8a
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/serviceListener/RouteNotify.java
@@ -0,0 +1,77 @@
+package org.onap.msb.apiroute.wrapper.serviceListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.wrapper.util.ServiceFilter;
+
+public class RouteNotify {
+
+ private static RouteNotify instance = new RouteNotify();
+
+ private List<IMicroServiceChangeListener> serviceListenerlist =
+ new ArrayList<IMicroServiceChangeListener>();
+
+ private RouteNotify() {}
+
+ public static RouteNotify getInstance() {
+ return instance;
+ }
+
+
+ public void addServiceChangeListener(IMicroServiceChangeListener listener) {
+ synchronized (serviceListenerlist) {
+ serviceListenerlist.add(listener);
+ }
+ }
+
+
+ /* public void removeServiceChangeListener(IMicroServiceChangeListener listener) {
+ synchronized (serviceListenerlist) {
+ serviceListenerlist.remove(listener);
+ }
+ }*/
+
+
+ public void noticeRouteListener4Update(String serviceName, String version, MicroServiceFullInfo microServiceInfo) throws Exception {
+ if (ServiceFilter.getInstance().isNeedNotifyByProtocol(microServiceInfo.getProtocol())) {
+ for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {
+ serviceListener.onChange(serviceName, version, microServiceInfo);
+ }
+ }
+
+ }
+
+ public void noticeUpdateStatusListener(MicroServiceFullInfo microServiceInfo, String status) {
+
+ for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {
+ serviceListener.onStatusChange(microServiceInfo.getServiceName(),
+ microServiceInfo.getVersion(), microServiceInfo.getHost(),microServiceInfo.getProtocol(), microServiceInfo.getPublish_port(),status);
+ }
+ }
+
+
+
+
+ public void noticeRouteListener4Add(MicroServiceFullInfo microServiceInfo) throws Exception {
+ if (ServiceFilter.getInstance().isNeedNotifyByProtocol(microServiceInfo.getProtocol())) {
+ for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {
+ serviceListener.onSave(microServiceInfo);
+ }
+ }
+ }
+
+ public void noticeRouteListener4Delete(MicroServiceFullInfo microServiceInfo) throws Exception {
+ if (ServiceFilter.getInstance().isNeedNotifyByProtocol(microServiceInfo.getProtocol())) {
+ for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {
+ serviceListener.onDelete(microServiceInfo);
+ }
+ }
+ }
+
+
+
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/CommonUtil.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/CommonUtil.java
new file mode 100644
index 0000000..2ad84a7
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/CommonUtil.java
@@ -0,0 +1,76 @@
+package org.onap.msb.apiroute.wrapper.util;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class CommonUtil {
+
+ public static final int SC_OK = 200;
+
+ public static Object[] concat(Object[] a, Object[] b) {
+ Object[] c = new Object[a.length + b.length];
+ System.arraycopy(a, 0, c, 0, a.length);
+ System.arraycopy(b, 0, c, a.length, b.length);
+ return c;
+ }
+
+ public static boolean contain(String strArray, String str) {
+ String[] array = StringUtils.split(strArray, ",");
+ return contain(array, str);
+ }
+
+ public static boolean contain(String[] array, String str) {
+ for (int i = 0; i < array.length; i++) {
+ if (array[i].trim().equals(str)) {
+ return true;
+ }
+ }
+ return false;
+
+ }
+
+ public static boolean contain(String[] array, String value[]) {
+ for (int i = 0; i < array.length; i++) {
+ for (int n = 0; n < value.length; n++) {
+ if (array[i].equals(value[n])) {
+ return true;
+ }
+ }
+ }
+ return false;
+
+ }
+
+ /**
+ * @param <T>
+ * @Title getDiffrent
+ * @Description TODO(Extract the list1 and list2 different data sets)
+ * @param list1
+ * @param list2
+ * @return TODO(a new List in list2 but not in list1)
+ * @return List<String>
+ */
+ public static <T> Set<T> getDiffrent(Set<T> list1, Set<T> list2) {
+
+ HashSet<T> set_all = new HashSet<T>();
+
+ for (T t1 : list1) {
+ set_all.add(t1);
+ }
+
+
+ Set<T> diff = new HashSet<T>();
+
+ for (T t2 : list2) {
+ if (set_all.add(t2)) { // in list2 but not in list1
+ diff.add(t2);
+ }
+ }
+
+
+ return diff;
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/ConfigUtil.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/ConfigUtil.java
new file mode 100644
index 0000000..80f99f4
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/ConfigUtil.java
@@ -0,0 +1,446 @@
+package org.onap.msb.apiroute.wrapper.util;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.onap.msb.apiroute.ApiRouteAppConfig;
+import org.onap.msb.apiroute.api.DiscoverInfo;
+import org.onap.msb.apiroute.wrapper.InitRouteServiceWrapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@SuppressWarnings("unchecked")
+public class ConfigUtil {
+ private final static ConfigUtil instance = new ConfigUtil();
+
+
+ private ConfigUtil() {}
+
+ public static ConfigUtil getInstance() {
+ return instance;
+ }
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ConfigUtil.class);
+
+ private String serverPort="80";
+
+ private String IUI_ROOT_PATH="iui";
+
+ private String API_ROOT_PATH="api";
+
+ private String namespaceMatches="all";
+
+ private String visualRangeMatches="0";
+
+ private String nodeMetaQueryParam="";
+
+ private String network_plane_typeMatches="";
+
+ private String[] routeWay={"ip"};
+
+ private Map<String,String> labelMapMatches;
+
+ private DiscoverInfo discoverInfo=new DiscoverInfo();
+
+ private String consul_ip="";
+
+ private String metricsUrl = "http://127.0.0.1:8066/admin/metrics";
+
+ public void initRootPath() {
+ String apiRootPathConfSource="Default";
+ String iuiRootPathConfSource="Default";
+
+ try {
+
+ URL urlRootPath =
+ ConfigUtil.class.getResource("/ext/initUrlRootPath/initUrlRootPath.json");
+ if (urlRootPath != null) {
+ String path = urlRootPath.getPath();
+
+ LOGGER.warn("read initUrlRootPath:" + path);
+
+ String fileContent = FileUtil.readFile(path);
+ ObjectMapper mapper = new ObjectMapper();
+
+ Map<String, String> map = mapper.readValue(fileContent, HashMap.class);
+ if (map.get("iuiRootPath") != null) {
+ IUI_ROOT_PATH = map.get("iuiRootPath");
+ iuiRootPathConfSource="initUrlRootPath.json";
+ }
+ if (map.get("apiRootPath") != null) {
+ API_ROOT_PATH = map.get("apiRootPath");
+ apiRootPathConfSource="initUrlRootPath.json";
+ }
+
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("init UrlRootPath throw exception", e);
+ }
+
+ LOGGER.warn("init IUI_ROOT_PATH from ["+iuiRootPathConfSource+"]:"+IUI_ROOT_PATH);
+ LOGGER.warn("init API_ROOT_PATH from ["+apiRootPathConfSource+"]:"+API_ROOT_PATH);
+
+ }
+
+ public void initApiGatewayPort() {
+
+ String env_APIGATEWAY_EXPOSE_PORT=System.getenv("APIGATEWAY_EXPOSE_PORT");
+ String httpExposePortConfSource="Default";
+ try {
+ // read initApiGatewayConfig
+ if (StringUtils.isBlank(env_APIGATEWAY_EXPOSE_PORT)) {
+ URL apiGatewayConfigPath =
+ ConfigUtil.class
+ .getResource("/ext/initApiGatewayConfig/initApiGatewayConfig.json");
+ if (apiGatewayConfigPath != null) {
+ String path = apiGatewayConfigPath.getPath();
+
+ LOGGER.warn("read initApiGatewayConfig:" + path);
+
+ String fileContent = FileUtil.readFile(path);
+ ObjectMapper mapper = new ObjectMapper();
+
+ Map<String, Object> labelMap = mapper.readValue(fileContent, Map.class);
+ if (labelMap.get("port") != null) {
+ serverPort = (String) labelMap.get("port");
+ httpExposePortConfSource="initApiGatewayConfig.json";
+ }
+ }
+ } else {
+ serverPort = env_APIGATEWAY_EXPOSE_PORT;
+ httpExposePortConfSource="env:APIGATEWAY_EXPOSE_PORT";
+ }
+ LOGGER.warn("init APIGATEWAY http publish Port from ["+httpExposePortConfSource+"]:"+serverPort);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.error(
+ "read initApiGatewayConfig Files or env(APIGATEWAY_EXPOSE_PORT) throw exception", e);
+ }
+
+
+ }
+
+ public void initConsulIp() {
+ String sys_consulIp=System.getenv("CONSUL_IP");
+ if (StringUtils.isNotBlank(sys_consulIp)) {
+ consul_ip=sys_consulIp;
+ LOGGER.warn("init consul_Ip from [env:CONSUL_IP]:" + sys_consulIp);
+ }
+ else{
+ LOGGER.warn("init consul_Ip from [env:CONSUL_IP] is blank");
+ }
+
+
+ }
+
+ public void initRouteNameSpaceMatches() {
+ String env_NAMESPACE=System.getenv("NAMESPACE");
+ String namespaceConfSource="Default";
+ try {
+ // read NAMESPACE
+ if (StringUtils.isBlank(env_NAMESPACE)) {
+ URL routeLabelsPath =
+ InitRouteServiceWrapper.class
+ .getResource("/ext/initRouteLabels/initRouteLabelsMatches.json");
+ if (routeLabelsPath != null) {
+ String path = routeLabelsPath.getPath();
+
+ String fileContent = FileUtil.readFile(path);
+ ObjectMapper mapper = new ObjectMapper();
+
+ Map<String, Object> labelMap = mapper.readValue(fileContent, Map.class);
+ if (labelMap.get("namespace") != null) {
+ namespaceMatches = (String) labelMap.get("namespace");
+ namespaceConfSource="initRouteLabelsMatches.json";
+ }
+ }
+ } else {
+ namespaceMatches =env_NAMESPACE;
+ namespaceConfSource="env:NAMESPACE";
+ }
+ LOGGER.warn("init namespace Filter from ["+namespaceConfSource+"]:" + namespaceMatches);
+ }
+ catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read initRouteNameSpaceMatches Files or env(NAMESPACE) throw exception",
+ e);
+ }
+
+
+
+ }
+ /**
+ * @Title: initRouteLabelsMatches
+ * @Description: TODO(According to the environment variable or a JSON file configuration
+ * initialization Route filter conditions)
+ * @return: void
+ */
+ public void initRouteLabelsMatches() {
+ String env_ROUTE_LABELS=System.getenv("ROUTE_LABELS");
+ String visualRangeConfSource="Default";
+ String networkPlaneConfSource="Default";
+ String labelConfSource="Default";
+ try {
+
+ // read ROUTE_LABELS
+ if (StringUtils.isBlank(env_ROUTE_LABELS)) {
+ URL routeLabelsPath =
+ InitRouteServiceWrapper.class
+ .getResource("/ext/initRouteLabels/initRouteLabelsMatches.json");
+ if (routeLabelsPath != null) {
+ String path = routeLabelsPath.getPath();
+
+ String fileContent = FileUtil.readFile(path);
+ ObjectMapper mapper = new ObjectMapper();
+
+ Map<?, ?> labelMap = mapper.readValue(fileContent, Map.class);
+ if (labelMap.get("predefineLabels") != null) {
+ Map<String, String> predefineLabelMapMatches =
+ (Map<String, String>) labelMap.get("predefineLabels");
+ if (predefineLabelMapMatches.get("visualRange") != null) {
+ visualRangeMatches = predefineLabelMapMatches.get("visualRange");
+ visualRangeConfSource="initRouteLabelsMatches.json";
+ }
+ if (predefineLabelMapMatches.get("network_plane_type") != null) {
+ network_plane_typeMatches =
+ predefineLabelMapMatches.get("network_plane_type");
+ networkPlaneConfSource="initRouteLabelsMatches.json";
+ }
+ }
+
+ if (labelMap.get("customLabels") != null) {
+ labelMapMatches = (Map<String, String>) labelMap.get("customLabels");
+ labelConfSource="initRouteLabelsMatches.json";
+ }
+
+ }
+ } else {
+ String[] env_routeLabels = StringUtils.split(env_ROUTE_LABELS, ",");
+ Map<String, String> labelMap = new HashMap<String, String>();
+
+ for (int i = 0; i < env_routeLabels.length; i++) {
+ String[] labels = StringUtils.split(env_routeLabels[i], ":");
+
+ if ("visualRange".equals(labels[0])) {
+ visualRangeMatches = labels[1];
+ visualRangeConfSource="env:ROUTE_LABELS";
+ } else if ("network_plane_type".equals(labels[0])) {
+ network_plane_typeMatches = labels[1];
+ networkPlaneConfSource="env:ROUTE_LABELS";
+ } else {
+ labelMap.put(labels[0], labels[1]);
+ }
+
+ }
+
+ labelConfSource="env:ROUTE_LABELS";
+ labelMapMatches = labelMap;
+
+ }
+ LOGGER.warn("init visualRange Filter from [ "+visualRangeConfSource+" ]:" + visualRangeMatches);
+ LOGGER.warn("init network_plane_type Filter from [ "+networkPlaneConfSource+" ]:" + network_plane_typeMatches);
+ LOGGER.warn("init customLabels Filter from [ "+labelConfSource+" ]:" + labelMapMatches);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ LOGGER.error(
+ "read initRouteLabelsPathMatches Files or env(ROUTE_LABELS) throw exception",
+ e);
+ }
+ }
+
+ public void initRouteWay() {
+ String env_ROUTE_WAY=System.getenv("ROUTE_WAY");
+ try {
+ // read NAMESPACE
+ if (StringUtils.isBlank(env_ROUTE_WAY)) {
+ URL routeLabelsPath =
+ InitRouteServiceWrapper.class.getResource("/ext/initRouteWay/initRouteWay.json");
+ if (routeLabelsPath != null) {
+ String path = routeLabelsPath.getPath();
+
+ String fileContent = FileUtil.readFile(path);
+ ObjectMapper mapper = new ObjectMapper();
+
+ Map<String, Object> routeWayMap = mapper.readValue(fileContent, Map.class);
+ String routeWayFromConfig=(String)routeWayMap.get("routeWay");
+ if (StringUtils.isNotBlank(routeWayFromConfig)) {
+ routeWay =
+ StringUtils.split(routeWayFromConfig, RouteUtil.SPLIT_LINE);
+ LOGGER.warn("init RouteWay from [initRouteWay.json]:" + routeWayFromConfig);
+ }
+ }
+ } else {
+ routeWay = StringUtils.split(env_ROUTE_WAY, RouteUtil.SPLIT_LINE);
+ LOGGER.warn("read initRouteWay from [env:ROUTE_WAY]:" + env_ROUTE_WAY);
+ }
+
+
+
+
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ LOGGER.error("read initRouteWay Files or env(ROUTE_WAY) throw exception", e);
+ }
+ }
+
+
+ public void initDiscoverInfo(ApiRouteAppConfig configuration){
+ DiscoverInfo config_discoverInfo = configuration.getDiscoverInfo();
+
+
+ discoverInfo.setEnabled(config_discoverInfo.isEnabled());
+
+ String discoverInfoConfSource="yaml config";
+
+ if (config_discoverInfo.isEnabled()) {
+
+ String discoverIP;
+ String env_SDCLIENT_IP=System.getenv("SDCLIENT_IP");
+
+ if (StringUtils.isBlank(env_SDCLIENT_IP)) {
+ // yml
+ discoverIP = config_discoverInfo.getIp();
+ } else {
+ discoverIP = env_SDCLIENT_IP;
+ discoverInfoConfSource="env:SDCLIENT_IP";
+ }
+
+ discoverInfo.setIp(discoverIP.trim());
+ discoverInfo.setPort(config_discoverInfo.getPort());
+ }
+
+ LOGGER.warn("init DiscoverInfo from ["+discoverInfoConfSource+"]--" + discoverInfo.toString()+" Enabled:"+discoverInfo.isEnabled());
+ }
+
+ public void initNodeMetaQueryParam() {
+ // judge consul register node:caltalog
+ String env_CONSUL_REGISTER_MODE = System.getenv("CONSUL_REGISTER_MODE");
+
+ if (env_CONSUL_REGISTER_MODE == null
+ || !env_CONSUL_REGISTER_MODE.trim().equals("catalog")) {
+ nodeMetaQueryParam = "";
+ return;
+ }
+
+ // visual range
+ String nodemeta_visualrange = nodemeta_visualrange(visualRangeMatches);
+
+ LOGGER.warn("calc nodemeta_visualrange from [" + visualRangeMatches
+ + "]:" + nodemeta_visualrange);
+
+ nodeMetaQueryParam = nodemeta_visualrange;
+
+ // name space
+ String nodemeta_namespace = nodemeta_namespace(namespaceMatches);
+ LOGGER.warn("calc nodemeta_namespace from [" + namespaceMatches + "]:"
+ + nodemeta_namespace);
+
+ if (!nodeMetaQueryParam.isEmpty() && !nodemeta_namespace.isEmpty()) {
+ nodeMetaQueryParam += "&";
+ }
+ nodeMetaQueryParam += nodemeta_namespace;
+
+ /*
+ * // nodemeta = (!nodemeta_visualrange.isEmpty() && !nodemeta_namespace
+ * .isEmpty()) ? nodemeta_visualrange + "&" + nodemeta_namespace :
+ * nodemeta_visualrange + nodemeta_namespace;
+ */
+
+ }
+
+ private String nodemeta_visualrange(final String visualRangeMatches) {
+
+ if (visualRangeMatches == null || visualRangeMatches.isEmpty()) {
+ return "";
+ }
+
+ // external:0
+ if (visualRangeMatches.trim().equals("0")) {
+ return "node-meta=external:true";
+ }
+
+ // internal:1
+ if (visualRangeMatches.trim().equals("1")) {
+ return "node-meta=internal:true";
+ }
+
+ return "";
+ }
+
+
+ private String nodemeta_namespace(final String namespaceMatches) {
+
+ // exclude null,"",all,&,|,!
+ if (namespaceMatches == null || namespaceMatches.isEmpty()
+ || namespaceMatches.contains("all")
+ || namespaceMatches.contains("&")
+ || namespaceMatches.contains("|")
+ || namespaceMatches.contains("!")) {
+ return "";
+ }
+
+ return "node-meta=ns:" + namespaceMatches;
+ }
+
+ public String getServerPort() {
+ return serverPort;
+ }
+
+ public String getIUI_ROOT_PATH() {
+ return IUI_ROOT_PATH;
+ }
+
+ public String getAPI_ROOT_PATH() {
+ return API_ROOT_PATH;
+ }
+
+ public String getNamespaceMatches() {
+ return namespaceMatches;
+ }
+
+ public String getVisualRangeMatches() {
+ return visualRangeMatches;
+ }
+
+ public String getNetwork_plane_typeMatches() {
+ return network_plane_typeMatches;
+ }
+
+ public String[] getRouteWay() {
+ return routeWay.clone();
+ }
+
+ public Map<String, String> getLabelMapMatches() {
+ return labelMapMatches;
+ }
+
+ public DiscoverInfo getDiscoverInfo() {
+ return discoverInfo;
+ }
+
+ public String getMetricsUrl() {
+ return metricsUrl;
+ }
+
+ public void setMetricsUrl(String metricsUrl) {
+ this.metricsUrl = metricsUrl;
+ }
+
+ public String getNodeMetaQueryParam() {
+ return nodeMetaQueryParam;
+ }
+
+ public String getConsul_ip() {
+ return consul_ip;
+ }
+
+
+
+}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/FileUtil.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/FileUtil.java
index baf3a1a..1e89f82 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/FileUtil.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/FileUtil.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.wrapper.util;
+
+package org.onap.msb.apiroute.wrapper.util;
import java.io.BufferedReader;
import java.io.File;
@@ -39,14 +40,14 @@ public final class FileUtil {
public static String readFile(String Path) throws IOException{
BufferedReader reader = null;
- String fileContent = "";
+ StringBuffer fileContent = new StringBuffer();
try {
FileInputStream fileInputStream = new FileInputStream(Path);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
reader = new BufferedReader(inputStreamReader);
String tempString = null;
while ((tempString = reader.readLine()) != null) {
- fileContent += tempString;
+ fileContent.append(tempString);
}
reader.close();
} catch (IOException e) {
@@ -60,6 +61,18 @@ public final class FileUtil {
}
}
}
- return fileContent;
+ return fileContent.toString();
+ }
+
+ /**
+ * Read all the files under a folder
+ */
+ public static String[] readfile(String filepath) throws FileNotFoundException, IOException {
+ File file = new File(filepath);
+ if (file.isDirectory()) {
+ String[] filelist = file.list();
+ return filelist;
+ }
+ return null;
}
}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/HttpClientUtil.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/HttpClientUtil.java
new file mode 100644
index 0000000..eb5ed1e
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/HttpClientUtil.java
@@ -0,0 +1,117 @@
+package org.onap.msb.apiroute.wrapper.util;
+
+import java.io.IOException;
+
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HttpClientUtil {
+
+ private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
+
+ private static int connectionTimeOut = 2*1000;
+
+
+ public static String httpGet(String url){
+ String result = null;
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+ HttpGet httpGet = new HttpGet(url);
+ httpGet.addHeader("Content-type", "application/json; charset=utf-8");
+ httpGet.setHeader("Accept", "application/json");
+ try {
+ CloseableHttpResponse res = httpClient.execute(httpGet);
+ result = EntityUtils.toString(res.getEntity());
+ if (res.getStatusLine().getStatusCode() != CommonUtil.SC_OK) {
+ logger.error(result);
+ }
+ res.close();
+ } catch (ClientProtocolException e) {
+ logger.error(url + ":httpGetWithJSON connect faild");
+ } catch (IOException e) {
+ logger.error( url + ":httpGetWithJSON connect faild");
+ } finally {
+ try {
+ httpClient.close();
+ } catch (IOException e) {
+ logger.error(url + ":close httpClient faild");
+ }
+ }
+
+ return result;
+
+ }
+
+ public static HttpGetResult httpGetStatusAndBody(String url){
+ HttpGetResult result= new HttpGetResult();
+ String body = null;
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+ HttpGet httpGet = new HttpGet(url);
+ httpGet.addHeader("Content-type", "application/json; charset=utf-8");
+ httpGet.setHeader("Accept", "application/json");
+
+ RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(connectionTimeOut).build();
+ httpGet.setConfig(requestConfig);
+
+ try {
+ CloseableHttpResponse res = httpClient.execute(httpGet);
+ body = EntityUtils.toString(res.getEntity());
+ if (res.getStatusLine().getStatusCode() != CommonUtil.SC_OK) {
+ logger.error(body);
+ }
+ result.setBody(body);
+ result.setStatusCode(res.getStatusLine().getStatusCode());
+ res.close();
+ } catch (ClientProtocolException e) {
+ logger.error(url + ":httpGetWithJSON connect faild",e);
+ } catch (IOException e) {
+ logger.error( url + ":httpGetWithJSON connect faild",e);
+ } finally {
+ try {
+ httpClient.close();
+ } catch (IOException e) {
+ logger.error(url + ":close httpClient faild");
+ }
+ }
+
+ return result;
+
+ }
+
+ public static int httpGetStatus(String url) throws Exception{
+ int iStatus=500;
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+
+
+ HttpGet httpGet = new HttpGet(url);
+ RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(10000).setConnectTimeout(10000).build();//设置请求和传输超时时间
+ httpGet.setConfig(requestConfig);
+ httpGet.addHeader("Content-type", "application/json; charset=utf-8");
+ httpGet.setHeader("Accept", "application/json");
+ try {
+ CloseableHttpResponse res = httpClient.execute(httpGet);
+
+ iStatus=res.getStatusLine().getStatusCode();
+ res.close();
+ } catch (ClientProtocolException e) {
+ logger.error(url + " httpGet connect faild:"+e.getMessage());
+ } catch (IOException e) {
+ logger.error(url + " httpGet connect faild:"+e.getMessage());
+ } finally {
+ try {
+ httpClient.close();
+ } catch (IOException e) {
+ logger.error(url + " httpGet close faild:"+e.getMessage());
+ }
+ }
+
+ return iStatus;
+
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/HttpGetResult.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/HttpGetResult.java
new file mode 100644
index 0000000..5b943e3
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/HttpGetResult.java
@@ -0,0 +1,19 @@
+package org.onap.msb.apiroute.wrapper.util;
+
+public class HttpGetResult {
+ private int statusCode;
+ private String body;
+ public int getStatusCode() {
+ return statusCode;
+ }
+ public void setStatusCode(int statusCode) {
+ this.statusCode = statusCode;
+ }
+ public String getBody() {
+ return body;
+ }
+ public void setBody(String body) {
+ this.body = body;
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/Jackson.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/Jackson.java
new file mode 100644
index 0000000..20b60d4
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/Jackson.java
@@ -0,0 +1,28 @@
+package org.onap.msb.apiroute.wrapper.util;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.guava.GuavaModule;
+import com.fasterxml.jackson.datatype.jdk7.Jdk7Module;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
+
+public class Jackson {
+ //use static singleton, make sure to reuse!
+ public static final ObjectMapper MAPPER = newObjectMapper();
+
+ private Jackson() {
+ /* singleton */
+ }
+
+ private static ObjectMapper newObjectMapper() {
+ final ObjectMapper mapper = new ObjectMapper();
+ return configure(mapper);
+ }
+
+ private static ObjectMapper configure(ObjectMapper mapper) {
+ mapper.registerModule(new GuavaModule());
+ mapper.registerModule(new JodaModule());
+ mapper.registerModule(new Jdk7Module());
+
+ return mapper;
+ }
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/JacksonJsonUtil.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/JacksonJsonUtil.java
new file mode 100644
index 0000000..4a7f50e
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/JacksonJsonUtil.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.msb.apiroute.wrapper.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+
+public class JacksonJsonUtil {
+
+ private static final Logger logger = LoggerFactory.getLogger(JacksonJsonUtil.class);
+
+ private volatile static ObjectMapper mapper = null;
+
+ private static ObjectMapper getMapperInstance() {
+ if (mapper == null) {
+ synchronized (JacksonJsonUtil.class) {
+ if (mapper == null) {
+ mapper = new ObjectMapper();
+ }
+ }
+ }
+ return mapper;
+ }
+
+ /**
+ * from java object to json
+ *
+ * @param obj
+ * @return json
+ * @throws Exception
+ */
+ public static String beanToJson(Object obj) throws Exception {
+ String json = null;
+
+ ObjectMapper objectMapper = getMapperInstance();
+ objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+ json = objectMapper.writeValueAsString(obj);
+
+ return json;
+ }
+
+
+
+ /**
+ * from json to java object
+ *
+ * @param json
+ * @param cls
+ * @return
+ * @throws Exception
+ */
+ public static Object jsonToBean(String json, Class<?> cls) throws Exception {
+ Object vo = null;
+ try {
+ ObjectMapper objectMapper = getMapperInstance();
+ objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+ vo = objectMapper.readValue(json, cls);
+
+ } catch (Exception e) {
+ logger.error(cls + " JsonTobean faild");
+ throw new Exception(cls + " JsonTobean faild");
+ }
+ return vo;
+ }
+
+ /**
+ * from json to java List
+ *
+ * @param json
+ * @return
+ * @throws Exception
+ */
+
+ public static <T> T jsonToListBean(String json, TypeReference<T> valueTypeRef) {
+ try {
+
+ ObjectMapper objectMapper = getMapperInstance();
+
+
+ return objectMapper.readValue(json, valueTypeRef);
+
+ } catch (Exception e) {
+ String errorMsg = " JsonTobean faild:" + e.getMessage();
+ logger.error(errorMsg);
+ }
+ return null;
+ }
+
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/JedisUtil.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/JedisUtil.java
new file mode 100644
index 0000000..ac9421b
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/JedisUtil.java
@@ -0,0 +1,208 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.msb.apiroute.wrapper.util;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.PropertyResourceBundle;
+import java.util.ResourceBundle;
+
+import org.apache.commons.lang3.StringUtils;
+import org.onap.msb.apiroute.wrapper.InitRouteServiceWrapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+
+
+public class JedisUtil {
+ private static final Logger LOGGER = LoggerFactory.getLogger(JedisUtil.class);
+ private static String host = "127.0.0.1";
+ private static int port = 6379;
+ private static int connectionTimeout = 2000;
+ private static int DEFAULT_DB_INDEX = 0;
+
+ private volatile static JedisPool jedisPool = null;
+
+
+ public static String propertiesName = "redis.properties";
+ private static final String LINE_SEPARATOR = System.getProperty("line.separator");
+
+
+ private JedisUtil() {
+ // private constructor
+
+ }
+
+ private synchronized static JedisPool initialPool() throws IOException {
+
+ JedisPoolConfig config = new JedisPoolConfig();
+ config.setMaxTotal(50);
+ config.setMaxIdle(30);
+ config.setMaxWaitMillis(5000);
+ config.setTestOnBorrow(false);
+ config.setTestOnReturn(true);
+
+ URL urlPath = JedisUtil.class.getResource("/ext/redisConf/redis.properties");
+ if (urlPath != null) {
+ String propertiesPath = urlPath.getPath();
+
+
+ File propertiesFile = new File(propertiesPath);
+
+ if (propertiesFile.exists()) {
+
+
+ BufferedInputStream inputStream =
+ new BufferedInputStream(new FileInputStream(propertiesPath));
+ ResourceBundle bundle = new PropertyResourceBundle(inputStream);
+
+ if (bundle == null) {
+ throw new IllegalArgumentException("[redis.properties] is not found!");
+ }
+
+
+ // Set up the connection pool basic information
+ String strHost = bundle.getString("redis.host");
+ if (StringUtils.isNotEmpty(strHost)) {
+ host = strHost;
+ }
+
+ // redis port: first read from env
+ if (StringUtils.isNotBlank(System.getenv("APIGATEWAY_REDIS_PORT"))) {
+ port = Integer.parseInt(System.getenv("APIGATEWAY_REDIS_PORT"));
+ } else {
+ String strPort = bundle.getString("redis.port");
+ if (StringUtils.isNotEmpty(strPort)) {
+ port = Integer.parseInt(strPort);
+ }
+ }
+
+
+ String strTimeout = bundle.getString("redis.connectionTimeout");
+ if (StringUtils.isNotEmpty(strTimeout)) {
+ connectionTimeout = Integer.parseInt(strTimeout);
+ }
+
+
+ String strDbIndex = bundle.getString("redis.db_index");
+ if (StringUtils.isNotEmpty(strDbIndex)) {
+ DEFAULT_DB_INDEX = Integer.parseInt(strDbIndex);
+ }
+
+ String strMaxTotal = bundle.getString("redis.pool.maxTotal");
+ if (StringUtils.isNotEmpty(strMaxTotal)) {
+ config.setMaxTotal(Integer.parseInt(strMaxTotal));
+ }
+
+ String strMaxIdle = bundle.getString("redis.pool.maxIdle");
+ if (StringUtils.isNotEmpty(strMaxIdle)) {
+ config.setMaxIdle(Integer.parseInt(strMaxIdle));
+ }
+
+ String strMaxWaitMillis = bundle.getString("redis.pool.maxWaitMillis");
+ if (StringUtils.isNotEmpty(strMaxWaitMillis)) {
+ config.setMaxWaitMillis(Long.parseLong(strMaxWaitMillis));
+ }
+
+ String strTestOnBorrow = bundle.getString("redis.pool.testOnBorrow");
+ if (StringUtils.isNotEmpty(strTestOnBorrow)) {
+ config.setTestOnBorrow(Boolean.valueOf(strTestOnBorrow));
+ }
+
+ String strTestOnReturn = bundle.getString("redis.pool.testOnReturn");
+ if (StringUtils.isNotEmpty(strTestOnReturn)) {
+ config.setTestOnReturn(Boolean.valueOf(strTestOnReturn));
+ }
+
+ }
+ }
+
+ StringBuffer redisinfo = new StringBuffer();
+ redisinfo.append("------redis.properties------").append(LINE_SEPARATOR);
+ redisinfo.append("redis.host: ").append(host).append(":").append(port).append(LINE_SEPARATOR);
+ redisinfo.append("redis.connectionTimeout: ").append(connectionTimeout).append(LINE_SEPARATOR);
+ redisinfo.append("redis.pool.maxTotal: ").append(config.getMaxTotal()).append(LINE_SEPARATOR);
+ redisinfo.append("redis.pool.maxIdle: ").append(config.getMaxIdle()).append(LINE_SEPARATOR);
+ redisinfo.append("redis.pool.maxWaitMillis: ").append(config.getMaxWaitMillis())
+ .append(LINE_SEPARATOR);
+ redisinfo.append("redis.pool.testOnBorrow: ").append(config.getTestOnBorrow())
+ .append(LINE_SEPARATOR);
+ redisinfo.append("redis.pool.testOnReturn: ").append(config.getTestOnReturn())
+ .append(LINE_SEPARATOR);
+
+
+ LOGGER.info(redisinfo.toString());
+ return new JedisPool(config, host, port, connectionTimeout);
+
+ }
+
+ /**
+ * From the connection pool to obtain jedis instance, use the default database index number 0
+ *
+ * @return
+ * @throws Exception
+ */
+ public static Jedis borrowJedisInstance() throws Exception {
+ return borrowJedisInstance(DEFAULT_DB_INDEX);
+ }
+
+ /**
+ * From the connection pool to obtain jedis instance, using the specified database index number
+ *
+ * @return
+ * @throws Exception
+ */
+
+ public static Jedis borrowJedisInstance(final int dbIndex) throws Exception {
+ if (jedisPool == null) {
+ synchronized (JedisUtil.class) {
+ if (jedisPool == null) {
+ jedisPool = initialPool();
+ }
+ }
+ }
+ Jedis resource = jedisPool.getResource();
+
+ if (resource == null) {
+ throw new Exception("fetch from jedis pool failed,null object!");
+ }
+
+ resource.select(dbIndex);
+ return resource;
+
+ }
+
+ /**
+ * returned to the pool jedis instance
+ *
+ * @param jedis
+ */
+ public static void returnJedisInstance(final Jedis jedis) {
+ if (jedis != null) {
+ jedis.close();
+ }
+ }
+
+
+}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceUtil.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/MicroServiceUtil.java
index 3da82ed..1081579 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceUtil.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/MicroServiceUtil.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,61 +13,44 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.wrapper.util;
-import java.util.regex.Pattern;
-
-import javax.servlet.http.HttpServletRequest;
+package org.onap.msb.apiroute.wrapper.util;
import org.apache.commons.lang3.StringUtils;
+import javax.servlet.http.HttpServletRequest;
+import java.util.regex.Pattern;
+
public class MicroServiceUtil {
public static final String PREFIX_PATH = "discover:microservices";
- public static final String PREFIX_PATH_PORT = "discover:";
-
- public static final String SUFFIX_PATH_INFO = "info";
-
- public static final String REDIS_KEY_PATTERN =
- "discover:microservices:(?<servicename>[^:]+)(:(?<version>[^:]*))?:info";
-
- public static final String REQUEST_SUCCESS = "SUCCESS";
-
- public static final String REQUEST_FAIL = "FAIL";
-
- public static final String ROUTE_PATH_LOADBALANCE = "lb"; // è´Ÿè½½å‡è¡¡è·¯å¾„å
+ private static final Pattern SERVICE_KEY_REGEX_PATTERN =
+ Pattern.compile("discover:microservices:(?<servicename>[^:]+)(:(?<version>[^:]*))");
public static String getPrefixedKey(String... paths) {
StringBuffer sb = new StringBuffer();
- if(paths[0].trim().equals("") || paths[0].equals(String.valueOf(JedisUtil.serverPort))){
- sb.append(PREFIX_PATH);
- }
- else{
- sb.append(PREFIX_PATH_PORT).append(paths[0]);
- }
-
- for (int i = 1; i < paths.length; i++) {
+ sb.append(PREFIX_PATH);
+
+ for (int i = 0; i < paths.length; i++) {
sb.append(":");
sb.append(paths[i]);
}
return sb.toString();
}
-
- public static String getServiceInfoKey(String serverPort,String serviceName, String version) {
- return getPrefixedKey(serverPort,serviceName, version, SUFFIX_PATH_INFO);
+
+ public static String getServiceKey(String serviceName, String version) {
+ return getPrefixedKey(serviceName, version);
}
-
-
-
-
- public static Pattern getRedisKeyPattern() {
- return Pattern.compile(REDIS_KEY_PATTERN);
+ public static Pattern getServiceKeyRegexPattern(){
+ return SERVICE_KEY_REGEX_PATTERN;
}
+
+
public static String getRealIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RegExpTestUtil.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/RegExpTestUtil.java
index 90c8cba..0edcfda 100644
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RegExpTestUtil.java
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/RegExpTestUtil.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2016 ZTE Corporation.
+ * Copyright 2016 ZTE, Inc. and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,13 +13,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.openo.msb.wrapper.util;
+package org.onap.msb.apiroute.wrapper.util;
+import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExpTestUtil {
+ private final static String API_KEY_PATTERN ="/api/(?<servicename>[^/]+)(/(?<version>[^/]*)).*";
+
+ private final static String IUI_KEY_PATTERN ="/iui/(?<servicename>[^/]+)/.*";
public static boolean hostRegExpTest(String host){
@@ -66,23 +70,46 @@ public static boolean urlRegExpTest(String url){
public static boolean apiRouteUrlRegExpTest(String url){
- String urlReg = "^\\/"+RouteUtil.API_ROOT_PATH+"\\/.*$";
+ String urlReg = "^\\/"+ConfigUtil.getInstance().getAPI_ROOT_PATH()+"\\/.*$";
return Pattern.matches(urlReg, url);
}
public static boolean iuiRouteUrlRegExpTest(String url){
- String urlReg = "^\\/"+RouteUtil.IUI_ROOT_PATH+"\\/.*$";
+ String urlReg = "^\\/"+ConfigUtil.getInstance().getIUI_ROOT_PATH()+"\\/.*$";
return Pattern.matches(urlReg, url);
}
+public static String[] apiServiceNameMatch4URL(String url){
+ Pattern redisKeyPattern =Pattern.compile(API_KEY_PATTERN);
+ Matcher matcher = redisKeyPattern.matcher(url+"/");
+ if (matcher.matches()) {
+ String version;
+ if(versionRegExpTest(matcher.group("version"))){
+ version=matcher.group("version");
+ }
+ else{
+ version="";
+ }
+ return new String[]{matcher.group("servicename"),version};
+ }
+ else{
+ return null;
+ }
+}
+
+
+public static String iuiServiceNameMatch4URL(String url){
+ Pattern redisKeyPattern =Pattern.compile(IUI_KEY_PATTERN);
+ Matcher matcher = redisKeyPattern.matcher(url+"/");
+ if (matcher.matches()) {
+ return matcher.group("servicename");
+ }
+ else{
+ return null;
+ }
+}
-
-
- public static void main(String[] args) {
- System.out.println(urlRegExpTest("/api "));
-// System.out.println("api".startsWith("/"));
- }
}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/RouteUtil.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/RouteUtil.java
new file mode 100644
index 0000000..331671f
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/RouteUtil.java
@@ -0,0 +1,345 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.msb.apiroute.wrapper.util;
+
+import org.apache.commons.lang3.StringUtils;
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.api.Node;
+import org.onap.msb.apiroute.api.RouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.api.exception.UnprocessableEntityException;
+
+
+public class RouteUtil {
+
+
+ public static final int consulDeafultPort=8500;
+
+ public static final String ROUTE_PATH="msb:routing";
+
+ public static final String ROUTE_PORT_PATH="msb:";
+
+ public static final String ROUTE_PATH_HOST="msb:host";
+
+ public static final String APIROUTE="api";
+
+ public static final String IUIROUTE="iui";
+
+ public static final String CUSTOMROUTE="custom";
+
+ public static final String HTTPS_PROTOCOL="https";
+
+ public static final String CUSTOM_PORTAL="portal";
+
+
+ public static final String PROTOCOL_LIST="REST,HTTP,UI,MQ,FTP,SNMP,TCP,UDP";
+
+ public static final String MSB_ROUTE_URL = "/api/microservices/v1/services";
+
+ public static final String MSB_CHECK_URL = "/api/catalog/v1/service/router-all";
+
+ public static final String visualRangeRange="0,1";
+
+ public static final String controlRangeMatches="0,1,2";
+
+ public static final String statusRangeMatches="0,1";
+
+ public static final String useOwnUpstreamRangeMatches="0,1";
+
+ public static final String ROUTEWAY_IP="ip";
+
+ public static final String ROUTEWAY_DOMAIN="domain";
+
+ public static final String SPLIT_LINE="|";
+
+ public static final String PROTOCOL_REST="REST";
+
+ public static final String PROTOCOL_UI="UI";
+
+ public static final String PROTOCOL_HTTP="HTTP";
+
+ public static final String FILTER_PROTOCOLS="REST,UI,HTTP";
+
+ public static final int SERVICE_DATA_QUEUE_NUM=5;
+
+ public static final int SERVICE_QUEUE_CAPACITY=100;
+
+ public static final int SERVICE_LIST_QUEUE_CAPACITY=5;
+
+ public static final int WATCH_SECOND=120;
+
+ public static final String HEALTH_CHECK_PASSING="passing";
+
+
+
+
+ /**
+ * @Title: getPrefixedKey
+ * @Description: TODO(Add base path prefix radis assembly path)
+ * @param: @param serviceName
+ * @param: @param version
+ * @param: @param type
+ * @param: @return
+ * @return: String
+ */
+
+ public static String getPrefixedKey(String...paths){
+ StringBuffer sb= new StringBuffer();
+
+ if(paths[0].trim().equals("") || paths[0].equals(ConfigUtil.getInstance().getServerPort())){
+ sb.append(ROUTE_PATH);
+ }
+ else{
+ sb.append(ROUTE_PORT_PATH).append(paths[0]);
+ }
+
+ for (int i = 1; i < paths.length; i++) {
+ sb.append(":");
+ sb.append(paths[i]);
+ }
+ return sb.toString();
+ }
+
+ public static String getPrefixedKey4Host(String...paths){
+ StringBuffer sb= new StringBuffer();
+
+ sb.append(ROUTE_PATH_HOST);
+
+
+ for (int i = 0; i < paths.length; i++) {
+ sb.append(":");
+ sb.append(paths[i]);
+ }
+ return sb.toString();
+ }
+
+
+
+
+ public static void checkRouteWay(String routeWay){
+ if(!CommonUtil.contain(ConfigUtil.getInstance().getRouteWay(),routeWay)){
+ String errInfo = "routeWay does not support,must be ip or domain";
+ throw new UnprocessableEntityException(errInfo);
+ }
+ }
+
+ public static void checkServiceNameAndVersion(String serviceName,String version){
+ if (StringUtils.isBlank(serviceName)) {
+ throw new UnprocessableEntityException("serviceName can't be empty");
+ }
+
+ if (StringUtils.isNotBlank(version)) {
+ if (!RegExpTestUtil.versionRegExpTest(version)) {
+ throw new UnprocessableEntityException("version is not a valid format");
+ }
+ }
+ }
+
+ public static void checkServiceStatus(String status){
+ if (!CommonUtil.contain(statusRangeMatches, status)) {
+ throw new UnprocessableEntityException(
+ "save RouteInfo Status FAIL:status is wrong,value range:("
+ + RouteUtil.statusRangeMatches + ")");
+ }
+ }
+
+
+
+ public static void checkRouterInfoFormat(RouteInfo routeInfo) {
+
+ if (StringUtils.isBlank(routeInfo.getServiceName()) || routeInfo.getServers().length == 0) {
+ throw new UnprocessableEntityException(
+ "save RouteInfo FAIL: Some required fields are empty");
+ }
+
+ if (StringUtils.isNotBlank(routeInfo.getUrl())) {
+ if (!RegExpTestUtil.urlRegExpTest(routeInfo.getUrl())) {
+ throw new UnprocessableEntityException(
+ "save RouteInfo FAIL:url is not a valid format(url must be begin with /)");
+
+ }
+ }
+
+ if (!CommonUtil.contain(RouteUtil.visualRangeRange, routeInfo.getVisualRange())) {
+ throw new UnprocessableEntityException(
+ "save RouteInfo FAIL:VisualRange is wrong,value range:("
+ + RouteUtil.visualRangeRange + ")");
+ }
+
+ if (!CommonUtil.contain(RouteUtil.controlRangeMatches, routeInfo.getControl())) {
+ throw new UnprocessableEntityException(
+ "save RouteInfo FAIL:control is wrong,value range:("
+ + RouteUtil.controlRangeMatches + ")");
+ }
+
+ if (!CommonUtil.contain(RouteUtil.statusRangeMatches, routeInfo.getStatus())) {
+ throw new UnprocessableEntityException(
+ "save RouteInfo FAIL:status is wrong,value range:("
+ + RouteUtil.statusRangeMatches + ")");
+ }
+
+ if (!CommonUtil.contain(RouteUtil.useOwnUpstreamRangeMatches, routeInfo.getUseOwnUpstream())) {
+ throw new UnprocessableEntityException(
+ "save RouteInfo FAIL:useOwnUpstream is wrong,value range:("
+ + RouteUtil.useOwnUpstreamRangeMatches + ")");
+ }
+
+ // Check the service instance format
+ RouteServer[] serverList = routeInfo.getServers();
+ for (int i = 0; i < serverList.length; i++) {
+ RouteServer server = serverList[i];
+ if (!RegExpTestUtil.ipRegExpTest(server.getIp())) {
+ throw new UnprocessableEntityException("save RouteInfo FAIL:IP(" + server.getIp()
+ + ")is not a valid ip address");
+ }
+
+ if (!RegExpTestUtil.portRegExpTest(server.getPort())) {
+ throw new UnprocessableEntityException("save RouteInfo FAIL:Port(" + server.getPort()
+ + ")is not a valid Port address");
+ }
+ }
+ }
+
+ public static void checkMicroServiceInfoFormat(MicroServiceFullInfo microServiceInfo,String requestIP){
+ // Check the service instance format
+ if (StringUtils.isBlank(microServiceInfo.getServiceName())
+ || StringUtils.isBlank(microServiceInfo.getProtocol())
+ || microServiceInfo.getNodes().size() == 0) {
+ throw new UnprocessableEntityException(
+ "register MicroServiceInfo FAIL: Some required fields are empty");
+ }
+
+ for (Node node : microServiceInfo.getNodes()) {
+
+ if (node.getIp() == null || node.getIp().isEmpty()) {
+ node.setIp(requestIP);
+ } else if (!RegExpTestUtil.ipRegExpTest(node.getIp())) {
+ throw new UnprocessableEntityException("register MicroServiceInfo FAIL:IP(" + node.getIp()
+ + ")is not a valid ip address");
+ }
+
+ if (!RegExpTestUtil.portRegExpTest(node.getPort())) {
+ throw new UnprocessableEntityException("register MicroServiceInfo FAIL:Port("
+ + node.getPort() + ")is not a valid Port address");
+ }
+ }
+
+ if (StringUtils.isNotBlank(microServiceInfo.getVersion())) {
+ if (!RegExpTestUtil.versionRegExpTest(microServiceInfo.getVersion())) {
+ throw new UnprocessableEntityException(
+ "register MicroServiceInfo FAIL:version is not a valid format");
+
+ }
+ }
+
+ if (StringUtils.isNotBlank(microServiceInfo.getUrl().trim())) {
+ if (!RegExpTestUtil.urlRegExpTest(microServiceInfo.getUrl())) {
+ throw new UnprocessableEntityException(
+ "register MicroServiceInfo FAIL:url is not a valid format(url must be begin with /)");
+
+ }
+ }
+
+
+ if (RouteUtil.PROTOCOL_LIST.indexOf(microServiceInfo.getProtocol().trim()) == -1) {
+ throw new UnprocessableEntityException(
+ "register MicroServiceInfo FAIL:Protocol is wrong,value range:("
+ + RouteUtil.PROTOCOL_LIST + ")");
+ }
+
+ }
+
+
+ public static String getAPIRedisPrefixedKey(String routeName, String version, String host,String publish_port,String routeWay){
+ String redisPrefixedKey;
+ if(ROUTEWAY_DOMAIN.equals(routeWay)){
+ redisPrefixedKey= RouteUtil.getPrefixedKey4Host(host, APIROUTE, routeName, version);
+ }
+ else{
+ redisPrefixedKey=RouteUtil.getPrefixedKey(publish_port, APIROUTE, routeName, version);
+ }
+
+ return redisPrefixedKey;
+ }
+
+ public static String getRedisPrefixedKey(String routeType,String routeName, String host,String publish_port,String routeWay){
+ String redisPrefixedKey;
+ if(ROUTEWAY_DOMAIN.equals(routeWay)){
+ redisPrefixedKey= RouteUtil.getPrefixedKey4Host(host, routeType, routeName);
+ }
+ else{
+ redisPrefixedKey=RouteUtil.getPrefixedKey(publish_port, routeType, routeName);
+ }
+
+ return redisPrefixedKey;
+ }
+
+ public static String getMutiRedisKey(String routeType,String routeWay){
+ String redisKey;
+ if(RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay)){
+ redisKey =
+ RouteUtil.getPrefixedKey4Host("*", routeType, "*");
+
+ }
+ else{
+ redisKey =
+ RouteUtil.getPrefixedKey("[^h]*", routeType, "*");
+
+ }
+
+ return redisKey;
+ }
+
+ /**
+ * @Title getRouteNameByns
+ * @Description TODO(æ ¹æ®æœåŠ¡å和命å空间拆分æœåŠ¡è·¯ç”±å)
+ * @param serviceName
+ * @param namespace
+ * @return
+ * @return String
+ */
+ public static String getRouteNameByns(String consul_serviceName,String namespace){
+ String serviceName=consul_serviceName;
+ if(StringUtils.isNotBlank(namespace)){
+ if(consul_serviceName.endsWith("-"+namespace)){
+ serviceName=consul_serviceName.substring(0,consul_serviceName.length()-namespace.length()-1);
+ }
+ }
+
+ return serviceName;
+ }
+
+ public static String getVisualRangeByRouter(String visualRange){
+ String[] rangs = StringUtils.split(visualRange, "|");
+ if(rangs.length>1){
+ String visualRangeMatches=ConfigUtil.getInstance().getVisualRangeMatches();
+ if(StringUtils.split(visualRangeMatches, "|").length>1){
+ return "0";
+ }
+ else{
+ return visualRangeMatches;
+ }
+ }
+ else{
+ return visualRange;
+ }
+
+ }
+
+
+
+}
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/ServiceFilter.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/ServiceFilter.java
new file mode 100644
index 0000000..49b7b49
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/util/ServiceFilter.java
@@ -0,0 +1,515 @@
+package org.onap.msb.apiroute.wrapper.util;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.api.Node;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.Service;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.orbitz.consul.model.health.HealthCheck;
+
+
+
+public class ServiceFilter {
+ private static ServiceFilter instance = new ServiceFilter();
+
+ private ServiceFilter() {}
+
+ public static ServiceFilter getInstance() {
+ return instance;
+ }
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ServiceFilter.class);
+
+
+ /**
+ * Determine whether the service needs to send a notification TODO: filter according to the
+ * agreement, the only notice of agreement for REST \HTTP\ UI interface MSB - REST
+ *
+ * @param protocol
+ * @return
+ */
+ public boolean isNeedNotifyByProtocol(String protocol) {
+ return CommonUtil.contain(RouteUtil.FILTER_PROTOCOLS, protocol.trim());
+ }
+
+ /**
+ * Determine whether the service needs to send a notification TODO: according to the visual range
+ * filter conditions Regular language: all 〠default 〠!default 〠A〠|A 〠A|B〠!A&!B
+ *
+ * @param visualRange
+ * @return
+ */
+ public boolean isNeedNotifyByNameSpace(String nameSpace) {
+
+ String namespaceMatches = ConfigUtil.getInstance().getNamespaceMatches();
+ String[] namespaceArray = StringUtils.split(namespaceMatches, "|");
+
+ if (CommonUtil.contain(namespaceArray, "all")) {
+ return true;
+ }
+
+ if (CommonUtil.contain(namespaceArray, "default")) {
+ if (StringUtils.isEmpty(nameSpace) || "default".equals(nameSpace) ) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ if (CommonUtil.contain(namespaceArray, "!default")) {
+ if (StringUtils.isNotEmpty(nameSpace) && !"default".equals(nameSpace)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ try {
+ String namespaceReg;
+ if (namespaceMatches.contains("!")) {
+ namespaceReg = "^" + namespaceMatches.replaceAll("!", "").replaceAll("&", "|") + "$";
+ return !Pattern.matches(namespaceReg, nameSpace);
+ } else {
+ namespaceReg = "^" + namespaceMatches + "$";
+ return Pattern.matches(namespaceReg, nameSpace);
+ }
+
+ } catch (Exception e) {
+ LOGGER.error(" Regular " + namespaceMatches + " throw exception:" + e.getMessage());
+ return false;
+ }
+ }
+
+ public boolean isNeedNotifyByVisualRange(String visualRange) {
+
+ String[] routeVisualRangeArray =
+ StringUtils.split(ConfigUtil.getInstance().getVisualRangeMatches(), "|");
+
+ String[] serviceVisualRangeArray = StringUtils.split(visualRange, "|");
+
+ if (CommonUtil.contain(serviceVisualRangeArray, routeVisualRangeArray)) {
+ return true;
+ }
+
+ return false;
+
+ }
+
+ public boolean isNeedNotifyByNetwork_plane_typeMatches(String network_plane_type) {
+
+ String network_plane_typeMatches = ConfigUtil.getInstance().getNetwork_plane_typeMatches();
+ if (StringUtils.isBlank(network_plane_typeMatches))
+ return true;
+
+ String[] routeNetwork_plane_typeArray = StringUtils.split(network_plane_typeMatches, "|");
+
+ String[] serviceVisualRangeArray = StringUtils.split(network_plane_type, "|");
+
+ if (CommonUtil.contain(serviceVisualRangeArray, routeNetwork_plane_typeArray)) {
+ return true;
+ }
+
+ return false;
+
+ }
+
+ /**
+ * Determine whether the service needs to send a notification TODO: according to the visual range
+ * filter conditions
+ *
+ * @param visualRange
+ * @return
+ */
+ public boolean isNeedNotifyByRouteLabels(Map<String, String> labelMap) {
+
+ Map<String, String> labelMapMatches = ConfigUtil.getInstance().getLabelMapMatches();
+
+ if (labelMapMatches == null || labelMapMatches.isEmpty()) {
+ return true;
+ }
+
+ for (Map.Entry<String, String> entry : labelMapMatches.entrySet()) {
+ String key = entry.getKey();
+ String value = entry.getValue();
+
+ // Multiple values match
+
+ if (StringUtils.isBlank(labelMap.get(key))) {
+ continue;
+ }
+
+ String[] routeLalelsArray = StringUtils.split(value, "|");
+
+ String[] serviceLabelsArray = StringUtils.split(labelMap.get(key), "|");
+
+ if (CommonUtil.contain(routeLalelsArray, serviceLabelsArray)) {
+ return true;
+ }
+
+ }
+
+ return false;
+ }
+
+
+
+ /*
+ * public boolean isNeedNotifyByRoute(String protocol, String namespace, String visualRange,
+ * String network_plane_type, Map<String, String> labelMap) {
+ *
+ * return isNeedNotifyByProtocol(protocol) && isNeedNotifyByNameSpace(namespace) &&
+ * isNeedNotifyByVisualRange(visualRange) && isNeedNotifyByRouteLabels(labelMap) &&
+ * isNeedNotifyByNetwork_plane_typeMatches(network_plane_type);
+ *
+ * }
+ */
+
+ public boolean isFilterCheck(ServiceHealth health){
+ return isFilterHealthCheck(health.getChecks()) && isFilterService(health.getService().getTags());
+ }
+
+ /**
+ * @Title isFilterHealthCheck
+ * @Description TODO(判断æœåŠ¡å®žä¾‹çš„å¥åº·æ£€æŸ¥ä¿¡æ¯ï¼Œå…¨éƒ¨ä¸ºpassing表示å¥åº·æ£€æŸ¥æœ‰æ•ˆ)
+ * @param List<HealthCheck>
+ * @return boolean checkList示例——"Checks" : [{
+ "Node" : "server",
+ "CheckID" : "serfHealth",
+ "Name" : "Serf Health Status",
+ "Status" : "passing",
+ "Notes" : "",
+ "Output" : "Agent alive and reachable",
+ "ServiceID" : "",
+ "ServiceName" : "",
+ "CreateIndex" : 65536,
+ "ModifyIndex" : 65536
+ }, {
+ "Node" : "server",
+ "CheckID" : "service:_tcp_roundrobin_1_10.74.151.26_22",
+ "Name" : "Service 'tcp_roundrobin_1' check",
+ "Status" : "critical",
+ "Notes" : "",
+ "Output" : "dial tcp: missing port in address ok",
+ "ServiceID" : "_tcp_roundrobin_1_10.74.151.26_22",
+ "ServiceName" : "tcp_roundrobin_1",
+ "CreateIndex" : 75988,
+ "ModifyIndex" : 76173
+ }
+ ]
+ */
+ public boolean isFilterHealthCheck(List<HealthCheck> checkList){
+ if(checkList.isEmpty()){
+ return true;
+ }
+
+ for (HealthCheck check : checkList) {
+ if (!RouteUtil.HEALTH_CHECK_PASSING.equals(check.getStatus())) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+
+
+ /**
+ * @Title isFilterService
+ * @Description TODO(判断æ¥è‡ªconsulçš„æœåŠ¡ä¿¡æ¯æ˜¯å¦éœ€è¦è¿‡æ»¤)
+ * @param List<String>
+ * @return boolean tagList示例—— [
+ * "\"base\":{\"protocol\":\"REST\",\"is_manual\":\"true\",\"version\":\"v1\",\"url\":\"/api/msbtest/v1\"}"
+ * , "\"ns\":{\"namespace\":\"nsName\"}",
+ * "\"labels\":{\"visualRange\":\"0\",\"network_plane_type\":\"net\",\"customLabel\":\"custom\"}"
+ * ]
+ */
+ @SuppressWarnings("unchecked")
+ public boolean isFilterService(List<String> tagList) {
+
+ if (tagList == null || tagList.size() == 0)
+ return false;
+
+ String visualRange = "", network_plane_type = "", protocol = "", namespace = "";
+
+ //针对多版本ä¸åŒå±žæ€§çš„tag会有多个,åªè¦å…¶ä¸­ä¸€ä¸ªåŒ¹é…å³é€šè¿‡è¿‡æ»¤,默认ä¸é€šè¿‡
+ boolean visualRangeFilter=false,protocolFilter = false, namespaceFilter = false;
+ boolean hasnamespace=false;
+
+ try {
+
+ for (String tag : tagList) {
+
+ // æå–基础属性tag
+ if (!protocolFilter && tag.startsWith("\"base\"")) {
+ String ms_base_json = tag.split("\"base\":")[1];
+
+ Map<String, String> baseMap =
+ (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_base_json, Map.class);
+
+ if (baseMap.get("protocol") != null) {
+ protocol = baseMap.get("protocol");
+ if ("PORTAL".equalsIgnoreCase(protocol)) {
+ protocol = "HTTP";
+ }
+
+ if (isNeedNotifyByProtocol(protocol)) {
+ protocolFilter=true;
+ }
+
+ }
+
+
+
+ continue;
+ }
+
+ // æå–命å空间属性tag
+ if (!namespaceFilter && tag.startsWith("\"ns\"")) {
+ String ms_ns_json = tag.split("\"ns\":")[1];
+ Map<String, String> nsMap =
+ (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_ns_json, Map.class);
+
+ if (nsMap.get("namespace") != null) {
+ namespace = nsMap.get("namespace");
+ hasnamespace=true;
+
+ if (isNeedNotifyByNameSpace(namespace)) {
+ namespaceFilter=true;
+ }
+ }
+
+
+ continue;
+ }
+
+ // æå–Label属性tag
+ if (tag.startsWith("\"labels\"")) {
+ String ms_labels_json = "{" + tag.split("\"labels\":\\{")[1];
+ // 自定义label标签属性
+ Map<String, String> labelMap =
+ (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_labels_json, Map.class);
+
+
+
+ if (!visualRangeFilter && labelMap.get("visualRange") != null) {
+ visualRange = labelMap.get("visualRange");
+ labelMap.remove("visualRange"); // 自定义标签排除å¯è§èŒƒå›´å’Œç½‘络平é¢
+
+ if(isNeedNotifyByVisualRange(visualRange)){
+ visualRangeFilter=true;
+ }
+ }
+
+
+ if (labelMap.get("network_plane_type") != null) {
+ network_plane_type = labelMap.get("network_plane_type");
+ labelMap.remove("network_plane_type");
+ }
+ if (!isNeedNotifyByNetwork_plane_typeMatches(network_plane_type)) {
+ return false;
+ }
+
+ if (!isNeedNotifyByRouteLabels(labelMap)) {
+ return false;
+ }
+
+ continue;
+ }
+
+ }
+
+ //针对无命å空间的æœåŠ¡åˆ¤æ–­æ˜¯å¦è¿‡æ»¤
+ if (!hasnamespace && isNeedNotifyByNameSpace(namespace)) {
+ namespaceFilter=true;
+ }
+
+ return visualRangeFilter && protocolFilter && namespaceFilter;
+
+
+ } catch (Exception e) {
+ LOGGER.error(" read tag throw exception", e);
+ return false;
+ }
+
+
+ }
+
+
+
+ @SuppressWarnings("unchecked")
+ public Map<String, MicroServiceFullInfo> transMicroServiceInfoFromConsul(
+ List<ServiceHealth> serviceNodeList) {
+ // åŒå多版本æœåŠ¡MAP
+ Map<String, MicroServiceFullInfo> microServiceInfo4version =
+ new HashMap<String, MicroServiceFullInfo>();
+
+
+ for (ServiceHealth serviceNode : serviceNodeList) {
+
+ MicroServiceFullInfo microServiceInfo = new MicroServiceFullInfo();
+ String url = "";
+ String version = "", visualRange = "", protocol = "", lb_policy = "", namespace =
+ "", host = "", path = "", publish_port = "";
+ boolean enable_ssl = false;
+
+ HashSet<Node> nodes = new HashSet<Node>();
+
+ Service service = serviceNode.getService();
+ String serviceName = service.getService();
+
+ try {
+ List<String> tagList = service.getTags();
+
+ for (String tag : tagList) {
+
+ if (tag.startsWith("\"base\"")) {
+ String ms_base_json = tag.split("\"base\":")[1];
+
+
+ Map<String, String> baseMap =
+ (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_base_json, Map.class);
+ if (baseMap.get("url") != null) {
+ url = baseMap.get("url");
+ }
+
+ if (baseMap.get("version") != null) {
+ version = baseMap.get("version");
+ }
+
+ if (baseMap.get("protocol") != null) {
+ protocol = baseMap.get("protocol");
+ }
+
+ if (baseMap.get("host") != null) {
+ host = baseMap.get("host");
+ }
+
+ if (baseMap.get("path") != null) {
+ path = baseMap.get("path");
+ }
+
+ if (baseMap.get("publish_port") != null) {
+ publish_port = baseMap.get("publish_port");
+ }
+
+
+ if (baseMap.get("enable_ssl") != null) {
+ enable_ssl = Boolean.valueOf(baseMap.get("enable_ssl"));
+ }
+
+ continue;
+ }
+
+
+
+ if (tag.startsWith("\"ns\"")) {
+ String ms_ns_json = tag.split("\"ns\":")[1];
+ Map<String, String> nsMap =
+ (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_ns_json, Map.class);
+
+ if (nsMap.get("namespace") != null) {
+ namespace = nsMap.get("namespace");
+ }
+
+ continue;
+ }
+
+ if (tag.startsWith("\"labels\"")) {
+ String ms_labels_json = "{" + tag.split("\"labels\":\\{")[1];
+ Map<String, String> labelMap =
+ (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_labels_json, Map.class);
+
+
+ if (labelMap.get("visualRange") != null) {
+ visualRange = labelMap.get("visualRange");
+ }
+
+ /*if (labelMap.get("network_plane_type") != null) {
+ network_plane_type = labelMap.get("network_plane_type");
+ }*/
+
+ continue;
+ }
+
+ if (tag.startsWith("\"lb\"")) {
+ String ms_lb_json = tag.split("\"lb\":")[1];
+ Map<String, String> lbMap =
+ (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_lb_json, Map.class);
+
+ if (lbMap.get("lb_policy") != null) {
+ lb_policy = lbMap.get("lb_policy");
+ }
+ continue;
+ }
+
+ }
+
+
+
+ } catch (Exception e) {
+ LOGGER.error(serviceName + " read tag throw exception", e);
+ }
+
+ if (!microServiceInfo4version.containsKey(version)) {
+
+ if ("PORTAL".equalsIgnoreCase(protocol)) {
+ protocol = "HTTP";
+ microServiceInfo.setCustom(RouteUtil.CUSTOM_PORTAL);
+ }
+
+ microServiceInfo.setProtocol(protocol);
+ microServiceInfo.setUrl(url);
+ microServiceInfo.setServiceName(serviceName);
+ microServiceInfo.setLb_policy(lb_policy);
+ microServiceInfo.setVisualRange(visualRange);
+
+ microServiceInfo.setEnable_ssl(enable_ssl);
+ microServiceInfo.setVersion(version);
+ microServiceInfo.setNamespace(namespace);
+ microServiceInfo.setHost(host);
+ microServiceInfo.setPath(path);
+ //系统间apigateway ä¿å­˜publish_port
+ if ("0".equals(ConfigUtil.getInstance().getVisualRangeMatches())) {
+ microServiceInfo.setPublish_port(publish_port);
+ }
+
+ nodes.add(new Node(service.getAddress(), String.valueOf(service.getPort())));
+ microServiceInfo.setNodes(nodes);
+
+ microServiceInfo4version.put(version, microServiceInfo);
+ } else {
+
+ Set<Node> newNodes = microServiceInfo4version.get(version).getNodes();
+ // 默认node是注册信æ¯çš„IPå’Œport
+ newNodes.add(new Node(service.getAddress(), String.valueOf(service.getPort())));
+
+ // åŒå多版本åŒæ­¥
+ microServiceInfo4version.get(version).setNodes(newNodes);
+
+ }
+
+
+ /*
+ * // å¥åº·æ£€æŸ¥ä¿¡æ¯ List<Check> checks = value.getChecks(); node.setStatus("passing"); for (Check
+ * check : checks) { if (!"passing".equals(check.getStatus())) {
+ * node.setStatus(check.getStatus()); break; } }
+ */
+
+
+
+ }
+
+ return microServiceInfo4version;
+
+ }
+
+}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/META-INF/MANIFEST.MF b/apiroute/apiroute-service/src/main/resources/api-doc/META-INF/MANIFEST.MF
index eaf90a9..eaf90a9 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/META-INF/MANIFEST.MF
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/META-INF/MANIFEST.MF
diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/WEB-INF/web.xml b/apiroute/apiroute-service/src/main/resources/api-doc/WEB-INF/web.xml
new file mode 100644
index 0000000..7d51568
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/WEB-INF/web.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF 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.
+-->
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+ http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+ version="3.0"
+ metadata-complete="true">
+
+ <description>
+ ZENAP API-DOC.
+ </description>
+ <display-name>ZENAP API-DOC</display-name>
+ <!-- Define example filters -->
+
+
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ <welcome-file>index.xhtml</welcome-file>
+ <welcome-file>index.htm</welcome-file>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
+
+</web-app>
+
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/reset.css b/apiroute/apiroute-service/src/main/resources/api-doc/css/reset.css
index 6c9e9e6..b2b0789 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/reset.css
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/css/reset.css
@@ -1,21 +1,3 @@
-/**
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
/* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 */
html,
body,
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/screen.css b/apiroute/apiroute-service/src/main/resources/api-doc/css/screen.css
index 92881b7..32b199b 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/screen.css
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/css/screen.css
@@ -1,21 +1,3 @@
-/**
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
/* Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org> */
.swagger-section pre code {
display: block;
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css b/apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css
index 877304f..27c3751 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/css/typography.css
@@ -1,21 +1,3 @@
-/**
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
/* droid-sans-regular - latin */
@font-face {
font-family: 'Droid Sans';
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.eot b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.eot
index 2250b71..2250b71 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.eot
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.eot
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.svg b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.svg
index a54bbbb..a54bbbb 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.svg
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.svg
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.ttf b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.ttf
index 523cb92..523cb92 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.ttf
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.ttf
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff
index 67e3e25..67e3e25 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff2 b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff2
index 1e726a7..1e726a7 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff2
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-700.woff2
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.eot b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.eot
index ac2698e..ac2698e 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.eot
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.eot
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.svg b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.svg
index d9f2a21..d9f2a21 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.svg
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.svg
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.ttf b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.ttf
index 76aede2..76aede2 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.ttf
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.ttf
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff
index abf1989..abf1989 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff2 b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff2
index 9f93f74..9f93f74 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff2
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/fonts/droid-sans-v6-latin-regular.woff2
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/explorer_icons.png b/apiroute/apiroute-service/src/main/resources/api-doc/images/explorer_icons.png
index ed9d2ff..ed9d2ff 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/explorer_icons.png
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/images/explorer_icons.png
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/logo_small.png b/apiroute/apiroute-service/src/main/resources/api-doc/images/logo_small.png
index 5496a65..5496a65 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/logo_small.png
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/images/logo_small.png
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/pet_store_api.png b/apiroute/apiroute-service/src/main/resources/api-doc/images/pet_store_api.png
index f9f9cd4..f9f9cd4 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/pet_store_api.png
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/images/pet_store_api.png
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/throbber.gif b/apiroute/apiroute-service/src/main/resources/api-doc/images/throbber.gif
index 0639388..0639388 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/throbber.gif
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/images/throbber.gif
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/wordnik_api.png b/apiroute/apiroute-service/src/main/resources/api-doc/images/wordnik_api.png
index dca4f14..dca4f14 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/images/wordnik_api.png
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/images/wordnik_api.png
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/index.html b/apiroute/apiroute-service/src/main/resources/api-doc/index.html
index ee78118..944b1f3 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/index.html
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/index.html
@@ -1,121 +1,120 @@
-<!--
-
- Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<!DOCTYPE html>
-<html>
-<head>
- <title>Swagger UI</title>
- <link href='css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
- <link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
- <link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
- <link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/>
- <link href='css/screen.css' media='print' rel='stylesheet' type='text/css'/>
- <script type="text/javascript" src="lib/shred.bundle.js"></script>
- <script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script>
- <script src='lib/jquery.slideto.min.js' type='text/javascript'></script>
- <script src='lib/jquery.wiggle.min.js' type='text/javascript'></script>
- <script src='lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
- <script src='lib/handlebars-2.0.0.js' type='text/javascript'></script>
- <script src='lib/underscore-min.js' type='text/javascript'></script>
- <script src='lib/backbone-min.js' type='text/javascript'></script>
- <script src='lib/swagger-client.js' type='text/javascript'></script>
- <script src='swagger-ui.js' type='text/javascript'></script>
- <script src='lib/highlight.7.3.pack.js' type='text/javascript'></script>
- <script src='lib/marked.js' type='text/javascript'></script>
-
-
- <!-- enabling this will enable oauth2 implicit scope support -->
- <script src='lib/swagger-oauth.js' type='text/javascript'></script>
- <script type="text/javascript">
- $(function () {
- var url = window.location.search.match(/url=([^&]+)/);
- if (url && url.length > 1) {
- url = decodeURIComponent(url[1]);
- } else {
- url = "/api/microservices/v1/swagger.json";
- }
- window.swaggerUi = new SwaggerUi({
- url: url,
- dom_id: "swagger-ui-container",
- supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
- onComplete: function(swaggerApi, swaggerUi){
-
- if(typeof initOAuth == "function") {
- /*
- initOAuth({
- clientId: "your-client-id",
- realm: "your-realms",
- appName: "your-app-name"
- });
- */
- }
- $('pre code').each(function(i, e) {
- hljs.highlightBlock(e)
- });
- },
- onFailure: function(data) {
- log("Unable to Load SwaggerUI");
- },
- docExpansion: "none",
- sorter : "alpha"
- });
-
- function addApiKeyAuthorization() {
- var key = $('#input_apiKey')[0].value;
- log("key: " + key);
- if(key && key.trim() != "") {
- log("added key " + key);
- window.authorizations.add("api_key", new ApiKeyAuthorization("api_key", key, "query"));
- }
- }
-
- $('#input_apiKey').change(function() {
- addApiKeyAuthorization();
- });
-
- // if you have an apiKey you would like to pre-populate on the page for demonstration purposes...
- /*
- var apiKey = "myApiKeyXXXX123456789";
- $('#input_apiKey').val(apiKey);
- addApiKeyAuthorization();
- */
-
- window.swaggerUi.load();
- });
- </script>
-</head>
-
-<body class="swagger-section">
-<div id='header' style="display:none">
- <div class="swagger-ui-wrap" >
- <a id="logo" >zte conductor</a>
- <form id='api_selector'>
- <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
- <div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"/></div>
- <div class='input'><a id="explore" href="#">Explore</a></div>
- </form>
- </div>
-</div>
-
-<div id="message-bar" class="swagger-ui-wrap">&nbsp;</div>
-<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
-</body>
- <script type="text/javascript" src="js/iframeResizer/iframeResizer.contentWindow.min.js"></script>
-</html>
+<!--
+
+Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+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.
+
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Swagger UI</title>
+ <link href='css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
+ <link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
+ <link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
+ <link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/>
+ <link href='css/screen.css' media='print' rel='stylesheet' type='text/css'/>
+ <script type="text/javascript" src="lib/shred.bundle.js"></script>
+ <script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script>
+ <script src='lib/jquery.slideto.min.js' type='text/javascript'></script>
+ <script src='lib/jquery.wiggle.min.js' type='text/javascript'></script>
+ <script src='lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
+ <script src='lib/handlebars-2.0.0.js' type='text/javascript'></script>
+ <script src='lib/underscore-min.js' type='text/javascript'></script>
+ <script src='lib/backbone-min.js' type='text/javascript'></script>
+ <script src='lib/swagger-client.js' type='text/javascript'></script>
+ <script src='swagger-ui.js' type='text/javascript'></script>
+ <script src='lib/highlight.7.3.pack.js' type='text/javascript'></script>
+ <script src='lib/marked.js' type='text/javascript'></script>
+
+<script src='js/tools.js' type='text/javascript'></script>
+
+
+ <!-- enabling this will enable oauth2 implicit scope support -->
+ <script src='lib/swagger-oauth.js' type='text/javascript'></script>
+ <script type="text/javascript">
+ $(function () {
+ var url = window.location.search.match(/url=([^&]+)/);
+ if (url && url.length > 1) {
+ url = decodeURIComponent(url[1]);
+ } else {
+ url = "/api/microservices/v1/swagger.json";
+ }
+ window.swaggerUi = new SwaggerUi({
+ url: url,
+ dom_id: "swagger-ui-container",
+ supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
+ onComplete: function(swaggerApi, swaggerUi){
+
+ if(typeof initOAuth == "function") {
+ /*
+ initOAuth({
+ clientId: "your-client-id",
+ realm: "your-realms",
+ appName: "your-app-name"
+ });
+ */
+ }
+ $('pre code').each(function(i, e) {
+ hljs.highlightBlock(e)
+ });
+ },
+ onFailure: function(data) {
+ log("Unable to Load SwaggerUI");
+ },
+ docExpansion: "none",
+ sorter : "alpha"
+ });
+
+ function addApiKeyAuthorization() {
+ var key = $('#input_apiKey')[0].value;
+ log("key: " + key);
+ if(key && key.trim() != "") {
+ log("added key " + key);
+ window.authorizations.add("api_key", new ApiKeyAuthorization("api_key", key, "query"));
+ }
+ }
+
+ $('#input_apiKey').change(function() {
+ addApiKeyAuthorization();
+ });
+
+ // if you have an apiKey you would like to pre-populate on the page for demonstration purposes...
+ /*
+ var apiKey = "myApiKeyXXXX123456789";
+ $('#input_apiKey').val(apiKey);
+ addApiKeyAuthorization();
+ */
+
+ window.swaggerUi.load();
+ });
+ </script>
+</head>
+
+<body class="swagger-section">
+<div id='header' style="display:none">
+ <div class="swagger-ui-wrap" >
+ <a id="logo" >zte conductor</a>
+ <form id='api_selector'>
+ <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
+ <div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"/></div>
+ <div class='input'><a id="explore" href="#">Explore</a></div>
+ </form>
+ </div>
+</div>
+
+<div id="message-bar" class="swagger-ui-wrap">&nbsp;</div>
+<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
+</body>
+ <script type="text/javascript" src="js/iframeResizer/iframeResizer.contentWindow.min.js"></script>
+</html>
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/iframeResizer/iframeResizer.contentWindow.min.js b/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js
index 9330e0f..9330e0f 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/iframeResizer/iframeResizer.contentWindow.min.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/iframeResizer/iframeResizer.min.js b/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js
index e8f4bcb..e8f4bcb 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/iframeResizer/iframeResizer.min.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js
diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/js/tools.js b/apiroute/apiroute-service/src/main/resources/api-doc/js/tools.js
new file mode 100644
index 0000000..21ecd51
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/js/tools.js
@@ -0,0 +1,1054 @@
+/*
+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)
+ *
+ * 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.
+ */
+////åˆå¹¶hk.min.js
+/*! store2 - v2.3.0 - 2015-05-22
+* Copyright (c) 2015 Nathan Bubna; Licensed MIT, GPL */
+;(function(window, define) {
+ var _ = {
+ version: "2.3.0",
+ areas: {},
+ apis: {},
+
+ // utilities
+ inherit: function(api, o) {
+ for (var p in api) {
+ if (!o.hasOwnProperty(p)) {
+ o[p] = api[p];
+ }
+ }
+ return o;
+ },
+ stringify: function(d) {
+ return d === undefined || typeof d === "function" ? d+'' : JSON.stringify(d);
+ },
+ parse: function(s) {
+ // if it doesn't parse, return as is
+ try{ return JSON.parse(s); }catch(e){ return s; }
+ },
+
+ // extension hooks
+ fn: function(name, fn) {
+ _.storeAPI[name] = fn;
+ for (var api in _.apis) {
+ _.apis[api][name] = fn;
+ }
+ },
+ get: function(area, key){ return area.getItem(key); },
+ set: function(area, key, string){ area.setItem(key, string); },
+ remove: function(area, key){ area.removeItem(key); },
+ key: function(area, i){ return area.key(i); },
+ length: function(area){ return area.length; },
+ clear: function(area){ area.clear(); },
+
+ // core functions
+ Store: function(id, area, namespace) {
+ var store = _.inherit(_.storeAPI, function(key, data, overwrite) {
+ if (arguments.length === 0){ return store.getAll(); }
+ if (data !== undefined){ return store.set(key, data, overwrite); }
+ if (typeof key === "string"){ return store.get(key); }
+ if (!key){ return store.clear(); }
+ return store.setAll(key, data);// overwrite=data, data=key
+ });
+ store._id = id;
+ try {
+ var testKey = '_safariPrivate_';
+ area.setItem(testKey, 'sucks');
+ store._area = area;
+ area.removeItem(testKey);
+ } catch (e) {}
+ if (!store._area) {
+ store._area = _.inherit(_.storageAPI, { items: {}, name: 'fake' });
+ }
+ store._ns = namespace || '';
+ if (!_.areas[id]) {
+ _.areas[id] = store._area;
+ }
+ if (!_.apis[store._ns+store._id]) {
+ _.apis[store._ns+store._id] = store;
+ }
+ return store;
+ },
+ storeAPI: {
+ // admin functions
+ area: function(id, area) {
+ var store = this[id];
+ if (!store || !store.area) {
+ store = _.Store(id, area, this._ns);//new area-specific api in this namespace
+ if (!this[id]){ this[id] = store; }
+ }
+ return store;
+ },
+ namespace: function(namespace, noSession) {
+ if (!namespace){
+ return this._ns ? this._ns.substring(0,this._ns.length-1) : '';
+ }
+ var ns = namespace, store = this[ns];
+ if (!store || !store.namespace) {
+ store = _.Store(this._id, this._area, this._ns+ns+'.');//new namespaced api
+ if (!this[ns]){ this[ns] = store; }
+ if (!noSession){ store.area('session', _.areas.session); }
+ }
+ return store;
+ },
+ isFake: function(){ return this._area.name === 'fake'; },
+ toString: function() {
+ return 'store'+(this._ns?'.'+this.namespace():'')+'['+this._id+']';
+ },
+
+ // storage functions
+ has: function(key) {
+ if (this._area.has) {
+ return this._area.has(this._in(key));//extension hook
+ }
+ return !!(this._in(key) in this._area);
+ },
+ size: function(){ return this.keys().length; },
+ each: function(fn, and) {
+ for (var i=0, m=_.length(this._area); i<m; i++) {
+ var key = this._out(_.key(this._area, i));
+ if (key !== undefined) {
+ if (fn.call(this, key, and || this.get(key)) === false) {
+ break;
+ }
+ }
+ if (m > _.length(this._area)) { m--; i--; }// in case of removeItem
+ }
+ return and || this;
+ },
+ keys: function() {
+ return this.each(function(k, list){ list.push(k); }, []);
+ },
+ get: function(key, alt) {
+ var s = _.get(this._area, this._in(key));
+ return s !== null ? _.parse(s) : alt || s;// support alt for easy default mgmt
+ },
+ getAll: function() {
+ return this.each(function(k, all){ all[k] = this.get(k); }, {});
+ },
+ set: function(key, data, overwrite) {
+ var d = this.get(key);
+ if (d != null && overwrite === false) {
+ return data;
+ }
+ return _.set(this._area, this._in(key), _.stringify(data), overwrite) || d;
+ },
+ setAll: function(data, overwrite) {
+ var changed, val;
+ for (var key in data) {
+ val = data[key];
+ if (this.set(key, val, overwrite) !== val) {
+ changed = true;
+ }
+ }
+ return changed;
+ },
+ remove: function(key) {
+ var d = this.get(key);
+ _.remove(this._area, this._in(key));
+ return d;
+ },
+ clear: function() {
+ if (!this._ns) {
+ _.clear(this._area);
+ } else {
+ this.each(function(k){ _.remove(this._area, this._in(k)); }, 1);
+ }
+ return this;
+ },
+ clearAll: function() {
+ var area = this._area;
+ for (var id in _.areas) {
+ if (_.areas.hasOwnProperty(id)) {
+ this._area = _.areas[id];
+ this.clear();
+ }
+ }
+ this._area = area;
+ return this;
+ },
+
+ // internal use functions
+ _in: function(k) {
+ if (typeof k !== "string"){ k = _.stringify(k); }
+ return this._ns ? this._ns + k : k;
+ },
+ _out: function(k) {
+ return this._ns ?
+ k && k.indexOf(this._ns) === 0 ?
+ k.substring(this._ns.length) :
+ undefined : // so each() knows to skip it
+ k;
+ }
+ },// end _.storeAPI
+ storageAPI: {
+ length: 0,
+ has: function(k){ return this.items.hasOwnProperty(k); },
+ key: function(i) {
+ var c = 0;
+ for (var k in this.items){
+ if (this.has(k) && i === c++) {
+ return k;
+ }
+ }
+ },
+ setItem: function(k, v) {
+ if (!this.has(k)) {
+ this.length++;
+ }
+ this.items[k] = v;
+ },
+ removeItem: function(k) {
+ if (this.has(k)) {
+ delete this.items[k];
+ this.length--;
+ }
+ },
+ getItem: function(k){ return this.has(k) ? this.items[k] : null; },
+ clear: function(){ for (var k in this.list){ this.removeItem(k); } },
+ toString: function(){ return this.length+' items in '+this.name+'Storage'; }
+ }// end _.storageAPI
+ };
+
+ // setup the primary store fn
+ if (window.store){ _.conflict = window.store; }
+ var store =
+ // safely set this up (throws error in IE10/32bit mode for local files)
+ _.Store("local", (function(){try{ return localStorage; }catch(e){}})());
+ store.local = store;// for completeness
+ store._ = _;// for extenders and debuggers...
+ // safely setup store.session (throws exception in FF for file:/// urls)
+ store.area("session", (function(){try{ return sessionStorage; }catch(e){}})());
+
+ //Expose store to the global object
+ window.store = store;
+
+ if (typeof define === 'function' && define.amd !== undefined) {
+ define(function () {
+ return store;
+ });
+ } else if (typeof module !== 'undefined' && module.exports) {
+ module.exports = store;
+ }
+
+})(this, null);
+
+// XHook - v1.3.3 - https://github.com/jpillora/xhook
+// Jaime Pillora <dev@jpillora.com> - MIT Copyright 2015
+(function(window,undefined) {
+var AFTER, BEFORE, COMMON_EVENTS, EventEmitter, FIRE, FormData, NativeFormData, NativeXMLHttp, OFF, ON, READY_STATE, UPLOAD_EVENTS, XHookFormData, XHookHttpRequest, XMLHTTP, convertHeaders, depricatedProp, document, fakeEvent, mergeObjects, msie, proxyEvents, slice, xhook, _base,
+ __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
+
+document = window.document;
+
+BEFORE = 'before';
+
+AFTER = 'after';
+
+READY_STATE = 'readyState';
+
+ON = 'addEventListener';
+
+OFF = 'removeEventListener';
+
+FIRE = 'dispatchEvent';
+
+XMLHTTP = 'XMLHttpRequest';
+
+FormData = 'FormData';
+
+UPLOAD_EVENTS = ['load', 'loadend', 'loadstart'];
+
+COMMON_EVENTS = ['progress', 'abort', 'error', 'timeout'];
+
+msie = parseInt((/msie (\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
+
+if (isNaN(msie)) {
+ msie = parseInt((/trident\/.*; rv:(\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);
+}
+
+(_base = Array.prototype).indexOf || (_base.indexOf = function(item) {
+ var i, x, _i, _len;
+ for (i = _i = 0, _len = this.length; _i < _len; i = ++_i) {
+ x = this[i];
+ if (x === item) {
+ return i;
+ }
+ }
+ return -1;
+});
+
+slice = function(o, n) {
+ return Array.prototype.slice.call(o, n);
+};
+
+depricatedProp = function(p) {
+ return p === "returnValue" || p === "totalSize" || p === "position";
+};
+
+mergeObjects = function(src, dst) {
+ var k, v;
+ for (k in src) {
+ v = src[k];
+ if (depricatedProp(k)) {
+ continue;
+ }
+ try {
+ dst[k] = src[k];
+ } catch (_error) {}
+ }
+ return dst;
+};
+
+proxyEvents = function(events, src, dst) {
+ var event, p, _i, _len;
+ p = function(event) {
+ return function(e) {
+ var clone, k, val;
+ clone = {};
+ for (k in e) {
+ if (depricatedProp(k)) {
+ continue;
+ }
+ val = e[k];
+ clone[k] = val === src ? dst : val;
+ }
+ return dst[FIRE](event, clone);
+ };
+ };
+ for (_i = 0, _len = events.length; _i < _len; _i++) {
+ event = events[_i];
+ if (dst._has(event)) {
+ src["on" + event] = p(event);
+ }
+ }
+};
+
+fakeEvent = function(type) {
+ var msieEventObject;
+ if (document.createEventObject != null) {
+ msieEventObject = document.createEventObject();
+ msieEventObject.type = type;
+ return msieEventObject;
+ } else {
+ try {
+ return new Event(type);
+ } catch (_error) {
+ return {
+ type: type
+ };
+ }
+ }
+};
+
+EventEmitter = function(nodeStyle) {
+ var emitter, events, listeners;
+ events = {};
+ listeners = function(event) {
+ return events[event] || [];
+ };
+ emitter = {};
+ emitter[ON] = function(event, callback, i) {
+ events[event] = listeners(event);
+ if (events[event].indexOf(callback) >= 0) {
+ return;
+ }
+ i = i === undefined ? events[event].length : i;
+ events[event].splice(i, 0, callback);
+ };
+ emitter[OFF] = function(event, callback) {
+ var i;
+ if (event === undefined) {
+ events = {};
+ return;
+ }
+ if (callback === undefined) {
+ events[event] = [];
+ }
+ i = listeners(event).indexOf(callback);
+ if (i === -1) {
+ return;
+ }
+ listeners(event).splice(i, 1);
+ };
+ emitter[FIRE] = function() {
+ var args, event, i, legacylistener, listener, _i, _len, _ref;
+ args = slice(arguments);
+ event = args.shift();
+ if (!nodeStyle) {
+ args[0] = mergeObjects(args[0], fakeEvent(event));
+ }
+ legacylistener = emitter["on" + event];
+ if (legacylistener) {
+ legacylistener.apply(undefined, args);
+ }
+ _ref = listeners(event).concat(listeners("*"));
+ for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
+ listener = _ref[i];
+ listener.apply(undefined, args);
+ }
+ };
+ emitter._has = function(event) {
+ return !!(events[event] || emitter["on" + event]);
+ };
+ if (nodeStyle) {
+ emitter.listeners = function(event) {
+ return slice(listeners(event));
+ };
+ emitter.on = emitter[ON];
+ emitter.off = emitter[OFF];
+ emitter.fire = emitter[FIRE];
+ emitter.once = function(e, fn) {
+ var fire;
+ fire = function() {
+ emitter.off(e, fire);
+ return fn.apply(null, arguments);
+ };
+ return emitter.on(e, fire);
+ };
+ emitter.destroy = function() {
+ return events = {};
+ };
+ }
+ return emitter;
+};
+
+xhook = EventEmitter(true);
+
+xhook.EventEmitter = EventEmitter;
+
+xhook[BEFORE] = function(handler, i) {
+ if (handler.length < 1 || handler.length > 2) {
+ throw "invalid hook";
+ }
+ return xhook[ON](BEFORE, handler, i);
+};
+
+xhook[AFTER] = function(handler, i) {
+ if (handler.length < 2 || handler.length > 3) {
+ throw "invalid hook";
+ }
+ return xhook[ON](AFTER, handler, i);
+};
+
+xhook.enable = function() {
+ window[XMLHTTP] = XHookHttpRequest;
+ if (NativeFormData) {
+ window[FormData] = XHookFormData;
+ }
+};
+
+xhook.disable = function() {
+ window[XMLHTTP] = xhook[XMLHTTP];
+ window[FormData] = NativeFormData;
+};
+
+convertHeaders = xhook.headers = function(h, dest) {
+ var header, headers, k, name, v, value, _i, _len, _ref;
+ if (dest == null) {
+ dest = {};
+ }
+ switch (typeof h) {
+ case "object":
+ headers = [];
+ for (k in h) {
+ v = h[k];
+ name = k.toLowerCase();
+ headers.push("" + name + ":\t" + v);
+ }
+ return headers.join('\n');
+ case "string":
+ headers = h.split('\n');
+ for (_i = 0, _len = headers.length; _i < _len; _i++) {
+ header = headers[_i];
+ if (/([^:]+):\s*(.+)/.test(header)) {
+ name = (_ref = RegExp.$1) != null ? _ref.toLowerCase() : void 0;
+ value = RegExp.$2;
+ if (dest[name] == null) {
+ dest[name] = value;
+ }
+ }
+ }
+ return dest;
+ }
+};
+
+NativeFormData = window[FormData];
+
+XHookFormData = function(form) {
+ var entries;
+ this.fd = form ? new NativeFormData(form) : new NativeFormData();
+ this.form = form;
+ entries = [];
+ Object.defineProperty(this, 'entries', {
+ get: function() {
+ var fentries;
+ fentries = !form ? [] : slice(form.querySelectorAll("input,select")).filter(function(e) {
+ var _ref;
+ return ((_ref = e.type) !== 'checkbox' && _ref !== 'radio') || e.checked;
+ }).map(function(e) {
+ return [e.name, e.type === "file" ? e.files : e.value];
+ });
+ return fentries.concat(entries);
+ }
+ });
+ this.append = (function(_this) {
+ return function() {
+ var args;
+ args = slice(arguments);
+ entries.push(args);
+ return _this.fd.append.apply(_this.fd, args);
+ };
+ })(this);
+};
+
+if (NativeFormData) {
+ xhook[FormData] = NativeFormData;
+ window[FormData] = XHookFormData;
+}
+
+NativeXMLHttp = window[XMLHTTP];
+
+xhook[XMLHTTP] = NativeXMLHttp;
+
+XHookHttpRequest = window[XMLHTTP] = function() {
+ var ABORTED, currentState, emitFinal, emitReadyState, facade, hasError, hasErrorHandler, readBody, readHead, request, response, setReadyState, status, transiting, writeBody, writeHead, xhr;
+ ABORTED = -1;
+ xhr = new xhook[XMLHTTP]();
+ request = {};
+ status = null;
+ hasError = void 0;
+ transiting = void 0;
+ response = void 0;
+ readHead = function() {
+ var key, name, val, _ref;
+ response.status = status || xhr.status;
+ if (!(status === ABORTED && msie < 10)) {
+ response.statusText = xhr.statusText;
+ }
+ if (status !== ABORTED) {
+ _ref = convertHeaders(xhr.getAllResponseHeaders());
+ for (key in _ref) {
+ val = _ref[key];
+ if (!response.headers[key]) {
+ name = key.toLowerCase();
+ response.headers[name] = val;
+ }
+ }
+ }
+ };
+ readBody = function() {
+ if (!xhr.responseType || xhr.responseType === "text") {
+ response.text = xhr.responseText;
+ response.data = xhr.responseText;
+ } else if (xhr.responseType === "document") {
+ response.xml = xhr.responseXML;
+ response.data = xhr.responseXML;
+ } else {
+ response.data = xhr.response;
+ }
+ try{
+ if(response.data){
+ // checked login time out reload to login
+ var data = $.parseJSON(response.data);
+ if(data.source && data.redirect_uri && data.source === "smagent"){
+ var redirect_uri = data.redirect_uri;
+ if(top){
+ top.location = redirect_uri.replace('$1', encodeURIComponent(top.location));
+ }else{
+ window.location = redirect_uri.replace('$1', encodeURIComponent(window.location));
+ }
+ }
+ }
+ }catch(e){}
+
+ if ("responseURL" in xhr) {
+ response.finalUrl = xhr.responseURL;
+ }
+ };
+ writeHead = function() {
+ facade.status = response.status;
+ facade.statusText = response.statusText;
+ };
+ writeBody = function() {
+ if ('text' in response) {
+ facade.responseText = response.text;
+ }
+ if ('xml' in response) {
+ facade.responseXML = response.xml;
+ }
+ if ('data' in response) {
+ facade.response = response.data;
+ }
+ if ('finalUrl' in response) {
+ facade.responseURL = response.finalUrl;
+ }
+ };
+ emitReadyState = function(n) {
+ while (n > currentState && currentState < 4) {
+ facade[READY_STATE] = ++currentState;
+ if (currentState === 1) {
+ facade[FIRE]("loadstart", {});
+ }
+ if (currentState === 2) {
+ writeHead();
+ }
+ if (currentState === 4) {
+ writeHead();
+ writeBody();
+ }
+ facade[FIRE]("readystatechange", {});
+ if (currentState === 4) {
+ setTimeout(emitFinal, 0);
+ }
+ }
+ };
+ emitFinal = function() {
+ if (!hasError) {
+ facade[FIRE]("load", {});
+ }
+ facade[FIRE]("loadend", {});
+ if (hasError) {
+ facade[READY_STATE] = 0;
+ }
+ };
+ currentState = 0;
+ setReadyState = function(n) {
+ var hooks, process;
+ if (n !== 4) {
+ emitReadyState(n);
+ return;
+ }
+ hooks = xhook.listeners(AFTER);
+ process = function() {
+ var hook;
+ if (!hooks.length) {
+ return emitReadyState(4);
+ }
+ hook = hooks.shift();
+ if (hook.length === 2) {
+ hook(request, response);
+ return process();
+ } else if (hook.length === 3 && request.async) {
+ return hook(request, response, process);
+ } else {
+ return process();
+ }
+ };
+ process();
+ };
+ facade = request.xhr = EventEmitter();
+ xhr.onreadystatechange = function(event) {
+ try {
+ if (xhr[READY_STATE] === 2) {
+ readHead();
+ }
+ } catch (_error) {}
+ if (xhr[READY_STATE] === 4) {
+ transiting = false;
+ readHead();
+ readBody();
+ }
+ setReadyState(xhr[READY_STATE]);
+ };
+ hasErrorHandler = function() {
+ hasError = true;
+ };
+ facade[ON]('error', hasErrorHandler);
+ facade[ON]('timeout', hasErrorHandler);
+ facade[ON]('abort', hasErrorHandler);
+ facade[ON]('progress', function() {
+ if (currentState < 3) {
+ setReadyState(3);
+ } else {
+ facade[FIRE]("readystatechange", {});
+ }
+ });
+ if ('withCredentials' in xhr || xhook.addWithCredentials) {
+ facade.withCredentials = false;
+ }
+ facade.status = 0;
+ facade.open = function(method, url, async, user, pass) {
+ currentState = 0;
+ hasError = false;
+ transiting = false;
+ request.headers = {};
+ request.headerNames = {};
+ request.status = 0;
+ response = {};
+ response.headers = {};
+ request.method = method;
+ request.url = url;
+ request.async = async !== false;
+ request.user = user;
+ request.pass = pass;
+ setReadyState(1);
+ };
+ facade.send = function(body) {
+ var hooks, k, modk, process, send, _i, _len, _ref;
+ _ref = ['type', 'timeout', 'withCredentials'];
+ if(navigator.userAgent.indexOf("Firefox/") != -1){http://atmosphere-framework.2306103.n4.nabble.com/Atmosphere-js-withCredentials-true-does-not-work-in-Firefox-td4656661.html
+ _ref = ['type', 'timeout'];
+ }
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ k = _ref[_i];
+ modk = k === "type" ? "responseType" : k;
+ if (modk in facade) {
+ request[k] = facade[modk];
+ }
+ }
+ request.body = body;
+ send = function() {
+ var header, value, _j, _len1, _ref1, _ref2;
+ proxyEvents(COMMON_EVENTS, xhr, facade);
+ if (facade.upload) {
+ proxyEvents(COMMON_EVENTS.concat(UPLOAD_EVENTS), xhr.upload, facade.upload);
+ }
+ transiting = true;
+ xhr.open(request.method, request.url, request.async, request.user, request.pass);
+ _ref1 = ['type', 'timeout', 'withCredentials'];
+ if(navigator.userAgent.indexOf("Firefox/") != -1){//http://atmosphere-framework.2306103.n4.nabble.com/Atmosphere-js-withCredentials-true-does-not-work-in-Firefox-td4656661.html
+ _ref1 = ['type', 'timeout'];
+ }
+ for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
+ k = _ref1[_j];
+ modk = k === "type" ? "responseType" : k;
+ if (k in request) {
+ xhr[modk] = request[k];
+ }
+ }
+ _ref2 = request.headers;
+ for (header in _ref2) {
+ value = _ref2[header];
+ xhr.setRequestHeader(header, value);
+ }
+ if (request.body instanceof XHookFormData) {
+ request.body = request.body.fd;
+ }
+ xhr.send(request.body);
+ };
+ hooks = xhook.listeners(BEFORE);
+ process = function() {
+ var done, hook;
+ if (!hooks.length) {
+ return send();
+ }
+ done = function(userResponse) {
+ if (typeof userResponse === 'object' && (typeof userResponse.status === 'number' || typeof response.status === 'number')) {
+ mergeObjects(userResponse, response);
+ if (__indexOf.call(userResponse, 'data') < 0) {
+ userResponse.data = userResponse.response || userResponse.text;
+ }
+ setReadyState(4);
+ return;
+ }
+ process();
+ };
+ done.head = function(userResponse) {
+ mergeObjects(userResponse, response);
+ return setReadyState(2);
+ };
+ done.progress = function(userResponse) {
+ mergeObjects(userResponse, response);
+ return setReadyState(3);
+ };
+ hook = hooks.shift();
+ if (hook.length === 1) {
+ return done(hook(request));
+ } else if (hook.length === 2 && request.async) {
+ return hook(request, done);
+ } else {
+ return done();
+ }
+ };
+ process();
+ };
+ facade.abort = function() {
+ status = ABORTED;
+ if (transiting) {
+ xhr.abort();
+ } else {
+ facade[FIRE]('abort', {});
+ }
+ };
+ facade.setRequestHeader = function(header, value) {
+ var lName, name;
+ lName = header != null ? header.toLowerCase() : void 0;
+ name = request.headerNames[lName] = request.headerNames[lName] || header;
+ if (request.headers[name]) {
+ value = request.headers[name] + ', ' + value;
+ }
+ request.headers[name] = value;
+ };
+ facade.getResponseHeader = function(header) {
+ var name;
+ name = header != null ? header.toLowerCase() : void 0;
+ return response.headers[name];
+ };
+ facade.getAllResponseHeaders = function() {
+ return convertHeaders(response.headers);
+ };
+ if (xhr.overrideMimeType) {
+ facade.overrideMimeType = function() {
+ return xhr.overrideMimeType.apply(xhr, arguments);
+ };
+ }
+ if (xhr.upload) {
+ facade.upload = request.upload = EventEmitter();
+ }
+ return facade;
+};
+/*
+if (typeof this.define === "function" && this.define.amd) {
+ define("xhook", [], function() {
+ return xhook;
+ });
+} else {*/
+ (this.exports || this).xhook = xhook;
+//}
+
+}.call(this,window));
+
+xhook.before(function(request) {
+ var zte_headers = store('zte_http_headers');
+ if (zte_headers && zte_headers.length > 0) {
+ for (i = 0; i < zte_headers.length; i++) {
+ if (zte_headers[i].store === true) {
+ if ( !! store(zte_headers[i].value)) {
+ request.headers[zte_headers[i].key] = store(zte_headers[i].value);
+ }
+ } else {
+ request.headers[zte_headers[i].key] = zte_headers[i].value;
+ }
+ }
+ }
+});
+/**
+ * åˆå§‹åŒ–脚本文件装载工具
+ * zongying 2010.12
+ * modify:
+ */
+$Boot = {};
+
+/**
+ * 创建命å空间
+ * @param {Object} name
+ * @param {Object} object
+ */
+$Boot.createNamespace = function(name, object) {
+ var splits = name.split(".");
+ var parent = window;
+ //document.windowæµè§ˆå™¨å†…置对象
+ var part = splits[0];
+ for (var i = 0, len = splits.length - 1; i < len; i++, part = splits[i]) {
+ if (!parent[part]) {
+ parent = parent[part] = {};
+ } else {
+ parent = parent[part];
+ }
+ }
+ // 存放对象
+ parent[part] = object;
+ // 返回 last part name (例如:classname)
+ return part;
+}
+
+$Boot.isDefined = function(o) {
+ return typeof (o) != "undefined"
+}
+/**
+ * å¯åŠ¨é…置类
+ */
+$Boot.Config = function() {
+
+ function isDefined(o) {
+ return typeof (o) != "undefined"
+ }
+
+ //用户应用当å‰ç›®å½•
+ if (!isDefined(window.$userAppDir)) {
+ window.$userAppDir = './'
+ }
+ //组件库目录
+ if (!isDefined(window.$userFrameDir)) {
+ window.$userFrameDir = '/common/'
+ }
+ //用户i18文件目录
+ if (!isDefined(window.$userI18nDir)) {
+ window.$userI18nDir = './'
+ }
+
+ //当å‰è¯­è¨€ 默认为英语
+ var language = "zh-CN";
+ //var languageList = ['ar', 'ba', 'cr', 'cs', 'de', 'el', 'es', 'fi', 'fr', 'fr-FR', 'hu-HU', 'id', 'it', 'ja', 'nb-NO', 'nl', 'pl', 'pl-PL', 'pt', 'pt-BR', 'ro-RO', 'ru-RU', 'sk', 'sr', 'sr-Latn', 'sv-SE', 'en-US','uk-UA', 'zh-CN', 'zh-TW'];
+ var languageList = ['en-US', 'zh-CN'];
+
+ //从æœåŠ¡ç«¯å–客户端接å—语言类型
+ var getAcceptLangFromServer = true;
+
+
+ /**
+ * 创建XMLHttpRequest对象
+ */
+ function createXMLHttpRequest() {
+ if (window.ActiveXObject) {
+ return new ActiveXObject("Microsoft.XMLHTTP");
+ } else if (window.XMLHttpRequest) {
+ return new XMLHttpRequest();
+ } else {
+ throw new Error("This Brower do not support XMLHTTP!!");
+ }
+ }
+
+
+ /**
+ * åŒæ­¥å‘é€xml http 请求
+ * @param {Object} url
+ * @param {Object} data
+ * @param {Object} method
+ */
+ function httpRequest(method, url, data) {
+ var xmlhttp;
+ xmlhttp = createXMLHttpRequest();
+ var sendData = null;
+ if (method == "get") {
+ url = url + "?" + data;
+
+ } else if (method == "post") {
+ sendData = data;
+ }
+ xmlhttp.open(method, url, false);
+ xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
+ xmlhttp.setRequestHeader("If-Modified-Since", "0");
+ xmlhttp.send(sendData);
+ if (xmlhttp.status == 200)
+ return xmlhttp.responseText;
+ }
+
+ /**
+ * åŒæ­¥å‘é€xml http 请求(给外部调用)
+ * @param {Object} url
+ * @param {Object} data
+ * @param {Object} method
+ */
+ this.httpRequestStatic = function(method, url, data) {
+ var xmlhttp;
+ xmlhttp = createXMLHttpRequest();
+ var sendData = null;
+ if (method == "get") {
+ url = url + "?" + data;
+
+ } else if (method == "post") {
+ sendData = data;
+ }
+ xmlhttp.open(method, url, false);
+ xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
+ xmlhttp.setRequestHeader("If-Modified-Since", "0");
+ xmlhttp.send(sendData);
+ if (xmlhttp.status == 200)
+ return xmlhttp.responseText;
+ }
+
+ function inArray(array, obj) {
+ for (var i = 0; i < array.length; i++) {
+ if (array[i] == obj) {
+ return true;
+ }
+ }
+ return false;
+
+ }
+
+ /**
+ * å–å¾—æµè§ˆå™¨è¯­è¨€ä¿¡æ¯
+ */
+ this.getLanguage = function() {
+ var rtnLanguage = localStorage.getItem("language-option");
+ if( rtnLanguage == "null" || rtnLanguage == null ){
+ rtnLanguage = window.navigator.userLanguage||window.navigator.language;
+ }
+ if( rtnLanguage == '"zh-CN"' || rtnLanguage == "zh-CN" ){
+ return "zh-CN";
+ }else{
+ return "en-US";
+ }
+ //return "en-US";
+ }
+
+ this.getUrlParam=function(name){
+ var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个å«æœ‰ç›®æ ‡å‚数的正则表达å¼å¯¹è±¡
+ var search =decodeURIComponent(location.search.substring(1)); //decodeURIComponent() 函数å¯å¯¹ encodeURIComponent() 函数编ç çš„ URI 进行解ç ã€‚
+ var r =search.match(reg); //匹é…目标å‚æ•°
+ if (r != null) return unescape(r[2]); //unescape() 函数å¯å¯¹é€šè¿‡ escape() ç¼–ç çš„字符串进行解ç ã€‚
+ return null; //返回å‚数值
+ }
+
+
+}
+
+//创建命å空间
+$Boot.createNamespace("com.zte.ums.aos.framework.BootConfig", $Boot.Config);
+//创建基础é…置对象实例
+$Boot.bootConfig = new com.zte.ums.aos.framework.BootConfig();
+
+function getLanguage(){
+ return $Boot.bootConfig.getLanguage();
+}
+
+function getStringWidth(text,fontSize)
+{
+ var span = document.getElementById("_ictframework_getwidth");
+ if (span == null) {
+ span = document.createElement("span");
+ span.id = "_ictframework_getwidth";
+ document.body.appendChild(span);
+ }
+ span.innerText = text;
+ span.style.whiteSpace = "nowrap";
+ $("#_ictframework_getwidth").attr('style','font-size:'+fontSize+'px;');
+ var width = span.offsetWidth;
+ $("#_ictframework_getwidth").attr('style','display:none');
+ return width;
+}
+
+function getUrlParam(name){
+ return $Boot.bootConfig.getUrlParam(name);
+}
+
+function httpRequest(method, url, data) {
+ return $Boot.bootConfig.httpRequestStatic(method, url, data)
+}
+
+// 定义JQUERY AJAX 完æˆå‡½æ•°ï¼Œåˆ¤æ–­è¿”回状æ€ï¼Œå¦‚果状æ€æ­£å¸¸ï¼Œä½†HEADER头里有session超时信æ¯ï¼Œåˆ™åˆ·æ–°é‡ç™»å½•
+// 如果状æ€ä¸º 401, 也刷新é‡ç™»å½•
+// 注æ„如果在$.ajax() 函数中定义了 complete,则覆盖了这里预定义complete内容,以$.ajax()函数中定义的为准,这里预定义的函数则失效,如果
+// è¦ç»§ç»­åˆ¤æ–­session超时,则需è¦åœ¨ $.ajax()函数中定义的complete函数中加入这里预定义内容。
+if (jQuery) {
+ $.ajaxSetup({
+ complete:function(XMLHttpRequest,textStatus){
+ if (XMLHttpRequest.status == 401) {
+ window.location.replace("login.html");
+ }
+ // if (XMLHttpRequest.status == 200) {
+ // var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus"); ////通过XMLHttpRequestå–å¾—å“应头,sessionstatus,
+ // if(sessionstatus=="timeout"){
+ // window.location.replace("/");
+ // }
+ // } else if (XMLHttpRequest.status == 401) {
+ // window.location.replace("/");
+ // }
+ }
+ });
+} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/backbone-min.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/backbone-min.js
index 28acba2..a3f544b 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/backbone-min.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/backbone-min.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
// Backbone.js 1.1.2
(function(t,e){if(typeof define==="function"&&define.amd){define(["underscore","jquery","exports"],function(i,r,s){t.Backbone=e(t,s,i,r)})}else if(typeof exports!=="undefined"){var i=require("underscore");e(t,exports,i)}else{t.Backbone=e(t,{},t._,t.jQuery||t.Zepto||t.ender||t.$)}})(this,function(t,e,i,r){var s=t.Backbone;var n=[];var a=n.push;var o=n.slice;var h=n.splice;e.VERSION="1.1.2";e.$=r;e.noConflict=function(){t.Backbone=s;return this};e.emulateHTTP=false;e.emulateJSON=false;var u=e.Events={on:function(t,e,i){if(!c(this,"on",t,[e,i])||!e)return this;this._events||(this._events={});var r=this._events[t]||(this._events[t]=[]);r.push({callback:e,context:i,ctx:i||this});return this},once:function(t,e,r){if(!c(this,"once",t,[e,r])||!e)return this;var s=this;var n=i.once(function(){s.off(t,n);e.apply(this,arguments)});n._callback=e;return this.on(t,n,r)},off:function(t,e,r){var s,n,a,o,h,u,l,f;if(!this._events||!c(this,"off",t,[e,r]))return this;if(!t&&!e&&!r){this._events=void 0;return this}o=t?[t]:i.keys(this._events);for(h=0,u=o.length;h<u;h++){t=o[h];if(a=this._events[t]){this._events[t]=s=[];if(e||r){for(l=0,f=a.length;l<f;l++){n=a[l];if(e&&e!==n.callback&&e!==n.callback._callback||r&&r!==n.context){s.push(n)}}}if(!s.length)delete this._events[t]}}return this},trigger:function(t){if(!this._events)return this;var e=o.call(arguments,1);if(!c(this,"trigger",t,e))return this;var i=this._events[t];var r=this._events.all;if(i)f(i,e);if(r)f(r,arguments);return this},stopListening:function(t,e,r){var s=this._listeningTo;if(!s)return this;var n=!e&&!r;if(!r&&typeof e==="object")r=this;if(t)(s={})[t._listenId]=t;for(var a in s){t=s[a];t.off(e,r,this);if(n||i.isEmpty(t._events))delete this._listeningTo[a]}return this}};var l=/\s+/;var c=function(t,e,i,r){if(!i)return true;if(typeof i==="object"){for(var s in i){t[e].apply(t,[s,i[s]].concat(r))}return false}if(l.test(i)){var n=i.split(l);for(var a=0,o=n.length;a<o;a++){t[e].apply(t,[n[a]].concat(r))}return false}return true};var f=function(t,e){var i,r=-1,s=t.length,n=e[0],a=e[1],o=e[2];switch(e.length){case 0:while(++r<s)(i=t[r]).callback.call(i.ctx);return;case 1:while(++r<s)(i=t[r]).callback.call(i.ctx,n);return;case 2:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a);return;case 3:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a,o);return;default:while(++r<s)(i=t[r]).callback.apply(i.ctx,e);return}};var d={listenTo:"on",listenToOnce:"once"};i.each(d,function(t,e){u[e]=function(e,r,s){var n=this._listeningTo||(this._listeningTo={});var a=e._listenId||(e._listenId=i.uniqueId("l"));n[a]=e;if(!s&&typeof r==="object")s=this;e[t](r,s,this);return this}});u.bind=u.on;u.unbind=u.off;i.extend(e,u);var p=e.Model=function(t,e){var r=t||{};e||(e={});this.cid=i.uniqueId("c");this.attributes={};if(e.collection)this.collection=e.collection;if(e.parse)r=this.parse(r,e)||{};r=i.defaults({},r,i.result(this,"defaults"));this.set(r,e);this.changed={};this.initialize.apply(this,arguments)};i.extend(p.prototype,u,{changed:null,validationError:null,idAttribute:"id",initialize:function(){},toJSON:function(t){return i.clone(this.attributes)},sync:function(){return e.sync.apply(this,arguments)},get:function(t){return this.attributes[t]},escape:function(t){return i.escape(this.get(t))},has:function(t){return this.get(t)!=null},set:function(t,e,r){var s,n,a,o,h,u,l,c;if(t==null)return this;if(typeof t==="object"){n=t;r=e}else{(n={})[t]=e}r||(r={});if(!this._validate(n,r))return false;a=r.unset;h=r.silent;o=[];u=this._changing;this._changing=true;if(!u){this._previousAttributes=i.clone(this.attributes);this.changed={}}c=this.attributes,l=this._previousAttributes;if(this.idAttribute in n)this.id=n[this.idAttribute];for(s in n){e=n[s];if(!i.isEqual(c[s],e))o.push(s);if(!i.isEqual(l[s],e)){this.changed[s]=e}else{delete this.changed[s]}a?delete c[s]:c[s]=e}if(!h){if(o.length)this._pending=r;for(var f=0,d=o.length;f<d;f++){this.trigger("change:"+o[f],this,c[o[f]],r)}}if(u)return this;if(!h){while(this._pending){r=this._pending;this._pending=false;this.trigger("change",this,r)}}this._pending=false;this._changing=false;return this},unset:function(t,e){return this.set(t,void 0,i.extend({},e,{unset:true}))},clear:function(t){var e={};for(var r in this.attributes)e[r]=void 0;return this.set(e,i.extend({},t,{unset:true}))},hasChanged:function(t){if(t==null)return!i.isEmpty(this.changed);return i.has(this.changed,t)},changedAttributes:function(t){if(!t)return this.hasChanged()?i.clone(this.changed):false;var e,r=false;var s=this._changing?this._previousAttributes:this.attributes;for(var n in t){if(i.isEqual(s[n],e=t[n]))continue;(r||(r={}))[n]=e}return r},previous:function(t){if(t==null||!this._previousAttributes)return null;return this._previousAttributes[t]},previousAttributes:function(){return i.clone(this._previousAttributes)},fetch:function(t){t=t?i.clone(t):{};if(t.parse===void 0)t.parse=true;var e=this;var r=t.success;t.success=function(i){if(!e.set(e.parse(i,t),t))return false;if(r)r(e,i,t);e.trigger("sync",e,i,t)};q(this,t);return this.sync("read",this,t)},save:function(t,e,r){var s,n,a,o=this.attributes;if(t==null||typeof t==="object"){s=t;r=e}else{(s={})[t]=e}r=i.extend({validate:true},r);if(s&&!r.wait){if(!this.set(s,r))return false}else{if(!this._validate(s,r))return false}if(s&&r.wait){this.attributes=i.extend({},o,s)}if(r.parse===void 0)r.parse=true;var h=this;var u=r.success;r.success=function(t){h.attributes=o;var e=h.parse(t,r);if(r.wait)e=i.extend(s||{},e);if(i.isObject(e)&&!h.set(e,r)){return false}if(u)u(h,t,r);h.trigger("sync",h,t,r)};q(this,r);n=this.isNew()?"create":r.patch?"patch":"update";if(n==="patch")r.attrs=s;a=this.sync(n,this,r);if(s&&r.wait)this.attributes=o;return a},destroy:function(t){t=t?i.clone(t):{};var e=this;var r=t.success;var s=function(){e.trigger("destroy",e,e.collection,t)};t.success=function(i){if(t.wait||e.isNew())s();if(r)r(e,i,t);if(!e.isNew())e.trigger("sync",e,i,t)};if(this.isNew()){t.success();return false}q(this,t);var n=this.sync("delete",this,t);if(!t.wait)s();return n},url:function(){var t=i.result(this,"urlRoot")||i.result(this.collection,"url")||M();if(this.isNew())return t;return t.replace(/([^\/])$/,"$1/")+encodeURIComponent(this.id)},parse:function(t,e){return t},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return!this.has(this.idAttribute)},isValid:function(t){return this._validate({},i.extend(t||{},{validate:true}))},_validate:function(t,e){if(!e.validate||!this.validate)return true;t=i.extend({},this.attributes,t);var r=this.validationError=this.validate(t,e)||null;if(!r)return true;this.trigger("invalid",this,r,i.extend(e,{validationError:r}));return false}});var v=["keys","values","pairs","invert","pick","omit"];i.each(v,function(t){p.prototype[t]=function(){var e=o.call(arguments);e.unshift(this.attributes);return i[t].apply(i,e)}});var g=e.Collection=function(t,e){e||(e={});if(e.model)this.model=e.model;if(e.comparator!==void 0)this.comparator=e.comparator;this._reset();this.initialize.apply(this,arguments);if(t)this.reset(t,i.extend({silent:true},e))};var m={add:true,remove:true,merge:true};var y={add:true,remove:false};i.extend(g.prototype,u,{model:p,initialize:function(){},toJSON:function(t){return this.map(function(e){return e.toJSON(t)})},sync:function(){return e.sync.apply(this,arguments)},add:function(t,e){return this.set(t,i.extend({merge:false},e,y))},remove:function(t,e){var r=!i.isArray(t);t=r?[t]:i.clone(t);e||(e={});var s,n,a,o;for(s=0,n=t.length;s<n;s++){o=t[s]=this.get(t[s]);if(!o)continue;delete this._byId[o.id];delete this._byId[o.cid];a=this.indexOf(o);this.models.splice(a,1);this.length--;if(!e.silent){e.index=a;o.trigger("remove",o,this,e)}this._removeReference(o,e)}return r?t[0]:t},set:function(t,e){e=i.defaults({},e,m);if(e.parse)t=this.parse(t,e);var r=!i.isArray(t);t=r?t?[t]:[]:i.clone(t);var s,n,a,o,h,u,l;var c=e.at;var f=this.model;var d=this.comparator&&c==null&&e.sort!==false;var v=i.isString(this.comparator)?this.comparator:null;var g=[],y=[],_={};var b=e.add,w=e.merge,x=e.remove;var E=!d&&b&&x?[]:false;for(s=0,n=t.length;s<n;s++){h=t[s]||{};if(h instanceof p){a=o=h}else{a=h[f.prototype.idAttribute||"id"]}if(u=this.get(a)){if(x)_[u.cid]=true;if(w){h=h===o?o.attributes:h;if(e.parse)h=u.parse(h,e);u.set(h,e);if(d&&!l&&u.hasChanged(v))l=true}t[s]=u}else if(b){o=t[s]=this._prepareModel(h,e);if(!o)continue;g.push(o);this._addReference(o,e)}o=u||o;if(E&&(o.isNew()||!_[o.id]))E.push(o);_[o.id]=true}if(x){for(s=0,n=this.length;s<n;++s){if(!_[(o=this.models[s]).cid])y.push(o)}if(y.length)this.remove(y,e)}if(g.length||E&&E.length){if(d)l=true;this.length+=g.length;if(c!=null){for(s=0,n=g.length;s<n;s++){this.models.splice(c+s,0,g[s])}}else{if(E)this.models.length=0;var k=E||g;for(s=0,n=k.length;s<n;s++){this.models.push(k[s])}}}if(l)this.sort({silent:true});if(!e.silent){for(s=0,n=g.length;s<n;s++){(o=g[s]).trigger("add",o,this,e)}if(l||E&&E.length)this.trigger("sort",this,e)}return r?t[0]:t},reset:function(t,e){e||(e={});for(var r=0,s=this.models.length;r<s;r++){this._removeReference(this.models[r],e)}e.previousModels=this.models;this._reset();t=this.add(t,i.extend({silent:true},e));if(!e.silent)this.trigger("reset",this,e);return t},push:function(t,e){return this.add(t,i.extend({at:this.length},e))},pop:function(t){var e=this.at(this.length-1);this.remove(e,t);return e},unshift:function(t,e){return this.add(t,i.extend({at:0},e))},shift:function(t){var e=this.at(0);this.remove(e,t);return e},slice:function(){return o.apply(this.models,arguments)},get:function(t){if(t==null)return void 0;return this._byId[t]||this._byId[t.id]||this._byId[t.cid]},at:function(t){return this.models[t]},where:function(t,e){if(i.isEmpty(t))return e?void 0:[];return this[e?"find":"filter"](function(e){for(var i in t){if(t[i]!==e.get(i))return false}return true})},findWhere:function(t){return this.where(t,true)},sort:function(t){if(!this.comparator)throw new Error("Cannot sort a set without a comparator");t||(t={});if(i.isString(this.comparator)||this.comparator.length===1){this.models=this.sortBy(this.comparator,this)}else{this.models.sort(i.bind(this.comparator,this))}if(!t.silent)this.trigger("sort",this,t);return this},pluck:function(t){return i.invoke(this.models,"get",t)},fetch:function(t){t=t?i.clone(t):{};if(t.parse===void 0)t.parse=true;var e=t.success;var r=this;t.success=function(i){var s=t.reset?"reset":"set";r[s](i,t);if(e)e(r,i,t);r.trigger("sync",r,i,t)};q(this,t);return this.sync("read",this,t)},create:function(t,e){e=e?i.clone(e):{};if(!(t=this._prepareModel(t,e)))return false;if(!e.wait)this.add(t,e);var r=this;var s=e.success;e.success=function(t,i){if(e.wait)r.add(t,e);if(s)s(t,i,e)};t.save(null,e);return t},parse:function(t,e){return t},clone:function(){return new this.constructor(this.models)},_reset:function(){this.length=0;this.models=[];this._byId={}},_prepareModel:function(t,e){if(t instanceof p)return t;e=e?i.clone(e):{};e.collection=this;var r=new this.model(t,e);if(!r.validationError)return r;this.trigger("invalid",this,r.validationError,e);return false},_addReference:function(t,e){this._byId[t.cid]=t;if(t.id!=null)this._byId[t.id]=t;if(!t.collection)t.collection=this;t.on("all",this._onModelEvent,this)},_removeReference:function(t,e){if(this===t.collection)delete t.collection;t.off("all",this._onModelEvent,this)},_onModelEvent:function(t,e,i,r){if((t==="add"||t==="remove")&&i!==this)return;if(t==="destroy")this.remove(e,r);if(e&&t==="change:"+e.idAttribute){delete this._byId[e.previous(e.idAttribute)];if(e.id!=null)this._byId[e.id]=e}this.trigger.apply(this,arguments)}});var _=["forEach","each","map","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","max","min","toArray","size","first","head","take","initial","rest","tail","drop","last","without","difference","indexOf","shuffle","lastIndexOf","isEmpty","chain","sample"];i.each(_,function(t){g.prototype[t]=function(){var e=o.call(arguments);e.unshift(this.models);return i[t].apply(i,e)}});var b=["groupBy","countBy","sortBy","indexBy"];i.each(b,function(t){g.prototype[t]=function(e,r){var s=i.isFunction(e)?e:function(t){return t.get(e)};return i[t](this.models,s,r)}});var w=e.View=function(t){this.cid=i.uniqueId("view");t||(t={});i.extend(this,i.pick(t,E));this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()};var x=/^(\S+)\s*(.*)$/;var E=["model","collection","el","id","attributes","className","tagName","events"];i.extend(w.prototype,u,{tagName:"div",$:function(t){return this.$el.find(t)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();this.stopListening();return this},setElement:function(t,i){if(this.$el)this.undelegateEvents();this.$el=t instanceof e.$?t:e.$(t);this.el=this.$el[0];if(i!==false)this.delegateEvents();return this},delegateEvents:function(t){if(!(t||(t=i.result(this,"events"))))return this;this.undelegateEvents();for(var e in t){var r=t[e];if(!i.isFunction(r))r=this[t[e]];if(!r)continue;var s=e.match(x);var n=s[1],a=s[2];r=i.bind(r,this);n+=".delegateEvents"+this.cid;if(a===""){this.$el.on(n,r)}else{this.$el.on(n,a,r)}}return this},undelegateEvents:function(){this.$el.off(".delegateEvents"+this.cid);return this},_ensureElement:function(){if(!this.el){var t=i.extend({},i.result(this,"attributes"));if(this.id)t.id=i.result(this,"id");if(this.className)t["class"]=i.result(this,"className");var r=e.$("<"+i.result(this,"tagName")+">").attr(t);this.setElement(r,false)}else{this.setElement(i.result(this,"el"),false)}}});e.sync=function(t,r,s){var n=T[t];i.defaults(s||(s={}),{emulateHTTP:e.emulateHTTP,emulateJSON:e.emulateJSON});var a={type:n,dataType:"json"};if(!s.url){a.url=i.result(r,"url")||M()}if(s.data==null&&r&&(t==="create"||t==="update"||t==="patch")){a.contentType="application/json";a.data=JSON.stringify(s.attrs||r.toJSON(s))}if(s.emulateJSON){a.contentType="application/x-www-form-urlencoded";a.data=a.data?{model:a.data}:{}}if(s.emulateHTTP&&(n==="PUT"||n==="DELETE"||n==="PATCH")){a.type="POST";if(s.emulateJSON)a.data._method=n;var o=s.beforeSend;s.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",n);if(o)return o.apply(this,arguments)}}if(a.type!=="GET"&&!s.emulateJSON){a.processData=false}if(a.type==="PATCH"&&k){a.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}var h=s.xhr=e.ajax(i.extend(a,s));r.trigger("request",r,h,s);return h};var k=typeof window!=="undefined"&&!!window.ActiveXObject&&!(window.XMLHttpRequest&&(new XMLHttpRequest).dispatchEvent);var T={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};e.ajax=function(){return e.$.ajax.apply(e.$,arguments)};var $=e.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var S=/\((.*?)\)/g;var H=/(\(\?)?:\w+/g;var A=/\*\w+/g;var I=/[\-{}\[\]+?.,\\\^$|#\s]/g;i.extend($.prototype,u,{initialize:function(){},route:function(t,r,s){if(!i.isRegExp(t))t=this._routeToRegExp(t);if(i.isFunction(r)){s=r;r=""}if(!s)s=this[r];var n=this;e.history.route(t,function(i){var a=n._extractParameters(t,i);n.execute(s,a);n.trigger.apply(n,["route:"+r].concat(a));n.trigger("route",r,a);e.history.trigger("route",n,r,a)});return this},execute:function(t,e){if(t)t.apply(this,e)},navigate:function(t,i){e.history.navigate(t,i);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=i.result(this,"routes");var t,e=i.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(I,"\\$&").replace(S,"(?:$1)?").replace(H,function(t,e){return e?t:"([^/?]+)"}).replace(A,"([^?]*?)");return new RegExp("^"+t+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(t,e){var r=t.exec(e).slice(1);return i.map(r,function(t,e){if(e===r.length-1)return t||null;return t?decodeURIComponent(t):null})}});var N=e.History=function(){this.handlers=[];i.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var R=/^[#\/]|\s+$/g;var O=/^\/+|\/+$/g;var P=/msie [\w.]+/;var C=/\/$/;var j=/#.*$/;N.started=false;i.extend(N.prototype,u,{interval:50,atRoot:function(){return this.location.pathname.replace(/[^\/]$/,"$&/")===this.root},getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getFragment:function(t,e){if(t==null){if(this._hasPushState||!this._wantsHashChange||e){t=decodeURI(this.location.pathname+this.location.search);var i=this.root.replace(C,"");if(!t.indexOf(i))t=t.slice(i.length)}else{t=this.getHash()}}return t.replace(R,"")},start:function(t){if(N.started)throw new Error("Backbone.history has already been started");N.started=true;this.options=i.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var r=this.getFragment();var s=document.documentMode;var n=P.exec(navigator.userAgent.toLowerCase())&&(!s||s<=7);this.root=("/"+this.root+"/").replace(O,"/");if(n&&this._wantsHashChange){var a=e.$('<iframe src="javascript:0" tabindex="-1">');this.iframe=a.hide().appendTo("body")[0].contentWindow;this.navigate(r)}if(this._hasPushState){e.$(window).on("popstate",this.checkUrl)}else if(this._wantsHashChange&&"onhashchange"in window&&!n){e.$(window).on("hashchange",this.checkUrl)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}this.fragment=r;var o=this.location;if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){this.fragment=this.getFragment(null,true);this.location.replace(this.root+"#"+this.fragment);return true}else if(this._hasPushState&&this.atRoot()&&o.hash){this.fragment=this.getHash().replace(R,"");this.history.replaceState({},document.title,this.root+this.fragment)}}if(!this.options.silent)return this.loadUrl()},stop:function(){e.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl);if(this._checkUrlInterval)clearInterval(this._checkUrlInterval);N.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getFragment(this.getHash(this.iframe))}if(e===this.fragment)return false;if(this.iframe)this.navigate(e);this.loadUrl()},loadUrl:function(t){t=this.fragment=this.getFragment(t);return i.any(this.handlers,function(e){if(e.route.test(t)){e.callback(t);return true}})},navigate:function(t,e){if(!N.started)return false;if(!e||e===true)e={trigger:!!e};var i=this.root+(t=this.getFragment(t||""));t=t.replace(j,"");if(this.fragment===t)return;this.fragment=t;if(t===""&&i!=="/")i=i.slice(0,-1);if(this._hasPushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,i)}else if(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getFragment(this.getHash(this.iframe))){if(!e.replace)this.iframe.document.open().close();this._updateHash(this.iframe.location,t,e.replace)}}else{return this.location.assign(i)}if(e.trigger)return this.loadUrl(t)},_updateHash:function(t,e,i){if(i){var r=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});e.history=new N;var U=function(t,e){var r=this;var s;if(t&&i.has(t,"constructor")){s=t.constructor}else{s=function(){return r.apply(this,arguments)}}i.extend(s,r,e);var n=function(){this.constructor=s};n.prototype=r.prototype;s.prototype=new n;if(t)i.extend(s.prototype,t);s.__super__=r.prototype;return s};p.extend=g.extend=$.extend=w.extend=N.extend=U;var M=function(){throw new Error('A "url" property or function must be specified')};var q=function(t,e){var i=e.error;e.error=function(r){if(i)i(t,r,e);t.trigger("error",t,r,e)}};return e});
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/handlebars-2.0.0.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/handlebars-2.0.0.js
index 9d77778..53cf921 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/handlebars-2.0.0.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/handlebars-2.0.0.js
@@ -1,4 +1,3 @@
-
/*!
handlebars v2.0.0
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/highlight.7.3.pack.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/highlight.7.3.pack.js
index f5f6fd4..9a95a75 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/highlight.7.3.pack.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/highlight.7.3.pack.js
@@ -1,2 +1 @@
-
var hljs=new function(){function l(o){return o.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+q.parentNode.className).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o<p.length;o++){if(e[p[o]]||p[o]=="no-highlight"){return p[o]}}}function c(q){var o=[];(function p(r,s){for(var t=r.firstChild;t;t=t.nextSibling){if(t.nodeType==3){s+=t.nodeValue.length}else{if(t.nodeName=="BR"){s+=1}else{if(t.nodeType==1){o.push({event:"start",offset:s,node:t});s=p(t,s);o.push({event:"stop",offset:s,node:t})}}}}return s})(q,0);return o}function j(x,v,w){var p=0;var y="";var r=[];function t(){if(x.length&&v.length){if(x[0].offset!=v[0].offset){return(x[0].offset<v[0].offset)?x:v}else{return v[0].event=="start"?x:v}}else{return x.length?x:v}}function s(A){function z(B){return" "+B.nodeName+'="'+l(B.value)+'"'}return"<"+A.nodeName+Array.prototype.map.call(A.attributes,z).join("")+">"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=("</"+o.nodeName.toLowerCase()+">")}while(o!=u.node);r.splice(q,1);while(q<r.length){y+=s(r[q]);q++}}}}return y+l(w.substr(p))}function f(q){function o(s,r){return RegExp(s,"m"+(q.cI?"i":"")+(r?"g":""))}function p(y,w){if(y.compiled){return}y.compiled=true;var s=[];if(y.k){var r={};function z(A,t){t.split(" ").forEach(function(B){var C=B.split("|");r[C[0]]=[A,C[1]?Number(C[1]):1];s.push(C[0])})}y.lR=o(y.l||hljs.IR,true);if(typeof y.k=="string"){z("keyword",y.k)}else{for(var x in y.k){if(!y.k.hasOwnProperty(x)){continue}z(x,y.k[x])}}y.k=r}if(w){if(y.bWK){y.b="\\b("+s.join("|")+")\\s"}y.bR=o(y.b?y.b:"\\B|\\b");if(!y.e&&!y.eW){y.e="\\B|\\b"}if(y.e){y.eR=o(y.e)}y.tE=y.e||"";if(y.eW&&w.tE){y.tE+=(y.e?"|":"")+w.tE}}if(y.i){y.iR=o(y.i)}if(y.r===undefined){y.r=1}if(!y.c){y.c=[]}for(var v=0;v<y.c.length;v++){if(y.c[v]=="self"){y.c[v]=y}p(y.c[v],y)}if(y.starts){p(y.starts,w)}var u=[];for(var v=0;v<y.c.length;v++){u.push(y.c[v].b)}if(y.tE){u.push(y.tE)}if(y.i){u.push(y.i)}y.t=u.length?o(u.join("|"),true):{exec:function(t){return null}}}p(q)}function d(D,E){function o(r,M){for(var L=0;L<M.c.length;L++){var K=M.c[L].bR.exec(r);if(K&&K.index==0){return M.c[L]}}}function s(K,r){if(K.e&&K.eR.test(r)){return K}if(K.eW){return s(K.parent,r)}}function t(r,K){return K.i&&K.iR.test(r)}function y(L,r){var K=F.cI?r[0].toLowerCase():r[0];return L.k.hasOwnProperty(K)&&L.k[K]}function G(){var K=l(w);if(!A.k){return K}var r="";var N=0;A.lR.lastIndex=0;var L=A.lR.exec(K);while(L){r+=K.substr(N,L.index-N);var M=y(A,L);if(M){v+=M[1];r+='<span class="'+M[0]+'">'+L[0]+"</span>"}else{r+=L[0]}N=A.lR.lastIndex;L=A.lR.exec(K)}return r+K.substr(N)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return'<span class="'+r.language+'">'+r.value+"</span>"}function J(){return A.sL!==undefined?z():G()}function I(L,r){var K=L.cN?'<span class="'+L.cN+'">':"";if(L.rB){x+=K;w=""}else{if(L.eB){x+=l(r)+K;w=""}else{x+=K;w=r}}A=Object.create(L,{parent:{value:A}});B+=L.r}function C(K,r){w+=K;if(r===undefined){x+=J();return 0}var L=o(r,A);if(L){x+=J();I(L,r);return L.rB?0:r.length}var M=s(A,r);if(M){if(!(M.rE||M.eE)){w+=r}x+=J();do{if(A.cN){x+="</span>"}A=A.parent}while(A!=M.parent);if(M.eE){x+=l(r)}w="";if(M.starts){I(M.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw"Illegal"}w+=r;return r.length||1}var F=e[D];f(F);var A=F;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(E);if(!u){break}q=C(E.substr(p,u.index-p),u[0]);p=u.index+q}C(E.substr(p));return{r:B,keyword_count:v,value:x,language:D}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:l(E)}}else{throw H}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"<br>")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:"[^ />]+"},b]}]}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery-1.8.0.min.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery-1.8.0.min.js
index 066d72c..066d72c 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery-1.8.0.min.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery-1.8.0.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.ba-bbq.min.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.ba-bbq.min.js
index ddb13f7..bcbf248 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.ba-bbq.min.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.ba-bbq.min.js
@@ -1,3 +1,11 @@
+/*
+ * jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
+ * http://benalman.com/projects/jquery-bbq-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);
/*
* jQuery hashchange event - v1.2 - 2/11/2010
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.slideto.min.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.slideto.min.js
index ba32cff..ba32cff 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.slideto.min.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.slideto.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.wiggle.min.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.wiggle.min.js
index 2adb0d6..2adb0d6 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.wiggle.min.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/jquery.wiggle.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/marked.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/marked.js
index f20ffc8..c2a678d 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/marked.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/marked.js
@@ -1,21 +1,9 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/chjj/marked
*/
+
;(function() {
/**
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/shred.bundle.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/shred.bundle.js
index 5d00a55..22ea396 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/shred.bundle.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/shred.bundle.js
@@ -1,4 +1,3 @@
-
var require = function (file, cwd) {
var resolved = require.resolve(file, cwd || '/');
var mod = require.modules[resolved];
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/shred/content.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/shred/content.js
index 9d21e03..b8051fe 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/shred/content.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/shred/content.js
@@ -1,21 +1,4 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
+
// The purpose of the `Content` object is to abstract away the data conversions
// to and from raw content entities as strings. For example, you want to be able
// to pass in a Javascript object and have it be automatically converted into a
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-client.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-client.js
index 1f935cf..5ab57c1 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-client.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-client.js
@@ -1,4 +1,3 @@
-
/**
* swagger-client - swagger.js is a javascript client for use with swaggering APIs.
* @version v2.1.9-M1
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-oauth.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-oauth.js
index 9c1f620..c4e144f 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-oauth.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/swagger-oauth.js
@@ -1,4 +1,3 @@
-
var appName;
var popupMask;
var popupDialog;
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/underscore-min.js b/apiroute/apiroute-service/src/main/resources/api-doc/lib/underscore-min.js
index a9c6fb9..11f1d96 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/lib/underscore-min.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/lib/underscore-min.js
@@ -1,4 +1,3 @@
-
// Underscore.js 1.7.0
// http://underscorejs.org
// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
diff --git a/apiroute/apiroute-service/src/main/resources/api-doc/o2c.html b/apiroute/apiroute-service/src/main/resources/api-doc/o2c.html
new file mode 100644
index 0000000..88e8bf1
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/o2c.html
@@ -0,0 +1,20 @@
+<script>
+var qp = null;
+if(window.location.hash) {
+ qp = location.hash.substring(1);
+}
+else {
+ qp = location.search.substring(1);
+}
+qp = qp ? JSON.parse('{"' + qp.replace(/&/g, '","').replace(/=/g,'":"') + '"}',
+ function(key, value) {
+ return key===""?value:decodeURIComponent(value) }
+ ):{}
+
+if (window.opener.swaggerUi.tokenUrl)
+ window.opener.processOAuthCode(qp);
+else
+ window.opener.onOAuthComplete(qp);
+
+window.close();
+</script> \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.js b/apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.js
index 89a4050..89a4050 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.min.js b/apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.min.js
index e146e8d..e146e8d 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.min.js
+++ b/apiroute/apiroute-service/src/main/resources/api-doc/swagger-ui.min.js
diff --git a/apiroute/apiroute-service/src/main/resources/banner.txt b/apiroute/apiroute-service/src/main/resources/banner.txt
new file mode 100644
index 0000000..ef1f9e2
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/banner.txt
@@ -0,0 +1,5 @@
+ __ __ _ _ ____
+ | \/ | (_) ___ _ __ ___ ___ ___ _ __ __ __ (_) ___ ___ | __ ) _ _ ___
+ | |\/| | | | / __| | '__| / _ \ / __| / _ \ | '__| \ \ / / | | / __| / _ \ | _ \ | | | | / __|
+ | | | | | | | (__ | | | (_) | \__ \ | __/ | | \ V / | | | (__ | __/ | |_) | | |_| | \__ \
+ |_| |_| |_| \___| |_| \___/ |___/ \___| |_| \_/ |_| \___| \___| |____/ \__,_| |___/
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/css/animate.min.css b/apiroute/apiroute-service/src/main/resources/iui-route/css/animate.min.css
index 88b94d5..88b94d5 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/css/animate.min.css
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/css/animate.min.css
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/css/base.css b/apiroute/apiroute-service/src/main/resources/iui-route/css/base.css
new file mode 100644
index 0000000..94f4a5e
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/css/base.css
@@ -0,0 +1,54 @@
+#top-bar {
+ background-color: #e0e0e0;
+ border-radius: 0;
+ height: 50px;
+}
+#top-bar, #top-bar small, #top-bar a {
+ /* text-shadow: 0px -1px 0px #182127; */
+ color: #333;
+}
+.container-fluid {
+ background-color: #fff;
+}
+.navbar-inner {
+ padding-left: 20px;
+ padding-right: 20px;
+ background-color: #2c2c2c;
+ background-image: -moz-linear-gradient(top, #333333, #222222);
+ background-image: -ms-linear-gradient(top, #333333, #222222);
+ background-image: -o-linear-gradient(top, #333333, #222222);
+ background-image: linear-gradient(top, #333333, #222222);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+}
+
+.logoimg {
+ float: left;
+ padding-top: 5px;
+}
+
+.chineseTitle {
+ margin: 0;
+ float: left;
+ margin-left: 25px;
+ font-weight: bold;
+ padding-top: 12px;
+ letter-spacing: 2px;
+ font-size: 20px;
+ font-family: 'Microsoft Yahei', sans-serif;
+ /* text-shadow: -1px 1px rgba(221, 221, 221, 1); */
+}
+
+.englishTitle {
+ margin: 0;
+ float: left;
+ margin-left: 10px;
+ font-family: Arial;
+ font-size: 14px;
+ padding-top: 20px;
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/css/chart.css b/apiroute/apiroute-service/src/main/resources/iui-route/css/chart.css
new file mode 100644
index 0000000..2469495
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/css/chart.css
@@ -0,0 +1,16 @@
+.container-fluid2 {
+ padding-left: 15px;
+ padding-right: 15px;
+ float:left;
+}
+
+.routeName{
+ color: rgba(153, 153, 153, 0.71);
+ margin-left: 5px;
+ font-size: 10px;
+}
+
+.form-title{
+ margin-top: 10px;
+ margin-left: 30px;
+} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/css/newRoute.css b/apiroute/apiroute-service/src/main/resources/iui-route/css/newRoute.css
index 8593b46..c431855 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/css/newRoute.css
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/css/newRoute.css
@@ -1,273 +1,340 @@
-/**
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-body {
- background-color: #4d5b69!important;
- font-family: "microsoft yahei";
-}
-
-.header.navbar {
- width: 100%;
- padding: 0 20px 0 20px;
- margin: 0;
- border: 0px;
- padding: 0px;
- box-shadow: none;
- height: 42px;
- min-height: 42px;
-}
-
-.header {
- filter: none !important;
- background-image: none !important;
- background-color: #fff !important;
-}
-
-.header.navbar .navbar-brand {
- display: inline-block;
- margin-right: 0;
- padding: 0;
- width: 135px !important;
- height: 42px !important;
- background-color: #238dfa !important;
- margin-top: 0 !important;
-}
-
-.page-sidebar-closed .header.navbar .navbar-brand {
- width: 35px !important;
-}
-
-.header.navbar .navbar-brand img {
- margin-left: 10px !important;
- width: 80%;
- margin-top: 7px;
-}
-
-.page-sidebar-closed .header.navbar .navbar-brand img {
- display: none !important;
-}
-
-.page-sidebar{
- float:left;
- width: 135px ;
- background-color: #4d5b69;
-}
-
-.page-sidebar-closed .page-sidebar{
-
- width: 35px !important;
-
-}
-
-.page-container {
- margin: 0px;
- padding: 0px;
- position: relative;
-}
-
-.sideBar {
- width: 132px;
- background-color: #4D5B69;
-}
-
-.page-sidebar-closed .sideBar{
-width: 35px !important;
-background-color: #4d5b69!important;
-
-}
-
-.sideBar .menu {
- width: 100%;
- height: 128px;
- color: #aaa;
- font-size: 16px;
- text-align: center;
- /* border-bottom: 2px solid #536372; */
- border-top: 1px solid #536372;
- /* border-bottom-style: groove; */
-}
-.page-sidebar-closed .sideBar .menu {
-height: 35px !important;
-border-bottom:0px;
-}
-
-.sideBar .menu i.icon.fa{
- font-size: 32px;
- margin-bottom: 7px
-}
-
-
-
-.page-sidebar-closed .sideBar .menu i.icon.fa{
- font-size: 18px;
-
-}
-
-
-
-
-
-.sideBar .menu i.icon {
- width: 36px;
- height: 36px;
-}
-
-.page-sidebar-closed .sideBar .menu i.icon {
- width: 18px;
- height: 18px;
-}
-.sideBar .menu i {
- margin-top: 25%;
-}
-
-.sideBar a.router-link-active .menu {
- color: #fff;
- background-color: #424e57;
- width: 132px;
-}
-
-.page-sidebar-closed .sideBar a.router-link-active .menu{
-width: 35px !important;
-height: 35px;
-}
-
-.page-sidebar-closed .sideBar a label{
- display:none
-
-}
-
-.sideBar a{
-text-decoration: none;
-cursor:pointer ;
-}
-
-.sideBar a:hover .menu {
- color: #fff;
- background-color: #424e57;
- width: 132px;
-
-}
-
-.page-sidebar-closed .sideBar a:hover .menu{
-width: 35px !important;
-}
-
-.sideBar a.router-link-active .menu .menu-left {
- width: 2px;
- height: 126px;
- float: left;
- background-color: #238ff9;
-}
-
-.page-sidebar-closed .sideBar a.router-link-active .menu .menu-left {
-
- height: 33px;
-
-}
-
-
-.sidebar-toggler {
- background-image: url(../img/sidebar-toggler-grey.jpg);
- background-color: #0f5179;
- margin-top: 15px;
- margin-left: 95px;
- margin-bottom: 5px;
- cursor: pointer;
- opacity: 0.5;
- filter: alpha(opacity=50);
- width: 29px;
- height: 29px;
- background-repeat: no-repeat;
-}
-
-.page-sidebar-closed .sidebar-toggler{
- margin-left: 3px;
-}
-
-.sideBar a .selected{
-display:none;
- }
-
-.sideBar a.router-link-active .selected{
- display: block;
- float: right;
- margin-top: -25px;
- background: none;
- width: 0;
- height: 0;
- border-style: solid;
- border-top: 12px double transparent;
- border-bottom: 12px double transparent;
- border-left: 0;
- border-right: 8px solid #F1F3FA;
-
-}
-
-.chineseTitle{
- margin: 0;
- float: left;
- margin-left: 20px;
- font-weight: bold;
- padding-top: 8px;
- letter-spacing: 2px;
- font-size: 20px;
- font-family: 'Microsoft Yahei', sans-serif;
- /* text-shadow: -1px 1px rgba(221, 221, 221, 1); */
-}
-
-.englishTitle{
- margin: 0;
- float: left;
- margin-left: 10px;
- font-family: Arial;
- font-size: 14px;
- padding-top: 15px;
-}
-
-.page-content {
- margin-top: 0px;
- padding: 0px;
- background-color: #9C5A5A !important;
- margin-left: 135px;
-}
-
-.page-sidebar-closed .page-content{
-
- margin-left: 35px;
-}
-
-.page-content-body {
- padding-left: 10px;
- padding-right: 10px;
- padding-top: 8px;
- float:left;
- width: 100%;
- background-color: #f1f3fa;
-}
-
-.page-sidebar-closed .page-content-body {
- padding-left: 0px;
- padding-right: 5px;
- padding-top: 5px;
-
-}
-
-label {
-
- font-weight: normal;
-}
+/*
+ * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+ *
+ * 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.
+ */
+body {
+ background-color: #4d5b69!important;
+ font-family: "microsoft yahei";
+}
+
+.header.navbar {
+ width: 100%;
+ padding: 0 20px 0 20px;
+ margin: 0;
+ border: 0px;
+ padding: 0px;
+ box-shadow: none;
+ height: 42px;
+ min-height: 42px;
+}
+
+.header {
+ filter: none !important;
+ background-image: none !important;
+ background-color: #fff !important;
+}
+
+.header.navbar .navbar-brand {
+ display: inline-block;
+ margin-right: 0;
+ padding: 0;
+ width: 135px !important;
+ height: 42px !important;
+ background-color: #238dfa !important;
+ margin-top: 0 !important;
+}
+
+.page-sidebar-closed .header.navbar .navbar-brand {
+ width: 35px !important;
+}
+
+.header.navbar .navbar-brand img {
+ margin-left: 10px !important;
+ width: 80%;
+ margin-top: 7px;
+}
+
+.page-sidebar-closed .header.navbar .navbar-brand img {
+ display: none !important;
+}
+
+.page-sidebar{
+ float:left;
+ width: 135px ;
+ background-color: #4d5b69;
+}
+
+.page-sidebar-closed .page-sidebar{
+
+ width: 35px !important;
+
+}
+
+.page-container {
+ margin: 0px;
+ padding: 0px;
+ position: relative;
+}
+
+.sideBar {
+ width: 135px;
+ background-color: #4D5B69;
+}
+
+.page-sidebar-closed .sideBar{
+width: 35px !important;
+background-color: #4d5b69!important;
+
+}
+
+.sideBar .menu {
+ width: 100%;
+ height: 128px;
+ color: #aaa;
+ font-size: 16px;
+ text-align: center;
+ /* border-bottom: 2px solid #536372; */
+ border-top: 1px solid #536372;
+ /* border-bottom-style: groove; */
+}
+.page-sidebar-closed .sideBar .menu {
+height: 35px !important;
+border-bottom:0px;
+}
+
+.sideBar .menu i.icon.fa{
+ font-size: 32px;
+ margin-bottom: 7px
+}
+
+
+
+.page-sidebar-closed .sideBar .menu i.icon.fa{
+ font-size: 18px;
+
+}
+
+
+
+
+
+.sideBar .menu i.icon {
+ width: 36px;
+ height: 36px;
+}
+
+.page-sidebar-closed .sideBar .menu i.icon {
+ width: 18px;
+ height: 18px;
+}
+.sideBar .menu i.icon {
+ margin-top: 25%;
+}
+
+.sideBar a.router-link-active .menu {
+ color: #fff;
+ background-color: #424e57;
+}
+
+.page-sidebar-closed .sideBar a.router-link-active .menu{
+width: 35px !important;
+height: 35px;
+}
+
+.page-sidebar-closed .sideBar a label{
+ display:none
+
+}
+
+.sideBar a{
+text-decoration: none;
+cursor:pointer ;
+}
+
+.sideBar a:hover .menu {
+ color: #fff;
+ background-color: #424e57;
+
+
+}
+
+.page-sidebar-closed .sideBar a:hover .menu{
+width: 35px !important;
+}
+
+.sideBar a.router-link-active .menu .menu-left {
+ width: 2px;
+ height: 126px;
+ float: left;
+ background-color: #238ff9;
+}
+
+.page-sidebar-closed .sideBar a.router-link-active .menu .menu-left {
+
+ height: 33px;
+
+}
+
+
+.sidebar-toggler {
+ background-image: url(../img/sidebar-toggler-grey.jpg);
+ background-color: #0f5179;
+ margin-top: 15px;
+ margin-left: 95px;
+ margin-bottom: 5px;
+ cursor: pointer;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ width: 29px;
+ height: 29px;
+ background-repeat: no-repeat;
+}
+
+.page-sidebar-closed .sidebar-toggler{
+ margin-left: 3px;
+}
+
+.sideBar a .selected{
+display:none;
+ }
+
+.sideBar a.router-link-active .selected{
+ display: block;
+ float: right;
+ margin-top: -25px;
+ background: none;
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-top: 12px double transparent;
+ border-bottom: 12px double transparent;
+ border-left: 0;
+ border-right: 8px solid #F1F3FA;
+
+}
+
+.chineseTitle{
+ margin: 0;
+ float: left;
+ margin-left: 20px;
+ font-weight: bold;
+ padding-top: 8px;
+ letter-spacing: 2px;
+ font-size: 20px;
+ font-family: 'Microsoft Yahei', sans-serif;
+ /* text-shadow: -1px 1px rgba(221, 221, 221, 1); */
+}
+
+.englishTitle{
+ margin: 0;
+ float: left;
+ margin-left: 10px;
+ font-family: Arial;
+ font-size: 14px;
+ padding-top: 15px;
+}
+
+.page-content {
+ margin-top: 0px;
+ padding: 0px;
+ background-color: #9C5A5A !important;
+ margin-left: 135px;
+}
+
+.page-sidebar-closed .page-content{
+
+ margin-left: 35px;
+}
+
+.page-content-body {
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-top: 8px;
+ float:left;
+ width: 100%;
+ background-color: #f1f3fa;
+}
+
+.page-sidebar-closed .page-content-body {
+ padding-left: 0px;
+ padding-right: 5px;
+ padding-top: 5px;
+
+}
+
+label {
+
+ font-weight: normal;
+}
+
+.sideBar ul{
+ list-style: none;
+ padding: 0;
+}
+
+
+
+.sub-menu {
+ list-style: none;
+ padding: 0;
+ margin: 8px 0;
+ box-shadow: 5px 5px rgba(140,178,198,.2);
+ display: none;
+}
+
+.sub-menu {
+ width: 150px;
+ position: absolute;
+ left: 135px;
+ margin-top: 0;
+ top: 5px;
+ background-color: #4d5b69;
+}
+
+.page-sidebar-closed .sub-menu {
+
+ left: 35px;
+ top: 0px;
+
+}
+
+.sideBarUl li{
+ position:relative;
+}
+.sideBarUl li:hover .sub-menu
+ {
+ display: block;
+}
+
+.sub-menu li{
+ background: 0 0;
+ margin: 0;
+ padding: 0;
+ margin-top: 1px!important;
+}
+
+
+.sub-menu li>a {
+ color: #aaa;
+ display: block;
+ margin: 0;
+ padding: 12px 14px 12px 30px;
+ text-decoration: none;
+ font-size: 14px;
+ font-weight: 400;
+ background: 0 0;
+}
+
+.sub-menu li>a:hover {
+ color: #fff;
+ background-color: #424e57;
+
+
+}
+
+.subicon.fa{
+ font-size: 18px;
+ margin-top:0px;
+
+}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/css/route.css b/apiroute/apiroute-service/src/main/resources/iui-route/css/route.css
index 9ddbaf6..e610337 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/css/route.css
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/css/route.css
@@ -1,646 +1,641 @@
-/**
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-body {
- color: #333;
- font-family: "Microsoft yahei", Verdana, Arial, Helvetica, sans-serif !important;
- padding: 0px !important;
- margin: 0px !important;
- direction: ltr;
- background-color: #ffffff !important;
-}
-
-/*.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
- cursor: auto;
-
- }*/
-.modal-footer {
- margin-top:0px;
- }
-.form-group {
- margin-bottom: 5px;
-}
-
-.modal-body {
- padding: 10px;
-}
-
-.row{
- margin-left: 0px;
- margin-right: 0px;
-}
-
-select {
- border-width: 1px;
- padding: 4px 1px;
- border-radius: 4px;
-}
-
-.navbar {
- overflow: visible;
- margin-bottom: 0px;
-
-}
-
-#top-bar, #top-bar small, #top-bar a {
- text-shadow: 0px -1px 0px #182127;
- color: #ffffff;
-}
-
-.span12{
- margin-top:5px;
-}
-
-#title {
- color: #ffffff;
- font-weight: bolder;
-}
-
-#top-bar {
- background-color: #363F45;
- background-image: -moz-linear-gradient(top, #545d63, #182127);
- background-image: -ms-linear-gradient(top, #545d63, #182127);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#545d63), to(#182127));
- background-image: -webkit-linear-gradient(top, #545d63, #182127);
- background-image: -o-linear-gradient(top, #545d63, #182127);
- background-image: linear-gradient(top, #545d63, #182127);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#545d63', endColorstr = '#182127', GradientType = 0);
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- height: 55px;
-}
-
-.navbar-inner {
- padding-left: 20px;
- padding-right: 20px;
- background-color: #2c2c2c;
- background-image: -moz-linear-gradient(top, #333333, #222222);
- background-image: -ms-linear-gradient(top, #333333, #222222);
- background-image: -o-linear-gradient(top, #333333, #222222);
- background-image: linear-gradient(top, #333333, #222222);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
-}
-
-
-
-.container-fluid {
- background-color: #fff;
-}
-
-div[data-name="route_zone"] {
- background-color: #fff;
- margin-bottom: 15px;
-}
-
-
-
-p[tooltip], div[tooltip], td[tooltip], span[tooltip]{
- overflow: hidden;
- text-overflow: ellipsis;
- white-space:nowrap;
-}
-
-.add-route-btn{
- background: #fff;
- color: #ccc;
- height: 115px;
- margin: 10px;
- padding-top: 22px;
- text-align: center;
- text-decoration: none;
- width: 130px;
- border:1px dashed #aaa;
- float:left;
-
-}
-
-.add-route-btn:hover{
- color:#3276b1;
- cursor: pointer;
-}
-
-
-.add-route-btn span {
- display: block;
- margin-left:5px;
- margin-right:5px;
- margin-top:5px;
- color: #444;
-}
-
-
-.quick-btn {
- background: #eee;
- box-shadow: 0 0 0 1px #f8f8f8 inset,0 0 0 1px #ccc;
- color: #444;
- height: 110px;
- margin: 10px;
- padding-top: 1pc;
- text-align: center;
- text-decoration: none;
- width: 120px;
- float:left;
-
-}
-div[data-name="route_zone"] .active{
- color:#fff;
- background-color:#444;
- cursor: pointer;
-}
-
-div[data-name="route_zone"] .sparkline .route-valid {
- color: #62AAF5;
- }
-
- div[data-name="route_zone"] .sparkline .route-invalid {
- color:rgba(128, 128, 128, 0.73);
- }
-
-div[data-name="route_zone"] .active .sparkline i{
- color:#C3DDF4;
- }
-
-
-
-.quick-btn:hover{
-
- box-shadow: 0 0 0 1px #f8f8f8 inset,0 0 0 1px #636363;
- cursor: pointer;
-}
-
-.quick-btn span {
- display: block;
- margin-left:5px;
- margin-right:5px;
- margin-top:10px;
-
-}
-
-.route-ip{
- font-size: 12px;
-}
-
-
-.progressList{
- margin-top: 15px;
- margin-left:15px;
- width:90%
-}
-
-.processContent{
- display: inline-block;margin-right:5px
-}
-
-.nav.nav-pills.nav-stacked > li.active > a, .nav.nav-pills.nav-stacked > li.active > a:hover,.nav.nav-pills.nav-stacked > li > a:hover {
- background-color: #f6f6f6;
- border-left-color: #3c8dbc;
- color: #444;
-}
-
-
-.nav.nav-pills.nav-stacked > li > a {
- border-top: 0;
- border-left: 3px solid transparent;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- color: #444;
- height:46px;
-}
-.nav.nav-pills > li.active > a {
- font-weight: 600;
-}
-
-.btn-xs {
- color: #333;
- font-size: 14px;
-}
-.grey {
- background-color: #e5e5e5;
- color: #333;
-}
-.btn-xs, .btn-group-xs>.btn {
- padding: 1px 5px;
- font-size: 12px;
- line-height: 1.5;
- border-radius: 3px;
-}
-
-.control-label .required {
- color: #e02222;
- font-size: 12px;
- padding-left: 2px;
-}
-
-.nav>li>a{
- /*padding:10px 5px;*/
-}
-
-.process-btn button{
- padding:3px 8px
-}
-
-pre.prettyprint {
- color:#000;
- height: 450px;
-}
-
-pre {
- font: 14px/22px 'courier new';
- word-break: break-all;
- word-wrap: break-word;
- border: 0px;
- background-color:#fff;
- padding: 5px 5px;
-}
-
-.atv {
- color: #114B7E;
-}
-
-
-
-.stats_box {
- display: inline-block;
- list-style: none outside none;
- margin-left: 0;
- margin-top: 10px;
- padding: 0;
- /*float: left;*/
-}
-
-.stats_box .routeDiv{
- background: #F1F3FA;
- /* box-shadow: 0 0 0 1px #f8f8f8 inset,0 0 0 1px #ccc; */
- display: inline-block;
- line-height: 18px;
- margin: 0 10px 10px;
- padding: 0 8px;
- float: left;
- height: 125px;
- border: 1px solid #E0E0E0;
- /* border-radius: 10px; */
-}
-
-.routeDiv:hover{
-
- border:1px solid #cfcfcf;
- cursor: pointer;
- box-shadow:-webkit-box-shadow:0 5px 20px rgba(0,0,0,0.1);
- box-shadow:0 5px 20px rgba(0,0,0,0.1);
-}
-
-
-.sparkline {
- width: 60px;
- border-right: 1px solid #dcdcdc;
- box-shadow: 1px 0 0 0 #fff;
- float: left;
- margin-right: 9pt;
- padding: 25px 10px 0 4px;
- line-height: 70px
-}
-
-.table-bordered > thead > tr > th{
- border-bottom-width: 0;
-}
-
-
-
-.stats_box .stat_text {
- float: left;
- font-size: 9pt;
- padding: 10px 0px 10px 0;
- text-align: left;
- width: 120px;
- position: relative;
-}
-
-.stats_box .stat_text .percent {
- color: #444;
- float: right;
- font-size: 20px;
- font-weight: 700;
- position: absolute;
- right: 0;
- top: 17px;
-}
-
-.stats_box .stat_text strong {
- display: block;
- font-size: 16px
-; margin-bottom: 10px;
- margin-top: 5px;
-
-}
-
-.stat_text b{
- font-weight: 100;
-}
-
-.stat_text span,.stats_box span{
- display: block;
- margin-bottom:5px;
-}
-
-
-
-.stats_box span a{
-padding: 0px 6px;
-margin-right:3px;
- }
-
-
-
- span.response_throbber {
- background-image: url('../img/throbber.gif');
- width: 128px;
- height: 16px;
- display: block;
- clear: none;
- float: left;
- margin-top: 50px;
-}
-
-div.separator div {
- text-align: center;
- line-height: 0;
-}
-
-.titlefont {
- font-size: 16px;
-}
-
-.separator-line {
- height: 1px;
- width: 100%;
- background: #ddd;
- overflow: hidden;
- margin-bottom: 15px;
- margin-top: 6px;
- opacity: 0.6;
-}
-
-
-
-.serverInput{
- display: inline;
- margin-right: 5px;
-}
-
-.apiRouteInput{
- float:left;
- margin-right: 10px
-}
-
-
-.input-group {
- position: relative;
- display: table;
- border-collapse: separate;
-}
-
- .input-group-btn-vertical {
- position: relative;
- white-space: nowrap;
- width: 10px;
- vertical-align: middle;
- display: table-cell;
-}
-
-.input-group-btn-vertical .bootstrap-touchspin-up {
- border-radius: 0;
- border-top-right-radius: 4px;
-}
-
-.input-group-btn-vertical>.btn {
- display: block;
- float: none;
- width: 100%;
- max-width: 100%;
- padding: 8px 10px;
- margin-left: -1px;
- position: relative;
-}
-
-.input-group-btn-vertical i {
- position: absolute;
- top: 3px;
- left: 5px;
- font-size: 9px;
- font-weight: 400;
-}
-
-.input-group-btn-vertical .bootstrap-touchspin-down {
- margin-top: -2px;
- border-radius: 0;
- border-bottom-right-radius: 4px;
-}
-
-
-
-.small_btn {
- padding: 0px 6px;
- margin-right: 3px;
-}
-
-.item-tip {
- position: absolute;
- color: #999999;
- top: 10px;
- left: 20px;
- transition: all linear .2s;
- background-color: #fff;
- padding: 0px 3px;
- font-size: 12px;
-}
-.item-tip-focus {top: -8px;font-size: 12px;color: #428bca;}
-
-.form-input-focus {border-color: #428bca;outline: 0;}
-
-.tip_color {
- color: #f0ad4e;
- cursor: help;
-}
-
-.item-tip-none{display: none}
-
-.tipArea{
- border-bottom: 1px solid #d4d4d4;
- width: 85%;
- text-align: center;
- margin-bottom: 20px;
- margin-left: 30px;
- font-weight: bold;
- position: relative;
-
-}
-
-.tipArea:after, .tipArea:before {
- border: 10px solid transparent;
- border-top: 10px solid #fff;
- width: 0;
- height: 0;
- right: 241px;
- top: 20px;
- content: ' ';
- position: absolute;
-}
-
-.tipArea:before {
- border-top-color: #d4d4d4;
- left: 230px;
- top: 21px;
-}
-
-
-.help-block {
- margin-top: 5px;
- margin-bottom: 5px;
- }
-
-.form-title {
- padding-left: 8px;
- padding-right: 8px;
- padding-top: 5px;
- padding-bottom: 5px;
- margin-bottom: 10px;
- margin-left:10px;
- border-left: 2px solid #5b9bd1;
- color: #1A78CA;
- font-size: 16px;
-}
-
-.form-title a{
- cursor: pointer;
-}
-
-.panel-tools {
- display: inline-block;
- float: right;
- margin-top: 0;
- padding: 0;
- position: relative;
-}
-
-.panel-tools a {
- margin-left: 5px;
- color: #9d9fa2;
- cursor: pointer;
-}
-
-.panel-tools a:hover{
- color: #34495e;
- text-decoration: none;
-}
-
-.table-responsive{
- margin-top: 15px;
-}
-
-.btn-s {
- padding: 0px 6px;
- margin-right: 3px;
-}
-
-
-table.dataTable thead .sorting,
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc,
-table.dataTable thead .sorting_asc_disabled,
-table.dataTable thead .sorting_desc_disabled {
- background: 0 0;
-}
-
-table.dataTable thead .sorting_asc:after {
- content: "\f0de";
- float: right;
- font-family: fontawesome;
- color:#357ebd;
-}
-
-table.dataTable thead .sorting_desc:after {
- content: "\f0dd";
- float: right;
- font-family: fontawesome;
- color:#357ebd;
-}
-
-table.dataTable thead .sorting:after {
- content: "\f0dc";
- float: right;
- font-family: fontawesome;
- color: rgba(50,50,50,.5);
-}
-
-
-.hostTableDiv{
- height: 100px;
- overflow: auto;
-
- }
-
-.hostTable{
- font-size: 12px;
- margin-bottom: 0px;
-}
-
-.hostTable>thead>tr>th, .hostTable>tbody>tr>th, .hostTable>tfoot>tr>th, .hostTable>thead>tr>td, .hostTable>tbody>tr>td, .hostTable>tfoot>tr>td {
- padding: 6px;
-
-}
-
-
-td.details-control {
- background: url('../img/details_open.png') no-repeat center center;
- cursor: pointer;
-}
-tr.shown td.details-control {
- background: url('../img/details_close.png') no-repeat center center;
-}
-
-
-input[type="checkbox"] {
- -webkit-appearance: none;
- background: #fff url(../img/checkbox-init.png);
- height: 18px;
- vertical-align: middle;
- width: 18px;
- margin-bottom:5px;
- margin-right:5px;
-}
-
-input[type="checkbox"]:checked {
- -webkit-appearance: none;
- background: #fff url(../img/checkbox-checked.png);
- height: 18px;
- vertical-align: middle;
- width: 18px;
-}
-
-input[type="checkbox"]:focus,
-input[type="checkbox"]:hover {
- outline: none;
+/*
+ * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+ *
+ * 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.
+ */
+body {
+ color: #333;
+ font-family: "Microsoft yahei", Verdana, Arial, Helvetica, sans-serif !important;
+ padding: 0px !important;
+ margin: 0px !important;
+ direction: ltr;
+ background-color: #ffffff !important;
+}
+
+/*.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
+ cursor: auto;
+
+ }*/
+.modal-footer {
+ margin-top:0px;
+ }
+.form-group {
+ margin-bottom: 5px;
+}
+
+.modal-body {
+ padding: 10px;
+}
+
+.row{
+ margin-left: 0px;
+ margin-right: 0px;
+}
+
+select {
+ border-width: 1px;
+ padding: 4px 1px;
+ border-radius: 4px;
+}
+
+.navbar {
+ overflow: visible;
+ margin-bottom: 0px;
+
+}
+
+
+
+.span12{
+ margin-top:5px;
+}
+
+#title {
+ color: #ffffff;
+ font-weight: bolder;
+}
+
+
+
+
+
+
+div[data-name="route_zone"] {
+ background-color: #fff;
+ margin-bottom: 15px;
+}
+
+
+
+p[tooltip], div[tooltip], td[tooltip], span[tooltip]{
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space:nowrap;
+}
+
+.add-route-btn{
+ background: #fff;
+ color: #ccc;
+ height: 115px;
+ margin: 10px;
+ padding-top: 22px;
+ text-align: center;
+ text-decoration: none;
+ width: 130px;
+ border:1px dashed #aaa;
+ float:left;
+
+}
+
+.add-route-btn:hover{
+ color:#3276b1;
+ cursor: pointer;
+}
+
+
+.add-route-btn span {
+ display: block;
+ margin-left:5px;
+ margin-right:5px;
+ margin-top:5px;
+ color: #444;
+}
+
+
+.quick-btn {
+ background: #eee;
+ box-shadow: 0 0 0 1px #f8f8f8 inset,0 0 0 1px #ccc;
+ color: #444;
+ height: 110px;
+ margin: 10px;
+ padding-top: 1pc;
+ text-align: center;
+ text-decoration: none;
+ width: 120px;
+ float:left;
+
+}
+div[data-name="route_zone"] .active{
+ color:#fff;
+ background-color:#444;
+ cursor: pointer;
+}
+
+div[data-name="route_zone"] .sparkline .route-valid {
+ color: #62AAF5;
+ }
+
+ div[data-name="route_zone"] .sparkline .route-invalid {
+ color:rgba(128, 128, 128, 0.73);
+ }
+
+div[data-name="route_zone"] .active .sparkline i{
+ color:#C3DDF4;
+ }
+
+
+
+.quick-btn:hover{
+
+ box-shadow: 0 0 0 1px #f8f8f8 inset,0 0 0 1px #636363;
+ cursor: pointer;
+}
+
+.quick-btn span {
+ display: block;
+ margin-left:5px;
+ margin-right:5px;
+ margin-top:10px;
+
+}
+
+.route-ip{
+ font-size: 12px;
+}
+
+
+.progressList{
+ margin-top: 15px;
+ margin-left:15px;
+ width:90%
+}
+
+.processContent{
+ display: inline-block;margin-right:5px
+}
+
+.nav.nav-pills.nav-stacked > li.active > a, .nav.nav-pills.nav-stacked > li.active > a:hover,.nav.nav-pills.nav-stacked > li > a:hover {
+ background-color: #f6f6f6;
+ border-left-color: #3c8dbc;
+ color: #444;
+}
+
+
+.nav.nav-pills.nav-stacked > li > a {
+ border-top: 0;
+ border-left: 3px solid transparent;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+ color: #444;
+ height:46px;
+}
+.nav.nav-pills > li.active > a {
+ font-weight: 600;
+}
+
+.btn-xs {
+ color: #333;
+ font-size: 14px;
+}
+.grey {
+ background-color: #e5e5e5;
+ color: #333;
+}
+.btn-xs, .btn-group-xs>.btn {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.control-label .required {
+ color: #e02222;
+ font-size: 12px;
+ padding-left: 2px;
+}
+
+.nav>li>a{
+ /*padding:10px 5px;*/
+}
+
+.process-btn button{
+ padding:3px 8px
+}
+
+pre.prettyprint {
+ color:#000;
+ height: 450px;
+}
+
+pre {
+ font: 14px/22px 'courier new';
+ word-break: break-all;
+ word-wrap: break-word;
+ border: 0px;
+ background-color:#fff;
+ padding: 5px 5px;
+}
+
+.atv {
+ color: #114B7E;
+}
+
+
+
+.stats_box {
+ display: inline-block;
+ list-style: none outside none;
+ margin-left: 0;
+ margin-top: 10px;
+ padding: 0;
+ /*float: left;*/
+}
+
+.stats_box .routeDiv{
+ background: #F1F3FA;
+ /* box-shadow: 0 0 0 1px #f8f8f8 inset,0 0 0 1px #ccc; */
+ display: inline-block;
+ line-height: 18px;
+ margin: 0 10px 10px;
+ padding: 0 8px;
+ float: left;
+ height: 125px;
+ border: 1px solid #E0E0E0;
+ /* border-radius: 10px; */
+}
+
+.routeDiv:hover{
+
+ border:1px solid #cfcfcf;
+ cursor: pointer;
+ box-shadow:-webkit-box-shadow:0 5px 20px rgba(0,0,0,0.1);
+ box-shadow:0 5px 20px rgba(0,0,0,0.1);
+}
+
+
+.sparkline {
+ width: 60px;
+ border-right: 1px solid #dcdcdc;
+ box-shadow: 1px 0 0 0 #fff;
+ float: left;
+ margin-right: 9pt;
+ padding: 20px 10px 0 4px;
+ line-height: 70px
+}
+
+.table-bordered > thead > tr > th{
+ border-bottom-width: 0;
+}
+
+
+
+.stats_box .stat_text {
+ float: left;
+ font-size: 9pt;
+ padding: 10px 0px 10px 0;
+ text-align: left;
+ width: 120px;
+ position: relative;
+}
+
+.stats_box .stat_text .percent {
+ color: #444;
+ float: right;
+ font-size: 20px;
+ font-weight: 700;
+ position: absolute;
+ right: 0;
+ top: 17px;
+}
+
+.stats_box .stat_text strong {
+ display: block;
+ font-size: 16px
+; margin-bottom: 10px;
+ margin-top: 5px;
+
+}
+
+.stat_text b{
+ font-weight: 100;
+}
+
+.stat_text span,.stats_box span{
+ display: block;
+}
+
+
+
+.stats_box span a{
+padding: 0px 6px;
+margin-right:3px;
+ }
+
+
+
+ span.response_throbber {
+ background-image: url('../img/throbber.gif');
+ width: 128px;
+ height: 16px;
+ display: block;
+ clear: none;
+ float: left;
+ margin-top: 50px;
+}
+
+div.separator div {
+ text-align: center;
+ line-height: 0;
+}
+
+.titlefont {
+ font-size: 16px;
+}
+
+.separator-line {
+ height: 1px;
+ width: 100%;
+ background: #ddd;
+ overflow: hidden;
+ margin-bottom: 15px;
+ margin-top: 6px;
+ opacity: 0.6;
+}
+
+
+
+.serverInput{
+ display: inline;
+ margin-right: 5px;
+}
+
+.apiRouteInput{
+ float:left;
+ margin-right: 10px
+}
+
+
+.input-group {
+ position: relative;
+ display: table;
+ border-collapse: separate;
+}
+
+ .input-group-btn-vertical {
+ position: relative;
+ white-space: nowrap;
+ width: 10px;
+ vertical-align: middle;
+ display: table-cell;
+}
+
+.input-group-btn-vertical .bootstrap-touchspin-up {
+ border-radius: 0;
+ border-top-right-radius: 4px;
+}
+
+.input-group-btn-vertical>.btn {
+ display: block;
+ float: none;
+ width: 100%;
+ max-width: 100%;
+ padding: 8px 10px;
+ margin-left: -1px;
+ position: relative;
+}
+
+.input-group-btn-vertical i {
+ position: absolute;
+ top: 3px;
+ left: 5px;
+ font-size: 9px;
+ font-weight: 400;
+}
+
+.input-group-btn-vertical .bootstrap-touchspin-down {
+ margin-top: -2px;
+ border-radius: 0;
+ border-bottom-right-radius: 4px;
+}
+
+
+
+.small_btn {
+ padding: 0px 6px;
+ margin-right: 3px;
+}
+
+.item-tip {
+ position: absolute;
+ color: #999999;
+ top: 10px;
+ left: 20px;
+ transition: all linear .2s;
+ background-color: #fff;
+ padding: 0px 3px;
+ font-size: 12px;
+}
+.item-tip-focus {top: -8px;font-size: 12px;color: #428bca;}
+
+.form-input-focus {border-color: #428bca;outline: 0;}
+
+.tip_color {
+ color: #f0ad4e;
+ cursor: help;
+}
+
+.item-tip-none{display: none}
+
+.tipArea{
+ border-bottom: 1px solid #d4d4d4;
+ width: 85%;
+ text-align: center;
+ margin-bottom: 20px;
+ margin-left: 30px;
+ font-weight: bold;
+ position: relative;
+
+}
+
+.tipArea:after, .tipArea:before {
+ border: 10px solid transparent;
+ border-top: 10px solid #fff;
+ width: 0;
+ height: 0;
+ right: 241px;
+ top: 20px;
+ content: ' ';
+ position: absolute;
+}
+
+.tipArea:before {
+ border-top-color: #d4d4d4;
+ left: 230px;
+ top: 21px;
+}
+
+
+.help-block {
+ margin-top: 5px;
+ margin-bottom: 5px;
+ }
+
+.form-title {
+ padding-left: 8px;
+ padding-right: 8px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ margin-bottom: 10px;
+ margin-left:10px;
+ border-left: 2px solid #5b9bd1;
+ color: #1A78CA;
+ font-size: 16px;
+}
+
+.form-title a{
+ cursor: pointer;
+}
+
+.panel-tools {
+ display: inline-block;
+ float: right;
+ margin-top: 0;
+ padding: 0;
+ position: relative;
+}
+
+.panel-tools a {
+ margin-left: 5px;
+ color: #9d9fa2;
+ cursor: pointer;
+}
+
+.panel-tools a:hover{
+ color: #34495e;
+ text-decoration: none;
+}
+
+.table-responsive{
+ margin-top: 15px;
+}
+
+.btn-s {
+ padding: 0px 6px;
+ margin-right: 3px;
+}
+
+
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+ background: 0 0;
+}
+
+table.dataTable thead .sorting_asc:after {
+ content: "\f0de";
+ float: right;
+ font-family: fontawesome;
+ color:#357ebd;
+}
+
+table.dataTable thead .sorting_desc:after {
+ content: "\f0dd";
+ float: right;
+ font-family: fontawesome;
+ color:#357ebd;
+}
+
+table.dataTable thead .sorting:after {
+ content: "\f0dc";
+ float: right;
+ font-family: fontawesome;
+ color: rgba(50,50,50,.5);
+}
+
+
+.hostTableDiv{
+ height: 100px;
+ overflow: auto;
+
+ }
+
+.hostTable{
+ font-size: 12px;
+ margin-bottom: 0px;
+}
+
+.hostTable>thead>tr>th, .hostTable>tbody>tr>th, .hostTable>tfoot>tr>th, .hostTable>thead>tr>td, .hostTable>tbody>tr>td, .hostTable>tfoot>tr>td {
+ padding: 6px;
+
+}
+
+
+td.details-control {
+ background: url('../img/details_open.png') no-repeat center center;
+ cursor: pointer;
+}
+tr.shown td.details-control {
+ background: url('../img/details_close.png') no-repeat center center;
+}
+
+
+input[type="checkbox"] {
+ -webkit-appearance: none;
+ background: #fff url(../img/checkbox-init.png);
+ height: 18px;
+ vertical-align: middle;
+ width: 18px;
+ margin-bottom:5px;
+ margin-right:5px;
+}
+
+input[type="checkbox"]:checked {
+ -webkit-appearance: none;
+ background: #fff url(../img/checkbox-checked.png);
+ height: 18px;
+ vertical-align: middle;
+ width: 18px;
+}
+
+input[type="checkbox"]:focus,
+input[type="checkbox"]:hover {
+ outline: none;
+}
+
+.stat_text strong{
+ word-wrap: break-word;
+ word-break: normal;
+}
+
+
+.line_break{
+ word-wrap: break-word;
+ word-break: normal;
+}
+
+.protocal{
+ background-color: #fff;
+ border-color: #b2d8b9;
+
+ border: 1px solid #ccc;
+ border-radius: 3px;
+ color: #333;
+ display: inline-block;
+ font-size: 11px;
+
+ line-height: 99%;
+ margin: 0;
+ margin-bottom: 10px;
+ padding: 2px 5px;
+ text-align: center;
+ text-decoration: none;
+ text-transform: uppercase;
+}
+
+.form-title a:hover{
+ text-decoration:none;
+
} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/default.html b/apiroute/apiroute-service/src/main/resources/iui-route/default.html
new file mode 100644
index 0000000..65726bf
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/default.html
@@ -0,0 +1,177 @@
+<!--
+
+Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+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.
+
+-->
+<!DOCTYPE html>
+<html>
+<head lang="en">
+<meta charset="UTF-8">
+<title id="org_onap_msb_route_title" name_i18n="org_onap_msb_route_ui_i18n"></title>
+<link
+ href="js/fontAwesome/css/font-awesome.min.css"
+ rel="stylesheet" />
+<link
+ href="js/bootstrap/css/bootstrap.min.css"
+ rel="stylesheet" />
+ <link href="css/newRoute.css" rel="stylesheet" type="text/css" />
+<link href="css/base.css" rel="stylesheet" type="text/css" />
+
+ <script type="text/javascript">
+
+ function setIframeUrl(type){
+
+ var url;
+
+ switch(type){
+ case 1:url="/iui/microservices/index.html";break;
+ case 2:url="/iui/msdiscover/index.html";break;
+ case 3:url="/iui/msdiscover/serviceMng.html?type=add";break;
+ }
+
+
+
+ $('#msbPage').attr("src",url);
+ }
+ </script>
+
+</head>
+<body >
+ <div id="routeHead">
+ <div class="navbar-inner container-fluid" id="top-bar">
+ <header class="row-fluid">
+ <div class="logoimg"><img class="logo" src="img/logo.png" alt="Logo"></div>
+ <div class="chineseTitle" id="org_onap_msb_route_chinese_name" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <div class="englishTitle" id="org_onap_msb_route_english_name" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ </header>
+ </div>
+</div>
+
+<div>
+ <div class="page-sidebar" >
+ <div class="sidebar-toggler hidden-xs hidden-sm" ></div>
+ <div class="sideBar">
+ <ul class="sideBarUl">
+ <li>
+ <a onclick="setIframeUrl(1)" class="router-link-active"><div class="menu"><div class="menu-left"></div><i aria-hidden="true" class="icon fa fa-link"></i><br><label id="org_onap_msb_route_sideBar_serviceroute" name_i18n="org_onap_msb_route_ui_i18n"></label>
+ </div>
+ </a>
+ </li>
+ <li>
+ <a onclick="setIframeUrl(2)" ><div class="menu"><div class="menu-left"></div><i aria-hidden="true" class="icon fa fa-cloud"></i><br><label id="org_onap_msb_route_sideBar_servicediscover" name_i18n="org_onap_msb_route_ui_i18n"></label>
+ </div>
+ </a>
+ </li>
+ <li>
+ <a onclick="setIframeUrl(3)" id="serviceregister_sideBar"><div class="menu"><div class="menu-left"></div><i aria-hidden="true" class="icon fa fa-plus-circle"></i><br><label id="org_onap_msb_route_sideBar_serviceregister" name_i18n="org_onap_msb_route_ui_i18n"></label>
+ </div>
+ </a>
+ </li>
+
+
+
+ </div>
+ </div>
+<div class="page-content" >
+ <div class="page-content-body">
+
+ <div id="pdiv_page-mainIframeisWare">
+ <iframe src="/iui/microservices/index.html" width="100%" scrolling="no" marginheight="0" frameborder="0" id="msbPage" name="msbPage" class="page-mainIframeisWare" ></iframe>
+ </div>
+ </div>
+ </div>
+</div>
+<script type="text/javascript" src="js/jquery/jquery-1.10.2.min.js"></script>
+<script type="text/javascript" src="js/iframeResizer/iframeResizer.min.js"></script>
+<script type="text/javascript" src="js/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>
+<script src="i18n/loadi18nApp_iui-route_view.js"></script>
+<script type="text/javascript">
+
+
+
+$(function(){
+
+
+ var apiRootPath="api";
+
+ $.ajaxSettings.async = false;
+ $.getJSON("./ext/initUrlRootPath/initUrlRootPath.json",function(json){
+ apiRootPath=json.apiRootPath;
+ });
+
+
+ var apiBasePath="/"+apiRootPath+"/microservices/v1";
+
+$.ajax({
+ "type": 'get',
+ "url": apiBasePath+"/apiRoute/apigateway_metrics/version/v1",
+ "dataType": "json",
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ $("#chart-sub-menu").hide();
+ }
+
+ });
+
+ loadPropertiesSideMenu('', 'msb-iui-route-i18n', 'i18n/');
+
+ //Get window height
+ var winHeight=610;
+ if (window.innerHeight)
+ winHeight = window.innerHeight;
+ else if ((document.body) && (document.body.clientHeight))
+ winHeight = document.body.clientHeight;
+ //Through in-depth internal Document to test the body, for the window size
+ if (document.documentElement && document.documentElement.clientHeight ) {
+ winHeight = document.documentElement.clientHeight;
+
+ }
+ winHeight=winHeight-55;
+$('iframe').iFrameResize({minHeight:winHeight});
+
+ $(".sideBar a").on({
+ click: function(){
+ $(".sideBar a").removeClass("router-link-active");
+
+ if($(this).is(".nav-link")){
+ $(this).parent().parent().parent().children("a").addClass("router-link-active");
+ }
+ else{
+ $(this).addClass("router-link-active");
+ }
+
+
+ }
+ });
+
+$(".sidebar-toggler").click(function(){
+ $("body").toggleClass("page-sidebar-closed");
+});
+
+
+
+});
+
+ function gotoServiceRegisterPage(){
+ $(".sideBar a").removeClass("router-link-active");
+ $("#serviceregister_sideBar").addClass("router-link-active");
+ //setIframeUrl(3);
+ }
+
+
+</script>
+
+
+</body>
+</html> \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js b/apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js
index 17642ab..f1b0277 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/i18n/loadi18nApp_iui-route_view.js
@@ -1,20 +1,17 @@
/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
*
* 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
+ * 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
*/
function loadPropertiesSideMenu(lang, propertiesFileNamePrefix, propertiesFilePath){
jQuery.i18n.properties({
@@ -24,7 +21,7 @@ function loadPropertiesSideMenu(lang, propertiesFileNamePrefix, propertiesFilePa
mode:'map', // 用 Map çš„æ–¹å¼ä½¿ç”¨èµ„æºæ–‡ä»¶ä¸­çš„值
callback: function() {// 加载æˆåŠŸåŽè®¾ç½®æ˜¾ç¤ºå†…容
- var i18nItems = $('[name_i18n=org_openo_msb_route_ui_i18n]');
+ var i18nItems = $('[name_i18n=org_onap_msb_route_ui_i18n]');
for(var i=0;i<i18nItems.length;i++){
var $item = $(i18nItems.eq(i));
var itemId = $item.attr('id');
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties b/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties
new file mode 100644
index 0000000..b21d948
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties
@@ -0,0 +1,166 @@
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+org_onap_msb_route_title=MicroService Bus
+
+org_onap_msb_route_sideBar_serviceroute=Service Route
+org_onap_msb_route_sideBar_servicediscover=Service Discover
+org_onap_msb_route_sideBar_servicemng=Service Manage
+org_onap_msb_route_sideBar_serviceregister=Service Register
+org_onap_msb_route_sideBar_service_status=Service Monitor
+
+org_onap_msb_route_chinese_name=
+org_onap_msb_route_english_name=MicroService Bus
+
+org_onap_msb_route_banner_title=MicroService Bus
+org_onap_msb_route_btn_export=Service Export
+org_onap_msb_route_tab_api=API Service
+org_onap_msb_route_tab_iui=IUI Service
+org_onap_msb_route_tab_custom=Custom Service
+org_onap_msb_route_tab_msb=MSB Service
+org_onap_msb_route_btn_add_api=Add API Service
+org_onap_msb_route_form_sourceservice=Source Service
+org_onap_msb_route_form_address=Host
+org_onap_msb_route_form_host_tip=Add Host(format--IP:Port)
+org_onap_msb_route_form_node_no=No
+org_onap_msb_route_form_node_control=operate
+org_onap_msb_route_form_url=URL
+org_onap_msb_route_form_target_tip=Published as
+org_onap_msb_route_form_target_service=Published URL
+org_onap_msb_route_form_servicename=Name
+org_onap_msb_route_form_version=Version
+org_onap_msb_route_form_version_tip=format:v(lowercase) + digital
+org_onap_msb_route_form_swagger=API Define
+org_onap_msb_route_form_swagger_address=API Address
+org_onap_msb_route_form_target_address= Target Address:
+org_onap_msb_route_form_publish_address=Published Address:
+org_onap_msb_route_form_metrics=Metrics Define
+org_onap_msb_route_form_metrics_address=Metrics Address
+org_onap_msb_route_form_btn_cancel=Cancel
+org_onap_msb_route_form_btn_save=Save
+org_onap_msb_route_form_btn_close=Close
+
+org_onap_msb_route_box_version=version:
+org_onap_msb_route_box_btn_disable=Disable
+org_onap_msb_route_box_btn_able=Enable
+org_onap_msb_route_box_btn_delete=Delete
+org_onap_msb_route_box_btn_update=Edit
+org_onap_msb_route_form_btn_addhost=Add Host
+org_onap_msb_route_form_btn_delhost=Delete Host
+org_onap_msb_route_box_btn_view=View
+
+org_onap_msb_route_btn_add_iui=Add IUI Service
+org_onap_msb_route_form_iui_tip=Target service registration at the same time corresponding Api service can be accessed through this address
+org_onap_msb_route_btn_add_custom=Add Custom Service
+org_onap_msb_route_btn_add_msb=Add MSB Service
+org_onap_msb_route_form_protocol=Protocol
+org_onap_msb_route_form_visualrange=VisualRange
+org_onap_msb_route_form_intersystem=External
+org_onap_msb_route_form_insystem=Internal
+org_onap_msb_route_form_msb_host=Host
+org_onap_msb_route_form_ttl_tip=Add TTL
+
+org_onap_msb_route_servicecontent_swagger=Rest Interface
+org_onap_msb_route_servicecontent_metrics=Metrics
+
+org_onap_msb_route_msb_info=Basic Information
+org_onap_msb_route_msb_hostlist=Host List
+
+org_onap_msb_route_content_title=Service Detail
+org_onap_msb_route_swagger_type_predefined=predeFined
+org_onap_msb_route_swagger_type_custominput=customInput
+
+
+//table
+org_onap_msb_route-table-sLengthMenu=View _MENU_ records
+org_onap_msb_route-table-sZeroRecords=No matching records found
+org_onap_msb_route-table-sInfo=Found total _TOTAL_ records
+org_onap_msb_route-table-sInfoEmpty=No records found to show
+org_onap_msb_route-table-sGroupActions=_TOTAL_ records selected:
+org_onap_msb_route-table-sAjaxRequestGeneralError=Could not complete request. Please check your internet connection.
+org_onap_msb_route-table-sEmptyTable=No data available in table
+org_onap_msb_route-table-sPrevious=Prev
+org_onap_msb_route-table-sNext=Next
+org_onap_msb_route-table-sPage=Page
+org_onap_msb_route-table-sPageOf=of
+org_onap_msb_route-table-search=Search:
+org_onap_msb_route-table-infofilter=(Filter from _MAX_ Records)
+
+org_onap_msb_route_err_host_empty=The new Host cannot be empty
+org_onap_msb_route_err_ttl_empty=The new TTL cannot be empty
+org_onap_msb_route_err_host_format=Wrong Host format (format IP: port)
+org_onap_msb_route_err_ttl_format=TTL can only for Numbers
+org_onap_msb_route_err_host_repeat=The services (Host: {0}) has been in existence
+org_onap_msb_route_err_host_del=Are you sure to delete [Host: {0}:{1}]?
+
+org_onap_msb_route_title_add_msb=Add MSB Service
+org_onap_msb_route_title_edit_msb=Edit MSB Service
+org_onap_msb_route_title_view_msb=View MSB Service
+org_onap_msb_route_title_add_iui=Add IUI Service
+org_onap_msb_route_title_edit_iui=Edit IUI Service
+org_onap_msb_route_title_view_iui=View IUI Service
+org_onap_msb_route_title_add_api=Add API Service
+org_onap_msb_route_title_edit_api=Edit API Service
+org_onap_msb_route_title_view_api=View API Service
+org_onap_msb_route_title_add_custom=Add Custom Service
+org_onap_msb_route_title_edit_custom=Edit Custom Service
+org_onap_msb_route_title_view_custom=View Custom Service
+org_onap_msb_route_err_service_repeat=Service(Name:{0}) has been published
+org_onap_msb_route_err_api_repeat=Service(Name:{0}-Version:{1}) has been published
+org_onap_msb_route_err_service_del_ask=Sure to delete[Name:{0} - Version:{1}]Service?
+org_onap_msb_route_err_service2_del_ask=Sure to delete[Name:{0}]Service?
+org_onap_msb_route_err_service_save=Service save failed:
+org_onap_msb_route_service_save= - Save success
+org_onap_msb_route_service_update= - Edit success
+org_onap_msb_route_err_host_leastone=Please enter at least one HOST address
+org_onap_msb_route_err_visualrange_empty= Please select the service visibleRange
+org_onap_msb_route_status_enable=Enable service success
+org_onap_msb_route_status_disable=Disable service success
+org_onap_msb_route_err_status=Service status update failed:
+
+org_onap_msb_route_service_del_success= - Delete success
+org_onap_msb_route_service_del_fail=Service delete failed:
+
+org_onap_msb_route_metric_content_title=Metrics Detail
+org_onap_msb_route_iui_content_title=IUI Service Detail
+
+//Input efficacy suggested
+org_onap_msb_route_validator_ip_format=Please fill in the correct IP
+org_onap_msb_route_validator_url_head_format=url address Begin with /, cannot end with /
+org_onap_msb_route_validator_url_head_only_format=url address Begin with/
+org_onap_msb_route_validator_url_format=The service URL format:ip:port/url
+org_onap_msb_route_validator_url_line_format=Name cannot contain /
+org_onap_msb_route_validator_content_format=Special symbols and Chinese name can not be filled in
+org_onap_msb_route_validator_name_empty=Please enter the service name
+org_onap_msb_route_validator_url_empty=Please enter the URL address
+org_onap_msb_route_validator_server_empty=Please enter the Host address
+org_onap_msb_route_validator_protocol_empty=Please select a service protocol
+org_onap_msb_route_validator_type_empty=Please select a service type
+org_onap_msb_route_validator_digits=Please enter an integer
+org_onap_msb_route_validator_min=Not a negative
+
+
+org_onap_msb_route_property_ttl=Tip:
+org_onap_msb_route_property_root=Root Service
+org_onap_msb_route_property_other_group=other
+org_onap_msb_route_property_normal=normal
+org_onap_msb_route_property_disable=disable
+org_onap_msb_route_property_unknown=unknown
+
+
+
+
+
+
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties b/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties
new file mode 100644
index 0000000..192613c
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties
@@ -0,0 +1,160 @@
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+org_onap_msb_route_title=ZTE å¾®æœåŠ¡
+
+org_onap_msb_route_sideBar_serviceroute=æœåŠ¡è·¯ç”±
+org_onap_msb_route_sideBar_servicediscover=æœåŠ¡å‘现
+org_onap_msb_route_sideBar_servicemng=æœåŠ¡ç®¡ç†
+org_onap_msb_route_sideBar_serviceregister=æœåŠ¡æ³¨å†Œ
+org_onap_msb_route_sideBar_service_status=æœåŠ¡ç›‘控
+
+org_onap_msb_route_chinese_name=å¾®æœåŠ¡
+org_onap_msb_route_english_name=MicroService Bus
+
+org_onap_msb_route_banner_title= —— å¾®æœåŠ¡
+org_onap_msb_route_btn_export=æœåŠ¡å¯¼å‡º
+org_onap_msb_route_tab_api=APIæœåŠ¡
+org_onap_msb_route_tab_iui=IUIæœåŠ¡
+org_onap_msb_route_tab_custom=自定义æœåŠ¡
+org_onap_msb_route_tab_msb=MSBæœåŠ¡
+org_onap_msb_route_btn_add_api=添加APIæœåŠ¡
+org_onap_msb_route_form_sourceservice=æºæœåŠ¡
+org_onap_msb_route_form_address=æœåŠ¡å™¨åœ°å€
+org_onap_msb_route_form_host_tip=添加host地å€(æ ¼å¼ IP:Port)
+org_onap_msb_route_form_node_no=åºå·
+org_onap_msb_route_form_node_control=æ“作
+org_onap_msb_route_form_url=URL地å€
+org_onap_msb_route_form_target_tip=å‘布为
+org_onap_msb_route_form_target_service=å‘布æœåŠ¡
+org_onap_msb_route_form_servicename=æœåŠ¡å
+org_onap_msb_route_form_version=版本å·
+org_onap_msb_route_form_version_tip=æ ¼å¼ï¼šv(å°å†™)+æ•°å­—
+org_onap_msb_route_form_swagger=API定义
+org_onap_msb_route_form_swagger_address=API地å€
+org_onap_msb_route_form_target_address=目标地å€ï¼š
+org_onap_msb_route_form_publish_address=å‘布地å€ï¼š
+org_onap_msb_route_form_metrics=性能指标定义
+org_onap_msb_route_form_metrics_address=性能指标地å€
+org_onap_msb_route_form_btn_cancel=å–消
+org_onap_msb_route_form_btn_save=ä¿å­˜
+org_onap_msb_route_form_btn_close=关闭
+
+org_onap_msb_route_box_version=版本:
+org_onap_msb_route_box_btn_disable=ç¦ç”¨
+org_onap_msb_route_box_btn_able=å¯ç”¨
+org_onap_msb_route_box_btn_delete=删除
+org_onap_msb_route_box_btn_update=修改
+org_onap_msb_route_form_btn_addhost=添加Host
+org_onap_msb_route_form_btn_delhost=删除Host
+org_onap_msb_route_box_btn_view=查看
+
+org_onap_msb_route_btn_add_iui=添加IUIæœåŠ¡
+org_onap_msb_route_form_iui_tip=目标æœåŠ¡åŒæ—¶æ³¨å†Œå¯¹åº”ApiæœåŠ¡æ‰èƒ½é€šè¿‡æ­¤åœ°å€è®¿é—®
+org_onap_msb_route_btn_add_custom=添加自定义æœåŠ¡
+org_onap_msb_route_btn_add_msb=添加MSBæœåŠ¡
+org_onap_msb_route_form_protocol=æœåŠ¡åè®®
+org_onap_msb_route_form_visualrange=æœåŠ¡å¯è§èŒƒå›´
+org_onap_msb_route_form_intersystem=系统间
+org_onap_msb_route_form_insystem=系统内
+org_onap_msb_route_form_msb_host=æœåŠ¡HOST
+org_onap_msb_route_form_ttl_tip=添加TTL数字
+
+org_onap_msb_route_servicecontent_swagger=接å£
+org_onap_msb_route_servicecontent_metrics=性能
+
+org_onap_msb_route_msb_info=基本信æ¯
+org_onap_msb_route_msb_hostlist=æœåŠ¡å®žä¾‹åˆ—表
+
+org_onap_msb_route_content_title=å¾®æœåŠ¡è¯¦æƒ…
+org_onap_msb_route_swagger_type_predefined=预定义选择
+org_onap_msb_route_swagger_type_custominput=自定义输入
+
+
+//表格相关
+org_onap_msb_route-table-sLengthMenu=æ¯é¡µ _MENU_ æ¡ç»“æžœ
+org_onap_msb_route-table-sZeroRecords=没有匹é…结果
+org_onap_msb_route-table-sInfo=总共找到 _TOTAL_ æ¡ç»“æžœ
+org_onap_msb_route-table-sInfoEmpty=共 0 项
+org_onap_msb_route-table-sGroupActions=_TOTAL_ æ¡ç»“果被选择:
+org_onap_msb_route-table-sAjaxRequestGeneralError=ä¸èƒ½å®Œæˆè¯·æ±‚,请检查您的网络连接情况。
+org_onap_msb_route-table-sEmptyTable=表中数æ®ä¸ºç©º
+org_onap_msb_route-table-sPrevious=å‰é¡µ
+org_onap_msb_route-table-sNext=下页
+org_onap_msb_route-table-sPage=第
+org_onap_msb_route-table-sPageOf=页,总页数:
+org_onap_msb_route-table-search=æœç´¢ï¼š
+org_onap_msb_route-table-infofilter=(从 _MAX_ æ¡è®°å½•è¿‡æ»¤)
+
+org_onap_msb_route_err_host_empty=新增HOSTä¸èƒ½ä¸ºç©º
+org_onap_msb_route_err_ttl_empty=新增HOSTçš„TTLä¸èƒ½ä¸ºç©º
+org_onap_msb_route_err_host_format=HOSTæ ¼å¼æœ‰è¯¯(æ ¼å¼ ip:port)
+org_onap_msb_route_err_ttl_format=TTLåªèƒ½ä¸ºæ•°å­—
+org_onap_msb_route_err_host_repeat=æœåŠ¡(HOST:{0})已存在
+org_onap_msb_route_err_host_del=确定删除[HOST:{0}:{1}]?
+
+org_onap_msb_route_title_add_msb=添加MSBæœåŠ¡å®žä¾‹
+org_onap_msb_route_title_edit_msb=修改MSBæœåŠ¡å®žä¾‹
+org_onap_msb_route_title_view_msb=查看MSBæœåŠ¡å®žä¾‹
+org_onap_msb_route_title_add_iui=添加IUIæœåŠ¡å®žä¾‹
+org_onap_msb_route_title_edit_iui=修改IUIæœåŠ¡å®žä¾‹
+org_onap_msb_route_title_view_iui=查看IUIæœåŠ¡å®žä¾‹
+org_onap_msb_route_title_add_api=添加APIæœåŠ¡å®žä¾‹
+org_onap_msb_route_title_edit_api=修改APIæœåŠ¡å®žä¾‹
+org_onap_msb_route_title_view_api=查看APIæœåŠ¡å®žä¾‹
+org_onap_msb_route_title_add_custom=添加自定义æœåŠ¡å®žä¾‹
+org_onap_msb_route_title_edit_custom=修改自定义æœåŠ¡å®žä¾‹
+org_onap_msb_route_title_view_custom=查看自定义æœåŠ¡å®žä¾‹
+org_onap_msb_route_err_service_repeat=æœåŠ¡(æœåŠ¡å:{0})å·²å‘布
+org_onap_msb_route_err_api_repeat=æœåŠ¡(æœåŠ¡å:{0}-版本å·ï¼š{1})å·²å‘布
+org_onap_msb_route_err_service_del_ask=确定删除[æœåŠ¡å:{0} - 版本å·ï¼š{1}]æœåŠ¡?
+org_onap_msb_route_err_service2_del_ask=确定删除[æœåŠ¡å:{0}]æœåŠ¡?
+org_onap_msb_route_err_service_save=æœåŠ¡ä¿å­˜å¤±è´¥ï¼š
+org_onap_msb_route_service_save=ä¿å­˜æˆåŠŸ
+org_onap_msb_route_service_update=修改æˆåŠŸ
+org_onap_msb_route_err_host_leastone=请至少输入一个HOST地å€
+org_onap_msb_route_err_visualrange_empty=请选择æœåŠ¡å¯è§èŒƒå›´
+org_onap_msb_route_status_enable=激活æˆåŠŸ
+org_onap_msb_route_status_disable=ç¦ç”¨æˆåŠŸ
+org_onap_msb_route_err_status=æœåŠ¡çŠ¶æ€æ“作失败:
+
+org_onap_msb_route_service_del_success=删除æˆåŠŸ
+org_onap_msb_route_service_del_fail=æœåŠ¡åˆ é™¤å¤±è´¥:
+
+org_onap_msb_route_metric_content_title=性能详情
+org_onap_msb_route_iui_content_title=IUIæœåŠ¡è¯¦æƒ…
+
+//输入效验æ示
+org_onap_msb_route_validator_ip_format=请填写正确的IP地å€
+org_onap_msb_route_validator_url_head_format=url地å€ä»¥/开头,ä¸èƒ½ä»¥/结尾
+org_onap_msb_route_validator_url_head_only_format=url地å€ä»¥/开头
+org_onap_msb_route_validator_url_format=æœåŠ¡åœ°å€æ ¼å¼ï¼šip:port/url
+org_onap_msb_route_validator_url_line_format=å称ä¸èƒ½åŒ…å«/
+org_onap_msb_route_validator_content_format=å称ä¸èƒ½è¾“入特殊符å·å’Œä¸­æ–‡
+org_onap_msb_route_validator_name_empty=请输入æœåŠ¡å
+org_onap_msb_route_validator_url_empty=请输入URL地å€
+org_onap_msb_route_validator_server_empty=请输入æœåŠ¡å™¨åœ°å€
+org_onap_msb_route_validator_protocol_empty=请选择æœåŠ¡åè®®
+org_onap_msb_route_validator_type_empty=请选择æœåŠ¡ç±»åž‹
+org_onap_msb_route_validator_digits=请输入整数
+org_onap_msb_route_validator_min=ä¸èƒ½ä¸ºè´Ÿæ•°
+
+
+org_onap_msb_route_property_ttl=æ示:
+org_onap_msb_route_property_root=æ ¹æœåŠ¡
+org_onap_msb_route_property_other_group=其他
+org_onap_msb_route_property_normal=正常
+org_onap_msb_route_property_disable=åœç”¨
+org_onap_msb_route_property_unknown=未知 \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-checked.png b/apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-checked.png
index 2ddfb0a..2ddfb0a 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-checked.png
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-checked.png
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-init.png b/apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-init.png
index e352cc5..e352cc5 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-init.png
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/img/checkbox-init.png
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/details_close.png b/apiroute/apiroute-service/src/main/resources/iui-route/img/details_close.png
index e6281ba..e6281ba 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/details_close.png
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/img/details_close.png
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/details_open.png b/apiroute/apiroute-service/src/main/resources/iui-route/img/details_open.png
index 5bf4389..5bf4389 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/details_open.png
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/img/details_open.png
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/down.png b/apiroute/apiroute-service/src/main/resources/iui-route/img/down.png
index f7732ba..f7732ba 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/down.png
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/img/down.png
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/img/loading-spinner-grey.gif b/apiroute/apiroute-service/src/main/resources/iui-route/img/loading-spinner-grey.gif
index 6d614d3..6d614d3 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/img/loading-spinner-grey.gif
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/img/loading-spinner-grey.gif
Binary files differ
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/img/logo.png b/apiroute/apiroute-service/src/main/resources/iui-route/img/logo.png
new file mode 100644
index 0000000..1f47ed0
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/img/logo.png
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/sidebar-toggler-grey.jpg b/apiroute/apiroute-service/src/main/resources/iui-route/img/sidebar-toggler-grey.jpg
index 83855dd..83855dd 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/sidebar-toggler-grey.jpg
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/img/sidebar-toggler-grey.jpg
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/img/throbber.gif b/apiroute/apiroute-service/src/main/resources/iui-route/img/throbber.gif
index 0639388..0639388 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/img/throbber.gif
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/img/throbber.gif
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/up.png b/apiroute/apiroute-service/src/main/resources/iui-route/img/up.png
index 8bd5374..8bd5374 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/up.png
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/img/up.png
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/zte_logo_16.gif b/apiroute/apiroute-service/src/main/resources/iui-route/img/zte_logo_16.gif
index 362b825..362b825 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/zte_logo_16.gif
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/img/zte_logo_16.gif
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/index.html b/apiroute/apiroute-service/src/main/resources/iui-route/index.html
index 6b024af..1ee0d07 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/index.html
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/index.html
@@ -1,1040 +1,1028 @@
-<!--
-
- Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<!DOCTYPE html>
-<html>
-<head lang="en">
-<meta charset="UTF-8">
-<title id="org_openo_msb_route_title" name_i18n="org_openo_msb_route_ui_i18n"></title>
-<link rel="shortcut icon" href="img/openo_logo_16.png" />
-<link
- href="js/fontAwesome/css/font-awesome.min.css"
- rel="stylesheet" />
-<link
- href="js/bootstrap/css/bootstrap.min.css"
- rel="stylesheet" />
-
-
-
-<link href="css/route.css" rel="stylesheet" type="text/css" />
-<link href="css/animate.min.css" rel="stylesheet" type="text/css" />
-<link href="js/dataTables/dataTables.bootstrap.css" rel="stylesheet" type="text/css" />
-
-<style>
-.ms-controller {
- visibility: hidden
-}
-</style>
-
- <script type="text/javascript" src="js/jquery/jquery-1.10.2.min.js"></script>
- <script type="text/javascript">
- var iuiRootPath="iui";
- var apiRootPath="api";
-
- $.ajaxSettings.async = false;
- $.getJSON("./ext/initUrlRootPath/initUrlRootPath.json",function(json){
- iuiRootPath=json.iuiRootPath;
- apiRootPath=json.apiRootPath;
- });
-
-
- var apiBasePath="/"+apiRootPath+"/microservices/v1";
- var iuiBasePath="/"+iuiRootPath+"/microservices";
-
-</script>
-
-
-
-
-</head>
-<body class="ms-controller" ms-controller="routeController">
-
-<div class="navbar" id="routeHead">
- <div class="navbar-inner container-fluid" id="top-bar">
- <header class="row-fluid">
- <h3 class="span12" id="title">
- <img class="logo" src="img/conductor-logo.png" alt="Logo" id="logo">
- <small id="org_openo_msb_route_banner_title" name_i18n="org_openo_msb_route_ui_i18n"></small>
- <button type="button" class="btn btn-default" ms-click="exportServices()" style="float:right;margin-left: 10px; margin-top: 5px;"><i class=" fa fa-external-link"></i> <span id="org_openo_msb_route_btn_export" name_i18n="org_openo_msb_route_ui_i18n"></span></button>
-
- </h3>
- </header>
- </div>
- </div>
- <script type="text/javascript">
- if (self != top) {document.getElementById("routeHead").style.display="none";}
-
- var currentLang = navigator.language;
-if(!currentLang) {currentLang = navigator.browserLanguage; }
-if(currentLang.toLowerCase() != "zh-cn") {$("#logo").hide(); }
- </script>
-
-<div style=" background-color: #f1f3fa !important; ">
-
-
- <div class="row row1 container-fluid" ms-visible="boxVisible">
-
- <ul class="nav nav-tabs" id="panelTab" style="margin-top: 10px;">
- <li class="active" ><a href="#apiPanel" data-toggle="tab" id="apiTab"><i class="fa fa-cloud fa-1x"></i> <span id="org_openo_msb_route_tab_api" name_i18n="org_openo_msb_route_ui_i18n"></span> </a></li>
- <li ><a href="#iuiPanel" data-toggle="tab" id="iuiTab"><i class="fa fa-tv fa-1x"></i> <span id="org_openo_msb_route_tab_iui" name_i18n="org_openo_msb_route_ui_i18n"></span></a></li>
-</ul>
-<div class="tab-content" >
- <div id="apiPanel" class="tab-pane active">
- <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">
-
- <button ms-visible="!discoverInfo.enabled" class="btn btn-primary" id="app-new-btn" ms-click="$showApiRouteDlg()" >
- <i class=" fa fa-plus-circle"></i> <span id="org_openo_msb_route_btn_add_api" name_i18n="org_openo_msb_route_ui_i18n"></span>
- </button>
-
- </div>
-
-
-<div id="routeDlg" class="modal fade" tabindex="-1" role="dialog"
- aria-labelledby="myModalLabel" aria-hidden="true" >
- <div class="modal-dialog">
- <div class="modal-content Changepasswd">
- <div class="content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal"
- aria-hidden="true">×</button>
- <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>
- </div>
- <div class="modal-body">
- <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>
- <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>
-
-
-
-
- <div id="info" class="tab-pane active">
-
- <form class="form-horizontal" id="routeForm" role="form">
-
- <div class="tipArea" id="org_openo_msb_route_form_sourceservice" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <div class="form-group" ms-visible="!discoverInfo.enabled">
-
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span class="required" aria-required="true">*</span>
- </label>
-
-
- <div class="col-sm-6" style="padding-right: 5px;">
- <div class="item-tip" id="org_openo_msb_route_form_host_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <input type="text" ms-duplex="apiRouteInfo.server" name="server" class="form-control form-tip" ms-attr-disabled="discoverInfo.enabled" style="display:inline-block;" />
- <span class="help-block"></span>
- </div>
- <div class="col-sm-1" style=" padding-left: 0px;" >
- <a href="#" ms-click="addapiHost()" class="btn btn-default " title="org_openo_msb_route_form_btn_addhost" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>
- </div>
- </div>
-
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span ms-visible="discoverInfo.enabled" id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
- </label>
- <div class="hostTableDiv col-sm-7">
- <table class="table table-striped hostTable">
- <thead>
- <tr>
- <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>
- <th>IP</th>
- <th>PORT</th>
- <th ms-visible="!discoverInfo.enabled" id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>
- </tr>
- </thead>
- <tbody ms-each-server="vm.apiRouteInfo.servers">
- <tr>
- <td>{{$index+1}}</td>
- <td ms-text="server.ip"></td>
- <td ms-text="server.port"></td>
- <td ms-visible="!discoverInfo.enabled"><a href="#" ms-click="delapiHost(server.ip,server.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>
- </tr>
-
-
- </tbody>
- </table>
- </div>
-
- </div>
-
- <div class="form-group" tyle="margin-bottom: 0;">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span class="required" aria-required="true">*</span>
- </label>
- <div class="col-sm-7">
-
- <input type="text" ms-duplex="apiRouteInfo.url" name="url" class="form-control" id="form-url" value="/" ms-attr-disabled="discoverInfo.enabled"/>
- <span class="help-block"></span>
- </div>
-
- </div>
- <div class="tipArea" id="org_openo_msb_route_form_target_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_target_service" name_i18n="org_openo_msb_route_ui_i18n"></span>
-
- </label>
- <div class="col-sm-7">
-
- {{vm.targetServiceUrl}}/{{vm.apiRootPath}}/{{vm.apiRouteInfo.serviceName}}/{{vm.apiRouteInfo.version}}
- <span class="help-block"></span>
- </div>
-
- </div>
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span class="required" aria-required="true">*</span>
- </label>
- <div class="col-sm-7">
- <input type="text" ms-duplex="apiRouteInfo.serviceName" name="serviceName" class="form-control" ms-attr-disabled="discoverInfo.enabled" />
- <span class="help-block"></span>
- </div>
-
- </div>
-
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_version" name_i18n="org_openo_msb_route_ui_i18n"></span>
-
- </label>
- <div class="col-sm-7">
- <div class="item-tip" ms-class-item-tip-none ="routeDlgInfo.saveType=='update'" id="org_openo_msb_route_form_version_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <input type="text" ms-duplex="apiRouteInfo.version" name="version" class="form-control form-tip" ms-attr-disabled="discoverInfo.enabled" />
- <span class="help-block"></span>
- </div>
-
- </div>
-
-
-
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span><a href="javascript:;" class="collapse-box" data-toggle="collapse"
- data-target="#apiJsonFullurl">
- <i class="fa fa-plus" id="apiJsonCollapse"></i> <span id="org_openo_msb_route_form_swagger" name_i18n="org_openo_msb_route_ui_i18n"></span>
- </a></span>
-
- </label>
- <div class="col-sm-7">
- <div class="input-group">
- <input type="text" class="form-control" ms-if="apiRouteInfo.apiJsonType=='1'" ms-duplex="apiJson.custom" ms-attr-disabled="routeDlgInfo.saveType=='view'"/>
- <select class="form-control m-b" ms-if="apiRouteInfo.apiJsonType=='0'" ms-each="jsonApiSelectList.selectItems" ms-duplex="apiJson.local" id="apiJsonSelect" ms-attr-disabled="routeDlgInfo.saveType=='view'">
- <option ms-attr-value='el'>{{el}}</option>
- </select>
-
- <div class="input-group-btn">
- <button class="btn btn-default dropdown-toggle" data-toggle="dropdown" type="button" aria-expanded="false" ms-attr-disabled="routeDlgInfo.saveType=='view'">{{showAPITypeName[apiRouteInfo.apiJsonType]}} <span class="caret"></span></button>
- <ul class="dropdown-menu pull-right">
- <li><a ms-click="setAPIType(0)">{{showAPITypeName[0]}}</a></li>
- <li><a ms-click="setAPIType(1)">{{showAPITypeName[1]}}</a></li>
- </ul>
- </div>
- </div>
- <span class="help-block"></span>
- </div>
-
-
-
-
- </div>
-
- <div id="apiJsonFullurl" class="form-group collapse in">
- <label class="control-label col-sm-3"><span id="org_openo_msb_route_form_swagger_address" name_i18n="org_openo_msb_route_ui_i18n"></span></label>
- <div class="col-sm-9">
- <div>
- <i class="fa fa-home fa-fw"></i> <span id="org_openo_msb_route_form_target_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span ms-if="vm.apiRouteInfo.apiJsonType==0">{{vm.targetServiceUrl}}/iui/microservices/ext/initSwaggerJson/{{vm.apiJson.local}}</span>
- <span ms-if="vm.apiRouteInfo.apiJsonType==1">{{vm.apiRouteInfo.servers[0].ip+":"+vm.apiRouteInfo.servers[0].port}}{{vm.apiJson.custom}}</span>
- </div>
- <div>
- <i class="fa fa-cloud-upload fa-fw"></i><span id="org_openo_msb_route_form_publish_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span ms-if="vm.apiRouteInfo.apiJsonType==0">{{vm.targetServiceUrl}}/iui/microservices/ext/initSwaggerJson/{{vm.apiJson.local}}</span>
- <span ms-if="vm.apiRouteInfo.apiJsonType==1">{{vm.targetServiceUrl}}/apijson/{{vm.apiRouteInfo.serviceName}}/{{vm.apiRouteInfo.version}}</span>
- </div>
-
-
- </div>
- </div>
-
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span><a href="javascript:;" class=" collapse-box" data-toggle="collapse"
- data-target="#metricsFullurl">
- <i class="fa fa-plus" id="metricsUrlCollapse"></i> <span id="org_openo_msb_route_form_metrics" name_i18n="org_openo_msb_route_ui_i18n"></span>
- </a></span>
- </label>
- <div class="col-sm-7">
-
- <input type="text" ms-duplex="apiRouteInfo.metricsUrl" name="metricsUrl" class="form-control" value="/admin/metrics" ms-attr-disabled="routeDlgInfo.saveType=='view'" />
-
-
- <span class="help-block"></span>
- </div>
-
-
-
- </div>
- <div id="metricsFullurl" class="form-group collapse in">
- <label class="control-label col-sm-3"><span id="org_openo_msb_route_form_metrics_address" name_i18n="org_openo_msb_route_ui_i18n"></span></label>
- <div class="col-sm-9">
- <div>
- <i class="fa fa-home fa-fw"></i><span id="org_openo_msb_route_form_target_address" name_i18n="org_openo_msb_route_ui_i18n"></span> {{vm.apiRouteInfo.servers[0].ip+":"+vm.apiRouteInfo.servers[0].port}}{{vm.apiRouteInfo.metricsUrl}}</span>
- </div>
- <div>
- <i class="fa fa-cloud-upload fa-fw"></i><span id="org_openo_msb_route_form_publish_address" name_i18n="org_openo_msb_route_ui_i18n"></span> {{vm.targetServiceUrl}}/admin/{{vm.apiRouteInfo.serviceName}}/{{vm.apiRouteInfo.version}}
- </div>
-
- </div>
- </div>
- </form>
- </div>
-
-
-
-
- </div>
- <div class="modal-footer"
- ms-visible="routeDlgInfo.saveType!='view'">
- <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_cancel" name_i18n="org_openo_msb_route_ui_i18n"></button>
- <button class="btn btn-primary" type="submit" ms-click="$saveApiRoute()" id="org_openo_msb_route_form_btn_save" name_i18n="org_openo_msb_route_ui_i18n"></button>
- </div>
- <div class="modal-footer"
- ms-visible="routeDlgInfo.saveType=='view'">
- <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_close" name_i18n="org_openo_msb_route_ui_i18n"></button>
-
- </div>
- </div>
-
- </div>
- </div>
- </div>
-
- <div class="row" data-name="route_zone" >
-
- <span class="response_throbber" ms-visible="vm.routeLoading"></span>
-
- <div class="stats_box" ms-each-route="apiRouteArray">
-
- <div class="routeDiv">
- <div class="sparkline" ms-click="gotoTarget(route,'api')" data-name="route_click_zone">
- <i class="fa fa-cloud fa-3x" ms-class-route-valid ="route.status === '1'" ms-class-route-invalid ="route.status === '0'"></i>
-
- </div>
- <div class="stat_text" ms-click="gotoTarget(route,'api')" data-name="route_click_zone">
- <strong ms-text="route.serviceName"></strong>
- <span><b id="org_openo_msb_route_box_version" name_i18n="org_openo_msb_route_ui_i18n"></b>{{route.version}}</span>
-
- </div>
-
- <span ms-visible="!discoverInfo.enabled">
-
- <a class="btn btn-default" ms-click="updateApiRoute(route,'update')" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-pencil-square-o" > </i></a>
- <a class="btn btn-default" ms-click="delApiRoute(route.serviceName,route.version)" ms-visible="route.control !='1'" title="org_openo_msb_route_box_btn_delete" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-trash-o" > </i></a>
- <a class="btn btn-default" ms-visible="route.status === '1' && route.control !='1'" title="org_openo_msb_route_box_btn_disable" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updateApiRouteStatus(route.serviceName,route.version,'0')"><i class="fa fa-stop" style="color:red;font-size:10px"></i></a>
- <a class="btn btn-default" ms-visible="route.status === '0' && route.control !='1'" title="org_openo_msb_route_box_btn_able" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updateApiRouteStatus(route.serviceName,route.version,'1')"><i class="fa fa-play" style="color:green;font-size:10px"></i></a>
- </span>
- <span ms-visible="discoverInfo.enabled">
- <a class="btn btn-default" ms-click="updateApiRoute(route,'update')"><i class="fa fa-pencil-square-o" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n"> </i></a>
- <a class="btn btn-default" ms-click="updateApiRoute(route,'view')"><i class="fa fa-file-text-o" title="org_openo_msb_route_box_btn_view" name_i18n="org_openo_msb_route_ui_i18n"> </i></a> </span>
-
- </div>
-
- </div>
-
- </div>
-
-
- </div>
- <div id="iuiPanel" class="tab-pane">
- <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">
- <button ms-visible="!discoverInfo.enabled" class="btn btn-primary" id="app-new-btn" ms-click="$showiuiRouteDlg()" >
- <i class=" fa fa-plus-circle"></i> <span id="org_openo_msb_route_btn_add_iui" name_i18n="org_openo_msb_route_ui_i18n">
- </button>
-
- </div>
-
- <div id="iuirouteDlg" class="modal fade" tabindex="-1" role="dialog"
- aria-labelledby="myModalLabel" aria-hidden="true" >
- <div class="modal-dialog">
- <div class="modal-content Changepasswd">
- <div class="content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal"
- aria-hidden="true">×</button>
- <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>
- </div>
- <div class="modal-body">
- <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>
- <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>
-
- <form class="form-horizontal" id="iuirouteForm" role="form">
-
- <div class="tipArea" id="org_openo_msb_route_form_sourceservice" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <div class="form-group" ms-visible="!discoverInfo.enabled">
-
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span class="required" aria-required="true">*</span>
- </label>
-
-
- <div class="col-sm-6" style="padding-right: 5px;">
- <div class="item-tip" id="org_openo_msb_route_form_host_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <input type="text" ms-duplex="iuiRouteInfo.server" name="iuiserver" class="form-control form-tip" style="display:inline-block;" ms-attr-disabled="discoverInfo.enabled" />
- <span class="help-block"></span>
- </div>
- <div class="col-sm-1" style=" padding-left: 0px;" >
- <a href="#" ms-click="addiuiHost()" class="btn btn-default " title="org_openo_msb_route_form_btn_addhost" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>
- </div>
- </div>
-
- <div class="form-group">
- <label class="control-label col-sm-3" >
-
- <span ms-visible="discoverInfo.enabled" id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
- </label>
- <div class="hostTableDiv col-sm-7">
- <table class="table table-striped hostTable">
- <thead>
- <tr>
- <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>
- <th>IP</th>
- <th>PORT</th>
- <th ms-visible="routeDlgInfo.saveType!='view'" id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>
- </tr>
- </thead>
- <tbody ms-each-server="vm.iuiRouteInfo.servers">
- <tr>
- <td>{{$index+1}}</td>
- <td ms-text="server.ip"></td>
- <td ms-text="server.port"></td>
- <td ms-visible="routeDlgInfo.saveType!='view'"><a href="#" ms-click="deliuiHost(server.ip,server.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>
- </tr>
-
-
- </tbody>
- </table>
- </div>
-
- </div>
-
-
- <div class="form-group" tyle="margin-bottom: 0;">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span class="required" aria-required="true">*</span>
- </label>
- <div class="col-sm-7">
-
- <input type="text" ms-duplex="iuiRouteInfo.url" name="iuiurl" class="form-control" value="/" ms-attr-disabled="discoverInfo.enabled" />
- <span class="help-block"></span>
- </div>
-
- </div>
- <div class="tipArea" id="org_openo_msb_route_form_target_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_target_service" name_i18n="org_openo_msb_route_ui_i18n"></span>
-
- </label>
- <div class="col-sm-7">
-
- {{vm.targetServiceUrl}}/{{vm.iuiRootPath}}/{{vm.iuiRouteInfo.serviceName}}
- <span class="help-block"></span>
- </div>
- <!--i class="fa fa-info-circle fa-lg tip_color" data-toggle="tooltip" data-placement="bottom" title="org_openo_msb_route_form_iui_tip" name_i18n="org_openo_msb_route_ui_i18n" ></i-->
-
- </div>
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span class="required" aria-required="true">*</span>
- </label>
- <div class="col-sm-7">
- <input type="text" ms-duplex="iuiRouteInfo.serviceName" name="iuiserviceName" class="form-control" ms-attr-disabled="discoverInfo.enabled" />
- <span class="help-block"></span>
- </div>
-
- </div>
-
-
-
-
-
-
- </form>
-
-
- </div>
-
-
- </div>
- <div class="modal-footer" ms-visible="routeDlgInfo.saveType!='view'">
- <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_cancel" name_i18n="org_openo_msb_route_ui_i18n"></button>
- <button class="btn btn-primary" type="submit" ms-click="$saveiuiRoute()" id="org_openo_msb_route_form_btn_save" name_i18n="org_openo_msb_route_ui_i18n"></button>
- </div>
- <div class="modal-footer"
- ms-visible="routeDlgInfo.saveType=='view'">
- <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_close" name_i18n="org_openo_msb_route_ui_i18n"></button>
-
- </div>
- </div>
-
- </div>
- </div>
-
- <div class="row" data-name="route_zone" >
-
- <span class="response_throbber" ms-visible="vm.routeLoading"></span>
-
- <div class="stats_box" ms-each-route="iuiRouteArray">
-
- <div class="routeDiv" ms-visible="route.control !='2'">
- <div class="sparkline" ms-click="gotoTarget(route,'iui')" data-name="route_click_zone">
- <i class="fa fa-tv fa-3x" ms-class-route-valid ="route.status === '1'" ms-class-route-invalid ="route.status === '0'"></i>
-
- </div>
- <div class="stat_text" ms-click="gotoTarget(route,'iui')" data-name="route_click_zone">
- <strong ms-text="route.serviceName"></strong>
- <span>{{route.servers[0].ip}}:{{route.servers[0].port}}</span>
- </div>
- <span ms-visible="!discoverInfo.enabled">
-
- <a class="btn btn-default" ms-click="updateiuiRoute(route,'update')"><i class="fa fa-pencil-square-o" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n" > </i></a>
- <a class="btn btn-default" ms-click="deliuiRoute(route.serviceName)" ms-visible="route.control !='1'"><i class="fa fa-trash-o" title="删除"> </i></a>
- <a class="btn btn-default" ms-visible="route.status === '1' && route.control !='1'" title="org_openo_msb_route_box_btn_disable" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updateiuiRouteStatus(route.serviceName,'0')"><i class="fa fa-stop" style="color:red;font-size:10px"></i></a>
- <a class="btn btn-default" ms-visible="route.status === '0' && route.control !='1'" title="org_openo_msb_route_box_btn_able" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updateiuiRouteStatus(route.serviceName,'1')"><i class="fa fa-play" style="color:green;font-size:10px"></i></a>
- </span>
- <span ms-visible="discoverInfo.enabled"><a class="btn btn-default" ms-click="updateiuiRoute(route,'view')"><i class="fa fa-file-text-o" title="org_openo_msb_route_box_btn_view" name_i18n="org_openo_msb_route_ui_i18n"> </i></a> </span>
-
- </div>
-
- </div>
-
- </div>
-
- </div>
-
- <div id="customPanel" class="tab-pane">
- <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">
- <button ms-visible="!discoverInfo.enabled" class="btn btn-primary" id="app-new-btn" ms-click="$showcustomRouteDlg()" >
- <i class=" fa fa-plus-circle"></i> <span id="org_openo_msb_route_btn_add_custom" name_i18n="org_openo_msb_route_ui_i18n"></span>
- </button>
-
- </div>
-
- <div id="customrouteDlg" class="modal fade" tabindex="-1" role="dialog"
- aria-labelledby="myModalLabel" aria-hidden="true" >
- <div class="modal-dialog">
- <div class="modal-content Changepasswd">
- <div class="content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal"
- aria-hidden="true">×</button>
- <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>
- </div>
- <div class="modal-body">
- <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>
- <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>
-
- <form class="form-horizontal" id="customrouteForm" role="form">
-
- <div class="tipArea" id="org_openo_msb_route_form_sourceservice" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <div class="form-group" ms-visible="!discoverInfo.enabled">
-
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span class="required" aria-required="true">*</span>
- </label>
-
-
- <div class="col-sm-6" style="padding-right: 5px;">
- <div class="item-tip" id="org_openo_msb_route_form_host_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <input type="text" ms-duplex="customRouteInfo.server" name="customserver" class="form-control form-tip" style="display:inline-block;" ms-attr-disabled="discoverInfo.enabled" />
- <span class="help-block"></span>
- </div>
- <div class="col-sm-1" style=" padding-left: 0px;" ms-visible="routeDlgInfo.saveType!='view'">
- <a href="#" ms-click="addcustomHost()" class="btn btn-default " title="org_openo_msb_route_form_btn_addhost" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>
- </div>
- </div>
-
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span ms-visible="discoverInfo.enabled" id="org_openo_msb_route_form_address" name_i18n="org_openo_msb_route_ui_i18n"></span>
- </label>
- <div class="hostTableDiv col-sm-7">
- <table class="table table-striped hostTable">
- <thead>
- <tr>
- <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>
- <th>IP</th>
- <th>PORT</th>
- <th ms-visible="routeDlgInfo.saveType!='view'" id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>
- </tr>
- </thead>
- <tbody ms-each-server="vm.customRouteInfo.servers">
- <tr>
- <td>{{$index+1}}</td>
- <td ms-text="server.ip"></td>
- <td ms-text="server.port"></td>
- <td ms-visible="routeDlgInfo.saveType!='view'"><a href="#" ms-click="delcustomHost(server.ip,server.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>
- </tr>
-
-
- </tbody>
- </table>
- </div>
-
- </div>
-
-
-
- <div class="form-group" tyle="margin-bottom: 0;">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span class="required" aria-required="true">*</span>
- </label>
- <div class="col-sm-7">
-
- <input type="text" ms-duplex="customRouteInfo.url" name="customurl" class="form-control" value="/" ms-attr-disabled="discoverInfo.enabled" />
- <span class="help-block"></span>
- </div>
-
- </div>
-
- <div class="tipArea" id="org_openo_msb_route_form_target_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_target_service" name_i18n="org_openo_msb_route_ui_i18n"></span>
-
- </label>
- <div class="col-sm-7">
-
- {{vm.targetServiceUrl}}{{vm.customRouteInfo.serviceName}}
- <span class="help-block"></span>
- </div>
-
-
- </div>
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></span>
-
- </label>
- <div class="col-sm-7">
- <input type="text" ms-duplex="customRouteInfo.serviceName" name="customserviceName" class="form-control" ms-attr-disabled="discoverInfo.enabled" />
- <span class="help-block"></span>
- </div>
-
- </div>
-
-
- </form>
-
-
- </div>
-
-
- </div>
- <div class="modal-footer" ms-visible="routeDlgInfo.saveType!='view'">
- <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_cancel" name_i18n="org_openo_msb_route_ui_i18n"></button>
- <button class="btn btn-primary" type="submit" ms-click="$savecustomRoute()" id="org_openo_msb_route_form_btn_save" name_i18n="org_openo_msb_route_ui_i18n"></button>
- </div>
- <div class="modal-footer"
- ms-visible="routeDlgInfo.saveType=='view'">
- <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_close" name_i18n="org_openo_msb_route_ui_i18n"></button>
-
- </div>
- </div>
-
- </div>
- </div>
-
- <div class="row" data-name="route_zone" >
-
- <span class="response_throbber" ms-visible="vm.routeLoading"></span>
-
-
- <div ms-each-el="customGroupRouteArray">
- <div class="form-title">
- <span><a data-toggle="collapse" >{{routeUtil.showGroupName($index,el)}}</a>
- <span class="label label-info" style="margin-left: 10px;">{{customGroupRouteArray[$index].length}}</span>
- </span>
- <div class="panel-tools">
- <a class="showhide" data-toggle="collapse"><i class="fa fa-chevron-up"></i></a>
- </div>
- </div>
- <div style="width: 100%;" class="collapseContent collapse in">
- <div class="stats_box" ms-each-elem="el">
- <div class="routeDiv" ms-visible="elem.control !='2'">
- <div class="sparkline" data-name="route_click_zone">
- <i class="fa fa-cogs fa-3x" ms-class-route-valid ="elem.status === '1'" ms-class-route-invalid ="elem.status === '0'"></i>
-
- </div>
- <div class="stat_text" data-name="route_click_zone" style="padding: 9px 0px 4px 0;">
- <strong ms-text="elem.serviceName==''?'/':elem.serviceName" style="height: 35px;word-wrap:break-word;word-break: normal;"></strong>
- <span>{{elem.servers[0].ip}}:{{elem.servers[0].port}}</span>
- </div>
- <span ms-visible="!discoverInfo.enabled">
-
- <a class="btn btn-default" ms-click="updatecustomRoute(elem,'update')"><i class="fa fa-pencil-square-o" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n" > </i></a>
- <a class="btn btn-default" ms-click="delcustomRoute(elem.serviceName)" ms-visible="elem.control !='1'"><i class="fa fa-trash-o" title="删除"> </i></a>
- <a class="btn btn-default" ms-visible="elem.status === '1' && elem.control !='1'" title="org_openo_msb_route_box_btn_disable" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updatecustomRouteStatus(elem.serviceName,'0')"><i class="fa fa-stop" style="color:red;font-size:10px"></i></a>
- <a class="btn btn-default" ms-visible="elem.status === '0' && elem.control !='1'" title="org_openo_msb_route_box_btn_able" name_i18n="org_openo_msb_route_ui_i18n" ms-click="updatecustomRouteStatus(elem.serviceName,'1')"><i class="fa fa-play" style="color:green;font-size:10px"></i></a>
- </span>
- <span ms-visible="discoverInfo.enabled"><a class="btn btn-default" ms-click="updatecustomRoute(elem,'view')"><i class="fa fa-file-text-o" title="org_openo_msb_route_box_btn_view" name_i18n="org_openo_msb_route_ui_i18n"> </i></a> </span>
-
- </div>
-
- </div>
- </div>
-
- </div>
-
-
-
- </div>
-
- </div>
-
-
- <div id="msbPanel" class="tab-pane">
- <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">
- <button class="btn btn-primary" id="app-new-btn" ms-click="$showmsbRouteDlg()" >
- <i class=" fa fa-plus-circle"></i> <span id="org_openo_msb_route_btn_add_msb" name_i18n="org_openo_msb_route_ui_i18n"></span>
- </button>
-
- </div>
-
- <div id="msbrouteDlg" class="modal fade" tabindex="-1" role="dialog"
- aria-labelledby="myModalLabel" aria-hidden="true" >
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal"
- aria-hidden="true">×</button>
- <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>
- </div>
- <div class="modal-body">
- <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>
- <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>
-
- <form class="form-horizontal" id="msbForm" role="form">
- <div class="tipArea" id="org_openo_msb_route_msb_info" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span class="required" aria-required="true">*</span>
- </label>
- <div class="col-sm-7">
- <input type="text" ms-duplex="msbRouteInfo.serviceName" name="serviceName" class="form-control" />
- <span class="help-block"></span>
- </div>
-
- </div>
-
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_version" name_i18n="org_openo_msb_route_ui_i18n"></span>
- </label>
- <div class="col-sm-7">
- <div class="item-tip" id="org_openo_msb_route_form_version_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <input type="text" ms-duplex="msbRouteInfo.version" name="version" class="form-control form-tip" />
- <span class="help-block"></span>
- </div>
-
- </div>
-
-
-
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></span>
- </label>
- <div class="col-sm-7">
-
- <input type="text" ms-duplex="msbRouteInfo.url" name="url" class="form-control" />
- <span class="help-block"></span>
- </div>
-
- </div>
-
-
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_protocol" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span class="required" aria-required="true">*</span>
- </label>
- <div class="col-sm-7">
- <select class="form-control m-b" ms-each="$msbProtocol" name="protocol" ms-duplex="msbRouteInfo.protocol" >
- <option ms-attr-value='el'>{{el}}</option>
- </select>
- <span class="help-block"></span>
- </div>
-
- </div>
-
- <div class="form-group">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_visualrange" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span class="required" aria-required="true">*</span>
- </label>
- <div class="col-sm-7">
- <input type="checkbox" ms-duplex="msbRouteInfo.visualRangeArray" value="0" ><span style="margin-right: 20px;" id="org_openo_msb_route_form_intersystem" name_i18n="org_openo_msb_route_ui_i18n" ></span>
- <input type="checkbox" ms-duplex="msbRouteInfo.visualRangeArray" value="1" ><span style="margin-right: 20px;" id="org_openo_msb_route_form_insystem" name_i18n="org_openo_msb_route_ui_i18n"></span>
-
- <span class="help-block"></span>
- </div>
-
- </div>
-
- <div class="tipArea" id="org_openo_msb_route_msb_hostlist" name_i18n="org_openo_msb_route_ui_i18n"></div>
-
- <div class="form-group">
-
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_msb_host" name_i18n="org_openo_msb_route_ui_i18n"></span>
- <span class="required" aria-required="true">*</span>
- </label>
-
-
- <div class="col-sm-4" style="padding-right: 5px;">
- <div class="item-tip" id="org_openo_msb_route_form_host_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
-
- <input type="text" placeholder="" ms-duplex="msbRouteInfo.newHost" class="form-control form-tip" name="newHost" style="display:inline-block;" />
-
- <span class="help-block"></span>
- </div>
- <div class="col-sm-2" style="padding-right: 5px;">
- <div class="item-tip" id="org_openo_msb_route_form_ttl_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
-
- <input type="text" placeholder="" ms-duplex="msbRouteInfo.newttl" class="form-control form-tip" name="newttl" style="display:inline-block;" />
-
- <span class="help-block"></span>
- </div>
- <div class="col-sm-1" style=" padding-left: 0px;">
- <a href="#" ms-click="addmsbHost()" class="btn btn-default " title="org_openo_msb_route_form_btn_addhost" name_i18n="org_openo_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>
- </div>
- </div>
-
- <div class="form-group">
- <label class="control-label col-sm-3"></label>
- <div class="hostTableDiv col-sm-7">
- <table class="table table-striped hostTable">
- <thead>
- <tr>
- <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>
- <th>IP</th>
- <th>PORT</th>
- <th>TTL</th>
- <th id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>
- </tr>
- </thead>
- <tbody ms-each-node="vm.msbRouteInfo.nodes">
- <tr>
- <td>{{$index+1}}</td>
- <td ms-text="node.ip"></td>
- <td ms-text="node.port"></td>
- <td ms-text="node.ttl"></td>
- <td><a href="#" title="org_openo_msb_route_form_btn_delhost" name_i18n="org_openo_msb_route_ui_i18n" ms-click="delmsbHost(node.ip,node.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>
- </tr>
-
-
- </tbody>
- </table>
- </div>
-
- </div>
-
- <div class="tipArea" ms-visible="msbRouteInfo.protocol=='REST'||msbRouteInfo.protocol=='UI'" id="org_openo_msb_route_form_target_tip" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <div class="form-group" ms-visible="msbRouteInfo.protocol=='REST'||msbRouteInfo.protocol=='UI'">
- <label class="control-label col-sm-3">
- <span id="org_openo_msb_route_form_target_service" name_i18n="org_openo_msb_route_ui_i18n"></span>
-
- </label>
- <div class="col-sm-7">
- {{vm.targetFullServiceUrl}}
-
-
- </div>
-
- </div>
-
- </form>
-
-
- </div>
-
-
- </div>
- <div class="modal-footer">
- <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_openo_msb_route_form_btn_cancel" name_i18n="org_openo_msb_route_ui_i18n"></button>
- <button class="btn btn-primary" type="submit" ms-click="$savemsbRoute()" id="org_openo_msb_route_form_btn_save" name_i18n="org_openo_msb_route_ui_i18n"></button>
- </div>
- </div>
-
- </div>
- </div>
-
- <div class="row" data-name="route_zone" >
-
-
- <div class="table-responsive">
- <table class="table table-striped table-bordered table-hover" id="msbTable">
- <thead>
- <tr>
- <th></th>
- <th style="display:none"></th>
- <th id="org_openo_msb_route_form_node_no" name_i18n="org_openo_msb_route_ui_i18n"></th>
- <th id="org_openo_msb_route_form_servicename" name_i18n="org_openo_msb_route_ui_i18n"></th>
- <th id="org_openo_msb_route_form_version" name_i18n="org_openo_msb_route_ui_i18n"></th>
-
- <th id="org_openo_msb_route_form_url" name_i18n="org_openo_msb_route_ui_i18n"></th>
- <th id="org_openo_msb_route_form_protocol" name_i18n="org_openo_msb_route_ui_i18n"></th>
- <th id="org_openo_msb_route_form_visualrange" name_i18n="org_openo_msb_route_ui_i18n"></th>
- <!--th>状æ€</th-->
- <th id="org_openo_msb_route_form_node_control" name_i18n="org_openo_msb_route_ui_i18n"></th>
- </tr>
- </thead>
- <tbody ms-each-msb="msbRouteArray">
- <tr>
- <td class="details-control"></td>
- <td ms-each-node="msb.nodes" style="display:none">
- {{node.ip}}:{{node.port}}:{{node.ttl}}
- </td>
- <td ms-text="$index+1"></td>
- <td ms-text="msb.serviceName"></td>
- <td ms-text="msb.version"></td>
-
- <td>{{msb.url==""?"/":msb.url}}</td>
- <td ms-text="msb.protocol"></td>
- <td ms-text="routeUtil.showVisualRange(msb.visualRange)"></td>
- <!--td ms-html="routeUtil.showStatus(msb.status)"></td-->
- <td>
-
- <a href="#" title="org_openo_msb_route_box_btn_update" name_i18n="org_openo_msb_route_ui_i18n" class="btn btn-default btn-s" ms-click="updatemsbRoute(msb)"><i class="fa fa fa-pencil-square-o"></i></a>
- <a href="#" title="org_openo_msb_route_box_btn_delete" name_i18n="org_openo_msb_route_ui_i18n" class="btn btn-default btn-s" ms-click="delmsbRoute(msb.serviceName,msb.version,this)"><i class="fa fa-trash-o"></i></a>
-
- </td>
- </tr>
-
- </tbody>
- </table>
-
- </div>
-
-
-
-
-
- </div>
-
- </div>
-
- </div>
-
-
-
- <div class="row-fluid separator" id="upArrawDiv">
- <div ms-visible="boxVisible" class="col-xs-12">
- <a href="#" ms-click="clickDisplayGraphAlink()"><img src="img/up.png"/></a>
- </div>
- </div>
-
-
-</div>
-
-<div class="row-fluid separator">
-
- <div ms-visible="!boxVisible" class="col-xs-12">
- <a href="#" ms-click="clickDisplayGraphAlink()" ><img src="img/down.png"/></a>
- </div>
-</div>
-
- <div class="container-fluid" style="margin-top:20px" id="serviceContent">
-
- <div class="row" style=" margin-top: 15px;">
- <div class="col-xs-6 col-md-6 col-sm-6 col-lg-6">
- <i class="fa fa-file-text-o fa-fw"></i>
- <span class=" titlefont" ms-text="routeTargetTitle"></span>
-
- </div>
- <div class="pull-right" ms-visible="vm.selectedRouteType=='api'">
- <button type="button" class="btn btn-default btn-sm" style="padding:3px 8px" ms-click="gotoRestDoc()"><i class="fa fa-link"></i> <span id="org_openo_msb_route_servicecontent_swagger" name_i18n="org_openo_msb_route_ui_i18n"></span></button>
- <button type="button" class="btn btn-default btn-sm" style="padding:3px 8px" ms-click="gotoJVM()" ms-visible="vm.selectedRoute.metricsUrl!=''"><i class="fa fa-bar-chart"></i> <span id="org_openo_msb_route_servicecontent_metrics" name_i18n="org_openo_msb_route_ui_i18n"></span></button>
- </div>
-
- </div>
- <div class="separator-line"></div>
-
-
-
- <iframe src="" width="100%" scrolling="no" marginheight="0" frameborder="0" id="msbSubPage" name="msbSubPage" class="page-mainIframeisWare" ></iframe>
-
-
-
- </div>
-
-
-</div>
-
-<script type="text/javascript" src="js/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>
-
-
- <script type="text/javascript" src="js/iframeResizer/iframeResizer.min.js"></script>
- <script type="text/javascript" src="js/iframeResizer/iframeResizer.contentWindow.min.js"></script>
-
- <script type="text/javascript" src="js/bootstrap/js/bootstrap.min.js"></script>
- <script type="text/javascript" src="js/dataTables/jquery.dataTables.min.js"></script>
- <script type="text/javascript" src="js/dataTables/dataTables.bootstrap.min.js"></script>
- <script type="text/javascript" src="js/bootbox/bootbox.min.js"></script>
- <script src="js/bootstrap-growl.min.js"></script>
- <script src="js/jquery-validation/jquery.validate.js"></script>
- <script type="text/javascript" src="js/avalon.js"></script>
-
-
-<script src="i18n/loadi18nApp_iui-route_view.js"></script>
-
-
- <script type="text/javascript" src="js/routeController.js"></script>
-
-
-<script type="text/javascript">
-
-$(function(){
-
-$('iframe').iFrameResize();
- loadPropertiesSideMenu('', 'msb-iui-route-i18n', 'i18n/');
-avalon.scan();
-vm.$initRoute();
-
-
-});
-
-</script>
- <script src="js/routeUtil.js"></script>
- <script src="js/routeFunc.js"></script>
-
-</body>
+<!--
+
+Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+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.
+
+-->
+<!DOCTYPE html>
+<html>
+<head lang="en">
+<meta charset="UTF-8">
+<title id="org_onap_msb_route_title" name_i18n="org_onap_msb_route_ui_i18n"></title>
+<link rel="shortcut icon" href="img/zte_logo_16.gif" />
+<link
+ href="js/fontAwesome/css/font-awesome.min.css"
+ rel="stylesheet" />
+<link
+ href="js/bootstrap/css/bootstrap.min.css"
+ rel="stylesheet" />
+
+
+
+<link href="css/route.css" rel="stylesheet" type="text/css" />
+<link href="css/base.css" rel="stylesheet" type="text/css" />
+<link href="css/animate.min.css" rel="stylesheet" type="text/css" />
+<link href="js/dataTables/dataTables.bootstrap.css" rel="stylesheet" type="text/css" />
+
+<style>
+.ms-controller {
+ visibility: hidden
+}
+</style>
+
+ <script type="text/javascript" src="js/jquery/jquery-1.10.2.min.js"></script>
+ <script type="text/javascript">
+ var iuiRootPath="iui";
+ var apiRootPath="api";
+
+ $.ajaxSettings.async = false;
+ $.getJSON("./ext/initUrlRootPath/initUrlRootPath.json",function(json){
+ iuiRootPath=json.iuiRootPath;
+ apiRootPath=json.apiRootPath;
+ });
+
+
+ var apiBasePath="/"+apiRootPath+"/microservices/v1";
+ var iuiBasePath="/"+iuiRootPath+"/microservices";
+
+</script>
+
+
+
+
+</head>
+<body class="ms-controller" ms-controller="routeController">
+
+
+
+ <div id="routeHead">
+ <div class="navbar-inner container-fluid" id="top-bar">
+ <header class="row-fluid">
+ <div class="logoimg"><img class="logo" src="img/logo.png" alt="Logo"></div>
+ <div class="chineseTitle" id="org_onap_msb_route_chinese_name" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <div class="englishTitle" id="org_onap_msb_route_english_name" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ </header>
+ </div>
+</div>
+
+ <script type="text/javascript">
+ if (self != top) {document.getElementById("routeHead").style.display="none";}
+
+ var currentLang = navigator.language;
+if(!currentLang) {currentLang = navigator.browserLanguage; }
+if(currentLang.toLowerCase() != "zh-cn") {$("#logo").hide(); }
+ </script>
+
+<div style=" background-color: #f1f3fa !important; ">
+
+
+ <div class="row row1 container-fluid" ms-visible="boxVisible">
+
+ <ul class="nav nav-tabs" id="panelTab" style="margin-top: 10px;">
+ <li class="active" ><a href="#apiPanel" data-toggle="tab" id="apiTab"><i class="fa fa-cloud fa-1x"></i> <span id="org_onap_msb_route_tab_api" name_i18n="org_onap_msb_route_ui_i18n"></span> </a></li>
+ <li ><a href="#iuiPanel" data-toggle="tab" id="iuiTab"><i class="fa fa-tv fa-1x"></i> <span id="org_onap_msb_route_tab_iui" name_i18n="org_onap_msb_route_ui_i18n"></span></a></li>
+ <li ><a href="#customPanel" data-toggle="tab" id="customTab"><i class="fa fa-cogs fa-1x"></i> <span id="org_onap_msb_route_tab_custom" name_i18n="org_onap_msb_route_ui_i18n"></span> </a></li>
+ <li ms-visible="!discoverInfo.enabled" ><a href="#msbPanel" data-toggle="tab" id="msbTab"><i class="fa fa-cubes fa-1x"></i> <span id="org_onap_msb_route_tab_msb" name_i18n="org_onap_msb_route_ui_i18n"></span> </a></li>
+</ul>
+<div class="tab-content" >
+ <div id="apiPanel" class="tab-pane active">
+ <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">
+
+ <button ms-visible="!discoverInfo.enabled" class="btn btn-primary" id="app-new-btn" ms-click="$showApiRouteDlg()" >
+ <i class=" fa fa-plus-circle"></i> <span id="org_onap_msb_route_btn_add_api" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ </button>
+
+ </div>
+
+
+<div id="routeDlg" class="modal fade" tabindex="-1" role="dialog"
+ aria-labelledby="myModalLabel" aria-hidden="true" >
+ <div class="modal-dialog">
+ <div class="modal-content Changepasswd">
+ <div class="content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"
+ aria-hidden="true">×</button>
+ <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>
+ </div>
+ <div class="modal-body">
+ <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>
+ <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>
+
+
+
+
+ <div id="info" class="tab-pane active">
+
+ <form class="form-horizontal" id="routeForm" role="form">
+
+ <div class="tipArea" id="org_onap_msb_route_form_sourceservice" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <div class="form-group" ms-visible="!discoverInfo.enabled">
+
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_address" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+
+
+ <div class="col-sm-6" style="padding-right: 5px;">
+ <div class="item-tip" id="org_onap_msb_route_form_host_tip" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <input type="text" ms-duplex="apiRouteInfo.server" name="server" class="form-control form-tip" ms-attr-disabled="discoverInfo.enabled" style="display:inline-block;" />
+ <span class="help-block"></span>
+ </div>
+ <div class="col-sm-1" style=" padding-left: 0px;" >
+ <a href="#" ms-click="addapiHost()" class="btn btn-default " title="org_onap_msb_route_form_btn_addhost" name_i18n="org_onap_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span ms-visible="discoverInfo.enabled" id="org_onap_msb_route_form_address" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ </label>
+ <div class="hostTableDiv col-sm-7">
+ <table class="table table-striped hostTable">
+ <thead>
+ <tr>
+ <th id="org_onap_msb_route_form_node_no" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ <th>IP</th>
+ <th>PORT</th>
+ <th ms-visible="!discoverInfo.enabled" id="org_onap_msb_route_form_node_control" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ </tr>
+ </thead>
+ <tbody ms-each-server="vm.apiRouteInfo.servers">
+ <tr>
+ <td>{{$index+1}}</td>
+ <td ms-text="server.ip"></td>
+ <td ms-text="server.port"></td>
+ <td ms-visible="!discoverInfo.enabled"><a href="#" ms-click="delapiHost(server.ip,server.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>
+ </tr>
+
+
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+
+ <div class="form-group" tyle="margin-bottom: 0;">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_url" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+
+ <input type="text" ms-duplex="apiRouteInfo.url" name="url" class="form-control" id="form-url" value="/" ms-attr-disabled="discoverInfo.enabled"/>
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+ <div class="tipArea" id="org_onap_msb_route_form_target_tip" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_target_service" name_i18n="org_onap_msb_route_ui_i18n"></span>
+
+ </label>
+ <div class="col-sm-7 line_break">{{vm.apiRouteInfo.publishProtocol}}://{{vm.route.routeHost}}/{{vm.route.apiRootPath}}/{{vm.apiRouteInfo.serviceName}}/{{vm.apiRouteInfo.version}}</div>
+
+ </div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_servicename" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+ <input type="text" ms-duplex="apiRouteInfo.serviceName" name="serviceName" class="form-control" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_version" name_i18n="org_onap_msb_route_ui_i18n"></span>
+
+ </label>
+ <div class="col-sm-7">
+ <div class="item-tip" ms-class-item-tip-none ="routeDlgInfo.saveType=='update'" id="org_onap_msb_route_form_version_tip" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <input type="text" ms-duplex="apiRouteInfo.version" name="version" class="form-control form-tip" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span><a href="javascript:;" class="collapse-box" data-toggle="collapse"
+ data-target="#apiJsonFullurl">
+ <i class="fa fa-plus" id="apiJsonCollapse"></i> <span id="org_onap_msb_route_form_swagger" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ </a></span>
+
+ </label>
+ <div class="col-sm-7">
+ <div class="input-group">
+ <input type="text" class="form-control" ms-if="apiRouteInfo.apiJsonType=='1'" ms-duplex="apiJson.custom" ms-attr-disabled="routeDlgInfo.saveType=='view'"/>
+ <select class="form-control m-b" ms-if="apiRouteInfo.apiJsonType=='0'" ms-each="jsonApiSelectList.selectItems" ms-duplex="apiJson.local" id="apiJsonSelect" ms-attr-disabled="routeDlgInfo.saveType=='view'">
+ <option ms-attr-value='el'>{{el}}</option>
+ </select>
+
+ <div class="input-group-btn">
+ <button class="btn btn-default dropdown-toggle" data-toggle="dropdown" type="button" aria-expanded="false" ms-attr-disabled="routeDlgInfo.saveType=='view'">{{showAPITypeName[apiRouteInfo.apiJsonType]}} <span class="caret"></span></button>
+ <ul class="dropdown-menu pull-right">
+ <li><a ms-click="setAPIType(0)">{{showAPITypeName[0]}}</a></li>
+ <li><a ms-click="setAPIType(1)">{{showAPITypeName[1]}}</a></li>
+ </ul>
+ </div>
+ </div>
+ <span class="help-block"></span>
+ </div>
+
+
+
+
+ </div>
+
+ <div id="apiJsonFullurl" class="form-group collapse in">
+ <label class="control-label col-sm-3"><span id="org_onap_msb_route_form_swagger_address" name_i18n="org_onap_msb_route_ui_i18n"></span></label>
+ <div class="col-sm-9">
+ <div>
+ <i class="fa fa-home fa-fw"></i> <span id="org_onap_msb_route_form_target_address" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span ms-if="vm.apiRouteInfo.apiJsonType==0">{{vm.route.routeHost}}/{{vm.route.iuiRootPath}}/microservices/ext/initSwaggerJson/{{vm.apiJson.local}}</span>
+ <span ms-if="vm.apiRouteInfo.apiJsonType==1">{{vm.apiRouteInfo.servers[0].ip+":"+vm.apiRouteInfo.servers[0].port}}{{vm.apiJson.custom}}</span>
+ </div>
+ <div>
+ <i class="fa fa-cloud-upload fa-fw"></i><span id="org_onap_msb_route_form_publish_address" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span ms-if="vm.apiRouteInfo.apiJsonType==0">{{vm.route.routeHost}}/{{vm.route.iuiRootPath}}/microservices/ext/initSwaggerJson/{{vm.apiJson.local}}</span>
+ <span ms-if="vm.apiRouteInfo.apiJsonType==1">{{vm.route.routeHost}}/apijson/{{vm.apiRouteInfo.serviceName}}/{{vm.apiRouteInfo.version}}</span>
+ </div>
+
+
+ </div>
+ </div>
+
+
+ </form>
+ </div>
+
+
+
+
+ </div>
+ <div class="modal-footer"
+ ms-visible="routeDlgInfo.saveType!='view'">
+ <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_onap_msb_route_form_btn_cancel" name_i18n="org_onap_msb_route_ui_i18n"></button>
+ <button class="btn btn-primary" type="submit" ms-click="$saveApiRoute()" id="org_onap_msb_route_form_btn_save" name_i18n="org_onap_msb_route_ui_i18n"></button>
+ </div>
+ <div class="modal-footer"
+ ms-visible="routeDlgInfo.saveType=='view'">
+ <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true" id="org_onap_msb_route_form_btn_close" name_i18n="org_onap_msb_route_ui_i18n"></button>
+
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </div>
+
+ <div class="row" data-name="route_zone" >
+
+ <span class="response_throbber" ms-visible="vm.routeLoading"></span>
+
+ <div ms-each-group="apiGroupByPortArray">
+ <div class="form-title">
+ <span><a data-toggle="collapse" ms-html="routeUtil.showGroupPort($index,group)"></a>
+ <span class="label label-info" style="margin-left: 10px;">{{apiGroupByPortArray[$index].length}}</span>
+ </span>
+ <div class="panel-tools">
+ <a class="showhide" data-toggle="collapse"><i class="fa fa-chevron-up"></i></a>
+ </div>
+ </div>
+ <div style="width: 100%;" class="collapseContent collapse in">
+
+
+ <div class="stats_box" ms-each-route="group">
+
+ <div class="routeDiv">
+ <div class="sparkline" ms-click="gotoTarget(route,'api')" data-name="route_click_zone">
+ <i class="fa fa-cloud fa-3x" ms-class-route-valid ="route.status === '1'" ms-class-route-invalid ="route.status === '0'"></i>
+ {{routeUtil.showPotocol(route.publish_port,route.publishProtocol)|html}}
+ </div>
+ <div class="stat_text" ms-click="gotoTarget(route,'api')" data-name="route_click_zone">
+ <strong ms-text="routeUtil.cutString(route.serviceName)" ms-attr-title="route.serviceName" ></strong>
+ <span><b id="org_onap_msb_route_box_version" name_i18n="org_onap_msb_route_ui_i18n"></b>{{route.version}}</span>
+
+ </div>
+
+ <span ms-visible="!discoverInfo.enabled">
+
+ <a class="btn btn-default" ms-click="updateApiRoute(route,'update')" title="org_onap_msb_route_box_btn_update" name_i18n="org_onap_msb_route_ui_i18n"><i class="fa fa-pencil-square-o" > </i></a>
+ <a class="btn btn-default" ms-click="delApiRoute(route.serviceName,route.version)" ms-visible="route.control !='1'" title="org_onap_msb_route_box_btn_delete" name_i18n="org_onap_msb_route_ui_i18n"><i class="fa fa-trash-o" > </i></a>
+ <a class="btn btn-default" ms-visible="route.status === '1' && route.control !='1'" title="org_onap_msb_route_box_btn_disable" name_i18n="org_onap_msb_route_ui_i18n" ms-click="updateApiRouteStatus(route.serviceName,route.version,'0')"><i class="fa fa-stop" style="color:red;font-size:10px"></i></a>
+ <a class="btn btn-default" ms-visible="route.status === '0' && route.control !='1'" title="org_onap_msb_route_box_btn_able" name_i18n="org_onap_msb_route_ui_i18n" ms-click="updateApiRouteStatus(route.serviceName,route.version,'1')"><i class="fa fa-play" style="color:green;font-size:10px"></i></a>
+ </span>
+ <span ms-visible="discoverInfo.enabled">
+ <a class="btn btn-default" ms-click="updateApiRoute(route,'update')"><i class="fa fa-pencil-square-o" title="org_onap_msb_route_box_btn_update" name_i18n="org_onap_msb_route_ui_i18n"> </i></a>
+ <a class="btn btn-default" ms-click="updateApiRoute(route,'view')"><i class="fa fa-file-text-o" title="org_onap_msb_route_box_btn_view" name_i18n="org_onap_msb_route_ui_i18n"> </i></a> </span>
+
+ </div>
+
+ </div>
+ </div>
+ </div>
+
+ </div>
+
+
+ </div>
+ <div id="iuiPanel" class="tab-pane">
+ <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">
+ <button ms-visible="!discoverInfo.enabled" class="btn btn-primary" id="app-new-btn" ms-click="$showiuiRouteDlg()" >
+ <i class=" fa fa-plus-circle"></i> <span id="org_onap_msb_route_btn_add_iui" name_i18n="org_onap_msb_route_ui_i18n">
+ </button>
+
+ </div>
+
+ <div id="iuirouteDlg" class="modal fade" tabindex="-1" role="dialog"
+ aria-labelledby="myModalLabel" aria-hidden="true" >
+ <div class="modal-dialog">
+ <div class="modal-content Changepasswd">
+ <div class="content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"
+ aria-hidden="true">×</button>
+ <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>
+ </div>
+ <div class="modal-body">
+ <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>
+ <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>
+
+ <form class="form-horizontal" id="iuirouteForm" role="form">
+
+ <div class="tipArea" id="org_onap_msb_route_form_sourceservice" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <div class="form-group" ms-visible="!discoverInfo.enabled">
+
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_address" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+
+
+ <div class="col-sm-6" style="padding-right: 5px;">
+ <div class="item-tip" id="org_onap_msb_route_form_host_tip" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <input type="text" ms-duplex="iuiRouteInfo.server" name="iuiserver" class="form-control form-tip" style="display:inline-block;" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+ <div class="col-sm-1" style=" padding-left: 0px;" >
+ <a href="#" ms-click="addiuiHost()" class="btn btn-default " title="org_onap_msb_route_form_btn_addhost" name_i18n="org_onap_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3" >
+
+ <span ms-visible="discoverInfo.enabled" id="org_onap_msb_route_form_address" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ </label>
+ <div class="hostTableDiv col-sm-7">
+ <table class="table table-striped hostTable">
+ <thead>
+ <tr>
+ <th id="org_onap_msb_route_form_node_no" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ <th>IP</th>
+ <th>PORT</th>
+ <th ms-visible="routeDlgInfo.saveType!='view'" id="org_onap_msb_route_form_node_control" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ </tr>
+ </thead>
+ <tbody ms-each-server="vm.iuiRouteInfo.servers">
+ <tr>
+ <td>{{$index+1}}</td>
+ <td ms-text="server.ip"></td>
+ <td ms-text="server.port"></td>
+ <td ms-visible="routeDlgInfo.saveType!='view'"><a href="#" ms-click="deliuiHost(server.ip,server.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>
+ </tr>
+
+
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+
+
+ <div class="form-group" tyle="margin-bottom: 0;">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_url" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+
+ <input type="text" ms-duplex="iuiRouteInfo.url" name="iuiurl" class="form-control" value="/" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+ <div class="tipArea" id="org_onap_msb_route_form_target_tip" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_target_service" name_i18n="org_onap_msb_route_ui_i18n"></span>
+
+ </label>
+ <div class="col-sm-7 line_break" >{{vm.iuiRouteInfo.publishProtocol}}://{{vm.route.routeHost}}/{{vm.route.iuiRootPath}}/{{vm.iuiRouteInfo.serviceName}}</div>
+ <!--i class="fa fa-info-circle fa-lg tip_color" data-toggle="tooltip" data-placement="bottom" title="org_onap_msb_route_form_iui_tip" name_i18n="org_onap_msb_route_ui_i18n" ></i-->
+
+ </div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_servicename" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+ <input type="text" ms-duplex="iuiRouteInfo.serviceName" name="iuiserviceName" class="form-control" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+
+
+
+
+
+ </form>
+
+
+ </div>
+
+
+ </div>
+ <div class="modal-footer" ms-visible="routeDlgInfo.saveType!='view'">
+ <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_onap_msb_route_form_btn_cancel" name_i18n="org_onap_msb_route_ui_i18n"></button>
+ <button class="btn btn-primary" type="submit" ms-click="$saveiuiRoute()" id="org_onap_msb_route_form_btn_save" name_i18n="org_onap_msb_route_ui_i18n"></button>
+ </div>
+ <div class="modal-footer"
+ ms-visible="routeDlgInfo.saveType=='view'">
+ <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true" id="org_onap_msb_route_form_btn_close" name_i18n="org_onap_msb_route_ui_i18n"></button>
+
+ </div>
+ </div>
+
+ </div>
+ </div>
+
+ <div class="row" data-name="route_zone" >
+
+ <span class="response_throbber" ms-visible="vm.routeLoading"></span>
+
+ <div ms-each-group="iuiGroupByPortArray">
+ <div class="form-title">
+ <span><a data-toggle="collapse" ms-html="routeUtil.showGroupPort($index,group)"></a>
+ <span class="label label-info" style="margin-left: 10px;">{{iuiGroupByPortArray[$index].length}}</span>
+ </span>
+ <div class="panel-tools">
+ <a class="showhide" data-toggle="collapse"><i class="fa fa-chevron-up"></i></a>
+ </div>
+ </div>
+ <div style="width: 100%;" class="collapseContent collapse in">
+
+
+ <div class="stats_box" ms-each-route="group">
+
+ <div class="routeDiv" ms-visible="route.control !='2'">
+ <div class="sparkline" ms-click="gotoTarget(route,'iui')" data-name="route_click_zone">
+ <i class="fa fa-tv fa-3x" ms-class-route-valid ="route.status === '1'" ms-class-route-invalid ="route.status === '0'"></i>
+ {{routeUtil.showPotocol(route.publish_port,route.publishProtocol)|html}}
+ </div>
+ <div class="stat_text" ms-click="gotoTarget(route,'iui')" data-name="route_click_zone">
+ <strong ms-text="routeUtil.cutString(route.serviceName)" ms-attr-title="route.serviceName" ></strong>
+ <span>{{route.servers[0].ip}}:{{route.servers[0].port}}</span>
+ </div>
+ <span ms-visible="!discoverInfo.enabled">
+
+ <a class="btn btn-default" ms-click="updateiuiRoute(route,'update')"><i class="fa fa-pencil-square-o" title="org_onap_msb_route_box_btn_update" name_i18n="org_onap_msb_route_ui_i18n" > </i></a>
+ <a class="btn btn-default" ms-click="deliuiRoute(route.serviceName)" ms-visible="route.control !='1'"><i class="fa fa-trash-o" title="删除"> </i></a>
+ <a class="btn btn-default" ms-visible="route.status === '1' && route.control !='1'" title="org_onap_msb_route_box_btn_disable" name_i18n="org_onap_msb_route_ui_i18n" ms-click="updateiuiRouteStatus(route.serviceName,'0')"><i class="fa fa-stop" style="color:red;font-size:10px"></i></a>
+ <a class="btn btn-default" ms-visible="route.status === '0' && route.control !='1'" title="org_onap_msb_route_box_btn_able" name_i18n="org_onap_msb_route_ui_i18n" ms-click="updateiuiRouteStatus(route.serviceName,'1')"><i class="fa fa-play" style="color:green;font-size:10px"></i></a>
+ </span>
+ <span ms-visible="discoverInfo.enabled"><a class="btn btn-default" ms-click="updateiuiRoute(route,'view')"><i class="fa fa-file-text-o" title="org_onap_msb_route_box_btn_view" name_i18n="org_onap_msb_route_ui_i18n"> </i></a> </span>
+
+ </div>
+
+ </div>
+ </div>
+ </div>
+
+ </div>
+
+ </div>
+
+ <div id="customPanel" class="tab-pane">
+ <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">
+ <button ms-visible="!discoverInfo.enabled" class="btn btn-primary" id="app-new-btn" ms-click="$showcustomRouteDlg()" >
+ <i class=" fa fa-plus-circle"></i> <span id="org_onap_msb_route_btn_add_custom" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ </button>
+
+ </div>
+
+ <div id="customrouteDlg" class="modal fade" tabindex="-1" role="dialog"
+ aria-labelledby="myModalLabel" aria-hidden="true" >
+ <div class="modal-dialog">
+ <div class="modal-content Changepasswd">
+ <div class="content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"
+ aria-hidden="true">×</button>
+ <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>
+ </div>
+ <div class="modal-body">
+ <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>
+ <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>
+
+ <form class="form-horizontal" id="customrouteForm" role="form">
+
+ <div class="tipArea" id="org_onap_msb_route_form_sourceservice" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <div class="form-group" ms-visible="!discoverInfo.enabled">
+
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_address" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+
+
+ <div class="col-sm-6" style="padding-right: 5px;">
+ <div class="item-tip" id="org_onap_msb_route_form_host_tip" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <input type="text" ms-duplex="customRouteInfo.server" name="customserver" class="form-control form-tip" style="display:inline-block;" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+ <div class="col-sm-1" style=" padding-left: 0px;" ms-visible="routeDlgInfo.saveType!='view'">
+ <a href="#" ms-click="addcustomHost()" class="btn btn-default " title="org_onap_msb_route_form_btn_addhost" name_i18n="org_onap_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span ms-visible="discoverInfo.enabled" id="org_onap_msb_route_form_address" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ </label>
+ <div class="hostTableDiv col-sm-7">
+ <table class="table table-striped hostTable">
+ <thead>
+ <tr>
+ <th id="org_onap_msb_route_form_node_no" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ <th>IP</th>
+ <th>PORT</th>
+ <th ms-visible="routeDlgInfo.saveType!='view'" id="org_onap_msb_route_form_node_control" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ </tr>
+ </thead>
+ <tbody ms-each-server="vm.customRouteInfo.servers">
+ <tr>
+ <td>{{$index+1}}</td>
+ <td ms-text="server.ip"></td>
+ <td ms-text="server.port"></td>
+ <td ms-visible="routeDlgInfo.saveType!='view'"><a href="#" ms-click="delcustomHost(server.ip,server.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>
+ </tr>
+
+
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+
+
+
+ <div class="form-group" tyle="margin-bottom: 0;">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_url" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+
+ <input type="text" ms-duplex="customRouteInfo.url" name="customurl" class="form-control" value="/" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+ <div class="tipArea" id="org_onap_msb_route_form_target_tip" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_target_service" name_i18n="org_onap_msb_route_ui_i18n"></span>
+
+ </label>
+ <div class="col-sm-7 line_break" >{{vm.customRouteInfo.publishProtocol}}://{{vm.route.routeHost}}{{vm.customRouteInfo.serviceName}}</div>
+
+
+ </div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_servicename" name_i18n="org_onap_msb_route_ui_i18n"></span>
+
+ </label>
+ <div class="col-sm-7">
+ <input type="text" ms-duplex="customRouteInfo.serviceName" name="customserviceName" class="form-control" ms-attr-disabled="discoverInfo.enabled" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+
+ </form>
+
+
+ </div>
+
+
+ </div>
+ <div class="modal-footer" ms-visible="routeDlgInfo.saveType!='view'">
+ <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_onap_msb_route_form_btn_cancel" name_i18n="org_onap_msb_route_ui_i18n"></button>
+ <button class="btn btn-primary" type="submit" ms-click="$savecustomRoute()" id="org_onap_msb_route_form_btn_save" name_i18n="org_onap_msb_route_ui_i18n"></button>
+ </div>
+ <div class="modal-footer"
+ ms-visible="routeDlgInfo.saveType=='view'">
+ <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true" id="org_onap_msb_route_form_btn_close" name_i18n="org_onap_msb_route_ui_i18n"></button>
+
+ </div>
+ </div>
+
+ </div>
+ </div>
+
+ <div class="row" data-name="route_zone" >
+
+ <span class="response_throbber" ms-visible="vm.routeLoading"></span>
+
+
+ <div ms-each-group="customGroupByPortArray">
+ <div class="form-title">
+ <span><a data-toggle="collapse" ms-html="routeUtil.showGroupPort($index,group)"></a>
+ <span class="label label-info" style="margin-left: 10px;">{{customGroupByPortArray[$index].length}}</span>
+ </span>
+ <div class="panel-tools">
+ <a class="showhide" data-toggle="collapse"><i class="fa fa-chevron-up"></i></a>
+ </div>
+ </div>
+ <div style="width: 100%;" class="collapseContent collapse in">
+
+
+ <div class="stats_box" ms-each-elem="group">
+
+ <div class="routeDiv" ms-visible="elem.control !='2'">
+ <div class="sparkline" data-name="route_click_zone">
+ <i class="fa fa-cogs fa-3x" ms-class-route-valid ="elem.status === '1'" ms-class-route-invalid ="elem.status === '0'"></i>
+ {{routeUtil.showPotocol(elem.publish_port,elem.publishProtocol)|html}}
+ </div>
+ <div class="stat_text" data-name="route_click_zone" >
+
+ <strong ms-text="elem.serviceName==''?'/':routeUtil.cutString(elem.serviceName)" ms-attr-title="elem.serviceName"></strong>
+ <span>{{elem.servers[0].ip}}:{{elem.servers[0].port}}</span>
+ </div>
+ <span ms-visible="!discoverInfo.enabled">
+
+ <a class="btn btn-default" ms-click="updatecustomRoute(elem,'update')"><i class="fa fa-pencil-square-o" title="org_onap_msb_route_box_btn_update" name_i18n="org_onap_msb_route_ui_i18n" > </i></a>
+ <a class="btn btn-default" ms-click="delcustomRoute(elem.serviceName)" ms-visible="elem.control !='1'"><i class="fa fa-trash-o" title="删除"> </i></a>
+ <a class="btn btn-default" ms-visible="elem.status === '1' && elem.control !='1'" title="org_onap_msb_route_box_btn_disable" name_i18n="org_onap_msb_route_ui_i18n" ms-click="updatecustomRouteStatus(elem.serviceName,'0')"><i class="fa fa-stop" style="color:red;font-size:10px"></i></a>
+ <a class="btn btn-default" ms-visible="elem.status === '0' && elem.control !='1'" title="org_onap_msb_route_box_btn_able" name_i18n="org_onap_msb_route_ui_i18n" ms-click="updatecustomRouteStatus(elem.serviceName,'1')"><i class="fa fa-play" style="color:green;font-size:10px"></i></a>
+ </span>
+ <span ms-visible="discoverInfo.enabled"><a class="btn btn-default" ms-click="updatecustomRoute(elem,'view')"><i class="fa fa-file-text-o" title="org_onap_msb_route_box_btn_view" name_i18n="org_onap_msb_route_ui_i18n"> </i></a> </span>
+
+ </div>
+
+ </div>
+ </div>
+
+ </div>
+
+
+
+ </div>
+
+ </div>
+
+
+ <div id="msbPanel" class="tab-pane">
+ <div class="row" style=" margin-top: 10px;text-align:right; margin-right: 20px;">
+ <button class="btn btn-primary" id="app-new-btn" ms-click="$showmsbRouteDlg()" >
+ <i class=" fa fa-plus-circle"></i> <span id="org_onap_msb_route_btn_add_msb" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ </button>
+
+ </div>
+
+ <div id="msbrouteDlg" class="modal fade" tabindex="-1" role="dialog"
+ aria-labelledby="myModalLabel" aria-hidden="true" >
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"
+ aria-hidden="true">×</button>
+ <h3 id="myModalLabel" ms-text="routeDlgInfo.titleName"></h3>
+ </div>
+ <div class="modal-body">
+ <div class="alert alert-info" ms-visible="server_rtn.info_block"></div>
+ <div class="alert alert-danger " ms-visible="server_rtn.warning_block" ms-text="server_rtn.rtn_info"></div>
+
+ <form class="form-horizontal" id="msbForm" role="form">
+ <div class="tipArea" id="org_onap_msb_route_msb_info" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_servicename" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+ <input type="text" ms-duplex="msbRouteInfo.serviceName" name="serviceName" class="form-control" ms-attr-disabled="vm.routeDlgInfo.saveType=='update'"/>
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_version" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ </label>
+ <div class="col-sm-7">
+ <div class="item-tip" id="org_onap_msb_route_form_version_tip" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <input type="text" ms-duplex="msbRouteInfo.version" name="version" class="form-control form-tip" ms-attr-disabled="vm.routeDlgInfo.saveType=='update'" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_url" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ </label>
+ <div class="col-sm-7">
+
+ <input type="text" ms-duplex="msbRouteInfo.url" name="url" class="form-control" />
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_protocol" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+ <select class="form-control m-b" ms-each="$msbProtocol" name="protocol" ms-duplex="msbRouteInfo.protocol" >
+ <option ms-attr-value='el'>{{el}}</option>
+ </select>
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_visualrange" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+ <div class="col-sm-7">
+ <input type="checkbox" ms-duplex="msbRouteInfo.visualRangeArray" value="0" ><span style="margin-right: 20px;" id="org_onap_msb_route_form_intersystem" name_i18n="org_onap_msb_route_ui_i18n" ></span>
+ <input type="checkbox" ms-duplex="msbRouteInfo.visualRangeArray" value="1" ><span style="margin-right: 20px;" id="org_onap_msb_route_form_insystem" name_i18n="org_onap_msb_route_ui_i18n"></span>
+
+ <span class="help-block"></span>
+ </div>
+
+ </div>
+
+ <div class="tipArea" id="org_onap_msb_route_msb_hostlist" name_i18n="org_onap_msb_route_ui_i18n"></div>
+
+ <div class="form-group">
+
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_msb_host" name_i18n="org_onap_msb_route_ui_i18n"></span>
+ <span class="required" aria-required="true">*</span>
+ </label>
+
+
+ <div class="col-sm-4" style="padding-right: 5px;">
+ <div class="item-tip" id="org_onap_msb_route_form_host_tip" name_i18n="org_onap_msb_route_ui_i18n"></div>
+
+ <input type="text" placeholder="" ms-duplex="msbRouteInfo.newHost" class="form-control form-tip" name="newHost" style="display:inline-block;" />
+
+ <span class="help-block"></span>
+ </div>
+ <div class="col-sm-2" style="padding-right: 5px;">
+ <div class="item-tip" id="org_onap_msb_route_form_ttl_tip" name_i18n="org_onap_msb_route_ui_i18n"></div>
+
+ <input type="text" placeholder="" ms-duplex="msbRouteInfo.newttl" class="form-control form-tip" name="newttl" style="display:inline-block;" />
+
+ <span class="help-block"></span>
+ </div>
+ <div class="col-sm-1" style=" padding-left: 0px;">
+ <a href="#" ms-click="addmsbHost()" class="btn btn-default " title="org_onap_msb_route_form_btn_addhost" name_i18n="org_onap_msb_route_ui_i18n"><i class="fa fa-plus-circle"></i></a>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="control-label col-sm-3"></label>
+ <div class="hostTableDiv col-sm-7">
+ <table class="table table-striped hostTable">
+ <thead>
+ <tr>
+ <th id="org_onap_msb_route_form_node_no" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ <th>IP</th>
+ <th>PORT</th>
+ <th>TTL</th>
+ <th id="org_onap_msb_route_form_node_control" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ </tr>
+ </thead>
+ <tbody ms-each-node="vm.msbRouteInfo.nodes">
+ <tr>
+ <td>{{$index+1}}</td>
+ <td ms-text="node.ip"></td>
+ <td ms-text="node.port"></td>
+ <td ms-text="node.ttl"></td>
+ <td><a href="#" title="org_onap_msb_route_form_btn_delhost" name_i18n="org_onap_msb_route_ui_i18n" ms-click="delmsbHost(node.ip,node.port)" style="padding: 0px 6px;" class="btn btn-default btn-s"><i class="fa fa-trash-o"></i></a></td>
+ </tr>
+
+
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+
+ <div class="tipArea" ms-visible="msbRouteInfo.protocol=='REST'||msbRouteInfo.protocol=='HTTP'||msbRouteInfo.protocol=='UI'" id="org_onap_msb_route_form_target_tip" name_i18n="org_onap_msb_route_ui_i18n"></div>
+ <div class="form-group" ms-visible="msbRouteInfo.protocol=='REST'||msbRouteInfo.protocol=='HTTP'||msbRouteInfo.protocol=='UI'">
+ <label class="control-label col-sm-3">
+ <span id="org_onap_msb_route_form_target_service" name_i18n="org_onap_msb_route_ui_i18n"></span>
+
+ </label>
+ <div class="col-sm-7 line_break">
+ {{vm.route.publishProtocol}}://{{vm.targetFullServiceUrl}}
+
+
+ </div>
+
+ </div>
+
+ </form>
+
+
+ </div>
+
+
+ </div>
+ <div class="modal-footer">
+ <button class="btn" data-dismiss="modal" aria-hidden="true" id="org_onap_msb_route_form_btn_cancel" name_i18n="org_onap_msb_route_ui_i18n"></button>
+ <button class="btn btn-primary" type="submit" ms-click="$savemsbRoute()" id="org_onap_msb_route_form_btn_save" name_i18n="org_onap_msb_route_ui_i18n"></button>
+ </div>
+ </div>
+
+ </div>
+ </div>
+
+ <div class="row" data-name="route_zone" >
+
+
+ <div class="table-responsive">
+ <table class="table table-striped table-bordered table-hover" id="msbTable">
+ <thead>
+ <tr>
+ <th></th>
+ <th style="display:none"></th>
+ <th id="org_onap_msb_route_form_node_no" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ <th id="org_onap_msb_route_form_servicename" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ <th id="org_onap_msb_route_form_version" name_i18n="org_onap_msb_route_ui_i18n"></th>
+
+ <th id="org_onap_msb_route_form_url" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ <th id="org_onap_msb_route_form_protocol" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ <th id="org_onap_msb_route_form_visualrange" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ <!--th>状æ€</th-->
+ <th id="org_onap_msb_route_form_node_control" name_i18n="org_onap_msb_route_ui_i18n"></th>
+ </tr>
+ </thead>
+ <tbody ms-each-msb="msbRouteArray">
+ <tr>
+ <td class="details-control"></td>
+ <td ms-each-node="msb.nodes" style="display:none">
+ {{node.ip}}:{{node.port}}:{{node.ttl}}
+ </td>
+ <td ms-text="$index+1"></td>
+ <td ms-text="msb.serviceName"></td>
+ <td ms-text="msb.version"></td>
+
+ <td>{{msb.url==""?"/":msb.url}}</td>
+ <td ms-text="msb.protocol"></td>
+ <td ms-text="routeUtil.showVisualRange(msb.visualRange)"></td>
+ <!--td ms-html="routeUtil.showStatus(msb.status)"></td-->
+ <td>
+
+ <a href="#" title="org_onap_msb_route_box_btn_update" name_i18n="org_onap_msb_route_ui_i18n" class="btn btn-default btn-s" ms-click="updatemsbRoute(msb)"><i class="fa fa fa-pencil-square-o"></i></a>
+ <a href="#" title="org_onap_msb_route_box_btn_delete" name_i18n="org_onap_msb_route_ui_i18n" class="btn btn-default btn-s" ms-click="delmsbRoute(msb.serviceName,msb.version,this)"><i class="fa fa-trash-o"></i></a>
+
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+
+ </div>
+
+
+
+
+
+ </div>
+
+ </div>
+
+ </div>
+
+
+
+ <div class="row-fluid separator" id="upArrawDiv">
+ <div ms-visible="boxVisible" class="col-xs-12">
+ <a href="#" ms-click="clickDisplayGraphAlink()"><img src="img/up.png"/></a>
+ </div>
+ </div>
+
+
+</div>
+
+<div class="row-fluid separator">
+
+ <div ms-visible="!boxVisible" class="col-xs-12">
+ <a href="#" ms-click="clickDisplayGraphAlink()" ><img src="img/down.png"/></a>
+ </div>
+</div>
+
+ <div class="container-fluid" style="margin-top:20px" id="serviceContent">
+
+ <div class="row" style=" margin-top: 15px;">
+ <div class="col-xs-6 col-md-6 col-sm-6 col-lg-6">
+ <i class="fa fa-file-text-o fa-fw"></i>
+ <span class=" titlefont" ms-text="routeTargetTitle"></span>
+
+ </div>
+
+
+ </div>
+ <div class="separator-line"></div>
+
+
+
+ <iframe src="" width="100%" scrolling="no" marginheight="0" frameborder="0" id="msbSubPage" name="msbSubPage" class="page-mainIframeisWare" ></iframe>
+
+
+
+ </div>
+
+
+</div>
+
+<script type="text/javascript" src="js/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>
+
+
+ <script type="text/javascript" src="js/iframeResizer/iframeResizer.min.js"></script>
+ <script type="text/javascript" src="js/iframeResizer/iframeResizer.contentWindow.min.js"></script>
+
+ <script type="text/javascript" src="js/bootstrap/js/bootstrap.min.js"></script>
+ <script type="text/javascript" src="js/dataTables/jquery.dataTables.min.js"></script>
+ <script type="text/javascript" src="js/dataTables/dataTables.bootstrap.min.js"></script>
+ <script type="text/javascript" src="js/bootbox/bootbox.min.js"></script>
+ <script src="js/bootstrap-growl.min.js"></script>
+ <script src="js/jquery-validation/jquery.validate.js"></script>
+ <script type="text/javascript" src="js/avalon.js"></script>
+
+
+<script src="i18n/loadi18nApp_iui-route_view.js"></script>
+
+
+ <script type="text/javascript" src="js/routeController.js"></script>
+
+
+<script type="text/javascript">
+
+$(function(){
+
+$('iframe').iFrameResize();
+ loadPropertiesSideMenu('', 'msb-iui-route-i18n', 'i18n/');
+avalon.scan();
+vm.$initRoute();
+
+
+});
+
+</script>
+ <script src="js/routeUtil.js"></script>
+ <script src="js/routeFunc.js"></script>
+
+</body>
</html> \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/avalon.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js
index 5eae6ca..a22bb7d 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/avalon.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js
@@ -1,4 +1,3 @@
-
/*==================================================
Copyright (c) 2013-2015 å¸å¾’正美 and other contributors
http://www.cnblogs.com/rubylouvre/
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootbox/bootbox.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootbox/bootbox.min.js
index a7ea24f..a7ea24f 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootbox/bootbox.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootbox/bootbox.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap-growl.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap-growl.min.js
index ce6deb1..ce6deb1 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap-growl.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap-growl.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/css/bootstrap-dt.css b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css
index 8ec95e1..2828337 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/css/bootstrap-dt.css
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css
@@ -1,3 +1,9 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
/*! normalize.css v3.0.0 | MIT License | git.io/normalize */
html {
font-family: sans-serif;
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css
index 9611bd2..679272d 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap.min.css
@@ -1 +1,7 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,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:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}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{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{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-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!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^="javascript:"]:after,a[href^="#"]: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}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-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:62.5%;-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:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;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{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.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;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}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:400;line-height:1;color:#999}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:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{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;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.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:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.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'}blockquote:before,blockquote:after{content:""}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;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;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{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-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-left:15px;padding-right: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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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{max-width:100%;background-color:transparent}th{text-align:left}.table{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-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.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.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.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.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.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.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.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{padding:0;margin:0;border:0;min-width: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;margin-bottom:5px;font-weight:700}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:thin dotted;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,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[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.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}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{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;border-color:#3c763d;background-color:#dff0d8}.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{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;border-color:#8a6d3b;background-color:#fcf8e3}.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{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;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom: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 .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;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-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;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.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:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.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:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.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:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{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:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.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:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{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:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.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:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{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:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.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:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.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:#2a6496;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:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;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%;padding-left:0;padding-right:0}.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;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@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.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:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro: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"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.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;list-style:none;font-size:14px;background-color:#fff;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);background-clip:padding-box}.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:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.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:focus,.btn-group-vertical>.btn:focus{outline:0}.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-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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right: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-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.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.33;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:400;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-bottom-right-radius:0;border-top-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-bottom-left-radius:0;border-top-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{margin-left:-1px}.nav{margin-bottom:0;padding-left: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:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.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;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.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:#428bca}.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{text-align:center;margin-bottom:5px}.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-right-radius:0;border-top-left-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{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;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-left:0;padding-right:0}}.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;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;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;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-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 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);margin-top:8px;margin-bottom:8px}@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 .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;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{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-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{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{background-color:#e7e7e7;color:#555}@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-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.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{background-color:#080808;color:#fff}@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:#999}.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:#999}.navbar-inverse .navbar-link:hover{color:#fff}.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{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.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;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;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:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.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:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.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:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding: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}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right: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:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.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:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.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}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;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:#428bca;-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;transition:width .6s ease}.progress-striped .progress-bar{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: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-size:40px 40px}.progress.active .progress-bar{-webkit-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: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: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: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: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,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.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-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.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{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.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{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.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{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.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-right-radius:3px;border-top-left-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{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{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-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 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{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{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{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-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.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-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-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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.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:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@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:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;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{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right: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;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;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{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;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{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.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;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.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}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.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%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;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:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix: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-footer:before,.modal-footer:after{content:" ";display:table}.clearfix: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-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right: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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!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}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js
index a5271e0..8ae571b 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js
@@ -1,3 +1,9 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
/* ========================================================================
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.min.js
index fc51ad7..b04a0e8 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.min.js
@@ -1,6 +1,6 @@
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")),f&&this.cycle(),this)};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("collapse in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);!e&&f.toggle&&"show"==c&&(c=!c),e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(b){a(d).remove(),a(e).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown",h),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=" li:not(.divider):visible a",i=f.find("[role=menu]"+h+", [role=listbox]"+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu], [role=listbox]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());c.is("a")&&b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this,d=this.tip();this.setContent(),this.options.animation&&d.addClass("fade");var e="function"==typeof this.options.placement?this.options.placement.call(this,d[0],this.$element[0]):this.options.placement,f=/\s?auto?\s?/i,g=f.test(e);g&&(e=e.replace(f,"")||"top"),d.detach().css({top:0,left:0,display:"block"}).addClass(e),this.options.container?d.appendTo(this.options.container):d.insertAfter(this.$element);var h=this.getPosition(),i=d[0].offsetWidth,j=d[0].offsetHeight;if(g){var k=this.$element.parent(),l=e,m=document.documentElement.scrollTop||document.body.scrollTop,n="body"==this.options.container?window.innerWidth:k.outerWidth(),o="body"==this.options.container?window.innerHeight:k.outerHeight(),p="body"==this.options.container?0:k.offset().left;e="bottom"==e&&h.top+h.height+j-m>o?"top":"top"==e&&h.top-m-j<0?"bottom":"right"==e&&h.right+i>n?"left":"left"==e&&h.left-i<p?"right":e,d.removeClass(l).addClass(e)}var q=this.getCalculatedOffset(e,h,i,j);this.applyPlacement(q,e),this.hoverState=null;var r=function(){c.$element.trigger("shown.bs."+c.type)};a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,r).emulateTransitionEnd(150):r()}},b.prototype.applyPlacement=function(b,c){var d,e=this.tip(),f=e[0].offsetWidth,g=e[0].offsetHeight,h=parseInt(e.css("margin-top"),10),i=parseInt(e.css("margin-left"),10);isNaN(h)&&(h=0),isNaN(i)&&(i=0),b.top=b.top+h,b.left=b.left+i,a.offset.setOffset(e[0],a.extend({using:function(a){e.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),e.addClass("in");var j=e[0].offsetWidth,k=e[0].offsetHeight;if("top"==c&&k!=g&&(d=!0,b.top=b.top+g-k),/bottom|top/.test(c)){var l=0;b.left<0&&(l=-2*b.left,b.left=0,e.offset(b),j=e[0].offsetWidth,k=e[0].offsetHeight),this.replaceArrow(l-f+j,j,"left")}else this.replaceArrow(k-g,k,"top");d&&e.offset(b)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(a(c).is("body")?window:c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);{var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})}},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(b.RESET).addClass("affix");var a=this.$window.scrollTop(),c=this.$element.offset();return this.pinnedOffset=c.top-a},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"top"==this.affixed&&(e.top+=d),"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(b.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:c-h-this.$element.height()}))}}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap2-typeahead.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap2-typeahead.min.js
index 65cec39..1d11b34 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap2-typeahead.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap2-typeahead.min.js
@@ -17,4 +17,5 @@
* limitations under the License.
* ============================================================ */
+
!function(t){"use strict";var e=function(e,s){this.$element=t(e),this.options=t.extend({},t.fn.typeahead.defaults,s),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=t(this.options.menu),this.shown=!1,this.listen()};e.prototype={constructor:e,select:function(){var t=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(t)).change(),this.hide()},updater:function(t){return t},show:function(){var e=t.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:e.top+e.height,left:e.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(){var e;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(e=t.isFunction(this.source)?this.source(this.query,t.proxy(this.process,this)):this.source,e?this.process(e):this)},process:function(e){var s=this;return e=t.grep(e,function(t){return s.matcher(t)}),e=this.sorter(e),e.length?this.render(e.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(t){return~t.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(t){for(var e,s=[],i=[],n=[];e=t.shift();)e.toLowerCase().indexOf(this.query.toLowerCase())?~e.indexOf(this.query)?i.push(e):n.push(e):s.push(e);return s.concat(i,n)},highlighter:function(t){var e=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return t.replace(new RegExp("("+e+")","ig"),function(t,e){return"<strong>"+e+"</strong>"})},render:function(e){var s=this;return e=t(e).map(function(e,i){return e=t(s.options.item).attr("data-value",i),e.find("a").html(s.highlighter(i)),e[0]}),e.first().addClass("active"),this.$menu.html(e),this},next:function(){var e=this.$menu.find(".active").removeClass("active"),s=e.next();s.length||(s=t(this.$menu.find("li")[0])),s.addClass("active")},prev:function(){var t=this.$menu.find(".active").removeClass("active"),e=t.prev();e.length||(e=this.$menu.find("li").last()),e.addClass("active")},listen:function(){this.$element.on("focus",t.proxy(this.focus,this)).on("blur",t.proxy(this.blur,this)).on("keypress",t.proxy(this.keypress,this)).on("keyup",t.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",t.proxy(this.keydown,this)),this.$menu.on("click",t.proxy(this.click,this)).on("mouseenter","li",t.proxy(this.mouseenter,this)).on("mouseleave","li",t.proxy(this.mouseleave,this))},eventSupported:function(t){var e=t in this.$element;return e||(this.$element.setAttribute(t,"return;"),e="function"==typeof this.$element[t]),e},move:function(t){if(this.shown){switch(t.keyCode){case 9:case 13:case 27:t.preventDefault();break;case 38:t.preventDefault(),this.prev();break;case 40:t.preventDefault(),this.next()}t.stopPropagation()}},keydown:function(e){this.suppressKeyPressRepeat=~t.inArray(e.keyCode,[40,38,9,13,27]),this.move(e)},keypress:function(t){this.suppressKeyPressRepeat||this.move(t)},keyup:function(t){switch(t.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}t.stopPropagation(),t.preventDefault()},focus:function(){this.focused=!0},blur:function(){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(t){t.stopPropagation(),t.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(e){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),t(e.currentTarget).addClass("active")},mouseleave:function(){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var s=t.fn.typeahead;t.fn.typeahead=function(s){return this.each(function(){var i=t(this),n=i.data("typeahead"),h="object"==typeof s&&s;n||i.data("typeahead",n=new e(this,h)),"string"==typeof s&&n[s]()})},t.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},t.fn.typeahead.Constructor=e,t.fn.typeahead.noConflict=function(){return t.fn.typeahead=s,this},t(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(){var e=t(this);e.data("typeahead")||e.typeahead(e.data())})}(window.jQuery); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/dataTables/dataTables.bootstrap.css b/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.css
index 4279313..c80d1bf 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/dataTables/dataTables.bootstrap.css
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.css
@@ -1,4 +1,3 @@
-
div.dataTables_length label {
font-weight: normal;
text-align: left;
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/dataTables/dataTables.bootstrap.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.min.js
index f0d09b9..f0d09b9 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/dataTables/dataTables.bootstrap.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/dataTables/jquery.dataTables.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/jquery.dataTables.min.js
index 85dd817..85dd817 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/dataTables/jquery.dataTables.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/jquery.dataTables.min.js
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/js/echarts/echarts.common.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/echarts/echarts.common.min.js
new file mode 100644
index 0000000..98fff8b
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/echarts/echarts.common.min.js
@@ -0,0 +1,29 @@
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.echarts=e():t.echarts=e()}(this,function(){return function(t){function e(n){if(i[n])return i[n].exports;var r=i[n]={exports:{},id:n,loaded:!1};return t[n].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){t.exports=i(2),i(100),i(94),i(104),i(178),i(191),i(215),i(192),i(31),i(206),i(199),i(198),i(197),i(181),i(207),i(222)},function(t,e){function i(t){if(null==t||"object"!=typeof t)return t;var e=t,n=O.call(t);if("[object Array]"===n){e=[];for(var r=0,o=t.length;r<o;r++)e[r]=i(t[r])}else if(D[n])e=t.constructor.from(t);else if(!P[n]&&!T(t)){e={};for(var a in t)t.hasOwnProperty(a)&&(e[a]=i(t[a]))}return e}function n(t,e,r){if(!M(e)||!M(t))return r?i(e):t;for(var o in e)if(e.hasOwnProperty(o)){var a=t[o],s=e[o];!M(s)||!M(a)||_(s)||_(a)||T(s)||T(a)||S(s)||S(a)?!r&&o in t||(t[o]=i(e[o],!0)):n(a,s,r)}return t}function r(t,e){for(var i=t[0],r=1,o=t.length;r<o;r++)i=n(i,t[r],e);return i}function o(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function a(t,e,i){for(var n in e)e.hasOwnProperty(n)&&(i?null!=e[n]:null==t[n])&&(t[n]=e[n]);return t}function s(){return document.createElement("canvas")}function l(){return L||(L=F.createCanvas().getContext("2d")),L}function h(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var i=0,n=t.length;i<n;i++)if(t[i]===e)return i}return-1}function u(t,e){function i(){}var n=t.prototype;i.prototype=e.prototype,t.prototype=new i;for(var r in n)t.prototype[r]=n[r];t.prototype.constructor=t,t.superClass=e}function c(t,e,i){t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,a(t,e,i)}function d(t){if(t)return"string"!=typeof t&&"number"==typeof t.length}function f(t,e,i){if(t&&e)if(t.forEach&&t.forEach===E)t.forEach(e,i);else if(t.length===+t.length)for(var n=0,r=t.length;n<r;n++)e.call(i,t[n],n,t);else for(var o in t)t.hasOwnProperty(o)&&e.call(i,t[o],o,t)}function p(t,e,i){if(t&&e){if(t.map&&t.map===B)return t.map(e,i);for(var n=[],r=0,o=t.length;r<o;r++)n.push(e.call(i,t[r],r,t));return n}}function g(t,e,i,n){if(t&&e){if(t.reduce&&t.reduce===V)return t.reduce(e,i,n);for(var r=0,o=t.length;r<o;r++)i=e.call(n,i,t[r],r,t);return i}}function m(t,e,i){if(t&&e){if(t.filter&&t.filter===N)return t.filter(e,i);for(var n=[],r=0,o=t.length;r<o;r++)e.call(i,t[r],r,t)&&n.push(t[r]);return n}}function v(t,e,i){if(t&&e)for(var n=0,r=t.length;n<r;n++)if(e.call(i,t[n],n,t))return t[n]}function y(t,e){var i=R.call(arguments,2);return function(){return t.apply(e,i.concat(R.call(arguments)))}}function x(t){var e=R.call(arguments,1);return function(){return t.apply(this,e.concat(R.call(arguments)))}}function _(t){return"[object Array]"===O.call(t)}function b(t){return"function"==typeof t}function w(t){return"[object String]"===O.call(t)}function M(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function S(t){return!!P[O.call(t)]}function T(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function A(t){return t!==t}function I(t){for(var e=0,i=arguments.length;e<i;e++)if(null!=arguments[e])return arguments[e]}function C(){return Function.call.apply(R,arguments)}function k(t,e){if(!t)throw new Error(e)}var L,P={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},D={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},O=Object.prototype.toString,z=Array.prototype,E=z.forEach,N=z.filter,R=z.slice,B=z.map,V=z.reduce,F={inherits:u,mixin:c,clone:i,merge:n,mergeAll:r,extend:o,defaults:a,getContext:l,createCanvas:s,indexOf:h,slice:C,find:v,isArrayLike:d,each:f,map:p,reduce:g,filter:m,bind:y,curry:x,isArray:_,isString:w,isObject:M,isFunction:b,isBuildInObject:S,isDom:T,eqNaN:A,retrieve:I,assert:k,noop:function(){}};t.exports=F},function(t,e,i){function n(t){return function(e,i,n){e=e&&e.toLowerCase(),R.prototype[t].call(this,e,i,n)}}function r(){R.call(this)}function o(t,e,i){function n(t,e){return t.prio-e.prio}i=i||{},"string"==typeof e&&(e=at[e]),this.id,this.group,this._dom=t;var o=this._zr=z.init(t,{renderer:i.renderer||"canvas",devicePixelRatio:i.devicePixelRatio,width:i.width,height:i.height});this._throttledZrFlush=O.throttle(E.bind(o.flush,o),17),this._theme=E.clone(e),this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._api=new S(this),this._coordSysMgr=new T,R.call(this),this._messageCenter=new r,this._initEvents(),this.resize=E.bind(this.resize,this),this._pendingActions=[],B(ot,n),B(nt,n),o.animation.on("frame",this._onframe,this)}function a(t,e,i){var n,r=this._model,o=this._coordSysMgr.getCoordinateSystems();e=D.parseFinder(r,e);for(var a=0;a<o.length;a++){var s=o[a];if(s[t]&&null!=(n=s[t](r,e,i)))return n}}function s(t,e,i,n,r){var o=t._model,a={};a[n+"Id"]=i[n+"Id"],a[n+"Index"]=i[n+"Index"],a[n+"Name"]=i[n+"Name"];var s={mainType:n,query:a};r&&(s.subType=r),o&&o.eachComponent(s,function(r,a){var s=t["series"===n?"_chartsMap":"_componentsMap"][r.__viewId];s&&s.__alive&&s[e](r,o,t._api,i)},t)}function l(t,e){var i=t.type,n=et[i],r=n.actionInfo,o=(r.update||"update").split(":"),a=o.pop();o=o[0]&&F(o[0]),this[X]=!0;var l=[t],h=!1;t.batch&&(h=!0,l=E.map(t.batch,function(e){return e=E.defaults(E.extend({},e),t),e.batch=null,e}));for(var u,c=[],d="highlight"===i||"downplay"===i,f=0;f<l.length;f++){var p=l[f];u=n.action(p,this._model),u=u||E.extend({},p),u.type=r.event||u.type,c.push(u),d?s(this,a,p,"series"):o&&s(this,a,p,o.main,o.sub)}"none"===a||d||o||(this[$]?(J.prepareAndUpdate.call(this,t),this[$]=!1):J[a].call(this,t)),u=h?{type:r.event||i,batch:c}:c[0],this[X]=!1,!e&&this._messageCenter.trigger(u.type,u)}function h(t){for(var e=this._pendingActions;e.length;){var i=e.shift();l.call(this,i,t)}}function u(t){!t&&this.trigger("updated")}function c(t,e,i){var n=this._api;V(this._componentsViews,function(r){var o=r.__model;r[t](o,e,n,i),_(o,r)},this),e.eachSeries(function(r,o){var a=this._chartsMap[r.__viewId];a[t](r,e,n,i),_(r,a),x(r,a)},this),y(this._zr,e)}function d(t,e){for(var i="component"===t,n=i?this._componentsViews:this._chartsViews,r=i?this._componentsMap:this._chartsMap,o=this._zr,a=0;a<n.length;a++)n[a].__alive=!1;e[i?"eachComponent":"eachSeries"](function(t,a){if(i){if("series"===t)return}else a=t;var s=a.id+"_"+a.type,l=r[s];if(!l){var h=F(a.type),u=i?k.getClass(h.main,h.sub):L.getClass(h.sub);if(!u)return;l=new u,l.init(e,this._api),r[s]=l,n.push(l),o.add(l.group)}a.__viewId=s,l.__alive=!0,l.__id=s,l.__model=a},this);for(var a=0;a<n.length;){var s=n[a];s.__alive?a++:(o.remove(s.group),s.dispose(e,this._api),n.splice(a,1),delete r[s.__id])}}function f(t,e){V(nt,function(i){i.func(t,e)})}function p(t){var e={};t.eachSeries(function(t){var i=t.get("stack"),n=t.getData();if(i&&"list"===n.type){var r=e[i];r&&(n.stackedOn=r),e[i]=n}})}function g(t,e){var i=this._api;V(ot,function(n){n.isLayout&&n.func(t,i,e)})}function m(t,e,i){var n=this._api;t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()}),V(ot,function(r){(!i||!r.isLayout)&&r.func(t,n,e)})}function v(t,e){var i=this._api;V(this._componentsViews,function(n){var r=n.__model;n.render(r,t,i,e),_(r,n)},this),V(this._chartsViews,function(t){t.__alive=!1},this),t.eachSeries(function(n,r){var o=this._chartsMap[n.__viewId];o.__alive=!0,o.render(n,t,i,e),o.group.silent=!!n.get("silent"),_(n,o),x(n,o)},this),y(this._zr,t),V(this._chartsViews,function(e){e.__alive||e.remove(t,i)},this)}function y(t,e){var i=t.storage,n=0;i.traverse(function(t){t.isGroup||n++}),n>e.get("hoverLayerThreshold")&&!w.node&&i.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function x(t,e){var i=0;e.group.traverse(function(t){"group"===t.type||t.ignore||i++});var n=+t.get("progressive"),r=i>t.get("progressiveThreshold")&&n&&!w.node;r&&e.group.traverse(function(t){t.isGroup||(t.progressive=r?Math.floor(i++/n):-1,r&&t.stopAnimation(!0))});var o=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.setStyle("blend",o)})}function _(t,e){var i=t.get("z"),n=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=n&&(t.zlevel=n))})}function b(t){function e(t,e){for(var i=0;i<t.length;i++){var n=t[i];n[o]=e}}var i=0,n=1,r=2,o="__connectUpdateStatus";E.each(it,function(a,s){t._messageCenter.on(s,function(a){if(ht[t.group]&&t[o]!==i){var s=t.makeActionFromEvent(a),l=[];E.each(lt,function(e){e!==t&&e.group===t.group&&l.push(e)}),e(l,i),V(l,function(t){t[o]!==n&&t.dispatchAction(s)}),e(l,r)}})})}/*!
+ * ECharts, a javascript interactive chart library.
+ *
+ * Copyright (c) 2015, Baidu Inc.
+ * All rights reserved.
+ *
+ * LICENSE
+ * https://github.com/ecomfe/echarts/blob/master/LICENSE.txt
+ */
+var w=i(10),M=i(125),S=i(93),T=i(23),A=i(126),I=i(13),C=i(16),k=i(59),L=i(28),P=i(3),D=i(6),O=i(47),z=i(78),E=i(1),N=i(19),R=i(21),B=i(46),V=E.each,F=I.parseClassType,G=1e3,H=5e3,W=1e3,Z=2e3,q=3e3,j=4e3,U=5e3,X="__flagInMainProcess",Y="__hasGradientOrPatternBg",$="__optionUpdated",Q=/^[a-zA-Z0-9_]+$/;r.prototype.on=n("on"),r.prototype.off=n("off"),r.prototype.one=n("one"),E.mixin(r,R);var K=o.prototype;K._onframe=function(){if(this[$]){var t=this[$].silent;this[X]=!0,J.prepareAndUpdate.call(this),this[X]=!1,this[$]=!1,h.call(this,t),u.call(this,t)}},K.getDom=function(){return this._dom},K.getZr=function(){return this._zr},K.setOption=function(t,e,i){var n;if(E.isObject(e)&&(i=e.lazyUpdate,n=e.silent,e=e.notMerge),this[X]=!0,!this._model||e){var r=new A(this._api),o=this._theme,a=this._model=new M(null,null,o,r);a.init(null,null,o,r)}this.__lastOnlyGraphic=!(!t||!t.graphic),E.each(t,function(t,e){"graphic"!==e&&(this.__lastOnlyGraphic=!1)},this),this._model.setOption(t,rt),i?(this[$]={silent:n},this[X]=!1):(J.prepareAndUpdate.call(this),this._zr.flush(),this[$]=!1,this[X]=!1,h.call(this,n),u.call(this,n))},K.setTheme=function(){console.log("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},K.getModel=function(){return this._model},K.getOption=function(){return this._model&&this._model.getOption()},K.getWidth=function(){return this._zr.getWidth()},K.getHeight=function(){return this._zr.getHeight()},K.getRenderedCanvas=function(t){if(w.canvasSupported){t=t||{},t.pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor");var e=this._zr,i=e.storage.getDisplayList();return E.each(i,function(t){t.stopAnimation(!0)}),e.painter.getRenderedCanvas(t)}},K.getDataURL=function(t){t=t||{};var e=t.excludeComponents,i=this._model,n=[],r=this;V(e,function(t){i.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(n.push(e),e.group.ignore=!0)})});var o=this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return V(n,function(t){t.group.ignore=!1}),o},K.getConnectedDataURL=function(t){if(w.canvasSupported){var e=this.group,i=Math.min,n=Math.max,r=1/0;if(ht[e]){var o=r,a=r,s=-r,l=-r,h=[],u=t&&t.pixelRatio||1;E.each(lt,function(r,u){if(r.group===e){var c=r.getRenderedCanvas(E.clone(t)),d=r.getDom().getBoundingClientRect();o=i(d.left,o),a=i(d.top,a),s=n(d.right,s),l=n(d.bottom,l),h.push({dom:c,left:d.left,top:d.top})}}),o*=u,a*=u,s*=u,l*=u;var c=s-o,d=l-a,f=E.createCanvas();f.width=c,f.height=d;var p=z.init(f);return V(h,function(t){var e=new P.Image({style:{x:t.left*u-o,y:t.top*u-a,image:t.dom}});p.add(e)}),p.refreshImmediately(),f.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},K.convertToPixel=E.curry(a,"convertToPixel"),K.convertFromPixel=E.curry(a,"convertFromPixel"),K.containPixel=function(t,e){var i,n=this._model;return t=D.parseFinder(n,t),E.each(t,function(t,n){n.indexOf("Models")>=0&&E.each(t,function(t){var r=t.coordinateSystem;if(r&&r.containPoint)i|=!!r.containPoint(e);else if("seriesModels"===n){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(i|=o.containPoint(e,t))}},this)},this),!!i},K.getVisual=function(t,e){var i=this._model;t=D.parseFinder(i,t,{defaultMainType:"series"});var n=t.seriesModel,r=n.getData(),o=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?r.indexOfRawIndex(t.dataIndex):null;return null!=o?r.getItemVisual(o,e):r.getVisual(e)};var J={update:function(t){var e=this._model,i=this._api,n=this._coordSysMgr,r=this._zr;if(e){e.restoreData(),n.create(this._model,this._api),f.call(this,e,i),p.call(this,e),n.update(e,i),m.call(this,e,t),v.call(this,e,t);var o=e.get("backgroundColor")||"transparent",a=r.painter;if(a.isSingleCanvas&&a.isSingleCanvas())r.configLayer(0,{clearColor:o});else{if(!w.canvasSupported){var s=N.parse(o);o=N.stringify(s,"rgb"),0===s[3]&&(o="transparent")}o.colorStops||o.image?(r.configLayer(0,{clearColor:o}),this[Y]=!0,this._dom.style.background="transparent"):(this[Y]&&r.configLayer(0,{clearColor:null}),this[Y]=!1,this._dom.style.background=o)}}},updateView:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),m.call(this,e,t),c.call(this,"updateView",e,t))},updateVisual:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),m.call(this,e,t,!0),c.call(this,"updateVisual",e,t))},updateLayout:function(t){var e=this._model;e&&(g.call(this,e,t),c.call(this,"updateLayout",e,t))},prepareAndUpdate:function(t){var e=this._model;d.call(this,"component",e),d.call(this,"chart",e),this.__lastOnlyGraphic?(V(this._componentsViews,function(i){var n=i.__model;n&&"graphic"===n.mainType&&(i.render(n,e,this._api,t),_(n,i))},this),this.__lastOnlyGraphic=!1):J.update.call(this,t)}};K.resize=function(t){this[X]=!0,this._zr.resize(t);var e=this._model&&this._model.resetOption("media"),i=e?"prepareAndUpdate":"update";J[i].call(this),this._loadingFX&&this._loadingFX.resize(),this[X]=!1;var n=t&&t.silent;h.call(this,n),u.call(this,n)},K.showLoading=function(t,e){if(E.isObject(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),st[t]){var i=st[t](this._api,e),n=this._zr;this._loadingFX=i,n.add(i)}},K.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},K.makeActionFromEvent=function(t){var e=E.extend({},t);return e.type=it[t.type],e},K.dispatchAction=function(t,e){if(E.isObject(e)||(e={silent:!!e}),et[t.type]){if(this[X])return void this._pendingActions.push(t);l.call(this,t,e.silent),e.flush?this._zr.flush(!0):e.flush!==!1&&w.browser.weChat&&this._throttledZrFlush(),h.call(this,e.silent),u.call(this,e.silent)}},K.on=n("on"),K.off=n("off"),K.one=n("one");var tt=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];K._initEvents=function(){V(tt,function(t){this._zr.on(t,function(e){var i,n=this.getModel(),r=e.target;if("globalout"===t)i={};else if(r&&null!=r.dataIndex){var o=r.dataModel||n.getSeriesByIndex(r.seriesIndex);i=o&&o.getDataParams(r.dataIndex,r.dataType)||{}}else r&&r.eventData&&(i=E.extend({},r.eventData));i&&(i.event=e,i.type=t,this.trigger(t,i))},this)},this),V(it,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},K.isDisposed=function(){return this._disposed},K.clear=function(){this.setOption({series:[]},!0)},K.dispose=function(){if(!this._disposed){this._disposed=!0;var t=this._api,e=this._model;V(this._componentsViews,function(i){i.dispose(e,t)}),V(this._chartsViews,function(i){i.dispose(e,t)}),this._zr.dispose(),delete lt[this.id]}},E.mixin(o,R);var et=[],it={},nt=[],rt=[],ot=[],at={},st={},lt={},ht={},ut=new Date-0,ct=new Date-0,dt="_echarts_instance_",ft={version:"3.4.0",dependencies:{zrender:"3.3.0"}};ft.init=function(t,e,i){var n=new o(t,e,i);return n.id="ec_"+ut++,lt[n.id]=n,t.setAttribute&&t.setAttribute(dt,n.id),b(n),n},ft.connect=function(t){if(E.isArray(t)){var e=t;t=null,E.each(e,function(e){null!=e.group&&(t=e.group)}),t=t||"g_"+ct++,E.each(e,function(e){e.group=t})}return ht[t]=!0,t},ft.disConnect=function(t){ht[t]=!1},ft.dispose=function(t){E.isDom(t)?t=ft.getInstanceByDom(t):"string"==typeof t&&(t=lt[t]),t instanceof o&&!t.isDisposed()&&t.dispose()},ft.getInstanceByDom=function(t){var e=t.getAttribute(dt);return lt[e]},ft.getInstanceById=function(t){return lt[t]},ft.registerTheme=function(t,e){at[t]=e},ft.registerPreprocessor=function(t){rt.push(t)},ft.registerProcessor=function(t,e){"function"==typeof t&&(e=t,t=G),nt.push({prio:t,func:e})},ft.registerAction=function(t,e,i){"function"==typeof e&&(i=e,e="");var n=E.isObject(t)?t.type:[t,t={event:e}][0];t.event=(t.event||n).toLowerCase(),e=t.event,E.assert(Q.test(n)&&Q.test(e)),et[n]||(et[n]={action:i,actionInfo:t}),it[e]=n},ft.registerCoordinateSystem=function(t,e){T.register(t,e)},ft.registerLayout=function(t,e){"function"==typeof t&&(e=t,t=W),ot.push({prio:t,func:e,isLayout:!0})},ft.registerVisual=function(t,e){"function"==typeof t&&(e=t,t=q),ot.push({prio:t,func:e})},ft.registerLoading=function(t,e){st[t]=e},ft.extendComponentModel=function(t){return I.extend(t)},ft.extendComponentView=function(t){return k.extend(t)},ft.extendSeriesModel=function(t){return C.extend(t)},ft.extendChartView=function(t){return L.extend(t)},ft.setCanvasCreator=function(t){E.createCanvas=t},ft.registerVisual(Z,i(139)),ft.registerPreprocessor(i(133)),ft.registerLoading("default",i(124)),ft.registerAction({type:"highlight",event:"highlight",update:"highlight"},E.noop),ft.registerAction({type:"downplay",event:"downplay",update:"downplay"},E.noop),ft.List=i(14),ft.Model=i(11),ft.graphic=i(3),ft.number=i(4),ft.format=i(8),ft.throttle=O.throttle,ft.matrix=i(20),ft.vector=i(5),ft.color=i(19),ft.util={},V(["map","each","filter","indexOf","inherits","reduce","filter","bind","curry","isArray","isString","isObject","isFunction","extend","defaults","clone"],function(t){ft.util[t]=E[t]}),ft.PRIORITY={PROCESSOR:{FILTER:G,STATISTIC:H},VISUAL:{LAYOUT:W,GLOBAL:Z,CHART:q,COMPONENT:j,BRUSH:U}},t.exports=ft},function(t,e,i){"use strict";function n(t){return null!=t&&"none"!=t}function r(t){return"string"==typeof t?_.lift(t,-.1):t}function o(t){if(t.__hoverStlDirty){var e=t.style.stroke,i=t.style.fill,o=t.__hoverStl;o.fill=o.fill||(n(i)?r(i):null),o.stroke=o.stroke||(n(e)?r(e):null);var a={};for(var s in o)o.hasOwnProperty(s)&&(a[s]=t.style[s]);t.__normalStl=a,t.__hoverStlDirty=!1}}function a(t){t.__isHover||(o(t),t.useHoverLayer?t.__zr&&t.__zr.addHover(t,t.__hoverStl):(t.setStyle(t.__hoverStl),t.z2+=1),t.__isHover=!0)}function s(t){if(t.__isHover){var e=t.__normalStl;t.useHoverLayer?t.__zr&&t.__zr.removeHover(t):(e&&t.setStyle(e),t.z2-=1),t.__isHover=!1}}function l(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&a(t)}):a(t)}function h(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&s(t)}):s(t)}function u(t,e){t.__hoverStl=t.hoverStyle||e||{},t.__hoverStlDirty=!0,t.__isHover&&o(t)}function c(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&l(this)}function d(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&h(this)}function f(){this.__isEmphasis=!0,l(this)}function p(){this.__isEmphasis=!1,h(this)}function g(t,e,i,n,r,o){"function"==typeof r&&(o=r,r=null);var a=n&&n.isAnimationEnabled();if(a){var s=t?"Update":"",l=n.getShallow("animationDuration"+s),h=n.getShallow("animationEasing"+s),u=n.getShallow("animationDelay"+s);"function"==typeof u&&(u=u(r,n.getAnimationDelayParams?n.getAnimationDelayParams(e,r):null)),"function"==typeof l&&(l=l(r)),l>0?e.animateTo(i,l,u||0,h,o):(e.attr(i),o&&o())}else e.attr(i),o&&o()}var m=i(1),v=i(169),y=Math.round,x=i(7),_=i(19),b=i(20),w=i(5),M={};M.Group=i(34),M.Image=i(49),M.Text=i(76),M.Circle=i(160),M.Sector=i(166),M.Ring=i(165),M.Polygon=i(162),M.Polyline=i(163),M.Rect=i(164),M.Line=i(161),M.BezierCurve=i(159),M.Arc=i(158),M.CompoundPath=i(153),M.LinearGradient=i(91),M.RadialGradient=i(154),M.BoundingRect=i(9),M.extendShape=function(t){return x.extend(t)},M.extendPath=function(t,e){return v.extendFromString(t,e)},M.makePath=function(t,e,i,n){var r=v.createFromString(t,e),o=r.getBoundingRect();if(i){var a=o.width/o.height;if("center"===n){var s,l=i.height*a;l<=i.width?s=i.height:(l=i.width,s=l/a);var h=i.x+i.width/2,u=i.y+i.height/2;i.x=h-l/2,i.y=u-s/2,i.width=l,i.height=s}M.resizePath(r,i)}return r},M.mergePath=v.mergePath,M.resizePath=function(t,e){if(t.applyTransform){var i=t.getBoundingRect(),n=i.calculateTransform(e);t.applyTransform(n)}},M.subPixelOptimizeLine=function(t){var e=M.subPixelOptimize,i=t.shape,n=t.style.lineWidth;return y(2*i.x1)===y(2*i.x2)&&(i.x1=i.x2=e(i.x1,n,!0)),y(2*i.y1)===y(2*i.y2)&&(i.y1=i.y2=e(i.y1,n,!0)),t},M.subPixelOptimizeRect=function(t){var e=M.subPixelOptimize,i=t.shape,n=t.style.lineWidth,r=i.x,o=i.y,a=i.width,s=i.height;return i.x=e(i.x,n,!0),i.y=e(i.y,n,!0),i.width=Math.max(e(r+a,n,!1)-i.x,0===a?0:1),i.height=Math.max(e(o+s,n,!1)-i.y,0===s?0:1),t},M.subPixelOptimize=function(t,e,i){var n=y(2*t);return(n+y(e))%2===0?n/2:(n+(i?1:-1))/2},M.setHoverStyle=function(t,e,i){t.__hoverSilentOnTouch=i&&i.hoverSilentOnTouch,"group"===t.type?t.traverse(function(t){"group"!==t.type&&u(t,e)}):u(t,e),t.on("mouseover",c).on("mouseout",d),t.on("emphasis",f).on("normal",p)},M.setText=function(t,e,i){var n=e.getShallow("position")||"inside",r=e.getShallow("offset"),o=n.indexOf("inside")>=0?"white":i,a=e.getModel("textStyle");m.extend(t,{textDistance:e.getShallow("distance")||5,textFont:a.getFont(),textPosition:n,textOffset:r,textFill:a.getTextColor()||o})},M.updateProps=function(t,e,i,n,r){g(!0,t,e,i,n,r)},M.initProps=function(t,e,i,n,r){g(!1,t,e,i,n,r)},M.getTransform=function(t,e){for(var i=b.identity([]);t&&t!==e;)b.mul(i,t.getLocalTransform(),i),t=t.parent;return i},M.applyTransform=function(t,e,i){return i&&(e=b.invert([],e)),w.applyTransform([],t,e)},M.transformDirection=function(t,e,i){var n=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),o=["left"===t?-n:"right"===t?n:0,"top"===t?-r:"bottom"===t?r:0];return o=M.applyTransform(o,e,i),Math.abs(o[0])>Math.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"},M.groupTransition=function(t,e,i,n){function r(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}function o(t){var e={position:w.clone(t.position),rotation:t.rotation};return t.shape&&(e.shape=m.extend({},t.shape)),e}if(t&&e){var a=r(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=a[t.anid];if(e){var n=o(t);t.attr(o(e)),M.updateProps(t,n,i,t.dataIndex)}}})}},t.exports=M},function(t,e){function i(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}var n={},r=1e-4;n.linearMap=function(t,e,i,n){var r=e[1]-e[0],o=i[1]-i[0];if(0===r)return 0===o?i[0]:(i[0]+i[1])/2;if(n)if(r>0){if(t<=e[0])return i[0];if(t>=e[1])return i[1]}else{if(t>=e[0])return i[0];if(t<=e[1])return i[1]}else{if(t===e[0])return i[0];if(t===e[1])return i[1]}return(t-e[0])/r*o+i[0]},n.parsePercent=function(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?i(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t},n.round=function(t,e){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),+(+t).toFixed(e)},n.asc=function(t){return t.sort(function(t,e){return t-e}),t},n.getPrecision=function(t){if(t=+t,isNaN(t))return 0;for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i},n.getPrecisionSafe=function(t){var e=t.toString(),i=e.indexOf(".");return i<0?0:e.length-1-i},n.getPixelPrecision=function(t,e){var i=Math.log,n=Math.LN10,r=Math.floor(i(t[1]-t[0])/n),o=Math.round(i(Math.abs(e[1]-e[0]))/n),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20},n.MAX_SAFE_INTEGER=9007199254740991,n.remRadian=function(t){var e=2*Math.PI;return(t%e+e)%e},n.isRadianAroundZero=function(t){return t>-r&&t<r},n.parseDate=function(t){if(t instanceof Date)return t;if("string"==typeof t){var e=new Date(t);return isNaN(+e)&&(e=new Date(new Date(t.replace(/-/g,"/"))-new Date("1970/01/01"))),e}return new Date(Math.round(t))},n.quantity=function(t){return Math.pow(10,Math.floor(Math.log(t)/Math.LN10))},n.nice=function(t,e){var i,r=n.quantity(t),o=t/r;return i=e?o<1.5?1:o<2.5?2:o<4?3:o<7?5:10:o<1?1:o<2?2:o<3?3:o<5?5:10,i*r},n.reformIntervals=function(t){function e(t,i,n){return t.interval[n]<i.interval[n]||t.interval[n]===i.interval[n]&&(t.close[n]-i.close[n]===(n?-1:1)||!n&&e(t,i,1))}t.sort(function(t,i){return e(t,i,0)?-1:1});for(var i=-(1/0),n=1,r=0;r<t.length;){for(var o=t[r].interval,a=t[r].close,s=0;s<2;s++)o[s]<=i&&(o[s]=i,a[s]=s?1:1-n),i=o[s],n=a[s];o[0]===o[1]&&a[0]*a[1]!==1?t.splice(r,1):r++}return t},n.isNumeric=function(t){return t-parseFloat(t)>=0},t.exports=n},function(t,e){var i="undefined"==typeof Float32Array?Array:Float32Array,n={create:function(t,e){var n=new i(2);return null==t&&(t=0),null==e&&(e=0),n[0]=t,n[1]=e,n},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:function(t){var e=new i(2);return e[0]=t[0],e[1]=t[1],e},set:function(t,e,i){return t[0]=e,t[1]=i,t},add:function(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t},scaleAndAdd:function(t,e,i,n){return t[0]=e[0]+i[0]*n,t[1]=e[1]+i[1]*n,t},sub:function(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t},len:function(t){return Math.sqrt(this.lenSquare(t))},lenSquare:function(t){return t[0]*t[0]+t[1]*t[1]},mul:function(t,e,i){return t[0]=e[0]*i[0],t[1]=e[1]*i[1],t},div:function(t,e,i){return t[0]=e[0]/i[0],t[1]=e[1]/i[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:function(t,e,i){return t[0]=e[0]*i,t[1]=e[1]*i,t},normalize:function(t,e){var i=n.len(e);return 0===i?(t[0]=0,t[1]=0):(t[0]=e[0]/i,t[1]=e[1]/i),t},distance:function(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))},distanceSquare:function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])},negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,i,n){return t[0]=e[0]+n*(i[0]-e[0]),t[1]=e[1]+n*(i[1]-e[1]),t},applyTransform:function(t,e,i){var n=e[0],r=e[1];return t[0]=i[0]*n+i[2]*r+i[4],t[1]=i[1]*n+i[3]*r+i[5],t},min:function(t,e,i){return t[0]=Math.min(e[0],i[0]),t[1]=Math.min(e[1],i[1]),t},max:function(t,e,i){return t[0]=Math.max(e[0],i[0]),t[1]=Math.max(e[1],i[1]),t}};n.length=n.len,n.lengthSquare=n.lenSquare,n.dist=n.distance,n.distSquare=n.distanceSquare,t.exports=n},function(t,e,i){function n(t,e){return t&&t.hasOwnProperty(e)}var r=i(8),o=i(4),a=i(11),s=i(1),l=s.each,h=s.isObject,u={};u.normalizeToArray=function(t){return t instanceof Array?t:null==t?[]:[t]},u.defaultEmphasis=function(t,e){if(t){var i=t.emphasis=t.emphasis||{},n=t.normal=t.normal||{};l(e,function(t){var e=s.retrieve(i[t],n[t]);null!=e&&(i[t]=e)})}},u.LABEL_OPTIONS=["position","offset","show","textStyle","distance","formatter"],u.getDataItemValue=function(t){return t&&(null==t.value?t:t.value)},u.isDataItemOption=function(t){return h(t)&&!(t instanceof Array)},u.converDataValue=function(t,e){var i=e&&e.type;return"ordinal"===i?t:("time"!==i||isFinite(t)||null==t||"-"===t||(t=+o.parseDate(t)),null==t||""===t?NaN:+t)},u.createDataFormatModel=function(t,e){var i=new a;return s.mixin(i,u.dataFormatMixin),i.seriesIndex=e.seriesIndex,i.name=e.name||"",i.mainType=e.mainType,i.subType=e.subType,i.getData=function(){return t},i},u.dataFormatMixin={getDataParams:function(t,e){var i=this.getData(e),n=this.seriesIndex,r=this.name,o=this.getRawValue(t,e),a=i.getRawIndex(t),s=i.getName(t,!0),l=i.getRawDataItem(t);return{componentType:this.mainType,componentSubType:this.subType,seriesType:"series"===this.mainType?this.subType:null,seriesIndex:n,seriesName:r,name:s,dataIndex:a,data:l,dataType:e,value:o,color:i.getItemVisual(t,"color"),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,i,n){e=e||"normal";var o=this.getData(i),a=o.getItemModel(t),s=this.getDataParams(t,i);null!=n&&s.value instanceof Array&&(s.value=s.value[n]);var l=a.get(["label",e,"formatter"]);return"function"==typeof l?(s.status=e,l(s)):"string"==typeof l?r.formatTpl(l,s):void 0},getRawValue:function(t,e){var i=this.getData(e),n=i.getRawDataItem(t);if(null!=n)return!h(n)||n instanceof Array?n:n.value},formatTooltip:s.noop},u.mappingToExists=function(t,e){e=(e||[]).slice();var i=s.map(t||[],function(t,e){return{exist:t}});return l(e,function(t,n){if(h(t)){for(var r=0;r<i.length;r++)if(!i[r].option&&null!=t.id&&i[r].exist.id===t.id+"")return i[r].option=t,void(e[n]=null);for(var r=0;r<i.length;r++){var o=i[r].exist;if(!(i[r].option||null!=o.id&&null!=t.id||null==t.name||u.isIdInner(t)||u.isIdInner(o)||o.name!==t.name+""))return i[r].option=t,void(e[n]=null)}}}),l(e,function(t,e){if(h(t)){for(var n=0;n<i.length;n++){var r=i[n].exist;if(!i[n].option&&!u.isIdInner(r)&&null==t.id){i[n].option=t;break}}n>=i.length&&i.push({option:t})}}),i},u.makeIdAndName=function(t){var e={};l(t,function(t,i){var n=t.exist;n&&(e[n.id]=t)}),l(t,function(t,i){var n=t.option;s.assert(!n||null==n.id||!e[n.id]||e[n.id]===t,"id duplicates: "+(n&&n.id)),n&&null!=n.id&&(e[n.id]=t),!t.keyInfo&&(t.keyInfo={})}),l(t,function(t,i){var n=t.exist,r=t.option,o=t.keyInfo;if(h(r)){if(o.name=null!=r.name?r.name+"":n?n.name:"\0-",n)o.id=n.id;else if(null!=r.id)o.id=r.id+"";else{var a=0;do o.id="\0"+o.name+"\0"+a++;while(e[o.id])}e[o.id]=t}})},u.isIdInner=function(t){return h(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")},u.compressBatches=function(t,e){function i(t,e,i){for(var n=0,r=t.length;n<r;n++)for(var o=t[n].seriesId,a=u.normalizeToArray(t[n].dataIndex),s=i&&i[o],l=0,h=a.length;l<h;l++){var c=a[l];s&&s[c]?s[c]=null:(e[o]||(e[o]={}))[c]=1}}function n(t,e){var i=[];for(var r in t)if(t.hasOwnProperty(r)&&null!=t[r])if(e)i.push(+r);else{var o=n(t[r],!0);o.length&&i.push({seriesId:r,dataIndex:o})}return i}var r={},o={};return i(t||[],r),i(e||[],o,r),[n(r),n(o)]},u.queryDataIndex=function(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?s.isArray(e.dataIndex)?s.map(e.dataIndex,function(e){return t.indexOfRawIndex(e)}):t.indexOfRawIndex(e.dataIndex):null!=e.name?s.isArray(e.name)?s.map(e.name,function(e){return t.indexOfName(e)}):t.indexOfName(e.name):void 0},u.parseFinder=function(t,e,i){if(s.isString(e)){var r={};r[e+"Index"]=0,e=r}var o=i&&i.defaultMainType;!o||n(e,o+"Index")||n(e,o+"Id")||n(e,o+"Name")||(e[o+"Index"]=0);var a={};return l(e,function(i,n){var i=e[n];if("dataIndex"===n||"dataIndexInside"===n)return void(a[n]=i);var r=n.match(/^(\w+)(Index|Id|Name)$/)||[],o=r[1],s=r[2];if(o&&s){var l={mainType:o};l[s.toLowerCase()]=i;var h=t.queryComponents(l);a[o+"Models"]=h,a[o+"Model"]=h[0]}}),a},t.exports=u},function(t,e,i){function n(t){r.call(this,t),this.path=new a}var r=i(36),o=i(1),a=i(29),s=i(149),l=i(65),h=l.prototype.getCanvasPattern,u=Math.abs;n.prototype={constructor:n,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var i=this.style,n=this.path,r=i.hasStroke(),o=i.hasFill(),a=i.fill,s=i.stroke,l=o&&!!a.colorStops,u=r&&!!s.colorStops,c=o&&!!a.image,d=r&&!!s.image;if(i.bind(t,this,e),this.setTransform(t),this.__dirty){var f=this.getBoundingRect();l&&(this._fillGradient=i.getGradient(t,a,f)),u&&(this._strokeGradient=i.getGradient(t,s,f))}l?t.fillStyle=this._fillGradient:c&&(t.fillStyle=h.call(a,t)),u?t.strokeStyle=this._strokeGradient:d&&(t.strokeStyle=h.call(s,t));var p=i.lineDash,g=i.lineDashOffset,m=!!t.setLineDash,v=this.getGlobalScale();n.setScale(v[0],v[1]),this.__dirtyPath||p&&!m&&r?(n=this.path.beginPath(t),p&&!m&&(n.setLineDash(p),n.setLineDashOffset(g)),this.buildPath(n,this.shape,!1),this.__dirtyPath=!1):(t.beginPath(),this.path.rebuildPath(t)),o&&n.fill(t),p&&m&&(t.setLineDash(p),t.lineDashOffset=g),r&&n.stroke(t),p&&m&&t.setLineDash([]),this.restoreTransform(t),null!=i.text&&this.drawRectText(t,this.getBoundingRect())},buildPath:function(t,e,i){},getBoundingRect:function(){var t=this._rect,e=this.style,i=!t;if(i){var n=this.path;this.__dirtyPath&&(n.beginPath(),this.buildPath(n,this.shape,!1)),t=n.getBoundingRect()}if(this._rect=t,e.hasStroke()){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||i){r.copy(t);var o=e.lineWidth,a=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(o=Math.max(o,this.strokeContainThreshold||4)),a>1e-10&&(r.width+=o/a,r.height+=o/a,r.x-=o/a/2,r.y-=o/a/2)}return r}return t},contain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this.getBoundingRect(),r=this.style;if(t=i[0],e=i[1],n.contain(t,e)){var o=this.path.data;if(r.hasStroke()){var a=r.lineWidth,l=r.strokeNoScale?this.getLineScale():1;if(l>1e-10&&(r.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),s.containStroke(o,a/l,t,e)))return!0}if(r.hasFill())return s.contain(o,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):r.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var i=this.shape;if(i){if(o.isObject(t))for(var n in t)t.hasOwnProperty(n)&&(i[n]=t[n]);else i[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&u(t[0]-1)>1e-10&&u(t[3]-1)>1e-10?Math.sqrt(u(t[0]*t[3]-t[2]*t[1])):1}},n.extend=function(t){var e=function(e){n.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var i=t.shape;if(i){this.shape=this.shape||{};var r=this.shape;for(var o in i)!r.hasOwnProperty(o)&&i.hasOwnProperty(o)&&(r[o]=i[o])}t.init&&t.init.call(this,e)};o.inherits(e,n);for(var i in t)"style"!==i&&"shape"!==i&&(e.prototype[i]=t[i]);return e},o.inherits(n,r),t.exports=n},function(t,e,i){var n=i(1),r=i(4),o=i(17),a={};a.addCommas=function(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))},a.toCamelCase=function(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t},a.normalizeCssArray=function(t){var e=t.length;return"number"==typeof t?[t,t,t,t]:2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t};var s=a.encodeHTML=function(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")},l=["a","b","c","d","e","f","g"],h=function(t,e){return"{"+t+(null==e?"":e)+"}"};a.formatTpl=function(t,e,i){n.isArray(e)||(e=[e]);var r=e.length;if(!r)return"";for(var o=e[0].$vars||[],a=0;a<o.length;a++){var u=l[a],c=h(u,0);t=t.replace(h(u),i?s(c):c)}for(var d=0;d<r;d++)for(var f=0;f<o.length;f++){var c=e[d][o[f]];t=t.replace(h(l[f],d),i?s(c):c)}return t};var u=function(t){return t<10?"0"+t:t};a.formatTime=function(t,e){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=r.parseDate(e),n=i.getFullYear(),o=i.getMonth()+1,a=i.getDate(),s=i.getHours(),l=i.getMinutes(),h=i.getSeconds();return t=t.replace("MM",u(o)).toLowerCase().replace("yyyy",n).replace("yy",n%100).replace("dd",u(a)).replace("d",a).replace("hh",u(s)).replace("h",s).replace("mm",u(l)).replace("m",l).replace("ss",u(h)).replace("s",h)},a.capitalFirst=function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},a.truncateText=o.truncateText,t.exports=a},function(t,e,i){"use strict";function n(t,e,i,n){i<0&&(t+=i,i=-i),n<0&&(e+=n,n=-n),this.x=t,this.y=e,this.width=i,this.height=n}var r=i(5),o=i(20),a=r.applyTransform,s=Math.min,l=Math.max;n.prototype={constructor:n,union:function(t){var e=s(t.x,this.x),i=s(t.y,this.y);this.width=l(t.x+t.width,this.x+this.width)-e,this.height=l(t.y+t.height,this.y+this.height)-i,this.x=e,this.y=i},applyTransform:function(){var t=[],e=[],i=[],n=[];return function(r){if(r){t[0]=i[0]=this.x,t[1]=n[1]=this.y,e[0]=n[0]=this.x+this.width,e[1]=i[1]=this.y+this.height,a(t,t,r),a(e,e,r),a(i,i,r),a(n,n,r),this.x=s(t[0],e[0],i[0],n[0]),this.y=s(t[1],e[1],i[1],n[1]);var o=l(t[0],e[0],i[0],n[0]),h=l(t[1],e[1],i[1],n[1]);this.width=o-this.x,this.height=h-this.y}}}(),calculateTransform:function(t){var e=this,i=t.width/e.width,n=t.height/e.height,r=o.create();return o.translate(r,r,[-e.x,-e.y]),o.scale(r,r,[i,n]),o.translate(r,r,[t.x,t.y]),r},intersect:function(t){if(!t)return!1;t instanceof n||(t=n.create(t));var e=this,i=e.x,r=e.x+e.width,o=e.y,a=e.y+e.height,s=t.x,l=t.x+t.width,h=t.y,u=t.y+t.height;return!(r<s||l<i||a<h||u<o)},contain:function(t,e){var i=this;return t>=i.x&&t<=i.x+i.width&&e>=i.y&&e<=i.y+i.height},clone:function(){return new n(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},n.create=function(t){return new n(t.x,t.y,t.width,t.height)},t.exports=n},function(t,e){function i(t){var e={},i={},n=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge\/([\d.]+)/),a=/micromessenger/i.test(t);return n&&(i.firefox=!0,i.version=n[1]),r&&(i.ie=!0,i.version=r[1]),o&&(i.edge=!0,i.version=o[1]),a&&(i.weChat=!0),{browser:i,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,touchEventsSupported:"ontouchstart"in window&&!i.ie&&!i.edge,pointerEventsSupported:"onpointerdown"in window&&(i.edge||i.ie&&i.version>=11)}}var n={};n="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0}:i(navigator.userAgent),t.exports=n},function(t,e,i){function n(t,e,i){this.parentModel=e,this.ecModel=i,this.option=t}function r(t,e,i){for(var n=0;n<e.length&&(!e[n]||(t=t&&"object"==typeof t?t[e[n]]:null,null!=t));n++);return null==t&&i&&(t=i.get(e)),t}function o(t,e){var i=s.get(t,"getParent");return i?i.call(t,e):t.parentModel}var a=i(1),s=i(15),l=i(10);n.prototype={constructor:n,init:null,mergeOption:function(t){a.merge(this.option,t,!0)},get:function(t,e){return null==t?this.option:r(this.option,this.parsePath(t),!e&&o(this,t))},getShallow:function(t,e){var i=this.option,n=null==i?i:i[t],r=!e&&o(this,t);return null==n&&r&&(n=r.getShallow(t)),n},getModel:function(t,e){var i,a=null==t?this.option:r(this.option,t=this.parsePath(t));return e=e||(i=o(this,t))&&i.getModel(t),new n(a,e,this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){var t=this.constructor;return new t(a.clone(this.option))},setReadOnly:function(t){s.setReadOnly(this,t)},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){s.set(this,"getParent",t)},isAnimationEnabled:function(){if(!l.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},s.enableClassExtend(n);var h=a.mixin;h(n,i(131)),h(n,i(128)),h(n,i(132)),h(n,i(130)),t.exports=n},function(t,e,i){"use strict";function n(t,e,i,n,r){var o=0,a=0;null==n&&(n=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(l,h){var u,c,d=l.position,f=l.getBoundingRect(),p=e.childAt(h+1),g=p&&p.getBoundingRect();if("horizontal"===t){var m=f.width+(g?-g.x+f.x:0);u=o+m,u>n||l.newline?(o=0,u=m,a+=s+i,s=f.height):s=Math.max(s,f.height)}else{var v=f.height+(g?-g.y+f.y:0);c=a+v,c>r||l.newline?(o+=s+i,a=0,c=v,s=f.width):s=Math.max(s,f.width)}l.newline||(d[0]=o,d[1]=a,"horizontal"===t?o=u+i:a=c+i)})}var r=i(1),o=i(9),a=i(4),s=i(8),l=a.parsePercent,h=r.each,u={},c=u.LOCATION_PARAMS=["left","right","top","bottom","width","height"];u.box=n,u.vbox=r.curry(n,"vertical"),u.hbox=r.curry(n,"horizontal"),u.getAvailableSize=function(t,e,i){var n=e.width,r=e.height,o=l(t.x,n),a=l(t.y,r),h=l(t.x2,n),u=l(t.y2,r);return(isNaN(o)||isNaN(parseFloat(t.x)))&&(o=0),(isNaN(h)||isNaN(parseFloat(t.x2)))&&(h=n),(isNaN(a)||isNaN(parseFloat(t.y)))&&(a=0),(isNaN(u)||isNaN(parseFloat(t.y2)))&&(u=r),i=s.normalizeCssArray(i||0),{width:Math.max(h-o-i[1]-i[3],0),height:Math.max(u-a-i[0]-i[2],0)}},u.getLayoutRect=function(t,e,i){i=s.normalizeCssArray(i||0);var n=e.width,r=e.height,a=l(t.left,n),h=l(t.top,r),u=l(t.right,n),c=l(t.bottom,r),d=l(t.width,n),f=l(t.height,r),p=i[2]+i[0],g=i[1]+i[3],m=t.aspect;switch(isNaN(d)&&(d=n-u-g-a),isNaN(f)&&(f=r-c-p-h),isNaN(d)&&isNaN(f)&&(m>n/r?d=.8*n:f=.8*r),null!=m&&(isNaN(d)&&(d=m*f),isNaN(f)&&(f=d/m)),isNaN(a)&&(a=n-u-d-g),isNaN(h)&&(h=r-c-f-p),t.left||t.right){case"center":a=n/2-d/2-i[3];break;case"right":a=n-d-g}switch(t.top||t.bottom){case"middle":case"center":h=r/2-f/2-i[0];break;case"bottom":h=r-f-p}a=a||0,h=h||0,isNaN(d)&&(d=n-a-(u||0)),isNaN(f)&&(f=r-h-(c||0));var v=new o(a+i[3],h+i[0],d,f);return v.margin=i,v},u.positionElement=function(t,e,i,n,a){var s=!a||!a.hv||a.hv[0],l=!a||!a.hv||a.hv[1],h=a&&a.boundingMode||"all";if(s||l){var c;if("raw"===h)c="group"===t.type?new o(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(c=t.getBoundingRect(),t.needLocalTransform()){var d=t.getLocalTransform();c=c.clone(),c.applyTransform(d)}e=u.getLayoutRect(r.defaults({width:c.width,
+height:c.height},e),i,n);var f=t.position,p=s?e.x-c.x:0,g=l?e.y-c.y:0;t.attr("position","raw"===h?[p,g]:[f[0]+p,f[1]+g])}},u.mergeLayoutParam=function(t,e,i){function n(n){var r={},s=0,l={},u=0,c=i.ignoreSize?1:2;if(h(n,function(e){l[e]=t[e]}),h(n,function(t){o(e,t)&&(r[t]=l[t]=e[t]),a(r,t)&&s++,a(l,t)&&u++}),u!==c&&s){if(s>=c)return r;for(var d=0;d<n.length;d++){var f=n[d];if(!o(r,f)&&o(t,f)){r[f]=t[f];break}}return r}return l}function o(t,e){return t.hasOwnProperty(e)}function a(t,e){return null!=t[e]&&"auto"!==t[e]}function s(t,e,i){h(t,function(t){e[t]=i[t]})}!r.isObject(i)&&(i={});var l=["width","left","right"],u=["height","top","bottom"],c=n(l),d=n(u);s(l,t,c),s(u,t,d)},u.getLayoutParams=function(t){return u.copyLayoutParams({},t)},u.copyLayoutParams=function(t,e){return e&&t&&h(c,function(i){e.hasOwnProperty(i)&&(t[i]=e[i])}),t},t.exports=u},function(t,e,i){function n(t){var e=[];return o.each(u.getClassesByMainType(t),function(t){a.apply(e,t.prototype.dependencies||[])}),o.map(e,function(t){return l.parseClassType(t).main})}var r=i(11),o=i(1),a=Array.prototype.push,s=i(44),l=i(15),h=i(12),u=r.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,i,n){r.call(this,t,e,i,n),this.uid=s.getUID("componentModel")},init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i)},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,n=i?h.getLayoutParams(t):{},r=e.getTheme();o.merge(t,r.get(this.mainType)),o.merge(t,this.getDefaultOption()),i&&h.mergeLayoutParam(t,n,i)},mergeOption:function(t,e){o.merge(this.option,t,!0);var i=this.layoutMode;i&&h.mergeLayoutParam(this.option,t,i)},optionUpdated:function(t,e){},getDefaultOption:function(){if(!l.hasOwn(this,"__defaultOption")){for(var t=[],e=this.constructor;e;){var i=e.prototype.defaultOption;i&&t.push(i),e=e.superClass}for(var n={},r=t.length-1;r>=0;r--)n=o.merge(n,t[r],!0);l.set(this,"__defaultOption",n)}return l.get(this,"__defaultOption")},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});l.enableClassManagement(u,{registerWhenExtend:!0}),s.enableSubTypeDefaulter(u),s.enableTopologicalTravel(u,n),o.mixin(u,i(129)),t.exports=u},function(t,e,i){(function(e){function n(t){return d.isArray(t)||(t=[t]),t}function r(t,e){var i=t.dimensions,n=new v(d.map(i,t.getDimensionInfo,t),t.hostModel);m(n,t);for(var r=n._storage={},o=t._storage,a=0;a<i.length;a++){var s=i[a],l=o[s];d.indexOf(e,s)>=0?r[s]=new l.constructor(o[s].length):r[s]=o[s]}return n}var o="undefined",a="undefined"==typeof window?e:window,s=typeof a.Float64Array===o?Array:a.Float64Array,l=typeof a.Int32Array===o?Array:a.Int32Array,h={"float":s,"int":l,ordinal:Array,number:Array,time:Array},u=i(11),c=i(43),d=i(1),f=i(6),p=d.isObject,g=["stackedOn","hasItemOption","_nameList","_idList","_rawData"],m=function(t,e){d.each(g.concat(e.__wrappedMethods||[]),function(i){e.hasOwnProperty(i)&&(t[i]=e[i])}),t.__wrappedMethods=e.__wrappedMethods},v=function(t,e){t=t||["x","y"];for(var i={},n=[],r=0;r<t.length;r++){var o,a={};"string"==typeof t[r]?(o=t[r],a={name:o,stackable:!1,type:"number"}):(a=t[r],o=a.name,a.type=a.type||"number"),n.push(o),i[o]=a}this.dimensions=n,this._dimensionInfos=i,this.hostModel=e,this.dataType,this.indices=[],this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this.stackedOn=null,this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._rawData,this._extent},y=v.prototype;y.type="list",y.hasItemOption=!0,y.getDimension=function(t){return isNaN(t)||(t=this.dimensions[t]||t),t},y.getDimensionInfo=function(t){return d.clone(this._dimensionInfos[this.getDimension(t)])},y.initData=function(t,e,i){t=t||[],this._rawData=t;var n=this._storage={},r=this.indices=[],o=this.dimensions,a=t.length,s=this._dimensionInfos,l=[],u={};e=e||[];for(var c=0;c<o.length;c++){var d=s[o[c]],p=h[d.type];n[o[c]]=new p(a)}var g=this;i||(g.hasItemOption=!1),i=i||function(t,e,i,n){var r=f.getDataItemValue(t);return f.isDataItemOption(t)&&(g.hasItemOption=!0),f.converDataValue(r instanceof Array?r[n]:r,s[e])};for(var m=0;m<t.length;m++){for(var v=t[m],y=0;y<o.length;y++){var x=o[y],_=n[x];_[m]=i(v,x,m,y)}r.push(m)}for(var c=0;c<t.length;c++){e[c]||t[c]&&null!=t[c].name&&(e[c]=t[c].name);var b=e[c]||"",w=t[c]&&t[c].id;!w&&b&&(u[b]=u[b]||0,w=b,u[b]>0&&(w+="__ec__"+u[b]),u[b]++),w&&(l[c]=w)}this._nameList=e,this._idList=l},y.count=function(){return this.indices.length},y.get=function(t,e,i){var n=this._storage,r=this.indices[e];if(null==r)return NaN;var o=n[t]&&n[t][r];if(i){var a=this._dimensionInfos[t];if(a&&a.stackable)for(var s=this.stackedOn;s;){var l=s.get(t,e);(o>=0&&l>0||o<=0&&l<0)&&(o+=l),s=s.stackedOn}}return o},y.getValues=function(t,e,i){var n=[];d.isArray(t)||(i=e,e=t,t=this.dimensions);for(var r=0,o=t.length;r<o;r++)n.push(this.get(t[r],e,i));return n},y.hasValue=function(t){for(var e=this.dimensions,i=this._dimensionInfos,n=0,r=e.length;n<r;n++)if("ordinal"!==i[e[n]].type&&isNaN(this.get(e[n],t)))return!1;return!0},y.getDataExtent=function(t,e,i){t=this.getDimension(t);var n=this._storage[t],r=this.getDimensionInfo(t);e=r&&r.stackable&&e;var o,a=(this._extent||(this._extent={}))[t+!!e];if(a)return a;if(n){for(var s=1/0,l=-(1/0),h=0,u=this.count();h<u;h++)o=this.get(t,h,e),i&&!i(o,t,h)||(o<s&&(s=o),o>l&&(l=o));return this._extent[t+!!e]=[s,l]}return[1/0,-(1/0)]},y.getSum=function(t,e){var i=this._storage[t],n=0;if(i)for(var r=0,o=this.count();r<o;r++){var a=this.get(t,r,e);isNaN(a)||(n+=a)}return n},y.indexOf=function(t,e){var i=this._storage,n=i[t],r=this.indices;if(n)for(var o=0,a=r.length;o<a;o++){var s=r[o];if(n[s]===e)return o}return-1},y.indexOfName=function(t){for(var e=this.indices,i=this._nameList,n=0,r=e.length;n<r;n++){var o=e[n];if(i[o]===t)return n}return-1},y.indexOfRawIndex=function(t){var e=this.indices,i=e[t];if(null!=i&&i===t)return t;for(var n=0,r=e.length-1;n<=r;){var o=(n+r)/2|0;if(e[o]<t)n=o+1;else{if(!(e[o]>t))return o;r=o-1}}return-1},y.indexOfNearest=function(t,e,i,n){var r=this._storage,o=r[t];null==n&&(n=1/0);var a=-1;if(o)for(var s=Number.MAX_VALUE,l=0,h=this.count();l<h;l++){var u=e-this.get(t,l,i),c=Math.abs(u);u<=n&&(c<s||c===s&&u>0)&&(s=c,a=l)}return a},y.getRawIndex=function(t){var e=this.indices[t];return null==e?-1:e},y.getRawDataItem=function(t){return this._rawData[this.getRawIndex(t)]},y.getName=function(t){return this._nameList[this.indices[t]]||""},y.getId=function(t){return this._idList[this.indices[t]]||this.getRawIndex(t)+""},y.each=function(t,e,i,r){"function"==typeof t&&(r=i,i=e,e=t,t=[]),t=d.map(n(t),this.getDimension,this);var o=[],a=t.length,s=this.indices;r=r||this;for(var l=0;l<s.length;l++)switch(a){case 0:e.call(r,l);break;case 1:e.call(r,this.get(t[0],l,i),l);break;case 2:e.call(r,this.get(t[0],l,i),this.get(t[1],l,i),l);break;default:for(var h=0;h<a;h++)o[h]=this.get(t[h],l,i);o[h]=l,e.apply(r,o)}},y.filterSelf=function(t,e,i,r){"function"==typeof t&&(r=i,i=e,e=t,t=[]),t=d.map(n(t),this.getDimension,this);var o=[],a=[],s=t.length,l=this.indices;r=r||this;for(var h=0;h<l.length;h++){var u;if(1===s)u=e.call(r,this.get(t[0],h,i),h);else{for(var c=0;c<s;c++)a[c]=this.get(t[c],h,i);a[c]=h,u=e.apply(r,a)}u&&o.push(l[h])}return this.indices=o,this._extent={},this},y.mapArray=function(t,e,i,n){"function"==typeof t&&(n=i,i=e,e=t,t=[]);var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},i,n),r},y.map=function(t,e,i,o){t=d.map(n(t),this.getDimension,this);var a=r(this,t),s=a.indices=this.indices,l=a._storage,h=[];return this.each(t,function(){var i=arguments[arguments.length-1],n=e&&e.apply(this,arguments);if(null!=n){"number"==typeof n&&(h[0]=n,n=h);for(var r=0;r<n.length;r++){var o=t[r],a=l[o],u=s[i];a&&(a[u]=n[r])}}},i,o),a},y.downSample=function(t,e,i,n){for(var o=r(this,[t]),a=this._storage,s=o._storage,l=this.indices,h=o.indices=[],u=[],c=[],d=Math.floor(1/e),f=s[t],p=this.count(),g=0;g<a[t].length;g++)s[t][g]=a[t][g];for(var g=0;g<p;g+=d){d>p-g&&(d=p-g,u.length=d);for(var m=0;m<d;m++){var v=l[g+m];u[m]=f[v],c[m]=v}var y=i(u),v=c[n(u,y)||0];f[v]=y,h.push(v)}return o},y.getItemModel=function(t){var e=this.hostModel;return t=this.indices[t],new u(this._rawData[t],e,e&&e.ecModel)},y.diff=function(t){var e,i=this._idList,n=t&&t._idList,r="e\0\0";return new c(t?t.indices:[],this.indices,function(t){return null!=(e=n[t])?e:r+t},function(t){return null!=(e=i[t])?e:r+t})},y.getVisual=function(t){var e=this._visual;return e&&e[t]},y.setVisual=function(t,e){if(p(t))for(var i in t)t.hasOwnProperty(i)&&this.setVisual(i,t[i]);else this._visual=this._visual||{},this._visual[t]=e},y.setLayout=function(t,e){if(p(t))for(var i in t)t.hasOwnProperty(i)&&this.setLayout(i,t[i]);else this._layout[t]=e},y.getLayout=function(t){return this._layout[t]},y.getItemLayout=function(t){return this._itemLayouts[t]},y.setItemLayout=function(t,e,i){this._itemLayouts[t]=i?d.extend(this._itemLayouts[t]||{},e):e},y.clearItemLayouts=function(){this._itemLayouts.length=0},y.getItemVisual=function(t,e,i){var n=this._itemVisuals[t],r=n&&n[e];return null!=r||i?r:this.getVisual(e)},y.setItemVisual=function(t,e,i){var n=this._itemVisuals[t]||{};if(this._itemVisuals[t]=n,p(e))for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);else n[e]=i},y.clearAllVisual=function(){this._visual={},this._itemVisuals=[]};var x=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType};y.setItemGraphicEl=function(t,e){var i=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=i&&i.seriesIndex,"group"===e.type&&e.traverse(x,e)),this._graphicEls[t]=e},y.getItemGraphicEl=function(t){return this._graphicEls[t]},y.eachItemGraphicEl=function(t,e){d.each(this._graphicEls,function(i,n){i&&t&&t.call(e,i,n)})},y.cloneShallow=function(){var t=d.map(this.dimensions,this.getDimensionInfo,this),e=new v(t,this.hostModel);return e._storage=this._storage,m(e,this),e.indices=this.indices.slice(),this._extent&&(e._extent=d.extend({},this._extent)),e},y.wrapMethod=function(t,e){var i=this[t];"function"==typeof i&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=i.apply(this,arguments);return e.apply(this,[t].concat(d.slice(arguments)))})},y.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],y.CHANGABLE_METHODS=["filterSelf"],t.exports=v}).call(e,function(){return this}())},function(t,e,i){function n(t){a.assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}function r(t,e){var i=a.slice(arguments,2);return this.superClass.prototype[e].apply(t,i)}function o(t,e,i){return this.superClass.prototype[e].apply(t,i)}var a=i(1),s={},l=".",h="___EC__COMPONENT__CONTAINER___",u="\0ec_\0";s.set=function(t,e,i){return t[u+e]=i},s.get=function(t,e){return t[u+e]},s.hasOwn=function(t,e){return t.hasOwnProperty(u+e)};var c=s.parseClassType=function(t){var e={main:"",sub:""};return t&&(t=t.split(l),e.main=t[0]||"",e.sub=t[1]||""),e};s.enableClassExtend=function(t,e){t.$constructor=t,t.extend=function(t){var e=this,i=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return a.extend(i.prototype,t),i.extend=this.extend,i.superCall=r,i.superApply=o,a.inherits(i,this),i.superClass=e,i}},s.enableClassManagement=function(t,e){function i(t){var e=r[t.main];return e&&e[h]||(e=r[t.main]={},e[h]=!0),e}e=e||{};var r={};if(t.registerClass=function(t,e){if(e)if(n(e),e=c(e),e.sub){if(e.sub!==h){var o=i(e);o[e.sub]=t}}else r[e.main]=t;return t},t.getClass=function(t,e,i){var n=r[t];if(n&&n[h]&&(n=e?n[e]:null),i&&!n)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return n},t.getClassesByMainType=function(t){t=c(t);var e=[],i=r[t.main];return i&&i[h]?a.each(i,function(t,i){i!==h&&e.push(t)}):e.push(i),e},t.hasClass=function(t){return t=c(t),!!r[t.main]},t.getAllClassMainTypes=function(){var t=[];return a.each(r,function(e,i){t.push(i)}),t},t.hasSubTypes=function(t){t=c(t);var e=r[t.main];return e&&e[h]},t.parseClassType=c,e.registerWhenExtend){var o=t.extend;o&&(t.extend=function(e){var i=o.call(this,e);return t.registerClass(i,e.type)})}return t},s.setReadOnly=function(t,e){},t.exports=s},function(t,e,i){"use strict";var n=i(1),r=i(8),o=i(15),a=i(6),s=i(13),l=i(57),h=i(10),u=i(12),c=o.set,d=o.get,f=r.encodeHTML,p=r.addCommas,g=s.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.normal.color",layoutMode:null,init:function(t,e,i,n){this.seriesIndex=this.componentIndex,this.mergeDefaultAndTheme(t,i),c(this,"dataBeforeProcessed",this.getInitialData(t,i)),this.restoreData()},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,r=i?u.getLayoutParams(t):{};n.merge(t,e.getTheme().get(this.subType)),n.merge(t,this.getDefaultOption()),a.defaultEmphasis(t.label,a.LABEL_OPTIONS),this.fillDataTextStyle(t.data),i&&u.mergeLayoutParam(t,r,i)},mergeOption:function(t,e){t=n.merge(this.option,t,!0),this.fillDataTextStyle(t.data);var i=this.layoutMode;i&&u.mergeLayoutParam(this.option,t,i);var r=this.getInitialData(t,e);r&&(c(this,"data",r),c(this,"dataBeforeProcessed",r.cloneShallow()))},fillDataTextStyle:function(t){if(t)for(var e=0;e<t.length;e++)t[e]&&t[e].label&&a.defaultEmphasis(t[e].label,a.LABEL_OPTIONS)},getInitialData:function(){},getData:function(t){var e=d(this,"data");return null==t?e:e.getLinkedData(t)},setData:function(t){c(this,"data",t)},getRawData:function(){return d(this,"dataBeforeProcessed")},coordDimToDataDim:function(t){return[t]},dataDimToCoordDim:function(t){return t},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(t,e,i){function o(t){var i=[];return n.each(t,function(t,n){var o,s=a.getDimensionInfo(n),l=s&&s.type;o="ordinal"===l?t+"":"time"===l?e?"":r.formatTime("yyyy/MM/dd hh:mm:ss",t):p(t),o&&i.push(o)}),i.join(", ")}var a=d(this,"data"),s=this.getRawValue(t),l=f(n.isArray(s)?o(s):p(s)),h=a.getName(t),u=a.getItemVisual(t,"color");n.isObject(u)&&u.colorStops&&(u=(u.colorStops[0]||{}).color),u=u||"transparent";var c='<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:'+f(u)+'"></span>',g=this.name;return"\0-"===g&&(g=""),e?c+f(this.name)+" : "+l:(g&&f(g)+"<br />")+c+(h?f(h)+" : "+l:l)},isAnimationEnabled:function(){if(h.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){c(this,"data",d(this,"dataBeforeProcessed").cloneShallow())},getColorFromPalette:function(t,e){var i=this.ecModel,n=l.getColorFromPalette.call(this,t,e);return n||(n=i.getColorFromPalette(t,e)),n},getAxisTooltipDataIndex:null,getTooltipPosition:null});n.mixin(g,a.dataFormatMixin),n.mixin(g,l),t.exports=g},function(t,e,i){function n(t,e){var i=t+":"+e;if(l[i])return l[i];for(var n=(t+"").split("\n"),r=0,o=0,a=n.length;o<a;o++)r=Math.max(p.measureText(n[o],e).width,r);return h>u&&(h=0,l={}),h++,l[i]=r,r}function r(t,e,i,r){var o=((t||"")+"").split("\n").length,a=n(t,e),s=n("国",e),l=o*s,h=new d(0,0,a,l);switch(h.lineHeight=s,r){case"bottom":case"alphabetic":h.y-=s;break;case"middle":h.y-=s/2}switch(i){case"end":case"right":h.x-=h.width;break;case"center":h.x-=h.width/2}return h}function o(t,e,i,n){var r=e.x,o=e.y,a=e.height,s=e.width,l=i.height,h=a/2-l/2,u="left";switch(t){case"left":r-=n,o+=h,u="right";break;case"right":r+=n+s,o+=h,u="left";break;case"top":r+=s/2,o-=n+l,u="center";break;case"bottom":r+=s/2,o+=a+n,u="center";break;case"inside":r+=s/2,o+=h,u="center";break;case"insideLeft":r+=n,o+=h,u="left";break;case"insideRight":r+=s-n,o+=h,u="right";break;case"insideTop":r+=s/2,o+=n,u="center";break;case"insideBottom":r+=s/2,o+=a-l-n,u="center";break;case"insideTopLeft":r+=n,o+=n,u="left";break;case"insideTopRight":r+=s-n,o+=n,u="right";break;case"insideBottomLeft":r+=n,o+=a-l-n;break;case"insideBottomRight":r+=s-n,o+=a-l-n,u="right"}return{x:r,y:o,textAlign:u,textBaseline:"top"}}function a(t,e,i,r,o){if(!e)return"";o=o||{},r=f(r,"...");for(var a=f(o.maxIterations,2),l=f(o.minChar,0),h=n("国",i),u=n("a",i),c=f(o.placeholder,""),d=e=Math.max(0,e-1),p=0;p<l&&d>=u;p++)d-=u;var g=n(r);g>d&&(r="",g=0),d=e-g;for(var m=(t+"").split("\n"),p=0,v=m.length;p<v;p++){var y=m[p],x=n(y,i);if(!(x<=e)){for(var _=0;;_++){if(x<=d||_>=a){y+=r;break}var b=0===_?s(y,d,u,h):x>0?Math.floor(y.length*d/x):0;y=y.substr(0,b),x=n(y,i)}""===y&&(y=c),m[p]=y}}return m.join("\n")}function s(t,e,i,n){for(var r=0,o=0,a=t.length;o<a&&r<e;o++){var s=t.charCodeAt(o);r+=0<=s&&s<=127?i:n}return o}var l={},h=0,u=5e3,c=i(1),d=i(9),f=c.retrieve,p={getWidth:n,getBoundingRect:r,adjustTextPositionOnRect:o,truncateText:a,measureText:function(t,e){var i=c.getContext();return i.font=e||"12px sans-serif",i.measureText(t)}};t.exports=p},function(t,e,i){"use strict";function n(t){return t>-w&&t<w}function r(t){return t>w||t<-w}function o(t,e,i,n,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*n+3*o*i)}function a(t,e,i,n,r){var o=1-r;return 3*(((e-t)*o+2*(i-e)*r)*o+(n-i)*r*r)}function s(t,e,i,r,o,a){var s=r+3*(e-i)-t,l=3*(i-2*e+t),h=3*(e-t),u=t-o,c=l*l-3*s*h,d=l*h-9*s*u,f=h*h-3*l*u,p=0;if(n(c)&&n(d))if(n(l))a[0]=0;else{var g=-h/l;g>=0&&g<=1&&(a[p++]=g)}else{var m=d*d-4*c*f;if(n(m)){var v=d/c,g=-l/s+v,y=-v/2;g>=0&&g<=1&&(a[p++]=g),y>=0&&y<=1&&(a[p++]=y)}else if(m>0){var x=b(m),w=c*l+1.5*s*(-d+x),M=c*l+1.5*s*(-d-x);w=w<0?-_(-w,T):_(w,T),M=M<0?-_(-M,T):_(M,T);var g=(-l-(w+M))/(3*s);g>=0&&g<=1&&(a[p++]=g)}else{var A=(2*c*l-3*s*d)/(2*b(c*c*c)),I=Math.acos(A)/3,C=b(c),k=Math.cos(I),g=(-l-2*C*k)/(3*s),y=(-l+C*(k+S*Math.sin(I)))/(3*s),L=(-l+C*(k-S*Math.sin(I)))/(3*s);g>=0&&g<=1&&(a[p++]=g),y>=0&&y<=1&&(a[p++]=y),L>=0&&L<=1&&(a[p++]=L)}}return p}function l(t,e,i,o,a){var s=6*i-12*e+6*t,l=9*e+3*o-3*t-9*i,h=3*e-3*t,u=0;if(n(l)){if(r(s)){var c=-h/s;c>=0&&c<=1&&(a[u++]=c)}}else{var d=s*s-4*l*h;if(n(d))a[0]=-s/(2*l);else if(d>0){var f=b(d),c=(-s+f)/(2*l),p=(-s-f)/(2*l);c>=0&&c<=1&&(a[u++]=c),p>=0&&p<=1&&(a[u++]=p)}}return u}function h(t,e,i,n,r,o){var a=(e-t)*r+t,s=(i-e)*r+e,l=(n-i)*r+i,h=(s-a)*r+a,u=(l-s)*r+s,c=(u-h)*r+h;o[0]=t,o[1]=a,o[2]=h,o[3]=c,o[4]=c,o[5]=u,o[6]=l,o[7]=n}function u(t,e,i,n,r,a,s,l,h,u,c){var d,f,p,g,m,v=.005,y=1/0;A[0]=h,A[1]=u;for(var _=0;_<1;_+=.05)I[0]=o(t,i,r,s,_),I[1]=o(e,n,a,l,_),g=x(A,I),g<y&&(d=_,y=g);y=1/0;for(var w=0;w<32&&!(v<M);w++)f=d-v,p=d+v,I[0]=o(t,i,r,s,f),I[1]=o(e,n,a,l,f),g=x(I,A),f>=0&&g<y?(d=f,y=g):(C[0]=o(t,i,r,s,p),C[1]=o(e,n,a,l,p),m=x(C,A),p<=1&&m<y?(d=p,y=m):v*=.5);return c&&(c[0]=o(t,i,r,s,d),c[1]=o(e,n,a,l,d)),b(y)}function c(t,e,i,n){var r=1-n;return r*(r*t+2*n*e)+n*n*i}function d(t,e,i,n){return 2*((1-n)*(e-t)+n*(i-e))}function f(t,e,i,o,a){var s=t-2*e+i,l=2*(e-t),h=t-o,u=0;if(n(s)){if(r(l)){var c=-h/l;c>=0&&c<=1&&(a[u++]=c)}}else{var d=l*l-4*s*h;if(n(d)){var c=-l/(2*s);c>=0&&c<=1&&(a[u++]=c)}else if(d>0){var f=b(d),c=(-l+f)/(2*s),p=(-l-f)/(2*s);c>=0&&c<=1&&(a[u++]=c),p>=0&&p<=1&&(a[u++]=p)}}return u}function p(t,e,i){var n=t+i-2*e;return 0===n?.5:(t-e)/n}function g(t,e,i,n,r){var o=(e-t)*n+t,a=(i-e)*n+e,s=(a-o)*n+o;r[0]=t,r[1]=o,r[2]=s,r[3]=s,r[4]=a,r[5]=i}function m(t,e,i,n,r,o,a,s,l){var h,u=.005,d=1/0;A[0]=a,A[1]=s;for(var f=0;f<1;f+=.05){I[0]=c(t,i,r,f),I[1]=c(e,n,o,f);var p=x(A,I);p<d&&(h=f,d=p)}d=1/0;for(var g=0;g<32&&!(u<M);g++){var m=h-u,v=h+u;I[0]=c(t,i,r,m),I[1]=c(e,n,o,m);var p=x(I,A);if(m>=0&&p<d)h=m,d=p;else{C[0]=c(t,i,r,v),C[1]=c(e,n,o,v);var y=x(C,A);v<=1&&y<d?(h=v,d=y):u*=.5}}return l&&(l[0]=c(t,i,r,h),l[1]=c(e,n,o,h)),b(d)}var v=i(5),y=v.create,x=v.distSquare,_=Math.pow,b=Math.sqrt,w=1e-8,M=1e-4,S=b(3),T=1/3,A=y(),I=y(),C=y();t.exports={cubicAt:o,cubicDerivativeAt:a,cubicRootAt:s,cubicExtrema:l,cubicSubdivide:h,cubicProjectPoint:u,quadraticAt:c,quadraticDerivativeAt:d,quadraticRootAt:f,quadraticExtremum:p,quadraticSubdivide:g,quadraticProjectPoint:m}},function(t,e){function i(t){return t=Math.round(t),t<0?0:t>255?255:t}function n(t){return t=Math.round(t),t<0?0:t>360?360:t}function r(t){return t<0?0:t>1?1:t}function o(t){return i(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function a(t){return r(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function s(t,e,i){return i<0?i+=1:i>1&&(i-=1),6*i<1?t+(e-t)*i*6:2*i<1?e:3*i<2?t+(e-t)*(2/3-i)*6:t}function l(t,e,i){return t+(e-t)*i}function h(t){if(t){t+="";var e=t.replace(/ /g,"").toLowerCase();if(e in x)return x[e].slice();if("#"!==e.charAt(0)){var i=e.indexOf("("),n=e.indexOf(")");if(i!==-1&&n+1===e.length){var r=e.substr(0,i),s=e.substr(i+1,n-(i+1)).split(","),l=1;switch(r){case"rgba":if(4!==s.length)return;l=a(s.pop());case"rgb":if(3!==s.length)return;return[o(s[0]),o(s[1]),o(s[2]),l];case"hsla":if(4!==s.length)return;return s[3]=a(s[3]),u(s);case"hsl":if(3!==s.length)return;return u(s);default:return}}}else{if(4===e.length){var h=parseInt(e.substr(1),16);if(!(h>=0&&h<=4095))return;return[(3840&h)>>4|(3840&h)>>8,240&h|(240&h)>>4,15&h|(15&h)<<4,1]}if(7===e.length){var h=parseInt(e.substr(1),16);if(!(h>=0&&h<=16777215))return;return[(16711680&h)>>16,(65280&h)>>8,255&h,1]}}}}function u(t){var e=(parseFloat(t[0])%360+360)%360/360,n=a(t[1]),r=a(t[2]),o=r<=.5?r*(n+1):r+n-r*n,l=2*r-o,h=[i(255*s(l,o,e+1/3)),i(255*s(l,o,e)),i(255*s(l,o,e-1/3))];return 4===t.length&&(h[3]=t[3]),h}function c(t){if(t){var e,i,n=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(n,r,o),s=Math.max(n,r,o),l=s-a,h=(s+a)/2;if(0===l)e=0,i=0;else{i=h<.5?l/(s+a):l/(2-s-a);var u=((s-n)/6+l/2)/l,c=((s-r)/6+l/2)/l,d=((s-o)/6+l/2)/l;n===s?e=d-c:r===s?e=1/3+u-d:o===s&&(e=2/3+c-u),e<0&&(e+=1),e>1&&(e-=1)}var f=[360*e,i,h];return null!=t[3]&&f.push(t[3]),f}}function d(t,e){var i=h(t);if(i){for(var n=0;n<3;n++)e<0?i[n]=i[n]*(1-e)|0:i[n]=(255-i[n])*e+i[n]|0;return y(i,4===i.length?"rgba":"rgb")}}function f(t,e){var i=h(t);if(i)return((1<<24)+(i[0]<<16)+(i[1]<<8)+ +i[2]).toString(16).slice(1)}function p(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[0,0,0,0];var r=t*(e.length-1),o=Math.floor(r),a=Math.ceil(r),s=e[o],h=e[a],u=r-o;return n[0]=i(l(s[0],h[0],u)),n[1]=i(l(s[1],h[1],u)),n[2]=i(l(s[2],h[2],u)),n[3]=i(l(s[3],h[3],u)),n}}function g(t,e,n){if(e&&e.length&&t>=0&&t<=1){var o=t*(e.length-1),a=Math.floor(o),s=Math.ceil(o),u=h(e[a]),c=h(e[s]),d=o-a,f=y([i(l(u[0],c[0],d)),i(l(u[1],c[1],d)),i(l(u[2],c[2],d)),r(l(u[3],c[3],d))],"rgba");return n?{color:f,leftIndex:a,rightIndex:s,value:o}:f}}function m(t,e,i,r){if(t=h(t))return t=c(t),null!=e&&(t[0]=n(e)),null!=i&&(t[1]=a(i)),null!=r&&(t[2]=a(r)),y(u(t),"rgba")}function v(t,e){if(t=h(t),t&&null!=e)return t[3]=r(e),y(t,"rgba")}function y(t,e){var i=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(i+=","+t[3]),e+"("+i+")"}var x={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};t.exports={parse:h,lift:d,toHex:f,fastMapToColor:p,mapToColor:g,modifyHSL:m,modifyAlpha:v,stringify:y}},function(t,e){var i="undefined"==typeof Float32Array?Array:Float32Array,n={create:function(){var t=new i(6);return n.identity(t),t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},mul:function(t,e,i){var n=e[0]*i[0]+e[2]*i[1],r=e[1]*i[0]+e[3]*i[1],o=e[0]*i[2]+e[2]*i[3],a=e[1]*i[2]+e[3]*i[3],s=e[0]*i[4]+e[2]*i[5]+e[4],l=e[1]*i[4]+e[3]*i[5]+e[5];return t[0]=n,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t},translate:function(t,e,i){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+i[0],t[5]=e[5]+i[1],t},rotate:function(t,e,i){var n=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],h=Math.sin(i),u=Math.cos(i);return t[0]=n*u+a*h,t[1]=-n*h+a*u,t[2]=r*u+s*h,t[3]=-r*h+u*s,t[4]=u*o+h*l,t[5]=u*l-h*o,t},scale:function(t,e,i){var n=i[0],r=i[1];return t[0]=e[0]*n,t[1]=e[1]*r,t[2]=e[2]*n,t[3]=e[3]*r,t[4]=e[4]*n,t[5]=e[5]*r,t},invert:function(t,e){var i=e[0],n=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=i*a-o*n;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-n*l,t[3]=i*l,t[4]=(n*s-a*r)*l,t[5]=(o*r-i*s)*l,t):null}};t.exports=n},function(t,e){var i=Array.prototype.slice,n=function(){this._$handlers={}};n.prototype={constructor:n,one:function(t,e,i){var n=this._$handlers;if(!e||!t)return this;n[t]||(n[t]=[]);for(var r=0;r<n[t].length;r++)if(n[t][r].h===e)return this;return n[t].push({h:e,one:!0,ctx:i||this}),this},on:function(t,e,i){var n=this._$handlers;if(!e||!t)return this;n[t]||(n[t]=[]);for(var r=0;r<n[t].length;r++)if(n[t][r].h===e)return this;return n[t].push({h:e,one:!1,ctx:i||this}),this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var i=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(i[t]){for(var n=[],r=0,o=i[t].length;r<o;r++)i[t][r].h!=e&&n.push(i[t][r]);i[t]=n}i[t]&&0===i[t].length&&delete i[t]}else delete i[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,n=e.length;n>3&&(e=i.call(e,1));for(var r=this._$handlers[t],o=r.length,a=0;a<o;){switch(n){case 1:r[a].h.call(r[a].ctx);break;case 2:r[a].h.call(r[a].ctx,e[1]);break;case 3:r[a].h.call(r[a].ctx,e[1],e[2]);break;default:r[a].h.apply(r[a].ctx,e)}r[a].one?(r.splice(a,1),o--):a++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,n=e.length;n>4&&(e=i.call(e,1,e.length-1));for(var r=e[e.length-1],o=this._$handlers[t],a=o.length,s=0;s<a;){switch(n){case 1:o[s].h.call(r);break;case 2:o[s].h.call(r,e[1]);break;case 3:o[s].h.call(r,e[1],e[2]);break;default:o[s].h.apply(r,e)}o[s].one?(o.splice(s,1),a--):s++}}return this}},t.exports=n},function(t,e,i){var n=i(137),r=i(38);i(138),i(136);var o=i(32),a=i(4),s=i(1),l=i(17),h={};h.getScaleExtent=function(t,e){var i,n,r,o=t.scale,l=o.type,h=e.getMin(),u=e.getMax(),c=null!=h,d=null!=u,f=o.getExtent();return"ordinal"===l?i=(e.get("data")||[]).length:(n=e.get("boundaryGap"),s.isArray(n)||(n=[n||0,n||0]),n[0]=a.parsePercent(n[0],1),n[1]=a.parsePercent(n[1],1),r=f[1]-f[0]),null==h&&(h="ordinal"===l?i?0:NaN:f[0]-n[0]*r),null==u&&(u="ordinal"===l?i?i-1:NaN:f[1]+n[1]*r),"dataMin"===h&&(h=f[0]),"dataMax"===u&&(u=f[1]),(null==h||!isFinite(h))&&(h=NaN),(null==u||!isFinite(u))&&(u=NaN),t.setBlank(s.eqNaN(h)||s.eqNaN(u)),e.getNeedCrossZero()&&(h>0&&u>0&&!c&&(h=0),h<0&&u<0&&!d&&(u=0)),[h,u]},h.niceScaleExtent=function(t,e){var i=t.scale,n=h.getScaleExtent(t,e),r=null!=e.getMin(),o=null!=e.getMax(),a=e.get("splitNumber");"log"===i.type&&(i.base=e.get("logBase")),i.setExtent(n[0],n[1]),i.niceExtent(a,r,o);var s=e.get("minInterval");if(isFinite(s)&&!r&&!o&&"interval"===i.type){var l=i.getInterval(),u=Math.max(Math.abs(l),s)/l;n=i.getExtent();var c=(n[1]+n[0])/2;i.setExtent(u*(n[0]-c)+c,u*(n[1]-c)+c),i.niceExtent(a)}var l=e.get("interval");null!=l&&i.setInterval&&i.setInterval(l)},h.createScaleByModel=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new n(t.getCategories(),[1/0,-(1/0)]);case"value":return new r;default:return(o.getClass(e)||r).create(t)}},h.ifAxisCrossZero=function(t){var e=t.scale.getExtent(),i=e[0],n=e[1];return!(i>0&&n>0||i<0&&n<0)},h.getAxisLabelInterval=function(t,e,i,n){var r,o=0,a=0,s=1;e.length>40&&(s=Math.floor(e.length/40));for(var h=0;h<t.length;h+=s){var u=t[h],c=l.getBoundingRect(e[h],i,"center","top");c[n?"x":"y"]+=u,c[n?"width":"height"]*=1.3,r?r.intersect(c)?(a++,o=Math.max(o,a)):(r.union(c),a=0):r=c.clone()}return 0===o&&s>1?s:(o+1)*s-1},h.getFormattedLabels=function(t,e){var i=t.scale,n=i.getTicksLabels(),r=i.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",null!=e?e:"")}}(e),s.map(n,e)):"function"==typeof e?s.map(r,function(n,r){return e("category"===t.type?i.getLabel(n):n,r)},this):n},t.exports=h},function(t,e,i){"use strict";function n(){this._coordinateSystems=[]}var r=i(1),o={};n.prototype={constructor:n,create:function(t,e){var i=[];r.each(o,function(n,r){var o=n.create(t,e);i=i.concat(o||[])}),this._coordinateSystems=i},update:function(t,e){r.each(this._coordinateSystems,function(i){i.update&&i.update(t,e)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},n.register=function(t,e){o[t]=e},n.get=function(t){return o[t]},t.exports=n},function(t,e,i){"use strict";var n=i(3),r=i(9),o=n.extendShape({type:"triangle",
+shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=e.width/2,o=e.height/2;t.moveTo(i,n-o),t.lineTo(i+r,n+o),t.lineTo(i-r,n+o),t.closePath()}}),a=n.extendShape({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=e.width/2,o=e.height/2;t.moveTo(i,n-o),t.lineTo(i+r,n),t.lineTo(i,n+o),t.lineTo(i-r,n),t.closePath()}}),s=n.extendShape({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,n=e.y,r=e.width/5*3,o=Math.max(r,e.height),a=r/2,s=a*a/(o-a),l=n-o+a+s,h=Math.asin(s/a),u=Math.cos(h)*a,c=Math.sin(h),d=Math.cos(h);t.arc(i,l,a,Math.PI-h,2*Math.PI+h);var f=.6*a,p=.7*a;t.bezierCurveTo(i+u-c*f,l+s+d*f,i,n-p,i,n),t.bezierCurveTo(i,n-p,i-u+c*f,l+s+d*f,i-u,l+s),t.closePath()}}),l=n.extendShape({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.height,n=e.width,r=e.x,o=e.y,a=n/3*2;t.moveTo(r,o),t.lineTo(r+a,o+i),t.lineTo(r,o+i/4*3),t.lineTo(r-a,o+i),t.lineTo(r,o),t.closePath()}}),h={line:n.Line,rect:n.Rect,roundRect:n.Rect,square:n.Rect,circle:n.Circle,diamond:a,pin:s,arrow:l,triangle:o},u={line:function(t,e,i,n,r){r.x1=t,r.y1=e+n/2,r.x2=t+i,r.y2=e+n/2},rect:function(t,e,i,n,r){r.x=t,r.y=e,r.width=i,r.height=n},roundRect:function(t,e,i,n,r){r.x=t,r.y=e,r.width=i,r.height=n,r.r=Math.min(i,n)/4},square:function(t,e,i,n,r){var o=Math.min(i,n);r.x=t,r.y=e,r.width=o,r.height=o},circle:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.r=Math.min(i,n)/2},diamond:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.width=i,r.height=n},pin:function(t,e,i,n,r){r.x=t+i/2,r.y=e+n/2,r.width=i,r.height=n},arrow:function(t,e,i,n,r){r.x=t+i/2,r.y=e+n/2,r.width=i,r.height=n},triangle:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.width=i,r.height=n}},c={};for(var d in h)h.hasOwnProperty(d)&&(c[d]=new h[d]);var f=n.extendShape({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;"pin"===e.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e,i){var n=e.symbolType,r=c[n];"none"!==e.symbolType&&(r||(n="rect",r=c[n]),u[n](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,i))}}),p=function(t){if("image"!==this.type){var e=this.style,i=this.shape;i&&"line"===i.symbolType?e.stroke=t:this.__isEmptyBrush?(e.stroke=t,e.fill="#fff"):(e.fill&&(e.fill=t),e.stroke&&(e.stroke=t)),this.dirty(!1)}},g={createSymbol:function(t,e,i,o,a,s){var l=0===t.indexOf("empty");l&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var h;return h=0===t.indexOf("image://")?new n.Image({style:{image:t.slice(8),x:e,y:i,width:o,height:a}}):0===t.indexOf("path://")?n.makePath(t.slice(7),{},new r(e,i,o,a)):new f({shape:{symbolType:t,x:e,y:i,width:o,height:a}}),h.__isEmptyBrush=l,h.setColor=p,h.setColor(s),h}};t.exports=g},function(t,e,i){"use strict";function n(t){return t.getBoundingClientRect?t.getBoundingClientRect():{left:0,top:0}}function r(t,e,i,n){return i=i||{},n||!u.canvasSupported?o(t,e,i):u.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(i.zrX=e.layerX,i.zrY=e.layerY):null!=e.offsetX?(i.zrX=e.offsetX,i.zrY=e.offsetY):o(t,e,i),i}function o(t,e,i){var r=n(t);i.zrX=e.clientX-r.left,i.zrY=e.clientY-r.top}function a(t,e,i){if(e=e||window.event,null!=e.zrX)return e;var n=e.type,o=n&&n.indexOf("touch")>=0;if(o){var a="touchend"!=n?e.targetTouches[0]:e.changedTouches[0];a&&r(t,a,e,i)}else r(t,e,e,i),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;return e}function s(t,e,i){c?t.addEventListener(e,i):t.attachEvent("on"+e,i)}function l(t,e,i){c?t.removeEventListener(e,i):t.detachEvent("on"+e,i)}var h=i(21),u=i(10),c="undefined"!=typeof window&&!!window.addEventListener,d=c?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};t.exports={clientToLocal:r,normalizeEvent:a,addEventListener:s,removeEventListener:l,stop:d,Dispatcher:h}},function(t,e){"use strict";var i={};t.exports={register:function(t,e){i[t]=e},get:function(t){return i[t]}}},function(t,e,i){function n(t,e,i,n){if(!e)return t;var s=r(e[0]),l=o.isArray(s)&&s.length||1;i=i||[],n=n||"extra";for(var h=0;h<l;h++)if(!t[h]){var u=i[h]||n+(h-i.length);t[h]=a(e,h)?{type:"ordinal",name:u}:u}return t}function r(t){return o.isArray(t)?t:o.isObject(t)?t.value:t}var o=i(1),a=n.guessOrdinal=function(t,e){for(var i=0,n=t.length;i<n;i++){var a=r(t[i]);if(!o.isArray(a))return!1;var a=a[e];if(null!=a&&isFinite(a))return!1;if(o.isString(a)&&"-"!==a)return!0}return!1};t.exports=n},function(t,e,i){function n(){this.group=new a,this.uid=s.getUID("viewChart")}function r(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var i=0;i<t.childCount();i++)r(t.childAt(i),e)}function o(t,e,i){var n=h.queryDataIndex(t,e);null!=n?u.each(h.normalizeToArray(n),function(e){r(t.getItemGraphicEl(e),i)}):t.eachItemGraphicEl(function(t){r(t,i)})}var a=i(34),s=i(44),l=i(15),h=i(6),u=i(1);n.prototype={type:"chart",init:function(t,e){},render:function(t,e,i,n){},highlight:function(t,e,i,n){o(t.getData(),n,"emphasis")},downplay:function(t,e,i,n){o(t.getData(),n,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){}};var c=n.prototype;c.updateView=c.updateLayout=c.updateVisual=function(t,e,i,n){this.render(t,e,i,n)},l.enableClassExtend(n,["dispose"]),l.enableClassManagement(n,{registerWhenExtend:!0}),t.exports=n},function(t,e,i){"use strict";var n=i(18),r=i(5),o=i(75),a=i(9),s=i(33).devicePixelRatio,l={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},h=[],u=[],c=[],d=[],f=Math.min,p=Math.max,g=Math.cos,m=Math.sin,v=Math.sqrt,y=Math.abs,x="undefined"!=typeof Float32Array,_=function(){this.data=[],this._len=0,this._ctx=null,this._xi=0,this._yi=0,this._x0=0,this._y0=0,this._ux=0,this._uy=0};_.prototype={constructor:_,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=y(1/s/t)||0,this._uy=y(1/s/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._len=0,this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(l.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var i=y(t-this._xi)>this._ux||y(e-this._yi)>this._uy||this._len<5;return this.addData(l.L,t,e),this._ctx&&i&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),i&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,i,n,r,o){return this.addData(l.C,t,e,i,n,r,o),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,i,n,r,o):this._ctx.bezierCurveTo(t,e,i,n,r,o)),this._xi=r,this._yi=o,this},quadraticCurveTo:function(t,e,i,n){return this.addData(l.Q,t,e,i,n),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,i,n):this._ctx.quadraticCurveTo(t,e,i,n)),this._xi=i,this._yi=n,this},arc:function(t,e,i,n,r,o){return this.addData(l.A,t,e,i,i,n,r-n,0,o?0:1),this._ctx&&this._ctx.arc(t,e,i,n,r,o),this._xi=g(r)*i+t,this._yi=m(r)*i+t,this},arcTo:function(t,e,i,n,r){return this._ctx&&this._ctx.arcTo(t,e,i,n,r),this},rect:function(t,e,i,n){return this._ctx&&this._ctx.rect(t,e,i,n),this.addData(l.R,t,e,i,n),this},closePath:function(){this.addData(l.Z);var t=this._ctx,e=this._x0,i=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,i),t.closePath()),this._xi=e,this._yi=i,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,i=0;i<t.length;i++)e+=t[i];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length==e||!x||(this.data=new Float32Array(e));for(var i=0;i<e;i++)this.data[i]=t[i];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,i=0,n=this._len,r=0;r<e;r++)i+=t[r].len();x&&this.data instanceof Float32Array&&(this.data=new Float32Array(n+i));for(var r=0;r<e;r++)for(var o=t[r].data,a=0;a<o.length;a++)this.data[n++]=o[a];this._len=n},addData:function(t){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var i=0;i<arguments.length;i++)e[this._len++]=arguments[i];this._prevCmd=t},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var i,n,r=this._dashSum,o=this._dashOffset,a=this._lineDash,s=this._ctx,l=this._xi,h=this._yi,u=t-l,c=e-h,d=v(u*u+c*c),g=l,m=h,y=a.length;for(u/=d,c/=d,o<0&&(o=r+o),o%=r,g-=o*u,m-=o*c;u>0&&g<=t||u<0&&g>=t||0==u&&(c>0&&m<=e||c<0&&m>=e);)n=this._dashIdx,i=a[n],g+=u*i,m+=c*i,this._dashIdx=(n+1)%y,u>0&&g<l||u<0&&g>l||c>0&&m<h||c<0&&m>h||s[n%2?"moveTo":"lineTo"](u>=0?f(g,t):p(g,t),c>=0?f(m,e):p(m,e));u=g-t,c=m-e,this._dashOffset=-v(u*u+c*c)},_dashedBezierTo:function(t,e,i,r,o,a){var s,l,h,u,c,d=this._dashSum,f=this._dashOffset,p=this._lineDash,g=this._ctx,m=this._xi,y=this._yi,x=n.cubicAt,_=0,b=this._dashIdx,w=p.length,M=0;for(f<0&&(f=d+f),f%=d,s=0;s<1;s+=.1)l=x(m,t,i,o,s+.1)-x(m,t,i,o,s),h=x(y,e,r,a,s+.1)-x(y,e,r,a,s),_+=v(l*l+h*h);for(;b<w&&(M+=p[b],!(M>f));b++);for(s=(M-f)/_;s<=1;)u=x(m,t,i,o,s),c=x(y,e,r,a,s),b%2?g.moveTo(u,c):g.lineTo(u,c),s+=p[b]/_,b=(b+1)%w;b%2!==0&&g.lineTo(o,a),l=o-u,h=a-c,this._dashOffset=-v(l*l+h*h)},_dashedQuadraticTo:function(t,e,i,n){var r=i,o=n;i=(i+2*t)/3,n=(n+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,i,n,r,o)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,x&&(this.data=new Float32Array(t)))},getBoundingRect:function(){h[0]=h[1]=c[0]=c[1]=Number.MAX_VALUE,u[0]=u[1]=d[0]=d[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,i=0,n=0,s=0,f=0;f<t.length;){var p=t[f++];switch(1==f&&(e=t[f],i=t[f+1],n=e,s=i),p){case l.M:n=t[f++],s=t[f++],e=n,i=s,c[0]=n,c[1]=s,d[0]=n,d[1]=s;break;case l.L:o.fromLine(e,i,t[f],t[f+1],c,d),e=t[f++],i=t[f++];break;case l.C:o.fromCubic(e,i,t[f++],t[f++],t[f++],t[f++],t[f],t[f+1],c,d),e=t[f++],i=t[f++];break;case l.Q:o.fromQuadratic(e,i,t[f++],t[f++],t[f],t[f+1],c,d),e=t[f++],i=t[f++];break;case l.A:var v=t[f++],y=t[f++],x=t[f++],_=t[f++],b=t[f++],w=t[f++]+b,M=(t[f++],1-t[f++]);1==f&&(n=g(b)*x+v,s=m(b)*_+y),o.fromArc(v,y,x,_,b,w,M,c,d),e=g(w)*x+v,i=m(w)*_+y;break;case l.R:n=e=t[f++],s=i=t[f++];var S=t[f++],T=t[f++];o.fromLine(n,s,n+S,s+T,c,d);break;case l.Z:e=n,i=s}r.min(h,h,c),r.max(u,u,d)}return 0===f&&(h[0]=h[1]=u[0]=u[1]=0),new a(h[0],h[1],u[0]-h[0],u[1]-h[1])},rebuildPath:function(t){for(var e,i,n,r,o,a,s=this.data,h=this._ux,u=this._uy,c=this._len,d=0;d<c;){var f=s[d++];switch(1==d&&(n=s[d],r=s[d+1],e=n,i=r),f){case l.M:e=n=s[d++],i=r=s[d++],t.moveTo(n,r);break;case l.L:o=s[d++],a=s[d++],(y(o-n)>h||y(a-r)>u||d===c-1)&&(t.lineTo(o,a),n=o,r=a);break;case l.C:t.bezierCurveTo(s[d++],s[d++],s[d++],s[d++],s[d++],s[d++]),n=s[d-2],r=s[d-1];break;case l.Q:t.quadraticCurveTo(s[d++],s[d++],s[d++],s[d++]),n=s[d-2],r=s[d-1];break;case l.A:var p=s[d++],v=s[d++],x=s[d++],_=s[d++],b=s[d++],w=s[d++],M=s[d++],S=s[d++],T=x>_?x:_,A=x>_?1:x/_,I=x>_?_/x:1,C=Math.abs(x-_)>.001,k=b+w;C?(t.translate(p,v),t.rotate(M),t.scale(A,I),t.arc(0,0,T,b,k,1-S),t.scale(1/A,1/I),t.rotate(-M),t.translate(-p,-v)):t.arc(p,v,T,b,k,1-S),1==d&&(e=g(b)*x+p,i=m(b)*_+v),n=g(k)*x+p,r=m(k)*_+v;break;case l.R:e=n=s[d],i=r=s[d+1],t.rect(s[d++],s[d++],s[d++],s[d++]);break;case l.Z:t.closePath(),n=e,r=i}}}},_.CMD=l,t.exports=_},function(t,e,i){var n=i(1);t.exports=function(t){for(var e=0;e<t.length;e++)t[e][1]||(t[e][1]=t[e][0]);return function(e){for(var i={},r=0;r<t.length;r++){var o=t[r][1];if(!(e&&n.indexOf(e,o)>=0)){var a=this.getShallow(o);null!=a&&(i[t[r][0]]=a)}}return i}}},function(t,e,i){"use strict";var n=i(3),r=i(1),o=i(2);i(53),i(109),o.extendComponentView({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new n.Rect({shape:t.coordinateSystem.getRect(),style:r.defaults({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))}}),o.registerPreprocessor(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})})},function(t,e,i){function n(){this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this.init.apply(this,arguments)}var r=i(15),o=n.prototype;o.parse=function(t){return t},o.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},o.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},o.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},o.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},o.unionExtentFromData=function(t,e){this.unionExtent(t.getDataExtent(e,!0))},o.getExtent=function(){return this._extent.slice()},o.setExtent=function(t,e){var i=this._extent;isNaN(t)||(i[0]=t),isNaN(e)||(i[1]=e)},o.getTicksLabels=function(){for(var t=[],e=this.getTicks(),i=0;i<e.length;i++)t.push(this.getLabel(e[i]));return t},r.enableClassExtend(n),r.enableClassManagement(n,{registerWhenExtend:!0}),t.exports=n},function(t,e){var i=1;"undefined"!=typeof window&&(i=Math.max(window.devicePixelRatio||1,1));var n={debugMode:0,devicePixelRatio:i};t.exports=n},function(t,e,i){var n=i(1),r=i(60),o=i(9),a=function(t){t=t||{},r.call(this,t);for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};a.prototype={constructor:a,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,i=0;i<e.length;i++)if(e[i].name===t)return e[i]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var i=this._children,n=i.indexOf(e);n>=0&&(i.splice(n,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,i=this.__zr;e&&e!==t.__storage&&(e.addToMap(t),t instanceof a&&t.addChildrenToStorage(e)),i&&i.refresh()},remove:function(t){var e=this.__zr,i=this.__storage,r=this._children,o=n.indexOf(r,t);return o<0?this:(r.splice(o,1),t.parent=null,i&&(i.delFromMap(t.id),t instanceof a&&t.delChildrenFromStorage(i)),e&&e.refresh(),this)},removeAll:function(){var t,e,i=this._children,n=this.__storage;for(e=0;e<i.length;e++)t=i[e],n&&(n.delFromMap(t.id),t instanceof a&&t.delChildrenFromStorage(n)),t.parent=null;return i.length=0,this},eachChild:function(t,e){for(var i=this._children,n=0;n<i.length;n++){var r=i[n];t.call(e,r,n)}return this},traverse:function(t,e){for(var i=0;i<this._children.length;i++){var n=this._children[i];t.call(e,n),"group"===n.type&&n.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var i=this._children[e];t.addToMap(i),i instanceof a&&i.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var i=this._children[e];t.delFromMap(i.id),i instanceof a&&i.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,i=new o(0,0,0,0),n=t||this._children,r=[],a=0;a<n.length;a++){var s=n[a];if(!s.ignore&&!s.invisible){var l=s.getBoundingRect(),h=s.getLocalTransform(r);h?(i.copy(l),i.applyTransform(h),e=e||i.clone(),e.union(i)):(e=e||l.clone(),e.union(l))}}return e||i}},n.inherits(a,r),t.exports=a},function(t,e,i){"use strict";function n(t){for(var e=0;e<t.length&&null==t[e];)e++;return t[e]}function r(t){var e=n(t);return null!=e&&!c.isArray(p(e))}function o(t,e,i){t=t||[];var n=e.get("coordinateSystem"),o=m[n],a=f.get(n),s=o&&o(t,e,i),v=s&&s.dimensions;v||(v=a&&a.dimensions||["x","y"],v=u(v,t,v.concat(["value"])));var y=s?s.categoryIndex:-1,x=new h(v,e),_=l(s,t),b={},w=y>=0&&r(t)?function(t,e,i,n){return d.isDataItemOption(t)&&(x.hasItemOption=!0),n===y?i:g(p(t),v[n])}:function(t,e,i,n){var r=p(t),o=g(r&&r[n],v[n]);d.isDataItemOption(t)&&(x.hasItemOption=!0);var a=s&&s.categoryAxesModels;return a&&a[e]&&"string"==typeof o&&(b[e]=b[e]||a[e].getCategories(),o=c.indexOf(b[e],o),o<0&&!isNaN(o)&&(o=+o)),o};return x.hasItemOption=!1,x.initData(t,_,w),x}function a(t){return"category"!==t&&"time"!==t}function s(t){return"category"===t?"ordinal":"time"===t?"time":"float"}function l(t,e){var i,n=[],r=t&&t.dimensions[t.categoryIndex];if(r&&(i=t.categoryAxesModels[r.name]),i){var o=i.getCategories();if(o){var a=e.length;if(c.isArray(e[0])&&e[0].length>1){n=[];for(var s=0;s<a;s++)n[s]=o[e[s][t.categoryIndex||0]]}else n=o.slice(0)}}return n}var h=i(14),u=i(27),c=i(1),d=i(6),f=i(23),p=d.getDataItemValue,g=d.converDataValue,m={cartesian2d:function(t,e,i){var n=c.map(["xAxis","yAxis"],function(t){return i.queryComponents({mainType:t,index:e.get(t+"Index"),id:e.get(t+"Id")})[0]}),r=n[0],o=n[1],l=r.get("type"),h=o.get("type"),d=[{name:"x",type:s(l),stackable:a(l)},{name:"y",type:s(h),stackable:a(h)}],f="category"===l,p="category"===h;u(d,t,["x","y","z"]);var g={};return f&&(g.x=r),p&&(g.y=o),{dimensions:d,categoryIndex:f?0:p?1:-1,categoryAxesModels:g}},singleAxis:function(t,e,i){var n=i.queryComponents({mainType:"singleAxis",index:e.get("singleAxisIndex"),id:e.get("singleAxisId")})[0],r=n.get("type"),o="category"===r,l=[{name:"single",type:s(r),stackable:a(r)}];u(l,t);var h={};return o&&(h.single=n),{dimensions:l,categoryIndex:o?0:-1,categoryAxesModels:h}},polar:function(t,e,i){var n=i.queryComponents({mainType:"polar",index:e.get("polarIndex"),id:e.get("polarId")})[0],r=n.findAxisModel("angleAxis"),o=n.findAxisModel("radiusAxis"),l=o.get("type"),h=r.get("type"),c=[{name:"radius",type:s(l),stackable:a(l)},{name:"angle",type:s(h),stackable:a(h)}],d="category"===h,f="category"===l;u(c,t,["radius","angle","value"]);var p={};return f&&(p.radius=o),d&&(p.angle=r),{dimensions:c,categoryIndex:d?1:f?0:-1,categoryAxesModels:p}},geo:function(t,e,i){return{dimensions:u([{name:"lng"},{name:"lat"}],t,["lng","lat","value"])}}};t.exports=o},function(t,e,i){function n(t){t=t||{},a.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new o(t.style),this._rect=null,this.__clipPaths=[]}var r=i(1),o=i(66),a=i(60),s=i(77);n.prototype={constructor:n,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:-1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this.getBoundingRect();return n.contain(i[0],i[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?a.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new o(t),this.dirty(!1),this}},r.inherits(n,a),r.mixin(n,s),t.exports=n},function(t,e){var i=function(t){this.colorStops=t||[]};i.prototype={constructor:i,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}},t.exports=i},function(t,e,i){var n=i(4),r=i(8),o=i(32),a=Math.floor,s=Math.ceil,l=n.getPrecisionSafe,h=n.round,u=o.extend({type:"interval",_interval:0,setExtent:function(t,e){var i=this._extent;isNaN(t)||(i[0]=parseFloat(t)),isNaN(e)||(i[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),u.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval||this.niceTicks(),this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice()},getTicks:function(){this._interval||this.niceTicks();var t=this._interval,e=this._extent,i=[],n=1e4;if(t){var r=this._niceExtent,o=l(t)+2;e[0]<r[0]&&i.push(e[0]);for(var a=r[0];a<=r[1];)if(i.push(a),a=h(a+t,o),i.length>n)return[];e[1]>(i.length?i[i.length-1]:r[1])&&i.push(e[1])}return i},getTicksLabels:function(){for(var t=[],e=this.getTicks(),i=0;i<e.length;i++)t.push(this.getLabel(e[i]));return t},getLabel:function(t){return r.addCommas(t)},niceTicks:function(t){t=t||5;var e=this._extent,i=e[1]-e[0];if(isFinite(i)){i<0&&(i=-i,e.reverse());var r=h(n.nice(i/t,!0),Math.max(l(e[0]),l(e[1]))+2),o=l(r)+2,u=[h(s(e[0]/r)*r,o),h(a(e[1]/r)*r,o)];this._interval=r,this._niceExtent=u}},niceExtent:function(t,e,i){var n=this._extent;if(n[0]===n[1])if(0!==n[0]){var r=n[0];i?n[0]-=r/2:(n[1]+=r/2,n[0]-=r/2)}else n[1]=1;var o=n[1]-n[0];isFinite(o)||(n[0]=0,n[1]=1),this.niceTicks(t);var l=this._interval;e||(n[0]=h(a(n[0]/l)*l)),i||(n[1]=h(s(n[1]/l)*l))}});u.create=function(){return new u},t.exports=u},function(t,e,i){function n(t){this.group=new o.Group,this._symbolCtor=t||a}function r(t,e,i){var n=t.getItemLayout(e);return n&&!isNaN(n[0])&&!isNaN(n[1])&&!(i&&i(e))&&"none"!==t.getItemVisual(e,"symbol")}var o=i(3),a=i(50),s=n.prototype;s.updateData=function(t,e){var i=this.group,n=t.hostModel,a=this._data,s=this._symbolCtor,l={itemStyle:n.getModel("itemStyle.normal").getItemStyle(["color"]),hoverItemStyle:n.getModel("itemStyle.emphasis").getItemStyle(),symbolRotate:n.get("symbolRotate"),symbolOffset:n.get("symbolOffset"),hoverAnimation:n.get("hoverAnimation"),labelModel:n.getModel("label.normal"),hoverLabelModel:n.getModel("label.emphasis")};t.diff(a).add(function(n){var o=t.getItemLayout(n);if(r(t,n,e)){var a=new s(t,n,l);a.attr("position",o),t.setItemGraphicEl(n,a),i.add(a)}}).update(function(h,u){var c=a.getItemGraphicEl(u),d=t.getItemLayout(h);return r(t,h,e)?(c?(c.updateData(t,h,l),o.updateProps(c,{position:d},n)):(c=new s(t,h),c.attr("position",d)),i.add(c),void t.setItemGraphicEl(h,c)):void i.remove(c)}).remove(function(t){var e=a.getItemGraphicEl(t);e&&e.fadeOut(function(){i.remove(e)})}).execute(),this._data=t},s.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,i){var n=t.getItemLayout(i);e.attr("position",n)})},s.remove=function(t){var e=this.group,i=this._data;i&&(t?i.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())},t.exports=n},function(t,e,i){function n(t){var e={};return c(["start","end","startValue","endValue","throttle"],function(i){t.hasOwnProperty(i)&&(e[i]=t[i])}),e}function r(t,e,i,n){null!=i[e]&&null==i[t]&&(n[t]=null)}var o=i(1),a=i(10),s=i(2),l=i(6),h=i(68),u=i(182),c=o.each,d=h.eachAxisDim,f=s.extendComponentModel({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","singleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:"filter",throttle:null,start:0,end:100,startValue:null,endValue:null},init:function(t,e,i){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0;var r=n(t);this.mergeDefaultAndTheme(t,i),this.doInit(r)},mergeOption:function(t){var e=n(t);o.merge(this.option,t,!0),this.doInit(e)},doInit:function(t){var e=this.option;a.canvasSupported||(e.realtime=!1),this._setDefaultThrottle(t),r("start","startValue",t,e),r("end","endValue",t,e),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var t=this._axisProxies;this.eachTargetAxis(function(e,i,n,r){var o=this.dependentModels[e.axis][i],a=o.__dzAxisProxy||(o.__dzAxisProxy=new u(e.name,i,this,r));t[e.name+"_"+i]=a},this)},_resetTarget:function(){var t=this.option,e=this._judgeAutoMode();d(function(e){var i=e.axisIndex;t[i]=l.normalizeToArray(t[i])},this),"axisIndex"===e?this._autoSetAxisIndex():"orient"===e&&this._autoSetOrient()},_judgeAutoMode:function(){var t=this.option,e=!1;d(function(i){null!=t[i.axisIndex]&&(e=!0)},this);var i=t.orient;return null==i&&e?"orient":e?void 0:(null==i&&(t.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var t=!0,e=this.get("orient",!0),i=this.option,n=this.dependentModels;if(t){var r="vertical"===e?"y":"x";n[r+"Axis"].length?(i[r+"AxisIndex"]=[0],t=!1):c(n.singleAxis,function(n){t&&n.get("orient",!0)===e&&(i.singleAxisIndex=[n.componentIndex],t=!1)})}t&&d(function(e){if(t){var n=[],r=this.dependentModels[e.axis];if(r.length&&!n.length)for(var o=0,a=r.length;o<a;o++)"category"===r[o].get("type")&&n.push(o);i[e.axisIndex]=n,n.length&&(t=!1)}},this),t&&this.ecModel.eachSeries(function(t){this._isSeriesHasAllAxesTypeOf(t,"value")&&d(function(e){var n=i[e.axisIndex],r=t.get(e.axisIndex),a=t.get(e.axisId),s=t.ecModel.queryComponents({mainType:e.axis,index:r,id:a})[0];r=s.componentIndex,o.indexOf(n,r)<0&&n.push(r)})},this)},_autoSetOrient:function(){var t;this.eachTargetAxis(function(e){!t&&(t=e.name)},this),this.option.orient="y"===t?"vertical":"horizontal"},_isSeriesHasAllAxesTypeOf:function(t,e){var i=!0;return d(function(n){var r=t.get(n.axisIndex),o=this.dependentModels[n.axis][r];o&&o.get("type")===e||(i=!1)},this),i},_setDefaultThrottle:function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},getFirstTargetAxisModel:function(){var t;return d(function(e){if(null==t){var i=this.get(e.axisIndex);i.length&&(t=this.dependentModels[e.axis][i[0]])}},this),t},eachTargetAxis:function(t,e){var i=this.ecModel;d(function(n){c(this.get(n.axisIndex),function(r){t.call(e,n,r,this,i)},this)},this)},getAxisProxy:function(t,e){return this._axisProxies[t+"_"+e]},setRawRange:function(t){c(["start","end","startValue","endValue"],function(e){this.option[e]=t[e]},this)},getPercentRange:function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},getValueRange:function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var i=this.findRepresentativeAxisProxy();return i?i.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(){var t=this._axisProxies;for(var e in t)if(t.hasOwnProperty(e)&&t[e].hostedBy(this))return t[e];for(var e in t)if(t.hasOwnProperty(e)&&!t[e].hostedBy(this))return t[e]}});t.exports=f},function(t,e,i){var n=i(59);t.exports=n.extend({type:"dataZoom",render:function(t,e,i,n){this.dataZoomModel=t,this.ecModel=e,this.api=i},getTargetCoordInfo:function(){function t(t,e,i,n){for(var r,o=0;o<i.length;o++)if(i[o].model===t){r=i[o];break}r||i.push(r={model:t,axisModels:[],coordIndex:n}),r.axisModels.push(e)}var e=this.dataZoomModel,i=this.ecModel,n={};return e.eachTargetAxis(function(e,r){var o=i.getComponent(e.axis,r);if(o){var a=o.getCoordSysModel();a&&t(a,o,n[a.mainType]||(n[a.mainType]=[]),a.componentIndex)}},this),n}})},function(t,e,i){function n(t,e){var i=t[1]-t[0],n=e,r=i/n/2;t[0]+=r,t[1]-=r}var r=i(4),o=r.linearMap,a=i(1),s=[0,1],l=function(t,e,i){this.dim=t,this.scale=e,this._extent=i||[0,0],this.inverse=!1,this.onBand=!1};l.prototype={constructor:l,contain:function(t){var e=this._extent,i=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return t>=i&&t<=n},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){var t=this._extent.slice();return t},getPixelPrecision:function(t){return r.getPixelPrecision(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var i=this._extent;i[0]=t,i[1]=e},dataToCoord:function(t,e){var i=this._extent,r=this.scale;return t=r.normalize(t),this.onBand&&"ordinal"===r.type&&(i=i.slice(),n(i,r.count())),o(t,s,i,e)},coordToData:function(t,e){var i=this._extent,r=this.scale;this.onBand&&"ordinal"===r.type&&(i=i.slice(),n(i,r.count()));var a=o(t,i,s,e);return this.scale.scale(a)},getTicksCoords:function(t){if(this.onBand&&!t){for(var e=this.getBands(),i=[],n=0;n<e.length;n++)i.push(e[n][0]);return e[n-1]&&i.push(e[n-1][1]),i}return a.map(this.scale.getTicks(),this.dataToCoord,this)},getLabelsCoords:function(){return a.map(this.scale.getTicks(),this.dataToCoord,this)},getBands:function(){for(var t=this.getExtent(),e=[],i=this.scale.count(),n=t[0],r=t[1],o=r-n,a=0;a<i;a++)e.push([o*a/i+n,o*(a+1)/i+n]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),i=e[1]-e[0]+(this.onBand?1:0);0===i&&(i=1);var n=Math.abs(t[1]-t[0]);return Math.abs(n)/i},isBlank:function(){return this._isBlank},setBlank:function(t){this._isBlank=t}},t.exports=l},function(t,e){"use strict";function i(t){return t}function n(t,e,n,r){this._old=t,this._new=e,this._oldKeyGetter=n||i,this._newKeyGetter=r||i}function r(t,e,i,n){for(var r=0;r<t.length;r++){var o=n(t[r],r),a=e[o];null==a?(i.push(o),e[o]=r):(a.length||(e[o]=a=[a]),a.push(r))}}n.prototype={constructor:n,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t,e=this._old,i=this._new,n=this._oldKeyGetter,o=this._newKeyGetter,a={},s={},l=[],h=[];for(r(e,a,l,n),r(i,s,h,o),t=0;t<e.length;t++){var u=l[t],c=s[u];if(null!=c){var d=c.length;d?(1===d&&(s[u]=null),c=c.unshift()):s[u]=null,this._update&&this._update(c,t)}else this._remove&&this._remove(t)}for(var t=0;t<h.length;t++){var u=h[t];if(s.hasOwnProperty(u)){var c=s[u];if(null==c)continue;if(c.length)for(var f=0,d=c.length;f<d;f++)this._add&&this._add(c[f]);else this._add&&this._add(c)}}}},t.exports=n},function(t,e,i){var n=i(1),r=i(15),o=r.parseClassType,a=0,s={},l="_";s.getUID=function(t){return[t||"",a++,Math.random()].join(l)},s.enableSubTypeDefaulter=function(t){var e={};return t.registerSubTypeDefaulter=function(t,i){t=o(t),e[t.main]=i},t.determineSubType=function(i,n){var r=n.type;if(!r){var a=o(i).main;t.hasSubTypes(i)&&e[a]&&(r=e[a](n))}return r},t},s.enableTopologicalTravel=function(t,e){function i(t){var i={},a=[];return n.each(t,function(s){var l=r(i,s),h=l.originalDeps=e(s),u=o(h,t);l.entryCount=u.length,0===l.entryCount&&a.push(s),n.each(u,function(t){n.indexOf(l.predecessor,t)<0&&l.predecessor.push(t);var e=r(i,t);n.indexOf(e.successor,t)<0&&e.successor.push(s)})}),{graph:i,noEntryList:a}}function r(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function o(t,e){var i=[];return n.each(t,function(t){n.indexOf(e,t)>=0&&i.push(t)}),i}t.topologicalTravel=function(t,e,r,o){function a(t){h[t].entryCount--,0===h[t].entryCount&&u.push(t)}function s(t){c[t]=!0,a(t)}if(t.length){var l=i(e),h=l.graph,u=l.noEntryList,c={};for(n.each(t,function(t){c[t]=!0});u.length;){var d=u.pop(),f=h[d],p=!!c[d];p&&(r.call(o,d,f.originalDeps.slice()),delete c[d]),n.each(f.successor,p?s:a)}n.each(c,function(){throw new Error("Circle dependency may exists")})}}},t.exports=s},function(t,e){t.exports=function(t,e,i,n,r){n.eachRawSeriesByType(t,function(t){var r=t.getData(),o=t.get("symbol")||e,a=t.get("symbolSize");r.setVisual({legendSymbol:i||o,symbol:o,symbolSize:a}),n.isSeriesFiltered(t)||("function"==typeof a&&r.each(function(e){var i=t.getRawValue(e),n=t.getDataParams(e);r.setItemVisual(e,"symbolSize",a(i,n))}),r.each(function(t){var e=r.getItemModel(t),i=e.getShallow("symbol",!0),n=e.getShallow("symbolSize",!0);null!=i&&r.setItemVisual(t,"symbol",i),null!=n&&r.setItemVisual(t,"symbolSize",n)}))})}},function(t,e){function i(t){for(var e=0;t>=u;)e|=1&t,t>>=1;return t+e}function n(t,e,i,n){var o=e+1;if(o===i)return 1;if(n(t[o++],t[e])<0){for(;o<i&&n(t[o],t[o-1])<0;)o++;r(t,e,o)}else for(;o<i&&n(t[o],t[o-1])>=0;)o++;return o-e}function r(t,e,i){for(i--;e<i;){var n=t[e];t[e++]=t[i],t[i--]=n}}function o(t,e,i,n,r){for(n===e&&n++;n<i;n++){for(var o,a=t[n],s=e,l=n;s<l;)o=s+l>>>1,r(a,t[o])<0?l=o:s=o+1;var h=n-s;switch(h){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;h>0;)t[s+h]=t[s+h-1],h--}t[s]=a}}function a(t,e,i,n,r,o){var a=0,s=0,l=1;if(o(t,e[i+r])>0){for(s=n-r;l<s&&o(t,e[i+r+l])>0;)a=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;l<s&&o(t,e[i+r-l])<=0;)a=l,
+l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var h=a;a=r-l,l=r-h}for(a++;a<l;){var u=a+(l-a>>>1);o(t,e[i+u])>0?a=u+1:l=u}return l}function s(t,e,i,n,r,o){var a=0,s=0,l=1;if(o(t,e[i+r])<0){for(s=r+1;l<s&&o(t,e[i+r-l])<0;)a=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var h=a;a=r-l,l=r-h}else{for(s=n-r;l<s&&o(t,e[i+r+l])>=0;)a=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a<l;){var u=a+(l-a>>>1);o(t,e[i+u])<0?l=u:a=u+1}return l}function l(t,e){function i(t,e){u[y]=t,f[y]=e,y+=1}function n(){for(;y>1;){var t=y-2;if(t>=1&&f[t-1]<=f[t]+f[t+1]||t>=2&&f[t-2]<=f[t]+f[t-1])f[t-1]<f[t+1]&&t--;else if(f[t]>f[t+1])break;o(t)}}function r(){for(;y>1;){var t=y-2;t>0&&f[t-1]<f[t+1]&&t--,o(t)}}function o(i){var n=u[i],r=f[i],o=u[i+1],c=f[i+1];f[i]=r+c,i===y-3&&(u[i+1]=u[i+2],f[i+1]=f[i+2]),y--;var d=s(t[o],t,n,r,0,e);n+=d,r-=d,0!==r&&(c=a(t[n+r-1],t,o,c,c-1,e),0!==c&&(r<=c?l(n,r,o,c):h(n,r,o,c)))}function l(i,n,r,o){var l=0;for(l=0;l<n;l++)x[l]=t[i+l];var h=0,u=r,d=i;if(t[d++]=t[u++],0!==--o){if(1===n){for(l=0;l<o;l++)t[d+l]=t[u+l];return void(t[d+o]=x[h])}for(var f,g,m,v=p;;){f=0,g=0,m=!1;do if(e(t[u],x[h])<0){if(t[d++]=t[u++],g++,f=0,0===--o){m=!0;break}}else if(t[d++]=x[h++],f++,g=0,1===--n){m=!0;break}while((f|g)<v);if(m)break;do{if(f=s(t[u],x,h,n,0,e),0!==f){for(l=0;l<f;l++)t[d+l]=x[h+l];if(d+=f,h+=f,n-=f,n<=1){m=!0;break}}if(t[d++]=t[u++],0===--o){m=!0;break}if(g=a(x[h],t,u,o,0,e),0!==g){for(l=0;l<g;l++)t[d+l]=t[u+l];if(d+=g,u+=g,o-=g,0===o){m=!0;break}}if(t[d++]=x[h++],1===--n){m=!0;break}v--}while(f>=c||g>=c);if(m)break;v<0&&(v=0),v+=2}if(p=v,p<1&&(p=1),1===n){for(l=0;l<o;l++)t[d+l]=t[u+l];t[d+o]=x[h]}else{if(0===n)throw new Error;for(l=0;l<n;l++)t[d+l]=x[h+l]}}else for(l=0;l<n;l++)t[d+l]=x[h+l]}function h(i,n,r,o){var l=0;for(l=0;l<o;l++)x[l]=t[r+l];var h=i+n-1,u=o-1,d=r+o-1,f=0,g=0;if(t[d--]=t[h--],0!==--n){if(1===o){for(d-=n,h-=n,g=d+1,f=h+1,l=n-1;l>=0;l--)t[g+l]=t[f+l];return void(t[d]=x[u])}for(var m=p;;){var v=0,y=0,_=!1;do if(e(x[u],t[h])<0){if(t[d--]=t[h--],v++,y=0,0===--n){_=!0;break}}else if(t[d--]=x[u--],y++,v=0,1===--o){_=!0;break}while((v|y)<m);if(_)break;do{if(v=n-s(x[u],t,i,n,n-1,e),0!==v){for(d-=v,h-=v,n-=v,g=d+1,f=h+1,l=v-1;l>=0;l--)t[g+l]=t[f+l];if(0===n){_=!0;break}}if(t[d--]=x[u--],1===--o){_=!0;break}if(y=o-a(t[h],x,0,o,o-1,e),0!==y){for(d-=y,u-=y,o-=y,g=d+1,f=u+1,l=0;l<y;l++)t[g+l]=x[f+l];if(o<=1){_=!0;break}}if(t[d--]=t[h--],0===--n){_=!0;break}m--}while(v>=c||y>=c);if(_)break;m<0&&(m=0),m+=2}if(p=m,p<1&&(p=1),1===o){for(d-=n,h-=n,g=d+1,f=h+1,l=n-1;l>=0;l--)t[g+l]=t[f+l];t[d]=x[u]}else{if(0===o)throw new Error;for(f=d-(o-1),l=0;l<o;l++)t[f+l]=x[l]}}else for(f=d-(o-1),l=0;l<o;l++)t[f+l]=x[l]}var u,f,p=c,g=0,m=d,v=0,y=0;g=t.length,g<2*d&&(m=g>>>1);var x=[];v=g<120?5:g<1542?10:g<119151?19:40,u=[],f=[],this.mergeRuns=n,this.forceMergeRuns=r,this.pushRun=i}function h(t,e,r,a){r||(r=0),a||(a=t.length);var s=a-r;if(!(s<2)){var h=0;if(s<u)return h=n(t,r,a,e),void o(t,r,a,r+h,e);var c=new l(t,e),d=i(s);do{if(h=n(t,r,a,e),h<d){var f=s;f>d&&(f=d),o(t,r,r+f,r+h,e),h=f}c.pushRun(r,h),c.mergeRuns(),s-=h,r+=h}while(0!==s);c.forceMergeRuns()}}var u=32,c=7,d=256;t.exports=h},function(t,e){var i={},n="\0__throttleOriginMethod",r="\0__throttleRate",o="\0__throttleType";i.throttle=function(t,e,i){function n(){h=(new Date).getTime(),u=null,t.apply(a,s||[])}var r,o,a,s,l=0,h=0,u=null;e=e||0;var c=function(){r=(new Date).getTime(),a=this,s=arguments,o=r-(i?l:h)-e,clearTimeout(u),i?u=setTimeout(n,e):o>=0?n():u=setTimeout(n,-o),l=r};return c.clear=function(){u&&(clearTimeout(u),u=null)},c},i.createOrUpdate=function(t,e,a,s){var l=t[e];if(l){var h=l[n]||l,u=l[o],c=l[r];if(c!==a||u!==s){if(null==a||!s)return t[e]=h;l=t[e]=i.throttle(h,a,"debounce"===s),l[n]=h,l[o]=s,l[r]=a}return l}},i.clear=function(t,e){var i=t[e];i&&i[n]&&(t[e]=i[n])},t.exports=i},function(t,e,i){var n=i(33);t.exports=function(){if(0!==n.debugMode)if(1==n.debugMode)for(var t in arguments)throw new Error(arguments[t]);else if(n.debugMode>1)for(var t in arguments)console.log(arguments[t])}},function(t,e,i){function n(t){r.call(this,t)}var r=i(36),o=i(9),a=i(1),s=i(151),l=new s(50);n.prototype={constructor:n,type:"image",brush:function(t,e){var i,n=this.style,r=n.image;if(n.bind(t,this,e),i="string"==typeof r?this._image:r,!i&&r){var o=l.get(r);if(!o)return i=new Image,i.onload=function(){i.onload=null;for(var t=0;t<o.pending.length;t++)o.pending[t].dirty()},o={image:i,pending:[this]},i.src=r,l.put(r,o),void(this._image=i);if(i=o.image,this._image=i,!i.width||!i.height)return void o.pending.push(this)}if(i){var a=n.width||i.width,s=n.height||i.height,h=n.x||0,u=n.y||0;if(!i.width||!i.height)return;if(this.setTransform(t),n.sWidth&&n.sHeight){var c=n.sx||0,d=n.sy||0;t.drawImage(i,c,d,n.sWidth,n.sHeight,h,u,a,s)}else if(n.sx&&n.sy){var c=n.sx,d=n.sy,f=a-c,p=s-d;t.drawImage(i,c,d,f,p,h,u,a,s)}else t.drawImage(i,h,u,a,s);null==n.width&&(n.width=a),null==n.height&&(n.height=s),this.restoreTransform(t),null!=n.text&&this.drawRectText(t,this.getBoundingRect())}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new o(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},a.inherits(n,r),t.exports=n},function(t,e,i){function n(t,e){var i=t.getItemVisual(e,"symbolSize");return i instanceof Array?i.slice():[+i,+i]}function r(t){return[t[0]/2,t[1]/2]}function o(t,e,i){h.Group.call(this),this.updateData(t,e,i)}function a(t,e){this.parent.drift(t,e)}var s=i(1),l=i(24),h=i(3),u=i(4),c=o.prototype;c._createSymbol=function(t,e,i,n){this.removeAll();var o=e.hostModel,s=e.getItemVisual(i,"color"),u=l.createSymbol(t,-1,-1,2,2,s);u.attr({z2:100,culling:!0,scale:[0,0]}),u.drift=a,h.initProps(u,{scale:r(n)},o,i),this._symbolType=t,this.add(u)},c.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(t)},c.getSymbolPath=function(){return this.childAt(0)},c.getScale=function(){return this.childAt(0).scale},c.highlight=function(){this.childAt(0).trigger("emphasis")},c.downplay=function(){this.childAt(0).trigger("normal")},c.setZ=function(t,e){var i=this.childAt(0);i.zlevel=t,i.z=e},c.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":"pointer"},c.updateData=function(t,e,i){this.silent=!1;var o=t.getItemVisual(e,"symbol")||"circle",a=t.hostModel,s=n(t,e);if(o!==this._symbolType)this._createSymbol(o,t,e,s);else{var l=this.childAt(0);h.updateProps(l,{scale:r(s)},a,e)}this._updateCommon(t,e,s,i),this._seriesModel=a};var d=["itemStyle","normal"],f=["itemStyle","emphasis"],p=["label","normal"],g=["label","emphasis"];c._updateCommon=function(t,e,i,n){var o=this.childAt(0),a=t.hostModel,l=t.getItemVisual(e,"color");"image"!==o.type&&o.useStyle({strokeNoScale:!0}),n=n||null;var c=n&&n.itemStyle,m=n&&n.hoverItemStyle,v=n&&n.symbolRotate,y=n&&n.symbolOffset,x=n&&n.labelModel,_=n&&n.hoverLabelModel,b=n&&n.hoverAnimation;if(!n||t.hasItemOption){var w=t.getItemModel(e);c=w.getModel(d).getItemStyle(["color"]),m=w.getModel(f).getItemStyle(),v=w.getShallow("symbolRotate"),y=w.getShallow("symbolOffset"),x=w.getModel(p),_=w.getModel(g),b=w.getShallow("hoverAnimation")}else m=s.extend({},m);var M=o.style;o.attr("rotation",(v||0)*Math.PI/180||0),y&&o.attr("position",[u.parsePercent(y[0],i[0]),u.parsePercent(y[1],i[1])]),o.setColor(l),o.setStyle(c);var S=t.getItemVisual(e,"opacity");null!=S&&(M.opacity=S);for(var T,A,I=t.dimensions.slice();I.length&&(T=I.pop(),A=t.getDimensionInfo(T).type,"ordinal"===A||"time"===A););null!=T&&x.getShallow("show")?(h.setText(M,x,l),M.text=s.retrieve(a.getFormattedLabel(e,"normal"),t.get(T,e))):M.text="",null!=T&&_.getShallow("show")?(h.setText(m,_,l),m.text=s.retrieve(a.getFormattedLabel(e,"emphasis"),t.get(T,e))):m.text="",o.off("mouseover").off("mouseout").off("emphasis").off("normal"),o.hoverStyle=m,h.setHoverStyle(o);var C=r(i);if(b&&a.isAnimationEnabled()){var k=function(){var t=C[1]/C[0];this.animateTo({scale:[Math.max(1.1*C[0],C[0]+3),Math.max(1.1*C[1],C[1]+3*t)]},400,"elasticOut")},L=function(){this.animateTo({scale:C},400,"elasticOut")};o.on("mouseover",k).on("mouseout",L).on("emphasis",k).on("normal",L)}},c.fadeOut=function(t){var e=this.childAt(0);this.silent=!0,e.style.text="",h.updateProps(e,{scale:[0,0]},this._seriesModel,this.dataIndex,t)},s.inherits(o,h.Group),t.exports=o},function(t,e,i){function n(t){var e={componentType:t.mainType};return e[t.mainType+"Index"]=t.componentIndex,e}function r(t,e,i){var n,r,o=d(e-t.rotation);return f(o)?(r=i>0?"top":"bottom",n="center"):f(o-v)?(r=i>0?"bottom":"top",n="center"):(r="middle",n=o>0&&o<v?i>0?"right":"left":i>0?"left":"right"),{rotation:o,textAlign:n,verticalAlign:r}}function o(t,e,i,n){var r,o,a=d(i-t.rotation),s=n[0]>n[1],l="start"===e&&!s||"start"!==e&&s;return f(a-v/2)?(o=l?"bottom":"top",r="center"):f(a-1.5*v)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*v&&a>v/2?l?"left":"right":l?"right":"left"),{rotation:a,textAlign:r,verticalAlign:o}}function a(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)}var s=i(1),l=i(8),h=i(3),u=i(11),c=i(4),d=c.remRadian,f=c.isRadianAroundZero,p=i(5),g=p.applyTransform,m=s.retrieve,v=Math.PI,y=function(t,e){this.opt=e,this.axisModel=t,s.defaults(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new h.Group;var i=new h.Group({position:e.position.slice(),rotation:e.rotation});i.updateTransform(),this._transform=i.transform,this._dumbGroup=i};y.prototype={constructor:y,hasBuilder:function(t){return!!x[t]},add:function(t){x[t].call(this)},getGroup:function(){return this.group}};var x={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var i=this.axisModel.axis.getExtent(),n=this._transform,r=[i[0],0],o=[i[1],0];n&&(g(r,r,n),g(o,o,n)),this.group.add(new h.Line(h.subPixelOptimizeLine({anid:"line",shape:{x1:r[0],y1:r[1],x2:o[0],y2:o[1]},style:s.extend({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle()),strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1})))}},axisTick:function(){var t=this.axisModel,e=t.axis;if(t.get("axisTick.show")&&!e.isBlank())for(var i=t.getModel("axisTick"),n=this.opt,r=i.getModel("lineStyle"),o=i.get("length"),a=b(i,n.labelInterval),l=e.getTicksCoords(i.get("alignWithLabel")),u=e.scale.getTicks(),c=[],d=[],f=this._transform,p=0;p<l.length;p++)if(!_(e,p,a)){var m=l[p];c[0]=m,c[1]=0,d[0]=m,d[1]=n.tickDirection*o,f&&(g(c,c,f),g(d,d,f)),this.group.add(new h.Line(h.subPixelOptimizeLine({anid:"tick_"+u[p],shape:{x1:c[0],y1:c[1],x2:d[0],y2:d[1]},style:s.defaults(r.getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")}),z2:2,silent:!0})))}},axisLabel:function(){function t(t,e){var i=t&&t.getBoundingRect().clone(),n=e&&e.getBoundingRect().clone();if(i&&n)return i.applyTransform(t.getLocalTransform()),n.applyTransform(e.getLocalTransform()),i.intersect(n)}var e=this.opt,i=this.axisModel,o=i.axis,l=m(e.axisLabelShow,i.get("axisLabel.show"));if(l&&!o.isBlank()){var c=i.getModel("axisLabel"),d=c.getModel("textStyle"),f=c.get("margin"),p=o.scale.getTicks(),g=i.getFormattedLabels(),y=m(e.labelRotation,c.get("rotate"))||0;y=y*v/180;var x=r(e,y,e.labelDirection),b=i.get("data"),w=[],M=a(i),S=i.get("triggerEvent");if(s.each(p,function(t,r){if(!_(o,r,e.labelInterval)){var a=d;b&&b[t]&&b[t].textStyle&&(a=new u(b[t].textStyle,d,i.ecModel));var s=a.getTextColor()||i.get("axisLine.lineStyle.color"),l=o.dataToCoord(t),c=[l,e.labelOffset+e.labelDirection*f],p=o.scale.getLabel(t),m=new h.Text({anid:"label_"+t,style:{text:g[r],textAlign:a.get("align",!0)||x.textAlign,textVerticalAlign:a.get("baseline",!0)||x.verticalAlign,textFont:a.getFont(),fill:"function"==typeof s?s(p):s},position:c,rotation:x.rotation,silent:M,z2:10});S&&(m.eventData=n(i),m.eventData.targetType="axisLabel",m.eventData.value=p),this._dumbGroup.add(m),m.updateTransform(),w.push(m),this.group.add(m),m.decomposeTransform()}},this),null!=i.getMin()){var T=w[0],A=w[1];t(T,A)&&(T.ignore=!0)}if(null!=i.getMax()){var I=w[w.length-1],C=w[w.length-2];t(C,I)&&(I.ignore=!0)}}},axisName:function(){var t=this.opt,e=this.axisModel,i=m(t.axisName,e.get("name"));if(i){var u,c=e.get("nameLocation"),d=t.nameDirection,f=e.getModel("nameTextStyle"),p=e.get("nameGap")||0,g=this.axisModel.axis.getExtent(),y=g[0]>g[1]?-1:1,x=["start"===c?g[0]-y*p:"end"===c?g[1]+y*p:(g[0]+g[1])/2,"middle"===c?t.labelOffset+d*p:0],_=e.get("nameRotate");null!=_&&(_=_*v/180);var b;"middle"===c?u=r(t,null!=_?_:t.rotation,d):(u=o(t,c,_||0,g),b=t.axisNameAvailableWidth,null!=b&&(b=Math.abs(b/Math.sin(u.rotation)),!isFinite(b)&&(b=null)));var w=f.getFont(),M=e.get("nameTruncate",!0)||{},S=M.ellipsis,T=m(M.maxWidth,b),A=null!=S&&null!=T?l.truncateText(i,T,w,S,{minChar:2,placeholder:M.placeholder}):i,I=e.get("tooltip",!0),C=e.mainType,k={componentType:C,name:i,$vars:["name"]};k[C+"Index"]=e.componentIndex;var L=new h.Text({anid:"name",__fullText:i,__truncatedText:A,style:{text:A,textFont:w,fill:f.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:u.textAlign,textVerticalAlign:u.verticalAlign},position:x,rotation:u.rotation,silent:a(e),z2:1,tooltip:I&&I.show?s.extend({content:i,formatter:function(){return i},formatterParams:k},I):null});e.get("triggerEvent")&&(L.eventData=n(e),L.eventData.targetType="axisName",L.eventData.name=i),this._dumbGroup.add(L),L.updateTransform(),this.group.add(L),L.decomposeTransform()}}},_=y.ifIgnoreOnTick=function(t,e,i){var n,r=t.scale;return"ordinal"===r.type&&("function"==typeof i?(n=r.getTicks()[e],!i(n,r.getLabel(n))):e%(i+1))},b=y.getInterval=function(t,e){var i=t.get("interval");return null!=i&&"auto"!=i||(i=e),i};t.exports=y},function(t,e,i){function n(t){return r.isObject(t)&&null!=t.value?t.value:t}var r=i(1),o=i(22);t.exports={getFormattedLabels:function(){return o.getFormattedLabels(this.axis,this.get("axisLabel.formatter"))},getCategories:function(){return"category"===this.get("type")&&r.map(this.get("data"),n)},getMin:function(t){var e=this.option,i=t||null==e.rangeStart?e.min:e.rangeStart;return null==i||"dataMin"===i||r.eqNaN(i)||(i=this.axis.scale.parse(i)),i},getMax:function(t){var e=this.option,i=t||null==e.rangeEnd?e.max:e.rangeEnd;return null==i||"dataMax"===i||r.eqNaN(i)||(i=this.axis.scale.parse(i)),i},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:r.noop,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}}},function(t,e,i){function n(t,e,i){return t.getCoordSysModel()===e}function r(t){var e,i=t.model,n=i.getFormattedLabels(),r=i.getModel("axisLabel.textStyle"),o=1,a=n.length;a>40&&(o=Math.ceil(a/40));for(var s=0;s<a;s+=o)if(!t.isLabelIgnored(s)){var l=r.getTextRect(n[s]);e?e.union(l):e=l}return e}function o(t,e,i){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,i),this._model=t}function a(t,e){var i=t.getExtent(),n=i[0]+i[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return n-t+e}}function s(t,e){return c.map(y,function(e){var i=t.getReferringComponents(e)[0];return i})}function l(t){return"cartesian2d"===t.get("coordinateSystem")}var h=i(12),u=i(22),c=i(1),d=i(121),f=i(119),p=c.each,g=u.ifAxisCrossZero,m=u.niceScaleExtent;i(122);var v=o.prototype;v.type="grid",v.getRect=function(){return this._rect},v.update=function(t,e){function i(t){var e=n[t];for(var i in e)if(e.hasOwnProperty(i)){var r=e[i];if(r&&("category"===r.type||!g(r)))return!0}return!1}var n=this._axesMap;this._updateScale(t,this._model),p(n.x,function(t){m(t,t.model)}),p(n.y,function(t){m(t,t.model)}),p(n.x,function(t){i("y")&&(t.onZero=!1)}),p(n.y,function(t){i("x")&&(t.onZero=!1)}),this.resize(this._model,e)},v.resize=function(t,e){function i(){p(o,function(t){var e=t.isHorizontal(),i=e?[0,n.width]:[0,n.height],r=t.inverse?1:0;t.setExtent(i[r],i[1-r]),a(t,e?n.x:n.y)})}var n=h.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=n;var o=this._axesList;i(),t.get("containLabel")&&(p(o,function(t){if(!t.model.get("axisLabel.inside")){var e=r(t);if(e){var i=t.isHorizontal()?"height":"width",o=t.model.get("axisLabel.margin");n[i]-=e[i]+o,"top"===t.position?n.y+=e.height+o:"left"===t.position&&(n.x+=e.width+o)}}}),i())},v.getAxis=function(t,e){var i=this._axesMap[t];if(null!=i){if(null==e)for(var n in i)if(i.hasOwnProperty(n))return i[n];return i[e]}},v.getCartesian=function(t,e){if(null!=t&&null!=e){var i="x"+t+"y"+e;return this._coordsMap[i]}for(var n=0,r=this._coordsList;n<r.length;n++)if(r[n].getAxis("x").index===t||r[n].getAxis("y").index===e)return r[n]},v.convertToPixel=function(t,e,i){var n=this._findConvertTarget(t,e);return n.cartesian?n.cartesian.dataToPoint(i):n.axis?n.axis.toGlobalCoord(n.axis.dataToCoord(i)):null},v.convertFromPixel=function(t,e,i){var n=this._findConvertTarget(t,e);return n.cartesian?n.cartesian.pointToData(i):n.axis?n.axis.coordToData(n.axis.toLocalCoord(i)):null},v._findConvertTarget=function(t,e){var i,n,r=e.seriesModel,o=e.xAxisModel||r&&r.getReferringComponents("xAxis")[0],a=e.yAxisModel||r&&r.getReferringComponents("yAxis")[0],s=e.gridModel,l=this._coordsList;if(r)i=r.coordinateSystem,c.indexOf(l,i)<0&&(i=null);else if(o&&a)i=this.getCartesian(o.componentIndex,a.componentIndex);else if(o)n=this.getAxis("x",o.componentIndex);else if(a)n=this.getAxis("y",a.componentIndex);else if(s){var h=s.coordinateSystem;h===this&&(i=this._coordsList[0])}return{cartesian:i,axis:n}},v.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},v._initCartesian=function(t,e,i){function r(i){return function(r,l){if(n(r,t,e)){var h=r.get("position");"x"===i?"top"!==h&&"bottom"!==h&&(h="bottom",o[h]&&(h="top"===h?"bottom":"top")):"left"!==h&&"right"!==h&&(h="left",o[h]&&(h="left"===h?"right":"left")),o[h]=!0;var c=new f(i,u.createScaleByModel(r),[0,0],r.get("type"),h),d="category"===c.type;c.onBand=d&&r.get("boundaryGap"),c.inverse=r.get("inverse"),c.onZero=r.get("axisLine.onZero"),r.axis=c,c.model=r,c.grid=this,c.index=l,this._axesList.push(c),a[i][l]=c,s[i]++}}}var o={left:!1,right:!1,top:!1,bottom:!1},a={x:{},y:{}},s={x:0,y:0};return e.eachComponent("xAxis",r("x"),this),e.eachComponent("yAxis",r("y"),this),s.x&&s.y?(this._axesMap=a,void p(a.x,function(t,e){p(a.y,function(i,n){var r="x"+e+"y"+n,o=new d(r);o.grid=this,this._coordsMap[r]=o,this._coordsList.push(o),o.addAxis(t),o.addAxis(i)},this)},this)):(this._axesMap={},void(this._axesList=[]))},v._updateScale=function(t,e){function i(t,e,i){p(i.coordDimToDataDim(e.dim),function(i){e.scale.unionExtentFromData(t,i)})}c.each(this._axesList,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeries(function(r){if(l(r)){var o=s(r,t),a=o[0],h=o[1];if(!n(a,e,t)||!n(h,e,t))return;var u=this.getCartesian(a.componentIndex,h.componentIndex),c=r.getData(),d=u.getAxis("x"),f=u.getAxis("y");"list"===c.type&&(i(c,d,r),i(c,f,r))}},this)};var y=["xAxis","yAxis"];o.create=function(t,e){var i=[];return t.eachComponent("grid",function(n,r){var a=new o(n,t,e);a.name="grid_"+r,a.resize(n,e),n.coordinateSystem=a,i.push(a)}),t.eachSeries(function(e){if(l(e)){var i=s(e,t),n=i[0],r=i[1],o=n.getCoordSysModel(),a=o.coordinateSystem;e.coordinateSystem=a.getCartesian(n.componentIndex,r.componentIndex)}}),i},o.dimensions=d.prototype.dimensions,i(23).register("cartesian2d",o),t.exports=o},function(t,e,i){var n=i(86),r=i(1),o=i(13),a=i(12),s=["value","category","time","log"];t.exports=function(t,e,i,l){r.each(s,function(o){e.extend({type:t+"Axis."+o,mergeDefaultAndTheme:function(e,n){var s=this.layoutMode,l=s?a.getLayoutParams(e):{},h=n.getTheme();r.merge(e,h.get(o+"Axis")),r.merge(e,this.getDefaultOption()),e.type=i(t,e),s&&a.mergeLayoutParam(e,l,s)},defaultOption:r.mergeAll([{},n[o+"Axis"],l],!0)})}),o.registerSubTypeDefaulter(t+"Axis",r.curry(i,t))}},function(t,e,i){"use strict";function n(t,e){return e.type||(e.data?"category":"value")}var r=i(13),o=i(1),a=i(54),s=r.extend({type:"cartesian2dAxis",axis:null,init:function(){s.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){s.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){s.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});o.merge(s.prototype,i(52));var l={offset:0};a("x",s,n,l),a("y",s,n,l),t.exports=s},function(t,e){t.exports=function(t,e){e.eachSeriesByType(t,function(t){var e=t.getData(),i=t.coordinateSystem;if(i){var n=i.dimensions;"singleAxis"===i.type?e.each(n[0],function(t,n){e.setItemLayout(n,isNaN(t)?[NaN,NaN]:i.dataToPoint(t))}):e.each(n,function(t,n,r){e.setItemLayout(r,isNaN(t)||isNaN(n)?[NaN,NaN]:i.dataToPoint([t,n]))},!0)}})}},function(t,e,i){var n=i(15),r=n.set,o=n.get;t.exports={clearColorPalette:function(){r(this,"colorIdx",0),r(this,"colorNameMap",{})},getColorFromPalette:function(t,e){e=e||this;var i=o(e,"colorIdx")||0,n=o(e,"colorNameMap")||r(e,"colorNameMap",{});if(n[t])return n[t];var a=this.get("color",!0)||[];if(a.length){var s=a[i];return t&&(n[t]=s),r(e,"colorIdx",(i+1)%a.length),s}}}},function(t,e){t.exports=function(t,e){var i=e.findComponents({mainType:"legend"});i&&i.length&&e.eachSeriesByType(t,function(t){var e=t.getData();e.filterSelf(function(t){for(var n=e.getName(t),r=0;r<i.length;r++)if(!i[r].isSelected(n))return!1;return!0},this)},this)}},function(t,e,i){var n=i(34),r=i(44),o=i(15),a=function(){this.group=new n,this.uid=r.getUID("viewComponent")};a.prototype={constructor:a,init:function(t,e){},render:function(t,e,i,n){},dispose:function(){}};var s=a.prototype;s.updateView=s.updateLayout=s.updateVisual=function(t,e,i,n){},o.enableClassExtend(a),o.enableClassManagement(a,{registerWhenExtend:!0}),t.exports=a},function(t,e,i){"use strict";var n=i(64),r=i(21),o=i(92),a=i(167),s=i(1),l=function(t){o.call(this,t),r.call(this,t),a.call(this,t),this.id=t.id||n()};l.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var i=this[t];i||(i=this[t]=[]),i[0]=e[0],i[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var i in t)t.hasOwnProperty(i)&&this.attrKV(i,t[i]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var i=0;i<e.length;i++)t.animation.addAnimator(e[i]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var i=0;i<e.length;i++)t.animation.removeAnimator(e[i]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},s.mixin(l,a),s.mixin(l,o),s.mixin(l,r),t.exports=l},function(t,e,i){function n(t,e){return t[e]}function r(t,e,i){t[e]=i}function o(t,e,i){return(e-t)*i+t}function a(t,e,i){return i>.5?e:t}function s(t,e,i,n,r){var a=t.length;if(1==r)for(var s=0;s<a;s++)n[s]=o(t[s],e[s],i);else for(var l=t[0].length,s=0;s<a;s++)for(var h=0;h<l;h++)n[s][h]=o(t[s][h],e[s][h],i)}function l(t,e,i){var n=t.length,r=e.length;if(n!==r){var o=n>r;if(o)t.length=r;else for(var a=n;a<r;a++)t.push(1===i?e[a]:x.call(e[a]))}for(var s=t[0]&&t[0].length,a=0;a<t.length;a++)if(1===i)isNaN(t[a])&&(t[a]=e[a]);else for(var l=0;l<s;l++)isNaN(t[a][l])&&(t[a][l]=e[a][l])}function h(t,e,i){if(t===e)return!0;var n=t.length;if(n!==e.length)return!1;if(1===i){for(var r=0;r<n;r++)if(t[r]!==e[r])return!1}else for(var o=t[0].length,r=0;r<n;r++)for(var a=0;a<o;a++)if(t[r][a]!==e[r][a])return!1;return!0}function u(t,e,i,n,r,o,a,s,l){var h=t.length;if(1==l)for(var u=0;u<h;u++)s[u]=c(t[u],e[u],i[u],n[u],r,o,a);else for(var d=t[0].length,u=0;u<h;u++)for(var f=0;f<d;f++)s[u][f]=c(t[u][f],e[u][f],i[u][f],n[u][f],r,o,a)}function c(t,e,i,n,r,o,a){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*a+(-3*(e-i)-2*s-l)*o+s*r+e}function d(t){if(y(t)){var e=t.length;if(y(t[0])){for(var i=[],n=0;n<e;n++)i.push(x.call(t[n]));return i}return x.call(t)}return t}function f(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function p(t,e,i,n,r){var d=t._getter,p=t._setter,v="spline"===e,x=n.length;if(x){var _,b=n[0].value,w=y(b),M=!1,S=!1,T=w&&y(b[0])?2:1;n.sort(function(t,e){return t.time-e.time}),_=n[x-1].time;for(var A=[],I=[],C=n[0].value,k=!0,L=0;L<x;L++){A.push(n[L].time/_);var P=n[L].value;if(w&&h(P,C,T)||!w&&P===C||(k=!1),C=P,"string"==typeof P){var D=m.parse(P);D?(P=D,M=!0):S=!0}I.push(P)}if(!k){for(var O=I[x-1],L=0;L<x-1;L++)w?l(I[L],O,T):!isNaN(I[L])||isNaN(O)||S||M||(I[L]=O);w&&l(d(t._target,r),O,T);var z,E,N,R,B,V,F=0,G=0;if(M)var H=[0,0,0,0];var W=function(t,e){var i;if(e<0)i=0;else if(e<G){for(z=Math.min(F+1,x-1),i=z;i>=0&&!(A[i]<=e);i--);i=Math.min(i,x-2)}else{for(i=F;i<x&&!(A[i]>e);i++);i=Math.min(i-1,x-2)}F=i,G=e;var n=A[i+1]-A[i];if(0!==n)if(E=(e-A[i])/n,v)if(R=I[i],N=I[0===i?i:i-1],B=I[i>x-2?x-1:i+1],V=I[i>x-3?x-1:i+2],w)u(N,R,B,V,E,E*E,E*E*E,d(t,r),T);else{var l;if(M)l=u(N,R,B,V,E,E*E,E*E*E,H,1),l=f(H);else{if(S)return a(R,B,E);l=c(N,R,B,V,E,E*E,E*E*E)}p(t,r,l)}else if(w)s(I[i],I[i+1],E,d(t,r),T);else{var l;if(M)s(I[i],I[i+1],E,H,1),l=f(H);else{if(S)return a(I[i],I[i+1],E);l=o(I[i],I[i+1],E)}p(t,r,l)}},Z=new g({target:t._target,life:_,loop:t._loop,delay:t._delay,onframe:W,ondestroy:i});return e&&"spline"!==e&&(Z.easing=e),Z}}}var g=i(145),m=i(19),v=i(1),y=v.isArrayLike,x=Array.prototype.slice,_=function(t,e,i,o){this._tracks={},this._target=t,this._loop=e||!1,this._getter=i||n,this._setter=o||r,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};_.prototype={when:function(t,e){var i=this._tracks;for(var n in e)if(e.hasOwnProperty(n)){if(!i[n]){i[n]=[];var r=this._getter(this._target,n);if(null==r)continue;0!==t&&i[n].push({time:0,value:d(r)})}i[n].push({time:t,value:e[n]})}return this},during:function(t){return this._onframeList.push(t),this},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,i=0;i<e;i++)t[i].call(this)},start:function(t){var e,i=this,n=0,r=function(){n--,n||i._doneCallback()};for(var o in this._tracks)if(this._tracks.hasOwnProperty(o)){var a=p(this,t,r,this._tracks[o],o);a&&(this._clipList.push(a),n++,this.animation&&this.animation.addClip(a),e=a)}if(e){var s=e.onframe;e.onframe=function(t,e){s(t,e);for(var n=0;n<i._onframeList.length;n++)i._onframeList[n](t,e)}}return n||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,i=this.animation,n=0;n<e.length;n++){var r=e[n];t&&r.onframe(this._target,1),i&&i.removeClip(r)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}},t.exports=_},function(t,e){t.exports="undefined"!=typeof window&&(window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)}},function(t,e){var i=2*Math.PI;t.exports={normalizeRadian:function(t){return t%=i,t<0&&(t+=i),t}}},function(t,e){var i=2311;t.exports=function(){return i++}},function(t,e){var i=function(t,e){this.image=t,this.repeat=e,this.type="pattern"};i.prototype.getCanvasPattern=function(t){return this._canvasPattern||(this._canvasPattern=t.createPattern(this.image,this.repeat))},t.exports=i},function(t,e){function i(t,e,i){var n=e.x,r=e.x2,o=e.y,a=e.y2;e.global||(n=n*i.width+i.x,r=r*i.width+i.x,o=o*i.height+i.y,a=a*i.height+i.y);var s=t.createLinearGradient(n,o,r,a);return s}function n(t,e,i){var n=i.width,r=i.height,o=Math.min(n,r),a=e.x,s=e.y,l=e.r;e.global||(a=a*n+i.x,s=s*r+i.y,l*=o);var h=t.createRadialGradient(a,s,0,a,s,l);return h}var r=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],o=function(t){this.extendFrom(t)};o.prototype={constructor:o,fill:"#000000",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,textFill:"#000",textStroke:null,textPosition:"inside",textOffset:null,textBaseline:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textTransform:!1,textRotation:0,blend:null,bind:function(t,e,i){for(var n=this,o=i&&i.style,a=!o,s=0;s<r.length;s++){var l=r[s],h=l[0];(a||n[h]!==o[h])&&(t[h]=n[h]||l[1])}if((a||n.fill!==o.fill)&&(t.fillStyle=n.fill),(a||n.stroke!==o.stroke)&&(t.strokeStyle=n.stroke),(a||n.opacity!==o.opacity)&&(t.globalAlpha=null==n.opacity?1:n.opacity),(a||n.blend!==o.blend)&&(t.globalCompositeOperation=n.blend||"source-over"),this.hasStroke()){var u=n.lineWidth;t.lineWidth=u/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&"none"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&"none"!==t&&this.lineWidth>0},extendFrom:function(t,e){if(t){var i=this;for(var n in t)!t.hasOwnProperty(n)||!e&&i.hasOwnProperty(n)||(i[n]=t[n])}},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,r){for(var o="radial"===e.type?n:i,a=o(t,e,r),s=e.colorStops,l=0;l<s.length;l++)a.addColorStop(s[l].offset,s[l].color);return a}};for(var a=o.prototype,s=0;s<r.length;s++){var l=r[s];l[0]in a||(a[l[0]]=l[1])}o.getGradient=a.getGradient,t.exports=o},function(t,e,i){var n=i(157),r=i(156);t.exports={buildPath:function(t,e,i){var o=e.points,a=e.smooth;if(o&&o.length>=2){if(a&&"spline"!==a){var s=r(o,a,i,e.smoothConstraint);t.moveTo(o[0][0],o[0][1]);for(var l=o.length,h=0;h<(i?l:l-1);h++){var u=s[2*h],c=s[2*h+1],d=o[(h+1)%l];t.bezierCurveTo(u[0],u[1],c[0],c[1],d[0],d[1])}}else{"spline"===a&&(o=n(o,i)),t.moveTo(o[0][0],o[0][1]);for(var h=1,f=o.length;h<f;h++)t.lineTo(o[h][0],o[h][1])}i&&t.closePath()}}}},function(t,e,i){var n=i(8),r=i(1),o={},a=["x","y","z","radius","angle","single"],s=["cartesian2d","polar","singleAxis"];o.isCoordSupported=function(t){return r.indexOf(s,t)>=0},o.createNameEach=function(t,e){t=t.slice();var i=r.map(t,n.capitalFirst);e=(e||[]).slice();var o=r.map(e,n.capitalFirst);return function(n,a){r.each(t,function(t,r){for(var s={name:t,capital:i[r]},l=0;l<e.length;l++)s[e[l]]=t+o[l];n.call(a,s)})}},o.eachAxisDim=o.createNameEach(a,["axisIndex","axis","index","id"]),o.createLinkedNodesFinder=function(t,e,i){function n(t,e){return r.indexOf(e.nodes,t)>=0}function o(t,n){var o=!1;return e(function(e){r.each(i(t,e)||[],function(t){n.records[e.name][t]&&(o=!0)})}),o}function a(t,n){n.nodes.push(t),e(function(e){r.each(i(t,e)||[],function(t){n.records[e.name][t]=!0})})}return function(i){function r(t){!n(t,s)&&o(t,s)&&(a(t,s),l=!0)}var s={nodes:[],records:{}};if(e(function(t){s.records[t.name]={}}),!i)return s;a(i,s);var l;do l=!1,t(r);while(l);return s}},t.exports=o},function(t,e,i){var n=i(1);t.exports={updateSelectedMap:function(t){this._selectTargetMap=n.reduce(t||[],function(t,e){return t[e.name]=e,t},{})},select:function(t){var e=this._selectTargetMap,i=e[t],r=this.get("selectedMode");
+"single"===r&&n.each(e,function(t){t.selected=!1}),i&&(i.selected=!0)},unSelect:function(t){var e=this._selectTargetMap[t];e&&(e.selected=!1)},toggleSelected:function(t){var e=this._selectTargetMap[t];if(null!=e)return this[e.selected?"unSelect":"select"](t),e.selected},isSelected:function(t){var e=this._selectTargetMap[t];return e&&e.selected}}},function(t,e,i){function n(t){r.defaultEmphasis(t.label,r.LABEL_OPTIONS)}var r=i(6),o=i(1),a=i(10),s=i(8),l=s.addCommas,h=s.encodeHTML,u=i(2).extendComponentModel({type:"marker",dependencies:["series","grid","polar","geo"],init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i),this.mergeOption(t,i,n.createdBySelf,!0)},isAnimationEnabled:function(){if(a.node)return!1;var t=this.__hostSeries;return this.getShallow("animation")&&t&&t.isAnimationEnabled()},mergeOption:function(t,e,i,r){var a=this.constructor,s=this.mainType+"Model";i||e.eachSeries(function(t){var i=t.get(this.mainType),l=t[s];return i&&i.data?(l?l.mergeOption(i,e,!0):(r&&n(i),o.each(i.data,function(t){t instanceof Array?(n(t[0]),n(t[1])):n(t)}),l=new a(i,this,e),o.extend(l,{mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0}),l.__hostSeries=t),void(t[s]=l)):void(t[s]=null)},this)},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=o.isArray(i)?o.map(i,l).join(", "):l(i),r=e.getName(t),a=h(this.name);return(null!=i||r)&&(a+="<br />"),r&&(a+=h(r),null!=i&&(a+=" : ")),null!=i&&(a+=h(n)),a},getData:function(){return this._data},setData:function(t){this._data=t}});o.mixin(u,r.dataFormatMixin),t.exports=u},function(t,e,i){t.exports=i(2).extendComponentView({type:"marker",init:function(){this.markerGroupMap={}},render:function(t,e,i){var n=this.markerGroupMap;for(var r in n)n.hasOwnProperty(r)&&(n[r].__keep=!1);var o=this.type+"Model";e.eachSeries(function(t){var n=t[o];n&&this.renderSeries(t,n,e,i)},this);for(var r in n)n.hasOwnProperty(r)&&!n[r].__keep&&this.group.remove(n[r].group)},renderSeries:function(){}})},function(t,e,i){function n(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}function r(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}function o(t,e,i){var n=-1;do n=Math.max(l.getPrecision(t.get(e,i)),n),t=t.stackedOn;while(t);return n}function a(t,e,i,n,r,a){var s=[],l=m(e,n,t),h=e.indexOfNearest(n,l,!0);s[r]=e.get(i,h,!0),s[a]=e.get(n,h,!0);var u=o(e,n,h);return u>=0&&(s[a]=+s[a].toFixed(u)),s}var s=i(1),l=i(4),h=s.indexOf,u=s.curry,c={min:u(a,"min"),max:u(a,"max"),average:u(a,"average")},d=function(t,e){var i=t.getData(),n=t.coordinateSystem;if(e&&!r(e)&&!s.isArray(e.coord)&&n){var o=n.dimensions,a=f(e,i,n,t);if(e=s.clone(e),e.type&&c[e.type]&&a.baseAxis&&a.valueAxis){var l=h(o,a.baseAxis.dim),u=h(o,a.valueAxis.dim);e.coord=c[e.type](i,a.baseDataDim,a.valueDataDim,l,u),e.value=e.coord[u]}else{for(var d=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],p=0;p<2;p++)if(c[d[p]]){var g=t.coordDimToDataDim(o[p])[0];d[p]=m(i,g,d[p])}e.coord=d}}return e},f=function(t,e,i,n){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=i.getAxis(n.dataDimToCoordDim(r.valueDataDim)),r.baseAxis=i.getOtherAxis(r.valueAxis),r.baseDataDim=n.coordDimToDataDim(r.baseAxis.dim)[0]):(r.baseAxis=n.getBaseAxis(),r.valueAxis=i.getOtherAxis(r.baseAxis),r.baseDataDim=n.coordDimToDataDim(r.baseAxis.dim)[0],r.valueDataDim=n.coordDimToDataDim(r.valueAxis.dim)[0]),r},p=function(t,e){return!(t&&t.containData&&e.coord&&!n(e))||t.containData(e.coord)},g=function(t,e,i,n){return n<2?t.coord&&t.coord[n]:t.value},m=function(t,e,i){if("average"===i){var n=0,r=0;return t.each(e,function(t,e){isNaN(t)||(n+=t,r++)},!0),n/r}return t.getDataExtent(e,!0)["max"===i?1:0]};t.exports={dataTransform:d,dataFilter:p,dimValueGetter:g,getAxisInfo:f,numCalculate:m}},,function(t,e){t.exports=function(t,e){var i={};e.eachRawSeriesByType(t,function(t){var n=t.getRawData(),r={};if(!e.isSeriesFiltered(t)){var o=t.getData();o.each(function(t){var e=o.getRawIndex(t);r[e]=t}),n.each(function(e){var a=r[e],s=null!=a&&o.getItemVisual(a,"color",!0);if(s)n.setItemVisual(e,"color",s);else{var l=n.getItemModel(e),h=l.get("itemStyle.normal.color")||t.getColorFromPalette(n.getName(e),i);n.setItemVisual(e,"color",h),null!=a&&o.setItemVisual(a,"color",h)}})}})}},function(t,e,i){var n=i(5),r=i(18),o={},a=Math.min,s=Math.max,l=Math.sin,h=Math.cos,u=n.create(),c=n.create(),d=n.create(),f=2*Math.PI;o.fromPoints=function(t,e,i){if(0!==t.length){var n,r=t[0],o=r[0],l=r[0],h=r[1],u=r[1];for(n=1;n<t.length;n++)r=t[n],o=a(o,r[0]),l=s(l,r[0]),h=a(h,r[1]),u=s(u,r[1]);e[0]=o,e[1]=h,i[0]=l,i[1]=u}},o.fromLine=function(t,e,i,n,r,o){r[0]=a(t,i),r[1]=a(e,n),o[0]=s(t,i),o[1]=s(e,n)};var p=[],g=[];o.fromCubic=function(t,e,i,n,o,l,h,u,c,d){var f,m=r.cubicExtrema,v=r.cubicAt,y=m(t,i,o,h,p);for(c[0]=1/0,c[1]=1/0,d[0]=-(1/0),d[1]=-(1/0),f=0;f<y;f++){var x=v(t,i,o,h,p[f]);c[0]=a(x,c[0]),d[0]=s(x,d[0])}for(y=m(e,n,l,u,g),f=0;f<y;f++){var _=v(e,n,l,u,g[f]);c[1]=a(_,c[1]),d[1]=s(_,d[1])}c[0]=a(t,c[0]),d[0]=s(t,d[0]),c[0]=a(h,c[0]),d[0]=s(h,d[0]),c[1]=a(e,c[1]),d[1]=s(e,d[1]),c[1]=a(u,c[1]),d[1]=s(u,d[1])},o.fromQuadratic=function(t,e,i,n,o,l,h,u){var c=r.quadraticExtremum,d=r.quadraticAt,f=s(a(c(t,i,o),1),0),p=s(a(c(e,n,l),1),0),g=d(t,i,o,f),m=d(e,n,l,p);h[0]=a(t,o,g),h[1]=a(e,l,m),u[0]=s(t,o,g),u[1]=s(e,l,m)},o.fromArc=function(t,e,i,r,o,a,s,p,g){var m=n.min,v=n.max,y=Math.abs(o-a);if(y%f<1e-4&&y>1e-4)return p[0]=t-i,p[1]=e-r,g[0]=t+i,void(g[1]=e+r);if(u[0]=h(o)*i+t,u[1]=l(o)*r+e,c[0]=h(a)*i+t,c[1]=l(a)*r+e,m(p,u,c),v(g,u,c),o%=f,o<0&&(o+=f),a%=f,a<0&&(a+=f),o>a&&!s?a+=f:o<a&&s&&(o+=f),s){var x=a;a=o,o=x}for(var _=0;_<a;_+=Math.PI/2)_>o&&(d[0]=h(_)*i+t,d[1]=l(_)*r+e,m(p,d,p),v(g,d,g))},t.exports=o},function(t,e,i){var n=i(36),r=i(1),o=i(17),a=function(t){n.call(this,t)};a.prototype={constructor:a,type:"text",brush:function(t,e){var i=this.style,n=i.x||0,r=i.y||0,a=i.text;if(null!=a&&(a+=""),i.bind(t,this,e),a){this.setTransform(t);var s,l=i.textAlign,h=i.textFont||i.font;if(i.textVerticalAlign){var u=o.getBoundingRect(a,h,i.textAlign,"top");switch(s="middle",i.textVerticalAlign){case"middle":r-=u.height/2-u.lineHeight/2;break;case"bottom":r-=u.height-u.lineHeight/2;break;default:r+=u.lineHeight/2}}else s=i.textBaseline;t.font=h||"12px sans-serif",t.textAlign=l||"left",t.textAlign!==l&&(t.textAlign="left"),t.textBaseline=s||"alphabetic",t.textBaseline!==s&&(t.textBaseline="alphabetic");for(var c=o.measureText("国",t.font).width,d=a.split("\n"),f=0;f<d.length;f++)i.hasFill()&&t.fillText(d[f],n,r),i.hasStroke()&&t.strokeText(d[f],n,r),r+=c;this.restoreTransform(t)}},getBoundingRect:function(){if(!this._rect){var t=this.style,e=t.textVerticalAlign,i=o.getBoundingRect(t.text+"",t.textFont||t.font,t.textAlign,e?"top":t.textBaseline);switch(e){case"middle":i.y-=i.height/2;break;case"bottom":i.y-=i.height}i.x+=t.x||0,i.y+=t.y||0,this._rect=i}return this._rect}},r.inherits(a,n),t.exports=a},function(t,e,i){function n(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}var r=i(17),o=i(9),a=new o,s=function(){};s.prototype={constructor:s,drawRectText:function(t,e,i){var o=this.style,s=o.text;if(null!=s&&(s+=""),s){t.save();var l,h,u=o.textPosition,c=o.textOffset,d=o.textDistance,f=o.textAlign,p=o.textFont||o.font,g=o.textBaseline,m=o.textVerticalAlign;i=i||r.getBoundingRect(s,p,f,g);var v=this.transform;if(o.textTransform?this.setTransform(t):v&&(a.copy(e),a.applyTransform(v),e=a),u instanceof Array){if(l=e.x+n(u[0],e.width),h=e.y+n(u[1],e.height),f=f||"left",g=g||"top",m){switch(m){case"middle":h-=i.height/2-i.lineHeight/2;break;case"bottom":h-=i.height-i.lineHeight/2;break;default:h+=i.lineHeight/2}g="middle"}}else{var y=r.adjustTextPositionOnRect(u,e,i,d);l=y.x,h=y.y,f=f||y.textAlign,g=g||y.textBaseline}c&&(l+=c[0],h+=c[1]),t.textAlign=f||"left",t.textBaseline=g||"alphabetic";var x=o.textFill,_=o.textStroke;x&&(t.fillStyle=x),_&&(t.strokeStyle=_),t.font=p||"12px sans-serif",t.shadowBlur=o.textShadowBlur,t.shadowColor=o.textShadowColor||"transparent",t.shadowOffsetX=o.textShadowOffsetX,t.shadowOffsetY=o.textShadowOffsetY;var b=s.split("\n");o.textRotation&&(v&&t.translate(v[4],v[5]),t.rotate(o.textRotation),v&&t.translate(-v[4],-v[5]));for(var w=0;w<b.length;w++)x&&t.fillText(b[w],l,h),_&&t.strokeText(b[w],l,h),h+=i.lineHeight;t.restore()}}},t.exports=s},function(t,e,i){function n(t){delete f[t]}/*!
+ * ZRender, a high performance 2d drawing library.
+ *
+ * Copyright (c) 2013, Baidu Inc.
+ * All rights reserved.
+ *
+ * LICENSE
+ * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt
+ */
+var r=i(64),o=i(10),a=i(1),s=i(140),l=i(143),h=i(144),u=i(152),c=!o.canvasSupported,d={canvas:i(142)},f={},p={};p.version="3.3.0",p.init=function(t,e){var i=new g(r(),t,e);return f[i.id]=i,i},p.dispose=function(t){if(t)t.dispose();else{for(var e in f)f.hasOwnProperty(e)&&f[e].dispose();f={}}return p},p.getInstance=function(t){return f[t]},p.registerPainter=function(t,e){d[t]=e};var g=function(t,e,i){i=i||{},this.dom=e,this.id=t;var n=this,r=new l,f=i.renderer;if(c){if(!d.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");f="vml"}else f&&d[f]||(f="canvas");var p=new d[f](e,r,i);this.storage=r,this.painter=p;var g=o.node?null:new u(p.getViewportRoot());this.handler=new s(r,p,g,p.root),this.animation=new h({stage:{update:a.bind(this.flush,this)}}),this.animation.start(),this._needsRefresh;var m=r.delFromMap,v=r.addToMap;r.delFromMap=function(t){var e=r.get(t);m.call(r,t),e&&e.removeSelfFromZr(n)},r.addToMap=function(t){v.call(r,t),t.addSelfToZr(n)}};g.prototype={constructor:g,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer(t,e),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},flush:function(){this._needsRefresh&&this.refreshImmediately(),this._needsRefreshHover&&this.refreshHoverImmediately()},addHover:function(t,e){this.painter.addHover&&(this.painter.addHover(t,e),this.refreshHover())},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e,i){var n=r();return this.painter.pathToImage(n,t,e,i)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},on:function(t,e,i){this.handler.on(t,e,i)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,n(this.id)}},t.exports=p},function(t,e,i){var n=i(2),r=i(1);t.exports=function(t,e){r.each(e,function(e){e.update="updateView",n.registerAction(e,function(i,n){var r={};return n.eachComponent({mainType:"series",subType:t,query:i},function(t){t[e.method]&&t[e.method](i.name);var n=t.getData();n.each(function(e){var i=n.getName(e);r[i]=t.isSelected(i)||!1})}),{name:i.name,selected:r}})})}},function(t,e,i){"use strict";var n=i(16),r=i(35);t.exports=n.extend({type:"series.__base_bar__",getInitialData:function(t,e){return r(t.data,this,e)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var i=e.dataToPoint(t,!0),n=this.getData(),r=n.getLayout("offset"),o=n.getLayout("size"),a=e.getBaseAxis().isHorizontal()?0:1;return i[a]+=r+o/2,i}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,itemStyle:{normal:{},emphasis:{}}}})},function(t,e,i){function n(t,e,i,n,r){o.setText(t,e,i),t.text=n,"outside"===t.textPosition&&(t.textPosition=r)}var r=i(1),o=i(3),a={};a.setLabel=function(t,e,i,o,a,s,l){var h=i.getModel("label.normal"),u=i.getModel("label.emphasis");h.get("show")?n(t,h,o,r.retrieve(a.getFormattedLabel(s,"normal"),a.getRawValue(s)),l):t.text="",u.get("show")?n(e,u,o,r.retrieve(a.getFormattedLabel(s,"emphasis"),a.getRawValue(s)),l):e.text=""},t.exports=a},function(t,e,i){function n(t){return isNaN(t[0])||isNaN(t[1])}function r(t,e,i,r,o,a,g,m,v,y,x){for(var _=0,b=i,w=0;w<r;w++){var M=e[b];if(b>=o||b<0)break;if(n(M)){if(x){b+=a;continue}break}if(b===i)t[a>0?"moveTo":"lineTo"](M[0],M[1]),c(f,M);else if(v>0){var S=b+a,T=e[S];if(x)for(;T&&n(e[S]);)S+=a,T=e[S];var A=.5,I=e[_],T=e[S];if(!T||n(T))c(p,M);else{n(T)&&!x&&(T=M),s.sub(d,T,I);var C,k;if("x"===y||"y"===y){var L="x"===y?0:1;C=Math.abs(M[L]-I[L]),k=Math.abs(M[L]-T[L])}else C=s.dist(M,I),k=s.dist(M,T);A=k/(k+C),u(p,M,d,-v*(1-A))}l(f,f,m),h(f,f,g),l(p,p,m),h(p,p,g),t.bezierCurveTo(f[0],f[1],p[0],p[1],M[0],M[1]),u(f,M,d,v*A)}else t.lineTo(M[0],M[1]);_=b,b+=a}return w}function o(t,e){var i=[1/0,1/0],n=[-(1/0),-(1/0)];if(e)for(var r=0;r<t.length;r++){var o=t[r];o[0]<i[0]&&(i[0]=o[0]),o[1]<i[1]&&(i[1]=o[1]),o[0]>n[0]&&(n[0]=o[0]),o[1]>n[1]&&(n[1]=o[1])}return{min:e?i:n,max:e?n:i}}var a=i(7),s=i(5),l=s.min,h=s.max,u=s.scaleAndAdd,c=s.copy,d=[],f=[],p=[];t.exports={Polyline:a.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},buildPath:function(t,e){var i=e.points,a=0,s=i.length,l=o(i,e.smoothConstraint);if(e.connectNulls){for(;s>0&&n(i[s-1]);s--);for(;a<s&&n(i[a]);a++);}for(;a<s;)a+=r(t,i,a,s,s,1,l.min,l.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),Polygon:a.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},buildPath:function(t,e){var i=e.points,a=e.stackedOnPoints,s=0,l=i.length,h=e.smoothMonotone,u=o(i,e.smoothConstraint),c=o(a,e.smoothConstraint);if(e.connectNulls){for(;l>0&&n(i[l-1]);l--);for(;s<l&&n(i[s]);s++);}for(;s<l;){var d=r(t,i,s,l,l,1,u.min,u.max,e.smooth,h,e.connectNulls);r(t,a,s+d-1,d,l,-1,c.min,c.max,e.stackedOnSmooth,h,e.connectNulls),s+=d+1,t.closePath()}}})}},,function(t,e,i){function n(t){if(!t.target||!t.target.draggable){var e=t.offsetX,i=t.offsetY;this.containsPoint&&this.containsPoint(e,i)&&(this._x=e,this._y=i,this._dragging=!0)}}function r(t){if(this._dragging&&(d.stop(t.event),"pinch"!==t.gestureEvent)){if(f.isTaken(this._zr,"globalPan"))return;var e=t.offsetX,i=t.offsetY,n=this._x,r=this._y,o=e-n,a=i-r;this._x=e,this._y=i;var s=this.target;if(s){var l=s.position;l[0]+=o,l[1]+=a,s.dirty()}d.stop(t.event),this.trigger("pan",o,a,n,r,e,i)}}function o(t){this._dragging=!1}function a(t){var e=t.wheelDelta>0?1.1:1/1.1;l.call(this,t,e,t.offsetX,t.offsetY)}function s(t){if(!f.isTaken(this._zr,"globalPan")){var e=t.pinchScale>1?1.1:1/1.1;l.call(this,t,e,t.pinchX,t.pinchY)}}function l(t,e,i,n){if(this.containsPoint&&this.containsPoint(i,n)){d.stop(t.event);var r=this.target,o=this.zoomLimit;if(r){var a=r.position,s=r.scale,l=this.zoom=this.zoom||1;if(l*=e,o){var h=o.min||0,u=o.max||1/0;l=Math.max(Math.min(u,l),h)}var c=l/this.zoom;this.zoom=l,a[0]-=(i-a[0])*(c-1),a[1]-=(n-a[1])*(c-1),s[0]*=c,s[1]*=c,r.dirty()}this.trigger("zoom",e,i,n)}}function h(t,e){this.target=e,this.containsPoint,this.zoomLimit,this.zoom,this._zr=t;var i=c.bind,l=i(n,this),h=i(r,this),d=i(o,this),f=i(a,this),p=i(s,this);u.call(this),this.setContainsPoint=function(t){this.containsPoint=t},this.enable=function(e){this.disable(),null==e&&(e=!0),e!==!0&&"move"!==e&&"pan"!==e||(t.on("mousedown",l),t.on("mousemove",h),t.on("mouseup",d)),e!==!0&&"scale"!==e&&"zoom"!==e||(t.on("mousewheel",f),t.on("pinch",p))},this.disable=function(){t.off("mousedown",l),t.off("mousemove",h),t.off("mouseup",d),t.off("mousewheel",f),t.off("pinch",p)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}var u=i(21),c=i(1),d=i(25),f=i(117);c.mixin(h,u),t.exports=h},function(t,e){t.exports=function(t,e,i,n,r){function o(t,e,i){var n=e.length?e.slice():[e,e];return e[0]>e[1]&&n.reverse(),t<0&&n[0]+t<i[0]&&(t=i[0]-n[0]),t>0&&n[1]+t>i[1]&&(t=i[1]-n[1]),t}return t?("rigid"===n?(t=o(t,e,i),e[0]+=t,e[1]+=t):(t=o(t,e[r],i),e[r]+=t,"push"===n&&e[0]>e[1]&&(e[1-r]=e[r])),e):e}},function(t,e,i){var n=i(1),r={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisLine:{show:!0,onZero:!0,lineStyle:{color:"#333",width:1,type:"solid"}},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,margin:8,textStyle:{fontSize:12}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},o=n.merge({boundaryGap:!0,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},r),a=n.merge({boundaryGap:[0,0],splitNumber:5},r),s=n.defaults({scale:!0,min:"dataMin",max:"dataMax"},a),l=n.defaults({logBase:10},a);l.scale=!0,t.exports={categoryAxis:o,valueAxis:a,timeAxis:s,logAxis:l}},function(t,e,i){"use strict";function n(t){return t.get("stack")||"__ec_stack_"+t.seriesIndex}function r(t){return t.dim+t.index}function o(t,e){var i={};s.each(t,function(t,e){var o=t.getData(),a=t.coordinateSystem,s=a.getBaseAxis(),l=s.getExtent(),u="category"===s.type?s.getBandWidth():Math.abs(l[1]-l[0])/o.count(),c=i[r(s)]||{bandWidth:u,remainedWidth:u,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},d=c.stacks;i[r(s)]=c;var f=n(t);d[f]||c.autoWidthCount++,d[f]=d[f]||{width:0,maxWidth:0};var p=h(t.get("barWidth"),u),g=h(t.get("barMaxWidth"),u),m=t.get("barGap"),v=t.get("barCategoryGap");p&&!d[f].width&&(p=Math.min(c.remainedWidth,p),d[f].width=p,c.remainedWidth-=p),g&&(d[f].maxWidth=g),null!=m&&(c.gap=m),null!=v&&(c.categoryGap=v)});var o={};return s.each(i,function(t,e){o[e]={};var i=t.stacks,n=t.bandWidth,r=h(t.categoryGap,n),a=h(t.gap,1),l=t.remainedWidth,u=t.autoWidthCount,c=(l-r)/(u+(u-1)*a);c=Math.max(c,0),s.each(i,function(t,e){var i=t.maxWidth;!t.width&&i&&i<c&&(i=Math.min(i,l),l-=i,t.width=i,u--)}),c=(l-r)/(u+(u-1)*a),c=Math.max(c,0);var d,f=0;s.each(i,function(t,e){t.width||(t.width=c),d=t,f+=t.width*(1+a)}),d&&(f-=d.width*a);var p=-f/2;s.each(i,function(t,i){o[e][i]=o[e][i]||{offset:p,width:t.width},p+=t.width*(1+a)})}),o}function a(t,e,i){var a=o(s.filter(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),l={},h={};e.eachSeriesByType(t,function(t){var e=t.getData(),i=t.coordinateSystem,o=i.getBaseAxis(),s=n(t),u=a[r(o)][s],c=u.offset,d=u.width,f=i.getOtherAxis(o),p=t.get("barMinHeight")||0,g=o.onZero?f.toGlobalCoord(f.dataToCoord(0)):f.getGlobalExtent()[0],m=i.dataToPoints(e,!0);l[s]=l[s]||[],h[s]=h[s]||[],e.setLayout({offset:c,size:d}),e.each(f.dim,function(t,i){if(!isNaN(t)){l[s][i]||(l[s][i]={p:g,n:g},h[s][i]={p:g,n:g});var n,r,o,a,u=t>=0?"p":"n",v=m[i],y=l[s][i][u],x=h[s][i][u];f.isHorizontal()?(n=y,r=v[1]+c,o=v[0]-x,a=d,h[s][i][u]+=o,Math.abs(o)<p&&(o=(o<0?-1:1)*p),l[s][i][u]+=o):(n=v[0]+c,r=y,o=d,a=v[1]-x,h[s][i][u]+=a,Math.abs(a)<p&&(a=(a<=0?-1:1)*p),l[s][i][u]+=a),e.setItemLayout(i,{x:n,y:r,width:o,height:a})}},!0)},this)}var s=i(1),l=i(4),h=l.parsePercent;t.exports=a},function(t,e){t.exports={containStroke:function(t,e,i,n,r,o,a){if(0===r)return!1;var s=r,l=0,h=t;if(a>e+s&&a>n+s||a<e-s&&a<n-s||o>t+s&&o>i+s||o<t-s&&o<i-s)return!1;if(t===i)return Math.abs(o-t)<=s/2;l=(e-n)/(t-i),h=(t*n-i*e)/(t-i);var u=l*o-a+h,c=u*u/(l*l+1);return c<=s/2*s/2}}},function(t,e,i){var n=i(18);t.exports={containStroke:function(t,e,i,r,o,a,s,l,h){if(0===s)return!1;var u=s;if(h>e+u&&h>r+u&&h>a+u||h<e-u&&h<r-u&&h<a-u||l>t+u&&l>i+u&&l>o+u||l<t-u&&l<i-u&&l<o-u)return!1;var c=n.quadraticProjectPoint(t,e,i,r,o,a,l,h,null);return c<=u/2}}},function(t,e){t.exports=function(t,e,i,n,r,o){if(o>e&&o>n||o<e&&o<n)return 0;if(n===e)return 0;var a=n<e?1:-1,s=(o-e)/(n-e);1!==s&&0!==s||(a=n<e?.5:-.5);var l=s*(i-t)+t;return l>r?a:0}},function(t,e,i){"use strict";var n=i(1),r=i(37),o=function(t,e,i,n,o,a){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==i?1:i,this.y2=null==n?0:n,this.type="linear",this.global=a||!1,r.call(this,o)};o.prototype={constructor:o},n.inherits(o,r),t.exports=o},function(t,e,i){"use strict";function n(t){return t>s||t<-s}var r=i(20),o=i(5),a=r.identity,s=5e-5,l=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},h=l.prototype;h.transform=null,h.needLocalTransform=function(){return n(this.rotation)||n(this.position[0])||n(this.position[1])||n(this.scale[0]-1)||n(this.scale[1]-1)},h.updateTransform=function(){var t=this.parent,e=t&&t.transform,i=this.needLocalTransform(),n=this.transform;return i||e?(n=n||r.create(),i?this.getLocalTransform(n):a(n),e&&(i?r.mul(n,t.transform,n):r.copy(n,t.transform)),this.transform=n,this.invTransform=this.invTransform||r.create(),void r.invert(this.invTransform,n)):void(n&&a(n))},h.getLocalTransform=function(t){t=t||[],a(t);var e=this.origin,i=this.scale,n=this.rotation,o=this.position;return e&&(t[4]-=e[0],t[5]-=e[1]),r.scale(t,t,i),n&&r.rotate(t,t,n),e&&(t[4]+=e[0],t[5]+=e[1]),t[4]+=o[0],t[5]+=o[1],t},h.setTransform=function(t){var e=this.transform,i=t.dpr||1;e?t.setTransform(i*e[0],i*e[1],i*e[2],i*e[3],i*e[4],i*e[5]):t.setTransform(i,0,0,i,0,0)},h.restoreTransform=function(t){var e=(this.transform,t.dpr||1);t.setTransform(e,0,0,e,0,0)};var u=[];h.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(r.mul(u,t.invTransform,e),e=u);var i=e[0]*e[0]+e[1]*e[1],o=e[2]*e[2]+e[3]*e[3],a=this.position,s=this.scale;n(i-1)&&(i=Math.sqrt(i)),n(o-1)&&(o=Math.sqrt(o)),e[0]<0&&(i=-i),e[3]<0&&(o=-o),a[0]=e[4],a[1]=e[5],s[0]=i,s[1]=o,this.rotation=Math.atan2(-e[1]/o,e[0]/i)}},h.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(i=-i),[e,i]},h.transformCoordToLocal=function(t,e){var i=[t,e],n=this.invTransform;return n&&o.applyTransform(i,i,n),i},h.transformCoordToGlobal=function(t,e){var i=[t,e],n=this.transform;return n&&o.applyTransform(i,i,n),i},t.exports=l},function(t,e,i){"use strict";function n(t){r.each(o,function(e){this[e]=r.bind(t[e],t)},this)}var r=i(1),o=["getDom","getZr","getWidth","getHeight","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption"];t.exports=n},function(t,e,i){var n=i(1);i(53),i(95),i(96);var r=i(87),o=i(2);o.registerLayout(n.curry(r,"bar")),o.registerVisual(function(t){t.eachSeriesByType("bar",function(t){var e=t.getData();e.setVisual("legendSymbol","roundRect")})}),i(31)},function(t,e,i){t.exports=i(80).extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect"})},function(t,e,i){"use strict";function n(t,e,i,n,r,o,a){var s=new h.Rect({shape:l.extend({},n)});if(o){var u=s.shape,c=r?"height":"width",d={};u[c]=0,d[c]=n[c],h[a?"updateProps":"initProps"](s,{shape:d},o,e)}return s}function r(t,e,i){i.style.text="",h.updateProps(i,{shape:{width:0}},e,t,function(){i.parent&&i.parent.remove(i)})}function o(t,e,i){var n=t.getItemLayout(e),r=s(i,n),o=n.width>0?1:-1,a=n.height>0?1:-1;return{x:n.x+o*r/2,y:n.y+a*r/2,width:n.width-o*r,height:n.height-a*r}}function a(t,e,i,n,r,o,a){var s=e.getItemVisual(i,"color"),c=e.getItemVisual(i,"opacity"),d=n.getModel("itemStyle.normal"),f=n.getModel("itemStyle.emphasis").getBarItemStyle();t.setShape("r",d.get("barBorderRadius")||0),t.useStyle(l.defaults({fill:s,opacity:c},d.getBarItemStyle()));var p=a?r.height>0?"bottom":"top":r.width>0?"left":"right";u.setLabel(t.style,f,n,s,o,i,p),h.setHoverStyle(t,f)}function s(t,e){var i=t.get(c)||0;return Math.min(i,Math.abs(e.width),Math.abs(e.height))}var l=i(1),h=i(3),u=i(81),c=["itemStyle","normal","barBorderWidth"];l.extend(i(11).prototype,i(97));var d=i(2).extendChartView({type:"bar",render:function(t,e,i){var n=t.get("coordinateSystem");return"cartesian2d"===n&&this._renderOnCartesian(t,e,i),this.group},dispose:l.noop,_renderOnCartesian:function(t,e,i){var s=this.group,l=t.getData(),u=this._data,c=t.coordinateSystem,d=c.getBaseAxis(),f=d.isHorizontal(),p=t.isAnimationEnabled()?t:null;l.diff(u).add(function(e){if(l.hasValue(e)){var i=l.getItemModel(e),r=o(l,e,i),h=n(l,e,i,r,f,p);l.setItemGraphicEl(e,h),s.add(h),a(h,l,e,i,r,t,f)}}).update(function(e,i){var r=u.getItemGraphicEl(i);if(!l.hasValue(e))return void s.remove(r);var c=l.getItemModel(e),d=o(l,e,c);r?h.updateProps(r,{shape:d},p,e):r=n(l,e,c,d,f,p,!0),l.setItemGraphicEl(e,r),s.add(r),a(r,l,e,c,d,t,f)}).remove(function(t){var e=u.getItemGraphicEl(t);e&&r(t,p,e)}).execute(),this._data=l},remove:function(t,e){var i=this.group,n=this._data;t.get("animation")?n&&n.eachItemGraphicEl(function(e){r(e.dataIndex,t,e)}):i.removeAll()}});t.exports=d},function(t,e,i){var n=i(30)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getBarItemStyle:function(t){var e=n.call(this,t);if(this.getBorderLineDash){var i=this.getBorderLineDash();i&&(e.lineDash=i)}return e}}},function(t,e,i){function n(t){return"_"+t+"Type"}function r(t,e,i){var n=e.getItemVisual(i,"color"),r=e.getItemVisual(i,t),o=e.getItemVisual(i,t+"Size");if(r&&"none"!==r){f.isArray(o)||(o=[o,o]);var a=h.createSymbol(r,-o[0]/2,-o[1]/2,o[0],o[1],n);return a.name=t,a}}function o(t){var e=new c({name:"line"});return a(e.shape,t),e}function a(t,e){var i=e[0],n=e[1],r=e[2];t.x1=i[0],t.y1=i[1],t.x2=n[0],t.y2=n[1],t.percent=1,r?(t.cpx1=r[0],t.cpy1=r[1]):(t.cpx1=NaN,t.cpy1=NaN)}function s(){var t=this,e=t.childOfName("fromSymbol"),i=t.childOfName("toSymbol"),n=t.childOfName("label");if(e||i||!n.ignore){for(var r=1,o=this.parent;o;)o.scale&&(r/=o.scale[0]),o=o.parent;var a=t.childOfName("line");if(this.__dirty||a.__dirty){var s=a.shape.percent,l=a.pointAt(0),h=a.pointAt(s),c=u.sub([],h,l);if(u.normalize(c,c),e){e.attr("position",l);var d=a.tangentAt(0);e.attr("rotation",Math.PI/2-Math.atan2(d[1],d[0])),e.attr("scale",[r*s,r*s])}if(i){i.attr("position",h);var d=a.tangentAt(1);i.attr("rotation",-Math.PI/2-Math.atan2(d[1],d[0])),i.attr("scale",[r*s,r*s])}if(!n.ignore){n.attr("position",h);var f,p,g,m=5*r;if("end"===n.__position)f=[c[0]*m+h[0],c[1]*m+h[1]],p=c[0]>.8?"left":c[0]<-.8?"right":"center",g=c[1]>.8?"top":c[1]<-.8?"bottom":"middle";else if("middle"===n.__position){var v=s/2,d=a.tangentAt(v),y=[d[1],-d[0]],x=a.pointAt(v);y[1]>0&&(y[0]=-y[0],y[1]=-y[1]),f=[x[0]+y[0]*m,x[1]+y[1]*m],p="center",g="bottom";var _=-Math.atan2(d[1],d[0]);h[0]<l[0]&&(_=Math.PI+_),n.attr("rotation",_)}else f=[-c[0]*m+l[0],-c[1]*m+l[1]],p=c[0]>.8?"right":c[0]<-.8?"left":"center",g=c[1]>.8?"bottom":c[1]<-.8?"top":"middle";n.attr({style:{textVerticalAlign:n.__verticalAlign||g,textAlign:n.__textAlign||p},position:f,scale:[r,r]})}}}}function l(t,e,i){d.Group.call(this),this._createLine(t,e,i)}var h=i(24),u=i(5),c=i(177),d=i(3),f=i(1),p=i(4),g=["fromSymbol","toSymbol"],m=l.prototype;m.beforeUpdate=s,m._createLine=function(t,e,i){var a=t.hostModel,s=t.getItemLayout(e),l=o(s);l.shape.percent=0,d.initProps(l,{shape:{percent:1}},a,e),this.add(l);var h=new d.Text({name:"label"});this.add(h),f.each(g,function(i){var o=r(i,t,e);this.add(o),this[n(i)]=t.getItemVisual(e,i)},this),this._updateCommonStl(t,e,i)},m.updateData=function(t,e,i){var o=t.hostModel,s=this.childOfName("line"),l=t.getItemLayout(e),h={shape:{}};a(h.shape,l),d.updateProps(s,h,o,e),f.each(g,function(i){var o=t.getItemVisual(e,i),a=n(i);if(this[a]!==o){this.remove(this.childOfName(i));var s=r(i,t,e);this.add(s)}this[a]=o},this),this._updateCommonStl(t,e,i)},m._updateCommonStl=function(t,e,i){var n=t.hostModel,r=this.childOfName("line"),o=i&&i.lineStyle,a=i&&i.hoverLineStyle,s=i&&i.labelModel,l=i&&i.hoverLabelModel;if(!i||t.hasItemOption){var h=t.getItemModel(e);o=h.getModel("lineStyle.normal").getLineStyle(),a=h.getModel("lineStyle.emphasis").getLineStyle(),s=h.getModel("label.normal"),l=h.getModel("label.emphasis")}var u=t.getItemVisual(e,"color"),c=f.retrieve(t.getItemVisual(e,"opacity"),o.opacity,1);r.useStyle(f.defaults({strokeNoScale:!0,fill:"none",stroke:u,opacity:c},o)),r.hoverStyle=a,f.each(g,function(t){var e=this.childOfName(t);e&&(e.setColor(u),e.setStyle({opacity:c}))},this);var m,v,y=s.getShallow("show"),x=l.getShallow("show"),_=this.childOfName("label");if(y||x){var b=n.getRawValue(e);v=null==b?v=t.getName(e):isFinite(b)?p.round(b):b,m=u||"#000"}if(y){var w=s.getModel("textStyle");_.setStyle({text:f.retrieve(n.getFormattedLabel(e,"normal",t.dataType),v),textFont:w.getFont(),fill:w.getTextColor()||m}),_.__textAlign=w.get("align"),_.__verticalAlign=w.get("baseline"),_.__position=s.get("position")}else _.setStyle("text","");if(x){var M=l.getModel("textStyle");_.hoverStyle={text:f.retrieve(n.getFormattedLabel(e,"emphasis",t.dataType),v),textFont:M.getFont(),fill:M.getTextColor()||m}}else _.hoverStyle={text:""};_.ignore=!y&&!x,d.setHoverStyle(this)},m.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},m.setLinePoints=function(t){var e=this.childOfName("line");a(e.shape,t),e.dirty()},f.inherits(l,d.Group),t.exports=l},function(t,e,i){function n(t){return isNaN(t[0])||isNaN(t[1])}function r(t){return!n(t[0])&&!n(t[1])}function o(t){this._ctor=t||s,this.group=new a.Group}var a=i(3),s=i(98),l=o.prototype;l.updateData=function(t){var e=this._lineData,i=this.group,n=this._ctor,o=t.hostModel,a={lineStyle:o.getModel("lineStyle.normal").getLineStyle(),hoverLineStyle:o.getModel("lineStyle.emphasis").getLineStyle(),labelModel:o.getModel("label.normal"),hoverLabelModel:o.getModel("label.emphasis")};t.diff(e).add(function(e){if(r(t.getItemLayout(e))){var o=new n(t,e,a);t.setItemGraphicEl(e,o),i.add(o)}}).update(function(o,s){var l=e.getItemGraphicEl(s);return r(t.getItemLayout(o))?(l?l.updateData(t,o,a):l=new n(t,o,a),t.setItemGraphicEl(o,l),void i.add(l)):void i.remove(l)}).remove(function(t){i.remove(e.getItemGraphicEl(t))}).execute(),this._lineData=t},l.updateLayout=function(){var t=this._lineData;t.eachItemGraphicEl(function(e,i){e.updateLayout(t,i)},this)},l.remove=function(){this.group.removeAll()},t.exports=o},function(t,e,i){var n=i(1),r=i(2),o=r.PRIORITY;i(101),i(102),r.registerVisual(n.curry(i(45),"line","circle","line")),r.registerLayout(n.curry(i(56),"line")),r.registerProcessor(o.PROCESSOR.STATISTIC,n.curry(i(135),"line")),i(31)},function(t,e,i){"use strict";var n=i(35),r=i(16);t.exports=r.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return n(t.data,this,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{normal:{position:"top"}},lineStyle:{normal:{width:2,type:"solid"}},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:!1,connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}})},function(t,e,i){"use strict";function n(t,e){if(t.length===e.length){for(var i=0;i<t.length;i++){var n=t[i],r=e[i];if(n[0]!==r[0]||n[1]!==r[1])return}return!0}}function r(t){return"number"==typeof t?t:t?.3:0}function o(t){var e=t.getGlobalExtent();if(t.onBand){var i=t.getBandWidth()/2-1,n=e[1]>e[0]?1:-1;e[0]+=n*i,e[1]-=n*i}return e}function a(t){return t>=0?1:-1}function s(t,e){var i=t.getBaseAxis(),n=t.getOtherAxis(i),r=i.onZero?0:n.scale.getExtent()[0],o=n.dim,s="x"===o||"radius"===o?1:0;return e.mapArray([o],function(n,l){for(var h,u=e.stackedOn;u&&a(u.get(o,l))===a(n);){h=u;break}var c=[];return c[s]=e.get(i.dim,l),c[1-s]=h?h.get(o,l,!0):r,t.dataToPoint(c)},!0)}function l(t,e,i){var n=o(t.getAxis("x")),r=o(t.getAxis("y")),a=t.getBaseAxis().isHorizontal(),s=Math.min(n[0],n[1]),l=Math.min(r[0],r[1]),h=Math.max(n[0],n[1])-s,u=Math.max(r[0],r[1])-l,c=i.get("lineStyle.normal.width")||2,d=i.get("clipOverflow")?c/2:Math.max(h,u);a?(l-=d,u+=2*d):(s-=d,h+=2*d);var f=new v.Rect({shape:{x:s,y:l,width:h,height:u}});return e&&(f.shape[a?"width":"height"]=0,v.initProps(f,{shape:{width:h,height:u}},i)),f}function h(t,e,i){var n=t.getAngleAxis(),r=t.getRadiusAxis(),o=r.getExtent(),a=n.getExtent(),s=Math.PI/180,l=new v.Sector({shape:{cx:t.cx,cy:t.cy,r0:o[0],r:o[1],startAngle:-a[0]*s,endAngle:-a[1]*s,clockwise:n.inverse}});return e&&(l.shape.endAngle=-a[0]*s,v.initProps(l,{shape:{endAngle:-a[1]*s}},i)),l}function u(t,e,i){return"polar"===t.type?h(t,e,i):l(t,e,i)}function c(t,e,i){for(var n=e.getBaseAxis(),r="x"===n.dim||"radius"===n.dim?0:1,o=[],a=0;a<t.length-1;a++){var s=t[a+1],l=t[a];o.push(l);var h=[];switch(i){case"end":h[r]=s[r],h[1-r]=l[1-r],o.push(h);break;case"middle":var u=(l[r]+s[r])/2,c=[];h[r]=c[r]=u,h[1-r]=l[1-r],c[1-r]=s[1-r],o.push(h),o.push(c);break;default:h[r]=l[r],h[1-r]=s[1-r],o.push(h)}}return t[a]&&o.push(t[a]),o}function d(t,e){var i=t.getVisual("visualMeta");if(i&&i.length&&t.count()){for(var n,r=i.length-1;r>=0;r--)if(i[r].dimension<2){n=i[r];break}if(n&&"cartesian2d"===e.type){var o=n.dimension,a=t.dimensions[o],s=e.getAxis(a),l=f.map(n.stops,function(t){return{coord:s.toGlobalCoord(s.dataToCoord(t.value)),color:t.color}}),h=l.length,u=n.outerColors.slice();h&&l[0].coord>l[h-1].coord&&(l.reverse(),u.reverse());var c=10,d=l[0].coord-c,p=l[h-1].coord+c,g=p-d;if(g<.001)return"transparent";f.each(l,function(t){t.offset=(t.coord-d)/g}),l.push({offset:h?l[h-1].offset:.5,color:u[1]||"transparent"}),l.unshift({offset:h?l[0].offset:.5,color:u[0]||"transparent"});var m=new v.LinearGradient(0,0,0,0,l,(!0));return m[a]=d,m[a+"2"]=p,m}}}var f=i(1),p=i(39),g=i(50),m=i(103),v=i(3),y=i(6),x=i(82),_=i(28);t.exports=_.extend({type:"line",init:function(){var t=new v.Group,e=new p;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,i){var o=t.coordinateSystem,a=this.group,l=t.getData(),h=t.getModel("lineStyle.normal"),p=t.getModel("areaStyle.normal"),g=l.mapArray(l.getItemLayout,!0),m="polar"===o.type,v=this._coordSys,y=this._symbolDraw,x=this._polyline,_=this._polygon,b=this._lineGroup,w=t.get("animation"),M=!p.isEmpty(),S=s(o,l),T=t.get("showSymbol"),A=T&&!m&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(l,o),I=this._data;I&&I.eachItemGraphicEl(function(t,e){t.__temp&&(a.remove(t),I.setItemGraphicEl(e,null))}),T||y.remove(),a.add(b);var C=!m&&t.get("step");x&&v.type===o.type&&C===this._step?(M&&!_?_=this._newPolygon(g,S,o,w):_&&!M&&(b.remove(_),_=this._polygon=null),b.setClipPath(u(o,!1,t)),T&&y.updateData(l,A),l.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),n(this._stackedOnPoints,S)&&n(this._points,g)||(w?this._updateAnimation(l,S,o,i,C):(C&&(g=c(g,o,C),S=c(S,o,C)),x.setShape({points:g}),_&&_.setShape({points:g,stackedOnPoints:S})))):(T&&y.updateData(l,A),C&&(g=c(g,o,C),S=c(S,o,C)),x=this._newPolyline(g,o,w),M&&(_=this._newPolygon(g,S,o,w)),b.setClipPath(u(o,!0,t)));var k=d(l,o)||l.getVisual("color");x.useStyle(f.defaults(h.getLineStyle(),{fill:"none",stroke:k,lineJoin:"bevel"}));var L=t.get("smooth");if(L=r(t.get("smooth")),x.setShape({smooth:L,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),_){var P=l.stackedOn,D=0;if(_.useStyle(f.defaults(p.getAreaStyle(),{fill:k,opacity:.7,lineJoin:"bevel"})),P){var O=P.hostModel;D=r(O.get("smooth"))}_.setShape({smooth:L,stackedOnSmooth:D,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=l,this._coordSys=o,this._stackedOnPoints=S,this._points=g,this._step=C},dispose:function(){},highlight:function(t,e,i,n){var r=t.getData(),o=y.queryDataIndex(r,n);if(!(o instanceof Array)&&null!=o&&o>=0){var a=r.getItemGraphicEl(o);if(!a){var s=r.getItemLayout(o);if(!s)return;a=new g(r,o),a.position=s,a.setZ(t.get("zlevel"),t.get("z")),a.ignore=isNaN(s[0])||isNaN(s[1]),a.__temp=!0,r.setItemGraphicEl(o,a),a.stopSymbolAnimation(!0),this.group.add(a)}a.highlight()}else _.prototype.highlight.call(this,t,e,i,n)},downplay:function(t,e,i,n){var r=t.getData(),o=y.queryDataIndex(r,n);if(null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else _.prototype.downplay.call(this,t,e,i,n)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new x.Polyline({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var i=this._polygon;return i&&this._lineGroup.remove(i),i=new x.Polygon({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(i),this._polygon=i,i},_getSymbolIgnoreFunc:function(t,e){var i=e.getAxesByScale("ordinal")[0];if(i&&i.isLabelIgnored)return f.bind(i.isLabelIgnored,i)},_updateAnimation:function(t,e,i,n,r){var o=this._polyline,a=this._polygon,s=t.hostModel,l=m(this._data,t,this._stackedOnPoints,e,this._coordSys,i),h=l.current,u=l.stackedOnCurrent,d=l.next,f=l.stackedOnNext;r&&(h=c(l.current,i,r),u=c(l.stackedOnCurrent,i,r),d=c(l.next,i,r),f=c(l.stackedOnNext,i,r)),o.shape.__points=l.current,o.shape.points=h,v.updateProps(o,{shape:{points:d}},s),a&&(a.setShape({points:h,stackedOnPoints:u}),v.updateProps(a,{shape:{points:d,stackedOnPoints:f}},s));for(var p=[],g=l.status,y=0;y<g.length;y++){var x=g[y].cmd;if("="===x){var _=t.getItemGraphicEl(g[y].idx1);_&&p.push({el:_,ptIdx:y})}}o.animators&&o.animators.length&&o.animators[0].during(function(){for(var t=0;t<p.length;t++){var e=p[t].el;e.attr("position",o.shape.__points[p[t].ptIdx])}})},remove:function(t){var e=this.group,i=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),i&&i.eachItemGraphicEl(function(t,n){t.__temp&&(e.remove(t),i.setItemGraphicEl(n,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}})},function(t,e){function i(t){return t>=0?1:-1}function n(t,e,n){for(var r,o=t.getBaseAxis(),a=t.getOtherAxis(o),s=o.onZero?0:a.scale.getExtent()[0],l=a.dim,h="x"===l||"radius"===l?1:0,u=e.stackedOn,c=e.get(l,n);u&&i(u.get(l,n))===i(c);){r=u;break}var d=[];return d[h]=e.get(o.dim,n),d[1-h]=r?r.get(l,n,!0):s,t.dataToPoint(d)}function r(t,e){var i=[];return e.diff(t).add(function(t){i.push({cmd:"+",idx:t})}).update(function(t,e){i.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){i.push({cmd:"-",idx:t})}).execute(),i}t.exports=function(t,e,i,o,a,s){for(var l=r(t,e),h=[],u=[],c=[],d=[],f=[],p=[],g=[],m=s.dimensions,v=0;v<l.length;v++){var y=l[v],x=!0;switch(y.cmd){case"=":var _=t.getItemLayout(y.idx),b=e.getItemLayout(y.idx1);(isNaN(_[0])||isNaN(_[1]))&&(_=b.slice()),h.push(_),u.push(b),c.push(i[y.idx]),d.push(o[y.idx1]),g.push(e.getRawIndex(y.idx1));break;case"+":var w=y.idx;h.push(a.dataToPoint([e.get(m[0],w,!0),e.get(m[1],w,!0)])),u.push(e.getItemLayout(w).slice()),c.push(n(a,e,w)),d.push(o[w]),g.push(e.getRawIndex(w));break;case"-":var w=y.idx,M=t.getRawIndex(w);M!==w?(h.push(t.getItemLayout(w)),u.push(s.dataToPoint([t.get(m[0],w,!0),t.get(m[1],w,!0)])),c.push(i[w]),d.push(n(s,t,w)),g.push(M)):x=!1}x&&(f.push(y),p.push(p.length))}p.sort(function(t,e){return g[t]-g[e]});for(var S=[],T=[],A=[],I=[],C=[],v=0;v<p.length;v++){var w=p[v];S[v]=h[w],T[v]=u[w],A[v]=c[w],I[v]=d[w],C[v]=f[w]}return{current:S,next:T,stackedOnCurrent:A,stackedOnNext:I,status:C}}},function(t,e,i){var n=i(1),r=i(2);i(105),i(106),i(79)("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),r.registerVisual(n.curry(i(74),"pie")),r.registerLayout(n.curry(i(108),"pie")),r.registerProcessor(n.curry(i(58),"pie"))},function(t,e,i){"use strict";var n=i(14),r=i(1),o=i(6),a=i(27),s=i(69),l=i(2).extendSeriesModel({type:"series.pie",init:function(t){l.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(t.data),this._defaultLabelLine(t);
+},mergeOption:function(t){l.superCall(this,"mergeOption",t),this.updateSelectedMap(this.option.data)},getInitialData:function(t,e){var i=a(["value"],t.data),r=new n(i,this);return r.initData(t.data),r},getDataParams:function(t){var e=this.getData(),i=l.superCall(this,"getDataParams",t),n=e.getSum("value");return i.percent=n?+(e.get("value",t)/n*100).toFixed(2):0,i.$vars.push("percent"),i},_defaultLabelLine:function(t){o.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,i=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,i.show=i.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,avoidLabelOverlap:!0,stillShowZeroSum:!0,label:{normal:{rotate:!1,show:!0,position:"outer"},emphasis:{}},labelLine:{normal:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}}},itemStyle:{normal:{borderWidth:1},emphasis:{}},animationType:"expansion",animationEasing:"cubicOut",data:[]}});r.mixin(l,s),t.exports=l},function(t,e,i){function n(t,e,i,n){var o=e.getData(),a=this.dataIndex,s=o.getName(a),l=e.get("selectedOffset");n.dispatchAction({type:"pieToggleSelect",from:t,name:s,seriesId:e.id}),o.each(function(t){r(o.getItemGraphicEl(t),o.getItemLayout(t),e.isSelected(o.getName(t)),l,i)})}function r(t,e,i,n,r){var o=(e.startAngle+e.endAngle)/2,a=Math.cos(o),s=Math.sin(o),l=i?n:0,h=[a*l,s*l];r?t.animate().when(200,{position:h}).start("bounceOut"):t.attr("position",h)}function o(t,e){function i(){o.ignore=o.hoverIgnore,a.ignore=a.hoverIgnore}function n(){o.ignore=o.normalIgnore,a.ignore=a.normalIgnore}s.Group.call(this);var r=new s.Sector({z2:2}),o=new s.Polyline,a=new s.Text;this.add(r),this.add(o),this.add(a),this.updateData(t,e,!0),this.on("emphasis",i).on("normal",n).on("mouseover",i).on("mouseout",n)}function a(t,e,i,n,r){var o=n.getModel("textStyle"),a="inside"===r||"inner"===r;return{fill:o.getTextColor()||(a?"#fff":t.getItemVisual(e,"color")),opacity:t.getItemVisual(e,"opacity"),textFont:o.getFont(),text:l.retrieve(t.hostModel.getFormattedLabel(e,i),t.getName(e))}}var s=i(3),l=i(1),h=o.prototype;h.updateData=function(t,e,i){function n(){a.stopAnimation(!0),a.animateTo({shape:{r:c.r+10}},300,"elasticOut")}function o(){a.stopAnimation(!0),a.animateTo({shape:{r:c.r}},300,"elasticOut")}var a=this.childAt(0),h=t.hostModel,u=t.getItemModel(e),c=t.getItemLayout(e),d=l.extend({},c);if(d.label=null,i){a.setShape(d);var f=h.getShallow("animationType");"scale"===f?(a.shape.r=c.r0,s.initProps(a,{shape:{r:c.r}},h,e)):(a.shape.endAngle=c.startAngle,s.updateProps(a,{shape:{endAngle:c.endAngle}},h,e))}else s.updateProps(a,{shape:d},h,e);var p=u.getModel("itemStyle"),g=t.getItemVisual(e,"color");a.useStyle(l.defaults({lineJoin:"bevel",fill:g},p.getModel("normal").getItemStyle())),a.hoverStyle=p.getModel("emphasis").getItemStyle(),r(this,t.getItemLayout(e),u.get("selected"),h.get("selectedOffset"),h.get("animation")),a.off("mouseover").off("mouseout").off("emphasis").off("normal"),u.get("hoverAnimation")&&h.isAnimationEnabled()&&a.on("mouseover",n).on("mouseout",o).on("emphasis",n).on("normal",o),this._updateLabel(t,e),s.setHoverStyle(this)},h._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),r=t.hostModel,o=t.getItemModel(e),l=t.getItemLayout(e),h=l.label,u=t.getItemVisual(e,"color");s.updateProps(i,{shape:{points:h.linePoints||[[h.x,h.y],[h.x,h.y],[h.x,h.y]]}},r,e),s.updateProps(n,{style:{x:h.x,y:h.y}},r,e),n.attr({style:{textVerticalAlign:h.verticalAlign,textAlign:h.textAlign,textFont:h.font},rotation:h.rotation,origin:[h.x,h.y],z2:10});var c=o.getModel("label.normal"),d=o.getModel("label.emphasis"),f=o.getModel("labelLine.normal"),p=o.getModel("labelLine.emphasis"),g=c.get("position")||d.get("position");n.setStyle(a(t,e,"normal",c,g)),n.ignore=n.normalIgnore=!c.get("show"),n.hoverIgnore=!d.get("show"),i.ignore=i.normalIgnore=!f.get("show"),i.hoverIgnore=!p.get("show"),i.setStyle({stroke:u,opacity:t.getItemVisual(e,"opacity")}),i.setStyle(f.getModel("lineStyle").getLineStyle()),n.hoverStyle=a(t,e,"emphasis",d,g),i.hoverStyle=p.getModel("lineStyle").getLineStyle();var m=f.get("smooth");m&&m===!0&&(m=.4),i.setShape({smooth:m})},l.inherits(o,s.Group);var u=i(28).extend({type:"pie",init:function(){var t=new s.Group;this._sectorGroup=t},render:function(t,e,i,r){if(!r||r.from!==this.uid){var a=t.getData(),s=this._data,h=this.group,u=e.get("animation"),c=!s,d=t.get("animationType"),f=l.curry(n,this.uid,t,u,i),p=t.get("selectedMode");if(a.diff(s).add(function(t){var e=new o(a,t);c&&"scale"!==d&&e.eachChild(function(t){t.stopAnimation(!0)}),p&&e.on("click",f),a.setItemGraphicEl(t,e),h.add(e)}).update(function(t,e){var i=s.getItemGraphicEl(e);i.updateData(a,t),i.off("click"),p&&i.on("click",f),h.add(i),a.setItemGraphicEl(t,i)}).remove(function(t){var e=s.getItemGraphicEl(t);h.remove(e)}).execute(),u&&c&&a.count()>0&&"scale"!==d){var g=a.getItemLayout(0),m=Math.max(i.getWidth(),i.getHeight())/2,v=l.bind(h.removeClipPath,h);h.setClipPath(this._createClipPath(g.cx,g.cy,m,g.startAngle,g.clockwise,v,t))}this._data=a}},dispose:function(){},_createClipPath:function(t,e,i,n,r,o,a){var l=new s.Sector({shape:{cx:t,cy:e,r0:0,r:i,startAngle:n,endAngle:n,clockwise:r}});return s.initProps(l,{shape:{endAngle:n+(r?1:-1)*Math.PI*2}},a,o),l},containPoint:function(t,e){var i=e.getData(),n=i.getItemLayout(0);if(n){var r=t[0]-n.cx,o=t[1]-n.cy,a=Math.sqrt(r*r+o*o);return a<=n.r&&a>=n.r0}}});t.exports=u},function(t,e,i){"use strict";function n(t,e,i,n,r,o,a){function s(e,i,n,r){for(var o=e;o<i;o++)if(t[o].y+=n,o>e&&o+1<i&&t[o+1].y>t[o].y+t[o].height)return void l(o,n/2);l(i-1,n/2)}function l(e,i){for(var n=e;n>=0&&(t[n].y-=i,!(n>0&&t[n].y>t[n-1].y+t[n-1].height));n--);}function h(t,e,i,n,r,o){for(var a=o>0?e?Number.MAX_VALUE:0:e?Number.MAX_VALUE:0,s=0,l=t.length;s<l;s++)if("center"!==t[s].position){var h=Math.abs(t[s].y-n),u=t[s].len,c=t[s].len2,d=h<r+u?Math.sqrt((r+u+c)*(r+u+c)-h*h):Math.abs(t[s].x-i);e&&d>=a&&(d=a-10),!e&&d<=a&&(d=a+10),t[s].x=i+d*o,a=d}}t.sort(function(t,e){return t.y-e.y});for(var u,c=0,d=t.length,f=[],p=[],g=0;g<d;g++)u=t[g].y-c,u<0&&s(g,d,-u,r),c=t[g].y+t[g].height;a-c<0&&l(d-1,c-a);for(var g=0;g<d;g++)t[g].y>=i?p.push(t[g]):f.push(t[g]);h(f,!1,e,i,n,r),h(p,!0,e,i,n,r)}function r(t,e,i,r,o,a){for(var s=[],l=[],h=0;h<t.length;h++)t[h].x<e?s.push(t[h]):l.push(t[h]);n(l,e,i,r,1,o,a),n(s,e,i,r,-1,o,a);for(var h=0;h<t.length;h++){var u=t[h].linePoints;if(u){var c=u[1][0]-u[2][0];t[h].x<e?u[2][0]=t[h].x+3:u[2][0]=t[h].x-3,u[1][1]=u[2][1]=t[h].y,u[1][0]=u[2][0]+c}}}var o=i(17);t.exports=function(t,e,i,n){var a,s,l=t.getData(),h=[],u=!1;l.each(function(i){var n,r,c,d,f=l.getItemLayout(i),p=l.getItemModel(i),g=p.getModel("label.normal"),m=g.get("position")||p.get("label.emphasis.position"),v=p.getModel("labelLine.normal"),y=v.get("length"),x=v.get("length2"),_=(f.startAngle+f.endAngle)/2,b=Math.cos(_),w=Math.sin(_);a=f.cx,s=f.cy;var M="inside"===m||"inner"===m;if("center"===m)n=f.cx,r=f.cy,d="center";else{var S=(M?(f.r+f.r0)/2*b:f.r*b)+a,T=(M?(f.r+f.r0)/2*w:f.r*w)+s;if(n=S+3*b,r=T+3*w,!M){var A=S+b*(y+e-f.r),I=T+w*(y+e-f.r),C=A+(b<0?-1:1)*x,k=I;n=C+(b<0?-5:5),r=k,c=[[S,T],[A,I],[C,k]]}d=M?"center":b>0?"left":"right"}var L=g.getModel("textStyle").getFont(),P=g.get("rotate")?b<0?-_+Math.PI:-_:0,D=t.getFormattedLabel(i,"normal")||l.getName(i),O=o.getBoundingRect(D,L,d,"top");u=!!P,f.label={x:n,y:r,position:m,height:O.height,len:y,len2:x,linePoints:c,textAlign:d,verticalAlign:"middle",font:L,rotation:P},M||h.push(f.label)}),!u&&t.get("avoidLabelOverlap")&&r(h,a,s,e,i,n)}},function(t,e,i){var n=i(4),r=n.parsePercent,o=i(107),a=i(1),s=2*Math.PI,l=Math.PI/180;t.exports=function(t,e,i,h){e.eachSeriesByType(t,function(t){var e=t.get("center"),h=t.get("radius");a.isArray(h)||(h=[0,h]),a.isArray(e)||(e=[e,e]);var u=i.getWidth(),c=i.getHeight(),d=Math.min(u,c),f=r(e[0],u),p=r(e[1],c),g=r(h[0],d/2),m=r(h[1],d/2),v=t.getData(),y=-t.get("startAngle")*l,x=t.get("minAngle")*l,_=v.getSum("value"),b=Math.PI/(_||v.count())*2,w=t.get("clockwise"),M=t.get("roseType"),S=t.get("stillShowZeroSum"),T=v.getDataExtent("value");T[0]=0;var A=s,I=0,C=y,k=w?1:-1;if(v.each("value",function(t,e){var i;if(isNaN(t))return void v.setItemLayout(e,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:w,cx:f,cy:p,r0:g,r:M?NaN:m});i="area"!==M?0===_&&S?b:t*b:s/(v.count()||1),i<x?(i=x,A-=x):I+=t;var r=C+k*i;v.setItemLayout(e,{angle:i,startAngle:C,endAngle:r,clockwise:w,cx:f,cy:p,r0:g,r:M?n.linearMap(t,T,[g,m]):m}),C=r},!0),A<s)if(A<=.001){var L=s/v.count();v.each(function(t){var e=v.getItemLayout(t);e.startAngle=y+k*t*L,e.endAngle=y+k*(t+1)*L})}else b=A/I,C=y,v.each("value",function(t,e){var i=v.getItemLayout(e),n=i.angle===x?x:t*b;i.startAngle=C,i.endAngle=C+k*n,C+=k*n});o(t,m,u,c)})}},function(t,e,i){"use strict";i(55),i(110)},function(t,e,i){function n(t,e){function i(t,e){var i=n.getAxis(t);return i.toGlobalCoord(i.dataToCoord(0))}var n=t.coordinateSystem,r=e.axis,o={},a=r.position,s=r.onZero?"onZero":a,l=r.dim,h=n.getRect(),u=[h.x,h.x+h.width,h.y,h.y+h.height],c=e.get("offset")||0,d={x:{top:u[2]-c,bottom:u[3]+c},y:{left:u[0]-c,right:u[1]+c}};d.x.onZero=Math.max(Math.min(i("y"),d.x.bottom),d.x.top),d.y.onZero=Math.max(Math.min(i("x"),d.y.right),d.y.left),o.position=["y"===l?d.y[s]:u[0],"x"===l?d.x[s]:u[3]],o.rotation=Math.PI/2*("x"===l?0:1);var f={top:-1,bottom:1,left:-1,right:1};o.labelDirection=o.tickDirection=o.nameDirection=f[a],r.onZero&&(o.labelOffset=d[l][a]-d[l].onZero),e.getModel("axisTick").get("inside")&&(o.tickDirection=-o.tickDirection),e.getModel("axisLabel").get("inside")&&(o.labelDirection=-o.labelDirection);var p=e.getModel("axisLabel").get("rotate");return o.labelRotation="top"===s?-p:p,o.labelInterval=r.getLabelInterval(),o.z2=1,o}var r=i(1),o=i(3),a=i(51),s=a.ifIgnoreOnTick,l=a.getInterval,h=["axisLine","axisLabel","axisTick","axisName"],u=["splitArea","splitLine"],c=i(2).extendComponentView({type:"axis",render:function(t,e){this.group.removeAll();var i=this._axisGroup;if(this._axisGroup=new o.Group,this.group.add(this._axisGroup),t.get("show")){var s=t.getCoordSysModel(),l=n(s,t),c=new a(t,l);r.each(h,c.add,c),this._axisGroup.add(c.getGroup()),r.each(u,function(e){t.get(e+".show")&&this["_"+e](t,s,l.labelInterval)},this),o.groupTransition(i,this._axisGroup,t)}},_splitLine:function(t,e,i){var n=t.axis;if(!n.isBlank()){var a=t.getModel("splitLine"),h=a.getModel("lineStyle"),u=h.get("color"),c=l(a,i);u=r.isArray(u)?u:[u];for(var d=e.coordinateSystem.getRect(),f=n.isHorizontal(),p=0,g=n.getTicksCoords(),m=n.scale.getTicks(),v=[],y=[],x=h.getLineStyle(),_=0;_<g.length;_++)if(!s(n,_,c)){var b=n.toGlobalCoord(g[_]);f?(v[0]=b,v[1]=d.y,y[0]=b,y[1]=d.y+d.height):(v[0]=d.x,v[1]=b,y[0]=d.x+d.width,y[1]=b);var w=p++%u.length;this._axisGroup.add(new o.Line(o.subPixelOptimizeLine({anid:"line_"+m[_],shape:{x1:v[0],y1:v[1],x2:y[0],y2:y[1]},style:r.defaults({stroke:u[w]},x),silent:!0})))}}},_splitArea:function(t,e,i){var n=t.axis;if(!n.isBlank()){var a=t.getModel("splitArea"),h=a.getModel("areaStyle"),u=h.get("color"),c=e.coordinateSystem.getRect(),d=n.getTicksCoords(),f=n.scale.getTicks(),p=n.toGlobalCoord(d[0]),g=n.toGlobalCoord(d[0]),m=0,v=l(a,i),y=h.getAreaStyle();u=r.isArray(u)?u:[u];for(var x=1;x<d.length;x++)if(!s(n,x,v)){var _,b,w,M,S=n.toGlobalCoord(d[x]);n.isHorizontal()?(_=p,b=c.y,w=S-_,M=c.height):(_=c.x,b=g,w=c.width,M=S-b);var T=m++%u.length;this._axisGroup.add(new o.Rect({anid:"area_"+f[x],shape:{x:_,y:b,width:w,height:M},style:r.defaults({fill:u[T]},y),silent:!0})),p=_+w,g=b+M}}}});c.extend({type:"xAxis"}),c.extend({type:"yAxis"})},function(t,e,i){var n=i(1),r=i(68),o=i(2);o.registerAction("dataZoom",function(t,e){var i=r.createLinkedNodesFinder(n.bind(e.eachComponent,e,"dataZoom"),r.eachAxisDim,function(t,e){return t.get(e.axisIndex)}),o=[];e.eachComponent({mainType:"dataZoom",query:t},function(t,e){o.push.apply(o,i(t).nodes)}),n.each(o,function(e,i){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})})})},function(t,e,i){function n(t,e,i){i.getAxisProxy(t.name,e).reset(i)}function r(t,e,i){i.getAxisProxy(t.name,e).filterData(i)}var o=i(2);o.registerProcessor(function(t,e){t.eachComponent("dataZoom",function(t){t.eachTargetAxis(n),t.eachTargetAxis(r)}),t.eachComponent("dataZoom",function(t){var e=t.findRepresentativeAxisProxy(),i=e.getDataPercentWindow(),n=e.getDataValueWindow();t.setRawRange({start:i[0],end:i[1],startValue:n[0],endValue:n[1]})})})},function(t,e,i){function n(t){var e=t[a];return e||(e=t[a]=[{}]),e}var r=i(1),o=r.each,a="\0_ec_hist_store",s={push:function(t,e){var i=n(t);o(e,function(e,n){for(var r=i.length-1;r>=0;r--){var o=i[r];if(o[n])break}if(r<0){var a=t.queryComponents({mainType:"dataZoom",subType:"select",id:n})[0];if(a){var s=a.getPercentRange();i[0][n]={dataZoomId:n,start:s[0],end:s[1]}}}}),i.push(e)},pop:function(t){var e=n(t),i=e[e.length-1];e.length>1&&e.pop();var r={};return o(i,function(t,i){for(var n=e.length-1;n>=0;n--){var t=e[n][i];if(t){r[i]=t;break}}}),r},clear:function(t){t[a]=null},count:function(t){return n(t).length}};t.exports=s},function(t,e,i){i(13).registerSubTypeDefaulter("dataZoom",function(t){return"slider"})},function(t,e,i){function n(t){R.call(this),this._zr=t,this.group=new F.Group,this._brushType,this._brushOption,this._panels,this._track=[],this._dragging,this._covers=[],this._creatingCover,this._creatingPanel,this._enableGlobalPan,this._uid="brushController_"+it++,this._handlers={},Z(nt,function(t,e){this._handlers[e]=B.bind(t,this)},this)}function r(t,e){var i=t._zr;t._enableGlobalPan||G.take(i,K,t._uid),Z(t._handlers,function(t,e){i.on(e,t)}),t._brushType=e.brushType,t._brushOption=B.merge(B.clone(et),e,!0)}function o(t){var e=t._zr;G.release(e,K,t._uid),Z(t._handlers,function(t,i){e.off(i,t)}),t._brushType=t._brushOption=null}function a(t,e){var i=rt[e.brushType].createCover(t,e);return h(i),i.__brushOption=e,t.group.add(i),i}function s(t,e){var i=c(e);return i.endCreating&&(i.endCreating(t,e),h(e)),e}function l(t,e){var i=e.__brushOption;c(e).updateCoverShape(t,e,i.range,i)}function h(t){t.traverse(function(t){t.z=Y,t.z2=Y})}function u(t,e){c(e).updateCommon(t,e),l(t,e)}function c(t){return rt[t.__brushOption.brushType]}function d(t,e,i){var n=t._panels;if(!n)return!0;var r;return Z(n,function(t){t.contain(e,i)&&(r=t)}),r}function f(t,e){var i=t._panels;if(!i)return!0;var n=e.__brushOption.panelId;return null==n||i[n]}function p(t){var e=t._covers,i=e.length;return Z(e,function(e){t.group.remove(e)},t),e.length=0,!!i}function g(t,e){var i=q(t._covers,function(t){var e=t.__brushOption,i=B.clone(e.range);return{brushType:e.brushType,panelId:e.panelId,range:i}});t.trigger("brush",i,{isEnd:!!e.isEnd,removeOnClick:!!e.removeOnClick})}function m(t){var e=t._track;if(!e.length)return!1;var i=e[e.length-1],n=e[0],r=i[0]-n[0],o=i[1]-n[1],a=X(r*r+o*o,.5);return a>$}function v(t){var e=t.length-1;return e<0&&(e=0),[t[0],t[e]]}function y(t,e,i,n){var r=new F.Group;return r.add(new F.Rect({name:"main",style:w(i),silent:!0,draggable:!0,cursor:"move",drift:W(t,e,r,"nswe"),ondragend:W(g,e,{isEnd:!0})})),Z(n,function(i){r.add(new F.Rect({name:i,style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:W(t,e,r,i),ondragend:W(g,e,{isEnd:!0})}))}),r}function x(t,e,i,n){var r=n.brushStyle.lineWidth||0,o=U(r,Q),a=i[0][0],s=i[1][0],l=a-r/2,h=s-r/2,u=i[0][1],c=i[1][1],d=u-o+r/2,f=c-o+r/2,p=u-a,g=c-s,m=p+r,v=g+r;b(t,e,"main",a,s,p,g),n.transformable&&(b(t,e,"w",l,h,o,v),b(t,e,"e",d,h,o,v),b(t,e,"n",l,h,m,o),b(t,e,"s",l,f,m,o),b(t,e,"nw",l,h,o,o),b(t,e,"ne",d,h,o,o),b(t,e,"sw",l,f,o,o),b(t,e,"se",d,f,o,o))}function _(t,e){var i=e.__brushOption,n=i.transformable,r=e.childAt(0);r.useStyle(w(i)),r.attr({silent:!n,cursor:n?"move":"default"}),Z(["w","e","n","s","se","sw","ne","nw"],function(i){var r=e.childOfName(i),o=T(t,i);r&&r.attr({silent:!n,invisible:!n,cursor:n?tt[o]+"-resize":null})})}function b(t,e,i,n,r,o,a){var s=e.childOfName(i);s&&s.setShape(L(k(t,e,[[n,r],[n+o,r+a]])))}function w(t){return B.defaults({strokeNoScale:!0},t.brushStyle)}function M(t,e,i,n){var r=[j(t,i),j(e,n)],o=[U(t,i),U(e,n)];return[[r[0],o[0]],[r[1],o[1]]]}function S(t){return F.getTransform(t.group)}function T(t,e){if(e.length>1){e=e.split("");var i=[T(t,e[0]),T(t,e[1])];return("e"===i[0]||"w"===i[0])&&i.reverse(),i.join("")}var n={w:"left",e:"right",n:"top",s:"bottom"},r={left:"w",right:"e",top:"n",bottom:"s"},i=F.transformDirection(n[e],S(t));return r[i]}function A(t,e,i,n,r,o,a,s){var l=n.__brushOption,h=t(l.range),c=C(i,o,a);Z(r.split(""),function(t){var e=J[t];h[e[0]][e[1]]+=c[e[0]]}),l.range=e(M(h[0][0],h[1][0],h[0][1],h[1][1])),u(i,n),g(i,{isEnd:!1})}function I(t,e,i,n,r){var o=e.__brushOption.range,a=C(t,i,n);Z(o,function(t){t[0]+=a[0],t[1]+=a[1]}),u(t,e),g(t,{isEnd:!1})}function C(t,e,i){var n=t.group,r=n.transformCoordToLocal(e,i),o=n.transformCoordToLocal(0,0);return[r[0]-o[0],r[1]-o[1]]}function k(t,e,i){var n=f(t,e);if(n===!0)return B.clone(i);var r=n.getBoundingRect();return B.map(i,function(t){var e=t[0];e=U(e,r.x),e=j(e,r.x+r.width);var i=t[1];return i=U(i,r.y),i=j(i,r.y+r.height),[e,i]})}function L(t){var e=j(t[0][0],t[1][0]),i=j(t[0][1],t[1][1]),n=U(t[0][0],t[1][0]),r=U(t[0][1],t[1][1]);return{x:e,y:i,width:n-e,height:r-i}}function P(t,e){var i=e.offsetX,n=e.offsetY,r=t._zr;if(t._brushType){for(var o,a=t._panels,s=t._covers,l=0;l<s.length;l++)if(rt[s[l].__brushOption.brushType].contain(s[l],i,n)){o=!0;break}o||(a?Z(a,function(t){t.contain(i,n)&&r.setCursorStyle("crosshair")}):r.setCursorStyle("crosshair"))}}function D(t){var e=t.event;e.preventDefault&&e.preventDefault()}function O(t,e,i){return t.childOfName("main").contain(e,i)}function z(t,e,i){var n,r=e.offsetX,o=e.offsetY,h=t._creatingCover,u=t._creatingPanel,c=t._brushOption;if(t._track.push(t.group.transformCoordToLocal(r,o)),m(t)||h){if(u&&!h){"single"===c.brushMode&&p(t);var f=B.clone(c);f.panelId=u===!0?null:u.__brushPanelId,h=t._creatingCover=a(t,f),t._covers.push(h)}if(h){var g=rt[t._brushType],v=h.__brushOption;v.range=g.getCreatingRange(k(t,h,t._track)),i&&(s(t,h),g.updateCommon(t,h)),l(t,h),n={isEnd:i}}}else i&&"single"===c.brushMode&&c.removeOnClick&&d(t,r,o)&&p(t)&&(n={isEnd:i,removeOnClick:!0});return n}function E(t){if(this._dragging){D(t);var e=z(this,t,!0);this._dragging=!1,this._track=[],this._creatingCover=null,e&&g(this,e)}}function N(t){return{createCover:function(e,i){return y(W(A,function(e){var i=[e,[0,100]];return t&&i.reverse(),i},function(e){return e[t]}),e,i,[["w","e"],["n","s"]][t])},getCreatingRange:function(e){var i=v(e),n=j(i[0][t],i[1][t]),r=U(i[0][t],i[1][t]);return[n,r]},updateCoverShape:function(e,i,n,r){var o,a=r.brushStyle.width;if(null==a){var s=f(e,i),l=0;if(s!==!0){var h=s.getBoundingRect();a=t?h.width:h.height,l=t?h.x:h.y}o=[l,l+(a||0)]}else o=[-a/2,a/2];var u=[n,o];t&&u.reverse(),x(e,i,u,r)},updateCommon:_,contain:O}}var R=i(21),B=i(1),V=i(9),F=i(3),G=i(117),H=i(43),W=B.curry,Z=B.each,q=B.map,j=Math.min,U=Math.max,X=Math.pow,Y=1e4,$=6,Q=6,K="globalPan",J={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},tt={w:"ew",e:"ew",n:"ns",s:"ns",ne:"nesw",sw:"nesw",nw:"nwse",se:"nwse"},et={brushStyle:{lineWidth:2,stroke:"rgba(0,0,0,0.3)",fill:"rgba(0,0,0,0.1)"},transformable:!0,brushMode:"single",removeOnClick:!1},it=0;n.prototype={constructor:n,enableBrush:function(t){return this._brushType&&o(this),t.brushType&&r(this,t),this},setPanels:function(t){var e=this._panels||{},i=this._panels=t&&t.length&&{},n=this.group;return i&&Z(t,function(t){var r=t.panelId,o=e[r];o||(o=new F.Rect({silent:!0,invisible:!0}),n.add(o));var a=t.rect;a instanceof V||(a=V.create(a)),o.attr("shape",a.plain()),o.__brushPanelId=r,i[r]=o,e[r]=null}),Z(e,function(t){t&&n.remove(t)}),this},mount:function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var e=this.group;return this._zr.add(e),e.attr({position:t.position||[0,0],rotation:t.rotation||0,scale:t.scale||[1,1]}),this},eachCover:function(t,e){Z(this._covers,t,e)},updateCovers:function(t){function e(t,e){return(null!=t.id?t.id:o+e)+"-"+t.brushType}function i(t,i){return e(t.__brushOption,i)}function n(e,i){var n=t[e];if(null!=i&&l[i]===d)h[e]=l[i];else{var r=h[e]=null!=i?(l[i].__brushOption=n,l[i]):s(c,a(c,n));u(c,r)}}function r(t){l[t]!==d&&c.group.remove(l[t])}t=B.map(t,function(t){return B.merge(B.clone(et),t,!0)});var o="\0-brush-index-",l=this._covers,h=this._covers=[],c=this,d=this._creatingCover;return new H(l,t,i,e).add(n).update(n).remove(r).execute(),this},unmount:function(){return this.enableBrush(!1),p(this),this._zr.remove(this.group),this},dispose:function(){this.unmount(),this.off()}},B.mixin(n,R);var nt={mousedown:function(t){if(this._dragging)E.call(this,t);else if(!t.target||!t.target.draggable){D(t);var e=t.offsetX,i=t.offsetY;this._creatingCover=null;var n=this._creatingPanel=d(this,e,i);n&&(this._dragging=!0,this._track=[this.group.transformCoordToLocal(e,i)])}},mousemove:function(t){if(P(this,t),this._dragging){D(t);var e=z(this,t,!1);e&&g(this,e)}},mouseup:E},rt={lineX:N(0),lineY:N(1),rect:{createCover:function(t,e){return y(W(A,function(t){return t},function(t){return t}),t,e,["w","e","n","s","se","sw","ne","nw"])},getCreatingRange:function(t){var e=v(t);return M(e[1][0],e[1][1],e[0][0],e[0][1])},updateCoverShape:function(t,e,i,n){x(t,e,i,n)},updateCommon:_,contain:O},polygon:{createCover:function(t,e){var i=new F.Group;return i.add(new F.Polyline({name:"main",style:w(e),silent:!0})),i},getCreatingRange:function(t){return t},endCreating:function(t,e){e.remove(e.childAt(0)),e.add(new F.Polygon({name:"main",draggable:!0,drift:W(I,t,e),ondragend:W(g,t,{isEnd:!0})}))},updateCoverShape:function(t,e,i,n){e.childAt(0).setShape({points:k(t,e,i)})},updateCommon:_,contain:O}};t.exports=n},function(t,e,i){function n(t){return t[0]>t[1]&&t.reverse(),t}function r(t,e){for(var i=!0,n=0;n<u.length;n++){var r=u[n]+"Index";if(t[r]>=0){i=!1;for(var o=0;o<e.length;o++)if(e[o][r]===t[r])return e[o]}}return i}function o(t,e,i,r){var o=i.coordSys.getAxis(t);return n(a.map([0,1],function(t){return e?o.coordToData(o.toLocalCoord(r[t])):o.toGlobalCoord(o.dataToCoord(r[t]))}))}var a=i(1),s=i(3),l=a.each,h={},u=["geo","xAxis","yAxis"],c="--",d=["dataToPoint","pointToData"];h.parseOutputRanges=function(t,e,i,n){l(t,function(t,i){var o=t.panelId;if(o){o=o.split(c),t[o[0]+"Index"]=+o[1];var a=r(t,e);t.coordRange=f[t.brushType](1,a,t.range),n&&(n[i]=a)}})},h.parseInputRanges=function(t,e){l(t.areas,function(e){var i=r(e,t.coordInfoList);e.range=e.range||[],i&&i!==!0&&(e.range=f[e.brushType](0,i,e.coordRange),e.panelId=i.panelId)})},h.makePanelOpts=function(t){var e=[];return l(t,function(t){var i,n=t.coordSys;t.geoIndex>=0?(i=n.getBoundingRect().clone(),i.applyTransform(s.getTransform(n))):i=n.grid.getRect().clone(),e.push({panelId:t.panelId,rect:i})}),e},h.makeCoordInfoList=function(t,e){var i=[];return l(u,function(n){var r=t[n+"Index"];null!=r&&"none"!==r&&("all"===r||a.isArray(r)||(r=[r]),e.eachComponent({mainType:n},function(t,e){if(!("all"!==r&&a.indexOf(r,e)<0)){var o,s;"xAxis"===n||"yAxis"===n?o=t.axis.grid:s=t.coordinateSystem;for(var l,h=0,u=i.length;h<u;h++){var d=i[h];if("yAxis"===n&&!d.yAxis&&d.xAxis){var f=o.getCartesian(d.xAxisIndex,e);if(f){s=f,l=d;break}}}!l&&i.push(l={}),l[n]=t,l[n+"Index"]=e,l.panelId=n+c+e,l.coordSys=s||o.getCartesian(l.xAxisIndex,l.yAxisIndex),l.coordSys?i[n+"Has"]=!0:i.pop()}}))}),i},h.controlSeries=function(t,e,i){var n=r(t,e.coordInfoList);return n===!0||n&&n.coordSys===i.coordinateSystem};var f={lineX:a.curry(o,"x"),lineY:a.curry(o,"y"),rect:function(t,e,i){var r=e.coordSys,o=r[d[t]]([i[0][0],i[1][0]]),a=r[d[t]]([i[0][1],i[1][1]]);return[n([o[0],a[0]]),n([o[1],a[1]])]},polygon:function(t,e,i){var n=e.coordSys;return a.map(i,n[d[t]],n)}};t.exports=h},function(t,e,i){function n(t){return t[r]||(t[r]={})}var r="\0_ec_interaction_mutex",o={take:function(t,e,i){var r=n(t);r[e]=i},release:function(t,e,i){var r=n(t),o=r[e];o===i&&(r[e]=null)},isTaken:function(t,e){return!!n(t)[e]}};i(2).registerAction({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},function(){}),t.exports=o},function(t,e,i){function n(t,e,i){r.positionElement(t,e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()},e.get("padding"))}var r=i(12),o=i(8),a=i(3);t.exports={layout:function(t,e,i){var o=r.getLayoutRect(e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()},e.get("padding"));r.box(e.get("orient"),t,e.get("itemGap"),o.width,o.height),n(t,e,i)},addBackground:function(t,e){var i=o.normalizeCssArray(e.get("padding")),n=t.getBoundingRect(),r=e.getItemStyle(["color","opacity"]);r.fill=e.get("backgroundColor");var s=new a.Rect({shape:{x:n.x-i[3],y:n.y-i[0],width:n.width+i[1]+i[3],height:n.height+i[0]+i[2]},style:r,silent:!0,z2:-1});a.subPixelOptimizeRect(s),t.add(s)}}},function(t,e,i){var n=i(1),r=i(42),o=i(123),a=function(t,e,i,n,o){r.call(this,t,e,i),this.type=n||"value",this.position=o||"bottom"};a.prototype={constructor:a,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(){var t=this.getExtent();return t[0]=this.toGlobalCoord(t[0]),t[1]=this.toGlobalCoord(t[1]),t},getLabelInterval:function(){var t=this._labelInterval;return t||(t=this._labelInterval=o(this)),t},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},toLocalCoord:null,toGlobalCoord:null},n.inherits(a,r),t.exports=a},function(t,e,i){"use strict";function n(t){return this._axes[t]}var r=i(1),o=function(t){this._axes={},this._dimList=[],this.name=t||""};o.prototype={constructor:o,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return r.map(this._dimList,n,this)},getAxesByScale:function(t){return t=t.toLowerCase(),r.filter(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var i=this._dimList,n=t instanceof Array?[]:{},r=0;r<i.length;r++){var o=i[r],a=this._axes[o];n[o]=a[e](t[o])}return n}},t.exports=o},function(t,e,i){"use strict";function n(t){o.call(this,t)}var r=i(1),o=i(120);n.prototype={constructor:n,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(t){var e=this.getAxis("x"),i=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&i.contain(i.toLocalCoord(t[1]))},containData:function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},dataToPoints:function(t,e){return t.mapArray(["x","y"],function(t,e){return this.dataToPoint([t,e])},e,this)},dataToPoint:function(t,e){var i=this.getAxis("x"),n=this.getAxis("y");return[i.toGlobalCoord(i.dataToCoord(t[0],e)),n.toGlobalCoord(n.dataToCoord(t[1],e))]},pointToData:function(t,e){var i=this.getAxis("x"),n=this.getAxis("y");return[i.coordToData(i.toLocalCoord(t[0]),e),n.coordToData(n.toLocalCoord(t[1]),e)]},getOtherAxis:function(t){return this.getAxis("x"===t.dim?"y":"x")}},r.inherits(n,o),t.exports=n},function(t,e,i){"use strict";i(55);var n=i(13);t.exports=n.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}})},function(t,e,i){"use strict";var n=i(1),r=i(22);t.exports=function(t){var e=t.model,i=e.getModel("axisLabel"),o=i.get("interval");return"category"!==t.type||"auto"!==o?"auto"===o?0:o:r.getAxisLabelInterval(n.map(t.scale.getTicks(),t.dataToCoord,t),e.getFormattedLabels(),i.getModel("textStyle").getFont(),t.isHorizontal())}},function(t,e,i){var n=i(3),r=i(1),o=Math.PI;t.exports=function(t,e){e=e||{},r.defaults(e,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var i=new n.Rect({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),a=new n.Arc({shape:{startAngle:-o/2,endAngle:-o/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),s=new n.Rect({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});a.animateShape(!0).when(1e3,{endAngle:3*o/2}).start("circularInOut"),a.animateShape(!0).when(1e3,{startAngle:3*o/2}).delay(300).start("circularInOut");var l=new n.Group;return l.add(a),l.add(s),l.add(i),l.resize=function(){var e=t.getWidth()/2,n=t.getHeight()/2;a.setShape({cx:e,cy:n});var r=a.shape.r;s.setShape({x:e-r,y:n-r,width:2*r,height:2*r}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},l.resize(),l}},function(t,e,i){function n(t,e){u.each(e,function(e,i){x.hasClass(i)||("object"==typeof e?t[i]=t[i]?u.merge(t[i],e,!1):u.clone(e):null==t[i]&&(t[i]=e))})}function r(t){t=t,this.option={},this.option[b]=1,this._componentsMap={},this._seriesIndices=null,n(t,this._theme.option),u.merge(t,_,!1),this.mergeOption(t)}function o(t,e){u.isArray(e)||(e=e?[e]:[]);var i={};return f(e,function(e){i[e]=(t[e]||[]).slice()}),i}function a(t,e,i){var n=e.type?e.type:i?i.subType:x.determineSubType(t,e);return n}function s(t){return g(t,function(t){return t.componentIndex})||[]}function l(t,e){return e.hasOwnProperty("subType")?p(t,function(t){return t.subType===e.subType}):t}function h(t){}var u=i(1),c=i(6),d=i(11),f=u.each,p=u.filter,g=u.map,m=u.isArray,v=u.indexOf,y=u.isObject,x=i(13),_=i(127),b="\0_ec_inner",w=d.extend({constructor:w,init:function(t,e,i,n){i=i||{},this.option=null,this._theme=new d(i),this._optionManager=n},setOption:function(t,e){u.assert(!(b in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption()},resetOption:function(t){var e=!1,i=this._optionManager;if(!t||"recreate"===t){var n=i.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(n)):r.call(this,n),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(this.mergeOption(o),e=!0)}if(!t||"recreate"===t||"media"===t){var a=i.getMediaOption(this,this._api);a.length&&f(a,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){function e(e,r){var l=c.normalizeToArray(t[e]),h=c.mappingToExists(n[e],l);c.makeIdAndName(h),f(h,function(t,i){var n=t.option;y(n)&&(t.keyInfo.mainType=e,t.keyInfo.subType=a(e,n,t.exist))});var d=o(n,r);i[e]=[],n[e]=[],f(h,function(t,r){var o=t.exist,a=t.option;if(u.assert(y(a)||o,"Empty component definition"),a){var s=x.getClass(e,t.keyInfo.subType,!0);if(o&&o instanceof s)o.name=t.keyInfo.name,o.mergeOption(a,this),o.optionUpdated(a,!1);else{var l=u.extend({dependentModels:d,componentIndex:r},t.keyInfo);o=new s(a,this,this,l),u.extend(o,l),o.init(a,this,this,l),o.optionUpdated(null,!0)}}else o.mergeOption({},this),o.optionUpdated({},!1);n[e][r]=o,i[e][r]=o.option},this),"series"===e&&(this._seriesIndices=s(n.series))}var i=this.option,n=this._componentsMap,r=[];f(t,function(t,e){null!=t&&(x.hasClass(e)?r.push(e):i[e]=null==i[e]?u.clone(t):u.merge(i[e],t,!0))}),x.topologicalTravel(r,x.getAllClassMainTypes(),e,this),this._seriesIndices=this._seriesIndices||[]},getOption:function(){var t=u.clone(this.option);return f(t,function(e,i){if(x.hasClass(i)){for(var e=c.normalizeToArray(e),n=e.length-1;n>=0;n--)c.isIdInner(e[n])&&e.splice(n,1);t[i]=e}}),delete t[b],t},getTheme:function(){return this._theme},getComponent:function(t,e){var i=this._componentsMap[t];if(i)return i[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var i=t.index,n=t.id,r=t.name,o=this._componentsMap[e];if(!o||!o.length)return[];var a;if(null!=i)m(i)||(i=[i]),a=p(g(i,function(t){
+return o[t]}),function(t){return!!t});else if(null!=n){var s=m(n);a=p(o,function(t){return s&&v(n,t.id)>=0||!s&&t.id===n})}else if(null!=r){var h=m(r);a=p(o,function(t){return h&&v(r,t.name)>=0||!h&&t.name===r})}else a=o;return l(a,t)},findComponents:function(t){function e(t){var e=r+"Index",i=r+"Id",n=r+"Name";return!t||null==t[e]&&null==t[i]&&null==t[n]?null:{mainType:r,index:t[e],id:t[i],name:t[n]}}function i(e){return t.filter?p(e,t.filter):e}var n=t.query,r=t.mainType,o=e(n),a=o?this.queryComponents(o):this._componentsMap[r];return i(l(a,t))},eachComponent:function(t,e,i){var n=this._componentsMap;if("function"==typeof t)i=e,e=t,f(n,function(t,n){f(t,function(t,r){e.call(i,n,t,r)})});else if(u.isString(t))f(n[t],e,i);else if(y(t)){var r=this.findComponents(t);f(r,e,i)}},getSeriesByName:function(t){var e=this._componentsMap.series;return p(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.series[t]},getSeriesByType:function(t){var e=this._componentsMap.series;return p(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.series.slice()},eachSeries:function(t,e){h(this),f(this._seriesIndices,function(i){var n=this._componentsMap.series[i];t.call(e,n,i)},this)},eachRawSeries:function(t,e){f(this._componentsMap.series,t,e)},eachSeriesByType:function(t,e,i){h(this),f(this._seriesIndices,function(n){var r=this._componentsMap.series[n];r.subType===t&&e.call(i,r,n)},this)},eachRawSeriesByType:function(t,e,i){return f(this.getSeriesByType(t),e,i)},isSeriesFiltered:function(t){return h(this),u.indexOf(this._seriesIndices,t.componentIndex)<0},filterSeries:function(t,e){h(this);var i=p(this._componentsMap.series,t,e);this._seriesIndices=s(i)},restoreData:function(){var t=this._componentsMap;this._seriesIndices=s(t.series);var e=[];f(t,function(t,i){e.push(i)}),x.topologicalTravel(e,x.getAllClassMainTypes(),function(e,i){f(t[e],function(t){t.restoreData()})})}});u.mixin(w,i(57)),t.exports=w},function(t,e,i){function n(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function r(t,e,i){var n,r,o=[],a=[],s=t.timeline;if(t.baseOption&&(r=t.baseOption),(s||t.options)&&(r=r||{},o=(t.options||[]).slice()),t.media){r=r||{};var l=t.media;d(l,function(t){t&&t.option&&(t.query?a.push(t):n||(n=t))})}return r||(r=t),r.timeline||(r.timeline=s),d([r].concat(o).concat(h.map(a,function(t){return t.option})),function(t){d(e,function(e){e(t,i)})}),{baseOption:r,timelineOptions:o,mediaDefault:n,mediaList:a}}function o(t,e,i){var n={width:e,height:i,aspectratio:e/i},r=!0;return h.each(t,function(t,e){var i=e.match(m);if(i&&i[1]&&i[2]){var o=i[1],s=i[2].toLowerCase();a(n[s],t,o)||(r=!1)}}),r}function a(t,e,i){return"min"===i?t>=e:"max"===i?t<=e:t===e}function s(t,e){return t.join(",")===e.join(",")}function l(t,e){e=e||{},d(e,function(e,i){if(null!=e){var n=t[i];if(c.hasClass(i)){e=u.normalizeToArray(e),n=u.normalizeToArray(n);var r=u.mappingToExists(n,e);t[i]=p(r,function(t){return t.option&&t.exist?g(t.exist,t.option,!0):t.exist||t.option})}else t[i]=g(n,e,!0)}})}var h=i(1),u=i(6),c=i(13),d=h.each,f=h.clone,p=h.map,g=h.merge,m=/^(min|max)?(.+)$/;n.prototype={constructor:n,setOption:function(t,e){t=f(t,!0);var i=this._optionBackup,n=r.call(this,t,e,!i);this._newBaseOption=n.baseOption,i?(l(i.baseOption,n.baseOption),n.timelineOptions.length&&(i.timelineOptions=n.timelineOptions),n.mediaList.length&&(i.mediaList=n.mediaList),n.mediaDefault&&(i.mediaDefault=n.mediaDefault)):this._optionBackup=n},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=p(e.timelineOptions,f),this._mediaList=p(e.mediaList,f),this._mediaDefault=f(e.mediaDefault),this._currentMediaIndices=[],f(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,i=this._timelineOptions;if(i.length){var n=t.getComponent("timeline");n&&(e=f(i[n.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),i=this._api.getHeight(),n=this._mediaList,r=this._mediaDefault,a=[],l=[];if(!n.length&&!r)return l;for(var h=0,u=n.length;h<u;h++)o(n[h].query,e,i)&&a.push(h);return!a.length&&r&&(a=[-1]),a.length&&!s(a,this._currentMediaIndices)&&(l=p(a,function(t){return f(t===-1?r.option:n[t].option)})),this._currentMediaIndices=a,l}},t.exports=n},function(t,e){var i="";"undefined"!=typeof navigator&&(i=navigator.platform||""),t.exports={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],textStyle:{fontFamily:i.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:!0,animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3}},function(t,e,i){t.exports={getAreaStyle:i(30)([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]])}},function(t,e){t.exports={getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}},function(t,e,i){var n=i(30)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]);t.exports={getItemStyle:function(t){var e=n.call(this,t),i=this.getBorderLineDash();return i&&(e.lineDash=i),e},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}}},function(t,e,i){var n=i(30)([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getLineStyle:function(t){var e=n.call(this,t),i=this.getLineDash(e.lineWidth);return i&&(e.lineDash=i),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),i=Math.max(t,2),n=4*t;return"solid"===e||null==e?null:"dashed"===e?[n,n]:[i,i]}}},function(t,e,i){function n(t,e){return t&&t.getShallow(e)}var r=i(17);t.exports={getTextColor:function(){var t=this.ecModel;return this.getShallow("color")||t&&t.get("textStyle.color")},getFont:function(){var t=this.ecModel,e=t&&t.getModel("textStyle");return[this.getShallow("fontStyle")||n(e,"fontStyle"),this.getShallow("fontWeight")||n(e,"fontWeight"),(this.getShallow("fontSize")||n(e,"fontSize")||12)+"px",this.getShallow("fontFamily")||n(e,"fontFamily")||"sans-serif"].join(" ")},getTextRect:function(t){return r.getBoundingRect(t,this.getFont(),this.getShallow("align"),this.getShallow("baseline"))},truncateText:function(t,e,i,n){return r.truncateText(t,e,this.getFont(),i,n)}}},function(t,e,i){function n(t,e){e=e.split(",");for(var i=t,n=0;n<e.length&&(i=i&&i[e[n]],null!=i);n++);return i}function r(t,e,i,n){e=e.split(",");for(var r,o=t,a=0;a<e.length-1;a++)r=e[a],null==o[r]&&(o[r]={}),o=o[r];(n||null==o[e[a]])&&(o[e[a]]=i)}function o(t){c(l,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}var a=i(1),s=i(134),l=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],h=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],u=["bar","boxplot","candlestick","chord","effectScatter","funnel","gauge","lines","graph","heatmap","line","map","parallel","pie","radar","sankey","scatter","treemap"],c=a.each;t.exports=function(t){c(t.series,function(t){if(a.isObject(t)){var e=t.type;if(s(t),"pie"!==e&&"gauge"!==e||null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===e){var i=n(t,"pointer.color");null!=i&&r(t,"itemStyle.normal.color",i)}for(var l=0;l<u.length;l++)if(u[l]===t.type){o(t);break}}}),t.dataRange&&(t.visualMap=t.dataRange),c(h,function(e){var i=t[e];i&&(a.isArray(i)||(i=[i]),c(i,function(t){o(t)}))})}},function(t,e,i){function n(t){var e=t&&t.itemStyle;e&&r.each(o,function(i){var n=e.normal,o=e.emphasis;n&&n[i]&&(t[i]=t[i]||{},t[i].normal?r.merge(t[i].normal,n[i]):t[i].normal=n[i],n[i]=null),o&&o[i]&&(t[i]=t[i]||{},t[i].emphasis?r.merge(t[i].emphasis,o[i]):t[i].emphasis=o[i],o[i]=null)})}var r=i(1),o=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];t.exports=function(t){if(t){n(t),n(t.markPoint),n(t.markLine);var e=t.data;if(e){for(var i=0;i<e.length;i++)n(e[i]);var o=t.markPoint;if(o&&o.data)for(var a=o.data,i=0;i<a.length;i++)n(a[i]);var s=t.markLine;if(s&&s.data)for(var l=s.data,i=0;i<l.length;i++)r.isArray(l[i])?(n(l[i][0]),n(l[i][1])):n(l[i])}}}},function(t,e){var i={average:function(t){for(var e=0,i=0,n=0;n<t.length;n++)isNaN(t[n])||(e+=t[n],i++);return 0===i?NaN:e/i},sum:function(t){for(var e=0,i=0;i<t.length;i++)e+=t[i]||0;return e},max:function(t){for(var e=-(1/0),i=0;i<t.length;i++)t[i]>e&&(e=t[i]);return e},min:function(t){for(var e=1/0,i=0;i<t.length;i++)t[i]<e&&(e=t[i]);return e},nearest:function(t){return t[0]}},n=function(t,e){return Math.round(t.length/2)};t.exports=function(t,e,r){e.eachSeriesByType(t,function(t){var e=t.getData(),r=t.get("sampling"),o=t.coordinateSystem;if("cartesian2d"===o.type&&r){var a=o.getBaseAxis(),s=o.getOtherAxis(a),l=a.getExtent(),h=l[1]-l[0],u=Math.round(e.count()/h);if(u>1){var c;"string"==typeof r?c=i[r]:"function"==typeof r&&(c=r),c&&(e=e.downSample(s.dim,1/u,c,n),t.setData(e))}}},this)}},function(t,e,i){function n(t,e){return c(t,u(e))}var r=i(1),o=i(32),a=i(4),s=i(38),l=o.prototype,h=s.prototype,u=a.getPrecisionSafe,c=a.round,d=Math.floor,f=Math.ceil,p=Math.pow,g=Math.log,m=o.extend({type:"log",base:10,$constructor:function(){o.apply(this,arguments),this._originalScale=new s},getTicks:function(){var t=this._originalScale,e=this._extent,i=t.getExtent();return r.map(h.getTicks.call(this),function(r){var o=a.round(p(this.base,r));return o=r===e[0]&&t.__fixMin?n(o,i[0]):o,o=r===e[1]&&t.__fixMax?n(o,i[1]):o},this)},getLabel:h.getLabel,scale:function(t){return t=l.scale.call(this,t),p(this.base,t)},setExtent:function(t,e){var i=this.base;t=g(t)/g(i),e=g(e)/g(i),h.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=l.getExtent.call(this);e[0]=p(t,e[0]),e[1]=p(t,e[1]);var i=this._originalScale,r=i.getExtent();return i.__fixMin&&(e[0]=n(e[0],r[0])),i.__fixMax&&(e[1]=n(e[1],r[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=g(t[0])/g(e),t[1]=g(t[1])/g(e),l.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!0,function(t){return t>0}))},niceTicks:function(t){t=t||10;var e=this._extent,i=e[1]-e[0];if(!(i===1/0||i<=0)){var n=a.quantity(i),r=t/i*n;for(r<=.5&&(n*=10);!isNaN(n)&&Math.abs(n)<1&&Math.abs(n)>0;)n*=10;var o=[a.round(f(e[0]/n)*n),a.round(d(e[1]/n)*n)];this._interval=n,this._niceExtent=o}},niceExtent:function(t,e,i){h.niceExtent.call(this,t,e,i);var n=this._originalScale;n.__fixMin=e,n.__fixMax=i}});r.each(["contain","normalize"],function(t){m.prototype[t]=function(e){return e=g(e)/g(this.base),l[t].call(this,e)}}),m.create=function(){return new m},t.exports=m},function(t,e,i){var n=i(1),r=i(32),o=r.prototype,a=r.extend({type:"ordinal",init:function(t,e){this._data=t,this._extent=e||[0,t.length-1]},parse:function(t){return"string"==typeof t?n.indexOf(this._data,t):Math.round(t)},contain:function(t){return t=this.parse(t),o.contain.call(this,t)&&null!=this._data[t]},normalize:function(t){return o.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(o.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,i=e[0];i<=e[1];)t.push(i),i++;return t},getLabel:function(t){return this._data[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getDataExtent(e,!1))},niceTicks:n.noop,niceExtent:n.noop});a.create=function(){return new a},t.exports=a},function(t,e,i){var n=i(1),r=i(4),o=i(8),a=i(38),s=a.prototype,l=Math.ceil,h=Math.floor,u=1e3,c=60*u,d=60*c,f=24*d,p=function(t,e,i,n){for(;i<n;){var r=i+n>>>1;t[r][2]<e?i=r+1:n=r}return i},g=a.extend({type:"time",getLabel:function(t){var e=this._stepLvl,i=new Date(t);return o.formatTime(e[0],i)},niceExtent:function(t,e,i){var n=this._extent;if(n[0]===n[1]&&(n[0]-=f,n[1]+=f),n[1]===-(1/0)&&n[0]===1/0){var o=new Date;n[1]=new Date(o.getFullYear(),o.getMonth(),o.getDate()),n[0]=n[1]-f}this.niceTicks(t);var a=this._interval;e||(n[0]=r.round(h(n[0]/a)*a)),i||(n[1]=r.round(l(n[1]/a)*a))},niceTicks:function(t){t=t||10;var e=this._extent,i=e[1]-e[0],n=i/t,o=m.length,a=p(m,n,0,o),s=m[Math.min(a,o-1)],u=s[2];if("year"===s[0]){var c=i/u,d=r.nice(c/t,!0);u*=d}var f=[l(e[0]/u)*u,h(e[1]/u)*u];this._stepLvl=s,this._interval=u,this._niceExtent=f},parse:function(t){return+r.parseDate(t)}});n.each(["contain","normalize"],function(t){g.prototype[t]=function(e){return s[t].call(this,this.parse(e))}});var m=[["hh:mm:ss",1,u],["hh:mm:ss",5,5*u],["hh:mm:ss",10,10*u],["hh:mm:ss",15,15*u],["hh:mm:ss",30,30*u],["hh:mm\nMM-dd",1,c],["hh:mm\nMM-dd",5,5*c],["hh:mm\nMM-dd",10,10*c],["hh:mm\nMM-dd",15,15*c],["hh:mm\nMM-dd",30,30*c],["hh:mm\nMM-dd",1,d],["hh:mm\nMM-dd",2,2*d],["hh:mm\nMM-dd",6,6*d],["hh:mm\nMM-dd",12,12*d],["MM-dd\nyyyy",1,f],["week",7,7*f],["month",1,31*f],["quarter",3,380*f/4],["half-year",6,380*f/2],["year",1,380*f]];g.create=function(){return new g},t.exports=g},function(t,e,i){var n=i(37);t.exports=function(t){function e(e){var i=(e.visualColorAccessPath||"itemStyle.normal.color").split("."),r=e.getData(),o=e.get(i)||e.getColorFromPalette(e.get("name"));r.setVisual("color",o),t.isSeriesFiltered(e)||("function"!=typeof o||o instanceof n||r.each(function(t){r.setItemVisual(t,"color",o(e.getDataParams(t)))}),r.each(function(t){var e=r.getItemModel(t),n=e.get(i,!0);null!=n&&r.setItemVisual(t,"color",n)}))}t.eachRawSeries(e)}},function(t,e,i){"use strict";function n(t,e,i){return{type:t,event:i,target:e,cancelBubble:!1,offsetX:i.zrX,offsetY:i.zrY,gestureEvent:i.gestureEvent,pinchX:i.pinchX,pinchY:i.pinchY,pinchScale:i.pinchScale,wheelDelta:i.zrDelta,zrByTouch:i.zrByTouch}}function r(){}function o(t,e,i){if(t[t.rectHover?"rectContain":"contain"](e,i)){for(var n=t;n;){if(n.silent||n.clipPath&&!n.clipPath.contain(e,i))return!1;n=n.parent}return!0}return!1}var a=i(1),s=i(168),l=i(21);r.prototype.dispose=function(){};var h=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],u=function(t,e,i,n){l.call(this),this.storage=t,this.painter=e,this.painterRoot=n,i=i||new r,this.proxy=i,i.handler=this,this._hovered,this._lastTouchMoment,this._lastX,this._lastY,s.call(this),a.each(h,function(t){i.on&&i.on(t,this[t],this)},this)};u.prototype={constructor:u,mousemove:function(t){var e=t.zrX,i=t.zrY,n=this.findHover(e,i,null),r=this._hovered,o=this.proxy;this._hovered=n,o.setCursor&&o.setCursor(n?n.cursor:"default"),r&&n!==r&&r.__zr&&this.dispatchToElement(r,"mouseout",t),this.dispatchToElement(n,"mousemove",t),n&&n!==r&&this.dispatchToElement(n,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);var e,i=t.toElement||t.relatedTarget;do i=i&&i.parentNode;while(i&&9!=i.nodeType&&!(e=i===this.painterRoot));!e&&this.trigger("globalout",{event:t})},resize:function(t){this._hovered=null},dispatch:function(t,e){var i=this[t];i&&i.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,i){for(var r="on"+e,o=n(e,t,i),a=t;a&&(a[r]&&(o.cancelBubble=a[r].call(a,o)),a.trigger(e,o),a=a.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)}))},findHover:function(t,e,i){for(var n=this.storage.getDisplayList(),r=n.length-1;r>=0;r--)if(!n[r].silent&&n[r]!==i&&!n[r].ignore&&o(n[r],t,e))return n[r]}},a.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){u.prototype[t]=function(e){var i=this.findHover(e.zrX,e.zrY,null);if("mousedown"===t)this._downel=i,this._upel=i;else if("mosueup"===t)this._upel=i;else if("click"===t&&this._downel!==this._upel)return;this.dispatchToElement(i,t,e)}}),a.mixin(u,l),a.mixin(u,s),t.exports=u},function(t,e,i){function n(){return!1}function r(t,e,i,n){var r=document.createElement(e),o=i.getWidth(),a=i.getHeight(),s=r.style;return s.position="absolute",s.left=0,s.top=0,s.width=o+"px",s.height=a+"px",r.width=o*n,r.height=a*n,r.setAttribute("data-zr-dom-id",t),r}var o=i(1),a=i(33),s=i(66),l=i(65),h=function(t,e,i){var s;i=i||a.devicePixelRatio,"string"==typeof t?s=r(t,"canvas",e,i):o.isObject(t)&&(s=t,t=s.id),this.id=t,this.dom=s;var l=s.style;l&&(s.onselectstart=n,l["-webkit-user-select"]="none",l["user-select"]="none",l["-webkit-touch-callout"]="none",l["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",l.padding=0,l.margin=0,l["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=i};h.prototype={constructor:h,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=r("back-"+this.id,"canvas",this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var i=this.dpr,n=this.dom,r=n.style,o=this.domBack;r.width=t+"px",r.height=e+"px",n.width=t*i,n.height=e*i,o&&(o.width=t*i,o.height=e*i,1!=i&&this.ctxBack.scale(i,i))},clear:function(t){var e=this.dom,i=this.ctx,n=e.width,r=e.height,o=this.clearColor,a=this.motionBlur&&!t,h=this.lastFrameAlpha,u=this.dpr;if(a&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,n/u,r/u)),i.clearRect(0,0,n,r),o){var c;o.colorStops?(c=o.__canvasGradient||s.getGradient(i,o,{x:0,y:0,width:n,height:r}),o.__canvasGradient=c):o.image&&(c=l.prototype.getCanvasPattern.call(o,i)),i.save(),i.fillStyle=c||o,i.fillRect(0,0,n,r),i.restore()}if(a){var d=this.domBack;i.save(),i.globalAlpha=h,i.drawImage(d,0,0,n,r),i.restore()}}},t.exports=h},function(t,e,i){"use strict";function n(t){return parseInt(t,10)}function r(t){return!!t&&(!!t.isBuildin||"function"==typeof t.resize&&"function"==typeof t.refresh)}function o(t){t.__unusedCount++}function a(t){1==t.__unusedCount&&t.clear()}function s(t,e,i){return x.copy(t.getBoundingRect()),t.transform&&x.applyTransform(t.transform),_.width=e,_.height=i,!x.intersect(_)}function l(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var i=0;i<t.length;i++)if(t[i]!==e[i])return!0}function h(t,e){for(var i=0;i<t.length;i++){var n=t[i],r=n.path;n.setTransform(e),r.beginPath(e),n.buildPath(r,n.shape),e.clip(),n.restoreTransform(e)}}function u(t,e){var i=document.createElement("div");return i.style.cssText=["position:relative","overflow:hidden","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",i}var c=i(33),d=i(1),f=i(48),p=i(9),g=i(46),m=i(141),v=i(62),y=5,x=new p(0,0,0,0),_=new p(0,0,0,0),b=function(t,e,i){var n=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=i=d.extend({},i||{}),this.dpr=i.devicePixelRatio||c.devicePixelRatio,this._singleCanvas=n,this.root=t;var r=t.style;r&&(r["-webkit-tap-highlight-color"]="transparent",r["-webkit-user-select"]=r["user-select"]=r["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var o=this._zlevelList=[],a=this._layers={};if(this._layerConfig={},n){var s=t.width,l=t.height;this._width=s,this._height=l;var h=new m(t,this,1);h.initContext(),a[0]=h,o.push(0),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var f=this._domRoot=u(this._width,this._height);t.appendChild(f)}this.pathToImage=this._createPathToImage(),this._progressiveLayers=[],this._hoverlayer,this._hoverElements=[]};b.prototype={constructor:b,isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},refresh:function(t){var e=this.storage.getDisplayList(!0),i=this._zlevelList;this._paintList(e,t);for(var n=0;n<i.length;n++){var r=i[n],o=this._layers[r];!o.isBuildin&&o.refresh&&o.refresh()}return this.refreshHover(),this._progressiveLayers.length&&this._startProgessive(),this},addHover:function(t,e){if(!t.__hoverMir){var i=new t.constructor({style:t.style,shape:t.shape});i.__from=t,t.__hoverMir=i,i.setStyle(e),this._hoverElements.push(i)}},removeHover:function(t){var e=t.__hoverMir,i=this._hoverElements,n=d.indexOf(i,e);n>=0&&i.splice(n,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,i=0;i<e.length;i++){var n=e[i].__from;n&&(n.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,i=this._hoverlayer;if(i&&i.clear(),e){g(t,this.storage.displayableSortFunc),i||(i=this._hoverlayer=this.getLayer(1e5));var n={};i.ctx.save();for(var r=0;r<e;){var o=t[r],a=o.__from;a&&a.__zr?(r++,a.invisible||(o.transform=a.transform,o.invTransform=a.invTransform,o.__clipPaths=a.__clipPaths,this._doPaintEl(o,i,!0,n))):(t.splice(r,1),a.__hoverMir=null,e--)}i.ctx.restore()}},_startProgessive:function(){function t(){i===e._progressiveToken&&e.storage&&(e._doPaintList(e.storage.getDisplayList()),e._furtherProgressive?(e._progress++,v(t)):e._progressiveToken=-1)}var e=this;if(e._furtherProgressive){var i=e._progressiveToken=+new Date;e._progress++,v(t)}},_clearProgressive:function(){this._progressiveToken=-1,this._progress=0,d.each(this._progressiveLayers,function(t){t.__dirty&&t.clear()})},_paintList:function(t,e){null==e&&(e=!1),this._updateLayerStatus(t),this._clearProgressive(),this.eachBuildinLayer(o),this._doPaintList(t,e),this.eachBuildinLayer(a)},_doPaintList:function(t,e){function i(t){var e=o.dpr||1;o.save(),o.globalAlpha=1,o.shadowBlur=0,n.__dirty=!0,o.setTransform(1,0,0,1,0,0),o.drawImage(t.dom,0,0,u*e,c*e),o.restore()}for(var n,r,o,a,s,l,h=0,u=this._width,c=this._height,p=this._progress,g=0,m=t.length;g<m;g++){var v=t[g],x=this._singleCanvas?0:v.zlevel,_=v.__frame;if(_<0&&s&&(i(s),s=null),r!==x&&(o&&o.restore(),a={},r=x,n=this.getLayer(r),n.isBuildin||f("ZLevel "+r+" has been used by unkown layer "+n.id),o=n.ctx,o.save(),n.__unusedCount=0,(n.__dirty||e)&&n.clear()),n.__dirty||e){if(_>=0){if(!s){if(s=this._progressiveLayers[Math.min(h++,y-1)],s.ctx.save(),s.renderScope={},s&&s.__progress>s.__maxProgress){g=s.__nextIdxNotProg-1;continue}l=s.__progress,s.__dirty||(p=l),s.__progress=p+1}_===p&&this._doPaintEl(v,s,!0,s.renderScope)}else this._doPaintEl(v,n,e,a);v.__dirty=!1}}s&&i(s),o&&o.restore(),this._furtherProgressive=!1,d.each(this._progressiveLayers,function(t){t.__maxProgress>=t.__progress&&(this._furtherProgressive=!0)},this)},_doPaintEl:function(t,e,i,n){var r=e.ctx,o=t.transform;if((e.__dirty||i)&&!t.invisible&&0!==t.style.opacity&&(!o||o[0]||o[3])&&(!t.culling||!s(t,this._width,this._height))){var a=t.__clipPaths;(n.prevClipLayer!==e||l(a,n.prevElClipPaths))&&(n.prevElClipPaths&&(n.prevClipLayer.ctx.restore(),n.prevClipLayer=n.prevElClipPaths=null,n.prevEl=null),a&&(r.save(),h(a,r),n.prevClipLayer=e,n.prevElClipPaths=a)),t.beforeBrush&&t.beforeBrush(r),t.brush(r,n.prevEl||null),n.prevEl=t,t.afterBrush&&t.afterBrush(r)}},getLayer:function(t){if(this._singleCanvas)return this._layers[0];var e=this._layers[t];return e||(e=new m("zr_"+t,this,this.dpr),e.isBuildin=!0,this._layerConfig[t]&&d.merge(e,this._layerConfig[t],!0),this.insertLayer(t,e),e.initContext()),e},insertLayer:function(t,e){var i=this._layers,n=this._zlevelList,o=n.length,a=null,s=-1,l=this._domRoot;if(i[t])return void f("ZLevel "+t+" has been used already");if(!r(e))return void f("Layer of zlevel "+t+" is not valid");if(o>0&&t>n[0]){for(s=0;s<o-1&&!(n[s]<t&&n[s+1]>t);s++);a=i[n[s]]}if(n.splice(s+1,0,t),a){var h=a.dom;h.nextSibling?l.insertBefore(e.dom,h.nextSibling):l.appendChild(e.dom)}else l.firstChild?l.insertBefore(e.dom,l.firstChild):l.appendChild(e.dom);i[t]=e},eachLayer:function(t,e){var i,n,r=this._zlevelList;for(n=0;n<r.length;n++)i=r[n],t.call(e,this._layers[i],i)},eachBuildinLayer:function(t,e){var i,n,r,o=this._zlevelList;for(r=0;r<o.length;r++)n=o[r],i=this._layers[n],i.isBuildin&&t.call(e,i,n)},eachOtherLayer:function(t,e){var i,n,r,o=this._zlevelList;for(r=0;r<o.length;r++)n=o[r],i=this._layers[n],i.isBuildin||t.call(e,i,n)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){var e=this._layers,i=this._progressiveLayers,n={},r={};this.eachBuildinLayer(function(t,e){n[e]=t.elCount,t.elCount=0,t.__dirty=!1}),d.each(i,function(t,e){r[e]=t.elCount,t.elCount=0,t.__dirty=!1});for(var o,a,s=0,l=0,h=0,u=t.length;h<u;h++){var c=t[h],f=this._singleCanvas?0:c.zlevel,p=e[f],g=c.progressive;if(p&&(p.elCount++,p.__dirty=p.__dirty||c.__dirty),g>=0){a!==g&&(a=g,l++);var v=c.__frame=l-1;if(!o){var x=Math.min(s,y-1);o=i[x],o||(o=i[x]=new m("progressive",this,this.dpr),o.initContext()),o.__maxProgress=0}o.__dirty=o.__dirty||c.__dirty,o.elCount++,o.__maxProgress=Math.max(o.__maxProgress,v),o.__maxProgress>=o.__progress&&(p.__dirty=!0)}else c.__frame=-1,o&&(o.__nextIdxNotProg=h,s++,o=null)}o&&(s++,o.__nextIdxNotProg=h),this.eachBuildinLayer(function(t,e){n[e]!==t.elCount&&(t.__dirty=!0)}),i.length=Math.min(s,y),d.each(i,function(t,e){r[e]!==t.elCount&&(c.__dirty=!0),t.__dirty&&(t.__progress=0)})},clear:function(){return this.eachBuildinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var i=this._layerConfig;i[t]?d.merge(i[t],e,!0):i[t]=e;var n=this._layers[t];n&&d.merge(n,i[t],!0)}},delLayer:function(t){var e=this._layers,i=this._zlevelList,n=e[t];n&&(n.dom.parentNode.removeChild(n.dom),delete e[t],i.splice(d.indexOf(i,t),1))},resize:function(t,e){var i=this._domRoot;i.style.display="none";var n=this._opts;if(null!=t&&(n.width=t),null!=e&&(n.height=e),t=this._getSize(0),e=this._getSize(1),i.style.display="",this._width!=t||e!=this._height){i.style.width=t+"px",i.style.height=e+"px";for(var r in this._layers)this._layers.hasOwnProperty(r)&&this._layers[r].resize(t,e);d.each(this._progressiveLayers,function(i){i.resize(t,e)}),this.refresh(!0)}return this._width=t,this._height=e,this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas)return this._layers[0].dom;var e=new m("image",this,t.pixelRatio||this.dpr);e.initContext(),e.clearColor=t.backgroundColor,e.clear();for(var i=this.storage.getDisplayList(!0),n={},r=0;r<i.length;r++){var o=i[r];this._doPaintEl(o,e,!0,n)}return e.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,i=["width","height"][t],r=["clientWidth","clientHeight"][t],o=["paddingLeft","paddingTop"][t],a=["paddingRight","paddingBottom"][t];if(null!=e[i]&&"auto"!==e[i])return parseFloat(e[i]);var s=this.root,l=document.defaultView.getComputedStyle(s);return(s[r]||n(l[i])||n(s.style[i]))-(n(l[o])||0)-(n(l[a])||0)|0},_pathToImage:function(t,e,n,r,o){var a=document.createElement("canvas"),s=a.getContext("2d");a.width=n*o,a.height=r*o,s.clearRect(0,0,n*o,r*o);var l={position:e.position,rotation:e.rotation,scale:e.scale};e.position=[0,0,0],e.rotation=0,e.scale=[1,1],e&&e.brush(s);var h=i(49),u=new h({id:t,style:{x:0,y:0,image:a}});return null!=l.position&&(u.position=e.position=l.position),null!=l.rotation&&(u.rotation=e.rotation=l.rotation),null!=l.scale&&(u.scale=e.scale=l.scale),u},_createPathToImage:function(){var t=this;return function(e,i,n,r){return t._pathToImage(e,i,n,r,t.dpr)}}},t.exports=b},function(t,e,i){"use strict";function n(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var r=i(1),o=i(10),a=i(34),s=i(46),l=function(){this._elements={},this._roots=[],this._displayList=[],this._displayListLen=0};l.prototype={constructor:l,traverse:function(t,e){for(var i=0;i<this._roots.length;i++)this._roots[i].traverse(t,e)},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){this._displayListLen=0;for(var e=this._roots,i=this._displayList,r=0,a=e.length;r<a;r++)this._updateAndAddDisplayable(e[r],null,t);i.length=this._displayListLen,o.canvasSupported&&s(i,n)},_updateAndAddDisplayable:function(t,e,i){if(!t.ignore||i){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var n=t.clipPath;if(n){e=e?e.slice():[];for(var r=n,o=t;r;)r.parent=o,r.updateTransform(),e.push(r),o=r,r=r.clipPath}if(t.isGroup){for(var a=t._children,s=0;s<a.length;s++){var l=a[s];t.__dirty&&(l.__dirty=!0),this._updateAndAddDisplayable(l,e,i)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){this._elements[t.id]||(t instanceof a&&t.addChildrenToStorage(this),this.addToMap(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(var e=0;e<this._roots.length;e++){var i=this._roots[e];i instanceof a&&i.delChildrenFromStorage(this)}return this._elements={},this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array)for(var e=0,n=t.length;e<n;e++)this.delRoot(t[e]);else{var o;o="string"==typeof t?this._elements[t]:t;var s=r.indexOf(this._roots,o);s>=0&&(this.delFromMap(o.id),this._roots.splice(s,1),o instanceof a&&o.delChildrenFromStorage(this))}},addToMap:function(t){return t instanceof a&&(t.__storage=this),t.dirty(!1),this._elements[t.id]=t,this},get:function(t){return this._elements[t]},delFromMap:function(t){var e=this._elements,i=e[t];return i&&(delete e[t],i instanceof a&&(i.__storage=null)),this},dispose:function(){this._elements=this._renderList=this._roots=null},displayableSortFunc:n},t.exports=l},function(t,e,i){"use strict";var n=i(1),r=i(25).Dispatcher,o=i(62),a=i(61),s=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,r.call(this)};s.prototype={constructor:s,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),i=0;i<e.length;i++)this.addClip(e[i])},removeClip:function(t){var e=n.indexOf(this._clips,t);e>=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),i=0;i<e.length;i++)this.removeClip(e[i]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,i=this._clips,n=i.length,r=[],o=[],a=0;a<n;a++){var s=i[a],l=s.step(t);l&&(r.push(l),o.push(s))}for(var a=0;a<n;)i[a]._needsRemove?(i[a]=i[n-1],i.pop(),n--):a++;n=r.length;for(var a=0;a<n;a++)o[a].fire(r[a]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){function t(){e._running&&(o(t),!e._paused&&e._update())}var e=this;this._running=!0,o(t)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},animate:function(t,e){e=e||{};var i=new a(t,e.loop,e.getter,e.setter);return this.addAnimator(i),i}},n.mixin(s,r),t.exports=s},function(t,e,i){function n(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart}var r=i(146);n.prototype={constructor:n,step:function(t){this._initialized||(this._startTime=t+this._delay,this._initialized=!0);var e=(t-this._startTime)/this._life;if(!(e<0)){e=Math.min(e,1);var i=this.easing,n="string"==typeof i?r[i]:i,o="function"==typeof n?n(e):e;
+return this.fire("frame",o),1==e?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(t){var e=(t-this._startTime)%this._life;this._startTime=t-e+this.gap,this._needsRemove=!1},fire:function(t,e){t="on"+t,this[t]&&this[t](this._target,e)}},t.exports=n},function(t,e){var i={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(-Math.pow(2,-10*(t-1))+2)},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||i<1?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),-(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)))},elasticOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||i<1?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},elasticInOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||i<1?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),(t*=2)<1?-.5*(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)):i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?.5*(t*t*((e+1)*t-e)):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-i.bounceOut(1-t)},bounceOut:function(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},bounceInOut:function(t){return t<.5?.5*i.bounceIn(2*t):.5*i.bounceOut(2*t-1)+.5}};t.exports=i},function(t,e,i){var n=i(63).normalizeRadian,r=2*Math.PI;t.exports={containStroke:function(t,e,i,o,a,s,l,h,u){if(0===l)return!1;var c=l;h-=t,u-=e;var d=Math.sqrt(h*h+u*u);if(d-c>i||d+c<i)return!1;if(Math.abs(o-a)%r<1e-4)return!0;if(s){var f=o;o=n(a),a=n(f)}else o=n(o),a=n(a);o>a&&(a+=r);var p=Math.atan2(u,h);return p<0&&(p+=r),p>=o&&p<=a||p+r>=o&&p+r<=a}}},function(t,e,i){var n=i(18);t.exports={containStroke:function(t,e,i,r,o,a,s,l,h,u,c){if(0===h)return!1;var d=h;if(c>e+d&&c>r+d&&c>a+d&&c>l+d||c<e-d&&c<r-d&&c<a-d&&c<l-d||u>t+d&&u>i+d&&u>o+d&&u>s+d||u<t-d&&u<i-d&&u<o-d&&u<s-d)return!1;var f=n.cubicProjectPoint(t,e,i,r,o,a,s,l,u,c,null);return f<=d/2}}},function(t,e,i){"use strict";function n(t,e){return Math.abs(t-e)<x}function r(){var t=b[0];b[0]=b[1],b[1]=t}function o(t,e,i,n,o,a,s,l,h,u){if(u>e&&u>n&&u>a&&u>l||u<e&&u<n&&u<a&&u<l)return 0;var c=g.cubicRootAt(e,n,a,l,u,_);if(0===c)return 0;for(var d,f,p=0,m=-1,v=0;v<c;v++){var y=_[v],x=0===y||1===y?.5:1,w=g.cubicAt(t,i,o,s,y);w<h||(m<0&&(m=g.cubicExtrema(e,n,a,l,b),b[1]<b[0]&&m>1&&r(),d=g.cubicAt(e,n,a,l,b[0]),m>1&&(f=g.cubicAt(e,n,a,l,b[1]))),p+=2==m?y<b[0]?d<e?x:-x:y<b[1]?f<d?x:-x:l<f?x:-x:y<b[0]?d<e?x:-x:l<d?x:-x)}return p}function a(t,e,i,n,r,o,a,s){if(s>e&&s>n&&s>o||s<e&&s<n&&s<o)return 0;var l=g.quadraticRootAt(e,n,o,s,_);if(0===l)return 0;var h=g.quadraticExtremum(e,n,o);if(h>=0&&h<=1){for(var u=0,c=g.quadraticAt(e,n,o,h),d=0;d<l;d++){var f=0===_[d]||1===_[d]?.5:1,p=g.quadraticAt(t,i,r,_[d]);p<a||(u+=_[d]<h?c<e?f:-f:o<c?f:-f)}return u}var f=0===_[0]||1===_[0]?.5:1,p=g.quadraticAt(t,i,r,_[0]);return p<a?0:o<e?f:-f}function s(t,e,i,n,r,o,a,s){if(s-=e,s>i||s<-i)return 0;var l=Math.sqrt(i*i-s*s);_[0]=-l,_[1]=l;var h=Math.abs(n-r);if(h<1e-4)return 0;if(h%y<1e-4){n=0,r=y;var u=o?1:-1;return a>=_[0]+t&&a<=_[1]+t?u:0}if(o){var l=n;n=p(r),r=p(l)}else n=p(n),r=p(r);n>r&&(r+=y);for(var c=0,d=0;d<2;d++){var f=_[d];if(f+t>a){var g=Math.atan2(s,f),u=o?1:-1;g<0&&(g=y+g),(g>=n&&g<=r||g+y>=n&&g+y<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(u=-u),c+=u)}}return c}function l(t,e,i,r,l){for(var u=0,p=0,g=0,y=0,x=0,_=0;_<t.length;){var b=t[_++];switch(b===h.M&&_>1&&(i||(u+=m(p,g,y,x,r,l))),1==_&&(p=t[_],g=t[_+1],y=p,x=g),b){case h.M:y=t[_++],x=t[_++],p=y,g=x;break;case h.L:if(i){if(v(p,g,t[_],t[_+1],e,r,l))return!0}else u+=m(p,g,t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case h.C:if(i){if(c.containStroke(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else u+=o(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case h.Q:if(i){if(d.containStroke(p,g,t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else u+=a(p,g,t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case h.A:var w=t[_++],M=t[_++],S=t[_++],T=t[_++],A=t[_++],I=t[_++],C=(t[_++],1-t[_++]),k=Math.cos(A)*S+w,L=Math.sin(A)*T+M;_>1?u+=m(p,g,k,L,r,l):(y=k,x=L);var P=(r-w)*T/S+w;if(i){if(f.containStroke(w,M,T,A,A+I,C,e,P,l))return!0}else u+=s(w,M,T,A,A+I,C,P,l);p=Math.cos(A+I)*S+w,g=Math.sin(A+I)*T+M;break;case h.R:y=p=t[_++],x=g=t[_++];var D=t[_++],O=t[_++],k=y+D,L=x+O;if(i){if(v(y,x,k,x,e,r,l)||v(k,x,k,L,e,r,l)||v(k,L,y,L,e,r,l)||v(y,L,y,x,e,r,l))return!0}else u+=m(k,x,k,L,r,l),u+=m(y,L,y,x,r,l);break;case h.Z:if(i){if(v(p,g,y,x,e,r,l))return!0}else u+=m(p,g,y,x,r,l);p=y,g=x}}return i||n(g,x)||(u+=m(p,g,y,x,r,l)||0),0!==u}var h=i(29).CMD,u=i(88),c=i(148),d=i(89),f=i(147),p=i(63).normalizeRadian,g=i(18),m=i(90),v=u.containStroke,y=2*Math.PI,x=1e-4,_=[-1,-1,-1],b=[-1,-1];t.exports={contain:function(t,e,i){return l(t,0,!1,e,i)},containStroke:function(t,e,i,n){return l(t,e,!0,i,n)}}},function(t,e,i){"use strict";function n(t){var e=t[1][0]-t[0][0],i=t[1][1]-t[0][1];return Math.sqrt(e*e+i*i)}function r(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}var o=i(25),a=function(){this._track=[]};a.prototype={constructor:a,recognize:function(t,e,i){return this._doTrack(t,e,i),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,i){var n=t.touches;if(n){for(var r={points:[],touches:[],target:e,event:t},a=0,s=n.length;a<s;a++){var l=n[a],h=o.clientToLocal(i,l,{});r.points.push([h.zrX,h.zrY]),r.touches.push(l)}this._track.push(r)}},_recognize:function(t){for(var e in s)if(s.hasOwnProperty(e)){var i=s[e](this._track,t);if(i)return i}}};var s={pinch:function(t,e){var i=t.length;if(i){var o=(t[i-1]||{}).points,a=(t[i-2]||{}).points||o;if(a&&a.length>1&&o&&o.length>1){var s=n(o)/n(a);!isFinite(s)&&(s=1),e.pinchScale=s;var l=r(o);return e.pinchX=l[0],e.pinchY=l[1],{type:"pinch",target:t[0].target,event:e}}}}};t.exports=a},function(t,e){var i=function(){this.head=null,this.tail=null,this._len=0},n=i.prototype;n.insert=function(t){var e=new r(t);return this.insertEntry(e),e},n.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,this.tail=t):this.head=this.tail=t,this._len++},n.remove=function(t){var e=t.prev,i=t.next;e?e.next=i:this.head=i,i?i.prev=e:this.tail=e,t.next=t.prev=null,this._len--},n.len=function(){return this._len};var r=function(t){this.value=t,this.next,this.prev},o=function(t){this._list=new i,this._map={},this._maxSize=t||10},a=o.prototype;a.put=function(t,e){var i=this._list,n=this._map;if(null==n[t]){var r=i.len();if(r>=this._maxSize&&r>0){var o=i.head;i.remove(o),delete n[o.key]}var a=i.insert(e);a.key=t,n[t]=a}},a.get=function(t){var e=this._map[t],i=this._list;if(null!=e)return e!==i.tail&&(i.remove(e),i.insertEntry(e)),e.value},a.clear=function(){this._list.clear(),this._map={}},t.exports=o},function(t,e,i){function n(t){return"mousewheel"===t&&d.browser.firefox?"DOMMouseScroll":t}function r(t,e,i){var n=t._gestureMgr;"start"===i&&n.clear();var r=n.recognize(e,t.handler.findHover(e.zrX,e.zrY,null),t.dom);if("end"===i&&n.clear(),r){var o=r.type;e.gestureEvent=o,t.handler.dispatchToElement(r.target,o,r.event)}}function o(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}function a(t){var e=t.pointerType;return"pen"===e||"touch"===e}function s(t){function e(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}u.each(x,function(e){t._handlers[e]=u.bind(w[e],t)}),u.each(b,function(e){t._handlers[e]=u.bind(w[e],t)}),u.each(y,function(i){t._handlers[i]=e(w[i],t)})}function l(t){function e(e,i){u.each(e,function(e){p(t,n(e),i._handlers[e])},i)}c.call(this),this.dom=t,this._touching=!1,this._touchTimer,this._gestureMgr=new f,this._handlers={},s(this),d.pointerEventsSupported?e(b,this):(d.touchEventsSupported&&e(x,this),e(y,this))}var h=i(25),u=i(1),c=i(21),d=i(10),f=i(150),p=h.addEventListener,g=h.removeEventListener,m=h.normalizeEvent,v=300,y=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],x=["touchstart","touchend","touchmove"],_={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},b=u.map(y,function(t){var e=t.replace("mouse","pointer");return _[e]?e:t}),w={mousemove:function(t){t=m(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){t=m(this.dom,t);var e=t.toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){t=m(this.dom,t),t.zrByTouch=!0,this._lastTouchMoment=new Date,r(this,t,"start"),w.mousemove.call(this,t),w.mousedown.call(this,t),o(this)},touchmove:function(t){t=m(this.dom,t),t.zrByTouch=!0,r(this,t,"change"),w.mousemove.call(this,t),o(this)},touchend:function(t){t=m(this.dom,t),t.zrByTouch=!0,r(this,t,"end"),w.mouseup.call(this,t),+new Date-this._lastTouchMoment<v&&w.click.call(this,t),o(this)},pointerdown:function(t){w.mousedown.call(this,t)},pointermove:function(t){a(t)||w.mousemove.call(this,t)},pointerup:function(t){w.mouseup.call(this,t)},pointerout:function(t){a(t)||w.mouseout.call(this,t)}};u.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){w[t]=function(e){e=m(this.dom,e),this.trigger(t,e)}});var M=l.prototype;M.dispose=function(){for(var t=y.concat(x),e=0;e<t.length;e++){var i=t[e];g(this.dom,n(i),this._handlers[i])}},M.setCursor=function(t){this.dom.style.cursor=t||"default"},u.mixin(l,c),t.exports=l},function(t,e,i){var n=i(7);t.exports=n.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,i=0;i<e.length;i++)t=t||e[i].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),i=0;i<t.length;i++)t[i].path.setScale(e[0],e[1])},buildPath:function(t,e){for(var i=e.paths||[],n=0;n<i.length;n++)i[n].buildPath(t,i[n].shape,!0)},afterBrush:function(){for(var t=this.shape.paths,e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),n.prototype.getBoundingRect.call(this)}})},function(t,e,i){"use strict";var n=i(1),r=i(37),o=function(t,e,i,n,o){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==i?.5:i,this.type="radial",this.global=o||!1,r.call(this,n)};o.prototype={constructor:o},n.inherits(o,r),t.exports=o},function(t,e){t.exports={buildPath:function(t,e){var i,n,r,o,a=e.x,s=e.y,l=e.width,h=e.height,u=e.r;l<0&&(a+=l,l=-l),h<0&&(s+=h,h=-h),"number"==typeof u?i=n=r=o=u:u instanceof Array?1===u.length?i=n=r=o=u[0]:2===u.length?(i=r=u[0],n=o=u[1]):3===u.length?(i=u[0],n=o=u[1],r=u[2]):(i=u[0],n=u[1],r=u[2],o=u[3]):i=n=r=o=0;var c;i+n>l&&(c=i+n,i*=l/c,n*=l/c),r+o>l&&(c=r+o,r*=l/c,o*=l/c),n+r>h&&(c=n+r,n*=h/c,r*=h/c),i+o>h&&(c=i+o,i*=h/c,o*=h/c),t.moveTo(a+i,s),t.lineTo(a+l-n,s),0!==n&&t.quadraticCurveTo(a+l,s,a+l,s+n),t.lineTo(a+l,s+h-r),0!==r&&t.quadraticCurveTo(a+l,s+h,a+l-r,s+h),t.lineTo(a+o,s+h),0!==o&&t.quadraticCurveTo(a,s+h,a,s+h-o),t.lineTo(a,s+i),0!==i&&t.quadraticCurveTo(a,s,a+i,s)}}},function(t,e,i){var n=i(5),r=n.min,o=n.max,a=n.scale,s=n.distance,l=n.add;t.exports=function(t,e,i,h){var u,c,d,f,p=[],g=[],m=[],v=[];if(h){d=[1/0,1/0],f=[-(1/0),-(1/0)];for(var y=0,x=t.length;y<x;y++)r(d,d,t[y]),o(f,f,t[y]);r(d,d,h[0]),o(f,f,h[1])}for(var y=0,x=t.length;y<x;y++){var _=t[y];if(i)u=t[y?y-1:x-1],c=t[(y+1)%x];else{if(0===y||y===x-1){p.push(n.clone(t[y]));continue}u=t[y-1],c=t[y+1]}n.sub(g,c,u),a(g,g,e);var b=s(_,u),w=s(_,c),M=b+w;0!==M&&(b/=M,w/=M),a(m,g,-b),a(v,g,w);var S=l([],_,m),T=l([],_,v);h&&(o(S,S,d),r(S,S,f),o(T,T,d),r(T,T,f)),p.push(S),p.push(T)}return i&&p.push(p.shift()),p}},function(t,e,i){function n(t,e,i,n,r,o,a){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*a+(-3*(e-i)-2*s-l)*o+s*r+e}var r=i(5);t.exports=function(t,e){for(var i=t.length,o=[],a=0,s=1;s<i;s++)a+=r.distance(t[s-1],t[s]);var l=a/2;l=l<i?i:l;for(var s=0;s<l;s++){var h,u,c,d=s/(l-1)*(e?i:i-1),f=Math.floor(d),p=d-f,g=t[f%i];e?(h=t[(f-1+i)%i],u=t[(f+1)%i],c=t[(f+2)%i]):(h=t[0===f?f:f-1],u=t[f>i-2?i-1:f+1],c=t[f>i-3?i-1:f+2]);var m=p*p,v=p*m;o.push([n(h[0],g[0],u[0],c[0],p,m,v),n(h[1],g[1],u[1],c[1],p,m,v)])}return o}},function(t,e,i){t.exports=i(7).extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.cx,n=e.cy,r=Math.max(e.r,0),o=e.startAngle,a=e.endAngle,s=e.clockwise,l=Math.cos(o),h=Math.sin(o);t.moveTo(l*r+i,h*r+n),t.arc(i,n,r,o,a,!s)}})},function(t,e,i){"use strict";function n(t,e,i){var n=t.cpx2,r=t.cpy2;return null===n||null===r?[(i?c:h)(t.x1,t.cpx1,t.cpx2,t.x2,e),(i?c:h)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(i?u:l)(t.x1,t.cpx1,t.x2,e),(i?u:l)(t.y1,t.cpy1,t.y2,e)]}var r=i(18),o=i(5),a=r.quadraticSubdivide,s=r.cubicSubdivide,l=r.quadraticAt,h=r.cubicAt,u=r.quadraticDerivativeAt,c=r.cubicDerivativeAt,d=[];t.exports=i(7).extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,r=e.x2,o=e.y2,l=e.cpx1,h=e.cpy1,u=e.cpx2,c=e.cpy2,f=e.percent;0!==f&&(t.moveTo(i,n),null==u||null==c?(f<1&&(a(i,l,r,f,d),l=d[1],r=d[2],a(n,h,o,f,d),h=d[1],o=d[2]),t.quadraticCurveTo(l,h,r,o)):(f<1&&(s(i,l,u,r,f,d),l=d[1],u=d[2],r=d[3],s(n,h,c,o,f,d),h=d[1],c=d[2],o=d[3]),t.bezierCurveTo(l,h,u,c,r,o)))},pointAt:function(t){return n(this.shape,t,!1)},tangentAt:function(t){var e=n(this.shape,t,!0);return o.normalize(e,e)}})},function(t,e,i){"use strict";t.exports=i(7).extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,i){i&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}})},function(t,e,i){t.exports=i(7).extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,r=e.x2,o=e.y2,a=e.percent;0!==a&&(t.moveTo(i,n),a<1&&(r=i*(1-a)+r*a,o=n*(1-a)+o*a),t.lineTo(r,o))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}})},function(t,e,i){var n=i(67);t.exports=i(7).extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){n.buildPath(t,e,!0)}})},function(t,e,i){var n=i(67);t.exports=i(7).extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){n.buildPath(t,e,!1)}})},function(t,e,i){var n=i(155);t.exports=i(7).extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,r=e.y,o=e.width,a=e.height;e.r?n.buildPath(t,e):t.rect(i,r,o,a),t.closePath()}})},function(t,e,i){t.exports=i(7).extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=2*Math.PI;t.moveTo(i+e.r,n),t.arc(i,n,e.r,0,r,!1),t.moveTo(i+e.r0,n),t.arc(i,n,e.r0,0,r,!0)}})},function(t,e,i){var n=i(10),r=i(7),o=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]];t.exports=r.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:n.browser.ie&&n.browser.version>=11?function(){var t,e=this.__clipPaths,i=this.style;if(e)for(var n=0;n<e.length;n++){var a=e[n]&&e[n].shape;if(a&&a.startAngle===a.endAngle){for(var s=0;s<o.length;s++)o[s][2]=i[o[s][0]],i[o[s][0]]=o[s][1];t=!0;break}}if(r.prototype.brush.apply(this,arguments),t)for(var s=0;s<o.length;s++)i[o[s][0]]=o[s][2]}:r.prototype.brush,buildPath:function(t,e){var i=e.cx,n=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=e.startAngle,s=e.endAngle,l=e.clockwise,h=Math.cos(a),u=Math.sin(a);t.moveTo(h*r+i,u*r+n),t.lineTo(h*o+i,u*o+n),t.arc(i,n,o,a,s,!l),t.lineTo(Math.cos(s)*r+i,Math.sin(s)*r+n),0!==r&&t.arc(i,n,r,s,a,l),t.closePath()}})},function(t,e,i){"use strict";var n=i(61),r=i(1),o=r.isString,a=r.isFunction,s=r.isObject,l=i(48),h=function(){this.animators=[]};h.prototype={constructor:h,animate:function(t,e){var i,o=!1,a=this,s=this.__zr;if(t){var h=t.split("."),u=a;o="shape"===h[0];for(var c=0,d=h.length;c<d;c++)u&&(u=u[h[c]]);u&&(i=u)}else i=a;if(!i)return void l('Property "'+t+'" is not existed in element '+a.id);var f=a.animators,p=new n(i,e);return p.during(function(t){a.dirty(o)}).done(function(){f.splice(r.indexOf(f,p),1)}),f.push(p),s&&s.animation.addAnimator(p),p},stopAnimation:function(t){for(var e=this.animators,i=e.length,n=0;n<i;n++)e[n].stop(t);return e.length=0,this},animateTo:function(t,e,i,n,r){function s(){h--,h||r&&r()}o(i)?(r=n,n=i,i=0):a(n)?(r=n,n="linear",i=0):a(i)?(r=i,i=0):a(e)?(r=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow("",this,t,e,i,n,r);var l=this.animators.slice(),h=l.length;h||r&&r();for(var u=0;u<l.length;u++)l[u].done(s).start(n)},_animateToShallow:function(t,e,i,n,o){var a={},l=0;for(var h in i)if(i.hasOwnProperty(h))if(null!=e[h])s(i[h])&&!r.isArrayLike(i[h])?this._animateToShallow(t?t+"."+h:h,e[h],i[h],n,o):(a[h]=i[h],l++);else if(null!=i[h])if(t){var u={};u[t]={},u[t][h]=i[h],this.attr(u)}else this.attr(h,i[h]);return l>0&&this.animate(t,!1).when(null==n?500:n,a).delay(o||0),this}},t.exports=h},function(t,e){function i(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}i.prototype={constructor:i,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(e,"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var i=t.offsetX,n=t.offsetY,r=i-this._x,o=n-this._y;this._x=i,this._y=n,e.drift(r,o,t),this.dispatchToElement(e,"drag",t.event);var a=this.findHover(i,n,e),s=this._dropTarget;this._dropTarget=a,e!==a&&(s&&a!==s&&this.dispatchToElement(s,"dragleave",t.event),a&&a!==s&&this.dispatchToElement(a,"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(e,"dragend",t.event),this._dropTarget&&this.dispatchToElement(this._dropTarget,"drop",t.event),this._draggingTarget=null,this._dropTarget=null}},t.exports=i},function(t,e,i){function n(t,e,i,n,r,o,a,s,l,h,u){var g=l*(p/180),y=f(g)*(t-i)/2+d(g)*(e-n)/2,x=-1*d(g)*(t-i)/2+f(g)*(e-n)/2,_=y*y/(a*a)+x*x/(s*s);_>1&&(a*=c(_),s*=c(_));var b=(r===o?-1:1)*c((a*a*(s*s)-a*a*(x*x)-s*s*(y*y))/(a*a*(x*x)+s*s*(y*y)))||0,w=b*a*x/s,M=b*-s*y/a,S=(t+i)/2+f(g)*w-d(g)*M,T=(e+n)/2+d(g)*w+f(g)*M,A=v([1,0],[(y-w)/a,(x-M)/s]),I=[(y-w)/a,(x-M)/s],C=[(-1*y-w)/a,(-1*x-M)/s],k=v(I,C);m(I,C)<=-1&&(k=p),m(I,C)>=1&&(k=0),0===o&&k>0&&(k-=2*p),1===o&&k<0&&(k+=2*p),u.addData(h,S,T,a,s,A,k,g,o)}function r(t){if(!t)return[];var e,i=t.replace(/-/g," -").replace(/ /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e<u.length;e++)i=i.replace(new RegExp(u[e],"g"),"|"+u[e]);var r,o=i.split("|"),a=0,l=0,h=new s,c=s.CMD;for(e=1;e<o.length;e++){var d,f=o[e],p=f.charAt(0),g=0,m=f.slice(1).replace(/e,-/g,"e-").split(",");m.length>0&&""===m[0]&&m.shift();for(var v=0;v<m.length;v++)m[v]=parseFloat(m[v]);for(;g<m.length&&!isNaN(m[g])&&!isNaN(m[0]);){var y,x,_,b,w,M,S,T=a,A=l;switch(p){case"l":a+=m[g++],l+=m[g++],d=c.L,h.addData(d,a,l);break;case"L":a=m[g++],l=m[g++],d=c.L,h.addData(d,a,l);break;case"m":a+=m[g++],l+=m[g++],d=c.M,h.addData(d,a,l),p="l";break;case"M":a=m[g++],l=m[g++],d=c.M,h.addData(d,a,l),p="L";break;case"h":a+=m[g++],d=c.L,h.addData(d,a,l);break;case"H":a=m[g++],d=c.L,h.addData(d,a,l);break;case"v":l+=m[g++],d=c.L,h.addData(d,a,l);break;case"V":l=m[g++],d=c.L,h.addData(d,a,l);break;case"C":d=c.C,h.addData(d,m[g++],m[g++],m[g++],m[g++],m[g++],m[g++]),a=m[g-2],l=m[g-1];break;case"c":d=c.C,h.addData(d,m[g++]+a,m[g++]+l,m[g++]+a,m[g++]+l,m[g++]+a,m[g++]+l),a+=m[g-2],l+=m[g-1];break;case"S":y=a,x=l;var I=h.len(),C=h.data;r===c.C&&(y+=a-C[I-4],x+=l-C[I-3]),d=c.C,T=m[g++],A=m[g++],a=m[g++],l=m[g++],h.addData(d,y,x,T,A,a,l);break;case"s":y=a,x=l;var I=h.len(),C=h.data;r===c.C&&(y+=a-C[I-4],x+=l-C[I-3]),d=c.C,T=a+m[g++],A=l+m[g++],a+=m[g++],l+=m[g++],h.addData(d,y,x,T,A,a,l);break;case"Q":T=m[g++],A=m[g++],a=m[g++],l=m[g++],d=c.Q,h.addData(d,T,A,a,l);break;case"q":T=m[g++]+a,A=m[g++]+l,a+=m[g++],l+=m[g++],d=c.Q,h.addData(d,T,A,a,l);break;case"T":y=a,x=l;var I=h.len(),C=h.data;r===c.Q&&(y+=a-C[I-4],x+=l-C[I-3]),a=m[g++],l=m[g++],d=c.Q,h.addData(d,y,x,a,l);break;case"t":y=a,x=l;var I=h.len(),C=h.data;r===c.Q&&(y+=a-C[I-4],x+=l-C[I-3]),a+=m[g++],l+=m[g++],d=c.Q,h.addData(d,y,x,a,l);break;case"A":_=m[g++],b=m[g++],w=m[g++],M=m[g++],S=m[g++],T=a,A=l,a=m[g++],l=m[g++],d=c.A,n(T,A,a,l,M,S,_,b,w,d,h);break;case"a":_=m[g++],b=m[g++],w=m[g++],M=m[g++],S=m[g++],T=a,A=l,a+=m[g++],l+=m[g++],d=c.A,n(T,A,a,l,M,S,_,b,w,d,h)}}"z"!==p&&"Z"!==p||(d=c.Z,h.addData(d)),r=d}return h.toStatic(),h}function o(t,e){var i,n=r(t);return e=e||{},e.buildPath=function(t){t.setData(n.data),i&&l(t,i);var e=t.getContext();e&&t.rebuildPath(e)},e.applyTransform=function(t){i||(i=h.create()),h.mul(i,t,i),this.dirty(!0)},e}var a=i(7),s=i(29),l=i(170),h=i(20),u=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"],c=Math.sqrt,d=Math.sin,f=Math.cos,p=Math.PI,g=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},m=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(g(t)*g(e))},v=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(m(t,e))};t.exports={createFromString:function(t,e){return new a(o(t,e))},extendFromString:function(t,e){return a.extend(o(t,e))},mergePath:function(t,e){for(var i=[],n=t.length,r=0;r<n;r++){var o=t[r];o.__dirty&&o.buildPath(o.path,o.shape,!0),i.push(o.path)}var s=new a(e);return s.buildPath=function(t){t.appendPath(i);var e=t.getContext();e&&t.rebuildPath(e)},s}}},function(t,e,i){function n(t,e){var i,n,o,u,c,d,f=t.data,p=r.M,g=r.C,m=r.L,v=r.R,y=r.A,x=r.Q;for(o=0,u=0;o<f.length;){switch(i=f[o++],u=o,n=0,i){case p:n=1;break;case m:n=1;break;case g:n=3;break;case x:n=2;break;case y:var _=e[4],b=e[5],w=l(e[0]*e[0]+e[1]*e[1]),M=l(e[2]*e[2]+e[3]*e[3]),S=h(-e[1]/M,e[0]/w);f[o++]+=_,f[o++]+=b,f[o++]*=w,f[o++]*=M,f[o++]+=S,f[o++]+=S,o+=2,u=o;break;case v:d[0]=f[o++],d[1]=f[o++],a(d,d,e),f[u++]=d[0],f[u++]=d[1],d[0]+=f[o++],d[1]+=f[o++],a(d,d,e),f[u++]=d[0],f[u++]=d[1]}for(c=0;c<n;c++){var d=s[c];d[0]=f[o++],d[1]=f[o++],a(d,d,e),f[u++]=d[0],f[u++]=d[1]}}}var r=i(29).CMD,o=i(5),a=o.applyTransform,s=[[],[],[]],l=Math.sqrt,h=Math.atan2;t.exports=n},function(t,e,i){if(!i(10).canvasSupported){var n,r="urn:schemas-microsoft-com:vml",o=window,a=o.document,s=!1;try{!a.namespaces.zrvml&&a.namespaces.add("zrvml",r),n=function(t){return a.createElement("<zrvml:"+t+' class="zrvml">')}}catch(l){n=function(t){return a.createElement("<"+t+' xmlns="'+r+'" class="zrvml">')}}var h=function(){if(!s){s=!0;var t=a.styleSheets;t.length<31?a.createStyleSheet().addRule(".zrvml","behavior:url(#default#VML)"):t[0].addRule(".zrvml","behavior:url(#default#VML)")}};t.exports={doc:a,initVML:h,createNode:n}}},,,,function(t,e){function i(){throw new Error("setTimeout has not been defined")}function n(){throw new Error("clearTimeout has not been defined")}function r(t){if(u===setTimeout)return setTimeout(t,0);if((u===i||!u)&&setTimeout)return u=setTimeout,setTimeout(t,0);try{return u(t,0)}catch(e){try{return u.call(null,t,0)}catch(e){return u.call(this,t,0)}}}function o(t){if(c===clearTimeout)return clearTimeout(t);if((c===n||!c)&&clearTimeout)return c=clearTimeout,clearTimeout(t);try{return c(t)}catch(e){try{return c.call(null,t)}catch(e){return c.call(this,t)}}}function a(){g&&f&&(g=!1,f.length?p=f.concat(p):m=-1,p.length&&s())}function s(){if(!g){var t=r(a);g=!0;for(var e=p.length;e;){for(f=p,p=[];++m<e;)f&&f[m].run();m=-1,e=p.length}f=null,g=!1,o(t)}}function l(t,e){this.fun=t,this.array=e}function h(){}var u,c,d=t.exports={};!function(){try{u="function"==typeof setTimeout?setTimeout:i}catch(t){u=i}try{c="function"==typeof clearTimeout?clearTimeout:n}catch(t){c=n}}();var f,p=[],g=!1,m=-1;d.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)e[i-1]=arguments[i];p.push(new l(t,e)),1!==p.length||g||r(s)},l.prototype.run=function(){this.fun.apply(null,this.array)},d.title="browser",d.browser=!0,d.env={},d.argv=[],d.version="",d.versions={},d.on=h,d.addListener=h,d.once=h,d.off=h,d.removeListener=h,d.removeAllListeners=h,d.emit=h,d.binding=function(t){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(t){throw new Error("process.chdir is not supported")},d.umask=function(){return 0}},function(t,e,i){function n(){this.group=new r.Group,this._symbolEl=new a({})}var r=i(3),o=i(24),a=r.extendShape({shape:{points:null,sizes:null},symbolProxy:null,buildPath:function(t,e){for(var i=e.points,n=e.sizes,r=this.symbolProxy,o=r.shape,a=0;a<i.length;a++){var s=i[a],l=n[a];l[0]<4?t.rect(s[0]-l[0]/2,s[1]-l[1]/2,l[0],l[1]):(o.x=s[0]-l[0]/2,o.y=s[1]-l[1]/2,o.width=l[0],o.height=l[1],r.buildPath(t,o,!0))}},findDataIndex:function(t,e){for(var i=this.shape,n=i.points,r=i.sizes,o=n.length-1;o>=0;o--){var a=n[o],s=r[o],l=a[0]-s[0]/2,h=a[1]-s[1]/2;if(t>=l&&e>=h&&t<=l+s[0]&&e<=h+s[1])return o}return-1}}),s=n.prototype;s.updateData=function(t){this.group.removeAll();var e=this._symbolEl,i=t.hostModel;e.setShape({points:t.mapArray(t.getItemLayout),sizes:t.mapArray(function(e){var i=t.getItemVisual(e,"symbolSize");return i instanceof Array||(i=[i,i]),i})}),e.symbolProxy=o.createSymbol(t.getVisual("symbol"),0,0,0,0),e.setColor=e.symbolProxy.setColor,e.useStyle(i.getModel("itemStyle.normal").getItemStyle(["color"]));var n=t.getVisual("color");n&&e.setColor(n),e.seriesIndex=i.seriesIndex,e.on("mousemove",function(t){e.dataIndex=null;var i=e.findDataIndex(t.offsetX,t.offsetY);i>0&&(e.dataIndex=i)}),this.group.add(e)},s.updateLayout=function(t){var e=t.getData();this._symbolEl.setShape({points:e.mapArray(e.getItemLayout)})},s.remove=function(){this.group.removeAll()},t.exports=n},function(t,e,i){function n(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}var r=i(3),o=i(5),a=r.Line.prototype,s=r.BezierCurve.prototype;t.exports=r.extendShape({type:"ec-line",style:{stroke:"#000",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(t,e){(n(e)?a:s).buildPath(t,e)},pointAt:function(t){return n(this.shape)?a.pointAt.call(this,t):s.pointAt.call(this,t)},tangentAt:function(t){var e=this.shape,i=n(e)?[e.x2-e.x1,e.y2-e.y1]:s.tangentAt.call(this,t);return o.normalize(i,i)}})},function(t,e,i){var n=i(1),r=i(2);i(179),i(180),r.registerVisual(n.curry(i(45),"scatter","circle",null)),r.registerLayout(n.curry(i(56),"scatter")),i(31)},function(t,e,i){"use strict";var n=i(35),r=i(16);t.exports=r.extend({type:"series.scatter",dependencies:["grid","polar"],getInitialData:function(t,e){var i=n(t.data,this,e);return i},brushSelector:"point",defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{normal:{opacity:.8}}}})},function(t,e,i){var n=i(39),r=i(176);i(2).extendChartView({type:"scatter",init:function(){this._normalSymbolDraw=new n,this._largeSymbolDraw=new r},render:function(t,e,i){var n=t.getData(),r=this._largeSymbolDraw,o=this._normalSymbolDraw,a=this.group,s=t.get("large")&&n.count()>t.get("largeThreshold")?r:o;this._symbolDraw=s,s.updateData(n),a.add(s.group),a.remove(s===r?o.group:r.group)},updateLayout:function(t){this._symbolDraw.updateLayout(t)},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e,!0)},dispose:function(){}})},function(t,e,i){i(114),i(40),i(41),i(187),i(188),i(183),i(184),i(112),i(111)},function(t,e,i){function n(t,e){var i=[1/0,-(1/0)];return h(e,function(e){var n=e.getData();n&&h(e.coordDimToDataDim(t),function(t){var e=n.getDataExtent(t);e[0]<i[0]&&(i[0]=e[0]),e[1]>i[1]&&(i[1]=e[1])})},this),i[1]<i[0]&&(i=[NaN,NaN]),i}function r(t,e){var i=e.getMin(!0);null!=i&&"dataMin"!==i&&(t[0]=i);var n=e.getMax(!0);return null!=n&&"dataMax"!==n&&(t[1]=n),e.get("scale",!0)||(t[0]>0&&(t[0]=0),t[1]<0&&(t[1]=0)),t}function o(t,e){var i=t.getAxisModel(),n=t._percentWindow,r=t._valueWindow;if(n){var o=s.getPixelPrecision(r,[0,500]),a=e||0===n[0]&&100===n[1];i.setRange(a?null:+r[0].toFixed(o),a?null:+r[1].toFixed(o))}}var a=i(1),s=i(4),l=i(68),h=a.each,u=s.asc,c=function(t,e,i,n){this._dimName=t,this._axisIndex=e,this._valueWindow,this._percentWindow,this._dataExtent,this.ecModel=n,this._dataZoomModel=i};c.prototype={constructor:c,hostedBy:function(t){return this._dataZoomModel===t},getDataValueWindow:function(){return this._valueWindow.slice()},getDataPercentWindow:function(){return this._percentWindow.slice()},getTargetSeriesModels:function(){var t=[],e=this.ecModel;return e.eachSeries(function(i){if(l.isCoordSupported(i.get("coordinateSystem"))){var n=this._dimName,r=e.queryComponents({mainType:n+"Axis",index:i.get(n+"AxisIndex"),id:i.get(n+"AxisId")})[0];this._axisIndex===(r&&r.componentIndex)&&t.push(i)}},this),t},getAxisModel:function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},getOtherAxisModel:function(){var t,e,i=this._dimName,n=this.ecModel,r=this.getAxisModel(),o="x"===i||"y"===i;o?(e="gridIndex",t="x"===i?"y":"x"):(e="polarIndex",t="angle"===i?"radius":"angle");var a;return n.eachComponent(t+"Axis",function(t){(t.get(e)||0)===(r.get(e)||0)&&(a=t)}),a},calculateDataWindow:function(t){var e=this._dataExtent,i=this.getAxisModel(),n=i.axis.scale,o=[0,100],a=[t.start,t.end],l=[];return e=e.slice(),r(e,i),h(["startValue","endValue"],function(e){l.push(null!=t[e]?n.parse(t[e]):null)}),h([0,1],function(t){var i=l[t],r=a[t];null!=r||null==i?(null==r&&(r=o[t]),i=n.parse(s.linearMap(r,o,e,!0))):r=s.linearMap(i,e,o,!0),l[t]=i,a[t]=r}),{valueWindow:u(l),percentWindow:u(a)}},reset:function(t){if(t===this._dataZoomModel){this._dataExtent=n(this._dimName,this.getTargetSeriesModels());var e=this.calculateDataWindow(t.option);this._valueWindow=e.valueWindow,this._percentWindow=e.percentWindow,o(this)}},restore:function(t){t===this._dataZoomModel&&(this._valueWindow=this._percentWindow=null,o(this,!0))},filterData:function(t){function e(t){return t>=o[0]&&t<=o[1]}if(t===this._dataZoomModel){var i=this._dimName,n=this.getTargetSeriesModels(),r=t.get("filterMode"),o=this._valueWindow,a=this.getOtherAxisModel();t.get("$fromToolbox")&&a&&"category"===a.get("type")&&(r="empty"),h(n,function(t){var n=t.getData();n&&h(t.coordDimToDataDim(i),function(i){"empty"===r?t.setData(n.map(i,function(t){return e(t)?t:NaN})):n.filterSelf(i,e)})})}}},t.exports=c},function(t,e,i){t.exports=i(40).extend({type:"dataZoom.inside",defaultOption:{disabled:!1,zoomLock:!1}})},function(t,e,i){function n(t){var e=[0,100];return!(t[0]<=e[1])&&(t[0]=e[1]),!(t[1]<=e[1])&&(t[1]=e[1]),!(t[0]>=e[0])&&(t[0]=e[0]),!(t[1]>=e[0])&&(t[1]=e[0]),
+t}var r=i(41),o=i(1),a=i(85),s=i(189),l=o.bind,h=r.extend({type:"dataZoom.inside",init:function(t,e){this._range},render:function(t,e,i,n){h.superApply(this,"render",arguments),s.shouldRecordRange(n,t.id)&&(this._range=t.getPercentRange()),o.each(this.getTargetCoordInfo(),function(e,n){var r=o.map(e,function(t){return s.generateCoordId(t.model)});o.each(e,function(e){var o=e.model;s.register(i,{coordId:s.generateCoordId(o),allCoordIds:r,containsPoint:function(t,e){return o.coordinateSystem.containPoint([t,e])},dataZoomId:t.id,throttleRate:t.get("throttle",!0),panGetRange:l(this._onPan,this,e,n),zoomGetRange:l(this._onZoom,this,e,n)})},this)},this)},dispose:function(){s.unregister(this.api,this.dataZoomModel.id),h.superApply(this,"dispose",arguments),this._range=null},_onPan:function(t,e,i,n,r,o,s,l,h){if(this.dataZoomModel.option.disabled)return this._range;var c=this._range.slice(),d=t.axisModels[0];if(d){var f=u[e]([o,s],[l,h],d,i,t),p=f.signal*(c[1]-c[0])*f.pixel/f.pixelLength;return a(p,c,[0,100],"rigid"),this._range=c}},_onZoom:function(t,e,i,r,o,a){var s=this.dataZoomModel.option;if(s.disabled||s.zoomLock)return this._range;var l=this._range.slice(),h=t.axisModels[0];if(h){var c=u[e](null,[o,a],h,i,t),d=(c.pixel-c.pixelStart)/c.pixelLength*(l[1]-l[0])+l[0];return r=Math.max(1/r,0),l[0]=(l[0]-d)*r+d,l[1]=(l[1]-d)*r+d,this._range=n(l)}}}),u={grid:function(t,e,i,n,r){var o=i.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,i,n,r){var o=i.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),h=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===i.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=h[1]-h[0],a.pixelStart=h[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,i,n,r){var o=i.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};t.exports=h},function(t,e,i){var n=i(40);t.exports=n.extend({type:"dataZoom.select"})},function(t,e,i){t.exports=i(41).extend({type:"dataZoom.select"})},function(t,e,i){var n=i(40),r=n.extend({type:"dataZoom.slider",layoutMode:"box",defaultOption:{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#2f4554",width:.5,opacity:.3},areaStyle:{color:"rgba(47,69,84,0.3)",opacity:.3}},borderColor:"#ddd",fillerColor:"rgba(167,183,204,0.4)",handleIcon:"M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z",handleSize:"100%",handleStyle:{color:"#a7b7cc"},labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#333"}}});t.exports=r},function(t,e,i){function n(t){var e={x:"y",y:"x",radius:"angle",angle:"radius"};return e[t]}var r=i(1),o=i(3),a=i(47),s=i(41),l=o.Rect,h=i(4),u=h.linearMap,c=i(12),d=i(85),f=h.asc,p=r.bind,g=r.each,m=7,v=1,y=30,x="horizontal",_="vertical",b=5,w=["line","bar","candlestick","scatter"],M=s.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,i,n){return M.superApply(this,"render",arguments),a.createOrUpdate(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),this.dataZoomModel.get("show")===!1?void this.group.removeAll():(n&&"dataZoom"===n.type&&n.from===this.uid||this._buildView(),void this._updateView())},remove:function(){M.superApply(this,"remove",arguments),a.clear(this,"_dispatchZoomAction")},dispose:function(){M.superApply(this,"dispose",arguments),a.clear(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new o.Group;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,i=this._findCoordRect(),n={width:e.getWidth(),height:e.getHeight()},o=this._orient===x?{right:n.width-i.x-i.width,top:n.height-y-m,width:i.width,height:y}:{right:m,top:i.y,width:y,height:i.height},a=c.getLayoutParams(t.option);r.each(["right","top","width","height"],function(t){"ph"===a[t]&&(a[t]=o[t])});var s=c.getLayoutRect(a,n,t.padding);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===_&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,i=this._orient,n=this.dataZoomModel.getFirstTargetAxisModel(),r=n&&n.get("inverse"),o=this._displayables.barGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(i!==x||r?i===x&&r?{scale:a?[-1,1]:[-1,-1]}:i!==_||r?{scale:a?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:a?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:a?[1,1]:[1,-1]});var s=t.getBoundingRect([o]);t.attr("position",[e.x-s.x,e.y-s.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var t=this.dataZoomModel,e=this._size;this._displayables.barGroup.add(new l({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,i=t.series,n=i.getRawData(),a=i.getShadowDim?i.getShadowDim():t.otherDim;if(null!=a){var s=n.getDataExtent(a),l=.3*(s[1]-s[0]);s=[s[0]-l,s[1]+l];var h,c=[0,e[1]],d=[0,e[0]],f=[[e[0],0],[0,0]],p=[],g=d[1]/(n.count()-1),m=0,v=Math.round(n.count()/e[0]);n.each([a],function(t,e){if(v>0&&e%v)return void(m+=g);var i=null==t||isNaN(t)||""===t,n=i?0:u(t,s,c,!0);i&&!h&&e?(f.push([f[f.length-1][0],0]),p.push([p[p.length-1][0],0])):!i&&h&&(f.push([m,0]),p.push([m,0])),f.push([m,n]),p.push([m,n]),m+=g,h=i});var y=this.dataZoomModel;this._displayables.barGroup.add(new o.Polygon({shape:{points:f},style:r.defaults({fill:y.get("dataBackgroundColor")},y.getModel("dataBackground.areaStyle").getAreaStyle()),silent:!0,z2:-20})),this._displayables.barGroup.add(new o.Polyline({shape:{points:p},style:y.getModel("dataBackground.lineStyle").getLineStyle(),silent:!0,z2:-19}))}}},_prepareDataShadowInfo:function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(e!==!1){var i,o=this.ecModel;return t.eachTargetAxis(function(a,s){var l=t.getAxisProxy(a.name,s).getTargetSeriesModels();r.each(l,function(t){if(!(i||e!==!0&&r.indexOf(w,t.get("type"))<0)){var l,h=o.getComponent(a.axis,s).axis,u=n(a.name),c=t.coordinateSystem;null!=u&&c.getOtherAxis&&(l=c.getOtherAxis(h).inverse),i={thisAxis:h,series:t,thisDim:a.name,otherDim:u,otherAxisInverse:l}}},this)},this),i}},_renderHandle:function(){var t=this._displayables,e=t.handles=[],i=t.handleLabels=[],n=this._displayables.barGroup,r=this._size,a=this.dataZoomModel;n.add(t.filler=new l({draggable:!0,cursor:"move",drift:p(this._onDragMove,this,"all"),ondragstart:p(this._showDataInfo,this,!0),ondragend:p(this._onDragEnd,this),onmouseover:p(this._showDataInfo,this,!0),onmouseout:p(this._showDataInfo,this,!1),style:{fill:a.get("fillerColor"),textPosition:"inside"}})),n.add(new l(o.subPixelOptimizeRect({silent:!0,shape:{x:0,y:0,width:r[0],height:r[1]},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:v,fill:"rgba(0,0,0,0)"}})));var s=a.get("handleIcon");g([0,1],function(t){var r=o.makePath(s,{style:{strokeNoScale:!0},rectHover:!0,cursor:"vertical"===this._orient?"ns-resize":"ew-resize",draggable:!0,drift:p(this._onDragMove,this,t),ondragend:p(this._onDragEnd,this),onmouseover:p(this._showDataInfo,this,!0),onmouseout:p(this._showDataInfo,this,!1)},{x:-.5,y:0,width:1,height:1},"center"),l=r.getBoundingRect();this._handleHeight=h.parsePercent(a.get("handleSize"),this._size[1]),this._handleWidth=l.width/l.height*this._handleHeight,r.setStyle(a.getModel("handleStyle").getItemStyle());var u=a.get("handleColor");null!=u&&(r.style.fill=u),n.add(e[t]=r);var c=a.textStyleModel;this.group.add(i[t]=new o.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textAlign:"center",fill:c.getTextColor(),textFont:c.getFont()},z2:10}))},this)},_resetInterval:function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[u(t[0],[0,100],e,!0),u(t[1],[0,100],e,!0)]},_updateInterval:function(t,e){var i=this._handleEnds,n=this._getViewExtent();d(e,i,n,"all"===t||this.dataZoomModel.get("zoomLock")?"rigid":"cross",t),this._range=f([u(i[0],n,[0,100],!0),u(i[1],n,[0,100],!0)])},_updateView:function(t){var e=this._displayables,i=this._handleEnds,n=f(i.slice()),r=this._size;g([0,1],function(t){var n=e.handles[t],o=this._handleHeight;n.attr({scale:[o,o],position:[i[t],r[1]/2-o/2]})},this),e.filler.setShape({x:n[0],y:0,width:n[1]-n[0],height:r[1]}),this._updateDataInfo(t)},_updateDataInfo:function(t){function e(t){var e=o.getTransform(n.handles[t].parent,this.group),i=o.transformDirection(0===t?"right":"left",e),l=this._handleWidth/2+b,h=o.applyTransform([d[t]+(0===t?-l:l),this._size[1]/2],e);r[t].setStyle({x:h[0],y:h[1],textVerticalAlign:a===x?"middle":i,textAlign:a===x?i:"center",text:s[t]})}var i=this.dataZoomModel,n=this._displayables,r=n.handleLabels,a=this._orient,s=["",""];if(i.get("showDetail")){var l=i.findRepresentativeAxisProxy();if(l){var h=l.getAxisModel().axis,u=this._range,c=t?l.calculateDataWindow({start:u[0],end:u[1]}).valueWindow:l.getDataValueWindow();s=[this._formatLabel(c[0],h),this._formatLabel(c[1],h)]}}var d=f(this._handleEnds.slice());e.call(this,0),e.call(this,1)},_formatLabel:function(t,e){var i=this.dataZoomModel,n=i.get("labelFormatter"),o=i.get("labelPrecision");null!=o&&"auto"!==o||(o=e.getPixelPrecision());var a=null==t||isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel(Math.round(t)):t.toFixed(Math.min(o,20));return r.isFunction(n)?n(t,a):r.isString(n)?n.replace("{value}",a):a},_showDataInfo:function(t){t=this._dragging||t;var e=this._displayables.handleLabels;e[0].attr("invisible",!t),e[1].attr("invisible",!t)},_onDragMove:function(t,e,i){this._dragging=!0;var n=this._applyBarTransform([e,i],!0);this._updateInterval(t,n[0]);var r=this.dataZoomModel.get("realtime");this._updateView(!r),r&&r&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1),this._dispatchZoomAction()},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_applyBarTransform:function(t,e){var i=this._displayables.barGroup.getLocalTransform();return o.applyTransform(t,i,e)},_findCoordRect:function(){var t;if(g(this.getTargetCoordInfo(),function(e){if(!t&&e.length){var i=e[0].model.coordinateSystem;t=i.getRect&&i.getRect()}}),!t){var e=this.api.getWidth(),i=this.api.getHeight();t={x:.2*e,y:.2*i,width:.6*e,height:.6*i}}return t}});t.exports=M},function(t,e,i){function n(t){var e=t.getZr();return e[p]||(e[p]={})}function r(t,e,i){var n=new c(t.getZr());return n.enable(),n.on("pan",f(a,i)),n.on("zoom",f(s,i)),n}function o(t){u.each(t,function(e,i){e.count||(e.controller.dispose(),delete t[i])})}function a(t,e,i,n,r,o,a){l(t,function(s){return s.panGetRange(t.controller,e,i,n,r,o,a)})}function s(t,e,i,n){l(t,function(r){return r.zoomGetRange(t.controller,e,i,n)})}function l(t,e){var i=[];u.each(t.dataZoomInfos,function(t){var n=e(t);n&&i.push({dataZoomId:t.dataZoomId,start:n[0],end:n[1]})}),t.dispatchAction(i)}function h(t,e){t.dispatchAction({type:"dataZoom",batch:e})}var u=i(1),c=i(84),d=i(47),f=u.curry,p="\0_ec_dataZoom_roams",g={register:function(t,e){var i=n(t),a=e.dataZoomId,s=e.coordId;u.each(i,function(t,i){var n=t.dataZoomInfos;n[a]&&u.indexOf(e.allCoordIds,s)<0&&(delete n[a],t.count--)}),o(i);var l=i[s];l||(l=i[s]={coordId:s,dataZoomInfos:{},count:0},l.controller=r(t,e,l),l.dispatchAction=u.curry(h,t)),l.controller.setContainsPoint(e.containsPoint),d.createOrUpdate(l,"dispatchAction",e.throttleRate,"fixRate"),!l.dataZoomInfos[a]&&l.count++,l.dataZoomInfos[a]=e},unregister:function(t,e){var i=n(t);u.each(i,function(t){t.controller.dispose();var i=t.dataZoomInfos;i[e]&&(delete i[e],t.count--)}),o(i)},shouldRecordRange:function(t,e){if(t&&"dataZoom"===t.type&&t.batch)for(var i=0,n=t.batch.length;i<n;i++)if(t.batch[i].dataZoomId===e)return!1;return!0},generateCoordId:function(t){return t.type+"\0_"+t.id}};t.exports=g},function(t,e,i){i(114),i(40),i(41),i(185),i(186),i(112),i(111)},function(t,e,i){function n(t,e,i,n){var r=i.type,o=u[r.charAt(0).toUpperCase()+r.slice(1)],a=new o(i);e.add(a),n[t]=a,a.__ecGraphicId=t}function r(t,e){var i=t&&t.parent;i&&("group"===t.type&&t.traverse(function(t){r(t,e)}),delete e[t.__ecGraphicId],i.remove(t))}function o(t){return t=l.extend({},t),l.each(["id","parentId","$action","hv","bounding"].concat(c.LOCATION_PARAMS),function(e){delete t[e]}),t}function a(t,e){var i;return l.each(e,function(e){null!=t[e]&&"auto"!==t[e]&&(i=!0)}),i}var s=i(2),l=i(1),h=i(6),u=i(3),c=i(12);s.registerPreprocessor(function(t){var e=t&&t.graphic;l.isArray(e)?e[0]&&e[0].elements?t.graphic=[t.graphic[0]]:t.graphic=[{elements:e}]:e&&!e.elements&&(t.graphic=[{elements:[e]}])});var d=s.extendComponentModel({type:"graphic",defaultOption:{elements:[],parentId:null},_elOptionsToUpdate:null,mergeOption:function(t){var e=this.option.elements;this.option.elements=null,d.superApply(this,"mergeOption",arguments),this.option.elements=e},optionUpdated:function(t,e){var i=this.option,n=(e?i:t).elements,r=i.elements=e?[]:i.elements,o=[];this._flatten(n,o);var s=h.mappingToExists(r,o);h.makeIdAndName(s);var u=this._elOptionsToUpdate=[];l.each(s,function(t,e){var i=t.exist,n=t.option;if(n){n.id=t.keyInfo.id;var o=n.parentId,s=n.parentOption,h=i&&i.parentId;!n.type&&i&&(n.type=i.type),n.parentId=o?o:s?s.id:h?h:null,n.parentOption=null,u.push(n);var d=l.extend({},n),f=n.$action;if(f&&"merge"!==f)"replace"===f?r[e]=d:"remove"===f&&i&&(r[e]=null);else if(i){l.merge(i,d,!0),c.mergeLayoutParam(i,d,{ignoreSize:!0}),c.copyLayoutParams(n,i)}else r[e]=d;r[e]&&(r[e].hv=n.hv=[a(n,["left","right"]),a(n,["top","bottom"])],"group"===r[e].type&&(null==r[e].width&&(r[e].width=n.width=0),null==r[e].height&&(r[e].height=n.height=0)))}},this);for(var d=r.length-1;d>=0;d--)null==r[d]?r.splice(d,1):delete r[d].$action},_flatten:function(t,e,i){l.each(t,function(t){if(t){i&&(t.parentOption=i),e.push(t);var n=t.children;"group"===t.type&&n&&this._flatten(n,e,t),delete t.children}},this)},useElOptionsToUpdate:function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t}});s.extendComponentView({type:"graphic",init:function(t,e){this._elMap={},this._lastGraphicModel},render:function(t,e,i){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t,i),this._relocate(t,i)},_updateElements:function(t,e){var i=t.useElOptionsToUpdate();if(i){var a=this._elMap,s=this.group;l.each(i,function(t){var e=t.$action,i=t.id,h=a[i],u=t.parentId,c=null!=u?a[u]:s;t.hv&&t.hv[1]&&"text"===t.type&&(t.style=l.defaults({textBaseline:"middle"},t.style),t.style.textVerticalAlign=null);var d=o(t);e&&"merge"!==e?"replace"===e?(r(h,a),n(i,c,d,a)):"remove"===e&&r(h,a):h?h.attr(d):n(i,c,d,a),a[i]&&(a[i].__ecGraphicWidth=t.width,a[i].__ecGraphicHeight=t.height)})}},_relocate:function(t,e){for(var i=t.option.elements,n=this.group,r=this._elMap,o=i.length-1;o>=0;o--){var a=i[o],s=r[a.id];if(s){var l=s.parent,h=l===n?{width:e.getWidth(),height:e.getHeight()}:{width:l.__ecGraphicWidth||0,height:l.__ecGraphicHeight||0};c.positionElement(s,a,h,null,{hv:a.hv,boundingMode:a.bounding})}}},_clear:function(){var t=this._elMap;l.each(t,function(e){r(e,t)}),this._elMap={}},dispose:function(){this._clear()}})},function(t,e,i){i(193),i(195),i(194);var n=i(2);n.registerProcessor(i(196))},function(t,e,i){"use strict";var n=i(1),r=i(11),o=i(2).extendComponentModel({type:"legend",dependencies:["series"],layoutMode:{type:"box",ignoreSize:!0},init:function(t,e,i){this.mergeDefaultAndTheme(t,i),t.selected=t.selected||{}},mergeOption:function(t){o.superCall(this,"mergeOption",t)},optionUpdated:function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&"single"===this.get("selectedMode")){for(var e=!1,i=0;i<t.length;i++){var n=t[i].get("name");if(this.isSelected(n)){this.select(n),e=!0;break}}!e&&this.select(t[0].get("name"))}},_updateData:function(t){var e=n.map(this.get("data")||[],function(t){return"string"!=typeof t&&"number"!=typeof t||(t={name:t}),new r(t,this,this.ecModel)},this);this._data=e;var i=n.map(t.getSeries(),function(t){return t.name});t.eachSeries(function(t){if(t.legendDataProvider){var e=t.legendDataProvider();i=i.concat(e.mapArray(e.getName))}}),this._availableNames=i},getData:function(){return this._data},select:function(t){var e=this.option.selected,i=this.get("selectedMode");if("single"===i){var r=this._data;n.each(r,function(t){e[t.get("name")]=!1})}e[t]=!0},unSelect:function(t){"single"!==this.get("selectedMode")&&(this.option.selected[t]=!1)},toggleSelected:function(t){var e=this.option.selected;e.hasOwnProperty(t)||(e[t]=!0),this[e[t]?"unSelect":"select"](t)},isSelected:function(t){var e=this.option.selected;return!(e.hasOwnProperty(t)&&!e[t])&&n.indexOf(this._availableNames,t)>=0},defaultOption:{zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:"top",align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,inactiveColor:"#ccc",textStyle:{color:"#333"},selectedMode:!0,tooltip:{show:!1}}});t.exports=o},function(t,e,i){function n(t,e){e.dispatchAction({type:"legendToggleSelect",name:t})}function r(t,e,i){var n=i.getZr().storage.getDisplayList()[0];n&&n.useHoverLayer||t.get("legendHoverLink")&&i.dispatchAction({type:"highlight",seriesName:t.name,name:e})}function o(t,e,i){var n=i.getZr().storage.getDisplayList()[0];n&&n.useHoverLayer||t.get("legendHoverLink")&&i.dispatchAction({type:"downplay",seriesName:t.name,name:e})}var a=i(1),s=i(24),l=i(3),h=i(118),u=a.curry;t.exports=i(2).extendComponentView({type:"legend",init:function(){this._symbolTypeStore={}},render:function(t,e,i){var s=this.group;if(s.removeAll(),t.get("show")){var c=t.get("selectedMode"),d=t.get("align");"auto"===d&&(d="right"===t.get("left")&&"vertical"===t.get("orient")?"right":"left");var f={};a.each(t.getData(),function(a){var h=a.get("name");if(""===h||"\n"===h)return void s.add(new l.Group({newline:!0}));var p=e.getSeriesByName(h)[0];if(!f[h])if(p){var g=p.getData(),m=g.getVisual("color");"function"==typeof m&&(m=m(p.getDataParams(0)));var v=g.getVisual("legendSymbol")||"roundRect",y=g.getVisual("symbol"),x=this._createItem(h,a,t,v,y,d,m,c);x.on("click",u(n,h,i)).on("mouseover",u(r,p,null,i)).on("mouseout",u(o,p,null,i)),f[h]=!0}else e.eachRawSeries(function(e){if(!f[h]&&e.legendDataProvider){var s=e.legendDataProvider(),l=s.indexOfName(h);if(l<0)return;var p=s.getItemVisual(l,"color"),g="roundRect",m=this._createItem(h,a,t,g,null,d,p,c);m.on("click",u(n,h,i)).on("mouseover",u(r,e,h,i)).on("mouseout",u(o,e,h,i)),f[h]=!0}},this)},this),h.layout(s,t,i),h.addBackground(s,t)}},_createItem:function(t,e,i,n,r,o,h,u){var c=i.get("itemWidth"),d=i.get("itemHeight"),f=i.get("inactiveColor"),p=i.isSelected(t),g=new l.Group,m=e.getModel("textStyle"),v=e.get("icon"),y=e.getModel("tooltip"),x=y.parentModel;if(n=v||n,g.add(s.createSymbol(n,0,0,c,d,p?h:f)),!v&&r&&(r!==n||"none"==r)){var _=.8*d;"none"===r&&(r="circle"),g.add(s.createSymbol(r,(c-_)/2,(d-_)/2,_,_,p?h:f))}var b="left"===o?c+5:-5,w=o,M=i.get("formatter"),S=t;"string"==typeof M&&M?S=M.replace("{name}",null!=t?t:""):"function"==typeof M&&(S=M(t));var T=new l.Text({style:{text:S,x:b,y:d/2,fill:p?m.getTextColor():f,textFont:m.getFont(),textAlign:w,textVerticalAlign:"middle"}});g.add(T);var A=new l.Rect({shape:g.getBoundingRect(),invisible:!0,tooltip:y.get("show")?a.extend({content:t,formatter:x.get("formatter",!0)||function(){return t},formatterParams:{componentType:"legend",legendIndex:i.componentIndex,name:t,$vars:["name"]}},y.option):null});return g.add(A),g.eachChild(function(t){t.silent=!0}),A.silent=!u,this.group.add(g),l.setHoverStyle(g),g}})},function(t,e,i){function n(t,e,i){var n,r={},a="toggleSelected"===t;return i.eachComponent("legend",function(i){a&&null!=n?i[n?"select":"unSelect"](e.name):(i[t](e.name),n=i.isSelected(e.name));var s=i.getData();o.each(s,function(t){var e=t.get("name");if("\n"!==e&&""!==e){var n=i.isSelected(e);e in r?r[e]=r[e]&&n:r[e]=n}})}),{name:e.name,selected:r}}var r=i(2),o=i(1);r.registerAction("legendToggleSelect","legendselectchanged",o.curry(n,"toggleSelected")),r.registerAction("legendSelect","legendselected",o.curry(n,"select")),r.registerAction("legendUnSelect","legendunselected",o.curry(n,"unSelect"))},function(t,e){t.exports=function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries(function(t){for(var i=0;i<e.length;i++)if(!e[i].isSelected(t.name))return!1;return!0})}},function(t,e,i){i(200),i(201),i(2).registerPreprocessor(function(t){t.markArea=t.markArea||{}})},function(t,e,i){i(202),i(203),i(2).registerPreprocessor(function(t){t.markLine=t.markLine||{}})},function(t,e,i){i(204),i(205),i(2).registerPreprocessor(function(t){t.markPoint=t.markPoint||{}})},function(t,e,i){t.exports=i(70).extend({type:"markArea",defaultOption:{zlevel:0,z:1,tooltip:{trigger:"item"},animation:!1,label:{normal:{show:!0,position:"top"},emphasis:{show:!0,position:"top"}},itemStyle:{normal:{borderWidth:0}}}})},function(t,e,i){function n(t){return!isNaN(t)&&!isFinite(t)}function r(t,e,i,r){var o=1-t;return n(e[o])&&n(i[o])}function o(t,e){var i=e.coord[0],n=e.coord[1];return!("cartesian2d"!==t.type||!i||!n||!r(1,i,n,t)&&!r(0,i,n,t))||(f.dataFilter(t,{coord:i,x:e.x0,y:e.y0})||f.dataFilter(t,{coord:n,x:e.x1,y:e.y1}))}function a(t,e,i,r,o){var a,s=r.coordinateSystem,l=t.getItemModel(e),h=u.parsePercent(l.get(i[0]),o.getWidth()),c=u.parsePercent(l.get(i[1]),o.getHeight());if(isNaN(h)||isNaN(c)){if(r.getMarkerPosition)a=r.getMarkerPosition(t.getValues(i,e));else{var d=t.get(i[0],e),f=t.get(i[1],e);a=s.dataToPoint([d,f],!0)}if("cartesian2d"===s.type){var p=s.getAxis("x"),g=s.getAxis("y"),d=t.get(i[0],e),f=t.get(i[1],e);n(d)?a[0]=p.toGlobalCoord(p.getExtent()["x0"===i[0]?0:1]):n(f)&&(a[1]=g.toGlobalCoord(g.getExtent()["y0"===i[1]?0:1]))}isNaN(h)||(a[0]=h),isNaN(c)||(a[1]=c)}else a=[h,c];return a}function s(t,e,i){var n,r,a=["x0","y0","x1","y1"];t?(n=l.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}),r=new h(l.map(a,function(t,e){return{name:t,type:n[e%2].type}}),i)):(n=[{name:"value",type:"float"}],r=new h(n,i));var s=l.map(i.get("data"),l.curry(p,e,t,i));t&&(s=l.filter(s,l.curry(o,t)));var u=t?function(t,e,i,n){return t.coord[Math.floor(n/2)][n%2]}:function(t){return t.value};return r.initData(s,null,u),r.hasItemOption=!0,r}var l=i(1),h=i(14),u=i(4),c=i(3),d=i(19),f=i(72),p=function(t,e,i,n){var r=f.dataTransform(t,n[0]),o=f.dataTransform(t,n[1]),a=l.retrieve,s=r.coord,h=o.coord;s[0]=a(s[0],-(1/0)),s[1]=a(s[1],-(1/0)),h[0]=a(h[0],1/0),h[1]=a(h[1],1/0);var u=l.mergeAll([{},r,o]);return u.coord=[r.coord,o.coord],u.x0=r.x,u.y0=r.y,u.x1=o.x,u.y1=o.y,u},g=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]];i(71).extend({type:"markArea",updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markAreaModel;if(e){var n=e.getData();n.each(function(e){var r=l.map(g,function(r){return a(n,e,r,t,i)});n.setItemLayout(e,r);var o=n.getItemGraphicEl(e);o.setShape("points",r)})}},this)},renderSeries:function(t,e,i,n){var r=t.coordinateSystem,o=t.name,h=t.getData(),u=this.markerGroupMap,f=u[o];f||(f=u[o]={group:new c.Group}),this.group.add(f.group),f.__keep=!0;var p=s(r,t,e);e.setData(p),p.each(function(e){p.setItemLayout(e,l.map(g,function(i){return a(p,e,i,t,n)})),p.setItemVisual(e,{color:h.getVisual("color")})}),p.diff(f.__data).add(function(t){var e=new c.Polygon({shape:{points:p.getItemLayout(t)}});p.setItemGraphicEl(t,e),f.group.add(e)}).update(function(t,i){var n=f.__data.getItemGraphicEl(i);c.updateProps(n,{shape:{points:p.getItemLayout(t)}},e,t),f.group.add(n),p.setItemGraphicEl(t,n)}).remove(function(t){var e=f.__data.getItemGraphicEl(t);f.group.remove(e)}).execute(),p.eachItemGraphicEl(function(t,i){var n=p.getItemModel(i),r=n.getModel("label.normal"),o=n.getModel("label.emphasis"),a=p.getItemVisual(i,"color");t.useStyle(l.defaults(n.getModel("itemStyle.normal").getItemStyle(),{fill:d.modifyAlpha(a,.4),stroke:a})),t.hoverStyle=n.getModel("itemStyle.normal").getItemStyle();var s=p.getName(i)||"",h=a||t.style.fill;r.getShallow("show")?(c.setText(t.style,r,h),t.style.text=l.retrieve(e.getFormattedLabel(i,"normal"),s)):t.style.text="",o.getShallow("show")?(c.setText(t.hoverStyle,o,h),t.hoverStyle.text=l.retrieve(e.getFormattedLabel(i,"emphasis"),s)):t.hoverStyle.text="",c.setHoverStyle(t,{}),t.dataModel=e}),f.__data=p,f.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,i){t.exports=i(70).extend({type:"markLine",defaultOption:{zlevel:0,z:5,symbol:["circle","arrow"],symbolSize:[8,16],precision:2,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"end"},emphasis:{show:!0}},lineStyle:{normal:{type:"dashed"},emphasis:{width:3}},animationEasing:"linear"}})},function(t,e,i){function n(t){return!isNaN(t)&&!isFinite(t)}function r(t,e,i,r){var o=1-t,a=r.dimensions[t];return n(e[o])&&n(i[o])&&e[t]===i[t]&&r.getAxis(a).containData(e[t])}function o(t,e){if("cartesian2d"===t.type){var i=e[0].coord,n=e[1].coord;if(i&&n&&(r(1,i,n,t)||r(0,i,n,t)))return!0}return c.dataFilter(t,e[0])&&c.dataFilter(t,e[1])}function a(t,e,i,r,o){var a,s=r.coordinateSystem,l=t.getItemModel(e),h=u.parsePercent(l.get("x"),o.getWidth()),c=u.parsePercent(l.get("y"),o.getHeight());if(isNaN(h)||isNaN(c)){if(r.getMarkerPosition)a=r.getMarkerPosition(t.getValues(t.dimensions,e));else{var d=s.dimensions,f=t.get(d[0],e),p=t.get(d[1],e);a=s.dataToPoint([f,p])}if("cartesian2d"===s.type){var g=s.getAxis("x"),m=s.getAxis("y"),d=s.dimensions;n(t.get(d[0],e))?a[0]=g.toGlobalCoord(g.getExtent()[i?0:1]):n(t.get(d[1],e))&&(a[1]=m.toGlobalCoord(m.getExtent()[i?0:1]))}isNaN(h)||(a[0]=h),isNaN(c)||(a[1]=c)}else a=[h,c];t.setItemLayout(e,a)}function s(t,e,i){var n;n=t?l.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}):[{name:"value",type:"float"}];var r=new h(n,i),a=new h(n,i),s=new h([],i),u=l.map(i.get("data"),l.curry(f,e,t,i));t&&(u=l.filter(u,l.curry(o,t)));var d=t?c.dimValueGetter:function(t){return t.value};return r.initData(l.map(u,function(t){return t[0]}),null,d),a.initData(l.map(u,function(t){return t[1]}),null,d),s.initData(l.map(u,function(t){return t[2]})),s.hasItemOption=!0,{from:r,to:a,line:s}}var l=i(1),h=i(14),u=i(4),c=i(72),d=i(99),f=function(t,e,i,n){var r=t.getData(),o=n.type;if(!l.isArray(n)&&("min"===o||"max"===o||"average"===o||null!=n.xAxis||null!=n.yAxis)){var a,s,h;if(null!=n.yAxis||null!=n.xAxis)s=null!=n.yAxis?"y":"x",a=e.getAxis(s),h=l.retrieve(n.yAxis,n.xAxis);else{var u=c.getAxisInfo(n,r,e,t);s=u.valueDataDim,a=u.valueAxis,h=c.numCalculate(r,s,o)}var d="x"===s?0:1,f=1-d,p=l.clone(n),g={};p.type=null,p.coord=[],g.coord=[],p.coord[f]=-(1/0),g.coord[f]=1/0;var m=i.get("precision");m>=0&&"number"==typeof h&&(h=+h.toFixed(m)),p.coord[d]=g.coord[d]=h,n=[p,g,{type:o,valueIndex:n.valueIndex,value:h}]}return n=[c.dataTransform(t,n[0]),c.dataTransform(t,n[1]),l.extend({},n[2])],n[2].type=n[2].type||"",l.merge(n[2],n[0]),l.merge(n[2],n[1]),n};i(71).extend({type:"markLine",updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markLineModel;if(e){var n=e.getData(),r=e.__from,o=e.__to;r.each(function(e){a(r,e,!0,t,i),a(o,e,!1,t,i)}),n.each(function(t){n.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])}),this.markerGroupMap[t.name].updateLayout()}},this)},renderSeries:function(t,e,i,n){function r(e,i,r){var o=e.getItemModel(i);a(e,i,r,t,n),e.setItemVisual(i,{symbolSize:o.get("symbolSize")||x[r?0:1],symbol:o.get("symbol",!0)||y[r?0:1],color:o.get("itemStyle.normal.color")||u.getVisual("color")})}var o=t.coordinateSystem,h=t.name,u=t.getData(),c=this.markerGroupMap,f=c[h];f||(f=c[h]=new d),this.group.add(f.group);var p=s(o,t,e),g=p.from,m=p.to,v=p.line;e.__from=g,e.__to=m,e.setData(v);var y=e.get("symbol"),x=e.get("symbolSize");l.isArray(y)||(y=[y,y]),"number"==typeof x&&(x=[x,x]),p.from.each(function(t){r(g,t,!0),r(m,t,!1)}),v.each(function(t){var e=v.getItemModel(t).get("lineStyle.normal.color");v.setItemVisual(t,{color:e||g.getItemVisual(t,"color")}),v.setItemLayout(t,[g.getItemLayout(t),m.getItemLayout(t)]),v.setItemVisual(t,{fromSymbolSize:g.getItemVisual(t,"symbolSize"),fromSymbol:g.getItemVisual(t,"symbol"),toSymbolSize:m.getItemVisual(t,"symbolSize"),toSymbol:m.getItemVisual(t,"symbol")})}),f.updateData(v),p.line.eachItemGraphicEl(function(t,i){t.traverse(function(t){t.dataModel=e})}),f.__keep=!0,f.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,i){t.exports=i(70).extend({type:"markPoint",defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"inside"},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:2}}}})},function(t,e,i){function n(t,e,i){var n=e.coordinateSystem;t.each(function(r){var o,a=t.getItemModel(r),l=s.parsePercent(a.get("x"),i.getWidth()),h=s.parsePercent(a.get("y"),i.getHeight());if(isNaN(l)||isNaN(h)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(n){var u=t.get(n.dimensions[0],r),c=t.get(n.dimensions[1],r);o=n.dataToPoint([u,c])}}else o=[l,h];isNaN(l)||(o[0]=l),isNaN(h)||(o[1]=h),t.setItemLayout(r,o)})}function r(t,e,i){var n;n=t?a.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}):[{name:"value",type:"float"}];var r=new l(n,i),o=a.map(i.get("data"),a.curry(h.dataTransform,e));return t&&(o=a.filter(o,a.curry(h.dataFilter,t))),r.initData(o,null,t?h.dimValueGetter:function(t){return t.value}),r}var o=i(39),a=i(1),s=i(4),l=i(14),h=i(72);i(71).extend({type:"markPoint",updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markPointModel;e&&(n(e.getData(),t,i),this.markerGroupMap[t.name].updateLayout(e))},this)},renderSeries:function(t,e,i,a){var s=t.coordinateSystem,l=t.name,h=t.getData(),u=this.markerGroupMap,c=u[l];c||(c=u[l]=new o);var d=r(s,t,e);e.setData(d),n(e.getData(),t,a),d.each(function(t){var i=d.getItemModel(t),n=i.getShallow("symbolSize");"function"==typeof n&&(n=n(e.getRawValue(t),e.getDataParams(t))),d.setItemVisual(t,{symbolSize:n,color:i.get("itemStyle.normal.color")||h.getVisual("color"),symbol:i.getShallow("symbol")})}),c.updateData(d),this.group.add(c.group),d.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e})}),c.__keep=!0,c.group.silent=e.get("silent")||t.get("silent")}})},function(t,e,i){"use strict";var n=i(2),r=i(3),o=i(12);n.extendComponentModel({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),n.extendComponentView({type:"title",render:function(t,e,i){if(this.group.removeAll(),t.get("show")){var n=this.group,a=t.getModel("textStyle"),s=t.getModel("subtextStyle"),l=t.get("textAlign"),h=t.get("textBaseline"),u=new r.Text({
+style:{text:t.get("text"),textFont:a.getFont(),fill:a.getTextColor()},z2:10}),c=u.getBoundingRect(),d=t.get("subtext"),f=new r.Text({style:{text:d,textFont:s.getFont(),fill:s.getTextColor(),y:c.height+t.get("itemGap"),textBaseline:"top"},z2:10}),p=t.get("link"),g=t.get("sublink");u.silent=!p,f.silent=!g,p&&u.on("click",function(){window.open(p,"_"+t.get("target"))}),g&&f.on("click",function(){window.open(g,"_"+t.get("subtarget"))}),n.add(u),d&&n.add(f);var m=n.getBoundingRect(),v=t.getBoxLayoutParams();v.width=m.width,v.height=m.height;var y=o.getLayoutRect(v,{width:i.getWidth(),height:i.getHeight()},t.get("padding"));l||(l=t.get("left")||t.get("right"),"middle"===l&&(l="center"),"right"===l?y.x+=y.width:"center"===l&&(y.x+=y.width/2)),h||(h=t.get("top")||t.get("bottom"),"center"===h&&(h="middle"),"bottom"===h?y.y+=y.height:"middle"===h&&(y.y+=y.height/2),h=h||"top"),n.attr("position",[y.x,y.y]);var x={textAlign:l,textVerticalAlign:h};u.setStyle(x),f.setStyle(x),m=n.getBoundingRect();var _=y.margin,b=t.getItemStyle(["color","opacity"]);b.fill=t.get("backgroundColor");var w=new r.Rect({shape:{x:m.x-_[3],y:m.y-_[0],width:m.width+_[1]+_[3],height:m.height+_[0]+_[2]},style:b,silent:!0});r.subPixelOptimizeRect(w),n.add(w)}}})},function(t,e,i){i(208),i(209),i(214),i(212),i(210),i(211),i(213)},function(t,e,i){var n=i(26),r=i(1),o=i(2).extendComponentModel({type:"toolbox",layoutMode:{type:"box",ignoreSize:!0},mergeDefaultAndTheme:function(t){o.superApply(this,"mergeDefaultAndTheme",arguments),r.each(this.option.feature,function(t,e){var i=n.get(e);i&&r.merge(t,i.defaultOption)})},defaultOption:{show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{normal:{borderColor:"#666",color:"none"},emphasis:{borderColor:"#3E98C5"}}}});t.exports=o},function(t,e,i){(function(e){function n(t){return 0===t.indexOf("my")}var r=i(26),o=i(1),a=i(3),s=i(11),l=i(43),h=i(118),u=i(17);t.exports=i(2).extendComponentView({type:"toolbox",render:function(t,e,i,c){function d(o,a){var l,h=y[o],u=y[a],d=m[h],p=new s(d,t,t.ecModel);if(h&&!u){if(n(h))l={model:p,onclick:p.option.onclick,featureName:h};else{var g=r.get(h);if(!g)return;l=new g(p,e,i)}v[h]=l}else{if(l=v[u],!l)return;l.model=p,l.ecModel=e,l.api=i}return!h&&u?void(l.dispose&&l.dispose(e,i)):!p.get("show")||l.unusable?void(l.remove&&l.remove(e,i)):(f(p,l,h),p.setIconStatus=function(t,e){var i=this.option,n=this.iconPaths;i.iconStatus=i.iconStatus||{},i.iconStatus[t]=e,n[t]&&n[t].trigger(e)},void(l.render&&l.render(p,e,i,c)))}function f(n,r,s){var l=n.getModel("iconStyle"),h=r.getIcons?r.getIcons():n.get("icon"),u=n.get("title")||{};if("string"==typeof h){var c=h,d=u;h={},u={},h[s]=c,u[s]=d}var f=n.iconPaths={};o.each(h,function(s,h){var c=l.getModel("normal").getItemStyle(),d=l.getModel("emphasis").getItemStyle(),m={x:-g/2,y:-g/2,width:g,height:g},v=0===s.indexOf("image://")?(m.image=s.slice(8),new a.Image({style:m})):a.makePath(s.replace("path://",""),{style:c,hoverStyle:d,rectHover:!0},m,"center");a.setHoverStyle(v),t.get("showTitle")&&(v.__title=u[h],v.on("mouseover",function(){var t=l.getModel("emphasis").getItemStyle();v.setStyle({text:u[h],textPosition:t.textPosition||"bottom",textFill:t.fill||t.stroke||"#000",textAlign:t.textAlign||"center"})}).on("mouseout",function(){v.setStyle({textFill:null})})),v.trigger(n.get("iconStatus."+h)||"normal"),p.add(v),v.on("click",o.bind(r.onclick,r,e,i,h)),f[h]=v})}var p=this.group;if(p.removeAll(),t.get("show")){var g=+t.get("itemSize"),m=t.get("feature")||{},v=this._features||(this._features={}),y=[];o.each(m,function(t,e){y.push(e)}),new l(this._featureNames||[],y).add(d).update(d).remove(o.curry(d,null)).execute(),this._featureNames=y,h.layout(p,t,i),h.addBackground(p,t),p.eachChild(function(t){var e=t.__title,n=t.hoverStyle;if(n&&e){var r=u.getBoundingRect(e,n.font),o=t.position[0]+p.position[0],a=t.position[1]+p.position[1]+g,s=!1;a+r.height>i.getHeight()&&(n.textPosition="top",s=!0);var l=s?-5-r.height:g+8;o+r.width/2>i.getWidth()?(n.textPosition=["100%",l],n.textAlign="right"):o-r.width/2<0&&(n.textPosition=[0,l],n.textAlign="left")}})}},updateView:function(t,e,i,n){o.each(this._features,function(t){t.updateView&&t.updateView(t.model,e,i,n)})},updateLayout:function(t,e,i,n){o.each(this._features,function(t){t.updateLayout&&t.updateLayout(t.model,e,i,n)})},remove:function(t,e){o.each(this._features,function(i){i.remove&&i.remove(t,e)}),this.group.removeAll()},dispose:function(t,e){o.each(this._features,function(i){i.dispose&&i.dispose(t,e)})}})}).call(e,i(175))},function(t,e,i){function n(t){var e={},i=[],n=[];return t.eachRawSeries(function(t){var r=t.coordinateSystem;if(!r||"cartesian2d"!==r.type&&"polar"!==r.type)i.push(t);else{var o=r.getBaseAxis();if("category"===o.type){var a=o.dim+"_"+o.index;e[a]||(e[a]={categoryAxis:o,valueAxis:r.getOtherAxis(o),series:[]},n.push({axisDim:o.dim,axisIndex:o.index})),e[a].series.push(t)}else i.push(t)}}),{seriesGroupByCategoryAxis:e,other:i,meta:n}}function r(t){var e=[];return p.each(t,function(t,i){var n=t.categoryAxis,r=t.valueAxis,o=r.dim,a=[" "].concat(p.map(t.series,function(t){return t.name})),s=[n.model.getCategories()];p.each(t.series,function(t){s.push(t.getRawData().mapArray(o,function(t){return t}))});for(var l=[a.join(v)],h=0;h<s[0].length;h++){for(var u=[],c=0;c<s.length;c++)u.push(s[c][h]);l.push(u.join(v))}e.push(l.join("\n"))}),e.join("\n\n"+m+"\n\n")}function o(t){return p.map(t,function(t){var e=t.getRawData(),i=[t.name],n=[];return e.each(e.dimensions,function(){for(var t=arguments.length,r=arguments[t-1],o=e.getName(r),a=0;a<t-1;a++)n[a]=arguments[a];i.push((o?o+v:"")+n.join(v))}),i.join("\n")}).join("\n\n"+m+"\n\n")}function a(t){var e=n(t);return{value:p.filter([r(e.seriesGroupByCategoryAxis),o(e.other)],function(t){return t.replace(/[\n\t\s]/g,"")}).join("\n\n"+m+"\n\n"),meta:e.meta}}function s(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function l(t){var e=t.slice(0,t.indexOf("\n"));if(e.indexOf(v)>=0)return!0}function h(t){for(var e=t.split(/\n+/g),i=s(e.shift()).split(y),n=[],r=p.map(i,function(t){return{name:t,data:[]}}),o=0;o<e.length;o++){var a=s(e[o]).split(y);n.push(a.shift());for(var l=0;l<a.length;l++)r[l]&&(r[l].data[o]=a[l])}return{series:r,categories:n}}function u(t){for(var e=t.split(/\n+/g),i=s(e.shift()),n=[],r=0;r<e.length;r++){var o,a=s(e[r]).split(y),l="",h=!1;isNaN(a[0])?(h=!0,l=a[0],a=a.slice(1),n[r]={name:l,value:[]},o=n[r].value):o=n[r]=[];for(var u=0;u<a.length;u++)o.push(+a[u]);1===o.length&&(h?n[r].value=o[0]:n[r]=o[0])}return{name:i,data:n}}function c(t,e){var i=t.split(new RegExp("\n*"+m+"\n*","g")),n={series:[]};return p.each(i,function(t,i){if(l(t)){var r=h(t),o=e[i],a=o.axisDim+"Axis";o&&(n[a]=n[a]||[],n[a][o.axisIndex]={data:r.categories},n.series=n.series.concat(r.series))}else{var r=u(t);n.series.push(r)}}),n}function d(t){this._dom=null,this.model=t}function f(t,e){return p.map(t,function(t,i){var n=e&&e[i];return p.isObject(n)&&!p.isArray(n)?(p.isObject(t)&&!p.isArray(t)&&(t=t.value),p.defaults({value:t},n)):t})}var p=i(1),g=i(25),m=new Array(60).join("-"),v="\t",y=new RegExp("["+v+"]+","g");d.defaultOption={show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",title:"æ•°æ®è§†å›¾",lang:["æ•°æ®è§†å›¾","关闭","刷新"],backgroundColor:"#fff",textColor:"#000",textareaColor:"#fff",textareaBorderColor:"#333",buttonColor:"#c23531",buttonTextColor:"#fff"},d.prototype.onclick=function(t,e){function i(){n.removeChild(o),S._dom=null}var n=e.getDom(),r=this.model;this._dom&&n.removeChild(this._dom);var o=document.createElement("div");o.style.cssText="position:absolute;left:5px;top:5px;bottom:5px;right:5px;",o.style.backgroundColor=r.get("backgroundColor")||"#fff";var s=document.createElement("h4"),l=r.get("lang")||[];s.innerHTML=l[0]||r.get("title"),s.style.cssText="margin: 10px 20px;",s.style.color=r.get("textColor");var h=document.createElement("div"),u=document.createElement("textarea");h.style.cssText="display:block;width:100%;overflow:hidden;";var d=r.get("optionToContent"),f=r.get("contentToOption"),m=a(t);if("function"==typeof d){var y=d(e.getOption());"string"==typeof y?h.innerHTML=y:p.isDom(y)&&h.appendChild(y)}else h.appendChild(u),u.readOnly=r.get("readOnly"),u.style.cssText="width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;",u.style.color=r.get("textColor"),u.style.borderColor=r.get("textareaBorderColor"),u.style.backgroundColor=r.get("textareaColor"),u.value=m.value;var x=m.meta,_=document.createElement("div");_.style.cssText="position:absolute;bottom:0;left:0;right:0;";var b="float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px",w=document.createElement("div"),M=document.createElement("div");b+=";background-color:"+r.get("buttonColor"),b+=";color:"+r.get("buttonTextColor");var S=this;g.addEventListener(w,"click",i),g.addEventListener(M,"click",function(){var t;try{t="function"==typeof f?f(h,e.getOption()):c(u.value,x)}catch(n){throw i(),new Error("Data view format error "+n)}t&&e.dispatchAction({type:"changeDataView",newOption:t}),i()}),w.innerHTML=l[1],M.innerHTML=l[2],M.style.cssText=b,w.style.cssText=b,!r.get("readOnly")&&_.appendChild(M),_.appendChild(w),g.addEventListener(u,"keydown",function(t){if(9===(t.keyCode||t.which)){var e=this.value,i=this.selectionStart,n=this.selectionEnd;this.value=e.substring(0,i)+v+e.substring(n),this.selectionStart=this.selectionEnd=i+1,g.stop(t)}}),o.appendChild(s),o.appendChild(h),o.appendChild(_),h.style.height=n.clientHeight-80+"px",n.appendChild(o),this._dom=o},d.prototype.remove=function(t,e){this._dom&&e.getDom().removeChild(this._dom)},d.prototype.dispose=function(t,e){this.remove(t,e)},i(26).register("dataView",d),i(2).registerAction({type:"changeDataView",event:"dataViewChanged",update:"prepareAndUpdate"},function(t,e){var i=[];p.each(t.newOption.series,function(t){var n=e.getSeriesByName(t.name)[0];if(n){var r=n.get("data");i.push({name:t.name,data:f(t.data,r)})}else i.push(p.extend({type:"scatter"},t))}),e.mergeOption(p.defaults({series:i},t.newOption))}),t.exports=d},function(t,e,i){"use strict";function n(t,e,i){(this._brushController=new l(i.getZr())).on("brush",s.bind(this._onBrush,this)).mount(),this._isZoomActive}function r(t){var e={};return s.each(["xAxisIndex","yAxisIndex"],function(i){e[i]=t[i],null==e[i]&&(e[i]="all"),(e[i]===!1||"none"===e[i])&&(e[i]=[])}),e}function o(t,e){t.setIconStatus("back",u.count(e)>1?"emphasis":"normal")}function a(t,e,i,n){var o=i._isZoomActive;n&&"takeGlobalCursor"===n.type&&(o="dataZoomSelect"===n.key&&n.dataZoomSelectActive),i._isZoomActive=o,t.setIconStatus("zoom",o?"emphasis":"normal");var a=h.makeCoordInfoList(r(t.option),e),s=a.xAxisHas&&!a.yAxisHas?"lineX":!a.xAxisHas&&a.yAxisHas?"lineY":"rect";i._brushController.setPanels(h.makePanelOpts(a)).enableBrush(!!o&&{brushType:s,brushStyle:{lineWidth:0,fill:"rgba(0,0,0,0.2)"}})}var s=i(1),l=i(115),h=i(116),u=i(113),c=s.each;i(190);var d="\0_ec_\0toolbox-dataZoom_";n.defaultOption={show:!0,icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:{zoom:"区域缩放",back:"区域缩放还原"}};var f=n.prototype;f.render=function(t,e,i,n){this.model=t,this.ecModel=e,this.api=i,a(t,e,this,n),o(t,e)},f.onclick=function(t,e,i){p[i].call(this)},f.remove=function(t,e){this._brushController.unmount()},f.dispose=function(t,e){this._brushController.dispose()};var p={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(u.pop(this.ecModel))}};f._onBrush=function(t,e){function i(t,e,i){var r=n(t,i[t],a);r&&(o[r.id]={dataZoomId:r.id,startValue:e[0],endValue:e[1]})}function n(t,e,i){var n;return i.eachComponent({mainType:"dataZoom",subType:"select"},function(r,o){var a=r.get(t+"Index");null!=a&&i.getComponent(t,a)===e&&(n=r)}),n}if(e.isEnd&&t.length){var o={},a=this.ecModel;this._brushController.updateCovers([]);var s=h.makeCoordInfoList(r(this.model.option),a),l=[];h.parseOutputRanges(t,s,a,l);var c=t[0],d=l[0],f=c.coordRange,p=c.brushType;if(d&&f)if("rect"===p)i("xAxis",f[0],d),i("yAxis",f[1],d);else{var g={lineX:"xAxis",lineY:"yAxis"};i(g[p],f,d)}u.push(a,o),this._dispatchZoomAction(o)}},f._dispatchZoomAction=function(t){var e=[];c(t,function(t,i){e.push(s.clone(t))}),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},i(26).register("dataZoom",n),i(2).registerPreprocessor(function(t){function e(t,e){if(e){var r=t+"Index",o=e[r];null==o||"all"==o||s.isArray(o)||(o=o===!1||"none"===o?[]:[o]),i(t,function(e,i){if(null==o||"all"==o||s.indexOf(o,i)!==-1){var a={type:"select",$fromToolbox:!0,id:d+t+i};a[r]=i,n.push(a)}})}}function i(e,i){var n=t[e];s.isArray(n)||(n=n?[n]:[]),c(n,i)}if(t){var n=t.dataZoom||(t.dataZoom=[]);s.isArray(n)||(t.dataZoom=n=[n]);var r=t.toolbox;if(r&&(s.isArray(r)&&(r=r[0]),r&&r.feature)){var o=r.feature.dataZoom;e("xAxis",o),e("yAxis",o)}}}),t.exports=n},function(t,e,i){"use strict";function n(t){this.model=t}var r=i(1);n.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z",tiled:"M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z"},title:{line:"切æ¢ä¸ºæŠ˜çº¿å›¾",bar:"切æ¢ä¸ºæŸ±çŠ¶å›¾",stack:"切æ¢ä¸ºå †å ",tiled:"切æ¢ä¸ºå¹³é“º"},option:{},seriesIndex:{}};var o=n.prototype;o.getIcons=function(){var t=this.model,e=t.get("icon"),i={};return r.each(t.get("type"),function(t){e[t]&&(i[t]=e[t])}),i};var a={line:function(t,e,i,n){if("bar"===t)return r.merge({id:e,type:"line",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.line")||{},!0)},bar:function(t,e,i,n){if("line"===t)return r.merge({id:e,type:"bar",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.bar")||{},!0)},stack:function(t,e,i,n){if("line"===t||"bar"===t)return r.merge({id:e,stack:"__ec_magicType_stack__"},n.get("option.stack")||{},!0)},tiled:function(t,e,i,n){if("line"===t||"bar"===t)return r.merge({id:e,stack:""},n.get("option.tiled")||{},!0)}},s=[["line","bar"],["stack","tiled"]];o.onclick=function(t,e,i){var n=this.model,o=n.get("seriesIndex."+i);if(a[i]){var l={series:[]},h=function(e){var o=e.subType,s=e.id,h=a[i](o,s,e,n);h&&(r.defaults(h,e.option),l.series.push(h));var u=e.coordinateSystem;if(u&&"cartesian2d"===u.type&&("line"===i||"bar"===i)){var c=u.getAxesByScale("ordinal")[0];if(c){var d=c.dim,f=d+"Axis",p=t.queryComponents({mainType:f,index:e.get(name+"Index"),id:e.get(name+"Id")})[0],g=p.componentIndex;l[f]=l[f]||[];for(var m=0;m<=g;m++)l[f][g]=l[f][g]||{};l[f][g].boundaryGap="bar"===i}}};r.each(s,function(t){r.indexOf(t,i)>=0&&r.each(t,function(t){n.setIconStatus(t,"normal")})}),n.setIconStatus(i,"emphasis"),t.eachComponent({mainType:"series",query:null==o?null:{seriesIndex:o}},h),e.dispatchAction({type:"changeMagicType",currentType:i,newOption:l})}};var l=i(2);l.registerAction({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),i(26).register("magicType",n),t.exports=n},function(t,e,i){"use strict";function n(t){this.model=t}var r=i(113);n.defaultOption={show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:"还原"};var o=n.prototype;o.onclick=function(t,e,i){r.clear(t),e.dispatchAction({type:"restore",from:this.uid})},i(26).register("restore",n),i(2).registerAction({type:"restore",event:"restore",update:"prepareAndUpdate"},function(t,e){e.resetOption("recreate")}),t.exports=n},function(t,e,i){function n(t){this.model=t}var r=i(10);n.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:"ä¿å­˜ä¸ºå›¾ç‰‡",type:"png",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:["å³é”®å¦å­˜ä¸ºå›¾ç‰‡"]},n.prototype.unusable=!r.canvasSupported;var o=n.prototype;o.onclick=function(t,e){var i=this.model,n=i.get("name")||t.get("title.0.text")||"echarts",o=document.createElement("a"),a=i.get("type",!0)||"png";o.download=n+"."+a,o.target="_blank";var s=e.getConnectedDataURL({type:a,backgroundColor:i.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",excludeComponents:i.get("excludeComponents"),pixelRatio:i.get("pixelRatio")});if(o.href=s,"function"!=typeof MouseEvent||r.browser.ie||r.browser.edge){var l=i.get("lang"),h='<body style="margin:0;"><img src="'+s+'" style="max-width:100%;" title="'+(l&&l[0]||"")+'" /></body>',u=window.open();u.document.write(h)}else{var c=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});o.dispatchEvent(c)}},i(26).register("saveAsImage",n),t.exports=n},function(t,e,i){i(217),i(218),i(2).registerAction({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},function(){}),i(2).registerAction({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},function(){})},function(t,e,i){function n(t){var e="cubic-bezier(0.23, 1, 0.32, 1)",i="left "+t+"s "+e+",top "+t+"s "+e;return s.map(p,function(t){return t+"transition:"+i}).join(";")}function r(t){var e=[],i=t.get("fontSize"),n=t.getTextColor();return n&&e.push("color:"+n),e.push("font:"+t.getFont()),i&&e.push("line-height:"+Math.round(3*i/2)+"px"),c(["decoration","align"],function(i){var n=t.get(i);n&&e.push("text-"+i+":"+n)}),e.join(";")}function o(t){t=t;var e=[],i=t.get("transitionDuration"),o=t.get("backgroundColor"),a=t.getModel("textStyle"),s=t.get("padding");return i&&e.push(n(i)),o&&(f.canvasSupported?e.push("background-Color:"+o):(e.push("background-Color:#"+l.toHex(o)),e.push("filter:alpha(opacity=70)"))),c(["width","color","radius"],function(i){var n="border-"+i,r=d(n),o=t.get(r);null!=o&&e.push(n+":"+o+("color"===i?"":"px"))}),e.push(r(a)),null!=s&&e.push("padding:"+u.normalizeCssArray(s).join("px ")+"px"),e.join(";")+";"}function a(t,e){var i=document.createElement("div"),n=e.getZr();this.el=i,this._x=e.getWidth()/2,this._y=e.getHeight()/2,t.appendChild(i),this._container=t,this._show=!1,this._hideTimeout;var r=this;i.onmouseenter=function(){r.enterable&&(clearTimeout(r._hideTimeout),r._show=!0),r._inContent=!0},i.onmousemove=function(e){if(e=e||window.event,!r.enterable){var i=n.handler;h.normalizeEvent(t,e,!0),i.dispatch("mousemove",e)}},i.onmouseleave=function(){r.enterable&&r._show&&r.hideLater(r._hideDelay),r._inContent=!1}}var s=i(1),l=i(19),h=i(25),u=i(8),c=s.each,d=u.toCamelCase,f=i(10),p=["","-webkit-","-moz-","-o-"],g="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;";a.prototype={constructor:a,enterable:!0,update:function(){var t=this._container,e=t.currentStyle||document.defaultView.getComputedStyle(t),i=t.style;"absolute"!==i.position&&"absolute"!==e.position&&(i.position="relative")},show:function(t){clearTimeout(this._hideTimeout);var e=this.el;e.style.cssText=g+o(t)+";left:"+this._x+"px;top:"+this._y+"px;"+(t.get("extraCssText")||""),e.style.display=e.innerHTML?"block":"none",this._show=!0},setContent:function(t){var e=this.el;e.innerHTML=t,e.style.display=t?"block":"none"},moveTo:function(t,e){var i=this.el.style;i.left=t+"px",i.top=e+"px",this._x=t,this._y=e},hide:function(){this.el.style.display="none",this._show=!1},hideLater:function(t){!this._show||this._inContent&&this.enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(s.bind(this.hide,this),t)):this.hide())},isShow:function(){return this._show}},t.exports=a},function(t,e,i){i(2).extendComponentModel({type:"tooltip",defaultOption:{zlevel:0,z:8,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove",alwaysShowContent:!1,confine:!1,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(50,50,50,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:!0,animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",lineStyle:{color:"#555",width:1,type:"solid"},crossStyle:{color:"#555",width:1,type:"dashed",textStyle:{}},shadowStyle:{color:"rgba(150,150,150,0.3)"}},textStyle:{color:"#fff",fontSize:14}}})},function(t,e,i){function n(t,e){if(!t||!e)return!1;var i=m.round;return i(t[0])===i(e[0])&&i(t[1])===i(e[1])}function r(t,e,i,n){return{x1:t,y1:e,x2:i,y2:n}}function o(t,e,i,n){return{x:t,y:e,width:i,height:n}}function a(t,e,i,n,r,o){return{cx:t,cy:e,r0:i,r:n,startAngle:r,endAngle:o,clockwise:!0}}function s(t,e,i,n,r){var o=i.clientWidth,a=i.clientHeight,s=20;return t+o+s>n?t-=o+s:t+=s,e+a+s>r?e-=a+s:e+=s,[t,e]}function l(t,e,i,n,r){var o=i.clientWidth,a=i.clientHeight;return t=Math.min(t+o,n)-o,e=Math.min(e+a,r)-a,t=Math.max(t,0),e=Math.max(e,0),[t,e]}function h(t,e,i){var n=i.clientWidth,r=i.clientHeight,o=5,a=0,s=0,l=e.width,h=e.height;switch(t){case"inside":a=e.x+l/2-n/2,s=e.y+h/2-r/2;break;case"top":a=e.x+l/2-n/2,s=e.y-r-o;break;case"bottom":a=e.x+l/2-n/2,s=e.y+h+o;break;case"left":a=e.x-n-o,s=e.y+h/2-r/2;break;case"right":a=e.x+l+o,s=e.y+h/2-r/2}return[a,s]}function u(t,e,i,n,r,o,a,u){var c=u.getWidth(),d=u.getHeight(),f=a&&a.getBoundingRect().clone();if(a&&f.applyTransform(a.transform),"function"==typeof t&&(t=t([e,i],o,r.el,f)),p.isArray(t))e=y(t[0],c),i=y(t[1],d);else if("string"==typeof t&&a){var g=h(t,f,r.el);e=g[0],i=g[1]}else{var g=s(e,i,r.el,c,d);e=g[0],i=g[1]}if(n){var g=l(e,i,r.el,c,d);e=g[0],i=g[1]}r.moveTo(e,i)}function c(t){var e=t.coordinateSystem,i=t.get("tooltip.trigger",!0);return!(!e||"cartesian2d"!==e.type&&"polar"!==e.type&&"singleAxis"!==e.type||"item"===i)}var d=i(216),f=i(3),p=i(1),g=i(8),m=i(4),v=i(6),y=m.parsePercent,x=i(10),_=i(11);i(2).extendComponentView({type:"tooltip",_axisPointers:{},init:function(t,e){if(!x.node){var i=new d(e.getDom(),e);this._tooltipContent=i}},render:function(t,e,i){if(!x.node){this.group.removeAll(),this._axisPointers={},this._tooltipModel=t,this._ecModel=e,this._api=i,this._lastHover={};var n=this._tooltipContent;n.update(),n.enterable=t.get("enterable"),this._alwaysShowContent=t.get("alwaysShowContent"),this._seriesGroupByAxis=this._prepareAxisTriggerData(t,e);var r=this._crossText;r&&this.group.add(r);var o=t.get("triggerOn");if(null!=this._lastX&&null!=this._lastY&&"none"!==o){var a=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){a.manuallyShowTip(t,e,i,{x:a._lastX,y:a._lastY})})}var s=this._api.getZr();s.off("click",this._tryShow),s.off("mousemove",this._mousemove),s.off("mouseout",this._hide),s.off("globalout",this._hide),"click"===o?s.on("click",this._tryShow,this):"mousemove"===o&&(s.on("mousemove",this._mousemove,this),s.on("mouseout",this._hide,this),s.on("globalout",this._hide,this))}},_mousemove:function(t){var e=this._tooltipModel.get("showDelay"),i=this;clearTimeout(this._showTimeout),e>0?this._showTimeout=setTimeout(function(){i._tryShow(t)},e):this._tryShow(t)},manuallyShowTip:function(t,e,i,n){function r(t){var e=t.getData(),i=v.queryDataIndex(e,n);if(null!=i&&!p.isArray(i)&&e.hasValue(i))return!0}if(n.from!==this.uid){var e=this._ecModel,o=n.seriesIndex,a=e.getSeriesByIndex(o),i=this._api,s="axis"===this._tooltipModel.get("trigger");if(null==n.x||null==n.y){if(s?(a&&!r(a)&&(a=null),a||e.eachSeries(function(t){c(t)&&!a&&r(t)&&(a=t)})):a=a||e.getSeriesByIndex(0),a){var l=a.getData(),h=v.queryDataIndex(l,n);if(null==h||p.isArray(h))return;var u,d,f=l.getItemGraphicEl(h),g=a.coordinateSystem;if(a.getTooltipPosition){var m=a.getTooltipPosition(h)||[];u=m[0],d=m[1]}else if(g&&g.dataToPoint){var m=g.dataToPoint(l.getValues(p.map(g.dimensions,function(t){return a.coordDimToDataDim(t)[0]}),h,!0));u=m&&m[0],d=m&&m[1]}else if(f){var y=f.getBoundingRect().clone();y.applyTransform(f.transform),u=y.x+y.width/2,d=y.y+y.height/2}null!=u&&null!=d&&this._tryShow({offsetX:u,offsetY:d,position:n.position,target:f,event:{}})}}else{var f=i.getZr().handler.findHover(n.x,n.y);this._tryShow({offsetX:n.x,offsetY:n.y,position:n.position,target:f,event:{}})}}},manuallyHideTip:function(t,e,i,n){n.from!==this.uid&&this._hide()},_prepareAxisTriggerData:function(t,e){var i={};return e.eachSeries(function(t){if(c(t)){var e,n,r=t.coordinateSystem;"cartesian2d"===r.type?(e=r.getBaseAxis(),n=e.dim+e.index):"singleAxis"===r.type?(e=r.getAxis(),n=e.dim+e.type):(e=r.getBaseAxis(),n=e.dim+r.name),i[n]=i[n]||{coordSys:[],series:[]},i[n].coordSys.push(r),i[n].series.push(t)}},this),i},_tryShow:function(t){var e=t.target,i=this._tooltipModel,n=i.get("trigger"),r=this._ecModel,o=this._api;if(i)if(this._lastX=t.offsetX,this._lastY=t.offsetY,e&&null!=e.dataIndex){var a=e.dataModel||r.getSeriesByIndex(e.seriesIndex),s=e.dataIndex,l=a.getData(),h=l.getItemModel(s);"axis"===(h.get("tooltip.trigger")||n)?this._showAxisTooltip(i,r,t):(this._ticket="",this._hideAxisPointer(),this._resetLastHover(),this._showItemTooltipContent(a,s,e.dataType,t)),o.dispatchAction({type:"showTip",from:this.uid,dataIndexInside:s,dataIndex:l.getRawIndex(s),seriesIndex:e.seriesIndex})}else if(e&&e.tooltip){var u=e.tooltip;if("string"==typeof u){var c=u;u={content:c,formatter:c}}var d=new _(u,i),f=d.get("content"),p=Math.random();this._showTooltipContent(d,f,d.get("formatterParams")||{},p,t.offsetX,t.offsetY,t.position,e,o)}else"item"===n?this._hide():this._showAxisTooltip(i,r,t),"cross"===i.get("axisPointer.type")&&o.dispatchAction({type:"showTip",from:this.uid,x:t.offsetX,y:t.offsetY})},_showAxisTooltip:function(t,e,i){var r=t.getModel("axisPointer"),o=r.get("type");if("cross"===o){var a=i.target;if(a&&null!=a.dataIndex){var s=e.getSeriesByIndex(a.seriesIndex),l=a.dataIndex;this._showItemTooltipContent(s,l,a.dataType,i)}}this._showAxisPointer();var h=!0;p.each(this._seriesGroupByAxis,function(e){var a=e.coordSys,s=a[0],l=[i.offsetX,i.offsetY];if(!s.containPoint(l))return void this._hideAxisPointer(s.name);h=!1;var u=s.dimensions,c=s.pointToData(l,!0);l=s.dataToPoint(c);var d=s.getBaseAxis(),f=r.get("axis");if("auto"===f&&(f=d.dim),d.isBlank()||p.eqNaN(l[0])||p.eqNaN(l[1]))return void this._hideAxisPointer(s.name);var g=!1,m=this._lastHover;if("cross"===o)n(m.data,c)&&(g=!0),m.data=c;else{var v=p.indexOf(u,f);m.data===c[v]&&(g=!0),m.data=c[v]}var y=t.get("animation");"cartesian2d"!==s.type||g?"polar"!==s.type||g?"singleAxis"!==s.type||g||this._showSinglePointer(r,s,f,l,y):this._showPolarPointer(r,s,f,l,y):this._showCartesianPointer(r,s,f,l,y),"cross"!==o&&this._dispatchAndShowSeriesTooltipContent(s,e.series,l,c,g,i.position)},this),this._tooltipModel.get("show")||this._hideAxisPointer(),h&&this._hide()},_showCartesianPointer:function(t,e,i,n,a){function s(i,n,o){var a="x"===i?r(n[0],o[0],n[0],o[1]):r(o[0],n[1],o[1],n[1]),s=h._getPointerElement(e,t,i,a);f.subPixelOptimizeLine({shape:a,style:s.style}),d?f.updateProps(s,{shape:a},t):s.attr({shape:a})}function l(i,n,r){var a=e.getAxis(i),s=a.getBandWidth(),l=r[1]-r[0],u="x"===i?o(n[0]-s/2,r[0],s,l):o(r[0],n[1]-s/2,l,s),c=h._getPointerElement(e,t,i,u);d?f.updateProps(c,{shape:u},t):c.attr({shape:u})}var h=this,u=t.get("type"),c=e.getBaseAxis(),d=a&&"cross"!==u&&"category"===c.type&&c.getBandWidth()>20;if("cross"===u)s("x",n,e.getAxis("y").getGlobalExtent()),s("y",n,e.getAxis("x").getGlobalExtent()),this._updateCrossText(e,n,t);else{var p=e.getAxis("x"===i?"y":"x"),g=p.getGlobalExtent();"cartesian2d"===e.type&&("line"===u?s:l)(i,n,g)}},_showSinglePointer:function(t,e,i,n,o){function a(i,n,o){var a=e.getAxis(),l=a.orient,u="horizontal"===l?r(n[0],o[0],n[0],o[1]):r(o[0],n[1],o[1],n[1]),c=s._getPointerElement(e,t,i,u);h?f.updateProps(c,{shape:u},t):c.attr({shape:u})}var s=this,l=t.get("type"),h=o&&"cross"!==l&&"category"===e.getBaseAxis().type,u=e.getRect(),c=[u.y,u.y+u.height];a(i,n,c)},_showPolarPointer:function(t,e,i,n,o){function s(i,n,o){var a,s=e.pointToCoord(n);if("angle"===i){var l=e.coordToPoint([o[0],s[1]]),u=e.coordToPoint([o[1],s[1]]);a=r(l[0],l[1],u[0],u[1])}else a={cx:e.cx,cy:e.cy,r:s[0]};var c=h._getPointerElement(e,t,i,a);p?f.updateProps(c,{shape:a},t):c.attr({shape:a})}function l(i,n,r){var o,s=e.getAxis(i),l=s.getBandWidth(),u=e.pointToCoord(n),c=Math.PI/180;o="angle"===i?a(e.cx,e.cy,r[0],r[1],(-u[1]-l/2)*c,(-u[1]+l/2)*c):a(e.cx,e.cy,u[0]-l/2,u[0]+l/2,0,2*Math.PI);var d=h._getPointerElement(e,t,i,o);p?f.updateProps(d,{shape:o},t):d.attr({shape:o})}var h=this,u=t.get("type"),c=e.getAngleAxis(),d=e.getRadiusAxis(),p=o&&"cross"!==u&&"category"===e.getBaseAxis().type;if("cross"===u)s("angle",n,d.getExtent()),s("radius",n,c.getExtent()),this._updateCrossText(e,n,t);else{var g=e.getAxis("radius"===i?"angle":"radius"),m=g.getExtent();("line"===u?s:l)(i,n,m)}},_updateCrossText:function(t,e,i){var n=i.getModel("crossStyle"),r=n.getModel("textStyle"),o=this._tooltipModel,a=this._crossText;a||(a=this._crossText=new f.Text({style:{textAlign:"left",textVerticalAlign:"bottom"}}),this.group.add(a));var s=t.pointToData(e),l=t.dimensions;s=p.map(s,function(e,i){var n=t.getAxis(l[i]);return e="category"===n.type||"time"===n.type?n.scale.getLabel(e):g.addCommas(e.toFixed(n.getPixelPrecision()))}),a.setStyle({fill:r.getTextColor()||n.get("color"),textFont:r.getFont(),text:s.join(", "),x:e[0]+5,y:e[1]-5}),a.z=o.get("z"),a.zlevel=o.get("zlevel")},_getPointerElement:function(t,e,i,n){var r=this._tooltipModel,o=r.get("z"),a=r.get("zlevel"),s=this._axisPointers,l=t.name;if(s[l]=s[l]||{},s[l][i])return s[l][i];var h=e.get("type"),u=e.getModel(h+"Style"),c="shadow"===h,d=u[c?"getAreaStyle":"getLineStyle"](),p="polar"===t.type?c?"Sector":"radius"===i?"Circle":"Line":c?"Rect":"Line";c?d.stroke=null:d.fill=null;var g=s[l][i]=new f[p]({style:d,z:o,zlevel:a,silent:!0,shape:n});return this.group.add(g),g},_dispatchAndShowSeriesTooltipContent:function(t,e,i,n,r,o){var a=this._tooltipModel,s=t.getBaseAxis(),l={x:1,radius:1,single:1}[s.dim]?0:1;if(e.length){var h,c=p.map(e,function(t){return{seriesIndex:t.seriesIndex,dataIndexInside:t.getAxisTooltipDataIndex?t.getAxisTooltipDataIndex(t.coordDimToDataDim(s.dim),n,s):t.getData().indexOfNearest(t.coordDimToDataDim(s.dim)[0],n[l],!1,"category"===s.type?.5:null)}});p.each(c,function(t,i){e[i].getData().hasValue(t.dataIndexInside)&&(h=i)}),h=h||0;var d=this._lastHover,f=this._api;d.payloadBatch&&!r&&f.dispatchAction({type:"downplay",batch:d.payloadBatch}),r||(f.dispatchAction({type:"highlight",batch:c}),d.payloadBatch=c);var m=c[h].dataIndexInside;if(f.dispatchAction({type:"showTip",dataIndexInside:m,dataIndex:e[h].getData().getRawIndex(m),seriesIndex:c[h].seriesIndex,from:this.uid}),s&&a.get("showContent")&&a.get("show")){var v=p.map(e,function(t,e){return t.getDataParams(c[e].dataIndexInside)});if(r)u(o||a.get("position"),i[0],i[1],a.get("confine"),this._tooltipContent,v,null,f);else{var y=c[h].dataIndexInside,x="time"===s.type?s.scale.getLabel(n[l]):e[h].getData().getName(y),_=(x?g.encodeHTML(x)+"<br />":"")+p.map(e,function(t,e){return t.formatTooltip(c[e].dataIndexInside,!0)}).join("<br />"),b="axis_"+t.name+"_"+y;this._showTooltipContent(a,_,v,b,i[0],i[1],o,null,f)}}}},_showItemTooltipContent:function(t,e,i,n){var r=this._api,o=t.getData(i),a=o.getItemModel(e),s=a.get("tooltip",!0);if("string"==typeof s){var l=s;s={formatter:l}}var h=this._tooltipModel,u=t.getModel("tooltip",h),c=new _(s,u,u.ecModel),d=t.getDataParams(e,i),f=t.formatTooltip(e,!1,i),p="item_"+t.name+"_"+e;
+this._showTooltipContent(c,f,d,p,n.offsetX,n.offsetY,n.position,n.target,r)},_showTooltipContent:function(t,e,i,n,r,o,a,s,l){if(this._ticket="",t.get("showContent")&&t.get("show")){var h=this._tooltipContent,c=t.get("confine"),d=t.get("formatter");a=a||t.get("position");var f=e;if(d)if("string"==typeof d)f=g.formatTpl(d,i,!0);else if("function"==typeof d){var p=this,m=n,v=function(t,e){t===p._ticket&&(h.setContent(e),u(a,r,o,c,h,i,s,l))};p._ticket=m,f=d(i,m,v)}h.show(t),h.setContent(f),u(a,r,o,c,h,i,s,l)}},_showAxisPointer:function(t){if(t){var e=this._axisPointers[t];e&&p.each(e,function(t){t.show()})}else this.group.eachChild(function(t){t.show()}),this.group.show()},_resetLastHover:function(){var t=this._lastHover;t.payloadBatch&&this._api.dispatchAction({type:"downplay",batch:t.payloadBatch}),this._lastHover={}},_hideAxisPointer:function(t){if(t){var e=this._axisPointers[t];e&&p.each(e,function(t){t.hide()})}else this.group.children().length&&this.group.hide()},_hide:function(){clearTimeout(this._showTimeout),this._hideAxisPointer(),this._resetLastHover(),this._alwaysShowContent||this._tooltipContent.hideLater(this._tooltipModel.get("hideDelay")),this._api.dispatchAction({type:"hideTip",from:this.uid}),this._lastX=this._lastY=null},dispose:function(t,e){if(!x.node){var i=e.getZr();this._tooltipContent.hide(),i.off("click",this._tryShow),i.off("mousemove",this._mousemove),i.off("mouseout",this._hide),i.off("globalout",this._hide)}}})},,function(t,e,i){function n(t){return parseInt(t,10)}function r(t,e){s.initVML(),this.root=t,this.storage=e;var i=document.createElement("div"),n=document.createElement("div");i.style.cssText="display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;",n.style.cssText="position:absolute;left:0;top:0;",t.appendChild(i),this._vmlRoot=n,this._vmlViewport=i,this.resize();var r=e.delFromMap,o=e.addToMap;e.delFromMap=function(t){var i=e.get(t);r.call(e,t),i&&i.onRemove&&i.onRemove(n)},e.addToMap=function(t){t.onAdd&&t.onAdd(n),o.call(e,t)},this._firstPaint=!0}function o(t){return function(){a('In IE8.0 VML mode painter not support method "'+t+'"')}}var a=i(48),s=i(171);r.prototype={constructor:r,getViewportRoot:function(){return this._vmlViewport},refresh:function(){var t=this.storage.getDisplayList(!0,!0);this._paintList(t)},_paintList:function(t){for(var e=this._vmlRoot,i=0;i<t.length;i++){var n=t[i];n.invisible||n.ignore?(n.__alreadyNotVisible||n.onRemove(e),n.__alreadyNotVisible=!0):(n.__alreadyNotVisible&&n.onAdd(e),n.__alreadyNotVisible=!1,n.__dirty&&(n.beforeBrush&&n.beforeBrush(),(n.brushVML||n.brush).call(n,e),n.afterBrush&&n.afterBrush())),n.__dirty=!1}this._firstPaint&&(this._vmlViewport.appendChild(e),this._firstPaint=!1)},resize:function(t,e){var t=null==t?this._getWidth():t,e=null==e?this._getHeight():e;if(this._width!=t||this._height!=e){this._width=t,this._height=e;var i=this._vmlViewport.style;i.width=t+"px",i.height=e+"px"}},dispose:function(){this.root.innerHTML="",this._vmlRoot=this._vmlViewport=this.storage=null},getWidth:function(){return this._width},getHeight:function(){return this._height},clear:function(){this._vmlViewport&&this.root.removeChild(this._vmlViewport)},_getWidth:function(){var t=this.root,e=t.currentStyle;return(t.clientWidth||n(e.width))-n(e.paddingLeft)-n(e.paddingRight)|0},_getHeight:function(){var t=this.root,e=t.currentStyle;return(t.clientHeight||n(e.height))-n(e.paddingTop)-n(e.paddingBottom)|0}};for(var l=["getLayer","insertLayer","eachLayer","eachBuildinLayer","eachOtherLayer","getLayers","modLayer","delLayer","clearLayer","toDataURL","pathToImage"],h=0;h<l.length;h++){var u=l[h];r.prototype[u]=o(u)}t.exports=r},function(t,e,i){if(!i(10).canvasSupported){var n=i(5),r=i(9),o=i(29).CMD,a=i(19),s=i(17),l=i(77),h=i(36),u=i(49),c=i(76),d=i(7),f=i(37),p=i(171),g=Math.round,m=Math.sqrt,v=Math.abs,y=Math.cos,x=Math.sin,_=Math.max,b=n.applyTransform,w=",",M="progid:DXImageTransform.Microsoft",S=21600,T=S/2,A=1e5,I=1e3,C=function(t){t.style.cssText="position:absolute;left:0;top:0;width:1px;height:1px;",t.coordsize=S+","+S,t.coordorigin="0,0"},k=function(t){return String(t).replace(/&/g,"&amp;").replace(/"/g,"&quot;")},L=function(t,e,i){return"rgb("+[t,e,i].join(",")+")"},P=function(t,e){e&&t&&e.parentNode!==t&&t.appendChild(e)},D=function(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)},O=function(t,e,i){return(parseFloat(t)||0)*A+(parseFloat(e)||0)*I+i},z=function(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t},E=function(t,e,i){var n=a.parse(e);i=+i,isNaN(i)&&(i=1),n&&(t.color=L(n[0],n[1],n[2]),t.opacity=i*n[3])},N=function(t){var e=a.parse(t);return[L(e[0],e[1],e[2]),e[3]]},R=function(t,e,i){var n=e.fill;if(null!=n)if(n instanceof f){var r,o=0,a=[0,0],s=0,l=1,h=i.getBoundingRect(),u=h.width,c=h.height;if("linear"===n.type){r="gradient";var d=i.transform,p=[n.x*u,n.y*c],g=[n.x2*u,n.y2*c];d&&(b(p,p,d),b(g,g,d));var m=g[0]-p[0],v=g[1]-p[1];o=180*Math.atan2(m,v)/Math.PI,o<0&&(o+=360),o<1e-6&&(o=0)}else{r="gradientradial";var p=[n.x*u,n.y*c],d=i.transform,y=i.scale,x=u,w=c;a=[(p[0]-h.x)/x,(p[1]-h.y)/w],d&&b(p,p,d),x/=y[0]*S,w/=y[1]*S;var M=_(x,w);s=0/M,l=2*n.r/M-s}var T=n.colorStops.slice();T.sort(function(t,e){return t.offset-e.offset});for(var A=T.length,I=[],C=[],k=0;k<A;k++){var L=T[k],P=N(L.color);C.push(L.offset*l+s+" "+P[0]),0!==k&&k!==A-1||I.push(P)}if(A>=2){var D=I[0][0],O=I[1][0],z=I[0][1]*e.opacity,R=I[1][1]*e.opacity;t.type=r,t.method="none",t.focus="100%",t.angle=o,t.color=D,t.color2=O,t.colors=C.join(","),t.opacity=R,t.opacity2=z}"radial"===r&&(t.focusposition=a.join(","))}else E(t,n,e.opacity)},B=function(t,e){null!=e.lineDash&&(t.dashstyle=e.lineDash.join(" ")),null==e.stroke||e.stroke instanceof f||E(t,e.stroke,e.opacity)},V=function(t,e,i,n){var r="fill"==e,o=t.getElementsByTagName(e)[0];null!=i[e]&&"none"!==i[e]&&(r||!r&&i.lineWidth)?(t[r?"filled":"stroked"]="true",i[e]instanceof f&&D(t,o),o||(o=p.createNode(e)),r?R(o,i,n):B(o,i),P(t,o)):(t[r?"filled":"stroked"]="false",D(t,o))},F=[[],[],[]],G=function(t,e){var i,n,r,a,s,l,h=o.M,u=o.C,c=o.L,d=o.A,f=o.Q,p=[];for(a=0;a<t.length;){switch(r=t[a++],n="",i=0,r){case h:n=" m ",i=1,s=t[a++],l=t[a++],F[0][0]=s,F[0][1]=l;break;case c:n=" l ",i=1,s=t[a++],l=t[a++],F[0][0]=s,F[0][1]=l;break;case f:case u:n=" c ",i=3;var v,_,M=t[a++],A=t[a++],I=t[a++],C=t[a++];r===f?(v=I,_=C,I=(I+2*M)/3,C=(C+2*A)/3,M=(s+2*M)/3,A=(l+2*A)/3):(v=t[a++],_=t[a++]),F[0][0]=M,F[0][1]=A,F[1][0]=I,F[1][1]=C,F[2][0]=v,F[2][1]=_,s=v,l=_;break;case d:var k=0,L=0,P=1,D=1,O=0;e&&(k=e[4],L=e[5],P=m(e[0]*e[0]+e[1]*e[1]),D=m(e[2]*e[2]+e[3]*e[3]),O=Math.atan2(-e[1]/D,e[0]/P));var z=t[a++],E=t[a++],N=t[a++],R=t[a++],B=t[a++]+O,V=t[a++]+B+O;a++;var G=t[a++],H=z+y(B)*N,W=E+x(B)*R,M=z+y(V)*N,A=E+x(V)*R,Z=G?" wa ":" at ";Math.abs(H-M)<1e-4&&(Math.abs(V-B)>.01?G&&(H+=270/S):Math.abs(W-E)<1e-4?G&&H<z||!G&&H>z?A-=270/S:A+=270/S:G&&W<E||!G&&W>E?M+=270/S:M-=270/S),p.push(Z,g(((z-N)*P+k)*S-T),w,g(((E-R)*D+L)*S-T),w,g(((z+N)*P+k)*S-T),w,g(((E+R)*D+L)*S-T),w,g((H*P+k)*S-T),w,g((W*D+L)*S-T),w,g((M*P+k)*S-T),w,g((A*D+L)*S-T)),s=M,l=A;break;case o.R:var q=F[0],j=F[1];q[0]=t[a++],q[1]=t[a++],j[0]=q[0]+t[a++],j[1]=q[1]+t[a++],e&&(b(q,q,e),b(j,j,e)),q[0]=g(q[0]*S-T),j[0]=g(j[0]*S-T),q[1]=g(q[1]*S-T),j[1]=g(j[1]*S-T),p.push(" m ",q[0],w,q[1]," l ",j[0],w,q[1]," l ",j[0],w,j[1]," l ",q[0],w,j[1]);break;case o.Z:p.push(" x ")}if(i>0){p.push(n);for(var U=0;U<i;U++){var X=F[U];e&&b(X,X,e),p.push(g(X[0]*S-T),w,g(X[1]*S-T),U<i-1?w:"")}}}return p.join("")};d.prototype.brushVML=function(t){var e=this.style,i=this._vmlEl;i||(i=p.createNode("shape"),C(i),this._vmlEl=i),V(i,"fill",e,this),V(i,"stroke",e,this);var n=this.transform,r=null!=n,o=i.getElementsByTagName("stroke")[0];if(o){var a=e.lineWidth;if(r&&!e.strokeNoScale){var s=n[0]*n[3]-n[1]*n[2];a*=m(v(s))}o.weight=a+"px"}var l=this.path;this.__dirtyPath&&(l.beginPath(),this.buildPath(l,this.shape),l.toStatic(),this.__dirtyPath=!1),i.path=G(l.data,this.transform),i.style.zIndex=O(this.zlevel,this.z,this.z2),P(t,i),null!=e.text?this.drawRectText(t,this.getBoundingRect()):this.removeRectText(t)},d.prototype.onRemove=function(t){D(t,this._vmlEl),this.removeRectText(t)},d.prototype.onAdd=function(t){P(t,this._vmlEl),this.appendRectText(t)};var H=function(t){return"object"==typeof t&&t.tagName&&"IMG"===t.tagName.toUpperCase()};u.prototype.brushVML=function(t){var e,i,n=this.style,r=n.image;if(H(r)){var o=r.src;if(o===this._imageSrc)e=this._imageWidth,i=this._imageHeight;else{var a=r.runtimeStyle,s=a.width,l=a.height;a.width="auto",a.height="auto",e=r.width,i=r.height,a.width=s,a.height=l,this._imageSrc=o,this._imageWidth=e,this._imageHeight=i}r=o}else r===this._imageSrc&&(e=this._imageWidth,i=this._imageHeight);if(r){var h=n.x||0,u=n.y||0,c=n.width,d=n.height,f=n.sWidth,v=n.sHeight,y=n.sx||0,x=n.sy||0,S=f&&v,T=this._vmlEl;T||(T=p.doc.createElement("div"),C(T),this._vmlEl=T);var A,I=T.style,k=!1,L=1,D=1;if(this.transform&&(A=this.transform,L=m(A[0]*A[0]+A[1]*A[1]),D=m(A[2]*A[2]+A[3]*A[3]),k=A[1]||A[2]),k){var z=[h,u],E=[h+c,u],N=[h,u+d],R=[h+c,u+d];b(z,z,A),b(E,E,A),b(N,N,A),b(R,R,A);var B=_(z[0],E[0],N[0],R[0]),V=_(z[1],E[1],N[1],R[1]),F=[];F.push("M11=",A[0]/L,w,"M12=",A[2]/D,w,"M21=",A[1]/L,w,"M22=",A[3]/D,w,"Dx=",g(h*L+A[4]),w,"Dy=",g(u*D+A[5])),I.padding="0 "+g(B)+"px "+g(V)+"px 0",I.filter=M+".Matrix("+F.join("")+", SizingMethod=clip)"}else A&&(h=h*L+A[4],u=u*D+A[5]),I.filter="",I.left=g(h)+"px",I.top=g(u)+"px";var G=this._imageEl,W=this._cropEl;G||(G=p.doc.createElement("div"),this._imageEl=G);var Z=G.style;if(S){if(e&&i)Z.width=g(L*e*c/f)+"px",Z.height=g(D*i*d/v)+"px";else{var q=new Image,j=this;q.onload=function(){q.onload=null,e=q.width,i=q.height,Z.width=g(L*e*c/f)+"px",Z.height=g(D*i*d/v)+"px",j._imageWidth=e,j._imageHeight=i,j._imageSrc=r},q.src=r}W||(W=p.doc.createElement("div"),W.style.overflow="hidden",this._cropEl=W);var U=W.style;U.width=g((c+y*c/f)*L),U.height=g((d+x*d/v)*D),U.filter=M+".Matrix(Dx="+-y*c/f*L+",Dy="+-x*d/v*D+")",W.parentNode||T.appendChild(W),G.parentNode!=W&&W.appendChild(G)}else Z.width=g(L*c)+"px",Z.height=g(D*d)+"px",T.appendChild(G),W&&W.parentNode&&(T.removeChild(W),this._cropEl=null);var X="",Y=n.opacity;Y<1&&(X+=".Alpha(opacity="+g(100*Y)+") "),X+=M+".AlphaImageLoader(src="+r+", SizingMethod=scale)",Z.filter=X,T.style.zIndex=O(this.zlevel,this.z,this.z2),P(t,T),null!=n.text&&this.drawRectText(t,this.getBoundingRect())}},u.prototype.onRemove=function(t){D(t,this._vmlEl),this._vmlEl=null,this._cropEl=null,this._imageEl=null,this.removeRectText(t)},u.prototype.onAdd=function(t){P(t,this._vmlEl),this.appendRectText(t)};var W,Z="normal",q={},j=0,U=100,X=document.createElement("div"),Y=function(t){var e=q[t];if(!e){j>U&&(j=0,q={});var i,n=X.style;try{n.font=t,i=n.fontFamily.split(",")[0]}catch(r){}e={style:n.fontStyle||Z,variant:n.fontVariant||Z,weight:n.fontWeight||Z,size:0|parseFloat(n.fontSize||12),family:i||"Microsoft YaHei"},q[t]=e,j++}return e};s.measureText=function(t,e){var i=p.doc;W||(W=i.createElement("div"),W.style.cssText="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;",p.doc.body.appendChild(W));try{W.style.font=e}catch(n){}return W.innerHTML="",W.appendChild(i.createTextNode(t)),{width:W.offsetWidth}};for(var $=new r,Q=function(t,e,i,n){var r=this.style,o=r.text;if(null!=o&&(o+=""),o){var a,l,h=r.textAlign,u=Y(r.textFont),c=u.style+" "+u.variant+" "+u.weight+" "+u.size+'px "'+u.family+'"',d=r.textBaseline,f=r.textVerticalAlign;i=i||s.getBoundingRect(o,c,h,d);var m=this.transform;if(m&&!n&&($.copy(e),$.applyTransform(m),e=$),n)a=e.x,l=e.y;else{var v=r.textPosition,y=r.textDistance;if(v instanceof Array)a=e.x+z(v[0],e.width),l=e.y+z(v[1],e.height),h=h||"left",d=d||"top";else{var x=s.adjustTextPositionOnRect(v,e,i,y);a=x.x,l=x.y,h=h||x.textAlign,d=d||x.textBaseline}}if(f){switch(f){case"middle":l-=i.height/2;break;case"bottom":l-=i.height}d="top"}var _=u.size;switch(d){case"hanging":case"top":l+=_/1.75;break;case"middle":break;default:l-=_/2.25}switch(h){case"left":break;case"center":a-=i.width/2;break;case"right":a-=i.width}var M,S,T,A=p.createNode,I=this._textVmlEl;I?(T=I.firstChild,M=T.nextSibling,S=M.nextSibling):(I=A("line"),M=A("path"),S=A("textpath"),T=A("skew"),S.style["v-text-align"]="left",C(I),M.textpathok=!0,S.on=!0,I.from="0 0",I.to="1000 0.05",P(I,T),P(I,M),P(I,S),this._textVmlEl=I);var L=[a,l],D=I.style;m&&n?(b(L,L,m),T.on=!0,T.matrix=m[0].toFixed(3)+w+m[2].toFixed(3)+w+m[1].toFixed(3)+w+m[3].toFixed(3)+",0,0",T.offset=(g(L[0])||0)+","+(g(L[1])||0),T.origin="0 0",D.left="0px",D.top="0px"):(T.on=!1,D.left=g(a)+"px",D.top=g(l)+"px"),S.string=k(o);try{S.style.font=c}catch(E){}V(I,"fill",{fill:n?r.fill:r.textFill,opacity:r.opacity},this),V(I,"stroke",{stroke:n?r.stroke:r.textStroke,opacity:r.opacity,lineDash:r.lineDash},this),I.style.zIndex=O(this.zlevel,this.z,this.z2),P(t,I)}},K=function(t){D(t,this._textVmlEl),this._textVmlEl=null},J=function(t){P(t,this._textVmlEl)},tt=[l,h,u,d,c],et=0;et<tt.length;et++){var it=tt[et].prototype;it.drawRectText=Q,it.removeRectText=K,it.appendRectText=J}c.prototype.brushVML=function(t){var e=this.style;null!=e.text?this.drawRectText(t,{x:e.x||0,y:e.y||0,width:0,height:0},this.getBoundingRect(),!0):this.removeRectText(t)},c.prototype.onRemove=function(t){this.removeRectText(t)},c.prototype.onAdd=function(t){this.appendRectText(t)}}},function(t,e,i){i(221),i(78).registerPainter("vml",i(220))}])}); \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/js/echarts/macarons.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/echarts/macarons.js
new file mode 100644
index 0000000..cc51e00
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/echarts/macarons.js
@@ -0,0 +1,540 @@
+
+(function (root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(['exports', 'echarts'], factory);
+ } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
+ // CommonJS
+ factory(exports, require('echarts'));
+ } else {
+ // Browser globals
+ factory({}, root.echarts);
+ }
+}(this, function (exports, echarts) {
+ var log = function (msg) {
+ if (typeof console !== 'undefined') {
+ console && console.error && console.error(msg);
+ }
+ };
+ if (!echarts) {
+ log('ECharts is not Loaded');
+ return;
+ }
+ echarts.registerTheme('macarons', {
+ "color": [
+ "#2ec7c9",
+ "#b6a2de",
+ "#5ab1ef",
+ "#ffb980",
+ "#d87a80",
+ "#8d98b3",
+ "#e5cf0d",
+ "#97b552",
+ "#95706d",
+ "#dc69aa",
+ "#07a2a4",
+ "#9a7fd1",
+ "#588dd5",
+ "#f5994e",
+ "#c05050",
+ "#59678c",
+ "#c9ab00",
+ "#7eb00a",
+ "#6f5553",
+ "#c14089"
+ ],
+ "backgroundColor": "rgba(0,0,0,0)",
+ "textStyle": {},
+ "title": {
+ "textStyle": {
+ "color": "#008acd"
+ },
+ "subtextStyle": {
+ "color": "#aaaaaa"
+ }
+ },
+ "line": {
+ "itemStyle": {
+ "normal": {
+ "borderWidth": 1
+ }
+ },
+ "lineStyle": {
+ "normal": {
+ "width": 2
+ }
+ },
+ "symbolSize": 3,
+ "symbol": "emptyCircle",
+ "smooth": true
+ },
+ "radar": {
+ "itemStyle": {
+ "normal": {
+ "borderWidth": 1
+ }
+ },
+ "lineStyle": {
+ "normal": {
+ "width": 2
+ }
+ },
+ "symbolSize": 3,
+ "symbol": "emptyCircle",
+ "smooth": true
+ },
+ "bar": {
+ "itemStyle": {
+ "normal": {
+ "barBorderWidth": 0,
+ "barBorderColor": "#ccc"
+ },
+ "emphasis": {
+ "barBorderWidth": 0,
+ "barBorderColor": "#ccc"
+ }
+ }
+ },
+ "pie": {
+ "itemStyle": {
+ "normal": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ },
+ "emphasis": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ }
+ }
+ },
+ "scatter": {
+ "itemStyle": {
+ "normal": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ },
+ "emphasis": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ }
+ }
+ },
+ "boxplot": {
+ "itemStyle": {
+ "normal": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ },
+ "emphasis": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ }
+ }
+ },
+ "parallel": {
+ "itemStyle": {
+ "normal": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ },
+ "emphasis": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ }
+ }
+ },
+ "sankey": {
+ "itemStyle": {
+ "normal": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ },
+ "emphasis": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ }
+ }
+ },
+ "funnel": {
+ "itemStyle": {
+ "normal": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ },
+ "emphasis": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ }
+ }
+ },
+ "gauge": {
+ "itemStyle": {
+ "normal": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ },
+ "emphasis": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ }
+ }
+ },
+ "candlestick": {
+ "itemStyle": {
+ "normal": {
+ "color": "#d87a80",
+ "color0": "#2ec7c9",
+ "borderColor": "#d87a80",
+ "borderColor0": "#2ec7c9",
+ "borderWidth": 1
+ }
+ }
+ },
+ "graph": {
+ "itemStyle": {
+ "normal": {
+ "borderWidth": 0,
+ "borderColor": "#ccc"
+ }
+ },
+ "lineStyle": {
+ "normal": {
+ "width": 1,
+ "color": "#aaaaaa"
+ }
+ },
+ "symbolSize": 3,
+ "symbol": "emptyCircle",
+ "smooth": true,
+ "color": [
+ "#2ec7c9",
+ "#b6a2de",
+ "#5ab1ef",
+ "#ffb980",
+ "#d87a80",
+ "#8d98b3",
+ "#e5cf0d",
+ "#97b552",
+ "#95706d",
+ "#dc69aa",
+ "#07a2a4",
+ "#9a7fd1",
+ "#588dd5",
+ "#f5994e",
+ "#c05050",
+ "#59678c",
+ "#c9ab00",
+ "#7eb00a",
+ "#6f5553",
+ "#c14089"
+ ],
+ "label": {
+ "normal": {
+ "textStyle": {
+ "color": "#eeeeee"
+ }
+ }
+ }
+ },
+ "map": {
+ "itemStyle": {
+ "normal": {
+ "areaColor": "#dddddd",
+ "borderColor": "#eeeeee",
+ "borderWidth": 0.5
+ },
+ "emphasis": {
+ "areaColor": "rgba(254,153,78,1)",
+ "borderColor": "#444444",
+ "borderWidth": 1
+ }
+ },
+ "label": {
+ "normal": {
+ "textStyle": {
+ "color": "#d87a80"
+ }
+ },
+ "emphasis": {
+ "textStyle": {
+ "color": "rgb(100,0,0)"
+ }
+ }
+ }
+ },
+ "geo": {
+ "itemStyle": {
+ "normal": {
+ "areaColor": "#dddddd",
+ "borderColor": "#eeeeee",
+ "borderWidth": 0.5
+ },
+ "emphasis": {
+ "areaColor": "rgba(254,153,78,1)",
+ "borderColor": "#444444",
+ "borderWidth": 1
+ }
+ },
+ "label": {
+ "normal": {
+ "textStyle": {
+ "color": "#d87a80"
+ }
+ },
+ "emphasis": {
+ "textStyle": {
+ "color": "rgb(100,0,0)"
+ }
+ }
+ }
+ },
+ "categoryAxis": {
+ "axisLine": {
+ "show": true,
+ "lineStyle": {
+ "color": "#008acd"
+ }
+ },
+ "axisTick": {
+ "show": true,
+ "lineStyle": {
+ "color": "#333"
+ }
+ },
+ "axisLabel": {
+ "show": true,
+ "textStyle": {
+ "color": "#333"
+ }
+ },
+ "splitLine": {
+ "show": false,
+ "lineStyle": {
+ "color": [
+ "#eee"
+ ]
+ }
+ },
+ "splitArea": {
+ "show": false,
+ "areaStyle": {
+ "color": [
+ "rgba(250,250,250,0.3)",
+ "rgba(200,200,200,0.3)"
+ ]
+ }
+ }
+ },
+ "valueAxis": {
+ "axisLine": {
+ "show": true,
+ "lineStyle": {
+ "color": "#008acd"
+ }
+ },
+ "axisTick": {
+ "show": true,
+ "lineStyle": {
+ "color": "#333"
+ }
+ },
+ "axisLabel": {
+ "show": true,
+ "textStyle": {
+ "color": "#333"
+ }
+ },
+ "splitLine": {
+ "show": true,
+ "lineStyle": {
+ "color": [
+ "#eee"
+ ]
+ }
+ },
+ "splitArea": {
+ "show": true,
+ "areaStyle": {
+ "color": [
+ "rgba(250,250,250,0.3)",
+ "rgba(200,200,200,0.3)"
+ ]
+ }
+ }
+ },
+ "logAxis": {
+ "axisLine": {
+ "show": true,
+ "lineStyle": {
+ "color": "#008acd"
+ }
+ },
+ "axisTick": {
+ "show": true,
+ "lineStyle": {
+ "color": "#333"
+ }
+ },
+ "axisLabel": {
+ "show": true,
+ "textStyle": {
+ "color": "#333"
+ }
+ },
+ "splitLine": {
+ "show": true,
+ "lineStyle": {
+ "color": [
+ "#eee"
+ ]
+ }
+ },
+ "splitArea": {
+ "show": true,
+ "areaStyle": {
+ "color": [
+ "rgba(250,250,250,0.3)",
+ "rgba(200,200,200,0.3)"
+ ]
+ }
+ }
+ },
+ "timeAxis": {
+ "axisLine": {
+ "show": true,
+ "lineStyle": {
+ "color": "#008acd"
+ }
+ },
+ "axisTick": {
+ "show": true,
+ "lineStyle": {
+ "color": "#333"
+ }
+ },
+ "axisLabel": {
+ "show": true,
+ "textStyle": {
+ "color": "#333"
+ }
+ },
+ "splitLine": {
+ "show": true,
+ "lineStyle": {
+ "color": [
+ "#eee"
+ ]
+ }
+ },
+ "splitArea": {
+ "show": false,
+ "areaStyle": {
+ "color": [
+ "rgba(250,250,250,0.3)",
+ "rgba(200,200,200,0.3)"
+ ]
+ }
+ }
+ },
+ "toolbox": {
+ "iconStyle": {
+ "normal": {
+ "borderColor": "#2ec7c9"
+ },
+ "emphasis": {
+ "borderColor": "#18a4a6"
+ }
+ }
+ },
+ "legend": {
+ "textStyle": {
+ "color": "#333333"
+ }
+ },
+ "tooltip": {
+ "axisPointer": {
+ "lineStyle": {
+ "color": "#008acd",
+ "width": "1"
+ },
+ "crossStyle": {
+ "color": "#008acd",
+ "width": "1"
+ }
+ }
+ },
+ "timeline": {
+ "lineStyle": {
+ "color": "#008acd",
+ "width": 1
+ },
+ "itemStyle": {
+ "normal": {
+ "color": "#008acd",
+ "borderWidth": 1
+ },
+ "emphasis": {
+ "color": "#a9334c"
+ }
+ },
+ "controlStyle": {
+ "normal": {
+ "color": "#008acd",
+ "borderColor": "#008acd",
+ "borderWidth": 0.5
+ },
+ "emphasis": {
+ "color": "#008acd",
+ "borderColor": "#008acd",
+ "borderWidth": 0.5
+ }
+ },
+ "checkpointStyle": {
+ "color": "#2ec7c9",
+ "borderColor": "rgba(46,199,201,0.4)"
+ },
+ "label": {
+ "normal": {
+ "textStyle": {
+ "color": "#008acd"
+ }
+ },
+ "emphasis": {
+ "textStyle": {
+ "color": "#008acd"
+ }
+ }
+ }
+ },
+ "visualMap": {
+ "color": [
+ "#5ab1ef",
+ "#e0ffff"
+ ]
+ },
+ "dataZoom": {
+ "backgroundColor": "rgba(47,69,84,0)",
+ "dataBackgroundColor": "rgba(239,239,255,1)",
+ "fillerColor": "rgba(182,162,222,0.2)",
+ "handleColor": "#008acd",
+ "handleSize": "100%",
+ "textStyle": {
+ "color": "#333333"
+ }
+ },
+ "markPoint": {
+ "label": {
+ "normal": {
+ "textStyle": {
+ "color": "#eeeeee"
+ }
+ },
+ "emphasis": {
+ "textStyle": {
+ "color": "#eeeeee"
+ }
+ }
+ }
+ }
+ });
+}));
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/css/font-awesome.css b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css
index 880eb82..880eb82 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/css/font-awesome.css
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/css/font-awesome.css.map b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css.map
index 60763a8..60763a8 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/css/font-awesome.css.map
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css.map
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/css/font-awesome.min.css b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.min.css
index 28431ad..ee4e978 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/css/font-awesome.min.css
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.min.css
@@ -1 +1,4 @@
+/*!
+ * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/FontAwesome.otf b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/FontAwesome.otf
index 681bdd4..681bdd4 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/FontAwesome.otf
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/FontAwesome.otf
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.eot b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.eot
index a30335d..a30335d 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.eot
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.eot
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.svg b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.svg
index 6fd19ab..6fd19ab 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.svg
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.svg
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.ttf b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.ttf
index d7994e1..d7994e1 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.ttf
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.ttf
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.woff b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff
index 6fd4ede..6fd4ede 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.woff
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.woff2 b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff2
index 5560193..5560193 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/fonts/fontawesome-webfont.woff2
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff2
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/animated.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/animated.less
index 66ad52a..66ad52a 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/animated.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/animated.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/bordered-pulled.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/bordered-pulled.less
index f1c8ad7..f1c8ad7 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/bordered-pulled.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/bordered-pulled.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/core.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/core.less
index c577ac8..c577ac8 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/core.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/core.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/fixed-width.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/fixed-width.less
index 110289f..110289f 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/fixed-width.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/fixed-width.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/font-awesome.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/font-awesome.less
index e3f89c8..e3f89c8 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/font-awesome.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/font-awesome.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/icons.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/icons.less
index 6ebe966..6ebe966 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/icons.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/icons.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/larger.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/larger.less
index c9d6467..c9d6467 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/larger.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/larger.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/list.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/list.less
index 0b44038..0b44038 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/list.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/list.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/mixins.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/mixins.less
index d5a43a1..d5a43a1 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/mixins.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/mixins.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/path.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/path.less
index 9211e66..9211e66 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/path.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/path.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/rotated-flipped.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/rotated-flipped.less
index f6ba814..f6ba814 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/rotated-flipped.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/rotated-flipped.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/stacked.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/stacked.less
index fc53fb0..fc53fb0 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/stacked.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/stacked.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/variables.less b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/variables.less
index 00418e7..00418e7 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/less/variables.less
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/variables.less
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_animated.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_animated.scss
index 8a020db..8a020db 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_animated.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_animated.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_bordered-pulled.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_bordered-pulled.scss
index d4b85a0..d4b85a0 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_bordered-pulled.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_bordered-pulled.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_core.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_core.scss
index 7425ef8..7425ef8 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_core.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_core.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_fixed-width.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_fixed-width.scss
index b221c98..b221c98 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_fixed-width.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_fixed-width.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_icons.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_icons.scss
index 62d9767..62d9767 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_icons.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_icons.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_larger.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_larger.scss
index 41e9a81..41e9a81 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_larger.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_larger.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_list.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_list.scss
index 7d1e4d5..7d1e4d5 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_list.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_list.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_mixins.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_mixins.scss
index f96719b..f96719b 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_mixins.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_mixins.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_path.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_path.scss
index bb457c2..bb457c2 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_path.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_path.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_rotated-flipped.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_rotated-flipped.scss
index a3558fd..a3558fd 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_rotated-flipped.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_rotated-flipped.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_stacked.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_stacked.scss
index aef7403..aef7403 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_stacked.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_stacked.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_variables.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_variables.scss
index c10cd47..c10cd47 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/_variables.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_variables.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/font-awesome.scss b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/font-awesome.scss
index ebd9646..ebd9646 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/fontAwesome/scss/font-awesome.scss
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/font-awesome.scss
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.contentWindow.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.contentWindow.min.js
index 9330e0f..9330e0f 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.contentWindow.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.contentWindow.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.min.js
index e8f4bcb..e8f4bcb 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/iframeResizer/iframeResizer.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.js
index 5288bf3..7491439 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.js
@@ -1,20 +1,10 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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
+/*!
+ * jQuery Validation Plugin v1.13.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.
+ * http://jqueryvalidation.org/
*
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
+ * Copyright (c) 2014 Jörn Zaefferer
+ * Released under the MIT license
*/
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.min.js
index 841358f..841358f 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/additional-methods.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.js
index 3b6c812..3b6c812 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.min.js
index 5264617..5264617 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/jquery.validate.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.js
index 09715fe..e609dbb 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.js
@@ -1,4 +1,3 @@
-
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.min.js
index 01a3200..01a3200 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ar.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.js
index e631723..fea21cf 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.min.js
index 9a6a316..9a6a316 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_bg.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.js
index 347cfba..0b308e1 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.min.js
index 9e94f4f..9e94f4f 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ca.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.js
index 2fd84c6..6c27e2b 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.min.js
index 586c7d5..586c7d5 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_cs.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.js
index 387ff01..e862aba 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.min.js
index 3663bd6..3663bd6 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_da.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.js
index 9379fa9..7f5bc8f 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.min.js
index d9c8d97..d9c8d97 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_de.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.js
index aa72674..5758f56 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.min.js
index b8f91d1..b8f91d1 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_el.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.js
index 715b484..bf37c17 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.min.js
index a248f1a..a248f1a 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.js
index fcee4fd..c7279e4 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.min.js
index 18e663c..18e663c 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_es_AR.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.js
index 5e51364..0dd93cd 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.min.js
index 54a8c5d..54a8c5d 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_et.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.js
index 24578b2..a9b0777 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.min.js
index caa3bb6..caa3bb6 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_eu.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.js
index 0fb97a3..eb7d336 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.min.js
index 94e151c..94e151c 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fa.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.js
index e49c4f9..1486128 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.min.js
index 7cf0e97..7cf0e97 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fi.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.js
index 0f35785..d465538 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.min.js
index 065760f..065760f 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_fr.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.js
index d3e6bd6..a36f609 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.min.js
index 1a77f40..1a77f40 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_gl.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.js
index 27a4742..b50beb0 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.min.js
index e0e8001..e0e8001 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_he.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.js
index 7e8f665..792ac44 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.min.js
index 184fe8a..184fe8a 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hr.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.js
index d71dbdf..735bc3b 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.min.js
index 55e615e..55e615e 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_hu.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.js
index d2f0391..48f7b9a 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.min.js
index 5096c8d..5096c8d 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_id.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.js
index fc1ce55..00948d4 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.min.js
index bbd362e..bbd362e 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_is.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.js
index 8194d9d..7fbee3b 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.min.js
index 03e4bda..03e4bda 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_it.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.js
index 281de3c..3eed43d 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.min.js
index f0c70cf..f0c70cf 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ja.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.js
index 8d61fb9..494ec91 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.min.js
index fdfe441..fdfe441 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ka.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.js
index 8ec07ab..17c8b83 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.min.js
index 2a9a5cf..2a9a5cf 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_kk.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.js
index 23efa22..f6b5355 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.min.js
index 9d4de3b..9d4de3b 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ko.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.js
index 051a44c..df17a1e 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.min.js
index 2a20cf4..2a20cf4 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lt.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.js
index f7d0e8a..ade1b88 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.min.js
index ce98a33..ce98a33 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_lv.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.js
index 4f18499..9de974a 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.min.js
index 44566bf..44566bf 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_my.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.js
index 8232517..cdba381 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.min.js
index 5eb962d..5eb962d 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_nl.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.js
index a9700b2..308b715 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.min.js
index f671f55..f671f55 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_no.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.js
index 841a1cf..453ba77 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.min.js
index 4e68c93..4e68c93 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pl.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.js
index b4594ec..71b1ef8 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.min.js
index 899d36e..899d36e 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_BR.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.js
index 25b2398..4c2a782 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.min.js
index 3e748a4..3e748a4 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_pt_PT.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.js
index bde95ad..be77eab 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.min.js
index 9ac878e..9ac878e 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ro.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.js
index 747c2a6..896827b 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.min.js
index 47e5871..47e5871 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_ru.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.js
index ac37c75..8e04a9d 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.min.js
index da43656..da43656 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_si.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.js
index 5ab253a..cf3680e 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.min.js
index 8caaf0c..8caaf0c 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sk.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.js
index c5a3c69..6eb9e0b 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.min.js
index c32891f..c32891f 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sl.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.js
index c360e43..e268be8 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.min.js
index cbdff67..cbdff67 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.js
index edfe3ce..3c14afc 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.min.js
index 4d525c2..4d525c2 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sr_lat.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.js
index cddf20d..758c8a7 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.min.js
index 625fd19..625fd19 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_sv.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.js
index 73e3f9e..e354e50 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.min.js
index 64de749..64de749 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_th.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.js
index db2a3dd..67e1e2c 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.min.js
index 89d15e1..89d15e1 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tj.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.js
index b873bc3..1d4c55e 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.min.js
index bfadcb9..bfadcb9 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_tr.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.js
index 678fe80..ecb855c 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.min.js
index 17708d5..17708d5 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_uk.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.js
index 2c62ad0..f37b00e 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.min.js
index bf7d4d4..bf7d4d4 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_vi.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.js
index 45f7b25..a4e121c 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.min.js
index 3f78784..3f78784 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.js
index 35b37d6..fc86be3 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.js
@@ -1,21 +1,3 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
define( ["jquery", "../jquery.validate"], factory );
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.min.js
index 0f1ef48..0f1ef48 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/messages_zh_TW.min.js
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.js
new file mode 100644
index 0000000..470133e
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.js
@@ -0,0 +1,22 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: DE
+ */
+$.extend($.validator.methods, {
+ date: function(value, element) {
+ return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value);
+ },
+ number: function(value, element) {
+ return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
+ }
+});
+
+})); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.min.js
index d3ac2ef..d3ac2ef 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.min.js
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.js
new file mode 100644
index 0000000..16446e4
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.js
@@ -0,0 +1,22 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: ES_CL
+ */
+$.extend($.validator.methods, {
+ date: function(value, element) {
+ return this.optional(element) || /^\d\d?\-\d\d?\-\d\d\d?\d?$/.test(value);
+ },
+ number: function(value, element) {
+ return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
+ }
+});
+
+})); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.min.js
index 63b83b5..63b83b5 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.min.js
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.js
new file mode 100644
index 0000000..44b3e36
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.js
@@ -0,0 +1,22 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: FI
+ */
+$.extend($.validator.methods, {
+ date: function(value, element) {
+ return this.optional(element) || /^\d{1,2}\.\d{1,2}\.\d{4}$/.test(value);
+ },
+ number: function(value, element) {
+ return this.optional(element) || /^-?(?:\d+)(?:,\d+)?$/.test(value);
+ }
+});
+
+})); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.min.js
index 39e9dd4..39e9dd4 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.min.js
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.js
new file mode 100644
index 0000000..91e0d8c
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.js
@@ -0,0 +1,19 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: NL
+ */
+$.extend($.validator.methods, {
+ date: function(value, element) {
+ return this.optional(element) || /^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test(value);
+ }
+});
+
+})); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.min.js
index 52c9893..52c9893 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.min.js
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.js
new file mode 100644
index 0000000..d06ccec
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.js
@@ -0,0 +1,19 @@
+(function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+ define( ["jquery", "../jquery.validate"], factory );
+ } else {
+ factory( jQuery );
+ }
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: PT_BR
+ */
+$.extend($.validator.methods, {
+ date: function(value, element) {
+ return this.optional(element) || /^\d\d?\/\d\d?\/\d\d\d?\d?$/.test(value);
+ }
+});
+
+})); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.min.js
index 2ad410e..2ad410e 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery.i18n/jquery.i18n.properties-1.0.9.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery.i18n/jquery.i18n.properties-1.0.9.js
index 00482d7..5f9b195 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery.i18n/jquery.i18n.properties-1.0.9.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery.i18n/jquery.i18n.properties-1.0.9.js
@@ -1,4 +1,3 @@
-
/******************************************************************************
* jquery.i18n.properties
*
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/jquery/jquery-1.10.2.min.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery/jquery-1.10.2.min.js
index 73f33fb..73f33fb 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/jquery/jquery-1.10.2.min.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery/jquery-1.10.2.min.js
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/routeController.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/routeController.js
index 193ce45..4424865 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/routeController.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/routeController.js
@@ -1,1826 +1,1945 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-var table;
-var vm = avalon
- .define({
- $id : "routeController",
- targetServiceUrl:"",
- targetFullServiceUrl:"",
- iuiRootPath:iuiRootPath,
- apiRootPath:apiRootPath,
- apiIframeUrl:"",
- iuiIframeUrl:"",
- boxVisible:true,
- routeTargetTitle:$.i18n.prop("org_openo_msb_route_content_title"),
- server_rtn:{
- info_block:false,
- warning_block:false,
- rtn_info:""
- },
- showAPIType:"0",
- showAPITypeName:[$.i18n.prop("org_openo_msb_route_swagger_type_predefined"),$.i18n.prop("org_openo_msb_route_swagger_type_custominput")],
- $msbProtocol :["REST","UI","HTTP","MQ","FTP","SNMP","TCP","UDP"],
- $msbType:["UI","NAF","SAF"],
- apiJson:{
- local:"",
- custom:""
- },
- setAPIType:function(type){
- vm.apiRouteInfo.apiJsonType=type;
- if(type==0){
- vm.apiJson.local=vm.jsonApiSelectList.selectItems[0];
- }
-
- },
- jsonApiSelectList: {
- condName : "type",
- component_type : 'select',
- selectItems : []
- },
-
- dataTableLanguage: {
- "sProcessing": "<img src='../img/loading-spinner-grey.gif'/><span>&nbsp;&nbsp;Loadding...</span>",
- "sLengthMenu": $.i18n.prop("org_openo_msb_route-table-sLengthMenu"),
- "sZeroRecords": $.i18n.prop("org_openo_msb_route-table-sZeroRecords"),
- "sInfo": "<span class='seperator'> </span>" + $.i18n.prop("org_openo_msb_route-table-sInfo"),
- "sInfoEmpty": $.i18n.prop("org_openo_msb_route-table-sInfoEmpty"),
- "sGroupActions": $.i18n.prop("org_openo_msb_route-table-sGroupActions"),
- "sAjaxRequestGeneralError": $.i18n.prop("org_openo_msb_route-table-sAjaxRequestGeneralError"),
- "sEmptyTable": $.i18n.prop("org_openo_msb_route-table-sEmptyTable"),
- "oPaginate": {
- "sPrevious": $.i18n.prop("org_openo_msb_route-table-sPrevious"),
- "sNext": $.i18n.prop("org_openo_msb_route-table-sNext"),
- "sPage": $.i18n.prop("org_openo_msb_route-table-sPage"),
- "sPageOf": $.i18n.prop("org_openo_msb_route-table-sPageOf")
- },
- "sSearch": $.i18n.prop("org_openo_msb_route-table-search"),
- "sInfoFiltered": $.i18n.prop("org_openo_msb_route-table-infofilter")
- },
- $apiRouteUrl :apiBasePath+'/apiRoute',
- $apiRouteInstanceUrl :apiBasePath+'/apiRoute/{serviceName}/version/{version}',
- $apiRouteStatusUrl :apiBasePath+'/apiRoute/{serviceName}/version/{version}/status/{status}',
- $apiDocsUrl :apiBasePath+'/apiRoute/apiDocs',
- $apiGatewayPortUrl :apiBasePath+'/apiRoute/apiGatewayPort',
- $discoverInfoUrl :apiBasePath+'/apiRoute/discoverInfo',
- $iuiRouteUrl :apiBasePath+'/iuiRoute',
- $iuiRouteInstanceUrl :apiBasePath+'/iuiRoute/{serviceName}',
- $iuiRouteStatusUrl :apiBasePath+'/iuiRoute/{serviceName}/status/{status}',
- $customRouteUrl :apiBasePath+'/customRoute/all',
- $customRouteInstanceUrl :apiBasePath+'/customRoute/instance',
- $customRouteStatusUrl :apiBasePath+'/customRoute/status',
- $msbRouteUrl:apiBasePath+'/services',
- $msbRouteInstanceUrl :apiBasePath+'/services/{serviceName}/version/{version}',
- routeLoading:false,
- apiRouteArray : [],
- apiRouteInfo : {
- oldServiceName:"",
- serviceName : "",
- oldVersion:"",
- version : "",
- status:"",
- url:"",
- metricsUrl:"/admin/metrics",
- apiJson:"/swagger.json",
- apiJsonType:"1",
- control:"",
- server:"",
- servers: []
- },
- iuiRouteArray : [],
- iuiRouteInfo : {
- oldServiceName:"",
- serviceName : "",
- status:"",
- url:"",
- server:"",
- control:"",
- servers: []
- },
- customRouteArray : [],
- customGroupRouteArray : [],
- customRouteInfo : {
- oldServiceName:"",
- serviceName : "",
- status:"",
- url:"",
- server:"",
- control:"",
- servers: []
- },
- msbRouteArray : [],
- msbRouteInfo : {
- oldServiceName:"",
- oldVersion:"",
- serviceName : "",
- version:"",
- status:"0",
- nodes:[],
- newHost:"",
- newttl:0,
- url:"",
- protocol:"",
- visualRange:"",
- visualRangeArray:[]
- },
- discoverInfo:{
- ip:"",
- port:"",
- enabled:false,
- deployMode:""
- },
- selectedRoute:"",
- selectedRouteType:"",
- routeDlgInfo:{
- titleName:"",
- saveType:""
- },
- $initRoute : function() {
-
-
-
- vm.routeLoading=true;
-
- $.ajax({
- "type": 'get',
- async: false,
- "url": vm.$discoverInfoUrl,
- "dataType": "json",
- success: function (resp) {
-
- vm.discoverInfo = (resp==null)?"":resp;
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
- bootbox.alert("get discoverInfo fails:"+textStatus+":"+errorThrown);
- }
- });
-
- $.ajax({
- "type": 'get',
- "url": vm.$apiRouteUrl,
- "dataType": "json",
- success: function (resp) {
- vm.apiRouteArray = (resp==null)?[]:resp;
- vm.apiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
- bootbox.alert("get api services fails:"+textStatus+":"+errorThrown);
- return;
- },
- complete:function(){
- vm.routeLoading=false;
- routeUtil.refreshRoute();
- $.ajax({
- "type": 'get',
- "url": vm.$apiGatewayPortUrl,
- "dataType": "text",
- success: function (resp) {
-
- vm.targetServiceUrl=location.hostname+":"+resp;
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
- bootbox.alert("get apiGateway published port fails:"+textStatus+":"+errorThrown);
- }
- });
- }
- });
-
-
-
- $.ajax({
- "type": 'get',
- "url": vm.$iuiRouteUrl,
- "dataType": "json",
- success: function (resp) {
- vm.iuiRouteArray = (resp==null)?[]:resp;
- vm.iuiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
- bootbox.alert("get iui services fails:"+textStatus+":"+errorThrown);
- return;
- },
- complete:function(){
- routeUtil.refreshRoute();
- }
- });
-
-
-
- $.ajax({
- "type": 'get',
- "url": vm.$customRouteUrl,
- "dataType": "json",
- success: function (resp) {
- vm.customRouteArray = (resp==null)?[]:resp;
-
- if(resp!=null && resp.length>0)
- {
- routeUtil.groupRoute(resp);
- }
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
- bootbox.alert("get custom services fails:"+textStatus+":"+errorThrown);
- return;
- },
- complete:function(){
- routeUtil.refreshRoute();
- }
- });
-
-
- $.ajax({
- "type": 'get',
- "url": vm.$apiDocsUrl,
- "dataType": "json",
- success: function (resp) {
- vm.jsonApiSelectList.selectItems= (resp==null)?[]:resp;
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
- bootbox.alert("get local apiDocs fails:"+textStatus+":"+errorThrown);
- }
- });
-
-
-
- vm.initMSBRoute();
-
-
-
-
- },
- initMSBRoute:function(){
- vm.initIUIfori18n();
-
- $.ajax({
- "type": 'get',
- "url": vm.$msbRouteUrl,
- "dataType": "json",
- success: function (resp) {
- vm.msbRouteArray = (resp==null)?[]:resp;
-
- vm.msbRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
- bootbox.alert("get msb services fails:"+XMLHttpRequest.responseText);
- return;
- },
- complete:function(){
-
- table=$('#msbTable').DataTable({
-
- "oLanguage": vm.dataTableLanguage,
- columnDefs: [ {
- targets: [ 0,8 ],
- "searchable": false,
- "bSortable": false,
- }],
- "order": [[2, 'asc']]
- });
-
- }
- });
-
-
- },
-
- clickDisplayGraphAlink: function () {
- vm.boxVisible = !vm.boxVisible;
- },
- addmsbHost:function(){
- if(vm.msbRouteInfo.newHost==""){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_empty");
- return;
- }
-
- if(vm.msbRouteInfo.newttl==""){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_ttl_empty");
- return;
- }
-
- var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/
- var ip,port;
- if(!reg.test(vm.msbRouteInfo.newHost)){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_format");
- return;
- }
- else{
-
- var hosts=vm.msbRouteInfo.newHost.split(":");
- ip=hosts[0];
- port=hosts[1];
- }
-
- var reg_ttl=/^\d+$/
-
- if(!reg_ttl.test(vm.msbRouteInfo.newttl)){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_ttl_format");
- return;
- }
-
-
-
- // determine whether host repeated
- for(var i=0;i<vm.msbRouteInfo.nodes.length;i++){
-
- if(vm.msbRouteInfo.nodes[i].ip==ip && vm.msbRouteInfo.nodes[i].port==port )
- {
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_repeat',[vm.msbRouteInfo.newHost]);
- return;
- }
-
- }
-
- vm.msbRouteInfo.nodes.push({"ip":ip,"port":port,"ttl":vm.msbRouteInfo.newttl});
- vm.msbRouteInfo.newHost="";
- vm.msbRouteInfo.newttl="";
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= "";
-
-
- },
- delmsbHost:function(ip,port){
-
- bootbox.confirm( $.i18n.prop('org_openo_msb_route_err_host_del',[ip],[port]),function(result){
- if(result){
-
- for(var i=0;i<vm.msbRouteInfo.nodes.length;i++){
- if(vm.msbRouteInfo.nodes[i].ip == ip && vm.msbRouteInfo.nodes[i].port == port){
- vm.msbRouteInfo.nodes.splice(i, 1);
- break;
- }
- }
-
- }
-
- });
-
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= "";
-
- },
- addapiHost:function(){
- if(vm.apiRouteInfo.server==""){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_empty");
- return;
- }
-
- var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/
- var ip,port;
- if(!reg.test(vm.apiRouteInfo.server)){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_format");
- return;
- }
- else{
- var hosts=vm.apiRouteInfo.server.split(":")
- ip=hosts[0];
- port=hosts[1];
- }
-
- // determine whether host repeated
- for(var i=0;i<vm.apiRouteInfo.servers.length;i++){
-
- if(vm.apiRouteInfo.servers[i].ip==ip && vm.apiRouteInfo.servers[i].port==port)
- {
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_repeat',[vm.apiRouteInfo.server]);
- return;
- }
-
- }
- var server={ip:ip,port:port,weight: 0};
- vm.apiRouteInfo.servers.push(server);
- vm.apiRouteInfo.server="";
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= "";
-
-
- },
- delapiHost:function(ip,port){
-
- bootbox.confirm( $.i18n.prop('org_openo_msb_route_err_host_del',[ip],[port]),function(result){
- if(result){
-
- for(var i=0;i<vm.apiRouteInfo.servers.length;i++){
- if(vm.apiRouteInfo.servers[i].ip == ip && vm.apiRouteInfo.servers[i].port == port ){
- vm.apiRouteInfo.servers.splice(i, 1);
- break;
- }
- }
-
- }
-
- });
-
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= "";
-
- },
- addcustomHost:function(){
- if(vm.customRouteInfo.server==""){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_empty");
- return;
- }
-
- var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/
- var ip,port;
- if(!reg.test(vm.customRouteInfo.server)){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_format");
- return;
- }
- else{
- var hosts=vm.customRouteInfo.server.split(":")
- ip=hosts[0];
- port=hosts[1];
- }
-
- //判断host是å¦é‡å¤
- for(var i=0;i<vm.customRouteInfo.servers.length;i++){
-
- if(vm.customRouteInfo.servers[i].ip==ip && vm.customRouteInfo.servers[i].port==port)
- {
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_repeat',[vm.apiRouteInfo.server]);
- return;
- }
-
- }
- var server={ip:ip,port:port,weight: 0};
- vm.customRouteInfo.servers.push(server);
- vm.customRouteInfo.server="";
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= "";
-
-
- },
- delcustomHost:function(ip,port){
-
- bootbox.confirm( $.i18n.prop('org_openo_msb_route_err_host_del',[ip],[port]),function(result){
- if(result){
-
- for(var i=0;i<vm.customRouteInfo.servers.length;i++){
- if(vm.customRouteInfo.servers[i].ip == ip && vm.customRouteInfo.servers[i].port == port ){
- vm.customRouteInfo.servers.splice(i, 1);
- break;
- }
- }
-
- }
-
- });
-
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= "";
-
- },
- addiuiHost:function(){
- if(vm.iuiRouteInfo.server==""){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_empty");
- return;
- }
-
- var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/
- var ip,port;
- if(!reg.test(vm.iuiRouteInfo.server)){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop("org_openo_msb_route_err_host_format");
- return;
- }
- else{
- var hosts=vm.iuiRouteInfo.server.split(":")
- ip=hosts[0];
- port=hosts[1];
- }
-
- //判断host是å¦é‡å¤
- for(var i=0;i<vm.iuiRouteInfo.servers.length;i++){
-
- if(vm.iuiRouteInfo.servers[i].ip==ip && vm.iuiRouteInfo.servers[i].port==port)
- {
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_repeat',[vm.apiRouteInfo.server]);
- return;
- }
-
- }
- var server={ip:ip,port:port,weight: 0};
- vm.iuiRouteInfo.servers.push(server);
- vm.iuiRouteInfo.server="";
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= "";
-
-
- },
- deliuiHost:function(ip,port){
-
- bootbox.confirm($.i18n.prop('org_openo_msb_route_err_host_del',[ip],[port]),function(result){
- if(result){
-
- for(var i=0;i<vm.iuiRouteInfo.servers.length;i++){
- if(vm.iuiRouteInfo.servers[i].ip == ip && vm.iuiRouteInfo.servers[i].port == port ){
- vm.iuiRouteInfo.servers.splice(i, 1);
- break;
- }
- }
-
- }
-
- });
-
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= "";
-
- },
- $showmsbRouteDlg:function() {
- vm.msbRouteInfo.serviceName="";
- vm.msbRouteInfo.version="";
- vm.msbRouteInfo.url="";
- vm.msbRouteInfo.protocol="";
- vm.msbRouteInfo.visualRange="";
- vm.msbRouteInfo.visualRangeArray=[];
- vm.msbRouteInfo.newHost="";
- vm.msbRouteInfo.nodes=[];
- vm.msbRouteInfo.status="1";
-
-
- vm.routeDlgInfo.saveType = "add";
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_add_msb');
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
-
-
-
- $(".form-group").each(function () {
- $(this).removeClass('has-success');
- $(this).removeClass('has-error');
- $(this).find(".help-block[id]").remove();
- $(this).find(".form-tip").removeClass('form-input-focus');
- $(this).find(".item-tip").removeClass('item-tip-focus');
- });
-
- $("#msbrouteDlg").modal("show");
- },
- $showiuiRouteDlg:function() {
-
- vm.iuiRouteInfo.serviceName="";
- vm.iuiRouteInfo.url="";
- vm.iuiRouteInfo.server="";
- vm.iuiRouteInfo.servers=[];
- vm.iuiRouteInfo.control="0";
- vm.iuiRouteInfo.status="1";
-
-
- vm.routeDlgInfo.saveType = "add";
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_add_iui');
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
-
- //$("input[name='iuioriService']").val("");
-
- $(".form-group").each(function () {
- $(this).removeClass('has-success');
- $(this).removeClass('has-error');
- $(this).find(".help-block[id]").remove();
- $(this).find(".form-tip").removeClass('form-input-focus');
- $(this).find(".item-tip").removeClass('item-tip-focus');
- });
-
- $("#iuirouteDlg").modal("show");
- },
- $showcustomRouteDlg:function() {
-
- vm.customRouteInfo.serviceName="";
- vm.customRouteInfo.url="";
- vm.customRouteInfo.server="";
- vm.customRouteInfo.servers=[];
- vm.customRouteInfo.control="0";
- vm.customRouteInfo.status="1";
-
-
- vm.routeDlgInfo.saveType = "add";
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_add_custom');
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
-
- //$("input[name='customoriService']").val("");
-
- $(".form-group").each(function () {
- $(this).removeClass('has-success');
- $(this).removeClass('has-error');
- $(this).find(".help-block[id]").remove();
- $(this).find(".form-tip").removeClass('form-input-focus');
- $(this).find(".item-tip").removeClass('item-tip-focus');
- });
-
- $("#customrouteDlg").modal("show");
- },
- $showApiRouteDlg : function() {
-
- $('#apiTab a:first').tab('show');
- vm.apiRouteInfo.serviceName="";
- vm.apiRouteInfo.version="";
- vm.apiRouteInfo.url="";
- vm.apiRouteInfo.metricsUrl="/admin/metrics";
- vm.apiRouteInfo.control="0";
- vm.apiRouteInfo.status="1";
- // vm.apiRouteInfo.apiJson="/service/swagger.json";
- vm.apiRouteInfo.apiJsonType="1";
- vm.apiRouteInfo.server="";
- vm.apiRouteInfo.servers=[];
-
- vm.apiJson.custom="/swagger.json";
-
- //$("input[name='oriService']").val("");
-
- $('#metricsFullurl').collapse('hide');
- $('#apiJsonFullurl').collapse('hide');
-
-
-
- vm.routeDlgInfo.saveType = "add";
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_add_api');
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
-
- $(".form-group").each(function () {
- $(this).removeClass('has-success');
- $(this).removeClass('has-error');
- $(this).find(".help-block[id]").remove();
- $(this).find(".form-tip").removeClass('form-input-focus');
- $(this).find(".item-tip").removeClass('item-tip-focus');
- });
-
-
- $("#routeDlg").modal("show");
- },
- $saveiuiRoute : function() {
-
- iuisuccess.hide();
- iuierror.hide();
- if (iuiform.valid() == false) {
- return false;
- }
-
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=true;
-
- vm.iuiRouteInfo.serviceName=$.trim(vm.iuiRouteInfo.serviceName);
-
- var servers=[];
- for(var i=0;i<vm.iuiRouteInfo.servers.length;i++){
- var server={ip:vm.iuiRouteInfo.servers[i].ip,port:vm.iuiRouteInfo.servers[i].port,weight: 0};
- servers.push(server);
- }
-
-
-
- var iuiRouteUrl=vm.iuiRouteInfo.url=="/"?"":vm.iuiRouteInfo.url;
- var data= JSON.stringify({
- "serviceName": vm.iuiRouteInfo.serviceName,
- "url": iuiRouteUrl,
- "control":vm.iuiRouteInfo.control,
- "status":vm.iuiRouteInfo.status,
- "servers": servers
- });
-
- if(vm.routeDlgInfo.saveType=="add")
- {
-
- //Determine whether to repeat
- for(var i=0;i<vm.iuiRouteArray.length;i++){
-
- if(vm.iuiRouteArray[i].serviceName==vm.iuiRouteInfo.serviceName)
- {
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_repeat',[vm.iuiRouteInfo.serviceName]);
- return;
- }
-
- }
-
- //save service
-
-
- $.ajax({
- "type": 'POST',
- "url": vm.$iuiRouteUrl,
- "data" : data,
- "dataType": "json",
- "contentType":"application/json",
- success: function (resp) {
-
- vm.iuiRouteArray.push(JSON.parse(data));
- vm.iuiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
-
- routeUtil.refreshRoute();
- $('#iuirouteDlg').modal('hide');
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_service_save'),"success");
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown;
-
- }
- });
- }
- else{ //update
-
- var url= vm.$iuiRouteInstanceUrl;
- url=url.replace("{serviceName}",vm.iuiRouteInfo.oldServiceName);
-
- //Determine whether to repeat
- if(vm.iuiRouteInfo.serviceName!=vm.iuiRouteInfo.oldServiceName) //Has been modified service name
- {
- for(var i=0;i<vm.iuiRouteArray.length;i++){
-
- if(vm.iuiRouteArray[i].serviceName==vm.iuiRouteInfo.serviceName)
- {
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_repeat',[vm.iuiRouteInfo.serviceName]);
- return;
- }
-
- }
- }
-
- $.ajax({
- "type": 'PUT',
- "url": url,
- "data" :data,
- "dataType": "json",
- "contentType":"application/json",
- success: function (resp) {
-
- for(var i=0;i<vm.iuiRouteArray.length;i++){
- if(vm.iuiRouteArray[i].serviceName == vm.iuiRouteInfo.oldServiceName)
- {
- vm.iuiRouteArray[i].serviceName=vm.iuiRouteInfo.serviceName;
- vm.iuiRouteArray[i].url=iuiRouteUrl;
- vm.iuiRouteArray[i].servers=vm.iuiRouteInfo.servers;
-
- break;
- }
- }
-
-
-
- $('#iuirouteDlg').modal('hide');
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_service_update'),"success");
-
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown;
-
- }
- });
-
-
- }
- },
- $savecustomRoute : function() {
-
- customsuccess.hide();
- customerror.hide();
- if (customform.valid() == false) {
- return false;
- }
-
- if(vm.customRouteInfo.servers.length==0){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_leastone');
- return;
- }
-
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=true;
-
- vm.customRouteInfo.serviceName=$.trim(vm.customRouteInfo.serviceName);
-
- var servers=[];
- for(var i=0;i<vm.customRouteInfo.servers.length;i++){
- var server={ip:vm.customRouteInfo.servers[i].ip,port:vm.customRouteInfo.servers[i].port,weight: 0};
- servers.push(server);
- }
-
- var customRouteUrl=vm.customRouteInfo.url=="/"?"":vm.customRouteInfo.url;
- var data= JSON.stringify({
- "serviceName": vm.customRouteInfo.serviceName,
- "url": customRouteUrl,
- "control":vm.customRouteInfo.control,
- "status":vm.customRouteInfo.status,
- "servers": servers
- });
-
- if(vm.routeDlgInfo.saveType=="add")
- {
-
- //Determine whether to repeat
- for(var i=0;i<vm.customRouteArray.length;i++){
-
- if(vm.customRouteArray[i].serviceName==vm.customRouteInfo.serviceName)
- {
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_repeat',[vm.customRouteInfo.serviceName]);
- return;
- }
-
- }
-
- //save
-
-
- $.ajax({
- "type": 'POST',
- "url": vm.$customRouteInstanceUrl,
- "data" : data,
- "dataType": "json",
- "contentType":"application/json",
- success: function (resp) {
-
- vm.customRouteArray.push(JSON.parse(data));
- routeUtil.groupRoute(vm.customRouteArray);
-
-
- routeUtil.refreshRoute();
- $('#customrouteDlg').modal('hide');
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_service_save'),"success");
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown;
-
- }
- });
- }
- else{ //update
-
- //Determine whether to repeat
- if(vm.customRouteInfo.serviceName!=vm.customRouteInfo.oldServiceName) //Has been modified service name
- {
- for(var i=0;i<vm.customRouteArray.length;i++){
-
- if(vm.customRouteArray[i].serviceName==vm.customRouteInfo.serviceName)
- {
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_repeat',[vm.customRouteInfo.serviceName]);
- return;
- }
-
- }
- }
-
- var url= vm.$customRouteInstanceUrl+"?serviceName="+vm.customRouteInfo.oldServiceName;
-
- $.ajax({
- "type": 'PUT',
- "url": url,
- "data" :data,
- "dataType": "json",
- "contentType":"application/json",
- success: function (resp) {
-
- for(var i=0;i<vm.customRouteArray.length;i++){
- if(vm.customRouteArray[i].serviceName == vm.customRouteInfo.oldServiceName)
- {
- vm.customRouteArray[i].serviceName=vm.customRouteInfo.serviceName;
- vm.customRouteArray[i].url=customRouteUrl;
- vm.customRouteArray[i].servers=vm.customRouteInfo.servers;
- break;
- }
- }
-
- routeUtil.groupRoute(vm.customRouteArray);
-
-
-
- $('#customrouteDlg').modal('hide');
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_service_update'),"success");
-
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info=$.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown;
-
- }
- });
-
-
- }
- },
- $saveApiRoute : function() {
-
- success.hide();
- error.hide();
- if (form.valid() == false) {
- return false;
- }
-
- if(vm.apiRouteInfo.servers.length==0){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_host_leastone');
- return;
- }
-
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=true;
-
-
- var apiRouteUrl=vm.apiRouteInfo.url=="/"?"":vm.apiRouteInfo.url;
- var apiJson=vm.apiRouteInfo.apiJsonType=="1"?vm.apiJson.custom:vm.apiJson.local;
-
- var servers=[];
- for(var i=0;i<vm.apiRouteInfo.servers.length;i++){
- var server={ip:vm.apiRouteInfo.servers[i].ip,port:vm.apiRouteInfo.servers[i].port,weight: 0};
- servers.push(server);
- }
-
-
- var data= JSON.stringify({
- "serviceName": vm.apiRouteInfo.serviceName,
- "version": vm.apiRouteInfo.version,
- "url": apiRouteUrl,
- "metricsUrl":vm.apiRouteInfo.metricsUrl,
- "apiJson": apiJson,
- "apiJsonType":vm.apiRouteInfo.apiJsonType,
- "control":vm.apiRouteInfo.control,
- "status":vm.apiRouteInfo.status,
- "servers": servers
-
- });
-
- if(vm.routeDlgInfo.saveType=="add")
- {
-
- //Determine whether to repeat
- for(var i=0;i<vm.apiRouteArray.length;i++){
-
- if(vm.apiRouteArray[i].serviceName==vm.apiRouteInfo.serviceName
- && vm.apiRouteArray[i].version==vm.apiRouteInfo.version )
- {
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info=$.i18n.prop('org_openo_msb_route_err_api_repeat',[vm.apiRouteInfo.serviceName],[vm.apiRouteInfo.version]);
- return;
- }
-
- }
-
- //save
-
-
- $.ajax({
- "type": 'POST',
- "url": vm.$apiRouteUrl,
- "data" : data,
- "dataType": "json",
- "contentType":"application/json",
- success: function (resp) {
-
- vm.apiRouteArray.push(JSON.parse(data));
- vm.apiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
-
- routeUtil.refreshRoute();
- $('#routeDlg').modal('hide');
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_service_save'),"success");
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown;
-
- }
- });
- }
- else{ //update
-
-
- //Determine whether to repeat
- if(vm.apiRouteInfo.serviceName!=vm.apiRouteInfo.oldServiceName ||
- vm.apiRouteInfo.version!=vm.apiRouteInfo.oldVersion) //Has been modified service name
- {
- for(var i=0;i<vm.apiRouteArray.length;i++){
-
- if(vm.apiRouteArray[i].serviceName==vm.apiRouteInfo.serviceName
- && vm.apiRouteArray[i].version==vm.apiRouteInfo.version )
- {
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_api_repeat',[vm.apiRouteInfo.serviceName],[vm.apiRouteInfo.version]);
- return;
- }
-
- }
- }
-
- var url= vm.$apiRouteInstanceUrl;
- var version=vm.apiRouteInfo.oldVersion==""?"null":vm.apiRouteInfo.oldVersion;
- url=url.replace("{serviceName}",vm.apiRouteInfo.oldServiceName).replace("{version}",version);
-
-
- $.ajax({
- "type": 'PUT',
- "url": url,
- "data" :data,
- "dataType": "json",
- "contentType":"application/json",
- success: function (resp) {
-
- for(var i=0;i<vm.apiRouteArray.length;i++){
- if(vm.apiRouteArray[i].serviceName == vm.apiRouteInfo.oldServiceName &&
- vm.apiRouteArray[i].version == vm.apiRouteInfo.oldVersion)
- {
- //vm.apiRouteArray[i] = JSON.parse(data);
- vm.apiRouteArray[i].serviceName=vm.apiRouteInfo.serviceName;
- vm.apiRouteArray[i].version= vm.apiRouteInfo.version;
- vm.apiRouteArray[i].url=apiRouteUrl;
- vm.apiRouteArray[i].metricsUrl=vm.apiRouteInfo.metricsUrl;
- vm.apiRouteArray[i].apiJson=apiJson;
- vm.apiRouteArray[i].apiJsonType=vm.apiRouteInfo.apiJsonType;
-
- vm.apiRouteArray[i].servers=vm.apiRouteInfo.servers;
-
-
- break;
- }
- }
-
-
-
- $('#routeDlg').modal('hide');
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_service_update'),"success");
-
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+textStatus+":"+errorThrown;
-
- }
- });
-
-
- }
- },
- $savemsbRoute : function() {
-
- msbsuccess.hide();
- msberror.hide();
- if (msbform.valid() == false) {
- return false;
- }
-
- if(vm.msbRouteInfo.nodes.length==0){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info=$.i18n.prop('org_openo_msb_route_err_host_leastone');
- return;
- }
-
- if(vm.msbRouteInfo.visualRangeArray.length==0){
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_visualrange_empty');
- return;
- }
-
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=true;
-
- var msbUrl=vm.msbRouteInfo.url=="/"?"":vm.msbRouteInfo.url;
-
-
- var nodes=[];
- for(var i=0;i<vm.msbRouteInfo.nodes.length;i++){
- var node={ip:vm.msbRouteInfo.nodes[i].ip,port:vm.msbRouteInfo.nodes[i].port,ttl: vm.msbRouteInfo.nodes[i].ttl};
- nodes.push(node);
- }
-
- var data= JSON.stringify({
- "serviceName": vm.msbRouteInfo.serviceName,
- "version": vm.msbRouteInfo.version,
- "url": msbUrl,
- "nodes": nodes,
- "protocol":vm.msbRouteInfo.protocol,
- "visualRange":vm.msbRouteInfo.visualRangeArray.join("|")
- });
-
- if(vm.routeDlgInfo.saveType=="add")
- {
-
- //Determine whether to repeat
- for(var i=0;i<vm.msbRouteArray.length;i++){
-
- if(vm.msbRouteArray[i].serviceName==vm.msbRouteInfo.serviceName
- && vm.msbRouteArray[i].version==vm.msbRouteInfo.version )
- {
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_api_repeat',[vm.msbRouteInfo.serviceName],[vm.msbRouteInfo.version]);
- }
-
- }
-
- //save
-
-
- $.ajax({
- "type": 'POST',
- "url": vm.$msbRouteUrl,
- "data" : data,
- "dataType": "json",
- "contentType":"application/json",
- success: function (resp) {
-
- // vm.msbRouteArray.push(JSON.parse(data));
- table.destroy();
- vm.initMSBRoute();
-
- // table=$('#msbTable').DataTable({
-
- // "oLanguage": vm.$dataTableLanguage,
- // columnDefs: [ {
- // targets: [ 7 ],
- // "searchable": false,
- // "bSortable": false,
- // }]
- // });
-
- $('#msbrouteDlg').modal('hide');
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_msb'),$.i18n.prop('org_openo_msb_route_service_save'),"success");
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+XMLHttpRequest.responseText;
-
- }
- });
- }
- else{ //update
-
-
- //Determine whether to repeat
- if(vm.msbRouteInfo.serviceName!=vm.msbRouteInfo.oldServiceName ||
- vm.msbRouteInfo.version!=vm.msbRouteInfo.oldVersion) //Has been modified service name or version
- {
- for(var i=0;i<vm.msbRouteArray.length;i++){
-
- if(vm.msbRouteArray[i].serviceName==vm.msbRouteInfo.serviceName
- && vm.msbRouteArray[i].version==vm.msbRouteInfo.version )
- {
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_api_repeat',[vm.msbRouteInfo.serviceName],[vm.msbRouteInfo.version]);
- return;
- }
-
- }
- }
-
- var url= vm.$msbRouteInstanceUrl;
- var version=vm.msbRouteInfo.oldVersion==""?"null":vm.msbRouteInfo.oldVersion;
- var serviceName2= vm.msbRouteInfo.oldServiceName.replace(/\//g,"*");
- url=url.replace("{serviceName}",serviceName2).replace("{version}",version);
-
-
- $.ajax({
- "type": 'PUT',
- "url": url,
- "data" :data,
- "dataType": "json",
- "contentType":"application/json",
- success: function (resp) {
-
- for(var i=0;i<vm.msbRouteArray.length;i++){
- if(vm.msbRouteArray[i].serviceName == vm.msbRouteInfo.oldServiceName &&
- vm.msbRouteArray[i].version == vm.msbRouteInfo.oldVersion)
- {
- //vm.apiRouteArray[i] = JSON.parse(data);
- vm.msbRouteArray[i].serviceName=vm.msbRouteInfo.serviceName;
- vm.msbRouteArray[i].version= vm.msbRouteInfo.version;
- vm.msbRouteArray[i].url=msbUrl;
- vm.msbRouteArray[i].protocol=vm.msbRouteInfo.protocol;
- vm.msbRouteArray[i].visualRange=vm.msbRouteInfo.visualRange;
- vm.msbRouteArray[i].visualRangeArray=vm.msbRouteInfo.visualRangeArray;
- vm.msbRouteArray[i].nodes=nodes;
-
- break;
- }
- }
-
-
-
- $('#msbrouteDlg').modal('hide');
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_msb'),$.i18n.prop('org_openo_msb_route_service_update'),"success");
-
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- vm.server_rtn.warning_block=true;
- vm.server_rtn.info_block=false;
- vm.server_rtn.rtn_info= $.i18n.prop('org_openo_msb_route_err_service_save')+XMLHttpRequest.responseText;
-
- }
- });
-
-
- }
- },
-
- updateApiRouteStatus:function(serviceName,version,status){
-
- var url= vm.$apiRouteStatusUrl;
- var version2=version==""?"null":version;
- url=url.replace("{serviceName}",serviceName).replace("{version}",version2).replace("{status}",status);
-
- $.ajax({
- "type": 'PUT',
- "url": url,
- "dataType": "json",
- success: function (resp) {
-
-
- for(var i=0;i<vm.apiRouteArray.length;i++){
- if(vm.apiRouteArray[i].serviceName == serviceName &&
- vm.apiRouteArray[i].version == version){
- vm.apiRouteArray[i].status=status;
- break;
- }
- }
-
- if(status=='1')
- {
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_status_enable'),"success");
- }
- else{
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_status_disable'),"success");
- }
-
-
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- bootbox.alert($.i18n.prop('org_openo_msb_route_err_status')+textStatus+":"+errorThrown);
-
- }
- });
-
- },
- updateiuiRouteStatus:function(serviceName,status){
-
- var url= vm.$iuiRouteStatusUrl;
-
- url=url.replace("{serviceName}",serviceName).replace("{status}",status);
-
- $.ajax({
- "type": 'PUT',
- "url": url,
- "dataType": "json",
- success: function (resp) {
-
-
- for(var i=0;i<vm.iuiRouteArray.length;i++){
- if(vm.iuiRouteArray[i].serviceName == serviceName){
- vm.iuiRouteArray[i].status=status;
- break;
- }
- }
-
- if(status=='1')
- {
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_status_enable'),"success");
- }
- else{
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_status_disable'),"success");
- }
-
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- bootbox.alert($.i18n.prop('org_openo_msb_route_err_status')+textStatus+":"+errorThrown);
-
- }
- });
-
- },
- updatecustomRouteStatus:function(serviceName,status){
-
-
- var url= vm.$customRouteStatusUrl+"?serviceName="+serviceName+"&status="+status;
-
-
- $.ajax({
- "type": 'PUT',
- "url": url,
- "dataType": "json",
- success: function (resp) {
-
-
- for(var i=0;i<vm.customRouteArray.length;i++){
- if(vm.customRouteArray[i].serviceName == serviceName){
- vm.customRouteArray[i].status=status;
- break;
- }
- }
-
-
- routeUtil.groupRoute(vm.customRouteArray);
-
- if(status=='1')
- {
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_status_enable'),"success");
- }
- else{
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_status_disable'),"success");
- }
-
-
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- bootbox.alert($.i18n.prop('org_openo_msb_route_err_status')+textStatus+":"+errorThrown);
-
- }
- });
-
- },
- updateApiRoute:function(apiRouteInfo,type){
-
-
-
-
- $('#metricsFullurl').collapse('hide');
- $('#apiJsonFullurl').collapse('hide');
- $('#apiTab a:first').tab('show');
-
- vm.apiRouteInfo.serviceName=apiRouteInfo.serviceName;
- vm.apiRouteInfo.oldServiceName=apiRouteInfo.serviceName;
- vm.apiRouteInfo.version= apiRouteInfo.version;
- vm.apiRouteInfo.oldVersion=apiRouteInfo.version;
- vm.apiRouteInfo.url=apiRouteInfo.url==""?"/":apiRouteInfo.url;
- vm.apiRouteInfo.metricsUrl=apiRouteInfo.metricsUrl;
- vm.apiRouteInfo.apiJson=apiRouteInfo.apiJson;
- vm.apiRouteInfo.apiJsonType=apiRouteInfo.apiJsonType;
- vm.apiRouteInfo.control=apiRouteInfo.control;
- vm.apiRouteInfo.status= apiRouteInfo.status;
-
- if(vm.apiRouteInfo.apiJsonType=="1"){
- vm.apiJson.custom=apiRouteInfo.apiJson;
- }
- else{
- vm.apiJson.local=apiRouteInfo.apiJson;
- vm.apiJson.custom="/swagger.json";
- $("#apiJsonSelect").val(apiRouteInfo.apiJson);
- }
-
- vm.apiRouteInfo.server="";
- vm.apiRouteInfo.servers=[];
- vm.apiRouteInfo.servers=apiRouteInfo.servers;
-
-
-
-
- // vm.apiRouteInfo= jQuery.extend({},apiRouteInfo);
-
- vm.routeDlgInfo.saveType = type;
- if(type=='update'){
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_edit_api');
- }
- else if(type=='view'){
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_view_api');
- }
-
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
-
-
- $(".form-group").each(function () {
- $(this).removeClass('has-success');
- $(this).removeClass('has-error');
- $(this).find(".help-block[id]").remove();
- $(this).find(".item-tip").addClass("item-tip-focus");
- $(this).find(".form-tip").removeClass('form-input-focus');
- });
-
- $("#routeDlg").modal("show");
- },
- updateiuiRoute:function(iuiRouteInfo,type){
-
-
- vm.iuiRouteInfo.serviceName=iuiRouteInfo.serviceName;
- vm.iuiRouteInfo.oldServiceName=iuiRouteInfo.serviceName;
- vm.iuiRouteInfo.url=iuiRouteInfo.url==""?"/":iuiRouteInfo.url;
- vm.iuiRouteInfo.server="";
- vm.iuiRouteInfo.servers=[];
- vm.iuiRouteInfo.servers=iuiRouteInfo.servers;
- vm.iuiRouteInfo.control=iuiRouteInfo.control;
- vm.iuiRouteInfo.status=iuiRouteInfo.status;
-
-
- // vm.apiRouteInfo= jQuery.extend({},apiRouteInfo);
-
-
- vm.routeDlgInfo.saveType = type;
- if(type=='update'){
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_edit_iui');
- }
- else if(type=='view'){
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_view_iui');
- }
-
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
-
-
- $(".form-group").each(function () {
- $(this).removeClass('has-success');
- $(this).removeClass('has-error');
- $(this).find(".help-block[id]").remove();
- $(this).find(".item-tip").addClass("item-tip-focus");
- $(this).find(".form-tip").removeClass('form-input-focus');
- });
-
- $("#iuirouteDlg").modal("show");
- },
- updatecustomRoute:function(customRouteInfo,type){
-
-
- vm.customRouteInfo.serviceName=customRouteInfo.serviceName;
- vm.customRouteInfo.oldServiceName=customRouteInfo.serviceName;
-
- vm.customRouteInfo.url=customRouteInfo.url==""?"/":customRouteInfo.url;
- vm.customRouteInfo.server="";
- vm.customRouteInfo.servers=[];
- vm.customRouteInfo.servers=customRouteInfo.servers;
- vm.customRouteInfo.control=customRouteInfo.control;
- vm.customRouteInfo.status=customRouteInfo.status;
-
- // vm.apiRouteInfo= jQuery.extend({},apiRouteInfo);
-
- vm.routeDlgInfo.saveType = type;
- if(type=='update'){
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_edit_custom');
- }
- else if(type=='view'){
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_view_custom');
- }
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
-
-
- $(".form-group").each(function () {
- $(this).removeClass('has-success');
- $(this).removeClass('has-error');
- $(this).find(".help-block[id]").remove();
- $(this).find(".item-tip").addClass("item-tip-focus");
- $(this).find(".form-tip").removeClass('form-input-focus');
- });
-
- $("#customrouteDlg").modal("show");
- },
- updatemsbRoute:function(msbRouteInfo){
-
- vm.msbRouteInfo.serviceName=msbRouteInfo.serviceName;
- vm.msbRouteInfo.oldServiceName=msbRouteInfo.serviceName;
- vm.msbRouteInfo.version= msbRouteInfo.version;
- vm.msbRouteInfo.oldVersion= msbRouteInfo.version
- vm.msbRouteInfo.url=msbRouteInfo.url==""?"/":msbRouteInfo.url;
- vm.msbRouteInfo.protocol=msbRouteInfo.protocol;
- vm.msbRouteInfo.visualRange=msbRouteInfo.visualRange;
- vm.msbRouteInfo.visualRangeArray=msbRouteInfo.visualRange.split("|");
- vm.msbRouteInfo.nodes=msbRouteInfo.nodes;
- vm.msbRouteInfo.newHost="";
- vm.msbRouteInfo.newttl="";
-
- routeUtil.changeTargetServiceUrl();
-
- vm.routeDlgInfo.saveType = "update";
- vm.routeDlgInfo.titleName=$.i18n.prop('org_openo_msb_route_title_edit_msb');
- vm.server_rtn.warning_block=false;
- vm.server_rtn.info_block=false;
-
-
- $(".form-group").each(function () {
- $(this).removeClass('has-success');
- $(this).removeClass('has-error');
- $(this).find(".help-block[id]").remove();
- $(this).find(".item-tip").addClass("item-tip-focus");
- $(this).find(".form-tip").removeClass('form-input-focus');
- });
-
- $("#msbrouteDlg").modal("show");
- },
- delApiRoute:function(serviceName,version){
- bootbox.confirm($.i18n.prop('org_openo_msb_route_err_service_del_ask',[serviceName],[version]),function(result){
- if(result){
- var url= vm.$apiRouteInstanceUrl;
- var version2=version==""?"null":version;
- url=url.replace("{serviceName}",serviceName).replace("{version}",version2);
-
- $.ajax({
- "type": 'DELETE',
- "url": url,
- "dataType": "json",
- success: function (resp) {
-
- for(var i=0;i<vm.apiRouteArray.length;i++){
- if(vm.apiRouteArray[i].serviceName == serviceName &&
- vm.apiRouteArray[i].version == version){
- vm.apiRouteArray.splice(i, 1);
- break;
- }
- }
-
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_api'),$.i18n.prop('org_openo_msb_route_service_del_success'),"success");
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- bootbox.alert($.i18n.prop('org_openo_msb_route_service_del_fail')+textStatus+":"+errorThrown);
-
- }
- });
-
-
- }
-
- });
-
- },
- deliuiRoute:function(serviceName){
- bootbox.confirm($.i18n.prop('org_openo_msb_route_err_service2_del_ask',[serviceName]),function(result){
- if(result){
- var url= vm.$iuiRouteInstanceUrl;
-
- url=url.replace("{serviceName}",serviceName);
-
- $.ajax({
- "type": 'DELETE',
- "url": url,
- "dataType": "json",
- success: function (resp) {
-
- for(var i=0;i<vm.iuiRouteArray.length;i++){
- if(vm.iuiRouteArray[i].serviceName == serviceName){
- vm.iuiRouteArray.splice(i, 1);
- break;
- }
- }
-
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_iui'),$.i18n.prop('org_openo_msb_route_service_del_success'),"success");
-
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- bootbox.alert($.i18n.prop('org_openo_msb_route_service_del_fail')+textStatus+":"+errorThrown);
-
- }
- });
-
-
- }
-
- });
-
- },
- delcustomRoute:function(serviceName){
- bootbox.confirm($.i18n.prop('org_openo_msb_route_err_service2_del_ask',[serviceName]),function(result){
- if(result){
- var url= vm.$customRouteInstanceUrl+"?serviceName="+serviceName;
-
- $.ajax({
- "type": 'DELETE',
- "url": url,
- "dataType": "json",
- success: function (resp) {
-
- for(var i=0;i<vm.customRouteArray.length;i++){
- if(vm.customRouteArray[i].serviceName == serviceName){
- vm.customRouteArray.splice(i, 1);
- break;
- }
- }
-
- routeUtil.groupRoute(vm.customRouteArray);
-
-
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_custom'),$.i18n.prop('org_openo_msb_route_service_del_success'),"success");
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- bootbox.alert($.i18n.prop('org_openo_msb_route_service_del_fail')+textStatus+":"+errorThrown);
-
- }
- });
-
-
- }
-
- });
-
- },
- delmsbRoute:function(serviceName,version,obj){
- bootbox.confirm($.i18n.prop('org_openo_msb_route_err_service_del_ask',[serviceName],[version]),function(result){
- if(result){
- var url= vm.$msbRouteInstanceUrl;
- var version2=version==""?"null":version;
- var serviceName2= serviceName.replace(/\//g,"*");
- url=url.replace("{serviceName}",serviceName2).replace("{version}",version2);
-
- $.ajax({
- "type": 'DELETE',
- "url": url,
- "dataType": "json",
- success: function (resp) {
- $(obj).parent().parent().addClass('selected');
-
- for(var i=0;i<vm.msbRouteArray.length;i++){
- if(vm.msbRouteArray[i].serviceName == serviceName &&
- vm.msbRouteArray[i].version==version ){
- vm.msbRouteArray.splice(i, 1);
- break;
- }
- }
-
- table.row('.selected').remove().draw( false );
-
- routeUtil.growl($.i18n.prop('org_openo_msb_route_tab_msb'),$.i18n.prop('org_openo_msb_route_service_del_success'),"success");
-
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- bootbox.alert($.i18n.prop('org_openo_msb_route_service_del_fail')+XMLHttpRequest.responseText);
-
- }
-
-
- });
-
-
- }
-
- });
-
- },
- exportServices:function(){
- var url=apiBasePath+"/apiRoute/export";
- window.open(url);
-
- },
- gotoTarget:function(route,type){
- vm.selectedRoute=route;
- vm.selectedRouteType=type;
-
- if(type=="api")
- {
- vm.gotoRestDoc();
- }
- else if(type=="iui"){
- vm.gotoIUI();
- }
-
- },
- gotoRestDoc:function(){
- vm.routeTargetTitle=vm.selectedRoute.serviceName+"-"+$.i18n.prop("org_openo_msb_route_content_title");
-
- var version=vm.selectedRoute.version==""?"":"/"+vm.selectedRoute.version;
-
- if(vm.selectedRoute.apiJsonType=="1")
- {
-
- var sourceUrl= "/apijson/"+vm.selectedRoute.serviceName+version;
- }
- else{
- var sourceUrl= iuiBasePath+"/ext/initSwaggerJson/"+vm.selectedRoute.apiJson;
- }
- //Local json data read from the real API service service address parameter
- var url=iuiBasePath+"/api-doc/index.html?url="+sourceUrl+"&api=/api/"+vm.selectedRoute.serviceName+version;
-
- $('#msbSubPage').attr("src",url);
- vm.apiIframeUrl=url;
- },
- gotoJVM:function(){
- vm.routeTargetTitle=vm.selectedRoute.serviceName+"-"+$.i18n.prop('org_openo_msb_route_metric_content_title');
-
- var version=vm.selectedRoute.version==""?"":"/"+vm.selectedRoute.version;
-
- var sourceUrl= "/admin/"+vm.selectedRoute.serviceName+version;
-
-
- var url=iuiBasePath+"/metrics/index.html?url="+sourceUrl;
-
- $('#msbSubPage').attr("src",url);
- },
- gotoIUI:function(){
- vm.routeTargetTitle=vm.selectedRoute.serviceName+"-"+$.i18n.prop('org_openo_msb_route_iui_content_title');
- var url= "/iui/"+vm.selectedRoute.serviceName+"/";
- $('#msbSubPage').attr("src",url);
- vm.iuiIframeUrl=url;
- },
- initIUIfori18n:function(){
- vm.routeTargetTitle=$.i18n.prop("org_openo_msb_route_content_title");
- vm.showAPITypeName=[$.i18n.prop("org_openo_msb_route_swagger_type_predefined"),$.i18n.prop("org_openo_msb_route_swagger_type_custominput")];
- vm.dataTableLanguage={
- "sProcessing": "<img src='../img/loading-spinner-grey.gif'/><span>&nbsp;&nbsp;Loadding...</span>",
- "sLengthMenu": $.i18n.prop("org_openo_msb_route-table-sLengthMenu"),
- "sZeroRecords": $.i18n.prop("org_openo_msb_route-table-sZeroRecords"),
- "sInfo": "<span class='seperator'> </span>" + $.i18n.prop("org_openo_msb_route-table-sInfo"),
- "sInfoEmpty": $.i18n.prop("org_openo_msb_route-table-sInfoEmpty"),
- "sGroupActions": $.i18n.prop("org_openo_msb_route-table-sGroupActions"),
- "sAjaxRequestGeneralError": $.i18n.prop("org_openo_msb_route-table-sAjaxRequestGeneralError"),
- "sEmptyTable": $.i18n.prop("org_openo_msb_route-table-sEmptyTable"),
- "oPaginate": {
- "sPrevious": $.i18n.prop("org_openo_msb_route-table-sPrevious"),
- "sNext": $.i18n.prop("org_openo_msb_route-table-sNext"),
- "sPage": $.i18n.prop("org_openo_msb_route-table-sPage"),
- "sPageOf": $.i18n.prop("org_openo_msb_route-table-sPageOf")
- },
- "sSearch": $.i18n.prop("org_openo_msb_route-table-search"),
- "sInfoFiltered": $.i18n.prop("org_openo_msb_route-table-infofilter")
- };
-
- }
-
-
-
- });
-
-
+/*
+ * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var table;
+var vm = avalon
+ .define({
+ $id : "routeController",
+ route:{
+ routeWay:"ip",
+ routeHost:"",
+ routeIP:"",
+ routePort:"",
+ routeSubDomain:"",
+ iuiRootPath:iuiRootPath,
+ apiRootPath:apiRootPath
+ },
+ apiIframeUrl:"",
+ iuiIframeUrl:"",
+ boxVisible:true,
+ routeTargetTitle:"",
+ server_rtn:{
+ info_block:false,
+ warning_block:false,
+ rtn_info:""
+ },
+ showAPIType:"0",
+ showAPITypeName:[$.i18n.prop("org_onap_msb_route_swagger_type_predefined"),$.i18n.prop("org_onap_msb_route_swagger_type_custominput")],
+ $msbProtocol :["REST","HTTP","UI","MQ","FTP","SNMP","TCP","UDP"],
+ $msbType:["UI","NAF","SAF"],
+ apiJson:{
+ local:"",
+ custom:""
+ },
+ setAPIType:function(type){
+ vm.apiRouteInfo.apiJsonType=type;
+ if(type==0){
+ vm.apiJson.local=vm.jsonApiSelectList.selectItems[0];
+ }
+
+ },
+ jsonApiSelectList: {
+ condName : "type",
+ component_type : 'select',
+ selectItems : []
+ },
+
+ dataTableLanguage: {
+ "sProcessing": "<img src='../img/loading-spinner-grey.gif'/><span>&nbsp;&nbsp;Loadding...</span>",
+ "sLengthMenu": $.i18n.prop("org_onap_msb_route-table-sLengthMenu"),
+ "sZeroRecords": $.i18n.prop("org_onap_msb_route-table-sZeroRecords"),
+ "sInfo": "<span class='seperator'> </span>" + $.i18n.prop("org_onap_msb_route-table-sInfo"),
+ "sInfoEmpty": $.i18n.prop("org_onap_msb_route-table-sInfoEmpty"),
+ "sGroupActions": $.i18n.prop("org_onap_msb_route-table-sGroupActions"),
+ "sAjaxRequestGeneralError": $.i18n.prop("org_onap_msb_route-table-sAjaxRequestGeneralError"),
+ "sEmptyTable": $.i18n.prop("org_onap_msb_route-table-sEmptyTable"),
+ "oPaginate": {
+ "sPrevious": $.i18n.prop("org_onap_msb_route-table-sPrevious"),
+ "sNext": $.i18n.prop("org_onap_msb_route-table-sNext"),
+ "sPage": $.i18n.prop("org_onap_msb_route-table-sPage"),
+ "sPageOf": $.i18n.prop("org_onap_msb_route-table-sPageOf")
+ },
+ "sSearch": $.i18n.prop("org_onap_msb_route-table-search"),
+ "sInfoFiltered": $.i18n.prop("org_onap_msb_route-table-infofilter")
+ },
+ $apiRouteUrl :apiBasePath+'/apiRoute',
+ $apiRouteInstanceUrl :apiBasePath+'/apiRoute/{serviceName}/version/{version}',
+ $apiRouteStatusUrl :apiBasePath+'/apiRoute/{serviceName}/version/{version}/status/{status}',
+ $apiDocsUrl :apiBasePath+'/apiRoute/apiDocs',
+ $apiGatewayPortUrl :apiBasePath+'/apiRoute/apiGatewayPort',
+ $discoverInfoUrl :apiBasePath+'/apiRoute/discoverInfo',
+ $iuiRouteUrl :apiBasePath+'/iuiRoute',
+ $iuiRouteInstanceUrl :apiBasePath+'/iuiRoute/{serviceName}',
+ $iuiRouteStatusUrl :apiBasePath+'/iuiRoute/{serviceName}/status/{status}',
+ $customRouteUrl :apiBasePath+'/customRoute/all',
+ $customRouteInstanceUrl :apiBasePath+'/customRoute/instance',
+ $customRouteStatusUrl :apiBasePath+'/customRoute/status',
+ $msbRouteUrl:apiBasePath+'/services',
+ $msbRouteInstanceUrl :apiBasePath+'/services/{serviceName}/version/{version}',
+ routeLoading:false,
+ apiRouteArray : [],
+ apiGroupByPortArray : [],
+ apiRouteInfo : {
+ oldServiceName:"",
+ serviceName : "",
+ oldVersion:"",
+ version : "",
+ status:"",
+ url:"",
+ apiJson:"/swagger.json",
+ apiJsonType:"1",
+ control:"",
+ host:"",
+ publish_port:"",
+ publishProtocol:"",
+ server:"",
+ servers: []
+ },
+ iuiRouteArray : [],
+ iuiGroupByPortArray : [],
+ iuiRouteInfo : {
+ oldServiceName:"",
+ serviceName : "",
+ status:"",
+ url:"",
+ server:"",
+ control:"",
+ host:"",
+ publish_port:"",
+ publishProtocol:"",
+ servers: []
+ },
+ customRouteArray : [],
+ customGroupByPortArray : [],
+ customGroupRouteArray : [],
+ customRouteInfo : {
+ oldServiceName:"",
+ serviceName : "",
+ status:"",
+ url:"",
+ server:"",
+ control:"",
+ host:"",
+ publish_port:"",
+ publishProtocol:"",
+ servers: []
+ },
+ msbRouteArray : [],
+ msbRouteInfo : {
+ oldServiceName:"",
+ oldVersion:"",
+ serviceName : "",
+ version:"",
+ status:"0",
+ nodes:[],
+ newHost:"",
+ newttl:0,
+ url:"",
+ protocol:"",
+ visualRange:"",
+ visualRangeArray:[]
+ },
+ discoverInfo:{
+ ip:"",
+ port:"",
+ enabled:true,
+ deployMode:""
+ },
+ selectedRoute:"",
+ selectedRouteType:"",
+ routeDlgInfo:{
+ titleName:"",
+ saveType:""
+ },
+ $initRoute : function() {
+
+
+ vm.route.routeSubDomain=window.location.host.substring(3);
+
+ vm.route.routeWay="ip";
+ vm.route.routeHost=window.location.host.split(":")[0]; //Default show port:80
+ vm.route.routeIP=window.location.host.split(":")[0];
+
+ /*if(window.location.host.split(":")[1]==null){
+ vm.route.routePort="80";
+ }
+ else{
+ vm.route.routePort=window.location.host.split(":")[1];
+ }*/
+
+ vm.route.routePort="80";
+
+ var getDiscoverInfoReturn=true;
+ $.ajax({
+ "type": 'get',
+ "async": false,
+ "url": vm.$discoverInfoUrl,
+ "dataType": "json",
+ success: function (resp) {
+
+ vm.discoverInfo = (resp==null)?"":resp;
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ getDiscoverInfoReturn=false;
+ bootbox.alert("get discoverInfo from server fails:"+XMLHttpRequest.statusText);
+
+ }
+ });
+
+
+
+
+ if(!getDiscoverInfoReturn) return;
+
+ vm.routeLoading=true;
+
+ $.ajax({
+ "type": 'get',
+ "url": vm.$apiRouteUrl+"?routeWay="+vm.route.routeWay,
+ "dataType": "json",
+ success: function (resp) {
+ //vm.apiRouteArray = (resp==null)?[]:resp;
+ //vm.apiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
+ if(resp!=null && resp.length>0){
+ vm.apiGroupByPortArray=routeUtil.groupRouteByPort(resp);
+ }
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ bootbox.alert("get API serviceInfos fails:"+XMLHttpRequest.responseText);
+
+ },
+ complete:function(){
+ vm.routeLoading=false;
+ routeUtil.refreshRoute();
+
+ }
+ });
+
+
+ $.ajax({
+ "type": 'get',
+ "url": vm.$iuiRouteUrl+"?routeWay="+vm.route.routeWay,
+ "dataType": "json",
+ success: function (resp) {
+ //vm.iuiRouteArray = (resp==null)?[]:resp;
+ //vm.iuiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
+ if(resp!=null && resp.length>0){
+ vm.iuiGroupByPortArray=routeUtil.groupRouteByPort(resp);
+ }
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ console.info("get iui services fails:"+XMLHttpRequest.responseText);
+
+ },
+ complete:function(){
+ routeUtil.refreshRoute();
+ }
+ });
+
+
+
+ $.ajax({
+ "type": 'get',
+ "url": vm.$customRouteUrl+"?routeWay="+vm.route.routeWay,
+ "dataType": "json",
+ success: function (resp) {
+ //vm.customRouteArray = (resp==null)?[]:resp;
+
+ if(resp!=null && resp.length>0)
+ {
+ //routeUtil.groupRoute(resp);
+ vm.customGroupByPortArray=routeUtil.groupRouteByPort(resp);
+ }
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ console.info("get custom services fails:"+XMLHttpRequest.responseText);
+
+ },
+ complete:function(){
+ routeUtil.refreshRoute();
+ }
+ });
+
+
+ $.ajax({
+ "type": 'get',
+ "url": vm.$apiDocsUrl,
+ "dataType": "json",
+ success: function (resp) {
+ vm.jsonApiSelectList.selectItems= (resp==null)?[]:resp;
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ console.info("get local apiDocs fails:"+textStatus+":"+errorThrown);
+ }
+ });
+
+
+
+
+ vm.initIUIfori18n();
+
+
+
+ if(vm.discoverInfo.enabled==false){
+ vm.initMSBRoute();
+ }
+
+
+
+
+ },
+ initMSBRoute:function(){
+ vm.initIUIfori18n();
+
+ $.ajax({
+ "type": 'get',
+ "url": vm.$msbRouteUrl,
+ "dataType": "json",
+ success: function (resp) {
+ vm.msbRouteArray = (resp==null)?[]:resp;
+
+ vm.msbRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ bootbox.alert("get msb services fails:"+XMLHttpRequest.responseText);
+ return;
+ },
+ complete:function(){
+
+ table=$('#msbTable').DataTable({
+
+ "oLanguage": vm.dataTableLanguage,
+ columnDefs: [ {
+ targets: [ 0,8 ],
+ "searchable": false,
+ "bSortable": false
+ }],
+ "order": [[2, 'asc']]
+ });
+
+ }
+ });
+
+
+ },
+
+ clickDisplayGraphAlink: function () {
+ vm.boxVisible = !vm.boxVisible;
+ },
+ addmsbHost:function(){
+ if(vm.msbRouteInfo.newHost==""){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_onap_msb_route_err_host_empty");
+ return;
+ }
+
+ if(vm.msbRouteInfo.newttl==""){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_onap_msb_route_err_ttl_empty");
+ return;
+ }
+
+ var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/
+ var ip,port;
+ if(!reg.test(vm.msbRouteInfo.newHost)){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_onap_msb_route_err_host_format");
+ return;
+ }
+ else{
+
+ var hosts=vm.msbRouteInfo.newHost.split(":");
+ ip=hosts[0];
+ port=hosts[1];
+ }
+
+ var reg_ttl=/^\d+$/
+
+ if(!reg_ttl.test(vm.msbRouteInfo.newttl)){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_onap_msb_route_err_ttl_format");
+ return;
+ }
+
+
+
+ // determine whether host repeated
+ for(var i=0;i<vm.msbRouteInfo.nodes.length;i++){
+
+ if(vm.msbRouteInfo.nodes[i].ip==ip && vm.msbRouteInfo.nodes[i].port==port )
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_host_repeat',[vm.msbRouteInfo.newHost]);
+ return;
+ }
+
+ }
+
+ vm.msbRouteInfo.nodes.push({"ip":ip,"port":port,"ttl":vm.msbRouteInfo.newttl});
+ vm.msbRouteInfo.newHost="";
+ vm.msbRouteInfo.newttl="";
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+
+ },
+ delmsbHost:function(ip,port){
+
+ bootbox.confirm( $.i18n.prop('org_onap_msb_route_err_host_del',[ip],[port]),function(result){
+ if(result){
+
+ for(var i=0;i<vm.msbRouteInfo.nodes.length;i++){
+ if(vm.msbRouteInfo.nodes[i].ip == ip && vm.msbRouteInfo.nodes[i].port == port){
+ vm.msbRouteInfo.nodes.splice(i, 1);
+ break;
+ }
+ }
+
+ }
+
+ });
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+ },
+ addapiHost:function(){
+ if(vm.apiRouteInfo.server==""){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_onap_msb_route_err_host_empty");
+ return;
+ }
+
+ var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/
+ var ip,port;
+ if(!reg.test(vm.apiRouteInfo.server)){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_onap_msb_route_err_host_format");
+ return;
+ }
+ else{
+ var hosts=vm.apiRouteInfo.server.split(":")
+ ip=hosts[0];
+ port=hosts[1];
+ }
+
+ // determine whether host repeated
+ for(var i=0;i<vm.apiRouteInfo.servers.length;i++){
+
+ if(vm.apiRouteInfo.servers[i].ip==ip && vm.apiRouteInfo.servers[i].port==port)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_host_repeat',[vm.apiRouteInfo.server]);
+ return;
+ }
+
+ }
+ var server={ip:ip,port:port,weight: 0};
+ vm.apiRouteInfo.servers.push(server);
+ vm.apiRouteInfo.server="";
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+
+ },
+ delapiHost:function(ip,port){
+
+ bootbox.confirm( $.i18n.prop('org_onap_msb_route_err_host_del',[ip],[port]),function(result){
+ if(result){
+
+ for(var i=0;i<vm.apiRouteInfo.servers.length;i++){
+ if(vm.apiRouteInfo.servers[i].ip == ip && vm.apiRouteInfo.servers[i].port == port ){
+ vm.apiRouteInfo.servers.splice(i, 1);
+ break;
+ }
+ }
+
+ }
+
+ });
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+ },
+ addcustomHost:function(){
+ if(vm.customRouteInfo.server==""){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_onap_msb_route_err_host_empty");
+ return;
+ }
+
+ var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/
+ var ip,port;
+ if(!reg.test(vm.customRouteInfo.server)){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_onap_msb_route_err_host_format");
+ return;
+ }
+ else{
+ var hosts=vm.customRouteInfo.server.split(":")
+ ip=hosts[0];
+ port=hosts[1];
+ }
+
+ //判断host是å¦é‡å¤
+ for(var i=0;i<vm.customRouteInfo.servers.length;i++){
+
+ if(vm.customRouteInfo.servers[i].ip==ip && vm.customRouteInfo.servers[i].port==port)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_host_repeat',[vm.apiRouteInfo.server]);
+ return;
+ }
+
+ }
+ var server={ip:ip,port:port,weight: 0};
+ vm.customRouteInfo.servers.push(server);
+ vm.customRouteInfo.server="";
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+
+ },
+ delcustomHost:function(ip,port){
+
+ bootbox.confirm( $.i18n.prop('org_onap_msb_route_err_host_del',[ip],[port]),function(result){
+ if(result){
+
+ for(var i=0;i<vm.customRouteInfo.servers.length;i++){
+ if(vm.customRouteInfo.servers[i].ip == ip && vm.customRouteInfo.servers[i].port == port ){
+ vm.customRouteInfo.servers.splice(i, 1);
+ break;
+ }
+ }
+
+ }
+
+ });
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+ },
+ addiuiHost:function(){
+ if(vm.iuiRouteInfo.server==""){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_onap_msb_route_err_host_empty");
+ return;
+ }
+
+ var reg=/^(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/
+ var ip,port;
+ if(!reg.test(vm.iuiRouteInfo.server)){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop("org_onap_msb_route_err_host_format");
+ return;
+ }
+ else{
+ var hosts=vm.iuiRouteInfo.server.split(":")
+ ip=hosts[0];
+ port=hosts[1];
+ }
+
+ //判断host是å¦é‡å¤
+ for(var i=0;i<vm.iuiRouteInfo.servers.length;i++){
+
+ if(vm.iuiRouteInfo.servers[i].ip==ip && vm.iuiRouteInfo.servers[i].port==port)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_host_repeat',[vm.apiRouteInfo.server]);
+ return;
+ }
+
+ }
+ var server={ip:ip,port:port,weight: 0};
+ vm.iuiRouteInfo.servers.push(server);
+ vm.iuiRouteInfo.server="";
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+
+ },
+ deliuiHost:function(ip,port){
+
+ bootbox.confirm($.i18n.prop('org_onap_msb_route_err_host_del',[ip],[port]),function(result){
+ if(result){
+
+ for(var i=0;i<vm.iuiRouteInfo.servers.length;i++){
+ if(vm.iuiRouteInfo.servers[i].ip == ip && vm.iuiRouteInfo.servers[i].port == port ){
+ vm.iuiRouteInfo.servers.splice(i, 1);
+ break;
+ }
+ }
+
+ }
+
+ });
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= "";
+
+ },
+ $showmsbRouteDlg:function() {
+ vm.msbRouteInfo.serviceName="";
+ vm.msbRouteInfo.version="";
+ vm.msbRouteInfo.url="";
+ vm.msbRouteInfo.protocol="";
+ vm.msbRouteInfo.visualRange="";
+ vm.msbRouteInfo.visualRangeArray=[];
+ vm.msbRouteInfo.newHost="";
+ vm.msbRouteInfo.nodes=[];
+ vm.msbRouteInfo.status="1";
+
+
+ vm.routeDlgInfo.saveType = "add";
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_onap_msb_route_title_add_msb');
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ $(this).find(".item-tip").removeClass('item-tip-focus');
+ });
+
+ $("#msbrouteDlg").modal("show");
+ },
+ $showiuiRouteDlg:function() {
+
+ vm.iuiRouteInfo.serviceName="";
+ vm.iuiRouteInfo.url="";
+ vm.iuiRouteInfo.server="";
+ vm.iuiRouteInfo.servers=[];
+ vm.iuiRouteInfo.control="0";
+ vm.iuiRouteInfo.status="1";
+
+
+ vm.routeDlgInfo.saveType = "add";
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_onap_msb_route_title_add_iui');
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+ //$("input[name='iuioriService']").val("");
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ $(this).find(".item-tip").removeClass('item-tip-focus');
+ });
+
+ $("#iuirouteDlg").modal("show");
+ },
+ $showcustomRouteDlg:function() {
+
+ vm.customRouteInfo.serviceName="";
+ vm.customRouteInfo.url="";
+ vm.customRouteInfo.server="";
+ vm.customRouteInfo.servers=[];
+ vm.customRouteInfo.control="0";
+ vm.customRouteInfo.status="1";
+
+
+ vm.routeDlgInfo.saveType = "add";
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_onap_msb_route_title_add_custom');
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+ //$("input[name='customoriService']").val("");
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ $(this).find(".item-tip").removeClass('item-tip-focus');
+ });
+
+ $("#customrouteDlg").modal("show");
+ },
+ $showApiRouteDlg : function() {
+
+ $('#apiTab a:first').tab('show');
+ vm.apiRouteInfo.serviceName="";
+ vm.apiRouteInfo.version="";
+ vm.apiRouteInfo.url="";
+ vm.apiRouteInfo.control="0";
+ vm.apiRouteInfo.status="1";
+ // vm.apiRouteInfo.apiJson="/service/swagger.json";
+ vm.apiRouteInfo.apiJsonType="1";
+ vm.apiRouteInfo.server="";
+ vm.apiRouteInfo.servers=[];
+
+ vm.apiJson.custom="/swagger.json";
+
+ //$("input[name='oriService']").val("");
+
+
+ $('#apiJsonFullurl').collapse('hide');
+
+
+
+ vm.routeDlgInfo.saveType = "add";
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_onap_msb_route_title_add_api');
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ $(this).find(".item-tip").removeClass('item-tip-focus');
+ });
+
+
+ $("#routeDlg").modal("show");
+ },
+ $saveiuiRoute : function() {
+
+ iuisuccess.hide();
+ iuierror.hide();
+ if (iuiform.valid() == false) {
+ return false;
+ }
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=true;
+
+ vm.iuiRouteInfo.serviceName=$.trim(vm.iuiRouteInfo.serviceName);
+
+ var servers=[];
+ for(var i=0;i<vm.iuiRouteInfo.servers.length;i++){
+ var server={ip:vm.iuiRouteInfo.servers[i].ip,port:vm.iuiRouteInfo.servers[i].port,weight: 0};
+ servers.push(server);
+ }
+
+
+
+ var iuiRouteUrl=vm.iuiRouteInfo.url=="/"?"":vm.iuiRouteInfo.url;
+ var data= JSON.stringify({
+ "serviceName": vm.iuiRouteInfo.serviceName,
+ "url": iuiRouteUrl,
+ "control":vm.iuiRouteInfo.control,
+ "status":vm.iuiRouteInfo.status,
+ "host":vm.iuiRouteInfo.host,
+ "publish_port:":vm.iuiRouteInfo.publish_port,
+ "servers": servers
+ });
+
+ if(vm.routeDlgInfo.saveType=="add")
+ {
+
+ //Determine whether to repeat
+ for(var i=0;i<vm.iuiRouteArray.length;i++){
+
+ if(vm.iuiRouteArray[i].serviceName==vm.iuiRouteInfo.serviceName)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_service_repeat',[vm.iuiRouteInfo.serviceName]);
+ return;
+ }
+
+ }
+
+ //save service
+
+
+ $.ajax({
+ "type": 'POST',
+ "url": vm.$iuiRouteUrl+"?routeWay="+vm.route.routeWay,
+ "data" : data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ vm.iuiRouteArray.push(JSON.parse(data));
+ vm.iuiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
+
+ routeUtil.refreshRoute();
+ $('#iuirouteDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_iui'),$.i18n.prop('org_onap_msb_route_service_save'),"success");
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_service_save')+textStatus+":"+errorThrown;
+
+ }
+ });
+ }
+ else{ //update
+
+ var url= vm.$iuiRouteInstanceUrl;
+ url=url.replace("{serviceName}",vm.iuiRouteInfo.oldServiceName);
+ url=url+"?host="+vm.iuiRouteInfo.host+"&publish_port="+vm.iuiRouteInfo.publish_port+"&routeWay="+vm.route.routeWay;
+
+
+ //Determine whether to repeat
+ if(vm.iuiRouteInfo.serviceName!=vm.iuiRouteInfo.oldServiceName) //Has been modified service name
+ {
+ for(var i=0;i<vm.iuiRouteArray.length;i++){
+
+ if(vm.iuiRouteArray[i].serviceName==vm.iuiRouteInfo.serviceName)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_service_repeat',[vm.iuiRouteInfo.serviceName]);
+ return;
+ }
+
+ }
+ }
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "data" :data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.iuiRouteArray.length;i++){
+ if(vm.iuiRouteArray[i].serviceName == vm.iuiRouteInfo.oldServiceName)
+ {
+ vm.iuiRouteArray[i].serviceName=vm.iuiRouteInfo.serviceName;
+ vm.iuiRouteArray[i].url=iuiRouteUrl;
+ vm.iuiRouteArray[i].servers=vm.iuiRouteInfo.servers;
+
+ break;
+ }
+ }
+
+
+
+ $('#iuirouteDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_iui'),$.i18n.prop('org_onap_msb_route_service_update'),"success");
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_service_save')+textStatus+":"+errorThrown;
+
+ }
+ });
+
+
+ }
+ },
+ $savecustomRoute : function() {
+
+ customsuccess.hide();
+ customerror.hide();
+ if (customform.valid() == false) {
+ return false;
+ }
+
+ if(vm.customRouteInfo.servers.length==0){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_host_leastone');
+ return;
+ }
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=true;
+
+ vm.customRouteInfo.serviceName=$.trim(vm.customRouteInfo.serviceName);
+
+ var servers=[];
+ for(var i=0;i<vm.customRouteInfo.servers.length;i++){
+ var server={ip:vm.customRouteInfo.servers[i].ip,port:vm.customRouteInfo.servers[i].port,weight: 0};
+ servers.push(server);
+ }
+
+ var customRouteUrl=vm.customRouteInfo.url=="/"?"":vm.customRouteInfo.url;
+ var data= JSON.stringify({
+ "serviceName": vm.customRouteInfo.serviceName,
+ "url": customRouteUrl,
+ "control":vm.customRouteInfo.control,
+ "status":vm.customRouteInfo.status,
+ "host":vm.customRouteInfo.host,
+ "publish_port":vm.customRouteInfo.publish_port,
+ "servers": servers
+ });
+
+ if(vm.routeDlgInfo.saveType=="add")
+ {
+
+ //Determine whether to repeat
+ for(var i=0;i<vm.customRouteArray.length;i++){
+
+ if(vm.customRouteArray[i].serviceName==vm.customRouteInfo.serviceName)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_service_repeat',[vm.customRouteInfo.serviceName]);
+ return;
+ }
+
+ }
+
+ //save
+
+
+ $.ajax({
+ "type": 'POST',
+ "url": vm.$customRouteInstanceUrl+"?routeWay="+vm.route.routeWay,
+ "data" : data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ vm.customRouteArray.push(JSON.parse(data));
+ routeUtil.groupRoute(vm.customRouteArray);
+
+
+ routeUtil.refreshRoute();
+ $('#customrouteDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_custom'),$.i18n.prop('org_onap_msb_route_service_save'),"success");
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_service_save')+textStatus+":"+errorThrown;
+
+ }
+ });
+ }
+ else{ //update
+
+ //Determine whether to repeat
+ if(vm.customRouteInfo.serviceName!=vm.customRouteInfo.oldServiceName) //Has been modified service name
+ {
+ for(var i=0;i<vm.customRouteArray.length;i++){
+
+ if(vm.customRouteArray[i].serviceName==vm.customRouteInfo.serviceName)
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_service_repeat',[vm.customRouteInfo.serviceName]);
+ return;
+ }
+
+ }
+ }
+
+ var url= vm.$customRouteInstanceUrl+"?serviceName="+vm.customRouteInfo.oldServiceName;
+ url=url+"&host="+vm.customRouteInfo.host+"&publish_port="+vm.customRouteInfo.publish_port+"&routeWay="+vm.route.routeWay;
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "data" :data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.customRouteArray.length;i++){
+ if(vm.customRouteArray[i].serviceName == vm.customRouteInfo.oldServiceName)
+ {
+ vm.customRouteArray[i].serviceName=vm.customRouteInfo.serviceName;
+ vm.customRouteArray[i].url=customRouteUrl;
+ vm.customRouteArray[i].servers=vm.customRouteInfo.servers;
+ break;
+ }
+ }
+
+ routeUtil.groupRoute(vm.customRouteArray);
+
+
+
+ $('#customrouteDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_custom'),$.i18n.prop('org_onap_msb_route_service_update'),"success");
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info=$.i18n.prop('org_onap_msb_route_err_service_save')+textStatus+":"+errorThrown;
+
+ }
+ });
+
+
+ }
+ },
+ $saveApiRoute : function() {
+
+ success.hide();
+ error.hide();
+ if (form.valid() == false) {
+ return false;
+ }
+
+ if(vm.apiRouteInfo.servers.length==0){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_host_leastone');
+ return;
+ }
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=true;
+
+
+ var apiRouteUrl=vm.apiRouteInfo.url=="/"?"":vm.apiRouteInfo.url;
+ var apiJson=vm.apiRouteInfo.apiJsonType=="1"?vm.apiJson.custom:vm.apiJson.local;
+
+ var servers=[];
+ for(var i=0;i<vm.apiRouteInfo.servers.length;i++){
+ var server={ip:vm.apiRouteInfo.servers[i].ip,port:vm.apiRouteInfo.servers[i].port,weight: 0};
+ servers.push(server);
+ }
+
+
+ var data= JSON.stringify({
+ "serviceName": vm.apiRouteInfo.serviceName,
+ "version": vm.apiRouteInfo.version,
+ "url": apiRouteUrl,
+ "apiJson": apiJson,
+ "apiJsonType":vm.apiRouteInfo.apiJsonType,
+ "control":vm.apiRouteInfo.control,
+ "status":vm.apiRouteInfo.status,
+ "host":vm.apiRouteInfo.host,
+ "publish_port":vm.apiRouteInfo.publish_port,
+ "servers": servers
+
+ });
+
+ if(vm.routeDlgInfo.saveType=="add")
+ {
+
+ //Determine whether to repeat
+ for(var i=0;i<vm.apiRouteArray.length;i++){
+
+ if(vm.apiRouteArray[i].serviceName==vm.apiRouteInfo.serviceName
+ && vm.apiRouteArray[i].version==vm.apiRouteInfo.version )
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info=$.i18n.prop('org_onap_msb_route_err_api_repeat',[vm.apiRouteInfo.serviceName],[vm.apiRouteInfo.version]);
+ return;
+ }
+
+ }
+
+ //save
+
+
+ $.ajax({
+ "type": 'POST',
+ "url": vm.$apiRouteUrl+"?routeWay="+vm.route.routeWay,
+ "data" : data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ vm.apiRouteArray.push(JSON.parse(data));
+ vm.apiRouteArray.sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
+
+ routeUtil.refreshRoute();
+ $('#routeDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_api'),$.i18n.prop('org_onap_msb_route_service_save'),"success");
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_service_save')+textStatus+":"+errorThrown;
+
+ }
+ });
+ }
+ else{ //update
+
+
+ //Determine whether to repeat
+ if(vm.apiRouteInfo.serviceName!=vm.apiRouteInfo.oldServiceName ||
+ vm.apiRouteInfo.version!=vm.apiRouteInfo.oldVersion) //Has been modified service name
+ {
+ for(var i=0;i<vm.apiRouteArray.length;i++){
+
+ if(vm.apiRouteArray[i].serviceName==vm.apiRouteInfo.serviceName
+ && vm.apiRouteArray[i].version==vm.apiRouteInfo.version )
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_api_repeat',[vm.apiRouteInfo.serviceName],[vm.apiRouteInfo.version]);
+ return;
+ }
+
+ }
+ }
+
+ var url= vm.$apiRouteInstanceUrl;
+ var version=vm.apiRouteInfo.oldVersion==""?"null":vm.apiRouteInfo.oldVersion;
+ url=url.replace("{serviceName}",vm.apiRouteInfo.oldServiceName).replace("{version}",version);
+ url=url+"?host="+vm.apiRouteInfo.host+"&publish_port="+vm.apiRouteInfo.publish_port+"&routeWay="+vm.route.routeWay;
+
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "data" :data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.apiRouteArray.length;i++){
+ if(vm.apiRouteArray[i].serviceName == vm.apiRouteInfo.oldServiceName &&
+ vm.apiRouteArray[i].version == vm.apiRouteInfo.oldVersion)
+ {
+ //vm.apiRouteArray[i] = JSON.parse(data);
+ vm.apiRouteArray[i].serviceName=vm.apiRouteInfo.serviceName;
+ vm.apiRouteArray[i].version= vm.apiRouteInfo.version;
+ vm.apiRouteArray[i].url=apiRouteUrl;
+ vm.apiRouteArray[i].apiJson=apiJson;
+ vm.apiRouteArray[i].apiJsonType=vm.apiRouteInfo.apiJsonType;
+
+ vm.apiRouteArray[i].servers=vm.apiRouteInfo.servers;
+
+
+ break;
+ }
+ }
+
+
+
+ $('#routeDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_api'),$.i18n.prop('org_onap_msb_route_service_update'),"success");
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_service_save')+textStatus+":"+errorThrown;
+
+ }
+ });
+
+
+ }
+ },
+ $savemsbRoute : function() {
+
+ msbsuccess.hide();
+ msberror.hide();
+ if (msbform.valid() == false) {
+ return false;
+ }
+
+ if(vm.msbRouteInfo.nodes.length==0){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info=$.i18n.prop('org_onap_msb_route_err_host_leastone');
+ return;
+ }
+
+ if(vm.msbRouteInfo.visualRangeArray.length==0){
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_visualrange_empty');
+ return;
+ }
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=true;
+
+ var msbUrl=vm.msbRouteInfo.url=="/"?"":vm.msbRouteInfo.url;
+
+
+ var nodes=[];
+ for(var i=0;i<vm.msbRouteInfo.nodes.length;i++){
+ var node={ip:vm.msbRouteInfo.nodes[i].ip,port:vm.msbRouteInfo.nodes[i].port,ttl: vm.msbRouteInfo.nodes[i].ttl};
+ nodes.push(node);
+ }
+
+ var data= JSON.stringify({
+ "serviceName": vm.msbRouteInfo.serviceName,
+ "version": vm.msbRouteInfo.version,
+ "url": msbUrl,
+ "nodes": nodes,
+ "protocol":vm.msbRouteInfo.protocol,
+ "visualRange":vm.msbRouteInfo.visualRangeArray.join("|")
+ });
+
+ if(vm.routeDlgInfo.saveType=="add")
+ {
+
+ //Determine whether to repeat
+ for(var i=0;i<vm.msbRouteArray.length;i++){
+
+ if(vm.msbRouteArray[i].serviceName==vm.msbRouteInfo.serviceName
+ && vm.msbRouteArray[i].version==vm.msbRouteInfo.version )
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_api_repeat',[vm.msbRouteInfo.serviceName],[vm.msbRouteInfo.version]);
+ }
+
+ }
+
+ //save
+
+
+ $.ajax({
+ "type": 'POST',
+ "url": vm.$msbRouteUrl,
+ "data" : data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ // vm.msbRouteArray.push(JSON.parse(data));
+ table.destroy();
+ vm.initMSBRoute();
+
+ // table=$('#msbTable').DataTable({
+
+ // "oLanguage": vm.$dataTableLanguage,
+ // columnDefs: [ {
+ // targets: [ 7 ],
+ // "searchable": false,
+ // "bSortable": false,
+ // }]
+ // });
+
+ $('#msbrouteDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_msb'),$.i18n.prop('org_onap_msb_route_service_save'),"success");
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_service_save')+XMLHttpRequest.responseText;
+
+ }
+ });
+ }
+ else{ //update
+
+
+ //Determine whether to repeat
+ if(vm.msbRouteInfo.serviceName!=vm.msbRouteInfo.oldServiceName ||
+ vm.msbRouteInfo.version!=vm.msbRouteInfo.oldVersion) //Has been modified service name or version
+ {
+ for(var i=0;i<vm.msbRouteArray.length;i++){
+
+ if(vm.msbRouteArray[i].serviceName==vm.msbRouteInfo.serviceName
+ && vm.msbRouteArray[i].version==vm.msbRouteInfo.version )
+ {
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_api_repeat',[vm.msbRouteInfo.serviceName],[vm.msbRouteInfo.version]);
+ return;
+ }
+
+ }
+ }
+
+ var url= vm.$msbRouteInstanceUrl;
+ var version=vm.msbRouteInfo.oldVersion==""?"null":vm.msbRouteInfo.oldVersion;
+ var serviceName2= vm.msbRouteInfo.oldServiceName.replace(/\//g,"*");
+ url=url.replace("{serviceName}",serviceName2).replace("{version}",version);
+
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "data" :data,
+ "dataType": "json",
+ "contentType":"application/json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.msbRouteArray.length;i++){
+ if(vm.msbRouteArray[i].serviceName == vm.msbRouteInfo.oldServiceName &&
+ vm.msbRouteArray[i].version == vm.msbRouteInfo.oldVersion)
+ {
+ //vm.apiRouteArray[i] = JSON.parse(data);
+ vm.msbRouteArray[i].serviceName=vm.msbRouteInfo.serviceName;
+ vm.msbRouteArray[i].version= vm.msbRouteInfo.version;
+ vm.msbRouteArray[i].url=msbUrl;
+ vm.msbRouteArray[i].protocol=vm.msbRouteInfo.protocol;
+ vm.msbRouteArray[i].visualRange=vm.msbRouteInfo.visualRange;
+ vm.msbRouteArray[i].visualRangeArray=vm.msbRouteInfo.visualRangeArray;
+ vm.msbRouteArray[i].nodes=nodes;
+
+ break;
+ }
+ }
+
+
+
+ $('#msbrouteDlg').modal('hide');
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_msb'),$.i18n.prop('org_onap_msb_route_service_update'),"success");
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ vm.server_rtn.warning_block=true;
+ vm.server_rtn.info_block=false;
+ vm.server_rtn.rtn_info= $.i18n.prop('org_onap_msb_route_err_service_save')+XMLHttpRequest.responseText;
+
+ }
+ });
+
+
+ }
+ },
+
+ updateApiRouteStatus:function(serviceName,version,status){
+
+ var url= vm.$apiRouteStatusUrl;
+ var version2=version==""?"null":version;
+ url=url.replace("{serviceName}",serviceName).replace("{version}",version2).replace("{status}",status);
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+
+
+ for(var i=0;i<vm.apiRouteArray.length;i++){
+ if(vm.apiRouteArray[i].serviceName == serviceName &&
+ vm.apiRouteArray[i].version == version){
+ vm.apiRouteArray[i].status=status;
+ break;
+ }
+ }
+
+ if(status=='1')
+ {
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_api'),$.i18n.prop('org_onap_msb_route_status_enable'),"success");
+ }
+ else{
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_api'),$.i18n.prop('org_onap_msb_route_status_disable'),"success");
+ }
+
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_onap_msb_route_err_status')+textStatus+":"+errorThrown);
+
+ }
+ });
+
+ },
+ updateiuiRouteStatus:function(serviceName,status){
+
+ var url= vm.$iuiRouteStatusUrl;
+
+ url=url.replace("{serviceName}",serviceName).replace("{status}",status);
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+
+
+ for(var i=0;i<vm.iuiRouteArray.length;i++){
+ if(vm.iuiRouteArray[i].serviceName == serviceName){
+ vm.iuiRouteArray[i].status=status;
+ break;
+ }
+ }
+
+ if(status=='1')
+ {
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_iui'),$.i18n.prop('org_onap_msb_route_status_enable'),"success");
+ }
+ else{
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_iui'),$.i18n.prop('org_onap_msb_route_status_disable'),"success");
+ }
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_onap_msb_route_err_status')+textStatus+":"+errorThrown);
+
+ }
+ });
+
+ },
+ updatecustomRouteStatus:function(serviceName,status){
+
+
+ var url= vm.$customRouteStatusUrl+"?serviceName="+serviceName+"&status="+status;
+
+
+ $.ajax({
+ "type": 'PUT',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+
+
+ for(var i=0;i<vm.customRouteArray.length;i++){
+ if(vm.customRouteArray[i].serviceName == serviceName){
+ vm.customRouteArray[i].status=status;
+ break;
+ }
+ }
+
+
+ routeUtil.groupRoute(vm.customRouteArray);
+
+ if(status=='1')
+ {
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_custom'),$.i18n.prop('org_onap_msb_route_status_enable'),"success");
+ }
+ else{
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_custom'),$.i18n.prop('org_onap_msb_route_status_disable'),"success");
+ }
+
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_onap_msb_route_err_status')+textStatus+":"+errorThrown);
+
+ }
+ });
+
+ },
+ updateApiRoute:function(apiRouteInfo,type){
+
+ if(vm.route.routeWay=="domain"){
+ vm.route.routeHost=apiRouteInfo.host+vm.route.routeSubDomain;
+ }
+ else{
+ if(apiRouteInfo.publish_port!=""){
+ vm.route.routeHost=vm.route.routeIP+":"+apiRouteInfo.publish_port;
+ }
+ else{
+ vm.route.routeHost=window.location.host.split(":")[0];
+ }
+ }
+
+
+ $('#apiJsonFullurl').collapse('hide');
+ $('#apiTab a:first').tab('show');
+
+ vm.apiRouteInfo.serviceName=apiRouteInfo.serviceName;
+ vm.apiRouteInfo.oldServiceName=apiRouteInfo.serviceName;
+ vm.apiRouteInfo.version= apiRouteInfo.version;
+ vm.apiRouteInfo.oldVersion=apiRouteInfo.version;
+ vm.apiRouteInfo.url=apiRouteInfo.url==""?"/":apiRouteInfo.url;
+ vm.apiRouteInfo.apiJson=apiRouteInfo.apiJson;
+ vm.apiRouteInfo.apiJsonType=apiRouteInfo.apiJsonType;
+ vm.apiRouteInfo.control=apiRouteInfo.control;
+ vm.apiRouteInfo.status= apiRouteInfo.status;
+ vm.apiRouteInfo.host= apiRouteInfo.host;
+ vm.apiRouteInfo.publish_port= apiRouteInfo.publish_port;
+ vm.apiRouteInfo.publishProtocol= apiRouteInfo.publishProtocol;
+
+
+ if(vm.apiRouteInfo.apiJsonType=="1"){
+ vm.apiJson.custom=apiRouteInfo.apiJson;
+ }
+ else{
+ vm.apiJson.local=apiRouteInfo.apiJson;
+ vm.apiJson.custom="/swagger.json";
+ $("#apiJsonSelect").val(apiRouteInfo.apiJson);
+ }
+
+ vm.apiRouteInfo.server="";
+ vm.apiRouteInfo.servers=[];
+ vm.apiRouteInfo.servers=apiRouteInfo.servers;
+
+
+
+
+ // vm.apiRouteInfo= jQuery.extend({},apiRouteInfo);
+
+ vm.routeDlgInfo.saveType = type;
+ if(type=='update'){
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_onap_msb_route_title_edit_api');
+ }
+ else if(type=='view'){
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_onap_msb_route_title_view_api');
+ }
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".item-tip").addClass("item-tip-focus");
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ });
+
+ $("#routeDlg").modal("show");
+ },
+ updateiuiRoute:function(iuiRouteInfo,type){
+
+ if(vm.route.routeWay=="domain"){
+ vm.route.routeHost= iuiRouteInfo.host+vm.route.routeSubDomain;
+
+ }
+ else{
+ if(iuiRouteInfo.publish_port!=""){
+ vm.route.routeHost=vm.route.routeIP+":"+iuiRouteInfo.publish_port;
+ }
+ else{
+ vm.route.routeHost=window.location.host.split(":")[0];
+ }
+ }
+
+ vm.iuiRouteInfo.serviceName=iuiRouteInfo.serviceName;
+ vm.iuiRouteInfo.oldServiceName=iuiRouteInfo.serviceName;
+ vm.iuiRouteInfo.url=iuiRouteInfo.url==""?"/":iuiRouteInfo.url;
+ vm.iuiRouteInfo.server="";
+ vm.iuiRouteInfo.servers=[];
+ vm.iuiRouteInfo.servers=iuiRouteInfo.servers;
+ vm.iuiRouteInfo.control=iuiRouteInfo.control;
+ vm.iuiRouteInfo.status=iuiRouteInfo.status;
+ vm.iuiRouteInfo.host= iuiRouteInfo.host;
+ vm.iuiRouteInfo.publish_port= iuiRouteInfo.publish_port;
+ vm.iuiRouteInfo.publishProtocol= iuiRouteInfo.publishProtocol;
+
+
+
+
+
+ // vm.apiRouteInfo= jQuery.extend({},apiRouteInfo);
+
+
+ vm.routeDlgInfo.saveType = type;
+ if(type=='update'){
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_onap_msb_route_title_edit_iui');
+ }
+ else if(type=='view'){
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_onap_msb_route_title_view_iui');
+ }
+
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".item-tip").addClass("item-tip-focus");
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ });
+
+ $("#iuirouteDlg").modal("show");
+ },
+ updatecustomRoute:function(customRouteInfo,type){
+
+ if(vm.route.routeWay=="domain"){
+ vm.route.routeHost= customRouteInfo.host+vm.route.routeSubDomain;
+
+ }
+ else{
+ if(customRouteInfo.publish_port!=""){
+ vm.route.routeHost=vm.route.routeIP+":"+customRouteInfo.publish_port;
+ }
+ else{
+ vm.route.routeHost=window.location.host.split(":")[0];
+ }
+ }
+
+
+
+ vm.customRouteInfo.serviceName=customRouteInfo.serviceName;
+ vm.customRouteInfo.oldServiceName=customRouteInfo.serviceName;
+
+ vm.customRouteInfo.url=customRouteInfo.url==""?"/":customRouteInfo.url;
+ vm.customRouteInfo.server="";
+ vm.customRouteInfo.servers=[];
+ vm.customRouteInfo.servers=customRouteInfo.servers;
+ vm.customRouteInfo.control=customRouteInfo.control;
+ vm.customRouteInfo.status=customRouteInfo.status;
+ vm.customRouteInfo.host= customRouteInfo.host;
+ vm.customRouteInfo.publish_port= customRouteInfo.publish_port;
+ vm.customRouteInfo.publishProtocol= customRouteInfo.publishProtocol;
+
+
+ // vm.apiRouteInfo= jQuery.extend({},apiRouteInfo);
+
+ vm.routeDlgInfo.saveType = type;
+ if(type=='update'){
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_onap_msb_route_title_edit_custom');
+ }
+ else if(type=='view'){
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_onap_msb_route_title_view_custom');
+ }
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".item-tip").addClass("item-tip-focus");
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ });
+
+ $("#customrouteDlg").modal("show");
+ },
+ updatemsbRoute:function(msbRouteInfo){
+
+ vm.msbRouteInfo.serviceName=msbRouteInfo.serviceName;
+ vm.msbRouteInfo.oldServiceName=msbRouteInfo.serviceName;
+ vm.msbRouteInfo.version= msbRouteInfo.version;
+ vm.msbRouteInfo.oldVersion= msbRouteInfo.version
+ vm.msbRouteInfo.url=msbRouteInfo.url==""?"/":msbRouteInfo.url;
+ vm.msbRouteInfo.protocol=msbRouteInfo.protocol;
+ vm.msbRouteInfo.visualRange=msbRouteInfo.visualRange;
+ vm.msbRouteInfo.visualRangeArray=msbRouteInfo.visualRange.split("|");
+ vm.msbRouteInfo.nodes=msbRouteInfo.nodes;
+ vm.msbRouteInfo.newHost="";
+ vm.msbRouteInfo.newttl="";
+
+ routeUtil.changeTargetServiceUrl();
+
+ vm.routeDlgInfo.saveType = "update";
+ vm.routeDlgInfo.titleName=$.i18n.prop('org_onap_msb_route_title_edit_msb');
+ vm.server_rtn.warning_block=false;
+ vm.server_rtn.info_block=false;
+
+
+ $(".form-group").each(function () {
+ $(this).removeClass('has-success');
+ $(this).removeClass('has-error');
+ $(this).find(".help-block[id]").remove();
+ $(this).find(".item-tip").addClass("item-tip-focus");
+ $(this).find(".form-tip").removeClass('form-input-focus');
+ });
+
+ $("#msbrouteDlg").modal("show");
+ },
+ delApiRoute:function(serviceName,version){
+ bootbox.confirm($.i18n.prop('org_onap_msb_route_err_service_del_ask',[serviceName],[version]),function(result){
+ if(result){
+ var url= vm.$apiRouteInstanceUrl;
+ var version2=version==""?"null":version;
+ url=url.replace("{serviceName}",serviceName).replace("{version}",version2);
+
+ $.ajax({
+ "type": 'DELETE',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.apiRouteArray.length;i++){
+ if(vm.apiRouteArray[i].serviceName == serviceName &&
+ vm.apiRouteArray[i].version == version){
+ vm.apiRouteArray.splice(i, 1);
+ break;
+ }
+ }
+
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_api'),$.i18n.prop('org_onap_msb_route_service_del_success'),"success");
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_onap_msb_route_service_del_fail')+textStatus+":"+errorThrown);
+
+ }
+ });
+
+
+ }
+
+ });
+
+ },
+ deliuiRoute:function(serviceName){
+ bootbox.confirm($.i18n.prop('org_onap_msb_route_err_service2_del_ask',[serviceName]),function(result){
+ if(result){
+ var url= vm.$iuiRouteInstanceUrl;
+
+ url=url.replace("{serviceName}",serviceName);
+
+ $.ajax({
+ "type": 'DELETE',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.iuiRouteArray.length;i++){
+ if(vm.iuiRouteArray[i].serviceName == serviceName){
+ vm.iuiRouteArray.splice(i, 1);
+ break;
+ }
+ }
+
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_iui'),$.i18n.prop('org_onap_msb_route_service_del_success'),"success");
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_onap_msb_route_service_del_fail')+textStatus+":"+errorThrown);
+
+ }
+ });
+
+
+ }
+
+ });
+
+ },
+ delcustomRoute:function(serviceName){
+ bootbox.confirm($.i18n.prop('org_onap_msb_route_err_service2_del_ask',[serviceName]),function(result){
+ if(result){
+ var url= vm.$customRouteInstanceUrl+"?serviceName="+serviceName;
+
+ $.ajax({
+ "type": 'DELETE',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+
+ for(var i=0;i<vm.customRouteArray.length;i++){
+ if(vm.customRouteArray[i].serviceName == serviceName){
+ vm.customRouteArray.splice(i, 1);
+ break;
+ }
+ }
+
+ routeUtil.groupRoute(vm.customRouteArray);
+
+
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_custom'),$.i18n.prop('org_onap_msb_route_service_del_success'),"success");
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_onap_msb_route_service_del_fail')+textStatus+":"+errorThrown);
+
+ }
+ });
+
+
+ }
+
+ });
+
+ },
+ delmsbRoute:function(serviceName,version,obj){
+ bootbox.confirm($.i18n.prop('org_onap_msb_route_err_service_del_ask',[serviceName],[version]),function(result){
+ if(result){
+ var url= vm.$msbRouteInstanceUrl;
+ var version2=version==""?"null":version;
+ var serviceName2= serviceName.replace(/\//g,"*");
+ url=url.replace("{serviceName}",serviceName2).replace("{version}",version2);
+
+ $.ajax({
+ "type": 'DELETE',
+ "url": url,
+ "dataType": "json",
+ success: function (resp) {
+ $(obj).parent().parent().addClass('selected');
+
+ for(var i=0;i<vm.msbRouteArray.length;i++){
+ if(vm.msbRouteArray[i].serviceName == serviceName &&
+ vm.msbRouteArray[i].version==version ){
+ vm.msbRouteArray.splice(i, 1);
+ break;
+ }
+ }
+
+ table.row('.selected').remove().draw( false );
+
+ routeUtil.growl($.i18n.prop('org_onap_msb_route_tab_msb'),$.i18n.prop('org_onap_msb_route_service_del_success'),"success");
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+
+ bootbox.alert($.i18n.prop('org_onap_msb_route_service_del_fail')+XMLHttpRequest.responseText);
+
+ }
+
+
+ });
+
+
+ }
+
+ });
+
+ },
+ exportServices:function(){
+ var url=apiBasePath+"/apiRoute/export"+"?routeWay="+vm.route.routeWay;
+ window.open(url);
+
+ },
+ gotoTarget:function(route,type){
+ vm.selectedRoute=route;
+ vm.selectedRouteType=type;
+
+ if (self != top) {
+ $(window.parent.document.body).animate({scrollTop:$("#msbSubPage").offset().top},1000);
+ }
+ else{
+ $("body").animate({scrollTop:$("#msbSubPage").offset().top},1000);
+ }
+
+ if(type=="api")
+ {
+ vm.gotoRestDoc();
+ }
+ else if(type=="iui"){
+ vm.gotoIUI();
+ }
+
+
+
+
+ },
+ gotoRestDoc:function(){
+ vm.routeTargetTitle=vm.selectedRoute.serviceName+"-"+$.i18n.prop("org_onap_msb_route_content_title");
+
+ var version=vm.selectedRoute.version==""?"":"/"+vm.selectedRoute.version;
+ var sourceUrl;
+
+ if(vm.selectedRoute.apiJsonType=="1")
+ {
+
+ if(vm.route.routeWay=="domain"){
+
+ sourceUrl=window.location.protocol+"//"+vm.selectedRoute.host+vm.route.routeSubDomain+ "/apijson/"+vm.selectedRoute.serviceName+version;
+ }
+ else{
+ if(vm.selectedRoute.publish_port!=""){
+ sourceUrl=vm.selectedRoute.publishProtocol+"://"+ vm.route.routeIP+":"+vm.selectedRoute.publish_port+"/apijson/"+vm.selectedRoute.serviceName+version;
+
+ }
+ else{
+ sourceUrl= "/apijson/"+vm.selectedRoute.serviceName+version;
+ }
+
+ }
+
+ }
+ else{
+ sourceUrl= iuiBasePath+"/ext/initSwaggerJson/"+vm.selectedRoute.apiJson;
+ }
+ //Local json data read from the real API service service address parameter
+ var url=iuiBasePath+"/api-doc/index.html?url="+sourceUrl+"&api=/api/"+vm.selectedRoute.serviceName+version;
+
+ $('#msbSubPage').attr("src",url);
+ vm.apiIframeUrl=url;
+ },
+ gotoIUI:function(){
+ vm.routeTargetTitle=vm.selectedRoute.serviceName+"-"+$.i18n.prop('org_onap_msb_route_iui_content_title');
+ var url;
+ if(vm.route.routeWay=="domain"){
+
+ url=window.location.protocol+"//"+vm.selectedRoute.host+vm.route.routeSubDomain+ "/iui/"+vm.selectedRoute.serviceName+"/";
+ }
+ else{
+ if(vm.selectedRoute.publish_port!=""){
+ url=vm.selectedRoute.publishProtocol+"://"+ vm.route.routeIP+":"+vm.selectedRoute.publish_port+"/iui/"+vm.selectedRoute.serviceName+"/";
+
+ }
+ else{
+ url= "/iui/"+vm.selectedRoute.serviceName+"/";
+ }
+
+
+ }
+ $('#msbSubPage').attr("src",url);
+ vm.iuiIframeUrl=url;
+ },
+ initIUIfori18n:function(){
+ vm.routeTargetTitle=$.i18n.prop("org_onap_msb_route_content_title");
+ vm.showAPITypeName=[$.i18n.prop("org_onap_msb_route_swagger_type_predefined"),$.i18n.prop("org_onap_msb_route_swagger_type_custominput")];
+ vm.dataTableLanguage={
+ "sProcessing": "<img src='../img/loading-spinner-grey.gif'/><span>&nbsp;&nbsp;Loadding...</span>",
+ "sLengthMenu": $.i18n.prop("org_onap_msb_route-table-sLengthMenu"),
+ "sZeroRecords": $.i18n.prop("org_onap_msb_route-table-sZeroRecords"),
+ "sInfo": "<span class='seperator'> </span>" + $.i18n.prop("org_onap_msb_route-table-sInfo"),
+ "sInfoEmpty": $.i18n.prop("org_onap_msb_route-table-sInfoEmpty"),
+ "sGroupActions": $.i18n.prop("org_onap_msb_route-table-sGroupActions"),
+ "sAjaxRequestGeneralError": $.i18n.prop("org_onap_msb_route-table-sAjaxRequestGeneralError"),
+ "sEmptyTable": $.i18n.prop("org_onap_msb_route-table-sEmptyTable"),
+ "oPaginate": {
+ "sPrevious": $.i18n.prop("org_onap_msb_route-table-sPrevious"),
+ "sNext": $.i18n.prop("org_onap_msb_route-table-sNext"),
+ "sPage": $.i18n.prop("org_onap_msb_route-table-sPage"),
+ "sPageOf": $.i18n.prop("org_onap_msb_route-table-sPageOf")
+ },
+ "sSearch": $.i18n.prop("org_onap_msb_route-table-search"),
+ "sInfoFiltered": $.i18n.prop("org_onap_msb_route-table-infofilter")
+ };
+
+ }
+
+
+
+ });
+
+
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/routeFunc.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/routeFunc.js
index 26fe171..aabd941 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/routeFunc.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/routeFunc.js
@@ -1,649 +1,645 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-$(function(){
-
- $('#msbTable tbody').on('click', 'td.details-control', function () {
- var tr = $(this).closest('tr');
- var row = table.row( tr );
- if ( row.child.isShown() ) {
- // This row is already open - close it
- row.child.hide();
- tr.removeClass('shown');
- }
- else {
- // Open this row
- var nodes=row.data()[1].match(/\d+.\d+.\d+.\d+:\d+:(-)?\d+/g)
-
- row.child( routeUtil.formatDetail(nodes) ).show();
- tr.addClass('shown');
- }
- } );
-
- $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
- //Get the name of the TAB has been activated
- var activeTab = $(e.target).text();
- if(this.id=="customTab" || this.id=="msbTab"){
- $("#serviceContent").hide();
- $("#upArrawDiv").hide();
- }
- else{
- $("#serviceContent").show();
- $("#upArrawDiv").show();
- $('#msbSubPage').attr("src","");
- $(".stats_box .routeDiv").removeClass("active");
- vm.selectedRouteType="";
- vm.routeTargetTitle=$.i18n.prop("org_openo_msb_route_content_title");
-
- }
- });
-
-
- $("[data-toggle='tooltip']").tooltip();
-
- $('#metricsFullurl').on('show.bs.collapse', function () {
- $('#metricsUrlCollapse').removeClass('fa-plus').addClass('fa-minus');
-
- });
-
- $('#metricsFullurl').on('hide.bs.collapse', function () {
- $('#metricsUrlCollapse').removeClass('fa-minus').addClass('fa-plus');
- });
-
- $('#apiJsonFullurl').on('show.bs.collapse', function () {
- $('#apiJsonCollapse').removeClass('fa-plus').addClass('fa-minus');
-
- });
-
- $('#apiJsonFullurl').on('hide.bs.collapse', function () {
- $('#apiJsonCollapse').removeClass('fa-minus').addClass('fa-plus');
- });
-
-
-
- $(".form-tip").blur(function(){
- if($.trim($(this).val())==""){
- $(this).removeClass("form-input-focus");
- $(this).prev().removeClass("item-tip-focus");
- }});
-
-$(".form-tip").focus(function(){
- if(!$(this).hasClass("form-input-focus")){
- $(this).addClass("form-input-focus");
- $(this).prev().addClass("item-tip-focus");
- }});
-
-$(".item-tip").click(function(){
- $(this).next().focus();
-});
-
-
-
-$("input[name='version']").blur(function(){
- $(this).val($(this).val().toLowerCase());
- routeUtil.changeTargetServiceUrl();
-});
-
-
-$("input[name='url']").blur(function(){
-
-routeUtil.changeTargetServiceUrl();
-
-});
-$("input[name='serviceName']").blur(function(){
-
-routeUtil.changeTargetServiceUrl();
-
-});
-
-
-
-$("select[name='protocol']").change(function(){
-
-routeUtil.changeTargetServiceUrl();
-
-});
-
-/*
-
-$("input[name='oriService']").blur(function(){
- var oriService=$.trim($(this).val());
- if(oriService==""){
- $("input[name='serviceName']").val("");
- $("input[name='version']").val("");
- $("input[name='server']").val("");
- $("input[name='url']").val("");
- return;
- }
-
-
-
- var reg=/^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/
- var reg_standard_match=/^(.*:\d{1,5})\/api\/(.*)\/(v.*)$/
- var reg_unstandard_match=/^(.*:\d{1,5})(\/.*)$/
- if(reg.test(oriService)){
- if(reg_standard_match.test(oriService)){
- //标准api
- var group = oriService.match(reg_standard_match);
- $("input[name='serviceName']").val(group[2]);
- $("input[name='server']").val(group[1].replace("http://",""));
-
-
- var version=group[3];
- var reg_endName_match=/^(.*?)\/.*$/
- if(reg_endName_match.test(version)){
- version = version.match(reg_endName_match)[1];
- }
- $("input[name='version']").val(version);
- $("input[name='url']").val("/api/"+group[2]+"/"+version);
-
- if(!$("input[name='version']").hasClass("form-input-focus")){
- $("input[name='version']").addClass("form-input-focus");
- $("input[name='version']").prev().addClass("item-tip-focus");
- }
-
-
-
- }
- else{
- //éžæ ‡å‡†api
- var group = oriService.match(reg_unstandard_match);
- var reg_endName_match=/^(.*?)\/$/
- var url=group[2];
- if(url!="/" && reg_endName_match.test(url)){
- url = url.match(reg_endName_match)[1];
- }
-
-
- $("input[name='serviceName']").val("");
- $("input[name='version']").val("");
- $("input[name='server']").val(group[1].replace("http://",""));
- $("input[name='url']").val(url);
- }
-
- if(!$("input[name='server']").hasClass("form-input-focus")){
- $("input[name='server']").addClass("form-input-focus");
- $("input[name='server']").prev().addClass("item-tip-focus");
- }
- }
-
-
-});
-
-
-$("input[name='iuioriService']").blur(function(){
- var oriService=$.trim($(this).val());
- if(oriService==""){
- $("input[name='iuiserviceName']").val("");
- $("input[name='iuiserver']").val("");
- $("input[name='iuiurl']").val("");
- return;
- }
-
-
-
- var reg=/^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/
- var reg_standard_match=/^(.*:\d{1,5})\/iui\/(.*|.*\/)$/
- var reg_unstandard_match=/^(.*:\d{1,5})(\/.*)$/
- if(reg.test(oriService)){
- if(reg_standard_match.test(oriService)){
- //标准api
- var group = oriService.match(reg_standard_match);
-
-
- $("input[name='iuiserver']").val(group[1].replace("http://",""));
-
-
- var serviceName=group[2];
- var reg_endName_match=/^(.*?)\/.*$/
- if(reg_endName_match.test(serviceName)){
- serviceName = serviceName.match(reg_endName_match)[1];
- }
- $("input[name='iuiserviceName']").val(serviceName);
- $("input[name='iuiurl']").val("/iui/"+serviceName);
-
- }
- else{
- //éžæ ‡å‡†api
- var group = oriService.match(reg_unstandard_match);
-
- var reg_endName_match=/^(.*?)\/$/
- var url=group[2];
- if(url!="/" && reg_endName_match.test(url)){
- url = url.match(reg_endName_match)[1];
- }
- $("input[name='iuiserver']").val(group[1].replace("http://",""));
- $("input[name='iuiurl']").val(url);
- }
-
- if(!$("input[name='iuiserver']").hasClass("form-input-focus")){
- $("input[name='iuiserver']").addClass("form-input-focus");
- $("input[name='iuiserver']").prev().addClass("item-tip-focus");
- }
- }
-
-
-});
-
-$("input[name='customoriService']").blur(function(){
- var oriService=$.trim($(this).val());
- if(oriService==""){
- $("input[name='customserviceName']").val("");
- $("input[name='customserver']").val("");
- $("input[name='customurl']").val("");
- return;
- }
-
-
-
- var reg=/^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/
-
- var reg_unstandard_match=/^(.*:\d{1,5})(\/.*)$/
- if(reg.test(oriService)){
-
-
- var group = oriService.match(reg_unstandard_match);
-
- var reg_endName_match=/^(.*?)\/$/
- var url=group[2];
- if(url!="/" && reg_endName_match.test(url)){
- url = url.match(reg_endName_match)[1];
- }
- $("input[name='customserver']").val(group[1].replace("http://",""));
- $("input[name='customurl']").val(url);
- $("input[name='customserviceName']").val(url);
-
-
- if(!$("input[name='customserver']").hasClass("form-input-focus")){
- $("input[name='customserver']").addClass("form-input-focus");
- $("input[name='customserver']").prev().addClass("item-tip-focus");
- }
- }
-
-
-});
-
-*/
-
- jQuery.validator.addMethod("ip", function(value, element) {
- return this.optional(element) || /^(([-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/.test(value);
- }, $.i18n.prop('org_openo_msb_route_validator_ip_format'));
-
-
-
- jQuery.validator.addMethod("url_head", function(value, element) {
- return this.optional(element) || /^\/.+((?!\/).)$/i.test(value) || /^\/$/i.test(value);
- }, $.i18n.prop('org_openo_msb_route_validator_url_head_format'));
-
-
-jQuery.validator.addMethod("url_head_only", function(value, element) {
- return this.optional(element) || /^\/.*$/i.test(value);
- }, $.i18n.prop('org_openo_msb_route_validator_url_head_only_format'));
-
- jQuery.validator.addMethod("version", function(value, element) {
- return this.optional(element) || /^v\d+(\.\d+)?$/i.test(value);
- }, $.i18n.prop('org_openo_msb_route_form_version_tip'));
-
- jQuery.validator.addMethod("service_url", function(value, element) {
- return this.optional(element) || /^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/.test(value);
- }, $.i18n.prop('org_openo_msb_route_validator_url_format'));
-
- jQuery.validator.addMethod("url_line", function(value, element) {
- return this.optional(element) || /^((?!\/).)*$/.test(value);
- }, $.i18n.prop('org_openo_msb_route_validator_url_line_format'));
-
- jQuery.validator.addMethod("content", function(value, element) {
- return this.optional(element) || /^([0-9a-zA-Z]|-|_)*$/i.test(value);
- }, $.i18n.prop('org_openo_msb_route_validator_content_format'));
-
- jQuery.validator.addMethod("custom_content", function(value, element) {
- return this.optional(element) || /^([0-9a-zA-Z]|-|_|\/)*$/i.test(value);
- }, $.i18n.prop('org_openo_msb_route_validator_content_format'));
-
-
- });
-
- var form = $('#routeForm');
- var error = $('.alert-danger', form);
- var success = $('.alert-success', form);
-
- var iuiform = $('#iuirouteForm');
- var iuierror = $('.alert-danger', iuiform);
- var iuisuccess = $('.alert-success', iuiform);
-
-
- var customform = $('#customrouteForm');
- var customerror = $('.alert-danger', customform);
- var customsuccess = $('.alert-success', customform);
-
- var msbform = $('#msbForm');
- var msberror = $('.alert-danger', msbform);
- var msbsuccess = $('.alert-success', msbform);
-
-
- form.validate({
- doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
- errorElement: 'span', //default input error message container
- errorClass: 'help-block', // default input error message class
- focusInvalid: false, // do not focus the last invalid input
- rules: {
- /* oriService:{
- service_url:true,
- maxlength:100
- },*/
- serviceName:{
- required: true,
- url_line:true,
- content:true,
- maxlength:50
- },
- version:{
- // required: true,
- maxlength:50,
- version:true
- },
- url:{
- required: true,
- url_head:true,
- maxlength:50
- },
- metricsUrl:{
- url_head:true,
- maxlength:50
- },
- server:{
- ip:true,
- maxlength:50
- }
- },
- messages: {
- serviceName:{
- required: "Please enter the service name"
- },
- url:{
- required: "Please enter the URL address"
-
- },
- server:{
- required:"Please enter the Host address"
-
- },
-
- },
- errorPlacement: function (error, element) { // render error placement for each input type
- error.insertAfter(element); // for other inputs, just perform default behavior
- },
-
- invalidHandler: function (event, validator) { //display error alert on form submit
- success.hide();
- error.show();
- //ZteFrameWork.scrollTo(error, -200);
- },
-
- highlight: function (element) { // hightlight error inputs
- $(element)
- .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group
- },
-
- unhighlight: function (element) { // revert the change done by hightlight
- $(element)
- .closest('.form-group').removeClass('has-error'); // set error class to the control group
- },
-
- success: function (label) {
- label
- .addClass('valid') // mark the current input as valid and display OK icon
- .closest('.form-group').removeClass('has-error'); // set success class to the control group
- },
- submitHandler: function (form) {
- success.show();
- error.hide();
- //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax
- }
-
- });
-
- iuiform.validate({
- doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
- errorElement: 'span', //default input error message container
- errorClass: 'help-block', // default input error message class
- focusInvalid: false, // do not focus the last invalid input
- rules: {
- /*iuioriService:{
- service_url:true,
- maxlength:100
- },*/
- iuiserviceName:{
- required: true,
- url_line:true,
- maxlength:50,
- content:true
- },
- iuiurl:{
- required: true,
- url_head:true,
- maxlength:50
- },
- iuiserver:{
- ip:true,
- maxlength:50
- }
- },
- messages: {
- iuiserviceName:{
- required: "Please enter the service name"
- },
- iuiurl:{
- required:"Please enter the URL address"
-
- },
- iuiserver:{
- required: "Please enter the Host address"
- },
-
- },
- errorPlacement: function (iuierror, element) { // render error placement for each input type
- iuierror.insertAfter(element); // for other inputs, just perform default behavior
- },
-
- invalidHandler: function (event, validator) { //display error alert on form submit
- iuisuccess.hide();
- iuierror.show();
- //ZteFrameWork.scrollTo(error, -200);
- },
-
- highlight: function (element) { // hightlight error inputs
- $(element)
- .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group
- },
-
- unhighlight: function (element) { // revert the change done by hightlight
- $(element)
- .closest('.form-group').removeClass('has-error'); // set error class to the control group
- },
-
- success: function (label) {
- label
- .addClass('valid') // mark the current input as valid and display OK icon
- .closest('.form-group').removeClass('has-error'); // set success class to the control group
- },
- submitHandler: function (form) {
- iuisuccess.show();
- iuierror.hide();
- //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax
- }
-
- });
-
- customform.validate({
- doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
- errorElement: 'span', //default input error message container
- errorClass: 'help-block', // default input error message class
- focusInvalid: false, // do not focus the last invalid input
- rules: {
- /*customoriService:{
- service_url:true,
- maxlength:100
- },*/
- customserviceName:{
- required: false,
- url_head:true,
- maxlength:100,
- custom_content:true
- },
- customurl:{
- required: true,
- url_head:true,
- maxlength:50
- },
- customserver:{
- ip:true,
- maxlength:50
- }
- },
- messages: {
- customserviceName:{
- required: "Please enter the service name"
- },
- customurl:{
- required: "Please enter the URL address"
-
- }
-
- },
- errorPlacement: function (customerror, element) { // render error placement for each input type
- customerror.insertAfter(element); // for other inputs, just perform default behavior
- },
-
- invalidHandler: function (event, validator) { //display error alert on form submit
- customsuccess.hide();
- customerror.show();
- //ZteFrameWork.scrollTo(error, -200);
- },
-
- highlight: function (element) { // hightlight error inputs
- $(element)
- .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group
- },
-
- unhighlight: function (element) { // revert the change done by hightlight
- $(element)
- .closest('.form-group').removeClass('has-error'); // set error class to the control group
- },
-
- success: function (label) {
- label
- .addClass('valid') // mark the current input as valid and display OK icon
- .closest('.form-group').removeClass('has-error'); // set success class to the control group
- },
- submitHandler: function (form) {
- customsuccess.show();
- customerror.hide();
- //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax
- }
-
- });
-
-
- msbform.validate({
- doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
- errorElement: 'span', //default input error message container
- errorClass: 'help-block', // default input error message class
- focusInvalid: false, // do not focus the last invalid input
- rules: {
-
- serviceName:{
- required: true,
- // url_line:true,
- custom_content:true,
- maxlength:50
- },
- version:{
- maxlength:50,
- version:true
- },
- url:{
- url_head:true,
- maxlength:50
- },
- newHost:{
- ip:true,
- maxlength:50
- },
- newttl:{
- digits:true,
- min:0
- },
- protocol:{
- required: true
- },
- type:{
- required: true
- }
- },
- messages: {
- serviceName:{
- required: "Please enter the service name"
- },
- protocol:{
- required: "Please select a service protocol"
- },
- type:{
- required: "Please select a service type"
-
- },
- newttl:{
- digits:"Please enter an integer",
- min: "Not a negative"
- }
-
- },
- errorPlacement: function (msberror, element) { // render error placement for each input type
- msberror.insertAfter(element); // for other inputs, just perform default behavior
- },
-
- invalidHandler: function (event, validator) { //display error alert on form submit
- msbsuccess.hide();
- msberror.show();
- //ZteFrameWork.scrollTo(error, -200);
- },
-
- highlight: function (element) { // hightlight error inputs
- $(element)
- .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group
- },
-
- unhighlight: function (element) { // revert the change done by hightlight
- $(element)
- .closest('.form-group').removeClass('has-error'); // set error class to the control group
- },
-
- success: function (label) {
- label
- .addClass('valid') // mark the current input as valid and display OK icon
- .closest('.form-group').removeClass('has-error'); // set success class to the control group
- },
- submitHandler: function (form) {
- msbsuccess.show();
- msberror.hide();
- //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax
- }
-
- });
-
-
+/*
+ * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+ *
+ * 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.
+ */
+$(function(){
+
+ $('#msbTable tbody').on('click', 'td.details-control', function () {
+ var tr = $(this).closest('tr');
+ var row = table.row( tr );
+ if ( row.child.isShown() ) {
+ // This row is already open - close it
+ row.child.hide();
+ tr.removeClass('shown');
+ }
+ else {
+ // Open this row
+ var nodes=row.data()[1].match(/\d+.\d+.\d+.\d+:\d+:(-)?\d+/g)
+
+ row.child( routeUtil.formatDetail(nodes) ).show();
+ tr.addClass('shown');
+ }
+ } );
+
+ $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
+ //Get the name of the TAB has been activated
+ var activeTab = $(e.target).text();
+ if(this.id=="customTab" || this.id=="msbTab"){
+ $("#serviceContent").hide();
+ $("#upArrawDiv").hide();
+ }
+ else{
+ $("#serviceContent").show();
+ $("#upArrawDiv").show();
+ $('#msbSubPage').attr("src","");
+ $(".stats_box .routeDiv").removeClass("active");
+ vm.selectedRouteType="";
+ vm.routeTargetTitle=$.i18n.prop("org_onap_msb_route_content_title");
+
+ }
+ });
+
+
+ $("[data-toggle='tooltip']").tooltip();
+
+ $('#metricsFullurl').on('show.bs.collapse', function () {
+ $('#metricsUrlCollapse').removeClass('fa-plus').addClass('fa-minus');
+
+ });
+
+ $('#metricsFullurl').on('hide.bs.collapse', function () {
+ $('#metricsUrlCollapse').removeClass('fa-minus').addClass('fa-plus');
+ });
+
+ $('#apiJsonFullurl').on('show.bs.collapse', function () {
+ $('#apiJsonCollapse').removeClass('fa-plus').addClass('fa-minus');
+
+ });
+
+ $('#apiJsonFullurl').on('hide.bs.collapse', function () {
+ $('#apiJsonCollapse').removeClass('fa-minus').addClass('fa-plus');
+ });
+
+
+
+ $(".form-tip").blur(function(){
+ if($.trim($(this).val())==""){
+ $(this).removeClass("form-input-focus");
+ $(this).prev().removeClass("item-tip-focus");
+ }});
+
+$(".form-tip").focus(function(){
+ if(!$(this).hasClass("form-input-focus")){
+ $(this).addClass("form-input-focus");
+ $(this).prev().addClass("item-tip-focus");
+ }});
+
+$(".item-tip").click(function(){
+ $(this).next().focus();
+});
+
+
+
+$("input[name='version']").blur(function(){
+ $(this).val($(this).val().toLowerCase());
+ routeUtil.changeTargetServiceUrl();
+});
+
+
+$("input[name='url']").blur(function(){
+
+routeUtil.changeTargetServiceUrl();
+
+});
+$("input[name='serviceName']").blur(function(){
+
+routeUtil.changeTargetServiceUrl();
+
+});
+
+
+
+$("select[name='protocol']").change(function(){
+
+routeUtil.changeTargetServiceUrl();
+
+});
+
+/*
+
+$("input[name='oriService']").blur(function(){
+ var oriService=$.trim($(this).val());
+ if(oriService==""){
+ $("input[name='serviceName']").val("");
+ $("input[name='version']").val("");
+ $("input[name='server']").val("");
+ $("input[name='url']").val("");
+ return;
+ }
+
+
+
+ var reg=/^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/
+ var reg_standard_match=/^(.*:\d{1,5})\/api\/(.*)\/(v.*)$/
+ var reg_unstandard_match=/^(.*:\d{1,5})(\/.*)$/
+ if(reg.test(oriService)){
+ if(reg_standard_match.test(oriService)){
+ //标准api
+ var group = oriService.match(reg_standard_match);
+ $("input[name='serviceName']").val(group[2]);
+ $("input[name='server']").val(group[1].replace("http://",""));
+
+
+ var version=group[3];
+ var reg_endName_match=/^(.*?)\/.*$/
+ if(reg_endName_match.test(version)){
+ version = version.match(reg_endName_match)[1];
+ }
+ $("input[name='version']").val(version);
+ $("input[name='url']").val("/api/"+group[2]+"/"+version);
+
+ if(!$("input[name='version']").hasClass("form-input-focus")){
+ $("input[name='version']").addClass("form-input-focus");
+ $("input[name='version']").prev().addClass("item-tip-focus");
+ }
+
+
+
+ }
+ else{
+ //éžæ ‡å‡†api
+ var group = oriService.match(reg_unstandard_match);
+ var reg_endName_match=/^(.*?)\/$/
+ var url=group[2];
+ if(url!="/" && reg_endName_match.test(url)){
+ url = url.match(reg_endName_match)[1];
+ }
+
+
+ $("input[name='serviceName']").val("");
+ $("input[name='version']").val("");
+ $("input[name='server']").val(group[1].replace("http://",""));
+ $("input[name='url']").val(url);
+ }
+
+ if(!$("input[name='server']").hasClass("form-input-focus")){
+ $("input[name='server']").addClass("form-input-focus");
+ $("input[name='server']").prev().addClass("item-tip-focus");
+ }
+ }
+
+
+});
+
+
+$("input[name='iuioriService']").blur(function(){
+ var oriService=$.trim($(this).val());
+ if(oriService==""){
+ $("input[name='iuiserviceName']").val("");
+ $("input[name='iuiserver']").val("");
+ $("input[name='iuiurl']").val("");
+ return;
+ }
+
+
+
+ var reg=/^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/
+ var reg_standard_match=/^(.*:\d{1,5})\/iui\/(.*|.*\/)$/
+ var reg_unstandard_match=/^(.*:\d{1,5})(\/.*)$/
+ if(reg.test(oriService)){
+ if(reg_standard_match.test(oriService)){
+ //标准api
+ var group = oriService.match(reg_standard_match);
+
+
+ $("input[name='iuiserver']").val(group[1].replace("http://",""));
+
+
+ var serviceName=group[2];
+ var reg_endName_match=/^(.*?)\/.*$/
+ if(reg_endName_match.test(serviceName)){
+ serviceName = serviceName.match(reg_endName_match)[1];
+ }
+ $("input[name='iuiserviceName']").val(serviceName);
+ $("input[name='iuiurl']").val("/iui/"+serviceName);
+
+ }
+ else{
+ //éžæ ‡å‡†api
+ var group = oriService.match(reg_unstandard_match);
+
+ var reg_endName_match=/^(.*?)\/$/
+ var url=group[2];
+ if(url!="/" && reg_endName_match.test(url)){
+ url = url.match(reg_endName_match)[1];
+ }
+ $("input[name='iuiserver']").val(group[1].replace("http://",""));
+ $("input[name='iuiurl']").val(url);
+ }
+
+ if(!$("input[name='iuiserver']").hasClass("form-input-focus")){
+ $("input[name='iuiserver']").addClass("form-input-focus");
+ $("input[name='iuiserver']").prev().addClass("item-tip-focus");
+ }
+ }
+
+
+});
+
+$("input[name='customoriService']").blur(function(){
+ var oriService=$.trim($(this).val());
+ if(oriService==""){
+ $("input[name='customserviceName']").val("");
+ $("input[name='customserver']").val("");
+ $("input[name='customurl']").val("");
+ return;
+ }
+
+
+
+ var reg=/^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/
+
+ var reg_unstandard_match=/^(.*:\d{1,5})(\/.*)$/
+ if(reg.test(oriService)){
+
+
+ var group = oriService.match(reg_unstandard_match);
+
+ var reg_endName_match=/^(.*?)\/$/
+ var url=group[2];
+ if(url!="/" && reg_endName_match.test(url)){
+ url = url.match(reg_endName_match)[1];
+ }
+ $("input[name='customserver']").val(group[1].replace("http://",""));
+ $("input[name='customurl']").val(url);
+ $("input[name='customserviceName']").val(url);
+
+
+ if(!$("input[name='customserver']").hasClass("form-input-focus")){
+ $("input[name='customserver']").addClass("form-input-focus");
+ $("input[name='customserver']").prev().addClass("item-tip-focus");
+ }
+ }
+
+
+});
+
+*/
+
+ jQuery.validator.addMethod("ip", function(value, element) {
+ return this.optional(element) || /^(([-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})$/.test(value);
+ }, $.i18n.prop('org_onap_msb_route_validator_ip_format'));
+
+
+
+ jQuery.validator.addMethod("url_head", function(value, element) {
+ return this.optional(element) || /^\/.+((?!\/).)$/i.test(value) || /^\/$/i.test(value);
+ }, $.i18n.prop('org_onap_msb_route_validator_url_head_format'));
+
+
+jQuery.validator.addMethod("url_head_only", function(value, element) {
+ return this.optional(element) || /^\/.*$/i.test(value);
+ }, $.i18n.prop('org_onap_msb_route_validator_url_head_only_format'));
+
+ jQuery.validator.addMethod("version", function(value, element) {
+ return this.optional(element) || /^v\d+(\.\d+)?$/i.test(value);
+ }, $.i18n.prop('org_onap_msb_route_form_version_tip'));
+
+ jQuery.validator.addMethod("service_url", function(value, element) {
+ return this.optional(element) || /^(|http:\/\/)(([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.)(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))\.){2}([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))):(\d{1,5})\/.*$/.test(value);
+ }, $.i18n.prop('org_onap_msb_route_validator_url_format'));
+
+ jQuery.validator.addMethod("url_line", function(value, element) {
+ return this.optional(element) || /^((?!\/).)*$/.test(value);
+ }, $.i18n.prop('org_onap_msb_route_validator_url_line_format'));
+
+ jQuery.validator.addMethod("content", function(value, element) {
+ return this.optional(element) || /^([0-9a-zA-Z]|-|_)*$/i.test(value);
+ }, $.i18n.prop('org_onap_msb_route_validator_content_format'));
+
+ jQuery.validator.addMethod("custom_content", function(value, element) {
+ return this.optional(element) || /^([0-9a-zA-Z]|-|_|\/)*$/i.test(value);
+ }, $.i18n.prop('org_onap_msb_route_validator_content_format'));
+
+
+ });
+
+ var form = $('#routeForm');
+ var error = $('.alert-danger', form);
+ var success = $('.alert-success', form);
+
+ var iuiform = $('#iuirouteForm');
+ var iuierror = $('.alert-danger', iuiform);
+ var iuisuccess = $('.alert-success', iuiform);
+
+
+ var customform = $('#customrouteForm');
+ var customerror = $('.alert-danger', customform);
+ var customsuccess = $('.alert-success', customform);
+
+ var msbform = $('#msbForm');
+ var msberror = $('.alert-danger', msbform);
+ var msbsuccess = $('.alert-success', msbform);
+
+
+ form.validate({
+ doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
+ errorElement: 'span', //default input error message container
+ errorClass: 'help-block', // default input error message class
+ focusInvalid: false, // do not focus the last invalid input
+ rules: {
+ /* oriService:{
+ service_url:true,
+ maxlength:100
+ },*/
+ serviceName:{
+ required: true,
+ url_line:true,
+ content:true,
+ maxlength:50
+ },
+ version:{
+ // required: true,
+ maxlength:50,
+ version:true
+ },
+ url:{
+ required: true,
+ url_head:true,
+ maxlength:50
+ },
+ metricsUrl:{
+ url_head:true,
+ maxlength:50
+ },
+ server:{
+ ip:true,
+ maxlength:50
+ }
+ },
+ messages: {
+ serviceName:{
+ required: "Please enter the service name"
+ },
+ url:{
+ required: "Please enter the URL address"
+
+ },
+ server:{
+ required:"Please enter the Host address"
+
+ }
+
+ },
+ errorPlacement: function (error, element) { // render error placement for each input type
+ error.insertAfter(element); // for other inputs, just perform default behavior
+ },
+
+ invalidHandler: function (event, validator) { //display error alert on form submit
+ success.hide();
+ error.show();
+ //ZteFrameWork.scrollTo(error, -200);
+ },
+
+ highlight: function (element) { // hightlight error inputs
+ $(element)
+ .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group
+ },
+
+ unhighlight: function (element) { // revert the change done by hightlight
+ $(element)
+ .closest('.form-group').removeClass('has-error'); // set error class to the control group
+ },
+
+ success: function (label) {
+ label
+ .addClass('valid') // mark the current input as valid and display OK icon
+ .closest('.form-group').removeClass('has-error'); // set success class to the control group
+ },
+ submitHandler: function (form) {
+ success.show();
+ error.hide();
+ //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax
+ }
+
+ });
+
+ iuiform.validate({
+ doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
+ errorElement: 'span', //default input error message container
+ errorClass: 'help-block', // default input error message class
+ focusInvalid: false, // do not focus the last invalid input
+ rules: {
+ /*iuioriService:{
+ service_url:true,
+ maxlength:100
+ },*/
+ iuiserviceName:{
+ required: true,
+ url_line:true,
+ maxlength:50,
+ content:true
+ },
+ iuiurl:{
+ required: true,
+ url_head:true,
+ maxlength:50
+ },
+ iuiserver:{
+ ip:true,
+ maxlength:50
+ }
+ },
+ messages: {
+ iuiserviceName:{
+ required: "Please enter the service name"
+ },
+ iuiurl:{
+ required:"Please enter the URL address"
+
+ },
+ iuiserver:{
+ required: "Please enter the Host address"
+ }
+ },
+ errorPlacement: function (iuierror, element) { // render error placement for each input type
+ iuierror.insertAfter(element); // for other inputs, just perform default behavior
+ },
+
+ invalidHandler: function (event, validator) { //display error alert on form submit
+ iuisuccess.hide();
+ iuierror.show();
+ //ZteFrameWork.scrollTo(error, -200);
+ },
+
+ highlight: function (element) { // hightlight error inputs
+ $(element)
+ .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group
+ },
+
+ unhighlight: function (element) { // revert the change done by hightlight
+ $(element)
+ .closest('.form-group').removeClass('has-error'); // set error class to the control group
+ },
+
+ success: function (label) {
+ label
+ .addClass('valid') // mark the current input as valid and display OK icon
+ .closest('.form-group').removeClass('has-error'); // set success class to the control group
+ },
+ submitHandler: function (form) {
+ iuisuccess.show();
+ iuierror.hide();
+ //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax
+ }
+
+ });
+
+ customform.validate({
+ doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
+ errorElement: 'span', //default input error message container
+ errorClass: 'help-block', // default input error message class
+ focusInvalid: false, // do not focus the last invalid input
+ rules: {
+ /*customoriService:{
+ service_url:true,
+ maxlength:100
+ },*/
+ customserviceName:{
+ required: false,
+ url_head:true,
+ maxlength:100,
+ custom_content:true
+ },
+ customurl:{
+ required: true,
+ url_head:true,
+ maxlength:50
+ },
+ customserver:{
+ ip:true,
+ maxlength:50
+ }
+ },
+ messages: {
+ customserviceName:{
+ required: "Please enter the service name"
+ },
+ customurl:{
+ required: "Please enter the URL address"
+
+ }
+
+ },
+ errorPlacement: function (customerror, element) { // render error placement for each input type
+ customerror.insertAfter(element); // for other inputs, just perform default behavior
+ },
+
+ invalidHandler: function (event, validator) { //display error alert on form submit
+ customsuccess.hide();
+ customerror.show();
+ //ZteFrameWork.scrollTo(error, -200);
+ },
+
+ highlight: function (element) { // hightlight error inputs
+ $(element)
+ .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group
+ },
+
+ unhighlight: function (element) { // revert the change done by hightlight
+ $(element)
+ .closest('.form-group').removeClass('has-error'); // set error class to the control group
+ },
+
+ success: function (label) {
+ label
+ .addClass('valid') // mark the current input as valid and display OK icon
+ .closest('.form-group').removeClass('has-error'); // set success class to the control group
+ },
+ submitHandler: function (form) {
+ customsuccess.show();
+ customerror.hide();
+ //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax
+ }
+
+ });
+
+
+ msbform.validate({
+ doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.
+ errorElement: 'span', //default input error message container
+ errorClass: 'help-block', // default input error message class
+ focusInvalid: false, // do not focus the last invalid input
+ rules: {
+
+ serviceName:{
+ required: true,
+ // url_line:true,
+ custom_content:true,
+ maxlength:50
+ },
+ version:{
+ maxlength:50,
+ version:true
+ },
+ url:{
+ url_head:true,
+ maxlength:50
+ },
+ newHost:{
+ ip:true,
+ maxlength:50
+ },
+ newttl:{
+ digits:true,
+ min:0
+ },
+ protocol:{
+ required: true
+ },
+ type:{
+ required: true
+ }
+ },
+ messages: {
+ serviceName:{
+ required: "Please enter the service name"
+ },
+ protocol:{
+ required: "Please select a service protocol"
+ },
+ type:{
+ required: "Please select a service type"
+
+ },
+ newttl:{
+ digits:"Please enter an integer",
+ min: "Not a negative"
+ }
+
+ },
+ errorPlacement: function (msberror, element) { // render error placement for each input type
+ msberror.insertAfter(element); // for other inputs, just perform default behavior
+ },
+
+ invalidHandler: function (event, validator) { //display error alert on form submit
+ msbsuccess.hide();
+ msberror.show();
+ //ZteFrameWork.scrollTo(error, -200);
+ },
+
+ highlight: function (element) { // hightlight error inputs
+ $(element)
+ .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group
+ },
+
+ unhighlight: function (element) { // revert the change done by hightlight
+ $(element)
+ .closest('.form-group').removeClass('has-error'); // set error class to the control group
+ },
+
+ success: function (label) {
+ label
+ .addClass('valid') // mark the current input as valid and display OK icon
+ .closest('.form-group').removeClass('has-error'); // set success class to the control group
+ },
+ submitHandler: function (form) {
+ msbsuccess.show();
+ msberror.hide();
+ //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax
+ }
+
+ });
+
+
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/routeUtil.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/routeUtil.js
index 42629cc..954e68c 100644
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/routeUtil.js
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/routeUtil.js
@@ -1,33 +1,42 @@
/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. All rights reserved.
+ * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
*
* 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
+ * 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
*/
var routeUtil = {};
routeUtil.growl=function(title,message,type){
$.growl({
icon: "fa fa-envelope-o fa-lg",
- title: "&nbsp;&nbsp;"+$.i18n.prop('org_openo_msb_route_property_ttl')+title,
+ title: "&nbsp;&nbsp;"+$.i18n.prop('org_onap_msb_route_property_ttl')+title,
message: message+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
},{
type: type
});
}
+routeUtil.cutString=function(str){
+ var newStr;
+ if(str.length>22){
+ newStr=str.substring(0,20)+"...";
+ }
+ else{
+ newStr=str;
+ }
+
+ return newStr;
+}
+
routeUtil.refreshRoute=function(){
$(".stats_box .routeDiv div[data-name='route_click_zone']").on({
@@ -54,6 +63,74 @@ routeUtil.refreshRoute=function(){
}
+routeUtil.groupRouteByPort=function(resp){
+ var routeArray=new Array();
+ var routeGroupArray=[[]];
+ for(var i=0;i<resp.length;i++){
+
+ var publish_port=resp[i].publish_port;
+
+
+ //Loop all packet classification
+ if(routeArray[publish_port] == undefined){
+ var list = [];
+ list.push(resp[i]);
+ routeArray[publish_port] = list;
+ }else{
+ routeArray[publish_port].push(resp[i]);
+ }
+
+ }
+
+ //Sorting through all quantity > 1
+
+
+ for(var groupServiceName in routeArray){
+
+ if(groupServiceName==""){
+ routeGroupArray[0]=routeArray[groupServiceName];
+ }
+ else{
+ routeGroupArray.push(routeArray[groupServiceName]);
+ }
+
+ }
+
+
+ for(var i=0;i<routeGroupArray.length;i++){
+
+ routeGroupArray[i].sort(function(a,b){return a.serviceName>b.serviceName?1:-1});
+ }
+
+
+
+ return routeGroupArray;
+
+}
+
+routeUtil.showGroupPort=function(index,serviceArray){
+
+ var defaultPort=vm.route.routePort+" <span class='protocal'>http</span> / 443 <span class='protocal'>https</span>";
+
+ if(serviceArray[0]==null) {return defaultPort;}
+
+ var publish_port=serviceArray[0].publish_port
+
+ if(publish_port==""){ return defaultPort;}
+ else { return publish_port}
+
+}
+
+routeUtil.showPotocol=function(publish_port,publishProtocol){
+
+ if(publish_port=="") return "";
+
+ return "<div class=\"protocal\" style=\"float:right\">"+publishProtocol+"</div>";
+
+}
+
+
+
//Sorting grouping custom service
routeUtil.groupRoute=function(resp){
var routeArray=new Array();
@@ -77,7 +154,7 @@ routeUtil.groupRoute=function(resp){
groupServiceName = fullServiceName.match(reg_match2)[1];
}
else{
- groupServiceName=$.i18n.prop('org_openo_msb_route_property_root');
+ groupServiceName=$.i18n.prop('org_onap_msb_route_property_root');
}
@@ -137,7 +214,7 @@ routeUtil.showGroupName=function(index,serviceArray){
var maxGroupSN=vm.customGroupRouteArray.length-1;
if(index==maxGroupSN){
- return $.i18n.prop('org_openo_msb_route_property_other_group');
+ return $.i18n.prop('org_onap_msb_route_property_other_group');
}
else{
var serviceName=serviceArray[0].serviceName;
@@ -193,13 +270,13 @@ routeUtil.currentTime=function()
routeUtil.showStatus=function(status){
if(status === '1'){
- return " <span class='label label-success'>"+$.i18n.prop('org_openo_msb_route_property_normal')+"</span>";
+ return " <span class='label label-success'>"+$.i18n.prop('org_onap_msb_route_property_normal')+"</span>";
}
else if(status === '0'){
- return " <span class='label label-danger'>"+$.i18n.prop('org_openo_msb_route_property_disable')+"</span>";
+ return " <span class='label label-danger'>"+$.i18n.prop('org_onap_msb_route_property_disable')+"</span>";
}
else {
- return " <span class='label label-info'>"+$.i18n.prop('org_openo_msb_route_property_unknown')+"</span>";
+ return " <span class='label label-info'>"+$.i18n.prop('org_onap_msb_route_property_unknown')+"</span>";
}
@@ -213,10 +290,10 @@ routeUtil.showVisualRange=function(visualRange){
for(var i=0;i<rangArray.length;i++){
if(rangArray[i] === '0'){
- visualRangeText+= $.i18n.prop('org_openo_msb_route_form_intersystem')+" ";
+ visualRangeText+= $.i18n.prop('org_onap_msb_route_form_intersystem')+" ";
}
else if(rangArray[i] === '1'){
- visualRangeText+= $.i18n.prop('org_openo_msb_route_form_insystem')+" ";
+ visualRangeText+= $.i18n.prop('org_onap_msb_route_form_insystem')+" ";
}
}
@@ -264,17 +341,16 @@ var serviceName=vm.msbRouteInfo.serviceName==""?"serviceName":vm.msbRouteInfo.se
vm.targetFullServiceUrl=vm.targetServiceUrl+"/"+iuiRootPath+"/"+serviceName;
}
else if(vm.msbRouteInfo.protocol=='REST'){
- if(routeUtil.ifAPIUrl(vm.msbRouteInfo.url)){
- var version=vm.msbRouteInfo.version==""?"":"/"+vm.msbRouteInfo.version
+ var version=vm.msbRouteInfo.version==""?"":"/"+vm.msbRouteInfo.version
vm.targetFullServiceUrl=vm.targetServiceUrl+"/"+apiRootPath+"/"+serviceName+version;
- }
- else{
- var reg_customName_match=/^(\/.*?)$/;
+ }
+ else if(vm.msbRouteInfo.protocol=='HTTP'){
+ var reg_customName_match=/^(\/.*?)$/;
if(!reg_customName_match.test(serviceName)) serviceName="/"+serviceName;
vm.targetFullServiceUrl=vm.targetServiceUrl+serviceName;
-
- }
- }
+ }
+
+
}
diff --git a/apiroute/apiroute-service/src/main/resources/iui-route/js/statusUtil.js b/apiroute/apiroute-service/src/main/resources/iui-route/js/statusUtil.js
new file mode 100644
index 0000000..bb0f3f7
--- /dev/null
+++ b/apiroute/apiroute-service/src/main/resources/iui-route/js/statusUtil.js
@@ -0,0 +1,428 @@
+var statusUtil = {};
+
+statusUtil.statisticsPollTime=60000;
+statusUtil.connectionsPollTime=5000;
+statusUtil.connectionsXAxisCount=12;
+statusUtil.statisticsXAxisCount=60;
+statusUtil.connection=true;
+
+statusUtil.initChart= function(){
+ statusUtil.init_statistics_requestChart();
+ statusUtil.init_status_requestChart();
+ statusUtil.init_connectionChart();
+
+}
+
+statusUtil.getQueryString= function(name) {
+ var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+ var r = window.location.search.substr(1).match(reg);
+ if (r != null)
+ return unescape(r[2]);
+ return null;
+}
+
+statusUtil.init_statistics_requestChart= function(){
+
+
+ var times = [];
+ var datas=[];
+ var latestTime="";
+ $.ajax({
+ "type": 'get',
+ "async": false,
+ "timeout" : 2000,
+ "url": apiBasePath+"/statistics/request?latestNum=10",
+ "dataType": "json",
+ success: function (resp) {
+
+ var initDatas = (resp==null)?[]:resp;
+ for(var i=0;i<initDatas.length;i++){
+ var dataArray=initDatas[i].split("|");
+ times.push(statusUtil.getLocalTime(dataArray[0]));
+ datas.push(dataArray[1]);
+ }
+
+ if(initDatas.length>0){
+ latestTime=initDatas[initDatas.length-1];
+ }
+
+
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
+ statusUtil.connection=false;
+ alert("get Chart Data fails:"+textStatus+":"+errorThrown);
+ }
+ });
+
+
+ var requestChart = echarts.init(document.getElementById('statisticsLineChartDiv'), 'macarons');
+
+ var option = {
+
+ tooltip : {
+ trigger: 'axis'
+ },
+ toolbox: {
+ feature: {
+ saveAsImage: {
+ name:'MSB历å²è®¿é—®æ¬¡æ•°ç»Ÿè®¡å›¾'
+ }
+ }
+ },
+ legend: {
+ data:['æ¯åˆ†é’Ÿå¤„ç†è¯·æ±‚æ•°']
+ },
+ xAxis:
+ {
+ type: 'category',
+ boundaryGap: false,
+ data: times,
+ name: '采集点'
+
+ },
+ yAxis:
+ {
+ type: 'value',
+ scale: true,
+ name: '请求数',
+ minInterval: 1,
+ min: 0,
+ boundaryGap: [0.1, 0.1]
+ },
+ series: [
+ {
+ name:'æ¯åˆ†é’Ÿå¤„ç†è¯·æ±‚æ•°',
+ type:'line',
+ stack: 'status',
+ data:datas
+ }
+ ]
+ };
+
+ // 使用刚指定的é…置项和数æ®æ˜¾ç¤ºå›¾è¡¨ã€‚
+ requestChart.setOption(option);
+ window.onresize = requestChart.resize;
+ if(statusUtil.connection==true){
+ setInterval(function () {
+
+ $.ajax({
+ "type": 'get',
+ "async": true,
+ "timeout" : 3000,
+ "url": apiBasePath+"/statistics/request",
+ "dataType": "json",
+ success: function (resp) {
+
+ var latestData = (resp==null)?[]:resp;
+
+ if(latestData.length>0){
+ var dataArray=latestData[0].split("|");
+
+ var data = option.series[0].data;
+
+ if(latestTime!=dataArray[0]){
+ data.push(dataArray[1]);
+ option.xAxis.data.push(statusUtil.getLocalTime(dataArray[0]));
+ if(data.length>=statusUtil.statisticsXAxisCount){
+ data.shift();
+ option.xAxis.data.shift();
+ }
+
+
+ var maxVaule=Math.max.apply(null, data);
+ if(maxVaule<5){
+ option.yAxis.max=5;
+ }
+ else{
+ option.yAxis.max=null;
+ }
+ requestChart.setOption(option);
+
+ latestTime=dataArray[0];
+ }
+
+ }
+ }
+ });
+
+
+ }, statusUtil.statisticsPollTime);
+ }
+}
+
+var statusLineChart;
+var statusLineChartOption;
+statusUtil.init_status_requestChart= function(){
+
+statusLineChart = echarts.init(document.getElementById('statusLineChartDiv'), 'macarons');
+
+statusLineChartOption = {
+ color:[ "#2ec7c9",
+ "#b6a2de",
+ "#ffb980"],
+ tooltip : {
+ trigger: 'axis'
+ },
+ toolbox: {
+ feature: {
+ saveAsImage: {
+ name:'MSB正在处ç†è¯·æ±‚数图'
+ }
+ }
+ },
+ legend: {
+ data:['已转å‘等待å“应','已接收待转å‘','收到å“应待返回']
+ },
+ xAxis:
+ {
+ type: 'category',
+ boundaryGap: false,
+ name: '采集点',
+ data: []
+ },
+ yAxis:
+ {
+ type: 'value',
+ scale: true,
+ name: '请求数',
+ min: 0,
+ minInterval: 1,
+ boundaryGap: [0.1, 0.1]
+ },
+ series: [
+ {
+ name:'已转å‘等待å“应',
+ type:'line',
+ data:[]
+ },
+ {
+ name:'已接收待转å‘',
+ type:'line',
+ data:[]
+ },
+ {
+ name:'收到å“应待返回',
+ type:'line',
+ data:[]
+ }
+
+ ]
+ };
+
+ // 使用刚指定的é…置项和数æ®æ˜¾ç¤ºå›¾è¡¨ã€‚
+ statusLineChart.setOption(statusLineChartOption);
+ window.onresize = statusLineChart.resize;
+ if(statusUtil.connection==true){
+
+ statusUtil.getStatusLineChart4Data();
+
+ setInterval(function () {
+ statusUtil.getStatusLineChart4Data();
+ }, statusUtil.connectionsPollTime);
+ }
+}
+
+statusUtil.getStatusLineChart4Data=function(){
+
+ $.ajax({
+ "type": 'get',
+ "async": true,
+ "timeout" : 3000,
+ "url": apiBasePath+"/status/request",
+ "dataType": "json",
+ success: function (resp) {
+
+ if(resp!=null){
+ var forward_data= statusLineChartOption.series[0].data;
+ var accept_data = statusLineChartOption.series[1].data;
+ var receive_data = statusLineChartOption.series[2].data;
+
+
+
+ if(accept_data.length>=statusUtil.statisticsXAxisCount){
+ accept_data.shift();
+ forward_data.shift();
+ receive_data.shift();
+ statusLineChartOption.xAxis.data.shift();
+ }
+
+
+ accept_data.push(resp.accept_preparing_forward);
+ forward_data.push(resp.forward_waiting_response);
+ receive_data.push(resp.receive_resp_not_return);
+
+ var allValue=accept_data.concat(forward_data).concat(receive_data);
+ var maxVaule=Math.max.apply(null, allValue);
+ if(maxVaule<5){
+ statusLineChartOption.yAxis.max=5;
+ }
+ else{
+ statusLineChartOption.yAxis.max=null;
+ }
+
+
+ statusLineChartOption.xAxis.data.push(statusUtil.getCurrentTime());
+
+ statusLineChart.setOption(statusLineChartOption);
+ }
+ }
+ });
+}
+
+var connectionChart;
+var connectionChartOption;
+
+statusUtil.init_connectionChart= function(){
+
+
+
+ connectionChart = echarts.init(document.getElementById('connectionBarChartDiv'), 'macarons');
+
+
+ connectionChartOption = {
+
+ tooltip : {
+ trigger: 'axis',
+ axisPointer : {
+ type : 'shadow'
+ }
+ },
+ toolbox: {
+ feature: {
+ saveAsImage: {
+ name:'MSB当å‰è¿žæŽ¥æ•°ç»Ÿè®¡å›¾'
+ }
+ }
+ },
+ legend: {
+ data:['Active','Waiting','Writing','Reading']
+ },
+ xAxis:
+ {
+ type: 'category',
+ boundaryGap: true,
+ name: '采集点',
+ // axisLabel:{
+ // interval:0,
+ // rotate:45
+ // },
+ data: []
+ },
+ yAxis:
+ {
+ type: 'value',
+ scale: true,
+ name: '连接数',
+ min: 0,
+ minInterval: 1,
+ boundaryGap: [0.1, 0.1]
+
+ },
+ series: [
+ {
+ name:'Active',
+ type:'bar',
+ data:[]
+ },
+ {
+ name:'Waiting',
+ type:'bar',
+ stack: 'connection',
+ data:[]
+ },
+ {
+ name:'Writing',
+ type:'bar',
+ stack: 'connection',
+ data:[]
+ },
+ {
+ name:'Reading',
+ type:'bar',
+ stack: 'connection',
+ data:[]
+ }
+ ]
+ };
+
+ // 使用刚指定的é…置项和数æ®æ˜¾ç¤ºå›¾è¡¨ã€‚
+ connectionChart.setOption(connectionChartOption);
+ window.onresize = connectionChart.resize;
+
+ if(statusUtil.connection==true){
+ statusUtil.getConnectionChart4Data();
+
+ setInterval(function () {
+ statusUtil.getConnectionChart4Data();
+ }, statusUtil.connectionsPollTime);
+ }
+}
+
+statusUtil.getConnectionChart4Data=function(){
+$.ajax({
+ "type": 'get',
+ "async": true,
+ "url": apiBasePath+"/status/connection",
+ "dataType": "json",
+ success: function (resp) {
+
+ if(resp!=null){
+ var active_data = connectionChartOption.series[0].data;
+ var waiting_data = connectionChartOption.series[1].data;
+ var writing_data = connectionChartOption.series[2].data;
+ var reading_data = connectionChartOption.series[3].data;
+
+
+ if(active_data.length>=statusUtil.connectionsXAxisCount){
+ active_data.shift();
+ waiting_data.shift();
+ writing_data.shift();
+ reading_data.shift();
+ connectionChartOption.xAxis.data.shift();
+ }
+
+ active_data.push(resp.connections_active);
+ waiting_data.push(resp.connections_waiting);
+ writing_data.push(resp.connections_writing);
+ reading_data.push(resp.connections_reading);
+
+ var allValue=active_data.concat(waiting_data).concat(writing_data).concat(reading_data)
+ var maxVaule=Math.max.apply(null, allValue)
+ if(maxVaule<5){
+ connectionChartOption.yAxis.max=5;
+ }
+ else{
+ connectionChartOption.yAxis.max=null;
+ }
+
+
+ connectionChartOption.xAxis.data.push(statusUtil.getCurrentTime());
+
+ connectionChart.setOption(connectionChartOption);
+
+ }
+ }
+ });
+
+}
+
+
+statusUtil.getCurrentTime=function(){
+ var date = new Date();
+ var axisData = [statusUtil.addZero(date.getHours()),statusUtil.addZero(date.getMinutes()),statusUtil.addZero(date.getSeconds())].join(":");
+ return axisData;
+ }
+
+statusUtil.addZero=function(s) {
+ return s < 10 ? '0' + s: s;
+ }
+
+
+statusUtil.getLocalTime=function(nS) {
+ var date = new Date(parseInt(nS)*1000);
+ var fullDate= [statusUtil.addZero(date.getFullYear()),statusUtil.addZero(date.getMonth() + 1 ) ,statusUtil.addZero(date.getDate())].join("-");
+ fullDate+=" ";
+ fullDate += [statusUtil.addZero(date.getHours()),statusUtil.addZero(date.getMinutes()),statusUtil.addZero(date.getSeconds())].join(":");
+ return fullDate;
+
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/SyncDataManagerTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/SyncDataManagerTest.java
new file mode 100644
index 0000000..668d445
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/SyncDataManagerTest.java
@@ -0,0 +1,56 @@
+package org.onap.msb.apiroute;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.onap.msb.apiroute.SyncDataManager;
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseCallback;
+import org.onap.msb.apiroute.wrapper.consulextend.util.Http;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ Http.class })
+@PowerMockIgnore({ "javax.net.ssl.*" })
+public class SyncDataManagerTest {
+
+ @SuppressWarnings("unchecked")
+ @Before
+ public void setUpBeforeTest() {
+ Http http = PowerMockito.mock(Http.class);
+
+ PowerMockito
+ .doNothing()
+ .when(http)
+ .asyncGet(Mockito.anyString(),
+ Mockito.any(TypeReference.class),
+ Mockito.any(ConsulResponseCallback.class));
+
+ PowerMockito
+ .doNothing()
+ .when(http)
+ .asyncGetDelayHandle(Mockito.anyString(),
+ Mockito.any(TypeReference.class),
+ Mockito.any(ConsulResponseCallback.class));
+
+ //
+ PowerMockito.spy(Http.class);
+ PowerMockito.when(Http.getInstance()).thenReturn(http);
+
+ }
+
+ @Test
+ public void testSyncDataManager()
+ {
+ SyncDataManager.initSyncTask("127.0.0.1",8500);
+ SyncDataManager.startWatchService("huangleibo");
+ SyncDataManager.resetIndex("huangleibo");
+ SyncDataManager.stopWatchService("huangleibo");
+ SyncDataManager.stopWatchServiceList();
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/ApiRouteHealthCheckTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/ApiRouteHealthCheckTest.java
new file mode 100644
index 0000000..1048ce0
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/ApiRouteHealthCheckTest.java
@@ -0,0 +1,69 @@
+package org.onap.msb.apiroute.health;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.onap.msb.apiroute.health.ApiRouteHealthCheck;
+import org.onap.msb.apiroute.wrapper.util.HttpClientUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.codahale.metrics.health.HealthCheck.Result;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ HttpClientUtil.class })
+public class ApiRouteHealthCheckTest {
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(ApiRouteHealthCheckTest.class);
+
+ @Test
+ public void testchecksuccess()
+ {
+ PowerMockito.mockStatic(HttpClientUtil.class);
+ try {
+
+ PowerMockito.when(HttpClientUtil.httpGetStatus(Mockito.anyString())).thenReturn(200);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ ApiRouteHealthCheck check = new ApiRouteHealthCheck();
+ Result rst = check.execute();
+
+ if (!rst.isHealthy()) {
+ LOGGER.warn("testchecksuccess health check failed:"+rst.getMessage());
+ }
+ else
+ {
+ LOGGER.debug(" testchecksuccess health");
+ }
+ }
+
+ @Test
+ public void testcheckfailed()
+ {
+ PowerMockito.mockStatic(HttpClientUtil.class);
+ try {
+
+ PowerMockito.when(HttpClientUtil.httpGetStatus(Mockito.anyString())).thenReturn(400);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ ApiRouteHealthCheck check = new ApiRouteHealthCheck();
+ Result rst = check.execute();
+
+ if (!rst.isHealthy()) {
+ LOGGER.warn("testcheckfailed health check failed:"+rst.getMessage());
+ }
+ else
+ {
+ LOGGER.debug(" testcheckfailed health");
+ }
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/ConsulLinkHealthCheckTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/ConsulLinkHealthCheckTest.java
new file mode 100644
index 0000000..50ac829
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/ConsulLinkHealthCheckTest.java
@@ -0,0 +1,103 @@
+package org.onap.msb.apiroute.health;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.onap.msb.apiroute.health.ConsulLinkHealthCheck;
+import org.onap.msb.apiroute.wrapper.util.HttpClientUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.codahale.metrics.health.HealthCheck.Result;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ HttpClientUtil.class,ConsulLinkHealthCheck.class })
+public class ConsulLinkHealthCheckTest {
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(ConsulLinkHealthCheckTest.class);
+
+ @Test
+ public void testchecksuccess()
+ {
+ PowerMockito.mockStatic(HttpClientUtil.class);
+ try {
+
+ PowerMockito.when(HttpClientUtil.httpGetStatus(Mockito.anyString())).thenReturn(200);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("CONSUL_IP")).thenReturn("192.168.0.1");
+
+ ConsulLinkHealthCheck check = new ConsulLinkHealthCheck();
+ Result rst = check.execute();
+
+ if (!rst.isHealthy()) {
+ LOGGER.warn("testchecksuccess health check failed:"+rst.getMessage());
+ }
+ else
+ {
+ LOGGER.debug(" testchecksuccess health");
+ }
+ }
+
+ @Test
+ public void testcheckfailed()
+ {
+ PowerMockito.mockStatic(HttpClientUtil.class);
+ try {
+
+ PowerMockito.when(HttpClientUtil.httpGetStatus(Mockito.anyString())).thenReturn(400);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("CONSUL_IP")).thenReturn("192.168.0.1");
+
+ ConsulLinkHealthCheck check = new ConsulLinkHealthCheck();
+ Result rst = check.execute();
+
+ if (!rst.isHealthy()) {
+ LOGGER.warn("testcheckfailed health check failed:"+rst.getMessage());
+ }
+ else
+ {
+ LOGGER.debug("testcheckfailed health");
+ }
+ }
+
+
+ @Test
+ public void testcheckNoENV()
+ {
+ PowerMockito.mockStatic(HttpClientUtil.class);
+ try {
+
+ PowerMockito.when(HttpClientUtil.httpGetStatus(Mockito.anyString())).thenReturn(400);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("CONSUL_IP")).thenReturn("");
+
+ ConsulLinkHealthCheck check = new ConsulLinkHealthCheck();
+ Result rst = check.execute();
+
+ if (!rst.isHealthy()) {
+ LOGGER.warn("testcheckNoENV health check failed:"+rst.getMessage());
+ }
+ else
+ {
+ LOGGER.debug("testcheckNoENV health");
+ }
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/OpenRestyHealthCheckTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/OpenRestyHealthCheckTest.java
new file mode 100644
index 0000000..810f645
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/OpenRestyHealthCheckTest.java
@@ -0,0 +1,77 @@
+package org.onap.msb.apiroute.health;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.onap.msb.apiroute.health.OpenRestyHealthCheck;
+import org.onap.msb.apiroute.wrapper.util.HttpClientUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.codahale.metrics.health.HealthCheck.Result;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ HttpClientUtil.class,OpenRestyHealthCheck.class })
+public class OpenRestyHealthCheckTest {
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(OpenRestyHealthCheckTest.class);
+
+ @Test
+ public void testchecksuccess()
+ {
+ PowerMockito.mockStatic(HttpClientUtil.class);
+ try {
+
+ PowerMockito.when(HttpClientUtil.httpGetStatus(Mockito.anyString())).thenReturn(200);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("HTTP_OVERWRITE_PORT")).thenReturn("10080");
+
+ OpenRestyHealthCheck check = new OpenRestyHealthCheck();
+
+ Result rst = check.execute();
+
+ if (!rst.isHealthy()) {
+ LOGGER.warn("testchecksuccess health check failed:"+rst.getMessage());
+ }
+ else
+ {
+ LOGGER.debug(" testchecksuccess health");
+ }
+ }
+
+ @Test
+ public void testcheckfailed()
+ {
+ PowerMockito.mockStatic(HttpClientUtil.class);
+ try {
+
+ PowerMockito.when(HttpClientUtil.httpGetStatus(Mockito.anyString())).thenReturn(400);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("HTTP_OVERWRITE_PORT")).thenReturn("");
+
+ OpenRestyHealthCheck check = new OpenRestyHealthCheck();
+
+ Result rst = check.execute();
+
+ if (!rst.isHealthy()) {
+ LOGGER.warn("testchecksuccess health check failed:"+rst.getMessage());
+ }
+ else
+ {
+ LOGGER.debug(" testchecksuccess health");
+ }
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/RedisHealthCheckTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/RedisHealthCheckTest.java
new file mode 100644
index 0000000..a667df2
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/health/RedisHealthCheckTest.java
@@ -0,0 +1,77 @@
+package org.onap.msb.apiroute.health;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.health.RedisHealthCheck;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import com.codahale.metrics.health.HealthCheck.Result;
+import com.fiftyonred.mock_jedis.MockJedisPool;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({JedisUtil.class,RedisAccessWrapper.class})
+@PowerMockIgnore( {"javax.management.*"})
+public class RedisHealthCheckTest {
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(RedisHealthCheckTest.class);
+
+ @Before
+ public void setUpBeforeTest() throws Exception {
+
+ }
+
+ @SuppressWarnings("static-access")
+ @Test
+ public void testchecksuccess()
+ {
+
+ try {
+ final JedisPool mockJedisPool = new MockJedisPool(new JedisPoolConfig(), "localhost");
+ PowerMockito.mockStatic(JedisUtil.class);
+ JedisUtil jedisUtil=PowerMockito.mock(JedisUtil.class);
+ PowerMockito.when(jedisUtil.borrowJedisInstance()).thenReturn(mockJedisPool.getResource());
+
+ RedisHealthCheck check = new RedisHealthCheck();
+ Result rst = check.execute();
+
+ if (!rst.isHealthy()) {
+ LOGGER.warn("testchecksuccess health check failed:"+rst.getMessage());
+ }
+ else
+ {
+ LOGGER.debug(" testchecksuccess health");
+ }
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testcheckfailed()
+ {
+ RedisHealthCheck check = new RedisHealthCheck();
+ Result rst = check.execute();
+
+ if (!rst.isHealthy()) {
+ LOGGER.warn("testcheckfailed health check failed:"+rst.getMessage());
+ }
+ else
+ {
+ LOGGER.debug("testcheckfailed health");
+ }
+
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/ApiRouteServiceWrapperTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/ApiRouteServiceWrapperTest.java
new file mode 100644
index 0000000..bb90a2c
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/ApiRouteServiceWrapperTest.java
@@ -0,0 +1,252 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.msb.apiroute.wrapper;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.api.ApiRouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
+import org.onap.msb.apiroute.wrapper.ApiRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.onap.msb.apiroute.wrapper.util.JacksonJsonUtil;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import com.fiftyonred.mock_jedis.MockJedisPool;
+
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({JedisUtil.class,RouteUtil.class,RedisAccessWrapper.class})
+@PowerMockIgnore( {"javax.management.*"})
+public class ApiRouteServiceWrapperTest {
+ private static ApiRouteServiceWrapper apiRouteServiceWrapper;
+ private static Comparator<ApiRouteInfo> apiRouteComparator = null;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ apiRouteServiceWrapper=ApiRouteServiceWrapper.getInstance();
+ apiRouteComparator = new Comparator<ApiRouteInfo>() {
+ @Override
+ public int compare(ApiRouteInfo o1, ApiRouteInfo o2) {
+ if (!o1.getServiceName().equals(o2.getServiceName()))
+ return (o1.getServiceName()).compareTo(o2.getServiceName());
+ if (!o1.getVersion().equals(o2.getVersion()))
+ return (o1.getVersion()).compareTo(o2.getVersion());
+ return 0;
+ }
+ };
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("ROUTE_WAY")).thenReturn(null);
+ PowerMockito.when(System.getenv("ROUTE_WAY")).thenReturn("ip|domain");
+ ConfigUtil.getInstance().initRouteWay();
+ }
+
+ @Before
+ public void setUpBeforeTest() throws Exception {
+ final JedisPool mockJedisPool = new MockJedisPool(new JedisPoolConfig(), "localhost");
+ PowerMockito.mockStatic(JedisUtil.class);
+ JedisUtil jedisUtil=PowerMockito.mock(JedisUtil.class);
+ PowerMockito.when(jedisUtil.borrowJedisInstance()).thenReturn(mockJedisPool.getResource());
+
+ PowerMockito.replace(PowerMockito.method(RedisAccessWrapper.class, "filterKeys")).with(new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ return mockJedisPool.getResource().keys((String) args[0]);
+ }
+ });
+ }
+
+
+
+ @Test
+ public void test_getApiRouteInstance_not_exist(){
+ try {
+ apiRouteServiceWrapper.getApiRouteInstance("testForJunit", "v1","","","ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ }
+
+ @Test
+ public void test_getApiRouteInstance(){
+
+ ApiRouteInfo apirouteInfo = buildApiRouteInfo();
+ try {
+ apiRouteServiceWrapper.saveApiRouteInstance4Rest(apirouteInfo, "ip");
+ ApiRouteInfo dbApirouteInfo=apiRouteServiceWrapper.getApiRouteInstance("testapi", "v1", "", "", "ip");
+ Assert.assertEquals(apirouteInfo,dbApirouteInfo );
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ }
+
+
+
+ @Test
+ public void test_getAllApiRouteInstances(){
+ ApiRouteInfo apirouteInfo = buildApiRouteInfo();
+ ApiRouteInfo apirouteInfo2 = buildApiRouteInfo2();
+ List<ApiRouteInfo> expected = new ArrayList<>();
+ expected.add(apirouteInfo);
+ expected.add(apirouteInfo2);
+ Collections.sort(expected, apiRouteComparator);
+
+ try {
+ apiRouteServiceWrapper.saveApiRouteInstance4Rest(apirouteInfo, "ip");
+ apiRouteServiceWrapper.saveApiRouteInstance4Rest(apirouteInfo2, "ip");
+
+
+ PowerMockito.mockStatic(RouteUtil.class);
+ PowerMockito.when(RouteUtil.getMutiRedisKey(RouteUtil.APIROUTE, "ip")).thenReturn("msb:routing:api:*");
+ List<ApiRouteInfo> apiRouterList=apiRouteServiceWrapper.getAllApiRouteInstances("ip");
+ Collections.sort(apiRouterList, apiRouteComparator);
+
+ Assert.assertEquals(expected,apiRouterList);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void test_updateApiRouteStatus(){
+ ApiRouteInfo apirouteInfo = buildApiRouteInfo();
+ try {
+ apiRouteServiceWrapper.saveApiRouteInstance4Rest(apirouteInfo, "ip");
+ ApiRouteInfo dbApirouteInfo=apiRouteServiceWrapper.getApiRouteInstance("testapi", "v1", "", "", "ip");
+ Assert.assertEquals("1",dbApirouteInfo.getStatus() );
+ apiRouteServiceWrapper.updateApiRouteStatus("testapi","v1","","","0", "ip");
+ dbApirouteInfo=apiRouteServiceWrapper.getApiRouteInstance("testapi", "v1", "", "", "ip");
+ Assert.assertEquals("0",dbApirouteInfo.getStatus() );
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ }
+
+
+
+ @Test
+ public void test_deleteApiRoute(){
+ ApiRouteInfo apirouteInfo2 = buildApiRouteInfo2();
+ try {
+ apiRouteServiceWrapper.saveApiRouteInstance4Rest(apirouteInfo2, "ip");
+ ApiRouteInfo dbApirouteInfo=apiRouteServiceWrapper.getApiRouteInstance("testapi2", "null","","","ip");
+ Assert.assertNotNull(dbApirouteInfo);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+ try {
+ apiRouteServiceWrapper.deleteApiRoute("testapi2", "null","","","ip");
+ apiRouteServiceWrapper.getApiRouteInstance("testapi2", "","","","ip");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+ }
+
+ @Test
+ public void test_getAllApiDocs(){
+ String[] paths=apiRouteServiceWrapper.getAllApiDocs();
+ String[] expecteds_paths={"api-doc1.json","api-doc2.json"};
+ Arrays.sort(expecteds_paths);
+ Arrays.sort(paths);
+ Assert.assertArrayEquals(expecteds_paths, paths);
+ }
+
+ @Test
+ public void test_getAllrouteByJson(){
+ ApiRouteInfo apirouteInfo = buildApiRouteInfo();
+ try {
+ apiRouteServiceWrapper.saveApiRouteInstance4Rest(apirouteInfo, "ip");
+
+ ApiRouteInfo[] apirouteList={apirouteInfo};
+ String expected_routeJson=JacksonJsonUtil.beanToJson(apirouteList);
+
+ PowerMockito.mockStatic(RouteUtil.class);
+ PowerMockito.when(RouteUtil.getMutiRedisKey(RouteUtil.APIROUTE, "ip")).thenReturn("msb:routing:api:*");
+ PowerMockito.when(RouteUtil.getMutiRedisKey(RouteUtil.IUIROUTE, "ip")).thenReturn("msb:routing:iui:*");
+ PowerMockito.when(RouteUtil.getMutiRedisKey(RouteUtil.CUSTOMROUTE, "ip")).thenReturn("msb:routing:custom:*");
+
+ String allrouteJson= apiRouteServiceWrapper.getAllrouteByJson("ip");
+ Assert.assertEquals(expected_routeJson, allrouteJson);
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+
+ }
+
+
+
+ private ApiRouteInfo buildApiRouteInfo(){
+ ApiRouteInfo apirouteInfo = new ApiRouteInfo();
+ apirouteInfo.setServiceName("testapi");
+ apirouteInfo.setVersion("v1");
+ apirouteInfo.setStatus("1");
+ apirouteInfo.setUrl("/api/testapi/v1");
+ apirouteInfo.setUseOwnUpstream("0");
+ apirouteInfo.setVisualRange("0");
+ apirouteInfo.setEnable_ssl(false);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ apirouteInfo.setServers(servers);
+ return apirouteInfo;
+ }
+
+ private ApiRouteInfo buildApiRouteInfo2(){
+ ApiRouteInfo apirouteInfo = new ApiRouteInfo();
+ apirouteInfo.setServiceName("testapi2");
+ apirouteInfo.setVersion("");
+ apirouteInfo.setStatus("1");
+ apirouteInfo.setUrl("/api/testapi2/v1");
+ apirouteInfo.setUseOwnUpstream("0");
+ apirouteInfo.setVisualRange("1");
+ apirouteInfo.setEnable_ssl(true);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.89","8080")};
+ apirouteInfo.setServers(servers);
+ return apirouteInfo;
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/CustomRouteServiceWrapperTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/CustomRouteServiceWrapperTest.java
new file mode 100644
index 0000000..3c77dbf
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/CustomRouteServiceWrapperTest.java
@@ -0,0 +1,208 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.msb.apiroute.wrapper;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.api.CustomRouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
+import org.onap.msb.apiroute.wrapper.CustomRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import com.fiftyonred.mock_jedis.MockJedisPool;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({JedisUtil.class,RouteUtil.class,RedisAccessWrapper.class})
+@PowerMockIgnore( {"javax.management.*"})
+public class CustomRouteServiceWrapperTest {
+
+ private static CustomRouteServiceWrapper customRouteServiceWrapper;
+ private static Comparator<CustomRouteInfo> customRouteComparator = null;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ customRouteServiceWrapper=CustomRouteServiceWrapper.getInstance();
+ customRouteComparator = new Comparator<CustomRouteInfo>() {
+ @Override
+ public int compare(CustomRouteInfo o1, CustomRouteInfo o2) {
+ if (!o1.getServiceName().equals(o2.getServiceName()))
+ return (o1.getServiceName()).compareTo(o2.getServiceName());
+ return 0;
+ }
+ };
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("ROUTE_WAY")).thenReturn(null);
+ PowerMockito.when(System.getenv("ROUTE_WAY")).thenReturn("ip|domain");
+ ConfigUtil.getInstance().initRouteWay();
+ }
+
+ @Before
+ public void setUpBeforeTest() throws Exception {
+ final JedisPool mockJedisPool = new MockJedisPool(new JedisPoolConfig(), "localhost");
+ PowerMockito.mockStatic(JedisUtil.class);
+ JedisUtil jedisUtil=PowerMockito.mock(JedisUtil.class);
+ PowerMockito.when(jedisUtil.borrowJedisInstance()).thenReturn(mockJedisPool.getResource());
+
+ PowerMockito.replace(PowerMockito.method(RedisAccessWrapper.class, "filterKeys")).with(new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ return mockJedisPool.getResource().keys((String) args[0]);
+ }
+ });
+ }
+
+ @Test
+ public void test_getCustomRouteInstance_not_exist(){
+ try {
+ customRouteServiceWrapper.getCustomRouteInstance("/testForJunit","","","ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+
+ }
+
+ }
+
+ @Test
+ public void test_getCustomRouteInstance(){
+
+ CustomRouteInfo customrouteInfo = buildCustomRouteInfo();
+ try {
+ customRouteServiceWrapper.saveCustomRouteInstance4Rest(customrouteInfo, "ip");
+ CustomRouteInfo dbCustomRouteInfo=customRouteServiceWrapper.getCustomRouteInstance("/testcustom", "", "", "ip");
+ Assert.assertEquals(customrouteInfo,dbCustomRouteInfo );
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void test_getAllCustomRouteInstances(){
+ CustomRouteInfo customrouteInfo = buildCustomRouteInfo();
+ CustomRouteInfo customrouteInfo2 = buildCustomRouteInfo2();
+ List<CustomRouteInfo> expected = new ArrayList<>();
+ expected.add(customrouteInfo);
+ expected.add(customrouteInfo2);
+ Collections.sort(expected, customRouteComparator);
+
+ try {
+ customRouteServiceWrapper.saveCustomRouteInstance4Rest(customrouteInfo, "ip");
+ customRouteServiceWrapper.saveCustomRouteInstance4Rest(customrouteInfo2, "ip");
+
+ PowerMockito.mockStatic(RouteUtil.class);
+ PowerMockito.when(RouteUtil.getMutiRedisKey(RouteUtil.CUSTOMROUTE, "ip")).thenReturn("msb:routing:custom:*");
+ List<CustomRouteInfo> customRouterList=customRouteServiceWrapper.getAllCustomRouteInstances("ip");
+ Collections.sort(customRouterList, customRouteComparator);
+
+ Assert.assertEquals(expected,customRouterList);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void test_updateCustomRouteStatus(){
+ CustomRouteInfo customrouteInfo = buildCustomRouteInfo();
+ try {
+ customRouteServiceWrapper.saveCustomRouteInstance4Rest(customrouteInfo, "ip");
+ CustomRouteInfo dbCustomrouteInfo=customRouteServiceWrapper.getCustomRouteInstance("/testcustom", "", "", "ip");
+ Assert.assertEquals("1",dbCustomrouteInfo.getStatus() );
+ customRouteServiceWrapper.updateCustomRouteStatus("/testcustom","","","0", "ip");
+ dbCustomrouteInfo=customRouteServiceWrapper.getCustomRouteInstance("/testcustom", "", "", "ip");
+ Assert.assertEquals("0",dbCustomrouteInfo.getStatus() );
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ }
+
+
+
+ @Test
+ public void test_deleteCustomRoute(){
+ CustomRouteInfo customrouteInfo2 = buildCustomRouteInfo2();
+ try {
+ customRouteServiceWrapper.saveCustomRouteInstance4Rest(customrouteInfo2, "ip");
+ CustomRouteInfo dbCustomrouteInfo=customRouteServiceWrapper.getCustomRouteInstance("/testcustom2","","","ip");
+ Assert.assertNotNull(dbCustomrouteInfo);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+ try {
+ customRouteServiceWrapper.deleteCustomRoute("/testcustom2","","","ip");
+ customRouteServiceWrapper.getCustomRouteInstance("/testcustom2","","","ip");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+ }
+
+
+ private CustomRouteInfo buildCustomRouteInfo(){
+ CustomRouteInfo customrouteInfo = new CustomRouteInfo();
+ customrouteInfo.setServiceName("/testcustom");
+ customrouteInfo.setStatus("1");
+ customrouteInfo.setUrl("/custom/testcustom");
+ customrouteInfo.setUseOwnUpstream("0");
+ customrouteInfo.setVisualRange("0");
+ customrouteInfo.setEnable_ssl(false);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ customrouteInfo.setServers(servers);
+ return customrouteInfo;
+ }
+
+ private CustomRouteInfo buildCustomRouteInfo2(){
+ CustomRouteInfo customrouteInfo = new CustomRouteInfo();
+ customrouteInfo.setServiceName("/testcustom2");
+ customrouteInfo.setStatus("1");
+ customrouteInfo.setUrl("/custom/testcustom");
+ customrouteInfo.setUseOwnUpstream("0");
+ customrouteInfo.setVisualRange("1");
+ customrouteInfo.setEnable_ssl(true);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.89","8080")};
+ customrouteInfo.setServers(servers);
+ return customrouteInfo;
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/InitRouteServiceWrapperTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/InitRouteServiceWrapperTest.java
new file mode 100644
index 0000000..7c183dd
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/InitRouteServiceWrapperTest.java
@@ -0,0 +1,241 @@
+package org.onap.msb.apiroute.wrapper;
+
+import io.dropwizard.jetty.HttpConnectorFactory;
+import io.dropwizard.server.SimpleServerFactory;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.onap.msb.apiroute.ApiRouteAppConfig;
+import org.onap.msb.apiroute.api.ApiRouteInfo;
+import org.onap.msb.apiroute.api.CustomRouteInfo;
+import org.onap.msb.apiroute.api.DiscoverInfo;
+import org.onap.msb.apiroute.api.IuiRouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.wrapper.ApiRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.CustomRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.InitRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.IuiRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.consulextend.Consul;
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseCallback;
+import org.onap.msb.apiroute.wrapper.consulextend.util.Http;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fiftyonred.mock_jedis.MockJedisPool;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ JedisUtil.class, RedisAccessWrapper.class, ConfigUtil.class,
+ Http.class, InitRouteServiceWrapper.class })
+@PowerMockIgnore({ "javax.management.*", "javax.net.ssl.*" })
+public class InitRouteServiceWrapperTest {
+ private static InitRouteServiceWrapper initRouteServiceWrapper;
+ private static Consul consul;
+
+ @SuppressWarnings("unchecked")
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ initRouteServiceWrapper = InitRouteServiceWrapper.getInstance();
+
+ Http http = PowerMockito.mock(Http.class);
+
+ PowerMockito
+ .doNothing()
+ .when(http)
+ .asyncGet(Mockito.anyString(),
+ Mockito.any(TypeReference.class),
+ Mockito.any(ConsulResponseCallback.class));
+
+ PowerMockito
+ .doNothing()
+ .when(http)
+ .asyncGetDelayHandle(Mockito.anyString(),
+ Mockito.any(TypeReference.class),
+ Mockito.any(ConsulResponseCallback.class));
+
+ PowerMockito.spy(Http.class);
+ PowerMockito.when(Http.getInstance()).thenReturn(http);
+
+ consul = Consul.builder().withHostAndPort("127.0.0.1", 8500).build();
+ }
+
+ @Before
+ public void initReidsMock() throws Exception {
+ final JedisPool mockJedisPool = new MockJedisPool(
+ new JedisPoolConfig(), "localhost");
+ PowerMockito.mockStatic(JedisUtil.class);
+ JedisUtil jedisUtil = PowerMockito.mock(JedisUtil.class);
+ PowerMockito.when(jedisUtil.borrowJedisInstance()).thenReturn(
+ mockJedisPool.getResource());
+
+ PowerMockito.replace(
+ PowerMockito.method(RedisAccessWrapper.class, "filterKeys"))
+ .with(new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method,
+ Object[] args) throws Throwable {
+ return mockJedisPool.getResource().keys(
+ (String) args[0]);
+ }
+ });
+ }
+
+ @Test
+ public void test_startCheckRedisConnect() {
+ try {
+ boolean ifRedisConnect = initRouteServiceWrapper
+ .startCheckRedisConnect();
+ Assert.assertEquals(true, ifRedisConnect);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+
+ }
+ }
+
+ @Test
+ public void test_runConsulClientApp() {
+
+ DiscoverInfo discoverInfo = new DiscoverInfo();
+ discoverInfo.setEnabled(true);
+ discoverInfo.setIp("127.0.0.1");
+ discoverInfo.setPort(10081);
+
+ ApiRouteAppConfig configuration = new ApiRouteAppConfig();
+ configuration.setDiscoverInfo(discoverInfo);
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("SDCLIENT_IP")).thenReturn("127.0.0.1");
+ ConfigUtil.getInstance().initDiscoverInfo(configuration);
+
+ try {
+ initRouteServiceWrapper.runConsulClientApp();
+
+ ApiRouteInfo discoverApiService = new ApiRouteInfo();
+ discoverApiService.setServiceName("msdiscover");
+ discoverApiService.setUrl("/api/microservices/v1");
+ discoverApiService.setVersion("v1");
+ discoverApiService.setMetricsUrl("/admin/metrics");
+ discoverApiService.setApiJson("/api/microservices/v1/swagger.json");
+ discoverApiService.setHost("msb");
+
+ RouteServer[] servers = new RouteServer[1];
+ servers[0] = new RouteServer(discoverInfo.getIp(),
+ String.valueOf(discoverInfo.getPort()));
+ discoverApiService.setServers(servers);
+
+ ApiRouteInfo db_discoverApiService = ApiRouteServiceWrapper
+ .getInstance().getApiRouteInstance("msdiscover", "v1",
+ "msb", "", "ip");
+ Assert.assertEquals(discoverApiService, db_discoverApiService);
+
+ IuiRouteInfo discoverIUIService = new IuiRouteInfo();
+ discoverIUIService.setServiceName("msdiscover");
+ discoverIUIService.setUrl("/iui/microservices");
+ discoverIUIService.setHost("msb");
+ discoverIUIService.setServers(servers);
+
+ Assert.assertEquals(
+ discoverIUIService,
+ IuiRouteServiceWrapper.getInstance().getIuiRouteInstance(
+ "msdiscover", "msb", "", "ip"));
+
+ } catch (Exception e) {
+ assert false : "throw exception means error occured!"
+ + e.getMessage();
+ }
+ }
+
+ @Test
+ public void test_initRouteInfoFromJson() {
+ try {
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("dwApp_server_connector_port"))
+ .thenReturn("8068");
+ initRouteServiceWrapper.initRouteInfoFromJson();
+
+ ApiRouteInfo apiroute = new ApiRouteInfo();
+ apiroute.setServiceName("microservices");
+ apiroute.setUrl("/api/microservices/v1");
+ apiroute.setVersion("v1");
+ apiroute.setMetricsUrl("/admin/metrics");
+ apiroute.setApiJson("/api/microservices/v1/swagger.json");
+ apiroute.setHost("msb");
+ apiroute.setControl("1");
+ apiroute.setStatus("1");
+
+ RouteServer[] servers = new RouteServer[1];
+ servers[0] = new RouteServer("127.0.0.1", "8068");
+ apiroute.setServers(servers);
+
+ ApiRouteInfo db_apiService = ApiRouteServiceWrapper
+ .getInstance()
+ .getApiRouteInstance("microservices", "v1", "msb", "", "ip");
+ Assert.assertEquals(apiroute, db_apiService);
+
+ IuiRouteInfo iuiRoute = new IuiRouteInfo();
+ iuiRoute.setServiceName("microservices");
+ iuiRoute.setUrl("/iui/microservices");
+ iuiRoute.setHost("msb");
+ iuiRoute.setControl("1");
+ iuiRoute.setStatus("1");
+ iuiRoute.setServers(servers);
+
+ Assert.assertEquals(iuiRoute, IuiRouteServiceWrapper.getInstance()
+ .getIuiRouteInstance("microservices", "msb", "", "ip"));
+
+ CustomRouteInfo customRoute = new CustomRouteInfo();
+ customRoute.setServiceName("/custom");
+ customRoute.setUrl("/custom");
+ customRoute.setHost("msb");
+ customRoute.setControl("1");
+ customRoute.setStatus("1");
+ RouteServer[] servers2 = new RouteServer[1];
+ servers2[0] = new RouteServer("127.0.0.1", "8066");
+ customRoute.setServers(servers2);
+
+ Assert.assertEquals(customRoute,
+ CustomRouteServiceWrapper.getInstance()
+ .getCustomRouteInstance("/custom", "msb", "", "ip"));
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+ }
+
+ @Test
+ public void test_initMetricsConfig() {
+ ApiRouteAppConfig configuration = new ApiRouteAppConfig();
+ SimpleServerFactory simpleServerFactory = new SimpleServerFactory();
+ HttpConnectorFactory httpConnectorFactory = new HttpConnectorFactory();
+ httpConnectorFactory.setPort(8888);
+ simpleServerFactory.setConnector(httpConnectorFactory);
+ simpleServerFactory.setAdminContextPath("/admin");
+
+ configuration.setServerFactory(simpleServerFactory);
+
+ initRouteServiceWrapper.initMetricsConfig(configuration);
+
+ Assert.assertEquals("http://127.0.0.1:8888/admin/metrics", ConfigUtil
+ .getInstance().getMetricsUrl());
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/IuiRouteServiceWrapperTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/IuiRouteServiceWrapperTest.java
new file mode 100644
index 0000000..7451e9b
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/IuiRouteServiceWrapperTest.java
@@ -0,0 +1,212 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.msb.apiroute.wrapper;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.api.IuiRouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
+import org.onap.msb.apiroute.wrapper.IuiRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import com.fiftyonred.mock_jedis.MockJedisPool;
+
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({JedisUtil.class,RouteUtil.class,RedisAccessWrapper.class})
+@PowerMockIgnore( {"javax.management.*"})
+public class IuiRouteServiceWrapperTest {
+ private static IuiRouteServiceWrapper iuiRouteServiceWrapper;
+ private static Comparator<IuiRouteInfo> iuiRouteComparator = null;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ iuiRouteServiceWrapper=IuiRouteServiceWrapper.getInstance();
+ iuiRouteComparator = new Comparator<IuiRouteInfo>() {
+ @Override
+ public int compare(IuiRouteInfo o1, IuiRouteInfo o2) {
+ if (!o1.getServiceName().equals(o2.getServiceName()))
+ return (o1.getServiceName()).compareTo(o2.getServiceName());
+ return 0;
+ }
+ };
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("ROUTE_WAY")).thenReturn(null);
+ PowerMockito.when(System.getenv("ROUTE_WAY")).thenReturn("ip|domain");
+ ConfigUtil.getInstance().initRouteWay();
+ }
+
+ @Before
+ public void setUpBeforeTest() throws Exception {
+ final JedisPool mockJedisPool = new MockJedisPool(new JedisPoolConfig(), "localhost");
+ PowerMockito.mockStatic(JedisUtil.class);
+ JedisUtil jedisUtil=PowerMockito.mock(JedisUtil.class);
+ PowerMockito.when(jedisUtil.borrowJedisInstance()).thenReturn(mockJedisPool.getResource());
+
+ PowerMockito.replace(PowerMockito.method(RedisAccessWrapper.class, "filterKeys")).with(new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ return mockJedisPool.getResource().keys((String) args[0]);
+ }
+ });
+ }
+
+
+ @Test
+ public void test_getIuiRouteInstance_not_exist(){
+ try {
+ iuiRouteServiceWrapper.getIuiRouteInstance("testForJunit","","","ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+
+ }
+
+ }
+
+ @Test
+ public void test_getIuiRouteInstance(){
+
+ IuiRouteInfo iuirouteInfo = buildIuiRouteInfo();
+ try {
+ iuiRouteServiceWrapper.saveIuiRouteInstance4Rest(iuirouteInfo, "ip");
+ IuiRouteInfo dbIuiRouteInfo=iuiRouteServiceWrapper.getIuiRouteInstance("testiui", "", "", "ip");
+ Assert.assertEquals(iuirouteInfo,dbIuiRouteInfo );
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void test_getAllIuiRouteInstances(){
+ IuiRouteInfo iuirouteInfo = buildIuiRouteInfo();
+ IuiRouteInfo iuirouteInfo2 = buildIuiRouteInfo2();
+ List<IuiRouteInfo> expected = new ArrayList<>();
+ expected.add(iuirouteInfo);
+ expected.add(iuirouteInfo2);
+ Collections.sort(expected, iuiRouteComparator);
+
+ try {
+ iuiRouteServiceWrapper.saveIuiRouteInstance4Rest(iuirouteInfo, "ip");
+ iuiRouteServiceWrapper.saveIuiRouteInstance4Rest(iuirouteInfo2, "ip");
+
+
+
+ PowerMockito.mockStatic(RouteUtil.class);
+ PowerMockito.when(RouteUtil.getMutiRedisKey(RouteUtil.IUIROUTE, "ip")).thenReturn("msb:routing:iui:*");
+ List<IuiRouteInfo> iuiRouterList=iuiRouteServiceWrapper.getAllIuiRouteInstances("ip");
+ Collections.sort(iuiRouterList, iuiRouteComparator);
+
+ Assert.assertEquals(expected,iuiRouterList);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void test_updateIuiRouteStatus(){
+ IuiRouteInfo iuirouteInfo = buildIuiRouteInfo();
+ try {
+ iuiRouteServiceWrapper.saveIuiRouteInstance4Rest(iuirouteInfo, "ip");
+ IuiRouteInfo dbIuirouteInfo=iuiRouteServiceWrapper.getIuiRouteInstance("testiui", "", "", "ip");
+ Assert.assertEquals("1",dbIuirouteInfo.getStatus() );
+ iuiRouteServiceWrapper.updateIuiRouteStatus("testiui","","","0", "ip");
+ dbIuirouteInfo=iuiRouteServiceWrapper.getIuiRouteInstance("testiui", "", "", "ip");
+ Assert.assertEquals("0",dbIuirouteInfo.getStatus() );
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ }
+
+
+
+ @Test
+ public void test_deleteIuiRoute(){
+ IuiRouteInfo iuirouteInfo2 = buildIuiRouteInfo2();
+ try {
+ iuiRouteServiceWrapper.saveIuiRouteInstance4Rest(iuirouteInfo2, "ip");
+ IuiRouteInfo dbIuirouteInfo=iuiRouteServiceWrapper.getIuiRouteInstance("testiui2","","","ip");
+ Assert.assertNotNull(dbIuirouteInfo);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+ try {
+ iuiRouteServiceWrapper.deleteIuiRoute("testiui2","","","ip");
+ iuiRouteServiceWrapper.getIuiRouteInstance("testiui2","","","ip");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+ }
+
+
+ private IuiRouteInfo buildIuiRouteInfo(){
+ IuiRouteInfo iuirouteInfo = new IuiRouteInfo();
+ iuirouteInfo.setServiceName("testiui");
+ iuirouteInfo.setStatus("1");
+ iuirouteInfo.setUrl("/iui/testiui");
+ iuirouteInfo.setUseOwnUpstream("0");
+ iuirouteInfo.setVisualRange("0");
+ iuirouteInfo.setEnable_ssl(false);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ iuirouteInfo.setServers(servers);
+ return iuirouteInfo;
+ }
+
+ private IuiRouteInfo buildIuiRouteInfo2(){
+ IuiRouteInfo iuirouteInfo = new IuiRouteInfo();
+ iuirouteInfo.setServiceName("testiui2");
+ iuirouteInfo.setStatus("1");
+ iuirouteInfo.setUrl("/iui/testiui");
+ iuirouteInfo.setUseOwnUpstream("0");
+ iuirouteInfo.setVisualRange("1");
+ iuirouteInfo.setEnable_ssl(true);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.89","8080")};
+ iuirouteInfo.setServers(servers);
+ return iuirouteInfo;
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/MicroServiceWrapperTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/MicroServiceWrapperTest.java
new file mode 100644
index 0000000..d830397
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/MicroServiceWrapperTest.java
@@ -0,0 +1,294 @@
+package org.onap.msb.apiroute.wrapper;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.api.Node;
+import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
+import org.onap.msb.apiroute.api.exception.UnprocessableEntityException;
+import org.onap.msb.apiroute.wrapper.MicroServiceWrapper;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import com.fiftyonred.mock_jedis.MockJedisPool;
+
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({JedisUtil.class,RedisAccessWrapper.class})
+@PowerMockIgnore( {"javax.management.*"})
+public class MicroServiceWrapperTest {
+ private static MicroServiceWrapper microServiceWrapper;
+ private static Comparator<MicroServiceFullInfo> microServiceComparator = null;
+
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ microServiceWrapper=MicroServiceWrapper.getInstance();
+ microServiceComparator = new Comparator<MicroServiceFullInfo>() {
+ @Override
+ public int compare(MicroServiceFullInfo o1, MicroServiceFullInfo o2) {
+ if (!o1.getServiceName().equals(o2.getServiceName()))
+ return (o1.getServiceName()).compareTo(o2.getServiceName());
+ return 0;
+ }
+ };
+ }
+
+ @Before
+ public void setUpBeforeTest() throws Exception {
+ final JedisPool mockJedisPool = new MockJedisPool(new JedisPoolConfig(), "localhost");
+ PowerMockito.mockStatic(JedisUtil.class);
+ JedisUtil jedisUtil=PowerMockito.mock(JedisUtil.class);
+ PowerMockito.when(jedisUtil.borrowJedisInstance()).thenReturn(mockJedisPool.getResource());
+
+ PowerMockito.replace(PowerMockito.method(RedisAccessWrapper.class, "filterKeys")).with(new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ return mockJedisPool.getResource().keys((String) args[0]);
+ }
+ });
+ }
+
+ @Test
+ public void test_getMicroServiceFullInfo_not_exist(){
+ try {
+ microServiceWrapper.getMicroServiceInstance("testForJunit","v1");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+
+ }
+
+ }
+
+ @Test
+ public void test_getMicroServiceFullInfo(){
+
+ MicroServiceFullInfo microServiceFullInfo = buildMicroServiceFullInfo();
+ try {
+ microServiceWrapper.saveMicroServiceInstance(microServiceFullInfo, false, "", "");
+ MicroServiceFullInfo dbMicroServiceFullInfo=microServiceWrapper.getMicroServiceInstance("testService", "v1");
+ Assert.assertEquals(microServiceFullInfo,dbMicroServiceFullInfo );
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+
+ }
+
+ @Test
+ public void test_getAllMicroServiceInstances(){
+ MicroServiceFullInfo microService = buildMicroServiceFullInfo();
+ MicroServiceFullInfo microService2 = buildMicroServiceFullInfo2();
+ List<MicroServiceFullInfo> expected = new ArrayList<>();
+ expected.add(microService);
+ expected.add(microService2);
+ Collections.sort(expected, microServiceComparator);
+
+ try {
+ microServiceWrapper.saveMicroServiceInstance(microService, false, "", "");
+ microServiceWrapper.saveMicroServiceInstance(microService2, false, "", "");
+
+ List<MicroServiceFullInfo> microServiceList=microServiceWrapper.getAllMicroServiceInstances();
+ Collections.sort(microServiceList, microServiceComparator);
+
+ Assert.assertEquals(expected,microServiceList);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void test_updateMicroServiceStatus(){
+ MicroServiceFullInfo microService = buildMicroServiceFullInfo();
+
+ try {
+ microServiceWrapper.saveMicroServiceInstance(microService, false, "", "");
+ MicroServiceFullInfo dbMicroServiceFullInfo=microServiceWrapper.getMicroServiceInstance("testService", "v1");
+ Assert.assertEquals("1",dbMicroServiceFullInfo.getStatus() );
+ microServiceWrapper.updateMicroServiceStatus("testService","v1","0");
+ dbMicroServiceFullInfo=microServiceWrapper.getMicroServiceInstance("testService", "v1");
+ Assert.assertEquals("0",dbMicroServiceFullInfo.getStatus() );
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ }
+
+
+
+ @Test
+ public void test_deleteMicroService(){
+ MicroServiceFullInfo microService = buildMicroServiceFullInfo2();
+ try {
+ microServiceWrapper.saveMicroServiceInstance(microService, false, "", "");
+ MicroServiceFullInfo dbMicroServiceFullInfo=microServiceWrapper.getMicroServiceInstance("testService2", "v1");
+ Assert.assertNotNull(dbMicroServiceFullInfo);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+ try {
+ microServiceWrapper.deleteMicroService("testService2","v1");
+ microServiceWrapper.getMicroServiceInstance("testService2", "v1");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+ }
+
+ @Test
+ public void test_deleteMicroServiceInstance(){
+
+
+ //添加多版本æœåŠ¡
+ MicroServiceFullInfo microService4v2 = buildMicroServiceFullInfo4version2();
+ try {
+ microServiceWrapper.saveMicroServiceInstance(microService4v2, false, "", "");
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ //删除ä¸å­˜åœ¨å®žä¾‹
+ try {
+ microServiceWrapper.deleteMicroServiceInstance("testService","v2","127.0.0.1","8989");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ //删除其中一个实例
+ microServiceWrapper.deleteMicroServiceInstance("testService","v2","10.74.148.87","8080");
+ MicroServiceFullInfo microService =microServiceWrapper.getMicroServiceInstance("testService", "v2");
+
+ Set<Node> nodeSet=new HashSet<Node>();
+ nodeSet.add(new Node("10.74.148.86","8080"));
+ Assert.assertEquals(nodeSet, microService.getNodes());
+
+ //删除æœåŠ¡
+ microServiceWrapper.deleteMicroServiceInstance("testService","v2","10.74.148.86","8080");
+ }
+ catch(Exception e){
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ try {
+ microServiceWrapper.getMicroServiceInstance("testService","v2");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+
+ }
+ }
+
+ @Test
+ public void test_getAllVersion(){
+ try {
+ microServiceWrapper.saveMicroServiceInstance(buildMicroServiceFullInfo(), false, "", "");
+ microServiceWrapper.saveMicroServiceInstance(buildMicroServiceFullInfo4version2(), false, "", "");
+ Set<String> versionSet=new HashSet<String>();
+ versionSet.add("v1");
+ versionSet.add("v2");
+ Assert.assertEquals(versionSet,microServiceWrapper.getAllVersion("testService"));
+
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+ try {
+ microServiceWrapper.deleteMicroService4AllVersion("testService");
+ Assert.assertEquals(0,microServiceWrapper.getAllVersion("testService").size());
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+
+ }
+
+ }
+
+ @Test
+ public void test_getAllMicroServiceKey(){
+ microServiceWrapper.saveMicroServiceInstance(buildMicroServiceFullInfo(), false, "", "");
+ microServiceWrapper.saveMicroServiceInstance(buildMicroServiceFullInfo2(), false, "", "");
+ Set<String> builder = new HashSet<String>();
+ builder.add("testService");
+ builder.add("testService2");
+ Assert.assertEquals(builder,microServiceWrapper.getAllMicroServiceKey());
+
+
+ }
+
+ private MicroServiceFullInfo buildMicroServiceFullInfo(){
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+ microServiceFullInfo.setServiceName("testService");
+ microServiceFullInfo.setVersion("v1");
+ microServiceFullInfo.setStatus("1");
+ microServiceFullInfo.setUrl("/testService/v1");
+ microServiceFullInfo.setVisualRange("0");
+ microServiceFullInfo.setProtocol("HTTP");
+ microServiceFullInfo.setEnable_ssl(false);
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.88","8080"));
+ microServiceFullInfo.setNodes(nodeSet);
+
+ return microServiceFullInfo;
+ }
+
+ private MicroServiceFullInfo buildMicroServiceFullInfo4version2(){
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+ microServiceFullInfo.setServiceName("testService");
+ microServiceFullInfo.setVersion("v2");
+ microServiceFullInfo.setStatus("1");
+ microServiceFullInfo.setUrl("/testService/v1");
+ microServiceFullInfo.setVisualRange("0");
+ microServiceFullInfo.setProtocol("HTTP");
+ microServiceFullInfo.setEnable_ssl(false);
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.87","8080"));
+ nodeSet.add(new Node("10.74.148.86","8080"));
+ microServiceFullInfo.setNodes(nodeSet);
+
+ return microServiceFullInfo;
+ }
+
+ private MicroServiceFullInfo buildMicroServiceFullInfo2(){
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+ microServiceFullInfo.setServiceName("testService2");
+ microServiceFullInfo.setVersion("v1");
+ microServiceFullInfo.setStatus("1");
+ microServiceFullInfo.setUrl("/api/testService/v1");
+ microServiceFullInfo.setVisualRange("1");
+ microServiceFullInfo.setProtocol("REST");
+ microServiceFullInfo.setEnable_ssl(true);
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.89","8080"));
+ microServiceFullInfo.setNodes(nodeSet);
+
+ return microServiceFullInfo;
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/ConsulTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/ConsulTest.java
new file mode 100644
index 0000000..abf5e09
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/ConsulTest.java
@@ -0,0 +1,149 @@
+package org.onap.msb.apiroute.wrapper.consulextend;
+
+import java.util.List;
+
+import org.apache.http.HttpEntity;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.onap.msb.apiroute.wrapper.consulextend.CatalogClient;
+import org.onap.msb.apiroute.wrapper.consulextend.Consul;
+import org.onap.msb.apiroute.wrapper.consulextend.HealthClient;
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseCallback;
+import org.onap.msb.apiroute.wrapper.consulextend.async.OriginalConsulResponse;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.consulextend.util.Http;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.orbitz.consul.model.ConsulResponse;
+import com.orbitz.consul.option.CatalogOptions;
+import com.orbitz.consul.option.QueryOptions;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ Http.class })
+@PowerMockIgnore({ "javax.net.ssl.*" })
+public class ConsulTest {
+ private static Consul consul10081;
+ private static Consul consul8500;
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(ConsulTest.class);
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+
+ Http http = PowerMockito.mock(Http.class);
+
+ PowerMockito
+ .doAnswer(new Answer() {
+ @Override
+ public Object answer(InvocationOnMock invocation)
+ throws Throwable {
+ Object[] args = invocation.getArguments();
+ ((ConsulResponseCallback) args[2]).onComplete(null);
+ return null;
+ }
+ })
+ .when(http)
+ .asyncGet(Mockito.anyString(),
+ Mockito.any(TypeReference.class),
+ Mockito.any(ConsulResponseCallback.class));
+
+ //
+ PowerMockito.spy(Http.class);
+ PowerMockito.when(Http.getInstance()).thenReturn(http);
+
+ //
+ consul10081 = Consul.builder().withHostAndPort("10.74.148.111", 10081)
+ .build();
+ consul8500 = Consul.builder().withHostAndPort("10.74.148.111", 8500)
+ .build();
+ }
+
+ @Test
+ public void testcatalogClient() {
+
+ ConsulResponseCallback<HttpEntity> callback = new ConsulResponseCallback<HttpEntity>() {
+
+ @Override
+ public void onComplete(
+ ConsulResponse<HttpEntity> consulResponse) {
+ LOGGER.info("service list complete!");
+ }
+
+ @Override
+ public void onFailure(Throwable throwable) {
+ LOGGER.info("service list failure!");
+ }
+
+ @Override
+ public void onDelayComplete(
+ OriginalConsulResponse<HttpEntity> originalConsulResponse) {
+ // TODO Auto-generated method stub
+ LOGGER.info("service list complete!");
+ }
+
+ };
+
+ // 10081
+ CatalogClient catalogclient10081 = consul10081.catalogClient();
+ catalogclient10081.getServices(CatalogOptions.BLANK, QueryOptions.BLANK, callback);
+
+ // 8500
+ CatalogClient catalogclient8500 = consul8500.catalogClient();
+ catalogclient8500.getServices(CatalogOptions.BLANK, QueryOptions.BLANK, callback);
+ }
+
+ @Test
+ public void testhealthClient() {
+
+ ConsulResponseCallback<List<ServiceHealth>> callback = new ConsulResponseCallback<List<ServiceHealth>>() {
+
+ @Override
+ public void onComplete(
+ ConsulResponse<List<ServiceHealth>> consulResponse) {
+ LOGGER.info("health service complete!");
+
+ }
+
+ @Override
+ public void onFailure(Throwable throwable) {
+ LOGGER.info("health service failure!");
+ }
+
+ @Override
+ public void onDelayComplete(
+ OriginalConsulResponse<List<ServiceHealth>> originalConsulResponse) {
+ // TODO Auto-generated method stub
+ LOGGER.info("health service complete!");
+ }
+
+ };
+
+ // 10081
+ HealthClient healthClient10081 = consul10081.healthClient();
+ healthClient10081.getAllServiceInstances("apigateway-default", CatalogOptions.BLANK,
+ QueryOptions.BLANK, callback);
+
+ healthClient10081.getHealthyServiceInstances("apigateway-default",
+ CatalogOptions.BLANK, QueryOptions.BLANK, callback);
+
+ // 8500
+ HealthClient healthClient8500 = consul8500.healthClient();
+ healthClient8500.getAllServiceInstances("apigateway-default", CatalogOptions.BLANK,
+ QueryOptions.BLANK, callback);
+ healthClient8500.getHealthyServiceInstances("apigateway-default", CatalogOptions.BLANK,
+ QueryOptions.BLANK, callback);
+
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServiceHealthCacheTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServiceHealthCacheTest.java
new file mode 100644
index 0000000..03cc209
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServiceHealthCacheTest.java
@@ -0,0 +1,24 @@
+package org.onap.msb.apiroute.wrapper.consulextend.cache;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.consulextend.Consul;
+import org.onap.msb.apiroute.wrapper.consulextend.cache.ServiceHealthCache;
+
+import com.orbitz.consul.option.CatalogOptions;
+
+public class ServiceHealthCacheTest {
+
+ @Test
+ public void testnewCache() {
+ Consul consul = Consul.newClient();
+ ServiceHealthCache cache1 = ServiceHealthCache.newCache(
+ consul.healthClient(), "huangleibo");
+ Assert.assertNotNull(cache1);
+
+ ServiceHealthCache cache2 = ServiceHealthCache.newCache(
+ consul.healthClient(), "huangleibo", false,
+ CatalogOptions.BLANK, 10);
+ Assert.assertNotNull(cache2);
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServicesCatalogCacheTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServicesCatalogCacheTest.java
new file mode 100644
index 0000000..7518ad7
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/cache/ServicesCatalogCacheTest.java
@@ -0,0 +1,15 @@
+package org.onap.msb.apiroute.wrapper.consulextend.cache;
+
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.consulextend.Consul;
+import org.onap.msb.apiroute.wrapper.consulextend.cache.ServicesCatalogCache;
+
+public class ServicesCatalogCacheTest {
+
+ @Test
+ public void testnewCache()
+ {
+ Consul consul = Consul.newClient();
+ ServicesCatalogCache cache = ServicesCatalogCache.newCache(consul.catalogClient());
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckServiceDataEmptyAndAutoStopWatchFilterTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckServiceDataEmptyAndAutoStopWatchFilterTest.java
new file mode 100644
index 0000000..9b9dd17
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckServiceDataEmptyAndAutoStopWatchFilterTest.java
@@ -0,0 +1,53 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+
+
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.consulextend.Consul;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.CheckServiceDataEmptyAndAutoStopWatchFilter;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableService;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableServiceHealth;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.Service;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+
+import com.orbitz.consul.model.ConsulResponse;
+import com.orbitz.consul.model.health.ImmutableNode;
+
+public class CheckServiceDataEmptyAndAutoStopWatchFilterTest {
+ @Test
+ public void testfilter()
+ {
+
+
+ CheckServiceDataEmptyAndAutoStopWatchFilter filter = new CheckServiceDataEmptyAndAutoStopWatchFilter("huangleibo");
+
+
+ List<ServiceHealth> list = new ArrayList<ServiceHealth>();
+
+ //id:huangleibo1,name:huangleibo,modifyIndex:1,createindex:1
+ Service service0 = ImmutableService.builder().id("huangleibo1").port(0).address("")
+ .service("huangleibo").addTags("").createIndex(1).modifyIndex(1).build();
+ ServiceHealth serviceHealth0 = ImmutableServiceHealth.builder()
+ .service(service0)
+ .node(ImmutableNode.builder().node("").address("").build())
+ .build();
+
+ list.add(serviceHealth0);
+ ConsulResponse<List<ServiceHealth>> object = new ConsulResponse<List<ServiceHealth>>(list,1,true, BigInteger.valueOf(1));
+
+ //have service,return true
+ Assert.assertTrue(filter.filter(object));
+
+ //empty [],return false
+ list.clear();
+ Assert.assertFalse(filter.filter(object));
+
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckTagAndAutoStopWatchFilterTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckTagAndAutoStopWatchFilterTest.java
new file mode 100644
index 0000000..bd9fe3a
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/CheckTagAndAutoStopWatchFilterTest.java
@@ -0,0 +1,70 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.consulextend.Consul;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.CheckTagAndAutoStopWatchFilter;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableService;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableServiceHealth;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.Service;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+
+import com.orbitz.consul.model.ConsulResponse;
+import com.orbitz.consul.model.health.ImmutableNode;
+
+public class CheckTagAndAutoStopWatchFilterTest {
+
+ @Test
+ public void testfilter() {
+
+ CheckTagAndAutoStopWatchFilter filter = new CheckTagAndAutoStopWatchFilter("huangleibo");
+
+
+ List<ServiceHealth> list = new ArrayList<ServiceHealth>();
+
+ //visual range:0,tags meet conditions
+ List<String> tags = new ArrayList<String>();
+ tags.add("\"base\":{\"protocol\":\"REST\",\"is_manual\":\"true\",\"version\":\"v1\",\"url\":\"/api/msbtest/v1\"}");
+ tags.add("\"ns\":{\"namespace\":\"nsName\"}");
+ tags.add("\"labels\":{\"visualRange\":\"0\",\"network_plane_type\":\"net\",\"customLabel\":\"custom\"}");
+
+ Service service0 = ImmutableService.builder().id("huangleibo1").port(0)
+ .address("").service("huangleibo").tags(tags).createIndex(1)
+ .modifyIndex(1).build();
+ ServiceHealth serviceHealth0 = ImmutableServiceHealth.builder()
+ .service(service0)
+ .node(ImmutableNode.builder().node("").address("").build())
+ .build();
+
+ list.add(serviceHealth0);
+ ConsulResponse<List<ServiceHealth>> object = new ConsulResponse<List<ServiceHealth>>(list,1,true,BigInteger.valueOf(1));
+
+ //visual range:0,tags meet conditions,return true
+ Assert.assertTrue(filter.filter(object));
+
+ //visual range:1,tags don't meet conditions
+ List<String> tags1 = new ArrayList<String>();
+ tags1.add("\"base\":{\"protocol\":\"REST\",\"is_manual\":\"true\",\"version\":\"v1\",\"url\":\"/api/msbtest/v1\"}");
+ tags1.add("\"ns\":{\"namespace\":\"nsName\"}");
+ tags1.add("\"labels\":{\"visualRange\":\"1\",\"network_plane_type\":\"net\",\"customLabel\":\"custom\"}");
+
+ Service service1 = ImmutableService.builder().id("huangleibo1").port(0)
+ .address("").service("huangleibo").tags(tags1).createIndex(1)
+ .modifyIndex(1).build();
+ ServiceHealth serviceHealth1 = ImmutableServiceHealth.builder()
+ .service(service1)
+ .node(ImmutableNode.builder().node("").address("").build())
+ .build();
+ list.clear();
+ list.add(serviceHealth1);
+
+ //visual range:1,tags don't meet conditions,return false
+ Assert.assertFalse(filter.filter(object));
+
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ConsulIndexFilterTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ConsulIndexFilterTest.java
new file mode 100644
index 0000000..51dfa49
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ConsulIndexFilterTest.java
@@ -0,0 +1,42 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.math.BigInteger;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.ConsulIndexFilter;
+
+import com.orbitz.consul.model.ConsulResponse;
+
+public class ConsulIndexFilterTest {
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+
+ }
+
+ @Test
+ public void testfilter()
+ {
+ ConsulIndexFilter<Integer> filter = new ConsulIndexFilter<Integer>();
+
+ int response = 1;
+ long lastContact= 1;
+ boolean knownLeader = true;
+
+ ConsulResponse<Integer> object = new ConsulResponse<Integer>(response,lastContact,knownLeader,BigInteger.valueOf(1));
+
+ //index 1;the first time,return true
+ Assert.assertTrue(filter.filter(object));
+
+
+ //index 1;same index,return false
+ Assert.assertFalse(filter.filter(object));
+
+ ConsulResponse<Integer> object1 = new ConsulResponse<Integer>(response,lastContact,knownLeader,BigInteger.valueOf(2));
+
+ //index 2;different index,return true
+ Assert.assertTrue(filter.filter(object1));
+
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ServiceModifyIndexFilterTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ServiceModifyIndexFilterTest.java
new file mode 100644
index 0000000..bc01589
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/ServiceModifyIndexFilterTest.java
@@ -0,0 +1,114 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.ServiceModifyIndexFilter;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableService;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableServiceHealth;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.Service;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+
+import com.orbitz.consul.model.ConsulResponse;
+import com.orbitz.consul.model.health.ImmutableNode;
+
+public class ServiceModifyIndexFilterTest {
+
+ @Test
+ public void testfilter()
+ {
+ ServiceModifyIndexFilter filter = new ServiceModifyIndexFilter();
+
+
+ List<ServiceHealth> list0 = new ArrayList<ServiceHealth>();
+
+ //id:huangleibo1,name:huangleibo,modifyIndex:1,createIndex:1
+ Service service0 = ImmutableService.builder().id("huangleibo1").port(0).address("")
+ .service("huangleibo").addTags("").createIndex(1).modifyIndex(1).build();
+ ServiceHealth serviceHealth0 = ImmutableServiceHealth.builder()
+ .service(service0)
+ .node(ImmutableNode.builder().node("").address("").build())
+ .build();
+ list0.add(serviceHealth0);
+
+ ConsulResponse<List<ServiceHealth>> object0 = new ConsulResponse<List<ServiceHealth>>(list0,1,true,BigInteger.valueOf(1));
+
+ //list-size:1,id:huangleibo1,name:huangleibo,modifyIndex:1;the first time:return true
+ Assert.assertTrue(filter.filter(object0));
+
+ //list-size:1,id:huangleibo1,name:huangleibo,modifyIndex:1;same index:return false
+ Assert.assertFalse(filter.filter(object0));
+
+ /////////////////////////////////////////////////////////////////////////////////
+
+ List<ServiceHealth> list1 = new ArrayList<ServiceHealth>();
+
+ //id:huangleibo2,name:huangleibo,modifyIndex:1,createIndex:1
+ Service service1 = ImmutableService.builder().id("huangleibo2").port(0).address("")
+ .service("huangleibo").addTags("").createIndex(1).modifyIndex(1).build();
+ ServiceHealth serviceHealth1 = ImmutableServiceHealth.builder()
+ .service(service1)
+ .node(ImmutableNode.builder().node("").address("").build())
+ .build();
+
+ list1.add(serviceHealth0);
+ list1.add(serviceHealth1);
+
+ ConsulResponse<List<ServiceHealth>> object1 = new ConsulResponse<List<ServiceHealth>>(list1,1,true,BigInteger.valueOf(1));
+
+ //list-size:2,
+ //id:huangleibo1,name:huangleibo,modifyIndex:1,createIndex:1
+ //id:huangleibo2,name:huangleibo,modifyIndex:1,createIndex:1
+ //size different,return true
+ Assert.assertTrue(filter.filter(object1));
+
+ //////////////////////////////////////////////////////////////////////////
+ List<ServiceHealth> list2 = new ArrayList<ServiceHealth>();
+
+ //id:huangleibo3,name:huangleibo,modifyIndex:1,createIndex:1
+ ImmutableService service2 = ImmutableService.builder().id("huangleibo3").port(0).address("")
+ .service("huangleibo").addTags("").createIndex(1).modifyIndex(1).build();
+ ServiceHealth serviceHealth2 = ImmutableServiceHealth.builder()
+ .service(service2)
+ .node(ImmutableNode.builder().node("").address("").build())
+ .build();
+ list2.add(serviceHealth0);
+ list2.add(serviceHealth2);
+
+ ConsulResponse<List<ServiceHealth>> object2 = new ConsulResponse<List<ServiceHealth>>(list2,1,true,BigInteger.valueOf(1));
+
+ //list-size:2,
+ //id:huangleibo1,name:huangleibo,modifyIndex:1,createIndex:1
+ //id:huangleibo3,name:huangleibo,modifyIndex:1,createIndex:1
+ //instance id different,return true
+ Assert.assertTrue(filter.filter(object2));
+
+
+ //////////////////////////////////////////////////////////////////////////
+ List<ServiceHealth> list3 = new ArrayList<ServiceHealth>();
+
+ //edit modifyindex 1 to 2
+ Service service3 = service2.withModifyIndex(2);
+ ServiceHealth serviceHealth3 = ImmutableServiceHealth.builder()
+ .service(service3)
+ .node(ImmutableNode.builder().node("").address("").build())
+ .build();
+ list3.add(serviceHealth0);
+ list3.add(serviceHealth3);
+
+ ConsulResponse<List<ServiceHealth>> object3 = new ConsulResponse<List<ServiceHealth>>(list3,1,true,BigInteger.valueOf(1));
+
+ //list-size:2,
+ //id:huangleibo1,name:huangleibo,modifyIndex:1,createIndex:1
+ //id:huangleibo3,name:huangleibo,modifyIndex:2,createIndex:1
+ //modifyIndex different,return true
+ Assert.assertTrue(filter.filter(object3));
+
+ //the same content,return false
+ Assert.assertFalse(filter.filter(object3));
+
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchCatalogServicesTaskTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchCatalogServicesTaskTest.java
new file mode 100644
index 0000000..14455ee
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchCatalogServicesTaskTest.java
@@ -0,0 +1,138 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.http.HttpEntity;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.onap.msb.apiroute.wrapper.consulextend.Consul;
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseCallback;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.WatchCatalogServicesTask;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.WatchTask;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.WatchTask.Filter;
+import org.onap.msb.apiroute.wrapper.consulextend.util.Http;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.orbitz.consul.model.ConsulResponse;
+import com.orbitz.consul.option.CatalogOptions;
+import com.orbitz.consul.option.QueryOptions;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ Http.class })
+@PowerMockIgnore({ "javax.net.ssl.*" })
+public class WatchCatalogServicesTaskTest {
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(WatchCatalogServicesTaskTest.class);
+
+ private Consul consul;
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Before
+ public void init() {
+
+ Map<String, List<String>> catalogservices = new HashMap<String, List<String>>();
+ String servicename = "huangleibo";
+ List<String> tags = new ArrayList<String>();
+ tags.add("1111");
+ tags.add("2222");
+ catalogservices.put(servicename, tags);
+
+ long lastContact = 1;
+ boolean knownLeader = true;
+ BigInteger index = BigInteger.valueOf(1);
+ final ConsulResponse<Map<String, List<String>>> response = new ConsulResponse<Map<String, List<String>>>(
+ catalogservices, lastContact, knownLeader, index);
+
+ //
+ Http http = PowerMockito.mock(Http.class);
+
+ PowerMockito
+ .doAnswer(new Answer() {
+ @Override
+ public Object answer(InvocationOnMock invocation)
+ throws Throwable {
+ Object[] args = invocation.getArguments();
+ ((ConsulResponseCallback) args[2]).onComplete(response);
+ return null;
+ }
+ })
+ .when(http)
+ .asyncGet(Mockito.anyString(),
+ Mockito.any(TypeReference.class),
+ Mockito.any(ConsulResponseCallback.class));
+
+ //
+ PowerMockito.spy(Http.class);
+ PowerMockito.when(Http.getInstance()).thenReturn(http);
+
+ consul = Consul.newClient();
+
+ WatchCatalogServicesTask task0 = new WatchCatalogServicesTask(
+ consul.catalogClient(), CatalogOptions.BLANK,
+ QueryOptions.BLANK, 10);
+
+ WatchCatalogServicesTask task1 = new WatchCatalogServicesTask(
+ consul.catalogClient(), 10);
+
+ WatchCatalogServicesTask task2 = new WatchCatalogServicesTask(
+ consul.catalogClient());
+
+ }
+
+ public class StopHandler implements WatchTask.Handler<HttpEntity>
+ {
+
+ private WatchCatalogServicesTask task;
+
+ StopHandler(WatchCatalogServicesTask task)
+ {
+ this.task = task;
+ }
+
+ @Override
+ public void handle(ConsulResponse<HttpEntity> object) {
+ // TODO Auto-generated method stub
+// Map<String, List<String>> map = (Map<String, List<String>>)object.getResponse();
+ LOGGER.debug("handler is here");
+ task.stopWatch();
+ }
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Test
+ public void teststartWatch() {
+ WatchCatalogServicesTask task0 = new WatchCatalogServicesTask(
+ consul.catalogClient(), CatalogOptions.BLANK,
+ QueryOptions.BLANK, 10);
+
+ task0.addFilter(new Filter() {
+ @Override
+ public boolean filter(ConsulResponse object) {
+ // TODO Auto-generated method stub
+// Map<String, List<String>> map = (Map<String, List<String>>)object.getResponse();
+ LOGGER.debug("filter is here");
+ return true;
+ }
+
+ });
+
+ task0.addHandler(new StopHandler(task0));
+
+ task0.startWatch();
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchServiceHealthTaskTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchServiceHealthTaskTest.java
new file mode 100644
index 0000000..0e5f95b
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchServiceHealthTaskTest.java
@@ -0,0 +1,156 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.onap.msb.apiroute.wrapper.consulextend.Consul;
+import org.onap.msb.apiroute.wrapper.consulextend.async.ConsulResponseCallback;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.WatchServiceHealthTask;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.WatchTask;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.WatchTask.Filter;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableService;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableServiceHealth;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.Service;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.consulextend.util.Http;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.orbitz.consul.model.ConsulResponse;
+import com.orbitz.consul.model.health.ImmutableNode;
+import com.orbitz.consul.option.CatalogOptions;
+import com.orbitz.consul.option.QueryOptions;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ Http.class })
+@PowerMockIgnore({ "javax.net.ssl.*" })
+public class WatchServiceHealthTaskTest {
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(WatchServiceHealthTaskTest.class);
+
+ private Consul consul;
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Before
+ public void init() {
+
+ List<ServiceHealth> list = new ArrayList<ServiceHealth>();
+
+ Service service = ImmutableService.builder().id("").port(0).address("")
+ .service("huangleibo").addTags("").createIndex(1).modifyIndex(1).build();
+ ServiceHealth serviceHealth = ImmutableServiceHealth.builder()
+ .service(service)
+ .node(ImmutableNode.builder().node("").address("").build())
+ .build();
+ list.add(serviceHealth);
+
+ long lastContact = 1;
+ boolean knownLeader = true;
+ BigInteger index = BigInteger.valueOf(1);
+ final ConsulResponse<List<ServiceHealth>> response = new ConsulResponse<List<ServiceHealth>>(
+ list, lastContact, knownLeader, index);
+
+ //
+ Http http = PowerMockito.mock(Http.class);
+
+ PowerMockito
+ .doAnswer(new Answer() {
+ @Override
+ public Object answer(InvocationOnMock invocation)
+ throws Throwable {
+ Object[] args = invocation.getArguments();
+ ((ConsulResponseCallback) args[2]).onComplete(response);
+ return null;
+ }
+ })
+ .when(http)
+ .asyncGet(Mockito.anyString(),
+ Mockito.any(TypeReference.class),
+ Mockito.any(ConsulResponseCallback.class));
+
+ //
+ PowerMockito.spy(Http.class);
+ PowerMockito.when(Http.getInstance()).thenReturn(http);
+
+ }
+
+ @Test
+ public void testgetServiceName() {
+ consul = Consul.newClient();
+
+ WatchServiceHealthTask task0 = new WatchServiceHealthTask(
+ consul.healthClient(), "huangleibo_task0", true,
+ CatalogOptions.BLANK, 10, QueryOptions.BLANK);
+
+ LOGGER.info("service name:" + task0.getServiceName());
+
+ WatchServiceHealthTask task1 = new WatchServiceHealthTask(
+ consul.healthClient(), "huangleibo_task1", true, 10);
+
+ LOGGER.debug("service name:" + task1.getServiceName());
+
+ WatchServiceHealthTask task2 = new WatchServiceHealthTask(
+ consul.healthClient(), "huangleibo_task2", 10);
+
+ LOGGER.debug("service name:" + task2.getServiceName());
+
+ }
+
+ public class StopHandler implements WatchTask.Handler<List<ServiceHealth>>
+ {
+
+ private WatchServiceHealthTask task;
+
+ StopHandler(WatchServiceHealthTask task)
+ {
+ this.task = task;
+ }
+
+ @Override
+ public void handle(ConsulResponse<List<ServiceHealth>> object) {
+ // TODO Auto-generated method stub
+ List<ServiceHealth> list = (List<ServiceHealth>)object.getResponse();
+ LOGGER.debug("handler:"+list.get(0).getService().getService());
+ task.stopWatch();
+ }
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Test
+ public void teststartWatch() {
+ Consul consul = Consul.newClient();
+ String serviceName = "huangleibo";
+
+ WatchServiceHealthTask task0 = new WatchServiceHealthTask(
+ consul.healthClient(), serviceName, true, CatalogOptions.BLANK,
+ 10, QueryOptions.BLANK);
+
+ task0.addFilter(new Filter() {
+
+ @Override
+ public boolean filter(ConsulResponse object) {
+ // TODO Auto-generated method stub
+ List<ServiceHealth> list = (List<ServiceHealth>)object.getResponse();
+ LOGGER.debug("filter:"+list.get(0).getService().getService());
+ return true;
+ }
+
+ });
+
+ task0.addHandler(new StopHandler(task0));
+
+ task0.startWatch();
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WriteBufferHandlerTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WriteBufferHandlerTest.java
new file mode 100644
index 0000000..a86baf1
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WriteBufferHandlerTest.java
@@ -0,0 +1,46 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.consulextend.expose.WriteBufferHandler;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableService;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableServiceHealth;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.Service;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.queue.ServiceData;
+
+import com.orbitz.consul.model.ConsulResponse;
+import com.orbitz.consul.model.health.ImmutableNode;
+
+public class WriteBufferHandlerTest {
+ @Test
+ public void testhandle() {
+ List<ServiceHealth> list = new ArrayList<ServiceHealth>();
+
+ // modifyIndex 1
+ Service service0 = ImmutableService.builder().id("huangleibo1").port(0)
+ .address("").service("huangleibo").addTags("").createIndex(1)
+ .modifyIndex(1).build();
+ ServiceHealth serviceHealth0 = ImmutableServiceHealth.builder()
+ .service(service0)
+ .node(ImmutableNode.builder().node("").address("").build())
+ .build();
+
+ list.add(serviceHealth0);
+
+ long lastContact = 1;
+ boolean knownLeader = true;
+ BigInteger index = BigInteger.valueOf(1);
+ ConsulResponse<List<ServiceHealth>> object = new ConsulResponse<List<ServiceHealth>>(
+ list, lastContact, knownLeader, index);
+
+ WriteBufferHandler<List<ServiceHealth>> handler = new WriteBufferHandler<List<ServiceHealth>>(
+ ServiceData.DataType.service);
+
+ handler.handle(object);
+
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/ServiceHealthTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/ServiceHealthTest.java
new file mode 100644
index 0000000..008a28d
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/ServiceHealthTest.java
@@ -0,0 +1,54 @@
+package org.onap.msb.apiroute.wrapper.consulextend.model.health;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.Service;
+
+import com.orbitz.consul.model.health.HealthCheck;
+import com.orbitz.consul.model.health.ImmutableHealthCheck;
+import com.orbitz.consul.model.health.ImmutableNode;
+import com.orbitz.consul.model.health.Node;
+
+public class ServiceHealthTest {
+
+ @Test
+ public void TestImmutableServiceHealth() {
+ Service service = ImmutableService.builder().id("").port(0).address("")
+ .service("huangleibo").addTags("").createIndex(1)
+ .modifyIndex(1).build();
+ Node node = ImmutableNode.builder().node("").address("").build();
+
+ HealthCheck healthCheck0 = ImmutableHealthCheck.builder().checkId("")
+ .name("").node("").notes("").output("").serviceId("")
+ .serviceName("").status("").build();
+ HealthCheck healthCheck1 = ImmutableHealthCheck.builder().checkId("")
+ .name("").node("").notes("").output("").serviceId("")
+ .serviceName("").status("").build();
+ HealthCheck healthCheck2 = ImmutableHealthCheck.builder().checkId("")
+ .name("").node("").notes("").output("").serviceId("")
+ .serviceName("").status("").build();
+
+ ImmutableServiceHealth serviceHealth0 = ImmutableServiceHealth
+ .builder().service(service).node(node).addChecks(healthCheck0)
+ .addChecks(healthCheck1, healthCheck2).build();
+
+ Assert.assertNotNull(serviceHealth0.getNode());
+ Assert.assertNotNull(serviceHealth0.getChecks());
+ /* ############################################################### */
+
+ ImmutableServiceHealth serviceHealth1 = serviceHealth0.withNode(node)
+ .withNode(ImmutableNode.builder().node("").address("").build())
+ .withService(service).withService(ImmutableService.builder().id("").port(0).address("")
+ .service("huangleibo1111").addTags("").createIndex(1)
+ .modifyIndex(1).build()).withChecks(healthCheck0);
+
+ Assert.assertFalse(serviceHealth1.equals(serviceHealth0));
+ System.out.println(serviceHealth1.hashCode());
+
+ /* ############################################################### */
+
+ ImmutableServiceHealth serviceHealth2 = ImmutableServiceHealth.builder().from(serviceHealth1).build();
+ Assert.assertTrue(serviceHealth1.equals(serviceHealth2));
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/ServiceTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/ServiceTest.java
new file mode 100644
index 0000000..81629c5
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/model/health/ServiceTest.java
@@ -0,0 +1,32 @@
+package org.onap.msb.apiroute.wrapper.consulextend.model.health;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ServiceTest {
+
+ @Test
+ public void testImmutableService() {
+ ImmutableService service0 = ImmutableService.builder()
+ .id("huangleibo_id").port(0).address("").service("huangleibo")
+ .addTags("111", "222").createIndex(1).modifyIndex(1).build();
+ Assert.assertEquals("huangleibo_id", service0.getId());
+ Assert.assertEquals(1, service0.getCreateIndex());
+ Assert.assertEquals(1, service0.getModifyIndex());
+
+ ImmutableService service1 = service0.withId("huangleibo_id")
+ .withId("new_id").withService("huangleibo")
+ .withService("new_service").withTags("new_tags")
+ .withAddress("").withAddress("new_address").withPort(0)
+ .withPort(1).withCreateIndex(1).withCreateIndex(2)
+ .withModifyIndex(1).withModifyIndex(2);
+
+ Assert.assertFalse(service0.equals(service1));
+
+ System.out.println(service1.hashCode());
+
+ ImmutableService service2 = ImmutableService.builder().from(service1)
+ .build();
+ Assert.assertEquals("new_id", service2.getId());
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/util/HttpTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/util/HttpTest.java
new file mode 100644
index 0000000..af2197e
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/consulextend/util/HttpTest.java
@@ -0,0 +1,80 @@
+package org.onap.msb.apiroute.wrapper.consulextend.util;
+
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.ProtocolVersion;
+import org.apache.http.StatusLine;
+import org.apache.http.entity.BasicHttpEntity;
+import org.apache.http.message.BasicHttpResponse;
+import org.apache.http.message.BasicStatusLine;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.consulextend.util.Http;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.orbitz.consul.option.ConsistencyMode;
+import com.orbitz.consul.option.ImmutableCatalogOptions;
+import com.orbitz.consul.option.ImmutableQueryOptions;
+import com.orbitz.consul.option.QueryOptions;
+
+public class HttpTest {
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(HttpTest.class);
+
+ @Before
+ public void init() {
+
+ }
+
+ @Test
+ public void testoptionsFrom() {
+ ImmutableCatalogOptions catalogs = ImmutableCatalogOptions.builder()
+ .build();
+ catalogs = catalogs.withDatacenter("datacenter").withTag("tag");
+
+ BigInteger index = new BigInteger("1");
+ ImmutableQueryOptions querys = QueryOptions.blockSeconds(10, index)
+ .build();
+ querys = querys.withConsistencyMode(ConsistencyMode.STALE)
+ .withDatacenter("datacenter").withNear("near")
+ .withToken("taoken");
+ String url = Http.optionsFrom(catalogs, querys);
+ LOGGER.info(url);
+ }
+
+ @Test
+ public void testconsulResponse() {
+
+ TypeReference<Map<String, List<String>>> TYPE_SERVICES_MAP = new TypeReference<Map<String, List<String>>>() {};
+
+ ProtocolVersion version = new ProtocolVersion("HTTP",1,1);
+ StatusLine status= new BasicStatusLine(version,200,"ok");
+ BasicHttpResponse response = new BasicHttpResponse(status);
+
+ response.setHeader("X-Consul-Index", "1");
+ response.setHeader("X-Consul-Lastcontact", "1");
+ response.setHeader("X-Consul-Knownleader", "true");
+
+ BasicHttpEntity entity = new BasicHttpEntity();
+ InputStream content = HttpTest.class.getResourceAsStream("serviceslist.json");
+ entity.setContent(content);
+ response.setEntity(entity);
+
+ Http.consulResponse(TYPE_SERVICES_MAP, response);
+
+ TypeReference<String> TYPE_SERVICES_MAP_STRING = new TypeReference<String>() {};
+ InputStream content1 = HttpTest.class.getResourceAsStream("serviceslist.json");
+ entity.setContent(content1);
+
+ Http.consulResponse(TYPE_SERVICES_MAP_STRING, response);
+
+ TypeReference<HttpEntity> TYPE_SERVICES_MAP_ENTITY = new TypeReference<HttpEntity>() {};
+ Http.consulResponse(TYPE_SERVICES_MAP_ENTITY, response);
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/queue/QueueManagerTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/queue/QueueManagerTest.java
new file mode 100644
index 0000000..a76575f
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/queue/QueueManagerTest.java
@@ -0,0 +1,178 @@
+package org.onap.msb.apiroute.wrapper.queue;
+
+import java.io.InputStream;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.entity.BasicHttpEntity;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.SyncDataManager;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableService;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableServiceHealth;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.Service;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.consulextend.util.HttpTest;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.queue.QueueManager;
+import org.onap.msb.apiroute.wrapper.queue.ServiceConsumer;
+import org.onap.msb.apiroute.wrapper.queue.ServiceData;
+import org.onap.msb.apiroute.wrapper.queue.ServiceListConsumer;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import com.fiftyonred.mock_jedis.MockJedisPool;
+import com.orbitz.consul.model.health.ImmutableNode;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({JedisUtil.class,RouteUtil.class,RedisAccessWrapper.class})
+@PowerMockIgnore( {"javax.management.*"})
+public class QueueManagerTest {
+ private static QueueManager queueManager;
+
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ queueManager=QueueManager.getInstance();
+ putInServiceListQueue();
+ putInServiceQueue4Update();
+
+ }
+
+ @Before
+ public void setUpBeforeTest() throws Exception {
+ final JedisPool mockJedisPool = new MockJedisPool(new JedisPoolConfig(), "localhost");
+ PowerMockito.mockStatic(JedisUtil.class);
+ JedisUtil jedisUtil=PowerMockito.mock(JedisUtil.class);
+ PowerMockito.when(jedisUtil.borrowJedisInstance()).thenReturn(mockJedisPool.getResource());
+
+ PowerMockito.replace(PowerMockito.method(RedisAccessWrapper.class, "filterKeys")).with(new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ return mockJedisPool.getResource().keys((String) args[0]);
+ }
+ });
+ }
+
+
+
+ public void test_ServiceConsumer(){
+
+ //start ServiceListConsumer
+// new Thread(new ServiceListConsumer(this),"ServiceListConsumerThread").start();
+
+ //start Service Consumer
+ int serviceQueneNum=RouteUtil.SERVICE_DATA_QUEUE_NUM;
+ for(int i=0;i<serviceQueneNum;i++){
+ new Thread(new ServiceConsumer(i),"ServiceConsumerThread"+i).start();
+ }
+
+ }
+
+
+ public void test_ServiceListConsumer(){
+
+ //start ServiceListConsumer
+ new Thread(new ServiceListConsumer(),"ServiceListConsumerThread").start();
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ putInServiceQueue4Delete();
+ }
+
+
+
+ private static void putInServiceListQueue(){
+ ServiceData<HttpEntity> data=new ServiceData<HttpEntity>();
+ data.setDataType(ServiceData.DataType.service_list);
+
+ BasicHttpEntity entity = new BasicHttpEntity();
+ InputStream content = HttpTest.class.getResourceAsStream("serviceslist.json");
+ entity.setContent(content);
+ data.setData(entity);
+
+ try {
+ queueManager.putIn(data);
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof InterruptedException);
+ }
+ }
+
+ private static void putInServiceQueue4Update(){
+ ServiceData<List<ServiceHealth>> data=new ServiceData<List<ServiceHealth>>();
+ data.setDataType(ServiceData.DataType.service);
+ data.setOperate(ServiceData.Operate.delete);
+
+ List<String> tagList = new ArrayList<String>();
+ tagList.add("\"base\":{\"protocol\":\"REST\",\"version\":\"v1\",\"url\":\"/api/msbtest/v1\"}");
+ tagList
+ .add("\"labels\":{\"visualRange\":\"0\",\"network_plane_type\":\"net\",\"customLabel\":\"custom\"}");
+ tagList.add("\"ns\":{\"namespace\":\"ns1\"}");
+
+ Service service =
+ ImmutableService.builder().id("id").port(8686).address("10.74.165.246").service("msbtest")
+ .addAllTags(tagList).createIndex(0).modifyIndex(0).build();
+ ServiceHealth serviceHealth =
+ ImmutableServiceHealth.builder().service(service)
+ .node(ImmutableNode.builder().node("server").address("192.168.1.98").build()).build();
+ List<ServiceHealth> serviceHealthList = new ArrayList<ServiceHealth>();
+ serviceHealthList.add(serviceHealth);
+
+ data.setData(serviceHealthList);
+
+ try {
+ queueManager.putIn(data);
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof InterruptedException);
+ }
+ }
+
+ private static void putInServiceQueue4Delete(){
+ ServiceData<List<ServiceHealth>> data=new ServiceData<List<ServiceHealth>>();
+ data.setDataType(ServiceData.DataType.service);
+ data.setOperate(ServiceData.Operate.update);
+
+ List<String> tagList = new ArrayList<String>();
+ tagList.add("\"base\":{\"protocol\":\"REST\",\"version\":\"v1\",\"url\":\"/api/msbtest/v1\"}");
+ tagList
+ .add("\"labels\":{\"visualRange\":\"0\",\"network_plane_type\":\"net\",\"customLabel\":\"custom\"}");
+ tagList.add("\"ns\":{\"namespace\":\"ns1\"}");
+
+ Service service =
+ ImmutableService.builder().id("id").port(8686).address("10.74.165.246").service("msbtest")
+ .addAllTags(tagList).createIndex(0).modifyIndex(0).build();
+ ServiceHealth serviceHealth =
+ ImmutableServiceHealth.builder().service(service)
+ .node(ImmutableNode.builder().node("server").address("192.168.1.98").build()).build();
+ List<ServiceHealth> serviceHealthList = new ArrayList<ServiceHealth>();
+ serviceHealthList.add(serviceHealth);
+
+ data.setData(serviceHealthList);
+
+ try {
+ queueManager.putIn(data);
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof InterruptedException);
+ }
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/ApiRouteServiceTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/ApiRouteServiceTest.java
new file mode 100644
index 0000000..a5aa87a
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/ApiRouteServiceTest.java
@@ -0,0 +1,251 @@
+package org.onap.msb.apiroute.wrapper.service;
+
+import com.fiftyonred.mock_jedis.MockJedisPool;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.api.ApiRouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.service.ApiRouteService;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({JedisUtil.class,RedisAccessWrapper.class})
+@PowerMockIgnore( {"javax.management.*"})
+public class ApiRouteServiceTest {
+ private static ApiRouteService apiRouteService = null;
+ private static Comparator<ApiRouteInfo> apiRouteComparator = null;
+ @BeforeClass
+ public static void setUp() throws Exception{
+ apiRouteService = ApiRouteService.getInstance();
+ apiRouteComparator = new Comparator<ApiRouteInfo>() {
+ @Override
+ public int compare(ApiRouteInfo o1, ApiRouteInfo o2) {
+ if (!o1.getServiceName().equals(o2.getServiceName()))
+ return (o1.getServiceName()).compareTo(o2.getServiceName());
+ if (!o1.getVersion().equals(o2.getVersion()))
+ return (o1.getVersion()).compareTo(o2.getVersion());
+ return 0;
+ }
+ };
+ }
+ @Before
+ public void setUpBeforeTest() throws Exception {
+ final JedisPool mockJedisPool = new MockJedisPool(new JedisPoolConfig(), "localhost");
+ PowerMockito.mockStatic(JedisUtil.class);
+ JedisUtil jedisUtil=PowerMockito.mock(JedisUtil.class);
+ PowerMockito.when(jedisUtil.borrowJedisInstance()).thenReturn(mockJedisPool.getResource());
+
+ PowerMockito.replace(PowerMockito.method(RedisAccessWrapper.class, "filterKeys")).with(new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ return mockJedisPool.getResource().keys((String) args[0]);
+ }
+ });
+ }
+ @Test
+ public void testGetApiRouteInstance_key_not_exist(){
+ try {
+ assertNull(apiRouteService.getApiRouteInstance("msb:routing:api:notexistservice:v1"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testGetApiRouteInstance_key_exist(){
+ ApiRouteInfo apirouteInfo = new ApiRouteInfo();
+ apirouteInfo.setServiceName("testapi");
+ apirouteInfo.setVersion("v1");
+ apirouteInfo.setStatus("1");
+ apirouteInfo.setUrl("/api/testapi/v1");
+ apirouteInfo.setUseOwnUpstream("0");
+ apirouteInfo.setVisualRange("0");
+ apirouteInfo.setEnable_ssl(false);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ apirouteInfo.setServers(servers);
+ try {
+ apiRouteService.saveApiRouteService2Redis(apirouteInfo,"msb:routing:api:testapi:v1");
+ assertEquals(apirouteInfo, apiRouteService.getApiRouteInstance("msb:routing:api:testapi:v1"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testSaveApiRouteService2Redis(){
+ ApiRouteInfo apirouteInfo = new ApiRouteInfo();
+ apirouteInfo.setServiceName("testapi");
+ apirouteInfo.setVersion("v1");
+ apirouteInfo.setStatus("1");
+ apirouteInfo.setUrl("/api/testapi/v1");
+ apirouteInfo.setUseOwnUpstream("0");
+ apirouteInfo.setVisualRange("0");
+ apirouteInfo.setEnable_ssl(true);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ apirouteInfo.setServers(servers);
+ try {
+ apiRouteService.saveApiRouteService2Redis(apirouteInfo,"msb:routing:api:testapi:v1");
+ assertEquals(apirouteInfo, apiRouteService.getApiRouteInstance("msb:routing:api:testapi:v1"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testSaveApiRouteService2Redis2(){
+ ApiRouteInfo apirouteInfo = new ApiRouteInfo();
+ apirouteInfo.setServiceName("test26msb");
+ apirouteInfo.setVersion("v1");
+ apirouteInfo.setStatus("1");
+ apirouteInfo.setUrl("/api/microservices/v1");
+ apirouteInfo.setUseOwnUpstream("0");
+ apirouteInfo.setVisualRange("0");
+ apirouteInfo.setEnable_ssl(true);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.151.26","443")};
+ apirouteInfo.setServers(servers);
+ try {
+ apiRouteService.saveApiRouteService2Redis(apirouteInfo,"msb:routing:api:test26msb:v1");
+ assertEquals(apirouteInfo, apiRouteService.getApiRouteInstance("msb:routing:api:test26msb:v1"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testDeleteApiRouteService2Redis(){
+ ApiRouteInfo apirouteInfo = new ApiRouteInfo();
+ apirouteInfo.setServiceName("testapi");
+ apirouteInfo.setVersion("v1");
+ apirouteInfo.setStatus("1");
+ apirouteInfo.setUrl("/api/testapi/v1");
+ apirouteInfo.setUseOwnUpstream("0");
+ apirouteInfo.setVisualRange("0");
+ apirouteInfo.setEnable_ssl(false);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ apirouteInfo.setServers(servers);
+ try {
+ apiRouteService.saveApiRouteService2Redis(apirouteInfo,"msb:routing:api:testapi:v1");
+ assertNotNull(apiRouteService.getApiRouteInstance("msb:routing:api:testapi:v1"));
+ apiRouteService.deleteApiRouteService2Redis("msb:routing:api:testapi:v1");
+ assertNull(apiRouteService.getApiRouteInstance("msb:routing:api:testapi:v1"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testUpdateApiRouteStatus2Redis(){
+ ApiRouteInfo apirouteInfo = new ApiRouteInfo();
+ apirouteInfo.setServiceName("testapi");
+ apirouteInfo.setVersion("v1");
+ apirouteInfo.setStatus("1");
+ apirouteInfo.setUrl("/api/testapi/v1");
+ apirouteInfo.setUseOwnUpstream("0");
+ apirouteInfo.setVisualRange("0");
+ apirouteInfo.setEnable_ssl(true);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ apirouteInfo.setServers(servers);
+ try {
+ apiRouteService.saveApiRouteService2Redis(apirouteInfo,"msb:routing:api:testapi:v1");
+ assertEquals("1", apiRouteService.getApiRouteInstance("msb:routing:api:testapi:v1").getStatus());
+ apiRouteService.updateApiRouteStatus2Redis("msb:routing:api:testapi:v1","0");
+ assertEquals("0", apiRouteService.getApiRouteInstance("msb:routing:api:testapi:v1").getStatus());
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testGetMultiApiRouteInstances() throws Exception {
+ ApiRouteInfo apirouteInfo = new ApiRouteInfo();
+ apirouteInfo.setServiceName("testapi");
+ apirouteInfo.setVersion("v1");
+ apirouteInfo.setStatus("1");
+ apirouteInfo.setUrl("/api/testapi/v1");
+ apirouteInfo.setUseOwnUpstream("0");
+ apirouteInfo.setVisualRange("0");
+ apirouteInfo.setEnable_ssl(false);
+ apirouteInfo.setServers(new RouteServer[]{new RouteServer("10.74.148.88","8080")});
+
+ ApiRouteInfo apirouteInfo2 = new ApiRouteInfo();
+ apirouteInfo2.setServiceName("testapi");
+ apirouteInfo2.setVersion("v2");
+ apirouteInfo2.setStatus("0");
+ apirouteInfo2.setUrl("/api/testapi/v2");
+ apirouteInfo2.setUseOwnUpstream("0");
+ apirouteInfo2.setVisualRange("0");;
+ apirouteInfo.setEnable_ssl(true);
+ apirouteInfo2.setServers(new RouteServer[]{new RouteServer("10.74.148.88","8088")});
+
+ apiRouteService.saveApiRouteService2Redis(apirouteInfo,"msb:routing:api:testapi:v1");
+ apiRouteService.saveApiRouteService2Redis(apirouteInfo2,"msb:routing:api:testapi:v2");
+
+ List<ApiRouteInfo> expected = new ArrayList<>();
+ expected.add(apirouteInfo);
+ expected.add(apirouteInfo2);
+ Collections.sort(expected, apiRouteComparator);
+
+ List<ApiRouteInfo> result = apiRouteService.getMultiApiRouteInstances("msb:routing:api:*");
+
+ Collections.sort(result, apiRouteComparator);
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void testDeleteMultiApiRouteInstances() throws Exception {
+ ApiRouteInfo apirouteInfo = new ApiRouteInfo();
+ apirouteInfo.setServiceName("testapi");
+ apirouteInfo.setVersion("v1");
+ apirouteInfo.setStatus("1");
+ apirouteInfo.setUrl("/api/testapi/v1");
+ apirouteInfo.setUseOwnUpstream("0");
+ apirouteInfo.setVisualRange("0");
+ apirouteInfo.setEnable_ssl(false);
+ apirouteInfo.setServers(new RouteServer[]{new RouteServer("10.74.148.88","8080")});
+
+ ApiRouteInfo apirouteInfo2 = new ApiRouteInfo();
+ apirouteInfo2.setServiceName("testapi");
+ apirouteInfo2.setVersion("v2");
+ apirouteInfo2.setStatus("0");
+ apirouteInfo2.setUrl("/api/testapi/v2");
+ apirouteInfo2.setUseOwnUpstream("0");
+ apirouteInfo2.setVisualRange("0");;
+ apirouteInfo.setEnable_ssl(true);
+ apirouteInfo2.setServers(new RouteServer[]{new RouteServer("10.74.148.88","8088")});
+ apiRouteService.saveApiRouteService2Redis(apirouteInfo,"msb:routing:api:testapi:v1");
+ apiRouteService.saveApiRouteService2Redis(apirouteInfo2,"msb:routing:api:testapi:v2");
+
+ assertEquals(2,apiRouteService.getMultiApiRouteInstances("msb:routing:api:testapi:*").size());
+ assertEquals(2,apiRouteService.deleteMultiApiRouteService2Redis("msb:routing:api:testapi:*"));
+ assertEquals(0,apiRouteService.getMultiApiRouteInstances("msb:routing:api:testapi:*").size());
+ }
+
+ @Test(expected = Exception.class)
+ public void testUpdateApiRouteStatus2Redis_keyNotExist() throws Exception {
+ apiRouteService.updateApiRouteStatus2Redis("msb:routing:api:notexistservice:v1","0");
+ }
+
+ @Test(expected = Exception.class)
+ public void testSaveApiRouteService2Redis_null() throws Exception {
+ apiRouteService.saveApiRouteService2Redis(null,"msb:routing:api:null:v1");
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/CustomRouteServiceTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/CustomRouteServiceTest.java
new file mode 100644
index 0000000..d34958b
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/CustomRouteServiceTest.java
@@ -0,0 +1,241 @@
+package org.onap.msb.apiroute.wrapper.service;
+
+import com.fiftyonred.mock_jedis.MockJedisPool;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.api.CustomRouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.service.CustomRouteService;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({JedisUtil.class,RedisAccessWrapper.class})
+@PowerMockIgnore( {"javax.management.*"})
+public class CustomRouteServiceTest {
+ private static CustomRouteService customRouteService = null;
+ private static Comparator<CustomRouteInfo> customRouteComparator = null;
+ @BeforeClass
+ public static void setUp() throws Exception{
+ customRouteService = CustomRouteService.getInstance();
+ customRouteComparator = new Comparator<CustomRouteInfo>() {
+ @Override
+ public int compare(CustomRouteInfo o1, CustomRouteInfo o2) {
+ if (!o1.getServiceName().equals(o2.getServiceName()))
+ return (o1.getServiceName()).compareTo(o2.getServiceName());
+ return 0;
+ }
+ };
+ }
+ @Before
+ public void setUpBeforeTest() throws Exception {
+ final JedisPool mockJedisPool = new MockJedisPool(new JedisPoolConfig(), "localhost");
+ PowerMockito.mockStatic(JedisUtil.class);
+ JedisUtil jedisUtil=PowerMockito.mock(JedisUtil.class);
+ PowerMockito.when(jedisUtil.borrowJedisInstance()).thenReturn(mockJedisPool.getResource());
+
+ PowerMockito.replace(PowerMockito.method(RedisAccessWrapper.class, "filterKeys")).with(new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ return mockJedisPool.getResource().keys((String) args[0]);
+ }
+ });
+ }
+ @Test
+ public void testGetCustomRouteInstance_key_not_exist(){
+ try {
+ assertNull(customRouteService.getCustomRouteInstance("msb:routing:custom:notexistservice:v1"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testGetCustomRouteInstance_key_exist(){
+ CustomRouteInfo customrouteInfo = new CustomRouteInfo();
+ customrouteInfo.setServiceName("testcustom");
+ customrouteInfo.setStatus("1");
+ customrouteInfo.setUrl("/custom/testcustom");
+ customrouteInfo.setUseOwnUpstream("0");
+ customrouteInfo.setVisualRange("0");
+ customrouteInfo.setEnable_ssl(false);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ customrouteInfo.setServers(servers);
+ try {
+ customRouteService.saveCustomRouteService2Redis(customrouteInfo, "msb:routing:custom:testcustom");
+ assertEquals(customrouteInfo, customRouteService.getCustomRouteInstance("msb:routing:custom:testcustom"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testSaveCustomRouteService2Redis(){
+ CustomRouteInfo customrouteInfo = new CustomRouteInfo();
+ customrouteInfo.setServiceName("testcustom");
+ customrouteInfo.setStatus("1");
+ customrouteInfo.setUrl("/custom/testcustom/v1");
+ customrouteInfo.setUseOwnUpstream("0");
+ customrouteInfo.setVisualRange("0");
+ customrouteInfo.setEnable_ssl(true);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ customrouteInfo.setServers(servers);
+ try {
+ customRouteService.saveCustomRouteService2Redis(customrouteInfo, "msb:routing:custom:testcustom");
+ assertEquals(customrouteInfo, customRouteService.getCustomRouteInstance("msb:routing:custom:testcustom"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testSaveCustomRouteService2Redis_urlIsSlash(){
+ CustomRouteInfo customrouteInfo = new CustomRouteInfo();
+ customrouteInfo.setServiceName("testcustom");
+ customrouteInfo.setStatus("1");
+ customrouteInfo.setUrl("/");
+ customrouteInfo.setUseOwnUpstream("0");
+ customrouteInfo.setVisualRange("0");
+ customrouteInfo.setEnable_ssl(true);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ customrouteInfo.setServers(servers);
+ try {
+ customRouteService.saveCustomRouteService2Redis(customrouteInfo, "msb:routing:custom:testcustom");
+ customrouteInfo.setUrl("");
+ assertEquals(customrouteInfo, customRouteService.getCustomRouteInstance("msb:routing:custom:testcustom"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testDeleteCustomRouteService2Redis(){
+ CustomRouteInfo customrouteInfo = new CustomRouteInfo();
+ customrouteInfo.setServiceName("testcustom");
+ customrouteInfo.setStatus("1");
+ customrouteInfo.setUrl("/custom/testcustom/v1");
+ customrouteInfo.setUseOwnUpstream("0");
+ customrouteInfo.setVisualRange("0");
+ customrouteInfo.setEnable_ssl(false);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ customrouteInfo.setServers(servers);
+ try {
+ customRouteService.saveCustomRouteService2Redis(customrouteInfo, "msb:routing:custom:testcustom");
+ assertNotNull(customRouteService.getCustomRouteInstance("msb:routing:custom:testcustom"));
+ customRouteService.deleteCustomRouteService2Redis("msb:routing:custom:testcustom");
+ assertNull(customRouteService.getCustomRouteInstance("msb:routing:custom:testcustom"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testUpdateCustomRouteStatus2Redis(){
+ CustomRouteInfo customrouteInfo = new CustomRouteInfo();
+ customrouteInfo.setServiceName("testcustom");
+ customrouteInfo.setStatus("1");
+ customrouteInfo.setUrl("/custom/testcustom/v1");
+ customrouteInfo.setUseOwnUpstream("0");
+ customrouteInfo.setVisualRange("0");
+ customrouteInfo.setEnable_ssl(true);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ customrouteInfo.setServers(servers);
+ try {
+ customRouteService.saveCustomRouteService2Redis(customrouteInfo, "msb:routing:custom:testcustom");
+ assertEquals("1", customRouteService.getCustomRouteInstance("msb:routing:custom:testcustom").getStatus());
+ customRouteService.updateCustomRouteStatus2Redis("msb:routing:custom:testcustom", "0");
+ assertEquals("0", customRouteService.getCustomRouteInstance("msb:routing:custom:testcustom").getStatus());
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testGetMultiCustomRouteInstances() throws Exception {
+ CustomRouteInfo customrouteInfo = new CustomRouteInfo();
+ customrouteInfo.setServiceName("testcustom");
+ customrouteInfo.setStatus("1");
+ customrouteInfo.setUrl("/custom/testcustom");
+ customrouteInfo.setUseOwnUpstream("0");
+ customrouteInfo.setVisualRange("0");
+ customrouteInfo.setEnable_ssl(false);
+ customrouteInfo.setServers(new RouteServer[]{new RouteServer("10.74.148.88","8080")});
+
+ CustomRouteInfo customrouteInfo2 = new CustomRouteInfo();
+ customrouteInfo2.setServiceName("testcustom2");
+ customrouteInfo2.setStatus("0");
+ customrouteInfo2.setUrl("/custom/testcustom2");
+ customrouteInfo2.setUseOwnUpstream("0");
+ customrouteInfo2.setVisualRange("0");;
+ customrouteInfo.setEnable_ssl(true);
+ customrouteInfo2.setServers(new RouteServer[]{new RouteServer("10.74.148.88","8088")});
+
+ customRouteService.saveCustomRouteService2Redis(customrouteInfo, "msb:routing:custom:testcustom");
+ customRouteService.saveCustomRouteService2Redis(customrouteInfo2, "msb:routing:custom:testcustom2");
+
+ List<CustomRouteInfo> expected = new ArrayList<>();
+ expected.add(customrouteInfo);
+ expected.add(customrouteInfo2);
+ Collections.sort(expected, customRouteComparator);
+
+ List<CustomRouteInfo> result = customRouteService.getMultiCustomRouteInstances("msb:routing:custom:*");
+
+ Collections.sort(result, customRouteComparator);
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void testDeleteMultiCustomRouteInstances() throws Exception {
+ CustomRouteInfo customrouteInfo = new CustomRouteInfo();
+ customrouteInfo.setServiceName("testcustom");
+ customrouteInfo.setStatus("1");
+ customrouteInfo.setUrl("/custom/testcustom");
+ customrouteInfo.setUseOwnUpstream("0");
+ customrouteInfo.setVisualRange("0");
+ customrouteInfo.setEnable_ssl(false);
+ customrouteInfo.setServers(new RouteServer[]{new RouteServer("10.74.148.88","8080")});
+
+ CustomRouteInfo customrouteInfo2 = new CustomRouteInfo();
+ customrouteInfo2.setServiceName("testcustom2");
+ customrouteInfo2.setStatus("0");
+ customrouteInfo2.setUrl("/custom/testcustom2");
+ customrouteInfo2.setUseOwnUpstream("0");
+ customrouteInfo2.setVisualRange("0");;
+ customrouteInfo.setEnable_ssl(true);
+ customrouteInfo2.setServers(new RouteServer[]{new RouteServer("10.74.148.88","8088")});
+ customRouteService.saveCustomRouteService2Redis(customrouteInfo, "msb:routing:custom:testcustom");
+ customRouteService.saveCustomRouteService2Redis(customrouteInfo2, "msb:routing:custom:testcustom2");
+
+ assertEquals(2,customRouteService.getMultiCustomRouteInstances("msb:routing:custom:*").size());
+ assertEquals(2,customRouteService.deleteMultiCustomRouteService2Redis("msb:routing:custom:*"));
+ assertEquals(0, customRouteService.getMultiCustomRouteInstances("msb:routing:custom:*").size());
+ }
+
+ @Test(expected = Exception.class)
+ public void testUpdateCustomRouteStatus2Redis_keyNotExist() throws Exception {
+ customRouteService.updateCustomRouteStatus2Redis("msb:routing:custom:notexistservice", "0");
+ }
+
+ @Test(expected = Exception.class)
+ public void testSaveCustomRouteService2Redis_null() throws Exception {
+ customRouteService.saveCustomRouteService2Redis(null, "msb:routing:custom:null");
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/IuiRouteServiceTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/IuiRouteServiceTest.java
new file mode 100644
index 0000000..0ddbb32
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/IuiRouteServiceTest.java
@@ -0,0 +1,221 @@
+package org.onap.msb.apiroute.wrapper.service;
+
+import com.fiftyonred.mock_jedis.MockJedisPool;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.api.IuiRouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.service.IuiRouteService;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({JedisUtil.class,RedisAccessWrapper.class})
+@PowerMockIgnore( {"javax.management.*"})
+public class IuiRouteServiceTest {
+ private static IuiRouteService iuiRouteService = null;
+ private static Comparator<IuiRouteInfo> iuiRouteComparator = null;
+ @BeforeClass
+ public static void setUp() throws Exception{
+ iuiRouteService = IuiRouteService.getInstance();
+ iuiRouteComparator = new Comparator<IuiRouteInfo>() {
+ @Override
+ public int compare(IuiRouteInfo o1, IuiRouteInfo o2) {
+ if (!o1.getServiceName().equals(o2.getServiceName()))
+ return (o1.getServiceName()).compareTo(o2.getServiceName());
+ return 0;
+ }
+ };
+ }
+ @Before
+ public void setUpBeforeTest() throws Exception {
+ final JedisPool mockJedisPool = new MockJedisPool(new JedisPoolConfig(), "localhost");
+ PowerMockito.mockStatic(JedisUtil.class);
+ JedisUtil jedisUtil=PowerMockito.mock(JedisUtil.class);
+ PowerMockito.when(jedisUtil.borrowJedisInstance()).thenReturn(mockJedisPool.getResource());
+
+ PowerMockito.replace(PowerMockito.method(RedisAccessWrapper.class, "filterKeys")).with(new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ return mockJedisPool.getResource().keys((String) args[0]);
+ }
+ });
+ }
+ @Test
+ public void testGetIuiRouteInstance_key_not_exist(){
+ try {
+ assertNull(iuiRouteService.getIuiRouteInstance("msb:routing:iui:notexistservice:v1"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testGetIuiRouteInstance_key_exist(){
+ IuiRouteInfo iuirouteInfo = new IuiRouteInfo();
+ iuirouteInfo.setServiceName("testiui");
+ iuirouteInfo.setStatus("1");
+ iuirouteInfo.setUrl("/iui/testiui");
+ iuirouteInfo.setUseOwnUpstream("0");
+ iuirouteInfo.setVisualRange("0");
+ iuirouteInfo.setEnable_ssl(false);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ iuirouteInfo.setServers(servers);
+ try {
+ iuiRouteService.saveIuiRouteService2Redis(iuirouteInfo,"msb:routing:iui:testiui");
+ assertEquals(iuirouteInfo, iuiRouteService.getIuiRouteInstance("msb:routing:iui:testiui"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testSaveIuiRouteService2Redis(){
+ IuiRouteInfo iuirouteInfo = new IuiRouteInfo();
+ iuirouteInfo.setServiceName("testiui");
+ iuirouteInfo.setStatus("1");
+ iuirouteInfo.setUrl("/iui/testiui/v1");
+ iuirouteInfo.setUseOwnUpstream("0");
+ iuirouteInfo.setVisualRange("0");
+ iuirouteInfo.setEnable_ssl(true);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ iuirouteInfo.setServers(servers);
+ try {
+ iuiRouteService.saveIuiRouteService2Redis(iuirouteInfo,"msb:routing:iui:testiui");
+ assertEquals(iuirouteInfo, iuiRouteService.getIuiRouteInstance("msb:routing:iui:testiui"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testDeleteIuiRouteService2Redis(){
+ IuiRouteInfo iuirouteInfo = new IuiRouteInfo();
+ iuirouteInfo.setServiceName("testiui");
+ iuirouteInfo.setStatus("1");
+ iuirouteInfo.setUrl("/iui/testiui/v1");
+ iuirouteInfo.setUseOwnUpstream("0");
+ iuirouteInfo.setVisualRange("0");
+ iuirouteInfo.setEnable_ssl(false);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ iuirouteInfo.setServers(servers);
+ try {
+ iuiRouteService.saveIuiRouteService2Redis(iuirouteInfo,"msb:routing:iui:testiui");
+ assertNotNull(iuiRouteService.getIuiRouteInstance("msb:routing:iui:testiui"));
+ iuiRouteService.deleteIuiRouteService2Redis("msb:routing:iui:testiui");
+ assertNull(iuiRouteService.getIuiRouteInstance("msb:routing:iui:testiui"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testUpdateIuiRouteStatus2Redis(){
+ IuiRouteInfo iuirouteInfo = new IuiRouteInfo();
+ iuirouteInfo.setServiceName("testiui");
+ iuirouteInfo.setStatus("1");
+ iuirouteInfo.setUrl("/iui/testiui/v1");
+ iuirouteInfo.setUseOwnUpstream("0");
+ iuirouteInfo.setVisualRange("0");
+ iuirouteInfo.setEnable_ssl(true);
+ RouteServer[] servers = new RouteServer[]{new RouteServer("10.74.148.88","8080")};
+ iuirouteInfo.setServers(servers);
+ try {
+ iuiRouteService.saveIuiRouteService2Redis(iuirouteInfo,"msb:routing:iui:testiui");
+ assertEquals("1", iuiRouteService.getIuiRouteInstance("msb:routing:iui:testiui").getStatus());
+ iuiRouteService.updateIuiRouteStatus2Redis("msb:routing:iui:testiui","0");
+ assertEquals("0", iuiRouteService.getIuiRouteInstance("msb:routing:iui:testiui").getStatus());
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testGetMultiIuiRouteInstances() throws Exception {
+ IuiRouteInfo iuirouteInfo = new IuiRouteInfo();
+ iuirouteInfo.setServiceName("testiui");
+ iuirouteInfo.setStatus("1");
+ iuirouteInfo.setUrl("/iui/testiui");
+ iuirouteInfo.setUseOwnUpstream("0");
+ iuirouteInfo.setVisualRange("0");
+ iuirouteInfo.setEnable_ssl(false);
+ iuirouteInfo.setServers(new RouteServer[]{new RouteServer("10.74.148.88","8080")});
+
+ IuiRouteInfo iuirouteInfo2 = new IuiRouteInfo();
+ iuirouteInfo2.setServiceName("testiui2");
+ iuirouteInfo2.setStatus("0");
+ iuirouteInfo2.setUrl("/iui/testiui2");
+ iuirouteInfo2.setUseOwnUpstream("0");
+ iuirouteInfo2.setVisualRange("0");;
+ iuirouteInfo.setEnable_ssl(true);
+ iuirouteInfo2.setServers(new RouteServer[]{new RouteServer("10.74.148.88","8088")});
+
+ iuiRouteService.saveIuiRouteService2Redis(iuirouteInfo,"msb:routing:iui:testiui");
+ iuiRouteService.saveIuiRouteService2Redis(iuirouteInfo2,"msb:routing:iui:testiui2");
+
+ List<IuiRouteInfo> expected = new ArrayList<>();
+ expected.add(iuirouteInfo);
+ expected.add(iuirouteInfo2);
+ Collections.sort(expected, iuiRouteComparator);
+
+ List<IuiRouteInfo> result = iuiRouteService.getMultiIuiRouteInstances("msb:routing:iui:*");
+
+ Collections.sort(result, iuiRouteComparator);
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void testDeleteMultiIuiRouteInstances() throws Exception {
+ IuiRouteInfo iuirouteInfo = new IuiRouteInfo();
+ iuirouteInfo.setServiceName("testiui");
+ iuirouteInfo.setStatus("1");
+ iuirouteInfo.setUrl("/iui/testiui");
+ iuirouteInfo.setUseOwnUpstream("0");
+ iuirouteInfo.setVisualRange("0");
+ iuirouteInfo.setEnable_ssl(false);
+ iuirouteInfo.setServers(new RouteServer[]{new RouteServer("10.74.148.88","8080")});
+
+ IuiRouteInfo iuirouteInfo2 = new IuiRouteInfo();
+ iuirouteInfo2.setServiceName("testiui2");
+ iuirouteInfo2.setStatus("0");
+ iuirouteInfo2.setUrl("/iui/testiui2");
+ iuirouteInfo2.setUseOwnUpstream("0");
+ iuirouteInfo2.setVisualRange("0");;
+ iuirouteInfo.setEnable_ssl(true);
+ iuirouteInfo2.setServers(new RouteServer[]{new RouteServer("10.74.148.88","8088")});
+ iuiRouteService.saveIuiRouteService2Redis(iuirouteInfo,"msb:routing:iui:testiui");
+ iuiRouteService.saveIuiRouteService2Redis(iuirouteInfo2,"msb:routing:iui:testiui2");
+
+ assertEquals(2,iuiRouteService.getMultiIuiRouteInstances("msb:routing:iui:*").size());
+ assertEquals(2,iuiRouteService.deleteMultiIuiRouteService2Redis("msb:routing:iui:*"));
+ assertEquals(0,iuiRouteService.getMultiIuiRouteInstances("msb:routing:iui:*").size());
+ }
+
+ @Test(expected = Exception.class)
+ public void testUpdateIuiRouteStatus2Redis_keyNotExist() throws Exception {
+ iuiRouteService.updateIuiRouteStatus2Redis("msb:routing:iui:notexistservice","0");
+ }
+
+ @Test(expected = Exception.class)
+ public void testSaveIuiRouteService2Redis_null() throws Exception {
+ iuiRouteService.saveIuiRouteService2Redis(null,"msb:routing:iui:null");
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/MicroServiceFullServiceTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/MicroServiceFullServiceTest.java
new file mode 100644
index 0000000..7ca2ff7
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/service/MicroServiceFullServiceTest.java
@@ -0,0 +1,413 @@
+package org.onap.msb.apiroute.wrapper.service;
+
+import com.fiftyonred.mock_jedis.MockJedisPool;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.api.Node;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.service.MicroServiceFullService;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.onap.msb.apiroute.wrapper.util.MicroServiceUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.*;
+
+import static org.junit.Assert.*;
+import static org.powermock.api.mockito.PowerMockito.when;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({JedisUtil.class,RedisAccessWrapper.class})
+@PowerMockIgnore( {"javax.management.*"})
+public class MicroServiceFullServiceTest {
+ private static MicroServiceFullService microServiceFullService = null;
+ private static Comparator<MicroServiceFullInfo> serviceComparator = null;
+ @BeforeClass
+ public static void setUp() throws Exception{
+ microServiceFullService = MicroServiceFullService.getInstance();
+ serviceComparator = new Comparator<MicroServiceFullInfo>() {
+ @Override
+ public int compare(MicroServiceFullInfo o1, MicroServiceFullInfo o2) {
+ if (!o1.getServiceName().equals(o2.getServiceName()))
+ return (o1.getServiceName()).compareTo(o2.getServiceName());
+ if (!o1.getVersion().equals(o2.getVersion()))
+ return (o1.getVersion()).compareTo(o2.getVersion());
+ return 0;
+ }
+ };
+ }
+ @Before
+ public void setUpBeforeTest() throws Exception {
+ final JedisPool mockJedisPool = new MockJedisPool(new JedisPoolConfig(), "localhost");
+ PowerMockito.mockStatic(JedisUtil.class);
+ JedisUtil jedisUtil=PowerMockito.mock(JedisUtil.class);
+ when(jedisUtil.borrowJedisInstance()).thenReturn(mockJedisPool.getResource());
+
+ PowerMockito.replace(PowerMockito.method(RedisAccessWrapper.class, "filterKeys")).with(new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ return mockJedisPool.getResource().keys((String) args[0]);
+ }
+ });
+ }
+
+ @Test
+ public void testExistsMicroServiceInstance_notExist(){
+ try {
+ assertFalse(microServiceFullService.existsMicroServiceInstance("notExist", "v1"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+ @Test
+ public void testExistsMicroServiceInstance_Exist(){
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+ microServiceFullInfo.setServiceName("testService");
+ microServiceFullInfo.setVersion("v1");
+ microServiceFullInfo.setStatus("1");
+ microServiceFullInfo.setUrl("/testService/v1");
+ microServiceFullInfo.setVisualRange("0");
+ microServiceFullInfo.setProtocol("http");
+ microServiceFullInfo.setEnable_ssl(false);
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.88","8080"));
+ microServiceFullInfo.setNodes(nodeSet);
+ try {
+ assertFalse(microServiceFullService.existsMicroServiceInstance("testService", "v1"));
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo);
+ assertTrue(microServiceFullService.existsMicroServiceInstance("testService", "v1"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+
+ @Test
+ public void testSaveMicroServiceInfo2Redis(){
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+ microServiceFullInfo.setServiceName("testService");
+ microServiceFullInfo.setVersion("v1");
+ microServiceFullInfo.setStatus("1");
+ microServiceFullInfo.setUrl("/testService/v1");
+ microServiceFullInfo.setVisualRange("0");
+ microServiceFullInfo.setProtocol("http");
+ microServiceFullInfo.setEnable_ssl(false);
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.88","8080"));
+ microServiceFullInfo.setNodes(nodeSet);
+ try {
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo);
+ MicroServiceFullInfo actual = microServiceFullService.getMicroServiceInstance("testService", "v1");
+ assertEquals(microServiceFullInfo, actual);
+ } catch (Exception e) {
+ e.printStackTrace();
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testDeleteMicroService(){
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+ microServiceFullInfo.setServiceName("testService");
+ microServiceFullInfo.setVersion("v1");
+ microServiceFullInfo.setStatus("1");
+ microServiceFullInfo.setUrl("/testService/v1");
+ microServiceFullInfo.setVisualRange("0");
+ microServiceFullInfo.setProtocol("http");
+ microServiceFullInfo.setEnable_ssl(false);
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.88","8080"));
+ microServiceFullInfo.setNodes(nodeSet);
+ try {
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo);
+ assertTrue(microServiceFullService.existsMicroServiceInstance("testService", "v1"));
+ microServiceFullService.deleteMicroService("testService","v1");
+ assertFalse(microServiceFullService.existsMicroServiceInstance("testService", "v1"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+
+ @Test
+ public void testUpdateMicroServiceStatus(){
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+ microServiceFullInfo.setServiceName("testService");
+ microServiceFullInfo.setVersion("v1");
+ microServiceFullInfo.setStatus("1");
+ microServiceFullInfo.setUrl("/testService/v1");
+ microServiceFullInfo.setVisualRange("0");
+ microServiceFullInfo.setProtocol("http");
+ microServiceFullInfo.setEnable_ssl(false);
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.88","8080"));
+ microServiceFullInfo.setNodes(nodeSet);
+ try {
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo);
+ assertEquals("1", microServiceFullService.getMicroServiceInstance("testService","v1").getStatus());
+ microServiceFullService.updateMicroServiceStatus("testService", "v1", "0");
+ assertEquals("0", microServiceFullService.getMicroServiceInstance("testService", "v1").getStatus());
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void testGetAllMicroServiceKey(){
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+ microServiceFullInfo.setServiceName("testService");
+ microServiceFullInfo.setVersion("v1");
+ microServiceFullInfo.setStatus("1");
+ microServiceFullInfo.setUrl("/testService/v1");
+ microServiceFullInfo.setVisualRange("0");
+ microServiceFullInfo.setProtocol("http");
+ microServiceFullInfo.setEnable_ssl(false);
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.88","8080"));
+ microServiceFullInfo.setNodes(nodeSet);
+
+ MicroServiceFullInfo microServiceFullInfo2 = new MicroServiceFullInfo();
+ microServiceFullInfo2.setServiceName("testService2");
+ microServiceFullInfo2.setVersion("");
+ microServiceFullInfo2.setStatus("1");
+ microServiceFullInfo2.setUrl("/testService2");
+ microServiceFullInfo2.setVisualRange("0");
+ microServiceFullInfo2.setProtocol("http");
+ microServiceFullInfo2.setEnable_ssl(false);
+ Set<Node> nodeSet2 = new HashSet<>();
+ nodeSet2.add(new Node("10.74.148.88","8081"));
+ microServiceFullInfo2.setNodes(nodeSet2);
+
+ MicroServiceFullInfo microServiceFullInfo3 = new MicroServiceFullInfo();
+ microServiceFullInfo3.setServiceName("testService");
+ microServiceFullInfo3.setVersion("v2");
+ microServiceFullInfo3.setStatus("1");
+ microServiceFullInfo3.setUrl("/testService/v2");
+ microServiceFullInfo3.setVisualRange("0");
+ microServiceFullInfo3.setProtocol("http");
+ microServiceFullInfo3.setEnable_ssl(false);
+ Set<Node> nodeSet3 = new HashSet<>();
+ nodeSet3.add(new Node("10.74.148.89","8080"));
+ microServiceFullInfo3.setNodes(nodeSet3);
+
+ try {
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo);
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo2);
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo3);
+
+ Set<String> result = microServiceFullService.getAllMicroServiceKey();
+ final Set<String> expected =new HashSet<String>();
+ expected.add("testService");
+ expected.add("testService2");
+
+ assertEquals(expected, result);
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+
+ }
+
+ @Test
+ public void testGetAllVersionsOfTheService(){
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+ microServiceFullInfo.setServiceName("testService");
+ microServiceFullInfo.setVersion("v1");
+ microServiceFullInfo.setStatus("1");
+ microServiceFullInfo.setUrl("/testService/v1");
+ microServiceFullInfo.setVisualRange("0");
+ microServiceFullInfo.setProtocol("http");
+ microServiceFullInfo.setEnable_ssl(false);
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.88","8080"));
+ microServiceFullInfo.setNodes(nodeSet);
+
+ MicroServiceFullInfo microServiceFullInfo2 = new MicroServiceFullInfo();
+ microServiceFullInfo2.setServiceName("testService2");
+ microServiceFullInfo2.setVersion("");
+ microServiceFullInfo2.setStatus("1");
+ microServiceFullInfo2.setUrl("/testService2");
+ microServiceFullInfo2.setVisualRange("0");
+ microServiceFullInfo2.setProtocol("http");
+ microServiceFullInfo2.setEnable_ssl(false);
+ Set<Node> nodeSet2 = new HashSet<>();
+ nodeSet2.add(new Node("10.74.148.88","8081"));
+ microServiceFullInfo2.setNodes(nodeSet2);
+
+ MicroServiceFullInfo microServiceFullInfo3 = new MicroServiceFullInfo();
+ microServiceFullInfo3.setServiceName("testService");
+ microServiceFullInfo3.setVersion("v2");
+ microServiceFullInfo3.setStatus("1");
+ microServiceFullInfo3.setUrl("/testService/v2");
+ microServiceFullInfo3.setVisualRange("0");
+ microServiceFullInfo3.setProtocol("http");
+ microServiceFullInfo3.setEnable_ssl(false);
+ Set<Node> nodeSet3 = new HashSet<>();
+ nodeSet3.add(new Node("10.74.148.89","8080"));
+ microServiceFullInfo3.setNodes(nodeSet3);
+
+ try {
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo);
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo3);
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo2);
+
+
+ List<MicroServiceFullInfo> result = microServiceFullService.getAllVersionsOfTheService("testService");
+
+ List<MicroServiceFullInfo> expected = new ArrayList<>();
+ expected.add(microServiceFullInfo);
+ expected.add(microServiceFullInfo3);
+
+ Collections.sort(expected,serviceComparator);
+ Collections.sort(result,serviceComparator);
+ assertEquals(expected, result);
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+
+ }
+
+ @Test
+ public void testGetAllMicroServicesInstances(){
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+ microServiceFullInfo.setServiceName("testService");
+ microServiceFullInfo.setVersion("v1");
+ microServiceFullInfo.setStatus("1");
+ microServiceFullInfo.setUrl("/testService/v1");
+ microServiceFullInfo.setVisualRange("0");
+ microServiceFullInfo.setProtocol("http");
+ microServiceFullInfo.setEnable_ssl(false);
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.88","8080"));
+ microServiceFullInfo.setNodes(nodeSet);
+
+ MicroServiceFullInfo microServiceFullInfo2 = new MicroServiceFullInfo();
+ microServiceFullInfo2.setServiceName("testService2");
+ microServiceFullInfo2.setVersion("");
+ microServiceFullInfo2.setStatus("1");
+ microServiceFullInfo2.setUrl("/testService/v1");
+ microServiceFullInfo2.setVisualRange("0");
+ microServiceFullInfo2.setProtocol("http");
+ microServiceFullInfo2.setEnable_ssl(true);
+ Set<Node> nodeSet2 = new HashSet<>();
+ nodeSet2.add(new Node("10.74.148.89","8080"));
+ microServiceFullInfo2.setNodes(nodeSet2);
+
+ try {
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo);
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo2);
+
+ List<MicroServiceFullInfo> expected = new ArrayList<MicroServiceFullInfo>();
+ expected.add(microServiceFullInfo);
+ expected.add(microServiceFullInfo2);
+ List<MicroServiceFullInfo> result = microServiceFullService.getAllMicroServiceInstances();
+ Collections.sort(expected, serviceComparator);
+ Collections.sort(result,serviceComparator );
+ assertEquals(expected, result);
+ } catch (Exception e) {
+ e.printStackTrace();
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+
+ @Test
+ public void testDeleteMultiMicroService(){
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+ microServiceFullInfo.setServiceName("testService");
+ microServiceFullInfo.setVersion("v1");
+ microServiceFullInfo.setStatus("1");
+ microServiceFullInfo.setUrl("/testService/v1");
+ microServiceFullInfo.setVisualRange("0");
+ microServiceFullInfo.setProtocol("http");
+ microServiceFullInfo.setEnable_ssl(false);
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.88","8080"));
+ microServiceFullInfo.setNodes(nodeSet);
+
+
+ MicroServiceFullInfo microServiceFullInfo3 = new MicroServiceFullInfo();
+ microServiceFullInfo3.setServiceName("testService");
+ microServiceFullInfo3.setVersion("v2");
+ microServiceFullInfo3.setStatus("1");
+ microServiceFullInfo3.setUrl("/testService/v2");
+ microServiceFullInfo3.setVisualRange("0");
+ microServiceFullInfo3.setProtocol("http");
+ microServiceFullInfo3.setEnable_ssl(false);
+ Set<Node> nodeSet3 = new HashSet<>();
+ nodeSet3.add(new Node("10.74.148.89","8080"));
+ microServiceFullInfo3.setNodes(nodeSet3);
+
+ try {
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo);
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo3);
+ //two versions of testservice exist
+ assertEquals(2,microServiceFullService.getAllVersionsOfTheService("testService").size());
+ //delete all versions of testservice
+ long size = microServiceFullService.deleteMultiMicroService(MicroServiceUtil.getPrefixedKey("testService","*"));
+ //after delete,no version exist
+ assertEquals(0,microServiceFullService.getAllVersionsOfTheService("testService").size());
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test
+ public void tesGetMicroServiceInstance_notExist(){
+ try {
+ assertNull(microServiceFullService.getMicroServiceInstance("notExist","v1"));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+
+ }
+ @Test
+ public void tesExistsGetUpdateDeleteMicroServiceStatus_versionNull(){
+ MicroServiceFullInfo microServiceFullInfo = new MicroServiceFullInfo();
+ microServiceFullInfo.setServiceName("testService");
+ microServiceFullInfo.setVersion("");
+ microServiceFullInfo.setStatus("1");
+ microServiceFullInfo.setUrl("/testService/v1");
+ microServiceFullInfo.setVisualRange("0");
+ microServiceFullInfo.setProtocol("http");
+ microServiceFullInfo.setEnable_ssl(false);
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.88","8080"));
+ microServiceFullInfo.setNodes(nodeSet);
+ try {
+ //test null
+ assertFalse(microServiceFullService.existsMicroServiceInstance("testService", "null"));
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo);
+ assertEquals("1", microServiceFullService.getMicroServiceInstance("testService","null").getStatus());
+ microServiceFullService.updateMicroServiceStatus("testService", "null", "0");
+ assertEquals("0", microServiceFullService.getMicroServiceInstance("testService", "null").getStatus());
+ microServiceFullService.deleteMicroService("testService","null");
+ assertFalse(microServiceFullService.existsMicroServiceInstance("testService", "null"));
+
+
+ //test String "null"
+ assertFalse(microServiceFullService.existsMicroServiceInstance("testService", null));
+ microServiceFullService.saveMicroServiceInfo2Redis(microServiceFullInfo);
+ assertEquals("1", microServiceFullService.getMicroServiceInstance("testService",null).getStatus());
+ microServiceFullService.updateMicroServiceStatus("testService", null, "0");
+ assertEquals("0", microServiceFullService.getMicroServiceInstance("testService", null).getStatus());
+ microServiceFullService.deleteMicroService("testService",null);
+ assertFalse(microServiceFullService.existsMicroServiceInstance("testService", null));
+ } catch (Exception e) {
+ assert false:"throw exception means error occured!"+e.getMessage();
+ }
+ }
+
+ @Test(expected = Exception.class)
+ public void tesSaveMicroService_null() throws Exception {
+ microServiceFullService.saveMicroServiceInfo2Redis(null);
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/serviceListener/MicroServiceChangeListenerTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/serviceListener/MicroServiceChangeListenerTest.java
new file mode 100644
index 0000000..f537e0e
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/serviceListener/MicroServiceChangeListenerTest.java
@@ -0,0 +1,666 @@
+package org.onap.msb.apiroute.wrapper.serviceListener;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.ApiRouteAppConfig;
+import org.onap.msb.apiroute.api.ApiRouteInfo;
+import org.onap.msb.apiroute.api.CustomRouteInfo;
+import org.onap.msb.apiroute.api.DiscoverInfo;
+import org.onap.msb.apiroute.api.IuiRouteInfo;
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.api.Node;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
+import org.onap.msb.apiroute.wrapper.ApiRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.CustomRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.InitRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.IuiRouteServiceWrapper;
+import org.onap.msb.apiroute.wrapper.dao.RedisAccessWrapper;
+import org.onap.msb.apiroute.wrapper.serviceListener.RouteNotify;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.onap.msb.apiroute.wrapper.util.HttpClientUtil;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.onap.msb.apiroute.wrapper.util.RouteUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import com.fiftyonred.mock_jedis.MockJedisPool;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({JedisUtil.class,ConfigUtil.class,HttpClientUtil.class, RedisAccessWrapper.class,})
+@PowerMockIgnore({"javax.management.*"})
+public class MicroServiceChangeListenerTest {
+ private static RouteNotify routeInstance;
+ private static ApiRouteServiceWrapper apiRouteServiceWrapper;
+ private static IuiRouteServiceWrapper iuiRouteServiceWrapper;
+ private static CustomRouteServiceWrapper customRouteServiceWrapper;
+
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ InitRouteServiceWrapper.getInstance().registerServiceChangeListener();
+ routeInstance=RouteNotify.getInstance();
+ apiRouteServiceWrapper=ApiRouteServiceWrapper.getInstance();
+ iuiRouteServiceWrapper=IuiRouteServiceWrapper.getInstance();
+ customRouteServiceWrapper=CustomRouteServiceWrapper.getInstance();
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("ROUTE_WAY")).thenReturn("ip|domain");
+ ConfigUtil.getInstance().initRouteWay();
+ }
+
+ @Before
+ public void initReidsMock() throws Exception {
+ final JedisPool mockJedisPool = new MockJedisPool(new JedisPoolConfig(), "localhost");
+ PowerMockito.mockStatic(JedisUtil.class);
+ JedisUtil jedisUtil=PowerMockito.mock(JedisUtil.class);
+ PowerMockito.when(jedisUtil.borrowJedisInstance()).thenReturn(mockJedisPool.getResource());
+
+ PowerMockito.replace(PowerMockito.method(RedisAccessWrapper.class, "filterKeys")).with(new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ return mockJedisPool.getResource().keys((String) args[0]);
+ }
+ });
+ }
+
+ @Test
+ public void test_noticeRouteListener4Update_api(){
+ try {
+ routeInstance.noticeRouteListener4Update("apiTest-ns", "v1", buildMicroServiceFullInfo4API());
+ ApiRouteInfo apiRouteInfo=apiRouteServiceWrapper.getApiRouteInstance("apiTest-ns", "v1", "host", "20081", "ip");
+
+ Assert.assertNotNull(apiRouteInfo);
+ Assert.assertEquals("1", apiRouteInfo.getStatus());
+
+ routeInstance.noticeUpdateStatusListener(buildMicroServiceFullInfo4API(),"0");
+ apiRouteInfo=apiRouteServiceWrapper.getApiRouteInstance("apiTest-ns", "v1", "host", "20081", "ip");
+ Assert.assertEquals("0", apiRouteInfo.getStatus());
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+ }
+
+ @Test
+ public void test_noticeRouteListener4Update_iui(){
+ try {
+ routeInstance.noticeRouteListener4Update("iuiTest-ns", "v1", buildMicroServiceFullInfo4IUI());
+ IuiRouteInfo iuiRouteInfo=iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest-ns", "host", "20081", "ip");
+
+ Assert.assertNotNull(iuiRouteInfo);
+ Assert.assertEquals("1", iuiRouteInfo.getStatus());
+
+ routeInstance.noticeUpdateStatusListener(buildMicroServiceFullInfo4IUI(),"0");
+ iuiRouteInfo=iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest-ns", "host", "20081", "ip");
+ Assert.assertEquals("0", iuiRouteInfo.getStatus());
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+ }
+
+ @Test
+ public void test_noticeRouteListener4Update_http(){
+ try {
+ routeInstance.noticeRouteListener4Update("httpTest-ns", "v1", buildMicroServiceFullInfo4HTTP());
+ CustomRouteInfo customRouteInfo=customRouteServiceWrapper.getCustomRouteInstance("/httpTest-ns", "host", "20081", "ip");
+ Assert.assertNotNull(customRouteInfo);
+ Assert.assertEquals("1", customRouteInfo.getStatus());
+
+ routeInstance.noticeUpdateStatusListener(buildMicroServiceFullInfo4HTTP(),"0");
+ customRouteInfo=customRouteServiceWrapper.getCustomRouteInstance("/httpTest-ns", "host", "20081", "ip");
+ Assert.assertEquals("0", customRouteInfo.getStatus());
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+ }
+
+ @Test
+ public void test_noticeRouteListener4Add_del_api(){
+ try {
+ MicroServiceFullInfo microServiceInfo =buildMicroServiceFullInfo4API();
+ routeInstance.noticeRouteListener4Add(microServiceInfo);
+ Assert.assertNotNull(apiRouteServiceWrapper.getApiRouteInstance("apiTest", "v1", "", "20081", "ip"));
+ Assert.assertNotNull(customRouteServiceWrapper.getCustomRouteInstance("/", "apitest-ns", "", "domain"));
+
+ routeInstance.noticeRouteListener4Delete(microServiceInfo);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ try {
+ apiRouteServiceWrapper.getApiRouteInstance("apiTest", "v1", "", "20081", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ apiRouteServiceWrapper.getApiRouteInstance("apiTest", "v1", "apitest-ns", "", "domain");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+
+ }
+
+ @Test
+ public void test_noticeRouteListener4Add_del_api_path(){
+ try {
+ MicroServiceFullInfo microServiceInfo =buildMicroServiceFullInfo4API_path();
+ routeInstance.noticeRouteListener4Add(microServiceInfo);
+ Assert.assertNotNull(apiRouteServiceWrapper.getApiRouteInstance("apiTest4Path", "v1", "", "10081", "ip"));
+ Assert.assertNotNull(apiRouteServiceWrapper.getApiRouteInstance("apiTest4Path", "v1", "", "10082", "ip"));
+ Assert.assertNotNull(apiRouteServiceWrapper.getApiRouteInstance("apiTest4Path", "v1", "host", "", "domain"));
+
+ routeInstance.noticeRouteListener4Delete(microServiceInfo);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ try {
+ apiRouteServiceWrapper.getApiRouteInstance("apiTest4Path", "v1", "", "10081", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ apiRouteServiceWrapper.getApiRouteInstance("apiTest4Path", "v1", "", "10082", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ apiRouteServiceWrapper.getApiRouteInstance("apiTest4Path", "v1", "host", "", "domain");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ }
+
+ @Test
+ public void test_noticeRouteListener4Add_del_api_mutiPort(){
+ try {
+ MicroServiceFullInfo microServiceInfo =buildMicroServiceFullInfo4API_path();
+ microServiceInfo.setPath("");
+ microServiceInfo.setHost("");
+
+ routeInstance.noticeRouteListener4Add(microServiceInfo);
+ Assert.assertNotNull(apiRouteServiceWrapper.getApiRouteInstance("apiTest", "v1", "", "10081", "ip"));
+ Assert.assertNotNull(apiRouteServiceWrapper.getApiRouteInstance("apiTest", "v1", "", "10082", "ip"));
+ Assert.assertNotNull(customRouteServiceWrapper.getCustomRouteInstance("/", "apitest", "", "domain"));
+
+ routeInstance.noticeRouteListener4Delete(microServiceInfo);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ try {
+ apiRouteServiceWrapper.getApiRouteInstance("apiTest", "v1", "", "10081", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ apiRouteServiceWrapper.getApiRouteInstance("apiTest", "v1", "", "10082", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ apiRouteServiceWrapper.getApiRouteInstance("apiTest", "v1", "apitest", "", "domain");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ }
+
+ @Test
+ public void test_noticeRouteListener4Add_del_iui(){
+ try {
+ MicroServiceFullInfo microServiceInfo =buildMicroServiceFullInfo4IUI();
+ routeInstance.noticeRouteListener4Add(microServiceInfo);
+ Assert.assertNotNull(iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest", "", "20081", "ip"));
+ Assert.assertNotNull(customRouteServiceWrapper.getCustomRouteInstance("/", "iuitest-ns", "", "domain"));
+
+ routeInstance.noticeRouteListener4Delete(microServiceInfo);
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ try {
+ iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest", "", "20081", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest", "iuitest-ns", "", "domain");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ }
+
+ @Test
+ public void test_noticeRouteListener4Add_del_iui_path(){
+ try {
+ MicroServiceFullInfo microServiceInfo =buildMicroServiceFullInfo4IUI_path();
+ routeInstance.noticeRouteListener4Add(microServiceInfo);
+ Assert.assertNotNull(iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest4Path", "", "10081", "ip"));
+ Assert.assertNotNull(iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest4Path", "", "10082", "ip"));
+ Assert.assertNotNull(iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest4Path", "host", "", "domain"));
+
+ routeInstance.noticeRouteListener4Delete(microServiceInfo);
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ try {
+ iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest4Path", "", "10081", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest4Path", "", "10082", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest4Path", "host", "", "domain");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ }
+
+
+ @Test
+ public void test_noticeRouteListener4Add_del_iui_mutiPort(){
+ try {
+ MicroServiceFullInfo microServiceInfo =buildMicroServiceFullInfo4IUI_path();
+ microServiceInfo.setPath("");
+ microServiceInfo.setHost("");
+
+ routeInstance.noticeRouteListener4Add(microServiceInfo);
+ Assert.assertNotNull(iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest", "", "10081", "ip"));
+ Assert.assertNotNull(iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest", "", "10082", "ip"));
+ Assert.assertNotNull(customRouteServiceWrapper.getCustomRouteInstance("/", "iuitest", "", "domain"));
+
+ routeInstance.noticeRouteListener4Delete(microServiceInfo);
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ try {
+ iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest", "", "10081", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ iuiRouteServiceWrapper.getIuiRouteInstance("iuiTest", "", "10082", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ customRouteServiceWrapper.getCustomRouteInstance("/", "iuitest", "", "domain");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ }
+
+ @Test
+ public void test_noticeRouteListener4Add_del_http(){
+ try {
+ MicroServiceFullInfo microServiceInfo=buildMicroServiceFullInfo4HTTP();
+ routeInstance.noticeRouteListener4Add(microServiceInfo);
+ Assert.assertNotNull(customRouteServiceWrapper.getCustomRouteInstance("/httpTest/v1", "", "20081", "ip"));
+ Assert.assertNotNull(customRouteServiceWrapper.getCustomRouteInstance("/httpTest/v1", "httptest-ns", "", "domain"));
+
+ routeInstance.noticeRouteListener4Delete(microServiceInfo);
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ try {
+ customRouteServiceWrapper.getCustomRouteInstance("/httpTest/v1", "", "20081", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ customRouteServiceWrapper.getCustomRouteInstance("/httpTest", "httptest-ns", "", "domain");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ }
+
+ @Test
+ public void test_noticeRouteListener4Add_del_http_path(){
+ try {
+ MicroServiceFullInfo microServiceInfo=buildMicroServiceFullInfo4HTTP_path();
+ routeInstance.noticeRouteListener4Add(microServiceInfo);
+ Assert.assertNotNull(customRouteServiceWrapper.getCustomRouteInstance("/httpTest4Path", "", "10081", "ip"));
+ Assert.assertNotNull(customRouteServiceWrapper.getCustomRouteInstance("/httpTest4Path", "", "10082", "ip"));
+ Assert.assertNotNull(customRouteServiceWrapper.getCustomRouteInstance("/httpTest4Path", "host", "", "domain"));
+
+ routeInstance.noticeRouteListener4Delete(microServiceInfo);
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ try {
+ customRouteServiceWrapper.getCustomRouteInstance("/httpTest4Path", "", "10081", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ customRouteServiceWrapper.getCustomRouteInstance("/httpTest4Path", "", "10082", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ customRouteServiceWrapper.getCustomRouteInstance("/httpTest4Path", "host", "", "domain");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ }
+
+
+ @Test
+ public void test_noticeRouteListener4Add_del_http_mutiPort(){
+ try {
+ MicroServiceFullInfo microServiceInfo=buildMicroServiceFullInfo4HTTP_path();
+ microServiceInfo.setPath("");
+ microServiceInfo.setHost("");
+
+ routeInstance.noticeRouteListener4Add(microServiceInfo);
+ Assert.assertNotNull(customRouteServiceWrapper.getCustomRouteInstance("/httpTest/v1", "", "10081", "ip"));
+ Assert.assertNotNull(customRouteServiceWrapper.getCustomRouteInstance("/httpTest/v1", "", "10082", "ip"));
+ Assert.assertNotNull(customRouteServiceWrapper.getCustomRouteInstance("/httpTest/v1", "httptest", "", "domain"));
+
+ routeInstance.noticeRouteListener4Delete(microServiceInfo);
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ try {
+ customRouteServiceWrapper.getCustomRouteInstance("/httpTest/v1", "", "10081", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ customRouteServiceWrapper.getCustomRouteInstance("/httpTest/v1", "", "10082", "ip");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ try {
+ customRouteServiceWrapper.getCustomRouteInstance("/httpTest", "httptest", "", "domain");
+ Assert.fail("should not process to here.");
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof ExtendedNotFoundException);
+ }
+
+ }
+
+
+ @Test
+ public void test_noticeRouteListener4Add_portal(){
+ try {
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("SDCLIENT_IP")).thenReturn("127.0.0.1");
+ ApiRouteAppConfig configuration=new ApiRouteAppConfig();
+
+ DiscoverInfo discoverInfo=new DiscoverInfo();
+ discoverInfo.setEnabled(true);
+ discoverInfo.setIp("127.0.0.2");
+ discoverInfo.setPort(10081);
+ configuration.setDiscoverInfo(discoverInfo);
+ ConfigUtil.getInstance().initDiscoverInfo(configuration);
+
+
+ PowerMockito.mockStatic(HttpClientUtil.class);
+ String publishUrl="http://127.0.0.1:10081/api/microservices/v1/services/portalTest/version/v1/allpublishaddress?namespace=&visualRange=0";
+ String resultJson ="[{\"domain\":\"opapi.openpalette.zte.com.cn\",\"port\":\"443\",\"publish_url\":\"/api\",\"visualRange\":\"0\",\"publish_protocol\":\"https\"},{\"ip\":\"10.74.165.246\",\"port\":\"443\",\"publish_url\":\"/opapi\",\"visualRange\":\"0\",\"publish_protocol\":\"https\"},{\"ip\":\"10.74.165.246\",\"port\":\"80\",\"publish_url\":\"/opapi\",\"visualRange\":\"0\",\"publish_protocol\":\"http\"}]";
+ PowerMockito.when(HttpClientUtil.httpGet(publishUrl)).thenReturn(resultJson);
+
+ MicroServiceFullInfo microServiceInfo=buildMicroServiceFullInfo4PORTAL();
+
+ routeInstance.noticeRouteListener4Add(microServiceInfo);
+
+ CustomRouteInfo routeInfo_ip=customRouteServiceWrapper.getCustomRouteInstance("/portalTest/v1", "", "10088", "ip");
+ RouteServer[] servers_ip = new RouteServer[]{new RouteServer("10.74.148.99","8080")};
+ Assert.assertArrayEquals(servers_ip, routeInfo_ip.getServers());
+
+ CustomRouteInfo routeInfo_domain=customRouteServiceWrapper.getCustomRouteInstance("/portalTest/v1", "host", "", "domain");
+ RouteServer[] servers_domain = new RouteServer[]{new RouteServer("10.74.165.246","443")};
+
+ Assert.assertArrayEquals(servers_domain, routeInfo_domain.getServers());
+
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+ }
+
+ }
+
+
+ private MicroServiceFullInfo buildMicroServiceFullInfo4API(){
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+ microServiceInfo.setServiceName("apiTest-ns");
+ microServiceInfo.setVersion("v1");
+ microServiceInfo.setEnable_ssl(false);
+ microServiceInfo.setPublish_port("20081");
+ microServiceInfo.setProtocol("REST");
+ microServiceInfo.setUrl("/api/apiTest/v1");
+ microServiceInfo.setVisualRange("1");
+ microServiceInfo.setStatus("1");
+ microServiceInfo.setNamespace("ns");
+ Set<Node> nodes = new HashSet<Node>();
+ nodes.add(new Node("10.74.148.88","8080"));
+ nodes.add(new Node("10.74.148.89","8080"));
+ microServiceInfo.setNodes(nodes);
+
+ return microServiceInfo;
+ }
+
+ private MicroServiceFullInfo buildMicroServiceFullInfo4API_path(){
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+ microServiceInfo.setServiceName("apiTest");
+ microServiceInfo.setVersion("v1");
+ microServiceInfo.setEnable_ssl(true);
+ microServiceInfo.setHost("host");
+ microServiceInfo.setPath("/api/apiTest4Path/v1");
+ microServiceInfo.setPublish_port("10081|10082");
+ microServiceInfo.setProtocol("REST");
+ microServiceInfo.setUrl("/api/apiTest/v1");
+ microServiceInfo.setVisualRange("0");
+ microServiceInfo.setLb_policy("ip_hash");
+ microServiceInfo.setStatus("1");
+ Set<Node> nodes = new HashSet<Node>();
+ nodes.add(new Node("10.74.148.88","8080"));
+ nodes.add(new Node("10.74.148.89","8080"));
+ microServiceInfo.setNodes(nodes);
+
+ return microServiceInfo;
+ }
+
+
+ private MicroServiceFullInfo buildMicroServiceFullInfo4PORTAL(){
+
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+ microServiceInfo.setServiceName("portalTest");
+ microServiceInfo.setVersion("v1");
+ microServiceInfo.setEnable_ssl(true);
+ microServiceInfo.setHost("host");
+ microServiceInfo.setPublish_port("10088");
+ microServiceInfo.setProtocol("HTTP");
+ microServiceInfo.setUrl("/portalTestUrl/v1");
+ microServiceInfo.setVisualRange("0");
+ microServiceInfo.setLb_policy("ip_hash");
+ microServiceInfo.setStatus("1");
+ microServiceInfo.setCustom(RouteUtil.CUSTOM_PORTAL);
+ Set<Node> nodes = new HashSet<Node>();
+ nodes.add(new Node("10.74.148.99","8080"));
+ microServiceInfo.setNodes(nodes);
+
+ return microServiceInfo;
+ }
+
+ private MicroServiceFullInfo buildMicroServiceFullInfo4IUI(){
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+ microServiceInfo.setServiceName("iuiTest-ns");
+ microServiceInfo.setNamespace("ns");
+ microServiceInfo.setVersion("v1");
+ microServiceInfo.setEnable_ssl(false);
+ microServiceInfo.setPublish_port("20081");
+ microServiceInfo.setProtocol("UI");
+ microServiceInfo.setUrl("/iui/iuiTest");
+ microServiceInfo.setVisualRange("1");
+ microServiceInfo.setStatus("1");
+ Set<Node> nodes = new HashSet<Node>();
+ nodes.add(new Node("10.74.148.88","8080"));
+ nodes.add(new Node("10.74.148.89","8080"));
+ microServiceInfo.setNodes(nodes);
+
+ return microServiceInfo;
+ }
+
+ private MicroServiceFullInfo buildMicroServiceFullInfo4IUI_path(){
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+ microServiceInfo.setServiceName("iuiTest");
+ microServiceInfo.setVersion("v1");
+ microServiceInfo.setEnable_ssl(true);
+ microServiceInfo.setHost("host");
+ microServiceInfo.setProtocol("UI");
+ microServiceInfo.setUrl("/iui/iuiTest");
+ microServiceInfo.setLb_policy("ip_hash");
+ microServiceInfo.setPublish_port("10081|10082");
+ microServiceInfo.setPath("/iui/iuiTest4Path");
+ microServiceInfo.setVisualRange("0");
+ microServiceInfo.setStatus("1");
+ Set<Node> nodes = new HashSet<Node>();
+ nodes.add(new Node("10.74.148.88","8080"));
+ nodes.add(new Node("10.74.148.89","8080"));
+ microServiceInfo.setNodes(nodes);
+
+ return microServiceInfo;
+ }
+
+ private MicroServiceFullInfo buildMicroServiceFullInfo4HTTP(){
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+ microServiceInfo.setServiceName("httpTest-ns");
+ microServiceInfo.setNamespace("ns");
+ microServiceInfo.setVersion("v1");
+ microServiceInfo.setEnable_ssl(false);
+ microServiceInfo.setPublish_port("20081");
+ microServiceInfo.setProtocol("HTTP");
+ microServiceInfo.setUrl("/httpTest");
+ microServiceInfo.setVisualRange("1");
+ microServiceInfo.setStatus("1");
+ Set<Node> nodes = new HashSet<Node>();
+ nodes.add(new Node("10.74.148.88","8080"));
+ nodes.add(new Node("10.74.148.89","8080"));
+ microServiceInfo.setNodes(nodes);
+
+ return microServiceInfo;
+ }
+
+ private MicroServiceFullInfo buildMicroServiceFullInfo4HTTP_path(){
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+ microServiceInfo.setServiceName("httpTest");
+ microServiceInfo.setVersion("v1");
+ microServiceInfo.setEnable_ssl(true);
+ microServiceInfo.setHost("host");
+ microServiceInfo.setPublish_port("20081");
+ microServiceInfo.setProtocol("HTTP");
+ microServiceInfo.setUrl("/httpTest");
+ microServiceInfo.setVisualRange("0");
+ microServiceInfo.setStatus("1");
+ microServiceInfo.setLb_policy("ip_hash");
+ microServiceInfo.setPublish_port("10081|10082");
+ microServiceInfo.setPath("/httpTest4Path");
+ Set<Node> nodes = new HashSet<Node>();
+ nodes.add(new Node("10.74.148.88","8080"));
+ nodes.add(new Node("10.74.148.89","8080"));
+ microServiceInfo.setNodes(nodes);
+
+ return microServiceInfo;
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/CommonUtilTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/CommonUtilTest.java
new file mode 100644
index 0000000..825868c
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/CommonUtilTest.java
@@ -0,0 +1,61 @@
+package org.onap.msb.apiroute.wrapper.util;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.util.CommonUtil;
+
+public class CommonUtilTest {
+
+
+
+ @Test
+ public void test_concat() {
+ Object[] str1 = new String[] {"test1", "test2"};
+ Object[] str2 = new String[] {"test3"};
+ Object[] str3 = CommonUtil.concat(str1, str2);
+
+ Assert.assertEquals(3, str3.length);
+ }
+
+ @Test
+ public void test_containStr() {
+ String value = "1";
+ String array[] = {"1", "2"};
+ Assert.assertTrue(CommonUtil.contain(array, value));
+ Assert.assertFalse(CommonUtil.contain(array, "3"));
+ }
+
+ @Test
+ public void test_containArray() {
+ String value[] = {"0"};
+ String array[] = {"1", "2"};
+ String array2[] = {"2", "1"};
+ Assert.assertFalse(CommonUtil.contain(array, value));
+ Assert.assertTrue(CommonUtil.contain(array, array2));
+ }
+
+ @Test
+ public void test_containStrArray() {
+ Assert.assertFalse(CommonUtil.contain("0,1,2", "3"));
+ Assert.assertTrue(CommonUtil.contain("0,1,2", "1"));
+ }
+
+ @Test
+ public void test_getDiffrent() {
+ Set<String> list1 = new HashSet<String>();
+ list1.add("test1");
+ list1.add("test2");
+
+ Set<String> list2 = new HashSet<String>();
+ list2.add("test2");
+ list2.add("test3");
+
+ Set<String> diff = CommonUtil.getDiffrent(list1, list2);
+ Assert.assertEquals(1, diff.size());
+ Assert.assertTrue(diff.contains("test3"));
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/ConfigUtilTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/ConfigUtilTest.java
new file mode 100644
index 0000000..e17c177
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/ConfigUtilTest.java
@@ -0,0 +1,214 @@
+package org.onap.msb.apiroute.wrapper.util;
+
+
+
+import java.lang.reflect.Field;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.ApiRouteAppConfig;
+import org.onap.msb.apiroute.api.DiscoverInfo;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ConfigUtil.class})
+public class ConfigUtilTest {
+
+ @Test
+ public void test_initRootPath() {
+ try {
+ ConfigUtil.getInstance().initRootPath();
+ String iuiRootPath = ConfigUtil.getInstance().getIUI_ROOT_PATH();
+ String apiRootPath = ConfigUtil.getInstance().getAPI_ROOT_PATH();
+ Assert.assertEquals("iui", iuiRootPath);
+ Assert.assertEquals("api", apiRootPath);
+ } catch (Exception e) {
+ Assert.fail("throw exception means error occured!" + e.getMessage());
+
+ }
+
+ }
+
+ @Test
+ public void test_initApiGatewayPort() {
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("APIGATEWAY_EXPOSE_PORT")).thenReturn(null);
+ ConfigUtil.getInstance().initApiGatewayPort();
+ Assert.assertEquals("80", ConfigUtil.getInstance().getServerPort());
+
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("APIGATEWAY_EXPOSE_PORT")).thenReturn("81");
+
+ ConfigUtil.getInstance().initApiGatewayPort();
+ Assert.assertEquals("81", ConfigUtil.getInstance().getServerPort());
+ }
+
+ @Test
+ public void test_initRouteNameSpaceMatches() {
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("APIGATEWAY_EXPOSE_PORT")).thenReturn(null);
+ ConfigUtil.getInstance().initRouteNameSpaceMatches();
+ Assert.assertEquals("all", ConfigUtil.getInstance().getNamespaceMatches());
+
+
+ PowerMockito.when(System.getenv("NAMESPACE")).thenReturn("net");
+
+ ConfigUtil.getInstance().initRouteNameSpaceMatches();
+ Assert.assertEquals("net", ConfigUtil.getInstance().getNamespaceMatches());
+ }
+
+ @Test
+ public void test_initRouteLabelsMatches() {
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("ROUTE_LABELS")).thenReturn(null);
+ ConfigUtil.getInstance().initRouteLabelsMatches();
+ Assert.assertEquals("0", ConfigUtil.getInstance().getVisualRangeMatches());
+ Assert.assertEquals("net", ConfigUtil.getInstance().getNetwork_plane_typeMatches());
+ Assert.assertTrue(ConfigUtil.getInstance().getLabelMapMatches().containsKey("custom-key"));
+
+
+
+
+ PowerMockito.when(System.getenv("ROUTE_LABELS")).thenReturn("visualRange:1,network_plane_type:net,custom:test");
+
+ ConfigUtil.getInstance().initRouteLabelsMatches();
+ Assert.assertEquals("1", ConfigUtil.getInstance().getVisualRangeMatches());
+ Assert.assertEquals("net", ConfigUtil.getInstance().getNetwork_plane_typeMatches());
+ Assert.assertTrue(ConfigUtil.getInstance().getLabelMapMatches().containsKey("custom"));
+
+ }
+
+ @Test
+ public void test_initRouteWay() {
+ PowerMockito.mockStatic(System.class);
+
+ PowerMockito.when(System.getenv("ROUTE_WAY")).thenReturn(null);
+ ConfigUtil.getInstance().initRouteWay();
+ String[] ip_routeWay={"ip"};
+ Assert.assertArrayEquals(ip_routeWay, ConfigUtil.getInstance().getRouteWay());
+
+ PowerMockito.when(System.getenv("ROUTE_WAY")).thenReturn("ip|domain");
+
+ ConfigUtil.getInstance().initRouteWay();
+ String[] routeWay={"ip","domain"};
+ Assert.assertArrayEquals(routeWay, ConfigUtil.getInstance().getRouteWay());
+ }
+
+ @Test
+ public void test_initDiscoverInfo() {
+ PowerMockito.mockStatic(System.class);
+
+
+ ApiRouteAppConfig configuration=new ApiRouteAppConfig();
+
+ DiscoverInfo discoverInfo=new DiscoverInfo();
+ discoverInfo.setEnabled(true);
+ discoverInfo.setIp("127.0.0.1");
+ discoverInfo.setPort(10081);
+
+ configuration.setDiscoverInfo(discoverInfo);
+ PowerMockito.when(System.getenv("SDCLIENT_IP")).thenReturn(null);
+ ConfigUtil.getInstance().initDiscoverInfo(configuration);
+ Assert.assertEquals("127.0.0.1:10081", ConfigUtil.getInstance().getDiscoverInfo().toString());
+
+ PowerMockito.when(System.getenv("SDCLIENT_IP")).thenReturn("10.74.44.86");
+ ConfigUtil.getInstance().initDiscoverInfo(configuration);
+ Assert.assertEquals("10.74.44.86:10081", ConfigUtil.getInstance().getDiscoverInfo().toString());
+ }
+
+ @Test
+ public void test_initNodeMeta() {
+
+ //CONSUL_REGISTER_MODE not catalog
+ ConfigUtil util=ConfigUtil.getInstance();
+ util.initNodeMetaQueryParam();
+ System.out.println(util.getNodeMetaQueryParam());
+ Assert.assertEquals(util.getNodeMetaQueryParam(),"");
+
+ //CONSUL_REGISTER_MODE catalog
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("CONSUL_REGISTER_MODE")).thenReturn("agnet");
+ util.initNodeMetaQueryParam();
+ System.out.println(util.getNodeMetaQueryParam());
+ Assert.assertEquals(util.getNodeMetaQueryParam(),"");
+
+
+ //CONSUL_REGISTER_MODE catalog
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("CONSUL_REGISTER_MODE")).thenReturn("catalog");
+ try {
+ Field visualRangeField=util.getClass().getDeclaredField("visualRangeMatches");
+ visualRangeField.setAccessible(true);
+
+ Field namespaceField = util.getClass().getDeclaredField("namespaceMatches");
+ namespaceField.setAccessible(true);
+
+ //0:default;
+ visualRangeField.set(util, "0");
+ namespaceField.set(util, "default");
+
+ util.initNodeMetaQueryParam();
+ System.out.println(util.getNodeMetaQueryParam());
+ Assert.assertEquals(util.getNodeMetaQueryParam(),"node-meta=external:true&node-meta=ns:default");
+
+ //1:default;
+ visualRangeField.set(util, "1");
+ util.initNodeMetaQueryParam();
+ System.out.println(util.getNodeMetaQueryParam());
+ Assert.assertEquals(util.getNodeMetaQueryParam(),"node-meta=internal:true&node-meta=ns:default");
+
+ //0|1:default
+ visualRangeField.set(util, "0|1");
+ util.initNodeMetaQueryParam();
+ System.out.println(util.getNodeMetaQueryParam());
+ Assert.assertEquals(util.getNodeMetaQueryParam(),"node-meta=ns:default");
+
+ //0|1:all
+ namespaceField.set(util, "all");
+ util.initNodeMetaQueryParam();
+ System.out.println(util.getNodeMetaQueryParam());
+ Assert.assertEquals(util.getNodeMetaQueryParam(),"");
+
+ ///////////////////////////////////////////////////////////////////////////
+ //1:all
+ visualRangeField.set(util, "1");
+ namespaceField.set(util, "all");
+ util.initNodeMetaQueryParam();
+ System.out.println(util.getNodeMetaQueryParam());
+ Assert.assertEquals(util.getNodeMetaQueryParam(),"node-meta=internal:true");
+
+ //1:!
+ namespaceField.set(util, "!default");
+ util.initNodeMetaQueryParam();
+ System.out.println(util.getNodeMetaQueryParam());
+ Assert.assertEquals(util.getNodeMetaQueryParam(),"node-meta=internal:true");
+
+ //1:&
+ namespaceField.set(util, "tenant1&tenant2");
+ util.initNodeMetaQueryParam();
+ System.out.println(util.getNodeMetaQueryParam());
+ Assert.assertEquals(util.getNodeMetaQueryParam(),"node-meta=internal:true");
+
+ //1:|
+ namespaceField.set(util, "tenant1|tenant2");
+ util.initNodeMetaQueryParam();
+ System.out.println(util.getNodeMetaQueryParam());
+ Assert.assertEquals(util.getNodeMetaQueryParam(),"node-meta=internal:true");
+
+ } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/HttpClientUtilTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/HttpClientUtilTest.java
new file mode 100644
index 0000000..568e4f9
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/HttpClientUtilTest.java
@@ -0,0 +1,29 @@
+package org.onap.msb.apiroute.wrapper.util;
+
+import java.io.IOException;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.util.HttpClientUtil;
+
+public class HttpClientUtilTest {
+
+ private String testIp="http://10.74.151.26:8500";
+
+ @Test
+ public void test_httpGet() {
+ /*try {
+ int result = HttpClientUtil.httpGetStatus(testIp);
+ if(result==200){
+ Assert.assertEquals("Consul Agent", HttpClientUtil.httpGet(testIp));
+ }
+ else{
+ Assert.assertEquals(500, result);
+ }
+
+
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof IOException);
+ }*/
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/JacksonJsonUtilTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/JacksonJsonUtilTest.java
new file mode 100644
index 0000000..f9835d9
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/JacksonJsonUtilTest.java
@@ -0,0 +1,94 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.msb.apiroute.wrapper.util;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.msb.apiroute.api.PublishFullAddress;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.wrapper.util.JacksonJsonUtil;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+
+public class JacksonJsonUtilTest {
+ @Test
+ public void testBeanToJson(){
+ try{
+ RouteServer server=new RouteServer("127.0.0.1","80");
+ String json=JacksonJsonUtil.beanToJson(server);
+ Assert.assertEquals("{\"ip\":\"127.0.0.1\",\"port\":\"80\",\"weight\":0}",json);
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+ }
+
+ @Test
+ public void testJsonToBean(){
+ try{
+ String json="{\"ip\":\"127.0.0.1\",\"port\":\"80\",\"weight\":0}";
+ RouteServer server=(RouteServer) JacksonJsonUtil.jsonToBean(json, RouteServer.class);
+ Assert.assertEquals("127.0.0.1",server.getIp());
+ Assert.assertEquals("80",server.getPort());
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+ }
+
+
+// @Test
+// public void testJsonToBean_Fail(){
+// try{
+// String json="{\"ip\":\"127.0.0.1\",\"port\":\"80\",\"weight\":0";
+// RouteServer server=(RouteServer) JacksonJsonUtil.jsonToBean(json, RouteServer.class);
+// }
+// catch(Exception e){
+// Assert.assertEquals("class org.onap.msb.apiroute.api.RouteServer JsonTobean faild",e.getMessage());
+// }
+// }
+
+ @Test
+ public void testJsonToListBean(){
+ try{
+ String resultJson="[{\"domain\": \"wudith.openpalette.zte.com.cn\",\"port\": \"80\",\"publish_url\": \"/api/wudith/v1\",\"visualRange\": \"0\",\"publish_protocol\": \"http\"},"
+ + "{\"ip\": \"10.74.165.246\",\"port\": \"80\",\"publish_url\": \"/api/wudith/v1\",\"visualRange\": \"0\",\"publish_protocol\": \"http\"}]";
+ List<PublishFullAddress> publishFullAddressList =
+ JacksonJsonUtil.jsonToListBean(resultJson, new TypeReference<List<PublishFullAddress>>() {});
+ Assert.assertEquals(2,publishFullAddressList.size());
+ Assert.assertEquals("80",publishFullAddressList.get(0).getPort());
+ }
+ catch(Exception e){
+ Assert.fail("Exception" + e.getMessage());
+ }
+ }
+
+ @Test
+ public void testJsonToListBean_Fail(){
+ try{
+ String resultJson="[\"domain\": \"wudith.openpalette.zte.com.cn\",\"port\": \"80\",\"publish_url\": \"/api/wudith/v1\",\"visualRange\": \"0\",\"publish_protocol\": \"http\"},"
+ + "{\"ip\": \"10.74.165.246\",\"port\": \"80\",\"publish_url\": \"/api/wudith/v1\",\"visualRange\": \"0\",\"publish_protocol\": \"http\"}]";
+ List<PublishFullAddress> publishFullAddressList =
+ JacksonJsonUtil.jsonToListBean(resultJson, new TypeReference<List<PublishFullAddress>>() {});
+ }
+ catch(Exception e){
+ Assert.assertTrue(e instanceof Exception);
+ }
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/JedisUtilTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/JedisUtilTest.java
new file mode 100644
index 0000000..5a92e32
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/JedisUtilTest.java
@@ -0,0 +1,20 @@
+package org.onap.msb.apiroute.wrapper.util;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+
+import redis.clients.jedis.exceptions.JedisConnectionException;
+
+public class JedisUtilTest {
+ @Test
+ public void test_initialPool() {
+ try {
+ JedisUtil.borrowJedisInstance();
+
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof JedisConnectionException);
+
+ }
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/MicroServiceUtilTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/MicroServiceUtilTest.java
new file mode 100644
index 0000000..2012413
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/MicroServiceUtilTest.java
@@ -0,0 +1,45 @@
+package org.onap.msb.apiroute.wrapper.util;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.wrapper.util.MicroServiceUtil;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import redis.clients.jedis.Jedis;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({HttpServletRequest.class})
+public class MicroServiceUtilTest {
+
+ @Test
+ public void test_getPrefixedKey(){
+ Assert.assertEquals("discover:microservices:test:v1",MicroServiceUtil.getPrefixedKey("test","v1"));
+ }
+
+ @Test
+ public void test_getServiceKey(){
+ Assert.assertEquals("discover:microservices:test:v1",MicroServiceUtil.getServiceKey("test","v1"));
+ }
+
+ @Test
+ public void test_getRealIp(){
+ HttpServletRequest request=PowerMockito.mock(HttpServletRequest.class);
+ PowerMockito.when(request.getHeader("X-Forwarded-For")).thenReturn("127.0.0.1");
+ Assert.assertEquals("127.0.0.1",MicroServiceUtil.getRealIp(request));
+
+ PowerMockito.when(request.getHeader("X-Forwarded-For")).thenReturn("");
+ PowerMockito.when(request.getHeader("X-Real-IP")).thenReturn("127.0.0.2");
+ Assert.assertEquals("127.0.0.2",MicroServiceUtil.getRealIp(request));
+
+ PowerMockito.when(request.getHeader("X-Forwarded-For")).thenReturn("");
+ PowerMockito.when(request.getHeader("X-Real-IP")).thenReturn("");
+ PowerMockito.when(request.getRemoteAddr()).thenReturn("127.0.0.3");
+ Assert.assertEquals("127.0.0.3",MicroServiceUtil.getRealIp(request));
+
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/RegExpTestUtilTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/RegExpTestUtilTest.java
new file mode 100644
index 0000000..11e5907
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/RegExpTestUtilTest.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.msb.apiroute.wrapper.util;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.msb.apiroute.wrapper.util.RegExpTestUtil;
+
+public class RegExpTestUtilTest {
+
+ @Test
+ public void test_HostRegExpTest(){
+ Assert.assertTrue(RegExpTestUtil.hostRegExpTest("127.0.0.1:8080"));
+ Assert.assertFalse(RegExpTestUtil.hostRegExpTest("0.0.0.1:89"));
+ }
+
+
+
+ @Test
+ public void test_IpRegExpTest(){
+ Assert.assertTrue(RegExpTestUtil.ipRegExpTest("127.0.0.1"));
+ Assert.assertFalse(RegExpTestUtil.ipRegExpTest("127.0.0.1.5"));
+ }
+
+
+
+ @Test
+ public void test_PortRegExpTest(){
+ Assert.assertTrue(RegExpTestUtil.portRegExpTest("80"));
+ Assert.assertFalse(RegExpTestUtil.portRegExpTest("898989"));
+ }
+
+
+ @Test
+ public void test_VersionRegExpTest(){
+ Assert.assertTrue(RegExpTestUtil.versionRegExpTest("v1"));
+ Assert.assertFalse(RegExpTestUtil.versionRegExpTest("23"));
+ }
+
+
+
+ @Test
+ public void test_urlRegExpTest(){
+ Assert.assertTrue(RegExpTestUtil.urlRegExpTest("/test"));
+ Assert.assertTrue(RegExpTestUtil.urlRegExpTest("/"));
+ Assert.assertFalse(RegExpTestUtil.urlRegExpTest("test"));
+ }
+
+
+ @Test
+ public void test_apiRouteUrlRegExpTest(){
+ Assert.assertTrue(RegExpTestUtil.apiRouteUrlRegExpTest("/api/test/v1"));
+ Assert.assertFalse(RegExpTestUtil.apiRouteUrlRegExpTest("/test"));
+ }
+
+
+
+ @Test
+ public void test_iuiRouteUrlRegExpTest(){
+ Assert.assertTrue(RegExpTestUtil.iuiRouteUrlRegExpTest("/iui/test"));
+ Assert.assertFalse(RegExpTestUtil.iuiRouteUrlRegExpTest("/test"));
+ }
+
+ @Test
+ public void test_apiServiceNameMatch4URL(){
+ String[] apiServiceNameArray={"testApiName","v1"};
+ Assert.assertArrayEquals(apiServiceNameArray, RegExpTestUtil.apiServiceNameMatch4URL("/api/testApiName/v1"));
+
+ String[] apiServiceNameArray_noversion={"testApiName",""};
+ Assert.assertArrayEquals(apiServiceNameArray_noversion, RegExpTestUtil.apiServiceNameMatch4URL("/api/testApiName"));
+
+ Assert.assertNull(RegExpTestUtil.apiServiceNameMatch4URL("/apiw/name/v1"));
+ }
+
+ @Test
+ public void test_iuiServiceNameMatch4URL(){
+ String iuiServiceName="testIuiName";
+ Assert.assertEquals(iuiServiceName, RegExpTestUtil.iuiServiceNameMatch4URL("/iui/testIuiName"));
+
+ Assert.assertNull(RegExpTestUtil.iuiServiceNameMatch4URL("/api/name/v1"));
+ }
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/RouteUtilTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/RouteUtilTest.java
new file mode 100644
index 0000000..7ddab84
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/RouteUtilTest.java
@@ -0,0 +1,373 @@
+/**
+ * Copyright 2016 ZTE, Inc. and others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.msb.apiroute.wrapper.util;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.api.Node;
+import org.onap.msb.apiroute.api.RouteInfo;
+import org.onap.msb.apiroute.api.RouteServer;
+import org.onap.msb.apiroute.api.exception.UnprocessableEntityException;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ConfigUtil.class})
+public class RouteUtilTest {
+
+ @Test
+ public void test_getPrefixedKey() {
+ Assert.assertEquals("msb:routing:test:v1", RouteUtil.getPrefixedKey("", "test", "v1"));
+ Assert.assertEquals("msb:5656:test:v1", RouteUtil.getPrefixedKey("5656", "test", "v1"));
+
+ }
+
+ @Test
+ public void test_getPrefixedKey4Host() {
+ Assert.assertEquals("msb:host:test:v1", RouteUtil.getPrefixedKey4Host("test", "v1"));
+
+ }
+
+
+
+ @Test
+ public void test_checkRouteWay() {
+ try {
+ RouteUtil.checkRouteWay("ipp");
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+
+ }
+
+ @Test
+ public void test_checkServiceNameAndVersion() {
+ try {
+ RouteUtil.checkServiceNameAndVersion("","v1");
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+
+ try {
+ RouteUtil.checkServiceNameAndVersion("test","ve1");
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+ @Test
+ public void test_checkServiceStatus() {
+ try {
+ RouteUtil.checkServiceStatus("2");
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+ @Test
+ public void test_checkRouterInfoFormat() {
+ RouteInfo routeInfo=new RouteInfo();
+
+ try {
+ RouteUtil.checkRouterInfoFormat(routeInfo);
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+ @Test
+ public void test_checkMicroServiceInfoFormat() {
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+
+ try {
+ RouteUtil.checkMicroServiceInfoFormat(microServiceInfo,"");
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+ @Test
+ public void test_checkMicroServiceInfoFormat_ip() {
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+ microServiceInfo.setServiceName("name");
+ microServiceInfo.setProtocol("REST");
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.88.22","8080"));
+ microServiceInfo.setNodes(nodeSet);
+
+ try {
+ RouteUtil.checkMicroServiceInfoFormat(microServiceInfo,"");
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+ @Test
+ public void test_checkMicroServiceInfoFormat_port() {
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+ microServiceInfo.setServiceName("name");
+ microServiceInfo.setProtocol("REST");
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("10.74.148.88.22","808770"));
+ microServiceInfo.setNodes(nodeSet);
+
+ try {
+ RouteUtil.checkMicroServiceInfoFormat(microServiceInfo,"");
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+ @Test
+ public void test_checkMicroServiceInfoFormat_version() {
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+ microServiceInfo.setServiceName("name");
+ microServiceInfo.setProtocol("REST");
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("","8089"));
+ microServiceInfo.setNodes(nodeSet);
+ microServiceInfo.setVersion("cv2");
+
+ try {
+ RouteUtil.checkMicroServiceInfoFormat(microServiceInfo,"10.74.55.36");
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+ @Test
+ public void test_checkMicroServiceInfoFormat_url() {
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+ microServiceInfo.setServiceName("name");
+ microServiceInfo.setProtocol("REST");
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("","8089"));
+ microServiceInfo.setNodes(nodeSet);
+ microServiceInfo.setVersion("v2");
+ microServiceInfo.setUrl("url");
+
+ try {
+ RouteUtil.checkMicroServiceInfoFormat(microServiceInfo,"10.74.55.36");
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+ @Test
+ public void test_checkMicroServiceInfoFormat_protocol() {
+ MicroServiceFullInfo microServiceInfo=new MicroServiceFullInfo();
+ microServiceInfo.setServiceName("name");
+ microServiceInfo.setProtocol("REST2");
+ Set<Node> nodeSet = new HashSet<>();
+ nodeSet.add(new Node("","8089"));
+ microServiceInfo.setNodes(nodeSet);
+ microServiceInfo.setVersion("v2");
+ microServiceInfo.setUrl("/url");
+
+ try {
+ RouteUtil.checkMicroServiceInfoFormat(microServiceInfo,"10.74.55.36");
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+ @Test
+ public void test_getAPIRedisPrefixedKey() {
+ Assert.assertEquals("msb:20081:api:testApi:v1", RouteUtil.getAPIRedisPrefixedKey("testApi", "v1", "testHost","20081","ip"));
+ Assert.assertEquals("msb:routing:api:testApi:v1", RouteUtil.getAPIRedisPrefixedKey("testApi", "v1", "testHost","","ip"));
+ Assert.assertEquals("msb:host:testHost:api:testApi:v1", RouteUtil.getAPIRedisPrefixedKey("testApi", "v1", "testHost","20081","domain"));
+ }
+
+ @Test
+ public void test_getRedisPrefixedKey() {
+ Assert.assertEquals("msb:20081:custom:/testName/v1", RouteUtil.getRedisPrefixedKey(RouteUtil.CUSTOMROUTE,"/testName/v1", "testHost","20081","ip"));
+ Assert.assertEquals("msb:routing:custom:/testName/v1", RouteUtil.getRedisPrefixedKey(RouteUtil.CUSTOMROUTE,"/testName/v1", "testHost","","ip"));
+ Assert.assertEquals("msb:host:testHost:custom:/testName/v1", RouteUtil.getRedisPrefixedKey(RouteUtil.CUSTOMROUTE,"/testName/v1", "testHost","20081","domain"));
+
+ Assert.assertEquals("msb:20081:iui:testName", RouteUtil.getRedisPrefixedKey(RouteUtil.IUIROUTE,"testName", "testHost","20081","ip"));
+ Assert.assertEquals("msb:routing:iui:testName", RouteUtil.getRedisPrefixedKey(RouteUtil.IUIROUTE,"testName", "testHost","","ip"));
+ Assert.assertEquals("msb:host:testHost:iui:testName", RouteUtil.getRedisPrefixedKey(RouteUtil.IUIROUTE,"testName", "testHost","20081","domain"));
+ }
+
+ @Test
+ public void test_getMutiRedisKey() {
+ Assert.assertEquals("msb:[^h]*:api:*", RouteUtil.getMutiRedisKey(RouteUtil.APIROUTE,"ip"));
+ Assert.assertEquals("msb:[^h]*:iui:*", RouteUtil.getMutiRedisKey(RouteUtil.IUIROUTE,"ip"));
+ Assert.assertEquals("msb:[^h]*:custom:*", RouteUtil.getMutiRedisKey(RouteUtil.CUSTOMROUTE,"ip"));
+
+ Assert.assertEquals("msb:host:*:api:*", RouteUtil.getMutiRedisKey(RouteUtil.APIROUTE,"domain"));
+ Assert.assertEquals("msb:host:*:iui:*", RouteUtil.getMutiRedisKey(RouteUtil.IUIROUTE,"domain"));
+ Assert.assertEquals("msb:host:*:custom:*", RouteUtil.getMutiRedisKey(RouteUtil.CUSTOMROUTE,"domain"));
+ }
+
+ @Test
+ public void test_getRouteNameByns() {
+ Assert.assertEquals("serviceName", RouteUtil.getRouteNameByns("serviceName",""));
+ Assert.assertEquals("serviceName", RouteUtil.getRouteNameByns("serviceName-ns","ns"));
+ Assert.assertEquals("serviceName-ns", RouteUtil.getRouteNameByns("serviceName-ns-ns","ns"));
+ Assert.assertEquals("serviceName", RouteUtil.getRouteNameByns("serviceName","default"));
+ }
+
+ @Test
+ public void test_getVisualRangeByRouter(){
+ Assert.assertEquals("0", RouteUtil.getVisualRangeByRouter("0|1"));
+ Assert.assertEquals("1", RouteUtil.getVisualRangeByRouter("1"));
+ Assert.assertEquals("0", RouteUtil.getVisualRangeByRouter("0"));
+
+
+ }
+
+ @Test
+ public void test_getVisualRangeByRouter_muti(){
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("ROUTE_LABELS")).thenReturn("lab1:val,visualRange:0|1");
+ ConfigUtil.getInstance().initRouteLabelsMatches();
+ Assert.assertEquals("0", RouteUtil.getVisualRangeByRouter("0|1"));
+ }
+
+ @Test
+ public void test_checkRouterInfoFormat_url() {
+ RouteInfo routeInfo=new RouteInfo();
+ routeInfo.setServiceName("name");
+ routeInfo.setUrl("url");
+ routeInfo.setServers( new RouteServer[]{new RouteServer("10.74.148.88","8080")});
+
+ try {
+ RouteUtil.checkRouterInfoFormat(routeInfo);
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+ @Test
+ public void test_checkRouterInfoFormat_visualRangeRange() {
+ RouteInfo routeInfo=new RouteInfo();
+ routeInfo.setServiceName("name");
+ routeInfo.setUrl("/url");
+ routeInfo.setServers( new RouteServer[]{new RouteServer("10.74.148.88","8080")});
+ routeInfo.setVisualRange("2");
+
+ try {
+ RouteUtil.checkRouterInfoFormat(routeInfo);
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+
+ @Test
+ public void test_checkRouterInfoFormat_controlRangeMatches() {
+ RouteInfo routeInfo=new RouteInfo();
+ routeInfo.setServiceName("name");
+ routeInfo.setUrl("/url");
+ routeInfo.setServers( new RouteServer[]{new RouteServer("10.74.148.88","8080")});
+ routeInfo.setVisualRange("0");
+ routeInfo.setControl("3");
+
+ try {
+ RouteUtil.checkRouterInfoFormat(routeInfo);
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+ @Test
+ public void test_checkRouterInfoFormat_statusRangeMatches() {
+ RouteInfo routeInfo=new RouteInfo();
+ routeInfo.setServiceName("name");
+ routeInfo.setUrl("/url");
+ routeInfo.setServers( new RouteServer[]{new RouteServer("10.74.148.88","8080")});
+ routeInfo.setVisualRange("0");
+ routeInfo.setControl("0");
+ routeInfo.setStatus("3");
+
+ try {
+ RouteUtil.checkRouterInfoFormat(routeInfo);
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+
+ @Test
+ public void test_checkRouterInfoFormat_useOwnUpstreamRangeMatches() {
+ RouteInfo routeInfo=new RouteInfo();
+ routeInfo.setServiceName("name");
+ routeInfo.setUrl("/url");
+ routeInfo.setServers( new RouteServer[]{new RouteServer("10.74.148.88","8080")});
+ routeInfo.setVisualRange("0");
+ routeInfo.setControl("0");
+ routeInfo.setStatus("0");
+ routeInfo.setUseOwnUpstream("3");
+
+ try {
+ RouteUtil.checkRouterInfoFormat(routeInfo);
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+ @Test
+ public void test_checkRouterInfoFormat_ip() {
+ RouteInfo routeInfo=new RouteInfo();
+ routeInfo.setServiceName("name");
+ routeInfo.setUrl("/url");
+ routeInfo.setServers( new RouteServer[]{new RouteServer("10.74.148.88.6","8080")});
+ routeInfo.setVisualRange("0");
+ routeInfo.setControl("0");
+ routeInfo.setStatus("0");
+ routeInfo.setUseOwnUpstream("1");
+
+ try {
+ RouteUtil.checkRouterInfoFormat(routeInfo);
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+
+ @Test
+ public void test_checkRouterInfoFormat_port() {
+ RouteInfo routeInfo=new RouteInfo();
+ routeInfo.setServiceName("name");
+ routeInfo.setUrl("/url");
+ routeInfo.setServers( new RouteServer[]{new RouteServer("10.74.148.88.6","757577")});
+ routeInfo.setVisualRange("0");
+ routeInfo.setControl("0");
+ routeInfo.setStatus("0");
+ routeInfo.setUseOwnUpstream("1");
+
+ try {
+ RouteUtil.checkRouterInfoFormat(routeInfo);
+ } catch (Exception e) {
+ Assert.assertTrue(e instanceof UnprocessableEntityException);
+ }
+ }
+
+
+
+
+
+
+
+
+}
diff --git a/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/ServiceFilterTest.java b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/ServiceFilterTest.java
new file mode 100644
index 0000000..e7c6531
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/java/org/onap/msb/apiroute/wrapper/util/ServiceFilterTest.java
@@ -0,0 +1,210 @@
+package org.onap.msb.apiroute.wrapper.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.msb.apiroute.api.MicroServiceFullInfo;
+import org.onap.msb.apiroute.api.Node;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableService;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ImmutableServiceHealth;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.Service;
+import org.onap.msb.apiroute.wrapper.consulextend.model.health.ServiceHealth;
+import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
+import org.onap.msb.apiroute.wrapper.util.ServiceFilter;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import com.orbitz.consul.model.health.ImmutableNode;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ConfigUtil.class})
+public class ServiceFilterTest {
+
+
+
+ @Test
+ public void test_isNeedNotifyByNameSpace() {
+
+ PowerMockito.mockStatic(System.class);
+
+ PowerMockito.when(System.getenv("NAMESPACE")).thenReturn("all");
+ ConfigUtil.getInstance().initRouteNameSpaceMatches();
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByNameSpace("test")); // namespaceMatches:all
+
+ PowerMockito.when(System.getenv("NAMESPACE")).thenReturn("default");
+ ConfigUtil.getInstance().initRouteNameSpaceMatches();
+ Assert.assertFalse(ServiceFilter.getInstance().isNeedNotifyByNameSpace("test"));// namespaceMatches:default
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByNameSpace(""));// namespaceMatches:default
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByNameSpace("default"));// namespaceMatches:default
+
+
+ PowerMockito.when(System.getenv("NAMESPACE")).thenReturn("!default");
+ ConfigUtil.getInstance().initRouteNameSpaceMatches();
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByNameSpace("test"));// namespaceMatches:!default
+ Assert.assertFalse(ServiceFilter.getInstance().isNeedNotifyByNameSpace(""));// namespaceMatches:!default
+
+ PowerMockito.when(System.getenv("NAMESPACE")).thenReturn("ns|ns2");
+ ConfigUtil.getInstance().initRouteNameSpaceMatches();
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByNameSpace("ns"));
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByNameSpace("ns2"));
+ Assert.assertFalse(ServiceFilter.getInstance().isNeedNotifyByNameSpace("ns3"));
+ Assert.assertFalse(ServiceFilter.getInstance().isNeedNotifyByNameSpace(""));
+
+
+ PowerMockito.when(System.getenv("NAMESPACE")).thenReturn("!ns&!ns2");
+ ConfigUtil.getInstance().initRouteNameSpaceMatches();
+ Assert.assertFalse(ServiceFilter.getInstance().isNeedNotifyByNameSpace("ns"));
+ Assert.assertFalse(ServiceFilter.getInstance().isNeedNotifyByNameSpace("ns2"));
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByNameSpace("ns3"));
+
+ }
+
+ /*
+ * @Test public void test_isNeedNotifyByVisualRange(){
+ *
+ * Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByVisualRange("0"));
+ * Assert.assertFalse(ServiceFilter.getInstance().isNeedNotifyByVisualRange("1"));
+ * Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByVisualRange("0|1")); }
+ */
+
+ @Test
+ public void test_isNeedNotifyByProtocol() {
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByProtocol("HTTP"));
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByProtocol("UI"));
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByProtocol("REST"));
+ Assert.assertFalse(ServiceFilter.getInstance().isNeedNotifyByProtocol("TCP"));
+ }
+
+ @Test
+ public void test_isNeedNotifyByNetwork_plane_typeMatches() {
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("ROUTE_LABELS")).thenReturn("network_plane_type:network");
+ ConfigUtil.getInstance().initRouteLabelsMatches();
+ Assert.assertFalse(ServiceFilter.getInstance().isNeedNotifyByNetwork_plane_typeMatches("net"));
+ Assert.assertTrue(ServiceFilter.getInstance()
+ .isNeedNotifyByNetwork_plane_typeMatches("network"));
+
+ PowerMockito.when(System.getenv("ROUTE_LABELS")).thenReturn("network_plane_type:net1|net2");
+ ConfigUtil.getInstance().initRouteLabelsMatches();
+ Assert.assertFalse(ServiceFilter.getInstance().isNeedNotifyByNetwork_plane_typeMatches("net"));
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByNetwork_plane_typeMatches("net1"));
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByNetwork_plane_typeMatches("net2"));
+
+ }
+
+ @Test
+ public void test_isNeedNotifyByRouteLabels() {
+ Map<String, String> labelMap = new HashMap<String, String>();
+ labelMap.put("lab1", "val1");
+
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("ROUTE_LABELS")).thenReturn("lab1:val,visualRange:1");
+ ConfigUtil.getInstance().initRouteLabelsMatches();
+ Assert.assertFalse(ServiceFilter.getInstance().isNeedNotifyByRouteLabels(labelMap));
+
+ PowerMockito.when(System.getenv("ROUTE_LABELS")).thenReturn("lab1:val1");
+ ConfigUtil.getInstance().initRouteLabelsMatches();
+ Assert.assertTrue(ServiceFilter.getInstance().isNeedNotifyByRouteLabels(labelMap));
+
+ }
+
+ @Test
+ public void test_isFilterService() {
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getenv("NAMESPACE")).thenReturn("ns1");
+ ConfigUtil.getInstance().initRouteNameSpaceMatches();
+
+ PowerMockito.when(System.getenv("ROUTE_LABELS")).thenReturn(
+ "visualRange:0,network_plane_type:net,customLabel:custom|custom2");
+ ConfigUtil.getInstance().initRouteLabelsMatches();
+
+ List<String> tagList = new ArrayList<String>();
+ tagList.add("\"base\":{\"protocol\":\"REST\",\"version\":\"v1\",\"url\":\"/api/msbtest/v1\"}");
+ tagList
+ .add("\"labels\":{\"visualRange\":\"0\",\"network_plane_type\":\"net\",\"customLabel\":\"custom\"}");
+ tagList.add("\"ns\":{\"namespace\":\"ns1\"}");
+ Assert.assertTrue(ServiceFilter.getInstance().isFilterService(tagList));
+
+ tagList.clear();
+ tagList.add("\"base\":{\"protocol\":\"TCP\",\"version\":\"v1\",\"url\":\"/api/msbtest/v1\"}");
+ Assert.assertFalse(ServiceFilter.getInstance().isFilterService(tagList));
+
+ tagList.clear();
+ tagList.add("\"base\":{\"protocol\":\"UI\",\"version\":\"v1\",\"url\":\"/api/msbtest/v1\"}");
+ tagList.add("\"ns\":{\"namespace\":\"ns2\"}");
+ Assert.assertFalse(ServiceFilter.getInstance().isFilterService(tagList));
+
+ tagList.clear();
+ tagList.add("\"base\":{\"protocol\":\"UI\",\"version\":\"v1\",\"url\":\"/api/msbtest/v1\"}");
+ tagList.add("\"ns\":{\"namespace\":\"ns1\"}");
+ tagList
+ .add("\"labels\":{\"visualRange\":\"1\",\"network_plane_type\":\"net\",\"customLabel\":\"custom\"}");
+ Assert.assertFalse(ServiceFilter.getInstance().isFilterService(tagList));
+
+ tagList.clear();
+ tagList.add("\"base\":{\"protocol\":\"UI\",\"version\":\"v1\",\"url\":\"/api/msbtest/v1\"}");
+ tagList.add("\"ns\":{\"namespace\":\"ns1\"}");
+ tagList
+ .add("\"labels\":{\"visualRange\":\"0\",\"network_plane_type\":\"net2\",\"customLabel\":\"custom\"}");
+ Assert.assertFalse(ServiceFilter.getInstance().isFilterService(tagList));
+
+ tagList.clear();
+ tagList.add("\"base\":{\"protocol\":\"UI\",\"version\":\"v1\",\"url\":\"/api/msbtest/v1\"}");
+ tagList.add("\"ns\":{\"namespace\":\"ns1\"}");
+ tagList
+ .add("\"labels\":{\"visualRange\":\"0\",\"network_plane_type\":\"net\",\"customLabel\":\"custom3\"}");
+ Assert.assertFalse(ServiceFilter.getInstance().isFilterService(tagList));
+
+ }
+
+ @Test
+ public void test_transMicroServiceInfoFromConsul() {
+ List<String> tagList = new ArrayList<String>();
+ tagList.add("\"base\":{\"protocol\":\"REST\",\"version\":\"v1\",\"url\":\"/api/msbtest/v1\"}");
+ tagList
+ .add("\"labels\":{\"visualRange\":\"0\",\"network_plane_type\":\"net\",\"customLabel\":\"custom\"}");
+ tagList.add("\"ns\":{\"namespace\":\"ns1\"}");
+
+ Service service =
+ ImmutableService.builder().id("id").port(8686).address("10.74.165.246").service("msbtest")
+ .addAllTags(tagList).createIndex(0).modifyIndex(0).build();
+ ServiceHealth serviceHealth =
+ ImmutableServiceHealth.builder().service(service)
+ .node(ImmutableNode.builder().node("server").address("192.168.1.98").build()).build();
+ List<ServiceHealth> serviceHealthList = new ArrayList<ServiceHealth>();
+ serviceHealthList.add(serviceHealth);
+
+ Map<String, MicroServiceFullInfo> serviceMap= ServiceFilter.getInstance().transMicroServiceInfoFromConsul(serviceHealthList);
+ Assert.assertTrue(serviceMap.containsKey("v1"));
+
+ MicroServiceFullInfo microService=new MicroServiceFullInfo();
+ microService.setServiceName("msbtest");
+ microService.setVersion("v1");
+ microService.setUrl("/api/msbtest/v1");
+ microService.setProtocol("REST");
+ microService.setVisualRange("0");
+ microService.setNamespace("ns1");
+
+ Set<Node> nodes=new HashSet<Node>();
+ nodes.add(new Node("10.74.165.246","8686"));
+ microService.setNodes(nodes);
+
+
+
+ Assert.assertEquals(microService,serviceMap.get("v1"));
+
+
+ }
+
+
+
+}
diff --git a/apiroute/apiroute-service/src/test/resources/ext/initApiGatewayConfig/initApiGatewayConfig.json b/apiroute/apiroute-service/src/test/resources/ext/initApiGatewayConfig/initApiGatewayConfig.json
new file mode 100644
index 0000000..67580e1
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/resources/ext/initApiGatewayConfig/initApiGatewayConfig.json
@@ -0,0 +1,3 @@
+{
+ "port" : "80"
+}
diff --git a/apiroute/apiroute-service/src/test/resources/ext/initRouteLabels/initRouteLabelsMatches.json b/apiroute/apiroute-service/src/test/resources/ext/initRouteLabels/initRouteLabelsMatches.json
new file mode 100644
index 0000000..80826f2
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/resources/ext/initRouteLabels/initRouteLabelsMatches.json
@@ -0,0 +1,12 @@
+{
+ "namespace":"all",
+ "predefineLabels":
+ {
+ "visualRange" : "0",
+ "network_plane_type":"net"
+ },
+ "customLabels":
+ {
+ "custom-key":"custom-value"
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/resources/ext/initRouteLabels/initRouteLabelsMatches.json.sample b/apiroute/apiroute-service/src/test/resources/ext/initRouteLabels/initRouteLabelsMatches.json.sample
new file mode 100644
index 0000000..1ffdbc1
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/resources/ext/initRouteLabels/initRouteLabelsMatches.json.sample
@@ -0,0 +1,12 @@
+{
+ "namespace":"all",
+ "predefineLabels":
+ {
+ "visualRange" : "0",
+ "network_plane_type":""
+ },
+ "customLabels":
+ {
+ "customLabel":""
+ }
+}
diff --git a/apiroute/apiroute-service/src/test/resources/ext/initRouteLabels/readme.txt b/apiroute/apiroute-service/src/test/resources/ext/initRouteLabels/readme.txt
new file mode 100644
index 0000000..3e95c5c
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/resources/ext/initRouteLabels/readme.txt
@@ -0,0 +1,17 @@
+Apigateway can synchronized service informations from the service discovery by configuring filter tag¡£
+Synchronization filter configuration file path£ºapiroute\ext\initRouteLabels\initVisualRangeMatches.json,
+{
+ "namespace":"",
+ "routeLabels":
+ {
+ "visualRange" : "0",
+ "network_plane_type":""
+ }
+}
+namespaceΪÃüÁî¿Õ¼ä¹ýÂËÌõ¼þ£¬ÖµÎª¿ÕÔòºöÂÔ´ËÏî¹ýÂË£¬·ñÔòÖ»ÓзþÎñnamespaceÊôÐÔÓëÌõ¼þÒ»ÖµķþÎñ²Å½øÐÐÏÂÒ»²½µÄ×Ô¶¨Òå±êÇ©Æ¥Åä¡£
+routeLabelsΪ×Ô¶¨Òå±êÇ©£¬Óû§¿É×Ô¶¨Òå¼üÖµ¶ÔÆ¥ÅäÌõ¼þ£¬Ö§³Ö¶àÏîÖµ£¬ÒÔ|·Ö¸ô¡£ÈÎÒ»¸ö±êÇ©µÄÖµÂú×㼴ͬ²½
+µ±Í¬²½·þÎñÐÅϢʱʹÓÃvisualRangeÕâ¸ö±êǩɸѡ£¬È¡Öµ·¶Î§ ϵͳ¼ä:0£¨Ä¬ÈÏ£© ϵͳÄÚ:1£¬ÆäÖÐϵͳ¼ä½«¶Ô·þÎñ·ÓÉ·ÃÎÊ×ö¼øȨ´¦Àí¡£
+
+Èç¹ûÊÇdocker²¿ÊðÊ×Ñ¡ÔÚapigatewayËùÔÚÈÝÆ÷ÅäÖÃenv»·¾³±äÁ¿»ñÈ¡£º
+±äÁ¿Ãû£ºNAMESPACE
+±äÁ¿Ãû£ºROUTE_LABELS ±äÁ¿Öµ¸ñʽ£ºvisualRange£º0; network_plane_type:xx|yy
diff --git a/apiroute/apiroute-service/src/test/resources/ext/initRouteWay/initRouteWay.json b/apiroute/apiroute-service/src/test/resources/ext/initRouteWay/initRouteWay.json
new file mode 100644
index 0000000..b6ebf27
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/resources/ext/initRouteWay/initRouteWay.json
@@ -0,0 +1,3 @@
+{
+ "routeWay":"ip"
+} \ No newline at end of file
diff --git a/apiroute/apiroute-service/src/test/resources/ext/initRouteWay/readme.txt b/apiroute/apiroute-service/src/test/resources/ext/initRouteWay/readme.txt
new file mode 100644
index 0000000..c219550
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/resources/ext/initRouteWay/readme.txt
@@ -0,0 +1,5 @@
+Apigateway ·ÓÉ·½Ê½£ºip/domain; ĬÈÏΪip
+
+Èç¹ûÊÇdocker²¿ÊðÊ×Ñ¡ÔÚapigatewayËùÔÚÈÝÆ÷ÅäÖÃenv»·¾³±äÁ¿»ñÈ¡£º
+±äÁ¿Ãû£ºROUTE_WAY ±äÁ¿¿ÉÑ¡Öµ£ºip/domain
+
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initServices/msb.json b/apiroute/apiroute-service/src/test/resources/ext/initServices/msb.json
index 5df59e2..43b795d 100644
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initServices/msb.json
+++ b/apiroute/apiroute-service/src/test/resources/ext/initServices/msb.json
@@ -1,53 +1,44 @@
-[{
- "serviceName" : "microservices",
- "version" : "v1",
- "url" : "/api/microservices/v1",
- "apiJson" : "/api/microservices/v1/swagger.json",
- "apiJsonType" : "1",
- "metricsUrl" : "/admin/metrics",
- "control" : "1",
- "status" : "1",
- "servers" : [{
- "ip" : "127.0.0.1",
- "port" : "8086",
- "weight" : 0
- }
- ]
- },
-{
- "serviceName" : "microservices",
- "url" : "/iui/microservices",
- "control" : "1",
- "status" : "1",
- "servers" : [{
- "ip" : "127.0.0.1",
- "port" : "8086",
- "weight" : 0
- }
- ]
- },
- {
- "serviceName" : "/winery-topologymodeler",
- "url" : "/winery-topologymodeler",
- "control" : "0",
- "status" : "1",
- "servers" : [{
- "ip" : "127.0.0.1",
- "port" : "8202",
- "weight" : 0
- }
- ]
- },
- {
- "serviceName" : "/winery",
- "url" : "/winery",
- "control" : "0",
- "status" : "1",
- "servers" : [{
- "ip" : "127.0.0.1",
- "port" : "8202",
- "weight" : 0
- }
- ]
- }
-]
+[{
+ "serviceName" : "microservices",
+ "version" : "v1",
+ "url" : "/api/microservices/v1",
+ "apiJson" : "/api/microservices/v1/swagger.json",
+ "apiJsonType" : "1",
+ "metricsUrl" : "/admin/metrics",
+ "control" : "1",
+ "status" : "1",
+ "host":"msb",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8066",
+ "weight" : 0
+ }
+ ]
+ },
+{
+ "serviceName" : "microservices",
+ "url" : "/iui/microservices",
+ "control" : "1",
+ "status" : "1",
+ "host":"msb",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8066",
+ "weight" : 0
+ }
+ ]
+ },
+ {
+ "serviceName" : "/custom",
+ "url" : "/custom",
+ "control" : "1",
+ "status" : "1",
+ "host":"msb",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8066",
+ "weight" : 0
+ }
+ ]
+ }
+]
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initServices/readme.txt b/apiroute/apiroute-service/src/test/resources/ext/initServices/readme.txt
index 2df5d10..59ef5e4 100644
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initServices/readme.txt
+++ b/apiroute/apiroute-service/src/test/resources/ext/initServices/readme.txt
@@ -1,82 +1,63 @@
-====
- Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-====
-
-########################## initialize default routeInfo to redis ##########################
-
-#when msb is starting, it will automatically read all json files under this folder, and initializes to redis.
-#If the routeInfo is exist, it will be ignored, otherwise it will be saved.
-
-
-# JSON File content must be routeInfo format array like below examples:
-
-# optional:
-# apiJsonType: 1:user-defined json type 0:pre-defined json type
-# control: 0:default 1:readonly 2:hidden
-# status: 0:disabled 1:enabled
-# Tip��control��status��weight are non-mandatory
-
-[
-##########################apiRoute example##########################
-
-{
- "serviceName" : "microservices",
- "version" : "v1",
- "url" : "/api/microservices/v1",
- "apiJson" : "/api/microservices/v1/swagger.json",
- "apiJsonType" : "1",
- "metricsUrl" : "/admin/metrics",
- "control" : "1",
- "status" : "1",
- "servers" : [{
- "ip" : "127.0.0.1",
- "port" : "8086",
- "weight" : 0
- }
- ]
- },
-
-##########################iuiRoute example##########################
-
-{
- "serviceName" : "microservices",
- "url" : "/iui/microservices",
- "control" : "1",
- "status" : "1",
- "servers" : [{
- "ip" : "127.0.0.1",
- "port" : "8086",
- "weight" : 0
- }
- ]
- },
-
-##########################customRoute example##########################
- {
- "serviceName" : "/test",
- "url" : "/test",
- "control" : "0",
- "status" : "1",
- "servers" : [{
- "ip" : "10.74.56.36",
- "port" : "8989",
- "weight" : 0
- }
- ]
- }
+########################## initialize default routeInfo to redis ##########################
+
+#when msb is starting, it will automatically read all json files under this folder, and initializes to redis.
+#If the routeInfo is exist, it will be ignored, otherwise it will be saved.
+
+
+# JSON File content must be routeInfo format array like below examples:
+
+# optional:
+# apiJsonType: 1:user-defined json type 0:pre-defined json type
+# control: 0:default 1:readonly 2:hidden
+# status: 0:disabled 1:enabled
+# Tip£ºcontrol¡¢status¡¢weight are non-mandatory
+
+[
+##########################apiRoute example##########################
+
+{
+ "serviceName" : "microservices",
+ "version" : "v1",
+ "url" : "/api/microservices/v1",
+ "apiJson" : "/api/microservices/v1/swagger.json",
+ "apiJsonType" : "1",
+ "metricsUrl" : "/admin/metrics",
+ "control" : "1",
+ "status" : "1",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8086",
+ "weight" : 0
+ }
+ ]
+ },
+
+##########################iuiRoute example##########################
+
+{
+ "serviceName" : "microservices",
+ "url" : "/iui/microservices",
+ "control" : "1",
+ "status" : "1",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8086",
+ "weight" : 0
+ }
+ ]
+ },
+
+##########################customRoute example##########################
+ {
+ "serviceName" : "/test",
+ "url" : "/test",
+ "control" : "0",
+ "status" : "1",
+ "servers" : [{
+ "ip" : "10.74.56.36",
+ "port" : "8989",
+ "weight" : 0
+ }
+ ]
+ }
] \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initSwaggerJson/api-doc1.json b/apiroute/apiroute-service/src/test/resources/ext/initSwaggerJson/api-doc1.json
index 7c63d7e..7c63d7e 100644
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initSwaggerJson/api-doc1.json
+++ b/apiroute/apiroute-service/src/test/resources/ext/initSwaggerJson/api-doc1.json
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initSwaggerJson/api-doc2.json b/apiroute/apiroute-service/src/test/resources/ext/initSwaggerJson/api-doc2.json
index eb7c8cd..eb7c8cd 100644
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initSwaggerJson/api-doc2.json
+++ b/apiroute/apiroute-service/src/test/resources/ext/initSwaggerJson/api-doc2.json
diff --git a/apiroute/apiroute-service/src/test/resources/ext/initUrlRootPath/initUrlRootPath.json b/apiroute/apiroute-service/src/test/resources/ext/initUrlRootPath/initUrlRootPath.json
new file mode 100644
index 0000000..9668592
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/resources/ext/initUrlRootPath/initUrlRootPath.json
@@ -0,0 +1,4 @@
+{
+ "iuiRootPath" : "iui",
+ "apiRootPath" : "api"
+}
diff --git a/apiroute/apiroute-service/src/test/resources/ext/redisConf/redis.properties b/apiroute/apiroute-service/src/test/resources/ext/redisConf/redis.properties
new file mode 100644
index 0000000..3703748
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/resources/ext/redisConf/redis.properties
@@ -0,0 +1,18 @@
+redis.host=127.0.0.1
+redis.port=6379
+#connectionTimeout
+redis.connectionTimeout=2000
+#redis dbIndex,defaule:0
+redis.db_index=0
+
+#--------------redis pool config--------------
+#maxTotal
+redis.pool.maxTotal=500
+#maxIdle
+redis.pool.maxIdle=100
+#maxWaitMillis:ms
+redis.pool.maxWaitMillis=15000
+#testOnBorrow
+redis.pool.testOnBorrow=false
+#testOnReturn
+redis.pool.testOnReturn=true
diff --git a/apiroute/apiroute-service/src/test/resources/org/onap/msb/apiroute/wrapper/consulextend/util/serviceslist.json b/apiroute/apiroute-service/src/test/resources/org/onap/msb/apiroute/wrapper/consulextend/util/serviceslist.json
new file mode 100644
index 0000000..5139ca8
--- /dev/null
+++ b/apiroute/apiroute-service/src/test/resources/org/onap/msb/apiroute/wrapper/consulextend/util/serviceslist.json
@@ -0,0 +1 @@
+{"aaa-aaa":["\"ns\":{\"namespace\":\"aaa\"}","\"base\":{\"version\":\"v1\",\"protocol\":\"UI\",\"url\":\"/iui\",\"enable_ssl\":\"false\",\"is_manual\":\"true\",\"status\":\"1\"}","\"lb\":{\"lb_policy\":\"\"}","\"labels\":{\"visualRange\":\"1\"}"],"apigateway-default":["\"base\":{\"url\":\"/api/microservices/v1\",\"protocol\":\"REST\",\"version\":\"v1\"}","\"labels\":{\"visualRange\":\"1\"}","\"metadata\":{\"routeWay\":\"ip\"}","\"ns\":{\"namespace\":\"default\"}"],"authen":["\"lb\":{\"lb_policy\":\"\"}","\"labels\":{\"visualRange\":\"1\"}","\"base\":{\"version\":\"v1\",\"protocol\":\"HTTP\",\"url\":\"/authen/v1\",\"enable_ssl\":\"false\",\"is_manual\":\"false\",\"status\":\"1\",\"ha_role\":\"active\"}"],"author":["\"base\":{\"version\":\"v1\",\"protocol\":\"HTTP\",\"url\":\"/author/v1\",\"enable_ssl\":\"false\",\"is_manual\":\"false\",\"status\":\"1\",\"ha_role\":\"active\"}","\"lb\":{\"lb_policy\":\"\"}","\"labels\":{\"visualRange\":\"1\"}"],"bbb-bbb":["\"ns\":{\"namespace\":\"bbb\"}","\"base\":{\"version\":\"v1\",\"protocol\":\"HTTP\",\"url\":\"/iui/component\",\"enable_ssl\":\"false\",\"is_manual\":\"true\",\"status\":\"1\"}","\"lb\":{\"lb_policy\":\"\"}","\"labels\":{\"visualRange\":\"1\"}"],"br-engine":["\"base\":{\"version\":\"v1\",\"protocol\":\"HTTP\",\"url\":\"/br-engine/v1\",\"enable_ssl\":\"false\",\"is_manual\":\"false\",\"status\":\"1\",\"ha_role\":\"active\"}","\"lb\":{\"lb_policy\":\"\"}","\"labels\":{\"visualRange\":\"0|1\"}"]} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-standalone/pom.xml b/apiroute/apiroute-standalone/pom.xml
index eac7c60..d304385 100644
--- a/msb-core/apiroute/apiroute-standalone/pom.xml
+++ b/apiroute/apiroute-standalone/pom.xml
@@ -1,57 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
-
- Copyright 2016 ZTE Corporation.
-
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
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
-
+
+ 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
+
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
- <groupId>org.openo.common-services.microservice-bus</groupId>
+ <groupId>org.onap.msb.apigateway.apiroute</groupId>
<artifactId>apiroute-parent</artifactId>
- <version>1.1.0-SNAPSHOT</version>
+ <version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
+ <groupId>org.onap.msb.apigateway.apiroute</groupId>
<artifactId>apiroute-standalone</artifactId>
- <name>common-services-microservice-bus/msb-core/apiroute/apiroute-standalone</name>
+ <name>onap/msb/apigateway/apiroute/apiroute-standalone</name>
<packaging>pom</packaging>
- <version>1.1.0-SNAPSHOT</version>
+ <version>0.0.1-SNAPSHOT</version>
<properties>
- <packageid>apiroute-standalone</packageid>
+ <packageid>apiroute</packageid>
<outputdir>target/assembly/</outputdir>
</properties>
<dependencies>
<dependency>
- <groupId>org.openo.common-services.microservice-bus</groupId>
+ <groupId>org.onap.msb.apigateway.apiroute</groupId>
<artifactId>apiroute-service</artifactId>
<version>${project.version}</version>
<optional>true</optional>
</dependency>
- </dependencies>
+ </dependencies>
<build>
-
- <plugins>
+
+ <plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
- <id>copy-resources</id>
+ <id>copy-resources</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
@@ -59,14 +56,14 @@
<configuration>
<outputDirectory>${outputdir}</outputDirectory>
<includeEmptyDirs>true</includeEmptyDirs>
- <resources>
+ <resources>
<resource>
- <directory>src/assembly/resource/</directory>
+ <directory>src/assembly/resources/</directory>
<filtering>false</filtering>
<includes>
<include>**/*</include>
</includes>
- </resource>
+ </resource>
</resources>
<overwrite>true</overwrite>
</configuration>
@@ -77,7 +74,7 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
- <executions>
+ <executions>
<execution>
<id>copy-jar</id>
<goals>
@@ -87,19 +84,19 @@
<configuration>
<artifactItems>
<artifactItem>
- <groupId>org.openo.common-services.microservice-bus</groupId>
+ <groupId>org.onap.msb.apigateway.apiroute</groupId>
<artifactId>apiroute-service</artifactId>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>${outputdir}/apiroute/</outputDirectory>
<destFileName>apiroute-service.jar</destFileName>
- </artifactItem>
+ </artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
-
+
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
@@ -116,7 +113,6 @@
<zipfileset dir="target/assembly/" includes="**"/>
</zip>
<attachartifact file="target/${packageid}-${project.version}.zip" type="zip"/>
-
</target>
</configuration>
</execution>
@@ -126,3 +122,4 @@
</build>
</project>
+
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/conf/apiroute.yml b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/conf/apiroute.yml
new file mode 100644
index 0000000..04c3531
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/conf/apiroute.yml
@@ -0,0 +1,47 @@
+defaultWorkspace: ../apiroute-works
+
+defaultName: ${DW_DEFAULT_NAME:-Stranger}
+
+
+# use the discover config if you want to monitor a discover service and register microservices change
+discoverInfo:
+ ip: 127.0.0.1
+ port: 10081
+ enabled: true
+
+
+# use the simple server factory if you only want to run on a single port
+server:
+ type: simple
+ rootPath: '/api/microservices/v1/*'
+ applicationContextPath: /
+ adminContextPath: /admin
+ connector:
+ type: http
+ port: 8066
+
+# Logging settings.
+logging:
+
+ # The default level of all loggers. Can be OFF, ERROR, WARN, INFO, DEBUG, TRACE, or ALL.
+ level: ALL
+
+ # Logger-specific levels.
+ loggers:
+
+ # Sets the level for 'com.example.app' to DEBUG.
+ com.example: DEBUG
+
+ appenders:
+ - type: console
+ threshold: WARN
+ timeZone: UTC
+ logFormat: "%d{yyyy-MM-dd HH:mm:ss SSS} %-5p [%c][%t] - %m%n"
+ - type: file
+ threshold: INFO
+ logFormat: "%d{yyyy-MM-dd HH:mm:ss SSS} %-5p [%c][%t] - %m%n"
+ currentLogFilename: ../apiroute-works/logs/msb-apiroute.log
+ archivedLogFilenamePattern: ../apiroute-works/logs/zip/msb-apiroute-%d{yyyy-MM-dd}.log.gz
+ archivedFileCount: 7
+ timeZone: UTC
+
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initApiGatewayConfig/initApiGatewayConfig.json b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initApiGatewayConfig/initApiGatewayConfig.json
new file mode 100644
index 0000000..67580e1
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initApiGatewayConfig/initApiGatewayConfig.json
@@ -0,0 +1,3 @@
+{
+ "port" : "80"
+}
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteLabels/initRouteLabelsMatches.json b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteLabels/initRouteLabelsMatches.json
new file mode 100644
index 0000000..44fb07e
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteLabels/initRouteLabelsMatches.json
@@ -0,0 +1,7 @@
+{
+ "namespace":"all",
+ "predefineLabels":
+ {
+ "visualRange" : "0"
+ }
+}
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteLabels/initRouteLabelsMatches.json.sample b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteLabels/initRouteLabelsMatches.json.sample
new file mode 100644
index 0000000..6743912
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteLabels/initRouteLabelsMatches.json.sample
@@ -0,0 +1,12 @@
+{
+ "namespace":"all",
+ "predefineLabels":
+ {
+ "visualRange" : "0",
+ "network_plane_type":""
+ },
+ "customLabels":
+ {
+ "custom-key":"custom-value"
+ }
+}
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteLabels/readme.txt b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteLabels/readme.txt
new file mode 100644
index 0000000..3e95c5c
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteLabels/readme.txt
@@ -0,0 +1,17 @@
+Apigateway can synchronized service informations from the service discovery by configuring filter tag¡£
+Synchronization filter configuration file path£ºapiroute\ext\initRouteLabels\initVisualRangeMatches.json,
+{
+ "namespace":"",
+ "routeLabels":
+ {
+ "visualRange" : "0",
+ "network_plane_type":""
+ }
+}
+namespaceΪÃüÁî¿Õ¼ä¹ýÂËÌõ¼þ£¬ÖµÎª¿ÕÔòºöÂÔ´ËÏî¹ýÂË£¬·ñÔòÖ»ÓзþÎñnamespaceÊôÐÔÓëÌõ¼þÒ»ÖµķþÎñ²Å½øÐÐÏÂÒ»²½µÄ×Ô¶¨Òå±êÇ©Æ¥Åä¡£
+routeLabelsΪ×Ô¶¨Òå±êÇ©£¬Óû§¿É×Ô¶¨Òå¼üÖµ¶ÔÆ¥ÅäÌõ¼þ£¬Ö§³Ö¶àÏîÖµ£¬ÒÔ|·Ö¸ô¡£ÈÎÒ»¸ö±êÇ©µÄÖµÂú×㼴ͬ²½
+µ±Í¬²½·þÎñÐÅϢʱʹÓÃvisualRangeÕâ¸ö±êǩɸѡ£¬È¡Öµ·¶Î§ ϵͳ¼ä:0£¨Ä¬ÈÏ£© ϵͳÄÚ:1£¬ÆäÖÐϵͳ¼ä½«¶Ô·þÎñ·ÓÉ·ÃÎÊ×ö¼øȨ´¦Àí¡£
+
+Èç¹ûÊÇdocker²¿ÊðÊ×Ñ¡ÔÚapigatewayËùÔÚÈÝÆ÷ÅäÖÃenv»·¾³±äÁ¿»ñÈ¡£º
+±äÁ¿Ãû£ºNAMESPACE
+±äÁ¿Ãû£ºROUTE_LABELS ±äÁ¿Öµ¸ñʽ£ºvisualRange£º0; network_plane_type:xx|yy
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteWay/initRouteWay.json b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteWay/initRouteWay.json
new file mode 100644
index 0000000..b6ebf27
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteWay/initRouteWay.json
@@ -0,0 +1,3 @@
+{
+ "routeWay":"ip"
+} \ No newline at end of file
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteWay/readme.txt b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteWay/readme.txt
new file mode 100644
index 0000000..c219550
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initRouteWay/readme.txt
@@ -0,0 +1,5 @@
+Apigateway ·ÓÉ·½Ê½£ºip/domain; ĬÈÏΪip
+
+Èç¹ûÊÇdocker²¿ÊðÊ×Ñ¡ÔÚapigatewayËùÔÚÈÝÆ÷ÅäÖÃenv»·¾³±äÁ¿»ñÈ¡£º
+±äÁ¿Ãû£ºROUTE_WAY ±äÁ¿¿ÉÑ¡Öµ£ºip/domain
+
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initServices/msb.json b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initServices/msb.json
new file mode 100644
index 0000000..c5d526a
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initServices/msb.json
@@ -0,0 +1,31 @@
+[{
+ "serviceName" : "microservices",
+ "version" : "v1",
+ "url" : "/api/microservices/v1",
+ "apiJson" : "/api/microservices/v1/swagger.json",
+ "apiJsonType" : "1",
+ "metricsUrl" : "/admin/metrics",
+ "control" : "1",
+ "status" : "1",
+ "host":"msb",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8066",
+ "weight" : 0
+ }
+ ]
+ },
+ {
+ "serviceName" : "microservices",
+ "url" : "/iui/microservices",
+ "control" : "1",
+ "status" : "1",
+ "host":"msb",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8066",
+ "weight" : 0
+ }
+ ]
+ }
+]
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initServices/readme.txt b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initServices/readme.txt
new file mode 100644
index 0000000..59ef5e4
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initServices/readme.txt
@@ -0,0 +1,63 @@
+########################## initialize default routeInfo to redis ##########################
+
+#when msb is starting, it will automatically read all json files under this folder, and initializes to redis.
+#If the routeInfo is exist, it will be ignored, otherwise it will be saved.
+
+
+# JSON File content must be routeInfo format array like below examples:
+
+# optional:
+# apiJsonType: 1:user-defined json type 0:pre-defined json type
+# control: 0:default 1:readonly 2:hidden
+# status: 0:disabled 1:enabled
+# Tip£ºcontrol¡¢status¡¢weight are non-mandatory
+
+[
+##########################apiRoute example##########################
+
+{
+ "serviceName" : "microservices",
+ "version" : "v1",
+ "url" : "/api/microservices/v1",
+ "apiJson" : "/api/microservices/v1/swagger.json",
+ "apiJsonType" : "1",
+ "metricsUrl" : "/admin/metrics",
+ "control" : "1",
+ "status" : "1",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8086",
+ "weight" : 0
+ }
+ ]
+ },
+
+##########################iuiRoute example##########################
+
+{
+ "serviceName" : "microservices",
+ "url" : "/iui/microservices",
+ "control" : "1",
+ "status" : "1",
+ "servers" : [{
+ "ip" : "127.0.0.1",
+ "port" : "8086",
+ "weight" : 0
+ }
+ ]
+ },
+
+##########################customRoute example##########################
+ {
+ "serviceName" : "/test",
+ "url" : "/test",
+ "control" : "0",
+ "status" : "1",
+ "servers" : [{
+ "ip" : "10.74.56.36",
+ "port" : "8989",
+ "weight" : 0
+ }
+ ]
+ }
+] \ No newline at end of file
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initSwaggerJson/api-doc1.json b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initSwaggerJson/api-doc1.json
new file mode 100644
index 0000000..7c63d7e
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initSwaggerJson/api-doc1.json
@@ -0,0 +1 @@
+{"swagger":"2.0","info":{"version":"1.0.0","title":"Local API Test"},"basePath":"/service","tags":[{"name":"ApiRoute"}],"paths":{"/apiRoute":{"get":{"tags":["ApiRoute"],"summary":"get all ApiRoute ","description":"","operationId":"getApiRoutes","produces":["application/json"],"parameters":[],"responses":{"200":{"description":"successful operation","schema":{"type":"array","items":{"$ref":"#/definitions/ApiRouteInfo"}}}}},"post":{"tags":["ApiRoute"],"summary":"add one ApiRoute ","description":"","operationId":"addApiRoute","produces":["application/json"],"parameters":[{"in":"body","name":"body","description":"ApiRoute Instance Info","required":true,"schema":{"$ref":"#/definitions/ApiRouteInfo"}}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/ApiRouteInfo"}},"500":{"description":"add ApiRoute error "}}}},"/apiRoute/type/{type}/{routeName}/version/{version}":{"get":{"tags":["ApiRoute"],"summary":"get one ApiRoute ","description":"","operationId":"getApiRoute","produces":["application/json"],"parameters":[{"name":"type","in":"path","description":"Route type","required":true,"type":"string","enum":["iui","api"]},{"name":"routeName","in":"path","description":"ApiRoute routeName","required":true,"type":"string"},{"name":"version","in":"path","description":"ApiRoute version","required":true,"type":"string"}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/ApiRouteInfo"}},"500":{"description":"get ApiRoute error "}}},"delete":{"tags":["ApiRoute"],"summary":"delete one ApiRoute by routeName and version","description":"","operationId":"deleteApiRoute","produces":["application/json"],"parameters":[{"name":"type","in":"path","description":"Route type","required":true,"type":"string","enum":["iui","api"]},{"name":"routeName","in":"path","description":"ApiRoute routeName","required":true,"type":"string"},{"name":"version","in":"path","description":"ApiRoute version","required":true,"type":"string"}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/ApiRouteResult"}},"500":{"description":"delete ApiRoute error "}}}},"/apiRoute/{routeName}/version/{version}":{"put":{"tags":["ApiRoute"],"summary":"update one ApiRoute by routeName and version","description":"","operationId":"updateApiRoute","produces":["application/json"],"parameters":[{"name":"routeName","in":"path","description":"ApiRoute routeName","required":true,"type":"string"},{"name":"version","in":"path","description":"ApiRoute version","required":true,"type":"string"},{"in":"body","name":"body","description":"ApiRoute Instance Info","required":true,"schema":{"$ref":"#/definitions/ApiRouteInfo"}}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/ApiRouteResult"}},"500":{"description":"update ApiRoute error "}}}}},"definitions":{"ApiRouteLifeCycle":{"type":"object","properties":{"installPath":{"type":"string"},"startScript":{"type":"string"},"stopScript":{"type":"string"}}},"ApiRouteServer":{"type":"object","properties":{"ip":{"type":"string"},"weight":{"type":"integer","format":"int32"}}},"ApiRouteResult":{"type":"object","properties":{"result":{"type":"string"},"info":{"type":"string"}}},"ApiRouteInfo":{"type":"object","properties":{"routeName":{"type":"string"},"version":{"type":"string"},"url":{"type":"string"},"apiJson":{"type":"string"},"type":{"type":"string"},"servers":{"type":"array","items":{"$ref":"#/definitions/ApiRouteServer"}},"lifeCycle":{"$ref":"#/definitions/ApiRouteLifeCycle"}}}}} \ No newline at end of file
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initSwaggerJson/api-doc2.json b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initSwaggerJson/api-doc2.json
new file mode 100644
index 0000000..eb7c8cd
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initSwaggerJson/api-doc2.json
@@ -0,0 +1 @@
+{"swagger":"2.0","info":{"version":"1.0.0","title":"Local API Test2"},"basePath":"/service","tags":[{"name":"ApiRoute"}],"paths":{"/apiRoute":{"get":{"tags":["ApiRoute"],"summary":"get all ApiRoute ","description":"","operationId":"getApiRoutes","produces":["application/json"],"parameters":[],"responses":{"200":{"description":"successful operation","schema":{"type":"array","items":{"$ref":"#/definitions/ApiRouteInfo"}}}}},"post":{"tags":["ApiRoute"],"summary":"add one ApiRoute ","description":"","operationId":"addApiRoute","produces":["application/json"],"parameters":[{"in":"body","name":"body","description":"ApiRoute Instance Info","required":true,"schema":{"$ref":"#/definitions/ApiRouteInfo"}}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/ApiRouteInfo"}},"500":{"description":"add ApiRoute error "}}}},"/apiRoute/type/{type}/{routeName}/version/{version}":{"get":{"tags":["ApiRoute"],"summary":"get one ApiRoute ","description":"","operationId":"getApiRoute","produces":["application/json"],"parameters":[{"name":"type","in":"path","description":"Route type","required":true,"type":"string","enum":["iui","api"]},{"name":"routeName","in":"path","description":"ApiRoute routeName","required":true,"type":"string"},{"name":"version","in":"path","description":"ApiRoute version","required":true,"type":"string"}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/ApiRouteInfo"}},"500":{"description":"get ApiRoute error "}}},"delete":{"tags":["ApiRoute"],"summary":"delete one ApiRoute by routeName and version","description":"","operationId":"deleteApiRoute","produces":["application/json"],"parameters":[{"name":"type","in":"path","description":"Route type","required":true,"type":"string","enum":["iui","api"]},{"name":"routeName","in":"path","description":"ApiRoute routeName","required":true,"type":"string"},{"name":"version","in":"path","description":"ApiRoute version","required":true,"type":"string"}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/ApiRouteResult"}},"500":{"description":"delete ApiRoute error "}}}},"/apiRoute/{routeName}/version/{version}":{"put":{"tags":["ApiRoute"],"summary":"update one ApiRoute by routeName and version","description":"","operationId":"updateApiRoute","produces":["application/json"],"parameters":[{"name":"routeName","in":"path","description":"ApiRoute routeName","required":true,"type":"string"},{"name":"version","in":"path","description":"ApiRoute version","required":true,"type":"string"},{"in":"body","name":"body","description":"ApiRoute Instance Info","required":true,"schema":{"$ref":"#/definitions/ApiRouteInfo"}}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/ApiRouteResult"}},"500":{"description":"update ApiRoute error "}}}}},"definitions":{"ApiRouteLifeCycle":{"type":"object","properties":{"installPath":{"type":"string"},"startScript":{"type":"string"},"stopScript":{"type":"string"}}},"ApiRouteServer":{"type":"object","properties":{"ip":{"type":"string"},"weight":{"type":"integer","format":"int32"}}},"ApiRouteResult":{"type":"object","properties":{"result":{"type":"string"},"info":{"type":"string"}}},"ApiRouteInfo":{"type":"object","properties":{"routeName":{"type":"string"},"version":{"type":"string"},"url":{"type":"string"},"apiJson":{"type":"string"},"type":{"type":"string"},"servers":{"type":"array","items":{"$ref":"#/definitions/ApiRouteServer"}},"lifeCycle":{"$ref":"#/definitions/ApiRouteLifeCycle"}}}}} \ No newline at end of file
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initUrlRootPath/initUrlRootPath.json b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initUrlRootPath/initUrlRootPath.json
new file mode 100644
index 0000000..9668592
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/initUrlRootPath/initUrlRootPath.json
@@ -0,0 +1,4 @@
+{
+ "iuiRootPath" : "iui",
+ "apiRootPath" : "api"
+}
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/redisConf/redis.properties b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/redisConf/redis.properties
new file mode 100644
index 0000000..939e35b
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/ext/redisConf/redis.properties
@@ -0,0 +1,18 @@
+redis.host=127.0.0.1
+redis.port=6379
+#connectionTimeout
+redis.connectionTimeout=2000
+#redis dbIndex,defaule:0
+redis.db_index=0
+
+#--------------redis pool config--------------
+#maxTotal
+redis.pool.maxTotal=50
+#maxIdle
+redis.pool.maxIdle=30
+#maxWaitMillis:ms
+redis.pool.maxWaitMillis=5000
+#testOnBorrow
+redis.pool.testOnBorrow=false
+#testOnReturn
+redis.pool.testOnReturn=true
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/run.sh b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/run.sh
index 4094bb9..fad6b20 100644
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/run.sh
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/run.sh
@@ -1,12 +1,11 @@
-#!/bin/bash
#
-# Copyright 2016 ZTE Corporation.
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
#
# 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
+# 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,
@@ -14,20 +13,33 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
-#JAVA_HOME="/home/conductortest/jdk1.7/jdk/linux"
+
+#!/bin/sh
DIRNAME=`dirname $0`
RUNHOME=`cd $DIRNAME/; pwd`
echo @RUNHOME@ $RUNHOME
-#JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
-echo @JAVA_HOME@ $JAVA_HOME
+if [ -f "$RUNHOME/setenv.sh" ]; then
+ . "$RUNHOME/setenv.sh"
+else
+echo "can not found $RUNHOME/setenv.sh"
+fi
+
+echo ================== ENV_INFO =============================================
+echo @RUNHOME@ $RUNHOME
+echo @JAVA_HOME@ $JAVA_HOME
+echo @Main_Class@ $Main_Class
+echo @APP_INFO@ $APP_INFO
+echo @Main_JAR@ $Main_JAR
+echo @Main_Conf@ $Main_Conf
+echo ==========================================================================
+
+echo start $APP_INFO ...
+
JAVA="$JAVA_HOME/bin/java"
-echo @JAVA@ $JAVA
+
JAVA_VERSION=`$JAVA -version 2>&1 |awk 'NR==1{ sub(/"/,""); print substr($3,1,3)}'`
echo @JAVA_VERSION@ $JAVA_VERSION
if [ $JAVA_VERSION = "1.8" ]
@@ -36,11 +48,23 @@ then
else
JAVA_OPTS="-Xms16m -Xmx128m -XX:+UseSerialGC -XX:MaxPermSize=64m -XX:NewRatio=2"
fi
-port=8779
+
+JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$RUNHOME/../apiroute-works/logs/dump-msb-$(date +%Y%m%d%H%M%S).hprof"
+port=8777
#JAVA_OPTS="$JAVA_OPTS -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=$port,server=y,suspend=n"
+
+CLASS_PATH="$RUNHOME/:$RUNHOME/$Main_JAR"
+
+echo ================== RUN_INFO =============================================
+echo @JAVA_HOME@ $JAVA_HOME
+echo @JAVA@ $JAVA
echo @JAVA_OPTS@ $JAVA_OPTS
+echo @CLASS_PATH@ $CLASS_PATH
+echo @EXT_DIRS@ $EXT_DIRS
+echo ==========================================================================
+
+echo @JAVA@ $JAVA
+echo @JAVA_CMD@
+"$JAVA" $JAVA_OPTS -classpath "$CLASS_PATH" $Main_Class server "$RUNHOME/$Main_Conf"
-class_path="$RUNHOME/:$RUNHOME/apiroute-service.jar"
-echo @class_path@ $class_path
-"$JAVA" $JAVA_OPTS -classpath "$class_path" org.openo.msb.ApiRouteApp server "$RUNHOME/conf/apiroute.yml"
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/setenv.sh b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/setenv.sh
new file mode 100644
index 0000000..131b734
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/setenv.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+Main_Class="org.onap.msb.apiroute.ApiRouteApp"
+Main_JAR="apiroute-service.jar"
+Main_Conf="conf/apiroute.yml"
+APP_INFO="msb-apiroute-service"
+
+if [ -f "/etc/timezone" ]; then
+ export TZ=`cat /etc/timezone`
+fi \ No newline at end of file
diff --git a/apiroute/apiroute-standalone/src/assembly/resources/apiroute/stop.sh b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/stop.sh
new file mode 100644
index 0000000..3e7d3a1
--- /dev/null
+++ b/apiroute/apiroute-standalone/src/assembly/resources/apiroute/stop.sh
@@ -0,0 +1,59 @@
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+
+#!/bin/sh
+
+DIRNAME=`dirname $0`
+RUNHOME=`cd $DIRNAME/; pwd`
+echo @RUNHOME@ $RUNHOME
+
+
+if [ -f "$RUNHOME/setenv.sh" ]; then
+ . "$RUNHOME/setenv.sh"
+else
+echo "can not found $RUNHOME/setenv.sh"
+fi
+
+
+echo ================== ENV_INFO =============================================
+echo RUNHOME=$RUNHOME
+echo JAVA_BASE=$JAVA_BASE
+echo Main_Class=$Main_Class
+echo APP_INFO=$APP_INFO
+echo ==========================================================================
+
+
+cd $RUNHOME; pwd
+
+function save_app_pid(){
+ app_id=`ps -ef | grep $Main_Class| grep $RUNHOME | grep -v grep | awk '{print $2}'`
+ echo @app_id@ $app_id
+}
+
+function kill_app_process(){
+ ps -p $app_id
+ if [ $? == 0 ]; then
+ kill -9 $app_id
+ fi
+}
+
+save_app_pid;
+echo @C_CMD@ kill -9 $app_id
+kill_app_process;
+
+
+
+
diff --git a/msb-parent/msbparent/pom.xml b/apiroute/pom.xml
index 868de97..4ace2ce 100644
--- a/msb-parent/msbparent/pom.xml
+++ b/apiroute/pom.xml
@@ -1,66 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
-
- Copyright 2016 ZTE Corporation.
-
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
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
-
+
+ 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
+
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
<parent>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>msbparent-lite</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <relativePath>../msbparent-lite</relativePath>
+ <groupId>org.onap.msb.apigateway</groupId>
+ <artifactId>msb-apigateway-parent</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
</parent>
-
- <artifactId>msbparent</artifactId>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.onap.msb.apigateway.apiroute</groupId>
+ <artifactId>apiroute-parent</artifactId>
+ <name>onap/msb/apigateway/apiroute</name>
<packaging>pom</packaging>
- <name>common-services-microservice-bus/msb-parent/msbparent</name>
+ <version>0.0.1-SNAPSHOT</version>
+
+ <modules>
+ <module>apiroute-service</module>
+ <module>apiroute-standalone</module>
+ </modules>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <scm>
- <connection>scm:git:ssh://gerrit.zte.com.cn:29418/paas/wisdom/modeldesign-parent.git</connection>
- <developerConnection>scm:git:ssh://gerrit.zte.com.cn:29418/paas/wisdom/modeldesign-parent.git</developerConnection>
- <tag>HEAD</tag>
+ <!-- Java Versions -->
+ <!-- FIXME: confirm these two are picked by maven-compiler-plugin -->
+ <maven.compiler.source>1.7</maven.compiler.source>
+ <maven.compiler.target>1.7</maven.compiler.target>
+ <java.version.source>${maven.compiler.source}</java.version.source>
+ <java.version.target>${maven.compiler.target}</java.version.target>
- </scm>
+ <!-- Maven plugin versions, in the 'canonical' format -->
+ <maven.antrun.plugin.version>1.8</maven.antrun.plugin.version>
+ <maven.bundle.version>3.0.0</maven.bundle.version>
+ <maven.clean.plugin.version>2.6.1</maven.clean.plugin.version>
+ <maven.compile.plugin.version>3.3</maven.compile.plugin.version>
+ <maven.jar.version>2.6</maven.jar.version>
+ <maven.javadoc.version>2.10.3</maven.javadoc.version>
+ <maven.plugin.version>3.4</maven.plugin.version>
+ <maven.release.version>2.5.2</maven.release.version>
+ <maven.surefire.version>2.18.1</maven.surefire.version>
- <properties>
+ <!-- Maven plugin versions, in random formats -->
+ <checkstyle.version>2.16</checkstyle.version>
+ <compiler.version>${maven.compile.plugin.version}</compiler.version>
+ <enforcer.version>1.4</enforcer.version>
<!-- Supporting Libraries -->
<dropwizard.version>0.8.0</dropwizard.version>
- <swagger.version>1.5.3</swagger.version>
+ <swagger.version>1.5.3</swagger.version>
<jedis.version>2.7.3</jedis.version>
<lombok.version>1.16.4</lombok.version>
<junit.version>4.11</junit.version>
<jetty.version>9.2.9.v20150224</jetty.version>
- <jackson-version>2.5.1</jackson-version>
+ <jackson-version>2.7.9</jackson-version>
<jersey.version>2.16</jersey.version>
- <slf4j.version>1.7.12</slf4j.version>
+ <slf4j.version>1.7.12</slf4j.version>
<logback.version>1.1.3</logback.version>
<httpclient.version>4.5</httpclient.version>
- <powermock.version>1.5.5</powermock.version>
+ <powermock.version>1.5.5</powermock.version>
+ <zenap-dropwizard-ext.version>1.17.10.01</zenap-dropwizard-ext.version>
+ <consul-client.version>0.13.8</consul-client.version>
+ <httpasyncclient.version>4.1.2</httpasyncclient.version>
+ <immutables.value.version>2.4.3</immutables.value.version>
+ <mock-jedis.version>0.4.0</mock-jedis.version>
+ <commons-io.version>1.3.2</commons-io.version>
</properties>
<dependencyManagement>
<dependencies>
-
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>${commons-io.version}</version>
+ </dependency>
<!-- Testing Dependencies -->
<dependency>
<groupId>junit</groupId>
@@ -68,19 +96,26 @@
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>org.powermock</groupId>
- <artifactId>powermock-module-junit4</artifactId>
- <version>${powermock.version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.powermock</groupId>
- <artifactId>powermock-api-mockito</artifactId>
- <version>${powermock.version}</version>
- <scope>test</scope>
- </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module-junit4</artifactId>
+ <version>${powermock.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito</artifactId>
+ <version>${powermock.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.fiftyonred</groupId>
+ <artifactId>mock-jedis</artifactId>
+ <version>${mock-jedis.version}</version>
+ <scope>test</scope>
+ </dependency>
<!-- Supporting Libraries -->
<dependency>
@@ -95,11 +130,12 @@
<version>${dropwizard.version}</version>
</dependency>
+
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-client</artifactId>
<version>${dropwizard.version}</version>
- </dependency>
+ </dependency>
<dependency>
<groupId>io.swagger</groupId>
@@ -112,13 +148,13 @@
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
- </dependency>
+ </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
- <!--jersey-->
+ <!--jersey -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
@@ -135,7 +171,7 @@
<version>${jersey.version}</version>
</dependency>
- <!--jackson-->
+ <!--jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
@@ -144,7 +180,7 @@
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
- <version>${jackson-version}</version>
+ <version>2.7.9.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
@@ -167,7 +203,7 @@
<version>${jackson-version}</version>
</dependency>
- <!--jetty-->
+ <!--jetty -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-io</artifactId>
@@ -223,89 +259,51 @@
<artifactId>jetty-server</artifactId>
<version>${jetty.version}</version>
</dependency>
- <!-- logger-->
+ <!-- logger -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
- </dependency>
+ </dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
- </dependency>
+ </dependency>
+
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
- </dependency>
+ </dependency>
+
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
- </dependencies>
- </dependencyManagement>
-<!-- <reporting>
- <plugins>
- <plugin>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <version>${checkstyle.version}</version>
- </plugin>
-
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>findbugs-maven-plugin</artifactId>
- <version>3.0.1</version>
- <configuration>
- <effort>Max</effort>
- <threshold>Low</threshold>
- <goal>site</goal>
- </configuration>
- </plugin>
-
- </plugins>
- </reporting> -->
+ <dependency>
+ <groupId>com.orbitz.consul</groupId>
+ <artifactId>consul-client</artifactId>
+ <version>${consul-client.version}</version>
+ </dependency>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-report-plugin</artifactId>
- <version>2.19.1</version>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>cobertura-maven-plugin</artifactId>
- <version>2.7</version>
- <configuration>
- <formats>
- <format>xml</format>
- <format>html</format>
- </formats>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jxr-plugin</artifactId>
- <version>2.5</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-pmd-plugin</artifactId>
- <version>3.6</version>
- <configuration>
- <linkXref>true</linkXref>
- <sourceEncoding>utf-8</sourceEncoding>
- <minimumTokens>100</minimumTokens>
- <targetJdk>1.8</targetJdk>
- </configuration>
- </plugin>
- </plugins>
- </build>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpasyncclient</artifactId>
+ <version>${httpasyncclient.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.immutables</groupId>
+ <artifactId>value</artifactId>
+ <version>${immutables.value.version}</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
</project>
diff --git a/build4docker.sh b/build4docker.sh
new file mode 100644
index 0000000..0045272
--- /dev/null
+++ b/build4docker.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+#
+# Copyright 2016 ZTE, Inc. and others.
+#
+# 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.
+#
+
+
+DIRNAME=`dirname $0`
+RUNHOME=`cd $DIRNAME/; pwd`
+echo @RUNHOME@ $RUNHOME
+
+echo @JAVA_HOME@ $JAVA_HOME
+
+#build
+mvn clean install -Dmaven.test.skip=true
+
+#cooy
+RELEASE_BASE_DIR=$RUNHOME/release
+echo @RELEASE_BASE_DIR@ $RELEASE_BASE_DIR
+
+RELEASE_DIR=${RELEASE_BASE_DIR}/msb-apigateway
+rm -rf $RELEASE_DIR
+mkdir $RELEASE_DIR -p
+
+DOCKER_RUN_NAME=msb_apigateway
+DOCKER_IMAGE_NAME=msb_apigateway
+DOCKER_RELEASE_VERSION=latest
+
+cp -r $RUNHOME/distributions/msb-apigateway/target/version/* ${RELEASE_DIR}
+cp $RUNHOME/ci/build_docker_image.sh ${RELEASE_DIR}
+#build docker image
+cd ${RELEASE_DIR}
+chmod 777 build_docker_image.sh
+
+
+docker rm -f ${DOCKER_RUN_NAME}
+docker rmi ${DOCKER_IMAGE_NAME}:${DOCKER_RELEASE_VERSION}
+
+./build_docker_image.sh -n=${DOCKER_IMAGE_NAME} -v=${DOCKER_RELEASE_VERSION} -d=./docker
+
+#docker run
+
+docker run -d --net=host --name ${DOCKER_RUN_NAME} ${DOCKER_IMAGE_NAME}:${DOCKER_RELEASE_VERSION}
+docker ps |grep ${DOCKER_RUN_NAME}
diff --git a/ci/build_docker_image.sh b/ci/build_docker_image.sh
new file mode 100644
index 0000000..7b6b546
--- /dev/null
+++ b/ci/build_docker_image.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+for i in "$@"
+do
+case $i in
+ -n=*|--name=*)
+ NAME="${i#*=}"
+ shift
+ ;;
+ -v=*|--version=*)
+ VERSION="${i#*=}"
+ shift
+ ;;
+ -d=*|--dir=*)
+ DIR="${i#*=}"
+ shift
+ ;;
+esac
+done
+
+if [[ ${NAME} && ${VERSION} && ${DIR} ]]; then
+ echo "assign the x to all files and dirs under current dir.."
+ chmod +x -R .
+ echo "begin to build image ${NAME}.."
+ docker build --no-cache -t ${NAME}:${VERSION} . >/dev/null || { echo -e "\nBuild docker image failed!";exit 1; }
+ docker rmi $(docker images | grep "^<none>" | awk '{print $3}') &>/dev/null
+ docker save -o ${NAME}.tar ${NAME}:${VERSION} >/dev/null || { rm -f ${NAME}.tar &>/dev/null;echo -e "\nSave docker image failed!";exit 1; }
+ if [ ! -d ${DIR} ]; then
+ mkdir -p ${DIR}
+ fi
+ mv ${NAME}.tar ${DIR}/${NAME}.tar &>/dev/null
+ echo "build completes!"
+else
+ echo "not all -n and -v and -d are provided!"
+ exit 1
+fi
diff --git a/distributions/msb-apigateway/pom.xml b/distributions/msb-apigateway/pom.xml
new file mode 100644
index 0000000..0cb4239
--- /dev/null
+++ b/distributions/msb-apigateway/pom.xml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.onap.msb.apigateway.distributions</groupId>
+ <artifactId>distributions-parent</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.onap.msb.apigateway.distributions</groupId>
+ <artifactId>msb-apigateway</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <name>onap/msb/apigateway/distributions/msb-apigateway</name>
+ <packaging>pom</packaging>
+
+ <properties>
+ <packageid>msb-apigateway</packageid>
+ <version.output>target/version</version.output>
+ </properties>
+
+ <profiles>
+ <profile>
+ <id>linux</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <dependencies>
+ <dependency>
+ <groupId>org.onap.msb.apigateway.apiroute</groupId>
+ <artifactId>apiroute-standalone</artifactId>
+ <type>zip</type>
+ <version>${project.version}</version>
+ <optional>true</optional>
+ </dependency>
+
+
+ <dependency>
+ <groupId>org.onap.msb.apigateway</groupId>
+ <artifactId>redis-ext</artifactId>
+ <type>tar.gz</type>
+ <classifier>${classifier.linux64}</classifier>
+ <version>${project.version}</version>
+ <optional>true</optional>
+ </dependency>
+
+ <dependency>
+ <groupId>org.onap.msb.apigateway</groupId>
+ <artifactId>openresty-ext</artifactId>
+ <type>tar.gz</type>
+ <classifier>${classifier.linux64}</classifier>
+ <version>${project.version}</version>
+ <optional>true</optional>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>unpacktolinux64</id>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <phase>prepare-package</phase>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.onap.msb.apigateway.apiroute</groupId>
+ <artifactId>apiroute-standalone</artifactId>
+ <type>zip</type>
+ </artifactItem>
+ <artifactItem>
+ <groupId>org.onap.msb.apigateway</groupId>
+ <artifactId>redis-ext</artifactId>
+ <type>tar.gz</type>
+ <classifier>${classifier.linux64}</classifier>
+ </artifactItem>
+ <artifactItem>
+ <groupId>org.onap.msb.apigateway</groupId>
+ <artifactId>openresty-ext</artifactId>
+ <type>tar.gz</type>
+ <classifier>${classifier.linux64}</classifier>
+ </artifactItem>
+ </artifactItems>
+ <excludes>**/*.bat,**/*.cmd,**/*.exe</excludes>
+ <outputDirectory>${linux64outputdir}</outputDirectory>
+ <overWriteReleases>false</overWriteReleases>
+ <overWriteSnapshots>true</overWriteSnapshots>
+ <outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-msb-resources-linux</id>
+ <phase>prepare-package</phase>
+ <goals>
+ <goal>copy-resources</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>${linux64outputdir}</outputDirectory>
+ <includeEmptyDirs>true</includeEmptyDirs>
+ <resources>
+ <resource>
+ <directory>src/assembly/resources/</directory>
+ <filtering>false</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ <excludes>
+ <exclude>**/*.bat</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <overwrite>true</overwrite>
+ </configuration>
+ </execution>
+ <execution>
+ <id>copy-resources-dockerfile</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy-resources</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>${version.output}</outputDirectory>
+ <includeEmptyDirs>true</includeEmptyDirs>
+ <resources>
+ <resource>
+ <directory>${dockerFileDir}</directory>
+ <filtering>false</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ </resources>
+ <overwrite>true</overwrite>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>distribution</id>
+ <phase>package</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <target name="distribution">
+
+ <tstamp>
+ <format property="last.updated" pattern="yyyy-MM-dd HH:mm:ss"/>
+ </tstamp>
+ <echo file="${linux64outputdir}/msb.version.properties" message="build.time=${last.updated}${line.separator}build.version=${project.version}"/>
+ <tar destfile="${version.output}/${packageid}-${project.version}-${classifier.linux64}.tar.gz" longfile="posix" compression="gzip">
+ <tarfileset dir="${linux64outputdir}" prefix="${packageid}" filemode="0644" dirmode="0755">
+ <exclude name="**/*.sh"/>
+ <exclude name="openresty/nginx/sbin/nginx"/>
+ <exclude name="redis/redis-*"/>
+ </tarfileset>
+ <tarfileset dir="${linux64outputdir}" prefix="${packageid}" filemode="0755" dirmode="0755">
+ <include name="**/*.sh"/>
+ <include name="openresty/nginx/sbin/nginx"/>
+ <include name="redis/redis-*"/>
+ </tarfileset>
+ </tar>
+ </target>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+
+ </plugins>
+ </build>
+ </profile>
+
+ </profiles>
+
+</project>
+
diff --git a/msb-core/distributions/standalone/src/assembly/resource/stop.sh b/distributions/msb-apigateway/src/assembly/resources/shutdown.sh
index b7c570b..b36bb43 100644
--- a/msb-core/distributions/standalone/src/assembly/resource/stop.sh
+++ b/distributions/msb-apigateway/src/assembly/resources/shutdown.sh
@@ -1,12 +1,11 @@
-#!/bin/sh
#
-# Copyright 2016 ZTE Corporation.
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
#
# 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
+# 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,
@@ -14,26 +13,19 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
+#!/bin/sh
DIRNAME=`dirname $0`
RUNHOME=`cd $DIRNAME/; pwd`
echo @RUNHOME@ $RUNHOME
+
echo "### Stopping openresty...";
# nohup ./startup.sh >>./nohup.log 2>&1 &
cd ./openresty
./stop.sh &
cd $RUNHOME
-echo "### Stopping external API gateway...";
-# nohup ./startup.sh >>./nohup.log 2>&1 &
-cd ./eag
-./stop.sh &
-cd $RUNHOME
-
echo "\n\n### Stopping apiroute"
cd ./apiroute
./stop.sh &
diff --git a/msb-core/distributions/standalone/src/assembly/resource/startup.sh b/distributions/msb-apigateway/src/assembly/resources/startup.sh
index aa4117d..5a19128 100644
--- a/msb-core/distributions/standalone/src/assembly/resource/startup.sh
+++ b/distributions/msb-apigateway/src/assembly/resources/startup.sh
@@ -1,12 +1,11 @@
-#!/bin/sh
#
-# Copyright 2016 ZTE Corporation.
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
#
# 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
+# 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,
@@ -14,41 +13,32 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
+
+#!/bin/sh
DIRNAME=`dirname $0`
RUNHOME=`cd $DIRNAME/; pwd`
echo @RUNHOME@ $RUNHOME
echo "### Starting redis";
-#nohup ./wso2bps/bin/wso2server.sh >>./OpenTOSCA/nohup.log 2>&1 &
cd ./redis
./run.sh &
cd $RUNHOME
-
-echo "\n\n### Starting apiroute"
-cd ./apiroute
-./run.sh &
-cd $RUNHOME
-
-
echo "### Starting openresty...";
# nohup ./startup.sh >>./nohup.log 2>&1 &
cd ./openresty
./run.sh &
cd $RUNHOME
-echo "### Starting external API gateway...";
-# nohup ./startup.sh >>./nohup.log 2>&1 &
-cd ./eag
-./run.sh &
+echo "\n\n### Starting apiroute"
+cd ./apiroute
+./run.sh
cd $RUNHOME
+
echo "Startup will be finished in background...";
echo " + Run 'tail ./apiroute-works/logs/application.log -f' to see what's happening";
echo " + Wait a minute";
echo " + Open 'http://<HOST>' in your browser to access the microservice bus
-stem";
+stem"; \ No newline at end of file
diff --git a/distributions/msb-apigateway/src/assembly/resources/startup4docker.sh b/distributions/msb-apigateway/src/assembly/resources/startup4docker.sh
new file mode 100644
index 0000000..b1dcb78
--- /dev/null
+++ b/distributions/msb-apigateway/src/assembly/resources/startup4docker.sh
@@ -0,0 +1,36 @@
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+
+#!/bin/sh
+DIRNAME=`dirname $0`
+RUNHOME=`cd $DIRNAME/; pwd`
+echo @RUNHOME@ $RUNHOME
+
+
+
+echo "### Starting redis";
+cd ./redis
+./run.sh
+cd $RUNHOME
+
+echo "\n\n### Starting openresty";
+cd ./openresty
+./run.sh
+cd $RUNHOME
+
+echo "\n\n### Starting apiroute"
+cd ./apiroute
+./run.sh \ No newline at end of file
diff --git a/distributions/msb-apigateway/src/main/docker/Dockerfile b/distributions/msb-apigateway/src/main/docker/Dockerfile
new file mode 100644
index 0000000..14e0b15
--- /dev/null
+++ b/distributions/msb-apigateway/src/main/docker/Dockerfile
@@ -0,0 +1,6 @@
+FROM openjdk:8.0.72
+ADD msb-apigateway*.tar.gz /opt/application
+
+ENV LD_LIBRARY_PATH /lib64
+WORKDIR /opt/application/msb-apigateway
+ENTRYPOINT exec $PWD/startup4docker.sh \ No newline at end of file
diff --git a/distributions/pom.xml b/distributions/pom.xml
new file mode 100644
index 0000000..90a70b3
--- /dev/null
+++ b/distributions/pom.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.onap.msb.apigateway</groupId>
+ <artifactId>msb-apigateway-parent</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.onap.msb.apigateway.distributions</groupId>
+ <artifactId>distributions-parent</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <name>onap/msb/apigateway/distributions</name>
+ <packaging>pom</packaging>
+ <modules>
+ <module>msb-apigateway</module>
+ </modules>
+
+
+ <properties>
+ <version.output>target/version</version.output>
+ <dockerFileDir>src/main/docker</dockerFileDir>
+ <blueprintFileDir>src/main/blueprint</blueprintFileDir>
+ </properties>
+
+</project>
+
diff --git a/msb-core/apiroute/apiroute-service/pom.xml b/msb-core/apiroute/apiroute-service/pom.xml
deleted file mode 100644
index 48e613c..0000000
--- a/msb-core/apiroute/apiroute-service/pom.xml
+++ /dev/null
@@ -1,165 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>apiroute-parent</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>apiroute-service</artifactId>
- <name>common-services-microservice-bus/msb-core/apiroute/apiroute-service</name>
- <packaging>jar</packaging>
- <version>1.1.0-SNAPSHOT</version>
-
-
- <dependencies>
- <dependency>
- <groupId>io.dropwizard</groupId>
- <artifactId>dropwizard-core</artifactId>
- </dependency>
- <dependency>
- <groupId>io.dropwizard</groupId>
- <artifactId>dropwizard-assets</artifactId>
- </dependency>
- <dependency>
- <groupId>io.dropwizard</groupId>
- <artifactId>dropwizard-client</artifactId>
- </dependency>
- <dependency>
- <groupId>io.swagger</groupId>
- <artifactId>swagger-jersey2-jaxrs</artifactId>
- <scope>compile</scope>
- </dependency>
- <!-- add by wangyg:增åŠ redisçš„java客户端jedisä¾Âèµ– -->
- <dependency>
- <groupId>redis.clients</groupId>
- <artifactId>jedis</artifactId>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
- <dependency>
- <groupId>net.sf.json-lib</groupId>
- <artifactId>json-lib</artifactId>
- <version>2.4</version>
- <classifier>jdk15</classifier>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <version>2.4</version>
- <configuration>
- <archive>
- <manifest>
- <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
- </manifest>
- </archive>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <version>2.3</version>
- <configuration>
- <createDependencyReducedPom>true</createDependencyReducedPom>
- <filters>
- <filter>
- <artifact>*:*</artifact>
- <excludes>
- <exclude>META-INF/*.SF</exclude>
- <exclude>META-INF/*.DSA</exclude>
- <exclude>META-INF/*.RSA</exclude>
- </excludes>
- </filter>
- </filters>
- </configuration>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <transformers>
- <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
- <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
- <mainClass>org.openo.msb.ApiRouteApp</mainClass>
- </transformer>
- </transformers>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <!--plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <id>copy-dependencies</id>
- <phase>package</phase>
- <goals>
- <goal>copy-dependencies</goal>
- </goals>
- <configuration>
- <artifactItems>
- <artifactItem>
- <groupId>io.dropwizard</groupId>
- <artifactId>dropwizard-core</artifactId>
- <version>${dropwizard.version}</version>
- <overWrite>true</overWrite>
- </artifactItem>
- </artifactItems>
- </configuration>
- </execution>
- </executions>
- </plugin-->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <configuration>
- <skip>true</skip>
- </configuration>
- </plugin>
- </plugins>
- <resources>
- <resource>
- <directory>src/main/java</directory>
- <includes>
- <include>**/*.properties</include>
- </includes>
- </resource>
- <resource>
- <directory>src/main/resources</directory>
- </resource>
- </resources>
- </build>
-</project>
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java
deleted file mode 100644
index e5a6394..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java
+++ /dev/null
@@ -1,549 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb;
-
-import io.dropwizard.Application;
-import io.dropwizard.assets.AssetsBundle;
-import io.dropwizard.jetty.HttpConnectorFactory;
-import io.dropwizard.server.SimpleServerFactory;
-import io.dropwizard.setup.Bootstrap;
-import io.dropwizard.setup.Environment;
-import io.swagger.jaxrs.config.BeanConfig;
-import io.swagger.jaxrs.listing.ApiListingResource;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.net.URL;
-import java.util.List;
-
-import net.sf.json.JSONObject;
-
-import org.apache.commons.lang3.StringUtils;
-import org.openo.msb.api.ApiRouteInfo;
-import org.openo.msb.api.ConsulInfo;
-import org.openo.msb.api.CustomRouteInfo;
-import org.openo.msb.api.DiscoverInfo;
-import org.openo.msb.api.IuiRouteInfo;
-import org.openo.msb.api.RouteServer;
-import org.openo.msb.api.exception.ExtendedNotFoundException;
-import org.openo.msb.health.ApiRouteHealthCheck;
-import org.openo.msb.resources.ApiRouteResource;
-import org.openo.msb.resources.CustomRouteResource;
-import org.openo.msb.resources.IuiRouteResource;
-import org.openo.msb.resources.MetricsResource;
-import org.openo.msb.resources.MicroServiceResource;
-import org.openo.msb.resources.ServiceAccessResource;
-import org.openo.msb.wrapper.ApiRouteServiceWrapper;
-import org.openo.msb.wrapper.CustomRouteServiceWrapper;
-import org.openo.msb.wrapper.IuiRouteServiceWrapper;
-import org.openo.msb.wrapper.serviceListener.MicroServiceChangeListener;
-import org.openo.msb.wrapper.util.FileUtil;
-import org.openo.msb.wrapper.util.JacksonJsonUtil;
-import org.openo.msb.wrapper.util.JedisUtil;
-import org.openo.msb.wrapper.util.MetricsUtil;
-import org.openo.msb.wrapper.util.MicroServiceDB;
-import org.openo.msb.wrapper.util.RegExpTestUtil;
-import org.openo.msb.wrapper.util.RouteUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-
-public class ApiRouteApp extends Application<ApiRouteAppConfig> {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ApiRouteApp.class);
-
- public static void main(String[] args) throws Exception {
- new ApiRouteApp().run(args);
-
- }
-
- private ApiRouteAppConfig config;
-
- @Override
- public String getName() {
- return " MicroService Bus ";
- }
-
- @Override
- public void initialize(Bootstrap<ApiRouteAppConfig> bootstrap) {
-
-
- }
-
- @Override
- public void run(ApiRouteAppConfig configuration, Environment environment) {
-
- initRootPath();
-
-
- new AssetsBundle("/iui-metrics", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices/metrics",
- "index.html", "iui-metrics").run(environment);
-
- new AssetsBundle("/iui-route", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices", "index.html",
- "iui-microservices").run(environment);
-
- new AssetsBundle("/api-doc", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices/api-doc",
- "index.html", "api-doc").run(environment);
-
- new AssetsBundle("/ext", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices/ext",
- "index.html", "ext").run(environment);
-
-
-
-
- final ApiRouteHealthCheck healthCheck =
- new ApiRouteHealthCheck(configuration.getDefaultWorkspace());
- environment.healthChecks().register("template", healthCheck);
- environment.jersey().register(new ApiRouteResource());
- environment.jersey().register(new IuiRouteResource());
- environment.jersey().register(new MetricsResource());
- environment.jersey().register(new CustomRouteResource());
- environment.jersey().register(new ServiceAccessResource());
- environment.jersey().register(new MicroServiceResource());
-
- config = configuration;
-
- initSwaggerConfig(environment, configuration);
- initRedisConfig(configuration);
- checkRedisConnect();
- initMetricsConfig(configuration);
- initVisualRangeMatches();
-
- registerServiceChangeListener();
-
-
- }
-
- private void initMetricsConfig(ApiRouteAppConfig configuration) {
-
- SimpleServerFactory simpleServerFactory =
- (SimpleServerFactory) configuration.getServerFactory();
- HttpConnectorFactory httpConnectorFactory =
- (HttpConnectorFactory) simpleServerFactory.getConnector();
- MetricsUtil.adminContextPath =
- "http://127.0.0.1:" + httpConnectorFactory.getPort()
- + simpleServerFactory.getAdminContextPath() + "/metrics";
- }
-
- private void initSwaggerConfig(Environment environment, ApiRouteAppConfig configuration) {
-
- environment.jersey().register(new ApiListingResource());
- environment.getObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
-
- BeanConfig config = new BeanConfig();
- config.setTitle("MicroService Bus rest API");
- config.setVersion("1.0.0");
- config.setResourcePackage("org.openo.msb.resources");
- SimpleServerFactory simpleServerFactory =
- (SimpleServerFactory) configuration.getServerFactory();
- String basePath = simpleServerFactory.getApplicationContextPath();
- String rootPath = simpleServerFactory.getJerseyRootPath();
-
- rootPath = rootPath.substring(0, rootPath.indexOf("/*"));
-
- basePath =
- basePath.equals("/") ? rootPath : (new StringBuilder()).append(basePath)
- .append(rootPath).toString();
-
- LOGGER.info("getApplicationContextPath: " + basePath);
- config.setBasePath(basePath);
- config.setScan(true);
- }
-
-
- private void initRootPath(){
- try {
-
- URL urlRootPath = ApiRouteApp.class.getResource("/ext/initUrlRootPath/initUrlRootPath.json");
- if (urlRootPath != null) {
- String path = urlRootPath.getPath();
-
- LOGGER.info("read initUrlRootPath:" + path);
-
- String fileContent = FileUtil.readFile(path);
- JSONObject jsonObj = JSONObject.fromObject(fileContent);
- RouteUtil.IUI_ROOT_PATH=jsonObj.get("iuiRootPath").toString();
- RouteUtil.API_ROOT_PATH=jsonObj.get("apiRootPath").toString();
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- LOGGER.error("read initUrlRootPath Files throw exception", e);
- }
-
- }
- private void initRedisConfig(ApiRouteAppConfig configuration) {
-
- String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
- String jarPath = path.substring(0, path.lastIndexOf("/"));
-
- LOGGER.info("jarpath: " + jarPath);
- LOGGER.info("getDefaultWorkspace " + configuration.getDefaultWorkspace());
-
- String confDir =
- jarPath + "/" + configuration.getDefaultWorkspace() + "/"
- + configuration.getPropertiesDir();
- String propertiesPath = confDir + "/" + configuration.getPropertiesName();
-
- JedisUtil.propertiesPath = propertiesPath;
-
- LOGGER.info("propertiesPath: " + propertiesPath);
- LOGGER.info("confDir: " + confDir);
-
- try {
- File dirFile = new File(confDir);
-
- if (!dirFile.exists()) {
- dirFile.mkdirs();
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- LOGGER.info("create RedisConfig confDir error: " + confDir + e.getMessage());
- }
-
-
- try {
- File propertiesFile = new File(propertiesPath);
- if (!propertiesFile.exists()) {
-
-
- propertiesFile.createNewFile();
-
- BufferedWriter output = new BufferedWriter(new FileWriter(propertiesFile));
- StringBuilder contentBuilder = new StringBuilder();
- contentBuilder.append("redis.host=127.0.0.1\n").append("redis.port=6379\n")
- .append("#connectionTimeout\n").append("redis.connectionTimeout=2000\n")
- .append("#redis dbIndex,defaule:0\n")
- .append("redis.db_index=0\n\n")
- .append("#--------------redis pool config--------------\n")
- .append("#maxTotal\n").append("redis.pool.maxTotal=100\n")
- .append("#maxIdle\n").append("redis.pool.maxIdle=20\n")
- .append("#maxWaitMillis:ms\n")
- .append("redis.pool.maxWaitMillis=1000\n")
- .append("#testOnBorrow\n")
- .append("redis.pool.testOnBorrow=false\n")
- .append("#testOnReturn\n")
- .append("redis.pool.testOnReturn=true\n")
- .append("#nginx Port\n").append("server.port=10080\n");
-
- output.write(contentBuilder.toString());
- output.close();
-
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- LOGGER.info("create RedisConfig File error: " + propertiesPath + e.getMessage());
- }
- }
-
-
- private void checkRedisConnect() {
-
- new Thread(new Runnable() {
- public void run() {
- int n = 0;
- while (true) {
- if (ApiRouteServiceWrapper.checkRedisConnect() == false) {
- n++;
- System.out.println(n
- + "/10 : Initial Route Configuration——redis connection fail...");
-
- try {
- Thread.sleep(10000);
- } catch (InterruptedException e) {
- LOGGER.error("Thread.sleep throw except:"+e.getMessage());
- }
-
-
- if (n >= 10) {
- System.out.println("Initial Route Configuration fail,timeout exit");
- LOGGER.error("Initial Route Configuration——redis connection fail,timeout exit...");
- break;
- }
- } else {
- System.out.println("starting to initial Route Configuration");
- // initRouteInfoFromConfig();
- initRouteInfoFromJson();
- System.out.println("starting to initial consul Configuration");
- runConsulClientApp();
-
- break;
- }
- }
-
- }
- }).start();
- }
-
-
-
-
- /**
- * @Title: initVisualRangeMatches
- * @Description: TODO(According to the environment variable or a JSON file configuration initialization VisualRange filter conditions)
- * @return: void
- */
- private void initVisualRangeMatches(){
- try {
- if(System.getenv("APIGATEWAY_VISUAL_RANGE")==null)
- {
-
- URL visualRangePath = ApiRouteApp.class.getResource("/ext/initVisualRange/initVisualRangeMatches.json");
- if (visualRangePath != null) {
- String path = visualRangePath.getPath();
-
- LOGGER.info("read initVisualRangeMatches:" + path);
-
- String fileContent = FileUtil.readFile(path);
- JSONObject jsonObj = JSONObject.fromObject(fileContent);
- String visualRangeArray=jsonObj.get("visualRange").toString();
-
-
- RouteUtil.visualRangeMatches=StringUtils.split(visualRangeArray, ",");
-
-
-
- }
- }
- else{
- RouteUtil.visualRangeMatches=StringUtils.split(System.getenv("APIGATEWAY_VISUAL_RANGE"), ",");
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- LOGGER.error("read initVisualRangeMatches Files or env(APIGATEWAY_VISUAL_RANGE) throw exception", e);
- }
- }
-
- /**
- * @Title: initRouteInfoFromJson
- * @Description: TODO(按照JSON文件é…ç½®åˆå§‹åŒ–routeæ•°æ®)
- * @return: void
- */
- private void initRouteInfoFromJson() {
-
- URL apiDocsPath = ApiRouteApp.class.getResource("/ext/initServices");
- if (apiDocsPath != null) {
- String path = apiDocsPath.getPath();
-
- LOGGER.info("read JsonFilefolder:" + path);
-
- try {
- File[] files = FileUtil.readFileFolder(path);
- for (int i = 0; i < files.length; i++) {
- File file = files[i];
- if (file.isFile() && file.getName().endsWith(".json")) {
- LOGGER.info("read JsonFile:" + file.getPath());
- String fileContent = FileUtil.readFile(file.getPath());
- saveInitService2redis(fileContent);
- } else {
- LOGGER.warn(file.getName() + " is not a right file");
- }
- }
-
-
-
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- LOGGER.error("read initServices Files throw FileNotFoundException", e);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- LOGGER.error("read initServices Files throw IOexception", e);
- }
-
- }
-
-
-
- }
-
-
-
- private void saveInitService2redis(String fileContent) {
- try {
- List<ApiRouteInfo> routeList =
- (List<ApiRouteInfo>) JacksonJsonUtil.jsonToListBean(fileContent);
- for (ApiRouteInfo route : routeList) {
- String url = route.getUrl();
-
- if (RegExpTestUtil.urlRegExpTest(route.getServiceName())) {
-
- try{
- CustomRouteInfo dbCustomRoute =
- CustomRouteServiceWrapper.getInstance().getCustomRouteInstance(
- route.getServiceName());
- }
- catch(ExtendedNotFoundException e){
-
- LOGGER.info("initCustomRoute: ServiceName--" + route.getServiceName());
-
- CustomRouteInfo customRouteInfo = new CustomRouteInfo();
- customRouteInfo.setControl(route.getControl());
- customRouteInfo.setServers(route.getServers());
- customRouteInfo.setServiceName(route.getServiceName());
- customRouteInfo.setStatus(route.getStatus());
- customRouteInfo.setUrl(route.getUrl());
-
-
- CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(
- customRouteInfo, "");
-
-
- }
- } else {
-
- if (RegExpTestUtil.apiRouteUrlRegExpTest(url) || url.startsWith("/api/microservices/")) {
-
-
- try{
- ApiRouteInfo dbApiRoute =
- ApiRouteServiceWrapper.getInstance().getApiRouteInstance(
- route.getServiceName(), route.getVersion());
- }
- catch(ExtendedNotFoundException e){
- LOGGER.info("initapiRoute: ServiceName--" + route.getServiceName());
- ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(route, "");
- }
-
-
- } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(url) || url.equals("/iui/microservices")) {
-
- try{
- IuiRouteInfo dbIuiRoute =
- IuiRouteServiceWrapper.getInstance().getIuiRouteInstance(
- route.getServiceName());
- }
- catch(ExtendedNotFoundException e){
-
- LOGGER.info(" initiuiRoute: ServiceName--" + route.getServiceName());
- IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
- iuiRouteInfo.setControl(route.getControl());
- iuiRouteInfo.setServers(route.getServers());
- iuiRouteInfo.setServiceName(route.getServiceName());
- iuiRouteInfo.setStatus(route.getStatus());
-
- if(url.equals("/iui/microservices")){
- iuiRouteInfo.setUrl("/"+RouteUtil.IUI_ROOT_PATH+"/microservices");
- }
- else{
- iuiRouteInfo.setUrl(route.getUrl());
- }
-
- IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);
-
- }
-
- } else {
- LOGGER.error("init Service throw exception——serviceName: " + route.getServiceName()+",url:"+url);
- }
- }
-
-
-
- }
-
- } catch (Exception e) {
- // TODO Auto-generated catch block
- LOGGER.error("read initServices Files throw exception", e);
- }
-
- }
-
-
-
- /**
- * The listener registration service changes
- */
- private void registerServiceChangeListener() {
- MicroServiceDB.getInstance().addServiceChangeListener(new MicroServiceChangeListener());
- }
-
- // Open the consul to monitor subscription service
- private void runConsulClientApp() {
- DiscoverInfo config_discoverInfo = config.getDiscoverInfo();
-
- ConsulInfo config_consulInfo=config.getConsulInfo();
-
- RouteUtil.discoverInfo.setEnabled(config_discoverInfo.isEnabled());
-
- if (config_discoverInfo.isEnabled()) {
- try{
- if(System.getenv("SDCLIENT_SVC_PORT")==null)
- {
- //yml
- RouteUtil.discoverInfo.setIp(config_discoverInfo.getIp());
- RouteUtil.discoverInfo.setPort(config_discoverInfo.getPort());
-
- }
- else{
-
- String discoverAddress=System.getenv("SDCLIENT_SVC_PORT").split("//")[1];
- String sdIP=discoverAddress.split(":")[0];
- int sdPort=Integer
- .parseInt(discoverAddress.split(":")[1]);
-
- RouteUtil.discoverInfo.setIp(sdIP);
- RouteUtil.discoverInfo.setPort(sdPort);
-
- config_consulInfo.setIp(sdIP);
- config_consulInfo.setPort(sdPort);
-
-
- }
-
-
-
- //Registration service discovery routing
- //api
- ApiRouteInfo discoverApiService=new ApiRouteInfo();
- discoverApiService.setServiceName("msdiscover");
- discoverApiService.setUrl("/api/microservices/v1");
- discoverApiService.setVersion("v1");
- discoverApiService.setMetricsUrl("/admin/metrics");
- discoverApiService.setApiJson("/api/microservices/v1/swagger.json");
-
- RouteServer[] servers=new RouteServer[1];
- servers[0]=new RouteServer(RouteUtil.discoverInfo.getIp(),String.valueOf(RouteUtil.discoverInfo.getPort()));
- discoverApiService.setServers(servers);
-
- ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(discoverApiService, "");
-
- //iui
- IuiRouteInfo discoverIUIService=new IuiRouteInfo();
- discoverIUIService.setServiceName("msdiscover");
- discoverIUIService.setUrl("/iui/microservices");
- discoverIUIService.setServers(servers);
- IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(discoverIUIService);
-
-
-
- ConsulClientApp consulClientApp = new ConsulClientApp(config_consulInfo.getIp(), config_consulInfo.getPort());
- // Monitor service change
- consulClientApp.startServiceListen();
- LOGGER.info("start monitor consul service--" +config_consulInfo.getIp() + ":"
- + config_consulInfo.getPort());
- }
- catch(Exception e){
- LOGGER.error("start monitor consul service fail:"+e.getMessage());
- }
- }
-
-
- }
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ConsulClientApp.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ConsulClientApp.java
deleted file mode 100644
index 4d83a6d..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/ConsulClientApp.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.apache.commons.lang3.StringUtils;
-import org.openo.msb.api.MicroServiceFullInfo;
-import org.openo.msb.api.MicroServiceInfo;
-import org.openo.msb.api.Node;
-import org.openo.msb.wrapper.MicroServiceWrapper;
-import org.openo.msb.wrapper.consul.CatalogClient;
-import org.openo.msb.wrapper.consul.Consul;
-import org.openo.msb.wrapper.consul.HealthClient;
-import org.openo.msb.wrapper.consul.cache.CatalogCache;
-import org.openo.msb.wrapper.consul.cache.ConsulCache;
-import org.openo.msb.wrapper.consul.cache.ConsulCache4Map;
-import org.openo.msb.wrapper.consul.cache.HealthCache;
-import org.openo.msb.wrapper.consul.cache.ServiceCache;
-import org.openo.msb.wrapper.consul.model.catalog.CatalogService;
-import org.openo.msb.wrapper.consul.model.catalog.ServiceInfo;
-import org.openo.msb.wrapper.consul.model.health.Service;
-import org.openo.msb.wrapper.consul.model.health.ServiceHealth;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ConsulClientApp {
-
- private final Consul consul;
- private final CatalogClient catalogClient;
- private final HealthClient healthClient;
- private AtomicReference<List<HealthCache>> cacheList = new AtomicReference<List<HealthCache>>(
- new ArrayList<HealthCache>());
-
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ConsulClientApp.class);
-
- public ConsulClientApp(String ip, int port) {
- URL url = null;
- try {
- url = new URL("http", ip, port, "");
- } catch (MalformedURLException e1) {
- // TODO Auto-generated catch block
- LOGGER.error("start ConsulClientApp throw exception", e1);
- throw new RuntimeException(e1);
- }
- this.consul = Consul.builder().withUrl(url).build(); // connect to Consul on localhost
- this.catalogClient = consul.catalogClient();
- this.healthClient = consul.healthClient();
- }
-
- public Consul getConsul() {
- return consul;
- }
-
- public CatalogClient getCatalogClient() {
- return catalogClient;
- }
-
- private void stopNodeListen(String serviceName) {
- try {
-
- ListIterator<HealthCache> cacheListLit = cacheList.get().listIterator();
- while (cacheListLit.hasNext()) {
- HealthCache cache = (HealthCache) cacheListLit.next();
- if (cache.getServiceName().equals(serviceName)) {
-
- cache.stop();
- cacheListLit.remove();
- LOGGER.info(cache.getServiceName() + " NodeListen stoped");
- break;
- }
- }
-
- } catch (Exception e) {
- // TODO Auto-generated catch block
- LOGGER.error("stop Node:[" + serviceName + "] Listen throw exception", e);
- }
-
-
- }
-
- /**
- * @Title startServiceListen
- * @Description TODO(Open the consul registration services to monitor)
- * @return void
- */
- public void startServiceListen() {
- final ServiceCache serviceCache = ServiceCache.newCache(catalogClient, 30);
- serviceCache.addListener(new ConsulCache4Map.Listener<String, Map<String, List<String>>>() {
- @Override
- public void notify(List<ServiceInfo> oldValues, List<ServiceInfo> newValues) {
- // do Something with updated server List
- LOGGER.info("--new service notify--");
-
- List<ServiceInfo> deRegisterServiceList = getDiffrent(oldValues, newValues);
-
-
- for (ServiceInfo serviceInfo : deRegisterServiceList) {
- try {
-
- MicroServiceWrapper.getInstance().deleteMicroService(
- serviceInfo.getServiceName(), serviceInfo.getVersion());
-
-
- stopNodeListen(serviceInfo.getServiceName());
- LOGGER.info("Cancel MicroServiceInfo and stop node listen successs:"
- + serviceInfo.getServiceName());
- } catch (Exception e) {
- LOGGER.error("Cancel MicroServiceInfo and stop node listen FAIL : ", e);
-
- }
-
- }
-
-
- List<ServiceInfo> registerServiceList = getDiffrent(newValues, oldValues);
- for (ServiceInfo serviceInfo : registerServiceList) {
-
- // if (deRegisterServiceList.contains(serviceInfo)) continue;
-
-
- LOGGER.info(" new serviceName:" + serviceInfo.getServiceName() + " version:"
- + serviceInfo.getVersion());
- // Open Node to monitor new registration service
- startHealthNodeListen(serviceInfo.getServiceName(), serviceInfo.getVersion());
-
- }
-
-
- }
-
- });
-
- try {
- LOGGER.info("start...consul ... service..Listening.");
- serviceCache.start();
-
- } catch (Exception e) {
- // TODO Auto-generated catch block
- LOGGER.error("start...service..Listen throw exception", e);
- }
- }
-
-
- /**
- * @Title startHealthNodeListen
- * @Description TODO(Open a service node changes to monitor, only to return to health service)
- * @param serviceName
- * @return
- * @return HealthCache
- */
- private HealthCache startHealthNodeListen(final String serviceName, final String version) {
- final HealthCache healthCache = HealthCache.newCache(healthClient, serviceName, 30);
- healthCache.addListener(new HealthCache.Listener<String, ServiceHealth>() {
- @Override
- public void notify(Map<String, ServiceHealth> newValues) {
- // do Something with updated server map
- LOGGER.info(serviceName + "--new node notify--");
-
- if (newValues.isEmpty()) {
- LOGGER.info(serviceName + "--nodeList is Empty--");
-
-
- MicroServiceWrapper.getInstance().deleteMicroService(serviceName, version);
-
- // try {
- // healthCache.stop();
- // } catch (Exception e) {
- // LOGGER.equals(serviceName+"-- stop Node error:"+e.getMessage());
- // }
-
- } else {
-
- MicroServiceInfo microServiceInfo = new MicroServiceInfo();
- HashSet<Node> nodes = new HashSet<Node>();
- String url = "";
- String version = "", visualRange = "", protocol = "",lb_policy="";
-
- for (Map.Entry<String, ServiceHealth> entry : newValues.entrySet()) {
- String nodeName = entry.getKey().toString();
- ServiceHealth value = (ServiceHealth) entry.getValue();
-
- Node node = new Node();
- Service service = value.getService();
- node.setIp(service.getAddress());
- node.setPort(String.valueOf(service.getPort()));
-
-
- try {
- List<String> tagList = service.getTags();
- for (String tag : tagList) {
- if (tag.startsWith("url")) {
- if (tag.split(":").length == 2) {
- url = tag.split(":")[1];
- } else {
- url = "";
- }
-
-
- continue;
- }
- if (tag.startsWith("version")) {
- if (tag.split(":").length == 2) {
- version = tag.split(":")[1];
- } else {
- version = "";
- }
- continue;
- }
- if (tag.startsWith("protocol")) {
- protocol = tag.split(":")[1];
- continue;
- }
- if (tag.startsWith("visualRange")) {
- visualRange = tag.split(":")[1];
- continue;
- }
-
- if (tag.startsWith("lb_policy")) {
- lb_policy = tag.split(":")[1];
- continue;
- }
-
- }
-
-
- } catch (Exception e) {
- LOGGER.error(serviceName + " read tag throw exception", e);
- System.out.println(serviceName + " read tag throw exception");
- }
-
- nodes.add(node);
- }
-
- microServiceInfo.setNodes(nodes);
- microServiceInfo.setProtocol(protocol);
- microServiceInfo.setUrl(url);
- microServiceInfo.setServiceName(serviceName);
- microServiceInfo.setLb_policy(lb_policy);
- if (!visualRange.isEmpty()) {
- microServiceInfo.setVisualRange(visualRange);
- }
- microServiceInfo.setVersion(version);
-
- try {
- MicroServiceFullInfo microServiceFullInfo =
- MicroServiceWrapper.getInstance().saveMicroServiceInstance(
- microServiceInfo, false, "", "");
- LOGGER.info("register MicroServiceInfo successs:"
- + microServiceFullInfo.getServiceName());
- } catch (Exception e) {
- LOGGER.error("register MicroServiceInfo FAIL : " + serviceName, e);
-
- }
- }
- }
- });
- try {
- LOGGER.info(serviceName + " Node Listen start");
- cacheList.get().add(healthCache);
- healthCache.start();
-
- } catch (Exception e) {
- // TODO Auto-generated catch block
- LOGGER.error(serviceName + " Node Listen start throw exception", e);
- }
-
- return healthCache;
- }
-
- /**
- * @Title startNodeListen
- * @Description TODO(Open a service node changes to monitor)
- * @param serviceName
- * @return
- * @return CatalogCache
- */
- @Deprecated
- private CatalogCache startNodeListen(final String serviceName) {
- final CatalogCache catalogCache = CatalogCache.newCache(catalogClient, serviceName, 30);
- catalogCache.addListener(new ConsulCache.Listener<String, CatalogService>() {
- @Override
- public void notify(Map<String, CatalogService> newValues) {
- // do Something with updated server map
- System.out.println(serviceName + "--new node notify--");
- LOGGER.info(serviceName + "--new node notify--");
-
- if (newValues.isEmpty()) {
- System.out.println(serviceName + "-- nodeList is Empty--");
- LOGGER.info(serviceName + "--nodeList is Empty-stop service[" + serviceName
- + "] listen-");
- try {
- catalogCache.stop();
- } catch (Exception e) {
- LOGGER.equals(serviceName + "-- stop Node error:" + e.getMessage());
- }
-
- } else {
-
- MicroServiceInfo microServiceInfo = new MicroServiceInfo();
- HashSet<Node> nodes = new HashSet<Node>();
- String url = "";
- String version = "", visualRange = "", protocol = "";
-
- for (Map.Entry<String, CatalogService> entry : newValues.entrySet()) {
- String nodeName = entry.getKey().toString();
- CatalogService value = (CatalogService) entry.getValue();
-
- Node node = new Node();
- node.setIp(value.getServiceAddress());
- node.setPort(String.valueOf(value.getServicePort()));
-
-
- try {
- List<String> tagList = value.getServiceTags();
- for (String tag : tagList) {
- if (tag.startsWith("url")) {
- if (tag.split(":").length == 2) {
- url = tag.split(":")[1];
- } else {
- url = "";
- }
-
-
- continue;
- }
- if (tag.startsWith("version")) {
- if (tag.split(":").length == 2) {
- version = tag.split(":")[1];
- } else {
- version = "";
- }
- continue;
- }
- if (tag.startsWith("protocol")) {
- protocol = tag.split(":")[1];
- continue;
- }
- if (tag.startsWith("visualRange")) {
- visualRange = tag.split(":")[1];
- continue;
- }
- if (tag.startsWith("ttl")) {
- int ttl = Integer.parseInt(tag.split(":")[1]);
- node.setTtl(ttl);
- continue;
- }
- }
-
-
- } catch (Exception e) {
- LOGGER.error(serviceName + " read tag throw exception", e);
- System.out.println(serviceName + " read tag throw exception");
- }
-
- nodes.add(node);
-
-
- System.out.println(nodeName + ":" + value.getServiceAddress() + " "
- + value.getServicePort() + " " + value.getServiceTags());
- }
-
- microServiceInfo.setNodes(nodes);
- microServiceInfo.setProtocol(protocol);
- microServiceInfo.setUrl(url);
- microServiceInfo.setServiceName(serviceName);
- if (!visualRange.isEmpty()) {
- microServiceInfo.setVisualRange(visualRange);
- }
- microServiceInfo.setVersion(version);
-
- try {
- MicroServiceFullInfo microServiceFullInfo =
- MicroServiceWrapper.getInstance().saveMicroServiceInstance(
- microServiceInfo, false, "", "");
- LOGGER.info("register MicroServiceInfo successs:" + microServiceFullInfo);
- System.out.println("register MicroServiceInfo successs:" + serviceName);
- } catch (Exception e) {
- LOGGER.error("register MicroServiceInfo FAIL : ", e);
-
- }
- }
- }
- });
- try {
- System.out.println(serviceName + " Node Listen start");
- LOGGER.info(serviceName + " Node Listen start");
- catalogCache.start();
-
- } catch (Exception e) {
- // TODO Auto-generated catch block
- LOGGER.error(serviceName + " Node Listen start throw exception", e);
- }
-
- return catalogCache;
- }
-
-
- /**
- * @Title getDiffrent
- * @Description TODO(Extract the list1 and list2 different data sets)
- * @param list1
- * @param list2
- * @return
- * @return List<String>
- */
- private List<ServiceInfo> getDiffrent(List<ServiceInfo> list1, List<ServiceInfo> list2) {
-
- List<ServiceInfo> diff = new ArrayList<ServiceInfo>();
-
-
-
- for (ServiceInfo serviceInfo : list1) {
- if (!list2.contains(serviceInfo)) {
- diff.add(serviceInfo);
- }
- }
-
- return diff;
- }
-
- public static void main(String[] args) {
- ConsulClientApp consulTest = new ConsulClientApp("127.0.0.1", 10081);
- consulTest.startServiceListen();
-
-
- }
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ApiRouteInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ApiRouteInfo.java
deleted file mode 100644
index fcde8d7..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ApiRouteInfo.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.api;
-
-import io.swagger.annotations.ApiModelProperty;
-
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-
-
-public class ApiRouteInfo implements Serializable{
- private static final long serialVersionUID = 1L;
- @ApiModelProperty(required = true)
- private String serviceName;
-
- @ApiModelProperty(example = "v1", required = true)
- private String version;
-
- @ApiModelProperty(value = "Target Service URL,start with /",example = "/test", required = true)
- private String url;
-
- private String apiJson=""; //swagger json Path
-
- @ApiModelProperty(value = "[apiJson Type] 0:local file 1: remote file", allowableValues = "0,1", example = "1")
- private String apiJsonType="1";
- private String metricsUrl="";
-
- @ApiModelProperty(value = "[control Range] 0:default 1:readonly 2:hidden ", allowableValues = "0,1,2", example = "0")
- private String control="0";
-
- @ApiModelProperty(value = "[status] 1:abled 0:disabled ", allowableValues = "0,1", example = "1")
- private String status="1";
-
- @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")
- private String visualRange = "1";
-
- @ApiModelProperty(value = "[LB Policy]non_ip_hash:0,ip_hash:1", allowableValues = "0,1", example = "0")
- private String useOwnUpstream="0";
-
- @ApiModelProperty(required = true)
- private RouteServer servers[];
-
-
-
- public String getServiceName() {
- return serviceName;
- }
- public void setServiceName(String serviceName) {
- this.serviceName = serviceName;
- }
- public String getVersion() {
- return version;
- }
- public void setVersion(String version) {
- this.version = version;
- }
-
- public String getApiJson() {
- return apiJson;
- }
- public void setApiJson(String apiJson) {
- this.apiJson = apiJson;
- }
-
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- public RouteServer[] getServers() {
- return servers;
- }
- public void setServers(RouteServer[] servers) {
- this.servers = servers;
- }
-
-
- public String getApiJsonType() {
- return apiJsonType;
- }
- public void setApiJsonType(String apiJsonType) {
- this.apiJsonType = apiJsonType;
- }
- public String getMetricsUrl() {
- return metricsUrl;
- }
- public void setMetricsUrl(String metricsUrl) {
- this.metricsUrl = metricsUrl;
- }
- public String getControl() {
- return control;
- }
- public void setControl(String control) {
- this.control = control;
- }
- public String getStatus() {
- return status;
- }
- public void setStatus(String status) {
- this.status = status;
- }
- public String getVisualRange() {
- return visualRange;
- }
- public void setVisualRange(String visualRange) {
- this.visualRange = visualRange;
- }
- public String getUseOwnUpstream() {
- return useOwnUpstream;
- }
-
- public void setUseOwnUpstream(String useOwnUpstream) {
- this.useOwnUpstream = useOwnUpstream;
- }
-
-
-
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ConsulInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ConsulInfo.java
deleted file mode 100644
index 4550b61..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ConsulInfo.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.api;
-
-import java.io.Serializable;
-
-public class ConsulInfo implements Serializable{
- private static final long serialVersionUID = 1L;
- private String ip;
- private int port;
-
- public String getIp() {
- return ip;
- }
- public void setIp(String ip) {
- this.ip = ip;
- }
- public int getPort() {
- return port;
- }
- public void setPort(int port) {
- this.port = port;
- }
-
-} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomRouteInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomRouteInfo.java
deleted file mode 100644
index 0d84857..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/CustomRouteInfo.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.api;
-
-import io.swagger.annotations.ApiModelProperty;
-
-import java.io.Serializable;
-
-public class CustomRouteInfo implements Serializable{
-
- private static final long serialVersionUID = 1L;
- @ApiModelProperty(required = true)
- private String serviceName;
-
- @ApiModelProperty(value = "Target Service URL,start with /",example = "/test", required = true)
- private String url;
-
- @ApiModelProperty(value = "[control Range] 0:default 1:readonly 2:hidden ", allowableValues = "0,1,2", example = "0")
- private String control="0";
-
- @ApiModelProperty(value = "[status] 1:abled 0:disabled ", allowableValues = "0,1", example = "1")
- private String status="1";
-
- @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")
- private String visualRange = "1";
-
- @ApiModelProperty(value = "[LB Policy]non_ip_hash:0,ip_hash:1", allowableValues = "0,1", example = "0")
- private String useOwnUpstream="0";
-
- @ApiModelProperty(required = true)
- private RouteServer servers[];
-
- public String getServiceName() {
- return serviceName;
- }
-
- public void setServiceName(String serviceName) {
- this.serviceName = serviceName;
- }
-
- public String getUrl() {
- return url;
- }
-
- public void setUrl(String url) {
- this.url = url;
- }
-
- public RouteServer[] getServers() {
- return servers;
- }
-
- public void setServers(RouteServer[] servers) {
- this.servers = servers;
- }
-
- public String getControl() {
- return control;
- }
-
- public void setControl(String control) {
- this.control = control;
- }
-
- public String getStatus() {
- return status;
- }
-
- public void setStatus(String status) {
- this.status = status;
- }
-
- public String getVisualRange() {
- return visualRange;
- }
-
- public void setVisualRange(String visualRange) {
- this.visualRange = visualRange;
- }
-
- public String getUseOwnUpstream() {
- return useOwnUpstream;
- }
-
- public void setUseOwnUpstream(String useOwnUpstream) {
- this.useOwnUpstream = useOwnUpstream;
- }
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/IuiRouteInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/IuiRouteInfo.java
deleted file mode 100644
index 64676d3..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/IuiRouteInfo.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.api;
-
-import io.swagger.annotations.ApiModelProperty;
-
-import java.io.Serializable;
-
-
-public class IuiRouteInfo implements Serializable{
- private static final long serialVersionUID = 1L;
- @ApiModelProperty(required = true)
- private String serviceName;
-
- @ApiModelProperty(value = "Target Service URL,start with /",example = "/test", required = true)
- private String url;
-
- @ApiModelProperty(value = "[control Range] 0:default 1:readonly 2:hidden ", allowableValues = "0,1,2", example = "0")
- private String control="0";
-
- @ApiModelProperty(value = "[status] 1:abled 0:disabled ", allowableValues = "0,1", example = "1")
- private String status="1";
-
- @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")
- private String visualRange = "1";
-
- @ApiModelProperty(value = "[LB Policy]non_ip_hash:0,ip_hash:1", allowableValues = "0,1", example = "0")
- private String useOwnUpstream="0";
-
- @ApiModelProperty(required = true)
- private RouteServer servers[];
-
- public String getServiceName() {
- return serviceName;
- }
-
- public void setServiceName(String serviceName) {
- this.serviceName = serviceName;
- }
-
- public String getUrl() {
- return url;
- }
-
- public void setUrl(String url) {
- this.url = url;
- }
-
- public RouteServer[] getServers() {
- return servers;
- }
-
- public void setServers(RouteServer[] servers) {
- this.servers = servers;
- }
-
- public String getControl() {
- return control;
- }
-
- public void setControl(String control) {
- this.control = control;
- }
-
- public String getStatus() {
- return status;
- }
-
- public void setStatus(String status) {
- this.status = status;
- }
-
- public String getVisualRange() {
- return visualRange;
- }
-
- public void setVisualRange(String visualRange) {
- this.visualRange = visualRange;
- }
-
- public String getUseOwnUpstream() {
- return useOwnUpstream;
- }
-
- public void setUseOwnUpstream(String useOwnUpstream) {
- this.useOwnUpstream = useOwnUpstream;
- }
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MetricsInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MetricsInfo.java
deleted file mode 100644
index 981dfe6..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MetricsInfo.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.api;
-
-
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class MetricsInfo{
- private Gauges gauges;
- private Timers timers;
-}
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-class Gauges {
-
- @JsonProperty("jvm.attribute.uptime")
- private JVMMetrics jvm_attribute_uptime;
-
- @JsonProperty("jvm.memory.pools.Eden-Space.usage")
- private JVMMetrics jvm_memory_pools_Eden_Space_usage;
-
- @JsonProperty("jvm.memory.pools.PS-Eden-Space.usage")
- private JVMMetrics jvm_memory_pools_PS_Eden_Space_usage;
-
- @JsonProperty("jvm.memory.pools.Perm-Gen.usage")
- private JVMMetrics jvm_memory_pools_Perm_Gen_usage;
-
- @JsonProperty("jvm.memory.pools.PS-Perm-Gen.usage")
- private JVMMetrics jvm_memory_pools_PS_Perm_Gen_usage;
-
- @JsonProperty("jvm.memory.pools.Survivor-Space.usage")
- private JVMMetrics jvm_memory_pools_Survivor_Space_usage;
-
- @JsonProperty("jvm.memory.pools.PS-Survivor-Space.usage")
- private JVMMetrics jvm_memory_pools_PS_Survivor_Space_usage;
-
- @JsonProperty("jvm.memory.pools.Tenured-Gen.usage")
- private JVMMetrics jvm_memory_pools_Tenured_Gen_usage;
-
- @JsonProperty("jvm.memory.pools.PS-Old-Gen.usage")
- private JVMMetrics jvm_memory_pools_PS_Old_Gen_usage;
-
- @JsonProperty("jvm.memory.pools.Code-Cache.usage")
- private JVMMetrics jvm_memory_pools_Code_Cache_usage;
-
- @JsonProperty("jvm.memory.heap.init")
- private JVMMetrics jvm_memory_heap_init;
-
- @JsonProperty("jvm.memory.non-heap.init")
- private JVMMetrics jvm_memory_non_heap_init;
-
- @JsonProperty("jvm.memory.heap.used")
- private JVMMetrics jvm_memory_heap_used;
-
- @JsonProperty("jvm.memory.non-heap.used")
- private JVMMetrics jvm_memory_non_heap_used;
-
- @JsonProperty("jvm.memory.heap.max")
- private JVMMetrics jvm_memory_heap_max;
-
- @JsonProperty("jvm.threads.runnable.count")
- private JVMMetrics jvm_threads_runnable_count;
-
- @JsonProperty("jvm.threads.timed_waiting.count")
- private JVMMetrics jvm_threads_timed_waiting_count;
-
- @JsonProperty("jvm.threads.waiting.count")
- private JVMMetrics jvm_threads_waiting_count;
-
- @JsonProperty("jvm.threads.blocked.count")
- private JVMMetrics jvm_threads_blocked_count;
-
- @JsonProperty("jvm.threads.count")
- private JVMMetrics jvm_threads_count;
-
-
-
-}
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-class Timers{
-
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.addApiRoute")
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_addApiRoute;
-
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.deleteApiRoute")
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_deleteApiRoute;
-
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.getApiDocs")
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_getApiDocs;
-
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.getApiRoute")
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_getApiRoute;
-
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.getApiRoutes")
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_getApiRoutes;
-
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.getServerIP")
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_getServerIP;
-
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.ApiRouteResource.updateApiRoute")
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_ApiRouteResource_updateApiRoute;
-
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.addIuiRoute")
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_addIuiRoute;
-
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.deleteIuiRoute")
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_deleteIuiRoute;
-
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.getIuiRoute")
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_getIuiRoute;
-
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.getIuiRoutes")
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_getIuiRoutes;
-
- @JsonProperty("com.zte.ums.nfv.eco.hsif.msb.resources.IuiRouteResource.updateIuiRoute")
- private HttpMetrics com_zte_ums_nfv_eco_hsif_msb_resources_IuiRouteResource_updateIuiRoute;
-
- @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.get-requests")
- private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_get_requests;
-
- @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.post-requests")
- private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_post_requests;
-
- @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.put-requests")
- private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_put_requests;
-
- @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.delete-requests")
- private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_delete_requests;
-
- @JsonProperty("io.dropwizard.jetty.MutableServletContextHandler.other-requests")
- private HttpMetrics io_dropwizard_jetty_MutableServletContextHandler_other_requests;
-
-}
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-class JVMMetrics{
- private double value;
-}
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-class HttpMetrics{
- private int count;
- private double max;
- private double mean;
- private double min;
- private double p50;
- private double p75;
- private double p95;
- private double p98;
- private double p99;
- private double p999;
- private double stddev;
- private double m15_rate;
- private double m1_rate;
- private double m5_rate;
- private double mean_rate;
- private String duration_units;
- private String rate_units;
-}
-
-
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceFullInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceFullInfo.java
deleted file mode 100644
index 3817395..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceFullInfo.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.api;
-
-import java.io.Serializable;
-import java.util.Set;
-
-public class MicroServiceFullInfo extends Service<NodeInfo> implements Serializable {
- private static final long serialVersionUID = 1L;
-
- private Set<NodeInfo> nodes;
-
- private String status = "1"; //0:disable 1:enable
-
- public Set<NodeInfo> getNodes() {
- return nodes;
- }
-
- public void setNodes(Set<NodeInfo> nodes) {
- this.nodes = nodes;
- }
-
- public String getStatus() {
- return status;
- }
- public void setStatus(String status) {
- this.status = status;
- }
-
-
-} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceInfo.java
deleted file mode 100644
index 725df2e..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/MicroServiceInfo.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.api;
-
-import java.io.Serializable;
-import java.util.Set;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class MicroServiceInfo extends Service<Node> implements Serializable {
- private static final long serialVersionUID = 1L;
-
- private Set<Node> nodes;
-
- public Set<Node> getNodes() {
- return nodes;
- }
-
- public void setNodes(Set<Node> nodes) {
- this.nodes = nodes;
- }
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/NodeInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/NodeInfo.java
deleted file mode 100644
index c1a5d68..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/NodeInfo.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.api;
-
-import java.util.Date;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-
-public class NodeInfo extends Node {
-
- private static final long serialVersionUID = 8955786461351557306L;
-
- private String nodeId;
-
-
-
- @JsonSerialize(using = CustomDateSerializer.class)
- private Date expiration;
-
- @JsonSerialize(using = CustomDateSerializer.class)
- private Date created_at;
-
- @JsonSerialize(using = CustomDateSerializer.class)
- private Date updated_at;
-
- public Date getExpiration() {
- return expiration;
- }
-
- public void setExpiration(Date expiration) {
- this.expiration = expiration;
- }
-
- public Date getCreated_at() {
- return created_at;
- }
-
- public void setCreated_at(Date created_at) {
- this.created_at = created_at;
- }
-
- public Date getUpdated_at() {
- return updated_at;
- }
-
- public void setUpdated_at(Date updated_at) {
- this.updated_at = updated_at;
- }
-
- public String getNodeId() {
- return nodeId;
- }
-
- public void setNodeId(String nodeId) {
- this.nodeId = nodeId;
- }
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Service.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Service.java
deleted file mode 100644
index 6e19a71..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/Service.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.api;
-
-import io.swagger.annotations.ApiModelProperty;
-
-import java.io.Serializable;
-import java.util.Set;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class Service<T> implements Serializable {
- private static final long serialVersionUID = 1L;
-
- @ApiModelProperty(required = true)
- private String serviceName;
-
- @ApiModelProperty(example = "v1")
- private String version="";
-
- @ApiModelProperty(value = "Target Service URL,start with /",example = "/api/serviceName/v1", required = true)
- private String url="";
-
- @ApiModelProperty(value = "Service Protocol", allowableValues = "REST,UI, MQ, FTP,SNMP,TCP,UDP", example = "REST",required = true)
- private String protocol = "";
-
-
- @ApiModelProperty(value = "[visual Range]interSystem:0,inSystem:1", allowableValues = "0,1", example = "1")
- private String visualRange = "1";
-
-
- @ApiModelProperty(value = "lb policy", allowableValues = "round-robin,hash,least_conn", example = "hash")
- private String lb_policy="";
-
- @ApiModelProperty(required = true)
- private Set<T> nodes;
-
- public Set<T> getNodes() {
- return nodes;
- }
-
- public void setNodes(Set<T> nodes) {
- this.nodes = nodes;
- }
-
- public String getServiceName() {
- return serviceName;
- }
- public void setServiceName(String serviceName) {
- this.serviceName = serviceName;
- }
- public String getVersion() {
- return version;
- }
- public void setVersion(String version) {
- this.version = version;
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- public String getProtocol() {
- return protocol;
- }
- public void setProtocol(String protocol) {
- this.protocol = protocol;
- }
-
- public String getVisualRange() {
- return visualRange;
- }
-
- public void setVisualRange(String visualRange) {
- this.visualRange = visualRange;
- }
-
-
- public String getLb_policy() {
- return lb_policy;
- }
-
- public void setLb_policy(String lb_policy) {
- this.lb_policy = lb_policy;
- }
-
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ServiceAccessInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ServiceAccessInfo.java
deleted file mode 100644
index 58f907a..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/api/ServiceAccessInfo.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.api;
-
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-
-public class ServiceAccessInfo implements Serializable {
- private static final long serialVersionUID = 1L;
- // (api|iui|custom|p2p)
- private String serviceType;
-
- private String serviceName;
- @JsonInclude(JsonInclude.Include.NON_NULL)
- private String version;
-
- private String accessAddr;
-
- /**
- * @return the serviceType
- */
- public String getServiceType() {
- return serviceType;
- }
-
- /**
- * @param serviceType the serviceType to set
- */
- public void setServiceType(String serviceType) {
- this.serviceType = serviceType;
- }
-
- /**
- * @return the serviceName
- */
- public String getServiceName() {
- return serviceName;
- }
-
- /**
- * @param serviceName the serviceName to set
- */
- public void setServiceName(String serviceName) {
- this.serviceName = serviceName;
- }
-
- /**
- * @return the version
- */
- public String getVersion() {
- return version;
- }
-
- /**
- * @param version the version to set
- */
- public void setVersion(String version) {
- this.version = version;
- }
-
- /**
- * @return the accessAddr
- */
- public String getAccessAddr() {
- return accessAddr;
- }
-
- /**
- * @param accessAddr the accessAddr to set
- */
- public void setAccessAddr(String accessAddr) {
- this.accessAddr = accessAddr;
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MetricsResource.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MetricsResource.java
deleted file mode 100644
index def36e2..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/MetricsResource.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.resources;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.openo.msb.api.MetricsInfo;
-import org.openo.msb.wrapper.MetricsServiceWrapper;
-
-import com.codahale.metrics.annotation.Timed;
-
-@Path("/metrics")
-@Api(tags = { "metrics" })
-@Produces(MediaType.APPLICATION_JSON)
-public class MetricsResource {
-
-
- @GET
- @Path("/")
- @ApiOperation(value = "get Metrics Info ", response = MetricsInfo.class)
- @Produces(MediaType.APPLICATION_JSON)
- @Timed
- public MetricsInfo getMetricsInfo() {
- return MetricsServiceWrapper.getMetricsInfo();
- }
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ServiceAccessResource.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ServiceAccessResource.java
deleted file mode 100644
index 65da72b..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/resources/ServiceAccessResource.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.resources;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-
-import java.util.List;
-
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-
-import org.openo.msb.api.ServiceAccessInfo;
-import org.openo.msb.wrapper.ServiceAccessWrapper;
-
-import com.codahale.metrics.annotation.Timed;
-
-
-@Path("/serviceaccess")
-@Api(tags = {"ServiceAccess"})
-@Produces(MediaType.APPLICATION_JSON)
-public class ServiceAccessResource {
-
- @GET
- @Path("/{serviceName}")
- @ApiOperation(value = "get the msb access address of the service ", response = ServiceAccessInfo.class)
- @ApiResponses(value = {@ApiResponse(code = 500, message = "get access address error ")})
- @Produces(MediaType.APPLICATION_JSON)
- @Timed
- public List<ServiceAccessInfo> getApiRoute(
- @ApiParam(value = "serviceName") @PathParam("serviceName") String serviceName,
- @ApiParam(value = "service type", allowableValues = "api,iui,custom,p2p") @QueryParam("type") String serviceType,
- @ApiParam(value = "version") @QueryParam("version") @DefaultValue("") String version,
- @ApiParam(hidden = true) @HeaderParam("Host") String host) {
-
- host=host.split(":")[0];
-
- return ServiceAccessWrapper.getInstance().getApiRouteAccessAddr(serviceType, serviceName,
- version, host);
-
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ApiRouteServiceWrapper.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ApiRouteServiceWrapper.java
deleted file mode 100644
index 3d6672b..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ApiRouteServiceWrapper.java
+++ /dev/null
@@ -1,565 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang3.StringUtils;
-import org.openo.msb.api.ApiRouteInfo;
-import org.openo.msb.api.DiscoverInfo;
-import org.openo.msb.api.RouteServer;
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
-import org.openo.msb.api.exception.ExtendedNotFoundException;
-import org.openo.msb.api.exception.ExtendedNotSupportedException;
-import org.openo.msb.wrapper.util.JedisUtil;
-import org.openo.msb.wrapper.util.RegExpTestUtil;
-import org.openo.msb.wrapper.util.RouteUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import redis.clients.jedis.Jedis;
-
-
-public class ApiRouteServiceWrapper {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ApiRouteServiceWrapper.class);
-
-
- private static ApiRouteServiceWrapper instance = new ApiRouteServiceWrapper();
-
- private ApiRouteServiceWrapper() {}
-
- public static ApiRouteServiceWrapper getInstance() {
- return instance;
- }
-
-
- public ApiRouteInfo[] getAllApiRouteInstances() {
-
-
- Jedis jedis = null;
- ApiRouteInfo[] apiRouteList = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
-
-
- String routekey =
- RouteUtil
- .getPrefixedKey("", RouteUtil.APIROUTE, "*", RouteUtil.ROUTE_PATH_INFO);
- Set<String> routeSet = jedis.keys(routekey);
- apiRouteList = new ApiRouteInfo[routeSet.size()];
-
- int i = 0;
- for (String routePath : routeSet) {
- String[] routePathArray = routePath.split(":");
- ApiRouteInfo apiRoute =
- getApiRouteInstance(routePathArray[3], routePathArray[4], jedis);
- apiRouteList[i] = apiRoute;
- i++;
- }
-
-
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new ExtendedInternalServerErrorException("call redis throw exception:"
- + e.getMessage());
-
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- return apiRouteList;
- }
-
-
-
- public static boolean checkRedisConnect() {
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis != null) {
- return true;
- }
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- return false;
- }
-
-
- public ApiRouteInfo getApiRouteInstance(String serviceName, String version) {
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- if (StringUtils.isNotBlank(version)) {
- if (!RegExpTestUtil.versionRegExpTest(version)) {
- throw new ExtendedNotSupportedException("version (" + version
- + ") is not a valid format");
- }
- }
-
-
- ApiRouteInfo apiRouteInfo = null;
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
-
- apiRouteInfo = getApiRouteInstance(serviceName, version, jedis);
-
-
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new ExtendedInternalServerErrorException("call redis throw exception:"
- + e.getMessage());
-
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- if (null == apiRouteInfo) {
- String errInfo =
- "ApiRouteInfo not found: serviceName-" + serviceName + " ,version-" + version;
- LOGGER.warn(errInfo);
- throw new ExtendedNotFoundException(errInfo);
-
- }
-
- return apiRouteInfo;
-
- }
-
- public ApiRouteInfo getApiRouteInstance(String serviceName, String version, Jedis jedis)
- throws Exception {
- if ("null".equals(version)) {
- version = "";
- }
-
- ApiRouteInfo apiRouteInfo = null;
-
-
-
- String routekey =
- RouteUtil.getPrefixedKey("", RouteUtil.APIROUTE, serviceName, version,
- RouteUtil.ROUTE_PATH_INFO);
- Map<String, String> infomap = jedis.hgetAll(routekey);
- if (!infomap.isEmpty()) {
- apiRouteInfo = new ApiRouteInfo();
- apiRouteInfo.setServiceName(serviceName);
- apiRouteInfo.setVersion(version);
- apiRouteInfo.setUrl(infomap.get("url"));
- apiRouteInfo.setMetricsUrl(infomap.get("metricsUrl"));
- apiRouteInfo.setApiJson(infomap.get("apijson"));
- apiRouteInfo.setApiJsonType(infomap.get("apiJsonType"));
- apiRouteInfo.setControl(infomap.get("control"));
- apiRouteInfo.setStatus(infomap.get("status"));
- apiRouteInfo.setVisualRange(infomap.get("visualRange"));
- apiRouteInfo.setUseOwnUpstream(infomap.get("useOwnUpstream"));
-
-
-
- String serviceLBkey =
- RouteUtil.getPrefixedKey("", RouteUtil.APIROUTE, serviceName, version,
- RouteUtil.ROUTE_PATH_LOADBALANCE);
- Set<String> serviceLBset = jedis.keys(serviceLBkey + ":*");
- int serverNum = serviceLBset.size();
- RouteServer[] apiRouteServerList = new RouteServer[serverNum];
- int i = 0;
- for (String serviceInfo : serviceLBset) {
- Map<String, String> serviceLBmap = jedis.hgetAll(serviceInfo);
- RouteServer server = new RouteServer();
- server.setIp(serviceLBmap.get("ip"));
- server.setPort(serviceLBmap.get("port"));
- server.setWeight(Integer.parseInt(serviceLBmap.get("weight")));
- apiRouteServerList[i] = server;
- i++;
- }
-
- apiRouteInfo.setServers(apiRouteServerList);
-
-
- }
-
-
- return apiRouteInfo;
- }
-
-
- public synchronized ApiRouteInfo updateApiRouteInstance(String serviceName, String version,
- ApiRouteInfo apiRouteInfo, String serverPort) {
-
- if ("null".equals(version)) {
- version = "";
- }
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- if (StringUtils.isNotBlank(version)) {
- if (!RegExpTestUtil.versionRegExpTest(version)) {
- throw new ExtendedNotSupportedException("version (" + version
- + ") is not a valid format");
- }
- }
-
-
-
-
- try {
-
-
- if (serviceName.equals(apiRouteInfo.getServiceName())
- && version.equals(apiRouteInfo.getVersion())) {
-
- deleteApiRoute(serviceName, version, RouteUtil.ROUTE_PATH_LOADBALANCE + "*",
- serverPort);
-
- } else {
-
- deleteApiRoute(serviceName, version, "*", serverPort);
- }
-
-
- saveApiRouteInstance(apiRouteInfo, serverPort);
-
-
- } catch (ExtendedNotSupportedException e) {
- throw e;
- } catch (Exception e) {
- LOGGER.error("update ApiRoute throw exception", e);
- throw new ExtendedInternalServerErrorException("update apiRouteInfo throw exception"
- + e.getMessage());
-
- }
-
- return apiRouteInfo;
-
- }
-
-
- public synchronized ApiRouteInfo updateApiRouteStatus(String serviceName, String version,
- String status) {
-
- if ("null".equals(version)) {
- version = "";
- }
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- if (StringUtils.isNotBlank(version)) {
- if (!RegExpTestUtil.versionRegExpTest(version)) {
- throw new ExtendedNotSupportedException("version (" + version
- + ") is not a valid format");
- }
- }
-
- if (!RouteUtil.contain(RouteUtil.statusRangeMatches, status)) {
- throw new ExtendedNotSupportedException(
- "save ApiRouteInfo Status FAIL:status is wrong,value range:("
- + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
- }
-
- ApiRouteInfo new_apiRouteInfo = getApiRouteInstance(serviceName, version);
-
-
-
- String serviceInfokey =
- RouteUtil.getPrefixedKey("", RouteUtil.APIROUTE, serviceName, version,
- RouteUtil.ROUTE_PATH_INFO);
- Map<String, String> serviceInfoMap = new HashMap<String, String>();
- serviceInfoMap.put("status", status);
-
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new Exception("fetch from jedis pool failed,null object!");
- }
-
- jedis.hmset(serviceInfokey, serviceInfoMap);
- new_apiRouteInfo.setStatus(status);
-
-
- } catch (Exception e) {
- LOGGER.error("update ApiRoute status throw exception", e);
- throw new ExtendedInternalServerErrorException("update ApiRoute status throw exception"
- + e.getMessage());
-
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- return new_apiRouteInfo;
- }
-
-
-
- public synchronized ApiRouteInfo saveApiRouteInstance(ApiRouteInfo apiRouteInfo,
- String serverPort) {
-
-
-
- if (StringUtils.isBlank(apiRouteInfo.getServiceName())
- || apiRouteInfo.getServers().length == 0) {
- throw new ExtendedNotSupportedException(
- "save apiRouteInfo FAIL: Some required fields are empty");
- }
-
- if (StringUtils.isNotBlank(apiRouteInfo.getVersion())) {
- if (!RegExpTestUtil.versionRegExpTest(apiRouteInfo.getVersion())) {
- throw new ExtendedNotSupportedException("version (" + apiRouteInfo.getVersion()
- + ") is not a valid format");
- }
- }
-
- if (StringUtils.isNotBlank(apiRouteInfo.getUrl())) {
- if (!RegExpTestUtil.urlRegExpTest(apiRouteInfo.getUrl())) {
- throw new ExtendedNotSupportedException(
- "save apiRouteInfo FAIL:url is not a valid format(url must be begin with /)");
-
- }
- }
-
- if (!RouteUtil.contain(RouteUtil.visualRangeRange, apiRouteInfo.getVisualRange())) {
- throw new ExtendedNotSupportedException(
- "save apiRouteInfo FAIL:VisualRange is wrong,value range:("
- + RouteUtil.show(RouteUtil.visualRangeMatches) + ")");
- }
-
- if (!RouteUtil.contain(RouteUtil.controlRangeMatches, apiRouteInfo.getControl())) {
- throw new ExtendedNotSupportedException(
- "save apiRouteInfo FAIL:control is wrong,value range:("
- + RouteUtil.show(RouteUtil.controlRangeMatches) + ")");
- }
-
- if (!RouteUtil.contain(RouteUtil.statusRangeMatches, apiRouteInfo.getStatus())) {
- throw new ExtendedNotSupportedException(
- "save apiRouteInfo FAIL:status is wrong,value range:("
- + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
- }
-
- if (!RouteUtil.contain(RouteUtil.useOwnUpstreamRangeMatches, apiRouteInfo.getUseOwnUpstream())) {
- throw new ExtendedNotSupportedException(
- "save apiRouteInfo FAIL:useOwnUpstream is wrong,value range:("
- + RouteUtil.show(RouteUtil.useOwnUpstreamRangeMatches) + ")");
- }
-
-
- RouteServer[] serverList = apiRouteInfo.getServers();
- for (int i = 0; i < serverList.length; i++) {
- RouteServer server = serverList[i];
- if (!RegExpTestUtil.ipRegExpTest(server.getIp())) {
- throw new ExtendedNotSupportedException("save apiRouteInfo FAIL:IP("
- + server.getIp() + ")is not a valid ip address");
- }
-
- if (!RegExpTestUtil.portRegExpTest(server.getPort())) {
- throw new ExtendedNotSupportedException("save apiRouteInfo FAIL:Port("
- + server.getPort() + ")is not a valid Port address");
- }
- }
-
-
- String serviceInfokey =
- RouteUtil.getPrefixedKey(serverPort, RouteUtil.APIROUTE,
- apiRouteInfo.getServiceName().trim(), apiRouteInfo.getVersion().trim(),
- RouteUtil.ROUTE_PATH_INFO);
- Map<String, String> serviceInfoMap = new HashMap<String, String>();
- serviceInfoMap.put("url", "/".equals(apiRouteInfo.getUrl().trim()) ? "" : apiRouteInfo
- .getUrl().trim());
- serviceInfoMap.put("apijson", apiRouteInfo.getApiJson());
- serviceInfoMap.put("apiJsonType", apiRouteInfo.getApiJsonType());
- serviceInfoMap.put("metricsUrl", apiRouteInfo.getMetricsUrl());
- serviceInfoMap.put("control", apiRouteInfo.getControl());
- serviceInfoMap.put("status", apiRouteInfo.getStatus());
- serviceInfoMap.put("visualRange", apiRouteInfo.getVisualRange());
- serviceInfoMap.put("useOwnUpstream", apiRouteInfo.getUseOwnUpstream());
-
-
- String serviceLBkey =
- RouteUtil.getPrefixedKey(serverPort, RouteUtil.APIROUTE,
- apiRouteInfo.getServiceName(), apiRouteInfo.getVersion(),
- RouteUtil.ROUTE_PATH_LOADBALANCE);
-
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
- jedis.hmset(serviceInfokey, serviceInfoMap);
-
-
- for (int i = 0; i < serverList.length; i++) {
- Map<String, String> servermap = new HashMap<String, String>();
- RouteServer server = serverList[i];
-
- servermap.put("ip", server.getIp());
- servermap.put("port", server.getPort());
- servermap.put("weight", Integer.toString(server.getWeight()));
-
- jedis.hmset(serviceLBkey + ":server" + (i + 1), servermap);
- }
-
-
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new ExtendedInternalServerErrorException("call redis throw exception:"
- + e.getMessage());
-
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- return apiRouteInfo;
- }
-
-
-
-
- public synchronized void deleteApiRoute(String serviceName, String version, String delKey,
- String serverPort) {
-
- if ("null".equals(version)) {
- version = "";
- }
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- if (StringUtils.isNotBlank(version)) {
- if (!RegExpTestUtil.versionRegExpTest(version)) {
- throw new ExtendedNotSupportedException("version (" + version
- + ") is not a valid format");
- }
- }
-
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
-
-
- String routekey =
- RouteUtil.getPrefixedKey(serverPort, RouteUtil.APIROUTE, serviceName, version,
- delKey);
- Set<String> infoSet = jedis.keys(routekey);
-
- if (infoSet.isEmpty()) {
- LOGGER.warn("delete ApiRoute FAIL:serviceName-"
- + serviceName + ",version:" + version + " not fond ");
- }
- else{
-
- String[] paths = new String[infoSet.size()];
- infoSet.toArray(paths);
- jedis.del(paths);
- }
-
-
- } catch (ExtendedNotFoundException e) {
- throw e;
- } catch (Exception e) {
- LOGGER.error("delete ApiRoute throw exception", e);
- throw new ExtendedInternalServerErrorException("delete ApiRoute throw exception:"
- + e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
-
- }
-
-
- public String[] getAllApiDocs() {
- URL apiDocsPath = ApiRouteServiceWrapper.class.getResource("/ext/initSwaggerJson");
- if (apiDocsPath != null) {
- String path = apiDocsPath.getPath();
-
- try {
- return readfile(path);
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- LOGGER.error("read ApiDocs Files throw FileNotFoundException", e);
- throw new ExtendedInternalServerErrorException("read ApiDocs Files throw FileNotFoundException:"
- + e.getMessage());
- } catch (IOException e) {
- // TODO Auto-generated catch block
- LOGGER.error("read ApiDocs Files throw IOexception", e);
- throw new ExtendedInternalServerErrorException("read ApiDocs Files throw IOexception:"
- + e.getMessage());
- }
-
- }
-
-
- return null;
- }
-
- public String[] readfile(String filepath) throws FileNotFoundException, IOException {
- File file = new File(filepath);
- if (file.isDirectory()) {
- String[] filelist = file.list();
- return filelist;
- }
- return null;
- }
-
- public String getApiGatewayPort() {
- // return JedisUtil.serverIp+":"+JedisUtil.serverPort;
- return System.getenv("APIGATEWAY_EXPOSE_PORT") == null ? String
- .valueOf(JedisUtil.serverPort) : System.getenv("APIGATEWAY_EXPOSE_PORT");
-
- }
-
- public DiscoverInfo getServiceDiscoverInfo() {
- return RouteUtil.discoverInfo;
-
- }
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/CustomRouteServiceWrapper.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/CustomRouteServiceWrapper.java
deleted file mode 100644
index 14f5523..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/CustomRouteServiceWrapper.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang3.StringUtils;
-import org.openo.msb.api.CustomRouteInfo;
-import org.openo.msb.api.RouteServer;
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
-import org.openo.msb.api.exception.ExtendedNotFoundException;
-import org.openo.msb.api.exception.ExtendedNotSupportedException;
-import org.openo.msb.wrapper.util.JedisUtil;
-import org.openo.msb.wrapper.util.RegExpTestUtil;
-import org.openo.msb.wrapper.util.RouteUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import redis.clients.jedis.Jedis;
-
-public class CustomRouteServiceWrapper {
-
-
- private static final Logger LOGGER = LoggerFactory.getLogger(CustomRouteServiceWrapper.class);
-
- private static CustomRouteServiceWrapper instance = new CustomRouteServiceWrapper();
-
- private CustomRouteServiceWrapper() {}
-
- public static CustomRouteServiceWrapper getInstance() {
- return instance;
- }
-
-
-
- public CustomRouteInfo[] getAllCustomRouteInstances() {
-
-
- Jedis jedis = null;
- CustomRouteInfo[] customRouteList = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
-
- String routekey =
- RouteUtil.getPrefixedKey("", RouteUtil.CUSTOMROUTE, "*",
- RouteUtil.ROUTE_PATH_INFO);
- Set<String> routeSet = jedis.keys(routekey);
- customRouteList = new CustomRouteInfo[routeSet.size()];
-
- int i = 0;
- for (String routePath : routeSet) {
- String[] routePathArray = routePath.split(":");
- CustomRouteInfo customRoute = getCustomRouteInstance(routePathArray[3], jedis);
- customRouteList[i] = customRoute;
- i++;
- }
-
-
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new ExtendedInternalServerErrorException("call redis throw exception:"
- + e.getMessage());
-
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- return customRouteList;
- }
-
-
-
- public CustomRouteInfo getCustomRouteInstance(String serviceName) {
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- CustomRouteInfo customRouteInfo;
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
-
- customRouteInfo = getCustomRouteInstance(serviceName, jedis);
-
-
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new ExtendedInternalServerErrorException("call redis throw exception:"
- + e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- if (null == customRouteInfo) {
- String errInfo = "customRouteInfo not found: serviceName-" + serviceName;
- LOGGER.warn(errInfo);
- throw new ExtendedNotFoundException(errInfo);
-
- }
-
- return customRouteInfo;
-
- }
-
- public CustomRouteInfo getCustomRouteInstance(String serviceName, Jedis jedis) throws Exception {
-
-
- CustomRouteInfo customRouteInfo = null;
-
-
- String routekey =
- RouteUtil.getPrefixedKey("", RouteUtil.CUSTOMROUTE, serviceName,
- RouteUtil.ROUTE_PATH_INFO);
- Map<String, String> infomap = jedis.hgetAll(routekey);
- if (!infomap.isEmpty()) {
- customRouteInfo = new CustomRouteInfo();
- customRouteInfo.setServiceName(serviceName);
- customRouteInfo.setUrl(infomap.get("url"));
- customRouteInfo.setControl(infomap.get("control"));
- customRouteInfo.setStatus(infomap.get("status"));
- customRouteInfo.setVisualRange(infomap.get("visualRange"));
- customRouteInfo.setUseOwnUpstream(infomap.get("useOwnUpstream"));
-
-
- String serviceLBkey =
- RouteUtil.getPrefixedKey("", RouteUtil.CUSTOMROUTE, serviceName,
- RouteUtil.ROUTE_PATH_LOADBALANCE);
- Set<String> serviceLBset = jedis.keys(serviceLBkey + ":*");
- int serverNum = serviceLBset.size();
- RouteServer[] CustomRouteServerList = new RouteServer[serverNum];
- int i = 0;
- for (String serviceInfo : serviceLBset) {
- Map<String, String> serviceLBmap = jedis.hgetAll(serviceInfo);
- RouteServer server = new RouteServer();
- server.setIp(serviceLBmap.get("ip"));
- server.setPort(serviceLBmap.get("port"));
- server.setWeight(Integer.parseInt(serviceLBmap.get("weight")));
- CustomRouteServerList[i] = server;
- i++;
- }
-
- customRouteInfo.setServers(CustomRouteServerList);
- }
-
-
- return customRouteInfo;
- }
-
- public synchronized CustomRouteInfo updateCustomRouteInstance(String serviceName,
- CustomRouteInfo customRouteInfo, String serverPort) {
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- try {
-
- if (serviceName.equals(customRouteInfo.getServiceName())) {
- deleteCustomRoute(serviceName, RouteUtil.ROUTE_PATH_LOADBALANCE + "*", serverPort);
- } else {
- deleteCustomRoute(serviceName, "*", serverPort);
- }
-
-
- saveCustomRouteInstance(customRouteInfo, serverPort);
-
-
-
- } catch (ExtendedNotSupportedException e) {
- throw e;
- } catch (Exception e) {
- LOGGER.error("updateCustomRoute throw exception", e);
- throw new ExtendedInternalServerErrorException("update CustomRoute throw exception"
- + e.getMessage());
-
- }
-
- return customRouteInfo;
-
- }
-
- public synchronized CustomRouteInfo updateCustomRouteStatus(String serviceName, String status) {
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- if (!RouteUtil.contain(RouteUtil.statusRangeMatches, status)) {
- throw new ExtendedNotSupportedException(
- "save CustomRouteInfo Status FAIL:status is wrong,value range:("
- + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
- }
-
- CustomRouteInfo new_customRouteInfo = getCustomRouteInstance(serviceName);
-
-
-
- String serviceInfokey =
- RouteUtil.getPrefixedKey("", RouteUtil.CUSTOMROUTE, serviceName,
- RouteUtil.ROUTE_PATH_INFO);
- Map<String, String> serviceInfoMap = new HashMap<String, String>();
- serviceInfoMap.put("status", status);
-
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
- jedis.hmset(serviceInfokey, serviceInfoMap);
- new_customRouteInfo.setStatus(status);
-
- } catch (Exception e) {
-
- LOGGER.error("update CustomRoute status throw exception", e);
- throw new ExtendedInternalServerErrorException(
- "update CustomRoute status throw exception" + e.getMessage());
-
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- return new_customRouteInfo;
- }
-
- public synchronized CustomRouteInfo saveCustomRouteInstance(CustomRouteInfo customRouteInfo,
- String serverPort) {
-
- if (StringUtils.isBlank(customRouteInfo.getServiceName())
- || customRouteInfo.getServers().length == 0) {
- throw new ExtendedNotSupportedException(
- "save CustomRouteInfo FAIL: Some required fields are empty");
- }
-
-
- if (!RegExpTestUtil.urlRegExpTest(customRouteInfo.getServiceName())) {
- throw new ExtendedNotSupportedException(
- "save CustomRouteInfo FAIL: ServiceName is not a valid format(ServiceName must be begin with /)");
-
- }
-
- if (StringUtils.isNotBlank(customRouteInfo.getUrl())){
- if (!RegExpTestUtil.urlRegExpTest(customRouteInfo.getUrl())) {
- throw new ExtendedNotSupportedException(
- "save CustomRouteInfo FAIL:url is not a valid format(url must be begin with /)");
-
- }
- }
-
- if (!RouteUtil.contain(RouteUtil.visualRangeRange, customRouteInfo.getVisualRange())) {
- throw new ExtendedNotSupportedException(
- "save CustomRouteInfo FAIL:VisualRange is wrong,value range:("
- + RouteUtil.show(RouteUtil.visualRangeMatches) + ")");
- }
-
- if (!RouteUtil.contain(RouteUtil.controlRangeMatches, customRouteInfo.getControl())) {
- throw new ExtendedNotSupportedException(
- "save CustomRouteInfo FAIL:control is wrong,value range:("
- + RouteUtil.show(RouteUtil.controlRangeMatches) + ")");
- }
-
- if (!RouteUtil.contain(RouteUtil.statusRangeMatches, customRouteInfo.getStatus())) {
- throw new ExtendedNotSupportedException(
- "save CustomRouteInfo FAIL:status is wrong,value range:("
- + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
- }
-
- if (!RouteUtil.contain(RouteUtil.useOwnUpstreamRangeMatches, customRouteInfo.getUseOwnUpstream())) {
- throw new ExtendedNotSupportedException(
- "save apiRouteInfo FAIL:useOwnUpstream is wrong,value range:("
- + RouteUtil.show(RouteUtil.useOwnUpstreamRangeMatches) + ")");
- }
-
- RouteServer[] serverList = customRouteInfo.getServers();
- for (int i = 0; i < serverList.length; i++) {
- RouteServer server = serverList[i];
- if (!RegExpTestUtil.ipRegExpTest(server.getIp())) {
- throw new ExtendedNotSupportedException("save CustomRouteInfo FAIL:IP("
- + server.getIp() + ")is not a valid ip address");
- }
-
- if (!RegExpTestUtil.portRegExpTest(server.getPort())) {
- throw new ExtendedNotSupportedException("save CustomRouteInfo FAIL:Port("
- + server.getPort() + ")is not a valid Port address");
- }
- }
-
-
- String serviceInfokey =
- RouteUtil.getPrefixedKey(serverPort, RouteUtil.CUSTOMROUTE,
- customRouteInfo.getServiceName().trim(), RouteUtil.ROUTE_PATH_INFO);
- Map<String, String> serviceInfoMap = new HashMap<String, String>();
- serviceInfoMap.put("url", "/".equals(customRouteInfo.getUrl().trim())
- ? ""
- : customRouteInfo.getUrl().trim());
- serviceInfoMap.put("control", customRouteInfo.getControl());
- serviceInfoMap.put("status", customRouteInfo.getStatus());
- serviceInfoMap.put("visualRange", customRouteInfo.getVisualRange());
- serviceInfoMap.put("useOwnUpstream", customRouteInfo.getUseOwnUpstream());
-
-
-
- String serviceLBkey =
- RouteUtil.getPrefixedKey(serverPort, RouteUtil.CUSTOMROUTE,
- customRouteInfo.getServiceName(), RouteUtil.ROUTE_PATH_LOADBALANCE);
-
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
- jedis.hmset(serviceInfokey, serviceInfoMap);
-
-
- for (int i = 0; i < serverList.length; i++) {
- Map<String, String> servermap = new HashMap<String, String>();
- RouteServer server = serverList[i];
-
- servermap.put("ip", server.getIp());
- servermap.put("port", server.getPort());
- servermap.put("weight", Integer.toString(server.getWeight()));
-
- jedis.hmset(serviceLBkey + ":server" + (i + 1), servermap);
- }
-
-
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new ExtendedInternalServerErrorException("call redis throw exception:"
- + e.getMessage());
-
- } finally {
- JedisUtil.returnJedisInstance(jedis);;
- }
-
- return customRouteInfo;
- }
-
-
-
- public synchronized void deleteCustomRoute(String serviceName, String delKey, String serverPort) {
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- Jedis jedis = null;
-
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
-
- String routekey =
- RouteUtil
- .getPrefixedKey(serverPort, RouteUtil.CUSTOMROUTE, serviceName, delKey);
- Set<String> infoSet = jedis.keys(routekey);
-
- if (infoSet.isEmpty()) {
- LOGGER.warn("delete CustomRoute FAIL:serviceName-"
- + serviceName + " not fond ");
- }
- else{
-
- String[] paths = new String[infoSet.size()];
- infoSet.toArray(paths);
- jedis.del(paths);
- }
-
- } catch (ExtendedNotFoundException e) {
- throw e;
- } catch (Exception e) {
-
- LOGGER.error("delete CustomRoute throw exception", e);
- throw new ExtendedInternalServerErrorException("delete CustomRoute throw exception:"
- + e.getMessage());
-
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
-
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/IuiRouteServiceWrapper.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/IuiRouteServiceWrapper.java
deleted file mode 100644
index b85b5ad..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/IuiRouteServiceWrapper.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang3.StringUtils;
-import org.openo.msb.api.IuiRouteInfo;
-import org.openo.msb.api.RouteServer;
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
-import org.openo.msb.api.exception.ExtendedNotFoundException;
-import org.openo.msb.api.exception.ExtendedNotSupportedException;
-import org.openo.msb.wrapper.util.JedisUtil;
-import org.openo.msb.wrapper.util.RegExpTestUtil;
-import org.openo.msb.wrapper.util.RouteUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import redis.clients.jedis.Jedis;
-
-public class IuiRouteServiceWrapper {
-
-
- private static final Logger LOGGER = LoggerFactory.getLogger(IuiRouteServiceWrapper.class);
-
- private static IuiRouteServiceWrapper instance = new IuiRouteServiceWrapper();
-
- private IuiRouteServiceWrapper() {}
-
- public static IuiRouteServiceWrapper getInstance() {
- return instance;
- }
-
- public IuiRouteInfo[] getAllIuiRouteInstances() {
-
-
- Jedis jedis = null;
- IuiRouteInfo[] iuiRouteList = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
-
- String routekey =
- RouteUtil
- .getPrefixedKey("", RouteUtil.IUIROUTE, "*", RouteUtil.ROUTE_PATH_INFO);
- Set<String> routeSet = jedis.keys(routekey);
- iuiRouteList = new IuiRouteInfo[routeSet.size()];
-
- int i = 0;
- for (String routePath : routeSet) {
- String[] routePathArray = routePath.split(":");
- IuiRouteInfo iuiRoute = getIuiRouteInstance(routePathArray[3], jedis);
- iuiRouteList[i] = iuiRoute;
- i++;
- }
-
-
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new ExtendedInternalServerErrorException("call redis throw exception:"
- + e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- return iuiRouteList;
- }
-
-
- public IuiRouteInfo getIuiRouteInstance(String serviceName) {
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- IuiRouteInfo iuiRouteInfo = null;
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
-
- iuiRouteInfo = getIuiRouteInstance(serviceName, jedis);
-
-
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new ExtendedInternalServerErrorException("call redis throw exception:"
- + e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- if (null == iuiRouteInfo) {
- String errInfo = "iuiRouteInfo not found: serviceName-" + serviceName;
- LOGGER.warn(errInfo);
- throw new ExtendedNotFoundException(errInfo);
-
- }
-
- return iuiRouteInfo;
-
- }
-
- public IuiRouteInfo getIuiRouteInstance(String serviceName, Jedis jedis) throws Exception {
-
-
- IuiRouteInfo iuiRouteInfo = null;
-
-
- String routekey =
- RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName,
- RouteUtil.ROUTE_PATH_INFO);
- Map<String, String> infomap = jedis.hgetAll(routekey);
- if (!infomap.isEmpty()) {
- iuiRouteInfo = new IuiRouteInfo();
- iuiRouteInfo.setServiceName(serviceName);
- iuiRouteInfo.setUrl(infomap.get("url"));
- iuiRouteInfo.setControl(infomap.get("control"));
- iuiRouteInfo.setStatus(infomap.get("status"));
- iuiRouteInfo.setVisualRange(infomap.get("visualRange"));
- iuiRouteInfo.setUseOwnUpstream(infomap.get("useOwnUpstream"));
-
-
- String serviceLBkey =
- RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName,
- RouteUtil.ROUTE_PATH_LOADBALANCE);
- Set<String> serviceLBset = jedis.keys(serviceLBkey + ":*");
- int serverNum = serviceLBset.size();
- RouteServer[] iuiRouteServerList = new RouteServer[serverNum];
- int i = 0;
- for (String serviceInfo : serviceLBset) {
- Map<String, String> serviceLBmap = jedis.hgetAll(serviceInfo);
- RouteServer server = new RouteServer();
- server.setIp(serviceLBmap.get("ip"));
- server.setPort(serviceLBmap.get("port"));
- server.setWeight(Integer.parseInt(serviceLBmap.get("weight")));
- iuiRouteServerList[i] = server;
- i++;
- }
-
- iuiRouteInfo.setServers(iuiRouteServerList);
- }
-
-
- return iuiRouteInfo;
- }
-
- public synchronized IuiRouteInfo updateIuiRouteInstance(String serviceName,
- IuiRouteInfo iuiRouteInfo) {
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- try {
- if (serviceName.equals(iuiRouteInfo.getServiceName())) {
- deleteIuiRoute(serviceName, RouteUtil.ROUTE_PATH_LOADBALANCE + "*");
-
- } else {
- deleteIuiRoute(serviceName, "*");
- }
- saveIuiRouteInstance(iuiRouteInfo);
-
- } catch (ExtendedNotSupportedException e) {
- throw e;
- } catch (Exception e) {
- LOGGER.error("updateIuiRoute throw exception", e);
- throw new ExtendedInternalServerErrorException("update IuiRouteInfo throw exception"
- + e.getMessage());
- }
-
- return iuiRouteInfo;
-
- }
-
- public synchronized IuiRouteInfo updateIuiRouteStatus(String serviceName, String status) {
-
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- if (!RouteUtil.contain(RouteUtil.statusRangeMatches, status)) {
- throw new ExtendedNotSupportedException(
- "save IuiRouteInfo Status FAIL:status is wrong,value range:("
- + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
- }
-
- IuiRouteInfo new_iuiRouteInfo = getIuiRouteInstance(serviceName);
-
- String serviceInfokey =
- RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName,
- RouteUtil.ROUTE_PATH_INFO);
- Map<String, String> serviceInfoMap = new HashMap<String, String>();
- serviceInfoMap.put("status", status);
-
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
- jedis.hmset(serviceInfokey, serviceInfoMap);
- new_iuiRouteInfo.setStatus(status);
-
- } catch (Exception e) {
- LOGGER.error("update IuiRoute status throw exception", e);
- throw new ExtendedInternalServerErrorException(
- "update IuiRouteInfo status throw exception" + e.getMessage());
-
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- return new_iuiRouteInfo;
- }
-
- public synchronized IuiRouteInfo saveIuiRouteInstance(IuiRouteInfo iuiRouteInfo) {
-
- if (StringUtils.isBlank(iuiRouteInfo.getServiceName())
- || iuiRouteInfo.getServers().length == 0) {
- throw new ExtendedNotSupportedException(
- "save iuiRouteInfo FAIL: Some required fields are empty");
- }
-
- if (StringUtils.isNotBlank(iuiRouteInfo.getUrl())){
- if (!RegExpTestUtil.urlRegExpTest(iuiRouteInfo.getUrl())) {
- throw new ExtendedNotSupportedException(
- "save iuiRouteInfo FAIL:url is not a valid format(url must be begin with /)");
-
- }
- }
-
- if (!RouteUtil.contain(RouteUtil.visualRangeRange, iuiRouteInfo.getVisualRange())) {
- throw new ExtendedNotSupportedException(
- "save iuiRouteInfo FAIL:VisualRange is wrong,value range:("
- + RouteUtil.show(RouteUtil.visualRangeMatches) + ")");
- }
-
- if (!RouteUtil.contain(RouteUtil.controlRangeMatches, iuiRouteInfo.getControl())) {
- throw new ExtendedNotSupportedException(
- "save iuiRouteInfo FAIL:control is wrong,value range:("
- + RouteUtil.show(RouteUtil.controlRangeMatches) + ")");
- }
-
- if (!RouteUtil.contain(RouteUtil.statusRangeMatches, iuiRouteInfo.getStatus())) {
- throw new ExtendedNotSupportedException(
- "save iuiRouteInfo FAIL:status is wrong,value range:("
- + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
- }
-
- if (!RouteUtil.contain(RouteUtil.useOwnUpstreamRangeMatches, iuiRouteInfo.getUseOwnUpstream())) {
- throw new ExtendedNotSupportedException(
- "save apiRouteInfo FAIL:useOwnUpstream is wrong,value range:("
- + RouteUtil.show(RouteUtil.useOwnUpstreamRangeMatches) + ")");
- }
-
- RouteServer[] serverList = iuiRouteInfo.getServers();
- for (int i = 0; i < serverList.length; i++) {
- RouteServer server = serverList[i];
- if (!RegExpTestUtil.ipRegExpTest(server.getIp())) {
- throw new ExtendedNotSupportedException("save iuiRouteInfo FAIL:IP("
- + server.getIp() + ")is not a valid ip address");
- }
-
- if (!RegExpTestUtil.portRegExpTest(server.getPort())) {
- throw new ExtendedNotSupportedException("save iuiRouteInfo FAIL:Port("
- + server.getPort() + ")is not a valid Port address");
- }
- }
-
-
- String serviceInfokey =
- RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, iuiRouteInfo.getServiceName().trim(),
- RouteUtil.ROUTE_PATH_INFO);
- Map<String, String> serviceInfoMap = new HashMap<String, String>();
- serviceInfoMap.put("url", "/".equals(iuiRouteInfo.getUrl().trim()) ? "" : iuiRouteInfo
- .getUrl().trim());
- serviceInfoMap.put("control", iuiRouteInfo.getControl());
- serviceInfoMap.put("status", iuiRouteInfo.getStatus());
- serviceInfoMap.put("visualRange", iuiRouteInfo.getVisualRange());
- serviceInfoMap.put("useOwnUpstream", iuiRouteInfo.getUseOwnUpstream());
-
-
- String serviceLBkey =
- RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, iuiRouteInfo.getServiceName(),
- RouteUtil.ROUTE_PATH_LOADBALANCE);
-
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
- jedis.hmset(serviceInfokey, serviceInfoMap);
-
- for (int i = 0; i < serverList.length; i++) {
- Map<String, String> servermap = new HashMap<String, String>();
- RouteServer server = serverList[i];
-
- servermap.put("ip", server.getIp());
- servermap.put("port", server.getPort());
- servermap.put("weight", Integer.toString(server.getWeight()));
-
- jedis.hmset(serviceLBkey + ":server" + (i + 1), servermap);
- }
-
-
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new ExtendedInternalServerErrorException("call redis throw exception:"
- + e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);;
- }
-
- return iuiRouteInfo;
- }
-
-
-
- public synchronized void deleteIuiRoute(String serviceName, String delKey) {
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new ExtendedInternalServerErrorException(
- "fetch from jedis pool failed,null object!");
- }
-
- String routekey = RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName, delKey);
- Set<String> infoSet = jedis.keys(routekey);
-
- if (infoSet.isEmpty()) {
- LOGGER.warn("delete IuiRoute FAIL:serviceName-"
- + serviceName + " not fond ");
- }
- else{
-
- String[] paths = new String[infoSet.size()];
- infoSet.toArray(paths);
- jedis.del(paths);
- }
-
-
- } catch (ExtendedNotFoundException e) {
- throw e;
- } catch (Exception e) {
- LOGGER.error("delete IuiRoute throw exception", e);
- throw new ExtendedInternalServerErrorException("delete IuiRoute throw exception:"
- + e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
-
- }
-
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MetricsServiceWrapper.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MetricsServiceWrapper.java
deleted file mode 100644
index edab97b..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MetricsServiceWrapper.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper;
-
-import java.io.IOException;
-
-import org.apache.http.ParseException;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
-import org.openo.msb.api.MetricsInfo;
-import org.openo.msb.wrapper.util.MetricsUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.PropertyAccessor;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-public class MetricsServiceWrapper {
-
- private static final Logger LOGGER = LoggerFactory
- .getLogger(MetricsServiceWrapper.class);
-
- public static MetricsInfo getMetricsInfo() {
-
- String metricsUrl = MetricsUtil.adminContextPath;
- String metricsJson = sendGetRequest(metricsUrl);
-
- metricsJson = metricsJson.replace("E_", "");//.replaceAll("(?![0-9])(\\.)(?![0-9])", "_").replace("-", "_")
- ObjectMapper mapper = new ObjectMapper();
- mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
- mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
- false);
- MetricsInfo metricsInfo = new MetricsInfo();
- try {
- metricsInfo = mapper.readValue(metricsJson, MetricsInfo.class);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- LOGGER.error("Jackson readValue to metricsInfo throw exception", e);
- }
-
- return metricsInfo;
- }
-
- public static String sendGetRequest(String url) {
- CloseableHttpClient httpClient = HttpClients.createDefault();
- HttpGet httpGet = new HttpGet(url);
-
- try {
- CloseableHttpResponse res = httpClient.execute(httpGet);
- try {
- if (res.getStatusLine().getStatusCode() == MetricsUtil.SC_OK) {
- return EntityUtils.toString(res.getEntity());
- }
- } finally {
- res.close();
- }
- } catch (ParseException e) {
- LOGGER.error("HttpClient throw ParseException:" + url, e);
- } catch (IOException e) {
- LOGGER.error("HttpClient throw IOException:" + url, e);
- }
- finally{
- try {
- httpClient.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- LOGGER.error("HttpClient Close throw IOException", e);
- }
- }
-
- return null;
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MicroServiceWrapper.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MicroServiceWrapper.java
deleted file mode 100644
index 0099481..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/MicroServiceWrapper.java
+++ /dev/null
@@ -1,515 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper;
-
-import java.util.Set;
-
-import org.apache.commons.lang3.StringUtils;
-import org.openo.msb.api.MicroServiceFullInfo;
-import org.openo.msb.api.MicroServiceInfo;
-import org.openo.msb.api.Node;
-import org.openo.msb.api.NodeInfo;
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
-import org.openo.msb.api.exception.ExtendedNotFoundException;
-import org.openo.msb.api.exception.ExtendedNotSupportedException;
-import org.openo.msb.wrapper.util.MicroServiceDB;
-import org.openo.msb.wrapper.util.RegExpTestUtil;
-import org.openo.msb.wrapper.util.RouteUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class MicroServiceWrapper {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceWrapper.class);
-
- private static MicroServiceWrapper instance = new MicroServiceWrapper();
-
-
- private MicroServiceWrapper() {}
-
- public static MicroServiceWrapper getInstance() {
- return instance;
- }
-
-
- /**
- * @Title: getAllMicroServiceInstances
- * @Description: getAllMicroServiceInstances
- * @param: @return
- * @return: Response
- * @throws Exception
- */
- public MicroServiceFullInfo[] getAllMicroServiceInstances(){
-
- try {
- return MicroServiceDB.getInstance().getAllMicroServiceInstances();
-
- } catch (Exception e) {
- throw new ExtendedInternalServerErrorException(e.getMessage());
- }
-
- }
-
- /**
- * @Title: getMicroServiceInstance
- * @Description: (getMicroServiceInstance)
- * @param: @param serviceName
- * @param: @param version
- * @param: @return
- * @return: ApiRouteInfo
- */
- public MicroServiceFullInfo getMicroServiceInstance(String serviceName, String version,String serverPort) {
- if("null".equals(version)) {
- version="";
- }
- serviceName=serviceName.replace("*", "/");
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException("serviceName can't be empty");
- }
-
- if (StringUtils.isNotBlank(version)) {
- if (!RegExpTestUtil.versionRegExpTest(version)) {
- throw new ExtendedNotSupportedException("version (" + version
- + ") is not a valid format");
- }
- }
-
- MicroServiceFullInfo microServiceInfo;
- try {
- microServiceInfo =
- MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,serverPort);
-
- } catch (Exception e) {
- throw new ExtendedInternalServerErrorException(e.getMessage());
- }
-
- if (null == microServiceInfo) {
- String errInfo =
- "microservice not found: serviceName-" + serviceName + ",version-" + version;
- LOGGER.warn(errInfo);
- throw new ExtendedNotFoundException(errInfo);
-
- }
-
- return microServiceInfo;
- }
-
-
-
- /**
- * @Title: updateMicroServiceInstance
- * @Description: updateMicroServiceInstance
- * @param: serviceName
- * @param: version
- * @param: microServiceInfo
- * @return: RouteResult
- */
- public synchronized MicroServiceFullInfo updateMicroServiceInstance(String serviceName,
- String version, MicroServiceInfo microServiceInfo) {
- if("null".equals(version)) {
- version="";
- }
- serviceName=serviceName.replace("*", "/");
-
- try {
-
-
- MicroServiceFullInfo oldService= getMicroServiceInstance(serviceName,version,"");
-
- // Delete the original record
- MicroServiceDB.getInstance().deleteMicroService(serviceName, version,"");
- // Notify the listeners
- MicroServiceDB.getInstance().noticeApiListener(oldService, "DELETE","");
- // Save the new record
- MicroServiceDB.getInstance().saveMicroServiceInfo2Redis(microServiceInfo,"");
-
- MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "ADD","");
- MicroServiceFullInfo newMicroServiceInfo =
- MicroServiceDB.getInstance().getMicroServiceInstance(
- microServiceInfo.getServiceName(), microServiceInfo.getVersion(),"");
- return newMicroServiceInfo;
- } catch (Exception e) {
- LOGGER.error("update MicroService throw exception", e);
- throw new ExtendedInternalServerErrorException(e.getMessage());
- }
-
-
- }
-
- public synchronized MicroServiceFullInfo updateMicroServiceNode(String serviceName,
- String version, String ip,String port, int ttl) {
- if("null".equals(version)) {
- version="";
- }
- serviceName=serviceName.replace("*", "/");
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException(
- "update MicroService Node FAIL:serviceName can't be empty");
- }
-
- if (StringUtils.isNotBlank(version)) {
- if (!RegExpTestUtil.versionRegExpTest(version)) {
- throw new ExtendedNotSupportedException(
- "update MicroService Node FAIL:version is not a valid format");
- }
- }
-
- if (!RegExpTestUtil.ipRegExpTest(ip)) {
- throw new ExtendedNotSupportedException("update MicroService Node FAIL:ip(" + ip
- + ")is not a valid IP address");
- }
-
- if (!RegExpTestUtil.portRegExpTest(port)) {
- throw new ExtendedNotSupportedException("update MicroService Node FAIL:port(" + port
- + ")is not a valid Port address");
- }
-
- try {
-
- MicroServiceDB.getInstance().updateMicroServiceNode2Redis(serviceName, version, ip,port,ttl);
-
- MicroServiceFullInfo newMicroServiceInfo =
- MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");
-
- return newMicroServiceInfo;
- } catch (NullPointerException e) {
- throw new ExtendedNotFoundException(e.getMessage());
- } catch (Exception e) {
- LOGGER.error("update MicroServiceNode throw exception", e);
- throw new ExtendedInternalServerErrorException(e.getMessage());
- }
- }
-
- /**
- * @Title updateMicroServiceStatus
- * @Description updateMicroServiceStatus
- * @param serviceName
- * @param version
- * @param status
- * @return
- * @return RouteResult
- */
-
- public synchronized MicroServiceFullInfo updateMicroServiceStatus(String serviceName, String version,
- String status) {
-
- if ("null".equals(version)) {
- version = "";
- }
- serviceName=serviceName.replace("*", "/");
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException(
- "update MicroService status FAIL:serviceName can't be empty");
- }
-
- if (StringUtils.isNotBlank(version)) {
- if (!RegExpTestUtil.versionRegExpTest(version)) {
- throw new ExtendedNotSupportedException(
- "update MicroService status FAIL:version is not a valid format");
- }
- }
-
- if(!"0".equals(status) && !"2".equals(status) && !"1".equals(status)){
-
- throw new ExtendedNotSupportedException("update MicroService status FAIL:status is wrong");
- }
-
-
- try {
-
- MicroServiceDB.getInstance().updateMicroServiceStatus(serviceName, version, status);
-
- MicroServiceFullInfo newMicroServiceInfo =
- MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");
-
- // Notify the listeners
- MicroServiceDB.getInstance().noticeUpdateStatusListener(newMicroServiceInfo, status);
-
-
- return newMicroServiceInfo;
- } catch (NullPointerException e) {
- throw new ExtendedNotFoundException(e.getMessage());
- } catch (Exception e) {
- LOGGER.error("update MicroServiceNode throw exception", e);
- throw new ExtendedInternalServerErrorException(e.getMessage());
- }
-
-
- }
-
-
- public synchronized MicroServiceFullInfo saveMicroServiceInstance(
- MicroServiceInfo microServiceInfo, boolean createOrUpdate,String requestIP,String serverPort) {
-
- if (StringUtils.isBlank(microServiceInfo.getServiceName())
- || StringUtils.isBlank(microServiceInfo.getProtocol())
- || microServiceInfo.getNodes().size() == 0) {
- throw new ExtendedNotSupportedException(
- "register MicroServiceInfo FAIL: Some required fields are empty");
- }
-
- for (Node node : microServiceInfo.getNodes()) {
-
- if(node.getIp()==null || node.getIp().isEmpty()){
- node.setIp(requestIP);
- }
- else if (!RegExpTestUtil.ipRegExpTest(node.getIp())) {
- throw new ExtendedNotSupportedException("register MicroServiceInfo FAIL:IP("
- + node.getIp() + ")is not a valid ip address");
- }
-
- if (!RegExpTestUtil.portRegExpTest(node.getPort())) {
- throw new ExtendedNotSupportedException("register MicroServiceInfo FAIL:Port("
- + node.getPort() + ")is not a valid Port address");
- }
- }
-
- if (StringUtils.isNotBlank(microServiceInfo.getVersion())) {
- if (!RegExpTestUtil.versionRegExpTest(microServiceInfo.getVersion())) {
- throw new ExtendedNotSupportedException(
- "register MicroServiceInfo FAIL:version is not a valid format");
-
- }
- }
-
- if (StringUtils.isNotBlank(microServiceInfo.getUrl().trim())) {
- if (!RegExpTestUtil.urlRegExpTest(microServiceInfo.getUrl())) {
- throw new ExtendedNotSupportedException(
- "register MicroServiceInfo FAIL:url is not a valid format(url must be begin with /)");
-
- }
- }
-
-
- if (RouteUtil.PROTOCOL_LIST.indexOf(microServiceInfo.getProtocol().trim()) == -1) {
- throw new ExtendedNotSupportedException(
- "register MicroServiceInfo FAIL:Protocol is wrong,value range:("
- + RouteUtil.PROTOCOL_LIST + ")");
- }
-
-
- try {
-
-
-
- if (createOrUpdate == false) {
- //After the first remove added
- MicroServiceDB.getInstance().deleteMicroService(
- microServiceInfo.getServiceName(), microServiceInfo.getVersion(),serverPort);
-
- //Notify the listeners
- MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE",serverPort);
-
- }
-
- //Save the new record
- MicroServiceDB.getInstance().saveMicroServiceInfo2Redis(microServiceInfo,serverPort);
- //Notify the listeners
- MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "ADD",serverPort);
-
-
-
- MicroServiceFullInfo newMicroServiceInfo =
- MicroServiceDB.getInstance().getMicroServiceInstance(
- microServiceInfo.getServiceName(), microServiceInfo.getVersion(),serverPort);
-
-
-
- return newMicroServiceInfo;
-
- } catch (ExtendedNotSupportedException e) {
- throw e;
- } catch (Exception e) {
- throw new ExtendedInternalServerErrorException(e.getMessage());
- }
-
- }
-
-
- public synchronized void deleteMicroService(String serviceName, String version) {
- if("null".equals(version)) {
- version="";
- }
- serviceName=serviceName.replace("*", "/");
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException(
- "delete MicroServiceInfo FAIL:serviceName can't be empty");
- }
-
- if (StringUtils.isNotBlank(version)) {
- if (!RegExpTestUtil.versionRegExpTest(version)) {
- throw new ExtendedNotSupportedException(
- "delete MicroServiceInfo FAIL:version is not a valid format");
-
- }
- }
-
- try {
-
- MicroServiceFullInfo microServiceInfo =
- MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");
-
- if (microServiceInfo == null) {
- LOGGER.warn("serviceName-"+ serviceName + ",version-" + version + " not fond ");
- return;
- }
-
- MicroServiceDB.getInstance().deleteMicroService(serviceName, version,"");
- //Notify the listeners
- MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE","");
-
- } catch (Exception e) {
- LOGGER.error("delete MicroServiceInfo throw exception", e);
- throw new ExtendedInternalServerErrorException(e.getMessage());
-
- }
-
- LOGGER.info("delete MicroServiceInfo success:serviceName-"
- + serviceName + ",version-" + version );
-
- }
-
-
- public synchronized void deleteMicroService(String serviceName, String version,String serverPort) {
- if("null".equals(version)) {
- version="";
- }
- serviceName=serviceName.replace("*", "/");
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException(
- "delete MicroServiceInfo FAIL:serviceName can't be empty");
- }
-
- if (StringUtils.isNotBlank(version)) {
- if (!RegExpTestUtil.versionRegExpTest(version)) {
- throw new ExtendedNotSupportedException(
- "delete MicroServiceInfo FAIL:version is not a valid format");
-
- }
- }
-
- try {
-
- MicroServiceFullInfo microServiceInfo =
- MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,serverPort);
-
- if (microServiceInfo == null) {
- throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL:serviceName-"
- + serviceName + ",version-" + version + " not fond ");
- }
-
- MicroServiceDB.getInstance().deleteMicroService(serviceName, version,serverPort);
- //Notify the listeners
- MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE",serverPort);
- } catch (ExtendedNotFoundException e) {
- throw e;
- } catch (Exception e) {
- LOGGER.error("delete MicroServiceInfo throw exception", e);
- throw new ExtendedInternalServerErrorException(e.getMessage());
-
- }
-
- LOGGER.info("delete MicroServiceInfo success:serviceName-"
- + serviceName + ",version-" + version );
-
- }
-
- public synchronized void deleteMicroServiceInstance(String serviceName, String version,
- String ip,String port) {
- if("null".equals(version)) {
- version="";
- }
- serviceName=serviceName.replace("*", "/");
-
- if (StringUtils.isBlank(serviceName)) {
- throw new ExtendedNotSupportedException(
- "delete MicroServiceInfo FAIL:serviceName can't be empty");
- }
-
- if (StringUtils.isNotBlank(version)) {
- if (!RegExpTestUtil.versionRegExpTest(version)) {
- throw new ExtendedNotSupportedException(
- "delete MicroServiceInfo FAIL:version is not a valid format");
- }
- }
-
- if (!RegExpTestUtil.ipRegExpTest(ip)) {
- throw new ExtendedNotSupportedException("delete MicroServiceInfo FAIL:IP(" + ip
- + ")is not a valid IP address");
- }
-
- if (!RegExpTestUtil.portRegExpTest(port)) {
- throw new ExtendedNotSupportedException("delete MicroServiceInfo FAIL:Port(" + port
- + ")is not a valid Port address");
- }
-
-
- try {
- MicroServiceFullInfo microServiceInfo =
- MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");
-
- if (microServiceInfo == null) {
- throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL:serviceName-"
- + serviceName + ",version-" + version + " not fond ");
- }
-
- Set<NodeInfo> nodes = microServiceInfo.getNodes();
-
- boolean ifFindBNode = false;
-
- for (Node node : nodes) {
- if (node.getIp().equals(ip) && node.getPort().equals(port)) {
- ifFindBNode = true;
- nodes.remove(node);
-
- if (nodes.isEmpty()) {
- //delete MicroService
- MicroServiceDB.getInstance().deleteMicroService(serviceName, version,"");
- //Notify the listeners
- MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE","");
- } else {
- //delete Node
- MicroServiceDB.getInstance().deleteNode(serviceName, version, ip,port);
- MicroServiceDB.getInstance().noticeUpdateApiListener(serviceName, version,microServiceInfo,"");
- }
-
- break;
- }
- }
-
- if (!ifFindBNode) {
- throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL: node-" + ip+":"+port
- + " not fond ");
- }
-
-
- } catch (ExtendedNotFoundException e) {
- throw e;
- } catch (Exception e) {
- LOGGER.error("deleteApiRoute throw exception", e);
- throw new ExtendedInternalServerErrorException(e.getMessage());
-
- }
-
- }
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ServiceAccessWrapper.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ServiceAccessWrapper.java
deleted file mode 100644
index 23a02a1..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/ServiceAccessWrapper.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.openo.msb.api.ServiceAccessInfo;
-import org.openo.msb.wrapper.util.JedisUtil;
-import org.openo.msb.wrapper.util.RouteUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import redis.clients.jedis.Jedis;
-
-public class ServiceAccessWrapper {
- private static final Logger LOGGER = LoggerFactory.getLogger(ServiceAccessWrapper.class);
-
- private static ServiceAccessWrapper instance = new ServiceAccessWrapper();
-
- private ServiceAccessWrapper() {}
-
- public static ServiceAccessWrapper getInstance() {
- return instance;
- }
-
- public ServiceAccessInfo getApiServiceAccessAddr(String serviceName, String version, String host) {
-
- ServiceAccessInfo apiRouteAccessInfo = null;
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new Exception("fetch from jedis pool failed,null object!");
- }
-
- if ("null".equals(version)) {
- version = "";
- }
-
- String routekey =
- RouteUtil.getPrefixedKey("",RouteUtil.APIROUTE, serviceName, version,
- RouteUtil.ROUTE_PATH_INFO);
- Boolean isExist = jedis.exists(routekey);
- if (isExist) {
- apiRouteAccessInfo = new ServiceAccessInfo();
- apiRouteAccessInfo.setServiceName(serviceName);
- apiRouteAccessInfo.setVersion(version);
- String accessAddr = "http://" + host + "/api/" + serviceName + "/" + version;
- apiRouteAccessInfo.setAccessAddr(accessAddr);
- }
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
- return apiRouteAccessInfo;
-
- }
-
- public List<ServiceAccessInfo> getApiRouteAccessAddr(String serviceType, String serviceName,
- String version, String host) {
- List<ServiceAccessInfo> serviceList = new ArrayList<ServiceAccessInfo>();
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new Exception("fetch from jedis pool failed,null object!");
- }
-
- String keyPattern = this.getRedisSearchPattern(serviceType, serviceName, version);
- Set<String> infoKeys = jedis.keys(keyPattern);
- Pattern pattern = this.getKeyPattern();
- for (Iterator<String> iterator = infoKeys.iterator(); iterator.hasNext();) {
- String infoKey = (String) iterator.next();
- Matcher matcher = pattern.matcher(infoKey);
- if (matcher.matches()) {
- ServiceAccessInfo serviceAccessInfo = new ServiceAccessInfo();
- serviceAccessInfo.setServiceType(matcher.group("servicetype"));
- serviceAccessInfo.setServiceName(matcher.group("servicename"));
- serviceAccessInfo.setVersion(matcher.group("version"));
- this.buildServiceAccessAddr(serviceAccessInfo, host, infoKey, jedis);
- serviceList.add(serviceAccessInfo);
- }
- }
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
- return serviceList;
-
- }
-
- private void buildServiceAccessAddr(ServiceAccessInfo serviceAccessInfo, String host,
- String infoKey, Jedis jedis) {
- String serviceType = serviceAccessInfo.getServiceType();
- StringBuffer accessAddr = new StringBuffer();
- switch (serviceType) {
- case RouteUtil.APIROUTE:
- accessAddr.append("http://").append(host).append(":").append(JedisUtil.serverPort)
- .append("/").append(serviceAccessInfo.getServiceType()).append("/")
- .append(serviceAccessInfo.getServiceName()).append("/")
- .append(serviceAccessInfo.getVersion());
- serviceAccessInfo.setAccessAddr(accessAddr.toString());
- break;
- case RouteUtil.IUIROUTE:
- accessAddr.append("http://").append(host).append(":").append(JedisUtil.serverPort)
- .append("/").append(serviceAccessInfo.getServiceType()).append("/")
- .append(serviceAccessInfo.getServiceName());
- serviceAccessInfo.setAccessAddr(accessAddr.toString());
- break;
- case RouteUtil.CUSTOMROUTE:
- accessAddr.append("http://").append(host).append(":").append(JedisUtil.serverPort)
- .append(serviceAccessInfo.getServiceName());
- serviceAccessInfo.setAccessAddr(accessAddr.toString());
- break;
- case RouteUtil.P2PROUTE:
- accessAddr.append(jedis.hget(infoKey, "url"));
- serviceAccessInfo.setAccessAddr(accessAddr.toString());
- break;
- default:
- serviceAccessInfo.setAccessAddr("not supported now");
- break;
- }
- }
-
- private String getRedisSearchPattern(String serviceType, String serviceName, String version) {
- StringBuffer sb = new StringBuffer();
- sb.append(RouteUtil.ROUTE_PATH);
- if (null != serviceType && !"".equals(serviceType)) {
- sb.append(":").append(serviceType);
- } else {
- sb.append(":").append("*");
- }
- sb.append(":").append(serviceName);
- if (null != version && !"".equals(version)) {
- sb.append(":");
- sb.append(version);
- sb.append(":");
- } else {
- sb.append(":*");
- }
- sb.append(RouteUtil.ROUTE_PATH_INFO);
- return sb.toString();
- }
-
- private Pattern getKeyPattern() {
- String pStr =
- "conductor:routing:(?<servicetype>api|iui|custom|p2p):(?<servicename>[^:]+)(:(?<version>[^:]*))?:info";
- return Pattern.compile(pStr);
- }
-} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/CatalogClient.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/CatalogClient.java
deleted file mode 100644
index 67115a8..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/CatalogClient.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul;
-
-import static org.openo.msb.wrapper.consul.util.ClientUtil.response;
-
-import java.util.List;
-import java.util.Map;
-
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MediaType;
-
-import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
-import org.openo.msb.wrapper.consul.model.ConsulResponse;
-import org.openo.msb.wrapper.consul.model.catalog.CatalogNode;
-import org.openo.msb.wrapper.consul.model.catalog.CatalogService;
-import org.openo.msb.wrapper.consul.model.health.Node;
-import org.openo.msb.wrapper.consul.option.CatalogOptions;
-import org.openo.msb.wrapper.consul.option.QueryOptions;
-
-/**
- * HTTP Client for /v1/catalog/ endpoints or api/catalog/v1 by openresty
- */
-public class CatalogClient {
-
- private static final GenericType<List<String>> TYPE_STRING_LIST = new GenericType<List<String>>() {};
- private static final GenericType<List<Node>> TYPE_NODE_LIST = new GenericType<List<Node>>() {};
- private static final GenericType<Map<String, List<String>>> TYPE_SERVICES_MAP = new GenericType<Map<String, List<String>>>() {};
- private static final GenericType<List<CatalogService>> TYPE_CATALOG_SERVICE_LIST = new GenericType<List<CatalogService>>() {};
- private static final GenericType<CatalogNode> TYPE_CATALOG_NODE = new GenericType<CatalogNode>() {};
-
- private final WebTarget webTarget;
-
- /**
- * Constructs an instance of this class.
- *
- * @param webTarget The {@link javax.ws.rs.client.WebTarget} to base requests from.
- */
- CatalogClient(WebTarget webTarget) {
- this.webTarget = webTarget;
- }
-
- /**
- * Retrieves all datacenters.
- *
- * GET /v1/catalog/datacenters
- *
- * @return A list of datacenter names.
- */
- public List<String> getDatacenters() {
- return webTarget.path("datacenters").request()
- .accept(MediaType.APPLICATION_JSON_TYPE).get(TYPE_STRING_LIST);
- }
-
- /**
- * Retrieves all nodes.
- *
- * GET /v1/catalog/nodes
- *
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
- * {@link org.openo.msb.wrapper.consul.model.health.Node} objects.
- */
- public ConsulResponse<List<Node>> getNodes() {
- return getNodes(null, QueryOptions.BLANK);
- }
-
- /**
- * Retrieves all nodes for a given datacenter.
- *
- * GET /v1/catalog/nodes?dc={datacenter}
- *
- * @param catalogOptions Catalog specific options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
- * {@link org.openo.msb.wrapper.consul.model.health.Node} objects.
- */
- public ConsulResponse<List<Node>> getNodes(CatalogOptions catalogOptions) {
- return getNodes(catalogOptions, QueryOptions.BLANK);
- }
-
- /**
- * Retrieves all nodes with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/catalog/nodes
- *
- * @param queryOptions The Query Options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
- * {@link org.openo.msb.wrapper.consul.model.health.Node} objects.
- */
- public ConsulResponse<List<Node>> getNodes(QueryOptions queryOptions) {
- return getNodes(null, queryOptions);
- }
-
- /**
- * Retrieves all nodes for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/catalog/nodes?dc={datacenter}
- *
- * @param catalogOptions Catalog specific options to use.
- * @param queryOptions The Query Options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
- * {@link org.openo.msb.wrapper.consul.model.health.Node} objects.
- */
- public ConsulResponse<List<Node>> getNodes(CatalogOptions catalogOptions, QueryOptions queryOptions) {
- return response(webTarget.path("nodes"), catalogOptions, queryOptions, TYPE_NODE_LIST);
- }
-
- /**
- * Retrieves all services for a given datacenter.
- *
- * GET /v1/catalog/services?dc={datacenter}
- *
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags.
- */
- public ConsulResponse<Map<String, List<String>>> getServices() {
- return getServices(null, QueryOptions.BLANK);
- }
-
- /**
- * Retrieves all services for a given datacenter.
- *
- * GET /v1/catalog/services?dc={datacenter}
- *
- * @param catalogOptions Catalog specific options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags.
- */
- public ConsulResponse<Map<String, List<String>>> getServices(CatalogOptions catalogOptions) {
- return getServices(catalogOptions, QueryOptions.BLANK);
- }
-
- /**
- * Retrieves all services for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/catalog/services?dc={datacenter}
- *
- * @param queryOptions The Query Options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags.
- */
- public ConsulResponse<Map<String, List<String>>> getServices(QueryOptions queryOptions) {
- return getServices(null, queryOptions);
- }
-
- /**
- * Retrieves all services for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/catalog/services?dc={datacenter}
- *
- * @param catalogOptions Catalog specific options to use.
- * @param queryOptions The Query Options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags.
- */
- public ConsulResponse<Map<String, List<String>>> getServices(CatalogOptions catalogOptions, QueryOptions queryOptions) {
- return response(webTarget.path("services"), catalogOptions, queryOptions, TYPE_SERVICES_MAP);
- }
-
- public void getService(QueryOptions queryOptions, ConsulResponseCallback<Map<String, List<String>>> callback) {
- response(webTarget.path("services"), CatalogOptions.BLANK,
- queryOptions, TYPE_SERVICES_MAP, callback);
- }
-
- /**
- * Retrieves a single service.
- *
- * GET /v1/catalog/service/{service}
- *
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing
- * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
- */
- public ConsulResponse<List<CatalogService>> getService(String service) {
- return getService(service, null, QueryOptions.BLANK);
- }
-
- /**
- * Retrieves a single service for a given datacenter.
- *
- * GET /v1/catalog/service/{service}?dc={datacenter}
- *
- * @param catalogOptions Catalog specific options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing
- * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
- */
- public ConsulResponse<List<CatalogService>> getService(String service, CatalogOptions catalogOptions) {
- return getService(service, catalogOptions, QueryOptions.BLANK);
- }
-
- /**
- * Retrieves a single service with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/catalog/service/{service}
- *
- * @param queryOptions The Query Options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing
- * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
- */
- public ConsulResponse<List<CatalogService>> getService(String service, QueryOptions queryOptions) {
- return getService(service, null, queryOptions);
- }
-
- public void getService(String service, QueryOptions queryOptions, ConsulResponseCallback<List<CatalogService>> callback) {
-
- response(webTarget.path("service").path(service), CatalogOptions.BLANK,
- queryOptions, TYPE_CATALOG_SERVICE_LIST, callback);
- }
-
-
-
- /**
- * Retrieves a single service for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/catalog/service/{service}?dc={datacenter}
- *
- * @param catalogOptions Catalog specific options to use.
- * @param queryOptions The Query Options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing
- * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
- */
- public ConsulResponse<List<CatalogService>> getService(String service, CatalogOptions catalogOptions,
- QueryOptions queryOptions) {
- return response(webTarget.path("service").path(service), catalogOptions, queryOptions,
- TYPE_CATALOG_SERVICE_LIST);
- }
-
- /**
- * Retrieves a single node.
- *
- * GET /v1/catalog/node/{node}
- *
- * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
- */
- public ConsulResponse<CatalogNode> getNode(String node) {
- return getNode(node, null, QueryOptions.BLANK);
- }
-
- /**
- * Retrieves a single node for a given datacenter.
- *
- * GET /v1/catalog/node/{node}?dc={datacenter}
- *
- * @param catalogOptions Catalog specific options to use.
- * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
- */
- public ConsulResponse<CatalogNode> getNode(String node, CatalogOptions catalogOptions) {
- return getNode(node, catalogOptions, QueryOptions.BLANK);
- }
-
- /**
- * Retrieves a single node with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/catalog/node/{node}
- *
- * @param queryOptions The Query Options to use.
- * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
- */
- public ConsulResponse<CatalogNode> getNode(String node, QueryOptions queryOptions) {
- return getNode(node, null, queryOptions);
- }
-
- /**
- * Retrieves a single node for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/catalog/node/{node}?dc={datacenter}
- *
- * @param catalogOptions Catalog specific options to use.
- * @param queryOptions The Query Options to use.
- * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
- */
- public ConsulResponse<CatalogNode> getNode(String node, CatalogOptions catalogOptions, QueryOptions queryOptions) {
- return response(webTarget.path("node").path(node), catalogOptions, queryOptions,
- TYPE_CATALOG_NODE);
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/Consul.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/Consul.java
deleted file mode 100644
index 46cfc00..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/Consul.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import javax.net.ssl.SSLContext;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-
-import org.openo.msb.wrapper.consul.util.Jackson;
-import org.openo.msb.wrapper.consul.util.ObjectMapperContextResolver;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.guava.GuavaModule;
-import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
-import com.google.common.net.HostAndPort;
-
-/**
- * Client for interacting with the Consul HTTP API.
- *
- * @author rfast
- */
-public class Consul {
-
- /**
- * Default Consul HTTP API host.
- */
- public static final String DEFAULT_HTTP_HOST = "localhost";
-
- /**
- * Default Consul HTTP API port.
- */
- public static final int DEFAULT_HTTP_PORT = 8500;
-
-
-
-
- private final CatalogClient catalogClient;
-
- private final HealthClient healthClient;
-
-
- /**
- * Private constructor.
- *
- * @param url The full URL of a running Consul instance.
- * @param builder JAX-RS client builder instance.
- */
- private Consul(String url, ClientBuilder builder, ObjectMapper mapper) {
-
- if (!FluentIterable.from(builder.getConfiguration().getClasses())
- .filter(new Predicate<Class<?>>() {
- @Override
- public boolean apply(final Class<?> clazz) {
- return JacksonJaxbJsonProvider.class.isAssignableFrom(clazz);
- }
- }).first().isPresent()) {
- builder.register(JacksonJaxbJsonProvider.class);
- }
- final Client client = builder
- .register(new ObjectMapperContextResolver(mapper))
- .build();
-
-
- if(url.endsWith("8500")){
- this.catalogClient = new CatalogClient(client.target(url).path("v1").path("catalog"));
- this.healthClient = new HealthClient(client.target(url).path("v1").path("health"));
- }
- else{
- this.catalogClient = new CatalogClient(client.target(url).path("api").path("catalog").path("v1"));
- this.healthClient = new HealthClient(client.target(url).path("api").path("health").path("v1"));
- }
-
-
-// agentClient.ping();
- }
-
- /**
- * Creates a new client given a complete URL.
- *
- * @deprecated Use {@link Consul.Builder}
- *
- * @param url The Consul API URL.
- * @param builder The JAX-RS client builder instance.
- * @return A new client.
- */
- @Deprecated
- public static Consul newClient(String url, ClientBuilder builder, ObjectMapper mapper) {
- return new Consul(url, builder, mapper);
- }
-
- /**
- * Creates a new client given a host and a port.
- *
- * @deprecated Use {@link Consul.Builder}
- *
- * @param host The Consul API hostname or IP.
- * @param port The Consul port.
- * @param builder The JAX-RS client builder instance.
- * @return A new client.
- */
- @Deprecated
- public static Consul newClient(String host, int port, ClientBuilder builder, ObjectMapper mapper) {
- try {
- return new Consul(new URL("http", host, port, "").toString(), builder, mapper);
- } catch (MalformedURLException e) {
- throw new ConsulException("Bad Consul URL", e);
- }
- }
-
- /**
- * Creates a new client given a host and a port.
- *
- * @deprecated Use {@link Consul.Builder}
- *
- * @param host The Consul API hostname or IP.
- * @param port The Consul port.
- * @return A new client.
- */
- @Deprecated
- public static Consul newClient(String host, int port) {
- return newClient(host, port, ClientBuilder.newBuilder(), Jackson.MAPPER);
- }
-
- /**
- * Creates a new client given a host and a port.
- *
- * @deprecated Use {@link Consul.Builder}
- *
- * @return A new client.
- */
- @Deprecated
- public static Consul newClient() {
- return newClient(DEFAULT_HTTP_HOST, DEFAULT_HTTP_PORT);
- }
-
-
- /**
- * Get the Catalog HTTP client.
- * <p>
- * /v1/catalog
- *
- * @return The Catalog HTTP client.
- */
- public CatalogClient catalogClient() {
- return catalogClient;
- }
-
- public HealthClient healthClient() {
- return healthClient;
- }
- /**
- * Creates a new {@link Builder} object.
- *
- * @return A new Consul builder.
- */
- public static Builder builder() {
- return new Builder();
- }
-
- /**
- * Builder for {@link Consul} client objects.
- */
- public static class Builder {
- private URL url;
- private Optional<SSLContext> sslContext = Optional.absent();
- private ObjectMapper objectMapper = Jackson.MAPPER;
- private ClientBuilder clientBuilder = ClientBuilder.newBuilder();
-
- {
- try {
- url = new URL("http", "localhost", 8500, "");
- } catch (MalformedURLException e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Constructs a new builder.
- */
- Builder() {
-
- }
-
- /**
- * Sets the URL from a {@link URL} object.
- *
- * @param url The Consul agent URL.
- * @return The builder.
- */
- public Builder withUrl(URL url) {
- this.url = url;
-
- return this;
- }
-
- /**
- * Sets the URL from a {@link HostAndPort} object.
- *
- * @param hostAndPort The Consul agent host and port.
- * @return The builder.
- */
- public Builder withHostAndPort(HostAndPort hostAndPort) {
- try {
- this.url = new URL("http", hostAndPort.getHostText(), hostAndPort.getPort(), "");
- } catch (MalformedURLException e) {
- throw new RuntimeException(e);
- }
-
- return this;
- }
-
- /**
- * Sets the URL from a string.
- *
- * @param url The Consul agent URL.
- * @return The builder.
- */
- public Builder withUrl(String url) {
- try {
- this.url = new URL(url);
- } catch (MalformedURLException e) {
- throw new RuntimeException(e);
- }
-
- return this;
- }
-
- /**
- * Sets the {@link SSLContext} for the client.
- *
- * @param sslContext The SSL context for HTTPS agents.
- * @return The builder.
- */
- public Builder withSslContext(SSLContext sslContext) {
- this.sslContext = Optional.of(sslContext);
-
- return this;
- }
-
- /**
- * Sets the {@link ObjectMapper} for the client.
- *
- * @param objectMapper The {@link ObjectMapper} to use.
- * @return The builder.
- */
- public Builder withObjectMapper(ObjectMapper objectMapper) {
- this.objectMapper = objectMapper;
-
- objectMapper.registerModule(new GuavaModule());
-
- return this;
- }
-
- /**
- * Sets the JAX-RS {@link ClientBuilder} to use.
- *
- * @param clientBuilder The JAX-RS builder.
- * @return This builder.
- */
- public Builder withClientBuilder(ClientBuilder clientBuilder) {
- this.clientBuilder = clientBuilder;
-
- return this;
- }
-
- /**
- * Constructs a new {@link Consul} client.
- *
- * @return A new Consul client.
- */
- public Consul build() {
- if (this.sslContext.isPresent()) {
- this.clientBuilder.sslContext(this.sslContext.get());
- }
-
- return new Consul(this.url.toExternalForm(), this.clientBuilder, this.objectMapper);
- }
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/ConsulException.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/ConsulException.java
deleted file mode 100644
index a17d68f..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/ConsulException.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul;
-
-/**
- * Wraps an exception thrown whilst interacting with the Consul API.
- */
-public class ConsulException extends RuntimeException {
-
- /**
- * Constructs an instance of this class.
- *
- * @param message The exception message.
- */
- public ConsulException(String message) {
- super(message);
- }
-
- /**
- * Constructs an instance of this class.
- *
- * @param message The exception message.
- * @param throwable The wrapped {@link java.lang.Throwable} object.
- */
- public ConsulException(String message, Throwable throwable) {
- super(message, throwable);
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/HealthClient.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/HealthClient.java
deleted file mode 100644
index 9fde7ee..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/HealthClient.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul;
-
-import static org.openo.msb.wrapper.consul.util.ClientUtil.response;
-
-import java.util.List;
-
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.GenericType;
-
-import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
-import org.openo.msb.wrapper.consul.model.ConsulResponse;
-import org.openo.msb.wrapper.consul.model.health.ServiceHealth;
-import org.openo.msb.wrapper.consul.option.CatalogOptions;
-import org.openo.msb.wrapper.consul.option.QueryOptions;
-
-/**
- * HTTP Client for /v1/health/ endpoints.
- */
-public class HealthClient {
-
-
- private static final GenericType<List<ServiceHealth>> TYPE_SERVICE_HEALTH_LIST =
- new GenericType<List<ServiceHealth>>() {};
-
- private final WebTarget webTarget;
-
- /**
- * Constructs an instance of this class.
- *
- * @param webTarget The {@link javax.ws.rs.client.WebTarget} to base requests from.
- */
- HealthClient(WebTarget webTarget) {
- this.webTarget = webTarget;
- }
-
-
-
- /**
- * Retrieves the healthchecks for all healthy service instances.
- *
- * GET /v1/health/service/{service}?passing
- *
- * @param service The service to query.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
- * {@link com.orbitz.consul.model.health.HealthCheck} objects.
- */
- public ConsulResponse<List<ServiceHealth>> getHealthyServiceInstances(String service) {
- return getHealthyServiceInstances(service, null, QueryOptions.BLANK);
- }
-
- /**
- * Retrieves the healthchecks for all healthy service instances in a given datacenter.
- *
- * GET /v1/health/service/{service}?dc={datacenter}&amp;passing
- *
- * @param service The service to query.
- * @param catalogOptions The catalog specific options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
- * {@link com.orbitz.consul.model.health.HealthCheck} objects.
- */
- public ConsulResponse<List<ServiceHealth>> getHealthyServiceInstances(String service, CatalogOptions catalogOptions) {
- return getHealthyServiceInstances(service, catalogOptions, QueryOptions.BLANK);
- }
-
- /**
- * Retrieves the healthchecks for all healthy service instances with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/health/service/{service}?passing
- *
- * @param service The service to query.
- * @param queryOptions The Query Options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
- * {@link com.orbitz.consul.model.health.HealthCheck} objects.
- */
- public ConsulResponse<List<ServiceHealth>> getHealthyServiceInstances(String service, QueryOptions queryOptions) {
- return getHealthyServiceInstances(service, null, queryOptions);
- }
-
- /**
- * Retrieves the healthchecks for all healthy service instances in a given datacenter with
- * {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/health/service/{service}?dc={datacenter}&amp;passing
- *
- * @param service The service to query.
- * @param catalogOptions The catalog specific options to use.
- * @param queryOptions The Query Options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
- * {@link com.orbitz.consul.model.health.HealthCheck} objects.
- */
- public ConsulResponse<List<ServiceHealth>> getHealthyServiceInstances(String service, CatalogOptions catalogOptions,
- QueryOptions queryOptions) {
- return response(webTarget.path("service").path(service).queryParam("passing", "true"),
- catalogOptions, queryOptions, TYPE_SERVICE_HEALTH_LIST);
- }
-
- /**
- * Asynchronously retrieves the healthchecks for all healthy service instances in a given
- * datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/health/service/{service}?dc={datacenter}&amp;passing
- *
- * Experimental.
- *
- * @param service The service to query.
- * @param catalogOptions The catalog specific options to use.
- * @param queryOptions The Query Options to use.
- * @param callback Callback implemented by callee to handle results.
- */
- public void getHealthyServiceInstances(String service, CatalogOptions catalogOptions,
- QueryOptions queryOptions,
- ConsulResponseCallback<List<ServiceHealth>> callback) {
- response(webTarget.path("service").path(service).queryParam("passing", "true"),
- catalogOptions, queryOptions, TYPE_SERVICE_HEALTH_LIST, callback);
- }
-
- /**
- * Asynchronously retrieves the healthchecks for all healthy service instances in a given
- * datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/health/service/{service}?dc={datacenter}&amp;passing
- *
- * Experimental.
- *
- * @param service The service to query.
- * @param queryOptions The Query Options to use.
- * @param callback Callback implemented by callee to handle results.
- */
- public void getHealthyServiceInstances(String service, QueryOptions queryOptions,
- ConsulResponseCallback<List<ServiceHealth>> callback) {
- response(webTarget.path("service").path(service).queryParam("passing", "true"),
- CatalogOptions.BLANK, queryOptions, TYPE_SERVICE_HEALTH_LIST, callback);
- }
-
- /**
- * Retrieves the healthchecks for all nodes.
- *
- * GET /v1/health/service/{service}
- *
- * @param service The service to query.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
- * {@link com.orbitz.consul.model.health.HealthCheck} objects.
- */
- public ConsulResponse<List<ServiceHealth>> getAllServiceInstances(String service) {
- return getAllServiceInstances(service, null, QueryOptions.BLANK);
- }
-
- /**
- * Retrieves the healthchecks for all nodes in a given datacenter.
- *
- * GET /v1/health/service/{service}?dc={datacenter}
- *
- * @param service The service to query.
- * @param catalogOptions The catalog specific options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
- * {@link com.orbitz.consul.model.health.HealthCheck} objects.
- */
- public ConsulResponse<List<ServiceHealth>> getAllServiceInstances(String service, CatalogOptions catalogOptions) {
- return getAllServiceInstances(service, catalogOptions, QueryOptions.BLANK);
- }
-
- /**
- * Retrieves the healthchecks for all nodes with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/health/service/{service}
- *
- * @param service The service to query.
- * @param queryOptions The Query Options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
- * {@link com.orbitz.consul.model.health.HealthCheck} objects.
- */
- public ConsulResponse<List<ServiceHealth>> getAllServiceInstances(String service, QueryOptions queryOptions) {
- return getAllServiceInstances(service, null, queryOptions);
- }
-
- /**
- * Retrieves the healthchecks for all nodes in a given datacenter with
- * {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/health/service/{service}?dc={datacenter}
- *
- * @param service The service to query.
- * @param catalogOptions The catalog specific options to use.
- * @param queryOptions The Query Options to use.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
- * {@link com.orbitz.consul.model.health.HealthCheck} objects.
- */
- public ConsulResponse<List<ServiceHealth>> getAllServiceInstances(String service, CatalogOptions catalogOptions,
- QueryOptions queryOptions) {
- return response(webTarget.path("service").path(service), catalogOptions, queryOptions,
- TYPE_SERVICE_HEALTH_LIST);
- }
-
- /**
- * Asynchronously retrieves the healthchecks for all nodes in a given
- * datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/health/service/{service}?dc={datacenter}
- *
- * Experimental.
- *
- * @param service The service to query.
- * @param catalogOptions The catalog specific options to use.
- * @param queryOptions The Query Options to use.
- * @param callback Callback implemented by callee to handle results.
- */
- public void getAllServiceInstances(String service, CatalogOptions catalogOptions,
- QueryOptions queryOptions,
- ConsulResponseCallback<List<ServiceHealth>> callback) {
- response(webTarget.path("service").path(service), catalogOptions, queryOptions,
- TYPE_SERVICE_HEALTH_LIST, callback);
- }
-
- /**
- * Asynchronously retrieves the healthchecks for all nodes in a given
- * datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
- *
- * GET /v1/health/service/{service}?dc={datacenter}
- *
- * Experimental.
- *
- * @param service The service to query.
- * @param queryOptions The Query Options to use.
- * @param callback Callback implemented by callee to handle results.
- */
- public void getAllServiceInstances(String service, QueryOptions queryOptions,
- ConsulResponseCallback<List<ServiceHealth>> callback) {
- response(webTarget.path("service").path(service), CatalogOptions.BLANK,
- queryOptions, TYPE_SERVICE_HEALTH_LIST, callback);
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/async/ConsulResponseCallback.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/async/ConsulResponseCallback.java
deleted file mode 100644
index d823e98..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/async/ConsulResponseCallback.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.async;
-
-import org.openo.msb.wrapper.consul.model.ConsulResponse;
-
-/**
- * For API calls that support long-polling, this callback is used to handle
- * the result on success or failure for an async HTTP call.
- *
- * @param <T> The Response type.
- */
-public interface ConsulResponseCallback<T> {
-
- /**
- * Callback for a successful {@link org.openo.msb.wrapper.consul.model.ConsulResponse}.
- *
- * @param consulResponse The Consul response.
- */
- void onComplete(ConsulResponse<T> consulResponse);
-
- /**
- * Callback for an unsuccessful request.
- *
- * @param throwable The exception thrown.
- */
- void onFailure(Throwable throwable);
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/CatalogCache.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/CatalogCache.java
deleted file mode 100644
index 346ba1d..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/CatalogCache.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.consul.cache;
-
-import java.math.BigInteger;
-import java.util.List;
-
-import org.openo.msb.wrapper.consul.CatalogClient;
-import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
-import org.openo.msb.wrapper.consul.model.catalog.CatalogService;
-
-import com.google.common.base.Function;
-
-public class CatalogCache extends ConsulCache<String, CatalogService>{
-
- private final String serviceName;
-
- private CatalogCache(Function<CatalogService, String> keyConversion,
- ConsulCache.CallbackConsumer<CatalogService> callbackConsumer,String serviceName) {
- super(keyConversion, callbackConsumer);
- this.serviceName=serviceName;
- // TODO Auto-generated constructor stub
- }
-
-
- public static CatalogCache newCache(
- final CatalogClient catalogClient,
- final String serviceName,
- final int watchSeconds){
- Function<CatalogService,String> keyExtractor = new Function<CatalogService, String>() {
- @Override
- public String apply(CatalogService input) {
- //return input.getKey().substring(rootPath.length() + 1);
- return input.getServiceId();
- }
- };
-
- final CallbackConsumer<CatalogService> callbackConsumer = new CallbackConsumer<CatalogService>() {
- @Override
- public void consume(BigInteger index, ConsulResponseCallback<List<CatalogService>> callback) {
- catalogClient.getService(serviceName, watchParams(index, watchSeconds),callback);
- }
- };
-
-
- return new CatalogCache(keyExtractor, callbackConsumer,serviceName);
-
-
- }
-
- public String getServiceName(){
- return this.serviceName;
- }
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache.java
deleted file mode 100644
index 500579a..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.cache;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableMap;
-
-import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
-import org.openo.msb.wrapper.consul.model.ConsulResponse;
-import org.openo.msb.wrapper.consul.option.QueryOptions;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.math.BigInteger;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-
-import static com.google.common.base.Preconditions.checkState;
-
-/**
- * A cache structure that can provide an up-to-date read-only
- * map backed by consul data
- *
- * @param <V>
- */
-public class ConsulCache<K, V> {
-
- enum State {latent, starting, started, stopped }
-
- private final static Logger LOGGER = LoggerFactory.getLogger(ConsulCache.class);
-
- private final AtomicReference<BigInteger> latestIndex = new AtomicReference<BigInteger>(null);
- private final AtomicReference<ImmutableMap<K, V>> lastResponse = new AtomicReference<ImmutableMap<K, V>>(ImmutableMap.<K, V>of());
- private final AtomicReference<State> state = new AtomicReference<State>(State.latent);
- private final CountDownLatch initLatch = new CountDownLatch(1);
- private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
- private final CopyOnWriteArrayList<Listener<K, V>> listeners = new CopyOnWriteArrayList<Listener<K, V>>();
-
- private final Function<V, K> keyConversion;
- private final CallbackConsumer<V> callBackConsumer;
- private final ConsulResponseCallback<List<V>> responseCallback;
-
- ConsulCache(
- Function<V, K> keyConversion,
- CallbackConsumer<V> callbackConsumer) {
- this(keyConversion, callbackConsumer, 10, TimeUnit.SECONDS);
- }
-
- ConsulCache(
- Function<V, K> keyConversion,
- CallbackConsumer<V> callbackConsumer,
- final long backoffDelayQty,
- final TimeUnit backoffDelayUnit) {
-
- this.keyConversion = keyConversion;
- this.callBackConsumer = callbackConsumer;
-
- this.responseCallback = new ConsulResponseCallback<List<V>>() {
- @Override
- public void onComplete(ConsulResponse<List<V>> consulResponse) {
-
- if (!isRunning()) {
- return;
- }
- updateIndex(consulResponse);
- ImmutableMap<K, V> full = convertToMap(consulResponse);
-
- boolean changed = !full.equals(lastResponse.get());
-// LOGGER.info("node changed:"+changed+"----"+full);
- if (changed) {
- // changes
- lastResponse.set(full);
- }
-
- if (changed) {
- for (Listener<K, V> l : listeners) {
- l.notify(full);
- }
- }
-
- if (state.compareAndSet(State.starting, State.started)) {
- initLatch.countDown();
- }
- runCallback();
- }
-
- @Override
- public void onFailure(Throwable throwable) {
-
- if (!isRunning()) {
- return;
- }
- LOGGER.error(String.format("Error getting response from consul. will retry in %d %s", backoffDelayQty, backoffDelayUnit), throwable);
-
- executorService.schedule(new Runnable() {
- @Override
- public void run() {
- runCallback();
- }
- }, backoffDelayQty, backoffDelayUnit);
- }
- };
- }
-
- public void start() throws Exception {
- checkState(state.compareAndSet(State.latent, State.starting),"Cannot transition from state %s to %s", state.get(), State.starting);
- runCallback();
- }
-
- public void stop() throws Exception {
- State previous = state.getAndSet(State.stopped);
- if (previous != State.stopped) {
- executorService.shutdownNow();
- }
- }
-
- private void runCallback() {
- if (isRunning()) {
- callBackConsumer.consume(latestIndex.get(), responseCallback);
- }
- }
-
- private boolean isRunning() {
- return state.get() == State.started || state.get() == State.starting;
- }
-
- public boolean awaitInitialized(long timeout, TimeUnit unit) throws InterruptedException {
- return initLatch.await(timeout, unit);
- }
-
- public ImmutableMap<K, V> getMap() {
- return lastResponse.get();
- }
-
- @VisibleForTesting
- ImmutableMap<K, V> convertToMap(final ConsulResponse<List<V>> response) {
- if (response == null || response.getResponse() == null || response.getResponse().isEmpty()) {
- return ImmutableMap.of();
- }
-
- final ImmutableMap.Builder<K, V> builder = ImmutableMap.builder();
- final Set<K> keySet = new HashSet<>();
- for (final V v : response.getResponse()) {
- final K key = keyConversion.apply(v);
- if (key != null) {
- if (!keySet.contains(key)) {
- builder.put(key, v);
- } else {
- System.out.println(key.toString());
- LOGGER.warn("Duplicate service encountered. May differ by tags. Try using more specific tags? " + key.toString());
- }
- }
- keySet.add(key);
- }
- return builder.build();
- }
-
- private void updateIndex(ConsulResponse<List<V>> consulResponse) {
- if (consulResponse != null && consulResponse.getIndex() != null) {
- this.latestIndex.set(consulResponse.getIndex());
- }
- }
-
- protected static QueryOptions watchParams(BigInteger index, int blockSeconds) {
- if (index == null) {
- return QueryOptions.BLANK;
- } else {
- return QueryOptions.blockSeconds(blockSeconds, index).build();
- }
- }
-
- /**
- * passed in by creators to vary the content of the cached values
- *
- * @param <V>
- */
- protected interface CallbackConsumer<V> {
- void consume(BigInteger index, ConsulResponseCallback<List<V>> callback);
- }
-
- /**
- * Implementers can register a listener to receive
- * a new map when it changes
- *
- * @param <V>
- */
- public interface Listener<K, V> {
- void notify(Map<K, V> newValues);
- }
-
- public boolean addListener(Listener<K, V> listener) {
- boolean added = listeners.add(listener);
- if (state.get() == State.started) {
- listener.notify(lastResponse.get());
- }
- return added;
- }
-
- public boolean removeListener(Listener<K, V> listener) {
- return listeners.remove(listener);
- }
-
- @VisibleForTesting
- protected State getState() {
- return state.get();
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache4Map.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache4Map.java
deleted file mode 100644
index 349cbdd..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ConsulCache4Map.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.consul.cache;
-
-
-import static com.google.common.base.Preconditions.checkState;
-
-import java.math.BigInteger;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
-import org.openo.msb.wrapper.consul.model.ConsulResponse;
-import org.openo.msb.wrapper.consul.model.catalog.CatalogService;
-import org.openo.msb.wrapper.consul.model.catalog.ServiceInfo;
-import org.openo.msb.wrapper.consul.option.QueryOptions;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-
-/**
- * A cache structure that can provide an up-to-date read-only
- * map backed by consul data
- *
- * @param <V>
- */
-public class ConsulCache4Map<K, V> {
-
- enum State {latent, starting, started, stopped }
-
- private final static Logger LOGGER = LoggerFactory.getLogger(ConsulCache4Map.class);
-
- private final AtomicReference<BigInteger> latestIndex = new AtomicReference<BigInteger>(null);
- private final AtomicReference<ImmutableList<ServiceInfo>> lastResponse = new AtomicReference<ImmutableList<ServiceInfo>>(ImmutableList.<ServiceInfo>of());
- private final AtomicReference<State> state = new AtomicReference<State>(State.latent);
- private final CountDownLatch initLatch = new CountDownLatch(1);
- private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
- private final CopyOnWriteArrayList<Listener<K, V>> listeners = new CopyOnWriteArrayList<Listener<K, V>>();
-
- private final CallbackConsumer<V> callBackConsumer;
- private final ConsulResponseCallback<Map<String,List<String>>> responseCallback;
-
- ConsulCache4Map(CallbackConsumer<V> callbackConsumer) {
- this( callbackConsumer, 10, TimeUnit.SECONDS);
- }
-
- ConsulCache4Map(
- CallbackConsumer<V> callbackConsumer,
- final long backoffDelayQty,
- final TimeUnit backoffDelayUnit) {
-
- this.callBackConsumer = callbackConsumer;
-
- this.responseCallback = new ConsulResponseCallback<Map<String,List<String>>>() {
- @Override
- public void onComplete(ConsulResponse<Map<String,List<String>>> consulResponse) {
-
- if (!isRunning()) {
- return;
- }
- updateIndex(consulResponse);
- ImmutableList<ServiceInfo> full = convertToList(consulResponse);
- List<ServiceInfo> oldList=lastResponse.get();
- boolean changed = !full.equals(lastResponse.get());
-// LOGGER.info("service changed:"+changed+"----"+full);
- if (changed) {
- // changes
- lastResponse.set(full);
- }
-
- if (changed) {
- for (Listener<K, V> l : listeners) {
- l.notify(oldList,full);
- }
- }
-
- if (state.compareAndSet(State.starting, State.started)) {
- initLatch.countDown();
- }
- runCallback();
- }
-
- @Override
- public void onFailure(Throwable throwable) {
-
- if (!isRunning()) {
- return;
- }
- LOGGER.error(String.format("Error getting response from consul. will retry in %d %s", backoffDelayQty, backoffDelayUnit), throwable);
-
- executorService.schedule(new Runnable() {
- @Override
- public void run() {
- runCallback();
- }
- }, backoffDelayQty, backoffDelayUnit);
- }
- };
- }
-
- public void start() throws Exception {
- checkState(state.compareAndSet(State.latent, State.starting),"Cannot transition from state %s to %s", state.get(), State.starting);
- runCallback();
- }
-
- public void stop() throws Exception {
- State previous = state.getAndSet(State.stopped);
- if (previous != State.stopped) {
- executorService.shutdownNow();
- }
- }
-
- private void runCallback() {
- if (isRunning()) {
- callBackConsumer.consume(latestIndex.get(), responseCallback);
- }
- }
-
- private boolean isRunning() {
- return state.get() == State.started || state.get() == State.starting;
- }
-
- public boolean awaitInitialized(long timeout, TimeUnit unit) throws InterruptedException {
- return initLatch.await(timeout, unit);
- }
-
- public ImmutableList<ServiceInfo> getMap() {
- return lastResponse.get();
- }
-
- @VisibleForTesting
- ImmutableList<ServiceInfo> convertToList(final ConsulResponse<Map<String,List<String>>> response) {
- if (response == null || response.getResponse() == null || response.getResponse().isEmpty()) {
- return ImmutableList.of();
- }
-
- final ImmutableList.Builder<ServiceInfo> builder = ImmutableList.builder();
- final Set<String> keySet = new HashSet<>();
-
- for(Map.Entry<String,List<String>> entry : response.getResponse().entrySet()) {
-
- String key = entry.getKey();
-
- if (key != null && !"consul".equals(key)) {
- if (!keySet.contains(key)) {
- ServiceInfo serviceInfo=new ServiceInfo();
- serviceInfo.setServiceName(key);
-
- List<String> value=entry.getValue();
- for(String tag:value){
-
- if(tag.startsWith("version")){
- String version;
- if(tag.split(":").length==2)
- {
- version = tag.split(":")[1];
- }
- else{
- version="";
- }
-
- serviceInfo.setVersion(version);
- break;
- }
- }
-
- builder.add(serviceInfo);
- } else {
- System.out.println(key.toString());
- LOGGER.warn("Duplicate service encountered. May differ by tags. Try using more specific tags? " + key.toString());
- }
- }
- keySet.add(key);
-
- }
-
-
- return builder.build();
- }
-
- private void updateIndex(ConsulResponse<Map<String,List<String>>> consulResponse) {
- if (consulResponse != null && consulResponse.getIndex() != null) {
- this.latestIndex.set(consulResponse.getIndex());
- }
- }
-
- protected static QueryOptions watchParams(BigInteger index, int blockSeconds) {
- if (index == null) {
- return QueryOptions.BLANK;
- } else {
- return QueryOptions.blockSeconds(blockSeconds, index).build();
- }
- }
-
- /**
- * passed in by creators to vary the content of the cached values
- *
- * @param <V>
- */
- protected interface CallbackConsumer<V> {
- void consume(BigInteger index, ConsulResponseCallback<Map<String,List<String>>> callback);
- }
-
- /**
- * Implementers can register a listener to receive
- * a new map when it changes
- *
- * @param <V>
- */
- public interface Listener<K, V> {
- void notify(List<ServiceInfo> oldValues,List<ServiceInfo> newValues);
- }
-
- public boolean addListener(Listener<K, V> listener) {
- boolean added = listeners.add(listener);
- if (state.get() == State.started) {
- listener.notify(lastResponse.get(),lastResponse.get());
- }
- return added;
- }
-
- public boolean removeListener(Listener<K, V> listener) {
- return listeners.remove(listener);
- }
-
- @VisibleForTesting
- protected State getState() {
- return state.get();
- }
-
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/HealthCache.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/HealthCache.java
deleted file mode 100644
index cc4d7cb..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/HealthCache.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.consul.cache;
-
-import java.math.BigInteger;
-import java.util.List;
-
-import org.openo.msb.wrapper.consul.HealthClient;
-import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
-import org.openo.msb.wrapper.consul.model.health.ServiceHealth;
-
-import com.google.common.base.Function;
-
-public class HealthCache extends ConsulCache<String, ServiceHealth>{
-
- private final String serviceName;
-
- private HealthCache(Function<ServiceHealth, String> keyConversion,
- ConsulCache.CallbackConsumer<ServiceHealth> callbackConsumer,String serviceName) {
- super(keyConversion, callbackConsumer);
- this.serviceName=serviceName;
- // TODO Auto-generated constructor stub
- }
-
-
- public static HealthCache newCache(
- final HealthClient healthClient,
- final String serviceName,
- final int watchSeconds){
- Function<ServiceHealth,String> keyExtractor = new Function<ServiceHealth, String>() {
- @Override
- public String apply(ServiceHealth input) {
- //return input.getKey().substring(rootPath.length() + 1);
- return input.getService().getId();
- }
- };
-
- final CallbackConsumer<ServiceHealth> callbackConsumer = new CallbackConsumer<ServiceHealth>() {
- @Override
- public void consume(BigInteger index, ConsulResponseCallback<List<ServiceHealth>> callback) {
- healthClient.getHealthyServiceInstances(serviceName, watchParams(index, watchSeconds),callback);
- }
- };
-
-
- return new HealthCache(keyExtractor, callbackConsumer,serviceName);
-
-
- }
-
- public String getServiceName(){
- return this.serviceName;
- }
-
-
-} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ServiceCache.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ServiceCache.java
deleted file mode 100644
index 5d16e24..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/cache/ServiceCache.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.consul.cache;
-
-import java.math.BigInteger;
-import java.util.List;
-import java.util.Map;
-
-import org.openo.msb.wrapper.consul.CatalogClient;
-import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
-
-public class ServiceCache extends ConsulCache4Map<String, Map<String, List<String>>> {
- private ServiceCache( ConsulCache4Map.CallbackConsumer<Map<String, List<String>>> callbackConsumer) {
- super(callbackConsumer);
- // TODO Auto-generated constructor stub
- }
-
-
- public static ServiceCache newCache(
- final CatalogClient catalogClient,
- final int watchSeconds){
-
-
- final CallbackConsumer<Map<String, List<String>>> callbackConsumer = new CallbackConsumer<Map<String, List<String>>>() {
- @Override
- public void consume(BigInteger index, ConsulResponseCallback<Map<String, List<String>>> callback) {
- catalogClient.getService(watchParams(index, watchSeconds),callback);
- }
- };
-
-
- return new ServiceCache(callbackConsumer);
-
-
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/ConsulResponse.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/ConsulResponse.java
deleted file mode 100644
index b19f37c..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/ConsulResponse.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.model;
-
-import com.google.common.base.Objects;
-
-import java.math.BigInteger;
-
-public class ConsulResponse<T> {
-
- private final T response;
- private final long lastContact;
- private final boolean knownLeader;
- private final BigInteger index;
-
- public ConsulResponse(T response, long lastContact, boolean knownLeader, BigInteger index) {
- this.response = response;
- this.lastContact = lastContact;
- this.knownLeader = knownLeader;
- this.index = index;
- }
-
- public T getResponse() {
- return response;
- }
-
- public long getLastContact() {
- return lastContact;
- }
-
- public boolean isKnownLeader() {
- return knownLeader;
- }
-
- public BigInteger getIndex() {
- return index;
- }
-
- @Override
- public String toString() {
- return "ConsulResponse{" +
- "response=" + response +
- ", lastContact=" + lastContact +
- ", knownLeader=" + knownLeader +
- ", index=" + index +
- '}';
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- ConsulResponse that = (ConsulResponse) o;
-
- return Objects.equal(this.response, that.response) &&
- Objects.equal(this.lastContact, that.lastContact) &&
- Objects.equal(this.knownLeader, that.knownLeader) &&
- Objects.equal(this.index, that.index);
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(response, lastContact, knownLeader, index);
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogNode.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogNode.java
deleted file mode 100644
index 5ffc97b..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogNode.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.model.catalog;
-
-import java.util.Map;
-
-import org.openo.msb.wrapper.consul.model.health.Node;
-import org.openo.msb.wrapper.consul.model.health.Service;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-
-
-@JsonSerialize(as = ImmutableCatalogNode.class)
-@JsonDeserialize(as = ImmutableCatalogNode.class)
-@JsonIgnoreProperties(ignoreUnknown = true)
-public abstract class CatalogNode {
-
- @JsonProperty("Node")
- public abstract Node getNode();
-
- @JsonProperty("Services")
- public abstract Map<String, Service> getServices();
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogService.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogService.java
deleted file mode 100644
index 9d62f02..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/CatalogService.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.model.catalog;
-
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-
-
-@JsonSerialize(as = ImmutableCatalogService.class)
-@JsonDeserialize(as = ImmutableCatalogService.class)
-@JsonIgnoreProperties(ignoreUnknown = true)
-public abstract class CatalogService {
-
- @JsonProperty("Node")
- public abstract String getNode();
-
- @JsonProperty("Address")
- public abstract String getAddress();
-
- @JsonProperty("ServiceName")
- public abstract String getServiceName();
-
- @JsonProperty("ServiceID")
- public abstract String getServiceId();
-
- @JsonProperty("ServiceAddress")
- public abstract String getServiceAddress();
-
- @JsonProperty("ServicePort")
- public abstract int getServicePort();
-
- @JsonProperty("ServiceTags")
- public abstract List<String> getServiceTags();
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogNode.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogNode.java
deleted file mode 100644
index 18830d5..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogNode.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.consul.model.catalog;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-
-import java.util.List;
-import java.util.Map;
-
-import javax.annotation.Generated;
-
-import org.openo.msb.wrapper.consul.model.health.Node;
-import org.openo.msb.wrapper.consul.model.health.Service;
-
-/**
- * Immutable implementation of {@link CatalogNode}.
- * <p>
- * Use the builder to create immutable instances:
- * {@code ImmutableCatalogNode.builder()}.
- */
-@SuppressWarnings("all")
-@Generated({"Immutables.generator", "CatalogNode"})
-@JsonIgnoreProperties(ignoreUnknown = true)
-public final class ImmutableCatalogNode extends CatalogNode {
- private final Node node;
- private final ImmutableMap<String, Service> services;
-
- private ImmutableCatalogNode(
- Node node,
- ImmutableMap<String, Service> services) {
- this.node = node;
- this.services = services;
- }
-
- /**
- * @return The value of the {@code node} attribute
- */
- @JsonProperty(value = "Node")
- @Override
- public Node getNode() {
- return node;
- }
-
- /**
- * @return The value of the {@code services} attribute
- */
- @JsonProperty(value = "Services")
- @Override
- public ImmutableMap<String, Service> getServices() {
- return services;
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link CatalogNode#getNode() node} attribute.
- * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for node
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableCatalogNode withNode(Node value) {
- if (this.node == value) return this;
- return new ImmutableCatalogNode(Preconditions.checkNotNull(value, "node"), this.services);
- }
-
- /**
- * Copy the current immutable object by replacing the {@link CatalogNode#getServices() services} map with the specified map.
- * Nulls are not permitted as keys or values.
- * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.
- * @param entries The entries to be added to the services map
- * @return A modified copy of {@code this} object
- */
- public final ImmutableCatalogNode withServices(Map<String, ? extends Service> entries) {
- if (this.services == entries) return this;
- ImmutableMap<String, Service> value = ImmutableMap.copyOf(entries);
- return new ImmutableCatalogNode(this.node, value);
- }
-
- /**
- * This instance is equal to all instances of {@code ImmutableCatalogNode} that have equal attribute values.
- * @return {@code true} if {@code this} is equal to {@code another} instance
- */
- @Override
- public boolean equals(Object another) {
- if (this == another) return true;
- return another instanceof ImmutableCatalogNode
- && equalTo((ImmutableCatalogNode) another);
- }
-
- private boolean equalTo(ImmutableCatalogNode another) {
- return node.equals(another.node)
- && services.equals(another.services);
- }
-
- /**
- * Computes a hash code from attributes: {@code node}, {@code services}.
- * @return hashCode value
- */
- @Override
- public int hashCode() {
- int h = 31;
- h = h * 17 + node.hashCode();
- h = h * 17 + services.hashCode();
- return h;
- }
-
- /**
- * Prints the immutable value {@code CatalogNode...} with all non-generated
- * and non-auxiliary attribute values.
- * @return A string representation of the value
- */
- @Override
- public String toString() {
- return MoreObjects.toStringHelper("CatalogNode")
- .add("node", node)
- .add("services", services)
- .toString();
- }
-
- /**
- * Utility type used to correctly read immutable object from JSON representation.
- * @deprecated Do not use this type directly, it exists only for the <em>Jackson</em>-binding infrastructure
- */
- @Deprecated
- @JsonDeserialize
- static final class Json extends CatalogNode {
- Node node;
- Map<String, Service> services;
- @JsonProperty(value = "Node")
- public void setNode(Node node) {
- this.node = node;
- }
- @JsonProperty(value = "Services")
- public void setServices(Map<String, Service> services) {
- this.services = services;
- }
- @Override
- public Node getNode() { throw new UnsupportedOperationException(); }
- @Override
- public Map<String, Service> getServices() { throw new UnsupportedOperationException(); }
- }
-
- /**
- * @param json A JSON-bindable data structure
- * @return An immutable value type
- * @deprecated Do not use this method directly, it exists only for the <em>Jackson</em>-binding infrastructure
- */
- @Deprecated
- @JsonCreator
- static ImmutableCatalogNode fromJson(Json json) {
- ImmutableCatalogNode.Builder builder = ImmutableCatalogNode.builder();
- if (json.node != null) {
- builder.node(json.node);
- }
- if (json.services != null) {
- builder.putAllServices(json.services);
- }
- return builder.build();
- }
-
- /**
- * Creates an immutable copy of a {@link CatalogNode} value.
- * Uses accessors to get values to initialize the new immutable instance.
- * If an instance is already immutable, it is returned as is.
- * @param instance The instance to copy
- * @return A copied immutable CatalogNode instance
- */
- public static ImmutableCatalogNode copyOf(CatalogNode instance) {
- if (instance instanceof ImmutableCatalogNode) {
- return (ImmutableCatalogNode) instance;
- }
- return ImmutableCatalogNode.builder()
- .from(instance)
- .build();
- }
-
- /**
- * Creates a builder for {@link ImmutableCatalogNode ImmutableCatalogNode}.
- * @return A new ImmutableCatalogNode builder
- */
- public static ImmutableCatalogNode.Builder builder() {
- return new ImmutableCatalogNode.Builder();
- }
-
- /**
- * Builds instances of type {@link ImmutableCatalogNode ImmutableCatalogNode}.
- * Initialize attributes and then invoke the {@link #build()} method to create an
- * immutable instance.
- * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,
- * but instead used immediately to create instances.</em>
- */
- public static final class Builder {
- private static final long INIT_BIT_NODE = 0x1L;
- private long initBits = 0x1;
-
- private Node node;
- private ImmutableMap.Builder<String, Service> servicesBuilder = ImmutableMap.builder();
-
- private Builder() {
- }
-
- /**
- * Fill a builder with attribute values from the provided {@code CatalogNode} instance.
- * Regular attribute values will be replaced with those from the given instance.
- * Absent optional values will not replace present values.
- * Collection elements and entries will be added, not replaced.
- * @param instance The instance from which to copy values
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder from(CatalogNode instance) {
- Preconditions.checkNotNull(instance, "instance");
- node(instance.getNode());
- putAllServices(instance.getServices());
- return this;
- }
-
- /**
- * Initializes the value for the {@link CatalogNode#getNode() node} attribute.
- * @param node The value for node
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder node(Node node) {
- this.node = Preconditions.checkNotNull(node, "node");
- initBits &= ~INIT_BIT_NODE;
- return this;
- }
-
- /**
- * Put one entry to the {@link CatalogNode#getServices() services} map.
- * @param key The key in the services map
- * @param value The associated value in the services map
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder putServices(String key, Service value) {
- servicesBuilder.put(key, value);
- return this;
- }
-
- /**
- * Put one entry to the {@link CatalogNode#getServices() services} map. Nulls are not permitted
- * @param entry The key and value entry
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder putServices(Map.Entry<String, ? extends Service> entry) {
- servicesBuilder.put(entry);
- return this;
- }
-
- /**
- * Sets or replaces all mappings from the specified map as entries for the {@link CatalogNode#getServices() services} map. Nulls are not permitted
- * @param entries The entries that will be added to the services map
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder services(Map<String, ? extends Service> entries) {
- servicesBuilder = ImmutableMap.builder();
- return putAllServices(entries);
- }
-
- /**
- * Put all mappings from the specified map as entries to {@link CatalogNode#getServices() services} map. Nulls are not permitted
- * @param entries The entries that will be added to the services map
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder putAllServices(Map<String, ? extends Service> entries) {
- servicesBuilder.putAll(entries);
- return this;
- }
-
- /**
- * Builds a new {@link ImmutableCatalogNode ImmutableCatalogNode}.
- * @return An immutable instance of CatalogNode
- * @throws java.lang.IllegalStateException if any required attributes are missing
- */
- public ImmutableCatalogNode build() throws IllegalStateException {
- if (initBits != 0) {
- throw new IllegalStateException(formatRequiredAttributesMessage());
- }
- return new ImmutableCatalogNode(node, servicesBuilder.build());
- }
-
- private String formatRequiredAttributesMessage() {
- List<String> attributes = Lists.newArrayList();
- if ((initBits & INIT_BIT_NODE) != 0) attributes.add("node");
- return "Cannot build CatalogNode, some of required attributes are not set " + attributes;
- }
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogService.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogService.java
deleted file mode 100644
index c16b94f..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ImmutableCatalogService.java
+++ /dev/null
@@ -1,625 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.consul.model.catalog;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import java.util.List;
-import javax.annotation.Generated;
-
-/**
- * Immutable implementation of {@link CatalogService}.
- * <p>
- * Use the builder to create immutable instances:
- * {@code ImmutableCatalogService.builder()}.
- */
-@SuppressWarnings("all")
-@Generated({"Immutables.generator", "CatalogService"})
-@JsonIgnoreProperties(ignoreUnknown = true)
-public final class ImmutableCatalogService extends CatalogService {
- private final String node;
- private final String address;
- private final String serviceName;
- private final String serviceId;
- private final String serviceAddress;
- private final int servicePort;
- private final ImmutableList<String> serviceTags;
-
- private ImmutableCatalogService(
- String node,
- String address,
- String serviceName,
- String serviceId,
- String serviceAddress,
- int servicePort,
- ImmutableList<String> serviceTags) {
- this.node = node;
- this.address = address;
- this.serviceName = serviceName;
- this.serviceId = serviceId;
- this.serviceAddress = serviceAddress;
- this.servicePort = servicePort;
- this.serviceTags = serviceTags;
- }
-
- /**
- * @return The value of the {@code node} attribute
- */
- @JsonProperty(value = "Node")
- @Override
- public String getNode() {
- return node;
- }
-
- /**
- * @return The value of the {@code address} attribute
- */
- @JsonProperty(value = "Address")
- @Override
- public String getAddress() {
- return address;
- }
-
- /**
- * @return The value of the {@code serviceName} attribute
- */
- @JsonProperty(value = "ServiceName")
- @Override
- public String getServiceName() {
- return serviceName;
- }
-
- /**
- * @return The value of the {@code serviceId} attribute
- */
- @JsonProperty(value = "ServiceID")
- @Override
- public String getServiceId() {
- return serviceId;
- }
-
- /**
- * @return The value of the {@code serviceAddress} attribute
- */
- @JsonProperty(value = "ServiceAddress")
- @Override
- public String getServiceAddress() {
- return serviceAddress;
- }
-
- /**
- * @return The value of the {@code servicePort} attribute
- */
- @JsonProperty(value = "ServicePort")
- @Override
- public int getServicePort() {
- return servicePort;
- }
-
- /**
- * @return The value of the {@code serviceTags} attribute
- */
- @JsonProperty(value = "ServiceTags")
- @Override
- public ImmutableList<String> getServiceTags() {
- return serviceTags;
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link CatalogService#getNode() node} attribute.
- * An equals check used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for node
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableCatalogService withNode(String value) {
- if (this.node.equals(value)) return this;
- return new ImmutableCatalogService(
- Preconditions.checkNotNull(value, "node"),
- this.address,
- this.serviceName,
- this.serviceId,
- this.serviceAddress,
- this.servicePort,
- this.serviceTags);
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link CatalogService#getAddress() address} attribute.
- * An equals check used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for address
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableCatalogService withAddress(String value) {
- if (this.address.equals(value)) return this;
- return new ImmutableCatalogService(
- this.node,
- Preconditions.checkNotNull(value, "address"),
- this.serviceName,
- this.serviceId,
- this.serviceAddress,
- this.servicePort,
- this.serviceTags);
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link CatalogService#getServiceName() serviceName} attribute.
- * An equals check used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for serviceName
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableCatalogService withServiceName(String value) {
- if (this.serviceName.equals(value)) return this;
- return new ImmutableCatalogService(
- this.node,
- this.address,
- Preconditions.checkNotNull(value, "serviceName"),
- this.serviceId,
- this.serviceAddress,
- this.servicePort,
- this.serviceTags);
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link CatalogService#getServiceId() serviceId} attribute.
- * An equals check used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for serviceId
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableCatalogService withServiceId(String value) {
- if (this.serviceId.equals(value)) return this;
- return new ImmutableCatalogService(
- this.node,
- this.address,
- this.serviceName,
- Preconditions.checkNotNull(value, "serviceId"),
- this.serviceAddress,
- this.servicePort,
- this.serviceTags);
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link CatalogService#getServiceAddress() serviceAddress} attribute.
- * An equals check used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for serviceAddress
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableCatalogService withServiceAddress(String value) {
- if (this.serviceAddress.equals(value)) return this;
- return new ImmutableCatalogService(
- this.node,
- this.address,
- this.serviceName,
- this.serviceId,
- Preconditions.checkNotNull(value, "serviceAddress"),
- this.servicePort,
- this.serviceTags);
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link CatalogService#getServicePort() servicePort} attribute.
- * A value equality check is used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for servicePort
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableCatalogService withServicePort(int value) {
- if (this.servicePort == value) return this;
- return new ImmutableCatalogService(
- this.node,
- this.address,
- this.serviceName,
- this.serviceId,
- this.serviceAddress,
- value,
- this.serviceTags);
- }
-
- /**
- * Copy the current immutable object with elements that replace the content of {@link CatalogService#getServiceTags() serviceTags}.
- * @param elements The elements to set
- * @return A modified copy of {@code this} object
- */
- public final ImmutableCatalogService withServiceTags(String... elements) {
- ImmutableList<String> newValue = ImmutableList.copyOf(elements);
- return new ImmutableCatalogService(
- this.node,
- this.address,
- this.serviceName,
- this.serviceId,
- this.serviceAddress,
- this.servicePort,
- newValue);
- }
-
- /**
- * Copy the current immutable object with elements that replace the content of {@link CatalogService#getServiceTags() serviceTags}.
- * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.
- * @param elements An iterable of serviceTags elements to set
- * @return A modified copy of {@code this} object
- */
- public final ImmutableCatalogService withServiceTags(Iterable<String> elements) {
- if (this.serviceTags == elements) return this;
- ImmutableList<String> newValue = ImmutableList.copyOf(elements);
- return new ImmutableCatalogService(
- this.node,
- this.address,
- this.serviceName,
- this.serviceId,
- this.serviceAddress,
- this.servicePort,
- newValue);
- }
-
- /**
- * This instance is equal to all instances of {@code ImmutableCatalogService} that have equal attribute values.
- * @return {@code true} if {@code this} is equal to {@code another} instance
- */
- @Override
- public boolean equals(Object another) {
- if (this == another) return true;
- return another instanceof ImmutableCatalogService
- && equalTo((ImmutableCatalogService) another);
- }
-
- private boolean equalTo(ImmutableCatalogService another) {
- return node.equals(another.node)
- && address.equals(another.address)
- && serviceName.equals(another.serviceName)
- && serviceId.equals(another.serviceId)
- && serviceAddress.equals(another.serviceAddress)
- && servicePort == another.servicePort
- && serviceTags.equals(another.serviceTags);
- }
-
- /**
- * Computes a hash code from attributes: {@code node}, {@code address}, {@code serviceName}, {@code serviceId}, {@code serviceAddress}, {@code servicePort}, {@code serviceTags}.
- * @return hashCode value
- */
- @Override
- public int hashCode() {
- int h = 31;
- h = h * 17 + node.hashCode();
- h = h * 17 + address.hashCode();
- h = h * 17 + serviceName.hashCode();
- h = h * 17 + serviceId.hashCode();
- h = h * 17 + serviceAddress.hashCode();
- h = h * 17 + servicePort;
- h = h * 17 + serviceTags.hashCode();
- return h;
- }
-
- /**
- * Prints the immutable value {@code CatalogService...} with all non-generated
- * and non-auxiliary attribute values.
- * @return A string representation of the value
- */
- @Override
- public String toString() {
- return MoreObjects.toStringHelper("CatalogService")
- .add("node", node)
- .add("address", address)
- .add("serviceName", serviceName)
- .add("serviceId", serviceId)
- .add("serviceAddress", serviceAddress)
- .add("servicePort", servicePort)
- .add("serviceTags", serviceTags)
- .toString();
- }
-
- /**
- * Utility type used to correctly read immutable object from JSON representation.
- * @deprecated Do not use this type directly, it exists only for the <em>Jackson</em>-binding infrastructure
- */
- @Deprecated
- @JsonDeserialize
- static final class Json extends CatalogService {
- String node;
- String address;
- String serviceName;
- String serviceId;
- String serviceAddress;
- Integer servicePort;
- List<String> serviceTags = ImmutableList.of();
- @JsonProperty(value = "Node")
- public void setNode(String node) {
- this.node = node;
- }
- @JsonProperty(value = "Address")
- public void setAddress(String address) {
- this.address = address;
- }
- @JsonProperty(value = "ServiceName")
- public void setServiceName(String serviceName) {
- this.serviceName = serviceName;
- }
- @JsonProperty(value = "ServiceID")
- public void setServiceId(String serviceId) {
- this.serviceId = serviceId;
- }
- @JsonProperty(value = "ServiceAddress")
- public void setServiceAddress(String serviceAddress) {
- this.serviceAddress = serviceAddress;
- }
- @JsonProperty(value = "ServicePort")
- public void setServicePort(int servicePort) {
- this.servicePort = servicePort;
- }
- @JsonProperty(value = "ServiceTags")
- public void setServiceTags(List<String> serviceTags) {
- this.serviceTags = serviceTags;
- }
- @Override
- public String getNode() { throw new UnsupportedOperationException(); }
- @Override
- public String getAddress() { throw new UnsupportedOperationException(); }
- @Override
- public String getServiceName() { throw new UnsupportedOperationException(); }
- @Override
- public String getServiceId() { throw new UnsupportedOperationException(); }
- @Override
- public String getServiceAddress() { throw new UnsupportedOperationException(); }
- @Override
- public int getServicePort() { throw new UnsupportedOperationException(); }
- @Override
- public List<String> getServiceTags() { throw new UnsupportedOperationException(); }
- }
-
- /**
- * @param json A JSON-bindable data structure
- * @return An immutable value type
- * @deprecated Do not use this method directly, it exists only for the <em>Jackson</em>-binding infrastructure
- */
- @Deprecated
- @JsonCreator
- static ImmutableCatalogService fromJson(Json json) {
- ImmutableCatalogService.Builder builder = ImmutableCatalogService.builder();
- if (json.node != null) {
- builder.node(json.node);
- }
- if (json.address != null) {
- builder.address(json.address);
- }
- if (json.serviceName != null) {
- builder.serviceName(json.serviceName);
- }
- if (json.serviceId != null) {
- builder.serviceId(json.serviceId);
- }
- if (json.serviceAddress != null) {
- builder.serviceAddress(json.serviceAddress);
- }
- if (json.servicePort != null) {
- builder.servicePort(json.servicePort);
- }
- if (json.serviceTags != null) {
- builder.addAllServiceTags(json.serviceTags);
- }
- return builder.build();
- }
-
- /**
- * Creates an immutable copy of a {@link CatalogService} value.
- * Uses accessors to get values to initialize the new immutable instance.
- * If an instance is already immutable, it is returned as is.
- * @param instance The instance to copy
- * @return A copied immutable CatalogService instance
- */
- public static ImmutableCatalogService copyOf(CatalogService instance) {
- if (instance instanceof ImmutableCatalogService) {
- return (ImmutableCatalogService) instance;
- }
- return ImmutableCatalogService.builder()
- .from(instance)
- .build();
- }
-
- /**
- * Creates a builder for {@link ImmutableCatalogService ImmutableCatalogService}.
- * @return A new ImmutableCatalogService builder
- */
- public static ImmutableCatalogService.Builder builder() {
- return new ImmutableCatalogService.Builder();
- }
-
- /**
- * Builds instances of type {@link ImmutableCatalogService ImmutableCatalogService}.
- * Initialize attributes and then invoke the {@link #build()} method to create an
- * immutable instance.
- * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,
- * but instead used immediately to create instances.</em>
- */
- public static final class Builder {
- private static final long INIT_BIT_NODE = 0x1L;
- private static final long INIT_BIT_ADDRESS = 0x2L;
- private static final long INIT_BIT_SERVICE_NAME = 0x4L;
- private static final long INIT_BIT_SERVICE_ID = 0x8L;
- private static final long INIT_BIT_SERVICE_ADDRESS = 0x10L;
- private static final long INIT_BIT_SERVICE_PORT = 0x20L;
- private long initBits = 0x3f;
-
- private String node;
- private String address;
- private String serviceName;
- private String serviceId;
- private String serviceAddress;
- private int servicePort;
- private ImmutableList.Builder<String> serviceTagsBuilder = ImmutableList.builder();
-
- private Builder() {
- }
-
- /**
- * Fill a builder with attribute values from the provided {@code CatalogService} instance.
- * Regular attribute values will be replaced with those from the given instance.
- * Absent optional values will not replace present values.
- * Collection elements and entries will be added, not replaced.
- * @param instance The instance from which to copy values
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder from(CatalogService instance) {
- Preconditions.checkNotNull(instance, "instance");
- node(instance.getNode());
- address(instance.getAddress());
- serviceName(instance.getServiceName());
- serviceId(instance.getServiceId());
- serviceAddress(instance.getServiceAddress());
- servicePort(instance.getServicePort());
- addAllServiceTags(instance.getServiceTags());
- return this;
- }
-
- /**
- * Initializes the value for the {@link CatalogService#getNode() node} attribute.
- * @param node The value for node
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder node(String node) {
- this.node = Preconditions.checkNotNull(node, "node");
- initBits &= ~INIT_BIT_NODE;
- return this;
- }
-
- /**
- * Initializes the value for the {@link CatalogService#getAddress() address} attribute.
- * @param address The value for address
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder address(String address) {
- this.address = Preconditions.checkNotNull(address, "address");
- initBits &= ~INIT_BIT_ADDRESS;
- return this;
- }
-
- /**
- * Initializes the value for the {@link CatalogService#getServiceName() serviceName} attribute.
- * @param serviceName The value for serviceName
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder serviceName(String serviceName) {
- this.serviceName = Preconditions.checkNotNull(serviceName, "serviceName");
- initBits &= ~INIT_BIT_SERVICE_NAME;
- return this;
- }
-
- /**
- * Initializes the value for the {@link CatalogService#getServiceId() serviceId} attribute.
- * @param serviceId The value for serviceId
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder serviceId(String serviceId) {
- this.serviceId = Preconditions.checkNotNull(serviceId, "serviceId");
- initBits &= ~INIT_BIT_SERVICE_ID;
- return this;
- }
-
- /**
- * Initializes the value for the {@link CatalogService#getServiceAddress() serviceAddress} attribute.
- * @param serviceAddress The value for serviceAddress
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder serviceAddress(String serviceAddress) {
- this.serviceAddress = Preconditions.checkNotNull(serviceAddress, "serviceAddress");
- initBits &= ~INIT_BIT_SERVICE_ADDRESS;
- return this;
- }
-
- /**
- * Initializes the value for the {@link CatalogService#getServicePort() servicePort} attribute.
- * @param servicePort The value for servicePort
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder servicePort(int servicePort) {
- this.servicePort = servicePort;
- initBits &= ~INIT_BIT_SERVICE_PORT;
- return this;
- }
-
- /**
- * Adds one element to {@link CatalogService#getServiceTags() serviceTags} list.
- * @param element A serviceTags element
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder addServiceTags(String element) {
- serviceTagsBuilder.add(element);
- return this;
- }
-
- /**
- * Adds elements to {@link CatalogService#getServiceTags() serviceTags} list.
- * @param elements An array of serviceTags elements
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder addServiceTags(String... elements) {
- serviceTagsBuilder.add(elements);
- return this;
- }
-
- /**
- * Sets or replaces all elements for {@link CatalogService#getServiceTags() serviceTags} list.
- * @param elements An iterable of serviceTags elements
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder serviceTags(Iterable<String> elements) {
- serviceTagsBuilder = ImmutableList.builder();
- return addAllServiceTags(elements);
- }
-
- /**
- * Adds elements to {@link CatalogService#getServiceTags() serviceTags} list.
- * @param elements An iterable of serviceTags elements
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder addAllServiceTags(Iterable<String> elements) {
- serviceTagsBuilder.addAll(elements);
- return this;
- }
-
- /**
- * Builds a new {@link ImmutableCatalogService ImmutableCatalogService}.
- * @return An immutable instance of CatalogService
- * @throws java.lang.IllegalStateException if any required attributes are missing
- */
- public ImmutableCatalogService build() throws IllegalStateException {
- if (initBits != 0) {
- throw new IllegalStateException(formatRequiredAttributesMessage());
- }
- return new ImmutableCatalogService(
- node,
- address,
- serviceName,
- serviceId,
- serviceAddress,
- servicePort,
- serviceTagsBuilder.build());
- }
-
- private String formatRequiredAttributesMessage() {
- List<String> attributes = Lists.newArrayList();
- if ((initBits & INIT_BIT_NODE) != 0) attributes.add("node");
- if ((initBits & INIT_BIT_ADDRESS) != 0) attributes.add("address");
- if ((initBits & INIT_BIT_SERVICE_NAME) != 0) attributes.add("serviceName");
- if ((initBits & INIT_BIT_SERVICE_ID) != 0) attributes.add("serviceId");
- if ((initBits & INIT_BIT_SERVICE_ADDRESS) != 0) attributes.add("serviceAddress");
- if ((initBits & INIT_BIT_SERVICE_PORT) != 0) attributes.add("servicePort");
- return "Cannot build CatalogService, some of required attributes are not set " + attributes;
- }
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ServiceInfo.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ServiceInfo.java
deleted file mode 100644
index dcf67a2..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/catalog/ServiceInfo.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.consul.model.catalog;
-
-import com.google.common.base.Objects;
-
-public class ServiceInfo {
-
- private String serviceName;
-
- private String version="";
-
- public String getServiceName() {
- return serviceName;
- }
-
- public void setServiceName(String serviceName) {
- this.serviceName = serviceName;
- }
-
- public String getVersion() {
- return version;
- }
-
- public void setVersion(String version) {
- this.version = version;
- }
-
- @Override
- public boolean equals(Object other)
- {
- if(this == other)
- return true;
- if(other instanceof ServiceInfo)
- {
- ServiceInfo that = (ServiceInfo)other;
- return Objects.equal(serviceName, that.serviceName) && Objects.equal(version, that.version);
- } else
- {
- return false;
- }
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(serviceName, version);
- }
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableNode.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableNode.java
deleted file mode 100644
index ed0340e..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableNode.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.consul.model.health;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-import java.util.List;
-import javax.annotation.Generated;
-
-/**
- * Immutable implementation of {@link Node}.
- * <p>
- * Use the builder to create immutable instances:
- * {@code ImmutableNode.builder()}.
- */
-@SuppressWarnings("all")
-@Generated({"Immutables.generator", "Node"})
-@JsonIgnoreProperties(ignoreUnknown = true)
-public final class ImmutableNode extends Node {
- private final String node;
- private final String address;
-
- private ImmutableNode(String node, String address) {
- this.node = node;
- this.address = address;
- }
-
- /**
- * @return The value of the {@code node} attribute
- */
- @JsonProperty(value = "Node")
- @Override
- public String getNode() {
- return node;
- }
-
- /**
- * @return The value of the {@code address} attribute
- */
- @JsonProperty(value = "Address")
- @Override
- public String getAddress() {
- return address;
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link Node#getNode() node} attribute.
- * An equals check used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for node
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableNode withNode(String value) {
- if (this.node.equals(value)) return this;
- return new ImmutableNode(Preconditions.checkNotNull(value, "node"), this.address);
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link Node#getAddress() address} attribute.
- * An equals check used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for address
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableNode withAddress(String value) {
- if (this.address.equals(value)) return this;
- return new ImmutableNode(this.node, Preconditions.checkNotNull(value, "address"));
- }
-
- /**
- * This instance is equal to all instances of {@code ImmutableNode} that have equal attribute values.
- * @return {@code true} if {@code this} is equal to {@code another} instance
- */
- @Override
- public boolean equals(Object another) {
- if (this == another) return true;
- return another instanceof ImmutableNode
- && equalTo((ImmutableNode) another);
- }
-
- private boolean equalTo(ImmutableNode another) {
- return node.equals(another.node)
- && address.equals(another.address);
- }
-
- /**
- * Computes a hash code from attributes: {@code node}, {@code address}.
- * @return hashCode value
- */
- @Override
- public int hashCode() {
- int h = 31;
- h = h * 17 + node.hashCode();
- h = h * 17 + address.hashCode();
- return h;
- }
-
- /**
- * Prints the immutable value {@code Node...} with all non-generated
- * and non-auxiliary attribute values.
- * @return A string representation of the value
- */
- @Override
- public String toString() {
- return MoreObjects.toStringHelper("Node")
- .add("node", node)
- .add("address", address)
- .toString();
- }
-
- /**
- * Utility type used to correctly read immutable object from JSON representation.
- * @deprecated Do not use this type directly, it exists only for the <em>Jackson</em>-binding infrastructure
- */
- @Deprecated
- @JsonDeserialize
- static final class Json extends Node {
- String node;
- String address;
- @JsonProperty(value = "Node")
- public void setNode(String node) {
- this.node = node;
- }
- @JsonProperty(value = "Address")
- public void setAddress(String address) {
- this.address = address;
- }
- @Override
- public String getNode() { throw new UnsupportedOperationException(); }
- @Override
- public String getAddress() { throw new UnsupportedOperationException(); }
- }
-
- /**
- * @param json A JSON-bindable data structure
- * @return An immutable value type
- * @deprecated Do not use this method directly, it exists only for the <em>Jackson</em>-binding infrastructure
- */
- @Deprecated
- @JsonCreator
- static ImmutableNode fromJson(Json json) {
- ImmutableNode.Builder builder = ImmutableNode.builder();
- if (json.node != null) {
- builder.node(json.node);
- }
- if (json.address != null) {
- builder.address(json.address);
- }
- return builder.build();
- }
-
- /**
- * Creates an immutable copy of a {@link Node} value.
- * Uses accessors to get values to initialize the new immutable instance.
- * If an instance is already immutable, it is returned as is.
- * @param instance The instance to copy
- * @return A copied immutable Node instance
- */
- public static ImmutableNode copyOf(Node instance) {
- if (instance instanceof ImmutableNode) {
- return (ImmutableNode) instance;
- }
- return ImmutableNode.builder()
- .from(instance)
- .build();
- }
-
- /**
- * Creates a builder for {@link ImmutableNode ImmutableNode}.
- * @return A new ImmutableNode builder
- */
- public static ImmutableNode.Builder builder() {
- return new ImmutableNode.Builder();
- }
-
- /**
- * Builds instances of type {@link ImmutableNode ImmutableNode}.
- * Initialize attributes and then invoke the {@link #build()} method to create an
- * immutable instance.
- * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,
- * but instead used immediately to create instances.</em>
- */
- public static final class Builder {
- private static final long INIT_BIT_NODE = 0x1L;
- private static final long INIT_BIT_ADDRESS = 0x2L;
- private long initBits = 0x3;
-
- private String node;
- private String address;
-
- private Builder() {
- }
-
- /**
- * Fill a builder with attribute values from the provided {@code Node} instance.
- * Regular attribute values will be replaced with those from the given instance.
- * Absent optional values will not replace present values.
- * @param instance The instance from which to copy values
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder from(Node instance) {
- Preconditions.checkNotNull(instance, "instance");
- node(instance.getNode());
- address(instance.getAddress());
- return this;
- }
-
- /**
- * Initializes the value for the {@link Node#getNode() node} attribute.
- * @param node The value for node
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder node(String node) {
- this.node = Preconditions.checkNotNull(node, "node");
- initBits &= ~INIT_BIT_NODE;
- return this;
- }
-
- /**
- * Initializes the value for the {@link Node#getAddress() address} attribute.
- * @param address The value for address
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder address(String address) {
- this.address = Preconditions.checkNotNull(address, "address");
- initBits &= ~INIT_BIT_ADDRESS;
- return this;
- }
-
- /**
- * Builds a new {@link ImmutableNode ImmutableNode}.
- * @return An immutable instance of Node
- * @throws java.lang.IllegalStateException if any required attributes are missing
- */
- public ImmutableNode build() throws IllegalStateException {
- if (initBits != 0) {
- throw new IllegalStateException(formatRequiredAttributesMessage());
- }
- return new ImmutableNode(node, address);
- }
-
- private String formatRequiredAttributesMessage() {
- List<String> attributes = Lists.newArrayList();
- if ((initBits & INIT_BIT_NODE) != 0) attributes.add("node");
- if ((initBits & INIT_BIT_ADDRESS) != 0) attributes.add("address");
- return "Cannot build Node, some of required attributes are not set " + attributes;
- }
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableService.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableService.java
deleted file mode 100644
index ec8f2d3..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ImmutableService.java
+++ /dev/null
@@ -1,477 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.consul.model.health;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import java.util.List;
-import javax.annotation.Generated;
-
-/**
- * Immutable implementation of {@link Service}.
- * <p>
- * Use the builder to create immutable instances:
- * {@code ImmutableService.builder()}.
- */
-@SuppressWarnings("all")
-@Generated({"Immutables.generator", "Service"})
-@JsonIgnoreProperties(ignoreUnknown = true)
-public final class ImmutableService extends Service {
- private final String id;
- private final String service;
- private final ImmutableList<String> tags;
- private final String address;
- private final int port;
-
- private ImmutableService(
- String id,
- String service,
- ImmutableList<String> tags,
- String address,
- int port) {
- this.id = id;
- this.service = service;
- this.tags = tags;
- this.address = address;
- this.port = port;
- }
-
- /**
- * @return The value of the {@code id} attribute
- */
- @JsonProperty(value = "ID")
- @Override
- public String getId() {
- return id;
- }
-
- /**
- * @return The value of the {@code service} attribute
- */
- @JsonProperty(value = "Service")
- @Override
- public String getService() {
- return service;
- }
-
- /**
- * @return The value of the {@code tags} attribute
- */
- @JsonProperty(value = "Tags")
- @JsonDeserialize(as = ImmutableList.class, contentAs = String.class)
- @Override
- public ImmutableList<String> getTags() {
- return tags;
- }
-
- /**
- * @return The value of the {@code address} attribute
- */
- @JsonProperty(value = "Address")
- @Override
- public String getAddress() {
- return address;
- }
-
- /**
- * @return The value of the {@code port} attribute
- */
- @JsonProperty(value = "Port")
- @Override
- public int getPort() {
- return port;
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link Service#getId() id} attribute.
- * An equals check used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for id
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableService withId(String value) {
- if (this.id.equals(value)) return this;
- return new ImmutableService(
- Preconditions.checkNotNull(value, "id"),
- this.service,
- this.tags,
- this.address,
- this.port);
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link Service#getService() service} attribute.
- * An equals check used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for service
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableService withService(String value) {
- if (this.service.equals(value)) return this;
- return new ImmutableService(
- this.id,
- Preconditions.checkNotNull(value, "service"),
- this.tags,
- this.address,
- this.port);
- }
-
- /**
- * Copy the current immutable object with elements that replace the content of {@link Service#getTags() tags}.
- * @param elements The elements to set
- * @return A modified copy of {@code this} object
- */
- public final ImmutableService withTags(String... elements) {
- ImmutableList<String> newValue = ImmutableList.copyOf(elements);
- return new ImmutableService(this.id, this.service, newValue, this.address, this.port);
- }
-
- /**
- * Copy the current immutable object with elements that replace the content of {@link Service#getTags() tags}.
- * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.
- * @param elements An iterable of tags elements to set
- * @return A modified copy of {@code this} object
- */
- public final ImmutableService withTags(Iterable<String> elements) {
- if (this.tags == elements) return this;
- ImmutableList<String> newValue = ImmutableList.copyOf(elements);
- return new ImmutableService(this.id, this.service, newValue, this.address, this.port);
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link Service#getAddress() address} attribute.
- * An equals check used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for address
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableService withAddress(String value) {
- if (this.address.equals(value)) return this;
- return new ImmutableService(
- this.id,
- this.service,
- this.tags,
- Preconditions.checkNotNull(value, "address"),
- this.port);
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link Service#getPort() port} attribute.
- * A value equality check is used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for port
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableService withPort(int value) {
- if (this.port == value) return this;
- return new ImmutableService(this.id, this.service, this.tags, this.address, value);
- }
-
- /**
- * This instance is equal to all instances of {@code ImmutableService} that have equal attribute values.
- * @return {@code true} if {@code this} is equal to {@code another} instance
- */
- @Override
- public boolean equals(Object another) {
- if (this == another) return true;
- return another instanceof ImmutableService
- && equalTo((ImmutableService) another);
- }
-
- private boolean equalTo(ImmutableService another) {
- return id.equals(another.id)
- && service.equals(another.service)
- && tags.equals(another.tags)
- && address.equals(another.address)
- && port == another.port;
- }
-
- /**
- * Computes a hash code from attributes: {@code id}, {@code service}, {@code tags}, {@code address}, {@code port}.
- * @return hashCode value
- */
- @Override
- public int hashCode() {
- int h = 31;
- h = h * 17 + id.hashCode();
- h = h * 17 + service.hashCode();
- h = h * 17 + tags.hashCode();
- h = h * 17 + address.hashCode();
- h = h * 17 + port;
- return h;
- }
-
- /**
- * Prints the immutable value {@code Service...} with all non-generated
- * and non-auxiliary attribute values.
- * @return A string representation of the value
- */
- @Override
- public String toString() {
- return MoreObjects.toStringHelper("Service")
- .add("id", id)
- .add("service", service)
- .add("tags", tags)
- .add("address", address)
- .add("port", port)
- .toString();
- }
-
- /**
- * Utility type used to correctly read immutable object from JSON representation.
- * @deprecated Do not use this type directly, it exists only for the <em>Jackson</em>-binding infrastructure
- */
- @Deprecated
- @JsonDeserialize
- static final class Json extends Service {
- String id;
- String service;
- List<String> tags = ImmutableList.of();
- String address;
- Integer port;
- @JsonProperty(value = "ID")
- public void setId(String id) {
- this.id = id;
- }
- @JsonProperty(value = "Service")
- public void setService(String service) {
- this.service = service;
- }
- @JsonProperty(value = "Tags")
- @JsonDeserialize(as = ImmutableList.class, contentAs = String.class)
- public void setTags(List<String> tags) {
- this.tags = tags;
- }
- @JsonProperty(value = "Address")
- public void setAddress(String address) {
- this.address = address;
- }
- @JsonProperty(value = "Port")
- public void setPort(int port) {
- this.port = port;
- }
- @Override
- public String getId() { throw new UnsupportedOperationException(); }
- @Override
- public String getService() { throw new UnsupportedOperationException(); }
- @Override
- public List<String> getTags() { throw new UnsupportedOperationException(); }
- @Override
- public String getAddress() { throw new UnsupportedOperationException(); }
- @Override
- public int getPort() { throw new UnsupportedOperationException(); }
- }
-
- /**
- * @param json A JSON-bindable data structure
- * @return An immutable value type
- * @deprecated Do not use this method directly, it exists only for the <em>Jackson</em>-binding infrastructure
- */
- @Deprecated
- @JsonCreator
- static ImmutableService fromJson(Json json) {
- ImmutableService.Builder builder = ImmutableService.builder();
- if (json.id != null) {
- builder.id(json.id);
- }
- if (json.service != null) {
- builder.service(json.service);
- }
- if (json.tags != null) {
- builder.addAllTags(json.tags);
- }
- if (json.address != null) {
- builder.address(json.address);
- }
- if (json.port != null) {
- builder.port(json.port);
- }
- return builder.build();
- }
-
- /**
- * Creates an immutable copy of a {@link Service} value.
- * Uses accessors to get values to initialize the new immutable instance.
- * If an instance is already immutable, it is returned as is.
- * @param instance The instance to copy
- * @return A copied immutable Service instance
- */
- public static ImmutableService copyOf(Service instance) {
- if (instance instanceof ImmutableService) {
- return (ImmutableService) instance;
- }
- return ImmutableService.builder()
- .from(instance)
- .build();
- }
-
- /**
- * Creates a builder for {@link ImmutableService ImmutableService}.
- * @return A new ImmutableService builder
- */
- public static ImmutableService.Builder builder() {
- return new ImmutableService.Builder();
- }
-
- /**
- * Builds instances of type {@link ImmutableService ImmutableService}.
- * Initialize attributes and then invoke the {@link #build()} method to create an
- * immutable instance.
- * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,
- * but instead used immediately to create instances.</em>
- */
- public static final class Builder {
- private static final long INIT_BIT_ID = 0x1L;
- private static final long INIT_BIT_SERVICE = 0x2L;
- private static final long INIT_BIT_ADDRESS = 0x4L;
- private static final long INIT_BIT_PORT = 0x8L;
- private long initBits = 0xf;
-
- private String id;
- private String service;
- private ImmutableList.Builder<String> tagsBuilder = ImmutableList.builder();
- private String address;
- private int port;
-
- private Builder() {
- }
-
- /**
- * Fill a builder with attribute values from the provided {@code Service} instance.
- * Regular attribute values will be replaced with those from the given instance.
- * Absent optional values will not replace present values.
- * Collection elements and entries will be added, not replaced.
- * @param instance The instance from which to copy values
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder from(Service instance) {
- Preconditions.checkNotNull(instance, "instance");
- id(instance.getId());
- service(instance.getService());
- addAllTags(instance.getTags());
- address(instance.getAddress());
- port(instance.getPort());
- return this;
- }
-
- /**
- * Initializes the value for the {@link Service#getId() id} attribute.
- * @param id The value for id
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder id(String id) {
- this.id = Preconditions.checkNotNull(id, "id");
- initBits &= ~INIT_BIT_ID;
- return this;
- }
-
- /**
- * Initializes the value for the {@link Service#getService() service} attribute.
- * @param service The value for service
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder service(String service) {
- this.service = Preconditions.checkNotNull(service, "service");
- initBits &= ~INIT_BIT_SERVICE;
- return this;
- }
-
- /**
- * Adds one element to {@link Service#getTags() tags} list.
- * @param element A tags element
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder addTags(String element) {
- tagsBuilder.add(element);
- return this;
- }
-
- /**
- * Adds elements to {@link Service#getTags() tags} list.
- * @param elements An array of tags elements
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder addTags(String... elements) {
- tagsBuilder.add(elements);
- return this;
- }
-
- /**
- * Sets or replaces all elements for {@link Service#getTags() tags} list.
- * @param elements An iterable of tags elements
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder tags(Iterable<String> elements) {
- tagsBuilder = ImmutableList.builder();
- return addAllTags(elements);
- }
-
- /**
- * Adds elements to {@link Service#getTags() tags} list.
- * @param elements An iterable of tags elements
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder addAllTags(Iterable<String> elements) {
- tagsBuilder.addAll(elements);
- return this;
- }
-
- /**
- * Initializes the value for the {@link Service#getAddress() address} attribute.
- * @param address The value for address
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder address(String address) {
- this.address = Preconditions.checkNotNull(address, "address");
- initBits &= ~INIT_BIT_ADDRESS;
- return this;
- }
-
- /**
- * Initializes the value for the {@link Service#getPort() port} attribute.
- * @param port The value for port
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder port(int port) {
- this.port = port;
- initBits &= ~INIT_BIT_PORT;
- return this;
- }
-
- /**
- * Builds a new {@link ImmutableService ImmutableService}.
- * @return An immutable instance of Service
- * @throws java.lang.IllegalStateException if any required attributes are missing
- */
- public ImmutableService build() throws IllegalStateException {
- if (initBits != 0) {
- throw new IllegalStateException(formatRequiredAttributesMessage());
- }
- return new ImmutableService(id, service, tagsBuilder.build(), address, port);
- }
-
- private String formatRequiredAttributesMessage() {
- List<String> attributes = Lists.newArrayList();
- if ((initBits & INIT_BIT_ID) != 0) attributes.add("id");
- if ((initBits & INIT_BIT_SERVICE) != 0) attributes.add("service");
- if ((initBits & INIT_BIT_ADDRESS) != 0) attributes.add("address");
- if ((initBits & INIT_BIT_PORT) != 0) attributes.add("port");
- return "Cannot build Service, some of required attributes are not set " + attributes;
- }
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Node.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Node.java
deleted file mode 100644
index 9f603c5..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Node.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.model.health;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-
-
-@JsonSerialize(as = ImmutableNode.class)
-@JsonDeserialize(as = ImmutableNode.class)
-@JsonIgnoreProperties(ignoreUnknown = true)
-public abstract class Node {
-
- @JsonProperty("Node")
- public abstract String getNode();
-
- @JsonProperty("Address")
- public abstract String getAddress();
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Service.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Service.java
deleted file mode 100644
index 6ac3d4b..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/Service.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.model.health;
-
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.google.common.collect.ImmutableList;
-
-
-@JsonSerialize(as = ImmutableService.class)
-@JsonDeserialize(as = ImmutableService.class)
-@JsonIgnoreProperties(ignoreUnknown = true)
-public abstract class Service {
-
- @JsonProperty("ID")
- public abstract String getId();
-
- @JsonProperty("Service")
- public abstract String getService();
-
- @JsonProperty("Tags")
- @JsonDeserialize(as = ImmutableList.class, contentAs = String.class)
- public abstract List<String> getTags();
-
- @JsonProperty("Address")
- public abstract String getAddress();
-
- @JsonProperty("Port")
- public abstract int getPort();
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ServiceHealth.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ServiceHealth.java
deleted file mode 100644
index 4693256..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/model/health/ServiceHealth.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.model.health;
-
-import org.openo.msb.wrapper.consul.model.catalog.ServiceInfo;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.Objects;
-
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class ServiceHealth {
-
- @JsonProperty("Node")
- public Node node;
-
- @JsonProperty("Service")
- public Service service;
-
- public Node getNode() {
- return node;
- }
-
- public void setNode(Node node) {
- this.node = node;
- }
-
- public Service getService() {
- return service;
- }
-
- public void setService(Service service) {
- this.service = service;
- }
-
- @Override
- public boolean equals(Object other)
- {
- if(this == other)
- return true;
- if(other instanceof ServiceHealth)
- {
- ServiceHealth that = (ServiceHealth)other;
- return Objects.equal(node, that.node) && Objects.equal(service, that.service);
- } else
- {
- return false;
- }
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(node, service);
- }
-
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/CatalogOptions.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/CatalogOptions.java
deleted file mode 100644
index daba73c..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/CatalogOptions.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.option;
-
-import static org.openo.msb.wrapper.consul.option.Options.optionallyAdd;
-
-import javax.ws.rs.client.WebTarget;
-
-import com.google.common.base.Optional;
-
-
-public abstract class CatalogOptions implements ParamAdder {
-
- public abstract Optional<String> getDatacenter();
- public abstract Optional<String> getTag();
-
- public static final CatalogOptions BLANK = ImmutableCatalogOptions.builder().build();
-
- @Override
- public final WebTarget apply(final WebTarget input) {
- WebTarget added = optionallyAdd(input, "dc", getDatacenter());
- added = optionallyAdd(added, "tag", getTag());
- return added;
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ConsistencyMode.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ConsistencyMode.java
deleted file mode 100644
index ea47c65..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ConsistencyMode.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.option;
-
-public enum ConsistencyMode {
- DEFAULT, STALE, CONSISTENT
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableCatalogOptions.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableCatalogOptions.java
deleted file mode 100644
index 89048d5..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableCatalogOptions.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.consul.option;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import javax.annotation.Generated;
-
-/**
- * Immutable implementation of {@link CatalogOptions}.
- * <p>
- * Use the builder to create immutable instances:
- * {@code ImmutableCatalogOptions.builder()}.
- */
-@SuppressWarnings("all")
-@Generated({"Immutables.generator", "CatalogOptions"})
-public final class ImmutableCatalogOptions extends CatalogOptions {
- private final Optional<String> datacenter;
- private final Optional<String> tag;
-
- private ImmutableCatalogOptions(
- Optional<String> datacenter,
- Optional<String> tag) {
- this.datacenter = datacenter;
- this.tag = tag;
- }
-
- /**
- * @return The value of the {@code datacenter} attribute
- */
- @Override
- public Optional<String> getDatacenter() {
- return datacenter;
- }
-
- /**
- * @return The value of the {@code tag} attribute
- */
- @Override
- public Optional<String> getTag() {
- return tag;
- }
-
- /**
- * Copy the current immutable object by setting a <i>present</i> value for the optional {@link CatalogOptions#getDatacenter() datacenter} attribute.
- * @param value The value for datacenter
- * @return A modified copy of {@code this} object
- */
- public final ImmutableCatalogOptions withDatacenter(String value) {
- Optional<String> newValue = Optional.of(value);
- return new ImmutableCatalogOptions(newValue, this.tag);
- }
-
- /**
- * Copy the current immutable object by setting an optional value for the {@link CatalogOptions#getDatacenter() datacenter} attribute.
- * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
- * @param optional A value for datacenter
- * @return A modified copy of {@code this} object
- */
- public final ImmutableCatalogOptions withDatacenter(Optional<String> optional) {
- Optional<String> value = Preconditions.checkNotNull(optional, "datacenter");
- if (this.datacenter == value) return this;
- return new ImmutableCatalogOptions(value, this.tag);
- }
-
- /**
- * Copy the current immutable object by setting a <i>present</i> value for the optional {@link CatalogOptions#getTag() tag} attribute.
- * @param value The value for tag
- * @return A modified copy of {@code this} object
- */
- public final ImmutableCatalogOptions withTag(String value) {
- Optional<String> newValue = Optional.of(value);
- return new ImmutableCatalogOptions(this.datacenter, newValue);
- }
-
- /**
- * Copy the current immutable object by setting an optional value for the {@link CatalogOptions#getTag() tag} attribute.
- * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
- * @param optional A value for tag
- * @return A modified copy of {@code this} object
- */
- public final ImmutableCatalogOptions withTag(Optional<String> optional) {
- Optional<String> value = Preconditions.checkNotNull(optional, "tag");
- if (this.tag == value) return this;
- return new ImmutableCatalogOptions(this.datacenter, value);
- }
-
- /**
- * This instance is equal to all instances of {@code ImmutableCatalogOptions} that have equal attribute values.
- * @return {@code true} if {@code this} is equal to {@code another} instance
- */
- @Override
- public boolean equals(Object another) {
- if (this == another) return true;
- return another instanceof ImmutableCatalogOptions
- && equalTo((ImmutableCatalogOptions) another);
- }
-
- private boolean equalTo(ImmutableCatalogOptions another) {
- return datacenter.equals(another.datacenter)
- && tag.equals(another.tag);
- }
-
- /**
- * Computes a hash code from attributes: {@code datacenter}, {@code tag}.
- * @return hashCode value
- */
- @Override
- public int hashCode() {
- int h = 31;
- h = h * 17 + datacenter.hashCode();
- h = h * 17 + tag.hashCode();
- return h;
- }
-
- /**
- * Prints the immutable value {@code CatalogOptions...} with all non-generated
- * and non-auxiliary attribute values.
- * @return A string representation of the value
- */
- @Override
- public String toString() {
- return MoreObjects.toStringHelper("CatalogOptions")
- .add("datacenter", datacenter)
- .add("tag", tag)
- .toString();
- }
-
- /**
- * Creates an immutable copy of a {@link CatalogOptions} value.
- * Uses accessors to get values to initialize the new immutable instance.
- * If an instance is already immutable, it is returned as is.
- * @param instance The instance to copy
- * @return A copied immutable CatalogOptions instance
- */
- public static ImmutableCatalogOptions copyOf(CatalogOptions instance) {
- if (instance instanceof ImmutableCatalogOptions) {
- return (ImmutableCatalogOptions) instance;
- }
- return ImmutableCatalogOptions.builder()
- .from(instance)
- .build();
- }
-
- /**
- * Creates a builder for {@link ImmutableCatalogOptions ImmutableCatalogOptions}.
- * @return A new ImmutableCatalogOptions builder
- */
- public static ImmutableCatalogOptions.Builder builder() {
- return new ImmutableCatalogOptions.Builder();
- }
-
- /**
- * Builds instances of type {@link ImmutableCatalogOptions ImmutableCatalogOptions}.
- * Initialize attributes and then invoke the {@link #build()} method to create an
- * immutable instance.
- * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,
- * but instead used immediately to create instances.</em>
- */
- public static final class Builder {
- private Optional<String> datacenter = Optional.absent();
- private Optional<String> tag = Optional.absent();
-
- private Builder() {
- }
-
- /**
- * Fill a builder with attribute values from the provided {@code CatalogOptions} instance.
- * Regular attribute values will be replaced with those from the given instance.
- * Absent optional values will not replace present values.
- * @param instance The instance from which to copy values
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder from(CatalogOptions instance) {
- Preconditions.checkNotNull(instance, "instance");
- Optional<String> datacenterOptional = instance.getDatacenter();
- if (datacenterOptional.isPresent()) {
- datacenter(datacenterOptional);
- }
- Optional<String> tagOptional = instance.getTag();
- if (tagOptional.isPresent()) {
- tag(tagOptional);
- }
- return this;
- }
-
- /**
- * Initializes the optional value {@link CatalogOptions#getDatacenter() datacenter} to datacenter.
- * @param datacenter The value for datacenter
- * @return {@code this} builder for chained invocation
- */
- public final Builder datacenter(String datacenter) {
- this.datacenter = Optional.of(datacenter);
- return this;
- }
-
- /**
- * Initializes the optional value {@link CatalogOptions#getDatacenter() datacenter} to datacenter.
- * @param datacenter The value for datacenter
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder datacenter(Optional<String> datacenter) {
- this.datacenter = Preconditions.checkNotNull(datacenter, "datacenter");
- return this;
- }
-
- /**
- * Initializes the optional value {@link CatalogOptions#getTag() tag} to tag.
- * @param tag The value for tag
- * @return {@code this} builder for chained invocation
- */
- public final Builder tag(String tag) {
- this.tag = Optional.of(tag);
- return this;
- }
-
- /**
- * Initializes the optional value {@link CatalogOptions#getTag() tag} to tag.
- * @param tag The value for tag
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder tag(Optional<String> tag) {
- this.tag = Preconditions.checkNotNull(tag, "tag");
- return this;
- }
-
- /**
- * Builds a new {@link ImmutableCatalogOptions ImmutableCatalogOptions}.
- * @return An immutable instance of CatalogOptions
- * @throws java.lang.IllegalStateException if any required attributes are missing
- */
- public ImmutableCatalogOptions build() throws IllegalStateException {
- return new ImmutableCatalogOptions(datacenter, tag);
- }
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableQueryOptions.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableQueryOptions.java
deleted file mode 100644
index c39b578..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ImmutableQueryOptions.java
+++ /dev/null
@@ -1,530 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.consul.option;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-import com.google.common.primitives.Booleans;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import javax.annotation.Generated;
-
-/**
- * Immutable implementation of {@link QueryOptions}.
- * <p>
- * Use the builder to create immutable instances:
- * {@code ImmutableQueryOptions.builder()}.
- */
-@SuppressWarnings("all")
-@Generated({"Immutables.generator", "QueryOptions"})
-public final class ImmutableQueryOptions extends QueryOptions {
- private final Optional<String> wait;
- private final Optional<String> token;
- private final Optional<BigInteger> index;
- private final Optional<String> near;
- private final ConsistencyMode consistencyMode;
- private final boolean isBlocking;
- private final boolean hasToken;
-
- private ImmutableQueryOptions(ImmutableQueryOptions.Builder builder) {
- this.wait = builder.wait;
- this.token = builder.token;
- this.index = builder.index;
- this.near = builder.near;
- if (builder.consistencyMode != null) {
- initShim.consistencyMode(builder.consistencyMode);
- }
- this.consistencyMode = initShim.getConsistencyMode();
- this.isBlocking = initShim.isBlocking();
- this.hasToken = initShim.hasToken();
- this.initShim = null;
- }
-
- private ImmutableQueryOptions(
- Optional<String> wait,
- Optional<String> token,
- Optional<BigInteger> index,
- Optional<String> near,
- ConsistencyMode consistencyMode) {
- this.wait = wait;
- this.token = token;
- this.index = index;
- this.near = near;
- this.consistencyMode = consistencyMode;
- initShim.consistencyMode(consistencyMode);
- this.isBlocking = initShim.isBlocking();
- this.hasToken = initShim.hasToken();
- this.initShim = null;
- }
-
- private static final int STAGE_INITIALIZING = -1;
- private static final int STAGE_UNINITIALIZED = 0;
- private static final int STAGE_INITIALIZED = 1;
- private volatile InitShim initShim = new InitShim();
-
- private final class InitShim {
- private ConsistencyMode consistencyMode;
- private byte consistencyModeStage;
-
- ConsistencyMode getConsistencyMode() {
- if (consistencyModeStage == STAGE_INITIALIZING) throw new IllegalStateException(formatInitCycleMessage());
- if (consistencyModeStage == STAGE_UNINITIALIZED) {
- consistencyModeStage = STAGE_INITIALIZING;
- this.consistencyMode = Preconditions.checkNotNull(ImmutableQueryOptions.super.getConsistencyMode(), "consistencyMode");
- consistencyModeStage = STAGE_INITIALIZED;
- }
- return consistencyMode;
- }
-
- ConsistencyMode consistencyMode(ConsistencyMode value) {
- this.consistencyMode = value;
- consistencyModeStage = STAGE_INITIALIZED;
- return value;
- }
- private boolean isBlocking;
- private byte isBlockingStage;
-
- boolean isBlocking() {
- if (isBlockingStage == STAGE_INITIALIZING) throw new IllegalStateException(formatInitCycleMessage());
- if (isBlockingStage == STAGE_UNINITIALIZED) {
- isBlockingStage = STAGE_INITIALIZING;
- this.isBlocking = ImmutableQueryOptions.super.isBlocking();
- isBlockingStage = STAGE_INITIALIZED;
- }
- return isBlocking;
- }
- private boolean hasToken;
- private byte hasTokenStage;
-
- boolean hasToken() {
- if (hasTokenStage == STAGE_INITIALIZING) throw new IllegalStateException(formatInitCycleMessage());
- if (hasTokenStage == STAGE_UNINITIALIZED) {
- hasTokenStage = STAGE_INITIALIZING;
- this.hasToken = ImmutableQueryOptions.super.hasToken();
- hasTokenStage = STAGE_INITIALIZED;
- }
- return hasToken;
- }
-
- private String formatInitCycleMessage() {
- ArrayList<String> attributes = Lists.newArrayList();
- if (consistencyModeStage == STAGE_INITIALIZING) attributes.add("consistencyMode");
- if (isBlockingStage == STAGE_INITIALIZING) attributes.add("isBlocking");
- if (hasTokenStage == STAGE_INITIALIZING) attributes.add("hasToken");
- return "Cannot build QueryOptions, attribute initializers form cycle" + attributes;
- }
- }
-
- /**
- * @return The value of the {@code wait} attribute
- */
- @Override
- public Optional<String> getWait() {
- return wait;
- }
-
- /**
- * @return The value of the {@code token} attribute
- */
- @Override
- public Optional<String> getToken() {
- return token;
- }
-
- /**
- * @return The value of the {@code index} attribute
- */
- @Override
- public Optional<BigInteger> getIndex() {
- return index;
- }
-
- /**
- * @return The value of the {@code near} attribute
- */
- @Override
- public Optional<String> getNear() {
- return near;
- }
-
- /**
- * @return The value of the {@code consistencyMode} attribute
- */
- @Override
- public ConsistencyMode getConsistencyMode() {
- return initShim != null
- ? initShim.getConsistencyMode()
- : consistencyMode;
- }
-
- /**
- * @return The computed-at-construction value of the {@code isBlocking} attribute
- */
- @Override
- public boolean isBlocking() {
- return initShim != null
- ? initShim.isBlocking()
- : isBlocking;
- }
-
- /**
- * @return The computed-at-construction value of the {@code hasToken} attribute
- */
- @Override
- public boolean hasToken() {
- return initShim != null
- ? initShim.hasToken()
- : hasToken;
- }
-
- /**
- * Copy the current immutable object by setting a <i>present</i> value for the optional {@link QueryOptions#getWait() wait} attribute.
- * @param value The value for wait
- * @return A modified copy of {@code this} object
- */
- public final ImmutableQueryOptions withWait(String value) {
- Optional<String> newValue = Optional.of(value);
- return validate(new ImmutableQueryOptions(newValue, this.token, this.index, this.near, this.consistencyMode));
- }
-
- /**
- * Copy the current immutable object by setting an optional value for the {@link QueryOptions#getWait() wait} attribute.
- * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
- * @param optional A value for wait
- * @return A modified copy of {@code this} object
- */
- public final ImmutableQueryOptions withWait(Optional<String> optional) {
- Optional<String> value = Preconditions.checkNotNull(optional, "wait");
- if (this.wait == value) return this;
- return validate(new ImmutableQueryOptions(value, this.token, this.index, this.near, this.consistencyMode));
- }
-
- /**
- * Copy the current immutable object by setting a <i>present</i> value for the optional {@link QueryOptions#getToken() token} attribute.
- * @param value The value for token
- * @return A modified copy of {@code this} object
- */
- public final ImmutableQueryOptions withToken(String value) {
- Optional<String> newValue = Optional.of(value);
- return validate(new ImmutableQueryOptions(this.wait, newValue, this.index, this.near, this.consistencyMode));
- }
-
- /**
- * Copy the current immutable object by setting an optional value for the {@link QueryOptions#getToken() token} attribute.
- * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
- * @param optional A value for token
- * @return A modified copy of {@code this} object
- */
- public final ImmutableQueryOptions withToken(Optional<String> optional) {
- Optional<String> value = Preconditions.checkNotNull(optional, "token");
- if (this.token == value) return this;
- return validate(new ImmutableQueryOptions(this.wait, value, this.index, this.near, this.consistencyMode));
- }
-
- /**
- * Copy the current immutable object by setting a <i>present</i> value for the optional {@link QueryOptions#getIndex() index} attribute.
- * @param value The value for index
- * @return A modified copy of {@code this} object
- */
- public final ImmutableQueryOptions withIndex(BigInteger value) {
- Optional<BigInteger> newValue = Optional.of(value);
- return validate(new ImmutableQueryOptions(this.wait, this.token, newValue, this.near, this.consistencyMode));
- }
-
- /**
- * Copy the current immutable object by setting an optional value for the {@link QueryOptions#getIndex() index} attribute.
- * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
- * @param optional A value for index
- * @return A modified copy of {@code this} object
- */
- public final ImmutableQueryOptions withIndex(Optional<BigInteger> optional) {
- Optional<BigInteger> value = Preconditions.checkNotNull(optional, "index");
- if (this.index == value) return this;
- return validate(new ImmutableQueryOptions(this.wait, this.token, value, this.near, this.consistencyMode));
- }
-
- /**
- * Copy the current immutable object by setting a <i>present</i> value for the optional {@link QueryOptions#getNear() near} attribute.
- * @param value The value for near
- * @return A modified copy of {@code this} object
- */
- public final ImmutableQueryOptions withNear(String value) {
- Optional<String> newValue = Optional.of(value);
- return validate(new ImmutableQueryOptions(this.wait, this.token, this.index, newValue, this.consistencyMode));
- }
-
- /**
- * Copy the current immutable object by setting an optional value for the {@link QueryOptions#getNear() near} attribute.
- * A shallow reference equality check on the optional value is used to prevent copying of the same value by returning {@code this}.
- * @param optional A value for near
- * @return A modified copy of {@code this} object
- */
- public final ImmutableQueryOptions withNear(Optional<String> optional) {
- Optional<String> value = Preconditions.checkNotNull(optional, "near");
- if (this.near == value) return this;
- return validate(new ImmutableQueryOptions(this.wait, this.token, this.index, value, this.consistencyMode));
- }
-
- /**
- * Copy the current immutable object by setting a value for the {@link QueryOptions#getConsistencyMode() consistencyMode} attribute.
- * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}.
- * @param value A new value for consistencyMode
- * @return A modified copy of the {@code this} object
- */
- public final ImmutableQueryOptions withConsistencyMode(ConsistencyMode value) {
- if (this.consistencyMode == value) return this;
- return validate(new ImmutableQueryOptions(
- this.wait,
- this.token,
- this.index,
- this.near,
- Preconditions.checkNotNull(value, "consistencyMode")));
- }
-
- /**
- * This instance is equal to all instances of {@code ImmutableQueryOptions} that have equal attribute values.
- * @return {@code true} if {@code this} is equal to {@code another} instance
- */
- @Override
- public boolean equals(Object another) {
- if (this == another) return true;
- return another instanceof ImmutableQueryOptions
- && equalTo((ImmutableQueryOptions) another);
- }
-
- private boolean equalTo(ImmutableQueryOptions another) {
- return wait.equals(another.wait)
- && token.equals(another.token)
- && index.equals(another.index)
- && near.equals(another.near)
- && consistencyMode.equals(another.consistencyMode)
- && isBlocking == another.isBlocking
- && hasToken == another.hasToken;
- }
-
- /**
- * Computes a hash code from attributes: {@code wait}, {@code token}, {@code index}, {@code near}, {@code consistencyMode}, {@code isBlocking}, {@code hasToken}.
- * @return hashCode value
- */
- @Override
- public int hashCode() {
- int h = 31;
- h = h * 17 + wait.hashCode();
- h = h * 17 + token.hashCode();
- h = h * 17 + index.hashCode();
- h = h * 17 + near.hashCode();
- h = h * 17 + consistencyMode.hashCode();
- h = h * 17 + Booleans.hashCode(isBlocking);
- h = h * 17 + Booleans.hashCode(hasToken);
- return h;
- }
-
- /**
- * Prints the immutable value {@code QueryOptions...} with all non-generated
- * and non-auxiliary attribute values.
- * @return A string representation of the value
- */
- @Override
- public String toString() {
- return MoreObjects.toStringHelper("QueryOptions")
- .add("wait", wait)
- .add("token", token)
- .add("index", index)
- .add("near", near)
- .add("consistencyMode", consistencyMode)
- .add("isBlocking", isBlocking)
- .add("hasToken", hasToken)
- .toString();
- }
-
- private static ImmutableQueryOptions validate(ImmutableQueryOptions instance) {
- instance.validate();
- return instance;
- }
-
- /**
- * Creates an immutable copy of a {@link QueryOptions} value.
- * Uses accessors to get values to initialize the new immutable instance.
- * If an instance is already immutable, it is returned as is.
- * @param instance The instance to copy
- * @return A copied immutable QueryOptions instance
- */
- public static ImmutableQueryOptions copyOf(QueryOptions instance) {
- if (instance instanceof ImmutableQueryOptions) {
- return (ImmutableQueryOptions) instance;
- }
- return ImmutableQueryOptions.builder()
- .from(instance)
- .build();
- }
-
- /**
- * Creates a builder for {@link ImmutableQueryOptions ImmutableQueryOptions}.
- * @return A new ImmutableQueryOptions builder
- */
- public static ImmutableQueryOptions.Builder builder() {
- return new ImmutableQueryOptions.Builder();
- }
-
- /**
- * Builds instances of type {@link ImmutableQueryOptions ImmutableQueryOptions}.
- * Initialize attributes and then invoke the {@link #build()} method to create an
- * immutable instance.
- * <p><em>{@code Builder} is not thread-safe and generally should not be stored in a field or collection,
- * but instead used immediately to create instances.</em>
- */
- public static final class Builder {
- private Optional<String> wait = Optional.absent();
- private Optional<String> token = Optional.absent();
- private Optional<BigInteger> index = Optional.absent();
- private Optional<String> near = Optional.absent();
- private ConsistencyMode consistencyMode;
-
- private Builder() {
- }
-
- /**
- * Fill a builder with attribute values from the provided {@code QueryOptions} instance.
- * Regular attribute values will be replaced with those from the given instance.
- * Absent optional values will not replace present values.
- * @param instance The instance from which to copy values
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder from(QueryOptions instance) {
- Preconditions.checkNotNull(instance, "instance");
- Optional<String> waitOptional = instance.getWait();
- if (waitOptional.isPresent()) {
- wait(waitOptional);
- }
- Optional<String> tokenOptional = instance.getToken();
- if (tokenOptional.isPresent()) {
- token(tokenOptional);
- }
- Optional<BigInteger> indexOptional = instance.getIndex();
- if (indexOptional.isPresent()) {
- index(indexOptional);
- }
- Optional<String> nearOptional = instance.getNear();
- if (nearOptional.isPresent()) {
- near(nearOptional);
- }
- consistencyMode(instance.getConsistencyMode());
- return this;
- }
-
- /**
- * Initializes the optional value {@link QueryOptions#getWait() wait} to wait.
- * @param wait The value for wait
- * @return {@code this} builder for chained invocation
- */
- public final Builder wait(String wait) {
- this.wait = Optional.of(wait);
- return this;
- }
-
- /**
- * Initializes the optional value {@link QueryOptions#getWait() wait} to wait.
- * @param wait The value for wait
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder wait(Optional<String> wait) {
- this.wait = Preconditions.checkNotNull(wait, "wait");
- return this;
- }
-
- /**
- * Initializes the optional value {@link QueryOptions#getToken() token} to token.
- * @param token The value for token
- * @return {@code this} builder for chained invocation
- */
- public final Builder token(String token) {
- this.token = Optional.of(token);
- return this;
- }
-
- /**
- * Initializes the optional value {@link QueryOptions#getToken() token} to token.
- * @param token The value for token
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder token(Optional<String> token) {
- this.token = Preconditions.checkNotNull(token, "token");
- return this;
- }
-
- /**
- * Initializes the optional value {@link QueryOptions#getIndex() index} to index.
- * @param index The value for index
- * @return {@code this} builder for chained invocation
- */
- public final Builder index(BigInteger index) {
- this.index = Optional.of(index);
- return this;
- }
-
- /**
- * Initializes the optional value {@link QueryOptions#getIndex() index} to index.
- * @param index The value for index
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder index(Optional<BigInteger> index) {
- this.index = Preconditions.checkNotNull(index, "index");
- return this;
- }
-
- /**
- * Initializes the optional value {@link QueryOptions#getNear() near} to near.
- * @param near The value for near
- * @return {@code this} builder for chained invocation
- */
- public final Builder near(String near) {
- this.near = Optional.of(near);
- return this;
- }
-
- /**
- * Initializes the optional value {@link QueryOptions#getNear() near} to near.
- * @param near The value for near
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder near(Optional<String> near) {
- this.near = Preconditions.checkNotNull(near, "near");
- return this;
- }
-
- /**
- * Initializes the value for the {@link QueryOptions#getConsistencyMode() consistencyMode} attribute.
- * <p><em>If not set, this attribute will have a default value as returned by the initializer of {@link QueryOptions#getConsistencyMode() consistencyMode}.</em>
- * @param consistencyMode The value for consistencyMode
- * @return {@code this} builder for use in a chained invocation
- */
- public final Builder consistencyMode(ConsistencyMode consistencyMode) {
- this.consistencyMode = Preconditions.checkNotNull(consistencyMode, "consistencyMode");
- return this;
- }
-
- /**
- * Builds a new {@link ImmutableQueryOptions ImmutableQueryOptions}.
- * @return An immutable instance of QueryOptions
- * @throws java.lang.IllegalStateException if any required attributes are missing
- */
- public ImmutableQueryOptions build() throws IllegalStateException {
- return ImmutableQueryOptions.validate(new ImmutableQueryOptions(this));
- }
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/Options.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/Options.java
deleted file mode 100644
index 1f04c09..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/Options.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.option;
-
-import com.google.common.base.Optional;
-
-import javax.ws.rs.client.WebTarget;
-
-public class Options {
- private Options(){};
-
- static <T> WebTarget optionallyAdd(WebTarget input, String key, Optional<T> val) {
- return val.isPresent() ? input.queryParam(key, val.get()) : input;
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ParamAdder.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ParamAdder.java
deleted file mode 100644
index dc9a9fa..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/ParamAdder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.option;
-
-import com.google.common.base.Function;
-
-import javax.ws.rs.client.WebTarget;
-
-public interface ParamAdder extends Function<WebTarget, WebTarget> {}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/QueryOptions.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/QueryOptions.java
deleted file mode 100644
index 688728e..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/option/QueryOptions.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.option;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static org.openo.msb.wrapper.consul.option.Options.optionallyAdd;
-
-import java.math.BigInteger;
-
-import javax.ws.rs.client.WebTarget;
-
-import com.google.common.base.Optional;
-
-/**
- * Container for common query options used by the Consul API.
- */
-
-public abstract class QueryOptions implements ParamAdder {
-
- public static final QueryOptions BLANK = ImmutableQueryOptions.builder().build();
-
- public abstract Optional<String> getWait();
- public abstract Optional<String> getToken();
- public abstract Optional<BigInteger> getIndex();
- public abstract Optional<String> getNear();
-
-
- public ConsistencyMode getConsistencyMode() {
- return ConsistencyMode.DEFAULT;
- }
-
-
- public boolean isBlocking() {
- return getWait().isPresent();
- }
-
-
- public boolean hasToken() {
- return getToken().isPresent();
- }
-
-
- void validate() {
- if (isBlocking()) {
- checkArgument(getIndex().isPresent(), "If wait is specified, index must also be specified");
- }
- }
-
- public static ImmutableQueryOptions.Builder blockSeconds(int seconds, BigInteger index) {
- return blockBuilder("s", seconds, index);
- }
-
- public static ImmutableQueryOptions.Builder blockMinutes(int minutes, BigInteger index) {
- return blockBuilder("m", minutes, index);
- }
-
- private static ImmutableQueryOptions.Builder blockBuilder(String identifier, int qty, BigInteger index) {
- return ImmutableQueryOptions.builder()
- .wait(String.format("%s%s", qty, identifier))
- .index(index);
- }
-
- @Override
- public WebTarget apply(WebTarget input) {
-
- WebTarget added = input;
- switch (getConsistencyMode()) {
- case CONSISTENT:
- added = added.queryParam("consistent", "");
- break;
- case STALE:
- added = added.queryParam("stale", "");
- break;
- }
-
- if (isBlocking()) {
- added = added.queryParam("wait", getWait().get())
- .queryParam("index", String.valueOf(getIndex().get()));
- }
-
- added = optionallyAdd(added, "token", getToken());
- added = optionallyAdd(added, "near", getToken());
-
- return added;
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Base64EncodingDeserializer.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Base64EncodingDeserializer.java
deleted file mode 100644
index 4770b6d..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Base64EncodingDeserializer.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.util;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.google.common.base.Optional;
-import com.google.common.io.BaseEncoding;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.IOException;
-
-/**
- * For use with JSON fields that Consul Base 64 encodes.
- */
-public class Base64EncodingDeserializer extends JsonDeserializer<Optional<String>> {
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Optional<String> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
- String value = p.getValueAsString();
-
- if (StringUtils.isNotEmpty(value)) {
- return Optional.of(new String(BaseEncoding.base64().decode(value)));
- }
- return Optional.absent();
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ClientUtil.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ClientUtil.java
deleted file mode 100644
index c45f0dd..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ClientUtil.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.util;
-
-import com.google.common.base.Optional;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-import javax.ws.rs.ServerErrorException;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.client.InvocationCallback;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.openo.msb.wrapper.consul.ConsulException;
-import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
-import org.openo.msb.wrapper.consul.model.ConsulResponse;
-import org.openo.msb.wrapper.consul.option.CatalogOptions;
-import org.openo.msb.wrapper.consul.option.ParamAdder;
-import org.openo.msb.wrapper.consul.option.QueryOptions;
-
-import java.math.BigInteger;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A collection of stateless utility methods for use in constructing
- * requests and responses to the Consul HTTP API.
- */
-public class ClientUtil {
-
- /**
- * Applies all key/values from the params map to query string parameters.
- *
- * @param webTarget The JAX-RS target to apply the query parameters.
- * @param params Map of parameters.
- * @return The new target with the parameters applied.
- */
- public static WebTarget queryParams(WebTarget webTarget, Map<String, String> params) {
- WebTarget target = webTarget;
-
- if(params != null) {
- for(Map.Entry<String, String> entry : params.entrySet()) {
- target = target.queryParam(entry.getKey(), entry.getValue());
- }
- }
-
- return target;
- }
-
- /**
- * Given a {@link org.openo.msb.wrapper.consul.option.ParamAdder} object, adds the
- * appropriate query string parameters to the request being built.
- *
- * @param webTarget The base {@link javax.ws.rs.client.WebTarget}.
- * @param paramAdder will add specific params to the target.
- * @return A {@link javax.ws.rs.client.WebTarget} with all appropriate query
- * string parameters.
- */
- public static WebTarget addParams(WebTarget webTarget, ParamAdder paramAdder) {
- return paramAdder == null ? webTarget : paramAdder.apply(webTarget);
- }
-
- /**
- * Generates a {@link org.openo.msb.wrapper.consul.model.ConsulResponse} for a specific datacenter,
- * set of {@link org.openo.msb.wrapper.consul.option.QueryOptions}, and a result type.
- *
- * @param target The base {@link javax.ws.rs.client.WebTarget}.
- * @param catalogOptions Catalog specific options to use.
- * @param queryOptions The Query Options to use.
- * @param type The generic type to marshall the resulting data to.
- * @param <T> The result type.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse}.
- */
- public static <T> ConsulResponse<T> response(WebTarget target, CatalogOptions catalogOptions,
- QueryOptions queryOptions,
- GenericType<T> type) {
- target = addParams(target, catalogOptions);
- target = addParams(target, queryOptions);
-
- return response(target, type);
- }
-
- /**
- * Generates a {@link org.openo.msb.wrapper.consul.model.ConsulResponse} for a specific datacenter,
- * set of {@link org.openo.msb.wrapper.consul.option.QueryOptions}, and a result type.
- *
- * @param target The base {@link javax.ws.rs.client.WebTarget}.
- * @param catalogOptions Catalog specific options to use.
- * @param queryOptions The Query Options to use.
- * @param type The generic type to marshall the resulting data to.
- * @param <T> The result type.
- */
- public static <T> void response(WebTarget target, CatalogOptions catalogOptions,
- QueryOptions queryOptions,
- GenericType<T> type,
- ConsulResponseCallback<T> callback) {
-
- target = addParams(target, catalogOptions);
- target = addParams(target, queryOptions);
-
- response(target, type, callback);
- }
-
- /**
- * Given a {@link javax.ws.rs.client.WebTarget} object and a type to marshall
- * the result JSON into, complete the HTTP GET request.
- *
- * @param webTarget The JAX-RS target.
- * @param responseType The class to marshall the JSON into.
- * @param <T> The class to marshall the JSON into.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing the result.
- */
- public static <T> ConsulResponse<T> response(WebTarget webTarget, GenericType<T> responseType) {
- Response response = webTarget.request().accept(MediaType.APPLICATION_JSON_TYPE).get();
-
- return consulResponse(responseType, response);
- }
-
- /**
- * Given a {@link javax.ws.rs.client.WebTarget} object and a type to marshall
- * the result JSON into, complete the HTTP GET request.
- *
- * @param webTarget The JAX-RS target.
- * @param responseType The class to marshall the JSON into.
- * @param callback The callback object to handle the result on a different thread.
- * @param <T> The class to marshall the JSON into.
- */
- public static <T> void response(WebTarget webTarget, final GenericType<T> responseType,
- final ConsulResponseCallback<T> callback) {
- webTarget.request().accept(MediaType.APPLICATION_JSON_TYPE).async().get(new InvocationCallback<Response>() {
-
- @Override
- public void completed(Response response) {
- try {
- callback.onComplete(consulResponse(responseType, response));
- } catch (Exception ex) {
- callback.onFailure(ex);
- }
- }
-
- @Override
- public void failed(Throwable throwable) {
- callback.onFailure(throwable);
- }
- });
- }
-
- /**
- * Extracts Consul specific headers and adds them to a {@link org.openo.msb.wrapper.consul.model.ConsulResponse}
- * object, which also contains the returned JSON entity.
- *
- * @param responseType The class to marshall the JSON to.
- * @param response The HTTP response.
- * @param <T> The class to marshall the JSON to.
- * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} object.
- */
- private static <T> ConsulResponse<T> consulResponse(GenericType<T> responseType, Response response) {
- handleErrors(response);
-
- String indexHeaderValue = response.getHeaderString("X-Consul-Index");
- String lastContactHeaderValue = response.getHeaderString("X-Consul-Lastcontact");
- String knownLeaderHeaderValue = response.getHeaderString("X-Consul-Knownleader");
-
- BigInteger index = new BigInteger(indexHeaderValue);
- long lastContact = lastContactHeaderValue == null ? -1 : Long.valueOf(lastContactHeaderValue);
- boolean knownLeader = knownLeaderHeaderValue == null ? false : Boolean.valueOf(knownLeaderHeaderValue);
-
- ConsulResponse<T> consulResponse = new ConsulResponse<T>(readResponse(response, responseType), lastContact, knownLeader, index);
-
- response.close();
-
- return consulResponse;
- }
-
- /**
- * Converts a {@link Response} object to the generic type provided, or an empty
- * representation if appropriate
- *
- * @param response response
- * @param responseType response type
- * @param <T>
- * @return the re
- */
- private static <T> T readResponse(Response response, GenericType<T> responseType) {
- if (response.getStatus() == Response.Status.NOT_FOUND.getStatusCode()) {
- // would be nice I knew a better way to do this
- if (responseType.getRawType() == List.class) {
- return (T) ImmutableList.of();
- } else if (responseType.getRawType() == Optional.class) {
- return (T) Optional.absent();
- } else if(responseType.getRawType() == Map.class) {
- return (T) ImmutableMap.of();
- } else {
- // Not sure if this case will be reached, but if it is it'll be nice to know
- throw new IllegalStateException("Cannot determine empty representation for " + responseType.getRawType());
- }
- }
- return response.readEntity(responseType);
- }
-
- /**
- * Since Consul returns plain text when an error occurs, check for
- * unsuccessful HTTP status code, and throw an exception with the text
- * from Consul as the message.
- *
- * @param response The HTTP response.
- */
- public static void handleErrors(Response response) {
-
- if (response.getStatusInfo().getFamily() == Response.Status.Family.SUCCESSFUL
- || response.getStatus() == Response.Status.NOT_FOUND.getStatusCode()) {
- // not an error
- return;
- }
-
- try {
- final String message = response.hasEntity() ? response.readEntity(String.class) : null;
- if (response.getStatusInfo().getFamily() == Response.Status.Family.SERVER_ERROR) {
- throw new ServerErrorException(message, response);
- } else {
- throw new WebApplicationException(message, response);
- }
- } catch (Exception e) {
- throw new ConsulException(e.getLocalizedMessage(), e);
- } finally {
- response.close();
- }
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Jackson.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Jackson.java
deleted file mode 100644
index f49ba12..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/Jackson.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.util;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.guava.GuavaModule;
-
-public class Jackson {
-
- public static final ObjectMapper MAPPER = newObjectMapper();
-
- private static ObjectMapper newObjectMapper() {
- ObjectMapper mapper = new ObjectMapper();
- mapper.registerModule(new GuavaModule());
- return mapper;
- }
-
- private Jackson() {}
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ObjectMapperContextResolver.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ObjectMapperContextResolver.java
deleted file mode 100644
index 9887bfe..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/ObjectMapperContextResolver.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.util;
-
-import javax.ws.rs.ext.ContextResolver;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
-
- private final ObjectMapper objectMapper;
- public ObjectMapperContextResolver(final ObjectMapper objectMapper) {
- this.objectMapper = objectMapper;
- }
-
- @Override
- public ObjectMapper getContext(final Class<?> type) {
- return objectMapper;
- }
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsDeserializer.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsDeserializer.java
deleted file mode 100644
index 8bb04a6..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsDeserializer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.util;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.IOException;
-
-/**
- * Deserializes Consul time values with "s" suffix to {@link Long} objects.
- */
-public class SecondsDeserializer extends JsonDeserializer<Long> {
-
- @Override
- public Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
- String value = p.getValueAsString();
-
- if (StringUtils.isNotEmpty(value)) {
- value = value.replaceAll("[a-zA-Z]", "");
- return Long.valueOf(value);
- } else {
- return null;
- }
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsSerializer.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsSerializer.java
deleted file mode 100644
index 8c0ba85..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/SecondsSerializer.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.util;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-
-import java.io.IOException;
-
-/**
- * Serializes a time field (e.g. TTL) as seconds.
- */
-public class SecondsSerializer extends JsonSerializer<Long> {
-
- @Override
- public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
- gen.writeString(String.format("%ss", value));
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/UnsignedLongDeserializer.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/UnsignedLongDeserializer.java
deleted file mode 100644
index 7bdee6f..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/consul/util/UnsignedLongDeserializer.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
-* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.openo.msb.wrapper.consul.util;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.google.common.primitives.UnsignedLongs;
-
-import java.io.IOException;
-
-/**
- * @author sgardner
- * @since 2015.02.28
- */
-public class UnsignedLongDeserializer extends JsonDeserializer<Long> {
- @Override
- public Long deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
- String sValue = jp.getValueAsString();
- return UnsignedLongs.decode(sValue);
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java
deleted file mode 100644
index 50960c7..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/serviceListener/MicroServiceChangeListener.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.serviceListener;
-
-import java.util.Set;
-
-import org.apache.commons.lang3.StringUtils;
-import org.openo.msb.api.ApiRouteInfo;
-import org.openo.msb.api.CustomRouteInfo;
-import org.openo.msb.api.IuiRouteInfo;
-import org.openo.msb.api.Node;
-import org.openo.msb.api.RouteServer;
-import org.openo.msb.api.Service;
-import org.openo.msb.wrapper.ApiRouteServiceWrapper;
-import org.openo.msb.wrapper.CustomRouteServiceWrapper;
-import org.openo.msb.wrapper.IuiRouteServiceWrapper;
-import org.openo.msb.wrapper.util.RegExpTestUtil;
-import org.openo.msb.wrapper.util.RouteUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-public class MicroServiceChangeListener implements IMicroServiceChangeListener {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceChangeListener.class);
-
- @Override
- public void onSave(Service microServiceInfo, String serverPort) {
-
- if ("UI".equals(microServiceInfo.getProtocol())) {
- IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);
- if (null != iuiRouteInfo) {
- IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);
- }
- } else if ("REST".equals(microServiceInfo.getProtocol())) {
- ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);
- if (null != apiRouteInfo) {
- ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfo, serverPort);
- }
- } else if ("HTTP".equals(microServiceInfo.getProtocol())) {
- CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);
- if (null != customRouteInfo) {
- CustomRouteServiceWrapper.getInstance()
- .saveCustomRouteInstance(customRouteInfo, serverPort);
- }
- }
-
- }
-
- @Override
- public void onChange(String serviceName, String version, Service microServiceInfo,
- String serverPort) {
-
- if ("UI".equals(microServiceInfo.getProtocol())) {
- if (serviceName.startsWith("iui_") || serviceName.startsWith("IUI_")) {
- serviceName = serviceName.substring(4);
- }
- IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);
- if (null != iuiRouteInfo) {
- IuiRouteServiceWrapper.getInstance().updateIuiRouteInstance(serviceName, iuiRouteInfo);
- }
- } else if ("REST".equals(microServiceInfo.getProtocol())) {
- ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);
- if (null != apiRouteInfo) {
- ApiRouteServiceWrapper.getInstance().updateApiRouteInstance(serviceName, version,
- apiRouteInfo, serverPort);
- }
- } else if ("HTTP".equals(microServiceInfo.getProtocol())) {
- if (!serviceName.startsWith("/")) {
- serviceName = "/" + serviceName;
- }
- CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);
- if (null != customRouteInfo) {
- CustomRouteServiceWrapper.getInstance().updateCustomRouteInstance(serviceName,
- customRouteInfo, serverPort);
- }
- }
-
-
-
- }
-
- @Override
- public void onStatusChange(String serviceName, String url, String version, String protocol,
- String status) {
- if ("UI".equals(protocol)) {
-
- if (serviceName.startsWith("iui_") || serviceName.startsWith("IUI_")) {
- serviceName = serviceName.substring(4);
- }
- IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName, status);
-
- } else if ("REST".equals(protocol)) {
- ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName, version, status);
- } else if ("HTTP".equals(protocol)) {
- if (!serviceName.startsWith("/")) {
- serviceName = "/" + serviceName;
- }
- CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName, status);
- }
-
- }
-
- @Override
- public void onDelete(String serviceName, String url, String version, String protocol,
- String serverPort) {
-
- if ("UI".equals(protocol)) {
- if (serviceName.startsWith("iui_") || serviceName.startsWith("IUI_")) {
- serviceName = serviceName.substring(4);
- }
- IuiRouteServiceWrapper.getInstance().deleteIuiRoute(serviceName, "*");
-
- } else if ("REST".equals(protocol)) {
- ApiRouteServiceWrapper.getInstance().deleteApiRoute(serviceName, version, "*", serverPort);
- } else if ("HTTP".equals(protocol)) {
- if (!serviceName.startsWith("/")) {
- serviceName = "/" + serviceName;
- }
-
- CustomRouteServiceWrapper.getInstance().deleteCustomRoute(serviceName, "*", serverPort);
- }
-
- }
-
-
- /**
- * @Title ifApiRouteUrl
- * @Description TODO(According to judge whether the API registration URL format)
- * @param url
- * @return
- * @return boolean
- */
- private boolean ifApiRouteUrl(String url) {
- return RegExpTestUtil.apiRouteUrlRegExpTest(url);
- }
-
-
- /**
- * From MicroServiceInfo to ApiRouteInfo
- *
- * @param microServiceInfo
- * @return
- */
- private ApiRouteInfo buildApiRouteInfo(Service microServiceInfo) {
-
- ApiRouteInfo apiRouteInfo = new ApiRouteInfo();
- apiRouteInfo.setUrl(microServiceInfo.getUrl());
-
- Set<Node> nodes = microServiceInfo.getNodes();
- RouteServer[] routeServers = new RouteServer[nodes.size()];
-
-
- int i = 0;
- for (Node node : nodes) {
- RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
- routeServers[i] = routeServer;
- i++;
- }
-
-
- apiRouteInfo.setServers(routeServers);
- String[] rangs = StringUtils.split(microServiceInfo.getVisualRange(), "|");
- if (RouteUtil.contain(rangs, "0")) {
- apiRouteInfo.setVisualRange("0");
- } else {
- apiRouteInfo.setVisualRange("1");
- }
-
-
- if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
- apiRouteInfo.setUseOwnUpstream("1");
- }
-
-
-
- apiRouteInfo.setServiceName(microServiceInfo.getServiceName());
- apiRouteInfo.setVersion(microServiceInfo.getVersion());
- // TODO:set json and metrics defaultValue
- String version =
- "".equals(microServiceInfo.getVersion()) ? "" : "/" + microServiceInfo.getVersion();
- apiRouteInfo.setApiJson(microServiceInfo.getUrl() + "/swagger.json");
- apiRouteInfo.setMetricsUrl("/admin/metrics");
- return apiRouteInfo;
- }
-
-
- /**
- * From MicroServiceInfo to CustomRouteInfo
- *
- * @param microServiceInfo
- * @return
- */
- private CustomRouteInfo buildCustomRouteInfo(Service microServiceInfo) {
-
- CustomRouteInfo customRouteInfo = new CustomRouteInfo();
- customRouteInfo.setUrl(microServiceInfo.getUrl());
-
- Set<Node> nodes = microServiceInfo.getNodes();
- RouteServer[] routeServers = new RouteServer[nodes.size()];
-
-
- int i = 0;
- for (Node node : nodes) {
- RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
- routeServers[i] = routeServer;
- i++;
- }
-
- customRouteInfo.setServers(routeServers);
- String[] rangs = StringUtils.split(microServiceInfo.getVisualRange(), "|");
- if (RouteUtil.contain(rangs, "0")) {
- customRouteInfo.setVisualRange("0");
- } else {
- customRouteInfo.setVisualRange("1");
- }
-
- if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
- customRouteInfo.setUseOwnUpstream("1");
- }
-
- String serviceName;
- if (!microServiceInfo.getServiceName().startsWith("/")) {
- serviceName = "/" + microServiceInfo.getServiceName();
- } else {
- serviceName = microServiceInfo.getServiceName();
- }
- customRouteInfo.setServiceName(serviceName);
-
- return customRouteInfo;
- }
-
-
- /**
- * From MicroServiceInfo to IuiRouteInfo
- *
- * @param microServiceInfo
- * @return
- */
- private IuiRouteInfo buildIuiRouteInfo(Service microServiceInfo) {
-
- IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
- iuiRouteInfo.setUrl(microServiceInfo.getUrl());
-
- Set<Node> nodes = microServiceInfo.getNodes();
- RouteServer[] routeServers = new RouteServer[nodes.size()];
-
-
- int i = 0;
- for (Node node : nodes) {
- RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
- routeServers[i] = routeServer;
- i++;
- }
-
- iuiRouteInfo.setServers(routeServers);
- String[] rangs = StringUtils.split(microServiceInfo.getVisualRange(), "|");
- if (RouteUtil.contain(rangs, "0")) {
- iuiRouteInfo.setVisualRange("0");
- } else {
- iuiRouteInfo.setVisualRange("1");
- }
-
- if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
- iuiRouteInfo.setUseOwnUpstream("1");
- }
-
- String serviceName = microServiceInfo.getServiceName();
- if (serviceName.startsWith("iui_") || serviceName.startsWith("IUI_")) {
- serviceName = serviceName.substring(4);
- }
-
-
- iuiRouteInfo.setServiceName(serviceName);
-
- return iuiRouteInfo;
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JacksonJsonUtil.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JacksonJsonUtil.java
deleted file mode 100644
index 5157187..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JacksonJsonUtil.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.util;
-
-import java.util.List;
-
-import org.openo.msb.api.ApiRouteInfo;
-import org.openo.msb.api.RouteServer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-
-
-public class JacksonJsonUtil {
-
- private static final Logger logger = LoggerFactory.getLogger(JacksonJsonUtil.class);
-
- private static ObjectMapper mapper;
-
-
- public static synchronized ObjectMapper getMapperInstance() {
- if (mapper == null) {
- mapper = new ObjectMapper();
- }
- return mapper;
- }
-
- /**
- * from java object to json
- * @param obj
- * @return json
- * @throws Exception
- */
- public static String beanToJson(Object obj) throws Exception {
- String json=null;
- try {
- ObjectMapper objectMapper = getMapperInstance();
- objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
- json =objectMapper.writeValueAsString(obj);
- } catch (Exception e) {
- logger.error("Class beanToJson faild");
- throw new Exception("Class beanToJson faild");
- }
- return json;
- }
-
-
-
- /**
- * from json to java object
- * @param json
- * @param cls
- * @return
- * @throws Exception
- */
- public static Object jsonToBean(String json, Class<?> cls) throws Exception {
- Object vo =null;
- try {
- ObjectMapper objectMapper = getMapperInstance();
- objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
- vo = objectMapper.readValue(json, cls);
-
- } catch (Exception e) {
- logger.error(cls+" JsonTobean faild");
- throw new Exception(cls+" JsonTobean faild");
- }
- return vo;
- }
-
- /**
- * from json to java List
- * @param json
- * @return
- * @throws Exception
- */
- public static List<ApiRouteInfo> jsonToListBean(String json) throws Exception {
- List<ApiRouteInfo> vo =null;
- try {
-
- ObjectMapper objectMapper = getMapperInstance();
-
-
- vo = objectMapper.readValue(json, new TypeReference<List<ApiRouteInfo>>() {});
-
- } catch (Exception e) {
- throw new Exception( "JSON_TO_BEAN_FAILD");
- }
- return vo;
- }
-
- public static void main(String[] args) {
- RouteServer server=new RouteServer("127.0.0.1","80");
- try {
- String json=beanToJson(server);
- System.out.println(json);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JedisUtil.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JedisUtil.java
deleted file mode 100644
index 46d071e..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/JedisUtil.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.util;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.util.PropertyResourceBundle;
-import java.util.ResourceBundle;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import redis.clients.jedis.Jedis;
-import redis.clients.jedis.JedisPool;
-import redis.clients.jedis.JedisPoolConfig;
-
-
-
-public final class JedisUtil {
- private static final Logger LOGGER = LoggerFactory.getLogger(JedisUtil.class);
- private static String host = "127.0.0.1";
- private static int port = 6379;
- private static int connectionTimeout = 2000;
- private static int DEFAULT_DB_INDEX = 0;
-
- private static JedisPool jedisPool = null;
-
- public static String serverIp="127.0.0.1";
-
- public static int serverPort=10080;
-
- public static String propertiesName="redis.properties";
-
- public static String propertiesPath="";
-
-
-
-public static void main(String[] args) {
-
-}
-
- private JedisUtil() {
- // private constructor
-
- }
-
- private static void initialPool() {
- try {
- JedisPoolConfig config = new JedisPoolConfig();
-
-// String pathtest=JedisUtil.class.getResource("").getPath();
-// String path ="/"+ pathtest.substring(0, pathtest.indexOf("assembly")).replace("file:/", "") +"assembly/"+defaultWorkspace;
-
- File propertiesFile = new File(propertiesPath);
-
- if (propertiesFile.exists()) {
-
-
- BufferedInputStream inputStream =new BufferedInputStream(new FileInputStream(propertiesPath));
- ResourceBundle bundle =new PropertyResourceBundle(inputStream);
-
- if (bundle == null) {
- throw new IllegalArgumentException(
- "[redis.properties] is not found!");
- }
-
-
-
- String strHost = bundle.getString("redis.host");
- if(StringUtils.isNotEmpty(strHost)){
- host = strHost;
- }
- String strPort = bundle.getString("redis.port");
- if(StringUtils.isNotEmpty(strPort)){
- port = Integer.valueOf(strPort);
- }
-
-
- String strTimeout = bundle.getString("redis.connectionTimeout");
- if (StringUtils.isNotEmpty(strTimeout) ){
- connectionTimeout = Integer.valueOf(strTimeout);
- }
-
-// serverIp=bundle.getString("server.ip");
- serverPort=Integer.valueOf(bundle.getString("server.port"));
-
- String strDbIndex = bundle.getString("redis.db_index");
- if (StringUtils.isNotEmpty(strDbIndex)) {
- DEFAULT_DB_INDEX = Integer.valueOf(strDbIndex);
- }
-
- String strMaxTotal = bundle.getString("redis.pool.maxTotal");
- if (StringUtils.isNotEmpty(strMaxTotal)) {
- config.setMaxTotal(Integer.valueOf(strMaxTotal));
- }
-
- String strMaxIdle = bundle.getString("redis.pool.maxIdle");
- if (StringUtils.isNotEmpty(strMaxIdle)) {
- config.setMaxIdle(Integer.valueOf(strMaxIdle));
- }
-
- String strMaxWaitMillis = bundle.getString("redis.pool.maxWaitMillis");
- if (StringUtils.isNotEmpty(strMaxWaitMillis)) {
- config.setMaxWaitMillis(Long.valueOf(strMaxWaitMillis));
- }
-
- String strTestOnBorrow = bundle
- .getString("redis.pool.testOnBorrow");
- if (StringUtils.isNotEmpty(strTestOnBorrow)) {
- config.setTestOnBorrow(Boolean.valueOf(strTestOnBorrow));
- }
-
- String strTestOnReturn = bundle
- .getString("redis.pool.testOnReturn");
- if (StringUtils.isNotEmpty(strTestOnReturn)) {
- config.setTestOnReturn(Boolean.valueOf(strTestOnReturn));
- }
-
- }
-
- LOGGER.info("Redis server info: " + host + ":" + port);
- LOGGER.info("nginx server info: " + serverIp + ":" + serverPort);
-
-
-// ResourceBundle bundle = ResourceBundle.getBundle("conf.redis");
-
- jedisPool = new JedisPool(config, host, port, connectionTimeout);
- } catch (Exception e) {
- LOGGER.error("Initiate Jedis pool failed!", e);
- }
- }
- /**
- * From the connection pool to obtain jedis instance, use the default database index number 0
- * @return
- */
- public synchronized static Jedis borrowJedisInstance() {
- if (jedisPool == null) {
- initialPool();
- }
- try {
- if (jedisPool != null) {
- Jedis resource = jedisPool.getResource();
- resource.select(DEFAULT_DB_INDEX);
- return resource;
- } else {
- return null;
- }
- } catch (Exception e) {
- LOGGER.error("Get Jedis from pool failed!", e);
- return null;
- }
- }
- /**
- * From the connection pool to obtain jedis instance, using the specified database index number
- * @return
- */
- public synchronized static Jedis borrowJedisInstance(final int dbIndex) {
- if (jedisPool == null) {
- initialPool();
- }
- try {
- if (jedisPool != null) {
- Jedis resource = jedisPool.getResource();
- resource.select(dbIndex);
- return resource;
- } else {
- return null;
- }
- } catch (Exception e) {
- LOGGER.error("Get Jedis from pool failed!", e);
- return null;
- }
- }
-
- /**
- * returned to the pool jedis instance
- * @param jedis
- */
- public static void returnJedisInstance(final Jedis jedis) {
- if (jedis != null) {
- jedis.close();
- }
- }
-
-
- /**
- * @Title getJedis
- * @Description TODO(From the connection pool to obtain jedis instance)
- * @throws Exception
- * @return Jedis
- */
- public static Jedis getJedis() throws Exception{
-
-
- Jedis jedis = borrowJedisInstance();
- if (jedis == null) {
- throw new Exception("fetch from jedis pool failed,null object!");
-
- }
-
- return jedis;
-
- }
-
-} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceDB.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceDB.java
deleted file mode 100644
index f2e2004..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/MicroServiceDB.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.util;
-
-import java.sql.Date;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.commons.lang3.StringUtils;
-import org.openo.msb.api.MicroServiceFullInfo;
-import org.openo.msb.api.MicroServiceInfo;
-import org.openo.msb.api.Node;
-import org.openo.msb.api.NodeInfo;
-import org.openo.msb.api.Service;
-import org.openo.msb.wrapper.serviceListener.IMicroServiceChangeListener;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import redis.clients.jedis.Jedis;
-
-public class MicroServiceDB {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceDB.class);
-
- private static MicroServiceDB instance = new MicroServiceDB();
-
- private List<IMicroServiceChangeListener> serviceListenerlist =
- new ArrayList<IMicroServiceChangeListener>();
-
- private MicroServiceDB() {}
-
- public static MicroServiceDB getInstance() {
- return instance;
- }
-
-
- public void addServiceChangeListener(IMicroServiceChangeListener listener) {
- synchronized (serviceListenerlist) {
- serviceListenerlist.add(listener);
- }
- }
-
-
- public void removeServiceChangeListener(IMicroServiceChangeListener listener) {
- synchronized (serviceListenerlist) {
- serviceListenerlist.remove(listener);
- }
- }
-
-
- public MicroServiceFullInfo[] getAllMicroServiceInstances() throws Exception {
- Jedis jedis = null;
- MicroServiceFullInfo[] microServiceList;
- try {
- jedis = JedisUtil.getJedis();
-
- String routekey =
- MicroServiceUtil.getPrefixedKey("","*", MicroServiceUtil.SUFFIX_PATH_INFO);
- Set<String> serviceSet = jedis.keys(routekey);
- microServiceList = new MicroServiceFullInfo[serviceSet.size()];
-
- Pattern redisKeyPattern = MicroServiceUtil.getRedisKeyPattern();
- int i = 0;
- for (String servicePath : serviceSet) {
- Matcher matcher = redisKeyPattern.matcher(servicePath);
- if (matcher.matches()) {
- microServiceList[i] = getMicroServiceByJedis(jedis, matcher.group("servicename"),matcher.group("version"), "");
- i++;
- }
- }
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new Exception("call redis throw exception:"+e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- return microServiceList;
- }
-
- public void saveMicroServiceInfo2Redis(MicroServiceInfo microServiceInfo,String serverPort) throws Exception {
- // 1.1 set info
- String serviceInfokey =
- MicroServiceUtil.getServiceInfoKey(serverPort,microServiceInfo.getServiceName(),
- microServiceInfo.getVersion());
- Map<String, String> serviceInfoMap = new HashMap<String, String>();
- serviceInfoMap.put("url", microServiceInfo.getUrl());
- serviceInfoMap.put("protocol", microServiceInfo.getProtocol());
- serviceInfoMap.put("visualRange",microServiceInfo.getVisualRange());
- serviceInfoMap.put("lb_policy",microServiceInfo.getLb_policy());
- serviceInfoMap.put("status", "1");
-
-
-
- // 1.2 set lb info
- String serviceLBkey =
- MicroServiceUtil.getPrefixedKey(serverPort,microServiceInfo.getServiceName(),
- microServiceInfo.getVersion(), MicroServiceUtil.ROUTE_PATH_LOADBALANCE);
-
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.getJedis();
- // 2.1 save info
- jedis.hmset(serviceInfokey, serviceInfoMap);
-
-
- for(Node node:microServiceInfo.getNodes()){
-
- String key=serviceLBkey+":"+node.getIp()+"-"+node.getPort();
-
- Map<String,String> nodeMap = new HashMap<String,String>();
-
- nodeMap.put("ip", node.getIp());
- nodeMap.put("port", node.getPort());
- nodeMap.put("ttl", Integer.toString(node.getTtl()));
- long expiration_time=System.currentTimeMillis()+node.getTtl()*1000;
- nodeMap.put("expiration", Long.toString(expiration_time));
-
- if(jedis.keys(key).isEmpty()){
- nodeMap.put("created_at", Long.toString(System.currentTimeMillis()));
- }
-// else{
-// Map<String,String> nodeLBmap = jedis.hgetAll(key);
-// nodeMap.put("created_at", nodeLBmap.get("created_at"));
-// }
- nodeMap.put("updated_at", Long.toString(System.currentTimeMillis()));
-
- jedis.hmset(key, nodeMap);
- }
-
-// jedis.sadd(serviceLBkey, nodeArray);
-
- } catch (Exception e) {
- LOGGER.error("save to redis throw exception", e);
- throw new Exception("save to redis throw exception:"+e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
-
-
- }
-
- public void updateMicroServiceStatus(String serviceName, String version,String status) throws Exception{
-
-
- String serviceInfokey = MicroServiceUtil.getServiceInfoKey("",serviceName, version);
- Map<String, String> serviceInfoMap = new HashMap<String, String>();
- serviceInfoMap.put("status", status);
-
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.borrowJedisInstance();
- if (jedis == null) {
- throw new Exception("fetch from jedis pool failed,null object!");
- }
- jedis.hmset(serviceInfokey, serviceInfoMap);
- }
- catch (Exception e) {
- LOGGER.error("update MicroService status throw exception", e);
- throw new Exception("update MicroService status throw exception:"+e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- }
-
-
- public void updateMicroServiceNode2Redis(String serviceName, String version,String ip,String port,int ttl) throws Exception {
- String serviceLBkey =
- MicroServiceUtil.getPrefixedKey("",serviceName,version, MicroServiceUtil.ROUTE_PATH_LOADBALANCE);
-
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.getJedis();
-
-
- String nodeKey=serviceLBkey+":"+ip+"-"+port;
- Map<String,String> nodeLBmap = jedis.hgetAll(nodeKey);
-
- if(nodeLBmap.isEmpty()){
- throw new NullPointerException(" MicroService Node not fond ");
- }
-
-
- nodeLBmap.put("ttl", Integer.toString(ttl));
- long expiration_time=System.currentTimeMillis()+ttl*1000;
- nodeLBmap.put("expiration", Long.toString(expiration_time));
- nodeLBmap.put("updated_at", Long.toString(System.currentTimeMillis()));
-
- jedis.hmset(nodeKey, nodeLBmap);
-
-
- }
- catch (NullPointerException e){
- throw e;
- }
- catch (Exception e) {
- LOGGER.error("update MicroService Node throw exception", e);
- throw new Exception("update MicroService Node throw exception:"+e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
- }
-
-
- public void noticeUpdateApiListener(String serviceName,String version,Service microServiceInfo,String serverPort) {
- if (isNeedNotify(microServiceInfo)) {
- for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {
- serviceListener.onChange(serviceName,version, microServiceInfo,serverPort);
- }
- }
-
- }
-
- public void noticeUpdateStatusListener(Service microServiceInfo,String status) {
-
- for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {
- serviceListener.onStatusChange(microServiceInfo.getServiceName(),microServiceInfo.getUrl(),
- microServiceInfo.getVersion(),microServiceInfo.getProtocol(),status);
- }
- }
-
-
-
- public void noticeApiListener(Service microServiceInfo, String type,String serverPort) {
- if (isNeedNotify(microServiceInfo)) {
-
- if ("ADD".equals(type)) {
- for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {
- serviceListener.onSave(microServiceInfo,serverPort);
- }
- } else if ("DELETE".equals(type)) {
- for (IMicroServiceChangeListener serviceListener : serviceListenerlist) {
- serviceListener.onDelete(microServiceInfo.getServiceName(),microServiceInfo.getUrl(),
- microServiceInfo.getVersion(),microServiceInfo.getProtocol(),serverPort);
- }
- }
-
- }
- }
-
-
- public MicroServiceFullInfo getMicroServiceInstance(String serviceName, String version,String serverPort)
- throws Exception {
- if (null == version || "null".equals(version)) {
- version = "";
- }
-
- Jedis jedis = null;
- MicroServiceFullInfo microServiceInfo = null;
-
- try {
- jedis = JedisUtil.getJedis();
-
- microServiceInfo= getMicroServiceByJedis(jedis,serviceName,version, serverPort);
-
-
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new Exception("call redis throw exception:"+e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- return microServiceInfo;
-
- }
-
- private MicroServiceFullInfo getMicroServiceByJedis(Jedis jedis,String serviceName, String version,String serverPort){
- MicroServiceFullInfo microServiceInfo = null;
- String serviceInfoKey = MicroServiceUtil.getServiceInfoKey(serverPort,serviceName, version);
- Map<String, String> infomap = jedis.hgetAll(serviceInfoKey);
- if (!infomap.isEmpty()) {
- microServiceInfo = new MicroServiceFullInfo();
- microServiceInfo.setServiceName(serviceName);
- microServiceInfo.setVersion(version);
- microServiceInfo.setUrl(infomap.get("url"));
- microServiceInfo.setProtocol(infomap.get("protocol"));
- microServiceInfo.setVisualRange(infomap.get("visualRange"));
- microServiceInfo.setStatus(infomap.get("status"));
- microServiceInfo.setLb_policy(infomap.get("lb_policy"));
-
- String nodeLBkey =
- MicroServiceUtil.getPrefixedKey(serverPort,microServiceInfo.getServiceName(),
- microServiceInfo.getVersion(),
- MicroServiceUtil.ROUTE_PATH_LOADBALANCE);
-
- Set<String> nodeKeys=jedis.keys(nodeLBkey+":*");
-
- Set<NodeInfo> nodes=new HashSet<NodeInfo>();
- for(String nodeKey:nodeKeys){
- Map<String,String> nodeLBmap = jedis.hgetAll(nodeKey);
- NodeInfo nodeInfo=new NodeInfo();
- nodeInfo.setNodeId(serviceName+"_"+nodeLBmap.get("ip")+"_"+nodeLBmap.get("port"));
- nodeInfo.setIp(nodeLBmap.get("ip"));
- nodeInfo.setPort(nodeLBmap.get("port"));
- nodeInfo.setTtl(Integer.parseInt(nodeLBmap.get("ttl")));
- nodeInfo.setCreated_at(new Date(Long.parseLong(nodeLBmap.get("created_at"))));
- nodeInfo.setUpdated_at(new Date(Long.parseLong(nodeLBmap.get("updated_at"))));
- nodeInfo.setExpiration(new Date(Long.parseLong(nodeLBmap.get("expiration"))));
-
- nodes.add(nodeInfo);
- }
-
- microServiceInfo.setNodes(nodes);
- }
-
-
-
-
- return microServiceInfo;
- }
-
-
- public void deleteMicroService(String serviceName, String version,String serverPort) throws Exception {
- if (null == version || "null".equals(version)) {
- version = "";
- }
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.getJedis();
- String routekey = MicroServiceUtil.getPrefixedKey(serverPort,serviceName, version, "*");
- Set<String> infoSet = jedis.keys(routekey);
-
- if (infoSet.isEmpty()) {
- LOGGER.error("delete MicroService FAIL:serviceName-"
- + serviceName + ",version:" + version + " not fond ");
- }
- else{
- String[] paths = new String[infoSet.size()];
-
- infoSet.toArray(paths);
-
- jedis.del(paths);
- }
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new Exception("call redis throw exception:"+e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
- }
-
- public void deleteNode(String serviceName, String version, String ip,String port) throws Exception {
- if (null == version || "null".equals(version)) {
- version = "";
- }
-
- Jedis jedis = null;
- try {
- jedis = JedisUtil.getJedis();
- String serviceLBkey =
- MicroServiceUtil.getPrefixedKey("",serviceName, version,
- MicroServiceUtil.ROUTE_PATH_LOADBALANCE,ip+"-"+port);
- jedis.del(serviceLBkey);
- } catch (Exception e) {
- LOGGER.error("call redis throw exception", e);
- throw new Exception("call redis throw exception:"+e.getMessage());
- } finally {
- JedisUtil.returnJedisInstance(jedis);
- }
-
- }
-
-
- /**
- * Determine whether the service needs to send a notification
- * TODO: filter according to the agreement,
- * the only notice of agreement for REST \ UI interface MSB - REST
- * @param protocol
- * @return
- */
- private boolean isNeedNotifyByProtocol(String protocol) {
- return "UI".equalsIgnoreCase(protocol) || "REST".equalsIgnoreCase(protocol) || "HTTP".equalsIgnoreCase(protocol);
- }
-
- /**
- * Determine whether the service needs to send a notification
- * TODO: according to the visual range filter conditions
- * @param visualRange
- * @return
- */
- private boolean isNeedNotifyByVisualRange(String visualRange) {
- String[] rangeArray=StringUtils.split(visualRange, "|");
- return RouteUtil.contain(RouteUtil.visualRangeMatches, rangeArray);
- }
-
- /**
- * According to the MicroServiceInfo entity information to judge whether need to send a notification
- * @param microServiceInfo
- * @return
- */
- private boolean isNeedNotify(Service microServiceInfo) {
- if (null != microServiceInfo) {
- return isNeedNotifyByProtocol(microServiceInfo.getProtocol()) &&
- isNeedNotifyByVisualRange(microServiceInfo.getVisualRange());
- } else {
- return false;
- }
- }
-
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RouteUtil.java b/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RouteUtil.java
deleted file mode 100644
index c987142..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/java/org/openo/msb/wrapper/util/RouteUtil.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.util;
-
-import org.apache.commons.lang3.StringUtils;
-import org.openo.msb.api.DiscoverInfo;
-
-
-public class RouteUtil {
-
- public static String IUI_ROOT_PATH="iui";
-
- public static String API_ROOT_PATH="api";
-
- public static final String ROUTE_PATH="msb:routing";
-
- public static final String APIROUTE="api";
-
- public static final String IUIROUTE="iui";
-
- public static final String CUSTOMROUTE="custom";
-
- public static final String P2PROUTE="p2p";
-
-
- public static final String ROUTE_PATH_INFO="info";
-
- public static final String ROUTE_PATH_LOADBALANCE="lb";
-
- public static final String APIROUTE_PATH_LIFE="life";
-
-
- public static final String REQUEST_SUCCESS = "SUCCESS";
-
- public static final String REQUEST_FAIL = "FAIL";
-
- public static String PROTOCOL_LIST="REST,UI,HTTP,MQ,FTP,SNMP,TCP,UDP";
-
- public static DiscoverInfo discoverInfo=new DiscoverInfo();
-
-
- public static String[] visualRangeRange={"0","1"};
-
- public static String[] controlRangeMatches={"0","1","2"};
-
- public static String[] statusRangeMatches={"0","1"};
-
- public static String[] useOwnUpstreamRangeMatches={"0","1"};
-
- public static String[] visualRangeMatches={"1"};
-
- /**
- * @Title: getPrefixedKey
- * @Description: TODO(Add base path prefix radis assembly path)
- * @param: @param serviceName
- * @param: @param version
- * @param: @param type
- * @param: @return
- * @return: String
- */
-
- public static String getPrefixedKey(String...paths){
- StringBuffer sb= new StringBuffer();
-
- if(paths[0].trim().equals("") || paths[0].equals(String.valueOf(JedisUtil.serverPort))){
- sb.append(ROUTE_PATH);
- }
- else{
- sb.append(paths[0]);
- }
-
- for (int i = 1; i < paths.length; i++) {
- sb.append(":");
- sb.append(paths[i]);
- }
- return sb.toString();
- }
-
-
- public static Object[] concat(Object[] a, Object[] b) {
- Object[] c= new Object[a.length+b.length];
- System.arraycopy(a, 0, c, 0, a.length);
- System.arraycopy(b, 0, c, a.length, b.length);
- return c;
- }
-
- public static boolean contain(String[] array,String str){
- for(int i=0;i<array.length;i++){
- if(array[i].equals(str)){
- return true;
- }
- }
- return false;
-
- }
-
- public static boolean contain(String[] array,String value[]){
- for(int i=0;i<array.length;i++){
- for(int n=0;n<value.length;n++){
- if(array[i].equals(value[n])){
- return true;
- }
- }
- }
- return false;
-
- }
-
- public static String show(String[] array){
-
- return StringUtils.join(array, "|");
-
- }
-
- public static void main(String[] args) {
- String array[]={"1","2"};
- System.out.println(StringUtils.join(array, "|"));
- }
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/WEB-INF/web.xml b/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/WEB-INF/web.xml
deleted file mode 100644
index 057b722..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/WEB-INF/web.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<web-app xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
- version="3.0"
- metadata-complete="true">
-
- <description>
- ZENAP API-DOC.
- </description>
- <display-name>ZENAP API-DOC</display-name>
- <!-- Define example filters -->
-
-
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- <welcome-file>index.xhtml</welcome-file>
- <welcome-file>index.htm</welcome-file>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
-
-</web-app>
-
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js
deleted file mode 100644
index 9971682..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.contentWindow.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/*! iFrame Resizer (iframeSizer.contentWindow.min.js) - v3.5.3 - 2016-02-23
- * Desc: Include this file in any page being loaded into an iframe
- * to force the iframe to resize to the content size.
- * Requires: iframeResizer.min.js on host page.
- * Copyright: (c) 2016 David J. Bradshaw - dave@bradshaw.net
- * License: MIT
- */
-!function(a){"use strict";function b(b,c,d){"addEventListener"in a?b.addEventListener(c,d,!1):"attachEvent"in a&&b.attachEvent("on"+c,d)}function c(b,c,d){"removeEventListener"in a?b.removeEventListener(c,d,!1):"detachEvent"in a&&b.detachEvent("on"+c,d)}function d(a){return a.charAt(0).toUpperCase()+a.slice(1)}function e(a){var b,c,d,e=null,f=0,g=function(){f=Fa(),e=null,d=a.apply(b,c),e||(b=c=null)};return function(){var h=Fa();f||(f=h);var i=xa-(h-f);return b=this,c=arguments,0>=i||i>xa?(e&&(clearTimeout(e),e=null),f=h,d=a.apply(b,c),e||(b=c=null)):e||(e=setTimeout(g,i)),d}}function f(a){return ma+"["+oa+"] "+a}function g(b){la&&"object"==typeof a.console&&console.log(f(b))}function h(b){"object"==typeof a.console&&console.warn(f(b))}function i(){j(),g("Initialising iFrame ("+location.href+")"),k(),n(),m("background",W),m("padding",$),A(),s(),t(),o(),C(),u(),ia=B(),N("init","Init message from host page"),Da()}function j(){function a(a){return"true"===a?!0:!1}var b=ha.substr(na).split(":");oa=b[0],X=void 0!==b[1]?Number(b[1]):X,_=void 0!==b[2]?a(b[2]):_,la=void 0!==b[3]?a(b[3]):la,ja=void 0!==b[4]?Number(b[4]):ja,U=void 0!==b[6]?a(b[6]):U,Y=b[7],fa=void 0!==b[8]?b[8]:fa,W=b[9],$=b[10],ua=void 0!==b[11]?Number(b[11]):ua,ia.enable=void 0!==b[12]?a(b[12]):!1,qa=void 0!==b[13]?b[13]:qa,Aa=void 0!==b[14]?b[14]:Aa}function k(){function b(){var b=a.iFrameResizer;g("Reading data from page: "+JSON.stringify(b)),Ca="messageCallback"in b?b.messageCallback:Ca,Da="readyCallback"in b?b.readyCallback:Da,ta="targetOrigin"in b?b.targetOrigin:ta,fa="heightCalculationMethod"in b?b.heightCalculationMethod:fa,Aa="widthCalculationMethod"in b?b.widthCalculationMethod:Aa}"iFrameResizer"in a&&Object===a.iFrameResizer.constructor&&b(),g("TargetOrigin for parent set to: "+ta)}function l(a,b){return-1!==b.indexOf("-")&&(h("Negative CSS value ignored for "+a),b=""),b}function m(a,b){void 0!==b&&""!==b&&"null"!==b&&(document.body.style[a]=b,g("Body "+a+' set to "'+b+'"'))}function n(){void 0===Y&&(Y=X+"px"),m("margin",l("margin",Y))}function o(){document.documentElement.style.height="",document.body.style.height="",g('HTML & body height set to "auto"')}function p(e){function f(){N(e.eventName,e.eventType)}var h={add:function(c){b(a,c,f)},remove:function(b){c(a,b,f)}};e.eventNames&&Array.prototype.map?(e.eventName=e.eventNames[0],e.eventNames.map(h[e.method])):h[e.method](e.eventName),g(d(e.method)+" event listener: "+e.eventType)}function q(a){p({method:a,eventType:"Animation Start",eventNames:["animationstart","webkitAnimationStart"]}),p({method:a,eventType:"Animation Iteration",eventNames:["animationiteration","webkitAnimationIteration"]}),p({method:a,eventType:"Animation End",eventNames:["animationend","webkitAnimationEnd"]}),p({method:a,eventType:"Input",eventName:"input"}),p({method:a,eventType:"Mouse Up",eventName:"mouseup"}),p({method:a,eventType:"Mouse Down",eventName:"mousedown"}),p({method:a,eventType:"Orientation Change",eventName:"orientationchange"}),p({method:a,eventType:"Print",eventName:["afterprint","beforeprint"]}),p({method:a,eventType:"Ready State Change",eventName:"readystatechange"}),p({method:a,eventType:"Touch Start",eventName:"touchstart"}),p({method:a,eventType:"Touch End",eventName:"touchend"}),p({method:a,eventType:"Touch Cancel",eventName:"touchcancel"}),p({method:a,eventType:"Transition Start",eventNames:["transitionstart","webkitTransitionStart","MSTransitionStart","oTransitionStart","otransitionstart"]}),p({method:a,eventType:"Transition Iteration",eventNames:["transitioniteration","webkitTransitionIteration","MSTransitionIteration","oTransitionIteration","otransitioniteration"]}),p({method:a,eventType:"Transition End",eventNames:["transitionend","webkitTransitionEnd","MSTransitionEnd","oTransitionEnd","otransitionend"]}),"child"===qa&&p({method:a,eventType:"IFrame Resized",eventName:"resize"})}function r(a,b,c,d){return b!==a&&(a in c||(h(a+" is not a valid option for "+d+"CalculationMethod."),a=b),g(d+' calculation method set to "'+a+'"')),a}function s(){fa=r(fa,ea,Ga,"height")}function t(){Aa=r(Aa,za,Ha,"width")}function u(){!0===U?(q("add"),F()):g("Auto Resize disabled")}function v(){g("Disable outgoing messages"),ra=!1}function w(){g("Remove event listener: Message"),c(a,"message",S)}function x(){null!==Z&&Z.disconnect()}function y(){q("remove"),x(),clearInterval(ka)}function z(){v(),w(),!0===U&&y()}function A(){var a=document.createElement("div");a.style.clear="both",a.style.display="block",document.body.appendChild(a)}function B(){function c(){return{x:void 0!==a.pageXOffset?a.pageXOffset:document.documentElement.scrollLeft,y:void 0!==a.pageYOffset?a.pageYOffset:document.documentElement.scrollTop}}function d(a){var b=a.getBoundingClientRect(),d=c();return{x:parseInt(b.left,10)+parseInt(d.x,10),y:parseInt(b.top,10)+parseInt(d.y,10)}}function e(a){function b(a){var b=d(a);g("Moving to in page link (#"+c+") at x: "+b.x+" y: "+b.y),R(b.y,b.x,"scrollToOffset")}var c=a.split("#")[1]||a,e=decodeURIComponent(c),f=document.getElementById(e)||document.getElementsByName(e)[0];void 0!==f?b(f):(g("In page link (#"+c+") not found in iFrame, so sending to parent"),R(0,0,"inPageLink","#"+c))}function f(){""!==location.hash&&"#"!==location.hash&&e(location.href)}function i(){function a(a){function c(a){a.preventDefault(),e(this.getAttribute("href"))}"#"!==a.getAttribute("href")&&b(a,"click",c)}Array.prototype.forEach.call(document.querySelectorAll('a[href^="#"]'),a)}function j(){b(a,"hashchange",f)}function k(){setTimeout(f,ba)}function l(){Array.prototype.forEach&&document.querySelectorAll?(g("Setting up location.hash handlers"),i(),j(),k()):h("In page linking not fully supported in this browser! (See README.md for IE8 workaround)")}return ia.enable?l():g("In page linking not enabled"),{findTarget:e}}function C(){g("Enable public methods"),Ba.parentIFrame={autoResize:function(a){return!0===a&&!1===U?(U=!0,u()):!1===a&&!0===U&&(U=!1,y()),U},close:function(){R(0,0,"close"),z()},getId:function(){return oa},getPageInfo:function(a){"function"==typeof a?(Ea=a,R(0,0,"pageInfo")):(Ea=function(){},R(0,0,"pageInfoStop"))},moveToAnchor:function(a){ia.findTarget(a)},reset:function(){Q("parentIFrame.reset")},scrollTo:function(a,b){R(b,a,"scrollTo")},scrollToOffset:function(a,b){R(b,a,"scrollToOffset")},sendMessage:function(a,b){R(0,0,"message",JSON.stringify(a),b)},setHeightCalculationMethod:function(a){fa=a,s()},setWidthCalculationMethod:function(a){Aa=a,t()},setTargetOrigin:function(a){g("Set targetOrigin: "+a),ta=a},size:function(a,b){var c=""+(a?a:"")+(b?","+b:"");N("size","parentIFrame.size("+c+")",a,b)}}}function D(){0!==ja&&(g("setInterval: "+ja+"ms"),ka=setInterval(function(){N("interval","setInterval: "+ja)},Math.abs(ja)))}function E(){function b(a){function b(a){!1===a.complete&&(g("Attach listeners to "+a.src),a.addEventListener("load",f,!1),a.addEventListener("error",h,!1),k.push(a))}"attributes"===a.type&&"src"===a.attributeName?b(a.target):"childList"===a.type&&Array.prototype.forEach.call(a.target.querySelectorAll("img"),b)}function c(a){k.splice(k.indexOf(a),1)}function d(a){g("Remove listeners from "+a.src),a.removeEventListener("load",f,!1),a.removeEventListener("error",h,!1),c(a)}function e(a,b,c){d(a.target),N(b,c+": "+a.target.src,void 0,void 0)}function f(a){e(a,"imageLoad","Image loaded")}function h(a){e(a,"imageLoadFailed","Image load failed")}function i(a){N("mutationObserver","mutationObserver: "+a[0].target+" "+a[0].type),a.forEach(b)}function j(){var a=document.querySelector("body"),b={attributes:!0,attributeOldValue:!1,characterData:!0,characterDataOldValue:!1,childList:!0,subtree:!0};return m=new l(i),g("Create body MutationObserver"),m.observe(a,b),m}var k=[],l=a.MutationObserver||a.WebKitMutationObserver,m=j();return{disconnect:function(){"disconnect"in m&&(g("Disconnect body MutationObserver"),m.disconnect(),k.forEach(d))}}}function F(){var b=0>ja;a.MutationObserver||a.WebKitMutationObserver?b?D():Z=E():(g("MutationObserver not supported in this browser!"),D())}function G(a,b){function c(a){var c=/^\d+(px)?$/i;if(c.test(a))return parseInt(a,V);var d=b.style.left,e=b.runtimeStyle.left;return b.runtimeStyle.left=b.currentStyle.left,b.style.left=a||0,a=b.style.pixelLeft,b.style.left=d,b.runtimeStyle.left=e,a}var d=0;return b=b||document.body,"defaultView"in document&&"getComputedStyle"in document.defaultView?(d=document.defaultView.getComputedStyle(b,null),d=null!==d?d[a]:0):d=c(b.currentStyle[a]),parseInt(d,V)}function H(a){a>xa/2&&(xa=2*a,g("Event throttle increased to "+xa+"ms"))}function I(a,b){for(var c=b.length,e=0,f=0,h=d(a),i=Fa(),j=0;c>j;j++)e=b[j].getBoundingClientRect()[a]+G("margin"+h,b[j]),e>f&&(f=e);return i=Fa()-i,g("Parsed "+c+" HTML elements"),g("Element position calculated in "+i+"ms"),H(i),f}function J(a){return[a.bodyOffset(),a.bodyScroll(),a.documentElementOffset(),a.documentElementScroll()]}function K(a,b){function c(){return h("No tagged elements ("+b+") found on page"),da}var d=document.querySelectorAll("["+b+"]");return 0===d.length?c():I(a,d)}function L(){return document.querySelectorAll("body *")}function M(a,b,c,d){function e(){da=l,ya=m,R(da,ya,a)}function f(){function a(a,b){var c=Math.abs(a-b)<=ua;return!c}return l=void 0!==c?c:Ga[fa](),m=void 0!==d?d:Ha[Aa](),a(da,l)||_&&a(ya,m)}function h(){return!(a in{init:1,interval:1,size:1})}function i(){return fa in pa||_&&Aa in pa}function j(){g("No change in size detected")}function k(){h()&&i()?Q(b):a in{interval:1}||j()}var l,m;f()||"init"===a?(O(),e()):k()}function N(a,b,c,d){function e(){a in{reset:1,resetPage:1,init:1}||g("Trigger event: "+b)}function f(){return va&&a in aa}f()?g("Trigger event cancelled: "+a):(e(),Ia(a,b,c,d))}function O(){va||(va=!0,g("Trigger event lock on")),clearTimeout(wa),wa=setTimeout(function(){va=!1,g("Trigger event lock off"),g("--")},ba)}function P(a){da=Ga[fa](),ya=Ha[Aa](),R(da,ya,a)}function Q(a){var b=fa;fa=ea,g("Reset trigger event: "+a),O(),P("reset"),fa=b}function R(a,b,c,d,e){function f(){void 0===e?e=ta:g("Message targetOrigin: "+e)}function h(){var f=a+":"+b,h=oa+":"+f+":"+c+(void 0!==d?":"+d:"");g("Sending message to host page ("+h+")"),sa.postMessage(ma+h,e)}!0===ra&&(f(),h())}function S(b){function c(){return ma===(""+b.data).substr(0,na)}function d(){ha=b.data,sa=b.source,i(),ca=!1,setTimeout(function(){ga=!1},ba)}function e(){ga?g("Page reset ignored by init"):(g("Page size reset by host page"),P("resetPage"))}function f(){N("resizeParent","Parent window requested size check")}function j(){var a=l();ia.findTarget(a)}function k(){return b.data.split("]")[1].split(":")[0]}function l(){return b.data.substr(b.data.indexOf(":")+1)}function m(){return"iFrameResize"in a}function n(){var a=l();g("MessageCallback called from parent: "+a),Ca(JSON.parse(a)),g(" --")}function o(){var a=l();g("PageInfoFromParent called from parent: "+a),Ea(JSON.parse(a)),g(" --")}function p(){return b.data.split(":")[2]in{"true":1,"false":1}}function q(){switch(k()){case"reset":e();break;case"resize":f();break;case"moveToAnchor":j();break;case"message":n();break;case"pageInfo":o();break;default:m()||p()||h("Unexpected message ("+b.data+")")}}function r(){!1===ca?q():p()?d():g('Ignored message of type "'+k()+'". Received before initialization.')}c()&&r()}function T(){"loading"!==document.readyState&&a.parent.postMessage("[iFrameResizerChild]Ready","*")}var U=!0,V=10,W="",X=0,Y="",Z=null,$="",_=!1,aa={resize:1,click:1},ba=128,ca=!0,da=1,ea="bodyOffset",fa=ea,ga=!0,ha="",ia={},ja=32,ka=null,la=!1,ma="[iFrameSizer]",na=ma.length,oa="",pa={max:1,min:1,bodyScroll:1,documentElementScroll:1},qa="child",ra=!0,sa=a.parent,ta="*",ua=0,va=!1,wa=null,xa=16,ya=1,za="scroll",Aa=za,Ba=a,Ca=function(){h("MessageCallback function not defined")},Da=function(){},Ea=function(){},Fa=Date.now||function(){return(new Date).getTime()},Ga={bodyOffset:function(){return document.body.offsetHeight+G("marginTop")+G("marginBottom")},offset:function(){return Ga.bodyOffset()},bodyScroll:function(){return document.body.scrollHeight},documentElementOffset:function(){return document.documentElement.offsetHeight},documentElementScroll:function(){return document.documentElement.scrollHeight},max:function(){return Math.max.apply(null,J(Ga))},min:function(){return Math.min.apply(null,J(Ga))},grow:function(){return Ga.max()},lowestElement:function(){return Math.max(Ga.bodyOffset(),I("bottom",L()))},taggedElement:function(){return K("bottom","data-iframe-height")}},Ha={bodyScroll:function(){return document.body.scrollWidth},bodyOffset:function(){return document.body.offsetWidth},documentElementScroll:function(){return document.documentElement.scrollWidth},documentElementOffset:function(){return document.documentElement.offsetWidth},scroll:function(){return Math.max(Ha.bodyScroll(),Ha.documentElementScroll())},max:function(){return Math.max.apply(null,J(Ha))},min:function(){return Math.min.apply(null,J(Ha))},rightMostElement:function(){return I("right",L())},taggedElement:function(){return K("right","data-iframe-width")}},Ia=e(M);b(a,"message",S),T()}(window||{});
-//# sourceMappingURL=iframeResizer.contentWindow.map \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js
deleted file mode 100644
index 853bbdd..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/js/iframeResizer/iframeResizer.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/*! iFrame Resizer (iframeSizer.min.js ) - v3.5.3 - 2016-02-23
- * Desc: Force cross domain iframes to size to content.
- * Requires: iframeResizer.contentWindow.min.js to be loaded into the target frame.
- * Copyright: (c) 2016 David J. Bradshaw - dave@bradshaw.net
- * License: MIT
- */
-!function(a){"use strict";function b(b,c,d){"addEventListener"in a?b.addEventListener(c,d,!1):"attachEvent"in a&&b.attachEvent("on"+c,d)}function c(b,c,d){"removeEventListener"in a?b.removeEventListener(c,d,!1):"detachEvent"in a&&b.detachEvent("on"+c,d)}function d(){var b,c=["moz","webkit","o","ms"];for(b=0;b<c.length&&!N;b+=1)N=a[c[b]+"RequestAnimationFrame"];N||h("setup","RequestAnimationFrame not supported")}function e(b){var c="Host page: "+b;return a.top!==a.self&&(c=a.parentIFrame&&a.parentIFrame.getId?a.parentIFrame.getId()+": "+b:"Nested host page: "+b),c}function f(a){return K+"["+e(a)+"]"}function g(a){return P[a]?P[a].log:G}function h(a,b){k("log",a,b,g(a))}function i(a,b){k("info",a,b,g(a))}function j(a,b){k("warn",a,b,!0)}function k(b,c,d,e){!0===e&&"object"==typeof a.console&&console[b](f(c),d)}function l(d){function e(){function a(){s(V),p(W)}g("Height"),g("Width"),t(a,V,"init")}function f(){var a=U.substr(L).split(":");return{iframe:P[a[0]].iframe,id:a[0],height:a[1],width:a[2],type:a[3]}}function g(a){var b=Number(P[W]["max"+a]),c=Number(P[W]["min"+a]),d=a.toLowerCase(),e=Number(V[d]);h(W,"Checking "+d+" is in range "+c+"-"+b),c>e&&(e=c,h(W,"Set "+d+" to min value")),e>b&&(e=b,h(W,"Set "+d+" to max value")),V[d]=""+e}function k(){function a(){function a(){var a=0,d=!1;for(h(W,"Checking connection is from allowed list of origins: "+c);a<c.length;a++)if(c[a]===b){d=!0;break}return d}function d(){var a=P[W].remoteHost;return h(W,"Checking connection is from: "+a),b===a}return c.constructor===Array?a():d()}var b=d.origin,c=P[W].checkOrigin;if(c&&""+b!="null"&&!a())throw new Error("Unexpected message received from: "+b+" for "+V.iframe.id+". Message was: "+d.data+". This error can be disabled by setting the checkOrigin: false option or by providing of array of trusted domains.");return!0}function l(){return K===(""+U).substr(0,L)&&U.substr(L).split(":")[0]in P}function w(){var a=V.type in{"true":1,"false":1,undefined:1};return a&&h(W,"Ignoring init message from meta parent page"),a}function y(a){return U.substr(U.indexOf(":")+J+a)}function z(a){h(W,"MessageCallback passed: {iframe: "+V.iframe.id+", message: "+a+"}"),N("messageCallback",{iframe:V.iframe,message:JSON.parse(a)}),h(W,"--")}function A(){var b=document.body.getBoundingClientRect(),c=V.iframe.getBoundingClientRect();return JSON.stringify({iframeHeight:c.height,iframeWidth:c.width,clientHeight:Math.max(document.documentElement.clientHeight,a.innerHeight||0),clientWidth:Math.max(document.documentElement.clientWidth,a.innerWidth||0),offsetTop:parseInt(c.top-b.top,10),offsetLeft:parseInt(c.left-b.left,10),scrollTop:a.pageYOffset,scrollLeft:a.pageXOffset})}function B(a,b){function c(){u("Send Page Info","pageInfo:"+A(),a,b)}x(c,32)}function C(){function d(b,c){function d(){P[g]?B(P[g].iframe,g):e()}["scroll","resize"].forEach(function(e){h(g,b+e+" listener for sendPageInfo"),c(a,e,d)})}function e(){d("Remove ",c)}function f(){d("Add ",b)}var g=W;f(),P[g].stopPageInfo=e}function D(){P[W]&&P[W].stopPageInfo&&(P[W].stopPageInfo(),delete P[W].stopPageInfo)}function E(){var a=!0;return null===V.iframe&&(j(W,"IFrame ("+V.id+") not found"),a=!1),a}function F(a){var b=a.getBoundingClientRect();return o(W),{x:Math.floor(Number(b.left)+Number(M.x)),y:Math.floor(Number(b.top)+Number(M.y))}}function G(b){function c(){M=g,H(),h(W,"--")}function d(){return{x:Number(V.width)+f.x,y:Number(V.height)+f.y}}function e(){a.parentIFrame?a.parentIFrame["scrollTo"+(b?"Offset":"")](g.x,g.y):j(W,"Unable to scroll to requested position, window.parentIFrame not found")}var f=b?F(V.iframe):{x:0,y:0},g=d();h(W,"Reposition requested from iFrame (offset x:"+f.x+" y:"+f.y+")"),a.top!==a.self?e():c()}function H(){!1!==N("scrollCallback",M)?p(W):q()}function I(b){function c(){var a=F(g);h(W,"Moving to in page link (#"+e+") at x: "+a.x+" y: "+a.y),M={x:a.x,y:a.y},H(),h(W,"--")}function d(){a.parentIFrame?a.parentIFrame.moveToAnchor(e):h(W,"In page link #"+e+" not found and window.parentIFrame not found")}var e=b.split("#")[1]||"",f=decodeURIComponent(e),g=document.getElementById(f)||document.getElementsByName(f)[0];g?c():a.top!==a.self?d():h(W,"In page link #"+e+" not found")}function N(a,b){return m(W,a,b)}function O(){switch(P[W].firstRun&&T(),V.type){case"close":n(V.iframe);break;case"message":z(y(6));break;case"scrollTo":G(!1);break;case"scrollToOffset":G(!0);break;case"pageInfo":B(P[W].iframe,W),C();break;case"pageInfoStop":D();break;case"inPageLink":I(y(9));break;case"reset":r(V);break;case"init":e(),N("initCallback",V.iframe),N("resizedCallback",V);break;default:e(),N("resizedCallback",V)}}function Q(a){var b=!0;return P[a]||(b=!1,j(V.type+" No settings for "+a+". Message was: "+U)),b}function S(){for(var a in P)u("iFrame requested init",v(a),document.getElementById(a),a)}function T(){P[W].firstRun=!1}var U=d.data,V={},W=null;"[iFrameResizerChild]Ready"===U?S():l()?(V=f(),W=R=V.id,!w()&&Q(W)&&(h(W,"Received: "+U),E()&&k()&&O())):i(W,"Ignored: "+U)}function m(a,b,c){var d=null,e=null;if(P[a]){if(d=P[a][b],"function"!=typeof d)throw new TypeError(b+" on iFrame["+a+"] is not a function");e=d(c)}return e}function n(a){var b=a.id;h(b,"Removing iFrame: "+b),a.parentNode.removeChild(a),m(b,"closedCallback",b),h(b,"--"),delete P[b]}function o(b){null===M&&(M={x:void 0!==a.pageXOffset?a.pageXOffset:document.documentElement.scrollLeft,y:void 0!==a.pageYOffset?a.pageYOffset:document.documentElement.scrollTop},h(b,"Get page position: "+M.x+","+M.y))}function p(b){null!==M&&(a.scrollTo(M.x,M.y),h(b,"Set page position: "+M.x+","+M.y),q())}function q(){M=null}function r(a){function b(){s(a),u("reset","reset",a.iframe,a.id)}h(a.id,"Size reset requested by "+("init"===a.type?"host page":"iFrame")),o(a.id),t(b,a,"reset")}function s(a){function b(b){a.iframe.style[b]=a[b]+"px",h(a.id,"IFrame ("+e+") "+b+" set to "+a[b]+"px")}function c(b){H||"0"!==a[b]||(H=!0,h(e,"Hidden iFrame detected, creating visibility listener"),y())}function d(a){b(a),c(a)}var e=a.iframe.id;P[e]&&(P[e].sizeHeight&&d("height"),P[e].sizeWidth&&d("width"))}function t(a,b,c){c!==b.type&&N?(h(b.id,"Requesting animation frame"),N(a)):a()}function u(a,b,c,d){function e(){var e=P[d].targetOrigin;h(d,"["+a+"] Sending msg to iframe["+d+"] ("+b+") targetOrigin: "+e),c.contentWindow.postMessage(K+b,e)}function f(){i(d,"["+a+"] IFrame("+d+") not found"),P[d]&&delete P[d]}function g(){c&&"contentWindow"in c&&null!==c.contentWindow?e():f()}d=d||c.id,P[d]&&g()}function v(a){return a+":"+P[a].bodyMarginV1+":"+P[a].sizeWidth+":"+P[a].log+":"+P[a].interval+":"+P[a].enablePublicMethods+":"+P[a].autoResize+":"+P[a].bodyMargin+":"+P[a].heightCalculationMethod+":"+P[a].bodyBackground+":"+P[a].bodyPadding+":"+P[a].tolerance+":"+P[a].inPageLinks+":"+P[a].resizeFrom+":"+P[a].widthCalculationMethod}function w(a,c){function d(){function b(b){1/0!==P[w][b]&&0!==P[w][b]&&(a.style[b]=P[w][b]+"px",h(w,"Set "+b+" = "+P[w][b]+"px"))}function c(a){if(P[w]["min"+a]>P[w]["max"+a])throw new Error("Value for min"+a+" can not be greater than max"+a)}c("Height"),c("Width"),b("maxHeight"),b("minHeight"),b("maxWidth"),b("minWidth")}function e(){var a=c&&c.id||S.id+F++;return null!==document.getElementById(a)&&(a+=F++),a}function f(b){return R=b,""===b&&(a.id=b=e(),G=(c||{}).log,R=b,h(b,"Added missing iframe ID: "+b+" ("+a.src+")")),b}function g(){h(w,"IFrame scrolling "+(P[w].scrolling?"enabled":"disabled")+" for "+w),a.style.overflow=!1===P[w].scrolling?"hidden":"auto",a.scrolling=!1===P[w].scrolling?"no":"yes"}function i(){("number"==typeof P[w].bodyMargin||"0"===P[w].bodyMargin)&&(P[w].bodyMarginV1=P[w].bodyMargin,P[w].bodyMargin=""+P[w].bodyMargin+"px")}function k(){var b=P[w].firstRun,c=P[w].heightCalculationMethod in O;!b&&c&&r({iframe:a,height:0,width:0,type:"init"})}function l(){Function.prototype.bind&&(P[w].iframe.iFrameResizer={close:n.bind(null,P[w].iframe),resize:u.bind(null,"Window resize","resize",P[w].iframe),moveToAnchor:function(a){u("Move to anchor","inPageLink:"+a,P[w].iframe,w)},sendMessage:function(a){a=JSON.stringify(a),u("Send Message","message:"+a,P[w].iframe,w)}})}function m(c){function d(){u("iFrame.onload",c,a),k()}b(a,"load",d),u("init",c,a)}function o(a){if("object"!=typeof a)throw new TypeError("Options is not an object")}function p(a){for(var b in S)S.hasOwnProperty(b)&&(P[w][b]=a.hasOwnProperty(b)?a[b]:S[b])}function q(a){return""===a||"file://"===a?"*":a}function s(b){b=b||{},P[w]={firstRun:!0,iframe:a,remoteHost:a.src.split("/").slice(0,3).join("/")},o(b),p(b),P[w].targetOrigin=!0===P[w].checkOrigin?q(P[w].remoteHost):"*"}function t(){return w in P&&"iFrameResizer"in a}var w=f(a.id);t()?j(w,"Ignored iFrame, already setup."):(s(c),g(),d(),i(),m(v(w)),l())}function x(a,b){null===Q&&(Q=setTimeout(function(){Q=null,a()},b))}function y(){function b(){function a(a){function b(b){return"0px"===P[a].iframe.style[b]}function c(a){return null!==a.offsetParent}c(P[a].iframe)&&(b("height")||b("width"))&&u("Visibility change","resize",P[a].iframe,a)}for(var b in P)a(b)}function c(a){h("window","Mutation observed: "+a[0].target+" "+a[0].type),x(b,16)}function d(){var a=document.querySelector("body"),b={attributes:!0,attributeOldValue:!1,characterData:!0,characterDataOldValue:!1,childList:!0,subtree:!0},d=new e(c);d.observe(a,b)}var e=a.MutationObserver||a.WebKitMutationObserver;e&&d()}function z(a){function b(){B("Window "+a,"resize")}h("window","Trigger event: "+a),x(b,16)}function A(){function a(){B("Tab Visable","resize")}"hidden"!==document.visibilityState&&(h("document","Trigger event: Visiblity change"),x(a,16))}function B(a,b){function c(a){return"parent"===P[a].resizeFrom&&P[a].autoResize&&!P[a].firstRun}for(var d in P)c(d)&&u(a,b,document.getElementById(d),d)}function C(){b(a,"message",l),b(a,"resize",function(){z("resize")}),b(document,"visibilitychange",A),b(document,"-webkit-visibilitychange",A),b(a,"focusin",function(){z("focus")}),b(a,"focus",function(){z("focus")})}function D(){function a(a,c){function d(){if(!c.tagName)throw new TypeError("Object is not a valid DOM element");if("IFRAME"!==c.tagName.toUpperCase())throw new TypeError("Expected <IFRAME> tag, found <"+c.tagName+">")}c&&(d(),w(c,a),b.push(c))}var b;return d(),C(),function(c,d){switch(b=[],typeof d){case"undefined":case"string":Array.prototype.forEach.call(document.querySelectorAll(d||"iframe"),a.bind(void 0,c));break;case"object":a(c,d);break;default:throw new TypeError("Unexpected data type ("+typeof d+")")}return b}}function E(a){a.fn.iFrameResize=function(a){return this.filter("iframe").each(function(b,c){w(c,a)}).end()}}var F=0,G=!1,H=!1,I="message",J=I.length,K="[iFrameSizer]",L=K.length,M=null,N=a.requestAnimationFrame,O={max:1,scroll:1,bodyScroll:1,documentElementScroll:1},P={},Q=null,R="Host Page",S={autoResize:!0,bodyBackground:null,bodyMargin:null,bodyMarginV1:8,bodyPadding:null,checkOrigin:!0,inPageLinks:!1,enablePublicMethods:!0,heightCalculationMethod:"bodyOffset",id:"iFrameResizer",interval:32,log:!1,maxHeight:1/0,maxWidth:1/0,minHeight:0,minWidth:0,resizeFrom:"parent",scrolling:!1,sizeHeight:!0,sizeWidth:!1,tolerance:0,widthCalculationMethod:"scroll",closedCallback:function(){},initCallback:function(){},messageCallback:function(){j("MessageCallback function not defined")},resizedCallback:function(){},scrollCallback:function(){return!0}};a.jQuery&&E(jQuery),"function"==typeof define&&define.amd?define([],D):"object"==typeof module&&"object"==typeof module.exports?module.exports=D():a.iFrameResize=a.iFrameResize||D()}(window||{});
-//# sourceMappingURL=iframeResizer.map \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/o2c.html b/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/o2c.html
deleted file mode 100644
index a8fb552..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/api-doc/o2c.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!--
-
- Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<script>
-var qp = null;
-if(window.location.hash) {
- qp = location.hash.substring(1);
-}
-else {
- qp = location.search.substring(1);
-}
-qp = qp ? JSON.parse('{"' + qp.replace(/&/g, '","').replace(/=/g,'":"') + '"}',
- function(key, value) {
- return key===""?value:decodeURIComponent(value) }
- ):{}
-
-if (window.opener.swaggerUi.tokenUrl)
- window.opener.processOAuthCode(qp);
-else
- window.opener.onOAuthComplete(qp);
-
-window.close();
-</script> \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/banner.txt b/msb-core/apiroute/apiroute-service/src/main/resources/banner.txt
deleted file mode 100644
index 58ed4f8..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/banner.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-====
- Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-====
-
- __ __ _ _ ____
- | \/ | (_) ___ _ __ ___ ___ ___ _ __ __ __ (_) ___ ___ | __ ) _ _ ___
- | |\/| | | | / __| | '__| / _ \ / __| / _ \ | '__| \ \ / / | | / __| / _ \ | _ \ | | | | / __|
- | | | | | | | (__ | | | (_) | \__ \ | __/ | | \ V / | | | (__ | __/ | |_) | | |_| | \__ \
- |_| |_| |_| \___| |_| \___/ |___/ \___| |_| \_/ |_| \___| \___| |____/ \__,_| |___/
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/css/metrics.css b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/css/metrics.css
deleted file mode 100644
index 4a2636a..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/css/metrics.css
+++ /dev/null
@@ -1,159 +0,0 @@
-/**
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-body {
- color: #333;
- font-family: "Microsoft yahei", Verdana, Arial, Helvetica, sans-serif !important;
- padding: 0px !important;
- margin: 0px !important;
- direction: ltr;
- background-color: #f1f3fa !important;
-}
-
-.row{
- margin-left: 0px;
- margin-right: 0px;
-}
-
-select {
- border-width: 1px;
- padding: 4px 1px;
- border-radius: 4px;
-}
-
-.navbar {
- overflow: visible;
- margin-bottom: 0px;
-
-}
-
-#top-bar, #top-bar small, #top-bar a {
- text-shadow: 0px -1px 0px #182127;
- color: #ffffff;
-}
-
-.span12{
- margin-top:10px;
-}
-
-#title {
- color: #ffffff;
- font-weight: bolder;
-}
-
-#top-bar {
- background-color: #363F45;
- background-image: -moz-linear-gradient(top, #545d63, #182127);
- background-image: -ms-linear-gradient(top, #545d63, #182127);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#545d63), to(#182127));
- background-image: -webkit-linear-gradient(top, #545d63, #182127);
- background-image: -o-linear-gradient(top, #545d63, #182127);
- background-image: linear-gradient(top, #545d63, #182127);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#545d63', endColorstr = '#182127', GradientType = 0);
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- height: 55px;
-}
-
-.navbar-inner {
- padding-left: 20px;
- padding-right: 20px;
- background-color: #2c2c2c;
- background-image: -moz-linear-gradient(top, #333333, #222222);
- background-image: -ms-linear-gradient(top, #333333, #222222);
- background-image: -o-linear-gradient(top, #333333, #222222);
- background-image: linear-gradient(top, #333333, #222222);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
-}
-
-
-
-.container-fluid {
- background-color: #fff;
-}
-
-
-
-p[tooltip], div[tooltip], td[tooltip], span[tooltip]{
- overflow: hidden;
- text-overflow: ellipsis;
- white-space:nowrap;
-}
-
-
-
-
-
-
-
-
-.titlefont {
- font-size: 16px;
- margin-left: 10px;
-}
-
-.separator-line {
- height: 1px;
- width: 100%;
- background: #ddd;
- overflow: hidden;
- margin-bottom: 15px;
- margin-top: 6px;
- opacity: 0.6;
-}
-
-
-table.dataTable thead .sorting,
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc,
-table.dataTable thead .sorting_asc_disabled,
-table.dataTable thead .sorting_desc_disabled {
- background: 0 0;
-}
-
-table.dataTable thead .sorting_asc:after {
- content: "\f0de";
- float: right;
- font-family: fontawesome;
-}
-
-table.dataTable thead .sorting_desc:after {
- content: "\f0dd";
- float: right;
- font-family: fontawesome;
-}
-
-table.dataTable thead .sorting:after {
- content: "\f0dc";
- float: right;
- font-family: fontawesome;
- color: rgba(50,50,50,.5);
-}
-
-.metricsChart {
- /*width: 560px;*/
- height: 400px;
- padding: 5px;
-} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/loadi18nApp_iui-metrics_view.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/loadi18nApp_iui-metrics_view.js
deleted file mode 100644
index fc1d3da..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/loadi18nApp_iui-metrics_view.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-function loadPropertiesSideMenu(lang, propertiesFileNamePrefix, propertiesFilePath){
- jQuery.i18n.properties({
- // language:lang,
- name:propertiesFileNamePrefix,
- path:propertiesFilePath, // 资æºæ–‡ä»¶è·¯å¾„
- mode:'map', // 用 Map çš„æ–¹å¼ä½¿ç”¨èµ„æºæ–‡ä»¶ä¸­çš„值
- callback: function() {// 加载æˆåŠŸåŽè®¾ç½®æ˜¾ç¤ºå†…容
-
- var i18nItems = $('[name_i18n=org_openo_msb_metrics_ui_i18n]');
- for(var i=0;i<i18nItems.length;i++){
- var $item = $(i18nItems.eq(i));
- var itemId = $item.attr('id');
- var itemTitle = $item.attr('title');
- /** id存在时元素内容需è¦å›½é™…化,title存在时元素title需è¦å›½é™…化 */
- if(typeof($item.attr("title")) == "string"){
- $item.attr("title", ($.i18n.prop(itemTitle)));
- }
- if(undefined != itemId && typeof($item.attr("placeholder"))=="undefined"){
- $item.text($.i18n.prop(itemId));
- }else if(undefined != itemId && typeof($item.attr("placeholder"))!="undefined"){
- $item.attr("placeholder", $.i18n.prop(itemId));
- }
- }
- }
- });
-}
-
-
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/msb-iui-metrics-i18n-en-US.properties b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/msb-iui-metrics-i18n-en-US.properties
deleted file mode 100644
index 94c7f59..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/msb-iui-metrics-i18n-en-US.properties
+++ /dev/null
@@ -1,85 +0,0 @@
-#
-# Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
-
-
-org_openo_msb_metrics_btn_refresh=Refresh
-org_openo_msb_metrics_iserr=This function cannot be accessed
-org_openo_msb_metrics_jvm_title=JVM Status
-org_openo_msb_metrics_jvm_time=JVM Run Time:
-org_openo_msb_metrics_memory=Memory
-org_openo_msb_metrics_thread=Thread
-org_openo_msb_metrics_thread_num=Totals:
-org_openo_msb_metrics_http_title=HTTP Access
-org_openo_msb_metrics_rest_title=Rest interface traffic rankings
-org_openo_msb_metrics_requests_title=HTTP traffic rankings
-org_openo_msb_metrics_http_table_title=HTTP Access detailed list
-
-org_openo_msb_metrics_http_table_sn=SN
-org_openo_msb_metrics_http_table_restname=Rest Name
-org_openo_msb_metrics_http_table_count=Visits
-org_openo_msb_metrics_http_table_max=Max response seconds
-org_openo_msb_metrics_http_table_min=Min response seconds
-org_openo_msb_metrics_http_table_mean=Mean response seconds
-org_openo_msb_metrics_http_table_m1=1 minute visits on average
-org_openo_msb_metrics_http_table_m5=5 minute visits on average
-
-org_openo_msb_metrics_jvm_memory_radius=JVM Memory Usage
-org_openo_msb_metrics_jvm_memory_bar=JVM Memory Distribution
-org_openo_msb_metrics_jvm_memory_bar_init=initialization
-org_openo_msb_metrics_jvm_memory_bar_used=used
-org_openo_msb_metrics_jvm_memory_bar_total=all
-
-org_openo_msb_metrics_jvm_memory_bar_heap=Heap
-org_openo_msb_metrics_jvm_memory_bar_non-heap=Non-Heap
-org_openo_msb_metrics_jvm_memory_bar_total-heap=Total
-org_openo_msb_metrics_jvm_thread_chart=Thread Distribution
-org_openo_msb_metrics_rest_bar_count=Visit Times
-
-org_openo_msb_route_content_title=Service Detail
-//table
-org_openo_msb_route-table-sLengthMenu=View _MENU_ records
-org_openo_msb_route-table-sZeroRecords=No matching records found
-org_openo_msb_route-table-sInfo=Found total _TOTAL_ records
-org_openo_msb_route-table-sInfoEmpty=No records found to show
-org_openo_msb_route-table-sGroupActions=_TOTAL_ records selected:
-org_openo_msb_route-table-sAjaxRequestGeneralError=Could not complete request. Please check your internet connection.
-org_openo_msb_route-table-sEmptyTable=No data available in table
-org_openo_msb_route-table-sPrevious=Prev
-org_openo_msb_route-table-sNext=Next
-org_openo_msb_route-table-sPage=Page
-org_openo_msb_route-table-sPageOf=of
-org_openo_msb_route-table-search=Search:
-org_openo_msb_route-table-infofilter=(Filter from _MAX_ Records)
-
-
-org_openo_msb_metrics_hour=h/
-org_openo_msb_metrics_second=s
-org_openo_msb_metrics_minute=m/
-
-org_openo_msb_metrics_chart_save_picture=save picture as
-org_openo_msb_metrics_chart_click_save=click save
-
-org_openo_msb_metrics_chart_line_change=switch line/bar chart
-
-
-
-
-
-
-
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/msb-iui-metrics-i18n-zh-CN.properties b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/msb-iui-metrics-i18n-zh-CN.properties
deleted file mode 100644
index f0f05bc..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/i18n/msb-iui-metrics-i18n-zh-CN.properties
+++ /dev/null
@@ -1,81 +0,0 @@
-#
-# Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
-
-
-org_openo_msb_metrics_btn_refresh=刷新
-org_openo_msb_metrics_iserr=暂未æ供此功能
-org_openo_msb_metrics_jvm_title=JVM状æ€
-org_openo_msb_metrics_jvm_time=JVMè¿è¡Œæ—¶é—´:
-org_openo_msb_metrics_memory=内存
-org_openo_msb_metrics_thread=线程
-org_openo_msb_metrics_thread_num=线程总数:
-org_openo_msb_metrics_http_title=HTTP访问
-org_openo_msb_metrics_rest_title=Rest接å£è®¿é—®é‡æŽ’行榜
-org_openo_msb_metrics_requests_title=HTTP访问é‡æŽ’行榜
-org_openo_msb_metrics_http_table_title=HTTP访问详细列表
-
-org_openo_msb_metrics_http_table_sn=åºå·
-org_openo_msb_metrics_http_table_restname=访问å
-org_openo_msb_metrics_http_table_count=访问数
-org_openo_msb_metrics_http_table_max=最长å“应秒数
-org_openo_msb_metrics_http_table_min=最短å“应秒数
-org_openo_msb_metrics_http_table_mean=å¹³å‡å“应秒数
-org_openo_msb_metrics_http_table_m1=1分钟平å‡è®¿é—®æ¬¡æ•°
-org_openo_msb_metrics_http_table_m5=5分钟平å‡è®¿é—®æ¬¡æ•°
-
-org_openo_msb_metrics_jvm_memory_radius=JVM 内存使用率
-org_openo_msb_metrics_jvm_memory_bar=JVM内存分布
-org_openo_msb_metrics_jvm_memory_bar_init=åˆå§‹åŒ–
-org_openo_msb_metrics_jvm_memory_bar_used=已使用
-org_openo_msb_metrics_jvm_memory_bar_total=全部
-
-org_openo_msb_metrics_jvm_memory_bar_heap=堆内存
-org_openo_msb_metrics_jvm_memory_bar_non-heap=éžå †å†…å­˜
-org_openo_msb_metrics_jvm_memory_bar_total-heap=总内存
-org_openo_msb_metrics_jvm_thread_chart=线程分布图
-org_openo_msb_metrics_rest_bar_count=访问次数
-
-org_openo_msb_route_content_title=å¾®æœåŠ¡è¯¦æƒ…
-
-//表格相关
-org_openo_msb_route-table-sLengthMenu=æ¯é¡µ _MENU_ æ¡ç»“æžœ
-org_openo_msb_route-table-sZeroRecords=没有匹é…结果
-org_openo_msb_route-table-sInfo=总共找到 _TOTAL_ æ¡ç»“æžœ
-org_openo_msb_route-table-sInfoEmpty=共 0 项
-org_openo_msb_route-table-sGroupActions=_TOTAL_ æ¡ç»“果被选择:
-org_openo_msb_route-table-sAjaxRequestGeneralError=ä¸èƒ½å®Œæˆè¯·æ±‚,请检查您的网络连接情况。
-org_openo_msb_route-table-sEmptyTable=表中数æ®ä¸ºç©º
-org_openo_msb_route-table-sPrevious=å‰é¡µ
-org_openo_msb_route-table-sNext=下页
-org_openo_msb_route-table-sPage=第
-org_openo_msb_route-table-sPageOf=页,总页数:
-org_openo_msb_route-table-search=æœç´¢ï¼š
-org_openo_msb_route-table-infofilter=(从 _MAX_ æ¡è®°å½•è¿‡æ»¤)
-
-org_openo_msb_metrics_hour=å°æ—¶
-org_openo_msb_metrics_second=秒
-org_openo_msb_metrics_minute=分
-
-org_openo_msb_metrics_chart_save_picture=ä¿å­˜ä¸ºå›¾ç‰‡
-org_openo_msb_metrics_chart_click_save=点击ä¿å­˜
-org_openo_msb_metrics_chart_line_change=折线图/柱状图切æ¢
-
-
-
-
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/img/netnumenLogo.png b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/img/netnumenLogo.png
deleted file mode 100644
index 289a8f7..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/img/netnumenLogo.png
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/index.html b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/index.html
deleted file mode 100644
index 8467d31..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/index.html
+++ /dev/null
@@ -1,259 +0,0 @@
-<!--
-
- Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<!DOCTYPE html>
-<html>
-<head lang="en">
-<meta charset="UTF-8">
-<title></title>
-<link
- href="js/fontAwesome/css/font-awesome.min.css"
- rel="stylesheet" />
-<link
- href="js/bootstrap/css/bootstrap.min.css"
- rel="stylesheet" />
-
-
-
-<link href="css/metrics.css" rel="stylesheet" type="text/css" />
-<link href="css/animate.min.css" rel="stylesheet" type="text/css" />
-<link href="js/dataTables/dataTables.bootstrap.css" rel="stylesheet" type="text/css" />
-
-<style>
-.ms-controller {
- visibility: hidden
-}
-</style>
-
-</head>
-<body>
-<div class="ms-controller" ms-controller="metricsController">
-<div class="navbar" id="metricsHead">
- <div class="navbar-inner container-fluid" id="top-bar">
- <header class="row-fluid">
- <h3 class="span12" id="title">
- <img class="logo" src="img/netnumenLogo.png" alt="Logo"/>
- <small> —— Metrics</small>
- <button class="btn btn-default pull-right" ms-click="initMetrics()" >
- <i class=" fa fa-refresh"></i> <span id="org_openo_msb_metrics_btn_refresh" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
- </button>
- </h3>
-
-
-
- </header>
-
- </div>
-</div>
-
-<div ms-visible="vm.isErr" style=" margin-top: 20px;text-align: center;" id="org_openo_msb_metrics_iserr" name_i18n="org_openo_msb_metrics_ui_i18n"></div>
-
-<div ms-visible="!vm.isErr">
-<span class="response_throbber" ms-visible="vm.routeLoading"></span>
-
-
- <div class="container-fluid">
-
-
-
- <div class="row" style=" margin-top: 15px;">
- <div class="col-xs-6 col-md-6 col-sm-6 col-lg-6">
- <i class="fa fa-cubes fa-lg"></i>
- <span class=" titlefont" id="org_openo_msb_metrics_jvm_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
- </div>
- <div class="pull-right">
- <i class="fa fa-clock-o"></i> <span id="org_openo_msb_metrics_jvm_time" name_i18n="org_openo_msb_metrics_ui_i18n"></span> {{vm.jvmTime}}
- </div>
- </div>
- <div class="separator-line"></div>
-
- <div class="row row-fluid">
-
- <div class="col-xs-12 col-sm-12 col-md-8 col-lg-7 " >
- <div class="panel panel-default">
- <div class="panel-heading">
- <i class="fa fa-stack-overflow fa-fw"></i> <span id="org_openo_msb_metrics_memory" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
- </div>
- <!-- /.panel-heading -->
- <div class="panel-body">
- <div id="memoryBarChartDiv" style="width:100%;height:250px"></div>
- <div id="memoryPieChartDiv" style="width:100%;height:200px"></div>
-
- </div>
- </div>
- </div>
-
- <div class="col-xs-12 col-sm-12 col-md-4 col-lg-5 ">
- <div class="panel panel-default">
- <div class="panel-heading">
- <i class="fa fa-tasks fa-fw"></i> <span id="org_openo_msb_metrics_thread" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
- <div class="pull-right">
- <span id="org_openo_msb_metrics_thread_num" name_i18n="org_openo_msb_metrics_ui_i18n"></span>{{vm.threadNum}}
- </div>
- </div>
- <!-- /.panel-heading -->
- <div class="panel-body metricsChart" id="threadsChartDiv" style="height:480px">
-
- </div>
- </div>
- </div>
-
-
- </div>
-
- </div>
-
-
-
- <div class="container-fluid">
-
- <div class="row">
- <div class="col-xs-6 col-md-6 col-sm-6 col-lg-6 ">
- <i class="fa fa-internet-explorer fa-lg"></i>
- <span class=" titlefont" id="org_openo_msb_metrics_http_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
-
- </div>
-
- </div>
- <div class="separator-line"></div>
-
-
- <div class="row row-fluid">
-
- <div class="col-xs-12 col-md-6 col-sm-6 col-lg-6 " >
- <div class="panel panel-default">
- <div class="panel-heading">
- <i class="fa fa-link fa-fw"></i> <span id="org_openo_msb_metrics_rest_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
- </div>
- <!-- /.panel-heading -->
- <div class="panel-body metricsChart" id="restChartDiv" >
-
- </div>
- </div>
- </div>
-
- <div class="col-xs-12 col-md-6 col-sm-6 col-lg-6 ">
- <div class="panel panel-default">
- <div class="panel-heading">
- <i class="fa fa-bar-chart fa-fw"></i> <span id="org_openo_msb_metrics_requests_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
- </div>
- <!-- /.panel-heading -->
- <div class="panel-body metricsChart" id="requestsChartDiv" >
-
- </div>
- </div>
- </div>
-
-
- </div>
-
-
- <div class="row-fluid">
-
- <div class="panel panel-default">
- <div class="panel-heading">
- <i class="fa fa-file-text-o fa-fw"></i> <span id="org_openo_msb_metrics_http_table_title" name_i18n="org_openo_msb_metrics_ui_i18n"></span>
- </div>
- <!-- /.panel-heading -->
- <div class="panel-body" >
-
- <div class="table-responsive">
- <table class="table table-striped table-bordered table-hover" id="restTable">
- <thead>
- <tr>
- <th id="org_openo_msb_metrics_http_table_sn" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
- <th id="org_openo_msb_metrics_http_table_restname" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
- <th id="org_openo_msb_metrics_http_table_count" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
- <th id="org_openo_msb_metrics_http_table_max" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
- <th id="org_openo_msb_metrics_http_table_min" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
- <th id="org_openo_msb_metrics_http_table_mean" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
- <th id="org_openo_msb_metrics_http_table_m1" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
- <th id="org_openo_msb_metrics_http_table_m5" name_i18n="org_openo_msb_metrics_ui_i18n"></th>
- </tr>
- </thead>
- <tbody ms-each-rest="restArray">
- <tr>
- <td ms-text="$index+1"></td>
- <td ms-text="metricsUtil.methodShortName(rest.name)" ms-attr-title="rest.name"></td>
- <td ms-text="rest.count"></td>
- <td ms-text="rest.max.toFixed(2)"></td>
- <td ms-text="rest.min.toFixed(2)"></td>
- <td ms-text="rest.mean.toFixed(2)"></td>
- <td ms-text="rest.m1_rate"></td>
- <td ms-text="rest.m5_rate"></td>
-
- </tr>
-
- </tbody>
- </table>
-
- </div>
- </div>
- </div>
-
- </div>
-
- </div>
-
-</div>
-</div>
-
-
-
- <script type="text/javascript" src="js/jquery/jquery-1.10.2.min.js"></script>
- <script type="text/javascript" src="js/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>
-<script src="i18n/loadi18nApp_iui-metrics_view.js"></script>
- <script type="text/javascript">
-
- var url = window.location.search.match(/url=([^&]+)/);
- if (url && url.length > 1) {
- url = decodeURIComponent(url[1]);
- $("#metricsHead").hide();
- } else {
- url = "/admin/microservices/v1/metrics";
- }
-
- loadPropertiesSideMenu('', 'msb-iui-metrics-i18n', 'i18n/');
-
-</script>
-
-
- <script type="text/javascript" src="js/bootstrap/js/bootstrap.min.js"></script>
-
- <script type="text/javascript" src="js/dataTables/jquery.dataTables.min.js"></script>
- <script type="text/javascript" src="js/dataTables/dataTables.bootstrap.min.js"></script>
-
- <script type="text/javascript" src="js/avalon.js"></script>
-
-
- <script src="js/metricsUtil.js"></script>
-
-
- <script src="js/echarts/echarts-all.js"></script>
-
- <script src="js/metricsChart.js"></script>
-
- <script type="text/javascript" src="js/metricsController.js"></script>
-
- <script type="text/javascript" src="js/iframeResizer/iframeResizer.contentWindow.min.js"></script>
-
-
-</body>
-</html> \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/css/bootstrap.min.css b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/css/bootstrap.min.css
deleted file mode 100644
index 9611bd2..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/css/bootstrap.min.css
+++ /dev/null
@@ -1 +0,0 @@
-/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,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:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}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{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{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-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!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^="javascript:"]:after,a[href^="#"]: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}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-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:62.5%;-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:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;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{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.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;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}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:400;line-height:1;color:#999}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:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{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;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.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:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.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'}blockquote:before,blockquote:after{content:""}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;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;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{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-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-left:15px;padding-right: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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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{max-width:100%;background-color:transparent}th{text-align:left}.table{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-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.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.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.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.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.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.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.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{padding:0;margin:0;border:0;min-width: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;margin-bottom:5px;font-weight:700}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:thin dotted;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,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[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.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}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{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;border-color:#3c763d;background-color:#dff0d8}.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{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;border-color:#8a6d3b;background-color:#fcf8e3}.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{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;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom: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 .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;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-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;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.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:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.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:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.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:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{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:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.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:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{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:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.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:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{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:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.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:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.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:#2a6496;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:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;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%;padding-left:0;padding-right:0}.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;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@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.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:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro: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"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.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;list-style:none;font-size:14px;background-color:#fff;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);background-clip:padding-box}.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:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.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:focus,.btn-group-vertical>.btn:focus{outline:0}.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-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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right: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-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.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.33;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:400;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-bottom-right-radius:0;border-top-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-bottom-left-radius:0;border-top-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{margin-left:-1px}.nav{margin-bottom:0;padding-left: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:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.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;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.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:#428bca}.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{text-align:center;margin-bottom:5px}.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-right-radius:0;border-top-left-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{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;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-left:0;padding-right:0}}.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;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;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;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-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 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);margin-top:8px;margin-bottom:8px}@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 .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;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{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-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{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{background-color:#e7e7e7;color:#555}@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-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.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{background-color:#080808;color:#fff}@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:#999}.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:#999}.navbar-inverse .navbar-link:hover{color:#fff}.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{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.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;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;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:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.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:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.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:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding: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}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right: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:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.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:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.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}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;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:#428bca;-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;transition:width .6s ease}.progress-striped .progress-bar{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: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-size:40px 40px}.progress.active .progress-bar{-webkit-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: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: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: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: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,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.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-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.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{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.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{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.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{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.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-right-radius:3px;border-top-left-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{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{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-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 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{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{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{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-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.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-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-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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.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:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@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:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;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{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right: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;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;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{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;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{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.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;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.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}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.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%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;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:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix: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-footer:before,.modal-footer:after{content:" ";display:table}.clearfix: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-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right: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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!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}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap2-typeahead.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap2-typeahead.min.js
deleted file mode 100644
index 1709a60..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/bootstrap/js/bootstrap2-typeahead.min.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/* =============================================================
- * bootstrap-typeahead.js v2.3.2
- * http://twitter.github.com/bootstrap/javascript.html#typeahead
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-!function(t){"use strict";var e=function(e,s){this.$element=t(e),this.options=t.extend({},t.fn.typeahead.defaults,s),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=t(this.options.menu),this.shown=!1,this.listen()};e.prototype={constructor:e,select:function(){var t=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(t)).change(),this.hide()},updater:function(t){return t},show:function(){var e=t.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:e.top+e.height,left:e.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(){var e;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(e=t.isFunction(this.source)?this.source(this.query,t.proxy(this.process,this)):this.source,e?this.process(e):this)},process:function(e){var s=this;return e=t.grep(e,function(t){return s.matcher(t)}),e=this.sorter(e),e.length?this.render(e.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(t){return~t.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(t){for(var e,s=[],i=[],n=[];e=t.shift();)e.toLowerCase().indexOf(this.query.toLowerCase())?~e.indexOf(this.query)?i.push(e):n.push(e):s.push(e);return s.concat(i,n)},highlighter:function(t){var e=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return t.replace(new RegExp("("+e+")","ig"),function(t,e){return"<strong>"+e+"</strong>"})},render:function(e){var s=this;return e=t(e).map(function(e,i){return e=t(s.options.item).attr("data-value",i),e.find("a").html(s.highlighter(i)),e[0]}),e.first().addClass("active"),this.$menu.html(e),this},next:function(){var e=this.$menu.find(".active").removeClass("active"),s=e.next();s.length||(s=t(this.$menu.find("li")[0])),s.addClass("active")},prev:function(){var t=this.$menu.find(".active").removeClass("active"),e=t.prev();e.length||(e=this.$menu.find("li").last()),e.addClass("active")},listen:function(){this.$element.on("focus",t.proxy(this.focus,this)).on("blur",t.proxy(this.blur,this)).on("keypress",t.proxy(this.keypress,this)).on("keyup",t.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",t.proxy(this.keydown,this)),this.$menu.on("click",t.proxy(this.click,this)).on("mouseenter","li",t.proxy(this.mouseenter,this)).on("mouseleave","li",t.proxy(this.mouseleave,this))},eventSupported:function(t){var e=t in this.$element;return e||(this.$element.setAttribute(t,"return;"),e="function"==typeof this.$element[t]),e},move:function(t){if(this.shown){switch(t.keyCode){case 9:case 13:case 27:t.preventDefault();break;case 38:t.preventDefault(),this.prev();break;case 40:t.preventDefault(),this.next()}t.stopPropagation()}},keydown:function(e){this.suppressKeyPressRepeat=~t.inArray(e.keyCode,[40,38,9,13,27]),this.move(e)},keypress:function(t){this.suppressKeyPressRepeat||this.move(t)},keyup:function(t){switch(t.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}t.stopPropagation(),t.preventDefault()},focus:function(){this.focused=!0},blur:function(){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(t){t.stopPropagation(),t.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(e){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),t(e.currentTarget).addClass("active")},mouseleave:function(){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var s=t.fn.typeahead;t.fn.typeahead=function(s){return this.each(function(){var i=t(this),n=i.data("typeahead"),h="object"==typeof s&&s;n||i.data("typeahead",n=new e(this,h)),"string"==typeof s&&n[s]()})},t.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},t.fn.typeahead.Constructor=e,t.fn.typeahead.noConflict=function(){return t.fn.typeahead=s,this},t(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(){var e=t(this);e.data("typeahead")||e.typeahead(e.data())})}(window.jQuery); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/echarts/echarts-all.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/echarts/echarts-all.js
deleted file mode 100644
index 98af0db..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/echarts/echarts-all.js
+++ /dev/null
@@ -1,36 +0,0 @@
-
-!function(e){var t,i;!function(){function e(e,t){if(!t)return e;if(0===e.indexOf(".")){var i=t.split("/"),n=e.split("/"),a=i.length-1,o=n.length,r=0,s=0;e:for(var l=0;o>l;l++)switch(n[l]){case"..":if(!(a>r))break e;r++,s++;break;case".":s++;break;default:break e}return i.length=a-r,n=n.slice(s),i.concat(n).join("/")}return e}function n(t){function i(i,r){if("string"==typeof i){var s=n[i];return s||(s=o(e(i,t)),n[i]=s),s}i instanceof Array&&(r=r||function(){},r.apply(this,a(i,r,t)))}var n={};return i}function a(i,n,a){for(var s=[],l=r[a],h=0,m=Math.min(i.length,n.length);m>h;h++){var V,U=e(i[h],a);switch(U){case"require":V=l&&l.require||t;break;case"exports":V=l.exports;break;case"module":V=l;break;default:V=o(U)}s.push(V)}return s}function o(e){var t=r[e];if(!t)throw new Error("No "+e);if(!t.defined){var i=t.factory,n=i.apply(this,a(t.deps||[],i,e));"undefined"!=typeof n&&(t.exports=n),t.defined=1}return t.exports}var r={};i=function(e,t,i){r[e]={id:e,deps:t,factory:i,defined:0,exports:{},require:n(e)}},t=n("")}(),i("echarts",["echarts/echarts"],function(e){return e}),i("echarts/echarts",["require","./config","zrender/tool/util","zrender/tool/event","zrender/tool/env","zrender","zrender/config","./chart/island","./component/toolbox","./component","./component/title","./component/tooltip","./component/legend","./util/ecData","./chart","zrender/tool/color","./component/timeline","zrender/shape/Image","zrender/loadingEffect/Bar","zrender/loadingEffect/Bubble","zrender/loadingEffect/DynamicLine","zrender/loadingEffect/Ring","zrender/loadingEffect/Spin","zrender/loadingEffect/Whirling","./theme/macarons","./theme/infographic"],function(e){function t(){r.Dispatcher.call(this)}function i(e){e.innerHTML="",this._themeConfig={},this.dom=e,this._connected=!1,this._status={dragIn:!1,dragOut:!1,needRefresh:!1},this._curEventType=!1,this._chartList=[],this._messageCenter=new t,this._messageCenterOutSide=new t,this.resize=this.resize(),this._init()}function n(e,t,i,n,a){for(var o=e._chartList,r=o.length;r--;){var s=o[r];"function"==typeof s[t]&&s[t](i,n,a)}}var a=e("./config"),o=e("zrender/tool/util"),r=e("zrender/tool/event"),s={},l=e("zrender/tool/env").canvasSupported,h=new Date-0,m={},V="_echarts_instance_";s.version="2.2.7",s.dependencies={zrender:"2.1.1"},s.init=function(t,n){var a=e("zrender");a.version.replace(".","")-0<s.dependencies.zrender.replace(".","")-0&&console.error("ZRender "+a.version+" is too old for ECharts "+s.version+". Current version need ZRender "+s.dependencies.zrender+"+"),t=t instanceof Array?t[0]:t;var o=t.getAttribute(V);return o||(o=h++,t.setAttribute(V,o)),m[o]&&m[o].dispose(),m[o]=new i(t),m[o].id=o,m[o].canvasSupported=l,m[o].setTheme(n),m[o]},s.getInstanceById=function(e){return m[e]},o.merge(t.prototype,r.Dispatcher.prototype,!0);var U=e("zrender/config").EVENT,d=["CLICK","DBLCLICK","MOUSEOVER","MOUSEOUT","DRAGSTART","DRAGEND","DRAGENTER","DRAGOVER","DRAGLEAVE","DROP"];return i.prototype={_init:function(){var t=this,i=e("zrender").init(this.dom);this._zr=i,this._messageCenter.dispatch=function(e,i,n,a){n=n||{},n.type=e,n.event=i,t._messageCenter.dispatchWithContext(e,n,a),t._messageCenterOutSide.dispatchWithContext(e,n,a)},this._onevent=function(e){return t.__onevent(e)};for(var n in a.EVENT)"CLICK"!=n&&"DBLCLICK"!=n&&"HOVER"!=n&&"MOUSEOUT"!=n&&"MAP_ROAM"!=n&&this._messageCenter.bind(a.EVENT[n],this._onevent,this);var o={};this._onzrevent=function(e){return t[o[e.type]](e)};for(var r=0,s=d.length;s>r;r++){var l=d[r],h=U[l];o[h]="_on"+l.toLowerCase(),i.on(h,this._onzrevent)}this.chart={},this.component={};var m=e("./chart/island");this._island=new m(this._themeConfig,this._messageCenter,i,{},this),this.chart.island=this._island;var V=e("./component/toolbox");this._toolbox=new V(this._themeConfig,this._messageCenter,i,{},this),this.component.toolbox=this._toolbox;var p=e("./component");p.define("title",e("./component/title")),p.define("tooltip",e("./component/tooltip")),p.define("legend",e("./component/legend")),(0===i.getWidth()||0===i.getHeight())&&console.error("Dom’s width & height should be ready before init.")},__onevent:function(e){e.__echartsId=e.__echartsId||this.id;var t=e.__echartsId===this.id;switch(this._curEventType||(this._curEventType=e.type),e.type){case a.EVENT.LEGEND_SELECTED:this._onlegendSelected(e);break;case a.EVENT.DATA_ZOOM:if(!t){var i=this.component.dataZoom;i&&(i.silence(!0),i.absoluteZoom(e.zoom),i.silence(!1))}this._ondataZoom(e);break;case a.EVENT.DATA_RANGE:t&&this._ondataRange(e);break;case a.EVENT.MAGIC_TYPE_CHANGED:if(!t){var n=this.component.toolbox;n&&(n.silence(!0),n.setMagicType(e.magicType),n.silence(!1))}this._onmagicTypeChanged(e);break;case a.EVENT.DATA_VIEW_CHANGED:t&&this._ondataViewChanged(e);break;case a.EVENT.TOOLTIP_HOVER:t&&this._tooltipHover(e);break;case a.EVENT.RESTORE:this._onrestore();break;case a.EVENT.REFRESH:t&&this._onrefresh(e);break;case a.EVENT.TOOLTIP_IN_GRID:case a.EVENT.TOOLTIP_OUT_GRID:if(t){if(this._connected){var o=this.component.grid;o&&(e.x=(e.event.zrenderX-o.getX())/o.getWidth(),e.y=(e.event.zrenderY-o.getY())/o.getHeight())}}else{var o=this.component.grid;o&&this._zr.trigger("mousemove",{connectTrigger:!0,zrenderX:o.getX()+e.x*o.getWidth(),zrenderY:o.getY()+e.y*o.getHeight()})}}if(this._connected&&t&&this._curEventType===e.type){for(var r in this._connected)this._connected[r].connectedEventHandler(e);this._curEventType=null}(!t||!this._connected&&t)&&(this._curEventType=null)},_onclick:function(e){if(n(this,"onclick",e),e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.CLICK,e.event,t,this)}},_ondblclick:function(e){if(n(this,"ondblclick",e),e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.DBLCLICK,e.event,t,this)}},_onmouseover:function(e){if(e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.HOVER,e.event,t,this)}},_onmouseout:function(e){if(e.target){var t=this._eventPackage(e.target);t&&null!=t.seriesIndex&&this._messageCenter.dispatch(a.EVENT.MOUSEOUT,e.event,t,this)}},_ondragstart:function(e){this._status={dragIn:!1,dragOut:!1,needRefresh:!1},n(this,"ondragstart",e)},_ondragenter:function(e){n(this,"ondragenter",e)},_ondragover:function(e){n(this,"ondragover",e)},_ondragleave:function(e){n(this,"ondragleave",e)},_ondrop:function(e){n(this,"ondrop",e,this._status),this._island.ondrop(e,this._status)},_ondragend:function(e){if(n(this,"ondragend",e,this._status),this._timeline&&this._timeline.ondragend(e,this._status),this._island.ondragend(e,this._status),this._status.needRefresh){this._syncBackupData(this._option);var t=this._messageCenter;t.dispatch(a.EVENT.DATA_CHANGED,e.event,this._eventPackage(e.target),this),t.dispatch(a.EVENT.REFRESH,null,null,this)}},_onlegendSelected:function(e){this._status.needRefresh=!1,n(this,"onlegendSelected",e,this._status),this._status.needRefresh&&this._messageCenter.dispatch(a.EVENT.REFRESH,null,null,this)},_ondataZoom:function(e){this._status.needRefresh=!1,n(this,"ondataZoom",e,this._status),this._status.needRefresh&&this._messageCenter.dispatch(a.EVENT.REFRESH,null,null,this)},_ondataRange:function(e){this._clearEffect(),this._status.needRefresh=!1,n(this,"ondataRange",e,this._status),this._status.needRefresh&&this._zr.refreshNextFrame()},_onmagicTypeChanged:function(){this._clearEffect(),this._render(this._toolbox.getMagicOption())},_ondataViewChanged:function(e){this._syncBackupData(e.option),this._messageCenter.dispatch(a.EVENT.DATA_CHANGED,null,e,this),this._messageCenter.dispatch(a.EVENT.REFRESH,null,null,this)},_tooltipHover:function(e){var t=[];n(this,"ontooltipHover",e,t)},_onrestore:function(){this.restore()},_onrefresh:function(e){this._refreshInside=!0,this.refresh(e),this._refreshInside=!1},_syncBackupData:function(e){this.component.dataZoom&&this.component.dataZoom.syncBackupData(e)},_eventPackage:function(t){if(t){var i=e("./util/ecData"),n=i.get(t,"seriesIndex"),a=i.get(t,"dataIndex");return a=-1!=n&&this.component.dataZoom?this.component.dataZoom.getRealDataIndex(n,a):a,{seriesIndex:n,seriesName:(i.get(t,"series")||{}).name,dataIndex:a,data:i.get(t,"data"),name:i.get(t,"name"),value:i.get(t,"value"),special:i.get(t,"special")}}},_noDataCheck:function(e){for(var t=e.series,i=0,n=t.length;n>i;i++)if(t[i].type==a.CHART_TYPE_MAP||t[i].data&&t[i].data.length>0||t[i].markPoint&&t[i].markPoint.data&&t[i].markPoint.data.length>0||t[i].markLine&&t[i].markLine.data&&t[i].markLine.data.length>0||t[i].nodes&&t[i].nodes.length>0||t[i].links&&t[i].links.length>0||t[i].matrix&&t[i].matrix.length>0||t[i].eventList&&t[i].eventList.length>0)return!1;var o=this._option&&this._option.noDataLoadingOption||this._themeConfig.noDataLoadingOption||a.noDataLoadingOption||{text:this._option&&this._option.noDataText||this._themeConfig.noDataText||a.noDataText,effect:this._option&&this._option.noDataEffect||this._themeConfig.noDataEffect||a.noDataEffect};return this.clear(),this.showLoading(o),!0},_render:function(t){if(this._mergeGlobalConifg(t),!this._noDataCheck(t)){var i=t.backgroundColor;if(i)if(l||-1==i.indexOf("rgba"))this.dom.style.backgroundColor=i;else{var n=i.split(",");this.dom.style.filter="alpha(opacity="+100*n[3].substring(0,n[3].lastIndexOf(")"))+")",n.length=3,n[0]=n[0].replace("a",""),this.dom.style.backgroundColor=n.join(",")+")"}this._zr.clearAnimation(),this._chartList=[];var o=e("./chart"),r=e("./component");(t.xAxis||t.yAxis)&&(t.grid=t.grid||{},t.dataZoom=t.dataZoom||{});for(var s,h,m,V=["title","legend","tooltip","dataRange","roamController","grid","dataZoom","xAxis","yAxis","polar"],U=0,d=V.length;d>U;U++)h=V[U],m=this.component[h],t[h]?(m?m.refresh&&m.refresh(t):(s=r.get(/^[xy]Axis$/.test(h)?"axis":h),m=new s(this._themeConfig,this._messageCenter,this._zr,t,this,h),this.component[h]=m),this._chartList.push(m)):m&&(m.dispose(),this.component[h]=null,delete this.component[h]);for(var p,c,u,y={},U=0,d=t.series.length;d>U;U++)c=t.series[U].type,c?y[c]||(y[c]=!0,p=o.get(c),p?(this.chart[c]?(u=this.chart[c],u.refresh(t)):u=new p(this._themeConfig,this._messageCenter,this._zr,t,this),this._chartList.push(u),this.chart[c]=u):console.error(c+" has not been required.")):console.error("series["+U+"] chart type has not been defined.");for(c in this.chart)c==a.CHART_TYPE_ISLAND||y[c]||(this.chart[c].dispose(),this.chart[c]=null,delete this.chart[c]);this.component.grid&&this.component.grid.refixAxisShape(this.component),this._island.refresh(t),this._toolbox.refresh(t),t.animation&&!t.renderAsImage?this._zr.refresh():this._zr.render();var g="IMG"+this.id,b=document.getElementById(g);t.renderAsImage&&l?(b?b.src=this.getDataURL(t.renderAsImage):(b=this.getImage(t.renderAsImage),b.id=g,b.style.position="absolute",b.style.left=0,b.style.top=0,this.dom.firstChild.appendChild(b)),this.un(),this._zr.un(),this._disposeChartList(),this._zr.clear()):b&&b.parentNode.removeChild(b),b=null,this._option=t}},restore:function(){this._clearEffect(),this._option=o.clone(this._optionRestore),this._disposeChartList(),this._island.clear(),this._toolbox.reset(this._option,!0),this._render(this._option)},refresh:function(e){this._clearEffect(),e=e||{};var t=e.option;!this._refreshInside&&t&&(t=this.getOption(),o.merge(t,e.option,!0),o.merge(this._optionRestore,e.option,!0),this._toolbox.reset(t)),this._island.refresh(t),this._toolbox.refresh(t),this._zr.clearAnimation();for(var i=0,n=this._chartList.length;n>i;i++)this._chartList[i].refresh&&this._chartList[i].refresh(t);this.component.grid&&this.component.grid.refixAxisShape(this.component),this._zr.refresh()},_disposeChartList:function(){this._clearEffect(),this._zr.clearAnimation();for(var e=this._chartList.length;e--;){var t=this._chartList[e];if(t){var i=t.type;this.chart[i]&&delete this.chart[i],this.component[i]&&delete this.component[i],t.dispose&&t.dispose()}}this._chartList=[]},_mergeGlobalConifg:function(t){for(var i=["backgroundColor","calculable","calculableColor","calculableHolderColor","nameConnector","valueConnector","animation","animationThreshold","animationDuration","animationDurationUpdate","animationEasing","addDataAnimation","symbolList","DRAG_ENABLE_TIME"],n=i.length;n--;){var o=i[n];null==t[o]&&(t[o]=null!=this._themeConfig[o]?this._themeConfig[o]:a[o])}var r=t.color;r&&r.length||(r=this._themeConfig.color||a.color),this._zr.getColor=function(t){var i=e("zrender/tool/color");return i.getColor(t,r)},l||(t.animation=!1,t.addDataAnimation=!1)},setOption:function(e,t){return e.timeline?this._setTimelineOption(e):this._setOption(e,t)},_setOption:function(e,t,i){return!t&&this._option?this._option=o.merge(this.getOption(),o.clone(e),!0):(this._option=o.clone(e),!i&&this._timeline&&this._timeline.dispose()),this._optionRestore=o.clone(this._option),this._option.series&&0!==this._option.series.length?(this.component.dataZoom&&(this._option.dataZoom||this._option.toolbox&&this._option.toolbox.feature&&this._option.toolbox.feature.dataZoom&&this._option.toolbox.feature.dataZoom.show)&&this.component.dataZoom.syncOption(this._option),this._toolbox.reset(this._option),this._render(this._option),this):void this._zr.clear()},getOption:function(){function e(e){var n=i._optionRestore[e];if(n)if(n instanceof Array)for(var a=n.length;a--;)t[e][a].data=o.clone(n[a].data);else t[e].data=o.clone(n.data)}var t=o.clone(this._option),i=this;return e("xAxis"),e("yAxis"),e("series"),t},setSeries:function(e,t){return t?(this._option.series=e,this.setOption(this._option,t)):this.setOption({series:e}),this},getSeries:function(){return this.getOption().series},_setTimelineOption:function(t){this._timeline&&this._timeline.dispose();var i=e("./component/timeline"),n=new i(this._themeConfig,this._messageCenter,this._zr,t,this);return this._timeline=n,this.component.timeline=this._timeline,this},addData:function(e,t,i,n,r){function s(){if(V._zr){V._zr.clearAnimation();for(var e=0,t=X.length;t>e;e++)X[e].motionlessOnce=h.addDataAnimation&&X[e].addDataAnimation;V._messageCenter.dispatch(a.EVENT.REFRESH,null,{option:h},V)}}for(var l=e instanceof Array?e:[[e,t,i,n,r]],h=this.getOption(),m=this._optionRestore,V=this,U=0,d=l.length;d>U;U++){e=l[U][0],t=l[U][1],i=l[U][2],n=l[U][3],r=l[U][4];var p=m.series[e],c=i?"unshift":"push",u=i?"pop":"shift";if(p){var y=p.data,g=h.series[e].data;if(y[c](t),g[c](t),n||(y[u](),t=g[u]()),null!=r){var b,f;if(p.type===a.CHART_TYPE_PIE&&(b=m.legend)&&(f=b.data)){var k=h.legend.data;if(f[c](r),k[c](r),!n){var x=o.indexOf(f,t.name);-1!=x&&f.splice(x,1),x=o.indexOf(k,t.name),-1!=x&&k.splice(x,1)}}else if(null!=m.xAxis&&null!=m.yAxis){var _,L,W=p.xAxisIndex||0;(null==m.xAxis[W].type||"category"===m.xAxis[W].type)&&(_=m.xAxis[W].data,L=h.xAxis[W].data,_[c](r),L[c](r),n||(_[u](),L[u]())),W=p.yAxisIndex||0,"category"===m.yAxis[W].type&&(_=m.yAxis[W].data,L=h.yAxis[W].data,_[c](r),L[c](r),n||(_[u](),L[u]()))}}this._option.series[e].data=h.series[e].data}}this._zr.clearAnimation();for(var X=this._chartList,v=0,w=function(){v--,0===v&&s()},U=0,d=X.length;d>U;U++)h.addDataAnimation&&X[U].addDataAnimation&&(v++,X[U].addDataAnimation(l,w));return this.component.dataZoom&&this.component.dataZoom.syncOption(h),this._option=h,h.addDataAnimation||setTimeout(s,0),this},addMarkPoint:function(e,t){return this._addMark(e,t,"markPoint")},addMarkLine:function(e,t){return this._addMark(e,t,"markLine")},_addMark:function(e,t,i){var n,a=this._option.series;if(a&&(n=a[e])){var r=this._optionRestore.series,s=r[e],l=n[i],h=s[i];l=n[i]=l||{data:[]},h=s[i]=h||{data:[]};for(var m in t)"data"===m?(l.data=l.data.concat(t.data),h.data=h.data.concat(t.data)):"object"!=typeof t[m]||null==l[m]?l[m]=h[m]=t[m]:(o.merge(l[m],t[m],!0),o.merge(h[m],t[m],!0));var V=this.chart[n.type];V&&V.addMark(e,t,i)}return this},delMarkPoint:function(e,t){return this._delMark(e,t,"markPoint")},delMarkLine:function(e,t){return this._delMark(e,t,"markLine")},_delMark:function(e,t,i){var n,a,o,r=this._option.series;if(!(r&&(n=r[e])&&(a=n[i])&&(o=a.data)))return this;t=t.split(" > ");for(var s=-1,l=0,h=o.length;h>l;l++){var m=o[l];if(m instanceof Array){if(m[0].name===t[0]&&m[1].name===t[1]){s=l;break}}else if(m.name===t[0]){s=l;break}}if(s>-1){o.splice(s,1),this._optionRestore.series[e][i].data.splice(s,1);var V=this.chart[n.type];V&&V.delMark(e,t.join(" > "),i)}return this},getDom:function(){return this.dom},getZrender:function(){return this._zr},getDataURL:function(e){if(!l)return"";if(0===this._chartList.length){var t="IMG"+this.id,i=document.getElementById(t);if(i)return i.src}var n=this.component.tooltip;switch(n&&n.hideTip(),e){case"jpeg":break;default:e="png"}var a=this._option.backgroundColor;return a&&"rgba(0,0,0,0)"===a.replace(" ","")&&(a="#fff"),this._zr.toDataURL("image/"+e,a)},getImage:function(e){var t=this._optionRestore.title,i=document.createElement("img");return i.src=this.getDataURL(e),i.title=t&&t.text||"ECharts",i},getConnectedDataURL:function(t){if(!this.isConnected())return this.getDataURL(t);var i=this.dom,n={self:{img:this.getDataURL(t),left:i.offsetLeft,top:i.offsetTop,right:i.offsetLeft+i.offsetWidth,bottom:i.offsetTop+i.offsetHeight}},a=n.self.left,o=n.self.top,r=n.self.right,s=n.self.bottom;for(var l in this._connected)i=this._connected[l].getDom(),n[l]={img:this._connected[l].getDataURL(t),left:i.offsetLeft,top:i.offsetTop,right:i.offsetLeft+i.offsetWidth,bottom:i.offsetTop+i.offsetHeight},a=Math.min(a,n[l].left),o=Math.min(o,n[l].top),r=Math.max(r,n[l].right),s=Math.max(s,n[l].bottom);var h=document.createElement("div");h.style.position="absolute",h.style.left="-4000px",h.style.width=r-a+"px",h.style.height=s-o+"px",document.body.appendChild(h);var m=e("zrender").init(h),V=e("zrender/shape/Image");for(var l in n)m.addShape(new V({style:{x:n[l].left-a,y:n[l].top-o,image:n[l].img}}));m.render();var U=this._option.backgroundColor;U&&"rgba(0,0,0,0)"===U.replace(/ /g,"")&&(U="#fff");var d=m.toDataURL("image/png",U);return setTimeout(function(){m.dispose(),h.parentNode.removeChild(h),h=null},100),d},getConnectedImage:function(e){var t=this._optionRestore.title,i=document.createElement("img");return i.src=this.getConnectedDataURL(e),i.title=t&&t.text||"ECharts",i},on:function(e,t){return this._messageCenterOutSide.bind(e,t,this),this},un:function(e,t){return this._messageCenterOutSide.unbind(e,t),this},connect:function(e){if(!e)return this;if(this._connected||(this._connected={}),e instanceof Array)for(var t=0,i=e.length;i>t;t++)this._connected[e[t].id]=e[t];else this._connected[e.id]=e;return this},disConnect:function(e){if(!e||!this._connected)return this;if(e instanceof Array)for(var t=0,i=e.length;i>t;t++)delete this._connected[e[t].id];else delete this._connected[e.id];for(var n in this._connected)return this;return this._connected=!1,this},connectedEventHandler:function(e){e.__echartsId!=this.id&&this._onevent(e)},isConnected:function(){return!!this._connected},showLoading:function(t){var i={bar:e("zrender/loadingEffect/Bar"),bubble:e("zrender/loadingEffect/Bubble"),dynamicLine:e("zrender/loadingEffect/DynamicLine"),ring:e("zrender/loadingEffect/Ring"),spin:e("zrender/loadingEffect/Spin"),whirling:e("zrender/loadingEffect/Whirling")};this._toolbox.hideDataView(),t=t||{};var n=t.textStyle||{};t.textStyle=n;var r=o.merge(o.merge(o.clone(n),this._themeConfig.textStyle),a.textStyle);n.textFont=r.fontStyle+" "+r.fontWeight+" "+r.fontSize+"px "+r.fontFamily,n.text=t.text||this._option&&this._option.loadingText||this._themeConfig.loadingText||a.loadingText,null!=t.x&&(n.x=t.x),null!=t.y&&(n.y=t.y),t.effectOption=t.effectOption||{},t.effectOption.textStyle=n;var s=t.effect;return("string"==typeof s||null==s)&&(s=i[t.effect||this._option&&this._option.loadingEffect||this._themeConfig.loadingEffect||a.loadingEffect]||i.spin),this._zr.showLoading(new s(t.effectOption)),this},hideLoading:function(){return this._zr.hideLoading(),this},setTheme:function(t){if(t){if("string"==typeof t)switch(t){case"macarons":t=e("./theme/macarons");break;case"infographic":t=e("./theme/infographic");break;default:t={}}else t=t||{};this._themeConfig=t}if(!l){var i=this._themeConfig.textStyle;i&&i.fontFamily&&i.fontFamily2&&(i.fontFamily=i.fontFamily2),i=a.textStyle,i.fontFamily=i.fontFamily2}this._timeline&&this._timeline.setTheme(!0),this._optionRestore&&this.restore()},resize:function(){var e=this;return function(){if(e._clearEffect(),e._zr.resize(),e._option&&e._option.renderAsImage&&l)return e._render(e._option),e;e._zr.clearAnimation(),e._island.resize(),e._toolbox.resize(),e._timeline&&e._timeline.resize();for(var t=0,i=e._chartList.length;i>t;t++)e._chartList[t].resize&&e._chartList[t].resize();return e.component.grid&&e.component.grid.refixAxisShape(e.component),e._zr.refresh(),e._messageCenter.dispatch(a.EVENT.RESIZE,null,null,e),e}},_clearEffect:function(){this._zr.modLayer(a.EFFECT_ZLEVEL,{motionBlur:!1}),this._zr.painter.clearLayer(a.EFFECT_ZLEVEL)},clear:function(){return this._disposeChartList(),this._zr.clear(),this._option={},this._optionRestore={},this.dom.style.backgroundColor=null,this},dispose:function(){var e=this.dom.getAttribute(V);e&&delete m[e],this._island.dispose(),this._toolbox.dispose(),this._timeline&&this._timeline.dispose(),this._messageCenter.unbind(),this.clear(),this._zr.dispose(),this._zr=null}},s}),i("echarts/config",[],function(){var e={CHART_TYPE_LINE:"line",CHART_TYPE_BAR:"bar",CHART_TYPE_SCATTER:"scatter",CHART_TYPE_PIE:"pie",CHART_TYPE_RADAR:"radar",CHART_TYPE_VENN:"venn",CHART_TYPE_TREEMAP:"treemap",CHART_TYPE_TREE:"tree",CHART_TYPE_MAP:"map",CHART_TYPE_K:"k",CHART_TYPE_ISLAND:"island",CHART_TYPE_FORCE:"force",CHART_TYPE_CHORD:"chord",CHART_TYPE_GAUGE:"gauge",CHART_TYPE_FUNNEL:"funnel",CHART_TYPE_EVENTRIVER:"eventRiver",CHART_TYPE_WORDCLOUD:"wordCloud",CHART_TYPE_HEATMAP:"heatmap",COMPONENT_TYPE_TITLE:"title",COMPONENT_TYPE_LEGEND:"legend",COMPONENT_TYPE_DATARANGE:"dataRange",COMPONENT_TYPE_DATAVIEW:"dataView",COMPONENT_TYPE_DATAZOOM:"dataZoom",COMPONENT_TYPE_TOOLBOX:"toolbox",COMPONENT_TYPE_TOOLTIP:"tooltip",COMPONENT_TYPE_GRID:"grid",COMPONENT_TYPE_AXIS:"axis",COMPONENT_TYPE_POLAR:"polar",COMPONENT_TYPE_X_AXIS:"xAxis",COMPONENT_TYPE_Y_AXIS:"yAxis",COMPONENT_TYPE_AXIS_CATEGORY:"categoryAxis",COMPONENT_TYPE_AXIS_VALUE:"valueAxis",COMPONENT_TYPE_TIMELINE:"timeline",COMPONENT_TYPE_ROAMCONTROLLER:"roamController",backgroundColor:"rgba(0,0,0,0)",color:["#ff7f50","#87cefa","#da70d6","#32cd32","#6495ed","#ff69b4","#ba55d3","#cd5c5c","#ffa500","#40e0d0","#1e90ff","#ff6347","#7b68ee","#00fa9a","#ffd700","#6699FF","#ff6666","#3cb371","#b8860b","#30e0e0"],markPoint:{clickable:!0,symbol:"pin",symbolSize:10,large:!1,effect:{show:!1,loop:!0,period:15,type:"scale",scaleSize:2,bounceDistance:10},itemStyle:{normal:{borderWidth:2,label:{show:!0,position:"inside"}},emphasis:{label:{show:!0}}}},markLine:{clickable:!0,symbol:["circle","arrow"],symbolSize:[2,4],smoothness:.2,precision:2,effect:{show:!1,loop:!0,period:15,scaleSize:2},bundling:{enable:!1,maxTurningAngle:45},itemStyle:{normal:{borderWidth:1.5,label:{show:!0,position:"end"},lineStyle:{type:"dashed"}},emphasis:{label:{show:!1},lineStyle:{}}}},textStyle:{decoration:"none",fontFamily:"Arial, Verdana, sans-serif",fontFamily2:"微软雅黑",fontSize:12,fontStyle:"normal",fontWeight:"normal"},EVENT:{REFRESH:"refresh",RESTORE:"restore",RESIZE:"resize",CLICK:"click",DBLCLICK:"dblclick",HOVER:"hover",MOUSEOUT:"mouseout",DATA_CHANGED:"dataChanged",DATA_ZOOM:"dataZoom",DATA_RANGE:"dataRange",DATA_RANGE_SELECTED:"dataRangeSelected",DATA_RANGE_HOVERLINK:"dataRangeHoverLink",LEGEND_SELECTED:"legendSelected",LEGEND_HOVERLINK:"legendHoverLink",MAP_SELECTED:"mapSelected",PIE_SELECTED:"pieSelected",MAGIC_TYPE_CHANGED:"magicTypeChanged",DATA_VIEW_CHANGED:"dataViewChanged",TIMELINE_CHANGED:"timelineChanged",MAP_ROAM:"mapRoam",FORCE_LAYOUT_END:"forceLayoutEnd",TOOLTIP_HOVER:"tooltipHover",TOOLTIP_IN_GRID:"tooltipInGrid",TOOLTIP_OUT_GRID:"tooltipOutGrid",ROAMCONTROLLER:"roamController"},DRAG_ENABLE_TIME:120,EFFECT_ZLEVEL:10,effectBlendAlpha:.95,symbolList:["circle","rectangle","triangle","diamond","emptyCircle","emptyRectangle","emptyTriangle","emptyDiamond"],loadingEffect:"spin",loadingText:"æ•°æ®è¯»å–中...",noDataEffect:"bubble",noDataText:"æš‚æ— æ•°æ®",calculable:!1,calculableColor:"rgba(255,165,0,0.6)",calculableHolderColor:"#ccc",nameConnector:" & ",valueConnector:": ",animation:!0,addDataAnimation:!0,animationThreshold:2e3,animationDuration:2e3,animationDurationUpdate:500,animationEasing:"ExponentialOut"};return e}),i("zrender/tool/util",["require","../dep/excanvas"],function(e){function t(e){return e&&1===e.nodeType&&"string"==typeof e.nodeName}function i(e){if("object"==typeof e&&null!==e){var n=e;if(e instanceof Array){n=[];for(var a=0,o=e.length;o>a;a++)n[a]=i(e[a])}else if(!y[g.call(e)]&&!t(e)){n={};for(var r in e)e.hasOwnProperty(r)&&(n[r]=i(e[r]))}return n}return e}function n(e,i,n,o){if(i.hasOwnProperty(n)){var r=e[n];"object"!=typeof r||y[g.call(r)]||t(r)?!o&&n in e||(e[n]=i[n]):a(e[n],i[n],o)}}function a(e,t,i){for(var a in t)n(e,t,a,i);return e}function o(){if(!U)if(e("../dep/excanvas"),window.G_vmlCanvasManager){var t=document.createElement("div");t.style.position="absolute",t.style.top="-1000px",document.body.appendChild(t),U=G_vmlCanvasManager.initElement(t).getContext("2d")}else U=document.createElement("canvas").getContext("2d");return U}function r(e,t){if(e.indexOf)return e.indexOf(t);for(var i=0,n=e.length;n>i;i++)if(e[i]===t)return i;return-1}function s(e,t){function i(){}var n=e.prototype;i.prototype=t.prototype,e.prototype=new i;for(var a in n)e.prototype[a]=n[a];e.constructor=e}function l(e,t,i){if(e&&t)if(e.forEach&&e.forEach===p)e.forEach(t,i);else if(e.length===+e.length)for(var n=0,a=e.length;a>n;n++)t.call(i,e[n],n,e);else for(var o in e)e.hasOwnProperty(o)&&t.call(i,e[o],o,e)}function h(e,t,i){if(e&&t){if(e.map&&e.map===c)return e.map(t,i);for(var n=[],a=0,o=e.length;o>a;a++)n.push(t.call(i,e[a],a,e));return n}}function m(e,t,i){if(e&&t){if(e.filter&&e.filter===u)return e.filter(t,i);for(var n=[],a=0,o=e.length;o>a;a++)t.call(i,e[a],a,e)&&n.push(e[a]);return n}}function V(e,t){return function(){e.apply(t,arguments)}}var U,d=Array.prototype,p=d.forEach,c=d.map,u=d.filter,y={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1},g=Object.prototype.toString;return{inherits:s,clone:i,merge:a,getContext:o,indexOf:r,each:l,map:h,filter:m,bind:V}}),i("zrender/tool/event",["require","../mixin/Eventful"],function(e){"use strict";function t(e){return"undefined"!=typeof e.zrenderX&&e.zrenderX||"undefined"!=typeof e.offsetX&&e.offsetX||"undefined"!=typeof e.layerX&&e.layerX||"undefined"!=typeof e.clientX&&e.clientX}function i(e){return"undefined"!=typeof e.zrenderY&&e.zrenderY||"undefined"!=typeof e.offsetY&&e.offsetY||"undefined"!=typeof e.layerY&&e.layerY||"undefined"!=typeof e.clientY&&e.clientY}function n(e){return"undefined"!=typeof e.zrenderDelta&&e.zrenderDelta||"undefined"!=typeof e.wheelDelta&&e.wheelDelta||"undefined"!=typeof e.detail&&-e.detail}var a=e("../mixin/Eventful"),o="function"==typeof window.addEventListener?function(e){e.preventDefault(),e.stopPropagation(),e.cancelBubble=!0}:function(e){e.returnValue=!1,e.cancelBubble=!0};return{getX:t,getY:i,getDelta:n,stop:o,Dispatcher:a}}),i("zrender/tool/env",[],function(){function e(e){var t=this.os={},i=this.browser={},n=e.match(/Web[kK]it[\/]{0,1}([\d.]+)/),a=e.match(/(Android);?[\s\/]+([\d.]+)?/),o=e.match(/(iPad).*OS\s([\d_]+)/),r=e.match(/(iPod)(.*OS\s([\d_]+))?/),s=!o&&e.match(/(iPhone\sOS)\s([\d_]+)/),l=e.match(/(webOS|hpwOS)[\s\/]([\d.]+)/),h=l&&e.match(/TouchPad/),m=e.match(/Kindle\/([\d.]+)/),V=e.match(/Silk\/([\d._]+)/),U=e.match(/(BlackBerry).*Version\/([\d.]+)/),d=e.match(/(BB10).*Version\/([\d.]+)/),p=e.match(/(RIM\sTablet\sOS)\s([\d.]+)/),c=e.match(/PlayBook/),u=e.match(/Chrome\/([\d.]+)/)||e.match(/CriOS\/([\d.]+)/),y=e.match(/Firefox\/([\d.]+)/),g=e.match(/MSIE ([\d.]+)/),b=n&&e.match(/Mobile\//)&&!u,f=e.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/)&&!u,g=e.match(/MSIE\s([\d.]+)/);return(i.webkit=!!n)&&(i.version=n[1]),a&&(t.android=!0,t.version=a[2]),s&&!r&&(t.ios=t.iphone=!0,t.version=s[2].replace(/_/g,".")),o&&(t.ios=t.ipad=!0,t.version=o[2].replace(/_/g,".")),r&&(t.ios=t.ipod=!0,t.version=r[3]?r[3].replace(/_/g,"."):null),l&&(t.webos=!0,t.version=l[2]),h&&(t.touchpad=!0),U&&(t.blackberry=!0,t.version=U[2]),d&&(t.bb10=!0,t.version=d[2]),p&&(t.rimtabletos=!0,t.version=p[2]),c&&(i.playbook=!0),m&&(t.kindle=!0,t.version=m[1]),V&&(i.silk=!0,i.version=V[1]),!V&&t.android&&e.match(/Kindle Fire/)&&(i.silk=!0),u&&(i.chrome=!0,i.version=u[1]),y&&(i.firefox=!0,i.version=y[1]),g&&(i.ie=!0,i.version=g[1]),b&&(e.match(/Safari/)||t.ios)&&(i.safari=!0),f&&(i.webview=!0),g&&(i.ie=!0,i.version=g[1]),t.tablet=!!(o||c||a&&!e.match(/Mobile/)||y&&e.match(/Tablet/)||g&&!e.match(/Phone/)&&e.match(/Touch/)),t.phone=!(t.tablet||t.ipod||!(a||s||l||U||d||u&&e.match(/Android/)||u&&e.match(/CriOS\/([\d.]+)/)||y&&e.match(/Mobile/)||g&&e.match(/Touch/))),{browser:i,os:t,canvasSupported:document.createElement("canvas").getContext?!0:!1}}return e(navigator.userAgent)}),i("zrender",["zrender/zrender"],function(e){return e}),i("zrender/zrender",["require","./dep/excanvas","./tool/util","./tool/log","./tool/guid","./Handler","./Painter","./Storage","./animation/Animation","./tool/env"],function(e){function t(e){return function(){e._needsRefreshNextFrame&&e.refresh()}}e("./dep/excanvas");var i=e("./tool/util"),n=e("./tool/log"),a=e("./tool/guid"),o=e("./Handler"),r=e("./Painter"),s=e("./Storage"),l=e("./animation/Animation"),h={},m={};m.version="2.1.1",m.init=function(e){var t=new V(a(),e);return h[t.id]=t,t},m.dispose=function(e){if(e)e.dispose();else{for(var t in h)h[t].dispose();h={}}return m},m.getInstance=function(e){return h[e]},m.delInstance=function(e){return delete h[e],m};var V=function(i,n){this.id=i,this.env=e("./tool/env"),this.storage=new s,this.painter=new r(n,this.storage),this.handler=new o(n,this.storage,this.painter),this.animation=new l({stage:{update:t(this)}}),this.animation.start();var a=this;this.painter.refreshNextFrame=function(){a.refreshNextFrame()},this._needsRefreshNextFrame=!1;var a=this,h=this.storage,m=h.delFromMap;h.delFromMap=function(e){var t=h.get(e);a.stopAnimation(t),m.call(h,e)}};return V.prototype.getId=function(){return this.id},V.prototype.addShape=function(e){return this.addElement(e),this},V.prototype.addGroup=function(e){return this.addElement(e),this},V.prototype.delShape=function(e){return this.delElement(e),this},V.prototype.delGroup=function(e){return this.delElement(e),this},V.prototype.modShape=function(e,t){return this.modElement(e,t),this},V.prototype.modGroup=function(e,t){return this.modElement(e,t),this},V.prototype.addElement=function(e){return this.storage.addRoot(e),this._needsRefreshNextFrame=!0,this},V.prototype.delElement=function(e){return this.storage.delRoot(e),this._needsRefreshNextFrame=!0,this},V.prototype.modElement=function(e,t){return this.storage.mod(e,t),this._needsRefreshNextFrame=!0,this},V.prototype.modLayer=function(e,t){return this.painter.modLayer(e,t),this._needsRefreshNextFrame=!0,this},V.prototype.addHoverShape=function(e){return this.storage.addHover(e),this},V.prototype.render=function(e){return this.painter.render(e),this._needsRefreshNextFrame=!1,this},V.prototype.refresh=function(e){return this.painter.refresh(e),this._needsRefreshNextFrame=!1,this},V.prototype.refreshNextFrame=function(){return this._needsRefreshNextFrame=!0,this},V.prototype.refreshHover=function(e){return this.painter.refreshHover(e),this},V.prototype.refreshShapes=function(e,t){return this.painter.refreshShapes(e,t),this},V.prototype.resize=function(){return this.painter.resize(),this},V.prototype.animate=function(e,t,a){var o=this;if("string"==typeof e&&(e=this.storage.get(e)),e){var r;if(t){for(var s=t.split("."),l=e,h=0,m=s.length;m>h;h++)l&&(l=l[s[h]]);l&&(r=l)}else r=e;if(!r)return void n('Property "'+t+'" is not existed in element '+e.id);
-
-null==e.__animators&&(e.__animators=[]);var V=e.__animators,U=this.animation.animate(r,{loop:a}).during(function(){o.modShape(e)}).done(function(){var t=i.indexOf(e.__animators,U);t>=0&&V.splice(t,1)});return V.push(U),U}n("Element not existed")},V.prototype.stopAnimation=function(e){if(e.__animators){for(var t=e.__animators,i=t.length,n=0;i>n;n++)t[n].stop();t.length=0}return this},V.prototype.clearAnimation=function(){return this.animation.clear(),this},V.prototype.showLoading=function(e){return this.painter.showLoading(e),this},V.prototype.hideLoading=function(){return this.painter.hideLoading(),this},V.prototype.getWidth=function(){return this.painter.getWidth()},V.prototype.getHeight=function(){return this.painter.getHeight()},V.prototype.toDataURL=function(e,t,i){return this.painter.toDataURL(e,t,i)},V.prototype.shapeToImage=function(e,t,i){var n=a();return this.painter.shapeToImage(n,e,t,i)},V.prototype.on=function(e,t,i){return this.handler.on(e,t,i),this},V.prototype.un=function(e,t){return this.handler.un(e,t),this},V.prototype.trigger=function(e,t){return this.handler.trigger(e,t),this},V.prototype.clear=function(){return this.storage.delRoot(),this.painter.clear(),this},V.prototype.dispose=function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,m.delInstance(this.id)},m}),i("zrender/config",[],function(){var e={EVENT:{RESIZE:"resize",CLICK:"click",DBLCLICK:"dblclick",MOUSEWHEEL:"mousewheel",MOUSEMOVE:"mousemove",MOUSEOVER:"mouseover",MOUSEOUT:"mouseout",MOUSEDOWN:"mousedown",MOUSEUP:"mouseup",GLOBALOUT:"globalout",DRAGSTART:"dragstart",DRAGEND:"dragend",DRAGENTER:"dragenter",DRAGOVER:"dragover",DRAGLEAVE:"dragleave",DROP:"drop",touchClickDelay:300},elementClassName:"zr-element",catchBrushException:!1,debugMode:0,devicePixelRatio:Math.max(window.devicePixelRatio||1,1)};return e}),i("echarts/chart/island",["require","./base","zrender/shape/Circle","../config","../util/ecData","zrender/tool/util","zrender/tool/event","zrender/tool/color","../util/accMath","../chart"],function(e){function t(e,t,n,a,r){i.call(this,e,t,n,a,r),this._nameConnector,this._valueConnector,this._zrHeight=this.zr.getHeight(),this._zrWidth=this.zr.getWidth();var l=this;l.shapeHandler.onmousewheel=function(e){var t=e.target,i=e.event,n=s.getDelta(i);n=n>0?-1:1,t.style.r-=n,t.style.r=t.style.r<5?5:t.style.r;var a=o.get(t,"value"),r=a*l.option.island.calculateStep;a=r>1?Math.round(a-r*n):+(a-r*n).toFixed(2);var h=o.get(t,"name");t.style.text=h+":"+a,o.set(t,"value",a),o.set(t,"name",h),l.zr.modShape(t.id),l.zr.refreshNextFrame(),s.stop(i)}}var i=e("./base"),n=e("zrender/shape/Circle"),a=e("../config");a.island={zlevel:0,z:5,r:15,calculateStep:.1};var o=e("../util/ecData"),r=e("zrender/tool/util"),s=e("zrender/tool/event");return t.prototype={type:a.CHART_TYPE_ISLAND,_combine:function(t,i){var n=e("zrender/tool/color"),a=e("../util/accMath"),r=a.accAdd(o.get(t,"value"),o.get(i,"value")),s=o.get(t,"name")+this._nameConnector+o.get(i,"name");t.style.text=s+this._valueConnector+r,o.set(t,"value",r),o.set(t,"name",s),t.style.r=this.option.island.r,t.style.color=n.mix(t.style.color,i.style.color)},refresh:function(e){e&&(e.island=this.reformOption(e.island),this.option=e,this._nameConnector=this.option.nameConnector,this._valueConnector=this.option.valueConnector)},getOption:function(){return this.option},resize:function(){var e=this.zr.getWidth(),t=this.zr.getHeight(),i=e/(this._zrWidth||e),n=t/(this._zrHeight||t);if(1!==i||1!==n){this._zrWidth=e,this._zrHeight=t;for(var a=0,o=this.shapeList.length;o>a;a++)this.zr.modShape(this.shapeList[a].id,{style:{x:Math.round(this.shapeList[a].style.x*i),y:Math.round(this.shapeList[a].style.y*n)}})}},add:function(e){var t=o.get(e,"name"),i=o.get(e,"value"),a=null!=o.get(e,"series")?o.get(e,"series").name:"",r=this.getFont(this.option.island.textStyle),s=this.option.island,l={zlevel:s.zlevel,z:s.z,style:{x:e.style.x,y:e.style.y,r:this.option.island.r,color:e.style.color||e.style.strokeColor,text:t+this._valueConnector+i,textFont:r},draggable:!0,hoverable:!0,onmousewheel:this.shapeHandler.onmousewheel,_type:"island"};"#fff"===l.style.color&&(l.style.color=e.style.strokeColor),this.setCalculable(l),l.dragEnableTime=0,o.pack(l,{name:a},-1,i,-1,t),l=new n(l),this.shapeList.push(l),this.zr.addShape(l)},del:function(e){this.zr.delShape(e.id);for(var t=[],i=0,n=this.shapeList.length;n>i;i++)this.shapeList[i].id!=e.id&&t.push(this.shapeList[i]);this.shapeList=t},ondrop:function(e,t){if(this.isDrop&&e.target){var i=e.target,n=e.dragged;this._combine(i,n),this.zr.modShape(i.id),t.dragIn=!0,this.isDrop=!1}},ondragend:function(e,t){var i=e.target;this.isDragend?t.dragIn&&(this.del(i),t.needRefresh=!0):t.dragIn||(i.style.x=s.getX(e.event),i.style.y=s.getY(e.event),this.add(i),t.needRefresh=!0),this.isDragend=!1}},r.inherits(t,i),e("../chart").define("island",t),t}),i("echarts/component/toolbox",["require","./base","zrender/shape/Line","zrender/shape/Image","zrender/shape/Rectangle","../util/shape/Icon","../config","zrender/tool/util","zrender/config","zrender/tool/event","./dataView","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.dom=o.dom,this._magicType={},this._magicMap={},this._isSilence=!1,this._iconList,this._iconShapeMap={},this._featureTitle={},this._featureIcon={},this._featureColor={},this._featureOption={},this._enableColor="red",this._disableColor="#ccc",this._markShapeList=[];var r=this;r._onMark=function(e){r.__onMark(e)},r._onMarkUndo=function(e){r.__onMarkUndo(e)},r._onMarkClear=function(e){r.__onMarkClear(e)},r._onDataZoom=function(e){r.__onDataZoom(e)},r._onDataZoomReset=function(e){r.__onDataZoomReset(e)},r._onDataView=function(e){r.__onDataView(e)},r._onRestore=function(e){r.__onRestore(e)},r._onSaveAsImage=function(e){r.__onSaveAsImage(e)},r._onMagicType=function(e){r.__onMagicType(e)},r._onCustomHandler=function(e){r.__onCustomHandler(e)},r._onmousemove=function(e){return r.__onmousemove(e)},r._onmousedown=function(e){return r.__onmousedown(e)},r._onmouseup=function(e){return r.__onmouseup(e)},r._onclick=function(e){return r.__onclick(e)}}var i=e("./base"),n=e("zrender/shape/Line"),a=e("zrender/shape/Image"),o=e("zrender/shape/Rectangle"),r=e("../util/shape/Icon"),s=e("../config");s.toolbox={zlevel:0,z:6,show:!1,orient:"horizontal",x:"right",y:"top",color:["#1e90ff","#22bb22","#4b0082","#d2691e"],disableColor:"#ddd",effectiveColor:"red",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemSize:16,showTitle:!0,feature:{mark:{show:!1,title:{mark:"辅助线开关",markUndo:"删除辅助线",markClear:"清空辅助线"},lineStyle:{width:1,color:"#1e90ff",type:"dashed"}},dataZoom:{show:!1,title:{dataZoom:"区域缩放",dataZoomReset:"区域缩放åŽé€€"}},dataView:{show:!1,title:"æ•°æ®è§†å›¾",readOnly:!1,lang:["æ•°æ®è§†å›¾","关闭","刷新"]},magicType:{show:!1,title:{line:"折线图切æ¢",bar:"柱形图切æ¢",stack:"堆积",tiled:"平铺",force:"力导å‘布局图切æ¢",chord:"和弦图切æ¢",pie:"饼图切æ¢",funnel:"æ¼æ–—图切æ¢"},type:[]},restore:{show:!1,title:"还原"},saveAsImage:{show:!1,title:"ä¿å­˜ä¸ºå›¾ç‰‡",type:"png",lang:["点击ä¿å­˜"]}}};var l=e("zrender/tool/util"),h=e("zrender/config"),m=e("zrender/tool/event"),V="stack",U="tiled";return t.prototype={type:s.COMPONENT_TYPE_TOOLBOX,_buildShape:function(){this._iconList=[];var e=this.option.toolbox;this._enableColor=e.effectiveColor,this._disableColor=e.disableColor;var t=e.feature,i=[];for(var n in t)if(t[n].show)switch(n){case"mark":i.push({key:n,name:"mark"}),i.push({key:n,name:"markUndo"}),i.push({key:n,name:"markClear"});break;case"magicType":for(var a=0,o=t[n].type.length;o>a;a++)t[n].title[t[n].type[a]+"Chart"]=t[n].title[t[n].type[a]],t[n].option&&(t[n].option[t[n].type[a]+"Chart"]=t[n].option[t[n].type[a]]),i.push({key:n,name:t[n].type[a]+"Chart"});break;case"dataZoom":i.push({key:n,name:"dataZoom"}),i.push({key:n,name:"dataZoomReset"});break;case"saveAsImage":this.canvasSupported&&i.push({key:n,name:"saveAsImage"});break;default:i.push({key:n,name:n})}if(i.length>0){for(var r,n,a=0,o=i.length;o>a;a++)r=i[a].name,n=i[a].key,this._iconList.push(r),this._featureTitle[r]=t[n].title[r]||t[n].title,t[n].icon&&(this._featureIcon[r]=t[n].icon[r]||t[n].icon),t[n].color&&(this._featureColor[r]=t[n].color[r]||t[n].color),t[n].option&&(this._featureOption[r]=t[n].option[r]||t[n].option);this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var a=0,o=this.shapeList.length;o>a;a++)this.zr.addShape(this.shapeList[a]);this._iconShapeMap.mark&&(this._iconDisable(this._iconShapeMap.markUndo),this._iconDisable(this._iconShapeMap.markClear)),this._iconShapeMap.dataZoomReset&&0===this._zoomQueue.length&&this._iconDisable(this._iconShapeMap.dataZoomReset)}},_buildItem:function(){var t,i,n,o,s=this.option.toolbox,l=this._iconList.length,h=this._itemGroupLocation.x,m=this._itemGroupLocation.y,V=s.itemSize,U=s.itemGap,d=s.color instanceof Array?s.color:[s.color],p=this.getFont(s.textStyle);"horizontal"===s.orient?(i=this._itemGroupLocation.y/this.zr.getHeight()<.5?"bottom":"top",n=this._itemGroupLocation.x/this.zr.getWidth()<.5?"left":"right",o=this._itemGroupLocation.y/this.zr.getHeight()<.5?"top":"bottom"):i=this._itemGroupLocation.x/this.zr.getWidth()<.5?"right":"left",this._iconShapeMap={};for(var c=this,u=0;l>u;u++){switch(t={type:"icon",zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:h,y:m,width:V,height:V,iconType:this._iconList[u],lineWidth:1,strokeColor:this._featureColor[this._iconList[u]]||d[u%d.length],brushType:"stroke"},highlightStyle:{lineWidth:1,text:s.showTitle?this._featureTitle[this._iconList[u]]:void 0,textFont:p,textPosition:i,strokeColor:this._featureColor[this._iconList[u]]||d[u%d.length]},hoverable:!0,clickable:!0},this._featureIcon[this._iconList[u]]&&(t.style.image=this._featureIcon[this._iconList[u]].replace(new RegExp("^image:\\/\\/"),""),t.style.opacity=.8,t.highlightStyle.opacity=1,t.type="image"),"horizontal"===s.orient&&(0===u&&"left"===n&&(t.highlightStyle.textPosition="specific",t.highlightStyle.textAlign=n,t.highlightStyle.textBaseline=o,t.highlightStyle.textX=h,t.highlightStyle.textY="top"===o?m+V+10:m-10),u===l-1&&"right"===n&&(t.highlightStyle.textPosition="specific",t.highlightStyle.textAlign=n,t.highlightStyle.textBaseline=o,t.highlightStyle.textX=h+V,t.highlightStyle.textY="top"===o?m+V+10:m-10)),this._iconList[u]){case"mark":t.onclick=c._onMark;break;case"markUndo":t.onclick=c._onMarkUndo;break;case"markClear":t.onclick=c._onMarkClear;break;case"dataZoom":t.onclick=c._onDataZoom;break;case"dataZoomReset":t.onclick=c._onDataZoomReset;break;case"dataView":if(!this._dataView){var y=e("./dataView");this._dataView=new y(this.ecTheme,this.messageCenter,this.zr,this.option,this.myChart)}t.onclick=c._onDataView;break;case"restore":t.onclick=c._onRestore;break;case"saveAsImage":t.onclick=c._onSaveAsImage;break;default:this._iconList[u].match("Chart")?(t._name=this._iconList[u].replace("Chart",""),t.onclick=c._onMagicType):t.onclick=c._onCustomHandler}"icon"===t.type?t=new r(t):"image"===t.type&&(t=new a(t)),this.shapeList.push(t),this._iconShapeMap[this._iconList[u]]=t,"horizontal"===s.orient?h+=V+U:m+=V+U}},_buildBackground:function(){var e=this.option.toolbox,t=this.reformCssArray(this.option.toolbox.padding);this.shapeList.push(new o({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-t[3],y:this._itemGroupLocation.y-t[0],width:this._itemGroupLocation.width+t[3]+t[1],height:this._itemGroupLocation.height+t[0]+t[2],brushType:0===e.borderWidth?"fill":"both",color:e.backgroundColor,strokeColor:e.borderColor,lineWidth:e.borderWidth}}))},_getItemGroupLocation:function(){var e=this.option.toolbox,t=this.reformCssArray(this.option.toolbox.padding),i=this._iconList.length,n=e.itemGap,a=e.itemSize,o=0,r=0;"horizontal"===e.orient?(o=(a+n)*i-n,r=a):(r=(a+n)*i-n,o=a);var s,l=this.zr.getWidth();switch(e.x){case"center":s=Math.floor((l-o)/2);break;case"left":s=t[3]+e.borderWidth;break;case"right":s=l-o-t[1]-e.borderWidth;break;default:s=e.x-0,s=isNaN(s)?0:s}var h,m=this.zr.getHeight();switch(e.y){case"top":h=t[0]+e.borderWidth;break;case"bottom":h=m-r-t[2]-e.borderWidth;break;case"center":h=Math.floor((m-r)/2);break;default:h=e.y-0,h=isNaN(h)?0:h}return{x:s,y:h,width:o,height:r}},__onmousemove:function(e){this._marking&&(this._markShape.style.xEnd=m.getX(e.event),this._markShape.style.yEnd=m.getY(e.event),this.zr.addHoverShape(this._markShape)),this._zooming&&(this._zoomShape.style.width=m.getX(e.event)-this._zoomShape.style.x,this._zoomShape.style.height=m.getY(e.event)-this._zoomShape.style.y,this.zr.addHoverShape(this._zoomShape),this.dom.style.cursor="crosshair",m.stop(e.event)),this._zoomStart&&"pointer"!=this.dom.style.cursor&&"move"!=this.dom.style.cursor&&(this.dom.style.cursor="crosshair")},__onmousedown:function(e){if(!e.target){this._zooming=!0;var t=m.getX(e.event),i=m.getY(e.event),n=this.option.dataZoom||{};return this._zoomShape=new o({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:t,y:i,width:1,height:1,brushType:"both"},highlightStyle:{lineWidth:2,color:n.fillerColor||s.dataZoom.fillerColor,strokeColor:n.handleColor||s.dataZoom.handleColor,brushType:"both"}}),this.zr.addHoverShape(this._zoomShape),!0}},__onmouseup:function(){if(!this._zoomShape||Math.abs(this._zoomShape.style.width)<10||Math.abs(this._zoomShape.style.height)<10)return this._zooming=!1,!0;if(this._zooming&&this.component.dataZoom){this._zooming=!1;var e=this.component.dataZoom.rectZoom(this._zoomShape.style);e&&(this._zoomQueue.push({start:e.start,end:e.end,start2:e.start2,end2:e.end2}),this._iconEnable(this._iconShapeMap.dataZoomReset),this.zr.refreshNextFrame())}return!0},__onclick:function(e){if(!e.target)if(this._marking)this._marking=!1,this._markShapeList.push(this._markShape),this._iconEnable(this._iconShapeMap.markUndo),this._iconEnable(this._iconShapeMap.markClear),this.zr.addShape(this._markShape),this.zr.refreshNextFrame();else if(this._markStart){this._marking=!0;var t=m.getX(e.event),i=m.getY(e.event);this._markShape=new n({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{xStart:t,yStart:i,xEnd:t,yEnd:i,lineWidth:this.query(this.option,"toolbox.feature.mark.lineStyle.width"),strokeColor:this.query(this.option,"toolbox.feature.mark.lineStyle.color"),lineType:this.query(this.option,"toolbox.feature.mark.lineStyle.type")}}),this.zr.addHoverShape(this._markShape)}},__onMark:function(e){var t=e.target;if(this._marking||this._markStart)this._resetMark(),this.zr.refreshNextFrame();else{this._resetZoom(),this.zr.modShape(t.id,{style:{strokeColor:this._enableColor}}),this.zr.refreshNextFrame(),this._markStart=!0;var i=this;setTimeout(function(){i.zr&&i.zr.on(h.EVENT.CLICK,i._onclick)&&i.zr.on(h.EVENT.MOUSEMOVE,i._onmousemove)},10)}return!0},__onMarkUndo:function(){if(this._marking)this._marking=!1;else{var e=this._markShapeList.length;if(e>=1){var t=this._markShapeList[e-1];this.zr.delShape(t.id),this.zr.refreshNextFrame(),this._markShapeList.pop(),1===e&&(this._iconDisable(this._iconShapeMap.markUndo),this._iconDisable(this._iconShapeMap.markClear))}}return!0},__onMarkClear:function(){this._marking&&(this._marking=!1);var e=this._markShapeList.length;if(e>0){for(;e--;)this.zr.delShape(this._markShapeList.pop().id);this._iconDisable(this._iconShapeMap.markUndo),this._iconDisable(this._iconShapeMap.markClear),this.zr.refreshNextFrame()}return!0},__onDataZoom:function(e){var t=e.target;if(this._zooming||this._zoomStart)this._resetZoom(),this.zr.refreshNextFrame(),this.dom.style.cursor="default";else{this._resetMark(),this.zr.modShape(t.id,{style:{strokeColor:this._enableColor}}),this.zr.refreshNextFrame(),this._zoomStart=!0;var i=this;setTimeout(function(){i.zr&&i.zr.on(h.EVENT.MOUSEDOWN,i._onmousedown)&&i.zr.on(h.EVENT.MOUSEUP,i._onmouseup)&&i.zr.on(h.EVENT.MOUSEMOVE,i._onmousemove)},10),this.dom.style.cursor="crosshair"}return!0},__onDataZoomReset:function(){return this._zooming&&(this._zooming=!1),this._zoomQueue.pop(),this._zoomQueue.length>0?this.component.dataZoom.absoluteZoom(this._zoomQueue[this._zoomQueue.length-1]):(this.component.dataZoom.rectZoom(),this._iconDisable(this._iconShapeMap.dataZoomReset),this.zr.refreshNextFrame()),!0},_resetMark:function(){this._marking=!1,this._markStart&&(this._markStart=!1,this._iconShapeMap.mark&&this.zr.modShape(this._iconShapeMap.mark.id,{style:{strokeColor:this._iconShapeMap.mark.highlightStyle.strokeColor}}),this.zr.un(h.EVENT.CLICK,this._onclick),this.zr.un(h.EVENT.MOUSEMOVE,this._onmousemove))},_resetZoom:function(){this._zooming=!1,this._zoomStart&&(this._zoomStart=!1,this._iconShapeMap.dataZoom&&this.zr.modShape(this._iconShapeMap.dataZoom.id,{style:{strokeColor:this._iconShapeMap.dataZoom.highlightStyle.strokeColor}}),this.zr.un(h.EVENT.MOUSEDOWN,this._onmousedown),this.zr.un(h.EVENT.MOUSEUP,this._onmouseup),this.zr.un(h.EVENT.MOUSEMOVE,this._onmousemove))},_iconDisable:function(e){"image"!=e.type?this.zr.modShape(e.id,{hoverable:!1,clickable:!1,style:{strokeColor:this._disableColor}}):this.zr.modShape(e.id,{hoverable:!1,clickable:!1,style:{opacity:.3}})},_iconEnable:function(e){"image"!=e.type?this.zr.modShape(e.id,{hoverable:!0,clickable:!0,style:{strokeColor:e.highlightStyle.strokeColor}}):this.zr.modShape(e.id,{hoverable:!0,clickable:!0,style:{opacity:.8}})},__onDataView:function(){return this._dataView.show(this.option),!0},__onRestore:function(){return this._resetMark(),this._resetZoom(),this.messageCenter.dispatch(s.EVENT.RESTORE,null,null,this.myChart),!0},__onSaveAsImage:function(){var e=this.option.toolbox.feature.saveAsImage,t=e.type||"png";"png"!=t&&"jpeg"!=t&&(t="png");var i;i=this.myChart.isConnected()?this.myChart.getConnectedDataURL(t):this.zr.toDataURL("image/"+t,this.option.backgroundColor&&"rgba(0,0,0,0)"===this.option.backgroundColor.replace(" ","")?"#fff":this.option.backgroundColor);var n=document.createElement("div");n.id="__echarts_download_wrap__",n.style.cssText="position:fixed;z-index:99999;display:block;top:0;left:0;background-color:rgba(33,33,33,0.5);text-align:center;width:100%;height:100%;line-height:"+document.documentElement.clientHeight+"px;";var a=document.createElement("a");a.href=i,a.setAttribute("download",(e.name?e.name:this.option.title&&(this.option.title.text||this.option.title.subtext)?this.option.title.text||this.option.title.subtext:"ECharts")+"."+t),a.innerHTML='<img style="vertical-align:middle" src="'+i+'" title="'+(window.ActiveXObject||"ActiveXObject"in window?"å³é”®->图片å¦å­˜ä¸º":e.lang?e.lang[0]:"点击ä¿å­˜")+'"/>',n.appendChild(a),document.body.appendChild(n),a=null,n=null,setTimeout(function(){var e=document.getElementById("__echarts_download_wrap__");e&&(e.onclick=function(){var e=document.getElementById("__echarts_download_wrap__");e.onclick=null,e.innerHTML="",document.body.removeChild(e),e=null},e=null)},500)},__onMagicType:function(e){this._resetMark();var t=e.target._name;return this._magicType[t]||(this._magicType[t]=!0,t===s.CHART_TYPE_LINE?this._magicType[s.CHART_TYPE_BAR]=!1:t===s.CHART_TYPE_BAR&&(this._magicType[s.CHART_TYPE_LINE]=!1),t===s.CHART_TYPE_PIE?this._magicType[s.CHART_TYPE_FUNNEL]=!1:t===s.CHART_TYPE_FUNNEL&&(this._magicType[s.CHART_TYPE_PIE]=!1),t===s.CHART_TYPE_FORCE?this._magicType[s.CHART_TYPE_CHORD]=!1:t===s.CHART_TYPE_CHORD&&(this._magicType[s.CHART_TYPE_FORCE]=!1),t===V?this._magicType[U]=!1:t===U&&(this._magicType[V]=!1),this.messageCenter.dispatch(s.EVENT.MAGIC_TYPE_CHANGED,e.event,{magicType:this._magicType},this.myChart)),!0},setMagicType:function(e){this._resetMark(),this._magicType=e,!this._isSilence&&this.messageCenter.dispatch(s.EVENT.MAGIC_TYPE_CHANGED,null,{magicType:this._magicType},this.myChart)},__onCustomHandler:function(e){var t=e.target.style.iconType,i=this.option.toolbox.feature[t].onclick;"function"==typeof i&&i.call(this,this.option)},reset:function(e,t){if(t&&this.clear(),this.query(e,"toolbox.show")&&this.query(e,"toolbox.feature.magicType.show")){var i=e.toolbox.feature.magicType.type,n=i.length;for(this._magicMap={};n--;)this._magicMap[i[n]]=!0;n=e.series.length;for(var a,o;n--;)a=e.series[n].type,this._magicMap[a]&&(o=e.xAxis instanceof Array?e.xAxis[e.series[n].xAxisIndex||0]:e.xAxis,o&&"category"===(o.type||"category")&&(o.__boundaryGap=null!=o.boundaryGap?o.boundaryGap:!0),o=e.yAxis instanceof Array?e.yAxis[e.series[n].yAxisIndex||0]:e.yAxis,o&&"category"===o.type&&(o.__boundaryGap=null!=o.boundaryGap?o.boundaryGap:!0),e.series[n].__type=a,e.series[n].__itemStyle=l.clone(e.series[n].itemStyle||{})),(this._magicMap[V]||this._magicMap[U])&&(e.series[n].__stack=e.series[n].stack)}this._magicType=t?{}:this._magicType||{};for(var r in this._magicType)if(this._magicType[r]){this.option=e,this.getMagicOption();break}var s=e.dataZoom;if(s&&s.show){var h=null!=s.start&&s.start>=0&&s.start<=100?s.start:0,m=null!=s.end&&s.end>=0&&s.end<=100?s.end:100;h>m&&(h+=m,m=h-m,h-=m),this._zoomQueue=[{start:h,end:m,start2:0,end2:100}]}else this._zoomQueue=[]},getMagicOption:function(){var e,t;if(this._magicType[s.CHART_TYPE_LINE]||this._magicType[s.CHART_TYPE_BAR]){for(var i=this._magicType[s.CHART_TYPE_LINE]?!1:!0,n=0,a=this.option.series.length;a>n;n++)t=this.option.series[n].type,(t==s.CHART_TYPE_LINE||t==s.CHART_TYPE_BAR)&&(e=this.option.xAxis instanceof Array?this.option.xAxis[this.option.series[n].xAxisIndex||0]:this.option.xAxis,e&&"category"===(e.type||"category")&&(e.boundaryGap=i?!0:e.__boundaryGap),e=this.option.yAxis instanceof Array?this.option.yAxis[this.option.series[n].yAxisIndex||0]:this.option.yAxis,e&&"category"===e.type&&(e.boundaryGap=i?!0:e.__boundaryGap));this._defaultMagic(s.CHART_TYPE_LINE,s.CHART_TYPE_BAR)}if(this._defaultMagic(s.CHART_TYPE_CHORD,s.CHART_TYPE_FORCE),this._defaultMagic(s.CHART_TYPE_PIE,s.CHART_TYPE_FUNNEL),this._magicType[V]||this._magicType[U])for(var n=0,a=this.option.series.length;a>n;n++)this._magicType[V]?(this.option.series[n].stack="_ECHARTS_STACK_KENER_2014_",t=V):this._magicType[U]&&(this.option.series[n].stack=null,t=U),this._featureOption[t+"Chart"]&&l.merge(this.option.series[n],this._featureOption[t+"Chart"]||{},!0);return this.option},_defaultMagic:function(e,t){if(this._magicType[e]||this._magicType[t])for(var i=0,n=this.option.series.length;n>i;i++){var a=this.option.series[i].type;(a==e||a==t)&&(this.option.series[i].type=this._magicType[e]?e:t,this.option.series[i].itemStyle=l.clone(this.option.series[i].__itemStyle),a=this.option.series[i].type,this._featureOption[a+"Chart"]&&l.merge(this.option.series[i],this._featureOption[a+"Chart"]||{},!0))}},silence:function(e){this._isSilence=e},resize:function(){this._resetMark(),this.clear(),this.option&&this.option.toolbox&&this.option.toolbox.show&&this._buildShape(),this._dataView&&this._dataView.resize()},hideDataView:function(){this._dataView&&this._dataView.hide()},clear:function(e){this.zr&&(this.zr.delShape(this.shapeList),this.shapeList=[],e||(this.zr.delShape(this._markShapeList),this._markShapeList=[]))},onbeforDispose:function(){this._dataView&&(this._dataView.dispose(),this._dataView=null),this._markShapeList=null},refresh:function(e){e&&(this._resetMark(),this._resetZoom(),e.toolbox=this.reformOption(e.toolbox),this.option=e,this.clear(!0),e.toolbox.show&&this._buildShape(),this.hideDataView())}},l.inherits(t,i),e("../component").define("toolbox",t),t}),i("echarts/component",[],function(){var e={},t={};return e.define=function(i,n){return t[i]=n,e},e.get=function(e){return t[e]},e}),i("echarts/component/title",["require","./base","zrender/shape/Text","zrender/shape/Rectangle","../config","zrender/tool/util","zrender/tool/area","zrender/tool/color","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Rectangle"),o=e("../config");o.title={zlevel:0,z:6,show:!0,text:"",subtext:"",x:"left",y:"top",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:5,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}};var r=e("zrender/tool/util"),s=e("zrender/tool/area"),l=e("zrender/tool/color");return t.prototype={type:o.COMPONENT_TYPE_TITLE,_buildShape:function(){if(this.titleOption.show){this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildItem:function(){var e=this.titleOption.text,t=this.titleOption.link,i=this.titleOption.target,a=this.titleOption.subtext,o=this.titleOption.sublink,r=this.titleOption.subtarget,s=this.getFont(this.titleOption.textStyle),h=this.getFont(this.titleOption.subtextStyle),m=this._itemGroupLocation.x,V=this._itemGroupLocation.y,U=this._itemGroupLocation.width,d=this._itemGroupLocation.height,p={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{y:V,color:this.titleOption.textStyle.color,text:e,textFont:s,textBaseline:"top"},highlightStyle:{color:l.lift(this.titleOption.textStyle.color,1),brushType:"fill"},hoverable:!1};t&&(p.hoverable=!0,p.clickable=!0,p.onclick=function(){i&&"self"==i?window.location=t:window.open(t)});var c={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{y:V+d,color:this.titleOption.subtextStyle.color,text:a,textFont:h,textBaseline:"bottom"},highlightStyle:{color:l.lift(this.titleOption.subtextStyle.color,1),brushType:"fill"},hoverable:!1};switch(o&&(c.hoverable=!0,c.clickable=!0,c.onclick=function(){r&&"self"==r?window.location=o:window.open(o)}),this.titleOption.x){case"center":p.style.x=c.style.x=m+U/2,p.style.textAlign=c.style.textAlign="center";break;case"left":p.style.x=c.style.x=m,p.style.textAlign=c.style.textAlign="left";break;case"right":p.style.x=c.style.x=m+U,p.style.textAlign=c.style.textAlign="right";break;default:m=this.titleOption.x-0,m=isNaN(m)?0:m,p.style.x=c.style.x=m}this.titleOption.textAlign&&(p.style.textAlign=c.style.textAlign=this.titleOption.textAlign),this.shapeList.push(new n(p)),""!==a&&this.shapeList.push(new n(c))},_buildBackground:function(){var e=this.reformCssArray(this.titleOption.padding);this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.titleOption.borderWidth?"fill":"both",color:this.titleOption.backgroundColor,strokeColor:this.titleOption.borderColor,lineWidth:this.titleOption.borderWidth}}))},_getItemGroupLocation:function(){var e,t=this.reformCssArray(this.titleOption.padding),i=this.titleOption.text,n=this.titleOption.subtext,a=this.getFont(this.titleOption.textStyle),o=this.getFont(this.titleOption.subtextStyle),r=Math.max(s.getTextWidth(i,a),s.getTextWidth(n,o)),l=s.getTextHeight(i,a)+(""===n?0:this.titleOption.itemGap+s.getTextHeight(n,o)),h=this.zr.getWidth();switch(this.titleOption.x){case"center":e=Math.floor((h-r)/2);break;case"left":e=t[3]+this.titleOption.borderWidth;break;case"right":e=h-r-t[1]-this.titleOption.borderWidth;break;default:e=this.titleOption.x-0,e=isNaN(e)?0:e}var m,V=this.zr.getHeight();switch(this.titleOption.y){case"top":m=t[0]+this.titleOption.borderWidth;break;case"bottom":m=V-l-t[2]-this.titleOption.borderWidth;break;case"center":m=Math.floor((V-l)/2);break;default:m=this.titleOption.y-0,m=isNaN(m)?0:m}return{x:e,y:m,width:r,height:l}},refresh:function(e){e&&(this.option=e,this.option.title=this.reformOption(this.option.title),this.titleOption=this.option.title,this.titleOption.textStyle=this.getTextStyle(this.titleOption.textStyle),this.titleOption.subtextStyle=this.getTextStyle(this.titleOption.subtextStyle)),this.clear(),this._buildShape()}},r.inherits(t,i),e("../component").define("title",t),t}),i("echarts/component/tooltip",["require","./base","../util/shape/Cross","zrender/shape/Line","zrender/shape/Rectangle","../config","../util/ecData","zrender/config","zrender/tool/event","zrender/tool/area","zrender/tool/color","zrender/tool/util","zrender/shape/Base","../component"],function(e){function t(e,t,o,r,s){i.call(this,e,t,o,r,s),this.dom=s.dom;var l=this;l._onmousemove=function(e){return l.__onmousemove(e)},l._onglobalout=function(e){return l.__onglobalout(e)},this.zr.on(h.EVENT.MOUSEMOVE,l._onmousemove),this.zr.on(h.EVENT.GLOBALOUT,l._onglobalout),l._hide=function(e){return l.__hide(e)},l._tryShow=function(e){return l.__tryShow(e)},l._refixed=function(e){return l.__refixed(e)},l._setContent=function(e,t){return l.__setContent(e,t)},this._tDom=this._tDom||document.createElement("div"),this._tDom.onselectstart=function(){return!1},this._tDom.onmouseover=function(){l._mousein=!0},this._tDom.onmouseout=function(){l._mousein=!1},this._tDom.className="echarts-tooltip",this._tDom.style.position="absolute",this.hasAppend=!1,this._axisLineShape&&this.zr.delShape(this._axisLineShape.id),this._axisLineShape=new a({zlevel:this.getZlevelBase(),z:this.getZBase(),invisible:!0,hoverable:!1}),this.shapeList.push(this._axisLineShape),this.zr.addShape(this._axisLineShape),this._axisShadowShape&&this.zr.delShape(this._axisShadowShape.id),this._axisShadowShape=new a({zlevel:this.getZlevelBase(),z:1,invisible:!0,hoverable:!1}),this.shapeList.push(this._axisShadowShape),this.zr.addShape(this._axisShadowShape),this._axisCrossShape&&this.zr.delShape(this._axisCrossShape.id),this._axisCrossShape=new n({zlevel:this.getZlevelBase(),z:this.getZBase(),invisible:!0,hoverable:!1}),this.shapeList.push(this._axisCrossShape),this.zr.addShape(this._axisCrossShape),this.showing=!1,this.refresh(r)}var i=e("./base"),n=e("../util/shape/Cross"),a=e("zrender/shape/Line"),o=e("zrender/shape/Rectangle"),r=new o({}),s=e("../config");s.tooltip={zlevel:1,z:8,show:!0,showContent:!0,trigger:"item",islandFormatter:"{a} <br/>{b} : {c}",showDelay:20,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(0,0,0,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,axisPointer:{type:"line",lineStyle:{color:"#48b",width:2,type:"solid"},crossStyle:{color:"#1e90ff",width:1,type:"dashed"},shadowStyle:{color:"rgba(150,150,150,0.3)",width:"auto",type:"default"}},textStyle:{color:"#fff"}};var l=e("../util/ecData"),h=e("zrender/config"),m=e("zrender/tool/event"),V=e("zrender/tool/area"),U=e("zrender/tool/color"),d=e("zrender/tool/util"),p=e("zrender/shape/Base");return t.prototype={type:s.COMPONENT_TYPE_TOOLTIP,_gCssText:"position:absolute;display:block;border-style:solid;white-space:nowrap;",_style:function(e){if(!e)return"";var t=[];if(e.transitionDuration){var i="left "+e.transitionDuration+"s,top "+e.transitionDuration+"s";t.push("transition:"+i),t.push("-moz-transition:"+i),t.push("-webkit-transition:"+i),t.push("-o-transition:"+i)}e.backgroundColor&&(t.push("background-Color:"+U.toHex(e.backgroundColor)),t.push("filter:alpha(opacity=70)"),t.push("background-Color:"+e.backgroundColor)),null!=e.borderWidth&&t.push("border-width:"+e.borderWidth+"px"),null!=e.borderColor&&t.push("border-color:"+e.borderColor),null!=e.borderRadius&&(t.push("border-radius:"+e.borderRadius+"px"),t.push("-moz-border-radius:"+e.borderRadius+"px"),t.push("-webkit-border-radius:"+e.borderRadius+"px"),t.push("-o-border-radius:"+e.borderRadius+"px"));var n=e.textStyle;n&&(n.color&&t.push("color:"+n.color),n.decoration&&t.push("text-decoration:"+n.decoration),n.align&&t.push("text-align:"+n.align),n.fontFamily&&t.push("font-family:"+n.fontFamily),n.fontSize&&t.push("font-size:"+n.fontSize+"px"),n.fontSize&&t.push("line-height:"+Math.round(3*n.fontSize/2)+"px"),n.fontStyle&&t.push("font-style:"+n.fontStyle),n.fontWeight&&t.push("font-weight:"+n.fontWeight));var a=e.padding;return null!=a&&(a=this.reformCssArray(a),t.push("padding:"+a[0]+"px "+a[1]+"px "+a[2]+"px "+a[3]+"px")),t=t.join(";")+";"},__hide:function(){this._lastDataIndex=-1,this._lastSeriesIndex=-1,this._lastItemTriggerId=-1,this._tDom&&(this._tDom.style.display="none");var e=!1;this._axisLineShape.invisible||(this._axisLineShape.invisible=!0,
-this.zr.modShape(this._axisLineShape.id),e=!0),this._axisShadowShape.invisible||(this._axisShadowShape.invisible=!0,this.zr.modShape(this._axisShadowShape.id),e=!0),this._axisCrossShape.invisible||(this._axisCrossShape.invisible=!0,this.zr.modShape(this._axisCrossShape.id),e=!0),this._lastTipShape&&this._lastTipShape.tipShape.length>0&&(this.zr.delShape(this._lastTipShape.tipShape),this._lastTipShape=!1,this.shapeList.length=2),e&&this.zr.refreshNextFrame(),this.showing=!1},_show:function(e,t,i,n){var a=this._tDom.offsetHeight,o=this._tDom.offsetWidth;e&&("function"==typeof e&&(e=e([t,i])),e instanceof Array&&(t=e[0],i=e[1])),t+o>this._zrWidth&&(t-=o+40),i+a>this._zrHeight&&(i-=a-20),20>i&&(i=0),this._tDom.style.cssText=this._gCssText+this._defaultCssText+(n?n:"")+"left:"+t+"px;top:"+i+"px;",(10>a||10>o)&&setTimeout(this._refixed,20),this.showing=!0},__refixed:function(){if(this._tDom){var e="",t=this._tDom.offsetHeight,i=this._tDom.offsetWidth;this._tDom.offsetLeft+i>this._zrWidth&&(e+="left:"+(this._zrWidth-i-20)+"px;"),this._tDom.offsetTop+t>this._zrHeight&&(e+="top:"+(this._zrHeight-t-10)+"px;"),""!==e&&(this._tDom.style.cssText+=e)}},__tryShow:function(){var e,t;if(this._curTarget){if("island"===this._curTarget._type&&this.option.tooltip.show)return void this._showItemTrigger();var i=l.get(this._curTarget,"series"),n=l.get(this._curTarget,"data");e=this.deepQuery([n,i,this.option],"tooltip.show"),null!=i&&null!=n&&e?(t=this.deepQuery([n,i,this.option],"tooltip.trigger"),"axis"===t?this._showAxisTrigger(i.xAxisIndex,i.yAxisIndex,l.get(this._curTarget,"dataIndex")):this._showItemTrigger()):(clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),this._hidingTicket=setTimeout(this._hide,this._hideDelay))}else this._findPolarTrigger()||this._findAxisTrigger()},_findAxisTrigger:function(){if(!this.component.xAxis||!this.component.yAxis)return void(this._hidingTicket=setTimeout(this._hide,this._hideDelay));for(var e,t,i=this.option.series,n=0,a=i.length;a>n;n++)if("axis"===this.deepQuery([i[n],this.option],"tooltip.trigger"))return e=i[n].xAxisIndex||0,t=i[n].yAxisIndex||0,this.component.xAxis.getAxis(e)&&this.component.xAxis.getAxis(e).type===s.COMPONENT_TYPE_AXIS_CATEGORY?void this._showAxisTrigger(e,t,this._getNearestDataIndex("x",this.component.xAxis.getAxis(e))):this.component.yAxis.getAxis(t)&&this.component.yAxis.getAxis(t).type===s.COMPONENT_TYPE_AXIS_CATEGORY?void this._showAxisTrigger(e,t,this._getNearestDataIndex("y",this.component.yAxis.getAxis(t))):void this._showAxisTrigger(e,t,-1);"cross"===this.option.tooltip.axisPointer.type&&this._showAxisTrigger(-1,-1,-1)},_findPolarTrigger:function(){if(!this.component.polar)return!1;var e,t=m.getX(this._event),i=m.getY(this._event),n=this.component.polar.getNearestIndex([t,i]);return n?(e=n.valueIndex,n=n.polarIndex):n=-1,-1!=n?this._showPolarTrigger(n,e):!1},_getNearestDataIndex:function(e,t){var i=-1,n=m.getX(this._event),a=m.getY(this._event);if("x"===e){for(var o,r,s=this.component.grid.getXend(),l=t.getCoordByIndex(i);s>l&&(r=l,n>=l);)o=l,l=t.getCoordByIndex(++i);return 0>=i?i=0:r-n>=n-o?i-=1:null==t.getNameByIndex(i)&&(i-=1),i}for(var h,V,U=this.component.grid.getY(),l=t.getCoordByIndex(i);l>U&&(h=l,l>=a);)V=l,l=t.getCoordByIndex(++i);return 0>=i?i=0:a-h>=V-a?i-=1:null==t.getNameByIndex(i)&&(i-=1),i},_showAxisTrigger:function(e,t,i){if(!this._event.connectTrigger&&this.messageCenter.dispatch(s.EVENT.TOOLTIP_IN_GRID,this._event,null,this.myChart),null==this.component.xAxis||null==this.component.yAxis||null==e||null==t)return clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),void(this._hidingTicket=setTimeout(this._hide,this._hideDelay));var n,a,o,r,l=this.option.series,h=[],V=[],U="";if("axis"===this.option.tooltip.trigger){if(!this.option.tooltip.show)return;a=this.option.tooltip.formatter,o=this.option.tooltip.position}var d,p,c=-1!=e&&this.component.xAxis.getAxis(e).type===s.COMPONENT_TYPE_AXIS_CATEGORY?"xAxis":-1!=t&&this.component.yAxis.getAxis(t).type===s.COMPONENT_TYPE_AXIS_CATEGORY?"yAxis":!1;if(c){var u="xAxis"==c?e:t;n=this.component[c].getAxis(u);for(var y=0,g=l.length;g>y;y++)this._isSelected(l[y].name)&&l[y][c+"Index"]===u&&"axis"===this.deepQuery([l[y],this.option],"tooltip.trigger")&&(r=this.query(l[y],"tooltip.showContent")||r,a=this.query(l[y],"tooltip.formatter")||a,o=this.query(l[y],"tooltip.position")||o,U+=this._style(this.query(l[y],"tooltip")),null!=l[y].stack&&"xAxis"==c?(h.unshift(l[y]),V.unshift(y)):(h.push(l[y]),V.push(y)));this.messageCenter.dispatch(s.EVENT.TOOLTIP_HOVER,this._event,{seriesIndex:V,dataIndex:i},this.myChart);var b;"xAxis"==c?(d=this.subPixelOptimize(n.getCoordByIndex(i),this._axisLineWidth),p=m.getY(this._event),b=[d,this.component.grid.getY(),d,this.component.grid.getYend()]):(d=m.getX(this._event),p=this.subPixelOptimize(n.getCoordByIndex(i),this._axisLineWidth),b=[this.component.grid.getX(),p,this.component.grid.getXend(),p]),this._styleAxisPointer(h,b[0],b[1],b[2],b[3],n.getGap(),d,p)}else d=m.getX(this._event),p=m.getY(this._event),this._styleAxisPointer(l,this.component.grid.getX(),p,this.component.grid.getXend(),p,0,d,p),i>=0?this._showItemTrigger(!0):(clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),this._tDom.style.display="none");if(h.length>0){if(this._lastItemTriggerId=-1,this._lastDataIndex!=i||this._lastSeriesIndex!=V[0]){this._lastDataIndex=i,this._lastSeriesIndex=V[0];var f,k;if("function"==typeof a){for(var x=[],y=0,g=h.length;g>y;y++)f=h[y].data[i],k=this.getDataFromOption(f,"-"),x.push({seriesIndex:V[y],seriesName:h[y].name||"",series:h[y],dataIndex:i,data:f,name:n.getNameByIndex(i),value:k,0:h[y].name||"",1:n.getNameByIndex(i),2:k,3:f});this._curTicket="axis:"+i,this._tDom.innerHTML=a.call(this.myChart,x,this._curTicket,this._setContent)}else if("string"==typeof a){this._curTicket=0/0,a=a.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}");for(var y=0,g=h.length;g>y;y++)a=a.replace("{a"+y+"}",this._encodeHTML(h[y].name||"")),a=a.replace("{b"+y+"}",this._encodeHTML(n.getNameByIndex(i))),f=h[y].data[i],f=this.getDataFromOption(f,"-"),a=a.replace("{c"+y+"}",f instanceof Array?f:this.numAddCommas(f));this._tDom.innerHTML=a}else{this._curTicket=0/0,a=this._encodeHTML(n.getNameByIndex(i));for(var y=0,g=h.length;g>y;y++)a+="<br/>"+this._encodeHTML(h[y].name||"")+" : ",f=h[y].data[i],f=this.getDataFromOption(f,"-"),a+=f instanceof Array?f:this.numAddCommas(f);this._tDom.innerHTML=a}}if(r===!1||!this.option.tooltip.showContent)return;this.hasAppend||(this._tDom.style.left=this._zrWidth/2+"px",this._tDom.style.top=this._zrHeight/2+"px",this.dom.firstChild.appendChild(this._tDom),this.hasAppend=!0),this._show(o,d+10,p+10,U)}},_showPolarTrigger:function(e,t){if(null==this.component.polar||null==e||null==t||0>t)return!1;var i,n,a,o=this.option.series,r=[],s=[],l="";if("axis"===this.option.tooltip.trigger){if(!this.option.tooltip.show)return!1;i=this.option.tooltip.formatter,n=this.option.tooltip.position}for(var h=this.option.polar[e].indicator[t].text,V=0,U=o.length;U>V;V++)this._isSelected(o[V].name)&&o[V].polarIndex===e&&"axis"===this.deepQuery([o[V],this.option],"tooltip.trigger")&&(a=this.query(o[V],"tooltip.showContent")||a,i=this.query(o[V],"tooltip.formatter")||i,n=this.query(o[V],"tooltip.position")||n,l+=this._style(this.query(o[V],"tooltip")),r.push(o[V]),s.push(V));if(r.length>0){for(var d,p,c,u=[],V=0,U=r.length;U>V;V++){d=r[V].data;for(var y=0,g=d.length;g>y;y++)p=d[y],this._isSelected(p.name)&&(p=null!=p?p:{name:"",value:{dataIndex:"-"}},c=this.getDataFromOption(p.value[t]),u.push({seriesIndex:s[V],seriesName:r[V].name||"",series:r[V],dataIndex:t,data:p,name:p.name,indicator:h,value:c,0:r[V].name||"",1:p.name,2:c,3:h}))}if(u.length<=0)return;if(this._lastItemTriggerId=-1,this._lastDataIndex!=t||this._lastSeriesIndex!=s[0])if(this._lastDataIndex=t,this._lastSeriesIndex=s[0],"function"==typeof i)this._curTicket="axis:"+t,this._tDom.innerHTML=i.call(this.myChart,u,this._curTicket,this._setContent);else if("string"==typeof i){i=i.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}").replace("{d}","{d0}");for(var V=0,U=u.length;U>V;V++)i=i.replace("{a"+V+"}",this._encodeHTML(u[V].seriesName)),i=i.replace("{b"+V+"}",this._encodeHTML(u[V].name)),i=i.replace("{c"+V+"}",this.numAddCommas(u[V].value)),i=i.replace("{d"+V+"}",this._encodeHTML(u[V].indicator));this._tDom.innerHTML=i}else{i=this._encodeHTML(u[0].name)+"<br/>"+this._encodeHTML(u[0].indicator)+" : "+this.numAddCommas(u[0].value);for(var V=1,U=u.length;U>V;V++)i+="<br/>"+this._encodeHTML(u[V].name)+"<br/>",i+=this._encodeHTML(u[V].indicator)+" : "+this.numAddCommas(u[V].value);this._tDom.innerHTML=i}if(a===!1||!this.option.tooltip.showContent)return;return this.hasAppend||(this._tDom.style.left=this._zrWidth/2+"px",this._tDom.style.top=this._zrHeight/2+"px",this.dom.firstChild.appendChild(this._tDom),this.hasAppend=!0),this._show(n,m.getX(this._event),m.getY(this._event),l),!0}},_showItemTrigger:function(e){if(this._curTarget){var t,i,n,a=l.get(this._curTarget,"series"),o=l.get(this._curTarget,"seriesIndex"),r=l.get(this._curTarget,"data"),h=l.get(this._curTarget,"dataIndex"),V=l.get(this._curTarget,"name"),U=l.get(this._curTarget,"value"),d=l.get(this._curTarget,"special"),p=l.get(this._curTarget,"special2"),c=[r,a,this.option],u="";if("island"!=this._curTarget._type){var y=e?"axis":"item";this.option.tooltip.trigger===y&&(t=this.option.tooltip.formatter,i=this.option.tooltip.position),this.query(a,"tooltip.trigger")===y&&(n=this.query(a,"tooltip.showContent")||n,t=this.query(a,"tooltip.formatter")||t,i=this.query(a,"tooltip.position")||i,u+=this._style(this.query(a,"tooltip"))),n=this.query(r,"tooltip.showContent")||n,t=this.query(r,"tooltip.formatter")||t,i=this.query(r,"tooltip.position")||i,u+=this._style(this.query(r,"tooltip"))}else this._lastItemTriggerId=0/0,n=this.deepQuery(c,"tooltip.showContent"),t=this.deepQuery(c,"tooltip.islandFormatter"),i=this.deepQuery(c,"tooltip.islandPosition");this._lastDataIndex=-1,this._lastSeriesIndex=-1,this._lastItemTriggerId!==this._curTarget.id&&(this._lastItemTriggerId=this._curTarget.id,"function"==typeof t?(this._curTicket=(a.name||"")+":"+h,this._tDom.innerHTML=t.call(this.myChart,{seriesIndex:o,seriesName:a.name||"",series:a,dataIndex:h,data:r,name:V,value:U,percent:d,indicator:d,value2:p,indicator2:p,0:a.name||"",1:V,2:U,3:d,4:p,5:r,6:o,7:h},this._curTicket,this._setContent)):"string"==typeof t?(this._curTicket=0/0,t=t.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}"),t=t.replace("{a0}",this._encodeHTML(a.name||"")).replace("{b0}",this._encodeHTML(V)).replace("{c0}",U instanceof Array?U:this.numAddCommas(U)),t=t.replace("{d}","{d0}").replace("{d0}",d||""),t=t.replace("{e}","{e0}").replace("{e0}",l.get(this._curTarget,"special2")||""),this._tDom.innerHTML=t):(this._curTicket=0/0,this._tDom.innerHTML=a.type===s.CHART_TYPE_RADAR&&d?this._itemFormatter.radar.call(this,a,V,U,d):a.type===s.CHART_TYPE_EVENTRIVER?this._itemFormatter.eventRiver.call(this,a,V,U,r):""+(null!=a.name?this._encodeHTML(a.name)+"<br/>":"")+(""===V?"":this._encodeHTML(V)+" : ")+(U instanceof Array?U:this.numAddCommas(U))));var g=m.getX(this._event),b=m.getY(this._event);this.deepQuery(c,"tooltip.axisPointer.show")&&this.component.grid?this._styleAxisPointer([a],this.component.grid.getX(),b,this.component.grid.getXend(),b,0,g,b):this._hide(),n!==!1&&this.option.tooltip.showContent&&(this.hasAppend||(this._tDom.style.left=this._zrWidth/2+"px",this._tDom.style.top=this._zrHeight/2+"px",this.dom.firstChild.appendChild(this._tDom),this.hasAppend=!0),this._show(i,g+20,b-20,u))}},_itemFormatter:{radar:function(e,t,i,n){var a="";a+=this._encodeHTML(""===t?e.name||"":t),a+=""===a?"":"<br />";for(var o=0;o<n.length;o++)a+=this._encodeHTML(n[o].text)+" : "+this.numAddCommas(i[o])+"<br />";return a},chord:function(e,t,i,n,a){if(null==a)return this._encodeHTML(t)+" ("+this.numAddCommas(i)+")";var o=this._encodeHTML(t),r=this._encodeHTML(n);return""+(null!=e.name?this._encodeHTML(e.name)+"<br/>":"")+o+" -> "+r+" ("+this.numAddCommas(i)+")<br />"+r+" -> "+o+" ("+this.numAddCommas(a)+")"},eventRiver:function(e,t,i,n){var a="";a+=this._encodeHTML(""===e.name?"":e.name+" : "),a+=this._encodeHTML(t),a+=""===a?"":"<br />",n=n.evolution;for(var o=0,r=n.length;r>o;o++)a+='<div style="padding-top:5px;">',n[o].detail&&(n[o].detail.img&&(a+='<img src="'+n[o].detail.img+'" style="float:left;width:40px;height:40px;">'),a+='<div style="margin-left:45px;">'+n[o].time+"<br/>",a+='<a href="'+n[o].detail.link+'" target="_blank">',a+=n[o].detail.text+"</a></div>",a+="</div>");return a}},_styleAxisPointer:function(e,t,i,n,a,o,r,s){if(e.length>0){var l,h,m=this.option.tooltip.axisPointer,V=m.type,U={line:{},cross:{},shadow:{}};for(var d in U)U[d].color=m[d+"Style"].color,U[d].width=m[d+"Style"].width,U[d].type=m[d+"Style"].type;for(var p=0,c=e.length;c>p;p++)l=e[p],h=this.query(l,"tooltip.axisPointer.type"),V=h||V,h&&(U[h].color=this.query(l,"tooltip.axisPointer."+h+"Style.color")||U[h].color,U[h].width=this.query(l,"tooltip.axisPointer."+h+"Style.width")||U[h].width,U[h].type=this.query(l,"tooltip.axisPointer."+h+"Style.type")||U[h].type);if("line"===V){var u=U.line.width,y=t==n;this._axisLineShape.style={xStart:y?this.subPixelOptimize(t,u):t,yStart:y?i:this.subPixelOptimize(i,u),xEnd:y?this.subPixelOptimize(n,u):n,yEnd:y?a:this.subPixelOptimize(a,u),strokeColor:U.line.color,lineWidth:u,lineType:U.line.type},this._axisLineShape.invisible=!1,this.zr.modShape(this._axisLineShape.id)}else if("cross"===V){var g=U.cross.width;this._axisCrossShape.style={brushType:"stroke",rect:this.component.grid.getArea(),x:this.subPixelOptimize(r,g),y:this.subPixelOptimize(s,g),text:("( "+this.component.xAxis.getAxis(0).getValueFromCoord(r)+" , "+this.component.yAxis.getAxis(0).getValueFromCoord(s)+" )").replace(" , "," ").replace(" , "," "),textPosition:"specific",strokeColor:U.cross.color,lineWidth:g,lineType:U.cross.type},this.component.grid.getXend()-r>100?(this._axisCrossShape.style.textAlign="left",this._axisCrossShape.style.textX=r+10):(this._axisCrossShape.style.textAlign="right",this._axisCrossShape.style.textX=r-10),s-this.component.grid.getY()>50?(this._axisCrossShape.style.textBaseline="bottom",this._axisCrossShape.style.textY=s-10):(this._axisCrossShape.style.textBaseline="top",this._axisCrossShape.style.textY=s+10),this._axisCrossShape.invisible=!1,this.zr.modShape(this._axisCrossShape.id)}else"shadow"===V&&((null==U.shadow.width||"auto"===U.shadow.width||isNaN(U.shadow.width))&&(U.shadow.width=o),t===n?Math.abs(this.component.grid.getX()-t)<2?(U.shadow.width/=2,t=n+=U.shadow.width/2):Math.abs(this.component.grid.getXend()-t)<2&&(U.shadow.width/=2,t=n-=U.shadow.width/2):i===a&&(Math.abs(this.component.grid.getY()-i)<2?(U.shadow.width/=2,i=a+=U.shadow.width/2):Math.abs(this.component.grid.getYend()-i)<2&&(U.shadow.width/=2,i=a-=U.shadow.width/2)),this._axisShadowShape.style={xStart:t,yStart:i,xEnd:n,yEnd:a,strokeColor:U.shadow.color,lineWidth:U.shadow.width},this._axisShadowShape.invisible=!1,this.zr.modShape(this._axisShadowShape.id));this.zr.refreshNextFrame()}},__onmousemove:function(e){if(clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),!this._mousein||!this._enterable){var t=e.target,i=m.getX(e.event),n=m.getY(e.event);if(t){this._curTarget=t,this._event=e.event,this._event.zrenderX=i,this._event.zrenderY=n;var a;if(this._needAxisTrigger&&this.component.polar&&-1!=(a=this.component.polar.isInside([i,n])))for(var o=this.option.series,l=0,h=o.length;h>l;l++)if(o[l].polarIndex===a&&"axis"===this.deepQuery([o[l],this.option],"tooltip.trigger")){this._curTarget=null;break}this._showingTicket=setTimeout(this._tryShow,this._showDelay)}else this._curTarget=!1,this._event=e.event,this._event.zrenderX=i,this._event.zrenderY=n,this._needAxisTrigger&&this.component.grid&&V.isInside(r,this.component.grid.getArea(),i,n)?this._showingTicket=setTimeout(this._tryShow,this._showDelay):this._needAxisTrigger&&this.component.polar&&-1!=this.component.polar.isInside([i,n])?this._showingTicket=setTimeout(this._tryShow,this._showDelay):(!this._event.connectTrigger&&this.messageCenter.dispatch(s.EVENT.TOOLTIP_OUT_GRID,this._event,null,this.myChart),this._hidingTicket=setTimeout(this._hide,this._hideDelay))}},__onglobalout:function(){clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),this._hidingTicket=setTimeout(this._hide,this._hideDelay)},__setContent:function(e,t){this._tDom&&(e===this._curTicket&&(this._tDom.innerHTML=t),setTimeout(this._refixed,20))},ontooltipHover:function(e,t){if(!this._lastTipShape||this._lastTipShape&&this._lastTipShape.dataIndex!=e.dataIndex){this._lastTipShape&&this._lastTipShape.tipShape.length>0&&(this.zr.delShape(this._lastTipShape.tipShape),this.shapeList.length=2);for(var i=0,n=t.length;n>i;i++)t[i].zlevel=this.getZlevelBase(),t[i].z=this.getZBase(),t[i].style=p.prototype.getHighlightStyle(t[i].style,t[i].highlightStyle),t[i].draggable=!1,t[i].hoverable=!1,t[i].clickable=!1,t[i].ondragend=null,t[i].ondragover=null,t[i].ondrop=null,this.shapeList.push(t[i]),this.zr.addShape(t[i]);this._lastTipShape={dataIndex:e.dataIndex,tipShape:t}}},ondragend:function(){this._hide()},onlegendSelected:function(e){this._selectedMap=e.selected},_setSelectedMap:function(){this._selectedMap=this.component.legend?d.clone(this.component.legend.getSelectedMap()):{}},_isSelected:function(e){return null!=this._selectedMap[e]?this._selectedMap[e]:!0},showTip:function(e){if(e){var t,i=this.option.series;if(null!=e.seriesIndex)t=e.seriesIndex;else for(var n=e.seriesName,a=0,o=i.length;o>a;a++)if(i[a].name===n){t=a;break}var r=i[t];if(null!=r){var m=this.myChart.chart[r.type],V="axis"===this.deepQuery([r,this.option],"tooltip.trigger");if(m)if(V){var U=e.dataIndex;switch(m.type){case s.CHART_TYPE_LINE:case s.CHART_TYPE_BAR:case s.CHART_TYPE_K:case s.CHART_TYPE_RADAR:if(null==this.component.polar||r.data[0].value.length<=U)return;var d=r.polarIndex||0,p=this.component.polar.getVector(d,U,"max");this._event={zrenderX:p[0],zrenderY:p[1]},this._showPolarTrigger(d,U)}}else{var c,u,y=m.shapeList;switch(m.type){case s.CHART_TYPE_LINE:case s.CHART_TYPE_BAR:case s.CHART_TYPE_K:case s.CHART_TYPE_TREEMAP:case s.CHART_TYPE_SCATTER:for(var U=e.dataIndex,a=0,o=y.length;o>a;a++)if(null==y[a]._mark&&l.get(y[a],"seriesIndex")==t&&l.get(y[a],"dataIndex")==U){this._curTarget=y[a],c=y[a].style.x,u=m.type!=s.CHART_TYPE_K?y[a].style.y:y[a].style.y[0];break}break;case s.CHART_TYPE_RADAR:for(var U=e.dataIndex,a=0,o=y.length;o>a;a++)if("polygon"===y[a].type&&l.get(y[a],"seriesIndex")==t&&l.get(y[a],"dataIndex")==U){this._curTarget=y[a];var p=this.component.polar.getCenter(r.polarIndex||0);c=p[0],u=p[1];break}break;case s.CHART_TYPE_PIE:for(var g=e.name,a=0,o=y.length;o>a;a++)if("sector"===y[a].type&&l.get(y[a],"seriesIndex")==t&&l.get(y[a],"name")==g){this._curTarget=y[a];var b=this._curTarget.style,f=(b.startAngle+b.endAngle)/2*Math.PI/180;c=this._curTarget.style.x+Math.cos(f)*b.r/1.5,u=this._curTarget.style.y-Math.sin(f)*b.r/1.5;break}break;case s.CHART_TYPE_MAP:for(var g=e.name,k=r.mapType,a=0,o=y.length;o>a;a++)if("text"===y[a].type&&y[a]._mapType===k&&y[a].style._name===g){this._curTarget=y[a],c=this._curTarget.style.x+this._curTarget.position[0],u=this._curTarget.style.y+this._curTarget.position[1];break}break;case s.CHART_TYPE_CHORD:for(var g=e.name,a=0,o=y.length;o>a;a++)if("sector"===y[a].type&&l.get(y[a],"name")==g){this._curTarget=y[a];var b=this._curTarget.style,f=(b.startAngle+b.endAngle)/2*Math.PI/180;return c=this._curTarget.style.x+Math.cos(f)*(b.r-2),u=this._curTarget.style.y-Math.sin(f)*(b.r-2),void this.zr.trigger(h.EVENT.MOUSEMOVE,{zrenderX:c,zrenderY:u})}break;case s.CHART_TYPE_FORCE:for(var g=e.name,a=0,o=y.length;o>a;a++)if("circle"===y[a].type&&l.get(y[a],"name")==g){this._curTarget=y[a],c=this._curTarget.position[0],u=this._curTarget.position[1];break}}null!=c&&null!=u&&(this._event={zrenderX:c,zrenderY:u},this.zr.addHoverShape(this._curTarget),this.zr.refreshHover(),this._showItemTrigger())}}}},hideTip:function(){this._hide()},refresh:function(e){if(this._zrHeight=this.zr.getHeight(),this._zrWidth=this.zr.getWidth(),this._lastTipShape&&this._lastTipShape.tipShape.length>0&&this.zr.delShape(this._lastTipShape.tipShape),this._lastTipShape=!1,this.shapeList.length=2,this._lastDataIndex=-1,this._lastSeriesIndex=-1,this._lastItemTriggerId=-1,e){this.option=e,this.option.tooltip=this.reformOption(this.option.tooltip),this.option.tooltip.textStyle=d.merge(this.option.tooltip.textStyle,this.ecTheme.textStyle),this._needAxisTrigger=!1,"axis"===this.option.tooltip.trigger&&(this._needAxisTrigger=!0);for(var t=this.option.series,i=0,n=t.length;n>i;i++)if("axis"===this.query(t[i],"tooltip.trigger")){this._needAxisTrigger=!0;break}this._showDelay=this.option.tooltip.showDelay,this._hideDelay=this.option.tooltip.hideDelay,this._defaultCssText=this._style(this.option.tooltip),this._setSelectedMap(),this._axisLineWidth=this.option.tooltip.axisPointer.lineStyle.width,this._enterable=this.option.tooltip.enterable,!this._enterable&&this._tDom.className.indexOf(h.elementClassName)<0&&(this._tDom.className+=" "+h.elementClassName)}if(this.showing){var a=this;setTimeout(function(){a.zr.trigger(h.EVENT.MOUSEMOVE,a.zr.handler._event)},50)}},onbeforDispose:function(){this._lastTipShape&&this._lastTipShape.tipShape.length>0&&this.zr.delShape(this._lastTipShape.tipShape),clearTimeout(this._hidingTicket),clearTimeout(this._showingTicket),this.zr.un(h.EVENT.MOUSEMOVE,this._onmousemove),this.zr.un(h.EVENT.GLOBALOUT,this._onglobalout),this.hasAppend&&this.dom.firstChild&&this.dom.firstChild.removeChild(this._tDom),this._tDom=null},_encodeHTML:function(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}},d.inherits(t,i),e("../component").define("tooltip",t),t}),i("echarts/component/legend",["require","./base","zrender/shape/Text","zrender/shape/Rectangle","zrender/shape/Sector","../util/shape/Icon","../util/shape/Candle","../config","zrender/tool/util","zrender/tool/area","../component"],function(e){function t(e,t,n,a,o){if(!this.query(a,"legend.data"))return void console.error("option.legend.data has not been defined.");i.call(this,e,t,n,a,o);var r=this;r._legendSelected=function(e){r.__legendSelected(e)},r._dispatchHoverLink=function(e){return r.__dispatchHoverLink(e)},this._colorIndex=0,this._colorMap={},this._selectedMap={},this._hasDataMap={},this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Rectangle"),o=e("zrender/shape/Sector"),r=e("../util/shape/Icon"),s=e("../util/shape/Candle"),l=e("../config");l.legend={zlevel:0,z:4,show:!0,orient:"horizontal",x:"center",y:"top",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemWidth:20,itemHeight:14,textStyle:{color:"#333"},selectedMode:!0};var h=e("zrender/tool/util"),m=e("zrender/tool/area");t.prototype={type:l.COMPONENT_TYPE_LEGEND,_buildShape:function(){if(this.legendOption.show){this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildItem:function(){var e,t,i,a,o,s,l,V,U=this.legendOption.data,d=U.length,p=this.legendOption.textStyle,c=this.zr.getWidth(),u=this.zr.getHeight(),y=this._itemGroupLocation.x,g=this._itemGroupLocation.y,b=this.legendOption.itemWidth,f=this.legendOption.itemHeight,k=this.legendOption.itemGap;"vertical"===this.legendOption.orient&&"right"===this.legendOption.x&&(y=this._itemGroupLocation.x+this._itemGroupLocation.width-b);for(var x=0;d>x;x++)o=h.merge(U[x].textStyle||{},p),s=this.getFont(o),e=this._getName(U[x]),l=this._getFormatterName(e),""!==e?(t=U[x].icon||this._getSomethingByName(e).type,V=this.getColor(e),"horizontal"===this.legendOption.orient?200>c-y&&b+5+m.getTextWidth(l,s)+(x===d-1||""===U[x+1]?0:k)>=c-y&&(y=this._itemGroupLocation.x,g+=f+k):200>u-g&&f+(x===d-1||""===U[x+1]?0:k)>=u-g&&("right"===this.legendOption.x?y-=this._itemGroupLocation.maxWidth+k:y+=this._itemGroupLocation.maxWidth+k,g=this._itemGroupLocation.y),i=this._getItemShapeByType(y,g,b,f,this._selectedMap[e]&&this._hasDataMap[e]?V:"#ccc",t,V),i._name=e,i=new r(i),a={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:y+b+5,y:g+f/2,color:this._selectedMap[e]?"auto"===o.color?V:o.color:"#ccc",text:l,textFont:s,textBaseline:"middle"},highlightStyle:{color:V,brushType:"fill"},hoverable:!!this.legendOption.selectedMode,clickable:!!this.legendOption.selectedMode},"vertical"===this.legendOption.orient&&"right"===this.legendOption.x&&(a.style.x-=b+10,a.style.textAlign="right"),a._name=e,a=new n(a),this.legendOption.selectedMode&&(i.onclick=a.onclick=this._legendSelected,i.onmouseover=a.onmouseover=this._dispatchHoverLink,i.hoverConnect=a.id,a.hoverConnect=i.id),this.shapeList.push(i),this.shapeList.push(a),"horizontal"===this.legendOption.orient?y+=b+5+m.getTextWidth(l,s)+k:g+=f+k):"horizontal"===this.legendOption.orient?(y=this._itemGroupLocation.x,g+=f+k):("right"===this.legendOption.x?y-=this._itemGroupLocation.maxWidth+k:y+=this._itemGroupLocation.maxWidth+k,g=this._itemGroupLocation.y);"horizontal"===this.legendOption.orient&&"center"===this.legendOption.x&&g!=this._itemGroupLocation.y&&this._mLineOptimize()},_getName:function(e){return"undefined"!=typeof e.name?e.name:e},_getFormatterName:function(e){var t,i=this.legendOption.formatter;return t="function"==typeof i?i.call(this.myChart,e):"string"==typeof i?i.replace("{name}",e):e},_getFormatterNameFromData:function(e){var t=this._getName(e);return this._getFormatterName(t)},_mLineOptimize:function(){for(var e=[],t=this._itemGroupLocation.x,i=2,n=this.shapeList.length;n>i;i++)this.shapeList[i].style.x===t?e.push((this._itemGroupLocation.width-(this.shapeList[i-1].style.x+m.getTextWidth(this.shapeList[i-1].style.text,this.shapeList[i-1].style.textFont)-t))/2):i===n-1&&e.push((this._itemGroupLocation.width-(this.shapeList[i].style.x+m.getTextWidth(this.shapeList[i].style.text,this.shapeList[i].style.textFont)-t))/2);for(var a=-1,i=1,n=this.shapeList.length;n>i;i++)this.shapeList[i].style.x===t&&a++,0!==e[a]&&(this.shapeList[i].style.x+=e[a])},_buildBackground:function(){var e=this.reformCssArray(this.legendOption.padding);this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.legendOption.borderWidth?"fill":"both",color:this.legendOption.backgroundColor,strokeColor:this.legendOption.borderColor,lineWidth:this.legendOption.borderWidth}}))},_getItemGroupLocation:function(){var e=this.legendOption.data,t=e.length,i=this.legendOption.itemGap,n=this.legendOption.itemWidth+5,a=this.legendOption.itemHeight,o=this.legendOption.textStyle,r=this.getFont(o),s=0,l=0,V=this.reformCssArray(this.legendOption.padding),U=this.zr.getWidth()-V[1]-V[3],d=this.zr.getHeight()-V[0]-V[2],p=0,c=0;if("horizontal"===this.legendOption.orient){l=a;for(var u=0;t>u;u++)if(""!==this._getName(e[u])){var y=m.getTextWidth(this._getFormatterNameFromData(e[u]),e[u].textStyle?this.getFont(h.merge(e[u].textStyle||{},o)):r);p+n+y+i>U?(p-=i,s=Math.max(s,p),l+=a+i,p=0):(p+=n+y+i,s=Math.max(s,p-i))}else p-=i,s=Math.max(s,p),l+=a+i,p=0}else{for(var u=0;t>u;u++)c=Math.max(c,m.getTextWidth(this._getFormatterNameFromData(e[u]),e[u].textStyle?this.getFont(h.merge(e[u].textStyle||{},o)):r));c+=n,s=c;for(var u=0;t>u;u++)""!==this._getName(e[u])?p+a+i>d?(s+=c+i,p-=i,l=Math.max(l,p),p=0):(p+=a+i,l=Math.max(l,p-i)):(s+=c+i,p-=i,l=Math.max(l,p),p=0)}U=this.zr.getWidth(),d=this.zr.getHeight();var g;switch(this.legendOption.x){case"center":g=Math.floor((U-s)/2);break;case"left":g=V[3]+this.legendOption.borderWidth;break;case"right":g=U-s-V[1]-V[3]-2*this.legendOption.borderWidth;break;default:g=this.parsePercent(this.legendOption.x,U)}var b;switch(this.legendOption.y){case"top":b=V[0]+this.legendOption.borderWidth;break;case"bottom":b=d-l-V[0]-V[2]-2*this.legendOption.borderWidth;break;case"center":b=Math.floor((d-l)/2);break;default:b=this.parsePercent(this.legendOption.y,d)}return{x:g,y:b,width:s,height:l,maxWidth:c}},_getSomethingByName:function(e){for(var t,i=this.option.series,n=0,a=i.length;a>n;n++){if(i[n].name===e)return{type:i[n].type,series:i[n],seriesIndex:n,data:null,dataIndex:-1};if(i[n].type===l.CHART_TYPE_PIE||i[n].type===l.CHART_TYPE_RADAR||i[n].type===l.CHART_TYPE_CHORD||i[n].type===l.CHART_TYPE_FORCE||i[n].type===l.CHART_TYPE_FUNNEL||i[n].type===l.CHART_TYPE_TREEMAP){t=i[n].categories||i[n].data||i[n].nodes;for(var o=0,r=t.length;r>o;o++)if(t[o].name===e)return{type:i[n].type,series:i[n],seriesIndex:n,data:t[o],dataIndex:o}}}return{type:"bar",series:null,seriesIndex:-1,data:null,dataIndex:-1}},_getItemShapeByType:function(e,t,i,n,a,o,r){var s,h="#ccc"===a?r:a,m={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{iconType:"legendicon"+o,x:e,y:t,width:i,height:n,color:a,strokeColor:a,lineWidth:2},highlightStyle:{color:h,strokeColor:h,lineWidth:1},hoverable:this.legendOption.selectedMode,clickable:this.legendOption.selectedMode};if(o.match("image")){var s=o.replace(new RegExp("^image:\\/\\/"),"");o="image"}switch(o){case"line":m.style.brushType="stroke",m.highlightStyle.lineWidth=3;break;case"radar":case"venn":case"tree":case"treemap":case"scatter":m.highlightStyle.lineWidth=3;break;case"k":m.style.brushType="both",m.highlightStyle.lineWidth=3,m.highlightStyle.color=m.style.color=this.deepQuery([this.ecTheme,l],"k.itemStyle.normal.color")||"#fff",m.style.strokeColor="#ccc"!=a?this.deepQuery([this.ecTheme,l],"k.itemStyle.normal.lineStyle.color")||"#ff3200":a;break;case"image":m.style.iconType="image",m.style.image=s,"#ccc"===a&&(m.style.opacity=.5)}return m},__legendSelected:function(e){var t=e.target._name;if("single"===this.legendOption.selectedMode)for(var i in this._selectedMap)this._selectedMap[i]=!1;this._selectedMap[t]=!this._selectedMap[t],this.messageCenter.dispatch(l.EVENT.LEGEND_SELECTED,e.event,{selected:this._selectedMap,target:t},this.myChart)},__dispatchHoverLink:function(e){this.messageCenter.dispatch(l.EVENT.LEGEND_HOVERLINK,e.event,{target:e.target._name},this.myChart)},refresh:function(e){if(e){this.option=e||this.option,this.option.legend=this.reformOption(this.option.legend),this.legendOption=this.option.legend;var t,i,n,a,o=this.legendOption.data||[];if(this.legendOption.selected)for(var r in this.legendOption.selected)this._selectedMap[r]="undefined"!=typeof this._selectedMap[r]?this._selectedMap[r]:this.legendOption.selected[r];for(var s=0,h=o.length;h>s;s++)t=this._getName(o[s]),""!==t&&(i=this._getSomethingByName(t),i.series?(this._hasDataMap[t]=!0,a=!i.data||i.type!==l.CHART_TYPE_PIE&&i.type!==l.CHART_TYPE_FORCE&&i.type!==l.CHART_TYPE_FUNNEL?[i.series]:[i.data,i.series],n=this.getItemStyleColor(this.deepQuery(a,"itemStyle.normal.color"),i.seriesIndex,i.dataIndex,i.data),n&&i.type!=l.CHART_TYPE_K&&this.setColor(t,n),this._selectedMap[t]=null!=this._selectedMap[t]?this._selectedMap[t]:!0):this._hasDataMap[t]=!1)}this.clear(),this._buildShape()},getRelatedAmount:function(e){for(var t,i=0,n=this.option.series,a=0,o=n.length;o>a;a++)if(n[a].name===e&&i++,n[a].type===l.CHART_TYPE_PIE||n[a].type===l.CHART_TYPE_RADAR||n[a].type===l.CHART_TYPE_CHORD||n[a].type===l.CHART_TYPE_FORCE||n[a].type===l.CHART_TYPE_FUNNEL){t=n[a].type!=l.CHART_TYPE_FORCE?n[a].data:n[a].categories;for(var r=0,s=t.length;s>r;r++)t[r].name===e&&"-"!=t[r].value&&i++}return i},setColor:function(e,t){this._colorMap[e]=t},getColor:function(e){return this._colorMap[e]||(this._colorMap[e]=this.zr.getColor(this._colorIndex++)),this._colorMap[e]},hasColor:function(e){return this._colorMap[e]?this._colorMap[e]:!1},add:function(e,t){
-for(var i=this.legendOption.data,n=0,a=i.length;a>n;n++)if(this._getName(i[n])===e)return;this.legendOption.data.push(e),this.setColor(e,t),this._selectedMap[e]=!0,this._hasDataMap[e]=!0},del:function(e){for(var t=this.legendOption.data,i=0,n=t.length;n>i;i++)if(this._getName(t[i])===e)return this.legendOption.data.splice(i,1)},getItemShape:function(e){if(null!=e)for(var t,i=0,n=this.shapeList.length;n>i;i++)if(t=this.shapeList[i],t._name===e&&"text"!=t.type)return t},setItemShape:function(e,t){for(var i,n=0,a=this.shapeList.length;a>n;n++)i=this.shapeList[n],i._name===e&&"text"!=i.type&&(this._selectedMap[e]||(t.style.color="#ccc",t.style.strokeColor="#ccc"),this.zr.modShape(i.id,t))},isSelected:function(e){return"undefined"!=typeof this._selectedMap[e]?this._selectedMap[e]:!0},getSelectedMap:function(){return this._selectedMap},setSelected:function(e,t){if("single"===this.legendOption.selectedMode)for(var i in this._selectedMap)this._selectedMap[i]=!1;this._selectedMap[e]=t,this.messageCenter.dispatch(l.EVENT.LEGEND_SELECTED,null,{selected:this._selectedMap,target:e},this.myChart)},onlegendSelected:function(e,t){var i=e.selected;for(var n in i)this._selectedMap[n]!=i[n]&&(t.needRefresh=!0),this._selectedMap[n]=i[n]}};var V={line:function(e,t){var i=t.height/2;e.moveTo(t.x,t.y+i),e.lineTo(t.x+t.width,t.y+i)},pie:function(e,t){var i=t.x,n=t.y,a=t.width,r=t.height;o.prototype.buildPath(e,{x:i+a/2,y:n+r+2,r:r,r0:6,startAngle:45,endAngle:135})},eventRiver:function(e,t){var i=t.x,n=t.y,a=t.width,o=t.height;e.moveTo(i,n+o),e.bezierCurveTo(i+a,n+o,i,n+4,i+a,n+4),e.lineTo(i+a,n),e.bezierCurveTo(i,n,i+a,n+o-4,i,n+o-4),e.lineTo(i,n+o)},k:function(e,t){var i=t.x,n=t.y,a=t.width,o=t.height;s.prototype.buildPath(e,{x:i+a/2,y:[n+1,n+1,n+o-6,n+o],width:a-6})},bar:function(e,t){var i=t.x,n=t.y+1,a=t.width,o=t.height-2,r=3;e.moveTo(i+r,n),e.lineTo(i+a-r,n),e.quadraticCurveTo(i+a,n,i+a,n+r),e.lineTo(i+a,n+o-r),e.quadraticCurveTo(i+a,n+o,i+a-r,n+o),e.lineTo(i+r,n+o),e.quadraticCurveTo(i,n+o,i,n+o-r),e.lineTo(i,n+r),e.quadraticCurveTo(i,n,i+r,n)},force:function(e,t){r.prototype.iconLibrary.circle(e,t)},radar:function(e,t){var i=6,n=t.x+t.width/2,a=t.y+t.height/2,o=t.height/2,r=2*Math.PI/i,s=-Math.PI/2,l=n+o*Math.cos(s),h=a+o*Math.sin(s);e.moveTo(l,h),s+=r;for(var m=0,V=i-1;V>m;m++)e.lineTo(n+o*Math.cos(s),a+o*Math.sin(s)),s+=r;e.lineTo(l,h)}};V.chord=V.pie,V.map=V.bar;for(var U in V)r.prototype.iconLibrary["legendicon"+U]=V[U];return h.inherits(t,i),e("../component").define("legend",t),t}),i("echarts/util/ecData",[],function(){function e(e,t,i,n,a,o,r,s){var l;return"undefined"!=typeof n&&(l=null==n.value?n:n.value),e._echartsData={_series:t,_seriesIndex:i,_data:n,_dataIndex:a,_name:o,_value:l,_special:r,_special2:s},e._echartsData}function t(e,t){var i=e._echartsData;if(!t)return i;switch(t){case"series":case"seriesIndex":case"data":case"dataIndex":case"name":case"value":case"special":case"special2":return i&&i["_"+t]}return null}function i(e,t,i){switch(e._echartsData=e._echartsData||{},t){case"series":case"seriesIndex":case"data":case"dataIndex":case"name":case"value":case"special":case"special2":e._echartsData["_"+t]=i}}function n(e,t){t._echartsData={_series:e._echartsData._series,_seriesIndex:e._echartsData._seriesIndex,_data:e._echartsData._data,_dataIndex:e._echartsData._dataIndex,_name:e._echartsData._name,_value:e._echartsData._value,_special:e._echartsData._special,_special2:e._echartsData._special2}}return{pack:e,set:i,get:t,clone:n}}),i("echarts/chart",[],function(){var e={},t={};return e.define=function(i,n){return t[i]=n,e},e.get=function(e){return t[e]},e}),i("zrender/tool/color",["require","../tool/util"],function(e){function t(e){D=e}function i(){D=N}function n(e,t){return e=0|e,t=t||D,t[e%t.length]}function a(e){B=e}function o(){H=B}function r(){return B}function s(e,t,i,n,a,o,r){O||(O=P.getContext());for(var s=O.createRadialGradient(e,t,i,n,a,o),l=0,h=r.length;h>l;l++)s.addColorStop(r[l][0],r[l][1]);return s.__nonRecursion=!0,s}function l(e,t,i,n,a){O||(O=P.getContext());for(var o=O.createLinearGradient(e,t,i,n),r=0,s=a.length;s>r;r++)o.addColorStop(a[r][0],a[r][1]);return o.__nonRecursion=!0,o}function h(e,t,i){e=p(e),t=p(t),e=I(e),t=I(t);for(var n=[],a=(t[0]-e[0])/i,o=(t[1]-e[1])/i,r=(t[2]-e[2])/i,s=(t[3]-e[3])/i,l=0,h=e[0],m=e[1],U=e[2],d=e[3];i>l;l++)n[l]=V([S(Math.floor(h),[0,255]),S(Math.floor(m),[0,255]),S(Math.floor(U),[0,255]),d.toFixed(4)-0],"rgba"),h+=a,m+=o,U+=r,d+=s;return h=t[0],m=t[1],U=t[2],d=t[3],n[l]=V([h,m,U,d],"rgba"),n}function m(e,t){var i=[],n=e.length;if(void 0===t&&(t=20),1===n)i=h(e[0],e[0],t);else if(n>1)for(var a=0,o=n-1;o>a;a++){var r=h(e[a],e[a+1],t);o-1>a&&r.pop(),i=i.concat(r)}return i}function V(e,t){if(t=t||"rgb",e&&(3===e.length||4===e.length)){if(e=C(e,function(e){return e>1?Math.ceil(e):e}),t.indexOf("hex")>-1)return"#"+((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1);if(t.indexOf("hs")>-1){var i=C(e.slice(1,3),function(e){return e+"%"});e[1]=i[0],e[2]=i[1]}return t.indexOf("a")>-1?(3===e.length&&e.push(1),e[3]=S(e[3],[0,1]),t+"("+e.slice(0,4).join(",")+")"):t+"("+e.slice(0,3).join(",")+")"}}function U(e){e=L(e),e.indexOf("rgba")<0&&(e=p(e));var t=[],i=0;return e.replace(/[\d.]+/g,function(e){e=3>i?0|e:+e,t[i++]=e}),t}function d(e,t){if(!E(e))return e;var i=I(e),n=i[3];return"undefined"==typeof n&&(n=1),e.indexOf("hsb")>-1?i=F(i):e.indexOf("hsl")>-1&&(i=T(i)),t.indexOf("hsb")>-1||t.indexOf("hsv")>-1?i=A(i):t.indexOf("hsl")>-1&&(i=M(i)),i[3]=n,V(i,t)}function p(e){return d(e,"rgba")}function c(e){return d(e,"rgb")}function u(e){return d(e,"hex")}function y(e){return d(e,"hsva")}function g(e){return d(e,"hsv")}function b(e){return d(e,"hsba")}function f(e){return d(e,"hsb")}function k(e){return d(e,"hsla")}function x(e){return d(e,"hsl")}function _(e){for(var t in G)if(u(G[t])===u(e))return t;return null}function L(e){return String(e).replace(/\s+/g,"")}function W(e){if(G[e]&&(e=G[e]),e=L(e),e=e.replace(/hsv/i,"hsb"),/^#[\da-f]{3}$/i.test(e)){e=parseInt(e.slice(1),16);var t=(3840&e)<<8,i=(240&e)<<4,n=15&e;e="#"+((1<<24)+(t<<4)+t+(i<<4)+i+(n<<4)+n).toString(16).slice(1)}return e}function X(e,t){if(!E(e))return e;var i=t>0?1:-1;"undefined"==typeof t&&(t=0),t=Math.abs(t)>1?1:Math.abs(t),e=c(e);for(var n=I(e),a=0;3>a;a++)n[a]=1===i?n[a]*(1-t)|0:(255-n[a])*t+n[a]|0;return"rgb("+n.join(",")+")"}function v(e){if(!E(e))return e;var t=I(p(e));return t=C(t,function(e){return 255-e}),V(t,"rgb")}function w(e,t,i){if(!E(e)||!E(t))return e;"undefined"==typeof i&&(i=.5),i=1-S(i,[0,1]);for(var n=2*i-1,a=I(p(e)),o=I(p(t)),r=a[3]-o[3],s=((n*r===-1?n:(n+r)/(1+n*r))+1)/2,l=1-s,h=[],m=0;3>m;m++)h[m]=a[m]*s+o[m]*l;var U=a[3]*i+o[3]*(1-i);return U=Math.max(0,Math.min(1,U)),1===a[3]&&1===o[3]?V(h,"rgb"):(h[3]=U,V(h,"rgba"))}function K(){return"#"+(Math.random().toString(16)+"0000").slice(2,8)}function I(e){e=W(e);var t=e.match(R);if(null===t)throw new Error("The color format error");var i,n,a,o=[];if(t[2])i=t[2].replace("#","").split(""),a=[i[0]+i[1],i[2]+i[3],i[4]+i[5]],o=C(a,function(e){return S(parseInt(e,16),[0,255])});else if(t[4]){var r=t[4].split(",");n=r[3],a=r.slice(0,3),o=C(a,function(e){return e=Math.floor(e.indexOf("%")>0?2.55*parseInt(e,0):e),S(e,[0,255])}),"undefined"!=typeof n&&o.push(S(parseFloat(n),[0,1]))}else if(t[5]||t[6]){var s=(t[5]||t[6]).split(","),l=parseInt(s[0],0)/360,h=s[1],m=s[2];n=s[3],o=C([h,m],function(e){return S(parseFloat(e)/100,[0,1])}),o.unshift(l),"undefined"!=typeof n&&o.push(S(parseFloat(n),[0,1]))}return o}function J(e,t){if(!E(e))return e;null===t&&(t=1);var i=I(p(e));return i[3]=S(Number(t).toFixed(4),[0,1]),V(i,"rgba")}function C(e,t){if("function"!=typeof t)throw new TypeError;for(var i=e?e.length:0,n=0;i>n;n++)e[n]=t(e[n]);return e}function S(e,t){return e<=t[0]?e=t[0]:e>=t[1]&&(e=t[1]),e}function E(e){return e instanceof Array||"string"==typeof e}function F(e){var t,i,n,a=e[0],o=e[1],r=e[2];if(0===o)t=255*r,i=255*r,n=255*r;else{var s=6*a;6===s&&(s=0);var l=0|s,h=r*(1-o),m=r*(1-o*(s-l)),V=r*(1-o*(1-(s-l))),U=0,d=0,p=0;0===l?(U=r,d=V,p=h):1===l?(U=m,d=r,p=h):2===l?(U=h,d=r,p=V):3===l?(U=h,d=m,p=r):4===l?(U=V,d=h,p=r):(U=r,d=h,p=m),t=255*U,i=255*d,n=255*p}return[t,i,n]}function T(e){var t,i,n,a=e[0],o=e[1],r=e[2];if(0===o)t=255*r,i=255*r,n=255*r;else{var s;s=.5>r?r*(1+o):r+o-o*r;var l=2*r-s;t=255*z(l,s,a+1/3),i=255*z(l,s,a),n=255*z(l,s,a-1/3)}return[t,i,n]}function z(e,t,i){return 0>i&&(i+=1),i>1&&(i-=1),1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+(t-e)*(2/3-i)*6:e}function A(e){var t,i,n=e[0]/255,a=e[1]/255,o=e[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r,h=s;if(0===l)t=0,i=0;else{i=l/s;var m=((s-n)/6+l/2)/l,V=((s-a)/6+l/2)/l,U=((s-o)/6+l/2)/l;n===s?t=U-V:a===s?t=1/3+m-U:o===s&&(t=2/3+V-m),0>t&&(t+=1),t>1&&(t-=1)}return t=360*t,i=100*i,h=100*h,[t,i,h]}function M(e){var t,i,n=e[0]/255,a=e[1]/255,o=e[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r,h=(s+r)/2;if(0===l)t=0,i=0;else{i=.5>h?l/(s+r):l/(2-s-r);var m=((s-n)/6+l/2)/l,V=((s-a)/6+l/2)/l,U=((s-o)/6+l/2)/l;n===s?t=U-V:a===s?t=1/3+m-U:o===s&&(t=2/3+V-m),0>t&&(t+=1),t>1&&(t-=1)}return t=360*t,i=100*i,h=100*h,[t,i,h]}var O,P=e("../tool/util"),D=["#ff9277"," #dddd00"," #ffc877"," #bbe3ff"," #d5ffbb","#bbbbff"," #ddb000"," #b0dd00"," #e2bbff"," #ffbbe3","#ff7777"," #ff9900"," #83dd00"," #77e3ff"," #778fff","#c877ff"," #ff77ab"," #ff6600"," #aa8800"," #77c7ff","#ad77ff"," #ff77ff"," #dd0083"," #777700"," #00aa00","#0088aa"," #8400dd"," #aa0088"," #dd0000"," #772e00"],N=D,B="rgba(255,255,0,0.5)",H=B,R=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,G={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#0ff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000",blanchedalmond:"#ffebcd",blue:"#00f",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#f0f",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#789",lightslategrey:"#789",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#0f0",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#f0f",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#f00",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#fff",whitesmoke:"#f5f5f5",yellow:"#ff0",yellowgreen:"#9acd32"};return{customPalette:t,resetPalette:i,getColor:n,getHighlightColor:r,customHighlight:a,resetHighlight:o,getRadialGradient:s,getLinearGradient:l,getGradientColors:m,getStepColors:h,reverse:v,mix:w,lift:X,trim:L,random:K,toRGB:c,toRGBA:p,toHex:u,toHSL:x,toHSLA:k,toHSB:f,toHSBA:b,toHSV:g,toHSVA:y,toName:_,toColor:V,toArray:U,alpha:J,getData:I}}),i("echarts/component/timeline",["require","./base","zrender/shape/Rectangle","../util/shape/Icon","../util/shape/Chain","../config","zrender/tool/util","zrender/tool/area","zrender/tool/event","../component"],function(e){function t(e,t,i,a,o){n.call(this,e,t,i,a,o);var r=this;if(r._onclick=function(e){return r.__onclick(e)},r._ondrift=function(e,t){return r.__ondrift(this,e,t)},r._ondragend=function(){return r.__ondragend()},r._setCurrentOption=function(){var e=r.timelineOption;r.currentIndex%=e.data.length;var t=r.options[r.currentIndex]||{};r.myChart._setOption(t,e.notMerge,!0),r.messageCenter.dispatch(s.EVENT.TIMELINE_CHANGED,null,{currentIndex:r.currentIndex,data:null!=e.data[r.currentIndex].name?e.data[r.currentIndex].name:e.data[r.currentIndex]},r.myChart)},r._onFrame=function(){r._setCurrentOption(),r._syncHandleShape(),r.timelineOption.autoPlay&&(r.playTicket=setTimeout(function(){return r.currentIndex+=1,!r.timelineOption.loop&&r.currentIndex>=r.timelineOption.data.length?(r.currentIndex=r.timelineOption.data.length-1,void r.stop()):void r._onFrame()},r.timelineOption.playInterval))},this.setTheme(!1),this.options=this.option.options,this.currentIndex=this.timelineOption.currentIndex%this.timelineOption.data.length,this.timelineOption.notMerge||0===this.currentIndex||(this.options[this.currentIndex]=l.merge(this.options[this.currentIndex],this.options[0])),this.timelineOption.show&&(this._buildShape(),this._syncHandleShape()),this._setCurrentOption(),this.timelineOption.autoPlay){var r=this;this.playTicket=setTimeout(function(){r.play()},null!=this.ecTheme.animationDuration?this.ecTheme.animationDuration:s.animationDuration)}}function i(e,t){var i=2,n=t.x+i,a=t.y+i+2,r=t.width-i,s=t.height-i,l=t.symbol;if("last"===l)e.moveTo(n+r-2,a+s/3),e.lineTo(n+r-2,a),e.lineTo(n+2,a+s/2),e.lineTo(n+r-2,a+s),e.lineTo(n+r-2,a+s/3*2),e.moveTo(n,a),e.lineTo(n,a);else if("next"===l)e.moveTo(n+2,a+s/3),e.lineTo(n+2,a),e.lineTo(n+r-2,a+s/2),e.lineTo(n+2,a+s),e.lineTo(n+2,a+s/3*2),e.moveTo(n,a),e.lineTo(n,a);else if("play"===l)if("stop"===t.status)e.moveTo(n+2,a),e.lineTo(n+r-2,a+s/2),e.lineTo(n+2,a+s),e.lineTo(n+2,a);else{var h="both"===t.brushType?2:3;e.rect(n+2,a,h,s),e.rect(n+r-h-2,a,h,s)}else if(l.match("image")){var m="";m=l.replace(new RegExp("^image:\\/\\/"),""),l=o.prototype.iconLibrary.image,l(e,{x:n,y:a,width:r,height:s,image:m})}}var n=e("./base"),a=e("zrender/shape/Rectangle"),o=e("../util/shape/Icon"),r=e("../util/shape/Chain"),s=e("../config");s.timeline={zlevel:0,z:4,show:!0,type:"time",notMerge:!1,realtime:!0,x:80,x2:80,y2:0,height:50,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,controlPosition:"left",autoPlay:!1,loop:!0,playInterval:2e3,lineStyle:{width:1,color:"#666",type:"dashed"},label:{show:!0,interval:"auto",rotate:0,textStyle:{color:"#333"}},checkpointStyle:{symbol:"auto",symbolSize:"auto",color:"auto",borderColor:"auto",borderWidth:"auto",label:{show:!1,textStyle:{color:"auto"}}},controlStyle:{itemSize:15,itemGap:5,normal:{color:"#333"},emphasis:{color:"#1e90ff"}},symbol:"emptyDiamond",symbolSize:4,currentIndex:0};var l=e("zrender/tool/util"),h=e("zrender/tool/area"),m=e("zrender/tool/event");return t.prototype={type:s.COMPONENT_TYPE_TIMELINE,_buildShape:function(){if(this._location=this._getLocation(),this._buildBackground(),this._buildControl(),this._chainPoint=this._getChainPoint(),this.timelineOption.label.show)for(var e=this._getInterval(),t=0,i=this._chainPoint.length;i>t;t+=e)this._chainPoint[t].showLabel=!0;this._buildChain(),this._buildHandle();for(var t=0,n=this.shapeList.length;n>t;t++)this.zr.addShape(this.shapeList[t])},_getLocation:function(){var e,t=this.timelineOption,i=this.reformCssArray(this.timelineOption.padding),n=this.zr.getWidth(),a=this.parsePercent(t.x,n),o=this.parsePercent(t.x2,n);null==t.width?(e=n-a-o,o=n-o):(e=this.parsePercent(t.width,n),o=a+e);var r,s,l=this.zr.getHeight(),h=this.parsePercent(t.height,l);return null!=t.y?(r=this.parsePercent(t.y,l),s=r+h):(s=l-this.parsePercent(t.y2,l),r=s-h),{x:a+i[3],y:r+i[0],x2:o-i[1],y2:s-i[2],width:e-i[1]-i[3],height:h-i[0]-i[2]}},_getReformedLabel:function(e){var t=this.timelineOption,i=null!=t.data[e].name?t.data[e].name:t.data[e],n=t.data[e].formatter||t.label.formatter;return n&&("function"==typeof n?i=n.call(this.myChart,i):"string"==typeof n&&(i=n.replace("{value}",i))),i},_getInterval:function(){var e=this._chainPoint,t=this.timelineOption,i=t.label.interval;if("auto"===i){var n=t.label.textStyle.fontSize,a=t.data,o=t.data.length;if(o>3){var r,s,l=!1;for(i=0;!l&&o>i;){i++,l=!0;for(var m=i;o>m;m+=i){if(r=e[m].x-e[m-i].x,0!==t.label.rotate)s=n;else if(a[m].textStyle)s=h.getTextWidth(e[m].name,e[m].textFont);else{var V=e[m].name+"",U=(V.match(/\w/g)||"").length,d=V.length-U;s=U*n*2/3+d*n}if(s>r){l=!1;break}}}}else i=1}else i=i-0+1;return i},_getChainPoint:function(){function e(e){return null!=h[e].name?h[e].name:h[e]+""}var t,i=this.timelineOption,n=i.symbol.toLowerCase(),a=i.symbolSize,o=i.label.rotate,r=i.label.textStyle,s=this.getFont(r),h=i.data,m=this._location.x,V=this._location.y+this._location.height/4*3,U=this._location.x2-this._location.x,d=h.length,p=[];if(d>1){var c=U/d;if(c=c>50?50:20>c?5:c,U-=2*c,"number"===i.type)for(var u=0;d>u;u++)p.push(m+c+U/(d-1)*u);else{p[0]=new Date(e(0).replace(/-/g,"/")),p[d-1]=new Date(e(d-1).replace(/-/g,"/"))-p[0];for(var u=1;d>u;u++)p[u]=m+c+U*(new Date(e(u).replace(/-/g,"/"))-p[0])/p[d-1];p[0]=m+c}}else p.push(m+U/2);for(var y,g,b,f,k,x=[],u=0;d>u;u++)m=p[u],y=h[u].symbol&&h[u].symbol.toLowerCase()||n,y.match("empty")?(y=y.replace("empty",""),b=!0):b=!1,y.match("star")&&(g=y.replace("star","")-0||5,y="star"),t=h[u].textStyle?l.merge(h[u].textStyle||{},r):r,f=t.align||"center",o?(f=o>0?"right":"left",k=[o*Math.PI/180,m,V-5]):k=!1,x.push({x:m,n:g,isEmpty:b,symbol:y,symbolSize:h[u].symbolSize||a,color:h[u].color,borderColor:h[u].borderColor,borderWidth:h[u].borderWidth,name:this._getReformedLabel(u),textColor:t.color,textAlign:f,textBaseline:t.baseline||"middle",textX:m,textY:V-(o?5:0),textFont:h[u].textStyle?this.getFont(t):s,rotation:k,showLabel:!1});return x},_buildBackground:function(){var e=this.timelineOption,t=this.reformCssArray(this.timelineOption.padding),i=this._location.width,n=this._location.height;(0!==e.borderWidth||"rgba(0,0,0,0)"!=e.backgroundColor.replace(/\s/g,""))&&this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._location.x-t[3],y:this._location.y-t[0],width:i+t[1]+t[3],height:n+t[0]+t[2],brushType:0===e.borderWidth?"fill":"both",color:e.backgroundColor,strokeColor:e.borderColor,lineWidth:e.borderWidth}}))},_buildControl:function(){var e=this,t=this.timelineOption,i=t.lineStyle,n=t.controlStyle;if("none"!==t.controlPosition){var a,r=n.itemSize,s=n.itemGap;"left"===t.controlPosition?(a=this._location.x,this._location.x+=3*(r+s)):(a=this._location.x2-(3*(r+s)-s),this._location.x2-=3*(r+s));var h=this._location.y,m={zlevel:this.getZlevelBase(),z:this.getZBase()+1,style:{iconType:"timelineControl",symbol:"last",x:a,y:h,width:r,height:r,brushType:"stroke",color:n.normal.color,strokeColor:n.normal.color,lineWidth:i.width},highlightStyle:{color:n.emphasis.color,strokeColor:n.emphasis.color,lineWidth:i.width+1},clickable:!0};this._ctrLastShape=new o(m),this._ctrLastShape.onclick=function(){e.last()},this.shapeList.push(this._ctrLastShape),a+=r+s,this._ctrPlayShape=new o(l.clone(m)),this._ctrPlayShape.style.brushType="fill",this._ctrPlayShape.style.symbol="play",this._ctrPlayShape.style.status=this.timelineOption.autoPlay?"playing":"stop",this._ctrPlayShape.style.x=a,this._ctrPlayShape.onclick=function(){"stop"===e._ctrPlayShape.style.status?e.play():e.stop()},this.shapeList.push(this._ctrPlayShape),a+=r+s,this._ctrNextShape=new o(l.clone(m)),this._ctrNextShape.style.symbol="next",this._ctrNextShape.style.x=a,this._ctrNextShape.onclick=function(){e.next()},this.shapeList.push(this._ctrNextShape)}},_buildChain:function(){var e=this.timelineOption,t=e.lineStyle;this._timelineShae={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:this._location.x,y:this.subPixelOptimize(this._location.y,t.width),width:this._location.x2-this._location.x,height:this._location.height,chainPoint:this._chainPoint,brushType:"both",strokeColor:t.color,lineWidth:t.width,lineType:t.type},hoverable:!1,clickable:!0,onclick:this._onclick},this._timelineShae=new r(this._timelineShae),this.shapeList.push(this._timelineShae)},_buildHandle:function(){var e=this._chainPoint[this.currentIndex],t=e.symbolSize+1;t=5>t?5:t,this._handleShape={zlevel:this.getZlevelBase(),z:this.getZBase()+1,hoverable:!1,draggable:!0,style:{iconType:"diamond",n:e.n,x:e.x-t,y:this._location.y+this._location.height/4-t,width:2*t,height:2*t,brushType:"both",textPosition:"specific",textX:e.x,textY:this._location.y-this._location.height/4,textAlign:"center",textBaseline:"middle"},highlightStyle:{},ondrift:this._ondrift,ondragend:this._ondragend},this._handleShape=new o(this._handleShape),this.shapeList.push(this._handleShape)},_syncHandleShape:function(){if(this.timelineOption.show){var e=this.timelineOption,t=e.checkpointStyle,i=this._chainPoint[this.currentIndex];this._handleShape.style.text=t.label.show?i.name:"",this._handleShape.style.textFont=i.textFont,this._handleShape.style.n=i.n,"auto"===t.symbol?this._handleShape.style.iconType="none"!=i.symbol?i.symbol:"diamond":(this._handleShape.style.iconType=t.symbol,t.symbol.match("star")&&(this._handleShape.style.n=t.symbol.replace("star","")-0||5,this._handleShape.style.iconType="star"));var n;"auto"===t.symbolSize?(n=i.symbolSize+2,n=5>n?5:n):n=t.symbolSize-0,this._handleShape.style.color="auto"===t.color?i.color?i.color:e.controlStyle.emphasis.color:t.color,this._handleShape.style.textColor="auto"===t.label.textStyle.color?this._handleShape.style.color:t.label.textStyle.color,this._handleShape.highlightStyle.strokeColor=this._handleShape.style.strokeColor="auto"===t.borderColor?i.borderColor?i.borderColor:"#fff":t.borderColor,this._handleShape.style.lineWidth="auto"===t.borderWidth?i.borderWidth?i.borderWidth:0:t.borderWidth-0,this._handleShape.highlightStyle.lineWidth=this._handleShape.style.lineWidth+1,this.zr.animate(this._handleShape.id,"style").when(500,{x:i.x-n,textX:i.x,y:this._location.y+this._location.height/4-n,width:2*n,height:2*n}).start("ExponentialOut")}},_findChainIndex:function(e){var t=this._chainPoint,i=t.length;if(e<=t[0].x)return 0;if(e>=t[i-1].x)return i-1;for(var n=0;i-1>n;n++)if(e>=t[n].x&&e<=t[n+1].x)return Math.abs(e-t[n].x)<Math.abs(e-t[n+1].x)?n:n+1},__onclick:function(e){var t=m.getX(e.event),i=this._findChainIndex(t);return i===this.currentIndex?!0:(this.currentIndex=i,this.timelineOption.autoPlay&&this.stop(),clearTimeout(this.playTicket),void this._onFrame())},__ondrift:function(e,t){this.timelineOption.autoPlay&&this.stop();var i,n=this._chainPoint,a=n.length;e.style.x+t<=n[0].x-n[0].symbolSize?(e.style.x=n[0].x-n[0].symbolSize,i=0):e.style.x+t>=n[a-1].x-n[a-1].symbolSize?(e.style.x=n[a-1].x-n[a-1].symbolSize,i=a-1):(e.style.x+=t,i=this._findChainIndex(e.style.x));var o=n[i],r=o.symbolSize+2;if(e.style.iconType=o.symbol,e.style.n=o.n,e.style.textX=e.style.x+r/2,e.style.y=this._location.y+this._location.height/4-r,e.style.width=2*r,e.style.height=2*r,e.style.text=o.name,i===this.currentIndex)return!0;if(this.currentIndex=i,this.timelineOption.realtime){clearTimeout(this.playTicket);var s=this;this.playTicket=setTimeout(function(){s._setCurrentOption()},200)}return!0},__ondragend:function(){this.isDragend=!0},ondragend:function(e,t){this.isDragend&&e.target&&(!this.timelineOption.realtime&&this._setCurrentOption(),t.dragOut=!0,t.dragIn=!0,t.needRefresh=!1,this.isDragend=!1,this._syncHandleShape())},last:function(){return this.timelineOption.autoPlay&&this.stop(),this.currentIndex-=1,this.currentIndex<0&&(this.currentIndex=this.timelineOption.data.length-1),this._onFrame(),this.currentIndex},next:function(){return this.timelineOption.autoPlay&&this.stop(),this.currentIndex+=1,this.currentIndex>=this.timelineOption.data.length&&(this.currentIndex=0),this._onFrame(),this.currentIndex},play:function(e,t){return this._ctrPlayShape&&"playing"!=this._ctrPlayShape.style.status&&(this._ctrPlayShape.style.status="playing",this.zr.modShape(this._ctrPlayShape.id),this.zr.refreshNextFrame()),this.timelineOption.autoPlay=null!=t?t:!0,this.timelineOption.autoPlay||clearTimeout(this.playTicket),this.currentIndex=null!=e?e:this.currentIndex+1,this.currentIndex>=this.timelineOption.data.length&&(this.currentIndex=0),this._onFrame(),this.currentIndex},stop:function(){return this._ctrPlayShape&&"stop"!=this._ctrPlayShape.style.status&&(this._ctrPlayShape.style.status="stop",this.zr.modShape(this._ctrPlayShape.id),this.zr.refreshNextFrame()),this.timelineOption.autoPlay=!1,clearTimeout(this.playTicket),this.currentIndex},resize:function(){this.timelineOption.show&&(this.clear(),this._buildShape(),this._syncHandleShape())},setTheme:function(e){this.timelineOption=this.reformOption(l.clone(this.option.timeline)),this.timelineOption.label.textStyle=this.getTextStyle(this.timelineOption.label.textStyle),this.timelineOption.checkpointStyle.label.textStyle=this.getTextStyle(this.timelineOption.checkpointStyle.label.textStyle),this.myChart.canvasSupported||(this.timelineOption.realtime=!1),this.timelineOption.show&&e&&(this.clear(),this._buildShape(),this._syncHandleShape())},onbeforDispose:function(){clearTimeout(this.playTicket)}},o.prototype.iconLibrary.timelineControl=i,l.inherits(t,n),e("../component").define("timeline",t),t}),i("zrender/shape/Image",["require","./Base","../tool/util"],function(e){var t=e("./Base"),i=function(e){t.call(this,e)};return i.prototype={type:"image",brush:function(e,t,i){var n=this.style||{};t&&(n=this.getHighlightStyle(n,this.highlightStyle||{}));var a=n.image,o=this;if(this._imageCache||(this._imageCache={}),"string"==typeof a){var r=a;this._imageCache[r]?a=this._imageCache[r]:(a=new Image,a.onload=function(){a.onload=null,o.modSelf(),i()},a.src=r,this._imageCache[r]=a)}if(a){if("IMG"==a.nodeName.toUpperCase())if(window.ActiveXObject){if("complete"!=a.readyState)return}else if(!a.complete)return;var s=n.width||a.width,l=n.height||a.height,h=n.x,m=n.y;if(!a.width||!a.height)return;if(e.save(),this.doClip(e),this.setContext(e,n),this.setTransform(e),n.sWidth&&n.sHeight){var V=n.sx||0,U=n.sy||0;e.drawImage(a,V,U,n.sWidth,n.sHeight,h,m,s,l)}else if(n.sx&&n.sy){var V=n.sx,U=n.sy,d=s-V,p=l-U;e.drawImage(a,V,U,d,p,h,m,s,l)}else e.drawImage(a,h,m,s,l);n.width||(n.width=s),n.height||(n.height=l),this.style.width||(this.style.width=s),this.style.height||(this.style.height=l),this.drawText(e,n,this.style),e.restore()}},getRect:function(e){return{x:e.x,y:e.y,width:e.width,height:e.height}},clearCache:function(){this._imageCache={}}},e("../tool/util").inherits(i,t),i}),i("zrender/loadingEffect/Bar",["require","./Base","../tool/util","../tool/color","../shape/Rectangle"],function(e){function t(e){i.call(this,e)}var i=e("./Base"),n=e("../tool/util"),a=e("../tool/color"),o=e("../shape/Rectangle");return n.inherits(t,i),t.prototype._start=function(e,t){var i=n.merge(this.options,{textStyle:{color:"#888"},backgroundColor:"rgba(250, 250, 250, 0.8)",effectOption:{x:0,y:this.canvasHeight/2-30,width:this.canvasWidth,height:5,brushType:"fill",timeInterval:100}}),r=this.createTextShape(i.textStyle),s=this.createBackgroundShape(i.backgroundColor),l=i.effectOption,h=new o({highlightStyle:n.clone(l)});return h.highlightStyle.color=l.color||a.getLinearGradient(l.x,l.y,l.x+l.width,l.y+l.height,[[0,"#ff6400"],[.5,"#ffe100"],[1,"#b1ff00"]]),null!=i.progress?(e(s),h.highlightStyle.width=this.adjust(i.progress,[0,1])*i.effectOption.width,e(h),e(r),void t()):(h.highlightStyle.width=0,setInterval(function(){e(s),h.highlightStyle.width<l.width?h.highlightStyle.width+=8:h.highlightStyle.width=0,e(h),e(r),t()},l.timeInterval))},t}),i("zrender/loadingEffect/Bubble",["require","./Base","../tool/util","../tool/color","../shape/Circle"],function(e){function t(e){i.call(this,e)}var i=e("./Base"),n=e("../tool/util"),a=e("../tool/color"),o=e("../shape/Circle");return n.inherits(t,i),t.prototype._start=function(e,t){for(var i=n.merge(this.options,{textStyle:{color:"#888"},backgroundColor:"rgba(250, 250, 250, 0.8)",effect:{n:50,lineWidth:2,brushType:"stroke",color:"random",timeInterval:100}}),r=this.createTextShape(i.textStyle),s=this.createBackgroundShape(i.backgroundColor),l=i.effect,h=l.n,m=l.brushType,V=l.lineWidth,U=[],d=this.canvasWidth,p=this.canvasHeight,c=0;h>c;c++){var u="random"==l.color?a.alpha(a.random(),.3):l.color;U[c]=new o({highlightStyle:{x:Math.ceil(Math.random()*d),y:Math.ceil(Math.random()*p),r:Math.ceil(40*Math.random()),brushType:m,color:u,strokeColor:u,lineWidth:V},animationY:Math.ceil(20*Math.random())})}return setInterval(function(){e(s);for(var i=0;h>i;i++){var n=U[i].highlightStyle;n.y-U[i].animationY+n.r<=0&&(U[i].highlightStyle.y=p+n.r,U[i].highlightStyle.x=Math.ceil(Math.random()*d)),U[i].highlightStyle.y-=U[i].animationY,e(U[i])}e(r),t()},l.timeInterval)},t}),i("zrender/loadingEffect/DynamicLine",["require","./Base","../tool/util","../tool/color","../shape/Line"],function(e){function t(e){i.call(this,e)}var i=e("./Base"),n=e("../tool/util"),a=e("../tool/color"),o=e("../shape/Line");return n.inherits(t,i),t.prototype._start=function(e,t){for(var i=n.merge(this.options,{textStyle:{color:"#fff"},backgroundColor:"rgba(0, 0, 0, 0.8)",effectOption:{n:30,lineWidth:1,color:"random",timeInterval:100}}),r=this.createTextShape(i.textStyle),s=this.createBackgroundShape(i.backgroundColor),l=i.effectOption,h=l.n,m=l.lineWidth,V=[],U=this.canvasWidth,d=this.canvasHeight,p=0;h>p;p++){var c=-Math.ceil(1e3*Math.random()),u=Math.ceil(400*Math.random()),y=Math.ceil(Math.random()*d),g="random"==l.color?a.random():l.color;V[p]=new o({highlightStyle:{xStart:c,yStart:y,xEnd:c+u,yEnd:y,strokeColor:g,lineWidth:m},animationX:Math.ceil(100*Math.random()),len:u})}return setInterval(function(){e(s);for(var i=0;h>i;i++){var n=V[i].highlightStyle;n.xStart>=U&&(V[i].len=Math.ceil(400*Math.random()),n.xStart=-400,n.xEnd=-400+V[i].len,n.yStart=Math.ceil(Math.random()*d),n.yEnd=n.yStart),n.xStart+=V[i].animationX,n.xEnd+=V[i].animationX,e(V[i])}e(r),t()},l.timeInterval)},t}),i("zrender/loadingEffect/Ring",["require","./Base","../tool/util","../tool/color","../shape/Ring","../shape/Sector"],function(e){function t(e){i.call(this,e)}var i=e("./Base"),n=e("../tool/util"),a=e("../tool/color"),o=e("../shape/Ring"),r=e("../shape/Sector");return n.inherits(t,i),t.prototype._start=function(e,t){var i=n.merge(this.options,{textStyle:{color:"#07a"},backgroundColor:"rgba(250, 250, 250, 0.8)",effect:{x:this.canvasWidth/2,y:this.canvasHeight/2,r0:60,r:100,color:"#bbdcff",brushType:"fill",textPosition:"inside",textFont:"normal 30px verdana",textColor:"rgba(30, 144, 255, 0.6)",timeInterval:100}}),s=i.effect,l=i.textStyle;
-
-null==l.x&&(l.x=s.x),null==l.y&&(l.y=s.y+(s.r0+s.r)/2-5);for(var h=this.createTextShape(i.textStyle),m=this.createBackgroundShape(i.backgroundColor),V=s.x,U=s.y,d=s.r0+6,p=s.r-6,c=s.color,u=a.lift(c,.1),y=new o({highlightStyle:n.clone(s)}),g=[],b=a.getGradientColors(["#ff6400","#ffe100","#97ff00"],25),f=15,k=240,x=0;16>x;x++)g.push(new r({highlightStyle:{x:V,y:U,r0:d,r:p,startAngle:k-f,endAngle:k,brushType:"fill",color:u},_color:a.getLinearGradient(V+d*Math.cos(k,!0),U-d*Math.sin(k,!0),V+d*Math.cos(k-f,!0),U-d*Math.sin(k-f,!0),[[0,b[2*x]],[1,b[2*x+1]]])})),k-=f;k=360;for(var x=0;4>x;x++)g.push(new r({highlightStyle:{x:V,y:U,r0:d,r:p,startAngle:k-f,endAngle:k,brushType:"fill",color:u},_color:a.getLinearGradient(V+d*Math.cos(k,!0),U-d*Math.sin(k,!0),V+d*Math.cos(k-f,!0),U-d*Math.sin(k-f,!0),[[0,b[2*x+32]],[1,b[2*x+33]]])})),k-=f;var _=0;if(null!=i.progress){e(m),_=100*this.adjust(i.progress,[0,1]).toFixed(2)/5,y.highlightStyle.text=5*_+"%",e(y);for(var x=0;20>x;x++)g[x].highlightStyle.color=_>x?g[x]._color:u,e(g[x]);return e(h),void t()}return setInterval(function(){e(m),_+=_>=20?-20:1,e(y);for(var i=0;20>i;i++)g[i].highlightStyle.color=_>i?g[i]._color:u,e(g[i]);e(h),t()},s.timeInterval)},t}),i("zrender/loadingEffect/Spin",["require","./Base","../tool/util","../tool/color","../tool/area","../shape/Sector"],function(e){function t(e){i.call(this,e)}var i=e("./Base"),n=e("../tool/util"),a=e("../tool/color"),o=e("../tool/area"),r=e("../shape/Sector");return n.inherits(t,i),t.prototype._start=function(e,t){var i=n.merge(this.options,{textStyle:{color:"#fff",textAlign:"start"},backgroundColor:"rgba(0, 0, 0, 0.8)"}),s=this.createTextShape(i.textStyle),l=10,h=o.getTextWidth(s.highlightStyle.text,s.highlightStyle.textFont),m=o.getTextHeight(s.highlightStyle.text,s.highlightStyle.textFont),V=n.merge(this.options.effect||{},{r0:9,r:15,n:18,color:"#fff",timeInterval:100}),U=this.getLocation(this.options.textStyle,h+l+2*V.r,Math.max(2*V.r,m));V.x=U.x+V.r,V.y=s.highlightStyle.y=U.y+U.height/2,s.highlightStyle.x=V.x+V.r+l;for(var d=this.createBackgroundShape(i.backgroundColor),p=V.n,c=V.x,u=V.y,y=V.r0,g=V.r,b=V.color,f=[],k=Math.round(180/p),x=0;p>x;x++)f[x]=new r({highlightStyle:{x:c,y:u,r0:y,r:g,startAngle:k*x*2,endAngle:k*x*2+k,color:a.alpha(b,(x+1)/p),brushType:"fill"}});var _=[0,c,u];return setInterval(function(){e(d),_[0]-=.3;for(var i=0;p>i;i++)f[i].rotation=_,e(f[i]);e(s),t()},V.timeInterval)},t}),i("zrender/loadingEffect/Whirling",["require","./Base","../tool/util","../tool/area","../shape/Ring","../shape/Droplet","../shape/Circle"],function(e){function t(e){i.call(this,e)}var i=e("./Base"),n=e("../tool/util"),a=e("../tool/area"),o=e("../shape/Ring"),r=e("../shape/Droplet"),s=e("../shape/Circle");return n.inherits(t,i),t.prototype._start=function(e,t){var i=n.merge(this.options,{textStyle:{color:"#888",textAlign:"start"},backgroundColor:"rgba(250, 250, 250, 0.8)"}),l=this.createTextShape(i.textStyle),h=10,m=a.getTextWidth(l.highlightStyle.text,l.highlightStyle.textFont),V=a.getTextHeight(l.highlightStyle.text,l.highlightStyle.textFont),U=n.merge(this.options.effect||{},{r:18,colorIn:"#fff",colorOut:"#555",colorWhirl:"#6cf",timeInterval:50}),d=this.getLocation(this.options.textStyle,m+h+2*U.r,Math.max(2*U.r,V));U.x=d.x+U.r,U.y=l.highlightStyle.y=d.y+d.height/2,l.highlightStyle.x=U.x+U.r+h;var p=this.createBackgroundShape(i.backgroundColor),c=new r({highlightStyle:{a:Math.round(U.r/2),b:Math.round(U.r-U.r/6),brushType:"fill",color:U.colorWhirl}}),u=new s({highlightStyle:{r:Math.round(U.r/6),brushType:"fill",color:U.colorIn}}),y=new o({highlightStyle:{r0:Math.round(U.r-U.r/3),r:U.r,brushType:"fill",color:U.colorOut}}),g=[0,U.x,U.y];return c.highlightStyle.x=u.highlightStyle.x=y.highlightStyle.x=g[1],c.highlightStyle.y=u.highlightStyle.y=y.highlightStyle.y=g[2],setInterval(function(){e(p),e(y),g[0]-=.3,c.rotation=g,e(c),e(u),e(l),t()},U.timeInterval)},t}),i("echarts/theme/macarons",[],function(){var e={color:["#2ec7c9","#b6a2de","#5ab1ef","#ffb980","#d87a80","#8d98b3","#e5cf0d","#97b552","#95706d","#dc69aa","#07a2a4","#9a7fd1","#588dd5","#f5994e","#c05050","#59678c","#c9ab00","#7eb00a","#6f5553","#c14089"],title:{textStyle:{fontWeight:"normal",color:"#008acd"}},dataRange:{itemWidth:15,color:["#5ab1ef","#e0ffff"]},toolbox:{color:["#1e90ff","#1e90ff","#1e90ff","#1e90ff"],effectiveColor:"#ff4500"},tooltip:{backgroundColor:"rgba(50,50,50,0.5)",axisPointer:{type:"line",lineStyle:{color:"#008acd"},crossStyle:{color:"#008acd"},shadowStyle:{color:"rgba(200,200,200,0.2)"}}},dataZoom:{dataBackgroundColor:"#efefff",fillerColor:"rgba(182,162,222,0.2)",handleColor:"#008acd"},grid:{borderColor:"#eee"},categoryAxis:{axisLine:{lineStyle:{color:"#008acd"}},splitLine:{lineStyle:{color:["#eee"]}}},valueAxis:{axisLine:{lineStyle:{color:"#008acd"}},splitArea:{show:!0,areaStyle:{color:["rgba(250,250,250,0.1)","rgba(200,200,200,0.1)"]}},splitLine:{lineStyle:{color:["#eee"]}}},polar:{axisLine:{lineStyle:{color:"#ddd"}},splitArea:{show:!0,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(200,200,200,0.2)"]}},splitLine:{lineStyle:{color:"#ddd"}}},timeline:{lineStyle:{color:"#008acd"},controlStyle:{normal:{color:"#008acd"},emphasis:{color:"#008acd"}},symbol:"emptyCircle",symbolSize:3},bar:{itemStyle:{normal:{barBorderRadius:5},emphasis:{barBorderRadius:5}}},line:{smooth:!0,symbol:"emptyCircle",symbolSize:3},k:{itemStyle:{normal:{color:"#d87a80",color0:"#2ec7c9",lineStyle:{color:"#d87a80",color0:"#2ec7c9"}}}},scatter:{symbol:"circle",symbolSize:4},radar:{symbol:"emptyCircle",symbolSize:3},map:{itemStyle:{normal:{areaStyle:{color:"#ddd"},label:{textStyle:{color:"#d87a80"}}},emphasis:{areaStyle:{color:"#fe994e"}}}},force:{itemStyle:{normal:{linkStyle:{color:"#1e90ff"}}}},chord:{itemStyle:{normal:{borderWidth:1,borderColor:"rgba(128, 128, 128, 0.5)",chordStyle:{lineStyle:{color:"rgba(128, 128, 128, 0.5)"}}},emphasis:{borderWidth:1,borderColor:"rgba(128, 128, 128, 0.5)",chordStyle:{lineStyle:{color:"rgba(128, 128, 128, 0.5)"}}}}},gauge:{axisLine:{lineStyle:{color:[[.2,"#2ec7c9"],[.8,"#5ab1ef"],[1,"#d87a80"]],width:10}},axisTick:{splitNumber:10,length:15,lineStyle:{color:"auto"}},splitLine:{length:22,lineStyle:{color:"auto"}},pointer:{width:5}},textStyle:{fontFamily:"微软雅黑, Arial, Verdana, sans-serif"}};return e}),i("echarts/theme/infographic",[],function(){var e={color:["#C1232B","#B5C334","#FCCE10","#E87C25","#27727B","#FE8463","#9BCA63","#FAD860","#F3A43B","#60C0DD","#D7504B","#C6E579","#F4E001","#F0805A","#26C0C0"],title:{textStyle:{fontWeight:"normal",color:"#27727B"}},dataRange:{x:"right",y:"center",itemWidth:5,itemHeight:25,color:["#C1232B","#FCCE10"]},toolbox:{color:["#C1232B","#B5C334","#FCCE10","#E87C25","#27727B","#FE8463","#9BCA63","#FAD860","#F3A43B","#60C0DD"],effectiveColor:"#ff4500"},tooltip:{backgroundColor:"rgba(50,50,50,0.5)",axisPointer:{type:"line",lineStyle:{color:"#27727B",type:"dashed"},crossStyle:{color:"#27727B"},shadowStyle:{color:"rgba(200,200,200,0.3)"}}},dataZoom:{dataBackgroundColor:"rgba(181,195,52,0.3)",fillerColor:"rgba(181,195,52,0.2)",handleColor:"#27727B"},grid:{borderWidth:0},categoryAxis:{axisLine:{lineStyle:{color:"#27727B"}},splitLine:{show:!1}},valueAxis:{axisLine:{show:!1},splitArea:{show:!1},splitLine:{lineStyle:{color:["#ccc"],type:"dashed"}}},polar:{axisLine:{lineStyle:{color:"#ddd"}},splitArea:{show:!0,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(200,200,200,0.2)"]}},splitLine:{lineStyle:{color:"#ddd"}}},timeline:{lineStyle:{color:"#27727B"},controlStyle:{normal:{color:"#27727B"},emphasis:{color:"#27727B"}},symbol:"emptyCircle",symbolSize:3},line:{itemStyle:{normal:{borderWidth:2,borderColor:"#fff",lineStyle:{width:3}},emphasis:{borderWidth:0}},symbol:"circle",symbolSize:3.5},k:{itemStyle:{normal:{color:"#C1232B",color0:"#B5C334",lineStyle:{width:1,color:"#C1232B",color0:"#B5C334"}}}},scatter:{itemStyle:{normal:{borderWidth:1,borderColor:"rgba(200,200,200,0.5)"},emphasis:{borderWidth:0}},symbol:"star4",symbolSize:4},radar:{symbol:"emptyCircle",symbolSize:3},map:{itemStyle:{normal:{areaStyle:{color:"#ddd"},label:{textStyle:{color:"#C1232B"}}},emphasis:{areaStyle:{color:"#fe994e"},label:{textStyle:{color:"rgb(100,0,0)"}}}}},force:{itemStyle:{normal:{linkStyle:{color:"#27727B"}}}},chord:{itemStyle:{normal:{borderWidth:1,borderColor:"rgba(128, 128, 128, 0.5)",chordStyle:{lineStyle:{color:"rgba(128, 128, 128, 0.5)"}}},emphasis:{borderWidth:1,borderColor:"rgba(128, 128, 128, 0.5)",chordStyle:{lineStyle:{color:"rgba(128, 128, 128, 0.5)"}}}}},gauge:{center:["50%","80%"],radius:"100%",startAngle:180,endAngle:0,axisLine:{show:!0,lineStyle:{color:[[.2,"#B5C334"],[.8,"#27727B"],[1,"#C1232B"]],width:"40%"}},axisTick:{splitNumber:2,length:5,lineStyle:{color:"#fff"}},axisLabel:{textStyle:{color:"#fff",fontWeight:"bolder"}},splitLine:{length:"5%",lineStyle:{color:"#fff"}},pointer:{width:"40%",length:"80%",color:"#fff"},title:{offsetCenter:[0,-20],textStyle:{color:"auto",fontSize:20}},detail:{offsetCenter:[0,0],textStyle:{color:"auto",fontSize:40}}},textStyle:{fontFamily:"微软雅黑, Arial, Verdana, sans-serif"}};return e}),i("zrender/dep/excanvas",["require"],function(){return document.createElement("canvas").getContext?G_vmlCanvasManager=!1:!function(){function e(){return this.context_||(this.context_=new f(this))}function t(e,t){var i=O.call(arguments,2);return function(){return e.apply(t,i.concat(O.call(arguments)))}}function i(e){return String(e).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function n(e,t,i){e.namespaces[t]||e.namespaces.add(t,i,"#default#VML")}function a(e){if(n(e,"g_vml_","urn:schemas-microsoft-com:vml"),n(e,"g_o_","urn:schemas-microsoft-com:office:office"),!e.styleSheets.ex_canvas_){var t=e.createStyleSheet();t.owningElement.id="ex_canvas_",t.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}function o(e){var t=e.srcElement;switch(e.propertyName){case"width":t.getContext().clearRect(),t.style.width=t.attributes.width.nodeValue+"px",t.firstChild.style.width=t.clientWidth+"px";break;case"height":t.getContext().clearRect(),t.style.height=t.attributes.height.nodeValue+"px",t.firstChild.style.height=t.clientHeight+"px"}}function r(e){var t=e.srcElement;t.firstChild&&(t.firstChild.style.width=t.clientWidth+"px",t.firstChild.style.height=t.clientHeight+"px")}function s(){return[[1,0,0],[0,1,0],[0,0,1]]}function l(e,t){for(var i=s(),n=0;3>n;n++)for(var a=0;3>a;a++){for(var o=0,r=0;3>r;r++)o+=e[n][r]*t[r][a];i[n][a]=o}return i}function h(e,t){t.fillStyle=e.fillStyle,t.lineCap=e.lineCap,t.lineJoin=e.lineJoin,t.lineWidth=e.lineWidth,t.miterLimit=e.miterLimit,t.shadowBlur=e.shadowBlur,t.shadowColor=e.shadowColor,t.shadowOffsetX=e.shadowOffsetX,t.shadowOffsetY=e.shadowOffsetY,t.strokeStyle=e.strokeStyle,t.globalAlpha=e.globalAlpha,t.font=e.font,t.textAlign=e.textAlign,t.textBaseline=e.textBaseline,t.scaleX_=e.scaleX_,t.scaleY_=e.scaleY_,t.lineScale_=e.lineScale_}function m(e){var t=e.indexOf("(",3),i=e.indexOf(")",t+1),n=e.substring(t+1,i).split(",");return(4!=n.length||"a"!=e.charAt(3))&&(n[3]=1),n}function V(e){return parseFloat(e)/100}function U(e,t,i){return Math.min(i,Math.max(t,e))}function d(e){var t,i,n,a,o,r;if(a=parseFloat(e[0])/360%360,0>a&&a++,o=U(V(e[1]),0,1),r=U(V(e[2]),0,1),0==o)t=i=n=r;else{var s=.5>r?r*(1+o):r+o-r*o,l=2*r-s;t=p(l,s,a+1/3),i=p(l,s,a),n=p(l,s,a-1/3)}return"#"+D[Math.floor(255*t)]+D[Math.floor(255*i)]+D[Math.floor(255*n)]}function p(e,t,i){return 0>i&&i++,i>1&&i--,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+(t-e)*(2/3-i)*6:e}function c(e){if(e in R)return R[e];var t,i=1;if(e=String(e),"#"==e.charAt(0))t=e;else if(/^rgb/.test(e)){for(var n,a=m(e),t="#",o=0;3>o;o++)n=-1!=a[o].indexOf("%")?Math.floor(255*V(a[o])):+a[o],t+=D[U(n,0,255)];i=+a[3]}else if(/^hsl/.test(e)){var a=m(e);t=d(a),i=a[3]}else t=H[e]||e;return R[e]={color:t,alpha:i}}function u(e){if(Y[e])return Y[e];var t,i=document.createElement("div"),n=i.style;try{n.font=e,t=n.fontFamily.split(",")[0]}catch(a){}return Y[e]={style:n.fontStyle||G.style,variant:n.fontVariant||G.variant,weight:n.fontWeight||G.weight,size:n.fontSize||G.size,family:t||G.family}}function y(e,t){var i={};for(var n in e)i[n]=e[n];var a=parseFloat(t.currentStyle.fontSize),o=parseFloat(e.size);return i.size="number"==typeof e.size?e.size:-1!=e.size.indexOf("px")?o:-1!=e.size.indexOf("em")?a*o:-1!=e.size.indexOf("%")?a/100*o:-1!=e.size.indexOf("pt")?o/.75:a,i}function g(e){return e.style+" "+e.variant+" "+e.weight+" "+e.size+"px '"+e.family+"'"}function b(e){return Q[e]||"square"}function f(e){this.m_=s(),this.mStack_=[],this.aStack_=[],this.currentPath_=[],this.strokeStyle="#000",this.fillStyle="#000",this.lineWidth=1,this.lineJoin="miter",this.lineCap="butt",this.miterLimit=1*A,this.globalAlpha=1,this.font="12px 微软雅黑",this.textAlign="left",this.textBaseline="alphabetic",this.canvas=e;var t="width:"+e.clientWidth+"px;height:"+e.clientHeight+"px;overflow:hidden;position:absolute",i=e.ownerDocument.createElement("div");i.style.cssText=t,e.appendChild(i);var n=i.cloneNode(!1);n.style.backgroundColor="#fff",n.style.filter="alpha(opacity=0)",e.appendChild(n),this.element_=i,this.scaleX_=1,this.scaleY_=1,this.lineScale_=1}function k(e,t,i,n){e.currentPath_.push({type:"bezierCurveTo",cp1x:t.x,cp1y:t.y,cp2x:i.x,cp2y:i.y,x:n.x,y:n.y}),e.currentX_=n.x,e.currentY_=n.y}function x(e,t){var i=c(e.strokeStyle),n=i.color,a=i.alpha*e.globalAlpha,o=e.lineScale_*e.lineWidth;1>o&&(a*=o),t.push("<g_vml_:stroke",' opacity="',a,'"',' joinstyle="',e.lineJoin,'"',' miterlimit="',e.miterLimit,'"',' endcap="',b(e.lineCap),'"',' weight="',o,'px"',' color="',n,'" />')}function _(e,t,i,n){var a=e.fillStyle,o=e.scaleX_,r=e.scaleY_,s=n.x-i.x,l=n.y-i.y;if(a instanceof v){var h=0,m={x:0,y:0},V=0,U=1;if("gradient"==a.type_){var d=a.x0_/o,p=a.y0_/r,u=a.x1_/o,y=a.y1_/r,g=L(e,d,p),b=L(e,u,y),f=b.x-g.x,k=b.y-g.y;h=180*Math.atan2(f,k)/Math.PI,0>h&&(h+=360),1e-6>h&&(h=0)}else{var g=L(e,a.x0_,a.y0_);m={x:(g.x-i.x)/s,y:(g.y-i.y)/l},s/=o*A,l/=r*A;var x=C.max(s,l);V=2*a.r0_/x,U=2*a.r1_/x-V}var _=a.colors_;_.sort(function(e,t){return e.offset-t.offset});for(var W=_.length,X=_[0].color,K=_[W-1].color,I=_[0].alpha*e.globalAlpha,J=_[W-1].alpha*e.globalAlpha,S=[],E=0;W>E;E++){var F=_[E];S.push(F.offset*U+V+" "+F.color)}t.push('<g_vml_:fill type="',a.type_,'"',' method="none" focus="100%"',' color="',X,'"',' color2="',K,'"',' colors="',S.join(","),'"',' opacity="',J,'"',' g_o_:opacity2="',I,'"',' angle="',h,'"',' focusposition="',m.x,",",m.y,'" />')}else if(a instanceof w){if(s&&l){var T=-i.x,z=-i.y;t.push("<g_vml_:fill",' position="',T/s*o*o,",",z/l*r*r,'"',' type="tile"',' src="',a.src_,'" />')}}else{var M=c(e.fillStyle),O=M.color,P=M.alpha*e.globalAlpha;t.push('<g_vml_:fill color="',O,'" opacity="',P,'" />')}}function L(e,t,i){var n=e.m_;return{x:A*(t*n[0][0]+i*n[1][0]+n[2][0])-M,y:A*(t*n[0][1]+i*n[1][1]+n[2][1])-M}}function W(e){return isFinite(e[0][0])&&isFinite(e[0][1])&&isFinite(e[1][0])&&isFinite(e[1][1])&&isFinite(e[2][0])&&isFinite(e[2][1])}function X(e,t,i){if(W(t)&&(e.m_=t,e.scaleX_=Math.sqrt(t[0][0]*t[0][0]+t[0][1]*t[0][1]),e.scaleY_=Math.sqrt(t[1][0]*t[1][0]+t[1][1]*t[1][1]),i)){var n=t[0][0]*t[1][1]-t[0][1]*t[1][0];e.lineScale_=z(T(n))}}function v(e){this.type_=e,this.x0_=0,this.y0_=0,this.r0_=0,this.x1_=0,this.y1_=0,this.r1_=0,this.colors_=[]}function w(e,t){switch(I(e),t){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=t;break;default:K("SYNTAX_ERR")}this.src_=e.src,this.width_=e.width,this.height_=e.height}function K(e){throw new J(e)}function I(e){e&&1==e.nodeType&&"IMG"==e.tagName||K("TYPE_MISMATCH_ERR"),"complete"!=e.readyState&&K("INVALID_STATE_ERR")}function J(e){this.code=this[e],this.message=e+": DOM Exception "+this.code}var C=Math,S=C.round,E=C.sin,F=C.cos,T=C.abs,z=C.sqrt,A=10,M=A/2,O=(+navigator.userAgent.match(/MSIE ([\d.]+)?/)[1],Array.prototype.slice);a(document);var P={init:function(e){var i=e||document;i.createElement("canvas"),i.attachEvent("onreadystatechange",t(this.init_,this,i))},init_:function(e){for(var t=e.getElementsByTagName("canvas"),i=0;i<t.length;i++)this.initElement(t[i])},initElement:function(t){if(!t.getContext){t.getContext=e,a(t.ownerDocument),t.innerHTML="",t.attachEvent("onpropertychange",o),t.attachEvent("onresize",r);var i=t.attributes;i.width&&i.width.specified?t.style.width=i.width.nodeValue+"px":t.width=t.clientWidth,i.height&&i.height.specified?t.style.height=i.height.nodeValue+"px":t.height=t.clientHeight}return t}};P.init();for(var D=[],N=0;16>N;N++)for(var B=0;16>B;B++)D[16*N+B]=N.toString(16)+B.toString(16);var H={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"},R={},G={style:"normal",variant:"normal",weight:"normal",size:12,family:"微软雅黑"},Y={},Q={butt:"flat",round:"round"},Z=f.prototype;Z.clearRect=function(){this.textMeasureEl_&&(this.textMeasureEl_.removeNode(!0),this.textMeasureEl_=null),this.element_.innerHTML=""},Z.beginPath=function(){this.currentPath_=[]},Z.moveTo=function(e,t){var i=L(this,e,t);this.currentPath_.push({type:"moveTo",x:i.x,y:i.y}),this.currentX_=i.x,this.currentY_=i.y},Z.lineTo=function(e,t){var i=L(this,e,t);this.currentPath_.push({type:"lineTo",x:i.x,y:i.y}),this.currentX_=i.x,this.currentY_=i.y},Z.bezierCurveTo=function(e,t,i,n,a,o){var r=L(this,a,o),s=L(this,e,t),l=L(this,i,n);k(this,s,l,r)},Z.quadraticCurveTo=function(e,t,i,n){var a=L(this,e,t),o=L(this,i,n),r={x:this.currentX_+2/3*(a.x-this.currentX_),y:this.currentY_+2/3*(a.y-this.currentY_)},s={x:r.x+(o.x-this.currentX_)/3,y:r.y+(o.y-this.currentY_)/3};k(this,r,s,o)},Z.arc=function(e,t,i,n,a,o){i*=A;var r=o?"at":"wa",s=e+F(n)*i-M,l=t+E(n)*i-M,h=e+F(a)*i-M,m=t+E(a)*i-M;s!=h||o||(s+=.125);var V=L(this,e,t),U=L(this,s,l),d=L(this,h,m);this.currentPath_.push({type:r,x:V.x,y:V.y,radius:i,xStart:U.x,yStart:U.y,xEnd:d.x,yEnd:d.y})},Z.rect=function(e,t,i,n){this.moveTo(e,t),this.lineTo(e+i,t),this.lineTo(e+i,t+n),this.lineTo(e,t+n),this.closePath()},Z.strokeRect=function(e,t,i,n){var a=this.currentPath_;this.beginPath(),this.moveTo(e,t),this.lineTo(e+i,t),this.lineTo(e+i,t+n),this.lineTo(e,t+n),this.closePath(),this.stroke(),this.currentPath_=a},Z.fillRect=function(e,t,i,n){var a=this.currentPath_;this.beginPath(),this.moveTo(e,t),this.lineTo(e+i,t),this.lineTo(e+i,t+n),this.lineTo(e,t+n),this.closePath(),this.fill(),this.currentPath_=a},Z.createLinearGradient=function(e,t,i,n){var a=new v("gradient");return a.x0_=e,a.y0_=t,a.x1_=i,a.y1_=n,a},Z.createRadialGradient=function(e,t,i,n,a,o){var r=new v("gradientradial");return r.x0_=e,r.y0_=t,r.r0_=i,r.x1_=n,r.y1_=a,r.r1_=o,r},Z.drawImage=function(e){var t,i,n,a,o,r,s,l,h=e.runtimeStyle.width,m=e.runtimeStyle.height;e.runtimeStyle.width="auto",e.runtimeStyle.height="auto";var V=e.width,U=e.height;if(e.runtimeStyle.width=h,e.runtimeStyle.height=m,3==arguments.length)t=arguments[1],i=arguments[2],o=r=0,s=n=V,l=a=U;else if(5==arguments.length)t=arguments[1],i=arguments[2],n=arguments[3],a=arguments[4],o=r=0,s=V,l=U;else{if(9!=arguments.length)throw Error("Invalid number of arguments");o=arguments[1],r=arguments[2],s=arguments[3],l=arguments[4],t=arguments[5],i=arguments[6],n=arguments[7],a=arguments[8]}var d=L(this,t,i),p=[],c=10,u=10,y=b=1;if(p.push(" <g_vml_:group",' coordsize="',A*c,",",A*u,'"',' coordorigin="0,0"',' style="width:',c,"px;height:",u,"px;position:absolute;"),1!=this.m_[0][0]||this.m_[0][1]||1!=this.m_[1][1]||this.m_[1][0]){var g=[],y=this.scaleX_,b=this.scaleY_;g.push("M11=",this.m_[0][0]/y,",","M12=",this.m_[1][0]/b,",","M21=",this.m_[0][1]/y,",","M22=",this.m_[1][1]/b,",","Dx=",S(d.x/A),",","Dy=",S(d.y/A),"");var f=d,k=L(this,t+n,i),x=L(this,t,i+a),_=L(this,t+n,i+a);f.x=C.max(f.x,k.x,x.x,_.x),f.y=C.max(f.y,k.y,x.y,_.y),p.push("padding:0 ",S(f.x/A),"px ",S(f.y/A),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",g.join(""),", SizingMethod='clip');")}else p.push("top:",S(d.y/A),"px;left:",S(d.x/A),"px;");p.push(' ">'),(o||r)&&p.push('<div style="overflow: hidden; width:',Math.ceil((n+o*n/s)*y),"px;"," height:",Math.ceil((a+r*a/l)*b),"px;"," filter:progid:DxImageTransform.Microsoft.Matrix(Dx=",-o*n/s*y,",Dy=",-r*a/l*b,');">'),p.push('<div style="width:',Math.round(y*V*n/s),"px;"," height:",Math.round(b*U*a/l),"px;"," filter:"),this.globalAlpha<1&&p.push(" progid:DXImageTransform.Microsoft.Alpha(opacity="+100*this.globalAlpha+")"),p.push(" progid:DXImageTransform.Microsoft.AlphaImageLoader(src=",e.src,',sizingMethod=scale)">'),(o||r)&&p.push("</div>"),p.push("</div></div>"),this.element_.insertAdjacentHTML("BeforeEnd",p.join(""))},Z.stroke=function(e){var t=[],i=10,n=10;t.push("<g_vml_:shape",' filled="',!!e,'"',' style="position:absolute;width:',i,"px;height:",n,'px;"',' coordorigin="0,0"',' coordsize="',A*i,",",A*n,'"',' stroked="',!e,'"',' path="');for(var a={x:null,y:null},o={x:null,y:null},r=0;r<this.currentPath_.length;r++){var s,l=this.currentPath_[r];switch(l.type){case"moveTo":s=l,t.push(" m ",S(l.x),",",S(l.y));break;case"lineTo":t.push(" l ",S(l.x),",",S(l.y));break;case"close":t.push(" x "),l=null;break;case"bezierCurveTo":t.push(" c ",S(l.cp1x),",",S(l.cp1y),",",S(l.cp2x),",",S(l.cp2y),",",S(l.x),",",S(l.y));break;case"at":case"wa":t.push(" ",l.type," ",S(l.x-this.scaleX_*l.radius),",",S(l.y-this.scaleY_*l.radius)," ",S(l.x+this.scaleX_*l.radius),",",S(l.y+this.scaleY_*l.radius)," ",S(l.xStart),",",S(l.yStart)," ",S(l.xEnd),",",S(l.yEnd))}l&&((null==a.x||l.x<a.x)&&(a.x=l.x),(null==o.x||l.x>o.x)&&(o.x=l.x),(null==a.y||l.y<a.y)&&(a.y=l.y),(null==o.y||l.y>o.y)&&(o.y=l.y))}t.push(' ">'),e?_(this,t,a,o):x(this,t),t.push("</g_vml_:shape>"),this.element_.insertAdjacentHTML("beforeEnd",t.join(""))},Z.fill=function(){this.stroke(!0)},Z.closePath=function(){this.currentPath_.push({type:"close"})},Z.save=function(){var e={};h(this,e),this.aStack_.push(e),this.mStack_.push(this.m_),this.m_=l(s(),this.m_)},Z.restore=function(){this.aStack_.length&&(h(this.aStack_.pop(),this),this.m_=this.mStack_.pop())},Z.translate=function(e,t){var i=[[1,0,0],[0,1,0],[e,t,1]];X(this,l(i,this.m_),!1)},Z.rotate=function(e){var t=F(e),i=E(e),n=[[t,i,0],[-i,t,0],[0,0,1]];X(this,l(n,this.m_),!1)},Z.scale=function(e,t){var i=[[e,0,0],[0,t,0],[0,0,1]];X(this,l(i,this.m_),!0)},Z.transform=function(e,t,i,n,a,o){var r=[[e,t,0],[i,n,0],[a,o,1]];X(this,l(r,this.m_),!0)},Z.setTransform=function(e,t,i,n,a,o){var r=[[e,t,0],[i,n,0],[a,o,1]];X(this,r,!0)},Z.drawText_=function(e,t,n,a,o){var r=this.m_,s=1e3,l=0,h=s,m={x:0,y:0},V=[],U=y(u(this.font),this.element_),d=g(U),p=this.element_.currentStyle,c=this.textAlign.toLowerCase();switch(c){case"left":case"center":case"right":break;case"end":c="ltr"==p.direction?"right":"left";break;case"start":c="rtl"==p.direction?"right":"left";break;default:c="left"}switch(this.textBaseline){case"hanging":case"top":m.y=U.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":m.y=-U.size/2.25}switch(c){case"right":l=s,h=.05;break;case"center":l=h=s/2}var b=L(this,t+m.x,n+m.y);V.push('<g_vml_:line from="',-l,' 0" to="',h,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!o,'" stroked="',!!o,'" style="position:absolute;width:1px;height:1px;">'),o?x(this,V):_(this,V,{x:-l,y:0},{x:h,y:U.size});var f=r[0][0].toFixed(3)+","+r[1][0].toFixed(3)+","+r[0][1].toFixed(3)+","+r[1][1].toFixed(3)+",0,0",k=S(b.x/A)+","+S(b.y/A);V.push('<g_vml_:skew on="t" matrix="',f,'" ',' offset="',k,'" origin="',l,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',i(e),'" style="v-text-align:',c,";font:",i(d),'" /></g_vml_:line>'),this.element_.insertAdjacentHTML("beforeEnd",V.join(""))},Z.fillText=function(e,t,i,n){this.drawText_(e,t,i,n,!1)},Z.strokeText=function(e,t,i,n){this.drawText_(e,t,i,n,!0)},Z.measureText=function(e){if(!this.textMeasureEl_){var t='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",t),this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";try{this.textMeasureEl_.style.font=this.font}catch(n){}return this.textMeasureEl_.appendChild(i.createTextNode(e)),{width:this.textMeasureEl_.offsetWidth}},Z.clip=function(){},Z.arcTo=function(){},Z.createPattern=function(e,t){return new w(e,t)},v.prototype.addColorStop=function(e,t){t=c(t),this.colors_.push({offset:e,color:t.color,alpha:t.alpha})};var q=J.prototype=new Error;q.INDEX_SIZE_ERR=1,q.DOMSTRING_SIZE_ERR=2,q.HIERARCHY_REQUEST_ERR=3,q.WRONG_DOCUMENT_ERR=4,q.INVALID_CHARACTER_ERR=5,q.NO_DATA_ALLOWED_ERR=6,q.NO_MODIFICATION_ALLOWED_ERR=7,q.NOT_FOUND_ERR=8,q.NOT_SUPPORTED_ERR=9,q.INUSE_ATTRIBUTE_ERR=10,q.INVALID_STATE_ERR=11,q.SYNTAX_ERR=12,q.INVALID_MODIFICATION_ERR=13,q.NAMESPACE_ERR=14,q.INVALID_ACCESS_ERR=15,q.VALIDATION_ERR=16,q.TYPE_MISMATCH_ERR=17,G_vmlCanvasManager=P,CanvasRenderingContext2D=f,CanvasGradient=v,CanvasPattern=w,DOMException=J}(),G_vmlCanvasManager}),i("zrender/mixin/Eventful",["require"],function(){var e=function(){this._handlers={}};return e.prototype.one=function(e,t,i){var n=this._handlers;return t&&e?(n[e]||(n[e]=[]),n[e].push({h:t,one:!0,ctx:i||this}),this):this},e.prototype.bind=function(e,t,i){var n=this._handlers;return t&&e?(n[e]||(n[e]=[]),n[e].push({h:t,one:!1,ctx:i||this}),this):this},e.prototype.unbind=function(e,t){var i=this._handlers;if(!e)return this._handlers={},this;if(t){if(i[e]){for(var n=[],a=0,o=i[e].length;o>a;a++)i[e][a].h!=t&&n.push(i[e][a]);i[e]=n}i[e]&&0===i[e].length&&delete i[e]}else delete i[e];return this},e.prototype.dispatch=function(e){if(this._handlers[e]){var t=arguments,i=t.length;i>3&&(t=Array.prototype.slice.call(t,1));for(var n=this._handlers[e],a=n.length,o=0;a>o;){switch(i){case 1:n[o].h.call(n[o].ctx);break;case 2:n[o].h.call(n[o].ctx,t[1]);break;case 3:n[o].h.call(n[o].ctx,t[1],t[2]);break;default:n[o].h.apply(n[o].ctx,t)}n[o].one?(n.splice(o,1),a--):o++}}return this},e.prototype.dispatchWithContext=function(e){if(this._handlers[e]){var t=arguments,i=t.length;i>4&&(t=Array.prototype.slice.call(t,1,t.length-1));for(var n=t[t.length-1],a=this._handlers[e],o=a.length,r=0;o>r;){switch(i){case 1:a[r].h.call(n);break;case 2:a[r].h.call(n,t[1]);break;case 3:a[r].h.call(n,t[1],t[2]);break;default:a[r].h.apply(n,t)}a[r].one?(a.splice(r,1),o--):r++}}return this},e}),i("zrender/tool/log",["require","../config"],function(e){var t=e("../config");return function(){if(0!==t.debugMode)if(1==t.debugMode)for(var e in arguments)throw new Error(arguments[e]);else if(t.debugMode>1)for(var e in arguments)console.log(arguments[e])}}),i("zrender/tool/guid",[],function(){var e=2311;return function(){return"zrender__"+e++}}),i("zrender/Handler",["require","./config","./tool/env","./tool/event","./tool/util","./tool/vector","./tool/matrix","./mixin/Eventful"],function(e){"use strict";function t(e,t){return function(i,n){return e.call(t,i,n)}}function i(e,t){return function(i,n,a){return e.call(t,i,n,a)}}function n(e){for(var i=d.length;i--;){var n=d[i];e["_"+n+"Handler"]=t(c[n],e)}}function a(e,t,i){if(this._draggingTarget&&this._draggingTarget.id==e.id||e.isSilent())return!1;var n=this._event;if(e.isCover(t,i)){e.hoverable&&this.storage.addHover(e);for(var a=e.parent;a;){if(a.clipShape&&!a.clipShape.isCover(this._mouseX,this._mouseY))return!1;a=a.parent}return this._lastHover!=e&&(this._processOutShape(n),this._processDragLeave(n),this._lastHover=e,this._processDragEnter(n)),this._processOverShape(n),this._processDragOver(n),this._hasfound=1,!0}return!1}var o=e("./config"),r=e("./tool/env"),s=e("./tool/event"),l=e("./tool/util"),h=e("./tool/vector"),m=e("./tool/matrix"),V=o.EVENT,U=e("./mixin/Eventful"),d=["resize","click","dblclick","mousewheel","mousemove","mouseout","mouseup","mousedown","touchstart","touchend","touchmove"],p=function(e){if(window.G_vmlCanvasManager)return!0;e=e||window.event;var t=e.toElement||e.relatedTarget||e.srcElement||e.target;return t&&t.className.match(o.elementClassName)},c={resize:function(e){e=e||window.event,this._lastHover=null,this._isMouseDown=0,this.dispatch(V.RESIZE,e)},click:function(e,t){if(p(e)||t){e=this._zrenderEventFixed(e);var i=this._lastHover;(i&&i.clickable||!i)&&this._clickThreshold<5&&this._dispatchAgency(i,V.CLICK,e),this._mousemoveHandler(e)}},dblclick:function(e,t){if(p(e)||t){e=e||window.event,e=this._zrenderEventFixed(e);var i=this._lastHover;(i&&i.clickable||!i)&&this._clickThreshold<5&&this._dispatchAgency(i,V.DBLCLICK,e),this._mousemoveHandler(e)}},mousewheel:function(e,t){if(p(e)||t){e=this._zrenderEventFixed(e);var i=e.wheelDelta||-e.detail,n=i>0?1.1:1/1.1,a=!1,o=this._mouseX,r=this._mouseY;this.painter.eachBuildinLayer(function(t){var i=t.position;if(t.zoomable){t.__zoom=t.__zoom||1;var l=t.__zoom;l*=n,l=Math.max(Math.min(t.maxZoom,l),t.minZoom),n=l/t.__zoom,t.__zoom=l,i[0]-=(o-i[0])*(n-1),i[1]-=(r-i[1])*(n-1),t.scale[0]*=n,t.scale[1]*=n,t.dirty=!0,a=!0,s.stop(e)}}),a&&this.painter.refresh(),this._dispatchAgency(this._lastHover,V.MOUSEWHEEL,e),this._mousemoveHandler(e)}},mousemove:function(e,t){if((p(e)||t)&&!this.painter.isLoading()){e=this._zrenderEventFixed(e),this._lastX=this._mouseX,this._lastY=this._mouseY,this._mouseX=s.getX(e),this._mouseY=s.getY(e);var i=this._mouseX-this._lastX,n=this._mouseY-this._lastY;this._processDragStart(e),this._hasfound=0,this._event=e,this._iterateAndFindHover(),this._hasfound||((!this._draggingTarget||this._lastHover&&this._lastHover!=this._draggingTarget)&&(this._processOutShape(e),
-this._processDragLeave(e)),this._lastHover=null,this.storage.delHover(),this.painter.clearHover());var a="default";if(this._draggingTarget)this.storage.drift(this._draggingTarget.id,i,n),this._draggingTarget.modSelf(),this.storage.addHover(this._draggingTarget),this._clickThreshold++;else if(this._isMouseDown){var o=!1;this.painter.eachBuildinLayer(function(e){e.panable&&(a="move",e.position[0]+=i,e.position[1]+=n,o=!0,e.dirty=!0)}),o&&this.painter.refresh()}this._draggingTarget||this._hasfound&&this._lastHover.draggable?a="move":this._hasfound&&this._lastHover.clickable&&(a="pointer"),this.root.style.cursor=a,this._dispatchAgency(this._lastHover,V.MOUSEMOVE,e),(this._draggingTarget||this._hasfound||this.storage.hasHoverShape())&&this.painter.refreshHover()}},mouseout:function(e,t){if(p(e)||t){e=this._zrenderEventFixed(e);var i=e.toElement||e.relatedTarget;if(i!=this.root)for(;i&&9!=i.nodeType;){if(i==this.root)return void this._mousemoveHandler(e);i=i.parentNode}e.zrenderX=this._lastX,e.zrenderY=this._lastY,this.root.style.cursor="default",this._isMouseDown=0,this._processOutShape(e),this._processDrop(e),this._processDragEnd(e),this.painter.isLoading()||this.painter.refreshHover(),this.dispatch(V.GLOBALOUT,e)}},mousedown:function(e,t){if(p(e)||t){if(this._clickThreshold=0,2==this._lastDownButton)return this._lastDownButton=e.button,void(this._mouseDownTarget=null);this._lastMouseDownMoment=new Date,e=this._zrenderEventFixed(e),this._isMouseDown=1,this._mouseDownTarget=this._lastHover,this._dispatchAgency(this._lastHover,V.MOUSEDOWN,e),this._lastDownButton=e.button}},mouseup:function(e,t){(p(e)||t)&&(e=this._zrenderEventFixed(e),this.root.style.cursor="default",this._isMouseDown=0,this._mouseDownTarget=null,this._dispatchAgency(this._lastHover,V.MOUSEUP,e),this._processDrop(e),this._processDragEnd(e))},touchstart:function(e,t){(p(e)||t)&&(e=this._zrenderEventFixed(e,!0),this._lastTouchMoment=new Date,this._mobileFindFixed(e),this._mousedownHandler(e))},touchmove:function(e,t){(p(e)||t)&&(e=this._zrenderEventFixed(e,!0),this._mousemoveHandler(e),this._isDragging&&s.stop(e))},touchend:function(e,t){if(p(e)||t){e=this._zrenderEventFixed(e,!0),this._mouseupHandler(e);var i=new Date;i-this._lastTouchMoment<V.touchClickDelay&&(this._mobileFindFixed(e),this._clickHandler(e),i-this._lastClickMoment<V.touchClickDelay/2&&(this._dblclickHandler(e),this._lastHover&&this._lastHover.clickable&&s.stop(e)),this._lastClickMoment=i),this.painter.clearHover()}}},u=function(e,t,o){U.call(this),this.root=e,this.storage=t,this.painter=o,this._lastX=this._lastY=this._mouseX=this._mouseY=0,this._findHover=i(a,this),this._domHover=o.getDomHover(),n(this),window.addEventListener?(window.addEventListener("resize",this._resizeHandler),r.os.tablet||r.os.phone?(e.addEventListener("touchstart",this._touchstartHandler),e.addEventListener("touchmove",this._touchmoveHandler),e.addEventListener("touchend",this._touchendHandler)):(e.addEventListener("click",this._clickHandler),e.addEventListener("dblclick",this._dblclickHandler),e.addEventListener("mousewheel",this._mousewheelHandler),e.addEventListener("mousemove",this._mousemoveHandler),e.addEventListener("mousedown",this._mousedownHandler),e.addEventListener("mouseup",this._mouseupHandler)),e.addEventListener("DOMMouseScroll",this._mousewheelHandler),e.addEventListener("mouseout",this._mouseoutHandler)):(window.attachEvent("onresize",this._resizeHandler),e.attachEvent("onclick",this._clickHandler),e.ondblclick=this._dblclickHandler,e.attachEvent("onmousewheel",this._mousewheelHandler),e.attachEvent("onmousemove",this._mousemoveHandler),e.attachEvent("onmouseout",this._mouseoutHandler),e.attachEvent("onmousedown",this._mousedownHandler),e.attachEvent("onmouseup",this._mouseupHandler))};u.prototype.on=function(e,t,i){return this.bind(e,t,i),this},u.prototype.un=function(e,t){return this.unbind(e,t),this},u.prototype.trigger=function(e,t){switch(e){case V.RESIZE:case V.CLICK:case V.DBLCLICK:case V.MOUSEWHEEL:case V.MOUSEMOVE:case V.MOUSEDOWN:case V.MOUSEUP:case V.MOUSEOUT:this["_"+e+"Handler"](t,!0)}},u.prototype.dispose=function(){var e=this.root;window.removeEventListener?(window.removeEventListener("resize",this._resizeHandler),r.os.tablet||r.os.phone?(e.removeEventListener("touchstart",this._touchstartHandler),e.removeEventListener("touchmove",this._touchmoveHandler),e.removeEventListener("touchend",this._touchendHandler)):(e.removeEventListener("click",this._clickHandler),e.removeEventListener("dblclick",this._dblclickHandler),e.removeEventListener("mousewheel",this._mousewheelHandler),e.removeEventListener("mousemove",this._mousemoveHandler),e.removeEventListener("mousedown",this._mousedownHandler),e.removeEventListener("mouseup",this._mouseupHandler)),e.removeEventListener("DOMMouseScroll",this._mousewheelHandler),e.removeEventListener("mouseout",this._mouseoutHandler)):(window.detachEvent("onresize",this._resizeHandler),e.detachEvent("onclick",this._clickHandler),e.detachEvent("dblclick",this._dblclickHandler),e.detachEvent("onmousewheel",this._mousewheelHandler),e.detachEvent("onmousemove",this._mousemoveHandler),e.detachEvent("onmouseout",this._mouseoutHandler),e.detachEvent("onmousedown",this._mousedownHandler),e.detachEvent("onmouseup",this._mouseupHandler)),this.root=this._domHover=this.storage=this.painter=null,this.un()},u.prototype._processDragStart=function(e){var t=this._lastHover;if(this._isMouseDown&&t&&t.draggable&&!this._draggingTarget&&this._mouseDownTarget==t){if(t.dragEnableTime&&new Date-this._lastMouseDownMoment<t.dragEnableTime)return;var i=t;this._draggingTarget=i,this._isDragging=1,i.invisible=!0,this.storage.mod(i.id),this._dispatchAgency(i,V.DRAGSTART,e),this.painter.refresh()}},u.prototype._processDragEnter=function(e){this._draggingTarget&&this._dispatchAgency(this._lastHover,V.DRAGENTER,e,this._draggingTarget)},u.prototype._processDragOver=function(e){this._draggingTarget&&this._dispatchAgency(this._lastHover,V.DRAGOVER,e,this._draggingTarget)},u.prototype._processDragLeave=function(e){this._draggingTarget&&this._dispatchAgency(this._lastHover,V.DRAGLEAVE,e,this._draggingTarget)},u.prototype._processDrop=function(e){this._draggingTarget&&(this._draggingTarget.invisible=!1,this.storage.mod(this._draggingTarget.id),this.painter.refresh(),this._dispatchAgency(this._lastHover,V.DROP,e,this._draggingTarget))},u.prototype._processDragEnd=function(e){this._draggingTarget&&(this._dispatchAgency(this._draggingTarget,V.DRAGEND,e),this._lastHover=null),this._isDragging=0,this._draggingTarget=null},u.prototype._processOverShape=function(e){this._dispatchAgency(this._lastHover,V.MOUSEOVER,e)},u.prototype._processOutShape=function(e){this._dispatchAgency(this._lastHover,V.MOUSEOUT,e)},u.prototype._dispatchAgency=function(e,t,i,n){var a="on"+t,o={type:t,event:i,target:e,cancelBubble:!1},r=e;for(n&&(o.dragged=n);r&&(r[a]&&(o.cancelBubble=r[a](o)),r.dispatch(t,o),r=r.parent,!o.cancelBubble););if(e)o.cancelBubble||this.dispatch(t,o);else if(!n){var s={type:t,event:i};this.dispatch(t,s),this.painter.eachOtherLayer(function(e){"function"==typeof e[a]&&e[a](s),e.dispatch&&e.dispatch(t,s)})}},u.prototype._iterateAndFindHover=function(){var e=m.create();return function(){for(var t,i,n=this.storage.getShapeList(),a=[0,0],o=n.length-1;o>=0;o--){var r=n[o];if(t!==r.zlevel&&(i=this.painter.getLayer(r.zlevel,i),a[0]=this._mouseX,a[1]=this._mouseY,i.needTransform&&(m.invert(e,i.transform),h.applyTransform(a,a,e))),this._findHover(r,a[0],a[1]))break}}}();var y=[{x:10},{x:-20},{x:10,y:10},{y:-20}];return u.prototype._mobileFindFixed=function(e){this._lastHover=null,this._mouseX=e.zrenderX,this._mouseY=e.zrenderY,this._event=e,this._iterateAndFindHover();for(var t=0;!this._lastHover&&t<y.length;t++){var i=y[t];i.x&&(this._mouseX+=i.x),i.y&&(this._mouseY+=i.y),this._iterateAndFindHover()}this._lastHover&&(e.zrenderX=this._mouseX,e.zrenderY=this._mouseY)},u.prototype._zrenderEventFixed=function(e,t){if(e.zrenderFixed)return e;if(t){var i="touchend"!=e.type?e.targetTouches[0]:e.changedTouches[0];if(i){var n=this.painter._domRoot.getBoundingClientRect();e.zrenderX=i.clientX-n.left,e.zrenderY=i.clientY-n.top}}else{e=e||window.event;var a=e.toElement||e.relatedTarget||e.srcElement||e.target;a&&a!=this._domHover&&(e.zrenderX=("undefined"!=typeof e.offsetX?e.offsetX:e.layerX)+a.offsetLeft,e.zrenderY=("undefined"!=typeof e.offsetY?e.offsetY:e.layerY)+a.offsetTop)}return e.zrenderFixed=1,e},l.merge(u.prototype,U.prototype,!0),u}),i("zrender/Painter",["require","./config","./tool/util","./tool/log","./loadingEffect/Base","./Layer","./shape/Image"],function(e){"use strict";function t(){return!1}function i(){}function n(e){return e?e.isBuildin?!0:"function"!=typeof e.resize||"function"!=typeof e.refresh?!1:!0:!1}var a=e("./config"),o=e("./tool/util"),r=e("./tool/log"),s=e("./loadingEffect/Base"),l=e("./Layer"),h=function(e,i){this.root=e,e.style["-webkit-tap-highlight-color"]="transparent",e.style["-webkit-user-select"]="none",e.style["user-select"]="none",e.style["-webkit-touch-callout"]="none",this.storage=i,e.innerHTML="",this._width=this._getWidth(),this._height=this._getHeight();var n=document.createElement("div");this._domRoot=n,n.style.position="relative",n.style.overflow="hidden",n.style.width=this._width+"px",n.style.height=this._height+"px",e.appendChild(n),this._layers={},this._zlevelList=[],this._layerConfig={},this._loadingEffect=new s({}),this.shapeToImage=this._createShapeToImageProcessor(),this._bgDom=document.createElement("div"),this._bgDom.style.cssText=["position:absolute;left:0px;top:0px;width:",this._width,"px;height:",this._height+"px;","-webkit-user-select:none;user-select;none;","-webkit-touch-callout:none;"].join(""),this._bgDom.setAttribute("data-zr-dom-id","bg"),this._bgDom.className=a.elementClassName,n.appendChild(this._bgDom),this._bgDom.onselectstart=t;var o=new l("_zrender_hover_",this);this._layers.hover=o,n.appendChild(o.dom),o.initContext(),o.dom.onselectstart=t,o.dom.style["-webkit-user-select"]="none",o.dom.style["user-select"]="none",o.dom.style["-webkit-touch-callout"]="none",this.refreshNextFrame=null};return h.prototype.render=function(e){return this.isLoading()&&this.hideLoading(),this.refresh(e,!0),this},h.prototype.refresh=function(e,t){var i=this.storage.getShapeList(!0);this._paintList(i,t);for(var n=0;n<this._zlevelList.length;n++){var a=this._zlevelList[n],o=this._layers[a];!o.isBuildin&&o.refresh&&o.refresh()}return"function"==typeof e&&e(),this},h.prototype._preProcessLayer=function(e){e.unusedCount++,e.updateTransform()},h.prototype._postProcessLayer=function(e){e.dirty=!1,1==e.unusedCount&&e.clear()},h.prototype._paintList=function(e,t){"undefined"==typeof t&&(t=!1),this._updateLayerStatus(e);var i,n,o;this.eachBuildinLayer(this._preProcessLayer);for(var s=0,l=e.length;l>s;s++){var h=e[s];if(n!==h.zlevel&&(i&&(i.needTransform&&o.restore(),o.flush&&o.flush()),n=h.zlevel,i=this.getLayer(n),i.isBuildin||r("ZLevel "+n+" has been used by unkown layer "+i.id),o=i.ctx,i.unusedCount=0,(i.dirty||t)&&i.clear(),i.needTransform&&(o.save(),i.setTransform(o))),(i.dirty||t)&&!h.invisible&&(!h.onbrush||h.onbrush&&!h.onbrush(o,!1)))if(a.catchBrushException)try{h.brush(o,!1,this.refreshNextFrame)}catch(m){r(m,"brush error of "+h.type,h)}else h.brush(o,!1,this.refreshNextFrame);h.__dirty=!1}i&&(i.needTransform&&o.restore(),o.flush&&o.flush()),this.eachBuildinLayer(this._postProcessLayer)},h.prototype.getLayer=function(e){var t=this._layers[e];return t||(t=new l(e,this),t.isBuildin=!0,this._layerConfig[e]&&o.merge(t,this._layerConfig[e],!0),t.updateTransform(),this.insertLayer(e,t),t.initContext()),t},h.prototype.insertLayer=function(e,t){if(this._layers[e])return void r("ZLevel "+e+" has been used already");if(!n(t))return void r("Layer of zlevel "+e+" is not valid");var i=this._zlevelList.length,a=null,o=-1;if(i>0&&e>this._zlevelList[0]){for(o=0;i-1>o&&!(this._zlevelList[o]<e&&this._zlevelList[o+1]>e);o++);a=this._layers[this._zlevelList[o]]}this._zlevelList.splice(o+1,0,e);var s=a?a.dom:this._bgDom;s.nextSibling?s.parentNode.insertBefore(t.dom,s.nextSibling):s.parentNode.appendChild(t.dom),this._layers[e]=t},h.prototype.eachLayer=function(e,t){for(var i=0;i<this._zlevelList.length;i++){var n=this._zlevelList[i];e.call(t,this._layers[n],n)}},h.prototype.eachBuildinLayer=function(e,t){for(var i=0;i<this._zlevelList.length;i++){var n=this._zlevelList[i],a=this._layers[n];a.isBuildin&&e.call(t,a,n)}},h.prototype.eachOtherLayer=function(e,t){for(var i=0;i<this._zlevelList.length;i++){var n=this._zlevelList[i],a=this._layers[n];a.isBuildin||e.call(t,a,n)}},h.prototype.getLayers=function(){return this._layers},h.prototype._updateLayerStatus=function(e){var t=this._layers,i={};this.eachBuildinLayer(function(e,t){i[t]=e.elCount,e.elCount=0});for(var n=0,a=e.length;a>n;n++){var o=e[n],r=o.zlevel,s=t[r];if(s){if(s.elCount++,s.dirty)continue;s.dirty=o.__dirty}}this.eachBuildinLayer(function(e,t){i[t]!==e.elCount&&(e.dirty=!0)})},h.prototype.refreshShapes=function(e,t){for(var i=0,n=e.length;n>i;i++){var a=e[i];a.modSelf()}return this.refresh(t),this},h.prototype.setLoadingEffect=function(e){return this._loadingEffect=e,this},h.prototype.clear=function(){return this.eachBuildinLayer(this._clearLayer),this},h.prototype._clearLayer=function(e){e.clear()},h.prototype.modLayer=function(e,t){if(t){this._layerConfig[e]?o.merge(this._layerConfig[e],t,!0):this._layerConfig[e]=t;var i=this._layers[e];i&&o.merge(i,this._layerConfig[e],!0)}},h.prototype.delLayer=function(e){var t=this._layers[e];t&&(this.modLayer(e,{position:t.position,rotation:t.rotation,scale:t.scale}),t.dom.parentNode.removeChild(t.dom),delete this._layers[e],this._zlevelList.splice(o.indexOf(this._zlevelList,e),1))},h.prototype.refreshHover=function(){this.clearHover();for(var e=this.storage.getHoverShapes(!0),t=0,i=e.length;i>t;t++)this._brushHover(e[t]);var n=this._layers.hover.ctx;return n.flush&&n.flush(),this.storage.delHover(),this},h.prototype.clearHover=function(){var e=this._layers.hover;return e&&e.clear(),this},h.prototype.showLoading=function(e){return this._loadingEffect&&this._loadingEffect.stop(),e&&this.setLoadingEffect(e),this._loadingEffect.start(this),this.loading=!0,this},h.prototype.hideLoading=function(){return this._loadingEffect.stop(),this.clearHover(),this.loading=!1,this},h.prototype.isLoading=function(){return this.loading},h.prototype.resize=function(){var e=this._domRoot;e.style.display="none";var t=this._getWidth(),i=this._getHeight();if(e.style.display="",this._width!=t||i!=this._height){this._width=t,this._height=i,e.style.width=t+"px",e.style.height=i+"px";for(var n in this._layers)this._layers[n].resize(t,i);this.refresh(null,!0)}return this},h.prototype.clearLayer=function(e){var t=this._layers[e];t&&t.clear()},h.prototype.dispose=function(){this.isLoading()&&this.hideLoading(),this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},h.prototype.getDomHover=function(){return this._layers.hover.dom},h.prototype.toDataURL=function(e,t,i){if(window.G_vmlCanvasManager)return null;var n=new l("image",this);this._bgDom.appendChild(n.dom),n.initContext();var o=n.ctx;n.clearColor=t||"#fff",n.clear();var s=this;this.storage.iterShape(function(e){if(!e.invisible&&(!e.onbrush||e.onbrush&&!e.onbrush(o,!1)))if(a.catchBrushException)try{e.brush(o,!1,s.refreshNextFrame)}catch(t){r(t,"brush error of "+e.type,e)}else e.brush(o,!1,s.refreshNextFrame)},{normal:"up",update:!0});var h=n.dom.toDataURL(e,i);return o=null,this._bgDom.removeChild(n.dom),h},h.prototype.getWidth=function(){return this._width},h.prototype.getHeight=function(){return this._height},h.prototype._getWidth=function(){var e=this.root,t=e.currentStyle||document.defaultView.getComputedStyle(e);return((e.clientWidth||parseInt(t.width,10))-parseInt(t.paddingLeft,10)-parseInt(t.paddingRight,10)).toFixed(0)-0},h.prototype._getHeight=function(){var e=this.root,t=e.currentStyle||document.defaultView.getComputedStyle(e);return((e.clientHeight||parseInt(t.height,10))-parseInt(t.paddingTop,10)-parseInt(t.paddingBottom,10)).toFixed(0)-0},h.prototype._brushHover=function(e){var t=this._layers.hover.ctx;if(!e.onbrush||e.onbrush&&!e.onbrush(t,!0)){var i=this.getLayer(e.zlevel);if(i.needTransform&&(t.save(),i.setTransform(t)),a.catchBrushException)try{e.brush(t,!0,this.refreshNextFrame)}catch(n){r(n,"hoverBrush error of "+e.type,e)}else e.brush(t,!0,this.refreshNextFrame);i.needTransform&&t.restore()}},h.prototype._shapeToImage=function(t,i,n,a,o){var r=document.createElement("canvas"),s=r.getContext("2d");r.style.width=n+"px",r.style.height=a+"px",r.setAttribute("width",n*o),r.setAttribute("height",a*o),s.clearRect(0,0,n*o,a*o);var l={position:i.position,rotation:i.rotation,scale:i.scale};i.position=[0,0,0],i.rotation=0,i.scale=[1,1],i&&i.brush(s,!1);var h=e("./shape/Image"),m=new h({id:t,style:{x:0,y:0,image:r}});return null!=l.position&&(m.position=i.position=l.position),null!=l.rotation&&(m.rotation=i.rotation=l.rotation),null!=l.scale&&(m.scale=i.scale=l.scale),m},h.prototype._createShapeToImageProcessor=function(){if(window.G_vmlCanvasManager)return i;var e=this;return function(t,i,n,o){return e._shapeToImage(t,i,n,o,a.devicePixelRatio)}},h}),i("zrender/Storage",["require","./tool/util","./Group"],function(e){"use strict";function t(e,t){return e.zlevel==t.zlevel?e.z==t.z?e.__renderidx-t.__renderidx:e.z-t.z:e.zlevel-t.zlevel}var i=e("./tool/util"),n=e("./Group"),a={hover:!1,normal:"down",update:!1},o=function(){this._elements={},this._hoverElements=[],this._roots=[],this._shapeList=[],this._shapeListOffset=0};return o.prototype.iterShape=function(e,t){if(t||(t=a),t.hover)for(var i=0,n=this._hoverElements.length;n>i;i++){var o=this._hoverElements[i];if(o.updateTransform(),e(o))return this}switch(t.update&&this.updateShapeList(),t.normal){case"down":for(var n=this._shapeList.length;n--;)if(e(this._shapeList[n]))return this;break;default:for(var i=0,n=this._shapeList.length;n>i;i++)if(e(this._shapeList[i]))return this}return this},o.prototype.getHoverShapes=function(e){for(var i=[],n=0,a=this._hoverElements.length;a>n;n++){i.push(this._hoverElements[n]);var o=this._hoverElements[n].hoverConnect;if(o){var r;o=o instanceof Array?o:[o];for(var s=0,l=o.length;l>s;s++)r=o[s].id?o[s]:this.get(o[s]),r&&i.push(r)}}if(i.sort(t),e)for(var n=0,a=i.length;a>n;n++)i[n].updateTransform();return i},o.prototype.getShapeList=function(e){return e&&this.updateShapeList(),this._shapeList},o.prototype.updateShapeList=function(){this._shapeListOffset=0;for(var e=0,i=this._roots.length;i>e;e++){var n=this._roots[e];this._updateAndAddShape(n)}this._shapeList.length=this._shapeListOffset;for(var e=0,i=this._shapeList.length;i>e;e++)this._shapeList[e].__renderidx=e;this._shapeList.sort(t)},o.prototype._updateAndAddShape=function(e,t){if(!e.ignore)if(e.updateTransform(),e.clipShape&&(e.clipShape.parent=e,e.clipShape.updateTransform(),t?(t=t.slice(),t.push(e.clipShape)):t=[e.clipShape]),"group"==e.type){for(var i=0;i<e._children.length;i++){var n=e._children[i];n.__dirty=e.__dirty||n.__dirty,this._updateAndAddShape(n,t)}e.__dirty=!1}else e.__clipShapes=t,this._shapeList[this._shapeListOffset++]=e},o.prototype.mod=function(e,t){if("string"==typeof e&&(e=this._elements[e]),e&&(e.modSelf(),t))if(t.parent||t._storage||t.__clipShapes){var n={};for(var a in t)"parent"!==a&&"_storage"!==a&&"__clipShapes"!==a&&t.hasOwnProperty(a)&&(n[a]=t[a]);i.merge(e,n,!0)}else i.merge(e,t,!0);return this},o.prototype.drift=function(e,t,i){var n=this._elements[e];return n&&(n.needTransform=!0,"horizontal"===n.draggable?i=0:"vertical"===n.draggable&&(t=0),(!n.ondrift||n.ondrift&&!n.ondrift(t,i))&&n.drift(t,i)),this},o.prototype.addHover=function(e){return e.updateNeedTransform(),this._hoverElements.push(e),this},o.prototype.delHover=function(){return this._hoverElements=[],this},o.prototype.hasHoverShape=function(){return this._hoverElements.length>0},o.prototype.addRoot=function(e){this._elements[e.id]||(e instanceof n&&e.addChildrenToStorage(this),this.addToMap(e),this._roots.push(e))},o.prototype.delRoot=function(e){if("undefined"==typeof e){for(var t=0;t<this._roots.length;t++){var a=this._roots[t];a instanceof n&&a.delChildrenFromStorage(this)}return this._elements={},this._hoverElements=[],this._roots=[],this._shapeList=[],void(this._shapeListOffset=0)}if(e instanceof Array)for(var t=0,o=e.length;o>t;t++)this.delRoot(e[t]);else{var r;r="string"==typeof e?this._elements[e]:e;var s=i.indexOf(this._roots,r);s>=0&&(this.delFromMap(r.id),this._roots.splice(s,1),r instanceof n&&r.delChildrenFromStorage(this))}},o.prototype.addToMap=function(e){return e instanceof n&&(e._storage=this),e.modSelf(),this._elements[e.id]=e,this},o.prototype.get=function(e){return this._elements[e]},o.prototype.delFromMap=function(e){var t=this._elements[e];return t&&(delete this._elements[e],t instanceof n&&(t._storage=null)),this},o.prototype.dispose=function(){this._elements=this._renderList=this._roots=this._hoverElements=null},o}),i("zrender/animation/Animation",["require","./Clip","../tool/color","../tool/util","../tool/event"],function(e){"use strict";function t(e,t){return e[t]}function i(e,t,i){e[t]=i}function n(e,t,i){return(t-e)*i+e}function a(e,t,i,a,o){var r=e.length;if(1==o)for(var s=0;r>s;s++)a[s]=n(e[s],t[s],i);else for(var l=e[0].length,s=0;r>s;s++)for(var h=0;l>h;h++)a[s][h]=n(e[s][h],t[s][h],i)}function o(e){switch(typeof e){case"undefined":case"string":return!1}return"undefined"!=typeof e.length}function r(e,t,i,n,a,o,r,l,h){var m=e.length;if(1==h)for(var V=0;m>V;V++)l[V]=s(e[V],t[V],i[V],n[V],a,o,r);else for(var U=e[0].length,V=0;m>V;V++)for(var d=0;U>d;d++)l[V][d]=s(e[V][d],t[V][d],i[V][d],n[V][d],a,o,r)}function s(e,t,i,n,a,o,r){var s=.5*(i-e),l=.5*(n-t);return(2*(t-i)+s+l)*r+(-3*(t-i)-2*s-l)*o+s*a+t}function l(e){if(o(e)){var t=e.length;if(o(e[0])){for(var i=[],n=0;t>n;n++)i.push(c.call(e[n]));return i}return c.call(e)}return e}function h(e){return e[0]=Math.floor(e[0]),e[1]=Math.floor(e[1]),e[2]=Math.floor(e[2]),"rgba("+e.join(",")+")"}var m=e("./Clip"),V=e("../tool/color"),U=e("../tool/util"),d=e("../tool/event").Dispatcher,p=window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||function(e){setTimeout(e,16)},c=Array.prototype.slice,u=function(e){e=e||{},this.stage=e.stage||{},this.onframe=e.onframe||function(){},this._clips=[],this._running=!1,this._time=0,d.call(this)};u.prototype={add:function(e){this._clips.push(e)},remove:function(e){if(e.__inStep)e.__needsRemove=!0;else{var t=U.indexOf(this._clips,e);t>=0&&this._clips.splice(t,1)}},_update:function(){for(var e=(new Date).getTime(),t=e-this._time,i=this._clips,n=i.length,a=[],o=[],r=0;n>r;r++){var s=i[r];s.__inStep=!0;var l=s.step(e);s.__inStep=!1,l&&(a.push(l),o.push(s))}for(var r=0;n>r;)i[r].__needsRemove?(i[r]=i[n-1],i.pop(),n--):r++;n=a.length;for(var r=0;n>r;r++)o[r].fire(a[r]);this._time=e,this.onframe(t),this.dispatch("frame",t),this.stage.update&&this.stage.update()},start:function(){function e(){t._running&&(p(e),t._update())}var t=this;this._running=!0,this._time=(new Date).getTime(),p(e)},stop:function(){this._running=!1},clear:function(){this._clips=[]},animate:function(e,t){t=t||{};var i=new y(e,t.loop,t.getter,t.setter);return i.animation=this,i},constructor:u},U.merge(u.prototype,d.prototype,!0);var y=function(e,n,a,o){this._tracks={},this._target=e,this._loop=n||!1,this._getter=a||t,this._setter=o||i,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};return y.prototype={when:function(e,t){for(var i in t)this._tracks[i]||(this._tracks[i]=[],0!==e&&this._tracks[i].push({time:0,value:l(this._getter(this._target,i))})),this._tracks[i].push({time:parseInt(e,10),value:t[i]});return this},during:function(e){return this._onframeList.push(e),this},start:function(e){var t=this,i=this._setter,l=this._getter,U="spline"===e,d=function(){if(t._clipCount--,0===t._clipCount){t._tracks={};for(var e=t._doneList.length,i=0;e>i;i++)t._doneList[i].call(t)}},p=function(p,c){var u=p.length;if(u){var y=p[0].value,g=o(y),b=!1,f=g&&o(y[0])?2:1;p.sort(function(e,t){return e.time-t.time});var k;if(u){k=p[u-1].time;for(var x=[],_=[],L=0;u>L;L++){x.push(p[L].time/k);var W=p[L].value;"string"==typeof W&&(W=V.toArray(W),0===W.length&&(W[0]=W[1]=W[2]=0,W[3]=1),b=!0),_.push(W)}var X,L,v,w,K,I,J,C=0,S=0;if(b)var E=[0,0,0,0];var F=function(e,o){if(S>o){for(X=Math.min(C+1,u-1),L=X;L>=0&&!(x[L]<=o);L--);L=Math.min(L,u-2)}else{for(L=C;u>L&&!(x[L]>o);L++);L=Math.min(L-1,u-2)}C=L,S=o;var m=x[L+1]-x[L];if(0!==m){if(v=(o-x[L])/m,U)if(K=_[L],w=_[0===L?L:L-1],I=_[L>u-2?u-1:L+1],J=_[L>u-3?u-1:L+2],g)r(w,K,I,J,v,v*v,v*v*v,l(e,c),f);else{var V;b?(V=r(w,K,I,J,v,v*v,v*v*v,E,1),V=h(E)):V=s(w,K,I,J,v,v*v,v*v*v),i(e,c,V)}else if(g)a(_[L],_[L+1],v,l(e,c),f);else{var V;b?(a(_[L],_[L+1],v,E,1),V=h(E)):V=n(_[L],_[L+1],v),i(e,c,V)}for(L=0;L<t._onframeList.length;L++)t._onframeList[L](e,o)}},T=new m({target:t._target,life:k,loop:t._loop,delay:t._delay,onframe:F,ondestroy:d});e&&"spline"!==e&&(T.easing=e),t._clipList.push(T),t._clipCount++,t.animation.add(T)}}};for(var c in this._tracks)p(this._tracks[c],c);return this},stop:function(){for(var e=0;e<this._clipList.length;e++){var t=this._clipList[e];this.animation.remove(t)}this._clipList=[]},delay:function(e){return this._delay=e,this},done:function(e){return e&&this._doneList.push(e),this}},u}),i("zrender/tool/vector",[],function(){var e="undefined"==typeof Float32Array?Array:Float32Array,t={create:function(t,i){var n=new e(2);return n[0]=t||0,n[1]=i||0,n},copy:function(e,t){return e[0]=t[0],e[1]=t[1],e},clone:function(t){var i=new e(2);return i[0]=t[0],i[1]=t[1],i},set:function(e,t,i){return e[0]=t,e[1]=i,e},add:function(e,t,i){return e[0]=t[0]+i[0],e[1]=t[1]+i[1],e},scaleAndAdd:function(e,t,i,n){return e[0]=t[0]+i[0]*n,e[1]=t[1]+i[1]*n,e},sub:function(e,t,i){return e[0]=t[0]-i[0],e[1]=t[1]-i[1],e},len:function(e){return Math.sqrt(this.lenSquare(e))},lenSquare:function(e){return e[0]*e[0]+e[1]*e[1]},mul:function(e,t,i){return e[0]=t[0]*i[0],e[1]=t[1]*i[1],e},div:function(e,t,i){return e[0]=t[0]/i[0],e[1]=t[1]/i[1],e},dot:function(e,t){return e[0]*t[0]+e[1]*t[1]},scale:function(e,t,i){return e[0]=t[0]*i,e[1]=t[1]*i,e},normalize:function(e,i){var n=t.len(i);return 0===n?(e[0]=0,e[1]=0):(e[0]=i[0]/n,e[1]=i[1]/n),e},distance:function(e,t){return Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1]))},distanceSquare:function(e,t){return(e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])},negate:function(e,t){return e[0]=-t[0],e[1]=-t[1],e},lerp:function(e,t,i,n){return e[0]=t[0]+n*(i[0]-t[0]),e[1]=t[1]+n*(i[1]-t[1]),e},applyTransform:function(e,t,i){var n=t[0],a=t[1];return e[0]=i[0]*n+i[2]*a+i[4],e[1]=i[1]*n+i[3]*a+i[5],e},min:function(e,t,i){return e[0]=Math.min(t[0],i[0]),e[1]=Math.min(t[1],i[1]),e},max:function(e,t,i){return e[0]=Math.max(t[0],i[0]),e[1]=Math.max(t[1],i[1]),e}};return t.length=t.len,t.lengthSquare=t.lenSquare,t.dist=t.distance,t.distSquare=t.distanceSquare,t}),i("zrender/tool/matrix",[],function(){var e="undefined"==typeof Float32Array?Array:Float32Array,t={create:function(){var i=new e(6);return t.identity(i),i},identity:function(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=1,e[4]=0,e[5]=0,e},copy:function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e},mul:function(e,t,i){return e[0]=t[0]*i[0]+t[2]*i[1],e[1]=t[1]*i[0]+t[3]*i[1],e[2]=t[0]*i[2]+t[2]*i[3],e[3]=t[1]*i[2]+t[3]*i[3],e[4]=t[0]*i[4]+t[2]*i[5]+t[4],e[5]=t[1]*i[4]+t[3]*i[5]+t[5],e},translate:function(e,t,i){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4]+i[0],e[5]=t[5]+i[1],e},rotate:function(e,t,i){var n=t[0],a=t[2],o=t[4],r=t[1],s=t[3],l=t[5],h=Math.sin(i),m=Math.cos(i);return e[0]=n*m+r*h,e[1]=-n*h+r*m,e[2]=a*m+s*h,e[3]=-a*h+m*s,e[4]=m*o+h*l,e[5]=m*l-h*o,e},scale:function(e,t,i){var n=i[0],a=i[1];return e[0]=t[0]*n,e[1]=t[1]*a,e[2]=t[2]*n,e[3]=t[3]*a,e[4]=t[4]*n,e[5]=t[5]*a,e},invert:function(e,t){var i=t[0],n=t[2],a=t[4],o=t[1],r=t[3],s=t[5],l=i*r-o*n;return l?(l=1/l,e[0]=r*l,e[1]=-o*l,e[2]=-n*l,e[3]=i*l,e[4]=(n*s-r*a)*l,e[5]=(o*a-i*s)*l,e):null}};return t}),i("zrender/loadingEffect/Base",["require","../tool/util","../shape/Text","../shape/Rectangle"],function(e){function t(e){this.setOptions(e)}var i=e("../tool/util"),n=e("../shape/Text"),a=e("../shape/Rectangle"),o="Loading...",r="normal 16px Arial";return t.prototype.createTextShape=function(e){return new n({highlightStyle:i.merge({x:this.canvasWidth/2,y:this.canvasHeight/2,text:o,textAlign:"center",textBaseline:"middle",textFont:r,color:"#333",brushType:"fill"},e,!0)})},t.prototype.createBackgroundShape=function(e){return new a({highlightStyle:{x:0,y:0,width:this.canvasWidth,height:this.canvasHeight,brushType:"fill",color:e}})},t.prototype.start=function(e){function t(t){e.storage.addHover(t)}function i(){e.refreshHover()}this.canvasWidth=e._width,this.canvasHeight=e._height,this.loadingTimer=this._start(t,i)},t.prototype._start=function(){return setInterval(function(){},1e4)},t.prototype.stop=function(){clearInterval(this.loadingTimer)},t.prototype.setOptions=function(e){this.options=e||{}},t.prototype.adjust=function(e,t){return e<=t[0]?e=t[0]:e>=t[1]&&(e=t[1]),e},t.prototype.getLocation=function(e,t,i){var n=null!=e.x?e.x:"center";switch(n){case"center":n=Math.floor((this.canvasWidth-t)/2);break;case"left":n=0;break;case"right":n=this.canvasWidth-t}var a=null!=e.y?e.y:"center";switch(a){case"center":a=Math.floor((this.canvasHeight-i)/2);break;case"top":a=0;break;case"bottom":a=this.canvasHeight-i}return{x:n,y:a,width:t,height:i}},t}),i("zrender/Layer",["require","./mixin/Transformable","./tool/util","./config"],function(e){function t(){return!1}function i(e,t,i){var n=document.createElement(t),a=i.getWidth(),o=i.getHeight();return n.style.position="absolute",n.style.left=0,n.style.top=0,n.style.width=a+"px",n.style.height=o+"px",n.width=a*r.devicePixelRatio,n.height=o*r.devicePixelRatio,n.setAttribute("data-zr-dom-id",e),n}var n=e("./mixin/Transformable"),a=e("./tool/util"),o=window.G_vmlCanvasManager,r=e("./config"),s=function(e,a){this.id=e,this.dom=i(e,"canvas",a),this.dom.onselectstart=t,this.dom.style["-webkit-user-select"]="none",this.dom.style["user-select"]="none",this.dom.style["-webkit-touch-callout"]="none",this.dom.style["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",this.dom.className=r.elementClassName,o&&o.initElement(this.dom),this.domBack=null,this.ctxBack=null,this.painter=a,this.unusedCount=0,this.config=null,this.dirty=!0,this.elCount=0,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.zoomable=!1,this.panable=!1,this.maxZoom=1/0,this.minZoom=0,n.call(this)};return s.prototype.initContext=function(){this.ctx=this.dom.getContext("2d");var e=r.devicePixelRatio;1!=e&&this.ctx.scale(e,e)},s.prototype.createBackBuffer=function(){if(!o){this.domBack=i("back-"+this.id,"canvas",this.painter),this.ctxBack=this.domBack.getContext("2d");var e=r.devicePixelRatio;1!=e&&this.ctxBack.scale(e,e)}},s.prototype.resize=function(e,t){var i=r.devicePixelRatio;this.dom.style.width=e+"px",this.dom.style.height=t+"px",this.dom.setAttribute("width",e*i),this.dom.setAttribute("height",t*i),1!=i&&this.ctx.scale(i,i),this.domBack&&(this.domBack.setAttribute("width",e*i),this.domBack.setAttribute("height",t*i),1!=i&&this.ctxBack.scale(i,i))},s.prototype.clear=function(){var e=this.dom,t=this.ctx,i=e.width,n=e.height,a=this.clearColor&&!o,s=this.motionBlur&&!o,l=this.lastFrameAlpha,h=r.devicePixelRatio;if(s&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,i/h,n/h)),t.clearRect(0,0,i/h,n/h),a&&(t.save(),t.fillStyle=this.clearColor,t.fillRect(0,0,i/h,n/h),t.restore()),s){var m=this.domBack;t.save(),t.globalAlpha=l,t.drawImage(m,0,0,i/h,n/h),t.restore()}},a.merge(s.prototype,n.prototype),s}),i("zrender/shape/Text",["require","../tool/area","./Base","../tool/util"],function(e){
-var t=e("../tool/area"),i=e("./Base"),n=function(e){i.call(this,e)};return n.prototype={type:"text",brush:function(e,i){var n=this.style;if(i&&(n=this.getHighlightStyle(n,this.highlightStyle||{})),"undefined"!=typeof n.text&&n.text!==!1){e.save(),this.doClip(e),this.setContext(e,n),this.setTransform(e),n.textFont&&(e.font=n.textFont),e.textAlign=n.textAlign||"start",e.textBaseline=n.textBaseline||"middle";var a,o=(n.text+"").split("\n"),r=t.getTextHeight("国",n.textFont),s=this.getRect(n),l=n.x;a="top"==n.textBaseline?s.y:"bottom"==n.textBaseline?s.y+r:s.y+r/2;for(var h=0,m=o.length;m>h;h++){if(n.maxWidth)switch(n.brushType){case"fill":e.fillText(o[h],l,a,n.maxWidth);break;case"stroke":e.strokeText(o[h],l,a,n.maxWidth);break;case"both":e.fillText(o[h],l,a,n.maxWidth),e.strokeText(o[h],l,a,n.maxWidth);break;default:e.fillText(o[h],l,a,n.maxWidth)}else switch(n.brushType){case"fill":e.fillText(o[h],l,a);break;case"stroke":e.strokeText(o[h],l,a);break;case"both":e.fillText(o[h],l,a),e.strokeText(o[h],l,a);break;default:e.fillText(o[h],l,a)}a+=r}e.restore()}},getRect:function(e){if(e.__rect)return e.__rect;var i=t.getTextWidth(e.text,e.textFont),n=t.getTextHeight(e.text,e.textFont),a=e.x;"end"==e.textAlign||"right"==e.textAlign?a-=i:"center"==e.textAlign&&(a-=i/2);var o;return o="top"==e.textBaseline?e.y:"bottom"==e.textBaseline?e.y-n:e.y-n/2,e.__rect={x:a,y:o,width:i,height:n},e.__rect}},e("../tool/util").inherits(n,i),n}),i("zrender/shape/Rectangle",["require","./Base","../tool/util"],function(e){var t=e("./Base"),i=function(e){t.call(this,e)};return i.prototype={type:"rectangle",_buildRadiusPath:function(e,t){var i,n,a,o,r=t.x,s=t.y,l=t.width,h=t.height,m=t.radius;"number"==typeof m?i=n=a=o=m:m instanceof Array?1===m.length?i=n=a=o=m[0]:2===m.length?(i=a=m[0],n=o=m[1]):3===m.length?(i=m[0],n=o=m[1],a=m[2]):(i=m[0],n=m[1],a=m[2],o=m[3]):i=n=a=o=0;var V;i+n>l&&(V=i+n,i*=l/V,n*=l/V),a+o>l&&(V=a+o,a*=l/V,o*=l/V),n+a>h&&(V=n+a,n*=h/V,a*=h/V),i+o>h&&(V=i+o,i*=h/V,o*=h/V),e.moveTo(r+i,s),e.lineTo(r+l-n,s),0!==n&&e.quadraticCurveTo(r+l,s,r+l,s+n),e.lineTo(r+l,s+h-a),0!==a&&e.quadraticCurveTo(r+l,s+h,r+l-a,s+h),e.lineTo(r+o,s+h),0!==o&&e.quadraticCurveTo(r,s+h,r,s+h-o),e.lineTo(r,s+i),0!==i&&e.quadraticCurveTo(r,s,r+i,s)},buildPath:function(e,t){t.radius?this._buildRadiusPath(e,t):(e.moveTo(t.x,t.y),e.lineTo(t.x+t.width,t.y),e.lineTo(t.x+t.width,t.y+t.height),e.lineTo(t.x,t.y+t.height),e.lineTo(t.x,t.y)),e.closePath()},getRect:function(e){if(e.__rect)return e.__rect;var t;return t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-t/2),y:Math.round(e.y-t/2),width:e.width+t,height:e.height+t},e.__rect}},e("../tool/util").inherits(i,t),i}),i("zrender/tool/area",["require","./util","./curve"],function(e){"use strict";function t(e){return e%=C,0>e&&(e+=C),e}function i(e,t,i,o){if(!t||!e)return!1;var r=e.type;L=L||W.getContext();var s=n(e,t,i,o);if("undefined"!=typeof s)return s;if(e.buildPath&&L.isPointInPath)return a(e,L,t,i,o);switch(r){case"ellipse":return!0;case"trochoid":var l="out"==t.location?t.r1+t.r2+t.d:t.r1-t.r2+t.d;return d(t,i,o,l);case"rose":return d(t,i,o,t.maxr);default:return!1}}function n(e,t,i,n){var a=e.type;switch(a){case"bezier-curve":return"undefined"==typeof t.cpX2?l(t.xStart,t.yStart,t.cpX1,t.cpY1,t.xEnd,t.yEnd,t.lineWidth,i,n):s(t.xStart,t.yStart,t.cpX1,t.cpY1,t.cpX2,t.cpY2,t.xEnd,t.yEnd,t.lineWidth,i,n);case"line":return r(t.xStart,t.yStart,t.xEnd,t.yEnd,t.lineWidth,i,n);case"polyline":return m(t.pointList,t.lineWidth,i,n);case"ring":return V(t.x,t.y,t.r0,t.r,i,n);case"circle":return d(t.x,t.y,t.r,i,n);case"sector":var o=t.startAngle*Math.PI/180,h=t.endAngle*Math.PI/180;return t.clockWise||(o=-o,h=-h),p(t.x,t.y,t.r0,t.r,o,h,!t.clockWise,i,n);case"path":return t.pathArray&&k(t.pathArray,Math.max(t.lineWidth,5),t.brushType,i,n);case"polygon":case"star":case"isogon":return c(t.pointList,i,n);case"text":var u=t.__rect||e.getRect(t);return U(u.x,u.y,u.width,u.height,i,n);case"rectangle":case"image":return U(t.x,t.y,t.width,t.height,i,n)}}function a(e,t,i,n,a){return t.beginPath(),e.buildPath(t,i),t.closePath(),t.isPointInPath(n,a)}function o(e,t,n,a){return!i(e,t,n,a)}function r(e,t,i,n,a,o,r){if(0===a)return!1;var s=Math.max(a,5),l=0,h=e;if(r>t+s&&r>n+s||t-s>r&&n-s>r||o>e+s&&o>i+s||e-s>o&&i-s>o)return!1;if(e===i)return Math.abs(o-e)<=s/2;l=(t-n)/(e-i),h=(e*n-i*t)/(e-i);var m=l*o-r+h,V=m*m/(l*l+1);return s/2*s/2>=V}function s(e,t,i,n,a,o,r,s,l,h,m){if(0===l)return!1;var V=Math.max(l,5);if(m>t+V&&m>n+V&&m>o+V&&m>s+V||t-V>m&&n-V>m&&o-V>m&&s-V>m||h>e+V&&h>i+V&&h>a+V&&h>r+V||e-V>h&&i-V>h&&a-V>h&&r-V>h)return!1;var U=X.cubicProjectPoint(e,t,i,n,a,o,r,s,h,m,null);return V/2>=U}function l(e,t,i,n,a,o,r,s,l){if(0===r)return!1;var h=Math.max(r,5);if(l>t+h&&l>n+h&&l>o+h||t-h>l&&n-h>l&&o-h>l||s>e+h&&s>i+h&&s>a+h||e-h>s&&i-h>s&&a-h>s)return!1;var m=X.quadraticProjectPoint(e,t,i,n,a,o,s,l,null);return h/2>=m}function h(e,i,n,a,o,r,s,l,h){if(0===s)return!1;var m=Math.max(s,5);l-=e,h-=i;var V=Math.sqrt(l*l+h*h);if(V-m>n||n>V+m)return!1;if(Math.abs(a-o)>=C)return!0;if(r){var U=a;a=t(o),o=t(U)}else a=t(a),o=t(o);a>o&&(o+=C);var d=Math.atan2(h,l);return 0>d&&(d+=C),d>=a&&o>=d||d+C>=a&&o>=d+C}function m(e,t,i,n){for(var t=Math.max(t,10),a=0,o=e.length-1;o>a;a++){var s=e[a][0],l=e[a][1],h=e[a+1][0],m=e[a+1][1];if(r(s,l,h,m,t,i,n))return!0}return!1}function V(e,t,i,n,a,o){var r=(a-e)*(a-e)+(o-t)*(o-t);return n*n>r&&r>i*i}function U(e,t,i,n,a,o){return a>=e&&e+i>=a&&o>=t&&t+n>=o}function d(e,t,i,n,a){return i*i>(n-e)*(n-e)+(a-t)*(a-t)}function p(e,t,i,n,a,o,r,s,l){return h(e,t,(i+n)/2,a,o,r,n-i,s,l)}function c(e,t,i){for(var n=e.length,a=0,o=0,r=n-1;n>o;o++){var s=e[r][0],l=e[r][1],h=e[o][0],m=e[o][1];a+=u(s,l,h,m,t,i),r=o}return 0!==a}function u(e,t,i,n,a,o){if(o>t&&o>n||t>o&&n>o)return 0;if(n==t)return 0;var r=t>n?1:-1,s=(o-t)/(n-t),l=s*(i-e)+e;return l>a?r:0}function y(){var e=E[0];E[0]=E[1],E[1]=e}function g(e,t,i,n,a,o,r,s,l,h){if(h>t&&h>n&&h>o&&h>s||t>h&&n>h&&o>h&&s>h)return 0;var m=X.cubicRootAt(t,n,o,s,h,S);if(0===m)return 0;for(var V,U,d=0,p=-1,c=0;m>c;c++){var u=S[c],g=X.cubicAt(e,i,a,r,u);l>g||(0>p&&(p=X.cubicExtrema(t,n,o,s,E),E[1]<E[0]&&p>1&&y(),V=X.cubicAt(t,n,o,s,E[0]),p>1&&(U=X.cubicAt(t,n,o,s,E[1]))),d+=2==p?u<E[0]?t>V?1:-1:u<E[1]?V>U?1:-1:U>s?1:-1:u<E[0]?t>V?1:-1:V>s?1:-1)}return d}function b(e,t,i,n,a,o,r,s){if(s>t&&s>n&&s>o||t>s&&n>s&&o>s)return 0;var l=X.quadraticRootAt(t,n,o,s,S);if(0===l)return 0;var h=X.quadraticExtremum(t,n,o);if(h>=0&&1>=h){for(var m=0,V=X.quadraticAt(t,n,o,h),U=0;l>U;U++){var d=X.quadraticAt(e,i,a,S[U]);r>d||(m+=S[U]<h?t>V?1:-1:V>o?1:-1)}return m}var d=X.quadraticAt(e,i,a,S[0]);return r>d?0:t>o?1:-1}function f(e,i,n,a,o,r,s,l){if(l-=i,l>n||-n>l)return 0;var h=Math.sqrt(n*n-l*l);if(S[0]=-h,S[1]=h,Math.abs(a-o)>=C){a=0,o=C;var m=r?1:-1;return s>=S[0]+e&&s<=S[1]+e?m:0}if(r){var h=a;a=t(o),o=t(h)}else a=t(a),o=t(o);a>o&&(o+=C);for(var V=0,U=0;2>U;U++){var d=S[U];if(d+e>s){var p=Math.atan2(l,d),m=r?1:-1;0>p&&(p=C+p),(p>=a&&o>=p||p+C>=a&&o>=p+C)&&(p>Math.PI/2&&p<1.5*Math.PI&&(m=-m),V+=m)}}return V}function k(e,t,i,n,a){var o=0,m=0,V=0,U=0,d=0,p=!0,c=!0;i=i||"fill";for(var y="stroke"===i||"both"===i,k="fill"===i||"both"===i,x=0;x<e.length;x++){var _=e[x],L=_.points;if(p||"M"===_.command){if(x>0&&(k&&(o+=u(m,V,U,d,n,a)),0!==o))return!0;U=L[L.length-2],d=L[L.length-1],p=!1,c&&"A"!==_.command&&(c=!1,m=U,V=d)}switch(_.command){case"M":m=L[0],V=L[1];break;case"L":if(y&&r(m,V,L[0],L[1],t,n,a))return!0;k&&(o+=u(m,V,L[0],L[1],n,a)),m=L[0],V=L[1];break;case"C":if(y&&s(m,V,L[0],L[1],L[2],L[3],L[4],L[5],t,n,a))return!0;k&&(o+=g(m,V,L[0],L[1],L[2],L[3],L[4],L[5],n,a)),m=L[4],V=L[5];break;case"Q":if(y&&l(m,V,L[0],L[1],L[2],L[3],t,n,a))return!0;k&&(o+=b(m,V,L[0],L[1],L[2],L[3],n,a)),m=L[2],V=L[3];break;case"A":var W=L[0],X=L[1],v=L[2],w=L[3],K=L[4],I=L[5],J=Math.cos(K)*v+W,C=Math.sin(K)*w+X;c?(c=!1,U=J,d=C):o+=u(m,V,J,C);var S=(n-W)*w/v+W;if(y&&h(W,X,w,K,K+I,1-L[7],t,S,a))return!0;k&&(o+=f(W,X,w,K,K+I,1-L[7],S,a)),m=Math.cos(K+I)*v+W,V=Math.sin(K+I)*w+X;break;case"z":if(y&&r(m,V,U,d,t,n,a))return!0;p=!0}}return k&&(o+=u(m,V,U,d,n,a)),0!==o}function x(e,t){var i=e+":"+t;if(v[i])return v[i];L=L||W.getContext(),L.save(),t&&(L.font=t),e=(e+"").split("\n");for(var n=0,a=0,o=e.length;o>a;a++)n=Math.max(L.measureText(e[a]).width,n);return L.restore(),v[i]=n,++K>J&&(K=0,v={}),n}function _(e,t){var i=e+":"+t;if(w[i])return w[i];L=L||W.getContext(),L.save(),t&&(L.font=t),e=(e+"").split("\n");var n=(L.measureText("国").width+2)*e.length;return L.restore(),w[i]=n,++I>J&&(I=0,w={}),n}var L,W=e("./util"),X=e("./curve"),v={},w={},K=0,I=0,J=5e3,C=2*Math.PI,S=[-1,-1,-1],E=[-1,-1];return{isInside:i,isOutside:o,getTextWidth:x,getTextHeight:_,isInsidePath:k,isInsidePolygon:c,isInsideSector:p,isInsideCircle:d,isInsideLine:r,isInsideRect:U,isInsidePolyline:m,isInsideCubicStroke:s,isInsideQuadraticStroke:l}}),i("zrender/shape/Base",["require","../tool/matrix","../tool/guid","../tool/util","../tool/log","../mixin/Transformable","../mixin/Eventful","../tool/area","../tool/color"],function(e){function t(t,n,a,o,r,s,l){r&&(t.font=r),t.textAlign=s,t.textBaseline=l;var h=i(n,a,o,r,s,l);n=(n+"").split("\n");var m=e("../tool/area").getTextHeight("国",r);switch(l){case"top":o=h.y;break;case"bottom":o=h.y+m;break;default:o=h.y+m/2}for(var V=0,U=n.length;U>V;V++)t.fillText(n[V],a,o),o+=m}function i(t,i,n,a,o,r){var s=e("../tool/area"),l=s.getTextWidth(t,a),h=s.getTextHeight("国",a);switch(t=(t+"").split("\n"),o){case"end":case"right":i-=l;break;case"center":i-=l/2}switch(r){case"top":break;case"bottom":n-=h*t.length;break;default:n-=h*t.length/2}return{x:i,y:n,width:l,height:h*t.length}}var n=window.G_vmlCanvasManager,a=e("../tool/matrix"),o=e("../tool/guid"),r=e("../tool/util"),s=e("../tool/log"),l=e("../mixin/Transformable"),h=e("../mixin/Eventful"),m=function(e){e=e||{},this.id=e.id||o();for(var t in e)this[t]=e[t];this.style=this.style||{},this.highlightStyle=this.highlightStyle||null,this.parent=null,this.__dirty=!0,this.__clipShapes=[],l.call(this),h.call(this)};m.prototype.invisible=!1,m.prototype.ignore=!1,m.prototype.zlevel=0,m.prototype.draggable=!1,m.prototype.clickable=!1,m.prototype.hoverable=!0,m.prototype.z=0,m.prototype.brush=function(e,t){var i=this.beforeBrush(e,t);switch(e.beginPath(),this.buildPath(e,i),i.brushType){case"both":e.fill();case"stroke":i.lineWidth>0&&e.stroke();break;default:e.fill()}this.drawText(e,i,this.style),this.afterBrush(e)},m.prototype.beforeBrush=function(e,t){var i=this.style;return this.brushTypeOnly&&(i.brushType=this.brushTypeOnly),t&&(i=this.getHighlightStyle(i,this.highlightStyle||{},this.brushTypeOnly)),"stroke"==this.brushTypeOnly&&(i.strokeColor=i.strokeColor||i.color),e.save(),this.doClip(e),this.setContext(e,i),this.setTransform(e),i},m.prototype.afterBrush=function(e){e.restore()};var V=[["color","fillStyle"],["strokeColor","strokeStyle"],["opacity","globalAlpha"],["lineCap","lineCap"],["lineJoin","lineJoin"],["miterLimit","miterLimit"],["lineWidth","lineWidth"],["shadowBlur","shadowBlur"],["shadowColor","shadowColor"],["shadowOffsetX","shadowOffsetX"],["shadowOffsetY","shadowOffsetY"]];m.prototype.setContext=function(e,t){for(var i=0,n=V.length;n>i;i++){var a=V[i][0],o=t[a],r=V[i][1];"undefined"!=typeof o&&(e[r]=o)}};var U=a.create();return m.prototype.doClip=function(e){if(this.__clipShapes&&!n)for(var t=0;t<this.__clipShapes.length;t++){var i=this.__clipShapes[t];if(i.needTransform){var o=i.transform;a.invert(U,o),e.transform(o[0],o[1],o[2],o[3],o[4],o[5])}if(e.beginPath(),i.buildPath(e,i.style),e.clip(),i.needTransform){var o=U;e.transform(o[0],o[1],o[2],o[3],o[4],o[5])}}},m.prototype.getHighlightStyle=function(t,i,n){var a={};for(var o in t)a[o]=t[o];var r=e("../tool/color"),s=r.getHighlightColor();"stroke"!=t.brushType?(a.strokeColor=s,a.lineWidth=(t.lineWidth||1)+this.getHighlightZoom(),a.brushType="both"):"stroke"!=n?(a.strokeColor=s,a.lineWidth=(t.lineWidth||1)+this.getHighlightZoom()):a.strokeColor=i.strokeColor||r.mix(t.strokeColor,r.toRGB(s));for(var o in i)"undefined"!=typeof i[o]&&(a[o]=i[o]);return a},m.prototype.getHighlightZoom=function(){return"text"!=this.type?6:2},m.prototype.drift=function(e,t){this.position[0]+=e,this.position[1]+=t},m.prototype.buildPath=function(){s("buildPath not implemented in "+this.type)},m.prototype.getRect=function(){s("getRect not implemented in "+this.type)},m.prototype.isCover=function(t,i){var n=this.transformCoordToLocal(t,i);return t=n[0],i=n[1],this.isCoverRect(t,i)?e("../tool/area").isInside(this,this.style,t,i):!1},m.prototype.isCoverRect=function(e,t){var i=this.style.__rect;return i||(i=this.style.__rect=this.getRect(this.style)),e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height},m.prototype.drawText=function(e,i,n){if("undefined"!=typeof i.text&&i.text!==!1){var a=i.textColor||i.color||i.strokeColor;e.fillStyle=a;var o,r,s,l,h=10,m=i.textPosition||this.textPosition||"top";switch(m){case"inside":case"top":case"bottom":case"left":case"right":if(this.getRect){var V=(n||i).__rect||this.getRect(n||i);switch(m){case"inside":s=V.x+V.width/2,l=V.y+V.height/2,o="center",r="middle","stroke"!=i.brushType&&a==i.color&&(e.fillStyle="#fff");break;case"left":s=V.x-h,l=V.y+V.height/2,o="end",r="middle";break;case"right":s=V.x+V.width+h,l=V.y+V.height/2,o="start",r="middle";break;case"top":s=V.x+V.width/2,l=V.y-h,o="center",r="bottom";break;case"bottom":s=V.x+V.width/2,l=V.y+V.height+h,o="center",r="top"}}break;case"start":case"end":var U=i.pointList||[[i.xStart||0,i.yStart||0],[i.xEnd||0,i.yEnd||0]],d=U.length;if(2>d)return;var p,c,u,y;switch(m){case"start":p=U[1][0],c=U[0][0],u=U[1][1],y=U[0][1];break;case"end":p=U[d-2][0],c=U[d-1][0],u=U[d-2][1],y=U[d-1][1]}s=c,l=y;var g=Math.atan((u-y)/(c-p))/Math.PI*180;0>c-p?g+=180:0>u-y&&(g+=360),h=5,g>=30&&150>=g?(o="center",r="bottom",l-=h):g>150&&210>g?(o="right",r="middle",s-=h):g>=210&&330>=g?(o="center",r="top",l+=h):(o="left",r="middle",s+=h);break;case"specific":s=i.textX||0,l=i.textY||0,o="start",r="middle"}null!=s&&null!=l&&t(e,i.text,s,l,i.textFont,i.textAlign||o,i.textBaseline||r)}},m.prototype.modSelf=function(){this.__dirty=!0,this.style&&(this.style.__rect=null),this.highlightStyle&&(this.highlightStyle.__rect=null)},m.prototype.isSilent=function(){return!(this.hoverable||this.draggable||this.clickable||this.onmousemove||this.onmouseover||this.onmouseout||this.onmousedown||this.onmouseup||this.onclick||this.ondragenter||this.ondragover||this.ondragleave||this.ondrop)},r.merge(m.prototype,l.prototype,!0),r.merge(m.prototype,h.prototype,!0),m}),i("zrender/tool/curve",["require","./vector"],function(e){function t(e){return e>-u&&u>e}function i(e){return e>u||-u>e}function n(e,t,i,n,a){var o=1-a;return o*o*(o*e+3*a*t)+a*a*(a*n+3*o*i)}function a(e,t,i,n,a){var o=1-a;return 3*(((t-e)*o+2*(i-t)*a)*o+(n-i)*a*a)}function o(e,i,n,a,o,r){var s=a+3*(i-n)-e,l=3*(n-2*i+e),h=3*(i-e),m=e-o,V=l*l-3*s*h,U=l*h-9*s*m,d=h*h-3*l*m,p=0;if(t(V)&&t(U))if(t(l))r[0]=0;else{var c=-h/l;c>=0&&1>=c&&(r[p++]=c)}else{var u=U*U-4*V*d;if(t(u)){var b=U/V,c=-l/s+b,f=-b/2;c>=0&&1>=c&&(r[p++]=c),f>=0&&1>=f&&(r[p++]=f)}else if(u>0){var k=Math.sqrt(u),x=V*l+1.5*s*(-U+k),_=V*l+1.5*s*(-U-k);x=0>x?-Math.pow(-x,g):Math.pow(x,g),_=0>_?-Math.pow(-_,g):Math.pow(_,g);var c=(-l-(x+_))/(3*s);c>=0&&1>=c&&(r[p++]=c)}else{var L=(2*V*l-3*s*U)/(2*Math.sqrt(V*V*V)),W=Math.acos(L)/3,X=Math.sqrt(V),v=Math.cos(W),c=(-l-2*X*v)/(3*s),f=(-l+X*(v+y*Math.sin(W)))/(3*s),w=(-l+X*(v-y*Math.sin(W)))/(3*s);c>=0&&1>=c&&(r[p++]=c),f>=0&&1>=f&&(r[p++]=f),w>=0&&1>=w&&(r[p++]=w)}}return p}function r(e,n,a,o,r){var s=6*a-12*n+6*e,l=9*n+3*o-3*e-9*a,h=3*n-3*e,m=0;if(t(l)){if(i(s)){var V=-h/s;V>=0&&1>=V&&(r[m++]=V)}}else{var U=s*s-4*l*h;if(t(U))r[0]=-s/(2*l);else if(U>0){var d=Math.sqrt(U),V=(-s+d)/(2*l),p=(-s-d)/(2*l);V>=0&&1>=V&&(r[m++]=V),p>=0&&1>=p&&(r[m++]=p)}}return m}function s(e,t,i,n,a,o){var r=(t-e)*a+e,s=(i-t)*a+t,l=(n-i)*a+i,h=(s-r)*a+r,m=(l-s)*a+s,V=(m-h)*a+h;o[0]=e,o[1]=r,o[2]=h,o[3]=V,o[4]=V,o[5]=m,o[6]=l,o[7]=n}function l(e,t,i,a,o,r,s,l,h,m,V){var U,d=.005,p=1/0;b[0]=h,b[1]=m;for(var y=0;1>y;y+=.05){f[0]=n(e,i,o,s,y),f[1]=n(t,a,r,l,y);var g=c.distSquare(b,f);p>g&&(U=y,p=g)}p=1/0;for(var x=0;32>x&&!(u>d);x++){var _=U-d,L=U+d;f[0]=n(e,i,o,s,_),f[1]=n(t,a,r,l,_);var g=c.distSquare(f,b);if(_>=0&&p>g)U=_,p=g;else{k[0]=n(e,i,o,s,L),k[1]=n(t,a,r,l,L);var W=c.distSquare(k,b);1>=L&&p>W?(U=L,p=W):d*=.5}}return V&&(V[0]=n(e,i,o,s,U),V[1]=n(t,a,r,l,U)),Math.sqrt(p)}function h(e,t,i,n){var a=1-n;return a*(a*e+2*n*t)+n*n*i}function m(e,t,i,n){return 2*((1-n)*(t-e)+n*(i-t))}function V(e,n,a,o,r){var s=e-2*n+a,l=2*(n-e),h=e-o,m=0;if(t(s)){if(i(l)){var V=-h/l;V>=0&&1>=V&&(r[m++]=V)}}else{var U=l*l-4*s*h;if(t(U)){var V=-l/(2*s);V>=0&&1>=V&&(r[m++]=V)}else if(U>0){var d=Math.sqrt(U),V=(-l+d)/(2*s),p=(-l-d)/(2*s);V>=0&&1>=V&&(r[m++]=V),p>=0&&1>=p&&(r[m++]=p)}}return m}function U(e,t,i){var n=e+i-2*t;return 0===n?.5:(e-t)/n}function d(e,t,i,n,a){var o=(t-e)*n+e,r=(i-t)*n+t,s=(r-o)*n+o;a[0]=e,a[1]=o,a[2]=s,a[3]=s,a[4]=r,a[5]=i}function p(e,t,i,n,a,o,r,s,l){var m,V=.005,U=1/0;b[0]=r,b[1]=s;for(var d=0;1>d;d+=.05){f[0]=h(e,i,a,d),f[1]=h(t,n,o,d);var p=c.distSquare(b,f);U>p&&(m=d,U=p)}U=1/0;for(var y=0;32>y&&!(u>V);y++){var g=m-V,x=m+V;f[0]=h(e,i,a,g),f[1]=h(t,n,o,g);var p=c.distSquare(f,b);if(g>=0&&U>p)m=g,U=p;else{k[0]=h(e,i,a,x),k[1]=h(t,n,o,x);var _=c.distSquare(k,b);1>=x&&U>_?(m=x,U=_):V*=.5}}return l&&(l[0]=h(e,i,a,m),l[1]=h(t,n,o,m)),Math.sqrt(U)}var c=e("./vector"),u=1e-4,y=Math.sqrt(3),g=1/3,b=c.create(),f=c.create(),k=c.create();return{cubicAt:n,cubicDerivativeAt:a,cubicRootAt:o,cubicExtrema:r,cubicSubdivide:s,cubicProjectPoint:l,quadraticAt:h,quadraticDerivativeAt:m,quadraticRootAt:V,quadraticExtremum:U,quadraticSubdivide:d,quadraticProjectPoint:p}}),i("zrender/mixin/Transformable",["require","../tool/matrix","../tool/vector"],function(e){"use strict";function t(e){return e>-s&&s>e}function i(e){return e>s||-s>e}var n=e("../tool/matrix"),a=e("../tool/vector"),o=[0,0],r=n.translate,s=5e-5,l=function(){this.position||(this.position=[0,0]),"undefined"==typeof this.rotation&&(this.rotation=[0,0,0]),this.scale||(this.scale=[1,1,0,0]),this.needLocalTransform=!1,this.needTransform=!1};return l.prototype={constructor:l,updateNeedTransform:function(){this.needLocalTransform=i(this.rotation[0])||i(this.position[0])||i(this.position[1])||i(this.scale[0]-1)||i(this.scale[1]-1)},updateTransform:function(){this.updateNeedTransform();var e=this.parent&&this.parent.needTransform;if(this.needTransform=this.needLocalTransform||e,this.needTransform){var t=this.transform||n.create();if(n.identity(t),this.needLocalTransform){var a=this.scale;if(i(a[0])||i(a[1])){o[0]=-a[2]||0,o[1]=-a[3]||0;var s=i(o[0])||i(o[1]);s&&r(t,t,o),n.scale(t,t,a),s&&(o[0]=-o[0],o[1]=-o[1],r(t,t,o))}if(this.rotation instanceof Array){if(0!==this.rotation[0]){o[0]=-this.rotation[1]||0,o[1]=-this.rotation[2]||0;var s=i(o[0])||i(o[1]);s&&r(t,t,o),n.rotate(t,t,this.rotation[0]),s&&(o[0]=-o[0],o[1]=-o[1],r(t,t,o))}}else 0!==this.rotation&&n.rotate(t,t,this.rotation);(i(this.position[0])||i(this.position[1]))&&r(t,t,this.position)}e&&(this.needLocalTransform?n.mul(t,this.parent.transform,t):n.copy(t,this.parent.transform)),this.transform=t,this.invTransform=this.invTransform||n.create(),n.invert(this.invTransform,t)}},setTransform:function(e){if(this.needTransform){var t=this.transform;e.transform(t[0],t[1],t[2],t[3],t[4],t[5])}},lookAt:function(){var e=a.create();return function(i){this.transform||(this.transform=n.create());var o=this.transform;if(a.sub(e,i,this.position),!t(e[0])||!t(e[1])){a.normalize(e,e);var r=this.scale;o[2]=e[0]*r[1],o[3]=e[1]*r[1],o[0]=e[1]*r[0],o[1]=-e[0]*r[0],o[4]=this.position[0],o[5]=this.position[1],this.decomposeTransform()}}}(),decomposeTransform:function(){if(this.transform){var e=this.transform,t=e[0]*e[0]+e[1]*e[1],n=this.position,a=this.scale,o=this.rotation;i(t-1)&&(t=Math.sqrt(t));var r=e[2]*e[2]+e[3]*e[3];i(r-1)&&(r=Math.sqrt(r)),n[0]=e[4],n[1]=e[5],a[0]=t,a[1]=r,a[2]=a[3]=0,o[0]=Math.atan2(-e[1]/r,e[0]/t),o[1]=o[2]=0}},transformCoordToLocal:function(e,t){var i=[e,t];return this.needTransform&&this.invTransform&&a.applyTransform(i,i,this.invTransform),i}},l}),i("zrender/Group",["require","./tool/guid","./tool/util","./mixin/Transformable","./mixin/Eventful"],function(e){var t=e("./tool/guid"),i=e("./tool/util"),n=e("./mixin/Transformable"),a=e("./mixin/Eventful"),o=function(e){e=e||{},this.id=e.id||t();for(var i in e)this[i]=e[i];this.type="group",this.clipShape=null,this._children=[],this._storage=null,this.__dirty=!0,n.call(this),a.call(this)};return o.prototype.ignore=!1,o.prototype.children=function(){return this._children.slice()},o.prototype.childAt=function(e){return this._children[e]},o.prototype.addChild=function(e){e!=this&&e.parent!=this&&(e.parent&&e.parent.removeChild(e),this._children.push(e),e.parent=this,this._storage&&this._storage!==e._storage&&(this._storage.addToMap(e),e instanceof o&&e.addChildrenToStorage(this._storage)))},o.prototype.removeChild=function(e){var t=i.indexOf(this._children,e);t>=0&&this._children.splice(t,1),e.parent=null,this._storage&&(this._storage.delFromMap(e.id),e instanceof o&&e.delChildrenFromStorage(this._storage))},o.prototype.clearChildren=function(){for(var e=0;e<this._children.length;e++){var t=this._children[e];this._storage&&(this._storage.delFromMap(t.id),t instanceof o&&t.delChildrenFromStorage(this._storage))}this._children.length=0},o.prototype.eachChild=function(e,t){for(var i=!!t,n=0;n<this._children.length;n++){var a=this._children[n];i?e.call(t,a):e(a)}},o.prototype.traverse=function(e,t){for(var i=!!t,n=0;n<this._children.length;n++){var a=this._children[n];i?e.call(t,a):e(a),"group"===a.type&&a.traverse(e,t)}},o.prototype.addChildrenToStorage=function(e){for(var t=0;t<this._children.length;t++){var i=this._children[t];e.addToMap(i),i instanceof o&&i.addChildrenToStorage(e)}},o.prototype.delChildrenFromStorage=function(e){for(var t=0;t<this._children.length;t++){var i=this._children[t];e.delFromMap(i.id),i instanceof o&&i.delChildrenFromStorage(e)}},o.prototype.modSelf=function(){this.__dirty=!0},i.merge(o.prototype,n.prototype,!0),i.merge(o.prototype,a.prototype,!0),o}),i("zrender/animation/Clip",["require","./easing"],function(e){function t(e){this._targetPool=e.target||{},this._targetPool instanceof Array||(this._targetPool=[this._targetPool]),this._life=e.life||1e3,this._delay=e.delay||0,this._startTime=(new Date).getTime()+this._delay,this._endTime=this._startTime+1e3*this._life,this.loop="undefined"==typeof e.loop?!1:e.loop,this.gap=e.gap||0,this.easing=e.easing||"Linear",this.onframe=e.onframe,this.ondestroy=e.ondestroy,this.onrestart=e.onrestart}var i=e("./easing");return t.prototype={step:function(e){var t=(e-this._startTime)/this._life;if(!(0>t)){t=Math.min(t,1);var n="string"==typeof this.easing?i[this.easing]:this.easing,a="function"==typeof n?n(t):t;return this.fire("frame",a),1==t?this.loop?(this.restart(),"restart"):(this.__needsRemove=!0,"destroy"):null}},restart:function(){var e=(new Date).getTime(),t=(e-this._startTime)%this._life;this._startTime=(new Date).getTime()-t+this.gap,this.__needsRemove=!1},fire:function(e,t){for(var i=0,n=this._targetPool.length;n>i;i++)this["on"+e]&&this["on"+e](this._targetPool[i],t)},constructor:t},t}),i("zrender/animation/easing",[],function(){var e={Linear:function(e){return e},QuadraticIn:function(e){return e*e},QuadraticOut:function(e){return e*(2-e)},QuadraticInOut:function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)},CubicIn:function(e){return e*e*e},CubicOut:function(e){return--e*e*e+1},CubicInOut:function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)},QuarticIn:function(e){return e*e*e*e},QuarticOut:function(e){return 1- --e*e*e*e},QuarticInOut:function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)},QuinticIn:function(e){return e*e*e*e*e},QuinticOut:function(e){return--e*e*e*e*e+1},QuinticInOut:function(e){return(e*=2)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)},SinusoidalIn:function(e){return 1-Math.cos(e*Math.PI/2)},SinusoidalOut:function(e){return Math.sin(e*Math.PI/2)},SinusoidalInOut:function(e){return.5*(1-Math.cos(Math.PI*e))},ExponentialIn:function(e){return 0===e?0:Math.pow(1024,e-1)},ExponentialOut:function(e){return 1===e?1:1-Math.pow(2,-10*e)},ExponentialInOut:function(e){return 0===e?0:1===e?1:(e*=2)<1?.5*Math.pow(1024,e-1):.5*(-Math.pow(2,-10*(e-1))+2)},CircularIn:function(e){return 1-Math.sqrt(1-e*e)},CircularOut:function(e){return Math.sqrt(1- --e*e)},CircularInOut:function(e){return(e*=2)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)},ElasticIn:function(e){var t,i=.1,n=.4;return 0===e?0:1===e?1:(!i||1>i?(i=1,t=n/4):t=n*Math.asin(1/i)/(2*Math.PI),-(i*Math.pow(2,10*(e-=1))*Math.sin(2*(e-t)*Math.PI/n)))},ElasticOut:function(e){var t,i=.1,n=.4;return 0===e?0:1===e?1:(!i||1>i?(i=1,t=n/4):t=n*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*e)*Math.sin(2*(e-t)*Math.PI/n)+1)},ElasticInOut:function(e){var t,i=.1,n=.4;return 0===e?0:1===e?1:(!i||1>i?(i=1,t=n/4):t=n*Math.asin(1/i)/(2*Math.PI),(e*=2)<1?-.5*i*Math.pow(2,10*(e-=1))*Math.sin(2*(e-t)*Math.PI/n):i*Math.pow(2,-10*(e-=1))*Math.sin(2*(e-t)*Math.PI/n)*.5+1)},BackIn:function(e){var t=1.70158;return e*e*((t+1)*e-t)},BackOut:function(e){var t=1.70158;return--e*e*((t+1)*e+t)+1},BackInOut:function(e){var t=2.5949095;return(e*=2)<1?.5*e*e*((t+1)*e-t):.5*((e-=2)*e*((t+1)*e+t)+2)},BounceIn:function(t){return 1-e.BounceOut(1-t)},BounceOut:function(e){return 1/2.75>e?7.5625*e*e:2/2.75>e?7.5625*(e-=1.5/2.75)*e+.75:2.5/2.75>e?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},BounceInOut:function(t){return.5>t?.5*e.BounceIn(2*t):.5*e.BounceOut(2*t-1)+.5}};return e}),i("echarts/chart/base",["require","zrender/shape/Image","../util/shape/Icon","../util/shape/MarkLine","../util/shape/Symbol","zrender/shape/Polyline","zrender/shape/ShapeBundle","../config","../util/ecData","../util/ecAnimation","../util/ecEffect","../util/accMath","../component/base","../layout/EdgeBundling","zrender/tool/util","zrender/tool/area"],function(e){function t(e){return null!=e.x&&null!=e.y}function i(e,t,i,n,a){p.call(this,e,t,i,n,a);var o=this;this.selectedMap={},this.lastShapeList=[],this.shapeHandler={onclick:function(){o.isClick=!0},ondragover:function(e){var t=e.target;t.highlightStyle=t.highlightStyle||{};var i=t.highlightStyle,n=i.brushTyep,a=i.strokeColor,r=i.lineWidth;i.brushType="stroke",i.strokeColor=o.ecTheme.calculableColor||h.calculableColor,i.lineWidth="icon"===t.type?30:10,o.zr.addHoverShape(t),setTimeout(function(){i&&(i.brushType=n,i.strokeColor=a,i.lineWidth=r)},20)},ondrop:function(e){null!=m.get(e.dragged,"data")&&(o.isDrop=!0)},ondragend:function(){o.isDragend=!0}}}var n=e("zrender/shape/Image"),a=e("../util/shape/Icon"),o=e("../util/shape/MarkLine"),r=e("../util/shape/Symbol"),s=e("zrender/shape/Polyline"),l=e("zrender/shape/ShapeBundle"),h=e("../config"),m=e("../util/ecData"),V=e("../util/ecAnimation"),U=e("../util/ecEffect"),d=e("../util/accMath"),p=e("../component/base"),c=e("../layout/EdgeBundling"),u=e("zrender/tool/util"),y=e("zrender/tool/area");return i.prototype={setCalculable:function(e){return e.dragEnableTime=this.ecTheme.DRAG_ENABLE_TIME||h.DRAG_ENABLE_TIME,e.ondragover=this.shapeHandler.ondragover,e.ondragend=this.shapeHandler.ondragend,e.ondrop=this.shapeHandler.ondrop,e},ondrop:function(e,t){if(this.isDrop&&e.target&&!t.dragIn){var i,n=e.target,a=e.dragged,o=m.get(n,"seriesIndex"),r=m.get(n,"dataIndex"),s=this.series,l=this.component.legend;if(-1===r){if(m.get(a,"seriesIndex")==o)return t.dragOut=t.dragIn=t.needRefresh=!0,void(this.isDrop=!1);i={value:m.get(a,"value"),name:m.get(a,"name")},this.type===h.CHART_TYPE_PIE&&i.value<0&&(i.value=0);for(var V=!1,U=s[o].data,p=0,c=U.length;c>p;p++)U[p].name===i.name&&"-"===U[p].value&&(s[o].data[p].value=i.value,V=!0);!V&&s[o].data.push(i),l&&l.add(i.name,a.style.color||a.style.strokeColor)}else i=s[o].data[r]||"-",null!=i.value?(s[o].data[r].value="-"!=i.value?d.accAdd(s[o].data[r].value,m.get(a,"value")):m.get(a,"value"),(this.type===h.CHART_TYPE_FUNNEL||this.type===h.CHART_TYPE_PIE)&&(l&&1===l.getRelatedAmount(i.name)&&this.component.legend.del(i.name),i.name+=this.option.nameConnector+m.get(a,"name"),l&&l.add(i.name,a.style.color||a.style.strokeColor))):s[o].data[r]="-"!=i?d.accAdd(s[o].data[r],m.get(a,"value")):m.get(a,"value");t.dragIn=t.dragIn||!0,this.isDrop=!1;var u=this;setTimeout(function(){u.zr.trigger("mousemove",e.event)},300)}},ondragend:function(e,t){if(this.isDragend&&e.target&&!t.dragOut){var i=e.target,n=m.get(i,"seriesIndex"),a=m.get(i,"dataIndex"),o=this.series;if(null!=o[n].data[a].value){o[n].data[a].value="-";var r=o[n].data[a].name,s=this.component.legend;s&&0===s.getRelatedAmount(r)&&s.del(r)}else o[n].data[a]="-";t.dragOut=!0,t.needRefresh=!0,this.isDragend=!1}},onlegendSelected:function(e,t){var i=e.selected;for(var n in this.selectedMap)this.selectedMap[n]!=i[n]&&(t.needRefresh=!0),this.selectedMap[n]=i[n]},_buildPosition:function(){this._symbol=this.option.symbolList,this._sIndex2ShapeMap={},this._sIndex2ColorMap={},this.selectedMap={},this.xMarkMap={};for(var e,t,i,n,a=this.series,o={top:[],bottom:[],left:[],right:[],other:[]},r=0,s=a.length;s>r;r++)a[r].type===this.type&&(a[r]=this.reformOption(a[r]),this.legendHoverLink=a[r].legendHoverLink||this.legendHoverLink,e=a[r].xAxisIndex,t=a[r].yAxisIndex,i=this.component.xAxis.getAxis(e),n=this.component.yAxis.getAxis(t),i.type===h.COMPONENT_TYPE_AXIS_CATEGORY?o[i.getPosition()].push(r):n.type===h.COMPONENT_TYPE_AXIS_CATEGORY?o[n.getPosition()].push(r):o.other.push(r));for(var l in o)o[l].length>0&&this._buildSinglePosition(l,o[l]);this.addShapeList()},_buildSinglePosition:function(e,t){var i=this._mapData(t),n=i.locationMap,a=i.maxDataLength;if(0!==a&&0!==n.length){switch(e){case"bottom":case"top":this._buildHorizontal(t,a,n,this.xMarkMap);break;case"left":case"right":this._buildVertical(t,a,n,this.xMarkMap);break;case"other":this._buildOther(t,a,n,this.xMarkMap)}for(var o=0,r=t.length;r>o;o++)this.buildMark(t[o])}},_mapData:function(e){for(var t,i,n,a,o=this.series,r=0,s={},l="__kener__stack__",m=this.component.legend,V=[],U=0,d=0,p=e.length;p>d;d++){if(t=o[e[d]],n=t.name,this._sIndex2ShapeMap[e[d]]=this._sIndex2ShapeMap[e[d]]||this.query(t,"symbol")||this._symbol[d%this._symbol.length],m){if(this.selectedMap[n]=m.isSelected(n),this._sIndex2ColorMap[e[d]]=m.getColor(n),a=m.getItemShape(n)){var c=a.style;if(this.type==h.CHART_TYPE_LINE)c.iconType="legendLineIcon",c.symbol=this._sIndex2ShapeMap[e[d]];else if(t.itemStyle.normal.barBorderWidth>0){var u=a.highlightStyle;c.brushType="both",c.x+=1,c.y+=1,c.width-=2,c.height-=2,c.strokeColor=u.strokeColor=t.itemStyle.normal.barBorderColor,u.lineWidth=3}m.setItemShape(n,a)}}else this.selectedMap[n]=!0,this._sIndex2ColorMap[e[d]]=this.zr.getColor(e[d]);this.selectedMap[n]&&(i=t.stack||l+e[d],null==s[i]?(s[i]=r,V[r]=[e[d]],r++):V[s[i]].push(e[d])),U=Math.max(U,t.data.length)}return{locationMap:V,maxDataLength:U}},_calculMarkMapXY:function(e,t,i){for(var n=this.series,a=0,o=t.length;o>a;a++)for(var r=0,s=t[a].length;s>r;r++){var l=t[a][r],h="xy"==i?0:"",m=this.component.grid,V=e[l];if("-1"!=i.indexOf("x")){V["counter"+h]>0&&(V["average"+h]=V["sum"+h]/V["counter"+h]);var U=this.component.xAxis.getAxis(n[l].xAxisIndex||0).getCoord(V["average"+h]);V["averageLine"+h]=[[U,m.getYend()],[U,m.getY()]],V["minLine"+h]=[[V["minX"+h],m.getYend()],[V["minX"+h],m.getY()]],V["maxLine"+h]=[[V["maxX"+h],m.getYend()],[V["maxX"+h],m.getY()]],V.isHorizontal=!1}if(h="xy"==i?1:"","-1"!=i.indexOf("y")){V["counter"+h]>0&&(V["average"+h]=V["sum"+h]/V["counter"+h]);var d=this.component.yAxis.getAxis(n[l].yAxisIndex||0).getCoord(V["average"+h]);V["averageLine"+h]=[[m.getX(),d],[m.getXend(),d]],V["minLine"+h]=[[m.getX(),V["minY"+h]],[m.getXend(),V["minY"+h]]],V["maxLine"+h]=[[m.getX(),V["maxY"+h]],[m.getXend(),V["maxY"+h]]],V.isHorizontal=!0}}},addLabel:function(e,t,i,n,a){var o=[i,t],r=this.deepMerge(o,"itemStyle.normal.label"),s=this.deepMerge(o,"itemStyle.emphasis.label"),l=r.textStyle||{},h=s.textStyle||{};
-
-if(r.show){var m=e.style;m.text=this._getLabelText(t,i,n,"normal"),m.textPosition=null==r.position?"horizontal"===a?"right":"top":r.position,m.textColor=l.color,m.textFont=this.getFont(l),m.textAlign=l.align,m.textBaseline=l.baseline}if(s.show){var V=e.highlightStyle;V.text=this._getLabelText(t,i,n,"emphasis"),V.textPosition=r.show?e.style.textPosition:null==s.position?"horizontal"===a?"right":"top":s.position,V.textColor=h.color,V.textFont=this.getFont(h),V.textAlign=h.align,V.textBaseline=h.baseline}return e},_getLabelText:function(e,t,i,n){var a=this.deepQuery([t,e],"itemStyle."+n+".label.formatter");a||"emphasis"!==n||(a=this.deepQuery([t,e],"itemStyle.normal.label.formatter"));var o=this.getDataFromOption(t,"-");return a?"function"==typeof a?a.call(this.myChart,{seriesName:e.name,series:e,name:i,value:o,data:t,status:n}):"string"==typeof a?a=a.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}").replace("{a0}",e.name).replace("{b0}",i).replace("{c0}",this.numAddCommas(o)):void 0:o instanceof Array?null!=o[2]?this.numAddCommas(o[2]):o[0]+" , "+o[1]:this.numAddCommas(o)},buildMark:function(e){var t=this.series[e];this.selectedMap[t.name]&&(t.markLine&&this._buildMarkLine(e),t.markPoint&&this._buildMarkPoint(e))},_buildMarkPoint:function(e){for(var t,i,n=(this.markAttachStyle||{})[e],a=this.series[e],o=u.clone(a.markPoint),r=0,s=o.data.length;s>r;r++)t=o.data[r],i=this.getMarkCoord(e,t),t.x=null!=t.x?t.x:i[0],t.y=null!=t.y?t.y:i[1],!t.type||"max"!==t.type&&"min"!==t.type||(t.value=i[3],t.name=t.name||t.type,t.symbolSize=t.symbolSize||y.getTextWidth(i[3],this.getFont())/2+5);for(var l=this._markPoint(e,o),r=0,s=l.length;s>r;r++){var m=l[r];m.zlevel=a.zlevel,m.z=a.z+1;for(var V in n)m[V]=u.clone(n[V]);this.shapeList.push(m)}if(this.type===h.CHART_TYPE_FORCE||this.type===h.CHART_TYPE_CHORD)for(var r=0,s=l.length;s>r;r++)this.zr.addShape(l[r])},_buildMarkLine:function(e){for(var t,i=(this.markAttachStyle||{})[e],n=this.series[e],a=u.clone(n.markLine),o=0,r=a.data.length;r>o;o++){var s=a.data[o];!s.type||"max"!==s.type&&"min"!==s.type&&"average"!==s.type?t=[this.getMarkCoord(e,s[0]),this.getMarkCoord(e,s[1])]:(t=this.getMarkCoord(e,s),a.data[o]=[u.clone(s),{}],a.data[o][0].name=s.name||s.type,a.data[o][0].value="average"!==s.type?t[3]:+t[3].toFixed(null!=a.precision?a.precision:this.deepQuery([this.ecTheme,h],"markLine.precision")),t=t[2],s=[{},{}]),null!=t&&null!=t[0]&&null!=t[1]&&(a.data[o][0].x=null!=s[0].x?s[0].x:t[0][0],a.data[o][0].y=null!=s[0].y?s[0].y:t[0][1],a.data[o][1].x=null!=s[1].x?s[1].x:t[1][0],a.data[o][1].y=null!=s[1].y?s[1].y:t[1][1])}var m=this._markLine(e,a),V=a.large;if(V){var U=new l({style:{shapeList:m}}),d=m[0];if(d){u.merge(U.style,d.style),u.merge(U.highlightStyle={},d.highlightStyle),U.style.brushType="stroke",U.zlevel=n.zlevel,U.z=n.z+1,U.hoverable=!1;for(var p in i)U[p]=u.clone(i[p])}this.shapeList.push(U),this.zr.addShape(U),U._mark="largeLine";var c=a.effect;c.show&&(U.effect=c)}else{for(var o=0,r=m.length;r>o;o++){var y=m[o];y.zlevel=n.zlevel,y.z=n.z+1;for(var p in i)y[p]=u.clone(i[p]);this.shapeList.push(y)}if(this.type===h.CHART_TYPE_FORCE||this.type===h.CHART_TYPE_CHORD)for(var o=0,r=m.length;r>o;o++)this.zr.addShape(m[o])}},_markPoint:function(e,t){var i=this.series[e],n=this.component;u.merge(u.merge(t,u.clone(this.ecTheme.markPoint||{})),u.clone(h.markPoint)),t.name=i.name;var a,o,r,s,l,V,U,d=[],p=t.data,c=n.dataRange,y=n.legend,g=this.zr.getWidth(),b=this.zr.getHeight();if(t.large)a=this.getLargeMarkPointShape(e,t),a._mark="largePoint",a&&d.push(a);else for(var f=0,k=p.length;k>f;f++)null!=p[f].x&&null!=p[f].y&&(r=null!=p[f].value?p[f].value:"",y&&(o=y.getColor(i.name)),c&&(o=isNaN(r)?o:c.getColor(r),s=[p[f],t],l=this.deepQuery(s,"itemStyle.normal.color")||o,V=this.deepQuery(s,"itemStyle.emphasis.color")||l,null==l&&null==V)||(o=null==o?this.zr.getColor(e):o,p[f].tooltip=p[f].tooltip||t.tooltip||{trigger:"item"},p[f].name=null!=p[f].name?p[f].name:"",p[f].value=r,a=this.getSymbolShape(t,e,p[f],f,p[f].name,this.parsePercent(p[f].x,g),this.parsePercent(p[f].y,b),"pin",o,"rgba(0,0,0,0)","horizontal"),a._mark="point",U=this.deepMerge([p[f],t],"effect"),U.show&&(a.effect=U),i.type===h.CHART_TYPE_MAP&&(a._geo=this.getMarkGeo(p[f])),m.pack(a,i,e,p[f],f,p[f].name,r),d.push(a)));return d},_markLine:function(){function e(e,t){e[t]=e[t]instanceof Array?e[t].length>1?e[t]:[e[t][0],e[t][0]]:[e[t],e[t]]}return function(i,n){var a=this.series[i],o=this.component,r=o.dataRange,s=o.legend;u.merge(u.merge(n,u.clone(this.ecTheme.markLine||{})),u.clone(h.markLine));var l=s?s.getColor(a.name):this.zr.getColor(i);e(n,"symbol"),e(n,"symbolSize"),e(n,"symbolRotate");for(var V=n.data,U=[],d=this.zr.getWidth(),p=this.zr.getHeight(),y=0;y<V.length;y++){var g=V[y];if(t(g[0])&&t(g[1])){var b=this.deepMerge(g),f=[b,n],k=l,x=null!=b.value?b.value:"";if(r){k=isNaN(x)?k:r.getColor(x);var _=this.deepQuery(f,"itemStyle.normal.color")||k,L=this.deepQuery(f,"itemStyle.emphasis.color")||_;if(null==_&&null==L)continue}g[0].tooltip=b.tooltip||n.tooltip||{trigger:"item"},g[0].name=g[0].name||"",g[1].name=g[1].name||"",g[0].value=x,U.push({points:[[this.parsePercent(g[0].x,d),this.parsePercent(g[0].y,p)],[this.parsePercent(g[1].x,d),this.parsePercent(g[1].y,p)]],rawData:g,color:k})}}var W=this.query(n,"bundling.enable");if(W){var X=new c;X.maxTurningAngle=this.query(n,"bundling.maxTurningAngle")/180*Math.PI,U=X.run(U)}n.name=a.name;for(var v=[],y=0,w=U.length;w>y;y++){var K=U[y],I=K.rawEdge||K,g=I.rawData,x=null!=g.value?g.value:"",J=this.getMarkLineShape(n,i,g,y,K.points,W,I.color);J._mark="line";var C=this.deepMerge([g[0],g[1],n],"effect");C.show&&(J.effect=C,J.effect.large=n.large),a.type===h.CHART_TYPE_MAP&&(J._geo=[this.getMarkGeo(g[0]),this.getMarkGeo(g[1])]),m.pack(J,a,i,g[0],y,g[0].name+(""!==g[1].name?" > "+g[1].name:""),x),v.push(J)}return v}}(),getMarkCoord:function(){return[0,0]},getSymbolShape:function(e,t,i,o,r,s,l,h,V,U,d){var p=[i,e],c=this.getDataFromOption(i,"-");h=this.deepQuery(p,"symbol")||h;var u=this.deepQuery(p,"symbolSize");u="function"==typeof u?u(c):u,"number"==typeof u&&(u=[u,u]);var y=this.deepQuery(p,"symbolRotate"),g=this.deepMerge(p,"itemStyle.normal"),b=this.deepMerge(p,"itemStyle.emphasis"),f=null!=g.borderWidth?g.borderWidth:g.lineStyle&&g.lineStyle.width;null==f&&(f=h.match("empty")?2:0);var k=null!=b.borderWidth?b.borderWidth:b.lineStyle&&b.lineStyle.width;null==k&&(k=f+2);var x=this.getItemStyleColor(g.color,t,o,i),_=this.getItemStyleColor(b.color,t,o,i),L=u[0],W=u[1],X=new a({style:{iconType:h.replace("empty","").toLowerCase(),x:s-L,y:l-W,width:2*L,height:2*W,brushType:"both",color:h.match("empty")?U:x||V,strokeColor:g.borderColor||x||V,lineWidth:f},highlightStyle:{color:h.match("empty")?U:_||x||V,strokeColor:b.borderColor||g.borderColor||_||x||V,lineWidth:k},clickable:this.deepQuery(p,"clickable")});return h.match("image")&&(X.style.image=h.replace(new RegExp("^image:\\/\\/"),""),X=new n({style:X.style,highlightStyle:X.highlightStyle,clickable:this.deepQuery(p,"clickable")})),null!=y&&(X.rotation=[y*Math.PI/180,s,l]),h.match("star")&&(X.style.iconType="star",X.style.n=h.replace("empty","").replace("star","")-0||5),"none"===h&&(X.invisible=!0,X.hoverable=!1),X=this.addLabel(X,e,i,r,d),h.match("empty")&&(null==X.style.textColor&&(X.style.textColor=X.style.strokeColor),null==X.highlightStyle.textColor&&(X.highlightStyle.textColor=X.highlightStyle.strokeColor)),m.pack(X,e,t,i,o,r),X._x=s,X._y=l,X._dataIndex=o,X._seriesIndex=t,X},getMarkLineShape:function(e,t,i,n,a,r,l){var h=null!=i[0].value?i[0].value:"-",m=null!=i[1].value?i[1].value:"-",V=[i[0].symbol||e.symbol[0],i[1].symbol||e.symbol[1]],U=[i[0].symbolSize||e.symbolSize[0],i[1].symbolSize||e.symbolSize[1]];U[0]="function"==typeof U[0]?U[0](h):U[0],U[1]="function"==typeof U[1]?U[1](m):U[1];var d=[this.query(i[0],"symbolRotate")||e.symbolRotate[0],this.query(i[1],"symbolRotate")||e.symbolRotate[1]],p=[i[0],i[1],e],c=this.deepMerge(p,"itemStyle.normal");c.color=this.getItemStyleColor(c.color,t,n,i);var u=this.deepMerge(p,"itemStyle.emphasis");u.color=this.getItemStyleColor(u.color,t,n,i);var y=c.lineStyle,g=u.lineStyle,b=y.width;null==b&&(b=c.borderWidth);var f=g.width;null==f&&(f=null!=u.borderWidth?u.borderWidth:b+2);var k=this.deepQuery(p,"smoothness");this.deepQuery(p,"smooth")||(k=0);var x=r?s:o,_=new x({style:{symbol:V,symbolSize:U,symbolRotate:d,brushType:"both",lineType:y.type,shadowColor:y.shadowColor||y.color||c.borderColor||c.color||l,shadowBlur:y.shadowBlur,shadowOffsetX:y.shadowOffsetX,shadowOffsetY:y.shadowOffsetY,color:c.color||l,strokeColor:y.color||c.borderColor||c.color||l,lineWidth:b,symbolBorderColor:c.borderColor||c.color||l,symbolBorder:c.borderWidth},highlightStyle:{shadowColor:g.shadowColor,shadowBlur:g.shadowBlur,shadowOffsetX:g.shadowOffsetX,shadowOffsetY:g.shadowOffsetY,color:u.color||c.color||l,strokeColor:g.color||y.color||u.borderColor||c.borderColor||u.color||c.color||l,lineWidth:f,symbolBorderColor:u.borderColor||c.borderColor||u.color||c.color||l,symbolBorder:null==u.borderWidth?c.borderWidth+2:u.borderWidth},clickable:this.deepQuery(p,"clickable")}),L=_.style;return r?(L.pointList=a,L.smooth=k):(L.xStart=a[0][0],L.yStart=a[0][1],L.xEnd=a[1][0],L.yEnd=a[1][1],L.curveness=k,_.updatePoints(_.style)),_=this.addLabel(_,e,i[0],i[0].name+" : "+i[1].name)},getLargeMarkPointShape:function(e,t){var i,n,a,o,s,l,h=this.series[e],m=this.component,V=t.data,U=m.dataRange,d=m.legend,p=[V[0],t];if(d&&(n=d.getColor(h.name)),!U||(a=null!=V[0].value?V[0].value:"",n=isNaN(a)?n:U.getColor(a),o=this.deepQuery(p,"itemStyle.normal.color")||n,s=this.deepQuery(p,"itemStyle.emphasis.color")||o,null!=o||null!=s)){n=this.deepMerge(p,"itemStyle.normal").color||n;var c=this.deepQuery(p,"symbol")||"circle";c=c.replace("empty","").replace(/\d/g,""),l=this.deepMerge([V[0],t],"effect");var u=window.devicePixelRatio||1;return i=new r({style:{pointList:V,color:n,strokeColor:n,shadowColor:l.shadowColor||n,shadowBlur:(null!=l.shadowBlur?l.shadowBlur:8)*u,size:this.deepQuery(p,"symbolSize"),iconType:c,brushType:"fill",lineWidth:1},draggable:!1,hoverable:!1}),l.show&&(i.effect=l),i}},backupShapeList:function(){this.shapeList&&this.shapeList.length>0?(this.lastShapeList=this.shapeList,this.shapeList=[]):this.lastShapeList=[]},addShapeList:function(){var e,t,i=this.option.animationThreshold/(this.canvasSupported?2:4),n=this.lastShapeList,a=this.shapeList,o=n.length>0,r=o?this.query(this.option,"animationDurationUpdate"):this.query(this.option,"animationDuration"),s=this.query(this.option,"animationEasing"),l={},m={};if(this.option.animation&&!this.option.renderAsImage&&a.length<i&&!this.motionlessOnce){for(var V=0,U=n.length;U>V;V++)t=this._getAnimationKey(n[V]),t.match("undefined")?this.zr.delShape(n[V].id):(t+=n[V].type,l[t]?this.zr.delShape(n[V].id):l[t]=n[V]);for(var V=0,U=a.length;U>V;V++)t=this._getAnimationKey(a[V]),t.match("undefined")?this.zr.addShape(a[V]):(t+=a[V].type,m[t]=a[V]);for(t in l)m[t]||this.zr.delShape(l[t].id);for(t in m)l[t]?(this.zr.delShape(l[t].id),this._animateMod(l[t],m[t],r,s,0,o)):(e=this.type!=h.CHART_TYPE_LINE&&this.type!=h.CHART_TYPE_RADAR||0===t.indexOf("icon")?0:r/2,this._animateMod(!1,m[t],r,s,e,o));this.zr.refresh(),this.animationEffect()}else{this.motionlessOnce=!1,this.zr.delShape(n);for(var V=0,U=a.length;U>V;V++)this.zr.addShape(a[V])}},_getAnimationKey:function(e){return this.type!=h.CHART_TYPE_MAP&&this.type!=h.CHART_TYPE_TREEMAP&&this.type!=h.CHART_TYPE_VENN&&this.type!=h.CHART_TYPE_TREE?m.get(e,"seriesIndex")+"_"+m.get(e,"dataIndex")+(e._mark?e._mark:"")+(this.type===h.CHART_TYPE_RADAR?m.get(e,"special"):""):m.get(e,"seriesIndex")+"_"+m.get(e,"dataIndex")+(e._mark?e._mark:"undefined")},_animateMod:function(e,t,i,n,a,o){switch(t.type){case"polyline":case"half-smooth-polygon":V.pointList(this.zr,e,t,i,n);break;case"rectangle":V.rectangle(this.zr,e,t,i,n);break;case"image":case"icon":V.icon(this.zr,e,t,i,n,a);break;case"candle":o?this.zr.addShape(t):V.candle(this.zr,e,t,i,n);break;case"ring":case"sector":case"circle":o?"sector"===t.type?V.sector(this.zr,e,t,i,n):this.zr.addShape(t):V.ring(this.zr,e,t,i+(m.get(t,"dataIndex")||0)%20*100,n);break;case"text":V.text(this.zr,e,t,i,n);break;case"polygon":o?V.pointList(this.zr,e,t,i,n):V.polygon(this.zr,e,t,i,n);break;case"ribbon":V.ribbon(this.zr,e,t,i,n);break;case"gauge-pointer":V.gaugePointer(this.zr,e,t,i,n);break;case"mark-line":V.markline(this.zr,e,t,i,n);break;case"bezier-curve":case"line":V.line(this.zr,e,t,i,n);break;default:this.zr.addShape(t)}},animationMark:function(e,t,i){for(var i=i||this.shapeList,n=0,a=i.length;a>n;n++)i[n]._mark&&this._animateMod(!1,i[n],e,t,0,!0);this.animationEffect(i)},animationEffect:function(e){if(!e&&this.clearEffectShape(),e=e||this.shapeList,null!=e){var t=h.EFFECT_ZLEVEL;this.canvasSupported&&this.zr.modLayer(t,{motionBlur:!0,lastFrameAlpha:this.option.effectBlendAlpha||h.effectBlendAlpha});for(var i,n=0,a=e.length;a>n;n++)i=e[n],i._mark&&i.effect&&i.effect.show&&U[i._mark]&&(U[i._mark](this.zr,this.effectList,i,t),this.effectList[this.effectList.length-1]._mark=i._mark)}},clearEffectShape:function(e){var t=this.effectList;if(this.zr&&t&&t.length>0){e&&this.zr.modLayer(h.EFFECT_ZLEVEL,{motionBlur:!1}),this.zr.delShape(t);for(var i=0;i<t.length;i++)t[i].effectAnimator&&t[i].effectAnimator.stop()}this.effectList=[]},addMark:function(e,t,i){var n=this.series[e];if(this.selectedMap[n.name]){var a=this.query(this.option,"animationDurationUpdate"),o=this.query(this.option,"animationEasing"),r=n[i].data,s=this.shapeList.length;if(n[i].data=t.data,this["_build"+i.replace("m","M")](e),this.option.animation&&!this.option.renderAsImage)this.animationMark(a,o,this.shapeList.slice(s));else{for(var l=s,h=this.shapeList.length;h>l;l++)this.zr.addShape(this.shapeList[l]);this.zr.refreshNextFrame()}n[i].data=r}},delMark:function(e,t,i){i=i.replace("mark","").replace("large","").toLowerCase();var n=this.series[e];if(this.selectedMap[n.name]){for(var a=!1,o=[this.shapeList,this.effectList],r=2;r--;)for(var s=0,l=o[r].length;l>s;s++)if(o[r][s]._mark==i&&m.get(o[r][s],"seriesIndex")==e&&m.get(o[r][s],"name")==t){this.zr.delShape(o[r][s].id),o[r].splice(s,1),a=!0;break}a&&this.zr.refreshNextFrame()}}},u.inherits(i,p),i}),i("zrender/shape/Circle",["require","./Base","../tool/util"],function(e){"use strict";var t=e("./Base"),i=function(e){t.call(this,e)};return i.prototype={type:"circle",buildPath:function(e,t){e.moveTo(t.x+t.r,t.y),e.arc(t.x,t.y,t.r,0,2*Math.PI,!0)},getRect:function(e){if(e.__rect)return e.__rect;var t;return t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-e.r-t/2),y:Math.round(e.y-e.r-t/2),width:2*e.r+t,height:2*e.r+t},e.__rect}},e("../tool/util").inherits(i,t),i}),i("echarts/util/accMath",[],function(){function e(e,t){var i=e.toString(),n=t.toString(),a=0;try{a=n.split(".")[1].length}catch(o){}try{a-=i.split(".")[1].length}catch(o){}return(i.replace(".","")-0)/(n.replace(".","")-0)*Math.pow(10,a)}function t(e,t){var i=e.toString(),n=t.toString(),a=0;try{a+=i.split(".")[1].length}catch(o){}try{a+=n.split(".")[1].length}catch(o){}return(i.replace(".","")-0)*(n.replace(".","")-0)/Math.pow(10,a)}function i(e,t){var i=0,n=0;try{i=e.toString().split(".")[1].length}catch(a){}try{n=t.toString().split(".")[1].length}catch(a){}var o=Math.pow(10,Math.max(i,n));return(Math.round(e*o)+Math.round(t*o))/o}function n(e,t){return i(e,-t)}return{accDiv:e,accMul:t,accAdd:i,accSub:n}}),i("echarts/util/shape/Icon",["require","zrender/tool/util","zrender/shape/Star","zrender/shape/Heart","zrender/shape/Droplet","zrender/shape/Image","zrender/shape/Base"],function(e){function t(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n+t.height),e.lineTo(i+5*a,n+14*o),e.lineTo(i+t.width,n+3*o),e.lineTo(i+13*a,n),e.lineTo(i+2*a,n+11*o),e.lineTo(i,n+t.height),e.moveTo(i+6*a,n+10*o),e.lineTo(i+14*a,n+2*o),e.moveTo(i+10*a,n+13*o),e.lineTo(i+t.width,n+13*o),e.moveTo(i+13*a,n+10*o),e.lineTo(i+13*a,n+t.height)}function i(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n+t.height),e.lineTo(i+5*a,n+14*o),e.lineTo(i+t.width,n+3*o),e.lineTo(i+13*a,n),e.lineTo(i+2*a,n+11*o),e.lineTo(i,n+t.height),e.moveTo(i+6*a,n+10*o),e.lineTo(i+14*a,n+2*o),e.moveTo(i+10*a,n+13*o),e.lineTo(i+t.width,n+13*o)}function n(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i+4*a,n+15*o),e.lineTo(i+9*a,n+13*o),e.lineTo(i+14*a,n+8*o),e.lineTo(i+11*a,n+5*o),e.lineTo(i+6*a,n+10*o),e.lineTo(i+4*a,n+15*o),e.moveTo(i+5*a,n),e.lineTo(i+11*a,n),e.moveTo(i+5*a,n+o),e.lineTo(i+11*a,n+o),e.moveTo(i,n+2*o),e.lineTo(i+t.width,n+2*o),e.moveTo(i,n+5*o),e.lineTo(i+3*a,n+t.height),e.lineTo(i+13*a,n+t.height),e.lineTo(i+t.width,n+5*o)}function a(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n+3*o),e.lineTo(i+6*a,n+3*o),e.moveTo(i+3*a,n),e.lineTo(i+3*a,n+6*o),e.moveTo(i+3*a,n+8*o),e.lineTo(i+3*a,n+t.height),e.lineTo(i+t.width,n+t.height),e.lineTo(i+t.width,n+3*o),e.lineTo(i+8*a,n+3*o)}function o(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i+6*a,n),e.lineTo(i+2*a,n+3*o),e.lineTo(i+6*a,n+6*o),e.moveTo(i+2*a,n+3*o),e.lineTo(i+14*a,n+3*o),e.lineTo(i+14*a,n+11*o),e.moveTo(i+2*a,n+5*o),e.lineTo(i+2*a,n+13*o),e.lineTo(i+14*a,n+13*o),e.moveTo(i+10*a,n+10*o),e.lineTo(i+14*a,n+13*o),e.lineTo(i+10*a,n+t.height)}function r(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16,r=t.width/2;e.lineWidth=1.5,e.arc(i+r,n+r,r-a,0,2*Math.PI/3),e.moveTo(i+3*a,n+t.height),e.lineTo(i+0*a,n+12*o),e.lineTo(i+5*a,n+11*o),e.moveTo(i,n+8*o),e.arc(i+r,n+r,r-a,Math.PI,5*Math.PI/3),e.moveTo(i+13*a,n),e.lineTo(i+t.width,n+4*o),e.lineTo(i+11*a,n+5*o)}function s(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n),e.lineTo(i,n+t.height),e.lineTo(i+t.width,n+t.height),e.moveTo(i+2*a,n+14*o),e.lineTo(i+7*a,n+6*o),e.lineTo(i+11*a,n+11*o),e.lineTo(i+15*a,n+2*o)}function l(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n),e.lineTo(i,n+t.height),e.lineTo(i+t.width,n+t.height),e.moveTo(i+3*a,n+14*o),e.lineTo(i+3*a,n+6*o),e.lineTo(i+4*a,n+6*o),e.lineTo(i+4*a,n+14*o),e.moveTo(i+7*a,n+14*o),e.lineTo(i+7*a,n+2*o),e.lineTo(i+8*a,n+2*o),e.lineTo(i+8*a,n+14*o),e.moveTo(i+11*a,n+14*o),e.lineTo(i+11*a,n+9*o),e.lineTo(i+12*a,n+9*o),e.lineTo(i+12*a,n+14*o)}function h(e,t){var i=t.x,n=t.y,a=t.width-2,o=t.height-2,r=Math.min(a,o)/2;n+=2,e.moveTo(i+r+3,n+r-3),e.arc(i+r+3,n+r-3,r-1,0,-Math.PI/2,!0),e.lineTo(i+r+3,n+r-3),e.moveTo(i+r,n),e.lineTo(i+r,n+r),e.arc(i+r,n+r,r,-Math.PI/2,2*Math.PI,!0),e.lineTo(i+r,n+r),e.lineWidth=1.5}function m(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;n-=o,e.moveTo(i+1*a,n+2*o),e.lineTo(i+15*a,n+2*o),e.lineTo(i+14*a,n+3*o),e.lineTo(i+2*a,n+3*o),e.moveTo(i+3*a,n+6*o),e.lineTo(i+13*a,n+6*o),e.lineTo(i+12*a,n+7*o),e.lineTo(i+4*a,n+7*o),e.moveTo(i+5*a,n+10*o),e.lineTo(i+11*a,n+10*o),e.lineTo(i+10*a,n+11*o),e.lineTo(i+6*a,n+11*o),e.moveTo(i+7*a,n+14*o),e.lineTo(i+9*a,n+14*o),e.lineTo(i+8*a,n+15*o),e.lineTo(i+7*a,n+15*o)}function V(e,t){var i=t.x,n=t.y,a=t.width,o=t.height,r=a/16,s=o/16,l=2*Math.min(r,s);e.moveTo(i+r+l,n+s+l),e.arc(i+r,n+s,l,Math.PI/4,3*Math.PI),e.lineTo(i+7*r-l,n+6*s-l),e.arc(i+7*r,n+6*s,l,Math.PI/4*5,4*Math.PI),e.arc(i+7*r,n+6*s,l/2,Math.PI/4*5,4*Math.PI),e.moveTo(i+7*r-l/2,n+6*s+l),e.lineTo(i+r+l,n+14*s-l),e.arc(i+r,n+14*s,l,-Math.PI/4,2*Math.PI),e.moveTo(i+7*r+l/2,n+6*s),e.lineTo(i+14*r-l,n+10*s-l/2),e.moveTo(i+16*r,n+10*s),e.arc(i+14*r,n+10*s,l,0,3*Math.PI),e.lineWidth=1.5}function U(e,t){var i=t.x,n=t.y,a=t.width,o=t.height,r=Math.min(a,o)/2;e.moveTo(i+a,n+o/2),e.arc(i+r,n+r,r,0,2*Math.PI),e.arc(i+r,n,r,Math.PI/4,Math.PI/5*4),e.arc(i,n+r,r,-Math.PI/3,Math.PI/3),e.arc(i+a,n+o,r,Math.PI,Math.PI/2*3),e.lineWidth=1.5}function d(e,t){for(var i=t.x,n=t.y,a=t.width,o=t.height,r=Math.round(o/3),s=Math.round((r-2)/2),l=3;l--;)e.rect(i,n+r*l+s,a,2)}function p(e,t){for(var i=t.x,n=t.y,a=t.width,o=t.height,r=Math.round(a/3),s=Math.round((r-2)/2),l=3;l--;)e.rect(i+r*l+s,n,2,o)}function c(e,t){var i=t.x,n=t.y,a=t.width/16;e.moveTo(i+a,n),e.lineTo(i+a,n+t.height),e.lineTo(i+15*a,n+t.height),e.lineTo(i+15*a,n),e.lineTo(i+a,n),e.moveTo(i+3*a,n+3*a),e.lineTo(i+13*a,n+3*a),e.moveTo(i+3*a,n+6*a),e.lineTo(i+13*a,n+6*a),e.moveTo(i+3*a,n+9*a),e.lineTo(i+13*a,n+9*a),e.moveTo(i+3*a,n+12*a),e.lineTo(i+9*a,n+12*a)}function u(e,t){var i=t.x,n=t.y,a=t.width/16,o=t.height/16;e.moveTo(i,n),e.lineTo(i,n+t.height),e.lineTo(i+t.width,n+t.height),e.lineTo(i+t.width,n),e.lineTo(i,n),e.moveTo(i+4*a,n),e.lineTo(i+4*a,n+8*o),e.lineTo(i+12*a,n+8*o),e.lineTo(i+12*a,n),e.moveTo(i+6*a,n+11*o),e.lineTo(i+6*a,n+13*o),e.lineTo(i+10*a,n+13*o),e.lineTo(i+10*a,n+11*o),e.lineTo(i+6*a,n+11*o)}function y(e,t){var i=t.x,n=t.y,a=t.width,o=t.height;e.moveTo(i,n+o/2),e.lineTo(i+a,n+o/2),e.moveTo(i+a/2,n),e.lineTo(i+a/2,n+o)}function g(e,t){var i=t.width/2,n=t.height/2,a=Math.min(i,n);e.moveTo(t.x+i+a,t.y+n),e.arc(t.x+i,t.y+n,a,0,2*Math.PI),e.closePath()}function b(e,t){e.rect(t.x,t.y,t.width,t.height),e.closePath()}function f(e,t){var i=t.width/2,n=t.height/2,a=t.x+i,o=t.y+n,r=Math.min(i,n);e.moveTo(a,o-r),e.lineTo(a+r,o+r),e.lineTo(a-r,o+r),e.lineTo(a,o-r),e.closePath()}function k(e,t){var i=t.width/2,n=t.height/2,a=t.x+i,o=t.y+n,r=Math.min(i,n);e.moveTo(a,o-r),e.lineTo(a+r,o),e.lineTo(a,o+r),e.lineTo(a-r,o),e.lineTo(a,o-r),e.closePath()}function x(e,t){var i=t.x,n=t.y,a=t.width/16;e.moveTo(i+8*a,n),e.lineTo(i+a,n+t.height),e.lineTo(i+8*a,n+t.height/4*3),e.lineTo(i+15*a,n+t.height),e.lineTo(i+8*a,n),e.closePath()}function _(t,i){var n=e("zrender/shape/Star"),a=i.width/2,o=i.height/2;n.prototype.buildPath(t,{x:i.x+a,y:i.y+o,r:Math.min(a,o),n:i.n||5})}function L(t,i){var n=e("zrender/shape/Heart");n.prototype.buildPath(t,{x:i.x+i.width/2,y:i.y+.2*i.height,a:i.width/2,b:.8*i.height})}function W(t,i){var n=e("zrender/shape/Droplet");n.prototype.buildPath(t,{x:i.x+.5*i.width,y:i.y+.5*i.height,a:.5*i.width,b:.8*i.height})}function X(e,t){var i=t.x,n=t.y-t.height/2*1.5,a=t.width/2,o=t.height/2,r=Math.min(a,o);e.arc(i+a,n+o,r,Math.PI/5*4,Math.PI/5),e.lineTo(i+a,n+o+1.5*r),e.closePath()}function v(t,i,n){var a=e("zrender/shape/Image");this._imageShape=this._imageShape||new a({style:{}});for(var o in i)this._imageShape.style[o]=i[o];this._imageShape.brush(t,!1,n)}function w(e){I.call(this,e)}var K=e("zrender/tool/util"),I=e("zrender/shape/Base");return w.prototype={type:"icon",iconLibrary:{mark:t,markUndo:i,markClear:n,dataZoom:a,dataZoomReset:o,restore:r,lineChart:s,barChart:l,pieChart:h,funnelChart:m,forceChart:V,chordChart:U,stackChart:d,tiledChart:p,dataView:c,saveAsImage:u,cross:y,circle:g,rectangle:b,triangle:f,diamond:k,arrow:x,star:_,heart:L,droplet:W,pin:X,image:v},brush:function(t,i,n){var a=i?this.highlightStyle:this.style;a=a||{};var o=a.iconType||this.style.iconType;if("image"===o){var r=e("zrender/shape/Image");r.prototype.brush.call(this,t,i,n)}else{var a=this.beforeBrush(t,i);switch(t.beginPath(),this.buildPath(t,a,n),a.brushType){case"both":t.fill();case"stroke":a.lineWidth>0&&t.stroke();break;default:t.fill()}this.drawText(t,a,this.style),this.afterBrush(t)}},buildPath:function(e,t,i){this.iconLibrary[t.iconType]?this.iconLibrary[t.iconType].call(this,e,t,i):(e.moveTo(t.x,t.y),e.lineTo(t.x+t.width,t.y),e.lineTo(t.x+t.width,t.y+t.height),e.lineTo(t.x,t.y+t.height),e.lineTo(t.x,t.y),e.closePath())},getRect:function(e){return e.__rect?e.__rect:(e.__rect={x:Math.round(e.x),y:Math.round(e.y-("pin"==e.iconType?e.height/2*1.5:0)),width:e.width,height:e.height*("pin"===e.iconType?1.25:1)},e.__rect)},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);e=i[0],t=i[1];var n=this.style.__rect;n||(n=this.style.__rect=this.getRect(this.style));var a=n.height<8||n.width<8?4:0;return e>=n.x-a&&e<=n.x+n.width+a&&t>=n.y-a&&t<=n.y+n.height+a}},K.inherits(w,I),w}),i("echarts/util/shape/MarkLine",["require","zrender/shape/Base","./Icon","zrender/shape/Line","zrender/shape/BezierCurve","zrender/tool/area","zrender/shape/util/dashedLineTo","zrender/tool/util","zrender/tool/curve"],function(e){function t(e){i.call(this,e),this.style.curveness>0&&this.updatePoints(this.style),this.highlightStyle.curveness>0&&this.updatePoints(this.highlightStyle)}var i=e("zrender/shape/Base"),n=e("./Icon"),a=e("zrender/shape/Line"),o=new a({}),r=e("zrender/shape/BezierCurve"),s=new r({}),l=e("zrender/tool/area"),h=e("zrender/shape/util/dashedLineTo"),m=e("zrender/tool/util"),V=e("zrender/tool/curve");return t.prototype={type:"mark-line",brush:function(e,t){var i=this.style;t&&(i=this.getHighlightStyle(i,this.highlightStyle||{})),e.save(),this.setContext(e,i),this.setTransform(e),e.save(),e.beginPath(),this.buildPath(e,i),e.stroke(),e.restore(),this.brushSymbol(e,i,0),this.brushSymbol(e,i,1),this.drawText(e,i,this.style),e.restore()},buildPath:function(e,t){var i=t.lineType||"solid";if(e.moveTo(t.xStart,t.yStart),t.curveness>0){var n=null;switch(i){case"dashed":n=[5,5];break;case"dotted":n=[1,1]}n&&e.setLineDash&&e.setLineDash(n),e.quadraticCurveTo(t.cpX1,t.cpY1,t.xEnd,t.yEnd)}else if("solid"==i)e.lineTo(t.xEnd,t.yEnd);else{var a=(t.lineWidth||1)*("dashed"==t.lineType?5:1);h(e,t.xStart,t.yStart,t.xEnd,t.yEnd,a)}},updatePoints:function(e){var t=e.curveness||0,i=1,n=e.xStart,a=e.yStart,o=e.xEnd,r=e.yEnd,s=(n+o)/2-i*(a-r)*t,l=(a+r)/2-i*(o-n)*t;e.cpX1=s,e.cpY1=l},brushSymbol:function(e,t,i){if("none"!=t.symbol[i]){e.save(),e.beginPath(),e.lineWidth=t.symbolBorder,e.strokeStyle=t.symbolBorderColor;var a=t.symbol[i].replace("empty","").toLowerCase();t.symbol[i].match("empty")&&(e.fillStyle="#fff");var o=t.xStart,r=t.yStart,s=t.xEnd,l=t.yEnd,h=0===i?o:s,m=0===i?r:l,U=t.curveness||0,d=null!=t.symbolRotate[i]?t.symbolRotate[i]-0:0;if(d=d/180*Math.PI,"arrow"==a&&0===d)if(0===U){var p=0===i?-1:1;d=Math.PI/2+Math.atan2(p*(l-r),p*(s-o))}else{var c=t.cpX1,u=t.cpY1,y=V.quadraticDerivativeAt,g=y(o,c,s,i),b=y(r,u,l,i);d=Math.PI/2+Math.atan2(b,g)}e.translate(h,m),0!==d&&e.rotate(d);var f=t.symbolSize[i];n.prototype.buildPath(e,{x:-f,y:-f,width:2*f,height:2*f,iconType:a}),e.closePath(),e.fill(),e.stroke(),e.restore()}},getRect:function(e){return e.curveness>0?s.getRect(e):o.getRect(e),e.__rect},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);return e=i[0],t=i[1],this.isCoverRect(e,t)?this.style.curveness>0?l.isInside(s,this.style,e,t):l.isInside(o,this.style,e,t):!1}},m.inherits(t,i),t}),i("echarts/util/shape/Symbol",["require","zrender/shape/Base","zrender/shape/Polygon","zrender/tool/util","./normalIsCover"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/shape/Polygon"),a=new n({}),o=e("zrender/tool/util");return t.prototype={type:"symbol",buildPath:function(e,t){var i=t.pointList,n=i.length;if(0!==n)for(var a,o,r,s,l,h=1e4,m=Math.ceil(n/h),V=i[0]instanceof Array,U=t.size?t.size:2,d=U,p=U/2,c=2*Math.PI,u=0;m>u;u++){e.beginPath(),a=u*h,o=a+h,o=o>n?n:o;for(var y=a;o>y;y++)if(t.random&&(r=t["randomMap"+y%20]/100,d=U*r*r,p=d/2),V?(s=i[y][0],l=i[y][1]):(s=i[y].x,l=i[y].y),3>d)e.rect(s-p,l-p,d,d);else switch(t.iconType){case"circle":e.moveTo(s,l),e.arc(s,l,p,0,c,!0);break;case"diamond":e.moveTo(s,l-p),e.lineTo(s+p/3,l-p/3),e.lineTo(s+p,l),e.lineTo(s+p/3,l+p/3),e.lineTo(s,l+p),e.lineTo(s-p/3,l+p/3),e.lineTo(s-p,l),e.lineTo(s-p/3,l-p/3),e.lineTo(s,l-p);break;default:e.rect(s-p,l-p,d,d)}if(e.closePath(),m-1>u)switch(t.brushType){case"both":e.fill(),t.lineWidth>0&&e.stroke();break;case"stroke":t.lineWidth>0&&e.stroke();break;default:e.fill()}}},getRect:function(e){return e.__rect||a.getRect(e)},isCover:e("./normalIsCover")},o.inherits(t,i),t}),i("zrender/shape/Polyline",["require","./Base","./util/smoothSpline","./util/smoothBezier","./util/dashedLineTo","./Polygon","../tool/util"],function(e){var t=e("./Base"),i=e("./util/smoothSpline"),n=e("./util/smoothBezier"),a=e("./util/dashedLineTo"),o=function(e){this.brushTypeOnly="stroke",this.textPosition="end",t.call(this,e)};return o.prototype={type:"polyline",buildPath:function(e,t){var n=t.pointList;if(!(n.length<2)){var o=Math.min(t.pointList.length,Math.round(t.pointListLength||t.pointList.length));if(t.smooth&&"spline"!==t.smooth){t.controlPointList||this.updateControlPoints(t);var r=t.controlPointList;e.moveTo(n[0][0],n[0][1]);for(var s,l,h,m=0;o-1>m;m++)s=r[2*m],l=r[2*m+1],h=n[m+1],e.bezierCurveTo(s[0],s[1],l[0],l[1],h[0],h[1])}else if("spline"===t.smooth&&(n=i(n),o=n.length),t.lineType&&"solid"!=t.lineType){if("dashed"==t.lineType||"dotted"==t.lineType){var V=(t.lineWidth||1)*("dashed"==t.lineType?5:1);e.moveTo(n[0][0],n[0][1]);for(var m=1;o>m;m++)a(e,n[m-1][0],n[m-1][1],n[m][0],n[m][1],V)}}else{e.moveTo(n[0][0],n[0][1]);for(var m=1;o>m;m++)e.lineTo(n[m][0],n[m][1])}}},updateControlPoints:function(e){e.controlPointList=n(e.pointList,e.smooth,!1,e.smoothConstraint)},getRect:function(t){return e("./Polygon").prototype.getRect(t)}},e("../tool/util").inherits(o,t),o}),i("zrender/shape/ShapeBundle",["require","./Base","../tool/util"],function(e){var t=e("./Base"),i=function(e){t.call(this,e)};return i.prototype={constructor:i,type:"shape-bundle",brush:function(e,t){var i=this.beforeBrush(e,t);e.beginPath();for(var n=0;n<i.shapeList.length;n++){var a=i.shapeList[n],o=a.style;t&&(o=a.getHighlightStyle(o,a.highlightStyle||{},a.brushTypeOnly)),a.buildPath(e,o)}switch(i.brushType){case"both":e.fill();case"stroke":i.lineWidth>0&&e.stroke();break;default:e.fill()}this.drawText(e,i,this.style),this.afterBrush(e)},getRect:function(e){if(e.__rect)return e.__rect;for(var t=1/0,i=-(1/0),n=1/0,a=-(1/0),o=0;o<e.shapeList.length;o++)var r=e.shapeList[o],s=r.getRect(r.style),t=Math.min(s.x,t),n=Math.min(s.y,n),i=Math.max(s.x+s.width,i),a=Math.max(s.y+s.height,a);return e.__rect={x:t,y:n,width:i-t,height:a-n},e.__rect},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);if(e=i[0],t=i[1],this.isCoverRect(e,t))for(var n=0;n<this.style.shapeList.length;n++){var a=this.style.shapeList[n];if(a.isCover(e,t))return!0}return!1}},e("../tool/util").inherits(i,t),i}),i("echarts/util/ecAnimation",["require","zrender/tool/util","zrender/tool/curve","zrender/shape/Polygon"],function(e){function t(e,t,i,n,a){var o,r=i.style.pointList,s=r.length;if(!t){if(o=[],"vertical"!=i._orient)for(var l=r[0][1],h=0;s>h;h++)o[h]=[r[h][0],l];else for(var m=r[0][0],h=0;s>h;h++)o[h]=[m,r[h][1]];"half-smooth-polygon"==i.type&&(o[s-1]=p.clone(r[s-1]),o[s-2]=p.clone(r[s-2])),t={style:{pointList:o}}}o=t.style.pointList;var V=o.length;i.style.pointList=V==s?o:s>V?o.concat(r.slice(V)):o.slice(0,s),e.addShape(i),i.__animating=!0,e.animate(i.id,"style").when(n,{pointList:r}).during(function(){i.updateControlPoints&&i.updateControlPoints(i.style)}).done(function(){i.__animating=!1}).start(a)}function i(e,t){for(var i=arguments.length,n=2;i>n;n++){var a=arguments[n];e.style[a]=t.style[a]}}function n(e,t,n,a,o){var r=n.style;t||(t={position:n.position,style:{x:r.x,y:"vertical"==n._orient?r.y+r.height:r.y,width:"vertical"==n._orient?r.width:0,height:"vertical"!=n._orient?r.height:0}});var s=r.x,l=r.y,h=r.width,m=r.height,V=[n.position[0],n.position[1]];i(n,t,"x","y","width","height"),n.position=t.position,e.addShape(n),(V[0]!=t.position[0]||V[1]!=t.position[1])&&e.animate(n.id,"").when(a,{position:V}).start(o),n.__animating=!0,e.animate(n.id,"style").when(a,{x:s,y:l,width:h,height:m}).done(function(){n.__animating=!1}).start(o)}function a(e,t,i,n,a){if(!t){var o=i.style.y;t={style:{y:[o[0],o[0],o[0],o[0]]}}}var r=i.style.y;i.style.y=t.style.y,e.addShape(i),i.__animating=!0,e.animate(i.id,"style").when(n,{y:r}).done(function(){i.__animating=!1}).start(a)}function o(e,t,i,n,a){var o=i.style.x,r=i.style.y,s=i.style.r0,l=i.style.r;i.__animating=!0,"r"!=i._animationAdd?(i.style.r0=0,i.style.r=0,i.rotation=[2*Math.PI,o,r],e.addShape(i),e.animate(i.id,"style").when(n,{r0:s,r:l}).done(function(){i.__animating=!1}).start(a),e.animate(i.id,"").when(n,{rotation:[0,o,r]}).start(a)):(i.style.r0=i.style.r,e.addShape(i),e.animate(i.id,"style").when(n,{r0:s}).done(function(){i.__animating=!1}).start(a))}function r(e,t,n,a,o){t||(t="r"!=n._animationAdd?{
-style:{startAngle:n.style.startAngle,endAngle:n.style.startAngle}}:{style:{r0:n.style.r}});var r=n.style.startAngle,s=n.style.endAngle;i(n,t,"startAngle","endAngle"),e.addShape(n),n.__animating=!0,e.animate(n.id,"style").when(a,{startAngle:r,endAngle:s}).done(function(){n.__animating=!1}).start(o)}function s(e,t,n,a,o){t||(t={style:{x:"left"==n.style.textAlign?n.style.x+100:n.style.x-100,y:n.style.y}});var r=n.style.x,s=n.style.y;i(n,t,"x","y"),e.addShape(n),n.__animating=!0,e.animate(n.id,"style").when(a,{x:r,y:s}).done(function(){n.__animating=!1}).start(o)}function l(t,i,n,a,o){var r=e("zrender/shape/Polygon").prototype.getRect(n.style),s=r.x+r.width/2,l=r.y+r.height/2;n.scale=[.1,.1,s,l],t.addShape(n),n.__animating=!0,t.animate(n.id,"").when(a,{scale:[1,1,s,l]}).done(function(){n.__animating=!1}).start(o)}function h(e,t,n,a,o){t||(t={style:{source0:0,source1:n.style.source1>0?360:-360,target0:0,target1:n.style.target1>0?360:-360}});var r=n.style.source0,s=n.style.source1,l=n.style.target0,h=n.style.target1;t.style&&i(n,t,"source0","source1","target0","target1"),e.addShape(n),n.__animating=!0,e.animate(n.id,"style").when(a,{source0:r,source1:s,target0:l,target1:h}).done(function(){n.__animating=!1}).start(o)}function m(e,t,i,n,a){t||(t={style:{angle:i.style.startAngle}});var o=i.style.angle;i.style.angle=t.style.angle,e.addShape(i),i.__animating=!0,e.animate(i.id,"style").when(n,{angle:o}).done(function(){i.__animating=!1}).start(a)}function V(e,t,i,a,o,r){if(i.style._x=i.style.x,i.style._y=i.style.y,i.style._width=i.style.width,i.style._height=i.style.height,t)n(e,t,i,a,o);else{var s=i._x||0,l=i._y||0;i.scale=[.01,.01,s,l],e.addShape(i),i.__animating=!0,e.animate(i.id,"").delay(r).when(a,{scale:[1,1,s,l]}).done(function(){i.__animating=!1}).start(o||"QuinticOut")}}function U(e,t,n,a,o){t||(t={style:{xStart:n.style.xStart,yStart:n.style.yStart,xEnd:n.style.xStart,yEnd:n.style.yStart}});var r=n.style.xStart,s=n.style.xEnd,l=n.style.yStart,h=n.style.yEnd;i(n,t,"xStart","xEnd","yStart","yEnd"),e.addShape(n),n.__animating=!0,e.animate(n.id,"style").when(a,{xStart:r,xEnd:s,yStart:l,yEnd:h}).done(function(){n.__animating=!1}).start(o)}function d(e,t,i,n,a){a=a||"QuinticOut",i.__animating=!0,e.addShape(i);var o=i.style,r=function(){i.__animating=!1},s=o.xStart,l=o.yStart,h=o.xEnd,m=o.yEnd;if(o.curveness>0){i.updatePoints(o);var V={p:0},U=o.cpX1,d=o.cpY1,p=[],u=[],y=c.quadraticSubdivide;e.animation.animate(V).when(n,{p:1}).during(function(){y(s,U,h,V.p,p),y(l,d,m,V.p,u),o.cpX1=p[1],o.cpY1=u[1],o.xEnd=p[2],o.yEnd=u[2],e.modShape(i)}).done(r).start(a)}else e.animate(i.id,"style").when(0,{xEnd:s,yEnd:l}).when(n,{xEnd:h,yEnd:m}).done(r).start(a)}var p=e("zrender/tool/util"),c=e("zrender/tool/curve");return{pointList:t,rectangle:n,candle:a,ring:o,sector:r,text:s,polygon:l,ribbon:h,gaugePointer:m,icon:V,line:U,markline:d}}),i("echarts/util/ecEffect",["require","../util/ecData","zrender/shape/Circle","zrender/shape/Image","zrender/tool/curve","../util/shape/Icon","../util/shape/Symbol","zrender/shape/ShapeBundle","zrender/shape/Polyline","zrender/tool/vector","zrender/tool/env"],function(e){function t(e,t,i,n){var a,r=i.effect,l=r.color||i.style.strokeColor||i.style.color,m=r.shadowColor||l,V=r.scaleSize,U=r.bounceDistance,d="undefined"!=typeof r.shadowBlur?r.shadowBlur:V;"image"!==i.type?(a=new h({zlevel:n,style:{brushType:"stroke",iconType:"droplet"!=i.style.iconType?i.style.iconType:"circle",x:d+1,y:d+1,n:i.style.n,width:i.style._width*V,height:i.style._height*V,lineWidth:1,strokeColor:l,shadowColor:m,shadowBlur:d},draggable:!1,hoverable:!1}),"pin"==i.style.iconType&&(a.style.y+=a.style.height/2*1.5),p&&(a.style.image=e.shapeToImage(a,a.style.width+2*d+2,a.style.height+2*d+2).style.image,a=new s({zlevel:a.zlevel,style:a.style,draggable:!1,hoverable:!1}))):a=new s({zlevel:n,style:i.style,draggable:!1,hoverable:!1}),o.clone(i,a),a.position=i.position,t.push(a),e.addShape(a);var c="image"!==i.type?window.devicePixelRatio||1:1,u=(a.style.width/c-i.style._width)/2;a.style.x=i.style._x-u,a.style.y=i.style._y-u,"pin"==i.style.iconType&&(a.style.y-=i.style.height/2*1.5);var y=100*(r.period+10*Math.random());e.modShape(i.id,{invisible:!0});var g=a.style.x+a.style.width/2/c,b=a.style.y+a.style.height/2/c;"scale"===r.type?(e.modShape(a.id,{scale:[.1,.1,g,b]}),e.animate(a.id,"",r.loop).when(y,{scale:[1,1,g,b]}).done(function(){i.effect.show=!1,e.delShape(a.id)}).start()):e.animate(a.id,"style",r.loop).when(y,{y:a.style.y-U}).when(2*y,{y:a.style.y}).done(function(){i.effect.show=!1,e.delShape(a.id)}).start()}function i(e,t,i,n){var a=i.effect,o=a.color||i.style.strokeColor||i.style.color,r=a.scaleSize,s=a.shadowColor||o,l="undefined"!=typeof a.shadowBlur?a.shadowBlur:2*r,h=window.devicePixelRatio||1,V=new m({zlevel:n,position:i.position,scale:i.scale,style:{pointList:i.style.pointList,iconType:i.style.iconType,color:o,strokeColor:o,shadowColor:s,shadowBlur:l*h,random:!0,brushType:"fill",lineWidth:1,size:i.style.size},draggable:!1,hoverable:!1});t.push(V),e.addShape(V),e.modShape(i.id,{invisible:!0});for(var U=Math.round(100*a.period),d={},p={},c=0;20>c;c++)V.style["randomMap"+c]=0,d={},d["randomMap"+c]=100,p={},p["randomMap"+c]=0,V.style["randomMap"+c]=100*Math.random(),e.animate(V.id,"style",!0).when(U,d).when(2*U,p).when(3*U,d).when(4*U,d).delay(Math.random()*U*c).start()}function n(e,t,i,n,a){var s=i.effect,h=i.style,m=s.color||h.strokeColor||h.color,V=s.shadowColor||h.strokeColor||m,c=h.lineWidth*s.scaleSize,u="undefined"!=typeof s.shadowBlur?s.shadowBlur:c,y=new r({zlevel:n,style:{x:u,y:u,r:c,color:m,shadowColor:V,shadowBlur:u},hoverable:!1}),g=0;if(p&&!a){var n=y.zlevel;y=e.shapeToImage(y,2*(c+u),2*(c+u)),y.zlevel=n,y.hoverable=!1,g=u}a||(o.clone(i,y),y.position=i.position,t.push(y),e.addShape(y));var b=function(){a||(i.effect.show=!1,e.delShape(y.id)),y.effectAnimator=null};if(i instanceof U){for(var f=[0],k=0,x=h.pointList,_=h.controlPointList,L=1;L<x.length;L++){if(_){var W=_[2*(L-1)],X=_[2*(L-1)+1];k+=d.dist(x[L-1],W)+d.dist(W,X)+d.dist(X,x[L])}else k+=d.dist(x[L-1],x[L]);f.push(k)}for(var v={p:0},w=e.animation.animate(v,{loop:s.loop}),L=0;L<f.length;L++)w.when(f[L]*s.period,{p:L});w.during(function(){var t,i,n=Math.floor(v.p);if(n==x.length-1)t=x[n][0],i=x[n][1];else{var o=v.p-n,r=x[n],s=x[n+1];if(_){var h=_[2*n],m=_[2*n+1];t=l.cubicAt(r[0],h[0],m[0],s[0],o),i=l.cubicAt(r[1],h[1],m[1],s[1],o)}else t=(s[0]-r[0])*o+r[0],i=(s[1]-r[1])*o+r[1]}y.style.x=t,y.style.y=i,a||e.modShape(y)}).done(b).start(),w.duration=k*s.period,y.effectAnimator=w}else{var K=h.xStart-g,I=h.yStart-g,J=h.xEnd-g,C=h.yEnd-g;y.style.x=K,y.style.y=I;var S=(J-K)*(J-K)+(C-I)*(C-I),E=Math.round(Math.sqrt(Math.round(S*s.period*s.period)));if(i.style.curveness>0){var F=h.cpX1-g,T=h.cpY1-g;y.effectAnimator=e.animation.animate(y,{loop:s.loop}).when(E,{p:1}).during(function(t,i){y.style.x=l.quadraticAt(K,F,J,i),y.style.y=l.quadraticAt(I,T,C,i),a||e.modShape(y)}).done(b).start()}else y.effectAnimator=e.animation.animate(y.style,{loop:s.loop}).when(E,{x:J,y:C}).during(function(){a||e.modShape(y)}).done(b).start();y.effectAnimator.duration=E}return y}function a(e,t,i,a){var o=new V({style:{shapeList:[]},zlevel:a,hoverable:!1}),r=i.style.shapeList,s=i.effect;o.position=i.position;for(var l=0,h=[],m=0;m<r.length;m++){r[m].effect=s;var U=n(e,null,r[m],a,!0),d=U.effectAnimator;o.style.shapeList.push(U),d.duration>l&&(l=d.duration),0===m&&(o.style.color=U.style.color,o.style.shadowBlur=U.style.shadowBlur,o.style.shadowColor=U.style.shadowColor),h.push(d)}t.push(o),e.addShape(o);var p=function(){for(var e=0;e<h.length;e++)h[e].stop()};if(l){o.__dummy=0;var c=e.animate(o.id,"",s.loop).when(l,{__dummy:1}).during(function(){e.modShape(o)}).done(function(){i.effect.show=!1,e.delShape(o.id)}).start(),u=c.stop;c.stop=function(){p(),u.call(this)}}}var o=e("../util/ecData"),r=e("zrender/shape/Circle"),s=e("zrender/shape/Image"),l=e("zrender/tool/curve"),h=e("../util/shape/Icon"),m=e("../util/shape/Symbol"),V=e("zrender/shape/ShapeBundle"),U=e("zrender/shape/Polyline"),d=e("zrender/tool/vector"),p=e("zrender/tool/env").canvasSupported;return{point:t,largePoint:i,line:n,largeLine:a}}),i("echarts/component/base",["require","../config","../util/ecData","../util/ecQuery","../util/number","zrender/tool/util","zrender/tool/env"],function(e){function t(e,t,a,o,r){this.ecTheme=e,this.messageCenter=t,this.zr=a,this.option=o,this.series=o.series,this.myChart=r,this.component=r.component,this.shapeList=[],this.effectList=[];var s=this;s._onlegendhoverlink=function(e){if(s.legendHoverLink)for(var t,a=e.target,o=s.shapeList.length-1;o>=0;o--)t=s.type==i.CHART_TYPE_PIE||s.type==i.CHART_TYPE_FUNNEL?n.get(s.shapeList[o],"name"):(n.get(s.shapeList[o],"series")||{}).name,t!=a||s.shapeList[o].invisible||s.shapeList[o].__animating||s.zr.addHoverShape(s.shapeList[o])},t&&t.bind(i.EVENT.LEGEND_HOVERLINK,this._onlegendhoverlink)}var i=e("../config"),n=e("../util/ecData"),a=e("../util/ecQuery"),o=e("../util/number"),r=e("zrender/tool/util");return t.prototype={canvasSupported:e("zrender/tool/env").canvasSupported,_getZ:function(e){if(null!=this[e])return this[e];var t=this.ecTheme[this.type];return t&&null!=t[e]?t[e]:(t=i[this.type],t&&null!=t[e]?t[e]:0)},getZlevelBase:function(){return this._getZ("zlevel")},getZBase:function(){return this._getZ("z")},reformOption:function(e){return e=r.merge(r.merge(e||{},r.clone(this.ecTheme[this.type]||{})),r.clone(i[this.type]||{})),this.z=e.z,this.zlevel=e.zlevel,e},reformCssArray:function(e){if(!(e instanceof Array))return[e,e,e,e];switch(e.length+""){case"4":return e;case"3":return[e[0],e[1],e[2],e[1]];case"2":return[e[0],e[1],e[0],e[1]];case"1":return[e[0],e[0],e[0],e[0]];case"0":return[0,0,0,0]}},getShapeById:function(e){for(var t=0,i=this.shapeList.length;i>t;t++)if(this.shapeList[t].id===e)return this.shapeList[t];return null},getFont:function(e){var t=this.getTextStyle(r.clone(e));return t.fontStyle+" "+t.fontWeight+" "+t.fontSize+"px "+t.fontFamily},getTextStyle:function(e){return r.merge(r.merge(e||{},this.ecTheme.textStyle),i.textStyle)},getItemStyleColor:function(e,t,i,n){return"function"==typeof e?e.call(this.myChart,{seriesIndex:t,series:this.series[t],dataIndex:i,data:n}):e},getDataFromOption:function(e,t){return null!=e?null!=e.value?e.value:e:t},subPixelOptimize:function(e,t){return e=t%2===1?Math.floor(e)+.5:Math.round(e)},resize:function(){this.refresh&&this.refresh(),this.clearEffectShape&&this.clearEffectShape(!0);var e=this;setTimeout(function(){e.animationEffect&&e.animationEffect()},200)},clear:function(){this.clearEffectShape&&this.clearEffectShape(),this.zr&&this.zr.delShape(this.shapeList),this.shapeList=[]},dispose:function(){this.onbeforDispose&&this.onbeforDispose(),this.clear(),this.shapeList=null,this.effectList=null,this.messageCenter&&this.messageCenter.unbind(i.EVENT.LEGEND_HOVERLINK,this._onlegendhoverlink),this.onafterDispose&&this.onafterDispose()},query:a.query,deepQuery:a.deepQuery,deepMerge:a.deepMerge,parsePercent:o.parsePercent,parseCenter:o.parseCenter,parseRadius:o.parseRadius,numAddCommas:o.addCommas,getPrecision:o.getPrecision},t}),i("echarts/layout/EdgeBundling",["require","../data/KDTree","zrender/tool/vector"],function(e){function t(e,t){e=e.array,t=t.array;var i=t[0]-e[0],n=t[1]-e[1],a=t[2]-e[2],o=t[3]-e[3];return i*i+n*n+a*a+o*o}function i(e){this.points=[e.mp0,e.mp1],this.group=e}function n(e){var t=e.points;t[0][1]<t[1][1]||e instanceof i?(this.array=[t[0][0],t[0][1],t[1][0],t[1][1]],this._startPoint=t[0],this._endPoint=t[1]):(this.array=[t[1][0],t[1][1],t[0][0],t[0][1]],this._startPoint=t[1],this._endPoint=t[0]),this.ink=m(t[0],t[1]),this.edge=e,this.group=null}function a(){this.edgeList=[],this.mp0=l(),this.mp1=l(),this.ink=0}function o(){this.maxNearestEdge=6,this.maxTurningAngle=Math.PI/4,this.maxIteration=20}var r=e("../data/KDTree"),s=e("zrender/tool/vector"),l=s.create,h=s.distSquare,m=s.dist,V=s.copy,U=s.clone;return n.prototype.getStartPoint=function(){return this._startPoint},n.prototype.getEndPoint=function(){return this._endPoint},a.prototype.addEdge=function(e){e.group=this,this.edgeList.push(e)},a.prototype.removeEdge=function(e){e.group=null,this.edgeList.splice(this.edgeList.indexOf(e),1)},o.prototype={constructor:o,run:function(e){function t(e,t){return h(e,t)<1e-10}function n(e,i){for(var n=[],a=0,o=0;o<e.length;o++)a>0&&t(e[o],n[a-1])||(n[a++]=U(e[o]));return i[0]&&!t(n[0],i[0])&&(n=n.reverse()),n}for(var a=this._iterate(e),o=0;o++<this.maxIteration;){for(var r=[],s=0;s<a.groups.length;s++)r.push(new i(a.groups[s]));var l=this._iterate(r);if(l.savedInk<=0)break;a=l}var m=[],V=function(e,t){for(var a,o=0;o<e.length;o++){var r=e[o];if(r.edgeList[0]&&r.edgeList[0].edge instanceof i){for(var s=[],l=0;l<r.edgeList.length;l++)s.push(r.edgeList[l].edge.group);a=t?t.slice():[],a.unshift(r.mp0),a.push(r.mp1),V(s,a)}else for(var l=0;l<r.edgeList.length;l++){var h=r.edgeList[l];a=t?t.slice():[],a.unshift(r.mp0),a.push(r.mp1),a.unshift(h.getStartPoint()),a.push(h.getEndPoint()),m.push({points:n(a,h.edge.points),rawEdge:h.edge})}}};return V(a.groups),m},_iterate:function(e){for(var i=[],o=[],s=0,h=0;h<e.length;h++){var m=new n(e[h]);i.push(m)}for(var U=new r(i,4),d=[],p=l(),c=l(),u=0,y=l(),g=l(),b=0,h=0;h<i.length;h++){var m=i[h];if(!m.group){U.nearestN(m,this.maxNearestEdge,t,d);for(var f=0,k=null,x=null,_=0;_<d.length;_++){var L=d[_],W=0;L.group?L.group!==x&&(x=L.group,u=this._calculateGroupEdgeInk(L.group,m,p,c),W=L.group.ink+m.ink-u):(u=this._calculateEdgeEdgeInk(m,L,p,c),W=L.ink+m.ink-u),W>f&&(f=W,k=L,V(g,c),V(y,p),b=u)}if(k){s+=f;var X;k.group||(X=new a,o.push(X),X.addEdge(k)),X=k.group,V(X.mp0,y),V(X.mp1,g),X.ink=b,k.group.addEdge(m)}else{var X=new a;o.push(X),V(X.mp0,m.getStartPoint()),V(X.mp1,m.getEndPoint()),X.ink=m.ink,X.addEdge(m)}}}return{groups:o,edges:i,savedInk:s}},_calculateEdgeEdgeInk:function(){var e=[],t=[];return function(i,n,a,o){e[0]=i.getStartPoint(),e[1]=n.getStartPoint(),t[0]=i.getEndPoint(),t[1]=n.getEndPoint(),this._calculateMeetPoints(e,t,a,o);var r=m(e[0],a)+m(a,o)+m(o,t[0])+m(e[1],a)+m(o,t[1]);return r}}(),_calculateGroupEdgeInk:function(e,t,i,n){for(var a=[],o=[],r=0;r<e.edgeList.length;r++){var s=e.edgeList[r];a.push(s.getStartPoint()),o.push(s.getEndPoint())}a.push(t.getStartPoint()),o.push(t.getEndPoint()),this._calculateMeetPoints(a,o,i,n);for(var l=m(i,n),r=0;r<a.length;r++)l+=m(a[r],i)+m(o[r],n);return l},_calculateMeetPoints:function(){var e=l(),t=l();return function(i,n,a,o){s.set(e,0,0),s.set(t,0,0);for(var r=i.length,l=0;r>l;l++)s.add(e,e,i[l]);s.scale(e,e,1/r),r=n.length;for(var l=0;r>l;l++)s.add(t,t,n[l]);s.scale(t,t,1/r),this._limitTurningAngle(i,e,t,a),this._limitTurningAngle(n,t,e,o)}}(),_limitTurningAngle:function(){var e=l(),t=l(),i=l(),n=l();return function(a,o,r,l){var V=Math.cos(this.maxTurningAngle),U=Math.tan(this.maxTurningAngle);s.sub(e,o,r),s.normalize(e,e),s.copy(l,o);for(var d=0,p=0;p<a.length;p++){var c=a[p];s.sub(t,c,o);var u=s.len(t);s.scale(t,t,1/u);var y=s.dot(t,e);if(V>y){s.scaleAndAdd(i,o,e,u*y);var g=m(i,c),b=g/U;s.scaleAndAdd(n,i,e,-b);var f=h(n,o);f>d&&(d=f,s.copy(l,n))}}}}()},o}),i("zrender/shape/Star",["require","../tool/math","./Base","../tool/util"],function(e){var t=e("../tool/math"),i=t.sin,n=t.cos,a=Math.PI,o=e("./Base"),r=function(e){o.call(this,e)};return r.prototype={type:"star",buildPath:function(e,t){var o=t.n;if(o&&!(2>o)){var r=t.x,s=t.y,l=t.r,h=t.r0;null==h&&(h=o>4?l*n(2*a/o)/n(a/o):l/3);var m=a/o,V=-a/2,U=r+l*n(V),d=s+l*i(V);V+=m;var p=t.pointList=[];p.push([U,d]);for(var c,u=0,y=2*o-1;y>u;u++)c=u%2===0?h:l,p.push([r+c*n(V),s+c*i(V)]),V+=m;p.push([U,d]),e.moveTo(p[0][0],p[0][1]);for(var u=0;u<p.length;u++)e.lineTo(p[u][0],p[u][1]);e.closePath()}},getRect:function(e){if(e.__rect)return e.__rect;var t;return t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-e.r-t/2),y:Math.round(e.y-e.r-t/2),width:2*e.r+t,height:2*e.r+t},e.__rect}},e("../tool/util").inherits(r,o),r}),i("zrender/shape/Heart",["require","./Base","./util/PathProxy","../tool/area","../tool/util"],function(e){"use strict";var t=e("./Base"),i=e("./util/PathProxy"),n=e("../tool/area"),a=function(e){t.call(this,e),this._pathProxy=new i};return a.prototype={type:"heart",buildPath:function(e,t){var n=this._pathProxy||new i;n.begin(e),n.moveTo(t.x,t.y),n.bezierCurveTo(t.x+t.a/2,t.y-2*t.b/3,t.x+2*t.a,t.y+t.b/3,t.x,t.y+t.b),n.bezierCurveTo(t.x-2*t.a,t.y+t.b/3,t.x-t.a/2,t.y-2*t.b/3,t.x,t.y),n.closePath()},getRect:function(e){return e.__rect?e.__rect:(this._pathProxy.isEmpty()||this.buildPath(null,e),this._pathProxy.fastBoundingRect())},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);return e=i[0],t=i[1],this.isCoverRect(e,t)?n.isInsidePath(this._pathProxy.pathCommands,this.style.lineWidth,this.style.brushType,e,t):void 0}},e("../tool/util").inherits(a,t),a}),i("zrender/shape/Droplet",["require","./Base","./util/PathProxy","../tool/area","../tool/util"],function(e){"use strict";var t=e("./Base"),i=e("./util/PathProxy"),n=e("../tool/area"),a=function(e){t.call(this,e),this._pathProxy=new i};return a.prototype={type:"droplet",buildPath:function(e,t){var n=this._pathProxy||new i;n.begin(e),n.moveTo(t.x,t.y+t.a),n.bezierCurveTo(t.x+t.a,t.y+t.a,t.x+3*t.a/2,t.y-t.a/3,t.x,t.y-t.b),n.bezierCurveTo(t.x-3*t.a/2,t.y-t.a/3,t.x-t.a,t.y+t.a,t.x,t.y+t.a),n.closePath()},getRect:function(e){return e.__rect?e.__rect:(this._pathProxy.isEmpty()||this.buildPath(null,e),this._pathProxy.fastBoundingRect())},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);return e=i[0],t=i[1],this.isCoverRect(e,t)?n.isInsidePath(this._pathProxy.pathCommands,this.style.lineWidth,this.style.brushType,e,t):void 0}},e("../tool/util").inherits(a,t),a}),i("zrender/tool/math",[],function(){function e(e,t){return Math.sin(t?e*a:e)}function t(e,t){return Math.cos(t?e*a:e)}function i(e){return e*a}function n(e){return e/a}var a=Math.PI/180;return{sin:e,cos:t,degreeToRadian:i,radianToDegree:n}}),i("zrender/shape/util/PathProxy",["require","../../tool/vector"],function(e){var t=e("../../tool/vector"),i=function(e,t){this.command=e,this.points=t||null},n=function(){this.pathCommands=[],this._ctx=null,this._min=[],this._max=[]};return n.prototype.fastBoundingRect=function(){var e=this._min,i=this._max;e[0]=e[1]=1/0,i[0]=i[1]=-(1/0);for(var n=0;n<this.pathCommands.length;n++){var a=this.pathCommands[n],o=a.points;switch(a.command){case"M":t.min(e,e,o),t.max(i,i,o);break;case"L":t.min(e,e,o),t.max(i,i,o);break;case"C":for(var r=0;6>r;r+=2)e[0]=Math.min(e[0],e[0],o[r]),e[1]=Math.min(e[1],e[1],o[r+1]),i[0]=Math.max(i[0],i[0],o[r]),i[1]=Math.max(i[1],i[1],o[r+1]);break;case"Q":for(var r=0;4>r;r+=2)e[0]=Math.min(e[0],e[0],o[r]),e[1]=Math.min(e[1],e[1],o[r+1]),i[0]=Math.max(i[0],i[0],o[r]),i[1]=Math.max(i[1],i[1],o[r+1]);break;case"A":var s=o[0],l=o[1],h=o[2],m=o[3];e[0]=Math.min(e[0],e[0],s-h),e[1]=Math.min(e[1],e[1],l-m),i[0]=Math.max(i[0],i[0],s+h),i[1]=Math.max(i[1],i[1],l+m)}}return{x:e[0],y:e[1],width:i[0]-e[0],height:i[1]-e[1]}},n.prototype.begin=function(e){return this._ctx=e||null,this.pathCommands.length=0,this},n.prototype.moveTo=function(e,t){return this.pathCommands.push(new i("M",[e,t])),this._ctx&&this._ctx.moveTo(e,t),this},n.prototype.lineTo=function(e,t){return this.pathCommands.push(new i("L",[e,t])),this._ctx&&this._ctx.lineTo(e,t),this},n.prototype.bezierCurveTo=function(e,t,n,a,o,r){return this.pathCommands.push(new i("C",[e,t,n,a,o,r])),this._ctx&&this._ctx.bezierCurveTo(e,t,n,a,o,r),this},n.prototype.quadraticCurveTo=function(e,t,n,a){return this.pathCommands.push(new i("Q",[e,t,n,a])),this._ctx&&this._ctx.quadraticCurveTo(e,t,n,a),this},n.prototype.arc=function(e,t,n,a,o,r){return this.pathCommands.push(new i("A",[e,t,n,n,a,o-a,0,r?0:1])),this._ctx&&this._ctx.arc(e,t,n,a,o,r),this},n.prototype.arcTo=function(e,t,i,n,a){return this._ctx&&this._ctx.arcTo(e,t,i,n,a),this},n.prototype.rect=function(e,t,i,n){return this._ctx&&this._ctx.rect(e,t,i,n),this},n.prototype.closePath=function(){return this.pathCommands.push(new i("z")),this._ctx&&this._ctx.closePath(),this},n.prototype.isEmpty=function(){return 0===this.pathCommands.length},n.PathSegment=i,n}),i("zrender/shape/Line",["require","./Base","./util/dashedLineTo","../tool/util"],function(e){var t=e("./Base"),i=e("./util/dashedLineTo"),n=function(e){this.brushTypeOnly="stroke",this.textPosition="end",t.call(this,e)};return n.prototype={type:"line",buildPath:function(e,t){if(t.lineType&&"solid"!=t.lineType){if("dashed"==t.lineType||"dotted"==t.lineType){var n=(t.lineWidth||1)*("dashed"==t.lineType?5:1);i(e,t.xStart,t.yStart,t.xEnd,t.yEnd,n)}}else e.moveTo(t.xStart,t.yStart),e.lineTo(t.xEnd,t.yEnd)},getRect:function(e){if(e.__rect)return e.__rect;var t=e.lineWidth||1;return e.__rect={x:Math.min(e.xStart,e.xEnd)-t,y:Math.min(e.yStart,e.yEnd)-t,width:Math.abs(e.xStart-e.xEnd)+t,height:Math.abs(e.yStart-e.yEnd)+t},e.__rect}},e("../tool/util").inherits(n,t),n}),i("zrender/shape/BezierCurve",["require","./Base","../tool/util"],function(e){"use strict";var t=e("./Base"),i=function(e){this.brushTypeOnly="stroke",this.textPosition="end",t.call(this,e)};return i.prototype={type:"bezier-curve",buildPath:function(e,t){e.moveTo(t.xStart,t.yStart),"undefined"!=typeof t.cpX2&&"undefined"!=typeof t.cpY2?e.bezierCurveTo(t.cpX1,t.cpY1,t.cpX2,t.cpY2,t.xEnd,t.yEnd):e.quadraticCurveTo(t.cpX1,t.cpY1,t.xEnd,t.yEnd)},getRect:function(e){if(e.__rect)return e.__rect;var t=Math.min(e.xStart,e.xEnd,e.cpX1),i=Math.min(e.yStart,e.yEnd,e.cpY1),n=Math.max(e.xStart,e.xEnd,e.cpX1),a=Math.max(e.yStart,e.yEnd,e.cpY1),o=e.cpX2,r=e.cpY2;"undefined"!=typeof o&&"undefined"!=typeof r&&(t=Math.min(t,o),i=Math.min(i,r),n=Math.max(n,o),a=Math.max(a,r));var s=e.lineWidth||1;return e.__rect={x:t-s,y:i-s,width:n-t+s,height:a-i+s},e.__rect}},e("../tool/util").inherits(i,t),i}),i("zrender/shape/util/dashedLineTo",[],function(){var e=[5,5];return function(t,i,n,a,o,r){if(t.setLineDash)return e[0]=e[1]=r,t.setLineDash(e),t.moveTo(i,n),void t.lineTo(a,o);r="number"!=typeof r?5:r;var s=a-i,l=o-n,h=Math.floor(Math.sqrt(s*s+l*l)/r);s/=h,l/=h;for(var m=!0,V=0;h>V;++V)m?t.moveTo(i,n):t.lineTo(i,n),m=!m,i+=s,n+=l;t.lineTo(a,o)}}),i("zrender/shape/Polygon",["require","./Base","./util/smoothSpline","./util/smoothBezier","./util/dashedLineTo","../tool/util"],function(e){var t=e("./Base"),i=e("./util/smoothSpline"),n=e("./util/smoothBezier"),a=e("./util/dashedLineTo"),o=function(e){t.call(this,e)};return o.prototype={type:"polygon",buildPath:function(e,t){var o=t.pointList;if(!(o.length<2)){if(t.smooth&&"spline"!==t.smooth){var r=n(o,t.smooth,!0,t.smoothConstraint);e.moveTo(o[0][0],o[0][1]);for(var s,l,h,m=o.length,V=0;m>V;V++)s=r[2*V],l=r[2*V+1],h=o[(V+1)%m],e.bezierCurveTo(s[0],s[1],l[0],l[1],h[0],h[1])}else if("spline"===t.smooth&&(o=i(o,!0)),t.lineType&&"solid"!=t.lineType){if("dashed"==t.lineType||"dotted"==t.lineType){var U=t._dashLength||(t.lineWidth||1)*("dashed"==t.lineType?5:1);t._dashLength=U,e.moveTo(o[0][0],o[0][1]);for(var V=1,d=o.length;d>V;V++)a(e,o[V-1][0],o[V-1][1],o[V][0],o[V][1],U);a(e,o[o.length-1][0],o[o.length-1][1],o[0][0],o[0][1],U)}}else{e.moveTo(o[0][0],o[0][1]);for(var V=1,d=o.length;d>V;V++)e.lineTo(o[V][0],o[V][1]);e.lineTo(o[0][0],o[0][1])}e.closePath()}},getRect:function(e){if(e.__rect)return e.__rect;for(var t=Number.MAX_VALUE,i=Number.MIN_VALUE,n=Number.MAX_VALUE,a=Number.MIN_VALUE,o=e.pointList,r=0,s=o.length;s>r;r++)o[r][0]<t&&(t=o[r][0]),o[r][0]>i&&(i=o[r][0]),o[r][1]<n&&(n=o[r][1]),o[r][1]>a&&(a=o[r][1]);var l;return l="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(t-l/2),y:Math.round(n-l/2),width:i-t+l,height:a-n+l},e.__rect}},e("../tool/util").inherits(o,t),o}),i("echarts/util/shape/normalIsCover",[],function(){return function(e,t){var i=this.transformCoordToLocal(e,t);return e=i[0],t=i[1],this.isCoverRect(e,t)}}),i("zrender/shape/util/smoothSpline",["require","../../tool/vector"],function(e){function t(e,t,i,n,a,o,r){var s=.5*(i-e),l=.5*(n-t);return(2*(t-i)+s+l)*r+(-3*(t-i)-2*s-l)*o+s*a+t}var i=e("../../tool/vector");return function(e,n){for(var a=e.length,o=[],r=0,s=1;a>s;s++)r+=i.distance(e[s-1],e[s]);var l=r/5;l=a>l?a:l;for(var s=0;l>s;s++){var h,m,V,U=s/(l-1)*(n?a:a-1),d=Math.floor(U),p=U-d,c=e[d%a];n?(h=e[(d-1+a)%a],m=e[(d+1)%a],V=e[(d+2)%a]):(h=e[0===d?d:d-1],m=e[d>a-2?a-1:d+1],V=e[d>a-3?a-1:d+2]);var u=p*p,y=p*u;o.push([t(h[0],c[0],m[0],V[0],p,u,y),t(h[1],c[1],m[1],V[1],p,u,y)])}return o}}),i("zrender/shape/util/smoothBezier",["require","../../tool/vector"],function(e){var t=e("../../tool/vector");return function(e,i,n,a){var o,r,s,l,h=[],m=[],V=[],U=[],d=!!a;if(d){s=[1/0,1/0],l=[-(1/0),-(1/0)];for(var p=0,c=e.length;c>p;p++)t.min(s,s,e[p]),t.max(l,l,e[p]);t.min(s,s,a[0]),t.max(l,l,a[1])}for(var p=0,c=e.length;c>p;p++){var o,r,u=e[p];if(n)o=e[p?p-1:c-1],r=e[(p+1)%c];else{if(0===p||p===c-1){h.push(t.clone(e[p]));continue}o=e[p-1],r=e[p+1]}t.sub(m,r,o),t.scale(m,m,i);var y=t.distance(u,o),g=t.distance(u,r),b=y+g;0!==b&&(y/=b,g/=b),t.scale(V,m,-y),t.scale(U,m,g);var f=t.add([],u,V),k=t.add([],u,U);d&&(t.max(f,f,s),t.min(f,f,l),t.max(k,k,s),t.min(k,k,l)),h.push(f),h.push(k)}return n&&h.push(t.clone(h.shift())),h}}),i("echarts/util/ecQuery",["require","zrender/tool/util"],function(e){function t(e,t){if("undefined"!=typeof e){if(!t)return e;t=t.split(".");for(var i=t.length,n=0;i>n;){if(e=e[t[n]],"undefined"==typeof e)return;n++}return e}}function i(e,i){for(var n,a=0,o=e.length;o>a;a++)if(n=t(e[a],i),"undefined"!=typeof n)return n}function n(e,i){for(var n,o=e.length;o--;){var r=t(e[o],i);"undefined"!=typeof r&&("undefined"==typeof n?n=a.clone(r):a.merge(n,r,!0))}return n}var a=e("zrender/tool/util");return{query:t,deepQuery:i,deepMerge:n}}),i("echarts/util/number",[],function(){function e(e){return e.replace(/^\s+/,"").replace(/\s+$/,"")}function t(t,i){return"string"==typeof t?e(t).match(/%$/)?parseFloat(t)/100*i:parseFloat(t):t}function i(e,i){return[t(i[0],e.getWidth()),t(i[1],e.getHeight())]}function n(e,i){i instanceof Array||(i=[0,i]);var n=Math.min(e.getWidth(),e.getHeight())/2;return[t(i[0],n),t(i[1],n)]}function a(e){return isNaN(e)?"-":(e=(e+"").split("."),e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(e.length>1?"."+e[1]:""))}function o(e){for(var t=1,i=0;Math.round(e*t)/t!==e;)t*=10,i++;return i}return{parsePercent:t,parseCenter:i,parseRadius:n,addCommas:a,getPrecision:o}}),i("echarts/data/KDTree",["require","./quickSelect"],function(e){function t(e,t){this.left=null,this.right=null,this.axis=e,this.data=t}var i=e("./quickSelect"),n=function(e,t){e.length&&(t||(t=e[0].array.length),this.dimension=t,this.root=this._buildTree(e,0,e.length-1,0),this._stack=[],this._nearstNList=[])};return n.prototype._buildTree=function(e,n,a,o){if(n>a)return null;var r=Math.floor((n+a)/2);r=i(e,n,a,r,function(e,t){return e.array[o]-t.array[o]});var s=e[r],l=new t(o,s);return o=(o+1)%this.dimension,a>n&&(l.left=this._buildTree(e,n,r-1,o),l.right=this._buildTree(e,r+1,a,o)),l},n.prototype.nearest=function(e,t){var i=this.root,n=this._stack,a=0,o=1/0,r=null;for(i.data!==e&&(o=t(i.data,e),r=i),e.array[i.axis]<i.data.array[i.axis]?(i.right&&(n[a++]=i.right),i.left&&(n[a++]=i.left)):(i.left&&(n[a++]=i.left),i.right&&(n[a++]=i.right));a--;){i=n[a];var s=e.array[i.axis]-i.data.array[i.axis],l=0>s,h=!1;s*=s,o>s&&(s=t(i.data,e),o>s&&i.data!==e&&(o=s,r=i),h=!0),l?(h&&i.right&&(n[a++]=i.right),i.left&&(n[a++]=i.left)):(h&&i.left&&(n[a++]=i.left),i.right&&(n[a++]=i.right))}return r.data},n.prototype._addNearest=function(e,t,i){for(var n=this._nearstNList,a=e-1;a>0&&!(t>=n[a-1].dist);a--)n[a].dist=n[a-1].dist,n[a].node=n[a-1].node;n[a].dist=t,n[a].node=i},n.prototype.nearestN=function(e,t,i,n){if(0>=t)return n.length=0,n;for(var a=this.root,o=this._stack,r=0,s=this._nearstNList,l=0;t>l;l++)s[l]||(s[l]={}),s[l].dist=0,s[l].node=null;var h=i(a.data,e),m=0;for(a.data!==e&&(m++,this._addNearest(m,h,a)),e.array[a.axis]<a.data.array[a.axis]?(a.right&&(o[r++]=a.right),a.left&&(o[r++]=a.left)):(a.left&&(o[r++]=a.left),a.right&&(o[r++]=a.right));r--;){a=o[r];var h=e.array[a.axis]-a.data.array[a.axis],V=0>h,U=!1;h*=h,(t>m||h<s[m-1].dist)&&(h=i(a.data,e),(t>m||h<s[m-1].dist)&&a.data!==e&&(t>m&&m++,this._addNearest(m,h,a)),U=!0),V?(U&&a.right&&(o[r++]=a.right),a.left&&(o[r++]=a.left)):(U&&a.left&&(o[r++]=a.left),a.right&&(o[r++]=a.right))}for(var l=0;m>l;l++)n[l]=s[l].node.data;return n.length=m,n},n}),i("echarts/data/quickSelect",["require"],function(){function e(e,t){return e-t}function t(e,t,i){var n=e[t];e[t]=e[i],e[i]=n}function i(e,i,n,a,o){for(var r=i;n>i;){var r=Math.round((n+i)/2),s=e[r];t(e,r,n),r=i;for(var l=i;n-1>=l;l++)o(s,e[l])>=0&&(t(e,l,r),r++);if(t(e,n,r),r===a)return r;a>r?i=r+1:n=r-1}return i}function n(t,n,a,o,r){return arguments.length<=3&&(o=n,r=2==arguments.length?e:a,n=0,a=t.length-1),i(t,n,a,o,r)}return n}),i("echarts/component/dataView",["require","./base","../config","zrender/tool/util","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.dom=o.dom,this._tDom=document.createElement("div"),this._textArea=document.createElement("textArea"),this._buttonRefresh=document.createElement("button"),this._buttonRefresh.setAttribute("type","button"),this._buttonClose=document.createElement("button"),this._buttonClose.setAttribute("type","button"),this._hasShow=!1,this._zrHeight=n.getHeight(),this._zrWidth=n.getWidth(),this._tDom.className="echarts-dataview",this.hide(),this.dom.firstChild.appendChild(this._tDom),window.addEventListener?(this._tDom.addEventListener("click",this._stop),this._tDom.addEventListener("mousewheel",this._stop),this._tDom.addEventListener("mousemove",this._stop),this._tDom.addEventListener("mousedown",this._stop),this._tDom.addEventListener("mouseup",this._stop),this._tDom.addEventListener("touchstart",this._stop),this._tDom.addEventListener("touchmove",this._stop),this._tDom.addEventListener("touchend",this._stop)):(this._tDom.attachEvent("onclick",this._stop),this._tDom.attachEvent("onmousewheel",this._stop),this._tDom.attachEvent("onmousemove",this._stop),this._tDom.attachEvent("onmousedown",this._stop),this._tDom.attachEvent("onmouseup",this._stop))}var i=e("./base"),n=e("../config"),a=e("zrender/tool/util");return t.prototype={type:n.COMPONENT_TYPE_DATAVIEW,_lang:["Data View","close","refresh"],_gCssText:"position:absolute;display:block;overflow:hidden;transition:height 0.8s,background-color 1s;-moz-transition:height 0.8s,background-color 1s;-webkit-transition:height 0.8s,background-color 1s;-o-transition:height 0.8s,background-color 1s;z-index:1;left:0;top:0;",hide:function(){this._sizeCssText="width:"+this._zrWidth+"px;height:0px;background-color:#f0ffff;",this._tDom.style.cssText=this._gCssText+this._sizeCssText},show:function(e){this._hasShow=!0;var t=this.query(this.option,"toolbox.feature.dataView.lang")||this._lang;this.option=e,this._tDom.innerHTML='<p style="padding:8px 0;margin:0 0 10px 0;border-bottom:1px solid #eee">'+(t[0]||this._lang[0])+"</p>";var i=this.query(this.option,"toolbox.feature.dataView.optionToContent");"function"!=typeof i?this._textArea.value=this._optionToContent():(this._textArea=document.createElement("div"),this._textArea.innerHTML=i(this.option)),this._textArea.style.cssText="display:block;margin:0 0 8px 0;padding:4px 6px;overflow:auto;width:100%;height:"+(this._zrHeight-100)+"px;",this._tDom.appendChild(this._textArea),this._buttonClose.style.cssText="float:right;padding:1px 6px;",this._buttonClose.innerHTML=t[1]||this._lang[1];var n=this;this._buttonClose.onclick=function(){n.hide()},this._tDom.appendChild(this._buttonClose),this.query(this.option,"toolbox.feature.dataView.readOnly")===!1?(this._buttonRefresh.style.cssText="float:right;margin-right:10px;padding:1px 6px;",this._buttonRefresh.innerHTML=t[2]||this._lang[2],this._buttonRefresh.onclick=function(){n._save()},this._textArea.readOnly=!1,this._textArea.style.cursor="default"):(this._buttonRefresh.style.cssText="display:none",
-this._textArea.readOnly=!0,this._textArea.style.cursor="text"),this._tDom.appendChild(this._buttonRefresh),this._sizeCssText="width:"+this._zrWidth+"px;height:"+this._zrHeight+"px;background-color:#fff;",this._tDom.style.cssText=this._gCssText+this._sizeCssText},_optionToContent:function(){var e,t,i,a,o,r,s=[],l="";if(this.option.xAxis)for(s=this.option.xAxis instanceof Array?this.option.xAxis:[this.option.xAxis],e=0,a=s.length;a>e;e++)if("category"==(s[e].type||"category")){for(r=[],t=0,i=s[e].data.length;i>t;t++)r.push(this.getDataFromOption(s[e].data[t]));l+=r.join(", ")+"\n\n"}if(this.option.yAxis)for(s=this.option.yAxis instanceof Array?this.option.yAxis:[this.option.yAxis],e=0,a=s.length;a>e;e++)if("category"==s[e].type){for(r=[],t=0,i=s[e].data.length;i>t;t++)r.push(this.getDataFromOption(s[e].data[t]));l+=r.join(", ")+"\n\n"}var h,m=this.option.series;for(e=0,a=m.length;a>e;e++){for(r=[],t=0,i=m[e].data.length;i>t;t++)o=m[e].data[t],h=m[e].type==n.CHART_TYPE_PIE||m[e].type==n.CHART_TYPE_MAP?(o.name||"-")+":":"",m[e].type==n.CHART_TYPE_SCATTER&&(o=this.getDataFromOption(o).join(", ")),r.push(h+this.getDataFromOption(o));l+=(m[e].name||"-")+" : \n",l+=r.join(m[e].type==n.CHART_TYPE_SCATTER?"\n":", "),l+="\n\n"}return l},_save:function(){var e=this.query(this.option,"toolbox.feature.dataView.contentToOption");if("function"!=typeof e){for(var t=this._textArea.value.split("\n"),i=[],a=0,o=t.length;o>a;a++)t[a]=this._trim(t[a]),""!==t[a]&&i.push(t[a]);this._contentToOption(i)}else e(this._textArea,this.option);this.hide();var r=this;setTimeout(function(){r.messageCenter&&r.messageCenter.dispatch(n.EVENT.DATA_VIEW_CHANGED,null,{option:r.option},r.myChart)},r.canvasSupported?800:100)},_contentToOption:function(e){var t,i,a,o,r,s,l,h=[],m=0;if(this.option.xAxis)for(h=this.option.xAxis instanceof Array?this.option.xAxis:[this.option.xAxis],t=0,o=h.length;o>t;t++)if("category"==(h[t].type||"category")){for(s=e[m].split(","),i=0,a=h[t].data.length;a>i;i++)l=this._trim(s[i]||""),r=h[t].data[i],"undefined"!=typeof h[t].data[i].value?h[t].data[i].value=l:h[t].data[i]=l;m++}if(this.option.yAxis)for(h=this.option.yAxis instanceof Array?this.option.yAxis:[this.option.yAxis],t=0,o=h.length;o>t;t++)if("category"==h[t].type){for(s=e[m].split(","),i=0,a=h[t].data.length;a>i;i++)l=this._trim(s[i]||""),r=h[t].data[i],"undefined"!=typeof h[t].data[i].value?h[t].data[i].value=l:h[t].data[i]=l;m++}var V=this.option.series;for(t=0,o=V.length;o>t;t++)if(m++,V[t].type==n.CHART_TYPE_SCATTER)for(var i=0,a=V[t].data.length;a>i;i++)s=e[m],l=s.replace(" ","").split(","),"undefined"!=typeof V[t].data[i].value?V[t].data[i].value=l:V[t].data[i]=l,m++;else{s=e[m].split(",");for(var i=0,a=V[t].data.length;a>i;i++)l=(s[i]||"").replace(/.*:/,""),l=this._trim(l),l="-"!=l&&""!==l?l-0:"-","undefined"!=typeof V[t].data[i].value?V[t].data[i].value=l:V[t].data[i]=l;m++}},_trim:function(e){var t=new RegExp("(^[\\s\\t\\xa0\\u3000]+)|([\\u3000\\xa0\\s\\t]+$)","g");return e.replace(t,"")},_stop:function(e){e=e||window.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},resize:function(){this._zrHeight=this.zr.getHeight(),this._zrWidth=this.zr.getWidth(),this._tDom.offsetHeight>10&&(this._sizeCssText="width:"+this._zrWidth+"px;height:"+this._zrHeight+"px;background-color:#fff;",this._tDom.style.cssText=this._gCssText+this._sizeCssText,this._textArea.style.cssText="display:block;margin:0 0 8px 0;padding:4px 6px;overflow:auto;width:100%;height:"+(this._zrHeight-100)+"px;")},dispose:function(){window.removeEventListener?(this._tDom.removeEventListener("click",this._stop),this._tDom.removeEventListener("mousewheel",this._stop),this._tDom.removeEventListener("mousemove",this._stop),this._tDom.removeEventListener("mousedown",this._stop),this._tDom.removeEventListener("mouseup",this._stop),this._tDom.removeEventListener("touchstart",this._stop),this._tDom.removeEventListener("touchmove",this._stop),this._tDom.removeEventListener("touchend",this._stop)):(this._tDom.detachEvent("onclick",this._stop),this._tDom.detachEvent("onmousewheel",this._stop),this._tDom.detachEvent("onmousemove",this._stop),this._tDom.detachEvent("onmousedown",this._stop),this._tDom.detachEvent("onmouseup",this._stop)),this._buttonRefresh.onclick=null,this._buttonClose.onclick=null,this._hasShow&&(this._tDom.removeChild(this._textArea),this._tDom.removeChild(this._buttonRefresh),this._tDom.removeChild(this._buttonClose)),this._textArea=null,this._buttonRefresh=null,this._buttonClose=null,this.dom.firstChild.removeChild(this._tDom),this._tDom=null}},a.inherits(t,i),e("../component").define("dataView",t),t}),i("echarts/util/shape/Cross",["require","zrender/shape/Base","zrender/shape/Line","zrender/tool/util","./normalIsCover"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/shape/Line"),a=e("zrender/tool/util");return t.prototype={type:"cross",buildPath:function(e,t){var i=t.rect;t.xStart=i.x,t.xEnd=i.x+i.width,t.yStart=t.yEnd=t.y,n.prototype.buildPath(e,t),t.xStart=t.xEnd=t.x,t.yStart=i.y,t.yEnd=i.y+i.height,n.prototype.buildPath(e,t)},getRect:function(e){return e.rect},isCover:e("./normalIsCover")},a.inherits(t,i),t}),i("zrender/shape/Sector",["require","../tool/math","../tool/computeBoundingBox","../tool/vector","./Base","../tool/util"],function(e){var t=e("../tool/math"),i=e("../tool/computeBoundingBox"),n=e("../tool/vector"),a=e("./Base"),o=n.create(),r=n.create(),s=n.create(),l=n.create(),h=function(e){a.call(this,e)};return h.prototype={type:"sector",buildPath:function(e,i){var n=i.x,a=i.y,o=i.r0||0,r=i.r,s=i.startAngle,l=i.endAngle,h=i.clockWise||!1;s=t.degreeToRadian(s),l=t.degreeToRadian(l),h||(s=-s,l=-l);var m=t.cos(s),V=t.sin(s);e.moveTo(m*o+n,V*o+a),e.lineTo(m*r+n,V*r+a),e.arc(n,a,r,s,l,!h),e.lineTo(t.cos(l)*o+n,t.sin(l)*o+a),0!==o&&e.arc(n,a,o,l,s,h),e.closePath()},getRect:function(e){if(e.__rect)return e.__rect;var a=e.x,h=e.y,m=e.r0||0,V=e.r,U=t.degreeToRadian(e.startAngle),d=t.degreeToRadian(e.endAngle),p=e.clockWise;return p||(U=-U,d=-d),m>1?i.arc(a,h,m,U,d,!p,o,s):(o[0]=s[0]=a,o[1]=s[1]=h),i.arc(a,h,V,U,d,!p,r,l),n.min(o,o,r),n.max(s,s,l),e.__rect={x:o[0],y:o[1],width:s[0]-o[0],height:s[1]-o[1]},e.__rect}},e("../tool/util").inherits(h,a),h}),i("echarts/util/shape/Candle",["require","zrender/shape/Base","zrender/tool/util","./normalIsCover"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/tool/util");return t.prototype={type:"candle",_numberOrder:function(e,t){return t-e},buildPath:function(e,t){var i=n.clone(t.y).sort(this._numberOrder);e.moveTo(t.x,i[3]),e.lineTo(t.x,i[2]),e.moveTo(t.x-t.width/2,i[2]),e.rect(t.x-t.width/2,i[2],t.width,i[1]-i[2]),e.moveTo(t.x,i[1]),e.lineTo(t.x,i[0])},getRect:function(e){if(!e.__rect){var t=0;("stroke"==e.brushType||"fill"==e.brushType)&&(t=e.lineWidth||1);var i=n.clone(e.y).sort(this._numberOrder);e.__rect={x:Math.round(e.x-e.width/2-t/2),y:Math.round(i[3]-t/2),width:e.width+t,height:i[0]-i[3]+t}}return e.__rect},isCover:e("./normalIsCover")},n.inherits(t,i),t}),i("zrender/tool/computeBoundingBox",["require","./vector","./curve"],function(e){function t(e,t,i){if(0!==e.length){for(var n=e[0][0],a=e[0][0],o=e[0][1],r=e[0][1],s=1;s<e.length;s++){var l=e[s];l[0]<n&&(n=l[0]),l[0]>a&&(a=l[0]),l[1]<o&&(o=l[1]),l[1]>r&&(r=l[1])}t[0]=n,t[1]=o,i[0]=a,i[1]=r}}function i(e,t,i,n,a,r){var s=[];o.cubicExtrema(e[0],t[0],i[0],n[0],s);for(var l=0;l<s.length;l++)s[l]=o.cubicAt(e[0],t[0],i[0],n[0],s[l]);var h=[];o.cubicExtrema(e[1],t[1],i[1],n[1],h);for(var l=0;l<h.length;l++)h[l]=o.cubicAt(e[1],t[1],i[1],n[1],h[l]);s.push(e[0],n[0]),h.push(e[1],n[1]);var m=Math.min.apply(null,s),V=Math.max.apply(null,s),U=Math.min.apply(null,h),d=Math.max.apply(null,h);a[0]=m,a[1]=U,r[0]=V,r[1]=d}function n(e,t,i,n,a){var r=o.quadraticExtremum(e[0],t[0],i[0]),s=o.quadraticExtremum(e[1],t[1],i[1]);r=Math.max(Math.min(r,1),0),s=Math.max(Math.min(s,1),0);var l=1-r,h=1-s,m=l*l*e[0]+2*l*r*t[0]+r*r*i[0],V=l*l*e[1]+2*l*r*t[1]+r*r*i[1],U=h*h*e[0]+2*h*s*t[0]+s*s*i[0],d=h*h*e[1]+2*h*s*t[1]+s*s*i[1];n[0]=Math.min(e[0],i[0],m,U),n[1]=Math.min(e[1],i[1],V,d),a[0]=Math.max(e[0],i[0],m,U),a[1]=Math.max(e[1],i[1],V,d)}var a=e("./vector"),o=e("./curve"),r=a.create(),s=a.create(),l=a.create(),h=function(e,t,i,n,o,h,m,V){if(Math.abs(n-o)>=2*Math.PI)return m[0]=e-i,m[1]=t-i,V[0]=e+i,void(V[1]=t+i);if(r[0]=Math.cos(n)*i+e,r[1]=Math.sin(n)*i+t,s[0]=Math.cos(o)*i+e,s[1]=Math.sin(o)*i+t,a.min(m,r,s),a.max(V,r,s),n%=2*Math.PI,0>n&&(n+=2*Math.PI),o%=2*Math.PI,0>o&&(o+=2*Math.PI),n>o&&!h?o+=2*Math.PI:o>n&&h&&(n+=2*Math.PI),h){var U=o;o=n,n=U}for(var d=0;o>d;d+=Math.PI/2)d>n&&(l[0]=Math.cos(d)*i+e,l[1]=Math.sin(d)*i+t,a.min(m,l,m),a.max(V,l,V))};return t.cubeBezier=i,t.quadraticBezier=n,t.arc=h,t}),i("echarts/util/shape/Chain",["require","zrender/shape/Base","./Icon","zrender/shape/util/dashedLineTo","zrender/tool/util","zrender/tool/matrix"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("./Icon"),a=e("zrender/shape/util/dashedLineTo"),o=e("zrender/tool/util"),r=e("zrender/tool/matrix");return t.prototype={type:"chain",brush:function(e,t){var i=this.style;t&&(i=this.getHighlightStyle(i,this.highlightStyle||{})),e.save(),this.setContext(e,i),this.setTransform(e),e.save(),e.beginPath(),this.buildLinePath(e,i),e.stroke(),e.restore(),this.brushSymbol(e,i),e.restore()},buildLinePath:function(e,t){var i=t.x,n=t.y+5,o=t.width,r=t.height/2-10;if(e.moveTo(i,n),e.lineTo(i,n+r),e.moveTo(i+o,n),e.lineTo(i+o,n+r),e.moveTo(i,n+r/2),t.lineType&&"solid"!=t.lineType){if("dashed"==t.lineType||"dotted"==t.lineType){var s=(t.lineWidth||1)*("dashed"==t.lineType?5:1);a(e,i,n+r/2,i+o,n+r/2,s)}}else e.lineTo(i+o,n+r/2)},brushSymbol:function(e,t){var i=t.y+t.height/4;e.save();for(var a,o=t.chainPoint,r=0,s=o.length;s>r;r++){if(a=o[r],"none"!=a.symbol){e.beginPath();var l=a.symbolSize;n.prototype.buildPath(e,{iconType:a.symbol,x:a.x-l,y:i-l,width:2*l,height:2*l,n:a.n}),e.fillStyle=a.isEmpty?"#fff":t.strokeColor,e.closePath(),e.fill(),e.stroke()}a.showLabel&&(e.font=a.textFont,e.fillStyle=a.textColor,e.textAlign=a.textAlign,e.textBaseline=a.textBaseline,a.rotation?(e.save(),this._updateTextTransform(e,a.rotation),e.fillText(a.name,a.textX,a.textY),e.restore()):e.fillText(a.name,a.textX,a.textY))}e.restore()},_updateTextTransform:function(e,t){var i=r.create();if(r.identity(i),0!==t[0]){var n=t[1]||0,a=t[2]||0;(n||a)&&r.translate(i,i,[-n,-a]),r.rotate(i,i,t[0]),(n||a)&&r.translate(i,i,[n,a])}e.transform.apply(e,i)},isCover:function(e,t){var i=this.style;return e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height?!0:!1}},o.inherits(t,i),t}),i("zrender/shape/Ring",["require","./Base","../tool/util"],function(e){var t=e("./Base"),i=function(e){t.call(this,e)};return i.prototype={type:"ring",buildPath:function(e,t){e.arc(t.x,t.y,t.r,0,2*Math.PI,!1),e.moveTo(t.x+t.r0,t.y),e.arc(t.x,t.y,t.r0,0,2*Math.PI,!0)},getRect:function(e){if(e.__rect)return e.__rect;var t;return t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-e.r-t/2),y:Math.round(e.y-e.r-t/2),width:2*e.r+t,height:2*e.r+t},e.__rect}},e("../tool/util").inherits(i,t),i}),i("echarts/component/axis",["require","./base","zrender/shape/Line","../config","../util/ecData","zrender/tool/util","zrender/tool/color","./categoryAxis","./valueAxis","../component"],function(e){function t(e,t,n,a,o,r){i.call(this,e,t,n,a,o),this.axisType=r,this._axisList=[],this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Line"),a=e("../config"),o=e("../util/ecData"),r=e("zrender/tool/util"),s=e("zrender/tool/color");return t.prototype={type:a.COMPONENT_TYPE_AXIS,axisBase:{_buildAxisLine:function(){var e=this.option.axisLine.lineStyle.width,t=e/2,i={_axisShape:"axisLine",zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1},a=this.grid;switch(this.option.position){case"left":i.style={xStart:a.getX()-t,yStart:a.getYend(),xEnd:a.getX()-t,yEnd:a.getY(),lineCap:"round"};break;case"right":i.style={xStart:a.getXend()+t,yStart:a.getYend(),xEnd:a.getXend()+t,yEnd:a.getY(),lineCap:"round"};break;case"bottom":i.style={xStart:a.getX(),yStart:a.getYend()+t,xEnd:a.getXend(),yEnd:a.getYend()+t,lineCap:"round"};break;case"top":i.style={xStart:a.getX(),yStart:a.getY()-t,xEnd:a.getXend(),yEnd:a.getY()-t,lineCap:"round"}}var o=i.style;""!==this.option.name&&(o.text=this.option.name,o.textPosition=this.option.nameLocation,o.textFont=this.getFont(this.option.nameTextStyle),this.option.nameTextStyle.align&&(o.textAlign=this.option.nameTextStyle.align),this.option.nameTextStyle.baseline&&(o.textBaseline=this.option.nameTextStyle.baseline),this.option.nameTextStyle.color&&(o.textColor=this.option.nameTextStyle.color)),o.strokeColor=this.option.axisLine.lineStyle.color,o.lineWidth=e,this.isHorizontal()?o.yStart=o.yEnd=this.subPixelOptimize(o.yEnd,e):o.xStart=o.xEnd=this.subPixelOptimize(o.xEnd,e),o.lineType=this.option.axisLine.lineStyle.type,i=new n(i),this.shapeList.push(i)},_axisLabelClickable:function(e,t){return e?(o.pack(t,void 0,-1,void 0,-1,t.style.text),t.hoverable=!0,t.clickable=!0,t.highlightStyle={color:s.lift(t.style.color,1),brushType:"fill"},t):t},refixAxisShape:function(e,t){if(this.option.axisLine.onZero){var i;if(this.isHorizontal()&&null!=t)for(var n=0,a=this.shapeList.length;a>n;n++)"axisLine"===this.shapeList[n]._axisShape?(this.shapeList[n].style.yStart=this.shapeList[n].style.yEnd=this.subPixelOptimize(t,this.shapeList[n].stylelineWidth),this.zr.modShape(this.shapeList[n].id)):"axisTick"===this.shapeList[n]._axisShape&&(i=this.shapeList[n].style.yEnd-this.shapeList[n].style.yStart,this.shapeList[n].style.yStart=t-i,this.shapeList[n].style.yEnd=t,this.zr.modShape(this.shapeList[n].id));if(!this.isHorizontal()&&null!=e)for(var n=0,a=this.shapeList.length;a>n;n++)"axisLine"===this.shapeList[n]._axisShape?(this.shapeList[n].style.xStart=this.shapeList[n].style.xEnd=this.subPixelOptimize(e,this.shapeList[n].stylelineWidth),this.zr.modShape(this.shapeList[n].id)):"axisTick"===this.shapeList[n]._axisShape&&(i=this.shapeList[n].style.xEnd-this.shapeList[n].style.xStart,this.shapeList[n].style.xStart=e,this.shapeList[n].style.xEnd=e+i,this.zr.modShape(this.shapeList[n].id))}},getPosition:function(){return this.option.position},isHorizontal:function(){return"bottom"===this.option.position||"top"===this.option.position}},reformOption:function(e){if(!e||e instanceof Array&&0===e.length?e=[{type:a.COMPONENT_TYPE_AXIS_VALUE}]:e instanceof Array||(e=[e]),e.length>2&&(e=[e[0],e[1]]),"xAxis"===this.axisType){(!e[0].position||"bottom"!=e[0].position&&"top"!=e[0].position)&&(e[0].position="bottom"),e.length>1&&(e[1].position="bottom"===e[0].position?"top":"bottom");for(var t=0,i=e.length;i>t;t++)e[t].type=e[t].type||"category",e[t].xAxisIndex=t,e[t].yAxisIndex=-1}else{(!e[0].position||"left"!=e[0].position&&"right"!=e[0].position)&&(e[0].position="left"),e.length>1&&(e[1].position="left"===e[0].position?"right":"left");for(var t=0,i=e.length;i>t;t++)e[t].type=e[t].type||"value",e[t].xAxisIndex=-1,e[t].yAxisIndex=t}return e},refresh:function(t){var i;t&&(this.option=t,"xAxis"===this.axisType?(this.option.xAxis=this.reformOption(t.xAxis),i=this.option.xAxis):(this.option.yAxis=this.reformOption(t.yAxis),i=this.option.yAxis),this.series=t.series);for(var n=e("./categoryAxis"),a=e("./valueAxis"),o=Math.max(i&&i.length||0,this._axisList.length),r=0;o>r;r++)!this._axisList[r]||!t||i[r]&&this._axisList[r].type==i[r].type||(this._axisList[r].dispose&&this._axisList[r].dispose(),this._axisList[r]=!1),this._axisList[r]?this._axisList[r].refresh&&this._axisList[r].refresh(i?i[r]:!1,this.series):i&&i[r]&&(this._axisList[r]="category"===i[r].type?new n(this.ecTheme,this.messageCenter,this.zr,i[r],this.myChart,this.axisBase):new a(this.ecTheme,this.messageCenter,this.zr,i[r],this.myChart,this.axisBase,this.series))},getAxis:function(e){return this._axisList[e]},getAxisCount:function(){return this._axisList.length},clear:function(){for(var e=0,t=this._axisList.length;t>e;e++)this._axisList[e].dispose&&this._axisList[e].dispose();this._axisList=[]}},r.inherits(t,i),e("../component").define("axis",t),t}),i("echarts/component/grid",["require","./base","zrender/shape/Rectangle","../config","zrender/tool/util","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Rectangle"),a=e("../config");a.grid={zlevel:0,z:0,x:80,y:60,x2:80,y2:60,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"};var o=e("zrender/tool/util");return t.prototype={type:a.COMPONENT_TYPE_GRID,getX:function(){return this._x},getY:function(){return this._y},getWidth:function(){return this._width},getHeight:function(){return this._height},getXend:function(){return this._x+this._width},getYend:function(){return this._y+this._height},getArea:function(){return{x:this._x,y:this._y,width:this._width,height:this._height}},getBbox:function(){return[[this._x,this._y],[this.getXend(),this.getYend()]]},refixAxisShape:function(e){for(var t,i,n,o=e.xAxis._axisList.concat(e.yAxis?e.yAxis._axisList:[]),r=o.length;r--;)n=o[r],n.type==a.COMPONENT_TYPE_AXIS_VALUE&&n._min<0&&n._max>=0&&(n.isHorizontal()?t=n.getCoord(0):i=n.getCoord(0));if("undefined"!=typeof t||"undefined"!=typeof i)for(r=o.length;r--;)o[r].refixAxisShape(t,i)},refresh:function(e){if(e||this._zrWidth!=this.zr.getWidth()||this._zrHeight!=this.zr.getHeight()){this.clear(),this.option=e||this.option,this.option.grid=this.reformOption(this.option.grid);var t=this.option.grid;this._zrWidth=this.zr.getWidth(),this._zrHeight=this.zr.getHeight(),this._x=this.parsePercent(t.x,this._zrWidth),this._y=this.parsePercent(t.y,this._zrHeight);var i=this.parsePercent(t.x2,this._zrWidth),a=this.parsePercent(t.y2,this._zrHeight);this._width="undefined"==typeof t.width?this._zrWidth-this._x-i:this.parsePercent(t.width,this._zrWidth),this._width=this._width<=0?10:this._width,this._height="undefined"==typeof t.height?this._zrHeight-this._y-a:this.parsePercent(t.height,this._zrHeight),this._height=this._height<=0?10:this._height,this._x=this.subPixelOptimize(this._x,t.borderWidth),this._y=this.subPixelOptimize(this._y,t.borderWidth),this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._x,y:this._y,width:this._width,height:this._height,brushType:t.borderWidth>0?"both":"fill",color:t.backgroundColor,strokeColor:t.borderColor,lineWidth:t.borderWidth}})),this.zr.addShape(this.shapeList[0])}}},o.inherits(t,i),e("../component").define("grid",t),t}),i("echarts/component/dataZoom",["require","./base","zrender/shape/Rectangle","zrender/shape/Polygon","../util/shape/Icon","../config","../util/date","zrender/tool/util","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r._ondrift=function(e,t){return r.__ondrift(this,e,t)},r._ondragend=function(){return r.__ondragend()},this._fillerSize=30,this._isSilence=!1,this._zoom={},this.option.dataZoom=this.reformOption(this.option.dataZoom),this.zoomOption=this.option.dataZoom,this._handleSize=this.zoomOption.handleSize,this.myChart.canvasSupported||(this.zoomOption.realtime=!1),this._location=this._getLocation(),this._zoom=this._getZoom(),this._backupData(),this.option.dataZoom.show&&this._buildShape(),this._syncData()}var i=e("./base"),n=e("zrender/shape/Rectangle"),a=e("zrender/shape/Polygon"),o=e("../util/shape/Icon"),r=e("../config");r.dataZoom={zlevel:0,z:4,show:!1,orient:"horizontal",backgroundColor:"rgba(0,0,0,0)",dataBackgroundColor:"#eee",fillerColor:"rgba(144,197,237,0.2)",handleColor:"rgba(70,130,180,0.8)",handleSize:8,showDetail:!0,realtime:!0};var s=e("../util/date"),l=e("zrender/tool/util");return t.prototype={type:r.COMPONENT_TYPE_DATAZOOM,_buildShape:function(){this._buildBackground(),this._buildFiller(),this._buildHandle(),this._buildFrame();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e]);this._syncFrameShape()},_getLocation:function(){var e,t,i,n,a=this.component.grid;return"horizontal"==this.zoomOption.orient?(i=this.zoomOption.width||a.getWidth(),n=this.zoomOption.height||this._fillerSize,e=null!=this.zoomOption.x?this.zoomOption.x:a.getX(),t=null!=this.zoomOption.y?this.zoomOption.y:this.zr.getHeight()-n-2):(i=this.zoomOption.width||this._fillerSize,n=this.zoomOption.height||a.getHeight(),e=null!=this.zoomOption.x?this.zoomOption.x:2,t=null!=this.zoomOption.y?this.zoomOption.y:a.getY()),{x:e,y:t,width:i,height:n}},_getZoom:function(){var e=this.option.series,t=this.option.xAxis;!t||t instanceof Array||(t=[t],this.option.xAxis=t);var i=this.option.yAxis;!i||i instanceof Array||(i=[i],this.option.yAxis=i);var n,a,o=[],s=this.zoomOption.xAxisIndex;if(t&&null==s){n=[];for(var l=0,h=t.length;h>l;l++)("category"==t[l].type||null==t[l].type)&&n.push(l)}else n=s instanceof Array?s:null!=s?[s]:[];if(s=this.zoomOption.yAxisIndex,i&&null==s){a=[];for(var l=0,h=i.length;h>l;l++)"category"==i[l].type&&a.push(l)}else a=s instanceof Array?s:null!=s?[s]:[];for(var m,l=0,h=e.length;h>l;l++)if(m=e[l],m.type==r.CHART_TYPE_LINE||m.type==r.CHART_TYPE_BAR||m.type==r.CHART_TYPE_SCATTER||m.type==r.CHART_TYPE_K){for(var V=0,U=n.length;U>V;V++)if(n[V]==(m.xAxisIndex||0)){o.push(l);break}for(var V=0,U=a.length;U>V;V++)if(a[V]==(m.yAxisIndex||0)){o.push(l);break}null==this.zoomOption.xAxisIndex&&null==this.zoomOption.yAxisIndex&&m.data&&this.getDataFromOption(m.data[0])instanceof Array&&(m.type==r.CHART_TYPE_SCATTER||m.type==r.CHART_TYPE_LINE||m.type==r.CHART_TYPE_BAR)&&o.push(l)}var d=null!=this._zoom.start?this._zoom.start:null!=this.zoomOption.start?this.zoomOption.start:0,p=null!=this._zoom.end?this._zoom.end:null!=this.zoomOption.end?this.zoomOption.end:100;d>p&&(d+=p,p=d-p,d-=p);var c=Math.round((p-d)/100*("horizontal"==this.zoomOption.orient?this._location.width:this._location.height));return{start:d,end:p,start2:0,end2:100,size:c,xAxisIndex:n,yAxisIndex:a,seriesIndex:o,scatterMap:this._zoom.scatterMap||{}}},_backupData:function(){this._originalData={xAxis:{},yAxis:{},series:{}};for(var e=this.option.xAxis,t=this._zoom.xAxisIndex,i=0,n=t.length;n>i;i++)this._originalData.xAxis[t[i]]=e[t[i]].data;for(var a=this.option.yAxis,o=this._zoom.yAxisIndex,i=0,n=o.length;n>i;i++)this._originalData.yAxis[o[i]]=a[o[i]].data;for(var s,l=this.option.series,h=this._zoom.seriesIndex,i=0,n=h.length;n>i;i++)s=l[h[i]],this._originalData.series[h[i]]=s.data,s.data&&this.getDataFromOption(s.data[0])instanceof Array&&(s.type==r.CHART_TYPE_SCATTER||s.type==r.CHART_TYPE_LINE||s.type==r.CHART_TYPE_BAR)&&(this._backupScale(),this._calculScatterMap(h[i]))},_calculScatterMap:function(t){this._zoom.scatterMap=this._zoom.scatterMap||{},this._zoom.scatterMap[t]=this._zoom.scatterMap[t]||{};var i=e("../component"),n=i.get("axis"),a=l.clone(this.option.xAxis);"category"==a[0].type&&(a[0].type="value"),a[1]&&"category"==a[1].type&&(a[1].type="value");var o=new n(this.ecTheme,null,!1,{xAxis:a,series:this.option.series},this,"xAxis"),r=this.option.series[t].xAxisIndex||0;this._zoom.scatterMap[t].x=o.getAxis(r).getExtremum(),o.dispose(),a=l.clone(this.option.yAxis),"category"==a[0].type&&(a[0].type="value"),a[1]&&"category"==a[1].type&&(a[1].type="value"),o=new n(this.ecTheme,null,!1,{yAxis:a,series:this.option.series},this,"yAxis"),r=this.option.series[t].yAxisIndex||0,this._zoom.scatterMap[t].y=o.getAxis(r).getExtremum(),o.dispose()},_buildBackground:function(){var e=this._location.width,t=this._location.height;this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._location.x,y:this._location.y,width:e,height:t,color:this.zoomOption.backgroundColor}}));for(var i=0,o=this._originalData.xAxis,s=this._zoom.xAxisIndex,l=0,h=s.length;h>l;l++)i=Math.max(i,o[s[l]].length);for(var m=this._originalData.yAxis,V=this._zoom.yAxisIndex,l=0,h=V.length;h>l;l++)i=Math.max(i,m[V[l]].length);for(var U,d=this._zoom.seriesIndex[0],p=this._originalData.series[d],c=Number.MIN_VALUE,u=Number.MAX_VALUE,l=0,h=p.length;h>l;l++)U=this.getDataFromOption(p[l],0),this.option.series[d].type==r.CHART_TYPE_K&&(U=U[1]),isNaN(U)&&(U=0),c=Math.max(c,U),u=Math.min(u,U);var y=c-u,g=[],b=e/(i-(i>1?1:0)),f=t/(i-(i>1?1:0)),k=1;"horizontal"==this.zoomOption.orient&&1>b?k=Math.floor(3*i/e):"vertical"==this.zoomOption.orient&&1>f&&(k=Math.floor(3*i/t));for(var l=0,h=i;h>l;l+=k)U=this.getDataFromOption(p[l],0),this.option.series[d].type==r.CHART_TYPE_K&&(U=U[1]),isNaN(U)&&(U=0),g.push("horizontal"==this.zoomOption.orient?[this._location.x+b*l,this._location.y+t-1-Math.round((U-u)/y*(t-10))]:[this._location.x+1+Math.round((U-u)/y*(e-10)),this._location.y+f*(h-l-1)]);"horizontal"==this.zoomOption.orient?(g.push([this._location.x+e,this._location.y+t]),g.push([this._location.x,this._location.y+t])):(g.push([this._location.x,this._location.y]),g.push([this._location.x,this._location.y+t])),this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{pointList:g,color:this.zoomOption.dataBackgroundColor},hoverable:!1}))},_buildFiller:function(){this._fillerShae={zlevel:this.getZlevelBase(),z:this.getZBase(),draggable:!0,ondrift:this._ondrift,ondragend:this._ondragend,_type:"filler"},this._fillerShae.style="horizontal"==this.zoomOption.orient?{x:this._location.x+Math.round(this._zoom.start/100*this._location.width)+this._handleSize,y:this._location.y,width:this._zoom.size-2*this._handleSize,height:this._location.height,color:this.zoomOption.fillerColor,text:":::",textPosition:"inside"}:{x:this._location.x,y:this._location.y+Math.round(this._zoom.start/100*this._location.height)+this._handleSize,width:this._location.width,height:this._zoom.size-2*this._handleSize,color:this.zoomOption.fillerColor,text:"::",textPosition:"inside"},this._fillerShae.highlightStyle={brushType:"fill",color:"rgba(0,0,0,0)"},this._fillerShae=new n(this._fillerShae),this.shapeList.push(this._fillerShae)},_buildHandle:function(){var e=this.zoomOption.showDetail?this._getDetail():{start:"",end:""};this._startShape={zlevel:this.getZlevelBase(),z:this.getZBase(),draggable:!0,style:{iconType:"rectangle",x:this._location.x,y:this._location.y,width:this._handleSize,height:this._handleSize,color:this.zoomOption.handleColor,text:"=",textPosition:"inside"},highlightStyle:{text:e.start,brushType:"fill",textPosition:"left"},ondrift:this._ondrift,ondragend:this._ondragend},"horizontal"==this.zoomOption.orient?(this._startShape.style.height=this._location.height,this._endShape=l.clone(this._startShape),this._startShape.style.x=this._fillerShae.style.x-this._handleSize,this._endShape.style.x=this._fillerShae.style.x+this._fillerShae.style.width,this._endShape.highlightStyle.text=e.end,this._endShape.highlightStyle.textPosition="right"):(this._startShape.style.width=this._location.width,this._endShape=l.clone(this._startShape),this._startShape.style.y=this._fillerShae.style.y+this._fillerShae.style.height,this._startShape.highlightStyle.textPosition="bottom",this._endShape.style.y=this._fillerShae.style.y-this._handleSize,this._endShape.highlightStyle.text=e.end,this._endShape.highlightStyle.textPosition="top"),this._startShape=new o(this._startShape),this._endShape=new o(this._endShape),this.shapeList.push(this._startShape),this.shapeList.push(this._endShape)},_buildFrame:function(){var e=this.subPixelOptimize(this._location.x,1),t=this.subPixelOptimize(this._location.y,1);this._startFrameShape={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:e,y:t,width:this._location.width-(e>this._location.x?1:0),height:this._location.height-(t>this._location.y?1:0),lineWidth:1,brushType:"stroke",strokeColor:this.zoomOption.handleColor}},this._endFrameShape=l.clone(this._startFrameShape),this._startFrameShape=new n(this._startFrameShape),this._endFrameShape=new n(this._endFrameShape),this.shapeList.push(this._startFrameShape),this.shapeList.push(this._endFrameShape)},_syncHandleShape:function(){"horizontal"==this.zoomOption.orient?(this._startShape.style.x=this._fillerShae.style.x-this._handleSize,this._endShape.style.x=this._fillerShae.style.x+this._fillerShae.style.width,this._zoom.start=(this._startShape.style.x-this._location.x)/this._location.width*100,this._zoom.end=(this._endShape.style.x+this._handleSize-this._location.x)/this._location.width*100):(this._startShape.style.y=this._fillerShae.style.y+this._fillerShae.style.height,this._endShape.style.y=this._fillerShae.style.y-this._handleSize,this._zoom.start=(this._location.y+this._location.height-this._startShape.style.y)/this._location.height*100,this._zoom.end=(this._location.y+this._location.height-this._endShape.style.y-this._handleSize)/this._location.height*100),this.zr.modShape(this._startShape.id),this.zr.modShape(this._endShape.id),this._syncFrameShape(),this.zr.refreshNextFrame()},_syncFillerShape:function(){var e,t;"horizontal"==this.zoomOption.orient?(e=this._startShape.style.x,t=this._endShape.style.x,this._fillerShae.style.x=Math.min(e,t)+this._handleSize,this._fillerShae.style.width=Math.abs(e-t)-this._handleSize,this._zoom.start=(Math.min(e,t)-this._location.x)/this._location.width*100,this._zoom.end=(Math.max(e,t)+this._handleSize-this._location.x)/this._location.width*100):(e=this._startShape.style.y,t=this._endShape.style.y,this._fillerShae.style.y=Math.min(e,t)+this._handleSize,this._fillerShae.style.height=Math.abs(e-t)-this._handleSize,this._zoom.start=(this._location.y+this._location.height-Math.max(e,t))/this._location.height*100,this._zoom.end=(this._location.y+this._location.height-Math.min(e,t)-this._handleSize)/this._location.height*100),this.zr.modShape(this._fillerShae.id),this._syncFrameShape(),this.zr.refreshNextFrame()},_syncFrameShape:function(){"horizontal"==this.zoomOption.orient?(this._startFrameShape.style.width=this._fillerShae.style.x-this._location.x,this._endFrameShape.style.x=this._fillerShae.style.x+this._fillerShae.style.width,this._endFrameShape.style.width=this._location.x+this._location.width-this._endFrameShape.style.x):(this._startFrameShape.style.y=this._fillerShae.style.y+this._fillerShae.style.height,this._startFrameShape.style.height=this._location.y+this._location.height-this._startFrameShape.style.y,this._endFrameShape.style.height=this._fillerShae.style.y-this._location.y),this.zr.modShape(this._startFrameShape.id),this.zr.modShape(this._endFrameShape.id)},_syncShape:function(){this.zoomOption.show&&("horizontal"==this.zoomOption.orient?(this._startShape.style.x=this._location.x+this._zoom.start/100*this._location.width,this._endShape.style.x=this._location.x+this._zoom.end/100*this._location.width-this._handleSize,this._fillerShae.style.x=this._startShape.style.x+this._handleSize,this._fillerShae.style.width=this._endShape.style.x-this._startShape.style.x-this._handleSize):(this._startShape.style.y=this._location.y+this._location.height-this._zoom.start/100*this._location.height,this._endShape.style.y=this._location.y+this._location.height-this._zoom.end/100*this._location.height-this._handleSize,this._fillerShae.style.y=this._endShape.style.y+this._handleSize,this._fillerShae.style.height=this._startShape.style.y-this._endShape.style.y-this._handleSize),this.zr.modShape(this._startShape.id),this.zr.modShape(this._endShape.id),this.zr.modShape(this._fillerShae.id),this._syncFrameShape(),this.zr.refresh())},_syncData:function(e){var t,i,n,a,o;for(var s in this._originalData){t=this._originalData[s];for(var l in t)o=t[l],null!=o&&(a=o.length,i=Math.floor(this._zoom.start/100*a),n=Math.ceil(this._zoom.end/100*a),this.getDataFromOption(o[0])instanceof Array&&this.option[s][l].type!=r.CHART_TYPE_K?(this._setScale(),this.option[s][l].data=this._synScatterData(l,o)):this.option[s][l].data=o.slice(i,n))}this._isSilence||!this.zoomOption.realtime&&!e||this.messageCenter.dispatch(r.EVENT.DATA_ZOOM,null,{zoom:this._zoom},this.myChart)},_synScatterData:function(e,t){if(0===this._zoom.start&&100==this._zoom.end&&0===this._zoom.start2&&100==this._zoom.end2)return t;var i,n,a,o,r,s=[],l=this._zoom.scatterMap[e];
-
-"horizontal"==this.zoomOption.orient?(i=l.x.max-l.x.min,n=this._zoom.start/100*i+l.x.min,a=this._zoom.end/100*i+l.x.min,i=l.y.max-l.y.min,o=this._zoom.start2/100*i+l.y.min,r=this._zoom.end2/100*i+l.y.min):(i=l.x.max-l.x.min,n=this._zoom.start2/100*i+l.x.min,a=this._zoom.end2/100*i+l.x.min,i=l.y.max-l.y.min,o=this._zoom.start/100*i+l.y.min,r=this._zoom.end/100*i+l.y.min);var h;(h=l.x.dataMappingMethods)&&(n=h.coord2Value(n),a=h.coord2Value(a)),(h=l.y.dataMappingMethods)&&(o=h.coord2Value(o),r=h.coord2Value(r));for(var m,V=0,U=t.length;U>V;V++)m=t[V].value||t[V],m[0]>=n&&m[0]<=a&&m[1]>=o&&m[1]<=r&&s.push(t[V]);return s},_setScale:function(){var e=0!==this._zoom.start||100!==this._zoom.end||0!==this._zoom.start2||100!==this._zoom.end2,t={xAxis:this.option.xAxis,yAxis:this.option.yAxis};for(var i in t)for(var n=0,a=t[i].length;a>n;n++)t[i][n].scale=e||t[i][n]._scale},_backupScale:function(){var e={xAxis:this.option.xAxis,yAxis:this.option.yAxis};for(var t in e)for(var i=0,n=e[t].length;n>i;i++)e[t][i]._scale=e[t][i].scale},_getDetail:function(){for(var e=["xAxis","yAxis"],t=0,i=e.length;i>t;t++){var n=this._originalData[e[t]];for(var a in n){var o=n[a];if(null!=o){var r=o.length,l=Math.floor(this._zoom.start/100*r),h=Math.ceil(this._zoom.end/100*r);return h-=h>0?1:0,{start:this.getDataFromOption(o[l]),end:this.getDataFromOption(o[h])}}}}e="horizontal"==this.zoomOption.orient?"xAxis":"yAxis";var m=this._zoom.seriesIndex[0],V=this.option.series[m][e+"Index"]||0,U=this.option[e][V].type,d=this._zoom.scatterMap[m][e.charAt(0)].min,p=this._zoom.scatterMap[m][e.charAt(0)].max,c=p-d;if("value"==U)return{start:d+c*this._zoom.start/100,end:d+c*this._zoom.end/100};if("time"==U){p=d+c*this._zoom.end/100,d+=c*this._zoom.start/100;var u=s.getAutoFormatter(d,p).formatter;return{start:s.format(u,d),end:s.format(u,p)}}return{start:"",end:""}},__ondrift:function(e,t,i){this.zoomOption.zoomLock&&(e=this._fillerShae);var n="filler"==e._type?this._handleSize:0;if("horizontal"==this.zoomOption.orient?e.style.x+t-n<=this._location.x?e.style.x=this._location.x+n:e.style.x+t+e.style.width+n>=this._location.x+this._location.width?e.style.x=this._location.x+this._location.width-e.style.width-n:e.style.x+=t:e.style.y+i-n<=this._location.y?e.style.y=this._location.y+n:e.style.y+i+e.style.height+n>=this._location.y+this._location.height?e.style.y=this._location.y+this._location.height-e.style.height-n:e.style.y+=i,"filler"==e._type?this._syncHandleShape():this._syncFillerShape(),this.zoomOption.realtime&&this._syncData(),this.zoomOption.showDetail){var a=this._getDetail();this._startShape.style.text=this._startShape.highlightStyle.text=a.start,this._endShape.style.text=this._endShape.highlightStyle.text=a.end,this._startShape.style.textPosition=this._startShape.highlightStyle.textPosition,this._endShape.style.textPosition=this._endShape.highlightStyle.textPosition}return!0},__ondragend:function(){this.zoomOption.showDetail&&(this._startShape.style.text=this._endShape.style.text="=",this._startShape.style.textPosition=this._endShape.style.textPosition="inside",this.zr.modShape(this._startShape.id),this.zr.modShape(this._endShape.id),this.zr.refreshNextFrame()),this.isDragend=!0},ondragend:function(e,t){this.isDragend&&e.target&&(!this.zoomOption.realtime&&this._syncData(),t.dragOut=!0,t.dragIn=!0,this._isSilence||this.zoomOption.realtime||this.messageCenter.dispatch(r.EVENT.DATA_ZOOM,null,{zoom:this._zoom},this.myChart),t.needRefresh=!1,this.isDragend=!1)},ondataZoom:function(e,t){t.needRefresh=!0},absoluteZoom:function(e){this._zoom.start=e.start,this._zoom.end=e.end,this._zoom.start2=e.start2,this._zoom.end2=e.end2,this._syncShape(),this._syncData(!0)},rectZoom:function(e){if(!e)return this._zoom.start=this._zoom.start2=0,this._zoom.end=this._zoom.end2=100,this._syncShape(),this._syncData(!0),this._zoom;var t=this.component.grid.getArea(),i={x:e.x,y:e.y,width:e.width,height:e.height};if(i.width<0&&(i.x+=i.width,i.width=-i.width),i.height<0&&(i.y+=i.height,i.height=-i.height),i.x>t.x+t.width||i.y>t.y+t.height)return!1;i.x<t.x&&(i.x=t.x),i.x+i.width>t.x+t.width&&(i.width=t.x+t.width-i.x),i.y+i.height>t.y+t.height&&(i.height=t.y+t.height-i.y);var n,a=(i.x-t.x)/t.width,o=1-(i.x+i.width-t.x)/t.width,r=1-(i.y+i.height-t.y)/t.height,s=(i.y-t.y)/t.height;return"horizontal"==this.zoomOption.orient?(n=this._zoom.end-this._zoom.start,this._zoom.start+=n*a,this._zoom.end-=n*o,n=this._zoom.end2-this._zoom.start2,this._zoom.start2+=n*r,this._zoom.end2-=n*s):(n=this._zoom.end-this._zoom.start,this._zoom.start+=n*r,this._zoom.end-=n*s,n=this._zoom.end2-this._zoom.start2,this._zoom.start2+=n*a,this._zoom.end2-=n*o),this._syncShape(),this._syncData(!0),this._zoom},syncBackupData:function(e){for(var t,i,n=this._originalData.series,a=e.series,o=0,r=a.length;r>o;o++){i=a[o].data||a[o].eventList,t=n[o]?Math.floor(this._zoom.start/100*n[o].length):0;for(var s=0,l=i.length;l>s;s++)n[o]&&(n[o][s+t]=i[s])}},syncOption:function(e){this.silence(!0),this.option=e,this.option.dataZoom=this.reformOption(this.option.dataZoom),this.zoomOption=this.option.dataZoom,this.myChart.canvasSupported||(this.zoomOption.realtime=!1),this.clear(),this._location=this._getLocation(),this._zoom=this._getZoom(),this._backupData(),this.option.dataZoom&&this.option.dataZoom.show&&this._buildShape(),this._syncData(),this.silence(!1)},silence:function(e){this._isSilence=e},getRealDataIndex:function(e,t){if(!this._originalData||0===this._zoom.start&&100==this._zoom.end)return t;var i=this._originalData.series;return i[e]?Math.floor(this._zoom.start/100*i[e].length)+t:-1},resize:function(){this.clear(),this._location=this._getLocation(),this._zoom=this._getZoom(),this.option.dataZoom.show&&this._buildShape()}},l.inherits(t,i),e("../component").define("dataZoom",t),t}),i("echarts/component/categoryAxis",["require","./base","zrender/shape/Text","zrender/shape/Line","zrender/shape/Rectangle","../config","zrender/tool/util","zrender/tool/area","../component"],function(e){function t(e,t,n,a,o,r){if(a.data.length<1)return void console.error("option.data.length < 1.");i.call(this,e,t,n,a,o),this.grid=this.component.grid;for(var s in r)this[s]=r[s];this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Line"),o=e("zrender/shape/Rectangle"),r=e("../config");r.categoryAxis={zlevel:0,z:0,show:!0,position:"bottom",name:"",nameLocation:"end",nameTextStyle:{},boundaryGap:!0,axisLine:{show:!0,onZero:!0,lineStyle:{color:"#48b",width:2,type:"solid"}},axisTick:{show:!0,interval:"auto",inside:!1,length:5,lineStyle:{color:"#333",width:1}},axisLabel:{show:!0,interval:"auto",rotate:0,margin:8,textStyle:{color:"#333"}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}};var s=e("zrender/tool/util"),l=e("zrender/tool/area");return t.prototype={type:r.COMPONENT_TYPE_AXIS_CATEGORY,_getReformedLabel:function(e){var t=this.getDataFromOption(this.option.data[e]),i=this.option.data[e].formatter||this.option.axisLabel.formatter;return i&&("function"==typeof i?t=i.call(this.myChart,t):"string"==typeof i&&(t=i.replace("{value}",t))),t},_getInterval:function(){var e=this.option.axisLabel.interval;if("auto"==e){var t=this.option.axisLabel.textStyle.fontSize,i=this.option.data,n=this.option.data.length;if(this.isHorizontal())if(n>3){var a,o,r=this.getGap(),h=!1,m=Math.floor(.5/r);for(m=1>m?1:m,e=Math.floor(15/r);!h&&n>e;){e+=m,h=!0,a=Math.floor(r*e);for(var V=Math.floor((n-1)/e)*e;V>=0;V-=e){if(0!==this.option.axisLabel.rotate)o=t;else if(i[V].textStyle)o=l.getTextWidth(this._getReformedLabel(V),this.getFont(s.merge(i[V].textStyle,this.option.axisLabel.textStyle)));else{var U=this._getReformedLabel(V)+"",d=(U.match(/\w/g)||"").length,p=U.length-d;o=d*t*2/3+p*t}if(o>a){h=!1;break}}}}else e=1;else if(n>3){var r=this.getGap();for(e=Math.floor(11/r);t>r*e-6&&n>e;)e++}else e=1}else e="function"==typeof e?1:e-0+1;return e},_buildShape:function(){if(this._interval=this._getInterval(),this.option.show){this.option.splitArea.show&&this._buildSplitArea(),this.option.splitLine.show&&this._buildSplitLine(),this.option.axisLine.show&&this._buildAxisLine(),this.option.axisTick.show&&this._buildAxisTick(),this.option.axisLabel.show&&this._buildAxisLabel();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildAxisTick:function(){var e,t=this.option.data,i=this.option.data.length,n=this.option.axisTick,o=n.length,r=n.lineStyle.color,s=n.lineStyle.width,l="function"==typeof n.interval?n.interval:"auto"==n.interval&&"function"==typeof this.option.axisLabel.interval?this.option.axisLabel.interval:!1,h=l?1:"auto"==n.interval?this._interval:n.interval-0+1,m=n.onGap,V=m?this.getGap()/2:"undefined"==typeof m&&this.option.boundaryGap?this.getGap()/2:0,U=V>0?-h:0;if(this.isHorizontal())for(var d,p="bottom"==this.option.position?n.inside?this.grid.getYend()-o-1:this.grid.getYend()+1:n.inside?this.grid.getY()+1:this.grid.getY()-o-1,c=U;i>c;c+=h)(!l||l(c,t[c]))&&(d=this.subPixelOptimize(this.getCoordByIndex(c)+(c>=0?V:0),s),e={_axisShape:"axisTick",zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:d,yStart:p,xEnd:d,yEnd:p+o,strokeColor:r,lineWidth:s}},this.shapeList.push(new a(e)));else for(var u,y="left"==this.option.position?n.inside?this.grid.getX()+1:this.grid.getX()-o-1:n.inside?this.grid.getXend()-o-1:this.grid.getXend()+1,c=U;i>c;c+=h)(!l||l(c,t[c]))&&(u=this.subPixelOptimize(this.getCoordByIndex(c)-(c>=0?V:0),s),e={_axisShape:"axisTick",zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:y,yStart:u,xEnd:y+o,yEnd:u,strokeColor:r,lineWidth:s}},this.shapeList.push(new a(e)))},_buildAxisLabel:function(){var e,t,i=this.option.data,a=this.option.data.length,o=this.option.axisLabel,r=o.rotate,l=o.margin,h=o.clickable,m=o.textStyle,V="function"==typeof o.interval?o.interval:!1;if(this.isHorizontal()){var U,d;"bottom"==this.option.position?(U=this.grid.getYend()+l,d="top"):(U=this.grid.getY()-l,d="bottom");for(var p=0;a>p;p+=this._interval)V&&!V(p,i[p])||""===this._getReformedLabel(p)||(t=s.merge(i[p].textStyle||{},m),e={zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1,style:{x:this.getCoordByIndex(p),y:U,color:t.color,text:this._getReformedLabel(p),textFont:this.getFont(t),textAlign:t.align||"center",textBaseline:t.baseline||d}},r&&(e.style.textAlign=r>0?"bottom"==this.option.position?"right":"left":"bottom"==this.option.position?"left":"right",e.rotation=[r*Math.PI/180,e.style.x,e.style.y]),this.shapeList.push(new n(this._axisLabelClickable(h,e))))}else{var c,u;"left"==this.option.position?(c=this.grid.getX()-l,u="right"):(c=this.grid.getXend()+l,u="left");for(var p=0;a>p;p+=this._interval)V&&!V(p,i[p])||""===this._getReformedLabel(p)||(t=s.merge(i[p].textStyle||{},m),e={zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1,style:{x:c,y:this.getCoordByIndex(p),color:t.color,text:this._getReformedLabel(p),textFont:this.getFont(t),textAlign:t.align||u,textBaseline:t.baseline||0===p&&""!==this.option.name?"bottom":p==a-1&&""!==this.option.name?"top":"middle"}},r&&(e.rotation=[r*Math.PI/180,e.style.x,e.style.y]),this.shapeList.push(new n(this._axisLabelClickable(h,e))))}},_buildSplitLine:function(){var e,t=this.option.data,i=this.option.data.length,n=this.option.splitLine,o=n.lineStyle.type,r=n.lineStyle.width,s=n.lineStyle.color;s=s instanceof Array?s:[s];var l=s.length,h="function"==typeof this.option.axisLabel.interval?this.option.axisLabel.interval:!1,m=n.onGap,V=m?this.getGap()/2:"undefined"==typeof m&&this.option.boundaryGap?this.getGap()/2:0;if(i-=m||"undefined"==typeof m&&this.option.boundaryGap?1:0,this.isHorizontal())for(var U,d=this.grid.getY(),p=this.grid.getYend(),c=0;i>c;c+=this._interval)(!h||h(c,t[c]))&&(U=this.subPixelOptimize(this.getCoordByIndex(c)+V,r),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:U,yStart:d,xEnd:U,yEnd:p,strokeColor:s[c/this._interval%l],lineType:o,lineWidth:r}},this.shapeList.push(new a(e)));else for(var u,y=this.grid.getX(),g=this.grid.getXend(),c=0;i>c;c+=this._interval)(!h||h(c,t[c]))&&(u=this.subPixelOptimize(this.getCoordByIndex(c)-V,r),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:y,yStart:u,xEnd:g,yEnd:u,strokeColor:s[c/this._interval%l],lineType:o,lineWidth:r}},this.shapeList.push(new a(e)))},_buildSplitArea:function(){var e,t=this.option.data,i=this.option.splitArea,n=i.areaStyle.color;if(n instanceof Array){var a=n.length,r=this.option.data.length,s="function"==typeof this.option.axisLabel.interval?this.option.axisLabel.interval:!1,l=i.onGap,h=l?this.getGap()/2:"undefined"==typeof l&&this.option.boundaryGap?this.getGap()/2:0;if(this.isHorizontal())for(var m,V=this.grid.getY(),U=this.grid.getHeight(),d=this.grid.getX(),p=0;r>=p;p+=this._interval)s&&!s(p,t[p])&&r>p||(m=r>p?this.getCoordByIndex(p)+h:this.grid.getXend(),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:d,y:V,width:m-d,height:U,color:n[p/this._interval%a]}},this.shapeList.push(new o(e)),d=m);else for(var c,u=this.grid.getX(),y=this.grid.getWidth(),g=this.grid.getYend(),p=0;r>=p;p+=this._interval)s&&!s(p,t[p])&&r>p||(c=r>p?this.getCoordByIndex(p)-h:this.grid.getY(),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:u,y:c,width:y,height:g-c,color:n[p/this._interval%a]}},this.shapeList.push(new o(e)),g=c)}else e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this.grid.getX(),y:this.grid.getY(),width:this.grid.getWidth(),height:this.grid.getHeight(),color:n}},this.shapeList.push(new o(e))},refresh:function(e){e&&(this.option=this.reformOption(e),this.option.axisLabel.textStyle=this.getTextStyle(this.option.axisLabel.textStyle)),this.clear(),this._buildShape()},getGap:function(){var e=this.option.data.length,t=this.isHorizontal()?this.grid.getWidth():this.grid.getHeight();return this.option.boundaryGap?t/e:t/(e>1?e-1:1)},getCoord:function(e){for(var t=this.option.data,i=t.length,n=this.getGap(),a=this.option.boundaryGap?n/2:0,o=0;i>o;o++){if(this.getDataFromOption(t[o])==e)return a=this.isHorizontal()?this.grid.getX()+a:this.grid.getYend()-a;a+=n}},getCoordByIndex:function(e){if(0>e)return this.isHorizontal()?this.grid.getX():this.grid.getYend();if(e>this.option.data.length-1)return this.isHorizontal()?this.grid.getXend():this.grid.getY();var t=this.getGap(),i=this.option.boundaryGap?t/2:0;return i+=e*t,i=this.isHorizontal()?this.grid.getX()+i:this.grid.getYend()-i},getNameByIndex:function(e){return this.getDataFromOption(this.option.data[e])},getIndexByName:function(e){for(var t=this.option.data,i=t.length,n=0;i>n;n++)if(this.getDataFromOption(t[n])==e)return n;return-1},getValueFromCoord:function(){return""},isMainAxis:function(e){return e%this._interval===0}},s.inherits(t,i),e("../component").define("categoryAxis",t),t}),i("echarts/component/valueAxis",["require","./base","zrender/shape/Text","zrender/shape/Line","zrender/shape/Rectangle","../config","../util/date","zrender/tool/util","../util/smartSteps","../util/accMath","../util/smartLogSteps","../component"],function(e){function t(e,t,n,a,o,r,s){if(!s||0===s.length)return void console.err("option.series.length == 0.");i.call(this,e,t,n,a,o),this.series=s,this.grid=this.component.grid;for(var l in r)this[l]=r[l];this.refresh(a,s)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Line"),o=e("zrender/shape/Rectangle"),r=e("../config");r.valueAxis={zlevel:0,z:0,show:!0,position:"left",name:"",nameLocation:"end",nameTextStyle:{},boundaryGap:[0,0],axisLine:{show:!0,onZero:!0,lineStyle:{color:"#48b",width:2,type:"solid"}},axisTick:{show:!1,inside:!1,length:5,lineStyle:{color:"#333",width:1}},axisLabel:{show:!0,rotate:0,margin:8,textStyle:{color:"#333"}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}};var s=e("../util/date"),l=e("zrender/tool/util");return t.prototype={type:r.COMPONENT_TYPE_AXIS_VALUE,_buildShape:function(){if(this._hasData=!1,this._calculateValue(),this._hasData&&this.option.show){this.option.splitArea.show&&this._buildSplitArea(),this.option.splitLine.show&&this._buildSplitLine(),this.option.axisLine.show&&this._buildAxisLine(),this.option.axisTick.show&&this._buildAxisTick(),this.option.axisLabel.show&&this._buildAxisLabel();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildAxisTick:function(){var e,t=this._valueList,i=this._valueList.length,n=this.option.axisTick,o=n.length,r=n.lineStyle.color,s=n.lineStyle.width;if(this.isHorizontal())for(var l,h="bottom"===this.option.position?n.inside?this.grid.getYend()-o-1:this.grid.getYend()+1:n.inside?this.grid.getY()+1:this.grid.getY()-o-1,m=0;i>m;m++)l=this.subPixelOptimize(this.getCoord(t[m]),s),e={_axisShape:"axisTick",zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:l,yStart:h,xEnd:l,yEnd:h+o,strokeColor:r,lineWidth:s}},this.shapeList.push(new a(e));else for(var V,U="left"===this.option.position?n.inside?this.grid.getX()+1:this.grid.getX()-o-1:n.inside?this.grid.getXend()-o-1:this.grid.getXend()+1,m=0;i>m;m++)V=this.subPixelOptimize(this.getCoord(t[m]),s),e={_axisShape:"axisTick",zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:U,yStart:V,xEnd:U+o,yEnd:V,strokeColor:r,lineWidth:s}},this.shapeList.push(new a(e))},_buildAxisLabel:function(){var e,t=this._valueList,i=this._valueList.length,a=this.option.axisLabel.rotate,o=this.option.axisLabel.margin,r=this.option.axisLabel.clickable,s=this.option.axisLabel.textStyle;if(this.isHorizontal()){var l,h;"bottom"===this.option.position?(l=this.grid.getYend()+o,h="top"):(l=this.grid.getY()-o,h="bottom");for(var m=0;i>m;m++)e={zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1,style:{x:this.getCoord(t[m]),y:l,color:"function"==typeof s.color?s.color(t[m]):s.color,text:this._valueLabel[m],textFont:this.getFont(s),textAlign:s.align||"center",textBaseline:s.baseline||h}},a&&(e.style.textAlign=a>0?"bottom"===this.option.position?"right":"left":"bottom"===this.option.position?"left":"right",e.rotation=[a*Math.PI/180,e.style.x,e.style.y]),this.shapeList.push(new n(this._axisLabelClickable(r,e)))}else{var V,U;"left"===this.option.position?(V=this.grid.getX()-o,U="right"):(V=this.grid.getXend()+o,U="left");for(var m=0;i>m;m++)e={zlevel:this.getZlevelBase(),z:this.getZBase()+3,hoverable:!1,style:{x:V,y:this.getCoord(t[m]),color:"function"==typeof s.color?s.color(t[m]):s.color,text:this._valueLabel[m],textFont:this.getFont(s),textAlign:s.align||U,textBaseline:s.baseline||(0===m&&""!==this.option.name?"bottom":m===i-1&&""!==this.option.name?"top":"middle")}},a&&(e.rotation=[a*Math.PI/180,e.style.x,e.style.y]),this.shapeList.push(new n(this._axisLabelClickable(r,e)))}},_buildSplitLine:function(){var e,t=this._valueList,i=this._valueList.length,n=this.option.splitLine,o=n.lineStyle.type,r=n.lineStyle.width,s=n.lineStyle.color;s=s instanceof Array?s:[s];var l=s.length;if(this.isHorizontal())for(var h,m=this.grid.getY(),V=this.grid.getYend(),U=0;i>U;U++)h=this.subPixelOptimize(this.getCoord(t[U]),r),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:h,yStart:m,xEnd:h,yEnd:V,strokeColor:s[U%l],lineType:o,lineWidth:r}},this.shapeList.push(new a(e));else for(var d,p=this.grid.getX(),c=this.grid.getXend(),U=0;i>U;U++)d=this.subPixelOptimize(this.getCoord(t[U]),r),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:p,yStart:d,xEnd:c,yEnd:d,strokeColor:s[U%l],lineType:o,lineWidth:r}},this.shapeList.push(new a(e))},_buildSplitArea:function(){var e,t=this.option.splitArea.areaStyle.color;if(t instanceof Array){var i=t.length,n=this._valueList,a=this._valueList.length;if(this.isHorizontal())for(var r,s=this.grid.getY(),l=this.grid.getHeight(),h=this.grid.getX(),m=0;a>=m;m++)r=a>m?this.getCoord(n[m]):this.grid.getXend(),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:h,y:s,width:r-h,height:l,color:t[m%i]}},this.shapeList.push(new o(e)),h=r;else for(var V,U=this.grid.getX(),d=this.grid.getWidth(),p=this.grid.getYend(),m=0;a>=m;m++)V=a>m?this.getCoord(n[m]):this.grid.getY(),e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:U,y:V,width:d,height:p-V,color:t[m%i]}},this.shapeList.push(new o(e)),p=V}else e={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this.grid.getX(),y:this.grid.getY(),width:this.grid.getWidth(),height:this.grid.getHeight(),color:t}},this.shapeList.push(new o(e))},_calculateValue:function(){if(isNaN(this.option.min-0)||isNaN(this.option.max-0)){for(var e,t,i={},n=this.component.legend,a=0,o=this.series.length;o>a;a++)!(this.series[a].type!=r.CHART_TYPE_LINE&&this.series[a].type!=r.CHART_TYPE_BAR&&this.series[a].type!=r.CHART_TYPE_SCATTER&&this.series[a].type!=r.CHART_TYPE_K&&this.series[a].type!=r.CHART_TYPE_EVENTRIVER||n&&!n.isSelected(this.series[a].name)||(e=this.series[a].xAxisIndex||0,t=this.series[a].yAxisIndex||0,this.option.xAxisIndex!=e&&this.option.yAxisIndex!=t||!this._calculSum(i,a)));var s;for(var a in i){s=i[a];for(var l=0,h=s.length;h>l;l++)if(!isNaN(s[l])){this._hasData=!0,this._min=s[l],this._max=s[l];break}if(this._hasData)break}for(var a in i){s=i[a];for(var l=0,h=s.length;h>l;l++)isNaN(s[l])||(this._min=Math.min(this._min,s[l]),this._max=Math.max(this._max,s[l]))}var m="log"!==this.option.type?this.option.boundaryGap:[0,0],V=Math.abs(this._max-this._min);this._min=isNaN(this.option.min-0)?this._min-Math.abs(V*m[0]):this.option.min-0,this._max=isNaN(this.option.max-0)?this._max+Math.abs(V*m[1]):this.option.max-0,this._min===this._max&&(0===this._max?this._max=1:this._max>0?this._min=this._max/this.option.splitNumber!=null?this.option.splitNumber:5:this._max=this._max/this.option.splitNumber!=null?this.option.splitNumber:5),"time"===this.option.type?this._reformTimeValue():"log"===this.option.type?this._reformLogValue():this._reformValue(this.option.scale)}else this._hasData=!0,this._min=this.option.min-0,this._max=this.option.max-0,"time"===this.option.type?this._reformTimeValue():"log"===this.option.type?this._reformLogValue():this._customerValue()},_calculSum:function(e,t){var i,n,a=this.series[t].name||"kener";if(this.series[t].stack){var o="__Magic_Key_Positive__"+this.series[t].stack,l="__Magic_Key_Negative__"+this.series[t].stack;e[o]=e[o]||[],e[l]=e[l]||[],e[a]=e[a]||[],n=this.series[t].data;for(var h=0,m=n.length;m>h;h++)i=this.getDataFromOption(n[h]),"-"!==i&&(i-=0,i>=0?null!=e[o][h]?e[o][h]+=i:e[o][h]=i:null!=e[l][h]?e[l][h]+=i:e[l][h]=i,this.option.scale&&e[a].push(i))}else if(e[a]=e[a]||[],this.series[t].type!=r.CHART_TYPE_EVENTRIVER){n=this.series[t].data;for(var h=0,m=n.length;m>h;h++)i=this.getDataFromOption(n[h]),this.series[t].type===r.CHART_TYPE_K?(e[a].push(i[0]),e[a].push(i[1]),e[a].push(i[2]),e[a].push(i[3])):i instanceof Array?(-1!=this.option.xAxisIndex&&e[a].push("time"!=this.option.type?i[0]:s.getNewDate(i[0])),-1!=this.option.yAxisIndex&&e[a].push("time"!=this.option.type?i[1]:s.getNewDate(i[1]))):e[a].push(i)}else{n=this.series[t].data;for(var h=0,m=n.length;m>h;h++)for(var V=n[h].evolution,U=0,d=V.length;d>U;U++)e[a].push(s.getNewDate(V[U].time))}},_reformValue:function(t){var i=e("../util/smartSteps"),n=this.option.splitNumber;!t&&this._min>=0&&this._max>=0&&(this._min=0),!t&&this._min<=0&&this._max<=0&&(this._max=0);var a=i(this._min,this._max,n);n=null!=n?n:a.secs,this._min=a.min,this._max=a.max,this._valueList=a.pnts,this._reformLabelData()},_reformTimeValue:function(){var e=null!=this.option.splitNumber?this.option.splitNumber:5,t=s.getAutoFormatter(this._min,this._max,e),i=t.formatter,n=t.gapValue;this._valueList=[s.getNewDate(this._min)];var a;switch(i){case"week":a=s.nextMonday(this._min);break;case"month":a=s.nextNthOnMonth(this._min,1);break;case"quarter":a=s.nextNthOnQuarterYear(this._min,1);break;case"half-year":a=s.nextNthOnHalfYear(this._min,1);break;case"year":a=s.nextNthOnYear(this._min,1);break;default:72e5>=n?a=(Math.floor(this._min/n)+1)*n:(a=s.getNewDate(this._min- -n),a.setHours(6*Math.round(a.getHours()/6)),a.setMinutes(0),a.setSeconds(0))}for(a-this._min<n/2&&(a-=-n),t=s.getNewDate(a),e*=1.5;e-->=0&&(("month"==i||"quarter"==i||"half-year"==i||"year"==i)&&t.setDate(1),!(this._max-t<n/2));)this._valueList.push(t),t=s.getNewDate(t- -n);this._valueList.push(s.getNewDate(this._max)),this._reformLabelData(function(e){return function(t){return s.format(e,t)}}(i))},_customerValue:function(){var t=e("../util/accMath"),i=null!=this.option.splitNumber?this.option.splitNumber:5,n=(this._max-this._min)/i;this._valueList=[];for(var a=0;i>=a;a++)this._valueList.push(t.accAdd(this._min,t.accMul(n,a)));this._reformLabelData()},_reformLogValue:function(){var t=this.option,i=e("../util/smartLogSteps")({dataMin:this._min,dataMax:this._max,logPositive:t.logPositive,logLabelBase:t.logLabelBase,splitNumber:t.splitNumber});this._min=i.dataMin,this._max=i.dataMax,this._valueList=i.tickList,this._dataMappingMethods=i.dataMappingMethods,this._reformLabelData(i.labelFormatter)},_reformLabelData:function(e){this._valueLabel=[];var t=this.option.axisLabel.formatter;if(t)for(var i=0,n=this._valueList.length;n>i;i++)"function"==typeof t?this._valueLabel.push(e?t.call(this.myChart,this._valueList[i],e):t.call(this.myChart,this._valueList[i])):"string"==typeof t&&this._valueLabel.push(e?s.format(t,this._valueList[i]):t.replace("{value}",this._valueList[i]));else for(var i=0,n=this._valueList.length;n>i;i++)this._valueLabel.push(e?e(this._valueList[i]):this.numAddCommas(this._valueList[i]))},getExtremum:function(){this._calculateValue();var e=this._dataMappingMethods;return{min:this._min,max:this._max,dataMappingMethods:e?l.merge({},e):null}},refresh:function(e,t){e&&(this.option=this.reformOption(e),this.option.axisLabel.textStyle=l.merge(this.option.axisLabel.textStyle||{},this.ecTheme.textStyle),this.series=t),this.zr&&(this.clear(),this._buildShape())},getCoord:function(e){this._dataMappingMethods&&(e=this._dataMappingMethods.value2Coord(e)),e=e<this._min?this._min:e,e=e>this._max?this._max:e;var t;return t=this.isHorizontal()?this.grid.getX()+(e-this._min)/(this._max-this._min)*this.grid.getWidth():this.grid.getYend()-(e-this._min)/(this._max-this._min)*this.grid.getHeight()},getCoordSize:function(e){return Math.abs(this.isHorizontal()?e/(this._max-this._min)*this.grid.getWidth():e/(this._max-this._min)*this.grid.getHeight())},getValueFromCoord:function(e){var t;return this.isHorizontal()?(e=e<this.grid.getX()?this.grid.getX():e,e=e>this.grid.getXend()?this.grid.getXend():e,t=this._min+(e-this.grid.getX())/this.grid.getWidth()*(this._max-this._min)):(e=e<this.grid.getY()?this.grid.getY():e,e=e>this.grid.getYend()?this.grid.getYend():e,t=this._max-(e-this.grid.getY())/this.grid.getHeight()*(this._max-this._min)),this._dataMappingMethods&&(t=this._dataMappingMethods.coord2Value(t)),t.toFixed(2)-0},isMaindAxis:function(e){for(var t=0,i=this._valueList.length;i>t;t++)if(this._valueList[t]===e)return!0;return!1}},l.inherits(t,i),e("../component").define("valueAxis",t),t}),i("echarts/util/date",[],function(){function e(e,t,i){i=i>1?i:2;for(var n,a,o,r,s=0,l=m.length;l>s;s++)if(n=m[s].value,a=Math.ceil(t/n)*n-Math.floor(e/n)*n,Math.round(a/n)<=1.2*i){o=m[s].formatter,r=m[s].value;break}return null==o&&(o="year",n=317088e5,a=Math.ceil(t/n)*n-Math.floor(e/n)*n,r=Math.round(a/(i-1)/n)*n),{formatter:o,gapValue:r}}function t(e){return 10>e?"0"+e:e}function i(e,i){("week"==e||"month"==e||"quarter"==e||"half-year"==e||"year"==e)&&(e="MM - dd\nyyyy");var n=h(i),a=n.getFullYear(),o=n.getMonth()+1,r=n.getDate(),s=n.getHours(),l=n.getMinutes(),m=n.getSeconds();return e=e.replace("MM",t(o)),e=e.toLowerCase(),e=e.replace("yyyy",a),e=e.replace("yy",a%100),e=e.replace("dd",t(r)),e=e.replace("d",r),e=e.replace("hh",t(s)),e=e.replace("h",s),e=e.replace("mm",t(l)),e=e.replace("m",l),e=e.replace("ss",t(m)),e=e.replace("s",m)}function n(e){return e=h(e),e.setDate(e.getDate()+8-e.getDay()),e}function a(e,t,i){return e=h(e),e.setMonth(Math.ceil((e.getMonth()+1)/i)*i),e.setDate(t),e}function o(e,t){return a(e,t,1)}function r(e,t){return a(e,t,3)}function s(e,t){return a(e,t,6)}function l(e,t){return a(e,t,12)}function h(e){return e instanceof Date?e:new Date("string"==typeof e?e.replace(/-/g,"/"):e)}var m=[{formatter:"hh : mm : ss",value:1e3},{formatter:"hh : mm : ss",value:5e3},{formatter:"hh : mm : ss",value:1e4},{formatter:"hh : mm : ss",value:15e3},{formatter:"hh : mm : ss",value:3e4},{formatter:"hh : mm\nMM - dd",value:6e4},{formatter:"hh : mm\nMM - dd",value:3e5},{formatter:"hh : mm\nMM - dd",value:6e5},{formatter:"hh : mm\nMM - dd",value:9e5},{formatter:"hh : mm\nMM - dd",value:18e5},{formatter:"hh : mm\nMM - dd",value:36e5},{formatter:"hh : mm\nMM - dd",value:72e5},{formatter:"hh : mm\nMM - dd",value:216e5},{formatter:"hh : mm\nMM - dd",value:432e5},{formatter:"MM - dd\nyyyy",value:864e5},{formatter:"week",value:6048e5},{formatter:"month",value:26784e5},{formatter:"quarter",value:8208e6},{formatter:"half-year",value:16416e6},{formatter:"year",value:32832e6}];return{getAutoFormatter:e,getNewDate:h,format:i,nextMonday:n,nextNthPerNmonth:a,nextNthOnMonth:o,nextNthOnQuarterYear:r,nextNthOnHalfYear:s,nextNthOnYear:l}}),i("echarts/util/smartSteps",[],function(){function e(e){return X.log(I(e))/X.LN10}function t(e){return X.pow(10,e)}function i(e){return e===w(e)}function n(e,t,n,a){b=a||{},f=b.steps||L,k=b.secs||W,n=v(+n||0)%99,e=+e||0,t=+t||0,x=_=0,"min"in b&&(e=+b.min||0,x=1),"max"in b&&(t=+b.max||0,_=1),e>t&&(t=[e,e=t][0]);var o=t-e;if(x&&_)return g(e,t,n);if((n||5)>o){if(i(e)&&i(t))return d(e,t,n);if(0===o)return p(e,t,n)}return h(e,t,n)}function a(e,i,n,a){a=a||0;var s=o((i-e)/n,-1),l=o(e,-1,1),h=o(i,-1),m=X.min(s.e,l.e,h.e);0===l.c?m=X.min(s.e,h.e):0===h.c&&(m=X.min(s.e,l.e)),r(s,{c:0,e:m}),r(l,s,1),r(h,s),a+=m,e=l.c,i=h.c;for(var V=(i-e)/n,U=t(a),d=0,p=[],c=n+1;c--;)p[c]=(e+V*c)*U;if(0>a){d=u(U),V=+(V*U).toFixed(d),e=+(e*U).toFixed(d),i=+(i*U).toFixed(d);for(var c=p.length;c--;)p[c]=p[c].toFixed(d),0===+p[c]&&(p[c]="0")}else e*=U,i*=U,V*=U;return k=0,f=0,b=0,{min:e,max:i,secs:n,step:V,fix:d,exp:a,pnts:p}}function o(n,a,o){a=v(a%10)||2,0>a&&(i(n)?a=(""+I(n)).replace(/0+$/,"").length||1:(n=n.toFixed(15).replace(/0+$/,""),a=n.replace(".","").replace(/^[-0]+/,"").length,n=+n));var r=w(e(n))-a+1,s=+(n*t(-r)).toFixed(15)||0;return s=o?w(s):K(s),!s&&(r=0),(""+I(s)).length>a&&(r+=1,s/=10),{c:s,e:r}}function r(e,i,n){var a=i.e-e.e;a&&(e.e+=a,e.c*=t(-a),e.c=n?w(e.c):K(e.c))}function s(e,t,i){e.e<t.e?r(t,e,i):r(e,t,i)}function l(e,t){t=t||L,e=o(e);for(var i=e.c,n=0;i>t[n];)n++;if(!t[n])for(i/=10,e.e+=1,n=0;i>t[n];)n++;return e.c=t[n],e}function h(e,t,n){var s,h=n||+k.slice(-1),p=l((t-e)/h,f),u=o(t-e),g=o(e,-1,1),b=o(t,-1);if(r(u,p),r(g,p,1),r(b,p),n?s=V(g,b,h):h=m(g,b),i(e)&&i(t)&&e*t>=0){if(h>t-e)return d(e,t,h);h=U(e,t,n,g,b,h)}var L=c(e,t,g.c,b.c);return g.c=L[0],b.c=L[1],(x||_)&&y(e,t,g,b),a(g.c,b.c,h,b.e)}function m(e,i){for(var n,a,o,r,s=[],h=k.length;h--;)n=k[h],a=l((i.c-e.c)/n,f),a=a.c*t(a.e),o=w(e.c/a)*a,r=K(i.c/a)*a,s[h]={min:o,max:r,step:a,span:r-o};return s.sort(function(e,t){var i=e.span-t.span;return 0===i&&(i=e.step-t.step),i}),s=s[0],n=s.span/s.step,e.c=s.min,i.c=s.max,3>n?2*n:n}function V(e,i,n){for(var a,o,r=i.c,s=(i.c-e.c)/n-1;r>e.c;)s=l(s+1,f),s=s.c*t(s.e),a=s*n,o=K(i.c/s)*s,r=o-a;var h=e.c-r,m=o-i.c,V=h-m;return V>1.1*s&&(V=v(V/s/2)*s,r+=V,o+=V),e.c=r,i.c=o,s}function U(e,n,a,o,r,s){var l=r.c-o.c,h=l/s*t(r.e);if(!i(h)&&(h=w(h),l=h*s,n-e>l&&(h+=1,l=h*s,!a&&h*(s-1)>=n-e&&(s-=1,l=h*s)),l>=n-e)){var m=l-(n-e);o.c=v(e-m/2),r.c=v(n+m/2),o.e=0,r.e=0}return s}function d(e,t,i){if(i=i||5,x)t=e+i;else if(_)e=t-i;else{var n=i-(t-e),o=v(e-n/2),r=v(t+n/2),s=c(e,t,o,r);e=s[0],t=s[1]}return a(e,t,i)}function p(e,t,i){i=i||5;var n=X.min(I(t/i),i)/2.1;return x?t=e+n:_?e=t-n:(e-=n,t+=n),h(e,t,i)}function c(e,t,i,n){
-return e>=0&&0>i?(n-=i,i=0):0>=t&&n>0&&(i-=n,n=0),[i,n]}function u(e){return e=(+e).toFixed(15).split("."),e.pop().replace(/0+$/,"").length}function y(e,t,i,n){if(x){var a=o(e,4,1);i.e-a.e>6&&(a={c:0,e:i.e}),s(i,a),s(n,a),n.c+=a.c-i.c,i.c=a.c}else if(_){var r=o(t,4);n.e-r.e>6&&(r={c:0,e:n.e}),s(i,r),s(n,r),i.c+=r.c-n.c,n.c=r.c}}function g(e,t,i){var n=i?[i]:k,s=t-e;if(0===s)return t=o(t,3),i=n[0],t.c=v(t.c+i/2),a(t.c-i,t.c,i,t.e);I(t/s)<1e-6&&(t=0),I(e/s)<1e-6&&(e=0);var l,h,m,V=[[5,10],[10,2],[50,10],[100,2]],U=[],d=[],p=o(t-e,3),c=o(e,-1,1),u=o(t,-1);r(c,p,1),r(u,p),s=u.c-c.c,p.c=s;for(var y=n.length;y--;){i=n[y],l=K(s/i),h=l*i-s,m=3*(h+3),m+=2*(i-n[0]+2),i%5===0&&(m-=10);for(var g=V.length;g--;)l%V[g][0]===0&&(m/=V[g][1]);d[y]=[i,l,h,m].join(),U[y]={secs:i,step:l,delta:h,score:m}}return U.sort(function(e,t){return e.score-t.score}),U=U[0],c.c=v(c.c-U.delta/2),u.c=v(u.c+U.delta/2),a(c.c,u.c,U.secs,p.e)}var b,f,k,x,_,L=[10,20,25,50],W=[4,5,6],X=Math,v=X.round,w=X.floor,K=X.ceil,I=X.abs;return n}),i("echarts/util/smartLogSteps",["require","./number"],function(e){function t(e){return i(),u=e||{},n(),a(),[o(),i()][0]}function i(){U=u=g=c=b=f=y=k=d=p=null}function n(){d=u.logLabelBase,null==d?(p="plain",d=10,c=I):(d=+d,1>d&&(d=10),p="exponent",c=L(d)),y=u.splitNumber,null==y&&(y=E);var e=parseFloat(u.dataMin),t=parseFloat(u.dataMax);isFinite(e)||isFinite(t)?isFinite(e)?isFinite(t)?e>t&&(t=[e,e=t][0]):t=e:e=t:e=t=1,U=u.logPositive,null==U&&(U=t>0||0===e),b=U?e:-t,f=U?t:-e,S>b&&(b=S),S>f&&(f=S)}function a(){function e(){y>m&&(y=m);var e=w(l(m/y)),t=v(l(m/e)),i=e*t,n=(i-U)/2,a=w(l(r-n));V(a-r)&&(a-=1),g=-a*c;for(var s=a;o>=s-e;s+=e)k.push(W(d,s))}function t(){for(var e=i(h,0),t=e+2;t>e&&a(e+1)+n(e+1)*C<r;)e++;for(var l=i(s,0),t=l-2;l>t&&a(l-1)+n(l-1)*C>o;)l--;g=-(a(e)*I+n(e)*J);for(var m=e;l>=m;m++){var V=a(m),U=n(m);k.push(W(10,V)*W(2,U))}}function i(e,t){return 3*e+t}function n(e){return e-3*a(e)}function a(e){return w(l(e/3))}k=[];var o=l(L(f)/c),r=l(L(b)/c),s=v(o),h=w(r),m=s-h,U=o-r;"exponent"===p?e():F>=m&&y>F?t():e()}function o(){for(var e=[],t=0,i=k.length;i>t;t++)e[t]=(U?1:-1)*k[t];!U&&e.reverse();var n=s(),a=n.value2Coord,o=a(e[0]),l=a(e[e.length-1]);return o===l&&(o-=1,l+=1),{dataMin:o,dataMax:l,tickList:e,logPositive:U,labelFormatter:r(),dataMappingMethods:n}}function r(){if("exponent"===p){var e=d,t=c;return function(i){if(!isFinite(parseFloat(i)))return"";var n="";return 0>i&&(i=-i,n="-"),n+e+m(L(i)/t)}}return function(e){return isFinite(parseFloat(e))?x.addCommas(h(e)):""}}function s(){var e=U,t=g;return{value2Coord:function(i){return null==i||isNaN(i)||!isFinite(i)?i:(i=parseFloat(i),isFinite(i)?e&&S>i?i=S:!e&&i>-S&&(i=-S):i=S,i=X(i),(e?1:-1)*(L(i)+t))},coord2Value:function(i){return null==i||isNaN(i)||!isFinite(i)?i:(i=parseFloat(i),isFinite(i)||(i=S),e?W(K,i-t):-W(K,-i+t))}}}function l(e){return+Number(+e).toFixed(14)}function h(e){return Number(e).toFixed(15).replace(/\.?0*$/,"")}function m(e){e=h(Math.round(e));for(var t=[],i=0,n=e.length;n>i;i++){var a=e.charAt(i);t.push(T[a]||"")}return t.join("")}function V(e){return e>-S&&S>e}var U,d,p,c,u,y,g,b,f,k,x=e("./number"),_=Math,L=_.log,W=_.pow,X=_.abs,v=_.ceil,w=_.floor,K=_.E,I=_.LN10,J=_.LN2,C=J/I,S=1e-9,E=5,F=2,T={0:"â°",1:"¹",2:"²",3:"³",4:"â´",5:"âµ",6:"â¶",7:"â·",8:"â¸",9:"â¹","-":"â»"};return t}),i("echarts/chart/line",["require","./base","zrender/shape/Polyline","../util/shape/Icon","../util/shape/HalfSmoothPolygon","../component/axis","../component/grid","../component/dataZoom","../config","../util/ecData","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,i,a,o){n.call(this,e,t,i,a,o),this.refresh(a)}function i(e,t,i){var n=t.x,a=t.y,r=t.width,s=t.height,l=s/2;t.symbol.match("empty")&&(e.fillStyle="#fff"),t.brushType="both";var h=t.symbol.replace("empty","").toLowerCase();h.match("star")?(l=h.replace("star","")-0||5,a-=1,h="star"):("rectangle"===h||"arrow"===h)&&(n+=(r-s)/2,r=s);var m="";if(h.match("image")&&(m=h.replace(new RegExp("^image:\\/\\/"),""),h="image",n+=Math.round((r-s)/2)-1,r=s+=2),h=o.prototype.iconLibrary[h]){var V=t.x,U=t.y;e.moveTo(V,U+l),e.lineTo(V+5,U+l),e.moveTo(V+t.width-5,U+l),e.lineTo(V+t.width,U+l);var d=this;h(e,{x:n+4,y:a+4,width:r-8,height:s-8,n:l,image:m},function(){d.modSelf(),i()})}else e.moveTo(n,a+l),e.lineTo(n+r,a+l)}var n=e("./base"),a=e("zrender/shape/Polyline"),o=e("../util/shape/Icon"),r=e("../util/shape/HalfSmoothPolygon");e("../component/axis"),e("../component/grid"),e("../component/dataZoom");var s=e("../config");s.line={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,dataFilter:"nearest",itemStyle:{normal:{label:{show:!1},lineStyle:{width:2,type:"solid",shadowColor:"rgba(0,0,0,0)",shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0}},emphasis:{label:{show:!1}}},symbolSize:2,showAllSymbol:!1};var l=e("../util/ecData"),h=e("zrender/tool/util"),m=e("zrender/tool/color");return t.prototype={type:s.CHART_TYPE_LINE,_buildShape:function(){this.finalPLMap={},this._buildPosition()},_buildHorizontal:function(e,t,i,n){for(var a,o,r,s,l,h,m,V,U,d=this.series,p=i[0][0],c=d[p],u=this.component.xAxis.getAxis(c.xAxisIndex||0),y={},g=0,b=t;b>g&&null!=u.getNameByIndex(g);g++){o=u.getCoordByIndex(g);for(var f=0,k=i.length;k>f;f++){a=this.component.yAxis.getAxis(d[i[f][0]].yAxisIndex||0),l=s=m=h=a.getCoord(0);for(var x=0,_=i[f].length;_>x;x++)p=i[f][x],c=d[p],V=c.data[g],U=this.getDataFromOption(V,"-"),y[p]=y[p]||[],n[p]=n[p]||{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY,sum:0,counter:0,average:0},"-"!==U?(U>=0?(s-=x>0?a.getCoordSize(U):l-a.getCoord(U),r=s):0>U&&(h+=x>0?a.getCoordSize(U):a.getCoord(U)-m,r=h),y[p].push([o,r,g,u.getNameByIndex(g),o,l]),n[p].min>U&&(n[p].min=U,n[p].minY=r,n[p].minX=o),n[p].max<U&&(n[p].max=U,n[p].maxY=r,n[p].maxX=o),n[p].sum+=U,n[p].counter++):y[p].length>0&&(this.finalPLMap[p]=this.finalPLMap[p]||[],this.finalPLMap[p].push(y[p]),y[p]=[])}s=this.component.grid.getY();for(var L,f=0,k=i.length;k>f;f++)for(var x=0,_=i[f].length;_>x;x++)p=i[f][x],c=d[p],V=c.data[g],U=this.getDataFromOption(V,"-"),"-"==U&&this.deepQuery([V,c,this.option],"calculable")&&(L=this.deepQuery([V,c],"symbolSize"),s+=2*L+5,r=s,this.shapeList.push(this._getCalculableItem(p,g,u.getNameByIndex(g),o,r,"horizontal")))}for(var W in y)y[W].length>0&&(this.finalPLMap[W]=this.finalPLMap[W]||[],this.finalPLMap[W].push(y[W]),y[W]=[]);this._calculMarkMapXY(n,i,"y"),this._buildBorkenLine(e,this.finalPLMap,u,"horizontal")},_buildVertical:function(e,t,i,n){for(var a,o,r,s,l,h,m,V,U,d=this.series,p=i[0][0],c=d[p],u=this.component.yAxis.getAxis(c.yAxisIndex||0),y={},g=0,b=t;b>g&&null!=u.getNameByIndex(g);g++){r=u.getCoordByIndex(g);for(var f=0,k=i.length;k>f;f++){a=this.component.xAxis.getAxis(d[i[f][0]].xAxisIndex||0),l=s=m=h=a.getCoord(0);for(var x=0,_=i[f].length;_>x;x++)p=i[f][x],c=d[p],V=c.data[g],U=this.getDataFromOption(V,"-"),y[p]=y[p]||[],n[p]=n[p]||{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY,sum:0,counter:0,average:0},"-"!==U?(U>=0?(s+=x>0?a.getCoordSize(U):a.getCoord(U)-l,o=s):0>U&&(h-=x>0?a.getCoordSize(U):m-a.getCoord(U),o=h),y[p].push([o,r,g,u.getNameByIndex(g),l,r]),n[p].min>U&&(n[p].min=U,n[p].minX=o,n[p].minY=r),n[p].max<U&&(n[p].max=U,n[p].maxX=o,n[p].maxY=r),n[p].sum+=U,n[p].counter++):y[p].length>0&&(this.finalPLMap[p]=this.finalPLMap[p]||[],this.finalPLMap[p].push(y[p]),y[p]=[])}s=this.component.grid.getXend();for(var L,f=0,k=i.length;k>f;f++)for(var x=0,_=i[f].length;_>x;x++)p=i[f][x],c=d[p],V=c.data[g],U=this.getDataFromOption(V,"-"),"-"==U&&this.deepQuery([V,c,this.option],"calculable")&&(L=this.deepQuery([V,c],"symbolSize"),s-=2*L+5,o=s,this.shapeList.push(this._getCalculableItem(p,g,u.getNameByIndex(g),o,r,"vertical")))}for(var W in y)y[W].length>0&&(this.finalPLMap[W]=this.finalPLMap[W]||[],this.finalPLMap[W].push(y[W]),y[W]=[]);this._calculMarkMapXY(n,i,"x"),this._buildBorkenLine(e,this.finalPLMap,u,"vertical")},_buildOther:function(e,t,i,n){for(var a,o=this.series,r={},s=0,l=i.length;l>s;s++)for(var h=0,m=i[s].length;m>h;h++){var V=i[s][h],U=o[V];a=this.component.xAxis.getAxis(U.xAxisIndex||0);var d=this.component.yAxis.getAxis(U.yAxisIndex||0),p=d.getCoord(0);r[V]=r[V]||[],n[V]=n[V]||{min0:Number.POSITIVE_INFINITY,min1:Number.POSITIVE_INFINITY,max0:Number.NEGATIVE_INFINITY,max1:Number.NEGATIVE_INFINITY,sum0:0,sum1:0,counter0:0,counter1:0,average0:0,average1:0};for(var c=0,u=U.data.length;u>c;c++){var y=U.data[c],g=this.getDataFromOption(y,"-");if(g instanceof Array){var b=a.getCoord(g[0]),f=d.getCoord(g[1]);r[V].push([b,f,c,g[0],b,p]),n[V].min0>g[0]&&(n[V].min0=g[0],n[V].minY0=f,n[V].minX0=b),n[V].max0<g[0]&&(n[V].max0=g[0],n[V].maxY0=f,n[V].maxX0=b),n[V].sum0+=g[0],n[V].counter0++,n[V].min1>g[1]&&(n[V].min1=g[1],n[V].minY1=f,n[V].minX1=b),n[V].max1<g[1]&&(n[V].max1=g[1],n[V].maxY1=f,n[V].maxX1=b),n[V].sum1+=g[1],n[V].counter1++}}}for(var k in r)r[k].length>0&&(this.finalPLMap[k]=this.finalPLMap[k]||[],this.finalPLMap[k].push(r[k]),r[k]=[]);this._calculMarkMapXY(n,i,"xy"),this._buildBorkenLine(e,this.finalPLMap,a,"other")},_buildBorkenLine:function(e,t,i,n){for(var o,s="other"==n?"horizontal":n,V=this.series,U=e.length-1;U>=0;U--){var d=e[U],p=V[d],c=t[d];if(p.type===this.type&&null!=c)for(var u=this._getBbox(d,s),y=this._sIndex2ColorMap[d],g=this.query(p,"itemStyle.normal.lineStyle.width"),b=this.query(p,"itemStyle.normal.lineStyle.type"),f=this.query(p,"itemStyle.normal.lineStyle.color"),k=this.getItemStyleColor(this.query(p,"itemStyle.normal.color"),d,-1),x=null!=this.query(p,"itemStyle.normal.areaStyle"),_=this.query(p,"itemStyle.normal.areaStyle.color"),L=0,W=c.length;W>L;L++){var X=c[L],v="other"!=n&&this._isLarge(s,X);if(v)X=this._getLargePointList(s,X,p.dataFilter);else for(var w=0,K=X.length;K>w;w++)o=p.data[X[w][2]],(this.deepQuery([o,p,this.option],"calculable")||this.deepQuery([o,p],"showAllSymbol")||"categoryAxis"===i.type&&i.isMainAxis(X[w][2])&&"none"!=this.deepQuery([o,p],"symbol"))&&this.shapeList.push(this._getSymbol(d,X[w][2],X[w][3],X[w][0],X[w][1],s));var I=new a({zlevel:p.zlevel,z:p.z,style:{miterLimit:g,pointList:X,strokeColor:f||k||y,lineWidth:g,lineType:b,smooth:this._getSmooth(p.smooth),smoothConstraint:u,shadowColor:this.query(p,"itemStyle.normal.lineStyle.shadowColor"),shadowBlur:this.query(p,"itemStyle.normal.lineStyle.shadowBlur"),shadowOffsetX:this.query(p,"itemStyle.normal.lineStyle.shadowOffsetX"),shadowOffsetY:this.query(p,"itemStyle.normal.lineStyle.shadowOffsetY")},hoverable:!1,_main:!0,_seriesIndex:d,_orient:s});if(l.pack(I,V[d],d,0,L,V[d].name),this.shapeList.push(I),x){var J=new r({zlevel:p.zlevel,z:p.z,style:{miterLimit:g,pointList:h.clone(X).concat([[X[X.length-1][4],X[X.length-1][5]],[X[0][4],X[0][5]]]),brushType:"fill",smooth:this._getSmooth(p.smooth),smoothConstraint:u,color:_?_:m.alpha(y,.5)},highlightStyle:{brushType:"fill"},hoverable:!1,_main:!0,_seriesIndex:d,_orient:s});l.pack(J,V[d],d,0,L,V[d].name),this.shapeList.push(J)}}}},_getBbox:function(e,t){var i=this.component.grid.getBbox(),n=this.xMarkMap[e];return null!=n.minX0?[[Math.min(n.minX0,n.maxX0,n.minX1,n.maxX1),Math.min(n.minY0,n.maxY0,n.minY1,n.maxY1)],[Math.max(n.minX0,n.maxX0,n.minX1,n.maxX1),Math.max(n.minY0,n.maxY0,n.minY1,n.maxY1)]]:("horizontal"===t?(i[0][1]=Math.min(n.minY,n.maxY),i[1][1]=Math.max(n.minY,n.maxY)):(i[0][0]=Math.min(n.minX,n.maxX),i[1][0]=Math.max(n.minX,n.maxX)),i)},_isLarge:function(e,t){return t.length<2?!1:"horizontal"===e?Math.abs(t[0][0]-t[1][0])<.5:Math.abs(t[0][1]-t[1][1])<.5},_getLargePointList:function(e,t,i){var n;n="horizontal"===e?this.component.grid.getWidth():this.component.grid.getHeight();var a=t.length,o=[];if("function"!=typeof i)switch(i){case"min":i=function(e){return Math.max.apply(null,e)};break;case"max":i=function(e){return Math.min.apply(null,e)};break;case"average":i=function(e){for(var t=0,i=0;i<e.length;i++)t+=e[i];return t/e.length};break;default:i=function(e){return e[0]}}for(var r=[],s=0;n>s;s++){var l=Math.floor(a/n*s),h=Math.min(Math.floor(a/n*(s+1)),a);if(!(l>=h)){for(var m=l;h>m;m++)r[m-l]="horizontal"===e?t[m][1]:t[m][0];r.length=h-l;for(var V=i(r),U=-1,d=1/0,m=l;h>m;m++){var p="horizontal"===e?t[m][1]:t[m][0],c=Math.abs(p-V);d>c&&(U=m,d=c)}var u=t[U].slice();"horizontal"===e?u[1]=V:u[0]=V,o.push(u)}}return o},_getSmooth:function(e){return e?.3:0},_getCalculableItem:function(e,t,i,n,a,o){var r=this.series,l=r[e].calculableHolderColor||this.ecTheme.calculableHolderColor||s.calculableHolderColor,h=this._getSymbol(e,t,i,n,a,o);return h.style.color=l,h.style.strokeColor=l,h.rotation=[0,0],h.hoverable=!1,h.draggable=!1,h.style.text=void 0,h},_getSymbol:function(e,t,i,n,a,o){var r=this.series,s=r[e],l=s.data[t],h=this.getSymbolShape(s,e,l,t,i,n,a,this._sIndex2ShapeMap[e],this._sIndex2ColorMap[e],"#fff","vertical"===o?"horizontal":"vertical");return h.zlevel=s.zlevel,h.z=s.z+1,this.deepQuery([l,s,this.option],"calculable")&&(this.setCalculable(h),h.draggable=!0),h},getMarkCoord:function(e,t){var i=this.series[e],n=this.xMarkMap[e],a=this.component.xAxis.getAxis(i.xAxisIndex),o=this.component.yAxis.getAxis(i.yAxisIndex);if(t.type&&("max"===t.type||"min"===t.type||"average"===t.type)){var r=null!=t.valueIndex?t.valueIndex:null!=n.maxX0?"1":"";return[n[t.type+"X"+r],n[t.type+"Y"+r],n[t.type+"Line"+r],n[t.type+r]]}return["string"!=typeof t.xAxis&&a.getCoordByIndex?a.getCoordByIndex(t.xAxis||0):a.getCoord(t.xAxis||0),"string"!=typeof t.yAxis&&o.getCoordByIndex?o.getCoordByIndex(t.yAxis||0):o.getCoord(t.yAxis||0)]},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},ontooltipHover:function(e,t){for(var i,n,a=e.seriesIndex,o=e.dataIndex,r=a.length;r--;)if(i=this.finalPLMap[a[r]])for(var s=0,l=i.length;l>s;s++){n=i[s];for(var h=0,m=n.length;m>h;h++)o===n[h][2]&&t.push(this._getSymbol(a[r],n[h][2],n[h][3],n[h][0],n[h][1],"horizontal"))}},addDataAnimation:function(e,t){function i(){c--,0===c&&t&&t()}function n(e){e.style.controlPointList=null}for(var a=this.series,o={},r=0,s=e.length;s>r;r++)o[e[r][0]]=e[r];for(var l,h,m,V,U,d,p,c=0,r=this.shapeList.length-1;r>=0;r--)if(U=this.shapeList[r]._seriesIndex,o[U]&&!o[U][3]){if(this.shapeList[r]._main&&this.shapeList[r].style.pointList.length>1){if(d=this.shapeList[r].style.pointList,h=Math.abs(d[0][0]-d[1][0]),V=Math.abs(d[0][1]-d[1][1]),p="horizontal"===this.shapeList[r]._orient,o[U][2]){if("half-smooth-polygon"===this.shapeList[r].type){var u=d.length;this.shapeList[r].style.pointList[u-3]=d[u-2],this.shapeList[r].style.pointList[u-3][p?0:1]=d[u-4][p?0:1],this.shapeList[r].style.pointList[u-2]=d[u-1]}this.shapeList[r].style.pointList.pop(),p?(l=h,m=0):(l=0,m=-V)}else{if(this.shapeList[r].style.pointList.shift(),"half-smooth-polygon"===this.shapeList[r].type){var y=this.shapeList[r].style.pointList.pop();p?y[0]=d[0][0]:y[1]=d[0][1],this.shapeList[r].style.pointList.push(y)}p?(l=-h,m=0):(l=0,m=V)}this.shapeList[r].style.controlPointList=null,this.zr.modShape(this.shapeList[r])}else{if(o[U][2]&&this.shapeList[r]._dataIndex===a[U].data.length-1){this.zr.delShape(this.shapeList[r].id);continue}if(!o[U][2]&&0===this.shapeList[r]._dataIndex){this.zr.delShape(this.shapeList[r].id);continue}}this.shapeList[r].position=[0,0],c++,this.zr.animate(this.shapeList[r].id,"").when(this.query(this.option,"animationDurationUpdate"),{position:[l,m]}).during(n).done(i).start()}c||t&&t()}},o.prototype.iconLibrary.legendLineIcon=i,h.inherits(t,n),e("../chart").define("line",t),t}),i("echarts/util/shape/HalfSmoothPolygon",["require","zrender/shape/Base","zrender/shape/util/smoothBezier","zrender/tool/util","zrender/shape/Polygon"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/shape/util/smoothBezier"),a=e("zrender/tool/util");return t.prototype={type:"half-smooth-polygon",buildPath:function(t,i){var a=i.pointList;if(!(a.length<2))if(i.smooth){var o=n(a.slice(0,-2),i.smooth,!1,i.smoothConstraint);t.moveTo(a[0][0],a[0][1]);for(var r,s,l,h=a.length,m=0;h-3>m;m++)r=o[2*m],s=o[2*m+1],l=a[m+1],t.bezierCurveTo(r[0],r[1],s[0],s[1],l[0],l[1]);t.lineTo(a[h-2][0],a[h-2][1]),t.lineTo(a[h-1][0],a[h-1][1]),t.lineTo(a[0][0],a[0][1])}else e("zrender/shape/Polygon").prototype.buildPath(t,i)}},a.inherits(t,i),t}),i("echarts/chart/bar",["require","./base","zrender/shape/Rectangle","../component/axis","../component/grid","../component/dataZoom","../config","../util/ecData","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Rectangle");e("../component/axis"),e("../component/grid"),e("../component/dataZoom");var a=e("../config");a.bar={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,barMinHeight:0,barGap:"30%",barCategoryGap:"20%",itemStyle:{normal:{barBorderColor:"#fff",barBorderRadius:0,barBorderWidth:0,label:{show:!1}},emphasis:{barBorderColor:"#fff",barBorderRadius:0,barBorderWidth:0,label:{show:!1}}}};var o=e("../util/ecData"),r=e("zrender/tool/util"),s=e("zrender/tool/color");return t.prototype={type:a.CHART_TYPE_BAR,_buildShape:function(){this._buildPosition()},_buildNormal:function(e,t,i,o,r){for(var s,l,h,m,V,U,d,p,c,u,y,g,b=this.series,f=i[0][0],k=b[f],x="horizontal"==r,_=this.component.xAxis,L=this.component.yAxis,W=x?_.getAxis(k.xAxisIndex):L.getAxis(k.yAxisIndex),X=this._mapSize(W,i),v=X.gap,w=X.barGap,K=X.barWidthMap,I=X.barMaxWidthMap,J=X.barWidth,C=X.barMinHeightMap,S=X.interval,E=this.deepQuery([this.ecTheme,a],"island.r"),F=0,T=t;T>F&&null!=W.getNameByIndex(F);F++){x?m=W.getCoordByIndex(F)-v/2:V=W.getCoordByIndex(F)+v/2;for(var z=0,A=i.length;A>z;z++){var M=b[i[z][0]].yAxisIndex||0,O=b[i[z][0]].xAxisIndex||0;s=x?L.getAxis(M):_.getAxis(O),d=U=c=p=s.getCoord(0);for(var P=0,D=i[z].length;D>P;P++)f=i[z][P],k=b[f],y=k.data[F],g=this.getDataFromOption(y,"-"),o[f]=o[f]||{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY,sum:0,counter:0,average:0},h=Math.min(I[f]||Number.MAX_VALUE,K[f]||J),"-"!==g&&(g>0?(l=P>0?s.getCoordSize(g):x?d-s.getCoord(g):s.getCoord(g)-d,1===D&&C[f]>l&&(l=C[f]),x?(U-=l,V=U):(m=U,U+=l)):0>g?(l=P>0?s.getCoordSize(g):x?s.getCoord(g)-c:c-s.getCoord(g),1===D&&C[f]>l&&(l=C[f]),x?(V=p,p+=l):(p-=l,m=p)):(l=0,x?(U-=l,V=U):(m=U,U+=l)),o[f][F]=x?m+h/2:V-h/2,o[f].min>g&&(o[f].min=g,x?(o[f].minY=V,o[f].minX=o[f][F]):(o[f].minX=m+l,o[f].minY=o[f][F])),o[f].max<g&&(o[f].max=g,x?(o[f].maxY=V,o[f].maxX=o[f][F]):(o[f].maxX=m+l,o[f].maxY=o[f][F])),o[f].sum+=g,o[f].counter++,F%S===0&&(u=this._getBarItem(f,F,W.getNameByIndex(F),m,V-(x?0:h),x?h:l,x?l:h,x?"vertical":"horizontal"),this.shapeList.push(new n(u))));for(var P=0,D=i[z].length;D>P;P++)f=i[z][P],k=b[f],y=k.data[F],g=this.getDataFromOption(y,"-"),h=Math.min(I[f]||Number.MAX_VALUE,K[f]||J),"-"==g&&this.deepQuery([y,k,this.option],"calculable")&&(x?(U-=E,V=U):(m=U,U+=E),u=this._getBarItem(f,F,W.getNameByIndex(F),m,V-(x?0:h),x?h:E,x?E:h,x?"vertical":"horizontal"),u.hoverable=!1,u.draggable=!1,u.style.lineWidth=1,u.style.brushType="stroke",u.style.strokeColor=k.calculableHolderColor||this.ecTheme.calculableHolderColor||a.calculableHolderColor,this.shapeList.push(new n(u)));x?m+=h+w:V-=h+w}}this._calculMarkMapXY(o,i,x?"y":"x")},_buildHorizontal:function(e,t,i,n){return this._buildNormal(e,t,i,n,"horizontal")},_buildVertical:function(e,t,i,n){return this._buildNormal(e,t,i,n,"vertical")},_buildOther:function(e,t,i,a){for(var o=this.series,r=0,s=i.length;s>r;r++)for(var l=0,h=i[r].length;h>l;l++){var m=i[r][l],V=o[m],U=V.xAxisIndex||0,d=this.component.xAxis.getAxis(U),p=d.getCoord(0),c=V.yAxisIndex||0,u=this.component.yAxis.getAxis(c),y=u.getCoord(0);a[m]=a[m]||{min0:Number.POSITIVE_INFINITY,min1:Number.POSITIVE_INFINITY,max0:Number.NEGATIVE_INFINITY,max1:Number.NEGATIVE_INFINITY,sum0:0,sum1:0,counter0:0,counter1:0,average0:0,average1:0};for(var g=0,b=V.data.length;b>g;g++){var f=V.data[g],k=this.getDataFromOption(f,"-");if(k instanceof Array){var x,_,L=d.getCoord(k[0]),W=u.getCoord(k[1]),X=[f,V],v=this.deepQuery(X,"barWidth")||10,w=this.deepQuery(X,"barHeight");null!=w?(x="horizontal",k[0]>0?(v=L-p,L-=v):v=k[0]<0?p-L:0,_=this._getBarItem(m,g,k[0],L,W-w/2,v,w,x)):(x="vertical",k[1]>0?w=y-W:k[1]<0?(w=W-y,W-=w):w=0,_=this._getBarItem(m,g,k[0],L-v/2,W,v,w,x)),this.shapeList.push(new n(_)),L=d.getCoord(k[0]),W=u.getCoord(k[1]),a[m].min0>k[0]&&(a[m].min0=k[0],a[m].minY0=W,a[m].minX0=L),a[m].max0<k[0]&&(a[m].max0=k[0],a[m].maxY0=W,a[m].maxX0=L),a[m].sum0+=k[0],a[m].counter0++,a[m].min1>k[1]&&(a[m].min1=k[1],a[m].minY1=W,a[m].minX1=L),a[m].max1<k[1]&&(a[m].max1=k[1],a[m].maxY1=W,a[m].maxX1=L),a[m].sum1+=k[1],a[m].counter1++}}}this._calculMarkMapXY(a,i,"xy")},_mapSize:function(e,t,i){var n,a,o=this._findSpecialBarSzie(t,i),r=o.barWidthMap,s=o.barMaxWidthMap,l=o.barMinHeightMap,h=o.sBarWidthCounter,m=o.sBarWidthTotal,V=o.barGap,U=o.barCategoryGap,d=1;if(t.length!=h){if(i)n=e.getGap(),V=0,a=+(n/t.length).toFixed(2),0>=a&&(d=Math.floor(t.length/n),a=1);else if(n="string"==typeof U&&U.match(/%$/)?(e.getGap()*(100-parseFloat(U))/100).toFixed(2)-0:e.getGap()-U,"string"==typeof V&&V.match(/%$/)?(V=parseFloat(V)/100,a=+((n-m)/((t.length-1)*V+t.length-h)).toFixed(2),V=a*V):(V=parseFloat(V),a=+((n-m-V*(t.length-1))/(t.length-h)).toFixed(2)),0>=a)return this._mapSize(e,t,!0)}else if(n=h>1?"string"==typeof U&&U.match(/%$/)?+(e.getGap()*(100-parseFloat(U))/100).toFixed(2):e.getGap()-U:m,a=0,V=h>1?+((n-m)/(h-1)).toFixed(2):0,0>V)return this._mapSize(e,t,!0);return this._recheckBarMaxWidth(t,r,s,l,n,a,V,d)},_findSpecialBarSzie:function(e,t){for(var i,n,a,o,r=this.series,s={},l={},h={},m=0,V=0,U=0,d=e.length;d>U;U++)for(var p={barWidth:!1,barMaxWidth:!1},c=0,u=e[U].length;u>c;c++){var y=e[U][c],g=r[y];if(!t){if(p.barWidth)s[y]=i;else if(i=this.query(g,"barWidth"),null!=i){s[y]=i,V+=i,m++,p.barWidth=!0;for(var b=0,f=c;f>b;b++){var k=e[U][b];s[k]=i}}if(p.barMaxWidth)l[y]=n;else if(n=this.query(g,"barMaxWidth"),null!=n){l[y]=n,p.barMaxWidth=!0;for(var b=0,f=c;f>b;b++){var k=e[U][b];l[k]=n}}}h[y]=this.query(g,"barMinHeight"),a=null!=a?a:this.query(g,"barGap"),o=null!=o?o:this.query(g,"barCategoryGap")}return{barWidthMap:s,barMaxWidthMap:l,barMinHeightMap:h,sBarWidth:i,sBarMaxWidth:n,sBarWidthCounter:m,sBarWidthTotal:V,barGap:a,barCategoryGap:o}},_recheckBarMaxWidth:function(e,t,i,n,a,o,r,s){for(var l=0,h=e.length;h>l;l++){var m=e[l][0];i[m]&&i[m]<o&&(a-=o-i[m])}return{barWidthMap:t,barMaxWidthMap:i,barMinHeightMap:n,gap:a,barWidth:o,barGap:r,interval:s}},_getBarItem:function(e,t,i,n,a,r,l,h){var m,V=this.series,U=V[e],d=U.data[t],p=this._sIndex2ColorMap[e],c=[d,U],u=this.deepMerge(c,"itemStyle.normal"),y=this.deepMerge(c,"itemStyle.emphasis"),g=u.barBorderWidth;m={zlevel:U.zlevel,z:U.z,clickable:this.deepQuery(c,"clickable"),style:{x:n,y:a,width:r,height:l,brushType:"both",color:this.getItemStyleColor(this.deepQuery(c,"itemStyle.normal.color")||p,e,t,d),radius:u.barBorderRadius,lineWidth:g,strokeColor:u.barBorderColor},highlightStyle:{color:this.getItemStyleColor(this.deepQuery(c,"itemStyle.emphasis.color"),e,t,d),radius:y.barBorderRadius,lineWidth:y.barBorderWidth,strokeColor:y.barBorderColor},_orient:h};var b=m.style;m.highlightStyle.color=m.highlightStyle.color||("string"==typeof b.color?s.lift(b.color,-.3):b.color),b.x=Math.floor(b.x),b.y=Math.floor(b.y),b.height=Math.ceil(b.height),b.width=Math.ceil(b.width),g>0&&b.height>g&&b.width>g?(b.y+=g/2,b.height-=g,b.x+=g/2,b.width-=g):b.brushType="fill",m.highlightStyle.textColor=m.highlightStyle.color,m=this.addLabel(m,U,d,i,h);for(var f=[b,m.highlightStyle],k=0,x=f.length;x>k;k++){var _=f[k].textPosition;if("insideLeft"===_||"insideRight"===_||"insideTop"===_||"insideBottom"===_){var L=5;switch(_){case"insideLeft":f[k].textX=b.x+L,f[k].textY=b.y+b.height/2,f[k].textAlign="left",f[k].textBaseline="middle";break;case"insideRight":f[k].textX=b.x+b.width-L,f[k].textY=b.y+b.height/2,f[k].textAlign="right",f[k].textBaseline="middle";break;case"insideTop":f[k].textX=b.x+b.width/2,f[k].textY=b.y+L/2,f[k].textAlign="center",f[k].textBaseline="top";break;case"insideBottom":f[k].textX=b.x+b.width/2,f[k].textY=b.y+b.height-L/2,f[k].textAlign="center",f[k].textBaseline="bottom"}f[k].textPosition="specific",f[k].textColor=f[k].textColor||"#fff"}}return this.deepQuery([d,U,this.option],"calculable")&&(this.setCalculable(m),m.draggable=!0),o.pack(m,V[e],e,V[e].data[t],t,i),m},getMarkCoord:function(e,t){var i,n,a=this.series[e],o=this.xMarkMap[e],r=this.component.xAxis.getAxis(a.xAxisIndex),s=this.component.yAxis.getAxis(a.yAxisIndex);if(!t.type||"max"!==t.type&&"min"!==t.type&&"average"!==t.type)if(o.isHorizontal){i="string"==typeof t.xAxis&&r.getIndexByName?r.getIndexByName(t.xAxis):t.xAxis||0;var l=o[i];l=null!=l?l:"string"!=typeof t.xAxis&&r.getCoordByIndex?r.getCoordByIndex(t.xAxis||0):r.getCoord(t.xAxis||0),n=[l,s.getCoord(t.yAxis||0)]}else{i="string"==typeof t.yAxis&&s.getIndexByName?s.getIndexByName(t.yAxis):t.yAxis||0;var h=o[i];h=null!=h?h:"string"!=typeof t.yAxis&&s.getCoordByIndex?s.getCoordByIndex(t.yAxis||0):s.getCoord(t.yAxis||0),n=[r.getCoord(t.xAxis||0),h]}else{var m=null!=t.valueIndex?t.valueIndex:null!=o.maxX0?"1":"";n=[o[t.type+"X"+m],o[t.type+"Y"+m],o[t.type+"Line"+m],o[t.type+m]]}return n},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},addDataAnimation:function(e,t){function i(){c--,0===c&&t&&t()}for(var n=this.series,a={},r=0,s=e.length;s>r;r++)a[e[r][0]]=e[r];for(var l,h,m,V,U,d,p,c=0,r=this.shapeList.length-1;r>=0;r--)if(d=o.get(this.shapeList[r],"seriesIndex"),a[d]&&!a[d][3]&&"rectangle"===this.shapeList[r].type){if(p=o.get(this.shapeList[r],"dataIndex"),U=n[d],a[d][2]&&p===U.data.length-1){this.zr.delShape(this.shapeList[r].id);continue}if(!a[d][2]&&0===p){this.zr.delShape(this.shapeList[r].id);continue}"horizontal"===this.shapeList[r]._orient?(V=this.component.yAxis.getAxis(U.yAxisIndex||0).getGap(),m=a[d][2]?-V:V,l=0):(h=this.component.xAxis.getAxis(U.xAxisIndex||0).getGap(),l=a[d][2]?h:-h,m=0),this.shapeList[r].position=[0,0],c++,this.zr.animate(this.shapeList[r].id,"").when(this.query(this.option,"animationDurationUpdate"),{position:[l,m]}).done(i).start()}c||t&&t()}},r.inherits(t,i),e("../chart").define("bar",t),t}),i("echarts/chart/scatter",["require","./base","../util/shape/Symbol","../component/axis","../component/grid","../component/dataZoom","../component/dataRange","../config","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("../util/shape/Symbol");e("../component/axis"),e("../component/grid"),e("../component/dataZoom"),e("../component/dataRange");var a=e("../config");a.scatter={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,symbolSize:4,large:!1,largeThreshold:2e3,itemStyle:{normal:{label:{show:!1}},emphasis:{label:{show:!1}}}};var o=e("zrender/tool/util"),r=e("zrender/tool/color");return t.prototype={type:a.CHART_TYPE_SCATTER,_buildShape:function(){var e=this.series;this._sIndex2ColorMap={},this._symbol=this.option.symbolList,this._sIndex2ShapeMap={},this.selectedMap={},this.xMarkMap={};for(var t,i,n,o,s=this.component.legend,l=[],h=0,m=e.length;m>h;h++)if(t=e[h],i=t.name,t.type===a.CHART_TYPE_SCATTER){if(e[h]=this.reformOption(e[h]),this.legendHoverLink=e[h].legendHoverLink||this.legendHoverLink,this._sIndex2ShapeMap[h]=this.query(t,"symbol")||this._symbol[h%this._symbol.length],s){if(this.selectedMap[i]=s.isSelected(i),this._sIndex2ColorMap[h]=r.alpha(s.getColor(i),.5),n=s.getItemShape(i)){var o=this._sIndex2ShapeMap[h];n.style.brushType=o.match("empty")?"stroke":"both",o=o.replace("empty","").toLowerCase(),o.match("rectangle")&&(n.style.x+=Math.round((n.style.width-n.style.height)/2),n.style.width=n.style.height),o.match("star")&&(n.style.n=o.replace("star","")-0||5,o="star"),o.match("image")&&(n.style.image=o.replace(new RegExp("^image:\\/\\/"),""),n.style.x+=Math.round((n.style.width-n.style.height)/2),n.style.width=n.style.height,o="image"),n.style.iconType=o,s.setItemShape(i,n)}}else this.selectedMap[i]=!0,this._sIndex2ColorMap[h]=r.alpha(this.zr.getColor(h),.5);this.selectedMap[i]&&l.push(h)}this._buildSeries(l),this.addShapeList()},_buildSeries:function(e){if(0!==e.length){for(var t,i,n,a,o,r,s,l,h=this.series,m={},V=0,U=e.length;U>V;V++)if(t=e[V],i=h[t],0!==i.data.length){o=this.component.xAxis.getAxis(i.xAxisIndex||0),r=this.component.yAxis.getAxis(i.yAxisIndex||0),m[t]=[];for(var d=0,p=i.data.length;p>d;d++)n=i.data[d],a=this.getDataFromOption(n,"-"),"-"===a||a.length<2||(s=o.getCoord(a[0]),l=r.getCoord(a[1]),m[t].push([s,l,d,n.name||""]));this.xMarkMap[t]=this._markMap(o,r,i.data,m[t]),this.buildMark(t)}this._buildPointList(m)}},_markMap:function(e,t,i,n){for(var a,o={min0:Number.POSITIVE_INFINITY,max0:Number.NEGATIVE_INFINITY,sum0:0,counter0:0,average0:0,min1:Number.POSITIVE_INFINITY,max1:Number.NEGATIVE_INFINITY,sum1:0,counter1:0,average1:0},r=0,s=n.length;s>r;r++)a=i[n[r][2]].value||i[n[r][2]],o.min0>a[0]&&(o.min0=a[0],o.minY0=n[r][1],o.minX0=n[r][0]),o.max0<a[0]&&(o.max0=a[0],o.maxY0=n[r][1],o.maxX0=n[r][0]),o.sum0+=a[0],o.counter0++,o.min1>a[1]&&(o.min1=a[1],o.minY1=n[r][1],o.minX1=n[r][0]),o.max1<a[1]&&(o.max1=a[1],o.maxY1=n[r][1],o.maxX1=n[r][0]),o.sum1+=a[1],o.counter1++;var l=this.component.grid.getX(),h=this.component.grid.getXend(),m=this.component.grid.getY(),V=this.component.grid.getYend();o.average0=o.sum0/o.counter0;var U=e.getCoord(o.average0);o.averageLine0=[[U,V],[U,m]],o.minLine0=[[o.minX0,V],[o.minX0,m]],o.maxLine0=[[o.maxX0,V],[o.maxX0,m]],o.average1=o.sum1/o.counter1;var d=t.getCoord(o.average1);return o.averageLine1=[[l,d],[h,d]],o.minLine1=[[l,o.minY1],[h,o.minY1]],o.maxLine1=[[l,o.maxY1],[h,o.maxY1]],o},_buildPointList:function(e){var t,i,n,a,o=this.series;for(var r in e)if(t=o[r],i=e[r],t.large&&t.data.length>t.largeThreshold)this.shapeList.push(this._getLargeSymbol(t,i,this.getItemStyleColor(this.query(t,"itemStyle.normal.color"),r,-1)||this._sIndex2ColorMap[r]));else for(var s=0,l=i.length;l>s;s++)n=i[s],a=this._getSymbol(r,n[2],n[3],n[0],n[1]),a&&this.shapeList.push(a)},_getSymbol:function(e,t,i,n,a){var o,r=this.series,s=r[e],l=s.data[t],h=this.component.dataRange;if(h){if(o=isNaN(l[2])?this._sIndex2ColorMap[e]:h.getColor(l[2]),!o)return null}else o=this._sIndex2ColorMap[e];var m=this.getSymbolShape(s,e,l,t,i,n,a,this._sIndex2ShapeMap[e],o,"rgba(0,0,0,0)","vertical");return m.zlevel=s.zlevel,m.z=s.z,m._main=!0,m},_getLargeSymbol:function(e,t,i){return new n({zlevel:e.zlevel,z:e.z,_main:!0,hoverable:!1,style:{pointList:t,color:i,strokeColor:i},highlightStyle:{pointList:[]}})},getMarkCoord:function(e,t){var i,n=this.series[e],a=this.xMarkMap[e],o=this.component.xAxis.getAxis(n.xAxisIndex),r=this.component.yAxis.getAxis(n.yAxisIndex);if(!t.type||"max"!==t.type&&"min"!==t.type&&"average"!==t.type)i=["string"!=typeof t.xAxis&&o.getCoordByIndex?o.getCoordByIndex(t.xAxis||0):o.getCoord(t.xAxis||0),"string"!=typeof t.yAxis&&r.getCoordByIndex?r.getCoordByIndex(t.yAxis||0):r.getCoord(t.yAxis||0)];else{var s=null!=t.valueIndex?t.valueIndex:1;i=[a[t.type+"X"+s],a[t.type+"Y"+s],a[t.type+"Line"+s],a[t.type+s]]}return i},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},ondataRange:function(e,t){this.component.dataRange&&(this.refresh(),t.needRefresh=!0)}},o.inherits(t,i),e("../chart").define("scatter",t),t}),i("echarts/component/dataRange",["require","./base","zrender/shape/Text","zrender/shape/Rectangle","../util/shape/HandlePolygon","../config","zrender/tool/util","zrender/tool/event","zrender/tool/area","zrender/tool/color","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var s=this;s._ondrift=function(e,t){return s.__ondrift(this,e,t)},s._ondragend=function(){return s.__ondragend()},s._dataRangeSelected=function(e){return s.__dataRangeSelected(e)},s._dispatchHoverLink=function(e){return s.__dispatchHoverLink(e)},s._onhoverlink=function(e){return s.__onhoverlink(e);
-
-},this._selectedMap={},this._range={},this.refresh(a),t.bind(r.EVENT.HOVER,this._onhoverlink)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Rectangle"),o=e("../util/shape/HandlePolygon"),r=e("../config");r.dataRange={zlevel:0,z:4,show:!0,orient:"vertical",x:"left",y:"bottom",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemWidth:20,itemHeight:14,precision:0,splitNumber:5,splitList:null,calculable:!1,selectedMode:!0,hoverLink:!0,realtime:!0,color:["#006edd","#e0ffff"],textStyle:{color:"#333"}};var s=e("zrender/tool/util"),l=e("zrender/tool/event"),h=e("zrender/tool/area"),m=e("zrender/tool/color");return t.prototype={type:r.COMPONENT_TYPE_DATARANGE,_textGap:10,_buildShape:function(){if(this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._isContinuity()?this._buildGradient():this._buildItem(),this.dataRangeOption.show)for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e]);this._syncShapeFromRange()},_buildItem:function(){var e,t,i,o,r=this._valueTextList,s=r.length,l=this.getFont(this.dataRangeOption.textStyle),m=this._itemGroupLocation.x,V=this._itemGroupLocation.y,U=this.dataRangeOption.itemWidth,d=this.dataRangeOption.itemHeight,p=this.dataRangeOption.itemGap,c=h.getTextHeight("国",l);"vertical"==this.dataRangeOption.orient&&"right"==this.dataRangeOption.x&&(m=this._itemGroupLocation.x+this._itemGroupLocation.width-U);var u=!0;this.dataRangeOption.text&&(u=!1,this.dataRangeOption.text[0]&&(i=this._getTextShape(m,V,this.dataRangeOption.text[0]),"horizontal"==this.dataRangeOption.orient?m+=h.getTextWidth(this.dataRangeOption.text[0],l)+this._textGap:(V+=c+this._textGap,i.style.y+=c/2+this._textGap,i.style.textBaseline="bottom"),this.shapeList.push(new n(i))));for(var y=0;s>y;y++)e=r[y],o=this.getColorByIndex(y),t=this._getItemShape(m,V,U,d,this._selectedMap[y]?o:"#ccc"),t._idx=y,t.onmousemove=this._dispatchHoverLink,this.dataRangeOption.selectedMode&&(t.clickable=!0,t.onclick=this._dataRangeSelected),this.shapeList.push(new a(t)),u&&(i={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:m+U+5,y:V,color:this._selectedMap[y]?this.dataRangeOption.textStyle.color:"#ccc",text:r[y],textFont:l,textBaseline:"top"},highlightStyle:{brushType:"fill"}},"vertical"==this.dataRangeOption.orient&&"right"==this.dataRangeOption.x&&(i.style.x-=U+10,i.style.textAlign="right"),i._idx=y,i.onmousemove=this._dispatchHoverLink,this.dataRangeOption.selectedMode&&(i.clickable=!0,i.onclick=this._dataRangeSelected),this.shapeList.push(new n(i))),"horizontal"==this.dataRangeOption.orient?m+=U+(u?5:0)+(u?h.getTextWidth(e,l):0)+p:V+=d+p;!u&&this.dataRangeOption.text[1]&&("horizontal"==this.dataRangeOption.orient?m=m-p+this._textGap:V=V-p+this._textGap,i=this._getTextShape(m,V,this.dataRangeOption.text[1]),"horizontal"!=this.dataRangeOption.orient&&(i.style.y-=5,i.style.textBaseline="top"),this.shapeList.push(new n(i)))},_buildGradient:function(){var t,i,o=this.getFont(this.dataRangeOption.textStyle),r=this._itemGroupLocation.x,s=this._itemGroupLocation.y,l=this.dataRangeOption.itemWidth,m=this.dataRangeOption.itemHeight,V=h.getTextHeight("国",o),U=10,d=!0;this.dataRangeOption.text&&(d=!1,this.dataRangeOption.text[0]&&(i=this._getTextShape(r,s,this.dataRangeOption.text[0]),"horizontal"==this.dataRangeOption.orient?r+=h.getTextWidth(this.dataRangeOption.text[0],o)+this._textGap:(s+=V+this._textGap,i.style.y+=V/2+this._textGap,i.style.textBaseline="bottom"),this.shapeList.push(new n(i))));for(var p=e("zrender/tool/color"),c=1/(this.dataRangeOption.color.length-1),u=[],y=0,g=this.dataRangeOption.color.length;g>y;y++)u.push([y*c,this.dataRangeOption.color[y]]);"horizontal"==this.dataRangeOption.orient?(t={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:r,y:s,width:l*U,height:m,color:p.getLinearGradient(r,s,r+l*U,s,u)},hoverable:!1},r+=l*U+this._textGap):(t={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:r,y:s,width:l,height:m*U,color:p.getLinearGradient(r,s,r,s+m*U,u)},hoverable:!1},s+=m*U+this._textGap),this.shapeList.push(new a(t)),this._calculableLocation=t.style,this.dataRangeOption.calculable&&(this._buildFiller(),this._bulidMask(),this._bulidHandle()),this._buildIndicator(),!d&&this.dataRangeOption.text[1]&&(i=this._getTextShape(r,s,this.dataRangeOption.text[1]),this.shapeList.push(new n(i)))},_buildIndicator:function(){var e,t,i=this._calculableLocation.x,n=this._calculableLocation.y,a=this._calculableLocation.width,r=this._calculableLocation.height,s=5;"horizontal"==this.dataRangeOption.orient?"bottom"!=this.dataRangeOption.y?(e=[[i,n+r],[i-s,n+r+s],[i+s,n+r+s]],t="bottom"):(e=[[i,n],[i-s,n-s],[i+s,n-s]],t="top"):"right"!=this.dataRangeOption.x?(e=[[i+a,n],[i+a+s,n-s],[i+a+s,n+s]],t="right"):(e=[[i,n],[i-s,n-s],[i-s,n+s]],t="left"),this._indicatorShape={style:{pointList:e,color:"#fff",__rect:{x:Math.min(e[0][0],e[1][0]),y:Math.min(e[0][1],e[1][1]),width:s*("horizontal"==this.dataRangeOption.orient?2:1),height:s*("horizontal"==this.dataRangeOption.orient?1:2)}},highlightStyle:{brushType:"fill",textPosition:t,textColor:this.dataRangeOption.textStyle.color},hoverable:!1},this._indicatorShape=new o(this._indicatorShape)},_buildFiller:function(){this._fillerShape={zlevel:this.getZlevelBase(),z:this.getZBase()+1,style:{x:this._calculableLocation.x,y:this._calculableLocation.y,width:this._calculableLocation.width,height:this._calculableLocation.height,color:"rgba(255,255,255,0)"},highlightStyle:{strokeColor:"rgba(255,255,255,0.5)",lineWidth:1},draggable:!0,ondrift:this._ondrift,ondragend:this._ondragend,onmousemove:this._dispatchHoverLink,_type:"filler"},this._fillerShape=new a(this._fillerShape),this.shapeList.push(this._fillerShape)},_bulidHandle:function(){var e,t,i,n,a,r,s,l,m=this._calculableLocation.x,V=this._calculableLocation.y,U=this._calculableLocation.width,d=this._calculableLocation.height,p=this.getFont(this.dataRangeOption.textStyle),c=h.getTextHeight("国",p),u=Math.max(h.getTextWidth(this._textFormat(this.dataRangeOption.max),p),h.getTextWidth(this._textFormat(this.dataRangeOption.min),p))+2;"horizontal"==this.dataRangeOption.orient?"bottom"!=this.dataRangeOption.y?(e=[[m,V],[m,V+d+c],[m-c,V+d+c],[m-1,V+d],[m-1,V]],t=m-u/2-c,i=V+d+c/2+2,n={x:m-u-c,y:V+d,width:u+c,height:c},a=[[m+U,V],[m+U,V+d+c],[m+U+c,V+d+c],[m+U+1,V+d],[m+U+1,V]],r=m+U+u/2+c,s=i,l={x:m+U,y:V+d,width:u+c,height:c}):(e=[[m,V+d],[m,V-c],[m-c,V-c],[m-1,V],[m-1,V+d]],t=m-u/2-c,i=V-c/2-2,n={x:m-u-c,y:V-c,width:u+c,height:c},a=[[m+U,V+d],[m+U,V-c],[m+U+c,V-c],[m+U+1,V],[m+U+1,V+d]],r=m+U+u/2+c,s=i,l={x:m+U,y:V-c,width:u+c,height:c}):(u+=c,"right"!=this.dataRangeOption.x?(e=[[m,V],[m+U+c,V],[m+U+c,V-c],[m+U,V-1],[m,V-1]],t=m+U+u/2+c/2,i=V-c/2,n={x:m+U,y:V-c,width:u+c,height:c},a=[[m,V+d],[m+U+c,V+d],[m+U+c,V+c+d],[m+U,V+1+d],[m,V+d+1]],r=t,s=V+d+c/2,l={x:m+U,y:V+d,width:u+c,height:c}):(e=[[m+U,V],[m-c,V],[m-c,V-c],[m,V-1],[m+U,V-1]],t=m-u/2-c/2,i=V-c/2,n={x:m-u-c,y:V-c,width:u+c,height:c},a=[[m+U,V+d],[m-c,V+d],[m-c,V+c+d],[m,V+1+d],[m+U,V+d+1]],r=t,s=V+d+c/2,l={x:m-u-c,y:V+d,width:u+c,height:c})),this._startShape={style:{pointList:e,text:this._textFormat(this.dataRangeOption.max),textX:t,textY:i,textFont:p,color:this.getColor(this.dataRangeOption.max),rect:n,x:e[0][0],y:e[0][1],_x:e[0][0],_y:e[0][1]}},this._startShape.highlightStyle={strokeColor:this._startShape.style.color,lineWidth:1},this._endShape={style:{pointList:a,text:this._textFormat(this.dataRangeOption.min),textX:r,textY:s,textFont:p,color:this.getColor(this.dataRangeOption.min),rect:l,x:a[0][0],y:a[0][1],_x:a[0][0],_y:a[0][1]}},this._endShape.highlightStyle={strokeColor:this._endShape.style.color,lineWidth:1},this._startShape.zlevel=this._endShape.zlevel=this.getZlevelBase(),this._startShape.z=this._endShape.z=this.getZBase()+1,this._startShape.draggable=this._endShape.draggable=!0,this._startShape.ondrift=this._endShape.ondrift=this._ondrift,this._startShape.ondragend=this._endShape.ondragend=this._ondragend,this._startShape.style.textColor=this._endShape.style.textColor=this.dataRangeOption.textStyle.color,this._startShape.style.textAlign=this._endShape.style.textAlign="center",this._startShape.style.textPosition=this._endShape.style.textPosition="specific",this._startShape.style.textBaseline=this._endShape.style.textBaseline="middle",this._startShape.style.width=this._endShape.style.width=0,this._startShape.style.height=this._endShape.style.height=0,this._startShape.style.textPosition=this._endShape.style.textPosition="specific",this._startShape=new o(this._startShape),this._endShape=new o(this._endShape),this.shapeList.push(this._startShape),this.shapeList.push(this._endShape)},_bulidMask:function(){var e=this._calculableLocation.x,t=this._calculableLocation.y,i=this._calculableLocation.width,n=this._calculableLocation.height;this._startMask={zlevel:this.getZlevelBase(),z:this.getZBase()+1,style:{x:e,y:t,width:"horizontal"==this.dataRangeOption.orient?0:i,height:"horizontal"==this.dataRangeOption.orient?n:0,color:"#ccc"},hoverable:!1},this._endMask={zlevel:this.getZlevelBase(),z:this.getZBase()+1,style:{x:"horizontal"==this.dataRangeOption.orient?e+i:e,y:"horizontal"==this.dataRangeOption.orient?t:t+n,width:"horizontal"==this.dataRangeOption.orient?0:i,height:"horizontal"==this.dataRangeOption.orient?n:0,color:"#ccc"},hoverable:!1},this._startMask=new a(this._startMask),this._endMask=new a(this._endMask),this.shapeList.push(this._startMask),this.shapeList.push(this._endMask)},_buildBackground:function(){var e=this.reformCssArray(this.dataRangeOption.padding);this.shapeList.push(new a({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.dataRangeOption.borderWidth?"fill":"both",color:this.dataRangeOption.backgroundColor,strokeColor:this.dataRangeOption.borderColor,lineWidth:this.dataRangeOption.borderWidth}}))},_getItemGroupLocation:function(){var e=this._valueTextList,t=e.length,i=this.dataRangeOption.itemGap,n=this.dataRangeOption.itemWidth,a=this.dataRangeOption.itemHeight,o=0,r=0,s=this.getFont(this.dataRangeOption.textStyle),l=h.getTextHeight("国",s),m=10;if("horizontal"==this.dataRangeOption.orient){if(this.dataRangeOption.text||this._isContinuity())o=(this._isContinuity()?n*m+i:t*(n+i))+(this.dataRangeOption.text&&"undefined"!=typeof this.dataRangeOption.text[0]?h.getTextWidth(this.dataRangeOption.text[0],s)+this._textGap:0)+(this.dataRangeOption.text&&"undefined"!=typeof this.dataRangeOption.text[1]?h.getTextWidth(this.dataRangeOption.text[1],s)+this._textGap:0);else{n+=5;for(var V=0;t>V;V++)o+=n+h.getTextWidth(e[V],s)+i}o-=i,r=Math.max(l,a)}else{var U;if(this.dataRangeOption.text||this._isContinuity())r=(this._isContinuity()?a*m+i:t*(a+i))+(this.dataRangeOption.text&&"undefined"!=typeof this.dataRangeOption.text[0]?this._textGap+l:0)+(this.dataRangeOption.text&&"undefined"!=typeof this.dataRangeOption.text[1]?this._textGap+l:0),U=Math.max(h.getTextWidth(this.dataRangeOption.text&&this.dataRangeOption.text[0]||"",s),h.getTextWidth(this.dataRangeOption.text&&this.dataRangeOption.text[1]||"",s)),o=Math.max(n,U);else{r=(a+i)*t,n+=5,U=0;for(var V=0;t>V;V++)U=Math.max(U,h.getTextWidth(e[V],s));o=n+U}r-=i}var d,p=this.reformCssArray(this.dataRangeOption.padding),c=this.zr.getWidth();switch(this.dataRangeOption.x){case"center":d=Math.floor((c-o)/2);break;case"left":d=p[3]+this.dataRangeOption.borderWidth;break;case"right":d=c-o-p[1]-this.dataRangeOption.borderWidth;break;default:d=this.parsePercent(this.dataRangeOption.x,c),d=isNaN(d)?0:d}var u,y=this.zr.getHeight();switch(this.dataRangeOption.y){case"top":u=p[0]+this.dataRangeOption.borderWidth;break;case"bottom":u=y-r-p[2]-this.dataRangeOption.borderWidth;break;case"center":u=Math.floor((y-r)/2);break;default:u=this.parsePercent(this.dataRangeOption.y,y),u=isNaN(u)?0:u}if(this.dataRangeOption.calculable){var g=Math.max(h.getTextWidth(this.dataRangeOption.max,s),h.getTextWidth(this.dataRangeOption.min,s))+l;"horizontal"==this.dataRangeOption.orient?(g>d&&(d=g),d+o+g>c&&(d-=g)):(l>u&&(u=l),u+r+l>y&&(u-=l))}return{x:d,y:u,width:o,height:r}},_getTextShape:function(e,t,i){return{zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:"horizontal"==this.dataRangeOption.orient?e:this._itemGroupLocation.x+this._itemGroupLocation.width/2,y:"horizontal"==this.dataRangeOption.orient?this._itemGroupLocation.y+this._itemGroupLocation.height/2:t,color:this.dataRangeOption.textStyle.color,text:i,textFont:this.getFont(this.dataRangeOption.textStyle),textBaseline:"horizontal"==this.dataRangeOption.orient?"middle":"top",textAlign:"horizontal"==this.dataRangeOption.orient?"left":"center"},hoverable:!1}},_getItemShape:function(e,t,i,n,a){return{zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:e,y:t+1,width:i,height:n-2,color:a},highlightStyle:{strokeColor:a,lineWidth:1}}},__ondrift:function(e,t,i){var n=this._calculableLocation.x,a=this._calculableLocation.y,o=this._calculableLocation.width,r=this._calculableLocation.height;return"horizontal"==this.dataRangeOption.orient?e.style.x+t<=n?e.style.x=n:e.style.x+t+e.style.width>=n+o?e.style.x=n+o-e.style.width:e.style.x+=t:e.style.y+i<=a?e.style.y=a:e.style.y+i+e.style.height>=a+r?e.style.y=a+r-e.style.height:e.style.y+=i,"filler"==e._type?this._syncHandleShape():this._syncFillerShape(e),this.dataRangeOption.realtime&&this._dispatchDataRange(),!0},__ondragend:function(){this.isDragend=!0},ondragend:function(e,t){this.isDragend&&e.target&&(t.dragOut=!0,t.dragIn=!0,this.dataRangeOption.realtime||this._dispatchDataRange(),t.needRefresh=!1,this.isDragend=!1)},_syncShapeFromRange:function(){var e=this.dataRangeOption.range||{},t=e.start,i=e.end;if(t>i&&(t=[i,i=t][0]),this._range.end=null!=t?t:null!=this._range.end?this._range.end:0,this._range.start=null!=i?i:null!=this._range.start?this._range.start:100,100!=this._range.start||0!==this._range.end){if("horizontal"==this.dataRangeOption.orient){var n=this._fillerShape.style.width;this._fillerShape.style.x+=n*(100-this._range.start)/100,this._fillerShape.style.width=n*(this._range.start-this._range.end)/100}else{var a=this._fillerShape.style.height;this._fillerShape.style.y+=a*(100-this._range.start)/100,this._fillerShape.style.height=a*(this._range.start-this._range.end)/100}this.zr.modShape(this._fillerShape.id),this._syncHandleShape()}},_syncHandleShape:function(){var e=this._calculableLocation.x,t=this._calculableLocation.y,i=this._calculableLocation.width,n=this._calculableLocation.height;"horizontal"==this.dataRangeOption.orient?(this._startShape.style.x=this._fillerShape.style.x,this._startMask.style.width=this._startShape.style.x-e,this._endShape.style.x=this._fillerShape.style.x+this._fillerShape.style.width,this._endMask.style.x=this._endShape.style.x,this._endMask.style.width=e+i-this._endShape.style.x,this._range.start=Math.ceil(100-(this._startShape.style.x-e)/i*100),this._range.end=Math.floor(100-(this._endShape.style.x-e)/i*100)):(this._startShape.style.y=this._fillerShape.style.y,this._startMask.style.height=this._startShape.style.y-t,this._endShape.style.y=this._fillerShape.style.y+this._fillerShape.style.height,this._endMask.style.y=this._endShape.style.y,this._endMask.style.height=t+n-this._endShape.style.y,this._range.start=Math.ceil(100-(this._startShape.style.y-t)/n*100),this._range.end=Math.floor(100-(this._endShape.style.y-t)/n*100)),this._syncShape()},_syncFillerShape:function(e){var t,i,n=this._calculableLocation.x,a=this._calculableLocation.y,o=this._calculableLocation.width,r=this._calculableLocation.height;"horizontal"==this.dataRangeOption.orient?(t=this._startShape.style.x,i=this._endShape.style.x,e.id==this._startShape.id&&t>=i?(i=t,this._endShape.style.x=t):e.id==this._endShape.id&&t>=i&&(t=i,this._startShape.style.x=t),this._fillerShape.style.x=t,this._fillerShape.style.width=i-t,this._startMask.style.width=t-n,this._endMask.style.x=i,this._endMask.style.width=n+o-i,this._range.start=Math.ceil(100-(t-n)/o*100),this._range.end=Math.floor(100-(i-n)/o*100)):(t=this._startShape.style.y,i=this._endShape.style.y,e.id==this._startShape.id&&t>=i?(i=t,this._endShape.style.y=t):e.id==this._endShape.id&&t>=i&&(t=i,this._startShape.style.y=t),this._fillerShape.style.y=t,this._fillerShape.style.height=i-t,this._startMask.style.height=t-a,this._endMask.style.y=i,this._endMask.style.height=a+r-i,this._range.start=Math.ceil(100-(t-a)/r*100),this._range.end=Math.floor(100-(i-a)/r*100)),this._syncShape()},_syncShape:function(){this._startShape.position=[this._startShape.style.x-this._startShape.style._x,this._startShape.style.y-this._startShape.style._y],this._startShape.style.text=this._textFormat(this._gap*this._range.start+this.dataRangeOption.min),this._startShape.style.color=this._startShape.highlightStyle.strokeColor=this.getColor(this._gap*this._range.start+this.dataRangeOption.min),this._endShape.position=[this._endShape.style.x-this._endShape.style._x,this._endShape.style.y-this._endShape.style._y],this._endShape.style.text=this._textFormat(this._gap*this._range.end+this.dataRangeOption.min),this._endShape.style.color=this._endShape.highlightStyle.strokeColor=this.getColor(this._gap*this._range.end+this.dataRangeOption.min),this.zr.modShape(this._startShape.id),this.zr.modShape(this._endShape.id),this.zr.modShape(this._startMask.id),this.zr.modShape(this._endMask.id),this.zr.modShape(this._fillerShape.id),this.zr.refreshNextFrame()},_dispatchDataRange:function(){this.messageCenter.dispatch(r.EVENT.DATA_RANGE,null,{range:{start:this._range.end,end:this._range.start}},this.myChart)},__dataRangeSelected:function(e){if("single"===this.dataRangeOption.selectedMode)for(var t in this._selectedMap)this._selectedMap[t]=!1;var i=e.target._idx;this._selectedMap[i]=!this._selectedMap[i];var n,a;this._useCustomizedSplit()?(n=this._splitList[i].max,a=this._splitList[i].min):(n=(this._colorList.length-i)*this._gap+this.dataRangeOption.min,a=n-this._gap),this.messageCenter.dispatch(r.EVENT.DATA_RANGE_SELECTED,e.event,{selected:this._selectedMap,target:i,valueMax:n,valueMin:a},this.myChart),this.messageCenter.dispatch(r.EVENT.REFRESH,null,null,this.myChart)},__dispatchHoverLink:function(e){var t,i;if(this.dataRangeOption.calculable){var n,a=this.dataRangeOption.max-this.dataRangeOption.min;n="horizontal"==this.dataRangeOption.orient?(1-(l.getX(e.event)-this._calculableLocation.x)/this._calculableLocation.width)*a:(1-(l.getY(e.event)-this._calculableLocation.y)/this._calculableLocation.height)*a,t=n-.05*a,i=n+.05*a}else if(this._useCustomizedSplit()){var o=e.target._idx;i=this._splitList[o].max,t=this._splitList[o].min}else{var o=e.target._idx;i=(this._colorList.length-o)*this._gap+this.dataRangeOption.min,t=i-this._gap}this.messageCenter.dispatch(r.EVENT.DATA_RANGE_HOVERLINK,e.event,{valueMin:t,valueMax:i},this.myChart)},__onhoverlink:function(e){if(this.dataRangeOption.show&&this.dataRangeOption.hoverLink&&this._indicatorShape&&e&&null!=e.seriesIndex&&null!=e.dataIndex){var t=e.value;if(""===t||isNaN(t))return;t<this.dataRangeOption.min?t=this.dataRangeOption.min:t>this.dataRangeOption.max&&(t=this.dataRangeOption.max),this._indicatorShape.position="horizontal"==this.dataRangeOption.orient?[(this.dataRangeOption.max-t)/(this.dataRangeOption.max-this.dataRangeOption.min)*this._calculableLocation.width,0]:[0,(this.dataRangeOption.max-t)/(this.dataRangeOption.max-this.dataRangeOption.min)*this._calculableLocation.height],this._indicatorShape.style.text=this._textFormat(e.value),this._indicatorShape.style.color=this.getColor(t),this.zr.addHoverShape(this._indicatorShape)}},_textFormat:function(e,t){var i=this.dataRangeOption;if(e!==-Number.MAX_VALUE&&(e=(+e).toFixed(i.precision)),null!=t&&t!==Number.MAX_VALUE&&(t=(+t).toFixed(i.precision)),i.formatter){if("string"==typeof i.formatter)return i.formatter.replace("{value}",e===-Number.MAX_VALUE?"min":e).replace("{value2}",t===Number.MAX_VALUE?"max":t);if("function"==typeof i.formatter)return i.formatter.call(this.myChart,e,t)}return null==t?e:e===-Number.MAX_VALUE?"< "+t:t===Number.MAX_VALUE?"> "+e:e+" - "+t},_isContinuity:function(){var e=this.dataRangeOption;return!(e.splitList?e.splitList.length>0:e.splitNumber>0)||e.calculable},_useCustomizedSplit:function(){var e=this.dataRangeOption;return e.splitList&&e.splitList.length>0},_buildColorList:function(e){if(this._colorList=m.getGradientColors(this.dataRangeOption.color,Math.max((e-this.dataRangeOption.color.length)/(this.dataRangeOption.color.length-1),0)+1),this._colorList.length>e){for(var t=this._colorList.length,i=[this._colorList[0]],n=t/(e-1),a=1;e-1>a;a++)i.push(this._colorList[Math.floor(a*n)]);i.push(this._colorList[t-1]),this._colorList=i}if(this._useCustomizedSplit())for(var o=this._splitList,a=0,t=o.length;t>a;a++)o[a].color&&(this._colorList[a]=o[a].color)},_buildGap:function(e){if(!this._useCustomizedSplit()){var t=this.dataRangeOption.precision;for(this._gap=(this.dataRangeOption.max-this.dataRangeOption.min)/e;this._gap.toFixed(t)-0!=this._gap&&5>t;)t++;this.dataRangeOption.precision=t,this._gap=((this.dataRangeOption.max-this.dataRangeOption.min)/e).toFixed(t)-0}},_buildDataList:function(e){for(var t=this._valueTextList=[],i=this.dataRangeOption,n=this._useCustomizedSplit(),a=0;e>a;a++){this._selectedMap[a]=!0;var o="";if(n){var r=this._splitList[e-1-a];o=null!=r.label?r.label:null!=r.single?this._textFormat(r.single):this._textFormat(r.min,r.max)}else o=this._textFormat(a*this._gap+i.min,(a+1)*this._gap+i.min);t.unshift(o)}},_buildSplitList:function(){if(this._useCustomizedSplit())for(var e=this.dataRangeOption.splitList,t=this._splitList=[],i=0,n=e.length;n>i;i++){var a=e[i];if(!a||null==a.start&&null==a.end)throw new Error("Empty item exists in splitList!");var o={label:a.label,color:a.color};o.min=a.start,o.max=a.end,o.min>o.max&&(o.min=[o.max,o.max=o.min][0]),o.min===o.max&&(o.single=o.max),null==o.min&&(o.min=-Number.MAX_VALUE),null==o.max&&(o.max=Number.MAX_VALUE),t.push(o)}},refresh:function(e){if(e){this.option=e,this.option.dataRange=this.reformOption(this.option.dataRange);var t=this.dataRangeOption=this.option.dataRange;if(!this._useCustomizedSplit()&&(null==t.min||null==t.max))throw new Error("option.dataRange.min or option.dataRange.max has not been defined.");this.myChart.canvasSupported||(t.realtime=!1);var i=this._isContinuity()?100:this._useCustomizedSplit()?t.splitList.length:t.splitNumber;this._buildSplitList(),this._buildColorList(i),this._buildGap(i),this._buildDataList(i)}this.clear(),this._buildShape()},getColor:function(e){if(isNaN(e))return null;var t;if(this._useCustomizedSplit()){for(var i=this._splitList,n=0,a=i.length;a>n;n++)if(i[n].min<=e&&i[n].max>=e){t=n;break}}else{if(this.dataRangeOption.min==this.dataRangeOption.max)return this._colorList[0];if(e<this.dataRangeOption.min?e=this.dataRangeOption.min:e>this.dataRangeOption.max&&(e=this.dataRangeOption.max),this.dataRangeOption.calculable&&(e-(this._gap*this._range.start+this.dataRangeOption.min)>5e-5||e-(this._gap*this._range.end+this.dataRangeOption.min)<-5e-5))return null;t=this._colorList.length-Math.ceil((e-this.dataRangeOption.min)/(this.dataRangeOption.max-this.dataRangeOption.min)*this._colorList.length),t==this._colorList.length&&t--}return this._selectedMap[t]?this._colorList[t]:null},getColorByIndex:function(e){return e>=this._colorList.length?e=this._colorList.length-1:0>e&&(e=0),this._colorList[e]},onbeforDispose:function(){this.messageCenter.unbind(r.EVENT.HOVER,this._onhoverlink)}},s.inherits(t,i),e("../component").define("dataRange",t),t}),i("echarts/util/shape/HandlePolygon",["require","zrender/shape/Base","zrender/shape/Polygon","zrender/tool/util"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/shape/Polygon"),a=e("zrender/tool/util");return t.prototype={type:"handle-polygon",buildPath:function(e,t){n.prototype.buildPath(e,t)},isCover:function(e,t){var i=this.transformCoordToLocal(e,t);e=i[0],t=i[1];var n=this.style.rect;return e>=n.x&&e<=n.x+n.width&&t>=n.y&&t<=n.y+n.height?!0:!1}},a.inherits(t,i),t}),i("echarts/chart/k",["require","./base","../util/shape/Candle","../component/axis","../component/grid","../component/dataZoom","../config","../util/ecData","zrender/tool/util","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("../util/shape/Candle");e("../component/axis"),e("../component/grid"),e("../component/dataZoom");var a=e("../config");a.k={zlevel:0,z:2,clickable:!0,hoverable:!0,legendHoverLink:!1,xAxisIndex:0,yAxisIndex:0,itemStyle:{normal:{color:"#fff",color0:"#00aa11",lineStyle:{width:1,color:"#ff3200",color0:"#00aa11"},label:{show:!1}},emphasis:{label:{show:!1}}}};var o=e("../util/ecData"),r=e("zrender/tool/util");return t.prototype={type:a.CHART_TYPE_K,_buildShape:function(){var e=this.series;this.selectedMap={};for(var t,i={top:[],bottom:[]},n=0,o=e.length;o>n;n++)e[n].type===a.CHART_TYPE_K&&(e[n]=this.reformOption(e[n]),this.legendHoverLink=e[n].legendHoverLink||this.legendHoverLink,t=this.component.xAxis.getAxis(e[n].xAxisIndex),t.type===a.COMPONENT_TYPE_AXIS_CATEGORY&&i[t.getPosition()].push(n));for(var r in i)i[r].length>0&&this._buildSinglePosition(r,i[r]);this.addShapeList()},_buildSinglePosition:function(e,t){var i=this._mapData(t),n=i.locationMap,a=i.maxDataLength;if(0!==a&&0!==n.length){this._buildHorizontal(t,a,n);for(var o=0,r=t.length;r>o;o++)this.buildMark(t[o])}},_mapData:function(e){for(var t,i,n=this.series,a=this.component.legend,o=[],r=0,s=0,l=e.length;l>s;s++)t=n[e[s]],i=t.name,this.selectedMap[i]=a?a.isSelected(i):!0,this.selectedMap[i]&&o.push(e[s]),r=Math.max(r,t.data.length);return{locationMap:o,maxDataLength:r}},_buildHorizontal:function(e,t,i){for(var n,a,o,r,s,l,h,m,V,U,d=this.series,p={},c=0,u=i.length;u>c;c++){n=i[c],a=d[n],o=a.xAxisIndex||0,r=this.component.xAxis.getAxis(o),h=a.barWidth||Math.floor(r.getGap()/2),U=a.barMaxWidth,U&&h>U&&(h=U),s=a.yAxisIndex||0,l=this.component.yAxis.getAxis(s),p[n]=[];for(var y=0,g=t;g>y&&null!=r.getNameByIndex(y);y++)m=a.data[y],V=this.getDataFromOption(m,"-"),"-"!==V&&4==V.length&&p[n].push([r.getCoordByIndex(y),h,l.getCoord(V[0]),l.getCoord(V[1]),l.getCoord(V[2]),l.getCoord(V[3]),y,r.getNameByIndex(y)])}this._buildKLine(e,p)},_buildKLine:function(e,t){for(var i,n,o,r,s,l,h,m,V,U,d,p,c,u,y,g,b,f=this.series,k=0,x=e.length;x>k;k++)if(b=e[k],d=f[b],u=t[b],this._isLarge(u)&&(u=this._getLargePointList(u)),d.type===a.CHART_TYPE_K&&null!=u){p=d,i=this.query(p,"itemStyle.normal.lineStyle.width"),n=this.query(p,"itemStyle.normal.lineStyle.color"),o=this.query(p,"itemStyle.normal.lineStyle.color0"),r=this.query(p,"itemStyle.normal.color"),s=this.query(p,"itemStyle.normal.color0"),l=this.query(p,"itemStyle.emphasis.lineStyle.width"),h=this.query(p,"itemStyle.emphasis.lineStyle.color"),m=this.query(p,"itemStyle.emphasis.lineStyle.color0"),V=this.query(p,"itemStyle.emphasis.color"),U=this.query(p,"itemStyle.emphasis.color0");for(var _=0,L=u.length;L>_;_++)y=u[_],c=d.data[y[6]],p=c,g=y[3]<y[2],this.shapeList.push(this._getCandle(b,y[6],y[7],y[0],y[1],y[2],y[3],y[4],y[5],g?this.query(p,"itemStyle.normal.color")||r:this.query(p,"itemStyle.normal.color0")||s,this.query(p,"itemStyle.normal.lineStyle.width")||i,g?this.query(p,"itemStyle.normal.lineStyle.color")||n:this.query(p,"itemStyle.normal.lineStyle.color0")||o,g?this.query(p,"itemStyle.emphasis.color")||V||r:this.query(p,"itemStyle.emphasis.color0")||U||s,this.query(p,"itemStyle.emphasis.lineStyle.width")||l||i,g?this.query(p,"itemStyle.emphasis.lineStyle.color")||h||n:this.query(p,"itemStyle.emphasis.lineStyle.color0")||m||o))}},_isLarge:function(e){return e[0][1]<.5},_getLargePointList:function(e){for(var t=this.component.grid.getWidth(),i=e.length,n=[],a=0;t>a;a++)n[a]=e[Math.floor(i/t*a)];return n},_getCandle:function(e,t,i,a,r,s,l,h,m,V,U,d,p,c,u){var y=this.series,g=y[e],b=g.data[t],f=[b,g],k={zlevel:g.zlevel,z:g.z,clickable:this.deepQuery(f,"clickable"),hoverable:this.deepQuery(f,"hoverable"),style:{x:a,y:[s,l,h,m],width:r,color:V,strokeColor:d,lineWidth:U,brushType:"both"},highlightStyle:{color:p,strokeColor:u,lineWidth:c},_seriesIndex:e};return k=this.addLabel(k,g,b,i),o.pack(k,g,e,b,t,i),k=new n(k)},getMarkCoord:function(e,t){var i=this.series[e],n=this.component.xAxis.getAxis(i.xAxisIndex),a=this.component.yAxis.getAxis(i.yAxisIndex);return["string"!=typeof t.xAxis&&n.getCoordByIndex?n.getCoordByIndex(t.xAxis||0):n.getCoord(t.xAxis||0),"string"!=typeof t.yAxis&&a.getCoordByIndex?a.getCoordByIndex(t.yAxis||0):a.getCoord(t.yAxis||0)]},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},addDataAnimation:function(e,t){function i(){p--,0===p&&t&&t()}for(var n=this.series,a={},r=0,s=e.length;s>r;r++)a[e[r][0]]=e[r];for(var l,h,m,V,U,d,p=0,r=0,s=this.shapeList.length;s>r;r++)if(U=this.shapeList[r]._seriesIndex,a[U]&&!a[U][3]&&"candle"===this.shapeList[r].type){if(d=o.get(this.shapeList[r],"dataIndex"),V=n[U],a[U][2]&&d===V.data.length-1){this.zr.delShape(this.shapeList[r].id);continue}if(!a[U][2]&&0===d){this.zr.delShape(this.shapeList[r].id);continue}h=this.component.xAxis.getAxis(V.xAxisIndex||0).getGap(),l=a[U][2]?h:-h,m=0,p++,this.zr.animate(this.shapeList[r].id,"").when(this.query(this.option,"animationDurationUpdate"),{position:[l,m]}).done(i).start()}p||t&&t()}},r.inherits(t,i),e("../chart").define("k",t),t}),i("echarts/chart/pie",["require","./base","zrender/shape/Text","zrender/shape/Ring","zrender/shape/Circle","zrender/shape/Sector","zrender/shape/Polyline","../config","../util/ecData","zrender/tool/util","zrender/tool/math","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r.shapeHandler.onmouseover=function(e){var t=e.target,i=h.get(t,"seriesIndex"),n=h.get(t,"dataIndex"),a=h.get(t,"special"),o=[t.style.x,t.style.y],s=t.style.startAngle,l=t.style.endAngle,m=((l+s)/2+360)%360,V=t.highlightStyle.color,U=r.getLabel(i,n,a,o,m,V,!0);U&&r.zr.addHoverShape(U);var d=r.getLabelLine(i,n,o,t.style.r0,t.style.r,m,V,!0);d&&r.zr.addHoverShape(d)},this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Ring"),o=e("zrender/shape/Circle"),r=e("zrender/shape/Sector"),s=e("zrender/shape/Polyline"),l=e("../config");l.pie={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,center:["50%","50%"],radius:[0,"75%"],clockWise:!0,startAngle:90,minAngle:0,selectedOffset:10,itemStyle:{normal:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!0,position:"outer"},labelLine:{show:!0,length:20,lineStyle:{width:1,type:"solid"}}},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!1},labelLine:{show:!1,length:20,lineStyle:{width:1,type:"solid"}}}}};var h=e("../util/ecData"),m=e("zrender/tool/util"),V=e("zrender/tool/math"),U=e("zrender/tool/color");return t.prototype={type:l.CHART_TYPE_PIE,_buildShape:function(){var e=this.series,t=this.component.legend;this.selectedMap={},this._selected={};var i,n,r;this._selectedMode=!1;for(var s,m=0,V=e.length;V>m;m++)if(e[m].type===l.CHART_TYPE_PIE){if(e[m]=this.reformOption(e[m]),this.legendHoverLink=e[m].legendHoverLink||this.legendHoverLink,s=e[m].name||"",this.selectedMap[s]=t?t.isSelected(s):!0,!this.selectedMap[s])continue;i=this.parseCenter(this.zr,e[m].center),n=this.parseRadius(this.zr,e[m].radius),this._selectedMode=this._selectedMode||e[m].selectedMode,this._selected[m]=[],this.deepQuery([e[m],this.option],"calculable")&&(r={zlevel:e[m].zlevel,z:e[m].z,hoverable:!1,style:{x:i[0],y:i[1],r0:n[0]<=10?0:n[0]-10,r:n[1]+10,brushType:"stroke",lineWidth:1,strokeColor:e[m].calculableHolderColor||this.ecTheme.calculableHolderColor||l.calculableHolderColor}},h.pack(r,e[m],m,void 0,-1),this.setCalculable(r),r=n[0]<=10?new o(r):new a(r),this.shapeList.push(r)),this._buildSinglePie(m),this.buildMark(m)}this.addShapeList()},_buildSinglePie:function(e){for(var t,i=this.series,n=i[e],a=n.data,o=this.component.legend,r=0,s=0,l=0,h=Number.NEGATIVE_INFINITY,m=[],V=0,U=a.length;U>V;V++)t=a[V].name,
-this.selectedMap[t]=o?o.isSelected(t):!0,this.selectedMap[t]&&!isNaN(a[V].value)&&(0!==+a[V].value?r++:s++,l+=+a[V].value,h=Math.max(h,+a[V].value));if(0!==l){for(var d,p,c,u,y,g,b=100,f=n.clockWise,k=(n.startAngle.toFixed(2)-0+360)%360,x=n.minAngle||.01,_=360-x*r-.01*s,L=n.roseType,V=0,U=a.length;U>V;V++)if(t=a[V].name,this.selectedMap[t]&&!isNaN(a[V].value)){if(p=o?o.getColor(t):this.zr.getColor(V),b=a[V].value/l,d="area"!=L?f?k-b*_-(0!==b?x:.01):b*_+k+(0!==b?x:.01):f?k-360/U:360/U+k,d=d.toFixed(2)-0,b=(100*b).toFixed(2),c=this.parseCenter(this.zr,n.center),u=this.parseRadius(this.zr,n.radius),y=+u[0],g=+u[1],"radius"===L?g=a[V].value/h*(g-y)*.8+.2*(g-y)+y:"area"===L&&(g=Math.sqrt(a[V].value/h)*(g-y)+y),f){var W;W=k,k=d,d=W}this._buildItem(m,e,V,b,a[V].selected,c,y,g,k,d,p),f||(k=d)}this._autoLabelLayout(m,c,g);for(var V=0,U=m.length;U>V;V++)this.shapeList.push(m[V]);m=null}},_buildItem:function(e,t,i,n,a,o,r,s,l,m,V){var U=this.series,d=((m+l)/2+360)%360,p=this.getSector(t,i,n,a,o,r,s,l,m,V);h.pack(p,U[t],t,U[t].data[i],i,U[t].data[i].name,n),e.push(p);var c=this.getLabel(t,i,n,o,d,V,!1),u=this.getLabelLine(t,i,o,r,s,d,V,!1);u&&(h.pack(u,U[t],t,U[t].data[i],i,U[t].data[i].name,n),e.push(u)),c&&(h.pack(c,U[t],t,U[t].data[i],i,U[t].data[i].name,n),c._labelLine=u,e.push(c))},getSector:function(e,t,i,n,a,o,s,l,h,m){var d=this.series,p=d[e],c=p.data[t],u=[c,p],y=this.deepMerge(u,"itemStyle.normal")||{},g=this.deepMerge(u,"itemStyle.emphasis")||{},b=this.getItemStyleColor(y.color,e,t,c)||m,f=this.getItemStyleColor(g.color,e,t,c)||("string"==typeof b?U.lift(b,-.2):b),k={zlevel:p.zlevel,z:p.z,clickable:this.deepQuery(u,"clickable"),style:{x:a[0],y:a[1],r0:o,r:s,startAngle:l,endAngle:h,brushType:"both",color:b,lineWidth:y.borderWidth,strokeColor:y.borderColor,lineJoin:"round"},highlightStyle:{color:f,lineWidth:g.borderWidth,strokeColor:g.borderColor,lineJoin:"round"},_seriesIndex:e,_dataIndex:t};if(n){var x=((k.style.startAngle+k.style.endAngle)/2).toFixed(2)-0;k.style._hasSelected=!0,k.style._x=k.style.x,k.style._y=k.style.y;var _=this.query(p,"selectedOffset");k.style.x+=V.cos(x,!0)*_,k.style.y-=V.sin(x,!0)*_,this._selected[e][t]=!0}else this._selected[e][t]=!1;return this._selectedMode&&(k.onclick=this.shapeHandler.onclick),this.deepQuery([c,p,this.option],"calculable")&&(this.setCalculable(k),k.draggable=!0),(this._needLabel(p,c,!0)||this._needLabelLine(p,c,!0))&&(k.onmouseover=this.shapeHandler.onmouseover),k=new r(k)},getLabel:function(e,t,i,a,o,r,s){var l=this.series,h=l[e],U=h.data[t];if(this._needLabel(h,U,s)){var d,p,c,u=s?"emphasis":"normal",y=m.merge(m.clone(U.itemStyle)||{},h.itemStyle),g=y[u].label,b=g.textStyle||{},f=a[0],k=a[1],x=this.parseRadius(this.zr,h.radius),_="middle";g.position=g.position||y.normal.label.position,"center"===g.position?(d=f,p=k,c="center"):"inner"===g.position||"inside"===g.position?(x=(x[0]+x[1])*(g.distance||.5),d=Math.round(f+x*V.cos(o,!0)),p=Math.round(k-x*V.sin(o,!0)),r="#fff",c="center"):(x=x[1]- -y[u].labelLine.length,d=Math.round(f+x*V.cos(o,!0)),p=Math.round(k-x*V.sin(o,!0)),c=o>=90&&270>=o?"right":"left"),"center"!=g.position&&"inner"!=g.position&&"inside"!=g.position&&(d+="left"===c?20:-20),U.__labelX=d-("left"===c?5:-5),U.__labelY=p;var L=new n({zlevel:h.zlevel,z:h.z+1,hoverable:!1,style:{x:d,y:p,color:b.color||r,text:this.getLabelText(e,t,i,u),textAlign:b.align||c,textBaseline:b.baseline||_,textFont:this.getFont(b)},highlightStyle:{brushType:"fill"}});return L._radius=x,L._labelPosition=g.position||"outer",L._rect=L.getRect(L.style),L._seriesIndex=e,L._dataIndex=t,L}},getLabelText:function(e,t,i,n){var a=this.series,o=a[e],r=o.data[t],s=this.deepQuery([r,o],"itemStyle."+n+".label.formatter");return s?"function"==typeof s?s.call(this.myChart,{seriesIndex:e,seriesName:o.name||"",series:o,dataIndex:t,data:r,name:r.name,value:r.value,percent:i}):"string"==typeof s?(s=s.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}").replace("{d}","{d0}"),s=s.replace("{a0}",o.name).replace("{b0}",r.name).replace("{c0}",r.value).replace("{d0}",i)):void 0:r.name},getLabelLine:function(e,t,i,n,a,o,r,l){var h=this.series,U=h[e],d=U.data[t];if(this._needLabelLine(U,d,l)){var p=l?"emphasis":"normal",c=m.merge(m.clone(d.itemStyle)||{},U.itemStyle),u=c[p].labelLine,y=u.lineStyle||{},g=i[0],b=i[1],f=a,k=this.parseRadius(this.zr,U.radius)[1]- -u.length,x=V.cos(o,!0),_=V.sin(o,!0);return new s({zlevel:U.zlevel,z:U.z+1,hoverable:!1,style:{pointList:[[g+f*x,b-f*_],[g+k*x,b-k*_],[d.__labelX,d.__labelY]],strokeColor:y.color||r,lineType:y.type,lineWidth:y.width},_seriesIndex:e,_dataIndex:t})}},_needLabel:function(e,t,i){return this.deepQuery([t,e],"itemStyle."+(i?"emphasis":"normal")+".label.show")},_needLabelLine:function(e,t,i){return this.deepQuery([t,e],"itemStyle."+(i?"emphasis":"normal")+".labelLine.show")},_autoLabelLayout:function(e,t,i){for(var n=[],a=[],o=0,r=e.length;r>o;o++)("outer"===e[o]._labelPosition||"outside"===e[o]._labelPosition)&&(e[o]._rect._y=e[o]._rect.y,e[o]._rect.x<t[0]?n.push(e[o]):a.push(e[o]));this._layoutCalculate(n,t,i,-1),this._layoutCalculate(a,t,i,1)},_layoutCalculate:function(e,t,i,n){function a(t,i,n){for(var a=t;i>a;a++)if(e[a]._rect.y+=n,e[a].style.y+=n,e[a]._labelLine&&(e[a]._labelLine.style.pointList[1][1]+=n,e[a]._labelLine.style.pointList[2][1]+=n),a>t&&i>a+1&&e[a+1]._rect.y>e[a]._rect.y+e[a]._rect.height)return void o(a,n/2);o(i-1,n/2)}function o(t,i){for(var n=t;n>=0&&(e[n]._rect.y-=i,e[n].style.y-=i,e[n]._labelLine&&(e[n]._labelLine.style.pointList[1][1]-=i,e[n]._labelLine.style.pointList[2][1]-=i),!(n>0&&e[n]._rect.y>e[n-1]._rect.y+e[n-1]._rect.height));n--);}function r(e,t,i,n,a){for(var o,r,s,l=i[0],h=i[1],m=a>0?t?Number.MAX_VALUE:0:t?Number.MAX_VALUE:0,V=0,U=e.length;U>V;V++)r=Math.abs(e[V]._rect.y-h),s=e[V]._radius-n,o=n+s>r?Math.sqrt((n+s+20)*(n+s+20)-Math.pow(e[V]._rect.y-h,2)):Math.abs(e[V]._rect.x+(a>0?0:e[V]._rect.width)-l),t&&o>=m&&(o=m-10),!t&&m>=o&&(o=m+10),e[V]._rect.x=e[V].style.x=l+o*a,e[V]._labelLine&&(e[V]._labelLine.style.pointList[2][0]=l+(o-5)*a,e[V]._labelLine.style.pointList[1][0]=l+(o-20)*a),m=o}e.sort(function(e,t){return e._rect.y-t._rect.y});for(var s,l=0,h=e.length,m=[],V=[],U=0;h>U;U++)s=e[U]._rect.y-l,0>s&&a(U,h,-s,n),l=e[U]._rect.y+e[U]._rect.height;this.zr.getHeight()-l<0&&o(h-1,l-this.zr.getHeight());for(var U=0;h>U;U++)e[U]._rect.y>=t[1]?V.push(e[U]):m.push(e[U]);r(V,!0,t,i,n),r(m,!1,t,i,n)},reformOption:function(e){var t=m.merge;return e=t(t(e||{},m.clone(this.ecTheme.pie||{})),m.clone(l.pie)),e.itemStyle.normal.label.textStyle=this.getTextStyle(e.itemStyle.normal.label.textStyle),e.itemStyle.emphasis.label.textStyle=this.getTextStyle(e.itemStyle.emphasis.label.textStyle),this.z=e.z,this.zlevel=e.zlevel,e},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()},addDataAnimation:function(e,t){function i(){s--,0===s&&t&&t()}for(var n=this.series,a={},o=0,r=e.length;r>o;o++)a[e[o][0]]=e[o];var s=0,h={},m={},V={},U=this.shapeList;this.shapeList=[];for(var d,p,c,u={},o=0,r=e.length;r>o;o++)d=e[o][0],p=e[o][2],c=e[o][3],n[d]&&n[d].type===l.CHART_TYPE_PIE&&(p?(c||(h[d+"_"+n[d].data.length]="delete"),u[d]=1):c?u[d]=0:(h[d+"_-1"]="delete",u[d]=-1),this._buildSinglePie(d));for(var y,g,o=0,r=this.shapeList.length;r>o;o++)switch(d=this.shapeList[o]._seriesIndex,y=this.shapeList[o]._dataIndex,g=d+"_"+y,this.shapeList[o].type){case"sector":h[g]=this.shapeList[o];break;case"text":m[g]=this.shapeList[o];break;case"polyline":V[g]=this.shapeList[o]}this.shapeList=[];for(var b,o=0,r=U.length;r>o;o++)if(d=U[o]._seriesIndex,a[d]){if(y=U[o]._dataIndex+u[d],g=d+"_"+y,b=h[g],!b)continue;if("sector"===U[o].type)"delete"!=b?(s++,this.zr.animate(U[o].id,"style").when(400,{startAngle:b.style.startAngle,endAngle:b.style.endAngle}).done(i).start()):(s++,this.zr.animate(U[o].id,"style").when(400,u[d]<0?{startAngle:U[o].style.startAngle}:{endAngle:U[o].style.endAngle}).done(i).start());else if("text"===U[o].type||"polyline"===U[o].type)if("delete"===b)this.zr.delShape(U[o].id);else switch(U[o].type){case"text":s++,b=m[g],this.zr.animate(U[o].id,"style").when(400,{x:b.style.x,y:b.style.y}).done(i).start();break;case"polyline":s++,b=V[g],this.zr.animate(U[o].id,"style").when(400,{pointList:b.style.pointList}).done(i).start()}}this.shapeList=U,s||t&&t()},onclick:function(e){var t=this.series;if(this.isClick&&e.target){this.isClick=!1;for(var i,n=e.target,a=n.style,o=h.get(n,"seriesIndex"),r=h.get(n,"dataIndex"),s=0,m=this.shapeList.length;m>s;s++)if(this.shapeList[s].id===n.id){if(o=h.get(n,"seriesIndex"),r=h.get(n,"dataIndex"),a._hasSelected)n.style.x=n.style._x,n.style.y=n.style._y,n.style._hasSelected=!1,this._selected[o][r]=!1;else{var U=((a.startAngle+a.endAngle)/2).toFixed(2)-0;n.style._hasSelected=!0,this._selected[o][r]=!0,n.style._x=n.style.x,n.style._y=n.style.y,i=this.query(t[o],"selectedOffset"),n.style.x+=V.cos(U,!0)*i,n.style.y-=V.sin(U,!0)*i}this.zr.modShape(n.id)}else this.shapeList[s].style._hasSelected&&"single"===this._selectedMode&&(o=h.get(this.shapeList[s],"seriesIndex"),r=h.get(this.shapeList[s],"dataIndex"),this.shapeList[s].style.x=this.shapeList[s].style._x,this.shapeList[s].style.y=this.shapeList[s].style._y,this.shapeList[s].style._hasSelected=!1,this._selected[o][r]=!1,this.zr.modShape(this.shapeList[s].id));this.messageCenter.dispatch(l.EVENT.PIE_SELECTED,e.event,{selected:this._selected,target:h.get(n,"name")},this.myChart),this.zr.refreshNextFrame()}}},m.inherits(t,i),e("../chart").define("pie",t),t}),i("echarts/chart/radar",["require","./base","zrender/shape/Polygon","../component/polar","../config","../util/ecData","zrender/tool/util","zrender/tool/color","../util/accMath","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Polygon");e("../component/polar");var a=e("../config");a.radar={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,polarIndex:0,itemStyle:{normal:{label:{show:!1},lineStyle:{width:2,type:"solid"}},emphasis:{label:{show:!1}}},symbolSize:2};var o=e("../util/ecData"),r=e("zrender/tool/util"),s=e("zrender/tool/color");return t.prototype={type:a.CHART_TYPE_RADAR,_buildShape:function(){this.selectedMap={},this._symbol=this.option.symbolList,this._queryTarget,this._dropBoxList=[],this._radarDataCounter=0;for(var e,t=this.series,i=this.component.legend,n=0,o=t.length;o>n;n++)t[n].type===a.CHART_TYPE_RADAR&&(this.serie=this.reformOption(t[n]),this.legendHoverLink=t[n].legendHoverLink||this.legendHoverLink,e=this.serie.name||"",this.selectedMap[e]=i?i.isSelected(e):!0,this.selectedMap[e]&&(this._queryTarget=[this.serie,this.option],this.deepQuery(this._queryTarget,"calculable")&&this._addDropBox(n),this._buildSingleRadar(n),this.buildMark(n)));this.addShapeList()},_buildSingleRadar:function(e){for(var t,i,n,a,o=this.component.legend,r=this.serie.data,s=this.deepQuery(this._queryTarget,"calculable"),l=0;l<r.length;l++)n=r[l].name||"",this.selectedMap[n]=o?o.isSelected(n):!0,this.selectedMap[n]&&(o?(i=o.getColor(n),t=o.getItemShape(n),t&&(t.style.brushType=this.deepQuery([r[l],this.serie],"itemStyle.normal.areaStyle")?"both":"stroke",o.setItemShape(n,t))):i=this.zr.getColor(l),a=this._getPointList(this.serie.polarIndex,r[l]),this._addSymbol(a,i,l,e,this.serie.polarIndex),this._addDataShape(a,i,r[l],e,l,s),this._radarDataCounter++)},_getPointList:function(e,t){for(var i,n,a=[],o=this.component.polar,r=0,s=t.value.length;s>r;r++)n=this.getDataFromOption(t.value[r]),i="-"!=n?o.getVector(e,r,n):!1,i&&a.push(i);return a},_addSymbol:function(e,t,i,n,a){for(var r,s=this.series,l=this.component.polar,h=0,m=e.length;m>h;h++)r=this.getSymbolShape(this.deepMerge([s[n].data[i],s[n]]),n,s[n].data[i].value[h],h,l.getIndicatorText(a,h),e[h][0],e[h][1],this._symbol[this._radarDataCounter%this._symbol.length],t,"#fff","vertical"),r.zlevel=this.getZlevelBase(),r.z=this.getZBase()+1,o.set(r,"data",s[n].data[i]),o.set(r,"value",s[n].data[i].value),o.set(r,"dataIndex",i),o.set(r,"special",h),this.shapeList.push(r)},_addDataShape:function(e,t,i,a,r,l){var h=this.series,m=[i,this.serie],V=this.getItemStyleColor(this.deepQuery(m,"itemStyle.normal.color"),a,r,i),U=this.deepQuery(m,"itemStyle.normal.lineStyle.width"),d=this.deepQuery(m,"itemStyle.normal.lineStyle.type"),p=this.deepQuery(m,"itemStyle.normal.areaStyle.color"),c=this.deepQuery(m,"itemStyle.normal.areaStyle"),u={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{pointList:e,brushType:c?"both":"stroke",color:p||V||("string"==typeof t?s.alpha(t,.5):t),strokeColor:V||t,lineWidth:U,lineType:d},highlightStyle:{brushType:this.deepQuery(m,"itemStyle.emphasis.areaStyle")||c?"both":"stroke",color:this.deepQuery(m,"itemStyle.emphasis.areaStyle.color")||p||V||("string"==typeof t?s.alpha(t,.5):t),strokeColor:this.getItemStyleColor(this.deepQuery(m,"itemStyle.emphasis.color"),a,r,i)||V||t,lineWidth:this.deepQuery(m,"itemStyle.emphasis.lineStyle.width")||U,lineType:this.deepQuery(m,"itemStyle.emphasis.lineStyle.type")||d}};o.pack(u,h[a],a,i,r,i.name,this.component.polar.getIndicator(h[a].polarIndex)),l&&(u.draggable=!0,this.setCalculable(u)),u=new n(u),this.shapeList.push(u)},_addDropBox:function(e){var t=this.series,i=this.deepQuery(this._queryTarget,"polarIndex");if(!this._dropBoxList[i]){var n=this.component.polar.getDropBox(i);n.zlevel=this.getZlevelBase(),n.z=this.getZBase(),this.setCalculable(n),o.pack(n,t,e,void 0,-1),this.shapeList.push(n),this._dropBoxList[i]=!0}},ondragend:function(e,t){var i=this.series;if(this.isDragend&&e.target){var n=e.target,a=o.get(n,"seriesIndex"),r=o.get(n,"dataIndex");this.component.legend&&this.component.legend.del(i[a].data[r].name),i[a].data.splice(r,1),t.dragOut=!0,t.needRefresh=!0,this.isDragend=!1}},ondrop:function(t,i){var n=this.series;if(this.isDrop&&t.target){var a,r,s=t.target,l=t.dragged,h=o.get(s,"seriesIndex"),m=o.get(s,"dataIndex"),V=this.component.legend;if(-1===m)a={value:o.get(l,"value"),name:o.get(l,"name")},n[h].data.push(a),V&&V.add(a.name,l.style.color||l.style.strokeColor);else{var U=e("../util/accMath");a=n[h].data[m],V&&V.del(a.name),a.name+=this.option.nameConnector+o.get(l,"name"),r=o.get(l,"value");for(var d=0;d<r.length;d++)a.value[d]=U.accAdd(a.value[d],r[d]);V&&V.add(a.name,l.style.color||l.style.strokeColor)}i.dragIn=i.dragIn||!0,this.isDrop=!1}},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},r.inherits(t,i),e("../chart").define("radar",t),t}),i("echarts/component/polar",["require","./base","zrender/shape/Text","zrender/shape/Line","zrender/shape/Polygon","zrender/shape/Circle","zrender/shape/Ring","../config","zrender/tool/util","../util/coordinates","../util/accMath","../util/smartSteps","../component"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Line"),o=e("zrender/shape/Polygon"),r=e("zrender/shape/Circle"),s=e("zrender/shape/Ring"),l=e("../config");l.polar={zlevel:0,z:0,center:["50%","50%"],radius:"75%",startAngle:90,boundaryGap:[0,0],splitNumber:5,name:{show:!0,textStyle:{color:"#333"}},axisLine:{show:!0,lineStyle:{color:"#ccc",width:1,type:"solid"}},axisLabel:{show:!1,textStyle:{color:"#333"}},splitArea:{show:!0,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}},splitLine:{show:!0,lineStyle:{width:1,color:"#ccc"}},type:"polygon"};var h=e("zrender/tool/util"),m=e("../util/coordinates");return t.prototype={type:l.COMPONENT_TYPE_POLAR,_buildShape:function(){for(var e=0;e<this.polar.length;e++)this._index=e,this.reformOption(this.polar[e]),this._queryTarget=[this.polar[e],this.option],this._createVector(e),this._buildSpiderWeb(e),this._buildText(e),this._adjustIndicatorValue(e),this._addAxisLabel(e);for(var e=0;e<this.shapeList.length;e++)this.zr.addShape(this.shapeList[e])},_createVector:function(e){for(var t,i=this.polar[e],n=this.deepQuery(this._queryTarget,"indicator"),a=n.length,o=i.startAngle,r=2*Math.PI/a,s=this._getRadius(),l=i.__ecIndicator=[],h=0;a>h;h++)t=m.polar2cartesian(s,o*Math.PI/180+r*h),l.push({vector:[t[1],-t[0]]})},_getRadius:function(){var e=this.polar[this._index];return this.parsePercent(e.radius,Math.min(this.zr.getWidth(),this.zr.getHeight())/2)},_buildSpiderWeb:function(e){var t=this.polar[e],i=t.__ecIndicator,n=t.splitArea,a=t.splitLine,o=this.getCenter(e),r=t.splitNumber,s=a.lineStyle.color,l=a.lineStyle.width,h=a.show,m=this.deepQuery(this._queryTarget,"axisLine");this._addArea(i,r,o,n,s,l,h),m.show&&this._addLine(i,o,m)},_addAxisLabel:function(t){for(var i,a,o,r,a,s,l,m,V,U,d=e("../util/accMath"),p=this.polar[t],c=this.deepQuery(this._queryTarget,"indicator"),u=p.__ecIndicator,y=this.deepQuery(this._queryTarget,"splitNumber"),g=this.getCenter(t),b=0;b<c.length;b++)if(i=this.deepQuery([c[b],p,this.option],"axisLabel"),i.show){var f=this.deepQuery([i,p,this.option],"textStyle"),k=this.deepQuery([i,p],"formatter");if(o={},o.textFont=this.getFont(f),o.color=f.color,o=h.merge(o,i),o.lineWidth=o.width,a=u[b].vector,s=u[b].value,m=b/c.length*2*Math.PI,V=i.offset||10,U=i.interval||0,!s)return;for(var x=1;y>=x;x+=U+1)r=h.merge({},o),l=d.accAdd(s.min,d.accMul(s.step,x)),l="function"==typeof k?k(l):"string"==typeof k?k.replace("{a}","{a0}").replace("{a0}",l):this.numAddCommas(l),r.text=l,r.x=x*a[0]/y+Math.cos(m)*V+g[0],r.y=x*a[1]/y+Math.sin(m)*V+g[1],this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),style:r,draggable:!1,hoverable:!1}))}},_buildText:function(e){for(var t,i,a,o,r,s,l,h=this.polar[e],m=h.__ecIndicator,V=this.deepQuery(this._queryTarget,"indicator"),U=this.getCenter(e),d=0,p=0,c=0;c<V.length;c++)o=this.deepQuery([V[c],h,this.option],"name"),o.show&&(l=this.deepQuery([o,h,this.option],"textStyle"),i={},i.textFont=this.getFont(l),i.color=l.color,i.text="function"==typeof o.formatter?o.formatter.call(this.myChart,V[c].text,c):"string"==typeof o.formatter?o.formatter.replace("{value}",V[c].text):V[c].text,m[c].text=i.text,t=m[c].vector,a=Math.round(t[0])>0?"left":Math.round(t[0])<0?"right":"center",null==o.margin?t=this._mapVector(t,U,1.1):(s=o.margin,d=t[0]>0?s:-s,p=t[1]>0?s:-s,d=0===t[0]?0:d,p=0===t[1]?0:p,t=this._mapVector(t,U,1)),i.textAlign=a,i.x=t[0]+d,i.y=t[1]+p,r=o.rotate?[o.rotate/180*Math.PI,t[0],t[1]]:[0,0,0],this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),style:i,draggable:!1,hoverable:!1,rotation:r})))},getIndicatorText:function(e,t){return this.polar[e]&&this.polar[e].__ecIndicator[t]&&this.polar[e].__ecIndicator[t].text},getDropBox:function(e){var t,i,e=e||0,n=this.polar[e],a=this.getCenter(e),o=n.__ecIndicator,r=o.length,s=[],l=n.type;if("polygon"==l){for(var h=0;r>h;h++)t=o[h].vector,s.push(this._mapVector(t,a,1.2));i=this._getShape(s,"fill","rgba(0,0,0,0)","",1)}else"circle"==l&&(i=this._getCircle("",1,1.2,a,"fill","rgba(0,0,0,0)"));return i},_addArea:function(e,t,i,n,a,o,r){for(var s,l,h,m,V=this.deepQuery(this._queryTarget,"type"),U=0;t>U;U++)l=(t-U)/t,r&&("polygon"==V?(m=this._getPointList(e,l,i),s=this._getShape(m,"stroke","",a,o)):"circle"==V&&(s=this._getCircle(a,o,l,i,"stroke")),this.shapeList.push(s)),n.show&&(h=(t-U-1)/t,this._addSplitArea(e,n,l,h,i,U))},_getCircle:function(e,t,i,n,a,o){var s=this._getRadius();return new r({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:n[0],y:n[1],r:s*i,brushType:a,strokeColor:e,lineWidth:t,color:o},hoverable:!1,draggable:!1})},_getRing:function(e,t,i,n){var a=this._getRadius();return new s({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:n[0],y:n[1],r:t*a,r0:i*a,color:e,brushType:"fill"},hoverable:!1,draggable:!1})},_getPointList:function(e,t,i){for(var n,a=[],o=e.length,r=0;o>r;r++)n=e[r].vector,a.push(this._mapVector(n,i,t));return a},_getShape:function(e,t,i,n,a){return new o({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{pointList:e,brushType:t,color:i,strokeColor:n,lineWidth:a},hoverable:!1,draggable:!1})},_addSplitArea:function(e,t,i,n,a,o){var r,s,l,h,m,V=e.length,U=t.areaStyle.color,d=[],V=e.length,p=this.deepQuery(this._queryTarget,"type");if("string"==typeof U&&(U=[U]),s=U.length,r=U[o%s],"polygon"==p)for(var c=0;V>c;c++)d=[],l=e[c].vector,h=e[(c+1)%V].vector,d.push(this._mapVector(l,a,i)),d.push(this._mapVector(l,a,n)),d.push(this._mapVector(h,a,n)),d.push(this._mapVector(h,a,i)),m=this._getShape(d,"fill",r,"",1),this.shapeList.push(m);else"circle"==p&&(m=this._getRing(r,i,n,a),this.shapeList.push(m))},_mapVector:function(e,t,i){return[e[0]*i+t[0],e[1]*i+t[1]]},getCenter:function(e){var e=e||0;return this.parseCenter(this.zr,this.polar[e].center)},_addLine:function(e,t,i){for(var n,a,o=e.length,r=i.lineStyle,s=r.color,l=r.width,h=r.type,m=0;o>m;m++)a=e[m].vector,n=this._getLine(t[0],t[1],a[0]+t[0],a[1]+t[1],s,l,h),this.shapeList.push(n)},_getLine:function(e,t,i,n,o,r,s){return new a({zlevel:this.getZlevelBase(),z:this.getZBase(),style:{xStart:e,yStart:t,xEnd:i,yEnd:n,strokeColor:o,lineWidth:r,lineType:s},hoverable:!1})},_adjustIndicatorValue:function(t){for(var i,n,a,o=this.polar[t],r=this.deepQuery(this._queryTarget,"indicator"),s=r.length,l=o.__ecIndicator,h=this._getSeriesData(t),m=o.boundaryGap,V=o.splitNumber,U=o.scale,d=e("../util/smartSteps"),p=0;s>p;p++){if("number"==typeof r[p].max)i=r[p].max,n=r[p].min||0,a={max:i,min:n};else{var c=this._findValue(h,p,V,m);n=c.min,i=c.max}!U&&n>=0&&i>=0&&(n=0),!U&&0>=n&&0>=i&&(i=0);var u=d(n,i,V,a);l[p].value={min:u.min,max:u.max,step:u.step}}},_getSeriesData:function(e){for(var t,i,n,a=[],o=this.component.legend,r=0;r<this.series.length;r++)if(t=this.series[r],t.type==l.CHART_TYPE_RADAR){i=t.data||[];for(var s=0;s<i.length;s++)n=this.deepQuery([i[s],t,this.option],"polarIndex")||0,n!=e||o&&!o.isSelected(i[s].name)||a.push(i[s])}return a},_findValue:function(e,t,i,n){function a(e){(e>o||void 0===o)&&(o=e),(r>e||void 0===r)&&(r=e)}var o,r,s;if(e&&0!==e.length){if(1==e.length&&(r=0),1!=e.length)for(var l=0;l<e.length;l++)a(this.getDataFromOption(e[l].value[t]));else{s=e[0];for(var l=0;l<s.value.length;l++)a(this.getDataFromOption(s.value[l]))}var h=Math.abs(o-r);return r-=Math.abs(h*n[0]),o+=Math.abs(h*n[1]),r===o&&(0===o?o=1:o>0?r=o/i:o/=i),{max:o,min:r}}},getVector:function(e,t,i){e=e||0,t=t||0;var n=this.polar[e].__ecIndicator;if(!(t>=n.length)){var a,o=this.polar[e].__ecIndicator[t],r=this.getCenter(e),s=o.vector,l=o.value.max,h=o.value.min;if("undefined"==typeof i)return r;switch(i){case"min":i=h;break;case"max":i=l;break;case"center":i=(l+h)/2}return a=l!=h?(i-h)/(l-h):.5,this._mapVector(s,r,a)}},isInside:function(e){var t=this.getNearestIndex(e);return t?t.polarIndex:-1},getNearestIndex:function(e){for(var t,i,n,a,o,r,s,l,h,V=0;V<this.polar.length;V++){if(t=this.polar[V],i=this.getCenter(V),e[0]==i[0]&&e[1]==i[1])return{polarIndex:V,valueIndex:0};if(n=this._getRadius(),o=t.startAngle,r=t.indicator,s=r.length,l=2*Math.PI/s,a=m.cartesian2polar(e[0]-i[0],i[1]-e[1]),e[0]-i[0]<0&&(a[1]+=Math.PI),a[1]<0&&(a[1]+=2*Math.PI),h=a[1]-o/180*Math.PI+2*Math.PI,Math.abs(Math.cos(h%(l/2)))*n>a[0])return{polarIndex:V,valueIndex:Math.floor((h+l/2)/l)%s}}},getIndicator:function(e){var e=e||0;return this.polar[e].indicator},refresh:function(e){e&&(this.option=e,this.polar=this.option.polar,this.series=this.option.series),this.clear(),this._buildShape()}},h.inherits(t,i),e("../component").define("polar",t),t}),i("echarts/util/coordinates",["require","zrender/tool/math"],function(e){function t(e,t){return[e*n.sin(t),e*n.cos(t)]}function i(e,t){return[Math.sqrt(e*e+t*t),Math.atan(t/e)]}var n=e("zrender/tool/math");return{polar2cartesian:t,cartesian2polar:i}}),i("echarts/chart/chord",["require","./base","zrender/shape/Text","zrender/shape/Line","zrender/shape/Sector","../util/shape/Ribbon","../util/shape/Icon","zrender/shape/BezierCurve","../config","../util/ecData","zrender/tool/util","zrender/tool/vector","../data/Graph","../layout/Chord","../chart"],function(e){"use strict";function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.scaleLineLength=4,this.scaleUnitAngle=4,this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Line"),o=e("zrender/shape/Sector"),r=e("../util/shape/Ribbon"),s=e("../util/shape/Icon"),l=e("zrender/shape/BezierCurve"),h=e("../config");h.chord={zlevel:0,z:2,clickable:!0,radius:["65%","75%"],center:["50%","50%"],padding:2,sort:"none",sortSub:"none",startAngle:90,clockWise:!0,ribbonType:!0,minRadius:10,maxRadius:20,symbol:"circle",showScale:!1,showScaleText:!1,itemStyle:{normal:{borderWidth:0,borderColor:"#000",label:{show:!0,rotate:!1,distance:5},chordStyle:{width:1,color:"black",borderWidth:1,borderColor:"#999",opacity:.5}},emphasis:{borderWidth:0,borderColor:"#000",chordStyle:{width:1,color:"black",borderWidth:1,borderColor:"#999"}}}};var m=e("../util/ecData"),V=e("zrender/tool/util"),U=e("zrender/tool/vector"),d=e("../data/Graph"),p=e("../layout/Chord");return t.prototype={type:h.CHART_TYPE_CHORD,_init:function(){var e=this.series;this.selectedMap={};for(var t={},i={},n=0,a=e.length;a>n;n++)if(e[n].type===this.type){var o=this.isSelected(e[n].name);this.selectedMap[e[n].name]=o,o&&this.buildMark(n),this.reformOption(e[n]),t[e[n].name]=e[n]}for(var n=0,a=e.length;a>n;n++)if(e[n].type===this.type)if(e[n].insertToSerie){var r=t[e[n].insertToSerie];e[n]._referenceSerie=r}else i[e[n].name]=[e[n]];for(var n=0,a=e.length;a>n;n++)if(e[n].type===this.type&&e[n].insertToSerie){for(var s=e[n]._referenceSerie;s&&s._referenceSerie;)s=s._referenceSerie;i[s.name]&&this.selectedMap[e[n].name]&&i[s.name].push(e[n])}for(var l in i)this._buildChords(i[l]);this.addShapeList()},_getNodeCategory:function(e,t){return e.categories&&e.categories[t.category||0]},_getNodeQueryTarget:function(e,t){var i=this._getNodeCategory(e,t);return[t,i,e]},_getEdgeQueryTarget:function(e,t,i){return i=i||"normal",[t.itemStyle&&t.itemStyle[i],e.itemStyle[i].chordStyle]},_buildChords:function(e){for(var t=[],i=e[0],n=function(e){return e.layout.size>0},a=function(e){return function(t){return e.getEdge(t.node2,t.node1)}},o=0;o<e.length;o++){var r=e[o];if(this.selectedMap[r.name]){var s;r.matrix?s=this._getSerieGraphFromDataMatrix(r,i):r.links&&(s=this._getSerieGraphFromNodeLinks(r,i)),s.filterNode(n,this),r.ribbonType&&s.filterEdge(a(s)),t.push(s),s.__serie=r}}if(t.length){var l=t[0];if(!i.ribbonType){var h=i.minRadius,m=i.maxRadius,V=1/0,U=-(1/0);l.eachNode(function(e){U=Math.max(e.layout.size,U),V=Math.min(e.layout.size,V)});var d=(m-h)/(U-V);l.eachNode(function(e){var t=this._getNodeQueryTarget(i,e),n=this.query(t,"symbolSize");e.layout.size=U===V?n||V:n||(e.layout.size-V)*d+h},this)}var c=new p;c.clockWise=i.clockWise,c.startAngle=i.startAngle*Math.PI/180,c.clockWise||(c.startAngle=-c.startAngle),c.padding=i.padding*Math.PI/180,c.sort=i.sort,c.sortSub=i.sortSub,c.directed=i.ribbonType,c.run(t);var u=this.query(i,"itemStyle.normal.label.show");if(i.ribbonType){this._buildSectors(i,0,l,i,t),u&&this._buildLabels(i,0,l,i,t);for(var o=0,y=0;o<e.length;o++)this.selectedMap[e[o].name]&&this._buildRibbons(e,o,t[y++],i);i.showScale&&this._buildScales(i,0,l)}else{this._buildNodeIcons(i,0,l,i,t),u&&this._buildLabels(i,0,l,i,t);for(var o=0,y=0;o<e.length;o++)this.selectedMap[e[o].name]&&this._buildEdgeCurves(e,o,t[y++],i,l)}this._initHoverHandler(e,t)}},_getSerieGraphFromDataMatrix:function(e,t){for(var i=[],n=0,a=[],o=0;o<e.matrix.length;o++)a[o]=e.matrix[o].slice();for(var r=e.data||e.nodes,o=0;o<r.length;o++){var s={},l=r[o];l.rawIndex=o;for(var h in l)"name"===h?s.id=l.name:s[h]=l[h];var m=this._getNodeCategory(t,l),V=m?m.name:l.name;if(this.selectedMap[V]=this.isSelected(V),this.selectedMap[V])i.push(s),n++;else{a.splice(n,1);for(var U=0;U<a.length;U++)a[U].splice(n,1)}}var p=d.fromMatrix(i,a,!0);return p.eachNode(function(e){e.layout={size:e.data.outValue},e.rawIndex=e.data.rawIndex}),p.eachEdge(function(e){e.layout={weight:e.data.weight}}),p},_getSerieGraphFromNodeLinks:function(e,t){for(var i=new d(!0),n=e.data||e.nodes,a=0,o=n.length;o>a;a++){var r=n[a];if(r&&!r.ignore){var s=this._getNodeCategory(t,r),l=s?s.name:r.name;if(this.selectedMap[l]=this.isSelected(l),this.selectedMap[l]){var h=i.addNode(r.name,r);h.rawIndex=a}}}for(var a=0,o=e.links.length;o>a;a++){var m=e.links[a],V=m.source,U=m.target;"number"==typeof V&&(V=n[V],V&&(V=V.name)),"number"==typeof U&&(U=n[U],U&&(U=U.name));var p=i.addEdge(V,U,m);p&&(p.rawIndex=a)}return i.eachNode(function(e){var i=e.data.value;if(null==i)if(i=0,t.ribbonType)for(var n=0;n<e.outEdges.length;n++)i+=e.outEdges[n].data.weight||0;else for(var n=0;n<e.edges.length;n++)i+=e.edges[n].data.weight||0;e.layout={size:i}}),i.eachEdge(function(e){e.layout={weight:null==e.data.weight?1:e.data.weight}}),i},_initHoverHandler:function(e,t){var i=e[0],n=t[0],a=this;n.eachNode(function(e){e.shape.onmouseover=function(){n.eachNode(function(e){e.shape.style.opacity=.1,e.labelShape&&(e.labelShape.style.opacity=.1,e.labelShape.modSelf()),e.shape.modSelf()});for(var i=0;i<t.length;i++)for(var o=0;o<t[i].edges.length;o++){var r=t[i].edges[o],s=a._getEdgeQueryTarget(t[i].__serie,r.data);r.shape.style.opacity=.1*a.deepQuery(s,"opacity"),r.shape.modSelf()}e.shape.style.opacity=1,e.labelShape&&(e.labelShape.style.opacity=1);for(var i=0;i<t.length;i++){var l=t[i].getNodeById(e.id);if(l)for(var o=0;o<l.outEdges.length;o++){var r=l.outEdges[o],s=a._getEdgeQueryTarget(t[i].__serie,r.data);r.shape.style.opacity=a.deepQuery(s,"opacity");var h=t[0].getNodeById(r.node2.id);h&&(h.shape&&(h.shape.style.opacity=1),h.labelShape&&(h.labelShape.style.opacity=1))}}a.zr.refreshNextFrame()},e.shape.onmouseout=function(){n.eachNode(function(e){e.shape.style.opacity=1,e.labelShape&&(e.labelShape.style.opacity=1,e.labelShape.modSelf()),e.shape.modSelf()});for(var e=0;e<t.length;e++)for(var o=0;o<t[e].edges.length;o++){var r=t[e].edges[o],s=[r.data,i];r.shape.style.opacity=a.deepQuery(s,"itemStyle.normal.chordStyle.opacity"),r.shape.modSelf()}a.zr.refreshNextFrame()}})},_buildSectors:function(e,t,i,n){var a=this.parseCenter(this.zr,n.center),r=this.parseRadius(this.zr,n.radius),s=n.clockWise,l=s?1:-1;i.eachNode(function(i){var h=this._getNodeCategory(n,i.data),V=this.getColor(h?h.name:i.id),U=i.layout.startAngle/Math.PI*180*l,d=i.layout.endAngle/Math.PI*180*l,p=new o({zlevel:e.zlevel,z:e.z,style:{x:a[0],y:a[1],r0:r[0],r:r[1],startAngle:U,endAngle:d,brushType:"fill",opacity:1,color:V,clockWise:s},clickable:n.clickable,highlightStyle:{brushType:"fill"}});p.style.lineWidth=this.deepQuery([i.data,n],"itemStyle.normal.borderWidth"),p.highlightStyle.lineWidth=this.deepQuery([i.data,n],"itemStyle.emphasis.borderWidth"),p.style.strokeColor=this.deepQuery([i.data,n],"itemStyle.normal.borderColor"),p.highlightStyle.strokeColor=this.deepQuery([i.data,n],"itemStyle.emphasis.borderColor"),p.style.lineWidth>0&&(p.style.brushType="both"),p.highlightStyle.lineWidth>0&&(p.highlightStyle.brushType="both"),m.pack(p,e,t,i.data,i.rawIndex,i.id,i.category),this.shapeList.push(p),i.shape=p},this)},_buildNodeIcons:function(e,t,i,n){var a=this.parseCenter(this.zr,n.center),o=this.parseRadius(this.zr,n.radius),r=o[1];i.eachNode(function(i){var o=i.layout.startAngle,l=i.layout.endAngle,h=(o+l)/2,V=r*Math.cos(h),U=r*Math.sin(h),d=this._getNodeQueryTarget(n,i.data),p=this._getNodeCategory(n,i.data),c=this.deepQuery(d,"itemStyle.normal.color");c||(c=this.getColor(p?p.name:i.id));var u=new s({zlevel:e.zlevel,z:e.z+1,style:{x:-i.layout.size,y:-i.layout.size,width:2*i.layout.size,height:2*i.layout.size,iconType:this.deepQuery(d,"symbol"),color:c,brushType:"both",lineWidth:this.deepQuery(d,"itemStyle.normal.borderWidth"),strokeColor:this.deepQuery(d,"itemStyle.normal.borderColor")},highlightStyle:{color:this.deepQuery(d,"itemStyle.emphasis.color"),lineWidth:this.deepQuery(d,"itemStyle.emphasis.borderWidth"),strokeColor:this.deepQuery(d,"itemStyle.emphasis.borderColor")},clickable:n.clickable,position:[V+a[0],U+a[1]]});m.pack(u,e,t,i.data,i.rawIndex,i.id,i.category),this.shapeList.push(u),i.shape=u},this)},_buildLabels:function(e,t,i,a){var o=this.query(a,"itemStyle.normal.label.rotate"),r=this.query(a,"itemStyle.normal.label.distance"),s=this.parseCenter(this.zr,a.center),l=this.parseRadius(this.zr,a.radius),h=a.clockWise,m=h?1:-1;
-
-i.eachNode(function(t){var i=t.layout.startAngle/Math.PI*180*m,h=t.layout.endAngle/Math.PI*180*m,V=(i*-m+h*-m)/2;V%=360,0>V&&(V+=360);var d=90>=V||V>=270;V=V*Math.PI/180;var p=[Math.cos(V),-Math.sin(V)],c=0;c=a.ribbonType?a.showScaleText?35+r:r:r+t.layout.size;var u=U.scale([],p,l[1]+c);U.add(u,u,s);var y={zlevel:e.zlevel,z:e.z+1,hoverable:!1,style:{text:null==t.data.label?t.id:t.data.label,textAlign:d?"left":"right"}};o?(y.rotation=d?V:Math.PI+V,y.style.x=d?l[1]+c:-l[1]-c,y.style.y=0,y.position=s.slice()):(y.style.x=u[0],y.style.y=u[1]),y.style.color=this.deepQuery([t.data,a],"itemStyle.normal.label.textStyle.color")||"#000000",y.style.textFont=this.getFont(this.deepQuery([t.data,a],"itemStyle.normal.label.textStyle")),y=new n(y),this.shapeList.push(y),t.labelShape=y},this)},_buildRibbons:function(e,t,i,n){var a=e[t],o=this.parseCenter(this.zr,n.center),s=this.parseRadius(this.zr,n.radius);i.eachEdge(function(l,h){var V,U=i.getEdge(l.node2,l.node1);if(U&&!l.shape){if(U.shape)return void(l.shape=U.shape);var d=l.layout.startAngle/Math.PI*180,p=l.layout.endAngle/Math.PI*180,c=U.layout.startAngle/Math.PI*180,u=U.layout.endAngle/Math.PI*180;V=this.getColor(1===e.length?l.layout.weight<=U.layout.weight?l.node1.id:l.node2.id:a.name);var y,g,b=this._getEdgeQueryTarget(a,l.data),f=this._getEdgeQueryTarget(a,l.data,"emphasis"),k=new r({zlevel:a.zlevel,z:a.z,style:{x:o[0],y:o[1],r:s[0],source0:d,source1:p,target0:c,target1:u,brushType:"both",opacity:this.deepQuery(b,"opacity"),color:V,lineWidth:this.deepQuery(b,"borderWidth"),strokeColor:this.deepQuery(b,"borderColor"),clockWise:n.clockWise},clickable:n.clickable,highlightStyle:{brushType:"both",opacity:this.deepQuery(f,"opacity"),lineWidth:this.deepQuery(f,"borderWidth"),strokeColor:this.deepQuery(f,"borderColor")}});l.layout.weight<=U.layout.weight?(y=U.node1,g=U.node2):(y=l.node1,g=l.node2),m.pack(k,a,t,l.data,null==l.rawIndex?h:l.rawIndex,l.data.name||y.id+"-"+g.id,y.id,g.id),this.shapeList.push(k),l.shape=k}},this)},_buildEdgeCurves:function(e,t,i,n,a){var o=e[t],r=this.parseCenter(this.zr,n.center);i.eachEdge(function(e,i){var n=a.getNodeById(e.node1.id),s=a.getNodeById(e.node2.id),h=n.shape,V=s.shape,U=this._getEdgeQueryTarget(o,e.data),d=this._getEdgeQueryTarget(o,e.data,"emphasis"),p=new l({zlevel:o.zlevel,z:o.z,style:{xStart:h.position[0],yStart:h.position[1],xEnd:V.position[0],yEnd:V.position[1],cpX1:r[0],cpY1:r[1],lineWidth:this.deepQuery(U,"width"),strokeColor:this.deepQuery(U,"color"),opacity:this.deepQuery(U,"opacity")},highlightStyle:{lineWidth:this.deepQuery(d,"width"),strokeColor:this.deepQuery(d,"color"),opacity:this.deepQuery(d,"opacity")}});m.pack(p,o,t,e.data,null==e.rawIndex?i:e.rawIndex,e.data.name||e.node1.id+"-"+e.node2.id,e.node1.id,e.node2.id),this.shapeList.push(p),e.shape=p},this)},_buildScales:function(e,t,i){var o,r,s=e.clockWise,l=this.parseCenter(this.zr,e.center),h=this.parseRadius(this.zr,e.radius),m=s?1:-1,V=0,d=-(1/0);e.showScaleText&&(i.eachNode(function(e){var t=e.data.value;t>d&&(d=t),V+=t}),d>1e10?(o="b",r=1e-9):d>1e7?(o="m",r=1e-6):d>1e4?(o="k",r=.001):(o="",r=1));var p=V/(360-e.padding);i.eachNode(function(t){for(var i=t.layout.startAngle/Math.PI*180,V=t.layout.endAngle/Math.PI*180,d=i;;){if(s&&d>V||!s&&V>d)break;var c=d/180*Math.PI,u=[Math.cos(c),Math.sin(c)],y=U.scale([],u,h[1]+1);U.add(y,y,l);var g=U.scale([],u,h[1]+this.scaleLineLength);U.add(g,g,l);var b=new a({zlevel:e.zlevel,z:e.z-1,hoverable:!1,style:{xStart:y[0],yStart:y[1],xEnd:g[0],yEnd:g[1],lineCap:"round",brushType:"stroke",strokeColor:"#666",lineWidth:1}});this.shapeList.push(b),d+=m*this.scaleUnitAngle}if(e.showScaleText)for(var f=i,k=5*p*this.scaleUnitAngle,x=0;;){if(s&&f>V||!s&&V>f)break;var c=f;c%=360,0>c&&(c+=360);var _=90>=c||c>=270,L=new n({zlevel:e.zlevel,z:e.z-1,hoverable:!1,style:{x:_?h[1]+this.scaleLineLength+4:-h[1]-this.scaleLineLength-4,y:0,text:Math.round(10*x)/10+o,textAlign:_?"left":"right"},position:l.slice(),rotation:_?[-c/180*Math.PI,0,0]:[-(c+180)/180*Math.PI,0,0]});this.shapeList.push(L),x+=k*r,f+=m*this.scaleUnitAngle*5}},this)},refresh:function(e){if(e&&(this.option=e,this.series=e.series),this.legend=this.component.legend,this.legend)this.getColor=function(e){return this.legend.getColor(e)},this.isSelected=function(e){return this.legend.isSelected(e)};else{var t={},i=0;this.getColor=function(e){return t[e]?t[e]:(t[e]||(t[e]=this.zr.getColor(i++)),t[e])},this.isSelected=function(){return!0}}this.backupShapeList(),this._init()},reformOption:function(e){var t=V.merge;e=t(t(e||{},this.ecTheme.chord),h.chord),e.itemStyle.normal.label.textStyle=this.getTextStyle(e.itemStyle.normal.label.textStyle),this.z=e.z,this.zlevel=e.zlevel}},V.inherits(t,i),e("../chart").define("chord",t),t}),i("echarts/util/shape/Ribbon",["require","zrender/shape/Base","zrender/shape/util/PathProxy","zrender/tool/util","zrender/tool/area"],function(e){function t(e){i.call(this,e),this._pathProxy=new n}var i=e("zrender/shape/Base"),n=e("zrender/shape/util/PathProxy"),a=e("zrender/tool/util"),o=e("zrender/tool/area");return t.prototype={type:"ribbon",buildPath:function(e,t){var i=t.clockWise||!1,n=this._pathProxy;n.begin(e);var a=t.x,o=t.y,r=t.r,s=t.source0/180*Math.PI,l=t.source1/180*Math.PI,h=t.target0/180*Math.PI,m=t.target1/180*Math.PI,V=a+Math.cos(s)*r,U=o+Math.sin(s)*r,d=a+Math.cos(l)*r,p=o+Math.sin(l)*r,c=a+Math.cos(h)*r,u=o+Math.sin(h)*r,y=a+Math.cos(m)*r,g=o+Math.sin(m)*r;n.moveTo(V,U),n.arc(a,o,t.r,s,l,!i),n.bezierCurveTo(.7*(a-d)+d,.7*(o-p)+p,.7*(a-c)+c,.7*(o-u)+u,c,u),(t.source0!==t.target0||t.source1!==t.target1)&&(n.arc(a,o,t.r,h,m,!i),n.bezierCurveTo(.7*(a-y)+y,.7*(o-g)+g,.7*(a-V)+V,.7*(o-U)+U,V,U))},getRect:function(e){return e.__rect?e.__rect:(this._pathProxy.isEmpty()||this.buildPath(null,e),this._pathProxy.fastBoundingRect())},isCover:function(e,t){var i=this.getRect(this.style);return e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height?o.isInsidePath(this._pathProxy.pathCommands,0,"fill",e,t):void 0}},a.inherits(t,i),t}),i("echarts/data/Graph",["require","zrender/tool/util"],function(e){var t=e("zrender/tool/util"),i=function(e){this._directed=e||!1,this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={}};i.prototype.isDirected=function(){return this._directed},i.prototype.addNode=function(e,t){if(this._nodesMap[e])return this._nodesMap[e];var n=new i.Node(e,t);return this.nodes.push(n),this._nodesMap[e]=n,n},i.prototype.getNodeById=function(e){return this._nodesMap[e]},i.prototype.addEdge=function(e,t,n){if("string"==typeof e&&(e=this._nodesMap[e]),"string"==typeof t&&(t=this._nodesMap[t]),e&&t){var a=e.id+"-"+t.id;if(this._edgesMap[a])return this._edgesMap[a];var o=new i.Edge(e,t,n);return this._directed&&(e.outEdges.push(o),t.inEdges.push(o)),e.edges.push(o),e!==t&&t.edges.push(o),this.edges.push(o),this._edgesMap[a]=o,o}},i.prototype.removeEdge=function(e){var i=e.node1,n=e.node2,a=i.id+"-"+n.id;this._directed&&(i.outEdges.splice(t.indexOf(i.outEdges,e),1),n.inEdges.splice(t.indexOf(n.inEdges,e),1)),i.edges.splice(t.indexOf(i.edges,e),1),i!==n&&n.edges.splice(t.indexOf(n.edges,e),1),delete this._edgesMap[a],this.edges.splice(t.indexOf(this.edges,e),1)},i.prototype.getEdge=function(e,t){return"string"!=typeof e&&(e=e.id),"string"!=typeof t&&(t=t.id),this._directed?this._edgesMap[e+"-"+t]:this._edgesMap[e+"-"+t]||this._edgesMap[t+"-"+e]},i.prototype.removeNode=function(e){if("string"!=typeof e||(e=this._nodesMap[e])){delete this._nodesMap[e.id],this.nodes.splice(t.indexOf(this.nodes,e),1);for(var i=0;i<this.edges.length;){var n=this.edges[i];n.node1===e||n.node2===e?this.removeEdge(n):i++}}},i.prototype.filterNode=function(e,t){for(var i=this.nodes.length,n=0;i>n;)e.call(t,this.nodes[n],n)?n++:(this.removeNode(this.nodes[n]),i--)},i.prototype.filterEdge=function(e,t){for(var i=this.edges.length,n=0;i>n;)e.call(t,this.edges[n],n)?n++:(this.removeEdge(this.edges[n]),i--)},i.prototype.eachNode=function(e,t){for(var i=this.nodes.length,n=0;i>n;n++)this.nodes[n]&&e.call(t,this.nodes[n],n)},i.prototype.eachEdge=function(e,t){for(var i=this.edges.length,n=0;i>n;n++)this.edges[n]&&e.call(t,this.edges[n],n)},i.prototype.clear=function(){this.nodes.length=0,this.edges.length=0,this._nodesMap={},this._edgesMap={}},i.prototype.breadthFirstTraverse=function(e,t,i,n){if("string"==typeof t&&(t=this._nodesMap[t]),t){var a="edges";"out"===i?a="outEdges":"in"===i&&(a="inEdges");for(var o=0;o<this.nodes.length;o++)this.nodes[o].__visited=!1;if(!e.call(n,t,null))for(var r=[t];r.length;)for(var s=r.shift(),l=s[a],o=0;o<l.length;o++){var h=l[o],m=h.node1===s?h.node2:h.node1;if(!m.__visited){if(e.call(m,m,s))return;r.push(m),m.__visited=!0}}}},i.prototype.clone=function(){for(var e=new i(this._directed),t=0;t<this.nodes.length;t++)e.addNode(this.nodes[t].id,this.nodes[t].data);for(var t=0;t<this.edges.length;t++){var n=this.edges[t];e.addEdge(n.node1.id,n.node2.id,n.data)}return e};var n=function(e,t){this.id=e,this.data=t||null,this.inEdges=[],this.outEdges=[],this.edges=[]};n.prototype.degree=function(){return this.edges.length},n.prototype.inDegree=function(){return this.inEdges.length},n.prototype.outDegree=function(){return this.outEdges.length};var a=function(e,t,i){this.node1=e,this.node2=t,this.data=i||null};return i.Node=n,i.Edge=a,i.fromMatrix=function(e,t,n){if(t&&t.length&&t[0].length===t.length&&e.length===t.length){for(var a=t.length,o=new i(n),r=0;a>r;r++){var s=o.addNode(e[r].id,e[r]);s.data.value=0,n&&(s.data.outValue=s.data.inValue=0)}for(var r=0;a>r;r++)for(var l=0;a>l;l++){var h=t[r][l];n&&(o.nodes[r].data.outValue+=h,o.nodes[l].data.inValue+=h),o.nodes[r].data.value+=h,o.nodes[l].data.value+=h}for(var r=0;a>r;r++)for(var l=r;a>l;l++){var h=t[r][l];if(0!==h){var m=o.nodes[r],V=o.nodes[l],U=o.addEdge(m,V,{});if(U.data.weight=h,r!==l&&n&&t[l][r]){var d=o.addEdge(V,m,{});d.data.weight=t[l][r]}}}return o}},i}),i("echarts/layout/Chord",["require"],function(){var e=function(e){e=e||{},this.sort=e.sort||null,this.sortSub=e.sortSub||null,this.padding=.05,this.startAngle=e.startAngle||0,this.clockWise=null==e.clockWise?!1:e.clockWise,this.center=e.center||[0,0],this.directed=!0};e.prototype.run=function(e){e instanceof Array||(e=[e]);var n=e.length;if(n){for(var a=e[0],o=a.nodes.length,r=[],s=0,l=0;o>l;l++){var h=a.nodes[l],m={size:0,subGroups:[],node:h};r.push(m);for(var V=0,U=0;U<e.length;U++){var d=e[U],p=d.getNodeById(h.id);if(p){m.size+=p.layout.size;for(var c=this.directed?p.outEdges:p.edges,u=0;u<c.length;u++){var y=c[u],g=y.layout.weight;m.subGroups.push({weight:g,edge:y,graph:d}),V+=g}}}s+=m.size;for(var b=m.size/V,u=0;u<m.subGroups.length;u++)m.subGroups[u].weight*=b;"ascending"===this.sortSub?m.subGroups.sort(t):"descending"===this.sort&&(m.subGroups.sort(t),m.subGroups.reverse())}"ascending"===this.sort?r.sort(i):"descending"===this.sort&&(r.sort(i),r.reverse());for(var b=(2*Math.PI-this.padding*o)/s,f=this.startAngle,k=this.clockWise?1:-1,l=0;o>l;l++){var m=r[l];m.node.layout.startAngle=f,m.node.layout.endAngle=f+k*m.size*b,m.node.layout.subGroups=[];for(var u=0;u<m.subGroups.length;u++){var x=m.subGroups[u];x.edge.layout.startAngle=f,f+=k*x.weight*b,x.edge.layout.endAngle=f}f=m.node.layout.endAngle+k*this.padding}}};var t=function(e,t){return e.weight-t.weight},i=function(e,t){return e.size-t.size};return e}),i("echarts/chart/force",["require","./base","../data/Graph","../layout/Force","zrender/shape/Line","zrender/shape/BezierCurve","zrender/shape/Image","../util/shape/Icon","../config","../util/ecData","zrender/tool/util","zrender/config","zrender/tool/vector","../chart"],function(e){"use strict";function t(e,t,o,h,m){var V=this;r.call(this,e,t,o,h,m),this.__nodePositionMap={},this._graph=new s(!0),this._layout=new l,this._layout.onupdate=function(){V._step()},this._steps=1,this.ondragstart=function(){i.apply(V,arguments)},this.ondragend=function(){a.apply(V,arguments)},this.ondrop=function(){},this.shapeHandler.ondragstart=function(){V.isDragstart=!0},this.onmousemove=function(){n.apply(V,arguments)},this.refresh(h)}function i(e){if(this.isDragstart&&e.target){var t=e.target;t.fixed=!0,this.isDragstart=!1,this.zr.on(u.EVENT.MOUSEMOVE,this.onmousemove)}}function n(){this._layout.temperature=.8,this._step()}function a(e,t){if(this.isDragend&&e.target){var i=e.target;i.fixed=!1,t.dragIn=!0,t.needRefresh=!1,this.isDragend=!1,this.zr.un(u.EVENT.MOUSEMOVE,this.onmousemove)}}function o(e,t,i){var n=y.create();return n[0]=(Math.random()-.5)*i+e,n[1]=(Math.random()-.5)*i+t,n}var r=e("./base"),s=e("../data/Graph"),l=e("../layout/Force"),h=e("zrender/shape/Line"),m=e("zrender/shape/BezierCurve"),V=e("zrender/shape/Image"),U=e("../util/shape/Icon"),d=e("../config");d.force={zlevel:1,z:2,center:["50%","50%"],size:"100%",preventOverlap:!1,coolDown:.99,minRadius:10,maxRadius:20,ratioScaling:!1,large:!1,useWorker:!1,steps:1,scaling:1,gravity:1,symbol:"circle",symbolSize:0,linkSymbol:null,linkSymbolSize:[10,15],draggable:!0,clickable:!0,roam:!1,itemStyle:{normal:{label:{show:!1,position:"inside"},nodeStyle:{brushType:"both",borderColor:"#5182ab",borderWidth:1},linkStyle:{color:"#5182ab",width:1,type:"line"}},emphasis:{label:{show:!1},nodeStyle:{},linkStyle:{opacity:0}}}};var p=e("../util/ecData"),c=e("zrender/tool/util"),u=e("zrender/config"),y=e("zrender/tool/vector");return t.prototype={constructor:t,type:d.CHART_TYPE_FORCE,_init:function(){this.selectedMap={};var e,t=this.component.legend,i=this.series;this.clear();for(var n=0,a=i.length;a>n;n++){var o=i[n];if(o.type===d.CHART_TYPE_FORCE){if(i[n]=this.reformOption(i[n]),e=i[n].name||"",this.selectedMap[e]=t?t.isSelected(e):!0,!this.selectedMap[e])continue;this.buildMark(n),this._initSerie(o,n);break}}this.animationEffect()},_getNodeCategory:function(e,t){return e.categories&&e.categories[t.category||0]},_getNodeQueryTarget:function(e,t,i){i=i||"normal";var n=this._getNodeCategory(e,t)||{};return[t.itemStyle&&t.itemStyle[i],n&&n.itemStyle&&n.itemStyle[i],e.itemStyle[i].nodeStyle]},_getEdgeQueryTarget:function(e,t,i){return i=i||"normal",[t.itemStyle&&t.itemStyle[i],e.itemStyle[i].linkStyle]},_initSerie:function(e,t){this._temperature=1,e.matrix?this._graph=this._getSerieGraphFromDataMatrix(e):e.links&&(this._graph=this._getSerieGraphFromNodeLinks(e)),this._buildLinkShapes(e,t),this._buildNodeShapes(e,t);var i=e.roam===!0||"move"===e.roam,n=e.roam===!0||"scale"===e.roam;this.zr.modLayer(this.getZlevelBase(),{panable:i,zoomable:n}),(this.query("markPoint.effect.show")||this.query("markLine.effect.show"))&&this.zr.modLayer(d.EFFECT_ZLEVEL,{panable:i,zoomable:n}),this._initLayout(e),this._step()},_getSerieGraphFromDataMatrix:function(e){for(var t=[],i=0,n=[],a=0;a<e.matrix.length;a++)n[a]=e.matrix[a].slice();for(var o=e.data||e.nodes,a=0;a<o.length;a++){var r={},l=o[a];for(var h in l)"name"===h?r.id=l.name:r[h]=l[h];var m=this._getNodeCategory(e,l),V=m?m.name:l.name;if(this.selectedMap[V]=this.isSelected(V),this.selectedMap[V])t.push(r),i++;else{n.splice(i,1);for(var U=0;U<n.length;U++)n[U].splice(i,1)}}var d=s.fromMatrix(t,n,!0);return d.eachNode(function(e,t){e.layout={size:e.data.value,mass:0},e.rawIndex=t}),d.eachEdge(function(e){e.layout={weight:e.data.weight}}),d},_getSerieGraphFromNodeLinks:function(e){for(var t=new s(!0),i=e.data||e.nodes,n=0,a=i.length;a>n;n++){var o=i[n];if(o&&!o.ignore){var r=this._getNodeCategory(e,o),l=r?r.name:o.name;if(this.selectedMap[l]=this.isSelected(l),this.selectedMap[l]){var h=t.addNode(o.name,o);h.rawIndex=n}}}for(var n=0,a=e.links.length;a>n;n++){var m=e.links[n],V=m.source,U=m.target;"number"==typeof V&&(V=i[V],V&&(V=V.name)),"number"==typeof U&&(U=i[U],U&&(U=U.name));var d=t.addEdge(V,U,m);d&&(d.rawIndex=n)}return t.eachNode(function(e){var t=e.data.value;if(null==t){t=0;for(var i=0;i<e.edges.length;i++)t+=e.edges[i].data.weight||0}e.layout={size:t,mass:0}}),t.eachEdge(function(e){e.layout={weight:null==e.data.weight?1:e.data.weight}}),t},_initLayout:function(e){var t=this._graph,i=t.nodes.length,n=this.query(e,"minRadius"),a=this.query(e,"maxRadius");this._steps=e.steps||1;var r=this._layout;r.center=this.parseCenter(this.zr,e.center),r.width=this.parsePercent(e.size,this.zr.getWidth()),r.height=this.parsePercent(e.size,this.zr.getHeight()),r.large=e.large,r.scaling=e.scaling,r.ratioScaling=e.ratioScaling,r.gravity=e.gravity,r.temperature=1,r.coolDown=e.coolDown,r.preventNodeEdgeOverlap=e.preventOverlap,r.preventNodeOverlap=e.preventOverlap;for(var s=1/0,l=-(1/0),h=0;i>h;h++){var m=t.nodes[h];l=Math.max(m.layout.size,l),s=Math.min(m.layout.size,s)}for(var V=l-s,h=0;i>h;h++){var m=t.nodes[h];V>0?(m.layout.size=(m.layout.size-s)*(a-n)/V+n,m.layout.mass=m.layout.size/a):(m.layout.size=(a-n)/2,m.layout.mass=.5)}for(var h=0;i>h;h++){var m=t.nodes[h];if("undefined"!=typeof this.__nodePositionMap[m.id])m.layout.position=y.create(),y.copy(m.layout.position,this.__nodePositionMap[m.id]);else if("undefined"!=typeof m.data.initial)m.layout.position=y.create(),y.copy(m.layout.position,m.data.initial);else{var U=this._layout.center,d=Math.min(this._layout.width,this._layout.height);m.layout.position=o(U[0],U[1],.8*d)}var p=m.shape.style,c=m.layout.size;p.width=p.width||2*c,p.height=p.height||2*c,p.x=-p.width/2,p.y=-p.height/2,y.copy(m.shape.position,m.layout.position)}i=t.edges.length,l=-(1/0);for(var h=0;i>h;h++){var u=t.edges[h];u.layout.weight>l&&(l=u.layout.weight)}for(var h=0;i>h;h++){var u=t.edges[h];u.layout.weight/=l}this._layout.init(t,e.useWorker)},_buildNodeShapes:function(e,t){var i=this._graph,n=this.query(e,"categories");i.eachNode(function(i){var a=this._getNodeCategory(e,i.data),o=[i.data,a,e],r=this._getNodeQueryTarget(e,i.data),s=this._getNodeQueryTarget(e,i.data,"emphasis"),l=new U({style:{x:0,y:0,color:this.deepQuery(r,"color"),brushType:"both",strokeColor:this.deepQuery(r,"strokeColor")||this.deepQuery(r,"borderColor"),lineWidth:this.deepQuery(r,"lineWidth")||this.deepQuery(r,"borderWidth")},highlightStyle:{color:this.deepQuery(s,"color"),strokeColor:this.deepQuery(s,"strokeColor")||this.deepQuery(s,"borderColor"),lineWidth:this.deepQuery(s,"lineWidth")||this.deepQuery(s,"borderWidth")},clickable:e.clickable,zlevel:this.getZlevelBase(),z:this.getZBase()});l.style.color||(l.style.color=this.getColor(a?a.name:i.id)),l.style.iconType=this.deepQuery(o,"symbol");var h=this.deepQuery(o,"symbolSize")||0;"number"==typeof h&&(h=[h,h]),l.style.width=2*h[0],l.style.height=2*h[1],l.style.iconType.match("image")&&(l.style.image=l.style.iconType.replace(new RegExp("^image:\\/\\/"),""),l=new V({style:l.style,highlightStyle:l.highlightStyle,clickable:l.clickable,zlevel:this.getZlevelBase(),z:this.getZBase()})),this.deepQuery(o,"itemStyle.normal.label.show")&&(l.style.text=null==i.data.label?i.id:i.data.label,l.style.textPosition=this.deepQuery(o,"itemStyle.normal.label.position"),l.style.textColor=this.deepQuery(o,"itemStyle.normal.label.textStyle.color"),l.style.textFont=this.getFont(this.deepQuery(o,"itemStyle.normal.label.textStyle")||{})),this.deepQuery(o,"itemStyle.emphasis.label.show")&&(l.highlightStyle.textPosition=this.deepQuery(o,"itemStyle.emphasis.label.position"),l.highlightStyle.textColor=this.deepQuery(o,"itemStyle.emphasis.label.textStyle.color"),l.highlightStyle.textFont=this.getFont(this.deepQuery(o,"itemStyle.emphasis.label.textStyle")||{})),this.deepQuery(o,"draggable")&&(this.setCalculable(l),l.dragEnableTime=0,l.draggable=!0,l.ondragstart=this.shapeHandler.ondragstart,l.ondragover=null);var m="";if("undefined"!=typeof i.category){var a=n[i.category];m=a&&a.name||""}p.pack(l,e,t,i.data,i.rawIndex,i.data.name||"",i.category),this.shapeList.push(l),this.zr.addShape(l),i.shape=l},this)},_buildLinkShapes:function(e,t){for(var i=this._graph,n=i.edges.length,a=0;n>a;a++){var o=i.edges[a],r=o.data,s=o.node1,l=o.node2,V=i.getEdge(l,s),d=this._getEdgeQueryTarget(e,r),u=this.deepQuery(d,"type");e.linkSymbol&&"none"!==e.linkSymbol&&(u="line");var y="line"===u?h:m,g=new y({style:{xStart:0,yStart:0,xEnd:0,yEnd:0},clickable:this.query(e,"clickable"),highlightStyle:{},zlevel:this.getZlevelBase(),z:this.getZBase()});if(V&&V.shape&&(g.style.offset=4,V.shape.style.offset=4),c.merge(g.style,this.query(e,"itemStyle.normal.linkStyle"),!0),c.merge(g.highlightStyle,this.query(e,"itemStyle.emphasis.linkStyle"),!0),"undefined"!=typeof r.itemStyle&&(r.itemStyle.normal&&c.merge(g.style,r.itemStyle.normal,!0),r.itemStyle.emphasis&&c.merge(g.highlightStyle,r.itemStyle.emphasis,!0)),g.style.lineWidth=g.style.lineWidth||g.style.width,g.style.strokeColor=g.style.strokeColor||g.style.color,g.highlightStyle.lineWidth=g.highlightStyle.lineWidth||g.highlightStyle.width,g.highlightStyle.strokeColor=g.highlightStyle.strokeColor||g.highlightStyle.color,p.pack(g,e,t,o.data,null==o.rawIndex?a:o.rawIndex,o.data.name||s.id+" - "+l.id,s.id,l.id),this.shapeList.push(g),this.zr.addShape(g),o.shape=g,e.linkSymbol&&"none"!==e.linkSymbol){var b=new U({style:{x:-5,y:0,width:e.linkSymbolSize[0],height:e.linkSymbolSize[1],iconType:e.linkSymbol,brushType:"fill",color:g.style.strokeColor},highlightStyle:{brushType:"fill"},position:[0,0],rotation:0,zlevel:this.getZlevelBase(),z:this.getZBase()});g._symbolShape=b,this.shapeList.push(b),this.zr.addShape(b)}}},_updateLinkShapes:function(){for(var e=y.create(),t=y.create(),i=y.create(),n=y.create(),a=this._graph.edges,o=0,r=a.length;r>o;o++){var s=a[o],l=s.node1.shape,h=s.node2.shape;y.copy(i,l.position),y.copy(n,h.position);var m=s.shape.style;if(y.sub(e,i,n),y.normalize(e,e),m.offset?(t[0]=e[1],t[1]=-e[0],y.scaleAndAdd(i,i,t,m.offset),y.scaleAndAdd(n,n,t,m.offset)):"bezier-curve"===s.shape.type&&(m.cpX1=(i[0]+n[0])/2-(n[1]-i[1])/4,m.cpY1=(i[1]+n[1])/2-(i[0]-n[0])/4),m.xStart=i[0],m.yStart=i[1],m.xEnd=n[0],m.yEnd=n[1],s.shape.modSelf(),s.shape._symbolShape){var V=s.shape._symbolShape;y.copy(V.position,n),y.scaleAndAdd(V.position,V.position,e,h.style.width/2+2);var U=Math.atan2(e[1],e[0]);V.rotation=Math.PI/2-U,V.modSelf()}}},_syncNodePositions:function(){for(var e=this._graph,t=0;t<e.nodes.length;t++){var i=e.nodes[t],n=i.layout.position,a=i.data,o=i.shape,r=o.fixed||a.fixX,s=o.fixed||a.fixY;r===!0?r=1:isNaN(r)&&(r=0),s===!0?s=1:isNaN(s)&&(s=0),o.position[0]+=(n[0]-o.position[0])*(1-r),o.position[1]+=(n[1]-o.position[1])*(1-s),y.copy(n,o.position);var l=a.name;if(l){var h=this.__nodePositionMap[l];h||(h=this.__nodePositionMap[l]=y.create()),y.copy(h,n)}o.modSelf()}},_step:function(){this._syncNodePositions(),this._updateLinkShapes(),this.zr.refreshNextFrame(),this._layout.temperature>.01?this._layout.step(this._steps):this.messageCenter.dispatch(d.EVENT.FORCE_LAYOUT_END,{},{},this.myChart)},refresh:function(e){if(e&&(this.option=e,this.series=this.option.series),this.legend=this.component.legend,this.legend)this.getColor=function(e){return this.legend.getColor(e)},this.isSelected=function(e){return this.legend.isSelected(e)};else{var t={},i=0;this.getColor=function(e){return t[e]?t[e]:(t[e]||(t[e]=this.zr.getColor(i++)),t[e])},this.isSelected=function(){return!0}}this._init()},dispose:function(){this.clear(),this.shapeList=null,this.effectList=null,this._layout.dispose(),this._layout=null,this.__nodePositionMap={}},getPosition:function(){var e=[];return this._graph.eachNode(function(t){t.layout&&e.push({name:t.data.name,position:Array.prototype.slice.call(t.layout.position)})}),e}},c.inherits(t,r),e("../chart").define("force",t),t}),i("echarts/layout/Force",["require","./forceLayoutWorker","zrender/tool/vector"],function(e){function t(){if("undefined"!=typeof Worker&&"undefined"!=typeof Blob)try{var e=new Blob([n.getWorkerCode()]);i=window.URL.createObjectURL(e)}catch(t){i=""}return i}var i,n=e("./forceLayoutWorker"),a=e("zrender/tool/vector"),o=window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||function(e){setTimeout(e,16)},r="undefined"==typeof Float32Array?Array:Float32Array,s=function(e){"undefined"==typeof i&&t(),e=e||{},this.width=e.width||500,this.height=e.height||500,this.center=e.center||[this.width/2,this.height/2],this.ratioScaling=e.ratioScaling||!1,this.scaling=e.scaling||1,this.gravity="undefined"!=typeof e.gravity?e.gravity:1,this.large=e.large||!1,this.preventNodeOverlap=e.preventNodeOverlap||!1,this.preventNodeEdgeOverlap=e.preventNodeEdgeOverlap||!1,this.maxSpeedIncrease=e.maxSpeedIncrease||1,this.onupdate=e.onupdate||function(){},this.temperature=e.temperature||1,this.coolDown=e.coolDown||.99,this._layout=null,this._layoutWorker=null;var n=this,a=this._$onupdate;this._$onupdate=function(e){a.call(n,e)}};return s.prototype.updateConfig=function(){var e=this.width,t=this.height,i=Math.min(e,t),n={center:this.center,width:this.ratioScaling?e:i,height:this.ratioScaling?t:i,scaling:this.scaling||1,gravity:this.gravity||1,barnesHutOptimize:this.large,preventNodeOverlap:this.preventNodeOverlap,preventNodeEdgeOverlap:this.preventNodeEdgeOverlap,maxSpeedIncrease:this.maxSpeedIncrease};if(this._layoutWorker)this._layoutWorker.postMessage({cmd:"updateConfig",config:n});else for(var a in n)this._layout[a]=n[a]},s.prototype.init=function(e,t){if(this._layoutWorker&&(this._layoutWorker.terminate(),this._layoutWorker=null),i&&t)try{this._layoutWorker||(this._layoutWorker=new Worker(i),this._layoutWorker.onmessage=this._$onupdate),this._layout=null}catch(a){this._layoutWorker=null,this._layout||(this._layout=new n)}else this._layout||(this._layout=new n);this.temperature=1,this.graph=e;for(var o=e.nodes.length,s=new r(2*o),l=new r(o),h=new r(o),m=0;o>m;m++){var V=e.nodes[m];s[2*m]=V.layout.position[0],s[2*m+1]=V.layout.position[1],l[m]="undefined"==typeof V.layout.mass?1:V.layout.mass,h[m]="undefined"==typeof V.layout.size?1:V.layout.size,V.layout.__index=m}o=e.edges.length;for(var U=new r(2*o),d=new r(o),m=0;o>m;m++){var p=e.edges[m];U[2*m]=p.node1.layout.__index,U[2*m+1]=p.node2.layout.__index,d[m]=p.layout.weight||1}this._layoutWorker?this._layoutWorker.postMessage({cmd:"init",nodesPosition:s,nodesMass:l,nodesSize:h,edges:U,edgesWeight:d}):(this._layout.initNodes(s,l,h),this._layout.initEdges(U,d)),this.updateConfig()},s.prototype.step=function(e){var t=this.graph.nodes;if(this._layoutWorker){for(var i=new r(2*t.length),n=0;n<t.length;n++){var s=t[n];i[2*n]=s.layout.position[0],i[2*n+1]=s.layout.position[1]}this._layoutWorker.postMessage(i.buffer,[i.buffer]),this._layoutWorker.postMessage({cmd:"update",steps:e,temperature:this.temperature,coolDown:this.coolDown});for(var n=0;e>n;n++)this.temperature*=this.coolDown}else{o(this._$onupdate);for(var n=0;n<t.length;n++){var s=t[n];a.copy(this._layout.nodes[n].position,s.layout.position)}for(var n=0;e>n;n++)this._layout.temperature=this.temperature,this._layout.update(),this.temperature*=this.coolDown}},s.prototype._$onupdate=function(e){if(this._layoutWorker){for(var t=new Float32Array(e.data),i=0;i<this.graph.nodes.length;i++){var n=this.graph.nodes[i];n.layout.position[0]=t[2*i],n.layout.position[1]=t[2*i+1]}this.onupdate&&this.onupdate()}else if(this._layout){for(var i=0;i<this.graph.nodes.length;i++){var n=this.graph.nodes[i];a.copy(n.layout.position,this._layout.nodes[i].position)}this.onupdate&&this.onupdate()}},s.prototype.dispose=function(){this._layoutWorker&&this._layoutWorker.terminate(),this._layoutWorker=null,this._layout=null},s}),i("echarts/layout/forceLayoutWorker",["require","zrender/tool/vector"],function o(e){"use strict";function t(){this.subRegions=[],this.nSubRegions=0,this.node=null,this.mass=0,this.centerOfMass=null,this.bbox=new l(4),this.size=0}function i(){this.position=r.create(),this.force=r.create(),this.forcePrev=r.create(),this.speed=r.create(),this.speedPrev=r.create(),this.mass=1,this.inDegree=0,this.outDegree=0}function n(e,t){this.node1=e,this.node2=t,this.weight=1}function a(){this.barnesHutOptimize=!1,this.barnesHutTheta=1.5,this.repulsionByDegree=!1,this.preventNodeOverlap=!1,this.preventNodeEdgeOverlap=!1,this.strongGravity=!0,this.gravity=1,this.scaling=1,this.edgeWeightInfluence=1,this.center=[0,0],this.width=500,this.height=500,this.maxSpeedIncrease=1,this.nodes=[],this.edges=[],this.bbox=new l(4),this._rootRegion=new t,this._rootRegion.centerOfMass=r.create(),this._massArr=null,this._k=0}var r,s="undefined"==typeof window&&"undefined"==typeof e;r=s?{create:function(e,t){var i=new Float32Array(2);return i[0]=e||0,i[1]=t||0,i},dist:function(e,t){var i=t[0]-e[0],n=t[1]-e[1];return Math.sqrt(i*i+n*n)},len:function(e){var t=e[0],i=e[1];return Math.sqrt(t*t+i*i)},scaleAndAdd:function(e,t,i,n){return e[0]=t[0]+i[0]*n,e[1]=t[1]+i[1]*n,e},scale:function(e,t,i){return e[0]=t[0]*i,e[1]=t[1]*i,e},add:function(e,t,i){return e[0]=t[0]+i[0],e[1]=t[1]+i[1],e},sub:function(e,t,i){return e[0]=t[0]-i[0],e[1]=t[1]-i[1],e},dot:function(e,t){return e[0]*t[0]+e[1]*t[1]},normalize:function(e,t){var i=t[0],n=t[1],a=i*i+n*n;return a>0&&(a=1/Math.sqrt(a),e[0]=t[0]*a,e[1]=t[1]*a),e},negate:function(e,t){return e[0]=-t[0],e[1]=-t[1],e},copy:function(e,t){return e[0]=t[0],e[1]=t[1],e},set:function(e,t,i){return e[0]=t,e[1]=i,e}}:e("zrender/tool/vector");var l="undefined"==typeof Float32Array?Array:Float32Array;if(t.prototype.beforeUpdate=function(){for(var e=0;e<this.nSubRegions;e++)this.subRegions[e].beforeUpdate();this.mass=0,this.centerOfMass&&(this.centerOfMass[0]=0,this.centerOfMass[1]=0),this.nSubRegions=0,this.node=null},t.prototype.afterUpdate=function(){this.subRegions.length=this.nSubRegions;for(var e=0;e<this.nSubRegions;e++)this.subRegions[e].afterUpdate()},t.prototype.addNode=function(e){if(0===this.nSubRegions){if(null==this.node)return void(this.node=e);this._addNodeToSubRegion(this.node),this.node=null}this._addNodeToSubRegion(e),this._updateCenterOfMass(e)},t.prototype.findSubRegion=function(e,t){for(var i=0;i<this.nSubRegions;i++){var n=this.subRegions[i];if(n.contain(e,t))return n}},t.prototype.contain=function(e,t){return this.bbox[0]<=e&&this.bbox[2]>=e&&this.bbox[1]<=t&&this.bbox[3]>=t},t.prototype.setBBox=function(e,t,i,n){this.bbox[0]=e,this.bbox[1]=t,this.bbox[2]=i,this.bbox[3]=n,this.size=(i-e+n-t)/2},t.prototype._newSubRegion=function(){var e=this.subRegions[this.nSubRegions];return e||(e=new t,this.subRegions[this.nSubRegions]=e),this.nSubRegions++,e},t.prototype._addNodeToSubRegion=function(e){var t=this.findSubRegion(e.position[0],e.position[1]),i=this.bbox;if(!t){var n=(i[0]+i[2])/2,a=(i[1]+i[3])/2,o=(i[2]-i[0])/2,r=(i[3]-i[1])/2,s=e.position[0]>=n?1:0,l=e.position[1]>=a?1:0,t=this._newSubRegion();t.setBBox(s*o+i[0],l*r+i[1],(s+1)*o+i[0],(l+1)*r+i[1])}t.addNode(e)},t.prototype._updateCenterOfMass=function(e){null==this.centerOfMass&&(this.centerOfMass=r.create());var t=this.centerOfMass[0]*this.mass,i=this.centerOfMass[1]*this.mass;t+=e.position[0]*e.mass,i+=e.position[1]*e.mass,this.mass+=e.mass,this.centerOfMass[0]=t/this.mass,this.centerOfMass[1]=i/this.mass},a.prototype.nodeToNodeRepulsionFactor=function(e,t,i){return i*i*e/t},a.prototype.edgeToNodeRepulsionFactor=function(e,t,i){return i*e/t},a.prototype.attractionFactor=function(e,t,i){return e*t/i},a.prototype.initNodes=function(e,t,n){this.temperature=1;var a=e.length/2;this.nodes.length=0;for(var o="undefined"!=typeof n,r=0;a>r;r++){var s=new i;s.position[0]=e[2*r],s.position[1]=e[2*r+1],s.mass=t[r],o&&(s.size=n[r]),this.nodes.push(s)}this._massArr=t,o&&(this._sizeArr=n)},a.prototype.initEdges=function(e,t){var i=e.length/2;this.edges.length=0;for(var a="undefined"!=typeof t,o=0;i>o;o++){var r=e[2*o],s=e[2*o+1],l=this.nodes[r],h=this.nodes[s];if(l&&h){l.outDegree++,h.inDegree++;var m=new n(l,h);a&&(m.weight=t[o]),this.edges.push(m)}}},a.prototype.update=function(){var e=this.nodes.length;if(this.updateBBox(),this._k=.4*this.scaling*Math.sqrt(this.width*this.height/e),this.barnesHutOptimize){this._rootRegion.setBBox(this.bbox[0],this.bbox[1],this.bbox[2],this.bbox[3]),this._rootRegion.beforeUpdate();for(var t=0;e>t;t++)this._rootRegion.addNode(this.nodes[t]);this._rootRegion.afterUpdate()}else{var i=0,n=this._rootRegion.centerOfMass;r.set(n,0,0);for(var t=0;e>t;t++){var a=this.nodes[t];i+=a.mass,r.scaleAndAdd(n,n,a.position,a.mass);
-
-}i>0&&r.scale(n,n,1/i)}this.updateForce(),this.updatePosition()},a.prototype.updateForce=function(){for(var e=this.nodes.length,t=0;e>t;t++){var i=this.nodes[t];r.copy(i.forcePrev,i.force),r.copy(i.speedPrev,i.speed),r.set(i.force,0,0)}this.updateNodeNodeForce(),this.gravity>0&&this.updateGravityForce(),this.updateEdgeForce(),this.preventNodeEdgeOverlap&&this.updateNodeEdgeForce()},a.prototype.updatePosition=function(){for(var e=this.nodes.length,t=r.create(),i=0;e>i;i++){var n=this.nodes[i],a=n.speed;r.scale(n.force,n.force,1/30);var o=r.len(n.force)+.1,s=Math.min(o,500)/o;r.scale(n.force,n.force,s),r.add(a,a,n.force),r.scale(a,a,this.temperature),r.sub(t,a,n.speedPrev);var l=r.len(t);if(l>0){r.scale(t,t,1/l);var h=r.len(n.speedPrev);h>0&&(l=Math.min(l/h,this.maxSpeedIncrease)*h,r.scaleAndAdd(a,n.speedPrev,t,l))}var m=r.len(a),s=Math.min(m,100)/(m+.1);r.scale(a,a,s),r.add(n.position,n.position,a)}},a.prototype.updateNodeNodeForce=function(){for(var e=this.nodes.length,t=0;e>t;t++){var i=this.nodes[t];if(this.barnesHutOptimize)this.applyRegionToNodeRepulsion(this._rootRegion,i);else for(var n=t+1;e>n;n++){var a=this.nodes[n];this.applyNodeToNodeRepulsion(i,a,!1)}}},a.prototype.updateGravityForce=function(){for(var e=0;e<this.nodes.length;e++)this.applyNodeGravity(this.nodes[e])},a.prototype.updateEdgeForce=function(){for(var e=0;e<this.edges.length;e++)this.applyEdgeAttraction(this.edges[e])},a.prototype.updateNodeEdgeForce=function(){for(var e=0;e<this.nodes.length;e++)for(var t=0;t<this.edges.length;t++)this.applyEdgeToNodeRepulsion(this.edges[t],this.nodes[e])},a.prototype.applyRegionToNodeRepulsion=function(){var e=r.create();return function(t,i){if(t.node)this.applyNodeToNodeRepulsion(t.node,i,!0);else{if(0===t.mass&&0===i.mass)return;r.sub(e,i.position,t.centerOfMass);var n=e[0]*e[0]+e[1]*e[1];if(n>this.barnesHutTheta*t.size*t.size){var a=this._k*this._k*(i.mass+t.mass)/(n+1);r.scaleAndAdd(i.force,i.force,e,2*a)}else for(var o=0;o<t.nSubRegions;o++)this.applyRegionToNodeRepulsion(t.subRegions[o],i)}}}(),a.prototype.applyNodeToNodeRepulsion=function(){var e=r.create();return function(t,i,n){if(t!==i&&(0!==t.mass||0!==i.mass)){r.sub(e,t.position,i.position);var a=e[0]*e[0]+e[1]*e[1];if(0!==a){var o,s=t.mass+i.mass,l=Math.sqrt(a);r.scale(e,e,1/l),this.preventNodeOverlap?(l=l-t.size-i.size,l>0?o=this.nodeToNodeRepulsionFactor(s,l,this._k):0>=l&&(o=this._k*this._k*10*s)):o=this.nodeToNodeRepulsionFactor(s,l,this._k),n||r.scaleAndAdd(t.force,t.force,e,2*o),r.scaleAndAdd(i.force,i.force,e,2*-o)}}}}(),a.prototype.applyEdgeAttraction=function(){var e=r.create();return function(t){var i=t.node1,n=t.node2;r.sub(e,i.position,n.position);var a,o=r.len(e);a=0===this.edgeWeightInfluence?1:1==this.edgeWeightInfluence?t.weight:Math.pow(t.weight,this.edgeWeightInfluence);var s;if(!(this.preventOverlap&&(o=o-i.size-n.size,0>=o))){var s=this.attractionFactor(a,o,this._k);r.scaleAndAdd(i.force,i.force,e,-s),r.scaleAndAdd(n.force,n.force,e,s)}}}(),a.prototype.applyNodeGravity=function(){var e=r.create();return function(t){r.sub(e,this.center,t.position),this.width>this.height?e[1]*=this.width/this.height:e[0]*=this.height/this.width;var i=r.len(e)/100;this.strongGravity?r.scaleAndAdd(t.force,t.force,e,i*this.gravity*t.mass):r.scaleAndAdd(t.force,t.force,e,this.gravity*t.mass/(i+1))}}(),a.prototype.applyEdgeToNodeRepulsion=function(){var e=r.create(),t=r.create(),i=r.create();return function(n,a){var o=n.node1,s=n.node2;if(o!==a&&s!==a){r.sub(e,s.position,o.position),r.sub(t,a.position,o.position);var l=r.len(e);r.scale(e,e,1/l);var h=r.dot(e,t);if(!(0>h||h>l)){r.scaleAndAdd(i,o.position,e,h);var m=r.dist(i,a.position)-a.size,V=this.edgeToNodeRepulsionFactor(a.mass,Math.max(m,.1),100);r.sub(e,a.position,i),r.normalize(e,e),r.scaleAndAdd(a.force,a.force,e,V),r.scaleAndAdd(o.force,o.force,e,-V),r.scaleAndAdd(s.force,s.force,e,-V)}}}}(),a.prototype.updateBBox=function(){for(var e=1/0,t=1/0,i=-(1/0),n=-(1/0),a=0;a<this.nodes.length;a++){var o=this.nodes[a].position;e=Math.min(e,o[0]),t=Math.min(t,o[1]),i=Math.max(i,o[0]),n=Math.max(n,o[1])}this.bbox[0]=e,this.bbox[1]=t,this.bbox[2]=i,this.bbox[3]=n},a.getWorkerCode=function(){var e=o.toString();return e.slice(e.indexOf("{")+1,e.lastIndexOf("return"))},s){var h=null;self.onmessage=function(e){if(e.data instanceof ArrayBuffer){if(!h)return;for(var t=new Float32Array(e.data),i=t.length/2,n=0;i>n;n++){var o=h.nodes[n];o.position[0]=t[2*n],o.position[1]=t[2*n+1]}}else switch(e.data.cmd){case"init":h||(h=new a),h.initNodes(e.data.nodesPosition,e.data.nodesMass,e.data.nodesSize),h.initEdges(e.data.edges,e.data.edgesWeight);break;case"updateConfig":if(h)for(var r in e.data.config)h[r]=e.data.config[r];break;case"update":var s=e.data.steps;if(h){var i=h.nodes.length,t=new Float32Array(2*i);h.temperature=e.data.temperature;for(var n=0;s>n;n++)h.update(),h.temperature*=e.data.coolDown;for(var n=0;i>n;n++){var o=h.nodes[n];t[2*n]=o.position[0],t[2*n+1]=o.position[1]}self.postMessage(t.buffer,[t.buffer])}else{var l=new Float32Array;self.postMessage(l.buffer,[l.buffer])}}}}return a}),i("echarts/chart/map",["require","./base","zrender/shape/Text","zrender/shape/Path","zrender/shape/Circle","zrender/shape/Rectangle","zrender/shape/Line","zrender/shape/Polygon","zrender/shape/Ellipse","zrender/shape/Image","../component/dataRange","../component/roamController","../layer/heatmap","../config","../util/ecData","zrender/tool/util","zrender/config","zrender/tool/event","../util/mapData/params","../util/mapData/textFixed","../util/mapData/geoCoord","../util/projection/svg","../util/projection/normal","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r._onmousewheel=function(e){return r.__onmousewheel(e)},r._onmousedown=function(e){return r.__onmousedown(e)},r._onmousemove=function(e){return r.__onmousemove(e)},r._onmouseup=function(e){return r.__onmouseup(e)},r._onroamcontroller=function(e){return r.__onroamcontroller(e)},r._ondrhoverlink=function(e){return r.__ondrhoverlink(e)},this._isAlive=!0,this._selectedMode={},this._activeMapType={},this._clickable={},this._hoverable={},this._showLegendSymbol={},this._selected={},this._mapTypeMap={},this._mapDataMap={},this._nameMap={},this._specialArea={},this._refreshDelayTicket,this._mapDataRequireCounter,this._markAnimation=!1,this._hoverLinkMap={},this._roamMap={},this._scaleLimitMap={},this._mx,this._my,this._mousedown,this._justMove,this._curMapType,this.refresh(a),this.zr.on(c.EVENT.MOUSEWHEEL,this._onmousewheel),this.zr.on(c.EVENT.MOUSEDOWN,this._onmousedown),t.bind(U.EVENT.ROAMCONTROLLER,this._onroamcontroller),t.bind(U.EVENT.DATA_RANGE_HOVERLINK,this._ondrhoverlink)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Path"),o=e("zrender/shape/Circle"),r=e("zrender/shape/Rectangle"),s=e("zrender/shape/Line"),l=e("zrender/shape/Polygon"),h=e("zrender/shape/Ellipse"),m=e("zrender/shape/Image");e("../component/dataRange"),e("../component/roamController");var V=e("../layer/heatmap"),U=e("../config");U.map={zlevel:0,z:2,mapType:"china",showLegendSymbol:!0,dataRangeHoverLink:!0,hoverable:!0,clickable:!0,itemStyle:{normal:{borderColor:"rgba(0,0,0,0)",borderWidth:1,areaStyle:{color:"#ccc"},label:{show:!1,textStyle:{color:"rgb(139,69,19)"}}},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1,areaStyle:{color:"rgba(255,215,0,0.8)"},label:{show:!1,textStyle:{color:"rgb(100,0,0)"}}}}};var d=e("../util/ecData"),p=e("zrender/tool/util"),c=e("zrender/config"),u=e("zrender/tool/event"),y=e("../util/mapData/params").params,g=e("../util/mapData/textFixed"),b=e("../util/mapData/geoCoord");return t.prototype={type:U.CHART_TYPE_MAP,_buildShape:function(){var e=this.series;this.selectedMap={},this._activeMapType={};for(var t,i,n,a,o=this.component.legend,r={},s={},l={},h={},m=0,V=e.length;V>m;m++)if(e[m].type==U.CHART_TYPE_MAP&&(e[m]=this.reformOption(e[m]),i=e[m].mapType,s[i]=s[i]||{},s[i][m]=!0,l[i]=l[i]||e[m].mapValuePrecision,this._scaleLimitMap[i]=this._scaleLimitMap[i]||{},e[m].scaleLimit&&p.merge(this._scaleLimitMap[i],e[m].scaleLimit,!0),this._roamMap[i]=e[m].roam||this._roamMap[i],(null==this._hoverLinkMap[i]||this._hoverLinkMap[i])&&(this._hoverLinkMap[i]=e[m].dataRangeHoverLink),this._nameMap[i]=this._nameMap[i]||{},e[m].nameMap&&p.merge(this._nameMap[i],e[m].nameMap,!0),this._activeMapType[i]=!0,e[m].textFixed&&p.merge(g,e[m].textFixed,!0),e[m].geoCoord&&p.merge(b,e[m].geoCoord,!0),this._selectedMode[i]=this._selectedMode[i]||e[m].selectedMode,(null==this._hoverable[i]||this._hoverable[i])&&(this._hoverable[i]=e[m].hoverable),(null==this._clickable[i]||this._clickable[i])&&(this._clickable[i]=e[m].clickable),(null==this._showLegendSymbol[i]||this._showLegendSymbol[i])&&(this._showLegendSymbol[i]=e[m].showLegendSymbol),h[i]=h[i]||e[m].mapValueCalculation,t=e[m].name,this.selectedMap[t]=o?o.isSelected(t):!0,this.selectedMap[t])){r[i]=r[i]||{},n=e[m].data;for(var d=0,c=n.length;c>d;d++){a=this._nameChange(i,n[d].name),r[i][a]=r[i][a]||{seriesIndex:[],valueMap:{},precision:0};for(var u in n[d])"value"!=u?r[i][a][u]=n[d][u]:isNaN(n[d].value)||(null==r[i][a].value&&(r[i][a].value=0),r[i][a].precision=Math.max(this.getPrecision(+n[d].value),r[i][a].precision),r[i][a].value+=+n[d].value,r[i][a].valueMap[m]=+n[d].value);r[i][a].seriesIndex.push(m)}}this._mapDataRequireCounter=0;for(var f in r)this._mapDataRequireCounter++;this._clearSelected(),0===this._mapDataRequireCounter&&(this.clear(),this.zr&&this.zr.delShape(this.lastShapeList),this.lastShapeList=[]);for(var f in r){for(var c in r[f]){"average"==h[f]&&(r[f][c].value/=r[f][c].seriesIndex.length);var k=r[f][c].value;null!=k&&(r[f][c].value=k.toFixed(null==l[f]?r[f][c].precision:l[f])-0)}this._mapDataMap[f]=this._mapDataMap[f]||{},this._mapDataMap[f].mapData?this._mapDataCallback(f,r[f],s[f])(this._mapDataMap[f].mapData):y[f.replace(/\|.*/,"")].getGeoJson&&(this._specialArea[f]=y[f.replace(/\|.*/,"")].specialArea||this._specialArea[f],y[f.replace(/\|.*/,"")].getGeoJson(this._mapDataCallback(f,r[f],s[f])))}},_mapDataCallback:function(t,i,n){var a=this;return function(o){a._isAlive&&null!=a._activeMapType[t]&&(-1!=t.indexOf("|")&&(o=a._getSubMapData(t,o)),a._mapDataMap[t].mapData=o,o.firstChild?(a._mapDataMap[t].rate=1,a._mapDataMap[t].projection=e("../util/projection/svg")):(a._mapDataMap[t].rate=.75,a._mapDataMap[t].projection=e("../util/projection/normal")),a._buildMap(t,a._getProjectionData(t,o,n),i,n),a._buildMark(t,n),--a._mapDataRequireCounter<=0&&(a.addShapeList(),a.zr.refreshNextFrame()),a._buildHeatmap(t))}},_clearSelected:function(){for(var e in this._selected)this._activeMapType[this._mapTypeMap[e]]||(delete this._selected[e],delete this._mapTypeMap[e])},_getSubMapData:function(e,t){for(var i=e.replace(/^.*\|/,""),n=t.features,a=0,o=n.length;o>a;a++)if(n[a].properties&&n[a].properties.name==i){n=n[a],"United States of America"==i&&n.geometry.coordinates.length>1&&(n={geometry:{coordinates:n.geometry.coordinates.slice(5,6),type:n.geometry.type},id:n.id,properties:n.properties,type:n.type});break}return{type:"FeatureCollection",features:[n]}},_getProjectionData:function(e,t,i){var n,a=this._mapDataMap[e].projection,o=[],r=this._mapDataMap[e].bbox||a.getBbox(t,this._specialArea[e]);n=this._mapDataMap[e].hasRoam?this._mapDataMap[e].transform:this._getTransform(r,i,this._mapDataMap[e].rate);var s,l=this._mapDataMap[e].lastTransform||{scale:{}};n.left!=l.left||n.top!=l.top||n.scale.x!=l.scale.x||n.scale.y!=l.scale.y?(s=a.geoJson2Path(t,n,this._specialArea[e]),l=p.clone(n)):(n=this._mapDataMap[e].transform,s=this._mapDataMap[e].pathArray),this._mapDataMap[e].bbox=r,this._mapDataMap[e].transform=n,this._mapDataMap[e].lastTransform=l,this._mapDataMap[e].pathArray=s;for(var h=[n.left,n.top],m=0,V=s.length;V>m;m++)o.push(this._getSingleProvince(e,s[m],h));if(this._specialArea[e])for(var U in this._specialArea[e])o.push(this._getSpecialProjectionData(e,t,U,this._specialArea[e][U],h));if("china"==e){var d=this.geo2pos(e,b["å—海诸岛"]||y["å—海诸岛"].textCoord),c=n.scale.x/10.5,u=[32*c+d[0],83*c+d[1]];g["å—海诸岛"]&&(u[0]+=g["å—海诸岛"][0],u[1]+=g["å—海诸岛"][1]),o.push({name:this._nameChange(e,"å—海诸岛"),path:y["å—海诸岛"].getPath(d,c),position:h,textX:u[0],textY:u[1]})}return o},_getSpecialProjectionData:function(t,i,n,a,o){i=this._getSubMapData("x|"+n,i);var r=e("../util/projection/normal"),s=r.getBbox(i),l=this.geo2pos(t,[a.left,a.top]),h=this.geo2pos(t,[a.left+a.width,a.top+a.height]),m=Math.abs(h[0]-l[0]),V=Math.abs(h[1]-l[1]),U=s.width,d=s.height,p=m/.75/U,c=V/d;p>c?(p=.75*c,m=U*p):(c=p,p=.75*c,V=d*c);var u={OffsetLeft:l[0],OffsetTop:l[1],scale:{x:p,y:c}},y=r.geoJson2Path(i,u);return this._getSingleProvince(t,y[0],o)},_getSingleProvince:function(e,t,i){var n,a=t.properties.name,o=g[a]||[0,0];if(b[a])n=this.geo2pos(e,b[a]);else if(t.cp)n=[t.cp[0]+o[0],t.cp[1]+o[1]];else{var r=this._mapDataMap[e].bbox;n=this.geo2pos(e,[r.left+r.width/2,r.top+r.height/2]),n[0]+=o[0],n[1]+=o[1]}return t.name=this._nameChange(e,a),t.position=i,t.textX=n[0],t.textY=n[1],t},_getTransform:function(e,t,i){var n,a,o,r,s,l,h,m=this.series,V=this.zr.getWidth(),U=this.zr.getHeight(),d=Math.round(.02*Math.min(V,U));for(var p in t)n=m[p].mapLocation||{},o=n.x||o,s=n.y||s,l=n.width||l,h=n.height||h;a=this.parsePercent(o,V),a=isNaN(a)?d:a,r=this.parsePercent(s,U),r=isNaN(r)?d:r,l=null==l?V-a-2*d:this.parsePercent(l,V),h=null==h?U-r-2*d:this.parsePercent(h,U);var c=e.width,u=e.height,y=l/i/c,g=h/u;if(y>g?(y=g*i,l=c*y):(g=y,y=g*i,h=u*g),isNaN(o))switch(o=o||"center",o+""){case"center":a=Math.floor((V-l)/2);break;case"right":a=V-l}if(isNaN(s))switch(s=s||"center",s+""){case"center":r=Math.floor((U-h)/2);break;case"bottom":r=U-h}return{left:a,top:r,width:l,height:h,baseScale:1,scale:{x:y,y:g}}},_buildMap:function(e,t,i,m){for(var V,c,u,y,g,b,f,k,x,_,L,W=this.series,X=this.component.legend,v=this.component.dataRange,w=0,K=t.length;K>w;w++){if(k=p.clone(t[w]),x={name:k.name,path:k.path,position:p.clone(k.position)},c=k.name,u=i[c]){g=[u],V="";for(var I=0,J=u.seriesIndex.length;J>I;I++){var C=W[u.seriesIndex[I]];g.push(C),V+=C.name+" ",X&&this._showLegendSymbol[e]&&X.hasColor(C.name)&&this.shapeList.push(new o({zlevel:C.zlevel,z:C.z+1,position:p.clone(k.position),_mapType:e,style:{x:k.textX+3+7*I,y:k.textY-10,r:3,color:X.getColor(C.name)},hoverable:!1}))}y=u.value}else{u={name:c,value:"-"},V="",g=[];for(var S in m)g.push(W[S]);y="-"}switch(this.ecTheme.map&&g.push(this.ecTheme.map),g.push(U.map),b=v&&!isNaN(y)?v.getColor(y):null,k.color=k.color||b||this.getItemStyleColor(this.deepQuery(g,"itemStyle.normal.color"),u.seriesIndex,-1,u)||this.deepQuery(g,"itemStyle.normal.areaStyle.color"),k.strokeColor=k.strokeColor||this.deepQuery(g,"itemStyle.normal.borderColor"),k.lineWidth=k.lineWidth||this.deepQuery(g,"itemStyle.normal.borderWidth"),x.color=this.getItemStyleColor(this.deepQuery(g,"itemStyle.emphasis.color"),u.seriesIndex,-1,u)||this.deepQuery(g,"itemStyle.emphasis.areaStyle.color")||k.color,x.strokeColor=this.deepQuery(g,"itemStyle.emphasis.borderColor")||k.strokeColor,x.lineWidth=this.deepQuery(g,"itemStyle.emphasis.borderWidth")||k.lineWidth,k.brushType=x.brushType=k.brushType||"both",k.lineJoin=x.lineJoin="round",k._name=x._name=c,f=this.deepQuery(g,"itemStyle.normal.label.textStyle"),L={zlevel:this.getZlevelBase(),z:this.getZBase()+1,position:p.clone(k.position),_mapType:e,_geo:this.pos2geo(e,[k.textX,k.textY]),style:{brushType:"fill",x:k.textX,y:k.textY,text:this.getLabelText(c,y,g,"normal"),_name:c,textAlign:"center",color:this.deepQuery(g,"itemStyle.normal.label.show")?this.deepQuery(g,"itemStyle.normal.label.textStyle.color"):"rgba(0,0,0,0)",textFont:this.getFont(f)}},L._style=p.clone(L.style),L.highlightStyle=p.clone(L.style),this.deepQuery(g,"itemStyle.emphasis.label.show")?(L.highlightStyle.text=this.getLabelText(c,y,g,"emphasis"),L.highlightStyle.color=this.deepQuery(g,"itemStyle.emphasis.label.textStyle.color")||L.style.color,f=this.deepQuery(g,"itemStyle.emphasis.label.textStyle")||f,L.highlightStyle.textFont=this.getFont(f)):L.highlightStyle.color="rgba(0,0,0,0)",_={zlevel:this.getZlevelBase(),z:this.getZBase(),position:p.clone(k.position),style:k,highlightStyle:x,_style:p.clone(k),_mapType:e},null!=k.scale&&(_.scale=p.clone(k.scale)),L=new n(L),_.style.shapeType){case"rectangle":_=new r(_);break;case"line":_=new s(_);break;case"circle":_=new o(_);break;case"polygon":_=new l(_);break;case"ellipse":_=new h(_);break;default:_=new a(_),_.buildPathArray&&(_.style.pathArray=_.buildPathArray(_.style.path))}(this._selectedMode[e]&&this._selected[c]&&u.selected!==!1||u.selected===!0)&&(L.style=L.highlightStyle,_.style=_.highlightStyle),L.clickable=_.clickable=this._clickable[e]&&(null==u.clickable||u.clickable),this._selectedMode[e]&&(this._selected[c]=null!=this._selected[c]?this._selected[c]:u.selected,this._mapTypeMap[c]=e,(null==u.selectable||u.selectable)&&(_.clickable=L.clickable=!0,_.onclick=L.onclick=this.shapeHandler.onclick)),this._hoverable[e]&&(null==u.hoverable||u.hoverable)?(L.hoverable=_.hoverable=!0,_.hoverConnect=L.id,L.hoverConnect=_.id):L.hoverable=_.hoverable=!1,d.pack(L,{name:V,tooltip:this.deepQuery(g,"tooltip")},0,u,0,c),this.shapeList.push(L),d.pack(_,{name:V,tooltip:this.deepQuery(g,"tooltip")},0,u,0,c),this.shapeList.push(_)}},_buildMark:function(e,t){this._seriesIndexToMapType=this._seriesIndexToMapType||{},this.markAttachStyle=this.markAttachStyle||{};var i=[this._mapDataMap[e].transform.left,this._mapDataMap[e].transform.top];"none"==e&&(i=[0,0]);for(var n in t)this._seriesIndexToMapType[n]=e,this.markAttachStyle[n]={position:i,_mapType:e},this.buildMark(n)},_buildHeatmap:function(e){for(var t=this.series,i=0,n=t.length;n>i;i++)if(t[i].heatmap){var a=t[i].heatmap.data;if(t[i].heatmap.needsTransform===!1){for(var o=[],r=0,s=a.length;s>r;++r)o.push([a[r][3],a[r][4],a[r][2]]);var l=[0,0]}else{var h=t[i].heatmap._geoData;if(void 0===h){t[i].heatmap._geoData=[];for(var r=0,s=a.length;s>r;++r)t[i].heatmap._geoData[r]=a[r];h=t[i].heatmap._geoData}for(var s=a.length,U=0;s>U;++U)a[U]=this.geo2pos(e,[h[U][0],h[U][1]]);var l=[this._mapDataMap[e].transform.left,this._mapDataMap[e].transform.top]}var d=new V(t[i].heatmap),p=d.getCanvas(a[0][3]?o:a,this.zr.getWidth(),this.zr.getHeight()),c=new m({zlevel:this.getZlevelBase(),z:this.getZBase()+1,position:l,scale:[1,1],hoverable:!1,style:{x:0,y:0,image:p,width:p.width,height:p.height}});c.type="heatmap",c._mapType=e,this.shapeList.push(c),this.zr.addShape(c)}},getMarkCoord:function(e,t){return t.geoCoord||b[t.name]?this.geo2pos(this._seriesIndexToMapType[e],t.geoCoord||b[t.name]):[0,0]},getMarkGeo:function(e){return e.geoCoord||b[e.name]},_nameChange:function(e,t){return this._nameMap[e][t]||t},getLabelText:function(e,t,i,n){var a=this.deepQuery(i,"itemStyle."+n+".label.formatter");return a?"function"==typeof a?a.call(this.myChart,e,t):"string"==typeof a?(a=a.replace("{a}","{a0}").replace("{b}","{b0}"),a=a.replace("{a0}",e).replace("{b0}",t)):void 0:e},_findMapTypeByPos:function(e,t){var i,n,a,o,r;for(var s in this._mapDataMap)if(i=this._mapDataMap[s].transform,i&&this._roamMap[s]&&this._activeMapType[s]&&(n=i.left,a=i.top,o=i.width,r=i.height,e>=n&&n+o>=e&&t>=a&&a+r>=t))return s},__onmousewheel:function(e){function t(e,t){for(var i=0;i<e.pointList.length;i++){var n=e.pointList[i];n[0]*=t,n[1]*=t}var a=e.controlPointList;if(a)for(var i=0;i<a.length;i++){var n=a[i];n[0]*=t,n[1]*=t}}function i(e,t){e.xStart*=t,e.yStart*=t,e.xEnd*=t,e.yEnd*=t,null!=e.cpX1&&(e.cpX1*=t,e.cpY1*=t)}if(!(this.shapeList.length<=0)){for(var n=0,a=this.shapeList.length;a>n;n++){var o=this.shapeList[n];if(o.__animating)return}var r,s,l=e.event,h=u.getX(l),m=u.getY(l),V=u.getDelta(l),d=e.mapTypeControl;d||(d={},s=this._findMapTypeByPos(h,m),s&&this._roamMap[s]&&"move"!=this._roamMap[s]&&(d[s]=!0));var p=!1;for(s in d)if(d[s]){p=!0;var c=this._mapDataMap[s].transform,y=c.left,g=c.top,b=c.width,f=c.height,k=this.pos2geo(s,[h-y,m-g]);if(V>0){if(r=1.2,null!=this._scaleLimitMap[s].max&&c.baseScale>=this._scaleLimitMap[s].max)continue}else if(r=1/1.2,null!=this._scaleLimitMap[s].min&&c.baseScale<=this._scaleLimitMap[s].min)continue;c.baseScale*=r,c.scale.x*=r,c.scale.y*=r,c.width=b*r,c.height=f*r,this._mapDataMap[s].hasRoam=!0,this._mapDataMap[s].transform=c,k=this.geo2pos(s,k),c.left-=k[0]-(h-y),c.top-=k[1]-(m-g),this._mapDataMap[s].transform=c,this.clearEffectShape(!0);for(var n=0,a=this.shapeList.length;a>n;n++){var o=this.shapeList[n];if(o._mapType==s){var x=o.type,_=o.style;switch(o.position[0]=c.left,o.position[1]=c.top,x){case"path":case"symbol":case"circle":case"rectangle":case"polygon":case"line":case"ellipse":case"heatmap":o.scale[0]*=r,o.scale[1]*=r;break;case"mark-line":i(_,r);break;case"polyline":t(_,r);break;case"shape-bundle":for(var L=0;L<_.shapeList.length;L++){var W=_.shapeList[L];"mark-line"==W.type?i(W.style,r):"polyline"==W.type&&t(W.style,r)}break;case"icon":case"image":k=this.geo2pos(s,o._geo),_.x=_._x=k[0]-_.width/2,_.y=_._y=k[1]-_.height/2;break;default:k=this.geo2pos(s,o._geo),_.x=k[0],_.y=k[1],"text"==x&&(o._style.x=o.highlightStyle.x=k[0],o._style.y=o.highlightStyle.y=k[1])}this.zr.modShape(o.id)}}}if(p){u.stop(l),this.zr.refreshNextFrame();var X=this;clearTimeout(this._refreshDelayTicket),this._refreshDelayTicket=setTimeout(function(){X&&X.shapeList&&X.animationEffect()},100),this.messageCenter.dispatch(U.EVENT.MAP_ROAM,e.event,{type:"scale"},this.myChart)}}},__onmousedown:function(e){if(!(this.shapeList.length<=0)){var t=e.target;if(!t||!t.draggable){var i=e.event,n=u.getX(i),a=u.getY(i),o=this._findMapTypeByPos(n,a);if(o&&this._roamMap[o]&&"scale"!=this._roamMap[o]){this._mousedown=!0,this._mx=n,this._my=a,this._curMapType=o,this.zr.on(c.EVENT.MOUSEUP,this._onmouseup);var r=this;setTimeout(function(){r.zr.on(c.EVENT.MOUSEMOVE,r._onmousemove)},100)}}}},__onmousemove:function(e){if(this._mousedown&&this._isAlive){var t=e.event,i=u.getX(t),n=u.getY(t),a=this._mapDataMap[this._curMapType].transform;a.hasRoam=!0,a.left-=this._mx-i,a.top-=this._my-n,this._mx=i,this._my=n,this._mapDataMap[this._curMapType].transform=a;for(var o=0,r=this.shapeList.length;r>o;o++)this.shapeList[o]._mapType==this._curMapType&&(this.shapeList[o].position[0]=a.left,this.shapeList[o].position[1]=a.top,this.zr.modShape(this.shapeList[o].id));this.messageCenter.dispatch(U.EVENT.MAP_ROAM,e.event,{type:"move"},this.myChart),this.clearEffectShape(!0),this.zr.refreshNextFrame(),this._justMove=!0,u.stop(t)}},__onmouseup:function(e){var t=e.event;this._mx=u.getX(t),this._my=u.getY(t),this._mousedown=!1;var i=this;setTimeout(function(){i._justMove&&i.animationEffect(),i._justMove=!1,i.zr.un(c.EVENT.MOUSEMOVE,i._onmousemove),i.zr.un(c.EVENT.MOUSEUP,i._onmouseup)},120)},__onroamcontroller:function(e){var t=e.event;t.zrenderX=this.zr.getWidth()/2,t.zrenderY=this.zr.getHeight()/2;var i=e.mapTypeControl,n=0,a=0,o=e.step;switch(e.roamType){case"scaleUp":return t.zrenderDelta=1,void this.__onmousewheel({event:t,mapTypeControl:i});case"scaleDown":return t.zrenderDelta=-1,void this.__onmousewheel({event:t,mapTypeControl:i});case"up":n=-o;break;case"down":n=o;break;case"left":a=-o;break;case"right":a=o}var r,s;for(s in i)this._mapDataMap[s]&&this._activeMapType[s]&&(r=this._mapDataMap[s].transform,r.hasRoam=!0,r.left-=a,r.top-=n,this._mapDataMap[s].transform=r);for(var l=0,h=this.shapeList.length;h>l;l++)s=this.shapeList[l]._mapType,i[s]&&this._activeMapType[s]&&(r=this._mapDataMap[s].transform,this.shapeList[l].position[0]=r.left,this.shapeList[l].position[1]=r.top,this.zr.modShape(this.shapeList[l].id));this.messageCenter.dispatch(U.EVENT.MAP_ROAM,e.event,{type:"move"},this.myChart),this.clearEffectShape(!0),this.zr.refreshNextFrame(),clearTimeout(this.dircetionTimer);var m=this;this.dircetionTimer=setTimeout(function(){m.animationEffect()},150)},__ondrhoverlink:function(e){for(var t,i,n=0,a=this.shapeList.length;a>n;n++)t=this.shapeList[n]._mapType,this._hoverLinkMap[t]&&this._activeMapType[t]&&(i=d.get(this.shapeList[n],"value"),null!=i&&i>=e.valueMin&&i<=e.valueMax&&this.zr.addHoverShape(this.shapeList[n]))},onclick:function(e){if(this.isClick&&e.target&&!this._justMove&&"icon"!=e.target.type){this.isClick=!1;var t=e.target,i=t.style._name,n=this.shapeList.length,a=t._mapType||"";if("single"==this._selectedMode[a])for(var o in this._selected)if(this._selected[o]&&this._mapTypeMap[o]==a){for(var r=0;n>r;r++)this.shapeList[r].style._name==o&&this.shapeList[r]._mapType==a&&(this.shapeList[r].style=this.shapeList[r]._style,this.zr.modShape(this.shapeList[r].id));o!=i&&(this._selected[o]=!1)}this._selected[i]=!this._selected[i];for(var r=0;n>r;r++)this.shapeList[r].style._name==i&&this.shapeList[r]._mapType==a&&(this.shapeList[r].style=this._selected[i]?this.shapeList[r].highlightStyle:this.shapeList[r]._style,this.zr.modShape(this.shapeList[r].id));this.messageCenter.dispatch(U.EVENT.MAP_SELECTED,e.event,{selected:this._selected,target:i},this.myChart),this.zr.refreshNextFrame();var s=this;setTimeout(function(){s.zr.trigger(c.EVENT.MOUSEMOVE,e.event)},100)}},refresh:function(e){e&&(this.option=e,this.series=e.series),this._mapDataRequireCounter>0?this.clear():this.backupShapeList(),this._buildShape(),this.zr.refreshHover()},ondataRange:function(e,t){this.component.dataRange&&(this.refresh(),t.needRefresh=!0)},pos2geo:function(e,t){return this._mapDataMap[e].transform?this._mapDataMap[e].projection.pos2geo(this._mapDataMap[e].transform,t):null},getGeoByPos:function(e,t){if(!this._mapDataMap[e].transform)return null;var i=[this._mapDataMap[e].transform.left,this._mapDataMap[e].transform.top];return t instanceof Array?(t[0]-=i[0],t[1]-=i[1]):(t.x-=i[0],t.y-=i[1]),this.pos2geo(e,t)},geo2pos:function(e,t){return this._mapDataMap[e].transform?this._mapDataMap[e].projection.geo2pos(this._mapDataMap[e].transform,t):null},getPosByGeo:function(e,t){if(!this._mapDataMap[e].transform)return null;var i=this.geo2pos(e,t);return i[0]+=this._mapDataMap[e].transform.left,i[1]+=this._mapDataMap[e].transform.top,i},getMapPosition:function(e){return this._mapDataMap[e].transform?[this._mapDataMap[e].transform.left,this._mapDataMap[e].transform.top]:null},onbeforDispose:function(){this._isAlive=!1,this.zr.un(c.EVENT.MOUSEWHEEL,this._onmousewheel),this.zr.un(c.EVENT.MOUSEDOWN,this._onmousedown),this.messageCenter.unbind(U.EVENT.ROAMCONTROLLER,this._onroamcontroller),this.messageCenter.unbind(U.EVENT.DATA_RANGE_HOVERLINK,this._ondrhoverlink)}},p.inherits(t,i),e("../chart").define("map",t),t}),i("zrender/shape/Path",["require","./Base","./util/PathProxy","../tool/util"],function(e){var t=e("./Base"),i=e("./util/PathProxy"),n=i.PathSegment,a=function(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1])},o=function(e,t){return(e[0]*t[0]+e[1]*t[1])/(a(e)*a(t))},r=function(e,t){return(e[0]*t[1]<e[1]*t[0]?-1:1)*Math.acos(o(e,t))},s=function(e){t.call(this,e)};return s.prototype={type:"path",buildPathArray:function(e,t,i){if(!e)return[];t=t||0,i=i||0;var a=e,o=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"];a=a.replace(/-/g," -"),a=a.replace(/ /g," "),a=a.replace(/ /g,","),a=a.replace(/,,/g,",");var r;for(r=0;r<o.length;r++)a=a.replace(new RegExp(o[r],"g"),"|"+o[r]);var s=a.split("|"),l=[],h=0,m=0;for(r=1;r<s.length;r++){var V=s[r],U=V.charAt(0);V=V.slice(1),V=V.replace(new RegExp("e,-","g"),"e-");var d=V.split(",");d.length>0&&""===d[0]&&d.shift();for(var p=0;p<d.length;p++)d[p]=parseFloat(d[p]);for(;d.length>0&&!isNaN(d[0]);){var c,u,y,g,b,f,k,x,_=null,L=[],W=h,X=m;switch(U){case"l":h+=d.shift(),m+=d.shift(),_="L",L.push(h,m);break;case"L":h=d.shift(),m=d.shift(),L.push(h,m);break;case"m":h+=d.shift(),m+=d.shift(),_="M",L.push(h,m),U="l";break;case"M":h=d.shift(),m=d.shift(),_="M",L.push(h,m),U="L";break;case"h":h+=d.shift(),_="L",L.push(h,m);break;case"H":h=d.shift(),_="L",L.push(h,m);break;case"v":m+=d.shift(),_="L",L.push(h,m);break;case"V":m=d.shift(),_="L",L.push(h,m);break;case"C":L.push(d.shift(),d.shift(),d.shift(),d.shift()),h=d.shift(),m=d.shift(),L.push(h,m);break;case"c":L.push(h+d.shift(),m+d.shift(),h+d.shift(),m+d.shift()),h+=d.shift(),m+=d.shift(),_="C",L.push(h,m);break;case"S":c=h,u=m,y=l[l.length-1],"C"===y.command&&(c=h+(h-y.points[2]),u=m+(m-y.points[3])),L.push(c,u,d.shift(),d.shift()),h=d.shift(),m=d.shift(),_="C",L.push(h,m);break;case"s":c=h,u=m,y=l[l.length-1],"C"===y.command&&(c=h+(h-y.points[2]),u=m+(m-y.points[3])),L.push(c,u,h+d.shift(),m+d.shift()),h+=d.shift(),m+=d.shift(),_="C",L.push(h,m);break;case"Q":L.push(d.shift(),d.shift()),h=d.shift(),m=d.shift(),L.push(h,m);break;case"q":L.push(h+d.shift(),m+d.shift()),h+=d.shift(),m+=d.shift(),_="Q",L.push(h,m);break;case"T":c=h,u=m,y=l[l.length-1],"Q"===y.command&&(c=h+(h-y.points[0]),u=m+(m-y.points[1])),h=d.shift(),m=d.shift(),_="Q",L.push(c,u,h,m);break;case"t":c=h,u=m,y=l[l.length-1],"Q"===y.command&&(c=h+(h-y.points[0]),u=m+(m-y.points[1])),h+=d.shift(),m+=d.shift(),_="Q",L.push(c,u,h,m);break;case"A":g=d.shift(),b=d.shift(),f=d.shift(),k=d.shift(),x=d.shift(),W=h,X=m,h=d.shift(),m=d.shift(),_="A",L=this._convertPoint(W,X,h,m,k,x,g,b,f);break;case"a":g=d.shift(),b=d.shift(),f=d.shift(),k=d.shift(),x=d.shift(),W=h,X=m,h+=d.shift(),m+=d.shift(),_="A",L=this._convertPoint(W,X,h,m,k,x,g,b,f)}for(var v=0,w=L.length;w>v;v+=2)L[v]+=t,L[v+1]+=i;l.push(new n(_||U,L))}("z"===U||"Z"===U)&&l.push(new n("z",[]))}return l},_convertPoint:function(e,t,i,n,a,s,l,h,m){var V=m*(Math.PI/180),U=Math.cos(V)*(e-i)/2+Math.sin(V)*(t-n)/2,d=-1*Math.sin(V)*(e-i)/2+Math.cos(V)*(t-n)/2,p=U*U/(l*l)+d*d/(h*h);p>1&&(l*=Math.sqrt(p),h*=Math.sqrt(p));var c=Math.sqrt((l*l*h*h-l*l*d*d-h*h*U*U)/(l*l*d*d+h*h*U*U));a===s&&(c*=-1),isNaN(c)&&(c=0);var u=c*l*d/h,y=c*-h*U/l,g=(e+i)/2+Math.cos(V)*u-Math.sin(V)*y,b=(t+n)/2+Math.sin(V)*u+Math.cos(V)*y,f=r([1,0],[(U-u)/l,(d-y)/h]),k=[(U-u)/l,(d-y)/h],x=[(-1*U-u)/l,(-1*d-y)/h],_=r(k,x);return o(k,x)<=-1&&(_=Math.PI),o(k,x)>=1&&(_=0),0===s&&_>0&&(_-=2*Math.PI),1===s&&0>_&&(_+=2*Math.PI),[g,b,l,h,f,_,V,s]},buildPath:function(e,t){var i=t.path,n=t.x||0,a=t.y||0;t.pathArray=t.pathArray||this.buildPathArray(i,n,a);for(var o=t.pathArray,r=t.pointList=[],s=[],l=0,h=o.length;h>l;l++){"M"==o[l].command.toUpperCase()&&(s.length>0&&r.push(s),s=[]);for(var m=o[l].points,V=0,U=m.length;U>V;V+=2)s.push([m[V],m[V+1]])}s.length>0&&r.push(s);for(var l=0,h=o.length;h>l;l++){var d=o[l].command,m=o[l].points;switch(d){case"L":e.lineTo(m[0],m[1]);break;case"M":e.moveTo(m[0],m[1]);break;case"C":e.bezierCurveTo(m[0],m[1],m[2],m[3],m[4],m[5]);break;case"Q":e.quadraticCurveTo(m[0],m[1],m[2],m[3]);break;case"A":var p=m[0],c=m[1],u=m[2],y=m[3],g=m[4],b=m[5],f=m[6],k=m[7],x=u>y?u:y,_=u>y?1:u/y,L=u>y?y/u:1;e.translate(p,c),e.rotate(f),e.scale(_,L),e.arc(0,0,x,g,g+b,1-k),e.scale(1/_,1/L),e.rotate(-f),e.translate(-p,-c);break;case"z":e.closePath()}}},getRect:function(e){if(e.__rect)return e.__rect;var t;t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0;for(var i=Number.MAX_VALUE,n=Number.MIN_VALUE,a=Number.MAX_VALUE,o=Number.MIN_VALUE,r=e.x||0,s=e.y||0,l=e.pathArray||this.buildPathArray(e.path),h=0;h<l.length;h++)for(var m=l[h].points,V=0;V<m.length;V++)V%2===0?(m[V]+r<i&&(i=m[V]),m[V]+r>n&&(n=m[V])):(m[V]+s<a&&(a=m[V]),m[V]+s>o&&(o=m[V]));var U;return U=i===Number.MAX_VALUE||n===Number.MIN_VALUE||a===Number.MAX_VALUE||o===Number.MIN_VALUE?{x:0,y:0,width:0,height:0}:{x:Math.round(i-t/2),y:Math.round(a-t/2),width:n-i+t,height:o-a+t},e.__rect=U,U}},e("../tool/util").inherits(s,t),s}),i("zrender/shape/Ellipse",["require","./Base","../tool/util"],function(e){var t=e("./Base"),i=function(e){t.call(this,e)};return i.prototype={type:"ellipse",buildPath:function(e,t){var i=.5522848,n=t.x,a=t.y,o=t.a,r=t.b,s=o*i,l=r*i;e.moveTo(n-o,a),e.bezierCurveTo(n-o,a-l,n-s,a-r,n,a-r),e.bezierCurveTo(n+s,a-r,n+o,a-l,n+o,a),e.bezierCurveTo(n+o,a+l,n+s,a+r,n,a+r),e.bezierCurveTo(n-s,a+r,n-o,a+l,n-o,a),e.closePath()},getRect:function(e){if(e.__rect)return e.__rect;var t;return t="stroke"==e.brushType||"fill"==e.brushType?e.lineWidth||1:0,e.__rect={x:Math.round(e.x-e.a-t/2),
-y:Math.round(e.y-e.b-t/2),width:2*e.a+t,height:2*e.b+t},e.__rect}},e("../tool/util").inherits(i,t),i}),i("echarts/component/roamController",["require","./base","zrender/shape/Rectangle","zrender/shape/Sector","zrender/shape/Circle","../config","zrender/tool/util","zrender/tool/color","zrender/tool/event","../component"],function(e){function t(e,t,n,a,o){if(this.rcOption={},a.roamController&&a.roamController.show){if(!a.roamController.mapTypeControl)return void console.error("option.roamController.mapTypeControl has not been defined.");i.call(this,e,t,n,a,o),this.rcOption=a.roamController;var r=this;this._drictionMouseDown=function(e){return r.__drictionMouseDown(e)},this._drictionMouseUp=function(e){return r.__drictionMouseUp(e)},this._drictionMouseMove=function(e){return r.__drictionMouseMove(e)},this._drictionMouseOut=function(e){return r.__drictionMouseOut(e)},this._scaleHandler=function(e){return r.__scaleHandler(e)},this.refresh(a)}}var i=e("./base"),n=e("zrender/shape/Rectangle"),a=e("zrender/shape/Sector"),o=e("zrender/shape/Circle"),r=e("../config");r.roamController={zlevel:0,z:4,show:!0,x:"left",y:"top",width:80,height:120,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,handleColor:"#6495ed",fillerColor:"#fff",step:15,mapTypeControl:null};var s=e("zrender/tool/util"),l=e("zrender/tool/color"),h=e("zrender/tool/event");return t.prototype={type:r.COMPONENT_TYPE_ROAMCONTROLLER,_buildShape:function(){if(this.rcOption.show){this._itemGroupLocation=this._getItemGroupLocation(),this._buildBackground(),this._buildItem();for(var e=0,t=this.shapeList.length;t>e;e++)this.zr.addShape(this.shapeList[e])}},_buildItem:function(){this.shapeList.push(this._getDirectionShape("up")),this.shapeList.push(this._getDirectionShape("down")),this.shapeList.push(this._getDirectionShape("left")),this.shapeList.push(this._getDirectionShape("right")),this.shapeList.push(this._getScaleShape("scaleUp")),this.shapeList.push(this._getScaleShape("scaleDown"))},_getDirectionShape:function(e){var t=this._itemGroupLocation.r,i=this._itemGroupLocation.x+t,n=this._itemGroupLocation.y+t,o={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:i,y:n,r:t,startAngle:-45,endAngle:45,color:this.rcOption.handleColor,text:">",textX:i+t/2+4,textY:n-.5,textAlign:"center",textBaseline:"middle",textPosition:"specific",textColor:this.rcOption.fillerColor,textFont:Math.floor(t/2)+"px arial"},highlightStyle:{color:l.lift(this.rcOption.handleColor,-.2),brushType:"fill"},clickable:!0};switch(e){case"up":o.rotation=[Math.PI/2,i,n];break;case"left":o.rotation=[Math.PI,i,n];break;case"down":o.rotation=[-Math.PI/2,i,n]}return o=new a(o),o._roamType=e,o.onmousedown=this._drictionMouseDown,o.onmouseup=this._drictionMouseUp,o.onmousemove=this._drictionMouseMove,o.onmouseout=this._drictionMouseOut,o},_getScaleShape:function(e){var t=this._itemGroupLocation.width,i=this._itemGroupLocation.height-t;i=0>i?20:i;var n=Math.min(t/2-5,i)/2,a=this._itemGroupLocation.x+("scaleDown"===e?t-n:n),r=this._itemGroupLocation.y+this._itemGroupLocation.height-n,s={zlevel:this.getZlevelBase(),z:this.getZBase(),style:{x:a,y:r,r:n,color:this.rcOption.handleColor,text:"scaleDown"===e?"-":"+",textX:a,textY:r-2,textAlign:"center",textBaseline:"middle",textPosition:"specific",textColor:this.rcOption.fillerColor,textFont:Math.floor(n)+"px verdana"},highlightStyle:{color:l.lift(this.rcOption.handleColor,-.2),brushType:"fill"},clickable:!0};return s=new o(s),s._roamType=e,s.onmousedown=this._scaleHandler,s},_buildBackground:function(){var e=this.reformCssArray(this.rcOption.padding);this.shapeList.push(new n({zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{x:this._itemGroupLocation.x-e[3],y:this._itemGroupLocation.y-e[0],width:this._itemGroupLocation.width+e[3]+e[1],height:this._itemGroupLocation.height+e[0]+e[2],brushType:0===this.rcOption.borderWidth?"fill":"both",color:this.rcOption.backgroundColor,strokeColor:this.rcOption.borderColor,lineWidth:this.rcOption.borderWidth}}))},_getItemGroupLocation:function(){var e,t=this.reformCssArray(this.rcOption.padding),i=this.rcOption.width,n=this.rcOption.height,a=this.zr.getWidth(),o=this.zr.getHeight();switch(this.rcOption.x){case"center":e=Math.floor((a-i)/2);break;case"left":e=t[3]+this.rcOption.borderWidth;break;case"right":e=a-i-t[1]-t[3]-2*this.rcOption.borderWidth;break;default:e=this.parsePercent(this.rcOption.x,a)}var r;switch(this.rcOption.y){case"top":r=t[0]+this.rcOption.borderWidth;break;case"bottom":r=o-n-t[0]-t[2]-2*this.rcOption.borderWidth;break;case"center":r=Math.floor((o-n)/2);break;default:r=this.parsePercent(this.rcOption.y,o)}return{x:e,y:r,r:i/2,width:i,height:n}},__drictionMouseDown:function(e){this.mousedown=!0,this._drictionHandlerOn(e)},__drictionMouseUp:function(e){this.mousedown=!1,this._drictionHandlerOff(e)},__drictionMouseMove:function(e){this.mousedown&&this._drictionHandlerOn(e)},__drictionMouseOut:function(e){this._drictionHandlerOff(e)},_drictionHandlerOn:function(e){this._dispatchEvent(e.event,e.target._roamType),clearInterval(this.dircetionTimer);var t=this;this.dircetionTimer=setInterval(function(){t._dispatchEvent(e.event,e.target._roamType)},100),h.stop(e.event)},_drictionHandlerOff:function(){clearInterval(this.dircetionTimer)},__scaleHandler:function(e){this._dispatchEvent(e.event,e.target._roamType),h.stop(e.event)},_dispatchEvent:function(e,t){this.messageCenter.dispatch(r.EVENT.ROAMCONTROLLER,e,{roamType:t,mapTypeControl:this.rcOption.mapTypeControl,step:this.rcOption.step},this.myChart)},refresh:function(e){e&&(this.option=e||this.option,this.option.roamController=this.reformOption(this.option.roamController),this.rcOption=this.option.roamController),this.clear(),this._buildShape()}},s.inherits(t,i),e("../component").define("roamController",t),t}),i("echarts/layer/heatmap",["require"],function(){function e(e){if(this.option=e,e)for(var i in t)this.option[i]=void 0!==e[i]?e[i]:t[i];else this.option=t}var t={blurSize:30,gradientColors:["blue","cyan","lime","yellow","red"],minAlpha:.05,valueScale:1,opacity:1},i=20,n=256;return e.prototype={getCanvas:function(e,t,a){var o=this._getBrush(),r=this._getGradient(),s=i+this.option.blurSize,l=document.createElement("canvas");l.width=t,l.height=a;for(var h=l.getContext("2d"),m=e.length,V=0;m>V;++V){var U=e[V],d=U[0],p=U[1],c=U[2],u=Math.min(1,Math.max(c*this.option.valueScale||this.option.minAlpha,this.option.minAlpha));h.globalAlpha=u,h.drawImage(o,d-s,p-s)}for(var y=h.getImageData(0,0,l.width,l.height),g=y.data,m=g.length/4;m--;){var b=4*m+3,u=g[b]/256,f=Math.floor(u*(n-1));g[b-3]=r[4*f],g[b-2]=r[4*f+1],g[b-1]=r[4*f+2],g[b]*=this.option.opacity}return h.putImageData(y,0,0),l},_getBrush:function(){if(!this._brushCanvas){this._brushCanvas=document.createElement("canvas");var e=i+this.option.blurSize,t=2*e;this._brushCanvas.width=t,this._brushCanvas.height=t;var n=this._brushCanvas.getContext("2d");n.shadowOffsetX=t,n.shadowBlur=this.option.blurSize,n.shadowColor="black",n.beginPath(),n.arc(-e,e,i,0,2*Math.PI,!0),n.closePath(),n.fill()}return this._brushCanvas},_getGradient:function(){if(!this._gradientPixels){var e=n,t=document.createElement("canvas");t.width=1,t.height=e;for(var i=t.getContext("2d"),a=i.createLinearGradient(0,0,0,e),o=this.option.gradientColors.length,r=0;o>r;++r)"string"==typeof this.option.gradientColors[r]?a.addColorStop((r+1)/o,this.option.gradientColors[r]):a.addColorStop(this.option.gradientColors[r].offset,this.option.gradientColors[r].color);i.fillStyle=a,i.fillRect(0,0,1,e),this._gradientPixels=i.getImageData(0,0,1,e).data}return this._gradientPixels}},e}),i("echarts/util/mapData/params",["require"],function(e){function t(e){if(!e.UTF8Encoding)return e;for(var t=e.features,n=0;n<t.length;n++)for(var a=t[n],o=a.geometry.coordinates,r=a.geometry.encodeOffsets,s=0;s<o.length;s++){var l=o[s];if("Polygon"===a.geometry.type)o[s]=i(l,r[s]);else if("MultiPolygon"===a.geometry.type)for(var h=0;h<l.length;h++){var m=l[h];l[h]=i(m,r[s][h])}}return e.UTF8Encoding=!1,e}function i(e,t){for(var i=[],n=t[0],a=t[1],o=0;o<e.length;o+=2){var r=e.charCodeAt(o)-64,s=e.charCodeAt(o+1)-64;r=r>>1^-(1&r),s=s>>1^-(1&s),r+=n,s+=a,n=r,a=s,i.push([r/1024,s/1024])}return i}var n={none:{getGeoJson:function(e){e({type:"FeatureCollection",features:[{type:"Feature",geometry:{coordinates:[],encodeOffsets:[],type:"Polygon"},properties:{}}]})}},world:{getGeoJson:function(i){e(["./geoJson/world_geo"],function(e){i(t(e))})}},china:{getGeoJson:function(i){e(["./geoJson/china_geo"],function(e){i(t(e))})}},"å—海诸岛":{textCoord:[126,25],getPath:function(e,t){for(var i=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]],n="",a=e[0],o=e[1],r=0,s=i.length;s>r;r++){n+="M "+((i[r][0][0]*t+a).toFixed(2)-0)+" "+((i[r][0][1]*t+o).toFixed(2)-0)+" ";for(var l=1,h=i[r].length;h>l;l++)n+="L "+((i[r][l][0]*t+a).toFixed(2)-0)+" "+((i[r][l][1]*t+o).toFixed(2)-0)+" "}return n+" Z"}},"æ–°ç–†":{getGeoJson:function(i){e(["./geoJson/xin_jiang_geo"],function(e){i(t(e))})}},"西è—":{getGeoJson:function(i){e(["./geoJson/xi_zang_geo"],function(e){i(t(e))})}},"内蒙å¤":{getGeoJson:function(i){e(["./geoJson/nei_meng_gu_geo"],function(e){i(t(e))})}},"é’æµ·":{getGeoJson:function(i){e(["./geoJson/qing_hai_geo"],function(e){i(t(e))})}},"å››å·":{getGeoJson:function(i){e(["./geoJson/si_chuan_geo"],function(e){i(t(e))})}},"黑龙江":{getGeoJson:function(i){e(["./geoJson/hei_long_jiang_geo"],function(e){i(t(e))})}},"甘肃":{getGeoJson:function(i){e(["./geoJson/gan_su_geo"],function(e){i(t(e))})}},"云å—":{getGeoJson:function(i){e(["./geoJson/yun_nan_geo"],function(e){i(t(e))})}},"广西":{getGeoJson:function(i){e(["./geoJson/guang_xi_geo"],function(e){i(t(e))})}},"æ¹–å—":{getGeoJson:function(i){e(["./geoJson/hu_nan_geo"],function(e){i(t(e))})}},"陕西":{getGeoJson:function(i){e(["./geoJson/shan_xi_1_geo"],function(e){i(t(e))})}},"广东":{getGeoJson:function(i){e(["./geoJson/guang_dong_geo"],function(e){i(t(e))})}},"å‰æž—":{getGeoJson:function(i){e(["./geoJson/ji_lin_geo"],function(e){i(t(e))})}},"河北":{getGeoJson:function(i){e(["./geoJson/he_bei_geo"],function(e){i(t(e))})}},"湖北":{getGeoJson:function(i){e(["./geoJson/hu_bei_geo"],function(e){i(t(e))})}},"贵州":{getGeoJson:function(i){e(["./geoJson/gui_zhou_geo"],function(e){i(t(e))})}},"山东":{getGeoJson:function(i){e(["./geoJson/shan_dong_geo"],function(e){i(t(e))})}},"江西":{getGeoJson:function(i){e(["./geoJson/jiang_xi_geo"],function(e){i(t(e))})}},"æ²³å—":{getGeoJson:function(i){e(["./geoJson/he_nan_geo"],function(e){i(t(e))})}},"è¾½å®":{getGeoJson:function(i){e(["./geoJson/liao_ning_geo"],function(e){i(t(e))})}},"山西":{getGeoJson:function(i){e(["./geoJson/shan_xi_2_geo"],function(e){i(t(e))})}},"安徽":{getGeoJson:function(i){e(["./geoJson/an_hui_geo"],function(e){i(t(e))})}},"ç¦å»º":{getGeoJson:function(i){e(["./geoJson/fu_jian_geo"],function(e){i(t(e))})}},"浙江":{getGeoJson:function(i){e(["./geoJson/zhe_jiang_geo"],function(e){i(t(e))})}},"江è‹":{getGeoJson:function(i){e(["./geoJson/jiang_su_geo"],function(e){i(t(e))})}},"é‡åº†":{getGeoJson:function(i){e(["./geoJson/chong_qing_geo"],function(e){i(t(e))})}},"å®å¤":{getGeoJson:function(i){e(["./geoJson/ning_xia_geo"],function(e){i(t(e))})}},"æµ·å—":{getGeoJson:function(i){e(["./geoJson/hai_nan_geo"],function(e){i(t(e))})}},"å°æ¹¾":{getGeoJson:function(i){e(["./geoJson/tai_wan_geo"],function(e){i(t(e))})}},"北京":{getGeoJson:function(i){e(["./geoJson/bei_jing_geo"],function(e){i(t(e))})}},"天津":{getGeoJson:function(i){e(["./geoJson/tian_jin_geo"],function(e){i(t(e))})}},"上海":{getGeoJson:function(i){e(["./geoJson/shang_hai_geo"],function(e){i(t(e))})}},"香港":{getGeoJson:function(i){e(["./geoJson/xiang_gang_geo"],function(e){i(t(e))})}},"澳门":{getGeoJson:function(i){e(["./geoJson/ao_men_geo"],function(e){i(t(e))})}}};return{decode:t,params:n}}),i("echarts/util/mapData/textFixed",[],function(){return{"广东":[0,-10],"香港":[10,10],"澳门":[-10,18],"黑龙江":[0,20],"天津":[5,5],"深圳市":[-35,0],"红河哈尼æ—å½æ—自治州":[0,20],"楚雄å½æ—自治州":[-5,15],"石河å­å¸‚":[-5,5],"五家渠市":[0,-10],"昌å‰å›žæ—自治州":[10,10],"昌江黎æ—自治县":[0,20],"陵水黎æ—自治县":[0,20],"东方市":[0,20],"渭å—市":[0,20]}}),i("echarts/util/mapData/geoCoord",[],function(){return{Russia:[100,60],"United States of America":[-99,38]}}),i("echarts/util/projection/svg",["require","zrender/shape/Path"],function(e){function t(e){return parseFloat(e||0)}function i(e){for(var i=e.firstChild;"svg"!=i.nodeName.toLowerCase()||1!=i.nodeType;)i=i.nextSibling;var n=t(i.getAttribute("x")),a=t(i.getAttribute("y")),o=t(i.getAttribute("width")),r=t(i.getAttribute("height"));return{left:n,top:a,width:o,height:r}}function n(e,t){function i(e){var t=e.tagName;if(m[t]){var o=m[t](e,n);o&&(o.scale=n,o.properties={name:e.getAttribute("name")||""},o.id=e.id,s(o,e),a.push(o))}for(var r=e.childNodes,l=0,h=r.length;h>l;l++)i(r[l])}var n=[t.scale.x,t.scale.y],a=[];return i(e),a}function a(e,t){var i=t instanceof Array?[1*t[0],1*t[1]]:[1*t.x,1*t.y];return[i[0]/e.scale.x,i[1]/e.scale.y]}function o(e,t){var i=t instanceof Array?[1*t[0],1*t[1]]:[1*t.x,1*t.y];return[i[0]*e.scale.x,i[1]*e.scale.y]}function r(e){return e.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function s(e,t){var i=t.getAttribute("fill"),n=t.getAttribute("stroke"),a=t.getAttribute("stroke-width"),o=t.getAttribute("opacity");i&&"none"!=i?(e.color=i,n?(e.brushType="both",e.strokeColor=n):e.brushType="fill"):n&&"none"!=n&&(e.strokeColor=n,e.brushType="stroke"),a&&"none"!=a&&(e.lineWidth=parseFloat(a)),o&&"none"!=o&&(e.opacity=parseFloat(o))}function l(e){for(var t=r(e).replace(/,/g," ").split(/\s+/),i=[],n=0;n<t.length;){var a=parseFloat(t[n++]),o=parseFloat(t[n++]);i.push([a,o])}return i}var h=e("zrender/shape/Path"),m={path:function(e,t){var i=e.getAttribute("d"),n=h.prototype.getRect({path:i});return{shapeType:"path",path:i,cp:[(n.x+n.width/2)*t[0],(n.y+n.height/2)*t[1]]}},rect:function(e,i){var n=t(e.getAttribute("x")),a=t(e.getAttribute("y")),o=t(e.getAttribute("width")),r=t(e.getAttribute("height"));return{shapeType:"rectangle",x:n,y:a,width:o,height:r,cp:[(n+o/2)*i[0],(a+r/2)*i[1]]}},line:function(e,i){var n=t(e.getAttribute("x1")),a=t(e.getAttribute("y1")),o=t(e.getAttribute("x2")),r=t(e.getAttribute("y2"));return{shapeType:"line",xStart:n,yStart:a,xEnd:o,yEnd:r,cp:[.5*(n+o)*i[0],.5*(a+r)*i[1]]}},circle:function(e,i){var n=t(e.getAttribute("cx")),a=t(e.getAttribute("cy")),o=t(e.getAttribute("r"));return{shapeType:"circle",x:n,y:a,r:o,cp:[n*i[0],a*i[1]]}},ellipse:function(e,t){var i=parseFloat(e.getAttribute("cx")||0),n=parseFloat(e.getAttribute("cy")||0),a=parseFloat(e.getAttribute("rx")||0),o=parseFloat(e.getAttribute("ry")||0);return{shapeType:"ellipse",x:i,y:n,a:a,b:o,cp:[i*t[0],n*t[1]]}},polygon:function(e,t){var i=e.getAttribute("points"),n=[1/0,1/0],a=[-(1/0),-(1/0)];if(i){i=l(i);for(var o=0;o<i.length;o++){var r=i[o];n[0]=Math.min(r[0],n[0]),n[1]=Math.min(r[1],n[1]),a[0]=Math.max(r[0],a[0]),a[1]=Math.max(r[1],a[1])}return{shapeType:"polygon",pointList:i,cp:[(n[0]+a[0])/2*t[0],(n[1]+a[1])/2*t[0]]}}},polyline:function(e,t){var i=m.polygon(e,t);return i}};return{getBbox:i,geoJson2Path:n,pos2geo:a,geo2pos:o}}),i("echarts/util/projection/normal",[],function(){function e(e,i){return i=i||{},e.srcSize||t(e,i),e.srcSize}function t(e,t){t=t||{},r.xmin=360,r.xmax=-360,r.ymin=180,r.ymax=-180;for(var i,n,a=e.features,o=0,s=a.length;s>o;o++)if(n=a[o],!n.properties.name||!t[n.properties.name])switch(n.type){case"Feature":r[n.geometry.type](n.geometry.coordinates);break;case"GeometryCollection":i=n.geometries;for(var l=0,h=i.length;h>l;l++)r[i[l].type](i[l].coordinates)}return e.srcSize={left:1*r.xmin.toFixed(4),top:1*r.ymin.toFixed(4),width:1*(r.xmax-r.xmin).toFixed(4),height:1*(r.ymax-r.ymin).toFixed(4)},e}function i(e,i,n){function a(e,t){c=e.type,u=e.coordinates,o._bbox={xmin:360,xmax:-360,ymin:180,ymax:-180},y=o[c](u),m.push({path:y,cp:o.makePoint(t.properties.cp?t.properties.cp:[(o._bbox.xmin+o._bbox.xmax)/2,(o._bbox.ymin+o._bbox.ymax)/2]),properties:t.properties,id:t.id})}n=n||{},o.scale=null,o.offset=null,e.srcSize||t(e,n),i.offset={x:e.srcSize.left,y:e.srcSize.top,left:i.OffsetLeft||0,top:i.OffsetTop||0},o.scale=i.scale,o.offset=i.offset;for(var r,s,l,h=e.features,m=[],V=0,U=h.length;U>V;V++)if(l=h[V],!l.properties.name||!n[l.properties.name])if("Feature"==l.type)a(l.geometry,l);else if("GeometryCollection"==l.type){r=l.geometries;for(var d=0,p=r.length;p>d;d++)s=r[d],a(s,s)}var c,u,y;return m}function n(e,t){var i,n;return t instanceof Array?(i=1*t[0],n=1*t[1]):(i=1*t.x,n=1*t.y),i=i/e.scale.x+e.offset.x-168.5,i=i>180?i-360:i,n=90-(n/e.scale.y+e.offset.y),[i,n]}function a(e,t){return o.offset=e.offset,o.scale=e.scale,o.makePoint(t instanceof Array?[1*t[0],1*t[1]]:[1*t.x,1*t.y])}var o={formatPoint:function(e){return[(e[0]<-168.5&&e[1]>63.8?e[0]+360:e[0])+168.5,90-e[1]]},makePoint:function(e){var t=this,i=t.formatPoint(e);t._bbox.xmin>e[0]&&(t._bbox.xmin=e[0]),t._bbox.xmax<e[0]&&(t._bbox.xmax=e[0]),t._bbox.ymin>e[1]&&(t._bbox.ymin=e[1]),t._bbox.ymax<e[1]&&(t._bbox.ymax=e[1]);var n=(i[0]-o.offset.x)*o.scale.x+o.offset.left,a=(i[1]-o.offset.y)*o.scale.y+o.offset.top;return[n,a]},Point:function(e){return e=this.makePoint(e),e.join(",")},LineString:function(e){for(var t,i="",n=0,a=e.length;a>n;n++)t=o.makePoint(e[n]),i=0===n?"M"+t.join(","):i+"L"+t.join(",");return i},Polygon:function(e){for(var t="",i=0,n=e.length;n>i;i++)t=t+o.LineString(e[i])+"z";return t},MultiPoint:function(e){for(var t=[],i=0,n=e.length;n>i;i++)t.push(o.Point(e[i]));return t},MultiLineString:function(e){for(var t="",i=0,n=e.length;n>i;i++)t+=o.LineString(e[i]);return t},MultiPolygon:function(e){for(var t="",i=0,n=e.length;n>i;i++)t+=o.Polygon(e[i]);return t}},r={formatPoint:o.formatPoint,makePoint:function(e){var t=this,i=t.formatPoint(e),n=i[0],a=i[1];t.xmin>n&&(t.xmin=n),t.xmax<n&&(t.xmax=n),t.ymin>a&&(t.ymin=a),t.ymax<a&&(t.ymax=a)},Point:function(e){this.makePoint(e)},LineString:function(e){for(var t=0,i=e.length;i>t;t++)this.makePoint(e[t])},Polygon:function(e){for(var t=0,i=e.length;i>t;t++)this.LineString(e[t])},MultiPoint:function(e){for(var t=0,i=e.length;i>t;t++)this.Point(e[t])},MultiLineString:function(e){for(var t=0,i=e.length;i>t;t++)this.LineString(e[t])},MultiPolygon:function(e){for(var t=0,i=e.length;i>t;t++)this.Polygon(e[t])}};return{getBbox:e,geoJson2Path:i,pos2geo:n,geo2pos:a}}),i("echarts/util/mapData/geoJson/an_hui_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"3415",properties:{name:"六安市",cp:[116.3123,31.8329],childNum:6},geometry:{type:"Polygon",coordinates:["@@„„nJ‚UXUVƒ°U„ÑnU@mlLVaVln@@bn@VU@xlb@lšLnKlšƒVI„JšUVxnI@lVL@b„Ž°VX@˜b„x„nVVUnVVnU‚›@kX@VwV@„alÂ¥UUnUWa@ƒ@wĸU„LUÂ¥lKUa@aUI@alLVaUƒ¯anƒWkUKm@XÂV@VaXÂlW@aU_UWVUƒI¯@ma¯W¯™™I@UU@WWU@U@@UU@VkV@@WUUm@UaU@„ÂlK@IUK„L@KWmXUWaXI@ƒ@a@a@U@U@KVÂ¥lw„k°b²JVIVKlV@UX„la„Ul`ÂœUVLVVVUšJ„U@Lnm@_VK@KUIW@™J@Xk@WW@U—ƒmÂm™XmWk@ÂkK@aUUƒVmmkÂUwUmWL™ÂÂ@WmU@™ÂUJmUULkKWakLWVkIƒlƒwULƒW@X°lÂUJ@°ULƒÂWV—wmJ@bmb¯VkÂm@@WÂkWm¯wƒL@lkXƒWmXÂym¯UImJUbkV™@Vn¯„@V@lUbƒ@mkÂ@maUxmlUbULWn@J—LmKUkWKkwUKƒbm„X„WxkVUKmLkVVÂ@JUUWL@xkJUUƒV@X@VVlUbVX@xk¤šx‚¼œxWxn„‚nn@Þ¼„JVb°aVn„@šmlnXU„JlbVlkz@‚lÂUÂŽlÂXJmxVxXnWxXÈWlUÂŽ@šUxU@VX@xUL@šUÆmLnV@lWXk@@JlbXblnlJ"],encodeOffsets:[[118710,33351]]}},{type:"Feature",id:"3408",properties:{name:"安庆市",cp:[116.7517,30.5255],childNum:9},geometry:{type:"Polygon",coordinates:["@@n°‚znW„XlW@k„K°xXn‚l@Xn@l‚°Una@anI˜xXU„ŽVK@¯VIkÂW¯X@‚„VK„x„klJXUlKXblLVKnVVIšŽV@Xn‚@šŽXKVnVxlÂŽnn„UlmV@²óUkV™lW„b„Âlƒšƒn@VVVIn@lw@WVIXblV„@Èx‚aUaVIVVnKVLšK„ƒln@b²K@»U£ƒÑķƒġÃÃ…b™K™a@Im@Û„Â@kWÓkkmKÃ…nóJƒUÅ£›W@w„ĕ@wĉţ¯¯ƒUkK±l¯UĴUÑkÂÃUķ»Ã¥¯Â™JƒIUÂŽVbUl¯ÈV¼VJU¼Vb@bkLUl@„VJ@bUXǚ@lkVmXmKkLVxš‚Ž„VƒL@VkVVÂVlÂzW˜kbmLUUUbVbUV™šlÃ’nJlUnLllUL@bU„Vx„l‚LXVƦÈVU¦WJ"],encodeOffsets:[[118834,31759]]}},{type:"Feature",id:"3411",properties:{name:"æ»å·žå¸‚",cp:[118.1909,32.536],childNum:7},geometry:{type:"Polygon",coordinates:["@@š„@`nnl@„xšK@X°KXV˜IXVlbXVWnX‚lL@šÈ»‚LVan@VJ„êVVn@‚ÂX@laÞbVaƒyn@„_‚xnWVXnWl@VnUVkI@l‚nXKVLVV@V@ÂkW@LlVô„@J@bVnnKnkVa@»lç@ƒnwšKma™UUUVњ@n™mWXalI@alVn@VwUaVU„@„nlaôJnU„VVXlJšaXXVK@UšV@VWx@nXVWšXVšUlLUbV‚ULVVnUVbUbVbš@@a„KÆnnKVK@U@UU@@a„@Vƒ°¯ÈJVIlÄ·@aÂa˜ÂUaVKU_@mkxUI@aƒUlyU@@™wkKWmUbUnUVWbkJW_ÂJ@bƒn@Vm@@KULk@V@@bVbÃ…m@LW@UVVbkK@UkKWL@VULUKWIUJUbkK@_WVXU›Jka@XƒVÂa@kšy@aVIUUW@@m„UlLÂœKWÑUKVan@UkVmmIXKƒaVaUwVU@UmykU¯@±UUL@WUIVÂUU@KkIWaƒaU@kUUaǃUÂó»mKƒk¯@Ây@kWK@bkI¯`mn™l¯XWlkVUzUJlbUbVJl@nnm„@VULV`XnWƗbmUUn™JmUknƒJ¯km@ƒyk@kU›xÂL@VUbmnn¤lX@`™z@JmaULUVl@Xn@xllkXWa—aW@UVmUÂbƒ@mVXšWxXbWbUŽƒÒnVVnVVUL"],encodeOffsets:[[120004,33520]]}},{type:"Feature",id:"3418",properties:{name:"宣城市",cp:[118.8062,30.6244],childNum:7},geometry:{type:"Polygon",coordinates:["@@Vb@„XL˜JXxlIXxlVlV@I²¤šnlUnVšU@VULWVUJ@Lnb@lV@UnV@@VVVlLnbnJ‚UVkUUVWn@@anUVnVJVIV‚Â@@nUJVbUb‚„@VUbVK@bn@VbnIlxkllXVlXKWUXUlL°¤UVVb@bš„UlkXW‚ƒxXz@‚„Ila„UlƒnUlJVInVÆJ„U„LVUnV„K°@VnlVnxV@XLlK@wVL@KnUlJXU˜bnKVLX„lÂUw@ÂVWlLXKm@@a„@VLnmlIVVnKn@škVašVlwk@@a@k@ƒVIUa™Â@ÂmaUa@wna@kmWĪUUmVUIVǗÂ@aƒKm™aĪkU™J@InÂmUUaVa„k‚lX@Vk@m@ÂVU@wnK@alKVUkUkKƒbmUkmƒ@U£WVk@@UÃbÂbƒaÇx@bÂ@WVUa¯ƒ@wVwUUV@VwnK@KWaÃ…Â@KšIUyUI@WmXó™UbWaÂKm™@km@IUyƒIUaWKƒx@zUKUL@llVUnkLVVkJWX@VUKUVƒIkVWakb@VWb@n@JkXUlmL@xkL@`VxšLUÈUJ@Vm@@bmIUlUL@VUVVbknm@mKUw™KVÈ@J@LÂV±kkJUIƒl"],encodeOffsets:[[120803,31247]]}},{type:"Feature",id:"3412",properties:{name:"阜阳市",cp:[115.7629,32.9919],childNum:6},geometry:{type:"Polygon",coordinates:["@@V™nƒš@ša„k°aš±@‚¥@UUI@aUmlwUUÂx›b@Â¥XU@mmI@a@Kn@@_W@@W„I@mšUVVXUl@XaV@‚K@I@a„LXÂ@aVI°K@KVL„UUw‚yXkšK@kšKÆbXnlK@k@a„JlU@w@U@»@aXKWƒn_‚JXkVKnƒ@°LlKXƒW@¯UƒÂ@aUK@kmJUw™VƒIUJ™„kÂŽmL™K@kka@wUVm@@am@UkUbkK@nmVƒÒ¯VU„WVÂVmIƒƒULk@ƒƒma@kkKƒƒ@nUbUamU™`UUVUkKVkkƒW@@bkmƒnƒmUXVKXVƒL@VƒbU„m‚™bVXÂJ@nmKÃ…I@KWKUXVJUL@VUKUX@KUKWL@LUJmaXXm@kVVV@L@VUL@VlK@L@V@LUK@VUb@UUU@°@nVxU`‚Lkn@`@XVJ@X™Vm„k@UKmV¯LVVÂn±WÂÂm@Ub@JlLUl„@VLk„@lmVVn@bnV@V°IV™šaVJXI°K°V@XXVlVVU„nšKVlUš„bWXnV@bV`U„„@@Âm@@‚ƒ@nxmn@bXVlL@¤nb„Ul¦šVVUnJVU„Vl@@bÞL"],encodeOffsets:[[118418,34392]]}},{type:"Feature",id:"3413",properties:{name:"宿州市",cp:[117.5208,33.6841],childNum:5},geometry:{type:"Polygon",coordinates:["@@@UWU@bkW@aWU@aUIkWV™lLXb„lVIUVV@‚mn@V_n@VaUK@I‚@UašanJVU„@lV„UVnnKVVlaUa„I@wnK‚Lnll@nVlk@wVKXkl@@b„bUJ@V‚U@U„UUyVk@aVUXwlWXX‚WU¹@aU™@WUI@mlUšn„J@Il@šaXbV@VKl@XxVL@W„IšJlb„@„al@„IUUm@@aVK@¥¯—@mUķ¯bWƒk£Vm@aÂkm@VaÃ…@UVWaƒ@UÂÂJWkƒJ—UƒbWbU@UlƒXk@ƒamV@K¯nk@ƒlU@Uxmz@bU`ÇbUbÃ…Vm£U@Ww™x@akLUK@UlakwUJWVkLmaUal@n_ƒmVUnKVUUmÃ…XWa™@kJmx@XUJ@bVLXxl@VVUVV„UbkLWbU@@lUVV„VVX„›K@XkJ@nU@@bV@VxUVlb„U@xXLWÂŽn@UxVbVĊ„V@b@XV`mnkJ@kUKmbƒaU@VbnbÆx@XU@@`k@@bl„™@@bkL@WƒakXWaU@Vmkx@XWW@Â@wUUUbƒJ™U¯V™@¯ÞU@WxXÂŽlL@bkb@ÂŽlVlnÂb™JW@kkU@mbkaWJ—IVlmz¯`UnU@mb™@@„ƒ`@bkVlÂœnV@b@šV@„aVxn@Vx‚KXnl@nbVK„bVK@a„_V@Vƒ„w@W„LlwnK@UmIU@VWš@šUÈ@lKnal„wš@@V°@šaUmlUUw@„ƒV@@UXK"],encodeOffsets:[[119836,35061]]}},{type:"Feature",id:"3410",properties:{name:"黄山市",cp:[118.0481,29.9542],childNum:5},geometry:{type:"Polygon",coordinates:["@@lXnlWX@VUJVnUJVzXJVx„kVJlI²l‚U@K@IUǚLVxnLn@lmUaVU@UVKVknJ@an@@UVIVǙKUw@_lK@wnKVklW@I@mXa@UlaXblU„JVUVL@UXWlIUUlKVmkU@kVKVL@y„wXLVb„JVz@Jlnš@nŽ‚LXbVaôšnW@Âla@UVWUa@Â@a@mk@WIk@VwUa¯¥m@UUVK@ImK@aX£ƒÂkK݁ÂV™a™™ƒ_@±ƒakXWW—LƒƒƒnU@@a@¯mK@L™JÂUWwUV™VmbXX@lWLn`mzUJUb™Lƒ„k@makVWmkX™ambkKknƒaƒ@ƒaƒb@‚U@Unm@—ƒWVƒ@ÂÂVbUbUJWIk@@lmL@°UVUVm„nš™@@kmWkb@xƒ_m@@aU@Âb@JlÂŽUz™lWxXn„@‚b²@l`„IVl„UlL@VšK„nVbUl@VlIn@@b„bVWUk‚@@bX@Valb@bnb°Vn@„xVKlbVnÂV@V‚x„L@ln@UXVV‚L˜"],encodeOffsets:[[120747,31095]]}},{type:"Feature",id:"3414",properties:{name:"巢湖市",cp:[117.7734,31.4978],childNum:5},geometry:{type:"Polygon",coordinates:["@@VV@blL@ÂŽXlWnnšnŽ˜„@VXXl@@WšIX@VJ@LšxÅŽxlnšŽ@bXJVblX@VVbUVn@VbUVlb@LnJVbVLV‚XLšÒVL„ÒšV„bVIVylUXk°Wšknm°_lJ@aXL@l‚z°@„lnLô¼V‚È„VUUaVKUÂ@WW@@UUa@knmVLlaV@„a@kšak±@UmwkKmk™lj™ÃUUkL@mlIVmnÃWkkUÃ@ÂKƑĉ™a@»ƒmmaÂ@mX™¤¯Uƒw@ƒ@ÂUU@bU±±L@akmƒ„™LUKmLUUUJVbÂbÇwƒ@kUWaUJ@Xkxm@UJUUm@™„k„ƒ‚ƒakXUšVl±ôU@kn"],encodeOffsets:[[119847,32007]]}},{type:"Feature",id:"3416",properties:{name:"亳州市",cp:[116.1914,33.4698],childNum:4},geometry:{type:"Polygon",coordinates:["@@lU@Un@@anUlw@KVmUwlaX_lKna@KU@@kWKUU@ankW™XK˜@@V²VVIÈU@al@VaÈamK@wU™@klaUƒV@XƒVUU»WUUbkmUkVÂmk@aÈw@mWU@VkIkVWKUÑķXȭºU¯lƒ@kkLWmÃ…a™L@l™LWlÂzVxƒVUK@L¯LUJ@bWƒK@b@JÂLU@Wbk@WVUU™V@nƒJ@XX@@`m@@L@bnJ@nWV@¦œa‚wVVkxVn@bVJ@V¦@Ž™²¯bƒl™b™@m„UšUŽƒŽ@¼ƒ¦Xb‚UV`@nnxUxWLkUkVWKkV@XV@@VVL@VX„@lVV@L@blL@`šL@xXKVL‚@„VnUš@lwnU@ml@XnV@@UVW°LnalƒUI@aUK@a‚a@U„kXW@I@mWL@UXK@UVW@U‚@@k„Wn‚@@V„@XblaVxšL@bVKXb„IlJ"],encodeOffsets:[[119183,34594]]}},{type:"Feature",id:"3417",properties:{name:"池州市",cp:[117.3889,30.2014],childNum:4},geometry:{type:"Polygon",coordinates:["@@„V°°ĊŤ@xƒĖ@xÂœXƤ„VôIÆmnLllXÔ@lƒÂ܎n@@JšbšLÆaĢÞĸ„°VVUUKVanK@UV@VL„VVn„ln@‚xnklxXamk@WV@Xa˜@naVk„KlÂk™@mkUWwkJWw—IWK@ƒUaUwWIUyVIUmVI@UXWmkkW‚—ÂKUUVWm@@kƒKÂw@U‚UUmkaULƒwm@¯Uma@akaUbW@@aÂ@VlUXƒa@am@kJ@UVkUaƒm™L@UkKƒVUkƒJk_±@Âaƒ@WmXwÇkkaVaUa±ƒœwV@VkƒwnyUaW@UU¯amLk@m™@kmmU™™¯K@L@lUX¯ƒWlkXƒŽVb„bƒVUL@J@LVKnÂlJXnlb@`nXlalV@bnL@Vnb˜¼@lXbWlkL™K@zUJmIUxUVUVmX","@@llUL@VlxšL@a@UƒwXa¯@"],encodeOffsets:[[119543,30781],[120061,31152]]}},{type:"Feature",id:"3401",properties:{name:"åˆè‚¥å¸‚",cp:[117.29,32.0581],childNum:4},geometry:{type:"Polygon",coordinates:["@@„L„xV‚ĊLÞkšVlVVÂXaWaXwW™nU„@‚anVVUX@˜bXblWkk@wWmk@VUVKnb@Išy@_kWm£nmVa@U‚KÂœwlVl@„zn@°l„IlmnVšIVmnV˜aXÃ…WmU_VK@Unƒmmk@UIVakaƒa™UĄUK™ÑWKUÂUKUamI@KkaVUUam@VUUa@UkWUaWI@a™ÂkmÅw™wUL@`mn@KƒV™IUVUUUK›Vk_ƒVkbWƒ@VkUULUJ±I¯aƒlkxU¦@L@V@V@b@b@„WJXbWVXn@LƒKVL@JkLƒŽV@Vbn@VV@XU@UlV@@VV@V@XXV@@VšJ°š°Xnb°@„JUVVXV`@bkXWÂŽUbU@WÂŽn@VLXlm„°bV„UbkK@bVJ@bVbkLV¦ƒKÄ·V@x@„XbmVVVk¦"],encodeOffsets:[[119678,33323]]}},{type:"Feature",id:"3403",properties:{name:"蚌埠市",cp:[117.4109,33.1073],childNum:4},geometry:{type:"Polygon",coordinates:["@@VÃ’XLlUlJ@UXV@nÇx@bnlUÂVllnVaXVV¼UVW„U@V„²wVV@Vl@„VnwlIš@XbÆWVnUVmLUV„nm`k@VbnblKXUVIlxkb@VVLlK@bšwXxV@n¤ÆUVaÈaV_@anyVwV@„kl@°m@LnU„bl@„WVkV@Xa„a˜V„IXl‚IV‚„@XbVUÆ@XKWwUkmW@_UmnIlJXkWKXmV@‚w@_XV@Kl@kU@KlX@Â@UUUUKWLÂm@klJVUUmk@mXUWmXÂwƒ`m@„zUbÃakbW@ÂÂm@UUĎUIm@UbÂKǼ@™kKWÂXmWUkaWU—JWU¯L@W™Lƒwk@mm@_™ƒÅl™UVkmWUnÂV@VWLUb™bƑĬ¯l"],encodeOffsets:[[119543,33722]]}},{type:"Feature",id:"3402",properties:{name:"芜湖市",cp:[118.3557,31.0858],childNum:4},geometry:{type:"Polygon",coordinates:["@@„bVaV@XllLXU°ŽlL@V@VUnVl¯Ikš›VUVU@@b@lUXUWmb„n@¼šbƒĊ‚LÞ@lVXlmÞUnkJ@nlKVVšÞXklWVaVI@aUKn»lL@Kn@‚XXwlm@mn°@„V@ÂWy„wXÂlWVk™ƒ@aUaVU¯£kKWVXVWLUkkWlkkwmJUam@@aULVa@UƒVaUaVI@m‚@UÂUJUIUmmV@bm@UXVVUlÂVmImakKUU@UU@VmU@@kma@KVIXUVK@U™VmUkV™m±£@JkU@nlšk‚ƒLUlmb—@WbU@@XnlWb"],encodeOffsets:[[120814,31585]]}},{type:"Feature",id:"3406",properties:{name:"淮北市",cp:[116.6968,33.6896],childNum:3},geometry:{type:"MultiPolygon",coordinates:[["@@lnnK@¦n@@V‚V„@@VV@nIV„V@VW²a@b@bVnUVVV@V™z@lš@°UšV„IVaVV@x@ÂŽXX@WlwUnV@XblW„b@XlK@aš@kƒ@al@@_V@@WÃ…wmaUaV@„bnaVL@llInmU_@W@aƒUUĉUaVwm@XÂWK@wƒVkaVUUwU@@aV@@mlI@WÂœLWƒUUUƒVU@kV@XalKVaUƒVUUUk@WwUK@aVI@WƒUk@@UUU±xkb@lVš@xnLÇbUbk@@bÇVUJ±U@U—@WLXšml@bVVXL@lV@@LmbkLW`kbVxUn@LkxmV@bm@@VkV"],["@@VVVkV@ÂÂ¥@UV@U@VUUJƒkWakKUšlXVJ@bXV@blX@aXV@V"]],encodeOffsets:[[[119183,34594]],[[119836,35061]]]}},{type:"Feature",id:"3404",properties:{name:"æ·®å—市",cp:[116.7847,32.7722],childNum:2},geometry:{type:"Polygon",coordinates:["@@°kƒīšaVaXK@U‚UVmnXUlšVÆkVKUUUmmU„ÑkU™UÃlĉKUƒwƒKƒbU@UxW@@lÂÂœmVUUVmUUƒmƒw—aW„kL¯K@ÂŽm„ULWlÂIm`X„WL@b@¼@V@xkVƒI@b@l@lk„V°Ȯ¹ĸW"],encodeOffsets:[[119543,33722]]}},{type:"Feature",id:"3405",properties:{name:"马éžå±±å¸‚",cp:[118.6304,31.5363],childNum:2},geometry:{type:"Polygon",coordinates:["@@šNJnllLnxV@laXLVKma„aXbVI„bVKVVVIVyn@n_ƒƒW@@ƒ„UnJlUVVXÂlLnaUWlÂV@VV„IXW@_W@XK@K@UVUUwVamÑXmmwƒw™KUnUK™çU@ƒJƒU¯@mÂŽ@nknWxÂWm@@LkKm¼VL@bUJUbkXWl"],encodeOffsets:[[121219,32288]]}},{type:"Feature",id:"3407",properties:{name:"铜陵市",cp:[117.9382,30.9375],childNum:3},geometry:{type:"MultiPolygon",coordinates:[["@@„ÒV¤@¼V²@aVV@ÂŽ@„„x°Vš£nW‚@nbnaVXVW@k@aV@VUÂœUl™°JUkVm@U@UkK¯ÂWVkKWkU@UbƒakwmlÂwm@ƒkUmƒUUKU@@VmLUbVLUV¯U"],["@@ÂLllUL@VlxšL@a@UƒwXamK"]],encodeOffsets:[[[120522,31529]],[[120094,31146]]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/ao_men_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"8200",properties:{name:"澳门",cp:[113.5715,22.1583],childNum:1},geometry:{type:"Polygon",coordinates:["@@HQFMDIDGBI@E@EEKEGCEIGGEKEMGSEU@CBEDAJAP@F@LBT@JCHMPOdADCFADAB@LFLDFFP@DAB@@AF@D@B@@FBD@FADHBBHAD@FAJ@JEDCJI`gFIJW"],encodeOffsets:[[116325,22699]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/bei_jing_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"110228",properties:{name:"密云县",cp:[117.0923,40.5121],childNum:1},geometry:{type:"Polygon",coordinates:["@@vIHZDZQtDLNMXIbHRCXXITbJ@H`LGPRDDJNCLHTOCWFGvGBUJMKGFO^IHWXITQCIÂ’Y^AXGfRˆDXF`DJOLB~G\\DZIHHpErUVMhHb]\\M†BVF@FTP`@zTbD\\@~M\\K`H^EVODWICAakAQXoIcCOCIgGYNWFWNGGKKGaJEGMEIKYJUT_J_Go@_SyQaSFMEGTcYOQLIIi@EKAUPCV[EEXQCW|aMUMAaYCYNIDGGACIMGGSKDQGaF_C[GaB@GOIiOKAYL“mI@CN]F[SWWAcKKI@HMUimEKbeYQYISNUOcBKPIFBNgvDPGZYFSf]CMSIWGEUFgDIQ[MeDMJS@RR@LphFPCHaBAJKF@J]IBJO@HlO@@RKAMPJHCNDJTHFP@ZGNANBRFH@J_fM^ONJNF\\VTDJHDON@XÂRND\\XRCPVETCLBVKDFJINHRGPRV@\\CLJN@VbXbLVT"],encodeOffsets:[[119561,41684]]}},{type:"Feature",id:"110116",properties:{name:"怀柔区",cp:[116.6377,40.6219],childNum:1},geometry:{type:"Polygon",coordinates:["@@JHTVHXCHPfnDJGHNDJSB[JSBGVSAOH@PMPuDEHHXZN@PHF@ZLJ@LHVYJA\\OFWP]BMtMBSRGV[JeVAPQVIFENMD¡–@^NV\\JH@NNL@NM\\kTQ\\I^FNIpBHGTBFFAZQfKDIXQTLXFXNNVMVHRGpCFLlRLEVBBH`IVO\\G`RDPAXLXBXORHZEHTDLLN@VGTMrQNFPeASKG@GMOAKBYMK@GTUHUXSHMVDNMOUEOZMJML@^KRACMZEZMRQLUHE@OFENPR@DI\\ChMHIDG\\GJMDWHCKGMDCIQCHO_K@GaIJSWWQDaGWJMNCKRsCYGYuJUSaKaW@UIMDK@[QUHOGQJMEILCAUDKFSOUQD[WMC‚Q@WPMGCCIUSE[IMPMN]`e@IEGAQBMHM@YEOSGCIDMIGNOLB@QP@GkP@AI^J@ILEBIbADGEOog@KQQWSekWQQUOFKZLF@PUNmIaHIUeBCTSHENcJa@_IWSaGu`GLSBKJQFOXGDXVQVOBIHcDSJWBEFGTMH[^mLaXcHiKElTRKtFXZ`MHMPCNRDxZˆB\\ICIHK@KÂŽHbIVFZ@BPnGTGbDXRDJaZKRiGEFSFEJhjFNZFjn"],encodeOffsets:[[119314,41552]]}},{type:"Feature",id:"110111",properties:{name:"房山区",cp:[115.8453,39.7163],childNum:1},geometry:{type:"Polygon",coordinates:["@@h@bl@HRJDZ``TA\\VVD^H`\\pF\\JÂŒ`JGv@ZO\\GPSTEjPTR`FnEbDTDHEhLFMTK@ETSPULKEI@OVISKSJACEQNQbV˜IXGDIN@dMB[IIBcN]ZHNLP@XOWCFWŠCNRHTpATD@^NVNLED@Rh@jCEF}E[OOHUEW]W@QGGDIQSH_MmFmCUT_K]i@MHÂCMW—FCF‹E{BMHMPOHKS]CFNGBELDH_@BcAKOACESAOBELaXAROB@FODMEDWJAG[aE@UM@DImEWJMC@OeCA{aE[@{L@MINUCQXKfUJORCHqJBF@TCXWNQX]M[EAJO@@KMBQJIC]EWMCCUBEBFHKDOTMBGNGF]MWDBRDdMDQVyE@LPVHDCP@JVVMTG~HNSH[CmRUvHPHBbA\\PTNRC\\YNJ€PRARPJDDR"],encodeOffsets:[[118343,40770]]}},{type:"Feature",id:"110229",properties:{name:"延庆县",cp:[116.1543,40.5286],childNum:1},geometry:{type:"Polygon",coordinates:["@@^AXOPEB[ZIGU@KKI@YGE@OYMGWFGvCNO@OPGTBHUTA\\ITACIGMIHmCOeDGGWSUIGimYEEMgiFITEFEjHLQbYCIWQaCSHmHAOY@UEaJÂG@LGLDJ[J‡AwYQCDMNONGY_EWLsSQFkMO[NWAIGaIYL@HMBOKiOQDWEUDMQSF_QIUBWdg@[NaAKQ@M]OQ@WhgLUMMFYQDIRCEUZOOCIOJ[KIUMKL@HIDKVEBM`HJAJSJUdBLGNEdMBMO[BYEWJSNKNaD]PE\\SjOT_RQVEZPpƒNQXfŠNA~lNG`@PNLp¼RFLfbdKbATUh@FSNWjGFZVLFHVA~X¨PPROfFJbNJPLFbENJPrEFNPFRHDDJdENJLVEPBJTVTHGHFRFH@PXP\\ORQHW\\BjWFDERLPPBbB\\E`B\\D\\L`@F]FCnJ^AZL"],encodeOffsets:[[119262,41751]]}},{type:"Feature",id:"110109",properties:{name:"门头沟区",cp:[115.8,39.9957],childNum:1},geometry:{type:"Polygon",coordinates:["@@V@XMnGPY²‰JQNEhH\\AZMPDVTTDZCPiJkHSHCjIdFtEHITCNITQEKUAMCEIKCECABYESKFWAKBEIIHABGDCKCAIHMHALKEI\\CFIBILIJQZS]BBEECS@E@@C]COKI@CABAAEEDMGƒCH]A[M@CJWH—JaUMRFRBDTITLUJ@PFJKLOVST@FSLENgKGFSCaCmF_ESQiOSFOT[HYPu@IH‹_[IoE_[]GUC[USB__CYQI@Gakg@qZeHQNMNV\\FVLPgJAFJPRLCH[XcPELUT[JiV_EELFTADBXRTRLJC@fHXHHbPd`fR@NfT`@TLplHMpCEJHJBVLFÂŽ@JT‚VnG^KXDXHNVGRLRXFJVdDHSNWLGfEzA"],encodeOffsets:[[118635,41113]]}},{type:"Feature",id:"110114",properties:{name:"昌平区",cp:[116.1777,40.2134],childNum:1},geometry:{type:"Polygon",coordinates:["@@VNLJI\\JPPDYPFVQDCJZRNEVNhKXgR@^P@NLRbB\\Mh@XcVARJE`RTCNFV€XRCjPPLNA@GZKbJJHXB\\MNPjLdGbWnK\\]NGHSFEXATIdCJGPARUWUHCPWRELITAHKv_E@iYCaW_BQ\\Y@QIO@QDCIGZCEMWGFMFAFgHEDOCSqKCCFGAMKEAC@ODGCGs@WH@KQA@EE@CE@GEA@EH@GGUEEJEAYD@JM@@DAA@FHD@FTJEHUC@JUBKCKG@G[CIIQReAYhO@OXGDO@@FF@IHJFCPEBACBIAAKDOABXARHPÂNEHGbQAAKQFGIAM[C@WHKaGiCEGOA‹HUKCIokSCUSOCYN[BgGMFIR±ŠOZmHWNU@ShbbXDHVXXGJ^lZ@PZ\\Nb@\\FHJAD"],
-encodeOffsets:[[118750,41232]]}},{type:"Feature",id:"110115",properties:{name:"大兴区",cp:[116.4716,39.6352],childNum:1},geometry:{type:"Polygon",coordinates:["@@F\\E~DFN@BDFEpHFCHBBEGCDCJBHUDSBB@ELCPbF@B\\J@BJVAFJ\\ADKTCBGECFMT@BMN@@FH@DaNBEnvB@FPBATK@FHEFIAKFBFL@@PKBFJHC@FXBRAFCDMPDTOL@JIVFDHH@DDH@BGRFCDLD@N^@@CNA@KNOAEBCECFEGCFGMGFIPMOEJOLBADBBHGG@GCHIECY@INC@DMGS\\AIOZAAEYA@GT@KKMBEETCGMVINFxA@MJADB@FlA@HJA@NND@DFA@DVAZBBOFKH_JA@K^GBC@EFE„G@gAENMXKJigC@IbSJMqGOP£RGSMGE@kbQFDPEFiBSGGSBK]I{CDWCIDOic[C_G@SuSO@EWKCO@MNY@\\uZOPENQD[LKESSKGBKEG@EJGAGHoHÂ¥CqhifeJkX_XFFGHFNEDFPENKHM^IFIVL^S`DVEnNnG`RTCJHH@R^XFXGVPP"],encodeOffsets:[[119042,40704]]}},{type:"Feature",id:"110113",properties:{name:"顺义区",cp:[116.7242,40.1619],childNum:1},geometry:{type:"Polygon",coordinates:["@@EhEBENXHFNYDJHCD@RJP@R[ZARX`DbjZF@bHXT`Jb@dIFMTGDSfAJVbGnJVM@OKELYPERVXRflXTT@NIfC\\NJRhCVEHFJXNT^DTeZEHYCOhuAMJELOdAVPTMOWBWNMNEJgl]@WGUFIC[T{EEDEHGCIGMI@SECUQI[D{A{GQESPUH]CsiMCmHUeoHENcAaDGCMDGMQCACCBaCGLMAHB@DIEQLOAAEEJ@CW@CDINGAAGKQOCgV@LG@BEGDKNeREFBNCFIDOPKD[@YRW@GFWDAFE@EHDDrLDTCPGF","@@KrJEH[\\B@FF@CHFBHUN‹AJKADGECBCMAG^E@EbI@BEGP"],encodeOffsets:[[119283,41084],[119377,41046]]}},{type:"Feature",id:"110117",properties:{name:"平谷区",cp:[117.1706,40.2052],childNum:1},geometry:{type:"Polygon",coordinates:["@@ZJZRafFLjn€VGNJ@LLBdXX\\T^EDMJ@”nZKLBjPPJ@HbA\\H`DbERHLCFK^BZaFWXQLAGMHa\\OLO@SBIpBdCLƒVQfElO@GSAKEDQTC@GEBKG@ORIJBDAPDFA@CaOq@GGQAAEJK@KMUGAAGEAa@MGMBGCGSIIW@WSUCMDOJeWOM@IUF{WMWaDIMgIoRoCOKeEOEAG_I[cg@wLIFENQFDVTFJ@HNDJGHCFFFS|D\\EJHV@Xk^IhMFMNAXPX"],encodeOffsets:[[119748,41190]]}},{type:"Feature",id:"110112",properties:{name:"通州区",cp:[116.7297,39.8131],childNum:1},geometry:{type:"Polygon",coordinates:["@@FDAJTGDNDCTDDEDBBE@DT@@EHCDGJ@EIZ@@FDBR@ATFBBVFFE@@HNA\\VE@CLIFNJFNJBCP]A@LJFA@HJEDD\\C@DBCHLAEPF@@DH@APHAERDF\\GIxDTM@CFLBBFJ@CNUPMHECGDBF]BMFPDLRBHHBJMDCX@@DFIBFPBRKJF@CGANBHKbDDABDRDHNNCHDbCdBFMpGHiOYMefKJMC}HWAUNW\\NNBNA„kNU|]HMTMN@MZBLFFF@RIRUT‘BMFIEGaAGGAOIIUGTSFcYKS@MSLYPKRUBU]EWDOI]CKGASgW@MTWKIMCS@uMAKKADMECGAKVUTSDy@IjWLMNBF@hƒHEF@FAD]H@LIBG`ELAPYAUB@CEB@CMC@MIB@GkB@ECAIB@NwBMEUJHNSDFFNALLS@@HZBBFYBJP[BHTCND@JMZ@FDGJHDH@GHAABCKAIPPFONEJNHEHHDEFFDADBFMP@L"],encodeOffsets:[[119329,40782]]}},{type:"Feature",id:"110105",properties:{name:"æœé˜³åŒº",cp:[116.4977,39.949],childNum:2},geometry:{type:"MultiPolygon",coordinates:[["@@bFGHBHFBFIVFHHG@@FFB@HDFF@@FRB@LXGt@DHCH@PBDLFBNF@BEXCHEX@ZQ\\@LCPOJCDEAMFEfQLMHCAFH@@KhUNE^AAEHCFDNGVODMI@AEKADEN@CSJw[HCEFQGBBOG@@CE@FOKBDGCAD@C[FCGIB@IE@K^BDOIAEMMIJEDKF@[UMB@GF@EEAUEABSQ@CA@EY@FJI@CHGD@FS@@CAFCACFSCCDCMSHBIECMB@D]@@MKCDCQEAHG@CCG@CGUEIJK@SPOCCNEDQBDNDB@DJCDLFCBBALJB@BVGPBKVO@KHCCCD@FE@BNA@FNCTDDJA@FGB@NBDW@CL@hT@@ZHHQDDDAFSAANBC@HG@EFS@@DE@@PCB@Ue@CADNJB@FCBWA@LI^ix@FIHrH"],["@@HUN‹AJKADGECBCMAG^E@EbI@BEGPKrJEH[\\B@FF@CHFB"]],encodeOffsets:[[[119169,40992]],[[119398,41063]]]}},{type:"Feature",id:"110108",properties:{name:"海淀区",cp:[116.2202,40.0239],childNum:1},geometry:{type:"Polygon",coordinates:["@@plDJVLÂŒGPBFHjDbHGL@X\\DBNHJREBLRBHaFGÂŽMGOBQAWPBLCBBAJBDFADOIEJGE@@EP@HCPWP@ZgfBRQJJ\\D@HLHLDVA@IVDFGSI@EGC@EBB@CN@@IZCAGHGaEqGJG@EjwJ]@K@GSA@e_I@NE@CA@Kg@KC@ENCFƒAKQAW@WIMK@V‹@I@@F@^EDFB@HcIaDYCBRRDCHD@EFLN@FE@CJUPEJOJMTBPEDIFCMIAKNOGMRFJNDVBFLSRMJSDGJsFcEiJGDGTIlOjYD"],encodeOffsets:[[118834,41050]]}},{type:"Feature",id:"110106",properties:{name:"丰å°åŒº",cp:[116.2683,39.8309],childNum:1},geometry:{type:"Polygon",coordinates:["@@hMN@NFTQCFRCBJFA@HJ@@HJ@HJ\\FTACDÂŒ@@UNLXJX@@MA@@IECAQlDFEHBDI~D@GXCFMVDFCH@@NF@ANJC@FnAB@AMF@@EDCDDLGP@LUOAUH@AIABKAAEDCKID@CCACMWA@EGDEILA@OK@AELEJBFEEGL@BSOA@EuAFmMACbG@@EM@ANS@ENFDAHSDCL[BEIUBAII@A[E@OaKD@FAACTGVIACDHDAFGAEDoGEFACM@i€g@@QFCMKMU@]SCoBGSMQ‰DEXXDWPO@MKYGM^AdJJA\\cNB\\G^„DNHFCBFABDBJ@PL^D@DF@T@FDAF^A"],encodeOffsets:[[118958,40846]]}},{type:"Feature",id:"110107",properties:{name:"石景山区",cp:[116.1887,39.9346],childNum:1},geometry:{type:"Polygon",coordinates:["@@NQPHLMJBDNJEFCAONSPIFIVODIF@@EKMFEC@DGQCAQZDbCdJ@GEAFC@]@EJ@DCSB[EGII@@GI@@GEBAIQDDESRMEM@gNYTIRKJAJEJ[DFJKLGBGNBJLDCDAHGBJJAFBLEXTLZFBAFDLD"],encodeOffsets:[[118940,40953]]}},{type:"Feature",id:"110102",properties:{name:"西城区",cp:[116.3631,39.9353],childNum:1},geometry:{type:"Polygon",coordinates:["@@XBDA@EIACM@IJAD]BC@SFABISAD]H@@OÂAEDQEW@BLE„MD@FLDh@@LDBF@@M`J@fTB@H"],encodeOffsets:[[119175,40932]]}},{type:"Feature",id:"110101",properties:{name:"东城区",cp:[116.418,39.9367],childNum:1},geometry:{type:"Polygon",coordinates:["@@DBf@@VDA@OF@@CT@FEH@@GADBMTBBECCRCGG@YS@@gDK@A‘C@PG@C^TBAJEB@TADC^IB@J"],encodeOffsets:[[119182,40921]]}},{type:"Feature",id:"110104",properties:{name:"宣武区",cp:[116.3603,39.8852],childNum:1},geometry:{type:"Polygon",coordinates:["@@RBX@RFFCÂŽBFU@aK@WA}CCJGAEFkCBRFD@JB@@N"],encodeOffsets:[[119118,40855]]}},{type:"Feature",id:"110103",properties:{name:"崇文区",cp:[116.4166,39.8811],childNum:1},geometry:{type:"Polygon",coordinates:["@@XBL@@bEVÂ’D@BX@AC@MHA@EIBCCDSEMmB@EIDBME@@MG@EDUCENWD@H"],encodeOffsets:[[119175,40829]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/china_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"xin_jiang",properties:{name:"æ–°ç–†",cp:[84.9023,41.748],childNum:18},geometry:{type:"Polygon",coordinates:["@@@›ÏÈôƧƦóəʵסʵóƪԫʵѵͩƧͩړ›υࡓɛʵ@ȃ@óᇑѵƨÉɚôóÐѺͩɜÌԭʵôƧɞñ@υƩ—݇ȂóƩƧ@ѵȂυœƥŌਗ—॥ɛóʵѵƧѹ˜݇Ìࢯ˜əɞυ˜ÏÍ©ÌóਙƨƧŋôÅóšÌͩóʵן›óŋړͪƧѶ@ɜԭ—ԫƦɛȄÌ›ÉȄöςƩȂÌœñȀÌœƩóóŎə˜@ÅÌŽ@ɞȀÉŎôƨóנѵȄƧ@óÅÉœóɜôŎÌͨςŎ@ƨóôƨɞ݈ʶóƨφó̎ȀƨÌԮòѸԮמ@ѺȀ@ƪá¬Ö†Ã²È‚ñÌòȂɜ˜óƨ̒Ŏ̑߼@φÏÈ€@Åà¹Ï‚̎Ƨφ@Éφڔ೦Ԯǿࢰ@ƦÅԮƨƨȄƧ۬ɜʶڔÅɚɚóÅôƨ߼˜ôƧƧóÌƥóÅѺǿƦÈφƧς˜ƨƧ̒@ɜƥƦυÌɛƪͩƩəƪʷ̑ə@ȃƨʵנŋྸÅਚԭԪ—@Éƨŋ̒օςʵôƧ"],encodeOffsets:[[98730,43786]]}},{type:"Feature",id:"xi_zang",properties:{name:"西è—",cp:[88.7695,31.6846],childNum:7},geometry:{type:"Polygon",coordinates:["@@ôŌנœôʶ̎ͪô™óŎƨŌਚƧÌôςͪφ—ɚÉࢰ—݈̎Ѻ—Ѷƨôʶ०ɜਘ˜Ʀŋφ›ѶÈÌ—ôÅɚŋ@̑ə—@ÅòÌɜ›óƥôʷƧÌφѹԪÌ×¢@Ѹʷɜ@ôñנ@ѶɛɞôÌÅѶƨѸƧƥÅƦœôÅô—@ƧôƩ̒ŋƨŌƦǿô̎ɜÈ̒—óʶѶôôО̒›ςƥɜÐφσɛÈ̎υƨఱƧÅ@ʵƥœ@ŌóóóͩƨƧóŋ̑õóɞóÉԩͪÉÏôƧÌƧѹͨڑŎ̑ÅóƧࢭͩÌѵÉóఱóóԪυô@̒ƥŌÌƧ̑Ȅ݇ŎƧ›ѵÓ@ɛõÅɛȄôӒƧŌѵǿɘƧŋԫ@ÌÊ´Æ¥@óǿ̑ȀóǿÌςóóυô@ʶɛñÏƦƩÅó̎óœѵó̑ͪࢯОóɜן˜ƧÌƥȄ߻̎ÌÌןŎÉɜöɞƩȀôöɛȀóͪÌƨƪÌ̎ȂƥԪυО@φɞ˜ôƪ"],encodeOffsets:[[80911,35146]]}},{type:"Feature",id:"nei_meng_gu",properties:{name:"内蒙å¤",cp:[117.5977,44.3408],childNum:12},geometry:{type:"Polygon",coordinates:["@@ኊÈ૊ö߼ƩɜɛנñԮɛѶóԮô@ÈѸóמ̎ගѺá¬@߼ʶԮӒ߼̎@ÅѹӒ̒Ԫƨöග̑ѶȄ̒ς।œѶɚöɞɜʴڔôôȂ̎—ѺȀς—ƨ˜ƪóԪ—ɜôɛОਕڔԭ˜ѵÌѹȂԫ›ɛƥÌȂóɜ̎ô@ʶ݊ੲࢮʵږͪנƨôȂƧ˜Ìͪ@ÅƦƨφԬѶɜôƦ@ÅƧôôƦəÅÌ›@ÅڒѶԬôÌʳԩÐÏ‚ÅôÅÉž@ƨȂѶəóƧ̒ػ̎óÌÅנóƨô̒@ƨɚɚ@עԫɛɛ@ÈυͩƥʳòևÏ—̑ࡗƧͪ༃ॣԮփ̎Ʀ@ôô@ôÅ@š@ÈѵóƨÌυȃóʵɛƨƥóυȂóəƪ›ÌÏƧͩɜԭڔȄ̎عƧÈÌÅóÌɛ›ƥƧ̑óÏÅ@Ƨ̘Éəɛ˜߻ͩÌÍ©ÉОÌƪƧóóӓƨóƧʳ݇@Éςƪœ@ʴƩ—ƧƦôƨɛȄə›Ƨŋυ›óͩѵ@ÉǿóŌןÌɛ˜óОÌœ̑ÌôÈÌÅòÈñóƦͩ@Ç¿É™@ɛƧ̑˜ÏÈυôÌօѹœóȃə™@ȂσʵѷƪòƩÌ—ôó߻ۯôʳƧ™óšõʵѵóѹɜÌȂѹôɛŌφֈƩͨÏóυӑóޟఱ̑݇ͪóƪƨŌóȄڔԬƩς×ñ̑ȃѵÅÔ­ÅƨÈɛǿÏôõɚɛóƧОə@ѹÌѵöԪͨôͪɛ̒ןÅƧƥóôƥƧɛŌôóÉó@̒݇Ӓ̒Ō@Ŏԭࢰ"],encodeOffsets:[[99540,43830]]}},{type:"Feature",id:"qing_hai",properties:{name:"é’æµ·",cp:[96.2402,35.4199],childNum:8},geometry:{type:"Polygon",coordinates:["@@ƨ@ôƪ݈Èƪ˜@φÉòóƨԮʶɛÌѹͪôОəóƧɞᇒѶ@ôږô@ǿѶ›ƪÈςœɜͩφ˜ςŋɞôѶɛƨŌɞ—@ɚςÅñԪॢͩƨȂɞóƨÅÌŽÅ×¢Ó̎óƧƦôœ̒Èɜ›ςͩ̒œɚɛƨôƨÉφɛóÈƨŋóóɚͩƨóóƩ@ƧəŋƦƩÌ@ƧƧôǿυ̑@ÈɞǿõÅÏƥסɚƧóτԫɞœôƧƦ@ñȃòñƥóυôôѹѵ—@ÅÌÈ„Éó@ȂəŌóəѹƦ@ÅÌŌυ݈ԩÅƧóôƧ̑›ôʵɞƧ̑ѵôƩɞƧ̑œóÐѵóôʵ̑˜ɛȂóÌƥȀƧŋ̑Ōóƪ@ƨó˜óÅƥ›ƦŎѷƨѵƧÌÅÉóѵɜן@óòɛ@ѷʸס@ԩ̎υѺƨ̎óʸôƦɛœñ̎@Åɚ˜@̒əŌóÅ̎˜"],encodeOffsets:[[91890,36945]]}},{type:"Feature",id:"si_chuan",properties:{name:"å››å·",cp:[102.9199,30.1904],childNum:21},geometry:{type:"Polygon",coordinates:["@@ô˜ôŋó̑Ԯ̒ɛОמͪƨÅöͫ߼ƥôȃƨóóñôƧóƧôÅÚ”ÅƨÅ@Ŏô˜òƥѺŎ@Åɜóנ˜ôǿô›ƦôԮÌɜôɚ›Ƨ—ñɛɚÈÌƧɛևυ@óóôŋÏÔ­É@ƧʸÌÅυɜƧƧóƧƨÈÏÌƨȃɚ—ôʵφóô̑ÌȂ̑ʵɜʵɞ@ƨʳסƩóŎə—óɜƧôƩƧϘóôôô@ŎƧƨƨƪѹ˜óÌÌÆ©@ÌѹÐôޟÌƩóƪυÉɛ—əƨôŎɛȀ@È‚@ñÉʶ@ÅŒÏ× Ì—õóɛͨƨȂѵОɛʵ@ÌÆ©Åó߼ƧలÌφɜȂυτɛОÏƦÉƨóƪ̒ѶÉƨóʶ̒œóƨƨôԪÅφ݇̎ŋ@ÅѺƥôɚɚŋ@ÈɞôÌȃ@ÅѶ˜óѺφóƦôñòòȄ"],encodeOffsets:[[104220,34336]]}},{type:"Feature",id:"hei_long_jiang",properties:{name:"黑龙江",cp:[128.1445,48.5156],childNum:13},geometry:{type:"Polygon",coordinates:["@@ᇔȂਚÐƨÅѶÅöƥςÅñƧƦóƨÈ@óƨ—óÈφӑóóƨ˜óǿ̎̑ôÐɞ—ó̑ɜə߼›̎ǿ̒ôڒӑφ@ƧÈÌŽÌƥƩ̎Ïశ˜ôȂςƨφ@נɞ݈˜̑ƥƧɛƨʵƧȃƥ@Ƨƥ@Å̑ԩôÉÏÏóɛƧ›ƩͩƧó߻ʸÌʷѹƥɞڕõÌöÉυ—ÌȂƧÌÌ‘ÅóƨñŋѹóóÈÌ›ÌԬõʸÌÅ@Ç¿Ì@ƧОυ@ñƨòȀƥŎ̑ÅѵóɛŌóȂԫÅƧŎѹñÌʶóОן@Ƨ̎Ѷô@È‚@™óŎó@@óÌƥԭք༄।ƨͩ̒ࡘς˜ñֈƦʴφͪ@ȂɜɜסԬə@Ƨə̑@ƧóןôÌÅÌô̑ؼôƨѵɚƧÈÉ@óÅÏŎԪОÌÊ´"],encodeOffsets:[[124380,54630]]}},{type:"Feature",id:"gan_su",properties:{name:"甘肃",cp:[95.7129,40.166],childNum:14},geometry:{type:"Polygon",coordinates:["@@ڔôԮࢯ@Å̑ŋ݈ӑ@̑ɞôóôɜŋƦƨôóƨƦנÅɜ̑óͩԩͧѶõѺÌÉš@ƨÐɜôöəςóɜȀƧȂԮÅѶÅ̒ȄמòƪÏړԫôȃƧŋôƩ݈ͩɚ@@Ç¿Éœ@φͩóÅɜӑƧÅôǿ̎›ôƥƪóõ›ö@ô—ƨ˜ôƧƦôó̒ɜ@ɞŌõʶÌÅ@ȀóôƨȂ@ʶע@@ƥ୾ӑó̑óŋôʵóɛړ@@ƩöóƩóÏ—ɛƨ̑@óʷƥƥ̎ɛƧ›ôÅƧǿôͩѵôÉȃɞÈõƧÏóó—@ÅƧÅÚ“ÅóŎôƨóƨôòƧôóȄ߻ƦõͬƧŎ×Í©ÉœÐԭ̑ô̒óŌó—ƥ@óƨÉ›σԬƨôעəςƦöÅÉÈ€@Ȃφ̒óȀƨƨ̎@ƥƪɚŌ@ƨôƪƧôəͪôôƧŌôȂυɜƧɞƧóəɜ̑›Ïͪɛœ̑Ȃó›ƨƥÌôסÓÌÅƧÅÉôƧÈॡͪòԩÏÅ@əɘƧŋѵɜÉóÏŌυ—ɛͪÏ›ƩȂѵœ@Ȁڕó@ȄɜʶφࡔڔœƨͪѶͪԬʶôƩעʶɚʶƥôóƨςȂ"],encodeOffsets:[[98730,43740]]}},{type:"Feature",id:"yun_nan",properties:{name:"云å—",cp:[101.8652,25.1807],childNum:16},geometry:{type:"Polygon",coordinates:["@@ôɞôÉ̒öôŌƧƨôͪôô@ŋƦ›@ʶƨÅô߻ƪÅ@ÌɜʶѶÐƧÈɜͧöô̘ςן@ŋɞʵ@ò@ÈɜǿóÅɚƧɜ˜φɞôƩ̎ƪóޠѺО@Ì̎ƪô̎Ѻ—ƧƩƨƧ@Åóóôóς—ƪƨƨóôɛó̑ԭ—ƥŌɛǿÉƨɛͩô›@ǿƨÈѺŌɚɛÌןѶÐɛƧôóƥÈƦͩôŎɞ—ƨ̑ɜ—òôφ@ƨʵ@ɛѹÅóȃəƨυǿóʵÏƧƧŌƩɛÌȄñƧƧȀÉÌԩʶƧ̑υ—óŌƥʳɚӑóÐƥô̑›óӒѵʵѹœƧÓןôƪφõŌƪ̒ԫŌƧؼƨƨס›ÏÈƧœƨȂóʶó@@ʴƨôôφ̎Ŏ@Ȁƨ—ƪɚƨœóƨôôôςóޤƧŌƩŋƧԪ"],encodeOffsets:[[100530,28800]]}},{type:"Feature",id:"guang_xi",properties:{name:"广西",cp:[108.2813,23.6426],childNum:14},geometry:{type:"Polygon",coordinates:["@@ƦŋѺ̎ڔʵƨÅ@ƦמȄƪôóȂɜŌɚͩɜ@öóɜôôȂƦôɜÈ@ɞφ›óȄ̎›ƨʶɞŋƨʴɚǿÌÌŽÔ¬@ôñ@Ìƨ›Ï۫ô›ɚƨƨÐƪÅ̎›ƥóƦʵƥŋ@ȃóƥƧ@@ÅÉǿôυƧÈѵɛ@əóÅÌ‘@@ə̛óƧó—@ÈƩ˜ÏóòÐƥô@Ó’Ì‘@óŎÌƥσŎυ@Ìƨ@Ō̑ôóͪƨ̒óŌړœÌÅŽ@ŌôȄѺŎ@ɜƧʶυ@ñóɛ˜Ƨ̒ɘóÅƥͪ"],encodeOffsets:[[107011,25335]]}},{type:"Feature",id:"hu_nan",properties:{name:"æ¹–å—",cp:[111.5332,27.3779],childNum:14},geometry:{type:"Polygon",coordinates:["@@@քɜОƨ@öÅמóƪôƩɚ̒Åß¼Èςͩɜòƪ—ɜȀò—ñÉò—Ѻͪ@ÅƨŋóÉôǿƨ™ɚȃóəƨȃѵͩóÌ@ȃƨóóƥƨƧ@ʵƦ›óͩɜ—ɛóñԭɛÅÏ…È‚ÌƧƦÅ@ɛƥ—ɛȀ̑œóʷóÅÌœƩÅƧОəƧóœς۬Ƨœ@Ìóòԫ@ÌÌəȀƧʳÉŌóɞƧ˜ƨɜóÅƨò@ȄƧŌÏŋóôԪОóʶ@̎óȄ"],encodeOffsets:[[111870,29161]]}},{type:"Feature",id:"shan_xi_1",properties:{name:"陕西",cp:[109.5996,35.6396],childNum:10},geometry:{type:"Polygon",coordinates:["@@ςôöƨÉȂɞȄѶóóͪƨȀóŎƨœÌɜƦƦôʸ̒@ɜƧς˜ƪôõô@ƪڔ@ôɜóʶôŌô̒୽Ӓ@Ʀ@Ѻ̎ɜѺɛѶôöʶô™ƨšóʴ߼۰óô̎˜ñƪѸƩτʶ@Èòŋəѹóǿ̑ʵ@È̒ʷυփô݉ôÐÌØ·@ÈƨóôÌƪõ@ʳÌʵ@ÉɛŋƩŌɛóןôƧŋ̒ó@ÅÌÆ¥@ÅÏ…@ƧƧôןÌ@ƥȂѹɜəœɛóԭ̎ƥóóœóȀן—ɛô@ŎѹÅñƦ"],encodeOffsets:[[108001,33705]]}},{type:"Feature",id:"guang_dong",properties:{name:"广东",cp:[113.4668,22.8076],childNum:21},geometry:{type:"Polygon",coordinates:["@@@Ȃô˜ôƨ̎œ@ɚ̒@ôÅ@ɚѶɜƨȂóφɞȀ@Åƨ@ôƦ@ȄƦŌƥʶƦôôŎôʸ̒›ɜǿƦ˜@ɜƥŎ̎ƨφÈɜŎòƥԮŎƨÅóÅɛƧÉəɞƧ߼ɜςȃñȄƦŎ̒Åôòƨəƨ˜ɚÐ@əƨÌƪʵυŌəɛóəԭÅəœóÅѹœÏʵÉƦÌ™ƥʳѶ›öÅ̑óóŋÏȀυƧƥɛѹÅƧôן—ɛÅѵ@óŋôʵÉ›ƪԩõ@ƧÅÌ@Ƨ@@ƦÉԮƪО@@","@@X¯aWĀ„@lÂ"],encodeOffsets:[[112411,21916],[116325,22697]]}},{type:"Feature",id:"ji_lin",properties:{name:"å‰æž—",cp:[126.4746,43.5938],childNum:9},geometry:{type:"Polygon",coordinates:["@@× @ôÐ̎ʵѺòƨÅԬŎôÈɜŋѶô̒ÅƦÅñǿòƧφ@ƨÐÌŽ@@È€ÌÅöʷÌԫ̎œôȂѺôòŌôƧ̒ÅƨÌÌŽÈφ˜@Å‹Æ©Í©×ȃƨ—@È̑ʶ@Ōóôɛœƥѹ̑—συ݇@ÉœÏƧȃࢯƨôœəȂɛÅÆ©É›ÌÏ…Ïóõœƪʴυφ@ʶôŌóœÏÖ„@ɜƧ@ÉǿƧͪÏȀƩóÌÅƨȂÌغړȃɛԮƨͪÌςƩœôɚφÈƦôɜƧôʶφȄ"],encodeOffsets:[[126181,47341]]}},{type:"Feature",id:"he_bei",properties:{name:"河北",cp:[115.4004,37.9688],childNum:11},geometry:{type:"MultiPolygon",coordinates:[["@@Æ©Ì’ÌŌѺ̒Ʃ˜óȄƧŌƥͪòôñȂ̎ÅóȂ̒Ì̎›ôÐɜ—נ̎ôŋɞȀѶ@ôͪφœƨŌɚœɜȃóƧƨƥƪ˜@ʳƩ›ɞÏ݈@Ï…Ðφʵɜ˜ƦÏƨƧÌÉóɛѹÌÏÅ̑ôóƨ@œƧƦôƨɛ@ƥƨ@ȂƦ@@ôəÅƧʶƨŌυœÌ̎ɛŋôÅÉ@óƧÌ›ƦʵѵʳôʵɜÅςôƪŋƨŌɚ@ôÐƥƧ@ÅѸɛÌô̎ʵѵÐÔ­@ÌÌƧò@ÈÉ@É™ÏυͩƪÌƩõƧŎƧÅóšॡȄɛʶɜȀ@ɞςѶƧœƥςɛÅ@ɚɜɜ@Ŏôôςœƪς"],["@@õə@Ƨɛ˜@ÅóƦφô"]],encodeOffsets:[[[117271,40455]],[[120061,41040]]]}},{type:"Feature",id:"hu_bei",properties:{name:"湖北",cp:[112.2363,31.1572],childNum:17},geometry:{type:"Polygon",coordinates:["@@ñȄυƦöÅƩ˜óנƨƨφ@@ÅÌƦ@Å̑ôƨŌנóɜôƪŋɜŌѶօڔə݈òɞÅɜŎôÓƦóƨô̒óôȃƨó̎ÅôƧƪ@ƨÈςƧə̑̎Ð@ÌƧÅÏôԭͩԫ—ÌʵƧšóȀôɞƧŌ@Åѹͩñ˜òɞñ˜ɛǿƩ˜ɛñÏͪ߻Ȃ̑ÅƪəƩó×ôõÅƧ@É›ÐƥȄó›̑ѺƧ›ôφóƨƨƦƪóɜÅôóòôƨóφÌƨóƦ̎"],encodeOffsets:[[112860,31905]]}},{type:"Feature",id:"gui_zhou",properties:{name:"贵州",cp:[106.6113,26.9385],childNum:9},geometry:{type:"Polygon",coordinates:["@@ɜȀƦŋԮ˜ô̒ɚ˜ôÅעƪƧʴÉ@ɛʶ̒ʶÌÈƦœóȂô@ôÅ@Åô—ƨʶѸô@ʶƨ˜ɞó@Åτöòυƨ@@əƨô@ɛ̒@Ʀɜôȃ@ÌôʵԩÐôóςŌƨŋ@ȃƧñôÅƧɛƨ—ôÉƧʵÌœôȃυœ@ÉɛȂƥóóÈɛóõôɛ@əͪɛŋôÈƩó×ȃ@ƥƧÅړʶѹÌƥŌƦȂóôɜƨѵО̎נəɜѹŋƧȂ@ȀóœɜͪɞƧ"],encodeOffsets:[[106651,27901]]}},{type:"Feature",id:"shan_dong",properties:{name:"山东",cp:[118.7402,36.4307],childNum:17},geometry:{type:"Polygon",coordinates:["@@Æ©Ìφͪɚςɞ@@Ȃƨñ̎̎Ԯ@ѶОƨƧڔ@φÐÌ‘Å‹@Æ©Ì’Ç¿ÌŽ@ƨɜԬςôʶÌʶöԫƨƧנƥɜŎôÅÌŽ@ôÅóÏƧÅԫôóƧԩó@ƥɜƧԭóƨʵɛƨ߻ӑɜÐԩ˜óô̑óƧʳə™óɛƧ@õȀƧœÌȃɛÅóÅυОÌ—óÉƩ—ԩ@ƧɚԫȄɚʶƨ˜ɞʶԪÌړɛƪ̒"],encodeOffsets:[[118261,37036]]}},{type:"Feature",id:"jiang_xi",properties:{name:"江西",cp:[116.0156,27.29],childNum:11},geometry:{type:"Polygon",coordinates:["@@ƧȄôɚəȄ̎ʶԬ˜ԮͪςóƨÅƪ›τɞƦÅƥƧ@ÅςôóÅôô̒ʷѶ—ƪƩƩǿ@Å̒ɛôυ@—ƧÈѹɛəƨѹ̑ƨÌóƥѵʷôÌÉ›ÈôÅÉǿƧԫƧ›ôʳƥÅòȃÏȄ߻ɛÉƨɞɚɜƨôÅƧŎԭÅñƦòԮɜôɛ˜ôͪƥœ@ʶƧƨôƦƧô@Ȅô̎Ѷͪ"],encodeOffsets:[[117e3,29025]]}},{type:"Feature",id:"he_nan",properties:{name:"æ²³å—",cp:[113.4668,33.8818],childNum:17},geometry:{type:"Polygon",coordinates:["@@φ˜̎ƪ̘ɞȄɚ@@Ȃעó̎ŌѺ̒ôֆॢȃô™ƨŎƨÅƪöƩ̑ڔɜԩÌÉʵƧ—əʵԬȃƨəԪ@@Ƨ̒ÅôÌÏ…ÈƧɚÌôóŋ@ÉƧŋõ̑σ—@ÅɜŋôÉ̒ƧɚôôطÏóóɛƩ@óƨÌÅƧôóȄ̑ôƧóƥôóÓÉ›ÅÉŎ݇ñړɚѵֆ@ÉžÌʶ@ʴƩöóÌ"],encodeOffsets:[[113040,35416]]}},{type:"Feature",id:"liao_ning",properties:{name:"è¾½å®",cp:[122.3438,41.0889],childNum:14},geometry:{type:"Polygon",coordinates:["@@ƨʴƧôôӔƨô̎ƩɞÐ̎ͪ߼ͪɜ—ɞɚÌ—@ƨςÅ̒ôƦƨɜœô̎ƪôςǿƨͩɞȀƨ@@ɛςփô›óŋ@ʵφυƩʳö›॥փÏѹס@əɛ@ͩࢯ@ѹʵÏ—ƩʶφȀƧ݈̒۬óʸÉŎѵ@ԭԫןɛƧƨƥςɛ—υʶφО"],encodeOffsets:[[122131,42301]]}},{type:"Feature",id:"shan_xi_2",properties:{name:"山西",cp:[112.4121,37.6611],childNum:11},geometry:{type:"Polygon",coordinates:["@@ɚѺñŌɚšôȄѺ›̎ֆφóςȂ̒—ɜƨɚ@@Ȁƨŋôȃƪ—ѹ̑Ìŋƪ̑ƩÏÏ›óó@Åɛɛ@əɜÅƦÏƨ›Ïѵ@Éɛǿɜʵóօѹ̑Ìŋסô@ÈÉ™@ÉȃÌ—ÌƩυ—Ƨô@È‚ÌظóОó݊φք̑ʸ@Ȃ̒ʶôȀ"],encodeOffsets:[[113581,39645]]}},{type:"Feature",id:"an_hui",properties:{name:"安徽",cp:[117.2461,32.0361],childNum:17},geometry:{type:"Polygon",coordinates:["@@ó̎̑Å@ƨƪ˜Ѷǿɜ̑φ—Ʀʵ̘Ƨѵôóƪôôυς—ƨȂɞÅ@Ìԫôò̑ƥ—óȃѶͩƧƥôÅѺœôÅƦ—@›ƥͩƧ—ôÈυó@̑ƧɛѵʵƩƪѵ˜̑ʸóóôÅÏó@ÅƦƨƥŎσÉÆ©Âœ@ÌŽÌОɚ̒ÏƨƧȂôɜςôóظəó̑ƨóɞɛŌ@Åτ˜ö̒ƨŌ@ɞôŌ̎óƨəφȂ"],encodeOffsets:[[119431,34741]]}},{type:"Feature",id:"fu_jian",properties:{name:"ç¦å»º",cp:[118.3008,25.9277],childNum:9},geometry:{type:"Polygon",coordinates:["@@̎›óÈƨӑ̒—̎ɚƨͩφÅƨÉ̎ŋóÅÏ—@Åƨ›òʳəóƨÅ̘õɛƧ@ƨѵƧÅÉ™ÅóŋƧô̑Éɛʳƥ@@óɛõ@Ƨ̑ƧóÈəƧ̑—ƧÌ@ɚəОƧ—Ƨɚóñ̑ŎóʴƨœƨԬɞȀóÅɜȂó̎ѶʸôƦƧÌѺ̒ɚƧѺɜƨȂ"],encodeOffsets:[[121321,28981]]}},{type:"Feature",id:"zhe_jiang",properties:{name:"浙江",cp:[120.498,29.0918],childNum:11},geometry:{type:"Polygon",coordinates:["@@Ѷʶƨɜ@̒φôóȂƨ˜Ʀͪ@œ̘ѸÌτȂ̒̑נÅמôƪƧôӑ̑›@Æ¥ÏͩƨօÌ@@Ï…Éó@Å‹É›@ôƩəóƧѵυó@ƩɜŋƧ@ÌŌƧɞυÅƧͪÌə̑˜ƧӒôȂÌÂœ@˜óφ̑ɜ@ŎƪȀ"],encodeOffsets:[[121051,30105]]}},{type:"Feature",id:"jiang_su",properties:{name:"江è‹",cp:[120.0586,32.915],childNum:13},geometry:{type:"Polygon",coordinates:["@@ôɞ̎˜φÐôÅÉœÅ̎Ȅƨ›öǿƨ@ôɜɚšƨʴ̒ôôó@Ƨ̎əԮȃԪૉöͩÌƧòʵφƧôʵ@óړɜóÅɜǿƧ›ÉÏσÈÑ·ÌŽÌ—ƥ˜óÅѹ›óÅƨƦѵͪôȄƦ˜ñ̒Ԭó@ÌŽÉÅƧÈϘóφƩóóôƨѶÌ—ƥʶυ˜ɛ̒ѵȀ"],encodeOffsets:[[119161,35460]]}},{type:"Feature",id:"chong_qing",properties:{name:"é‡åº†",cp:[107.7539,30.1904],childNum:40},geometry:{type:"Polygon",coordinates:["@@əȂòɜƨ˜ѺɛƦÈÌ@ƪ—õÅφƥòȃƥÌƧôυÌƧôñóóôɛÅƩôƧƥôƧóυƨœ̒ѹôœƦȃ@փƥɛ̑@@ɜƧó@ɚƧ@ñφσõ@ÅŽÉôƧ—@ʵѷóƧʵó˜@ŎóÅó@ôÈƥ›ó̒υôóʶə˜ƧȄς̎ƧȂôƨƨƨφɛ̎Åƨʷɞ@ςԮóŌôôφ@ɜֈ̎ƨ"],encodeOffsets:[[111150,32446]]}},{type:"Feature",id:"ning_xia",properties:{name:"å®å¤",cp:[105.9961,37.3096],childNum:5},geometry:{type:"Polygon",coordinates:["@@ల̒ôޠφӒςôƪͧυևɜŋѺó̎ÈÌÉ›@ѹס@@ʵƧÈôó@Ç¿ÌÅöʵÉÅ‹É›@ô̑ƥóóƨƧ—ó˜ôœó@ƩôóƦÌœóȀƨŎɛӒôÅυͪɛ@@Ȁə@"],encodeOffsets:[[106831,38340]]}},{type:"Feature",id:"hai_nan",properties:{name:"æµ·å—",cp:[109.9512,19.2041],childNum:18},geometry:{type:"Polygon",coordinates:["@@φɜƦʶÌôφô̎@ƨŎö@τʵƦ˜ԩ۫õÐÌóƥȃƧ@Æ©É™×ƨ̑Ʀ@Þ¤"],encodeOffsets:[[111240,19846]]}},{type:"Feature",id:"tai_wan",properties:{name:"å°æ¹¾",cp:[121.0254,23.5986],childNum:1},geometry:{type:"Polygon",coordinates:["@@ô—ƩÉöƧÉѵəޣÌÏƩԭóÅóͪÏɞƧОôԪ݈ଦѶɜ̒ɛ"],encodeOffsets:[[124831,25650]]}},{type:"Feature",id:"bei_jing",properties:{name:"北京",cp:[116.4551,40.2539],childNum:19},geometry:{type:"Polygon",coordinates:["@@óóó›υóôƥ@Åóóə@ƧŋƩŌÏóɛÅóʶѶʴƥʶ̎œôƨɞ@óŎɜŌ̎Ìφ›Ƨŋƨʵ"],encodeOffsets:[[120241,41176]]}},{type:"Feature",id:"tian_jin",properties:{name:"天津",cp:[117.4219,39.4189],childNum:18},geometry:{type:"Polygon",coordinates:["@@ôôɜ—@ƨöɚôœôôɚÅ@óƥ@@ÈƦƧɜ@óƧƨƥ@›ƧóəÐÌóѷɜ@ŎƦƨóО"],encodeOffsets:[[119610,40545]]}},{type:"Feature",id:"shang_hai",properties:{name:"上海",cp:[121.4648,31.2891],childNum:19},geometry:{type:"Polygon",coordinates:["@@ɞςƨœɛȀôÅڔɛóυôÌןÅÌ‘Ì’"],encodeOffsets:[[123840,31771]]}},{type:"Feature",id:"xiang_gang",properties:{name:"香港",cp:[114.2578,22.3242],childNum:1},geometry:{type:"Polygon",coordinates:["@@óɛƩ@Ï@óœôȀɚŎƨ@ö@@Åƨ@"],encodeOffsets:[[117361,22950]]}},{type:"Feature",id:"ao_men",properties:{name:"澳门",cp:[113.5547,22.1484],childNum:1},geometry:{type:"Polygon",coordinates:["@@X¯aWĀ„@lÂ"],encodeOffsets:[[116325,22697]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/chong_qing_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"500242",properties:{name:"酉阳土家æ—è‹—æ—自治县",cp:[108.8196,28.8666],childNum:1},geometry:{type:"Polygon",coordinates:["@@XJ°œlJX@lbl@XbV@VLnJlxnbšƒUU@IVK@lVIVwnJlU@n@J@L@Jn@l_nWVLVln@@blLšmV@@xœÔ‚`nϪxV‚ÈLlx„LVxVVšƒV_U»VWn_mÂ¥XwVmnX°ƒlmUUVwÞaVƒÂk@a@mmIUa@™mwk@™ƒm@@U¯a@UV@@K™Â@ykkmwkV@kU@ƒÑƒVkKWLÃ…amaUÂm@kyU@WkU@Ua™IUašÂVaUUmUUa@aVLXKWa¯UUbmJXnWnX`l@@xkzWÆ@V„LU¦‚x@b@JkIkJ@LmbUamJÂwm@óxƒnk@V„@x„ŽVnUVmVUÂVÂŽUbVlUbkXWÂŽ"],encodeOffsets:[[110914,29695]]}},{type:"Feature",id:"500236",properties:{name:"奉节县",cp:[109.3909,30.9265],childNum:1},geometry:{type:"Polygon",coordinates:["@@WVXb‚UnK@x@b‚²kxmKkl¯_ƒVV°™VUÂ@bnKVVV@@nkÂŽ@n›bn‚@š°@VLÄŒUš@°WV@V™nU@InKVÂl@nU„b˜KnX„WlknLlKUwnalLša„VlUXmWk@UU@UWWIUyķ¹XaWW@ÂX™ƒKUIVm„U@W@UVU@KV@n»VkUkÇmUmVIUmULUbm@ƒwUaƒKkkm¯ÑUL@bWVnx@VmxUI@„klmkkK@aƒK@IlJ@I¯ƒk@mak@mnkJVL@bV@Ub„„W`UUUV™I@VƒU@VVbUJVLUVVbUX„VVxk¦VJUnVxnVVUšJV@Ubl@@bXV@L"],encodeOffsets:[[111781,31658]]}},{type:"Feature",id:"500238",properties:{name:"巫溪县",cp:[109.3359,31.4813],childNum:1},geometry:{type:"Polygon",coordinates:["@@nLWbX‚VLVU„V@KšIVl@b„@lbšU„VnU@JÆU@V@n°KÄ¢Ul@VbÞKšVš@„_„V‚KXU‚U@KXƒ@wlkkU@mWKUU@UôJ@XV@ÂœaVmÞIVaVLƒƒ@»kmƒ@ƒUkL™U@aU@WWƒLUUU™™KkbƒwWa@KU@kaƒXmW—LƒamVk@UÂmL@JmVUšU@¯X™@Ä‹VUK¯@Ã…nWK™LkKULWK@UXK@wW@™LkV@bVLƒlXn›`¯xU„°LnÂŽlV@n°Lnl"],encodeOffsets:[[111488,32361]]}},{type:"Feature",id:"500234",properties:{name:"开县",cp:[108.4131,31.2561],childNum:1},geometry:{type:"Polygon",coordinates:["@@n@na‚I„wš@@VVK„LVbVxnVÆUnanKWÂXamKmk¯K@mkUm¯KVƒ°wÂÂ@Wm@UIUUlKUU@a¯KWanwmUXamKkÂUÂWUnU@KƒkUwWKXaWLUWkImaUUUƒƒKka±Âk@lƒ¯w™wmbUƒ™ƒkXm@UJkIW‚XXƒbƒmƒ„UJ™XUV@°šKlšlVXÂV@xmbnV@blV@VšœU`UL@V™a@bULlb°VXbܚ@V@bƒL@J„xnLVb@lVb@VÂ@@z˜bXWšX„KVLV‚š@@bUVVL@b„„lVna@ll@„zl@@J"],encodeOffsets:[[111150,32434]]}},{type:"Feature",id:"500243",properties:{name:"å½­æ°´è‹—æ—土家æ—自治县",cp:[108.2043,29.3994],childNum:1},geometry:{type:"Polygon",coordinates:["@@„Jlb@nVV@bXb@ÆlL„Ul`nÂVKU¼VxkbW„nlUxlXX‚@°°WnnJ@VUn@J„k°L@VlV@nUJ„x@bVVVz@VnLla„KnalVlIUŽ„¼@nV@@anKUwVal@UÂlJœƒlI@akU@UWÂXKVI‚¯Uak@@KmkXWÃœkXÂWykIWwXw@ÂlaXamkVUUym_XmlkkmmakwmIUKU@Wak@kaW@kI¯›WIk¦VŽƒUUƒmaUV@XkVUV±aUb¯b¯¥m@@ImJ—@mƒmL@kUKUkkJƒbV¦"],encodeOffsets:[[110408,29729]]}},{type:"Feature",id:"500235",properties:{name:"云阳县",cp:[108.8306,31.0089],childNum:1},geometry:{type:"Polygon",coordinates:["@@lb„LV„VVnblJVXXKWbXLVx„l@LmVXVVÂl‚nLWbnVmxXb°L@bVVkLVVVJn@@X‚‚œ_Wm„kUK@alUšKX@@xWL@VXLVKlLšKXLÆm@™mÂÂœa@mlÂ@mU@UUmL@aVšUU¯„U°`lknLlw±@a@wmLÂVWaXU@KWU@ak@VaU@™IUVmUUwVmUIlÂ¥UwƒUVWUaVUUKVIUa@UUUUJƒUUm™kƒ„nl@„@VWV@L¯aUb™Ulxƒ@@b@VULUx@VUxVV™U@bU@mxU„U@mUVÂŽklkkƒ@WxknlxÂK@amLƒKU„ÂK"],encodeOffsets:[[111016,31742]]}},{type:"Feature",id:"500101",properties:{name:"万州区",cp:[108.3911,30.6958],childNum:1},geometry:{type:"Polygon",coordinates:["@@ĸĊVI„ƒ„n„aWWXÂlJVIn@lWš„V„našx°xk„l@²Ž‚LVƒ„LnK@b‚LkwlmXw„@lllkUÂnVV@VƒnwV@@ašVUUVw@UVwVK@U@a„@kwšVVa°b@KXU@U@ƒmk„ƒÇÑÂaml™kUVmn@VULU˜m@kUVkUaƒwUWm@Uw¯„mKUUmVUUULUKU„W@XbWVkaWwkUU™ƒ™k@maUbmbVlk¦ƒxUVUIWVU„kJVVkL@UmJ™UUVU@lLUVU„lx„@@ÂVbƒJ™U™L¯¤@Vƒ„"],encodeOffsets:[[110464,31551]]}},{type:"Feature",id:"500229",properties:{name:"城å£åŽ¿",cp:[108.7756,31.9098],childNum:1},geometry:{type:"Polygon",coordinates:["@@VK@w¯L@m@UÃ…V@ImVƒU™Vkaƒ@@aUk™J@LƒUUVUKmLmbÃ…VmUUwUaƒKUL@U™@ƒxÂJmbm@ÂnVJ@X@VkV‚n™lƒLXx™@ƒb@bUVƒLU`UnƒbU@@ÂŽmVVX@JX@VLVVšklV—„‚`@bUL@V„LVKn@‚U@„UJkn@lmLmK@X@Jn@mb„nÞWVXnJ‚k„KČÑÆ@VK@knaÃœmXÂlUÄŒW°kôÇÆÂ@a@yÞ_VmƒUnU@K"],encodeOffsets:[[111893,32513]]}},{type:"Feature",id:"500116",properties:{name:"江津区",cp:[106.2158,28.9874],childNum:1},geometry:{type:"Polygon",coordinates:["@@„InWUUlU@LVašlX@°²lÃ’XxlK@Ul@@Un@UaVJ@I@W@UƒUUVUwVIUKUa‚UUÂVwn@Ãœx@XUlnn‚bÂœJ@Â¥VklKUUlk@ynU@kVƒUUVWnI@Â¥V£VWVIUKU@UVƒa@n@Vm@@nÂlUaVkUwƒJ@blLkLW@XWmXkmmLn™@m@U@UVm@™„UVÂUUlakUVa„ƒVkV@@wnaWUk@VwkƒlmVIkUUxmJ@U„™@KƒIkx±V@IUm@K@IUKkbWKUbn„m„@bmVnbmb@xkxUJ@ÂULW`@bX@WVXL@Vƒš¯„mk¯@UJ@VmLUaWnX@WJ@nkKkxW@UIV@@KkImmkK@UW@XaWIU@U‚ƒIkbWb„xXÂŽlLVbnV@bWlX@VxVLnl@nÆÞVÃœ"],encodeOffsets:[[108585,30032]]}},{type:"Feature",id:"500240",properties:{name:"石柱土家æ—自治县",cp:[108.2813,30.1025],childNum:1},geometry:{type:"Polygon",coordinates:["@@„š@kl@š¼UbmVXJ@bV@nxVIVJULVVk@@LWbnJVU@bVbUJ@blLXnWV—@mbnV‚@V„„bn@VJVLnaVanbl@„šVšlVXxlbXUWaX@VƒUUVwUUVm@I@WmI@a„mlLϪlK@alwnUV@kóVaƒÃÂk@UlbVK@™VU»VÂUÂUVWUƒ@U`ULkwm@@KmU@knKƒ»VÂkJkUmbƒLkbmK@UUyUU@aƒwm@@XXJ@VVLVVUbVnUJVX@K„„k`WXXJWXUbmW@bkL™Um`Xnƒb@JVL@LU@™°VVXKVnUxVLUbmJ"],encodeOffsets:[[110588,30769]]}},{type:"Feature",id:"500237",properties:{name:"巫山县",cp:[109.8853,31.1188],childNum:1},geometry:{type:"Polygon",coordinates:["@@kVƒU™bkKmbVxkLmKkllbV@@LXb„xlašLVšVV„KXXV@@bšVlK„V„@ln@¼°KXa„U@Ulw°JXalIUa„ÃWÂXW@kVU@ƒVUVWUUUamUÂw@aVamwn@VUUƒlLXWm£@wÇĉkKklmLUÒ¯ƒWn™@ğ±ÂkwmaÂWm¼U@@LUV@V@XƒVUnVJ„LWš@‚XXWbĸºVzXJVXV@@VXlWn"],encodeOffsets:[[112399,31917]]}},{type:"Feature",id:"500102",properties:{name:"涪陵区",cp:[107.3364,29.6796],childNum:1},geometry:{type:"Polygon",coordinates:["@@nèVblÄ–VVnLšŽ„@šx‚V„n@nšJ@L„UVVX@lbUJV@@nn@VVVK@z„˜V@nzVJVUlmX@@_VVVbnaVal@@knW@wnaƒÂVK@aVI„J@£kUVW@‚wXUVJ„amƒ@Ikƒƒƒƒ_X¥ƒ@WwkKkwmŽ™šƒkUxƒnÃ…mm¥™ÂÂWVÂ@Um@UlVL@JU@@Xƒ@UVkKVk™KVk™Kkb@bmJVXU„VVUbU@@`W_UV¯b"],encodeOffsets:[[109508,30207]]}},{type:"Feature",id:"500230",properties:{name:"丰都县",cp:[107.8418,29.9048],childNum:1},geometry:{type:"Polygon",coordinates:["@@Þè@XUK@LlV@blbUJ@„„V@bnV‚Â@VVVXU@ƒlbXal@VXnKV@maXUރ@amk@aVKXV‚anbš£°mnIVaUKVwUmWLUUš¯V@@KUK@I„aWmn_šVlK@anXVaXWWIXWl_ƒƒ@LUWVIUmVaUUUK@UWI@Wn@VI@mkU@U¯Kƒl@ImVÃ…LƒwU¤óbUU@wWÂXkmm@LU@@VUIWVUL@JUnƒaƒx@Jn„ƒbUIWVÂx@ÂŽUXlV@¤ƒIUJ@bUL„Žmb@xmX@lk@UbmbUaUU@`W@kn"],encodeOffsets:[[110048,30713]]}},{type:"Feature",id:"500232",properties:{name:"武隆县",cp:[107.655,29.35],childNum:1},geometry:{type:"Polygon",coordinates:["@@l„„w„bVm@IVKXUVJ@UV@@KnnWlXÂ@xVVôaV£„xÆKnUVm@UmIXm¯¯@ÂWÂkWVwmkXƒlaUwV»ULmÂk_ƒVkK@Ã…Wa@aUU@mkaƒIƒb@‚n¼ƒnm‚Â_@mmK@UƒLUVÂVmI@aUJ@XWJ@ÂU`UIkm±kk@@lULmUmKUnVšnlUVmI@VkVlx™bkIƒVmLUxkKUŽ‚Xš‚n¦Æn„mVw„lš™nÂlxlLXx„@W¦„`„„"],encodeOffsets:[[110262,30291]]}},{type:"Feature",id:"500119",properties:{name:"å—å·åŒº",cp:[107.1716,29.1302],childNum:1},geometry:{type:"Polygon",coordinates:["@@VšUbVJVUn@VLX@WVXVVI@VUVWxU@mš@ÄŠX@@¼V°aVUX`@_V@VaUUVƒUWnI@alašLUlšLUllLVU„@@WV@@IUKVkn@@VlLVwnK„UlJšakwlU@UnJVUmkU™VmXa@wVK@UUw™@VƒVI@akƒ@alInwlKXUmaUW@wWLk™™KVak_ÇaUƒƒV@šXbƒLVxUlWIk@UK@V™@ƒkU@VbUVUlVnƒLUV@lVXmxkV@L@V@Vk@WbUwmL@JUI@xVxkx"],encodeOffsets:[[109463,29830]]}},{type:"Feature",id:"500241",properties:{name:"秀山土家æ—è‹—æ—自治县",cp:[109.0173,28.5205],childNum:1},geometry:{type:"Polygon",coordinates:["@@XlV@lzn@VÂŽnbÆbXKlL„U„ÒV@@llUnxll@zšŽ@LU@@V°b@Vn@š„l@VÑUƒnK@UšU@aUaƒkVm@K¯wƒklmnn„Ul`nI@almkIUwmWVkUaƒkkJmUUa@K@aU@@_m@@wUyVUUa@Umƒ@aÂwlÂ@Wka±„UkUykIWV™b@bUVk@›aU@UXU‚UIWakUWmUxUV@nUVWbšŽ@XXVVÂŽmXXÂŽ@VƒbVLkVWx"],encodeOffsets:[[111330,29183]]}},{type:"Feature",id:"500114",properties:{name:"黔江区",cp:[108.7207,29.4708],childNum:1},geometry:{type:"Polygon",coordinates:["@@VX@V@LV@VJUL@lVnnxlb@VXV‚XV@@W„@UIVK@kUKna@£VWUaVUUalIVJVIUW„_lm@bXKV@mn@J„UUw@KnIVll@VanLVmUkVKXLVKUIVamw@ÂUaU_lw„KlwUWV_Ua@aUa@KUšwm›Â_›Ó@wU@™nkK@am@UkUKmXk`m@@I@K@I@mkVmIUxUJ@kUL@JVV™„lnklWnn`VzUVnlWbkb@ÂWxXxlJXzWŽÛlWXnl@Ll@Vb°UJWLXÂ@VlV@bkJ"],encodeOffsets:[[111106,30420]]}},{type:"Feature",id:"500117",properties:{name:"åˆå·åŒº",cp:[106.3257,30.108],childNum:1},geometry:{type:"Polygon",coordinates:["@@XKVXlK„ƒVL@UnV@aValXXK„U@WVwUaVU@IV@@aVW„L@U@anVV@@bVK@UVL@bnJWL@VnUnb˜@@JnIlVÂl‚@@bXIWbn@UKVLVKXLlaV@VVnK@bVL„m„IVƒ@KmknUUWVI@aVJ@_„WU_VmUwƒU@K™ƒVaÂk@am¯mJU_UJUkU@WÂkIV`UI@JVÂ@LmmU@@mƒbUzś™Â@„VK@nUKƒ„ƒb™akb@UWK@bkVVbV„Û@@`ƒXk@WÂŽ@n@lXL@bmb@VVJUn@JnUlnUlmX@`XLlbkJW@kzlb@`@b@b"],encodeOffsets:[[108529,31101]]}},{type:"Feature",id:"500222",properties:{name:"綦江县",cp:[106.6553,28.8171],childNum:1},geometry:{type:"Polygon",coordinates:["@@@¦‚@X„lVX@@UVKl„VUX@lanVlUVbXWVXVƒ„VVUnKVUlwUwU@UJ@nmVkUV™lwXam@VaUUUw@W@kk»mV@UmKkwVKVUU@@LUKVI@mV@XVWxnXVKUUUK@wWU@UUWnUlLXa‚mUI„amÂ@wÂI@K@amIm‚UUkI@m‚akUkKWUUanƒ@wƒamLVxk@UVmUUL@Vm@kV@I@ak@@bWVXJlLVbVL@š@bn@@`Un„@WbUKULWVXbƒ@UVmbX„WVƒb@bÂVmxUKUƒV@šUn@V@V@nmšnKlnnWWXX@lKkK@a„IVxUlVb‚k@mn@@U@m„bVUV@VLUJUXU¤"],encodeOffsets:[[109137,29779]]}},{type:"Feature",id:"500233",properties:{name:"忠县",cp:[107.8967,30.3223],childNum:1},geometry:{type:"Polygon",coordinates:["@@VLÞĊ„U@WšÂ@¼V‚„@lk@w²mlšVUœ„llšVnI@VlKUUlIVƒXUVJVU„wlÂ¥UkUKUIm@ƒaUƒÂ@mUna˜@XUWmkK@aVIUa@aUVmIXa@Kl@UUVKUIUJmwU@@aWInUVa™»k@@lƒ™¯n™¤maÂbWUUL@bnl@bÄWVnbU@mLUWk@Wbka@„WVUU@UÂÂmUmVkUULV„lVUx„l@L@VƒbÈÒlb"],encodeOffsets:[[110239,31146]]}},{type:"Feature",id:"500228",properties:{name:"æ¢å¹³åŽ¿",cp:[107.7429,30.6519],childNum:1},geometry:{type:"Polygon",coordinates:["@@XLV@VV@b°°nšƒnkb@bƒšnJWVXblIUVšxWnUJnVVLVU„JlUnLVK@UnUVJš²nKVbVKla@aXÂlJ„k„Klb„ƒ@U°£šKšV„IUa@ƒ@kwVƒVUkKV@VUkk›ƒUVk™±n@xklƒ@UÂ@»™‚@XƒVÃĉUJnxWbÂ@UX›KkVUbUKWUkVmkkLU`›b"],encodeOffsets:[[109980,31247]]}},{type:"Feature",id:"500113",properties:{name:"å·´å—区",cp:[106.7322,29.4214],childNum:1},geometry:{type:"Polygon",coordinates:["@@nxnVlJlUXLƒ¦@x@Vl@nKVVX@V_V@@KlVXU„@lKlxXIl@ÈĊ@Vl@n_VJlÂŽnÂVlnb„²VVVJVÂVmUUkÄ•UamçUÂ@»W@@ĉn™V@XwVU@UUJWUXUW@UKm@UVUIVaU™UVmLUVƒUU„UWWXUakVmUkbW@UVkƒUL@VW@kUWƒÂ@mJUXVVU„@lmV@zklVVkLUl@¦›I"],encodeOffsets:[[108990,30061]]}},{type:"Feature",id:"500223",properties:{name:"æ½¼å—县",cp:[105.7764,30.1135],childNum:1},geometry:{type:"Polygon",coordinates:["@@@a@a@_kalyX@lIkaWK@_nWVkkmmV@IVmUI@Una@aWK@k@mkbWaknmJUk@mk@@kUal@Uaš@Wa@aXLlwUKlkkƒ@KmI@VUJ@Lk@@VUUmL@amJU£kKUaWakLmU@bVVUbnbWV@xkL@bUb‚xUxVbXJVbUVWIUVU@kLWxkKWV@n¯VUbU@@VVX@VmaUL@VUK@VVbn@lVnI‚@@lnLULm@Ub@ÂŽl@na„@lK@XVVkJ@b@zl@@VnV@bVb@J@bnXV`lXXmVI@W@InbV@@aVKUblKVLUanLlmnLlK"],encodeOffsets:[[108529,31101]]}},{type:"Feature",id:"500118",properties:{name:"æ°¸å·åŒº",cp:[105.8643,29.2566],childNum:1},geometry:{type:"Polygon",coordinates:["@@@b܄nWVLX„lxV„VxXxlVn@@bVblK@a@UnLVJV@@UnLVU@VXaVKVXš@n`WÂUÿ@IUKlaUUUkWyUÛÅÃ@mmkUKUwW@Xk@amUUakKWƒwXaƒK@VVLklƒXVlkxV„UL@bm@Vxn`ƒIVxUVkLVšUšl@@lkXmmƒVUn@VV@Xb"],encodeOffsets:[[108192,30038]]}},{type:"Feature",id:"500231",properties:{name:"垫江县",cp:[107.4573,30.2454],childNum:1},geometry:{type:"Polygon",coordinates:["@@šĊ°¤nҘ¼œaV_lKnllUXVVLValUÂœLVW‚@XamwVIUKkaÇфa@U@KƒkVwkUUƒVKlVnU@aƒU@ƒVIka@akU@KVL@WÃçUV@Vmbů@L™KƒnnJW„ƒVkxlL@VX@VxmnXVWxUb@bkn"],encodeOffsets:[[109812,30961]]}},{type:"Feature",id:"500112",properties:{name:"æ¸åŒ—区",cp:[106.7212,29.8499],childNum:1},geometry:{type:"Polygon",coordinates:["@@@bVVXL‚a@lnbWn@L„@XVlK@VVLUVlbkLUKVVVL@VšnX‚VL@VV@UbVb@x@¦UxVb@bUJƒL@L„VVxlK@™nk@U@W„UVLlKXV„@VblU@UUKVU@wn@VJVanLlkX@VaVK™¯@a@U@U@ƒVaUK„kUUımaUkm@UUkbm@@Vk@@JƒwU@Ub@I@JmwUL@aƒ@@KkVÇLkƒWkƒ@kUU@@xUVmKUnllUb"],encodeOffsets:[[109013,30381]]}},{type:"Feature",id:"500115",properties:{name:"长寿区",cp:[107.1606,29.9762],childNum:1},geometry:{type:"Polygon",coordinates:["@@VVšU„bX‚lX„¥l@XnVmlxUx„@@blVnnôĀlm@aVaXwWUnmUwW@@UkKlw„UXƒmI„mšL@KÆ°na@UUImyU@ƒ—@yULUUm@@mU@VIkaW@UUƒV@K™I@mƒmÂU™wƒ@™ÂmKUnU‚UIƒlVLUb@„@V@V@bš°ULUbW@klmKUbUIm@@xUVVL"],encodeOffsets:[[109429,30747]]}},{type:"Feature",id:"500225",properties:{name:"大足县",cp:[105.7544,29.6136],childNum:1},geometry:{type:"Polygon",coordinates:["@@XUmaVaUU@anVlKXbValU@aV@@IXKš@@bV@VxVK@UXLlUšJXa@_‚@@aVK—ÅWVkwWaƒƒwUa@am@kUWLU@kWmX@ykI@W@UV@na@LlLV@UƒkwWƒUKmXX`mIVl@bXLWVkbkkƒx@`VXm@@J@U@UUKUxk@WbUIVl@VXLW„ƒJUkUlUImxXlmb@X@VUJUnVbšW@UV@@VVX@bnW@LVxUnlJUV@n„@VxVIn@l`„UVVVL"],encodeOffsets:[[108270,30578]]}},{type:"Feature",id:"500224",properties:{name:"é“œæ¢åŽ¿",cp:[106.0291,29.8059],childNum:1},geometry:{type:"Polygon",coordinates:["@@VblLV¤nI@bnKVV@Ul@@KVI@UnJ@Ll„klVLkxWK@bXb™@Vbk@Vb@ll@@nVlnIlmXblaXÂl@„W@_Ãœ@UƒUalU@aXL@Vlašb„a„ƒVL@mUL@ƒUUƒƒÇÂXUW›X_WaƒƒUƒÂ»m_™@UWULWb@UUVmK@VU@UImK@V@bkL„x‚„XblxXU˜ÆUL@bÂ@@`Wb™IkVWK@VULUwU@@a™@WL@JU@@bkVUb"],encodeOffsets:[[108316,30527]]}},{type:"Feature",id:"500226",properties:{name:"è£æ˜ŒåŽ¿",cp:[105.5127,29.4708],childNum:1},geometry:{type:"Polygon",coordinates:["@@VI@U@WnaWknwVJVkVl„IXƒWK@UUkVJXal@VwVL@V@V@In@UW@_„wlllaXUWK@aUknJW_ۃ@aWaU@@UVm„UUaUImJVnÃ…UmVÂUm`kUUVWLnVU@VVmXƒK@„nxmÂŽULkx™ImJ@nU`@X@Vkn@`@nlV@nVJVaX„VLnK@bVV@nV@lbXWš@"],encodeOffsets:[[108012,30392]]}},{type:"Feature",id:"500227",properties:{name:"璧山县",cp:[106.2048,29.5807],childNum:1},geometry:{type:"Polygon",coordinates:["@@XzVlVVkbVL@JVÄ€XŽ‚¼V„„„XbW`XÂœWVȎ„„VVšŽVkV@@UXa@alK@IƒƒU@UKWÂUyUI@wVUUWVak@VUkƒW¹@WXI@yVIUK@kWwkѯ±W@™kUb@KkVVVmXƒJ"],encodeOffsets:[[108585,30032]]}},{type:"Feature",id:"500109",properties:{name:"北碚区",cp:[106.5674,29.8883],childNum:1},geometry:{type:"Polygon",coordinates:["@@X‚VLV@„„@JkL@bWb@VU@UlƜVy„a@nV@nn@KUÂ@IVJU_lJXÂV@VlVIV`nIn°@b‚lUbš„„KVI@aUaVw@Â¥@wUaVaU@@UUKW™m@UUKUUVLlKkaVUUK@UkLWUƒ@@KXmma@kÂbWKUU@aUamLnÞ@VWLk@@Wm@ULU@@U™KUVWI"],encodeOffsets:[[108855,30449]]}},{type:"Feature",id:"500110",properties:{name:"万盛区",cp:[106.908,28.9325],childNum:1},geometry:{type:"Polygon",coordinates:["@@VIV@@wVJ@InKVxXal@@U@U@KlUnwUW@kVU„KUmVkUa@I@KW@@bk@@mƒU@m@k@a@aƒIUxmJk@ƒwULƒwkKmVVX@VXV@xVLVVULmWXwWUU@@nUJVL@KV@UVULlxnL@VnUl¼@l@XVxVVUbn@WbkxUšlVnU@m"],encodeOffsets:[[109452,29779]]}},{type:"Feature",id:"500107",properties:{name:"ä¹é¾™å¡åŒº",cp:[106.3586,29.4049],childNum:1},geometry:{type:"Polygon",coordinates:["@@XK‚L@Vš@XbV@lW@UV@@VXIV@U™VKlL@KnÂnJ@VV@VU@I„@@mVUVWUUmL@V¯LUK@UV@UU@a@U@yU@WLUK@X@KUVmL@ƒ@aXI@w@ammVk@WÛwm@UxVÂÂVVbVLUJVxVU„V@V@X@JUIVbm@@Vk@@VkL@lVLUJ@zWJ@X"],encodeOffsets:[[108799,30241]]}},{type:"Feature",id:"500106",properties:{name:"æ²™åªå区",cp:[106.3696,29.6191],childNum:1},geometry:{type:"Polygon",coordinates:["@@Xºl„UVl@UbVXUV@xVJVzXJVUšL@VV@VKn@@Xl@XK@UmÃnKVbVakkVm@k„ƒUK@UmImÂ@LkKULVšU@WJ@UU@@VkXU@Wa™@@UÂKWL"],encodeOffsets:[[108799,30241]]}},{type:"Feature",id:"500108",properties:{name:"å—岸区",cp:[106.6663,29.5367],childNum:1},geometry:{type:"Polygon",coordinates:["@@VV„JVL@bUVVnl`XIlwXJlw°nnl‚IXW@UÇĉk@WJkwkLƒ@WVkU@LU@U`W@UXUV@n"],encodeOffsets:[[109092,30241]]}},{type:"Feature",id:"500105",properties:{name:"江北区",cp:[106.8311,29.6191],childNum:1},geometry:{type:"Polygon",coordinates:["@@nLVU@wV@lV„@Xll„ÈKlU@L„@@bVKnx@I@JVaV@„x@Il@@Un@laVVn@mÂkÂUIm`k@WXÂJmk¯mkxWIkxWJk_UmVUUKƒ@UU™@ƒ„@l"],encodeOffsets:[[109013,30319]]}},{type:"Feature",id:"500104",properties:{name:"大渡å£åŒº",cp:[106.4905,29.4214],childNum:1},geometry:{type:"Polygon",coordinates:["@@k@@U@w„¥WKkVkImUmwÂa@b@xWJ@b@„nKVU@L@WVLXKV@@z@V@bVVU@@VVL°K@U"],encodeOffsets:[[109080,30190]]}},{type:"Feature",id:"500111",properties:{name:"åŒæ¡¥åŒº",cp:[105.7874,29.4928],childNum:1},geometry:{type:"Polygon",coordinates:["@@WwUwU@kK@KmbU@@V@XlJ@znWlXV@XK"],encodeOffsets:[[108372,30235]]}},{type:"Feature",id:"500103",properties:{name:"æ¸ä¸­åŒº",cp:[106.5344,29.5477],childNum:1},geometry:{type:"Polygon",coordinates:["@@VLš@VV„@VL@aUKƒIUUƒ@@JUVU@"],encodeOffsets:[[109036,30257]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/fu_jian_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"3507",properties:{name:"å—平市",cp:[118.136,27.2845],childNum:10},geometry:{type:"Polygon",coordinates:["@@@knyƒk@ƒKU¥šwV@nkƒWƒzUmk@@ÂlKUa@aVI@UƒKUamKUUVaUI‚@Xƒ@UV@K±IUVVlUbUbUL@KWUXmWk@KkXmmkŃKUĪa@amUƒbkUkKWUnwUĂwV™UUƒÃUKV£U™@ƒnKWwXLVKmÂ¥@wUXkmWk@ƒ@wX@lU„@šyVImaXwVƒƒ@kŽƒnU@mbk@mlUXƒmU@mV@n@bnW@bUIWJ—ImVUKWbUK@nkKƒaU@W_ÂVUUmWmL@UU@™bUWUL@V@bmVUz@`mUUVVbXL@V™L@lmLUxmVÂamXkW@xWbU„VbUxkU±@Ã…UmmkLUbW@@`kLknVlV@lbXxlVUXVV™ŽU„U@UbWÂŽkIWVUUUJkI@llbUxVL@V™VƒUU°ULUmWXUV@VULWbÂ@™xm@UaVLVKUa@ƒÂw@V›bkÂmVÂambUUm@@VkK@„@b„xlxX@‚„n¤@Xƒ@@lkLWV@ÂŽn„V„kb@bWJXLWx@nkxmm™bXn@VWVUn@VnJ@bVXl@„™VJXnWbX`lL„UlJVI@ÂŽÂœ@VXV@Vl@bn@@Æmn@VšxXU@mVIlxšVššnI„l@nVJ‚aXI@mlU@aXkVm°klmnVV_naš°@V@xܦXK„V‚nnUlVXbVK‚LXKV@naV@@ÂVVl@@lXblXšWnLlbVK²nš@@‚VLUnlV@lƒXÂxô°‚V@UnaUUlKXLVUVVUbVVlUnJVX„@VW@an@lb„@nÂl@VU@anƒšUVW@kƒaUm@InVVKVU@ÂkUW@Uam@km@kVa@a@™nwšU@WlI@mVI@WXaW_nƒ@™nƒlkkW@U‚¥@kV@Uw@wUƒ@@IXK‚¥VIn@nU@`@Xl@VV„LnašW‚bVaUwnU„@VIšKlV"],encodeOffsets:[[122119,28086]]}},{type:"Feature",id:"3504",properties:{name:"三明市",cp:[117.5317,26.3013],childNum:11},geometry:{type:"Polygon",coordinates:["@@lL@Un@VVna‚bnUlÂÂœa@U‚x@„VbULUKVbn@šw‚@XaVK@UVUXWVnVKV¯„VšU@UUKVwka@klJVIVVXUlJXÂVaV@VƒšÂUUVWkUWwkaU@UklmlK@_X@ValKnnÆV²@lVVwUaVƒXa@wlXnW‚bnUVwnK@kšK@UWKUaVUnV@_VynU@a@UVKVXšaV@@VnKnXVV‚UX`V@„blL@mVLXaVLnU˜JXIVJ@amX@a@mnUV@„nVWnkl@naV@„ml„@@KmÂÂKUam@UU@ƒ@UlKU™Vk™U™K@aVaUwV™UÂ¥UIkJ@wmI@‚mbkwkVW@UXƒKULU`™IVKUa@LƒkkVmUU@WlULUWÃ…U@I@ƒWW™nU@@w@a@ƒUam_XyVIVWkkƒ@mwVKXUV@nw˜VXkWƒÅ™U@ƒaƒU¯KUnƒK@ƒ¯šmUƒLXÂŽVLnWVbVbUVm@Ub¯¼W@Âamƒ`kb™amLUUUĪaUXV`@x@XmJ@n@L@xkJUU@kU@mWm@kUUwUUVWl@VUkIƒy@kkaVUUm™IWVXbWxU@k„mVkK@nWVX¦WxU@@bkx@VU@WÂŽk@™kUbmJUUmkUW@_kKWKƒ@knV¤kIUKWLUbV‚Â@Wbk@@VWL@VkI@lUXVxUVU@@mWIƒV@a¯nUaƒaUV@„ƒJ™b@bÞ°VbUš@X™aUVmL@‚VXÂblÂŽnV„°˜n@Vnx„@VUUUlK@InJVb@„Vlnn@V™L@VWJU„Âx@XlJUVVÂVl@LUUUJ@Lƒ„@lUL°¦k˜V„VnV@„xV„„l@blLnlšLVaXll@šnVUn@‚xn@nml°‚X@lb"],
-encodeOffsets:[[119858,27754]]}},{type:"Feature",id:"3508",properties:{name:"龙岩市",cp:[116.8066,25.2026],childNum:7},geometry:{type:"Polygon",coordinates:["@@ša„I@ƒVU„bVb°m@b„UXJ@nV@VUUwVW@klJ@UXK@Ul@Xa‚@UÂVaXKVLlJU£lm„@XLlL@`VXnlVVnIVašll@XÂV@@Ulw@aV@XwWÂ¥XU@mlLnUlƒV@XwWaXUšJVnUVlb@l„zlJUVk@UXVVVxlVn@nXV@@lVVlI@w@K@mnI@W@wU_VWšbV„VVnKšbla„_n‚bX@°»Van@VUUaUamXUKW„K@a@Ukƒ@wWkXƒWW@wUU™KÂw@_lyƒwUkU@@Uƒ@kamVmƒXašUVUka@ÂWk@»UUUVƒKkbWU™VUbk@mkƒxkƒƒKnIVUmW@kUKmXUmVaU@kU@ÂmÂ@KÂUWVkIWJ@ÂŽU@UI@wUUUa@KW»nU@mVkUmm@XwWU@ƒUUmLÂ@ƒw@mnƒVÂUU@aWak@@amxU@UxULWVXbVLU`mbUImVU„ƒbn‚V@@bVn@bnVWxÂLmyUbƒIUKƒ@ÂaƒVm™akbV‚UXW„UlÂKWbkV@„WLUlk@@nšbƒb@lkKmU@ƒUIWJkw¯UUVVxm@@XkbWx—›XÂKƒlUzWJkUUL@bmKkVƒ@@VUIUlWV@X„K@VkbWx°xUb@LUbk@@VWb@LXJ@VWXU@@bUVV„VVn@VVlLn„@l„@‚xk¦Vx@bVJXbƒn@JlnXxV@@„nJ@X@V@lmx„bUn@xVL@VVKlL@l„„nLVaVL@xkl@LƒxVl°š„X„WVX„Vl„œJWÂnxlJ"],encodeOffsets:[[119194,26657]]}},{type:"Feature",id:"3509",properties:{name:"å®å¾·å¸‚",cp:[119.6521,26.9824],childNum:9},geometry:{type:"Polygon",coordinates:["@@@LVKVaVaUkVU²J@LVU„@@W‚ÂVJUbVVnLVb„L@VUJ@bVbkL@ÂŽl@Vn„y„XmlU@™xV¦„L@Ž„lmz@lnL@bVVšbVb@l„nšKVk„Vl¤@zXV@šl@XJVLVKnXVK‚VnU@wUm@šKUƒ@UlVlw@U@U@ƒUaUKlU@kXKlmXIWKXaVIVUVK@KU@@k„JVUnLVJUL@V‚IVa@VnLšKUnl`Vb„V„ÂV@š‚Vbn@Vzn@lKnVlI„VVKUalkXJl@XXVWVLVUUmVU@Unm„£lK@Uk@WUXK@U@WVwVkšƒĠkĢÇ°aUÃ…UwmaţƒɱUÇa™w„±V¹XalKôx„@„UVaÜʓͿVóbÃ…LƒJm„¯Vk¦ƒŽk@mamXkKUƒUL›akbk@mV@LkJWb@Vk„mXk@UVmaUV@amLUKUamI@KUaU@WbU@UUUƒUIWJUkm@šƒw™Kk„VJm@kxÇÂVƒUKÂ@mUVUkmlkkVm@ÂamwƒLVWU@UbVLkšUbƒ@VƒmK@ÂXaVWU_VJnwV@@kUmWakxƒ@kwWakIWxnbUJ™zƒ@kVW@@x@„XllnVW@xn¦ULWKXxmL@„VšU¤VL„ÞVVUšÈxV„mxXVlLlV„anV@bšbV„„LlÆnnlW@LXlWnXV"],encodeOffsets:[[121816,27816]]}},{type:"Feature",id:"3501",properties:{name:"ç¦å·žå¸‚",cp:[119.4543,25.9222],childNum:9},geometry:{type:"Polygon",coordinates:["@@lxna@ÂnJ@xlIVJV¦UšVxUb@bšLšVUlVškL@V@„VVn@Vb‚Ln‚@LU„lJXblx„@lwXbVn@lU@mxUIV`UXWb@‚nLU„„@Val™UKVaV@UX„Knx‚bn@lUkllnUVnV‚@VLU„È‚lwn@UIlƒšL„x‚™n@VlXIVJV„VVV@XaV@Vb@LnJVbVLnK@bVUnbVUl@nWlƒ@UXalI@KnUl@laÂœbVKV„lLnWnbl@„Âl¥°Unƒ„IÆKôa΀U„a@UUwÇWÇ“IUWUÃ…Vkƨm@ƒ@£@KmLU¤ULË£J™kUƒVÇŸUUÄ·@ĉVƒKUk@Ñ°wôǚç@īšé@Åţ¥mīÛkm¼Å@ƒVÄ·Vó°Å¦U°ƒn@bVJXVVL@bUŽƒakLmx@xmxXzW`XbWnXV@bWLÛ@™aƒ@ƒaXbWVkaÃwU@mlÂÂWKkLWWkLUKULW@kVmVUUÃÂUamV—¤›n@xUVUzkJV¦lJU„"],encodeOffsets:[[121253,26511]]}},{type:"Feature",id:"3506",properties:{name:"漳州市",cp:[117.5757,24.3732],childNum:10},geometry:{type:"Polygon",coordinates:["@@@bl@Xb@bVVUÂŽm„@n„x‚@nKVV@„XVWxn@VnUl@nmVX¼@LVbVV@xVJV@@ÂXIlJXU‚V@Ln‚@ÂlVV@UbVnnWVL@lnXUVmJ„Ll„„wnll@VašUXVla„LVUVV@¼Xl@ÂlbUV™VWbn„nUlb„@@VV@„aVUšmlÂUašUny@kU@Wkk@WaUVk@@ammk@@U@UlU@aUa@wl@šmXLllnL‚U@anVnU@L@VVV@KlXnWVnVanUšw@w@wm›nÃ…@wƒaUam@Uk„mUÂl@@a„a@U@¥škôK‚wȯ°w@Å»kwÇ•aÂK›ÑÛk@Ä•Åřċ£ĵƒUKW»kÃ…Å»LU@UlÄ¡w@¤Vz™VUbkKUbmLmlULU¼UxmbXl@bWVƒb@bUnV‚UšVbULU@@VkbVL@`U@WX@ÂŽXV@b°„@b¯š@¤@Xm@@b@`U„VVUL"],encodeOffsets:[[119712,24953]]}},{type:"Feature",id:"3505",properties:{name:"泉州市",cp:[118.3228,25.1147],childNum:9},geometry:{type:"Polygon",coordinates:["@@Vl„xkz@`‚xšLVV@xXXW„Xl@xl„@V@bnV°™@„„LVm°L„V„bV@ƚX„Wl—UmxU@WVULnx„@llUXUJWzn`Vb@„@b@xV@šmXX@„@JÆVVXVKXkV@nVlU„l@KVbULšJV_VK„LVWX@lUVƒkIUÂ¥lIVyVU@wÂœm˜£nUVWUÂ@aƒm@UÂmWw@UX@@am™VUn@@aUUlUVanaWUXWmUnkšK@VšUlVVUUwš@XLWWX™ma@knm‚bVb„VXbVL‚@XJlInlšL„w˜mXóšw@çV»ÇçŋaķƧóƅóKġ°nÃ…UÄ·Æ‘UÇW@—¯xÇ°öÆlÂV„n@llšaš@„Lšbƒ`™@™„VšXVƒÂVx@V@bULVJUÂk‚Ç@ƒ¼ƒXUKk@mmULkaWbk@ƒx@UkL@a@K@U@UmKmbU@kV@UmVUbUmmXkW@LUU@U@KmVmU@bÂVmKkkWK™nk@@xVb@bkV@V@Vl@nn@bl@VUXbl@XlV@@lmz™VVbkŽ™nUVƒb"],encodeOffsets:[[120398,25797]]}},{type:"Feature",id:"3503",properties:{name:"莆田市",cp:[119.0918,25.3455],childNum:2},geometry:{type:"Polygon",coordinates:["@@VbނVVnUlUX@VKVLlKXXlKXL‚‚nkV@ÞxlbXUWa„b„@šbÃœ@XK@aWUXmWaX_Wynw@wnwlK„bVÂ@aUKWUUI@a„mV¯Ŏ¥ô¯ĸU„UÆ@n»¯aƿé@ţ¯nĉĬÃK™óó@™ÑU¼@è™xWô—nƒx™KmkkJWIÂ@UKWaƒUUaÂamn@lnbWšXXWK™@VxUVkU™V@U™LmlnVWXXVmbUbkVVV@bm@UVnš@bW@@VXx‚n@V„n@bV‚UX"],encodeOffsets:[[121388,26264]]}},{type:"Feature",id:"3502",properties:{name:"厦门市",cp:[118.1689,24.6478],childNum:1},geometry:{type:"Polygon",coordinates:["@@@VlUV@nanL@V@V@L@blK@V„wl@XalbVKnnl@VL„W„»È@lÂVÂUIVK@a@UUw„ÂWUU™šƒš@„_™aƒK™@™bkkm@UƒkÂõÅÂxóL™l@¦@Vƒb@bk@VŽƒnVln@Vb„b@xmÆnÂœ@x@x™x"],encodeOffsets:[[120747,25465]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/gan_su_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"6209",properties:{name:"酒泉市",cp:[96.2622,40.4517],childNum:8},geometry:{type:"Polygon",coordinates:["@@ÇnÃ…aĉ@ƒU¯¥›UŹ‚ƒ£™WUýUU±JkkUw‚yÞIÄŒxĊĕĊ¯š¥ÆUkţ™UÅÓ±¼™IUx¯UƒÒƑ‚ÃÂÅ°ƒKÃnğ°ÅU@Žƒ@Vn@þš¼¯šWnŎ°XLWlnVnbWnƒVXxmbƒa—bóUƒlÇ•UUa™IUmlU™ƒš¥™kƒ¥ĉwkkƒÃÉ›a@¯™™U¯°mVƒkÂVÂnKlƒÅÑÇÑU@kl™UÄ¡ÂŽkUÅ»nUW™@š¯ƒÂk»šÂmWV£UKnUƒmUw‚w@ƒUIVaX™šwm»Èmmwn¯ċ™¯LĉŽUƒJUalÂka±VÂa@U‚k@ƒÛф¯WmnÂUaɤÛÂmƒn¯m±x@wóxÛLÄ¡Ã’Ux¯VƒÈ™JUbózÃĂKĉ¯ÅlÃUÃ…ÂŽWÂÂl¯nÅ¥bÃ@¯ÂÇ©LÄ¡ÂmV@ƯĢkÆm™ĊkVÅ¥LɃmÃXó°@„ĢbVŽóVæɱ@Ƨaġ„UV„ĠÇÈV¼UVÅ£wmbÂJÇwË‹a™XmǯKkkmŽƒbXšm¼V¼ǬŚ²¤ôŰÆƴôÌŤǪnɆӨ¼ɆLÆłUĊšxŎƞȘǔˎǬǪnƨŮǬö°»šġ„„ÞÜÆĸÒĊ„ǀbƾèôÈ@¼¯þŤĸƧ°VĀ¯b@lÈĊ‚šʠńÌ„ȘKǀŽֲॗţÿǕý@ÂʊǓƨóÆÑǖŃôw@΋ʈƆÅÈVVÄŠV„óĊÅ@ÞƒĬV@Þīš@°Ž„V@ĸĢƒ°XτƜĠ@ÈaÜ¥Åƅ‚™nğóĕVÄ¡Uůƿŋ—ĕƒa±V—UťÇğÑ"],encodeOffsets:[[101892,40821]]}},{type:"Feature",id:"6207",properties:{name:"张掖市",cp:[99.7998,38.7433],childNum:9},geometry:{type:"Polygon",coordinates:["@@ÈÒŎÒk„mLUÂŽlÂŽU„¯nV°šš@°ɜb„ÞĠaÈ»ĸl‚š„LVUÈ@ÄŠÂ@ýUm„@@ÂÆVĠ¯Þm„LƯÞƒ„ѰVVwšJ²»ÆԚVlŤÅV™¦ĉ°ĉĖċwÃJÂzVxll²IVVVþšX„¤źÂÂœV°¦„VÄŠ@ÆbÈmÇ”LĸÂĠ¯Ģaô¯ĸmÆÛUƒlÇĸk°ÂXyÄŠUÇ”V„ǩnmV»ƒa@ýnK°Ân@lÂ¥@»ż„Ċ¤m皃@£ČU@mƒmVkÞUƱ²¹°‚ĠwÂÅƑŃU¯™›V¯aÈÅšƒÇ»™ġn_°xÅŽKlxÂœklx„@Þw‚„„@Æm²b‚DzLlkšWXať¯ĊaœÑšK±w@wƒUÅçV±Uk™@@„¯š¯xƒU™±±UU°ÅxVxÅÔÅ°ó¯UÂæóbÃþƒ@ĉÈóUV‚Ux„„@ÂVÂŽUVÃwÅÈǎóVkk¯JÇÂkmmL@„™KÇx@bkš™@U°ķ²ó`ƒÂš™šmn¯°ƒUwlÃ…kUƒ`™¦ɛô™Žķz@ÂŽÃ…nÇ°U¼¯KmVk²ƒJƒ¼ÆÞķôš¤ULƒ@mnÄŸ`™šÇnUxÇ@Ûÿ™U@ƒƒkŻŽ@xÂ@mÂóJkŃ¥VÂŹĉóÒĉlċ°ķ„UÂƽ܃ÂÂ@›x"],encodeOffsets:[[99720,40090]]}},{type:"Feature",id:"6230",properties:{name:"甘å—è—æ—自治州",cp:[102.9199,34.6893],childNum:9},geometry:{type:"Polygon",coordinates:["@@Þš™nKlnšwXÂ¥WÃXk˜xÞUnƒ°aÄŠVnUUKlÂÞÂĶWXnĠ¥ô»„™@ÂnmVL@¤°™Vz„JšanU@aÆwna@k›ƒU¯šyX_›aĉb™ƒ„wĎXkWwÃ…aš¯VÂ¥mƒ¯ÂUƒƒI@ƒš@„mšb°aÈçšUš¥@»‚knwɜƇ°I°ÑÈmVU™¯Xa@w‚W@wšÂV¯Č¥l¯Uwnm@k˜aUaóKkk@™Ça™b@ÂŽÂÃ’Wa¯IÇxÛam¼™VUƒxÂÃ’l‚@zÃÒ¯bÃaĉVĉwDŽÂW›zÂJ™ÂmJn²mܯUƒ¯ĉ@ġ¤Åb@²nšmlƒ@@Ž„„U„ƒLVxšV™„U¼Ålma™b@ƒ°™lÂ@WIUƒ¯@mĪ@™™ó„™„@U›zÅ£yƒXÂÇU™ÇVUUVLkbWakVWmUbkkƒKUÂÆ»nƒ°Knk@aƒUVmšnk»l¯Ģ›lw@_kKVU@ƒnaƒ@lUk@¯¥mV@kmbÂW™b¯Åõa@mkU@ÂkƒÇŽkU@›`@™óó—bl¼Uxƒn„¼šlVȄx@blVkVVnƒ`XÈġÈ@ǃK£ÃJmUUnUÄ–mlU„mKUn™VÃ…aUw›Uĉ`¯n¯wW¼nxVŽ™š@bĉnƒ‚kIċŘkXUŽ±Ò™xšÈ@ÂŽX°`l„œV˜IȯĊV„ƒšVVan@VašUVażÂVmšblkÈW„ƒWIXa„alL@wVb„„V„¦lL@lĠ™n҄U‚nk‚šL@ÆÞkšÞšK‚bñþW¦Û„ċVƒ„ULUºkÈlÅŽUxÆxÞUUxšÒ‚x„@XbšL@lÆ@„ÒlXVln@„bm¼ƒJ@„Ån„šƒx@bnšĠm„xVXmbÈè@ŽĊ£ČW˜w"],encodeOffsets:[[105210,36349]]}},{type:"Feature",id:"6206",properties:{name:"æ­¦å¨å¸‚",cp:[103.0188,38.1061],childNum:4},geometry:{type:"Polygon",coordinates:["@@±¯ÂÂ¥@klwU»ƒƒÞÃmwÂKm¯™™ç@™kVÇUL¯lVÂUKġ„ġm@a@U„@X£°l°LŎÇ@aÅVÃw™ÔƒKUŽÅš„ÂWJ¯Âlm@ÂÛVWa™@klĉUmaƒLUanaƒ™ƒk¯J„™™±KkXóÜÅxƒ²Ç‚@„„nUÃ’ÄŠb°@™ÆkL™Ž™XÇÆ@xÃn—xWxţ„¯¤ƒI@Æn„ƒVV„VlU²Æè„V@x²x™L›ÒĉbŦ°Wb™Xklބš@l¤šXÄŠ`„wl@ĢÈŎm@bšnV‚Ubƒ„@șÆÛLƒèǚUÒŦlĸ™`°ĮʟÆǓbĉôϚĊƚĢnŤé΀ÑĸĀĊ¦„@@l°lœ¦Ȯ¦ɆÞĊKŤÂ™ĵĸů„»mÅÂyġ™ķŭ@Çɱȭ¯mƧUÄŠÄ·nÅŻ»UaU™˜ƛɞÃƨů"],encodeOffsets:[[106336,38543]]}},{type:"Feature",id:"6212",properties:{name:"陇å—市",cp:[105.304,33.5632],childNum:9},geometry:{type:"Polygon",coordinates:["@@šÈÞ@l`UÂmVƒ¼œŽ‚@nnÆwVlnVVa„LVƒÈ_‚ÿރ@n„a„xÆ@„lš_š@VxnK@llLnxmÈŎJnbUxšI°Žl@n¦‚lÈIlmX¥„k°@šk‚J„k²é˜@kÂlaUaVaU@@ÃnIWÂnmnx‚k„ºÞ„„aV™°„V@nw‚KšxôbÞ£šVšU„bšþšLn»mƒVw„IšJ°Ž@„nb@°°I„ġUkÇKVƒ™™@ů»lƒ„Lnmģ@anK@ÑÜÂnÂ@»mL@£™yk„UUmbUÞÃ@kyÇbó»™XUxƒWVzÂb±mÃbXaƒwUamL¯»@wUKVwm¯ĵJ°ÅUWVk„KVk°wÈVšÂVуlUšƒ¥šÂkmVamknƒUw¯¯ƒbċ¥ÅKƒk™Kk„™VÄ‹Vk£kKVw‚Ñ„a@kóyÛ¯ÇVk™ów›š—XťǼów™Ž¯U±‚k„ƒ@Âx›IĉÒÅVmÈnšÜ@n°„bUbÃV‚ŽUnnJ¯Į@‚m¦nV܃@„„L°JXb‚Ñ@šaÈb@šllôLVb—b@lmnVxk°ċ¦U°™Ž@xÂX@xWbš°UVÇn¯Ò¯JɛƈmxÂl@¼"],encodeOffsets:[[106527,34943]]}},{type:"Feature",id:"6210",properties:{name:"庆阳市",cp:[107.5342,36.2],childNum:8},geometry:{type:"Polygon",coordinates:["@@kw‚ĉ—»VamƒƒV¯wƒIóVkl¯Â™Km™VůÃWkL@bÃKŦ@Ž™„@š™LÂx›@Âb@l™a@km@@l¯nm@UaÃ…@ƒ„óWUXm¥™nƒwÂ`@UUxķôÇ°ğ¦@„VJš_n‚‚IVÂŽnalxkX„JWn¯šnVƒLšxl¤nnVbklVX@xnxmV@bUK@nm@@xƒV—°±aÃ…nƒŽkUWnUaƒx@m™n@ƒ¯LƒššmUÄ€lU@lÂV@blLUblxklkIÇx¯°‚UXbšaVÂŽUnšV@°‚LUlnbšX@`°ÂnVmbnÆmÂV‚kLmK™¦UÂŽ@X„y@kl@U„°K@¼XbW„ƒš@b„WnLVa„VšƒVz@xlVČ¥lbUxÞÂlV„U@nÆWôn²™VJlU„Ƨ„LnmÃœLXa˜n@mÂœw@wlUlV²mšblwšVȃlLÞ„±@ÂlVnUlxnkma@mškšJ@kXV‚U@mn@š¼VXUƒVƒlLnmVbôaVÂnWV»ÈUl°È¯ÆInݮU@kk»mKkÂÆġk¯@»mƒk—¯@óÇlÇ@—Vykkl™Uml¯Þ™@w"],encodeOffsets:[[111229,36383]]}},{type:"Feature",id:"6204",properties:{name:"白银市",cp:[104.8645,36.5076],childNum:6},geometry:{type:"Polygon",coordinates:["@@VKUȚl@š谚nŽ‚LnxÃބ„V¼kx@l‚¦²°ĊóĠ„™Ċ»š@ÈxšaÄŠxlwÈVŤa@¯²aÇ£ƒJk£lƒnUÞ@°šô™@y„wl»lIX¥ǪÂnw@ÑÞWla„ÅlL@ƒUwĉakƒlÂ@ƒš¯mwna°J„ÂV¯nUVÓÞÑm£²óWaUĂ@óÃUçV»ÈkkW@¯‚xV@XÂlK@wX@Vmm_@wÈÙKU¯ÇwVwÃ…K¯VƒkƒJ™™™XkWVaƒImŽ¯Uk„ÇlVšœĀV°mxóšk„@¼ó„WxĉÜU@Ub‚zÛJÇkÂ@‚ÆnVlԙ@kŽ„x™ô@ĬWL¯ƒƒK@aÛImm™@ƒIUaƒ@™™UŽÇêU¤ÂÂVÒÇx¯ÒV„šš™lk@Wbĉ¦UbkWV_‚y¯Lƒaó„kÂŽ@b@nmbkx„°"],encodeOffsets:[[106077,37885]]}},{type:"Feature",id:"6211",properties:{name:"定西市",cp:[104.5569,35.0848],childNum:7},geometry:{type:"Polygon",coordinates:["@@„a‚V²wVJV_@„LlanÃ…llŦçÜӚ_šlnƒWaôk„xUš„bmV@ÂÈ°lèšnk°l¦„`@nnL‚@ÈlÃœIÂyVaV@ĊÛXwôƒ@»lƒô™nwU¯›ÿU™Èklƒ°Vn„JUblXšWšš„I„l°U„ƒVƒš—@aVVVmnL@„lƒ„UUw‚mkƒš£„bVÂ¥VUVwۂƒÂlaÂÇÃރmk£ƒLUy¯L@ÂWlkKW_XaWƒ—mƒ„ġU@a™k™‚ƒakXkmVwmÂŹVƒU™b™WƒónÂmwnWW£„KÈnV¥ƒ¥„ƒÆ_k™lW„bU¯„V°aôbnaVwmaÅInÇmwkK@kmLUw™@™`ƒkÃ…@ƒwƒb@mÄÂĀÇ`U„ƒKUbmUUkÃ…xmmÂ@›Â„»nUVÂk_Ã@™Ç™¦™VÇè¯b™aƒn™@@„„JV„°Žn„U¦™°ÆbXxWl„êƒxš„ĊaÂœbW`™zV°œ„@lmbÃ…x@bmV™bƒI™`™¦@Ã’UVUI@ƃL@bš¼@ššŽ@„šlmxnL„°ULƒŽƒÞğޛ°kLUŽƒL™°™xVŽ„n„KVƒl@šzX@"],encodeOffsets:[[106122,36794]]}},{type:"Feature",id:"6205",properties:{name:"天水市",cp:[105.6445,34.6289],childNum:6},geometry:{type:"Polygon",coordinates:["@@UyÈÂVƒVUnn@ƒVU„`UblzšJnk‚@Vb„KU„°l„wš„„W°„nkVŽ‚UÈlš£°V@Ân¥šV„kl™kU˜±U„ƒn™ƒÂlw¯UkwmKUÂlmkUmnkym@Ã…Â@U„mWÂÈU°l°anÂlJškUKlU„¯Èm@kmWV»kkÃLUWUx±b™@¯ma@ƒ¯Â™IƒJUxn„m¼™K™ýƒa™V™Uäóa™wÂLmxU@¯ƒUšƒbùÂlmwmnXÂŽmJ@ÞV@UbVbkblŽ—@±êƒlÂI™l¯@ƒlW¦knÇJÂkmÂ¥k@¯Â™Jmbóa¯bƒUV°ƒakXlšÅ`ƒ„„¦U¦ÇmƒLX¤mXnxm‚„ôšXša„VźUnÂŽUxlnlW„bšÂšl@bÄ¢V„ƒ˜nX„WbX`lLXk@Ž°KVz„Kl¤„nÞÂÈkb„‚ÜÂ"],encodeOffsets:[[108180,35984]]}},{type:"Feature",id:"6201",properties:{name:"兰州市",cp:[103.5901,36.3043],childNum:5},geometry:{type:"MultiPolygon",coordinates:[["@@lW²LššƒŽ°I„l„šmbVb„KnbÄŠVlkš@XbÃœU@ÂŽkn°‚XIƒÂƙV„LšÓÞxÅŽUlÂôƒ„b°KÂzU`lXVaÄŠÂ¥Xal@šk™™Uƒ°ÑÈwUтÂV£ÈéVšš„@Vb„Jš@nnÃœJ@b„L°„XK@īšóƒwlš@kÓmUÂÃ…mK@mƒ_kÂ¥l¯™mkçǯ@ÂnUƒaV™ƒwólXbm„™k™`ÛÔťèkkmÆkbƒK@ÂU`UI±xÂUƒbWlX„mbVbÅÒólkƒƒIWJkšƒ@ƒz—KŻ¼™@™xUx󎃄¯LWb@ŽÅ҄„±¦U`nbťĀUšVb„LšŽ„U"],["@@ƒ¯lwna@mÅȯK¯kW¤ƒ@@V@bÄ¢nĢƒVLU‚°k"]],encodeOffsets:[[[105188,37649]],[[106077,37885]]]}},{type:"Feature",id:"6208",properties:{name:"平凉市",cp:[107.0728,35.321],childNum:7},geometry:{type:"Polygon",coordinates:["@@ÆLUxÈxV°šLÇÞ@xn`Ãœ@XÂ@nĊŽÆwnJmwUx‚aUkšw@V@w„aVmlLXÃl@X‚VÄ¢mV°@nl@UUUWK@w„ÿVI²Òlmš@nÃĊýVV@nšJ°„„šUÅ‚m@kÂV¼nK›ĢȤôK„blÂnKllVk²aĠ¥È¯ĸóVw@V‚_„xšmn¦VWôX„ƒÆ@Vbn@°m@kn@@lšb@k‚aÂœ@‚wšK@™šƒ@ÂÂUlKVaƒWX™W²¹lӄw@_°›n@@_lKÃ…ÂÄ·W™Â@ÂŽmLUWƒn™»Û@›lÂ_Ç`ƒÂÛmm°ÅbWb@š—VWbƒUUÂÂKDŽÅaÄ¡lmkÂUÄ¡lƒ»—Lƒl™Um¦@Ž¯U™¤ÇkÂVUÂml¯ƒƒX™ƒƒx¯kVƒƒLUaÂ@ml™IkyVaƒ_UV@„mmUVU„ÇŽVzUxUVU¦ƒa™¤l„ÂnVxƒVk„@ƒmKUnUU@b™˜U„ƒ„","@@@ŽżÂ@™mlkƒġk"],encodeOffsets:[[107877,36338],[108439,36265]]}},{type:"Feature",id:"6229",properties:{name:"临å¤å›žæ—自治州",cp:[103.2715,35.5737],childNum:8},geometry:{type:"Polygon",coordinates:["@@š@ż»˜L„y„@l™XI„Jl„ôkÆÑUanaWƒXkW@™yk@U„ƒLƒmUšwš¯„KVÂlKœ¯ĠÄÄÂVKƒ¯mKnw™k@ĪÂ@™™»@a„K@Ã…VJVU@њ¥š_Uy¯š@£UKmn@‚ƒšó¼ğ¦WmĵXÃÂŽkÂŽVLmVĉU¯bm„ÃV—wWlXÞW¦™xkmmL™šÃŽœ„±U@Vގ™š@„ÅÈW°X„ܼƨyUÄ®nÂŽWÂŽnXÃxUx°lVÂXJlÂôV"],encodeOffsets:[[105548,37075]]}},{type:"Feature",id:"6203",properties:{name:"金昌市",cp:[102.074,38.5126],childNum:2},geometry:{type:"Polygon",coordinates:["@@šĢȼ™„Çł°bÂœU°šV‚ƒń‚ÆǖŰnšÆ„ÅĬǔaʠůĭš_kķÆ¥VÑș„çÜKšÅ@DŽƒVaU™m@aÅnġÇk@ƒxĉ_™Wk£™@ÃıKÂȱaÃ…nƒ@ƒÃxƒ@kw›lkwÅL¯wm`"],encodeOffsets:[[103849,38970]]}},{type:"Feature",id:"6202",properties:{name:"嘉峪关市",cp:[98.1738,39.8035],childNum:1},geometry:{type:"Polygon",coordinates:["@@llÄŠx„¦šl™¦š„kVVnšJVbÇ–V„kôV˜a„bnaWw„UXmmamUXkWKůXm°™™»ĉÂÇ@UVƒK™ķkǼğb"],encodeOffsets:[[100182,40664]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/guang_dong_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"4418",properties:{name:"清远市",cp:[112.9175,24.3292],childNum:8},geometry:{type:"Polygon",coordinates:["@@lǯÂkÿƒaV¯™ÂVaÈU„¥ÆDŽIlxšmnb‚UÂœxl™„Uôl°kš„„Wl„š@ô™VwUanUl@„xVkšaX¥‚kU»„aš¯±Â@kka@ƒUwmUkwƒJk™˜Â„±k@ƒ™™L@ÂÃWUwV×xÇU¯ŽÇX@m™Åƒ@@yĉ£VmUwȗ»ÇšUn„lUnWU¯`Ukƒ@@„™x„Ž@bÇxX¼ƒVVš¯LšĀk‚ÃLƒ„¯@VŽƒĀ¯lnÄŠW¦kVÇôkUDŽUK@ţ™U@a™™ó܃UU»ƒ@™¦k@Vx„KVb„n‚š@„Âƙ„l„@xšƒbWšnlU„lxÈlV„È°Æ„@¼™„@x„šWxœŎ‚V„šK°„š¥ššnĮkÅŽ@ÈÑm™„K@¥šk@™ô@„nôV"],encodeOffsets:[[115707,25527]]}},{type:"Feature",id:"4402",properties:{name:"韶关市",cp:[113.7964,24.7028],childNum:8},geometry:{type:"Polygon",coordinates:["@@W™Xk±Ñ@ƒUw™mUwĉwlmn@Æwn£mÂkIš¥ÇÅ@¥šaƒón£nWWwš£V`Þ@šÂnVml@xô¼„IV¥ƒkUmkamUkVWwÛ»móƒ£UVÃ…Kmn@x™@kbmm¯a™Xka›VĉaUbò—‚lš„IlxnVVx@„lb@l²Â™°ƒbV¼ÂlW¦™bUlƒwk@mVVbUxóš™@kƒƒX™ƒ¯lókƒVkš›wÂVma™nkwƒJÅȃ¦ÇVUbšŽU°„blĀ°ŽkÈ@x™¦Æܙ°@„°„¦óa™VUôlUlbXÂl@nÂÃœV„„nKlÂŽnIVÞ°Wš„°U@bnm@¥šIVƒ²Ulƒ°VnalzXyl_Vyƒ¦lƒœLlxš„@ŽÞbšKm„knVWanwĄVwČº˜@n_ÞV„aVÂŽÃœIÂœl@„˜KȚ„ÂVJ@aš£È@˜™@ÂÂkm™„aV¯W@_ƒa¯KmbkÇkLmwƒ@Ã…Â¥"],encodeOffsets:[[117147,25549]]}},{type:"Feature",id:"4408",properties:{name:"湛江市",cp:[110.3577,20.9894],childNum:6},geometry:{type:"Polygon",coordinates:["@@@ƒkXĪ@a„UUÄ‹lk„Jƒk„™@wVJXUWk°W@ÂnKnwlUlš²ƒ„blU@‚lI„l@„XbW„šxnm@ÂlW@w„wU‚JX¯VU°`ŎóˋkÃÃkÃ…@ÇmğÈřmw™aĵV›xUÛ»°™ĠǷnýmóX¥ɅĵÒÇ@°²ĊUĖ±ĮU¤Ç°™Ā¯ÉnżUĊĊĬVÂ@脎@ԃÒU¼l¤nƒĠb„êVĠ°ÂÈy„zVaV‚nUÆL„ašbVl„wÆ@"],encodeOffsets:[[113040,22416]]}},{type:"Feature",id:"4414",properties:{name:"梅州市",cp:[116.1255,24.1534],childNum:8},geometry:{type:"Polygon",coordinates:["@@„‚nԚlW¼Âx‚¦@lÂœVl™lLkè„a@zš¤ƒĖ„¼UxlnUKUbÃlU¼lb@„Vx„V„klJÈwV¯š@Ä lÛĖšnƒbkšÆźÞƒUÈôklmšL„¥‚LÂœW˜„„™nKUkVa°V„x@IVV@x°bUk„a™a@mV@„Â@y„w‚L„ÑUwVUšV„‚„U‚bÞVVann‚@XwÇÿš¯²aVamkXaÆ»@»nw@¥›UXaƒÂkbWa¯KUw@Â¥m@kwmLU»UU™J@kmU@UUWUƒ@ƒyƒanwmçÛl¯ÂƒŽ¯UƒÂmKUmƒwVÂkmÃXÂbW@XWÃbƒk¯@±‚Âw@»U@W¯Å@ƒÂÇ¥UƒU@ƒƒ™IU™ƒakJƒĀ„ꃰšþƒXkamÂŽ@Žƒ_ÂJ°Âm‚@X"],encodeOffsets:[[118125,24419]]}},{type:"Feature",id:"4416",properties:{name:"æ²³æºå¸‚",cp:[114.917,23.9722],childNum:6},geometry:{type:"Polygon",coordinates:["@@°VlmX¹laĢÒlm„@„„šVš£‚‚@¦ĢklynÂn¼lW°z„W„„°ÂVbÈV@lÆbnn‚JškX„šVÆašÅ„W@™ƒUUw@ƒkaV»ÞkVaVLkmVwƒ»„ĕ™£@yƒblçkKkš›U@kÂ¥‚wX»™kmӃÂ@Wn¯‚I„`@ÂnÂlb„W™ý„¯ƒé„ÿlI@™XUmWUwƒ@@ÂUJU„Ç„mKUV@x™„ţk¯Â¯LWƒƒnUxÂK@ű»VwÂa¯š@¤WX@ŽÛ¦@¤ÇIȼWxXŽƒ@Wx—w›ŽUnVbÅèmVÂa±²ÂUWl@ÂŽk„lȄ¤nôܼXxlUnVlbVn„lU¦ƒJó»@wnkmU™‚Ã@U_™¤XxmXm¤„ô™b@¦Èƙ¦lJnÂ"],encodeOffsets:[[117057,25167]]}},{type:"Feature",id:"4412",properties:{name:"肇庆市",cp:[112.1265,23.5822],childNum:7},geometry:{type:"Polygon",coordinates:["@@l@š¥„@V¼„Vôۚš@bšV@ŤVLȃlVÈólUXÂ¥mĉ°k„ÿU°@„ƒÞKl™ÿ°KU™„UW»Èw@aƒÂšw@ƒ„@nm@wݣkÓVUVn„Kš™k¥™£Vamƒ@nkKkbÆǫma—kmLU¥™UmƒÛwmVU™mUƒJ—ÂÇaUxÇIn`mb@Þ¯b@„nJ@nl„U‚V„lVU„ÂL›W¯—Û`Ç_¯`mš¯I™bĉWÄ‹zÂx±J™xšÂ¯ÆUƒƒ_k@™šƒJ@Umb„šXôlLš˜n¦@¼ĊxlUXŽ˜xUbÂL‚Ġ„UnVÄŠwlšUš„b@ÂlW„X„‚m²Â˜@ÞWxXš‚Unb"],encodeOffsets:[[114627,24818]]}},{type:"Feature",id:"4413",properties:{name:"惠州市",cp:[114.6204,23.1647],childNum:4},geometry:{type:"Polygon",coordinates:["@@lbšW°bnnlaš@@wnmÆLVUkÇlƒ@ÂXk‚V²±‚bnUÆçUaVmœ˜xXw„@WÂXwÇ»ÈJ@£Ü¥@ÂXW@£°™‚bUx²¼@ƂLVw„mX„°K°ÂŤlšƒ@wVUnLȃVƒVIky±wkƒKU¯ƒÂÃ…kƒÂ™XġÑۃlwUwlm@m„ÂnKWašÅÂm›¯ÂóÇmÄŸb¯alĉUwÄ·bmb@lÞÒVn—šmĀŹ@VŽƒbVÂŽUnmakLm`@xĉkklVÔVJVn—lV„UnmJmaÂLUbl‚™zmÂŽkL™a™‚Å@@zš‚V¦UÂŽV²kJ„nÃœU@˜VXUÂŽÂL@„lJƒL@bäUnVŽ—b@xVnlK²„Vx°V„xlI„lkVl²k¤@n"],encodeOffsets:[[116776,24492]]}},{type:"Feature",id:"4409",properties:{name:"茂å市",cp:[111.0059,22.0221],childNum:5},geometry:{type:"Polygon",coordinates:["@@‚LnÇlk„KnkÆL„ƒUm™ÈxlUÂœJló°n@ššanŽš„„a@ƒ˜@X_@mÃóóU@a™aU¯mL¯ƒƒÂkÂV¯™ÇVwkw@ÂV±Ŏ£@™™Â@šalw±Vk@m„Åm¯™ÿŃƧIÇ`Åô¯_UVW°ÂIV‚ƒx@xkX@ÂŽmn™wXƒWa@ƒƒkkJ@ÂkVƒa±„k™kVmxmL@‚¯XXlWVUI@xƒš„lƒIklVȃV@b„šlW@„@nUxVbÂlVxkôlx™Ân„‚y„šnIƻư„aXwlK„bVnƒŽXb‚L„¤„k‚L—èƒVV¼ƒŽ²IlÄ VX„ynz°KVx°@VlÂœLlblKœš"],encodeOffsets:[[113761,23237]]}},{type:"Feature",id:"4407",properties:{name:"江门市",cp:[112.6318,22.1484],childNum:5},geometry:{type:"Polygon",coordinates:["@@lUXx°JWnnƚXVš„W„X@„šºVLV¯nU‚Vnb™ô„x‚aXmW™XIšŽUb°xlK„Âl¯œK˜xXÞ°ŽšX鴆@„ĉÞÂU™‚çš»nóƒVma—x‚¯UÃ…U¥ï@ƒƒç@È™@çĉÅUmU籃ĉKÃxÃ_Ã…Jƒk¯»ó¯nmèkǀšŽWxœ¼mnUÜġ°@¦Â@ƒxƒLkŽÇaVnUxV„™šVlnIlbnÆÆKX¦"],encodeOffsets:[[114852,22928]]}},{type:"Feature",id:"4417",properties:{name:"阳江市",cp:[111.8298,22.0715],childNum:4},geometry:{type:"Polygon",coordinates:["@@°„nKV°šb@bôVÞô@n„VlÒôÆUnlnn@lmkmVkƒaÈkÆƄ™k¥‚ÅÞ»ÆKXkW¥ÅLmÃ…kamJUkš™UƒVwUmÈbl„K„w‚@@¥Ģ¯VÛnm›»Xw™Âlƿ™@kbW™—aʵ@óL›l¯Âƽ@™ƒƒLn°ƒÆ@nUl‚²kx™b@‚šÂ@šÅ¤U²@ÂŽlxUxšÈU°lŽ„Â"],encodeOffsets:[[114053,22782]]}},{type:"Feature",id:"4453",properties:{name:"云浮市",cp:[111.7859,22.8516],childNum:5},geometry:{type:"Polygon",coordinates:["@@@V„Iš™l@„`V„°Å™Âšw²I‚wÄŒyÄŠXša°Jn™°_È`Ãœ_°˜œX‚KVƒkUUƒVÂkƒ@mmI@ƒ°a@Ãnam_ÈJVwlĉX@„šlUšómaÂUmVU°UK™¹@ƒƒWƒXU™™WmÃ…Xm¯IWwkVWlÃ…LüÂÆl¦ƒšÅÅÇl„bUllnknm@kmVmóÅkуUW`—@@„ƒb™ƒm™b@™¯mkô›IkVÇwnš„VƒÂÃ…KmlƒLklmÈÂKƒÂšVÄŠK°²„`n˜¤n„U„bWl„xVx™LUx@°nXm`VÂklVxmnnx"],encodeOffsets:[[114053,23873]]}},{type:"Feature",id:"4401",properties:{name:"广州市",cp:[113.5107,23.2196],childNum:13},geometry:{type:"Polygon",coordinates:["@@Ș¼VxUnĊ¤@z„@šÆ@nÈW°ÂÈV˜w„ŽUÞVxÞX@ŽšK„šl@ބVaÄŠbÂœU@ml£k±lUƒkkJƒw¯UUw±ƒkLUm@w˜aUÂVmÞ£@a„KkI@ƒ‚KVÂUW@—ÛVƒmlIU±VÂU¥™Â@yÄŸzƧǃƒšƽĠřšÅnī±mÂ@ƒ²¯lƒ°@nÃÆóÂUll@XnÃVU¦mVV°—„V¼™Jƒn„b@°mbn„ƒ‚@²¯‚¯wVwƒ@@nmxX¤¯L@ÂŽVLU„m@@l"],encodeOffsets:[[115673,24019]]}},{type:"Feature",id:"4415",properties:{name:"汕尾市",cp:[115.5762,23.0438],childNum:4},geometry:{type:"Polygon",coordinates:["@@@‚„@VxnXWV@š„bVššJ„„V@ÞÅU¥Ċxš£UWU‚wÃ…UUÂ¥WVUkĊÇnkV`°LV™„wƒƒnU@™„ƒlbĊ¯„Vnalšš@@çkUÃ¥ġaó¯ÅaÃ…LŻÆUýmy¯Âó@ĉÆó„ȯw™ÆXbmLƒ‚@nknVxkx܄ĢҚW„ÂÆl„ÂV°„Ll‚²xlz"],encodeOffsets:[[118193,23806]]}},{type:"Feature",id:"4452",properties:{name:"æ­é˜³å¸‚",cp:[116.1255,23.313],childNum:5},geometry:{type:"Polygon",coordinates:["@@V„Ȧ„ÂÆ@X°V@@¼‚x²Â°@„lÞaWXX@‚aÞWlnUŽ„xVnnL„‚°V„Â@k‚mÄ¢ÂlÂ@„ak™@mlk°aXƒ±„nwm±™²¯JV²Â@ƒwW˜—_mƒa„ÂV»ƒU@m¯ĉUф™šJl™„ašbVn„lĸLlƅÛDZwÃ@ĉxóÂ@è™@k™mbƒUĉ°kaƒ„@šmV„„ƒxUš¯KU_mlĉÈVlXUV¦ÆVÂxVÂŽVX™¤ĉwV¦ÃÆ"],encodeOffsets:[[118384,24036]]}},{type:"Feature",id:"4404",properties:{name:"ç æµ·å¸‚",cp:[113.7305,22.1155],childNum:1},geometry:{type:"Polygon",coordinates:["@@„è@„Þ°V¦VÆ°˜wnb„UÆ»nçÆÂ@Ânxܤ²llU°VnÈJÞ°UôéšķUklƒô£VVËŒKÞV°£n¥ƒ£ȗ™Ãy¯¯mÃ…kw¯bÇĔğ@Ãn¯ĊƒVÄŸÂÅÅŻƒķJ@Èš","@@X¯kmèVbnJ‚™"],encodeOffsets:[[115774,22602],[116325,22697]]}},{type:"Feature",id:"4406",properties:{name:"佛山市",cp:[112.8955,23.1097],childNum:1},geometry:{type:"Polygon",coordinates:["@@Èb˜Ž„InVVšnUÃœxn„šVV¦nK˜lnbÅǬlalL@mn„Ubš¤l¦™šƒLUmUVlԜ¤@xmnVl°_XVVmƒkVmș@kn@VƒUK@°KW£nw@m„@Ux°x°Â@±„Âmƒna@¯ƒa„mšIU»˜ƒU¯nUV¥ÞUWmk@Vk¯Â™Ukn݄ÂWÃĊÛ@Ǧ™W¯ÂW×w›Lk°ƒÂkL¯wVa™ÂWJXšWnÂbƒwkVĪW@kÄŠ"],encodeOffsets:[[115088,23316]]}},{type:"Feature",id:"4451",properties:{name:"潮州市",cp:[116.7847,23.8293],childNum:3},geometry:{type:"Polygon",coordinates:["@@°ŽÜknèmx„b„z„@V‚VX@VnV@lšIVVV¼nKlxn@@¦Vx°LXbla„ŽWbÂœV°£¯™WÂ@ÂnW@™‚aUñVÂÂœwWš»@¥ŤÅUÃÇ“ÃóV@ńǎkUVmƒIUwÃ…VWÇX¹›Â—@W„¯bkl@nlšƒb@‚kÂÄ¡ÂŽÂn@l"],encodeOffsets:[[119161,24306]]}},{type:"Feature",id:"4405",properties:{name:"汕头市",cp:[117.1692,23.3405],childNum:2},geometry:{type:"Polygon",coordinates:["@@‚@U±°Iš±n²mx²ƒ˜@ÂœÂWºXÈÆUVx„JUnlVÈÂ@ŃôUǔÞVçn»VyĢÛVm@»kaÃUǼóšÛÈķKÄ‹Â¥X„¥WwÄŸk™ƒ¯@ƒwÄ·KƒkUm™aƒbkš™IƒšVÒ°Ċ@n„VU¼ƒ‚„bn˜`X—„x"],encodeOffsets:[[119251,24059]]}},{type:"Feature",id:"4403",properties:{name:"深圳市",cp:[114.5435,22.5439],childNum:1},geometry:{type:"Polygon",coordinates:["@@ÞLš„@xšbV„šVšK°™X°Kô¥Vw@anU„èƒÂš‚lkÄŠl@wn_lKnbVmU„aUÂź@nÿ˜™UmÃѯUƒbk„@ÆkxÅ»@™aÇX—wƒJƒƒ¯LÄ·ÃUĕ™ó™ĸóêWº@b²nmĬ™Æ"],encodeOffsets:[[116404,23265]]}},{type:"Feature",id:"4419",properties:{name:"东莞市",cp:[113.8953,22.901],childNum:1},geometry:{type:"Polygon",coordinates:["@@ÅŽ@šÂšblKnšykÂVa‚KnbnIVmUƒ˜kUmUIUә„ÂčmV@bUxó¦¯LW‚¯š™L™UUĪa@w™ƒÃKğŚ™ƾ„„ƨÈĠy"],encodeOffsets:[[116573,23670]]}},{type:"Feature",id:"4420",properties:{name:"中山市",cp:[113.4229,22.478],childNum:1},geometry:{type:"Polygon",coordinates:["@@‚XœÒlmšV°ÂôÂÞÅ@m„¯°k„±‚@@aX¹¯VÃÂÇIUmV¯kk‚±Û£mw@‚ÅÂmèżmô™¼ÂèVš"],encodeOffsets:[[115887,23209]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/guang_xi_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"4510",properties:{name:"百色市",cp:[106.6003,23.9227],childNum:12},geometry:{type:"Polygon",coordinates:["@@lklWXL@VšI‚l@XnJn@VUUalÂk@mK@kny@UlU@a°™„ƒUU@VmaU@Ua@UWwÂ@ƒn@KmLÂm@alkšmnI‚m@an@VIUamWÃ…ImwU@@a@K„X@JVL„UVmUaVkUa@m„@@Ulmkk°ƒUaVUlKXbVwVIkaVmUk@KVk@a„aW¯m@w„¥laÂœX@KmaškVmnUl@nxVKšInU@yVaVIV@na°KlxX@@_lmXšUV`VIV™V@„Ân@lšbn@@WUkValK@²yl@„„VUV@@K°L@KU@@UVaXIVVV@naVkVa@K@UUK@UUa™LWa—w@m@K@UVÂVƒ@mVÂUUVKnL„mVL„K‚bVK@UUIk›mI@mUIVK@IUK@VkLƒ@WU@mÂU@WmUk@ƒI@VƒJk@WwX_@amK@UUWkIƒ„ƒK@LVbÂ@mVmakL@J@bU@Ux@xƒbmI@`ƒIÂwm@UbmKUaÂUWa¯UkJWV@XƒJUU¯LUmV@ma@kkamKÂwƒLUUmWVkkm@aVUUkVKnVVUmÂXK@UW@km@Ukkm@@W@U™kUy@I@aUUmbƒ¤U@kUmL@bmJU@Ua@wkLWWkL@Uƒ@VaU@ƒLUakKWbkUWVkKkLVLUV@JVbƒz@Vƒ„Â@ƒVmUU@kVmK¯@VƒU_™VWakVmIUKUaU@@bml@XU@@V@LmKUV„mVUKƒÂƒKƒbkaUXƒKUL@x@V@l@„mxU¦„V@ÂŽlL@V@Ln@@VV@„nlKUaV@nLUbmJnL@VWLkbmV„@@L„W‚„XLlx„VVIVV@x@V²blUVm„LVUÂœK@kWWXUlV@Xl`„LX„l@@VšŽƒn@VnbVš@lVÂUVUÈVbš@@`UXU`l@@XUVm@kš@xmVknUJVXUbmKULmbÂx@VlJ@LVbkKUbVLÇUUVƒUVmU@VaUkUKƒVUwmLkUUVVlƒbka™XmwƒKUšVVU@@ÂÂV±Uk@VWUUm»XamU™bƒKk™`ƒ„™U@UnWW_kKmbUVUVmnUV@„nJVUlšUbU@UV@n@JmI@VmbnVUXlx¯ŽkKmnVV@L@V™bkV™Umm™@Ub¯LmlÂUƒL@VWLkmkLmmn£WmnKU_mW™š™bnbmxƒ@U¦UJU„@Xmlk¦@‚mnUUm@@Jn@lV„ÔVJnIVW„I@a„ƒÆK@I@aVK„IlŽÞnnl@nl`nbÆX²l@xV„@llbVn²ŽVVl@nn„V@IlW@Un@@kVa°KšnÈmVaVÂXUlaVƒÈU„VlwôUlynIVašan@lVXb‚Iš@nÂ¥la@Kš_n‚@bÆx@XnJV„nKVz@`VXVšU`@bƒ¦UV@VšIlx„UnV‚K„XÈbšVllšbVbnVn@"],encodeOffsets:[[109126,25684]]}},{type:"Feature",id:"4512",properties:{name:"河池市",cp:[107.8638,24.5819],childNum:11},geometry:{type:"Polygon",coordinates:["@@lLVl„bVV@nXVlI@JVX„mšn„W°b„IVV@‚ln„@nalVUb„nW‚@ÂkVkÃ’lbVKn²°bUÂŽlV²@˜X@`nb„aUI@ƒ°wlU@aXJVI@aVK@wUamIXm‚@XUV@@bV@Vm„ImÂnUUwVaVKXU‚nVK@akƒVwV@nL@UV`n@@X‚lnIUJl@X¦˜V@aUIVm@anƒV@UwnL@VlbVL@KVVXUWƒ„wUUVUka@UVJnUlbnalbVVn@°„„LV`Þ@šXVxV@@bVlUVVbXnWlXnmlš@XXWVXJmbUI@V„llUVkn@@VWV@Vnb„@VXUJVnn`lLVk„a„»lVšLnw@WV@lInw@WnU@U@m‚knUVó„K‚wUmUXUƒU@@wVJVIl@XKVVVbVI„J@Un@lÂŽVLnm„b@U@Ul@nUš°VUVJnnVJV@„Â@mVU@ƒ@wkUVwkKWk™yUUkU@alkÈ@lJ@x„Ilƒ@UUWVkUw@Kn@@kmaƒVUl™UUL™ÇƒUUKl@UUmL@aXU@mlUUwmKÂkUUVKVUƒaƒKUÂnK@U@Vl@XUWU„KlwX@šb@K‚@XkV@UwWJka@aUwmV@U™@@U@wUm@»kLWVkIWÂŽXnmV@VkbmKƒLUbk™Va@aƒaÂ@@aVU@aVak£@ıUkVU¯V™UUƒJVƒUIƒ@kxmUmWUbÂL›w@K@aU@@aVU@ÂÂKma@aka@_VWkk@UWVUKULWKULUš@KUnƒwVaUKƒxU@UÂmaƒL—m@kVmVa@UkƒmI@ƒ@KmIkxU@@K™U@mmakI@VƒLkmWkkJ™_U‚@V@L@n˜xXbšKVb@VVL@V@LUbUlmbU@UUWJUb@VV@@L¯K@LU@UVƒƒk@±z@‚kLUbVl@Xm@™akÂm@ƒÂU@UšUJU_™VWÂŽkn@`W@kw¯LmbU@UJUb@zmV™JULmwk@mVUn™lnb@L›Wkbƒ¦@x°nXŽƒb@bUl@LVlUnlbUJUxWakLUVVb¯„llkn@Vƒ@@nVbUlVbUnƒVUK@IƒW@L@bV@nxÆJnXVbUJm@@bÂnmJ™nkl@b‚nnK@L„m‚@Xx@VVbV@nb@UVVƒ„¯š@bkV@Vmz@lnLl@kÂŽVbUVm@mI@WÂk™J@UWKkXkl"],encodeOffsets:[[109126,25684]]}},{type:"Feature",id:"4503",properties:{name:"桂林市",cp:[110.5554,25.318],childNum:13},geometry:{type:"Polygon",coordinates:["@@nU@J‚X@`XLm¦VbÂ`lšVXXWš@VblÄŒnVšŽlanLnmVLšK@_VaĴ@kUa„@VmVb„aV@XVVzlVVK@knKVmX£VKšLlbnš@b@llL@xĊôXaV@°È@¤„bn„V@@Wl_„V„U@W„nVamw„wVbn@„K‚VšLX@VmVÂUxlV@šnVV_nK@m‚I@Wn@@IšUÄŠ@@wVWX@@I°VVm@wmU@m@IUƒV™kƒlkÂUmmkÃ…V@@aV@@Wn_UKla@kšaV„šlVanb@k„@@KlVn@@aV@nIWW™UUaVU@™kKmwU@UImKk@UU@w@W@‚™kÂ@™UkWƒ@mk_W@Ua@a™ƒƒ@—¯ƒmV£@mƒUUam@—kWakƒVama@UUm@Ânw@alaUmnUlVlIÂœV‚™šLVyk£Vm@k@UUJkƒK@kmKUw™KkÂWK@UXImyVwnI@m‚ƒkUlkUKkUVmƒw@kkJWUÈm@_k@@aƒaW@U„UJUwU@@IWKkƒmUUV@nVl@bVb@bU‚UXƒakw@ƒWUkbkKƒbm@™xUlkLm@@wmKUX@‚™ÂUaVW™XVmU@@UUUƒxkmWXkKkUWaUaUb™L@`UL@LV`UXmK@VmakLVbkL‚xUJUIVbUVVb¯KƒV@Xnl@ÂlVXbmÃ’nV@L@VWKkVUIWJkIƒŽUamUUbm@U„kU@JUbW@X„WxUam@kbVVUnUJmUUV@bƒU@UUV™@ƒVk@ƒbƒmULV¦U@V„U`VLUL@xVbn@UJ@nWJXXVÂŽVV@bkxVbUx‚Lšš@x„¦@šU‚lXUVVlULV@@šnÂŽU„ƒb@xl„nJVnlVknUlVÂUbmÂŽU@ƒbVš„x"],encodeOffsets:[[112399,26500]]}},{type:"Feature",id:"4501",properties:{name:"å—å®å¸‚",cp:[108.479,23.1152],childNum:7},geometry:{type:"Polygon",coordinates:["@@lKnbnU‚@Ua@K„L„ƒlJVX@VnL@bW`Xxl@„I@U„Jl@nV@X‚V@nXV„@lK@UVL@JULVJ@nnJlÂœVJ@VULÂaƒLUKƒnmKULVVUÂŽ@nU„š`lIXlln„K@UlJnb@nšV@LV@lwnJ@L@„nJl„@VUbUn@l˜n„KnbVÂŽV@„wVLUb„xVm@LV™VKXLVKVLXU@VllUX@`lb@bnb‚L@ÂŽUV@bV@@b@LÂœx‚KVanXVƒUUmVUUUaVUky‚UUa„ImK@mUUVUkKU_@W@UVVVIUW„UVaVU@UUKnƒ@k@al@ll@bnL@b„VUV˜X@VÂœ@@b‚Knblmn@V_@aUalL@a@akK@kVKUKlwUUnÂVÂ¥VmU_VWVIVaX@Va„alńK@LVJnalL@LnK„wlVUw‚mX@VXšƒlLUVnblaUmVUVwXU@Wm¯Va@ÂÞKnw@w™mšk„»‚UVW²a@_mW@U@I„y„LVUUKW@@™„LX@VUV@@yVU@UV@nwUUmJka@IU@ƒmƒVkaW@UwUX@`ƒ@kLWUk@mƒkUUm@k‚UUWkUƒkWxk@@VƒK@nÂV@UVaƒUUJmIkVƒ@UamLUbkVmamLka™@ƒ‚ÂkmL¯ÂWI@wÂJmwƒx@akU@aUKmbkaW_nW@_U@Wm@a@wkwUKmƒk@ƒbkb›wÂ@mKUkkU@J@bW@kVWz@bÂVUa›VUx@„ULkJWbXVVXƒ`@ÂœmJUVU@@Lk@WbU@UJlnXlm„Vx@Ln@‚b@K„LX„WJUÂUW@kƒaUVUbmV@nnV@n@lVLƒVmLX‚mXkV±@kxÃ…L›šUbÂJWIÃ…J@I‚mXalkUamKkškL±aVwÂKƒUU@mÞnbWJX„m„@lÂbmKULWUUVkaƒbnn@Vl@VVÂV@VƒbVbnLWLXJWxXLV@@VVÂ"],encodeOffsets:[[109958,23806]]}},{type:"Feature",id:"4502",properties:{name:"柳州市",cp:[109.3799,24.9774],childNum:7},geometry:{type:"Polygon",coordinates:["@@ƒwU™„aV@nÂVaUÂVklmkUUmmIkƒ@w„aVƒmÂ@™U@VKUkVUkWVÂ@™ƒ¥@w™™ÂKVwUalw@aUUUÂWWXI@mVIm@Ua@wVKUKV_UƒV@UÂ¥VK„n„al@„Uš@VU@V„V@aVUnVVIVmUUlan@VbXwWƒX@Va@IlVVƒn@VanVVb„ÂlJXIVJlUXL@U@KmUnÑWakU@ÂmkƒJUI@mk™@wUmmUVÂ@JXaWIXWmaUIƒJƒkk@W„nJ@„ƒaUak@›kkJ@kUKU_ƒ@myUÂóWUkmÂ¥kUmL@KUKm@k_UmVa@ƒk@@UmU@mm_—JWIUVUÂŽWLUlÂbVÂUJÇVUIVwƒKUVk@mU@n@lUL@Km@@l@L™VƒzÂJmUU¤m@UbV²U`U@@¼Vn@x@Vš@@VnUVx@blbXIVxU@WlÂ@@L™aW@kxƒLXVWVk@@U@VmLVŽ„L„bUVULVV‚lnLVxkV@nWV@bnKVVk@VL„VšÈVKšVVk„Unb@lm@@LVxUlVX@Vk„ƒJ@wkIÇ@kl@blVVVšzXllLUxlV@x@„UV@nƒ‚U@UImmUIUV™¯mVk@@V@VƒamnUKkÂm@@VƒIUJUaUUWLk@UJUI@xV@V„VWVnÂxƒLUômVV„@VkVVVUnV@UVkL@VVV@bVxla@bkXVJVn„`nU@bƒb@bVL@VnJ@„l@šV„aU@@_lW@UUU@Unƒlll@XLl@@UX@°bVWVanLlknVV@VVX@VVƒnUÂŽVLmbXJ@nllXX@`VXƒlmaÂXVWk@Wkƒw—J@„VL@J‚bnU@bn@@bVKUnVJVIVVVL²a@bV@@Vl@nUVakalmš„UL@VUL@V‚a@mXÂl@nK@UlK„L@Vl@@nkllb@š„Vnn@‚šnV„™V°l„šVInwlKXxlU°Žn@@ƒ‚I@UnVlakÂUJWkUK@anUWK@_ÞJ@U"],encodeOffsets:[[112399,26500]]}},{type:"Feature",id:"4514",properties:{name:"崇左市",cp:[107.3364,22.4725],childNum:7},geometry:{type:"Polygon",coordinates:["@@@JVzšl@V@Xn@ll@VlnX@@VWLnÂŽUVmUULVlUV@blnUlnXVV„K‚xnLlb@lnbU@Vn°KVV„I@WXUlI°VXb‚VVbnLVan@‚x„J@_nJ„a@wVwV@@a@IUÂ@UU@WKXwWIXKmKUa„a@U‚UUUk@@Umm„albVUXVVKnL‚a@knƒWƒXImanÃV@„V‚LUx²blKl™nLVbklWbÂn@JÆIXJ‚IVaœ™ÆKlw²@lUnWWÂnK„UUK@k@mmU@mnUVaVU„b@lVXVÂXIWƒƒK@LÂam@@KUwnƒWkkmVIV@Xal@@KV@VUnI@›„_UWWUkam@kkm@ka@mƒk@wkJWIUÂU@WXkW™XkWWLUUƒ@UakLƒW™XV±VIVWUU@anUWaUK@IU@Vak@@UUKWaƒÂ@m@ak@@wUkla@mUaUklakwVƒ¯¯@WWUkLkKmaĪkLUnV`UxWX@Jkn@bmlƒakkk@ƒb@l¯bm„ƒbÂJ›b@VXn„bVV@„ƒbƒJUkkKWVU@mœÛVUUW@UVUJWXkVkKmÂUL@WW@U„Vl@XXKW„XJ@XVlmbUxnnm@UlVnV@XVm¦VJÂb@šmLkKÇbXblVkn@l@bWnX`V@@IVV@ÂŽV„V°n@@_naÆVVbUVVbUJnzlVUl‚XkV@Vlx@X„VnxƒbƒKUK@b¯ÂVVUV™L"],encodeOffsets:[[109227,23440]]}},{type:"Feature",id:"4513",properties:{name:"æ¥å®¾å¸‚",cp:[109.7095,23.8403],childNum:6},geometry:{type:"Polygon",coordinates:["@@nVlw„@VJU„„IVVUšV°lU²V@„l¤Ub@bUV@b‚@„b@bUblšVa„KnLla@UnUWmXÂlJXUlKV@V_U±Van@V£nV‚I„yšU@K@kn@@LVK@k@mnVl@VU„LUxVJÈUVIU‚aVkXKVÂVUXJ˜In`@nnV@Vl@@„UbVnl`n@VL@LnKlVn¦VlôXV‚nz„@V`VL@llIÂœll@Vb„b@ƒmIXƒl@„l„IVJnbWXXJWb@IU‚nVVn@xlš@nVJ„I@W„U°LUaVUUaVJVIÂwlKUalKnb@UnLVWU_@KVK@_šKVa„@VKU¯VLVKn@la„aUkU@maVU„J@k™@Um@XmbkyVaUIUU@KV@laVn@KXKWUkUk@ƒaW™UUVw@aXKmƒVaUUkšmIƒlUU@wUa™xUmmU™¯™U@WƒLUÂÂmVIUym@UÂVmUa@wmw@çÂm@aWLU„™JUIUamKmL@™Âaƒx¯¥ƒkUÂ¥U@±„k„UVmKU_mJUbkKm„ƒLÅǙ_@WWUXUmaVUkK™„UWW@ÂnVxkUƒxmL@KkKmbUI@KƒLkƃbUbW@UbUJUXV`UnU¦mÂŽVVkxVLUL@llL@b@bkKVb@bU`m@knmaÂL@a›@@U—WVUƒU@amK@akkk@@b@lm„VL@VUVUbƒVVXUJUU@V@XV`lLUVVV@nnLƒJVbÂVlzUVVbVVnUVVU„"],encodeOffsets:[[111083,24599]]}},{type:"Feature",id:"4509",properties:{name:"玉林市",cp:[110.2148,22.3792],childNum:6},geometry:{type:"Polygon",coordinates:["@@VJUXVVXlWX@V™xVnX@@`ššULWÂŽUXÃ…bWK@mULUUmJ@n¯b@l@VULVx„x‚XU`VXXJVI„V@nm`@nUÂŽVXn@lWVn@b@Jn@nU@Lm`@Xn@WJƒ¦U@@VnL„lV@@Xl`nIlJnkVL„w@KVK@UšaVL@bVKX™lUUKVK@I„VšL„a@U@WšLUlVL@bU@@blb@VlbUxVbXUVJ@xVL„U„lV@VU„bVLnKl„XJ@L‚b@an@VanL@`VLšKV_UWl@U_„a@WVInlVUUUVm@I@W@wVakIWm@U@ƒXwlaVbnI@ƒm»Va@aXaVLšU„»@aVa@k™KkL@KmU@WƒzUK@wU@VWUUVUUKUa@ÂmKmbUK@_nWVaUkVaUaVUVLXKVƒVUVmVI@UkKkLm`UkW@UwÂWW_„ÂUaU@WakXmK@xUXƒJkƒUUWUk@Wl—ÂmJ@km@@aUKÂzmyVk„a@kkWVUU¯lmU@@w‚kkmV@Vk@mÃ…Iƒ‚Ukƒaƒ@UbÂ@m@UUU`mÂUbWaÂWmb™X™ÂXKWIXUWm@љ@y@UkIUJUUWLUWƒL@UkVUxW@kaWbÂKWnXxW¦n„m`XLVlUbVbUx™I@JmLUKUb@VW@@bkL@b@VlU@xkš@L@lƒxXxWXX°V@VVVbUVV@UVVbULVnVJUb²b‚aUb@VVVVInlV@VnXaVUšÂlI„VUb"],encodeOffsets:[[112478,22872]]}},{type:"Feature",id:"4504",properties:{name:"梧州市",cp:[110.9949,23.5052],childNum:6},geometry:{type:"Polygon",coordinates:["@@VbXblVlLXWln„wVV@VV@UnšWUXVbš‚@ÂVWXa@kVK„ÂUaVaVkšUlyX@Vaƒ—VmUwUaVU@UÈymI@aU°@š™nWV@VaVaÂw@IV@VmnLVK@kmmna@™„™VbVI@aV@XbW`U„„LUVVx„@VbUV@bl@VLXblJn¦lL„°°@n™@K@UlLnK„a°LWbnJ„¦UÃ’V„UllLlVnKnbWnn„V`„w‚@@ÂXa±™n™l@XKV_„WVkVa@kVyUa@wU£UW@ÂUIVW‚@@a—wWaX_WKkVmUULmak@UJUI@±m»™—k@m»VyUIm™nmmwnkUmVaVIUÂn_mW@»Vk„@VwkmmUXa@IƒaVÂm—Âmƒ@Wm_U@ÂÂmIUWóLmUk@laXmmkUK@UmKULUUmWULƒ@VakU™@Ub@bƒ¼™VUKWb@bUbn¼@„mJUakbWx@„@VXnlJUb@x@X@JUnVVUVmkUJ@XƒbV`k@VXU`™LUK@_mKUbm@@b@„U`@nlV@b„UnbVbn@@`VbUbVV¯bm@@ÂmJXb@bVnUllVXUlbUl@LU¦VVmÂŽkLVb@b™l@V@XlK@V@nUJUz„°mÂŽÂwmLmlXbWVU@UUUlƒIU@VVmVÂ@@¦‚bXbWxX„WlXVWL@LUmkbU@@LVVVJUblzna@WVnš@@lƒIUVnbV@Vlƒbkbm@ULUKV°ULƒ@"],encodeOffsets:[[112973,24863]]}},{type:"Feature",id:"4511",properties:{name:"贺州市",cp:[111.3135,24.4006],childNum:4},geometry:{type:"Polygon",coordinates:["@@nL@xn@lKVkšwn@„alLlaXV@„lx„bVWVÂ@aUa@aUk@mVUnVl„XL@JV@VxVIVƒX@„b@bl@@`ÇnXVlI@l„xUnlVVLkllV„@nmJUxnzWJ@VXLlŽšLVxnL@l„LlÂŽVI@V@lUnl¤Uz™Kš@„Vl@š„L‚l„Lnš‚b@VnVVU@k„a‚Knxn@VkVJ@ńUlakmWIUaVanm@_UK@UVWUa@klÂXam™U@VmĪVIXW„@lUVknVlKVLXÂŽVXšW@b@VlšnnVL@KXL‚Kn@lb@UnW°@Va„X„WVb°aVa@I¯aUkUaVKVwƒaXk@a„a‚™@wkm@alanUVw@alK@ÂUmkw@UƒaUmU@WXUaUK@UW@UaÂVWI@Â¥Xa@w@ÂWWšÂVƒXwƒÂU@mKUXUWVU@a¯klÂ@akU@UULmK¯VUVW@U_m`U@@xVbUz@lUbUlƒXU`WLk@mš²šWb@ÂŽÂ@ƒxU_mƒXmmamLkUkKVkUƒVу¥mIXa¯KƒbmLkK@V@Lmš¯@ƒ¯kKmÂ¥kIWaUKk@@aVUUaƒ@UwVUƒKVƒX_WaU@@bUJUaƒš@šmbnn@lULmKUnU@@J‚xUbUbU@mX™š¯@VÂŽ@bnJÇz@VUVVbVxUn„˜UbW@kz™VUlUbVbƒŽUL@lWb"],encodeOffsets:[[113220,24947]]}},{type:"Feature",id:"4507",properties:{name:"钦州市",cp:[109.0283,22.0935],childNum:3},geometry:{type:"Polygon",coordinates:["@@@IlVVlnL‚@Âœxla„al@n„VLlx@x@bXnV@@`mXX`lbnaVL@blV@b„wnx‚I@xXJ°ÂnK‚l„š@lbnKnblUVanKVb„@lUnJVI„VUb@V‚U@m„L@Ul@Xw„llVVXÂV@lVnlVn„l@XVlK„@@_VWVxX@lb„U„nV@@JlbnIlmnVV@UwVK@U@k°a@mnIVVVK@nXLÆaVWXÂVK™™@_W@Umšw@UXWWkUUVWUIVaƒUkJ™ÂUVWbUmU@mkUJUU@UVaÂb±aVaUIUmVKUaVUU@VUUaUUU@W¯XWWw„w@k@Kl™@wkV@U@alK@aX@@UmIUWUIƒ@mmkXU`U_WJUnUJmUk@@amLU@UVW@UkU@@VƒbUWVUk@@wmKkUWLUWÂX@JmIƒlUkkKWKkLWUÂ@UKWa@bU@@a@_UKWƒÂUUUmJmw@ÂnÂV_@Ä¡ÄŸKóLmbU¼VÆ@xUXƒ@Um@wklVnUn›lkaUV@„lV²WVklWXXbWlkVkIm`UUƒLƒUU@UWƒx@XU@@lWLU@kbUbV`UXllUV@bmb@LnKVbULm‚šÂnVVIV`X@"],encodeOffsets:[[110881,22742]]}},{type:"Feature",id:"4508",properties:{name:"贵港市",cp:[109.9402,23.3459],childNum:3},geometry:{type:"Polygon",coordinates:["@@n@VzUJ‚nVŽ„K@XšVš°nVVnšwVb@xVV„knJl™VVUbn„WL@bUxVVXš„bl@lVXkWƒXwWaÂa@¥‚@nUUUV@„JVkVVV@XUWanknK‚xnƒ¯VyVI@m@UkL@W@Ušk@aUalKnÂUUVÂ¥@KVkkaWVkUVkUm@aWanI@Ân@°aUUVaUa@_m@UamaƒV@akU@mV_@ƒÂa@KWIkƒmLUKƒaUVU@ƒkƒVUK@wUIWVUaVwka@Uka@aV@@aUKVk™K@X@Vƒb™KƒU@JULVLkVWšUL@aUK™b@VUL@LƒxUKmlkImJk_@WU@ƒkmK@UV@„¥XIm@@Wn_@KmVm@@I@aUmkXm@UWVÂ@mn_@mƒUUJWIUWV_ÂWƒwU@mUknVVmxU@@VUV@zU@UVW@ƒK@šX@VLUVƒKƒz@J@VnX@`±bUXÂVƒ¼™lšn@xmxÃL@‚Ubn°@XWVUxUVVnkbWVXV@Xš`ÆȄKnƒlLVanIV`nLVUlƒ²ƒV@V¦„l°¦„w‚b@šnKnLVbVJšIVƒXK@b‚n@ènx@xVbUnV‚"],encodeOffsets:[[112568,24255]]}},{type:"Feature",id:"4506",properties:{name:"防城港市",cp:[108.0505,21.9287],childNum:3},geometry:{type:"Polygon",coordinates:["@@XV@X°°U„lxkbVlVb@nkbVl@xl@@b@n„‚XbVL@Vl@UbV@@JVLXbmV@bVVUXUJU²šW„XlKVb„@VVXKlXšWlXXWV@VÂXJlI@x„l@nlbn@lln@lbXalIVK@ƒVwÂœUVb‚U@aXylUX@@aW@U_UJmU™ÂnÂVKUamL@Kna@aVUkkVWU_ValaV@XK@kV@@W„wVXV@„V„KVVn_lJlUXkWaXWlkXU‚±kU@ƒVUlbÂœkVmUmlk™¯Ã™™WÂ@mb@¦VxULm™kJUU@Âma¯wƒmkX@VóJ±bUVUXÃWk™lWXXlƒxUaƒbƒIğ™Ç@U@mVUKkkm@UJm@XnWV@x"],encodeOffsets:[[110070,22174]]}},{type:"Feature",id:"4505",properties:{name:"北海市",cp:[109.314,21.6211],childNum:2},geometry:{type:"Polygon",coordinates:["@@VaVLnK@IšJVwUaVaUkWKn_mƒXÂ¥WwXm‚LXalbU£UyV„Å@Ùwm@™°Âl›LÃ…Uƒmk™mwÛaÆ‘LÃUUm@ȣƃV_„Ó@£UƒƒUÂVƒ„™¼U°W̄™ÞVbXbôx@b@bmVÂ@ǃ™UÃ@@Ä¢U`mÂ@ÂŽnxnIVV‚VX„VL@`@bV@@aXbVL‚@XVlKXLlLVl„knJ@I‚WVXXKlVnL@xl@UVVX„a@UV@VlX@VUV@nK@bl@nVVIVmXIV`V_lWnn„@VJVXnJ"],encodeOffsets:[[112242,22444]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/gui_zhou_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"5203",properties:{name:"éµä¹‰å¸‚",cp:[106.908,28.1744],childNum:14},geometry:{type:"MultiPolygon",coordinates:[["@@@UnUlJn„w‚JU°VL@bnVšU„wlJ@XƒŽXVlU@klVUJknl„UllL@bUJ@xULUlƒ„UblVkblbnw‚UXmla@„wV@VK@L@UXaVKVLXWƒUVa@U@Im@@W@£UKUakKWIXU@al@@llUnL@W@Un@@VlUV@VIUanKl@Xb@lmxVb@b°bÂb@nlJVVnÂnJ@b@L‚V@ln„@LmV@VÂx@blnVK„nlJXIlw„J@҄b@nlK@Un@UL@VVVVUUUVK„l„@VUVL„J@UVUUw„@Wm@™„UV„ÈVlbUb@JšLlÂŽX@@x„„ƒLmÂŽk@@nlx@bUJUzVJ„@@LVxUV@bWxnLnVVK@_‚K²xVbV@nÂ¥@aVI@b„@l@Va„Knb@n‚`n„mmý„W@ƒU_šwV@VlVV@Vn@n„˜@nI@Jn@°¦VaUU@™„mVÂVWVaUńU@aVKnƒVbVÂUmmU@a@kUw™m@aUUmUUJ¯ÂlakU‚aXaWUUaVƒkk„amÂkmUnVlULƒVlJ@XU@UJWUUw„k@aU@WbkWƒL@U@WU@@XUKmV@aUÂVwUÄ•UJUamUUVUÑm™nIVJ@kl@XalJVn@KVLϴ@UWIXWmU@mVÂUKnUWLUKUaWUUKVU@U@anUny@UlUkK@w@a@aVUƒ»UkVw@Wmk—JāmUUVmwXalLXWWUnam@XkƒJ@UVU@U@W„@@U@I@Wl@Ènlw@KXLWb„lVUkalKUU„VVaV@@wnIlaUmkUƒKWU@KkUkLWaƒKUÂUWUn@VƒK@LnnWJUIƒVkUWVnV@V™@@XƒK@VUIUJ@IWJkX@VVJ™IƒVkK@I@UVaUWk@m„@wnUWKk@mxk@@„lV@b„xmb@x@VÂUmLkUƒJ@nVV@b@VkLVbU`¯I›l@™U_UW@UU@™™ƒK¯wm@™xƒL¯¥kIƒ™ƒ‚@bkbƒ@Ua@ƒm@kkW@XVbmV@ÂŽkV@bWbUbV@„¦ƒxXlmVk@ƒ¦™bkaWL@KUImK@wUK@VUI™b@bmK@LÃ…y@akXW@kbWlXblL@ÂŽULUbƒ`@U™kUymX¯@mšUJUÂUJƒL@Lm@@WÂX@lU„VlšXll„@l@Èk°V°Ž„X@VU@UVll@XUJVXUVm@@VXLWlnV@Xƒšk@mVULnxV@@bm‚kL@VWLUbU@UVm@ƒbÂ@Ä·Â¥UnmJ@UUVƒkkJUšlÔU`UIW@ƒ°kLUlUI@WVI™U@mWKkXk@ƒ‚WU@bXšW„@J@xÂX@l@LVl@xšLVxXX@x‚KnxVknb‚KVV@U„L„WlXU`@nUlšX@llVXšVU„KlkUKlI@anKVLXKVaUIVWV_VK@VnLlU„»VKVL„m"],["@@@KlKkUUVVX"]],
-encodeOffsets:[[[108799,29239]],[[110532,27822]]]}},{type:"Feature",id:"5226",properties:{name:"黔东å—è‹—æ—ä¾—æ—自治州",cp:[108.4241,26.4166],childNum:17},geometry:{type:"MultiPolygon",coordinates:[["@@VV@XkV@bUbWJU¼Vb@Vnb@bš„@J@bƒL@LV@UVƒlUI@a™KULVb@bkJmx„šlLVxknVJk„‚xnKmnnL@bn`WIXlWLU@UxVbUVmKV„XI@JVIVJ@U„L@Wš@@UmUXUlV„UVJXImm@K„L@UVmVXV‚„LXblKlV@LXV„LlVVnkbmJ@xnXl@šbXa‚@Vana„ÒšL„m‚VnIl‚Þ¦°k@b„@@lV„nJlUnš‚VX_„@lVlK„šV„UUxVLVWVIXJšUlnnWlI@KUaUUVKn@VaVXV@na@ƒmw¯@mUkJUamI@lk@@am@@I„ƒUmVImUUÂÂw˜™@anUVaUU@LU@WaÂWUXWW„wV@VwnU@L@ynbl@@X@a„J@nW@@Vn@„lVLlxnI„lš@@UWKUƒnIlJXIVllIVVš¼XK@aVI„V‚@@bn@VKXLVKVVVInw„J@UWI@mX@WKnI@KmU„UVJUL@V„KW@@k„Â@aU@@W@InJWUXwWI@Wƒ@¯wkaVaUIl@nÂŽValIXWWI@UUm@anwWkXWWIUbk@UJmIUamKVUUUÂVVama¯VkIVÂVUlKnXVwX@@WVaUUVa@IlƒÂaVmƒkna›wk™UU@ƒU@mUVƒšUVwÂœl°LVbnJVU™¯la@mX@@UWKXU@aV_V@@JlkUƒ¯@V™nK@km¯k„U@ƒWUÂW@ÂmmƒU@™kmlU@wkL@WƒUkL@VmLƒJ@b@V@bknUUVK@UVKUK@Uk@Wa@LUVVnUbmVk@@UU@@aƒV¯K@U@UU@WmUL@aU@WV—w@ƒ˜I„xXll@UX‚K@KXXVJna@wWaģnaUKV„m@UU@mUmaÂlm@@XkVm@ÂU@VƒLmWU@kkWxU@@bVV@VkXVlƒVƒ@UUk@@ƒmI@KUw„m@UmVƒUUwU@lwkV@IUa@mUaVIVKVa@w@U@™UJkb@n@bmJ@XmlÂVUxWXkJmUkUUVW™xUlU@ƒaULUšmbU@@‚WXkmƒL@xUV@nUxÇm@„XLWbnlƒnV‚nnUV˜ÂU‚nVVz„@lbUVVlULVb@V@nUJkwm@Ux@bWbUK@UULka›JÂbƒU™U@U@lUK@XUJmn™J@bU@UwWa™x@zkJWnUJUUVšVV@bXn@xVb@J™L™m@X™w@`@bkb@VmXUV¯L@mW@@n@V@‚ƒL@K—IW@@aƒaUx¯@U„m@XbW@@L„V@bnVWVkKUzlV@bÆa@lnI@VV@@LnVVKUaV_VJVbnU@bn@‚‚nX@yVIVxXKVLlUVaXU°J","@@@KlKkUUVVX"],["@@UUVUkUmV@ln@VXVK@K"]],encodeOffsets:[[[110318,27214],[110532,27822]],[[112219,27394]]]}},{type:"Feature",id:"5224",properties:{name:"毕节地区",cp:[105.1611,27.0648],childNum:8},geometry:{type:"Polygon",coordinates:["@@UkVƒ@k‚W@Xn@@K„KVIVÂVIn™°@nWVzšl@V„_VaVK@ÂkKWaXklaX@lW@bÆz@KnL@ašaVJ@UVL@xnLVJ@LXKlbša„¥l@nUWk„wĴU@VaXa@amLkUƒKmƒ¯kƒmkIUaƒKUIWƒkKmÂ@anw@mlwXIƒmƒUk¯@a@amUƒ`kÂkKWVkxmUUak_mJmw@w„mXUW¯X›_@WnI@aVwkWWýŃU@WLkU™aUbVV@lUVVnm@kUmV¯™kK™LƒwmVÂUUaWV™aÂaWw¯wƒÈ@VULUVUUƒK@nWJkI™l@Umxnbm@kbUJƒa¯bUbVxmLUV™aUÂ@VUUWxkVVV@bUV@XWbnlUbƒbUJlbUV¯b@z„`WbXnmbƒaƒwUwVWÂUƒbUxmbU@Uam™Â@ÂVƒk™VÂÂaƒwVaUƒWI@mUKóz@lUlÃ…@WIƒb@xXxml@XklULWKUÂmwUa¯KUXWJkaULmKkLWbkKUVƒImƒÂƒWa@kUaULƒW¯LƒK¯@kbƒL@b™x@J@bmnnlUšlzU`U@@Uƒb@„m‚n¦°bU„Vx@bkVm¼mxÂ@mk™mVV@bkxVn„aVV@bU@mL@b²`lIVV@lXLlš„bVxn@@bl@XllIVšnbVšn°°wlbXw@mVa°ÂlVnU@mš™VLVbn@@b„@@WVnUV@Xlxn`VznJVb@L@bV`V@šUnwšU„@WUXKV@UUlmUUlaXalLšm„bšIVbnJVIlVVaUUnWVXn‚VL‚k@ƒnWnblnlb²x„xVKVXlVXLVW„LlUVJna@wVL„¼@JVX@`@nnx@nWJU@Vx@XXKšŽUblxUš°„LVKVVlL@KnbVUnJ„IlUšƒnKl£VW„x„IlJ@nšVÞUVVnb‚VX@V_°lnK","@@@UmWUwkU@Um@@VkL@V@„„‚V„VkV@nbVa@ƒ"],encodeOffsets:[[108552,28412],[107213,27445]]}},{type:"Feature",id:"5227",properties:{name:"é»”å—布ä¾æ—è‹—æ—自治州",cp:[107.2485,25.8398],childNum:12},geometry:{type:"Polygon",coordinates:["@@‚V@IöalK@UV@@KUaVIVVÂœLlaVbVWnX@‚@LnUlxl@naVLXVVaVU„J@ÂlUUanWWI„@VlV@Xbƒb@V„n@VmVVbk@kU@V›V@X„J@zn`ULW@kK@_WVUK@LUb@Jlxn@nnWlU@@b„x@XVVU@UbVb‚@n`VI@VVLUlUIUV@KmL@VV@XIV@@lVLVmXV„@WLXLW@U`šnkb@Vl@UL@VVV„L„llX@`lIXb„J˜IXW„L‚aVL@ÂŽXXW‚ÂĢ™b@bmK@L@°@Vnxmxšn„K@xVn@VkL@V™Lƒakbl`VnnxVnUlššV@@VVXV`@šœk°JV_UalK@U@aUU@m„IlVnK‚V@U@wnaƒw@akU@ƒl@nwl@XLmV@xnƒl@VXUb@V@JlL„UšJUI@UlWUƒnLVUUaVwV@XKWkXJm_@amKnmmLÂwlƒUIlmUwkKĪnwlI@aUaVKšL@bVJ„kVUU@@K„K@a@I™ƒ@ama@UUaV»XIVa@alU@WUU¯IWVUbkVUKWLUwUJ@zmWÂÂm@@amVUaUIU`VbULmU@KU@@UmJ@kÃ…b@akUVylLXUmU@aƒU@KX@Wan@Vƒ°@Vw„b@bX@˜J@L„K@Â@U@mX@@n°KVUnW@Ula@a@_šx@WšnšK@IUa@wWm@aUUU™VVVIXmlI@yšwXbVxV@@ašInmVI@WVL@k@VšV„V‚aÂœIlbVK@VVLXa@aVwn@lxVI@m@UUaVKUkVUkaƒ@UymUV—ÂVUmmU„mmkXaWK@ƒÈnVw@mVU@w„KlnXW@ÂV@naV™VKUk@KVIUWƒ@mk@KXU@Um@@lÂVƒk@UVJna@UWaƒL@a@ƒXa@kmmVUUk@mkkƒamJ—ImJUUmIÂm±aUUkambkamVUU@VlbUbVVƒxX„WVUU@VUakU@UmUV‚U@mnUVVnUbVJ@b—UWÂ¥kLVamVÂkUaWJU_UVWKk@@nl„UVVJUXÂm@Vm@UnVlmbnÂmJUbULU@@UUKWVÂIWxnJVb@xUL@bUJWIkxƒbkb@xVJƒbmU@kÂW±LkKUkVa@a¯amÂ¥ULkalÑlKXUWƒXƒaVakImVƒ@ka@ÂUUƒJ¯aƒX™mmb—KWU@wUUƒaUa™KmU@UXlWb—¼WLUKUb°„UlVbkbVL@VƒšƒJ@nVlUbUXmJ@VX@lbUbU@@bWb@VnLVJ@bVVUz„ŽVL@lnL@b™VVVULmKUk™Jkbm@ƒxVb@V—kƒKVnnV@b@ÂŽWXU‚„nV„l‚ÂVVXVJUXlVXbWV@VU@Ubk@@KWbUUmL@JnXV°XJ@_‚`UbkXVVlÆkbƒ@VLXVV@‚V@k„KXX@`V@@n"],encodeOffsets:[[108912,26905]]}},{type:"Feature",id:"5222",properties:{name:"é“œä»åœ°åŒº",cp:[108.6218,28.0096],childNum:10},geometry:{type:"Polygon",coordinates:["@@°a@aÈbVUlU@aVKnVV„VUÂlyX¹lWVa@ÂU™VƒnUVU@m™Â@mUÂl@„mÞw„@‚xnIVbna@KVI‚J@kÂwV¥ƒUXÇVkVW@kkKWU@aXUWmnIVa°VXbmL@VVbnVVVUb™ÂVbšJVbVKXkVKVanU@aWÂnWUÂWa@U™Ânk@mVIVK@wXxlLXbVJVÂlKÂœbl@VI@mšaXalVV„VbX@@ašalnkx@b@V‚b@Vnx@bVVUXn¤WXn@Vl@Vlzn@š`@I@KUU@ƒV£namÂVkXa@aVK‚nnU@anVlKƒa@UUU@amk@»kƒU¯@aš„VWnkWmkImU@akaVm@»VUV@UKnkW¯XWlkUKnIWaš@nmlIXmWUnwUwWm@wULmaUJkIUaƒaWa—klwkwmJmU@bkJ@XUJ¯ÂW@XbWbUKUkWJUUVKnn@UmmXUWa@mU@@UÂI@WmXVykwm@kaULWwU@¯ƒlKUUVU@mU@UkmaUbmV@b—š‚xVÂnVUJVnƒ„@Jn@@bl@@knJVblInV°@nx@„mbU@UWUbm@ULVVVb@LkJmXkm™VWIUJUXUKVwƒV™UƒŽkLkUƒ@W`ÂUm™kVmIUƒ@kƒ@@a¯lÃÂ¥kÂmJÂUƒn™KĄmbUbÂ@Wb™ak@mWU@UbƒUVVkLlbUVƒkXaWK@LkxÇmk@@X@J@Vƒ@@X@VUV@V„IWln@mbXVWXkKWbnxVUnV„ƘInl@XUxVl„¼UV@b@b@xlLkV@VmzmV@b@VUVVLXVVbVLXKmVVLU‚@nnVWXXJ@V›¦UK@LUmkIWbk@@lUImJnšVÃ’VUnVVbVIVÄ–UxV‚@bnUVL@WV@@X@V„KlXXaV@@bƒlVxXVVIV@@WkI„UVKUkVmlnnŽƒbllU„VbXVWbÂblVkb°ŽVInVVV@bšnVx@l@bnVVnUÂŽUam„UL@bƒVVÆUbUXU‚ƒn@šVVUb"],encodeOffsets:[[110667,29785]]}},{type:"Feature",id:"5223",properties:{name:"黔西å—布ä¾æ—è‹—æ—自治州",cp:[105.5347,25.3949],childNum:8},geometry:{type:"Polygon",coordinates:["@@VL@Vl@@IXW@kVUVbnW@XlKVVnU„VlL@b„aVbƒb@xX‚°ÔUxV@kbm@VxkxWJœ„V¦ƒŽ@ÈnšVKšxWÂXJmV@n„Ò@xVbn@@blLk`VX@bššla²JVUlnn@U±lw@wnw@mlwVIX@@m@klKnk‚a„KnwmmXkÆÂVm„Uš¥l@nb°Ân@„aVwVmVIVÂnI@a„¯@mšU°ƒl@@VnI@JV@UV@b@IUbVJmXöºƒzllUbVa@aXUl@„U@llLnKVaUa@UmK@UšwV„bnKV@VwVK@UXƒV@Vbn@‚w@U„WnX‚@„a@m„I„™@UUKlaUaVk¯ƒVaVLXK˜»XaWk¯mƒkÄŸwmWÂ@mIƒVkwƒJUIšÇVwU™UkVKkƒm@UkmU@WÃ…wm£ÂVƒ„m¤¯IkJWa™_™lUbmJÂzÃJk„ƒUÇVU„ƒ‚@bU„Ãn™m¯LUb@`mL@VkL@VƒUmmk@UU±ÂUmka@kUƒ@ÂÄ·ymUkk@mmkÃmUaUakImV@V@VÃ…Lƒ¦ƒJUXmJXšWb@n°Æœx‚¼nV@LlbUÂŽUbmL¯@ÞbV¤nbVx@bUVlblIϪ@KVVUnVJUn@VlLUlmLUUUxmK@IÂ@@VW@@bU@UJmUkLVVUl@b@V"],encodeOffsets:[[107157,25965]]}},{type:"Feature",id:"5202",properties:{name:"六盘水市",cp:[104.7546,26.0925],childNum:5},geometry:{type:"MultiPolygon",coordinates:[["@@ôyVL@nXJV„Ub„x‚bUÂŽlšU„@ŽšÂnÂŽVbV@naVw„a‚VUXVx„x„bnaWmXaƒ_@y°aVUkaVI„aVamkXa@WVU@aUUlUXwVV@UVšbVUnKUwVa°a„bVIlan@manw@VšklJXI@m„LVVVUVK@U„ǃk@KUa@UkaVU@UVWV_XWVXVWlLXKlLXaÆKšwVL@akKm@Uwƒ@@XUVk@VÂUI@wWK@aUV™I@UkK@ƒmL™Wƒ@kImJƒUÃ…VmkXUW@UJkx@nmx@xkxV²m@kmUV±Ikb™™@aUWl_kK@am@Ua@wĄ@mnUWIX™wULm™@DŽÂU¥›ƒXIlwUwn@laU@Vw¯ÓWÂ@w„aUaƒb@akKƒUmVUUkL@WmXUaUV@lWX@Jk@@UUKULmLUJmzkKmVX°VšUnWKUL™ƒƒL@mU@UnVJ@b@„UV@Xƒ`m_@lÂ@@bmbXJmnnš@°˜wnn@ÂŽVLX@V‚@nVl@nk@@b‚l@nn°WlXzW`XXVKnUlxVbUb@‚V„Xb@Ž‚ÂVxÈbVlnbmn@ÂŽkVUL@„ƒŽmLUVVL"],["@@@ƒ@UmWUwkU@Um@@VkL@V@„„‚@„V@VkV@nbVa"]],encodeOffsets:[[[107089,27181]],[[107213,27479]]]}},{type:"Feature",id:"5204",properties:{name:"安顺市",cp:[105.9082,25.9882],childNum:6},geometry:{type:"Polygon",coordinates:["@@lL@bUK™xÃ…LWbkKWLkKUXUWWXU`UX@VUVlb@VVb@L„l°xXx‚bšbXUVb‚VnU„xšKlL°šnUlVn@UmVU@kUUVašblVXKV@ƄXþlXUxnU@mVK@_@ml@UU„@šblU@KnLVyUw„@@UmkšWVw@UVK@VXzVK@n„VVUUW@kVJnÂlaš@nKW™kaWL@U—™õb@JÂU@mU@@_WWƒL@lÂUU@WUUK„@lakÃ…UUlWVaÂ_@`WIU¯mW@InKVVXa@Ll@VaV@@UXUWakUVWUIUW‚UkÂUƒƒmVÂXW@Â@amUUm„L˜l@UUa„wn@lašIVlnLVKUUšU@amK@kUKƒÂVyUU@aUImK@UXa@aV@VakaW@@UnIVWVaUkƒbÂ@mWƒX@VÂxm@UaU@W„@VULUxU@mLƒaUŽ™x@VnL@VVbUbmLkK@kƒVk@WV@bUbVakk„yõ¹nWUIVa@J@aVUU@@ImJ@Uk@¯„™V@nƒ°@bmJUÂUJUnUxƒbm@¯Žmak@™¦ƒVUnÃ…ÂŽWlnnmxƒLÂbmlkL@l@nWVnlÆU„VnIlJ„@šXnK@„lL@VšJVU@bXL@xVJUÂl@VU@W„@Vxn@"],encodeOffsets:[[108237,26792]]}},{type:"Feature",id:"5201",properties:{name:"贵阳市",cp:[106.6992,26.7682],childNum:5},geometry:{type:"Polygon",coordinates:["@@nÂŽlLX„VJ„LVblJ„n°ln„„LlVnKlU@ÂnUUa@WlX@l„n@‚Vb„@la@a„„šlJ°¦„Kšwn@°x„LVkUmmwUmk_la„bšK@UlK@UUm@wƒL™mnwmw@U@¯@KnL@aša‚ġXÂWW@ÂUKÂbƒKWX—JƒIWakJ@_kWƒkƒKUU@UVKk@@Ula™mV_X@WKXKƒ@WUUnUK@kU@WJU@@UnK@LVUVJVkUK@UUJm_Â@UaVaV@UU@Wƒw@aV@Xkmmm@kw@IVa@KVLXU@`lLX@VKm_@yƒI@WÂœU@UlVl@UanU@Uƒm@U„aWaU@Ukƒ@XJmXVbkV@ŽƒIUVUbWUUKmbk@kwmV@K@ÂmWUXUakb›KUUUJVb@LU@@VkL˜š@VXKlbXšmL™@kbm‚UI@lVXUVƒU@mULWy@UUL@VUx™Xnl@Vƒ@VxUzmK@LkV™aƒ@VVk@@n@`UL@nmV@bmJ@XÂœ`WÂX°WVƒn@xnxnIl`VbnVlwXUlLl‚„_nV@b@bl°„V„nWJkx@nmx@b"],encodeOffsets:[[108945,27760]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/hai_nan_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"469003",properties:{name:"儋州市",cp:[109.3291,19.5653],childNum:1},geometry:{type:"Polygon",coordinates:["@@஼jpnrÂ’``ÂŽpRVHʘ̤žZt^JÖA˜[†CâlTébQhRPOhMBcRSQiROE[FYdGNOEIH]MgEAMLLIAG_WMCSL@ED]PCLYC[ZIHgjSxJTMbHNEFCMEE_HSDFHSLECRNSFDRICHNADGPI\\RZGIJTIAHLDQOHG`GTNCOIC@eIGDWHIS[kiE[FMbECÂZS@KKS[FDWsCeRuU_DUQNOE[LKGUBM¨EDQP@HWHGDImÂXƒCogÂ_~‹I_fGDG|QDUWKBC\\ore|}[KLsISBHVXHCN`lNdQLOnFJSXcUEJMCKSHOUMDIm_‹DI`kNDIGEYFM\\YPEEIPMSGLIKOVAU_EBGQ@CIk`WGGDUM_XcIOLCJphHT_NCISG_R@V]\\OjSGAQSAKF]@q^mGFKSW^cQUC[]T}SGD@^_ˆaRUTO@OHATŸ”"],encodeOffsets:[[111506,20018]]}},{type:"Feature",id:"469005",properties:{name:"文昌市",cp:[110.8905,19.7823],childNum:1},geometry:{type:"Polygon",coordinates:["@@€hIJ¤Ī¯LQDaFßL[VQìw€G‚F~Z^Ab[€¹ZYöpFº lN®D´INQQk]U‘[GSU©S_­c‹}aoSiA£cÅ¡©EiQeU­qWoESKSSOmwŸćõWkÂàmJMAAMMCWHGoM]gA[FGZLZCTURFNBncVOXCdGB@TSbk\\gDOKMNKWQHIvXDJ\\VDTXPERHJMFNj@OwX@LOTGzL^GHN^@RPHPE^KTDhhtBjZL[Pg@MNGLEdHV[HbRb@JHEV_NKLBRTPZhERHJcH^HDRlZJOPGdDJPOpXTETaV[GOZXTARQTRLBLWDa^QAF`ENUPBPÂ…\\Eji`yºEvåà"],encodeOffsets:[[113115,20665]]}},{type:"Feature",id:"469033",properties:{name:"ä¹ä¸œé»Žæ—自治县",cp:[109.0283,18.6301],childNum:1},geometry:{type:"Polygon",coordinates:["@@ªVLP`@PEdNRAHOPEAKHEVL`GZBJfvdTAXNNTZJFPrHHNpKTD\\ILHbEVd^J‚OHLh@NNBnHP`\\xH@NBRLJTlÂŽNv_^CTLd@bNDVFbxdFV€UPBTKOGEOUO@OEBXQP[H_EI\\EbeYa@UO_J‹MEJ_IEDKJUGMDcNUd_FMTEJSGoZ]EIYGO[YW‘gEQ]a@WHEDQKUSDUGAbYBUpSCYNiWqOSQEoF[UcQISWWNÂMSDe_cLQ_UBiKQOOASQAWgS­Ä]ZaÂŽSPÃZ]XMXSÂŒ[^oVËNgNKlE RôEø"],encodeOffsets:[[111263,19164]]}},{type:"Feature",id:"4602",properties:{name:"三亚市",cp:[109.3716,18.3698],childNum:1},geometry:{type:"Polygon",coordinates:["@@®ĂhTBXTRPBRPjLVAR`dKf`TC‚NXMTXRJVdE\\FpTRrPjXZMTDVoZABaVHTCLVCRGF@X^bFRÂ’hZXP\\ZHHMA[^wBWXJlW¤EJ[bCTOF‹WWMm@ILMGWQ@DQ^QNWFSHEbF`OXNbO„VNKTEPDTLTCCVTREfvfEHNbRAENH^RJXCFHNFRpVGHWISDOTMVCZeGamaLoLÛD¹¹ėgsia{OųE—Tt‰lɂwr}jŸR±E{L}j]HÄ…KÃT[P"],encodeOffsets:[[111547,18737]]}},{type:"Feature",id:"469036",properties:{name:"ç¼ä¸­é»Žæ—è‹—æ—自治县",cp:[109.8413,19.0736],childNum:1},geometry:{type:"Polygon",coordinates:["@@bRFnHNbHÂŒgN@NPEnbXP@bND`NT\\@\\QZb@`@J]V@XhžDpW„nÂCJGHGXO@CR§FANHVKLF\\MPVR`CvVfQtDPKpGHG@S`WJP~^dSTHWX\\RHTFACQTIAUPOU@MG__IaYSFQK‘NSbORHXCZeTFJg„B`YBMNMFi~IVDV[tGJWXGDQRGF]ˆJrALgESLSAYDGIaFeXQLS\\MKSLSQYJY}eKO[EHiGSaK[Yw[bmdURgEK^_kcSGEOHKIAS]aFSU@Y]IWFUTYlkP_CUOUEkmYbSQK@EMWUuAU\\M@EpK^_ZMDQ^OXwC_ZODBrERURGVVZ\\DTXcFWNIAWJWAYUUFYEWLQQaCIZeDM`cLKRGpanJZQd"],encodeOffsets:[[112153,19488]]}},{type:"Feature",id:"469007",properties:{name:"东方市",cp:[108.8498,19.0414],childNum:1},geometry:{type:"Polygon",coordinates:["@@ºŸx‹JYZQ”IŠYXLl@dR\\WZEn]bA\\S~F`KXaDeTiNO^EEKWEDQXITBXaWaDQMUJOIaTWf@NJV@dSxGZ‰Fu_Â@WMKAUˆ}AQ@MwG_[GOAmMMg@GKÂP]IUcaFKG[JSCoLGMqGEOYIMSWMSBucIeYA_HUKGFBLOFGPQBcMOF_@KO©UAtERadwZQ\\@ÊJÃ’gòUĪRlR°KÄ®VÂŽLJ"],encodeOffsets:[[111208,19833]]}},{type:"Feature",id:"4601",properties:{name:"æµ·å£å¸‚",cp:[110.3893,19.8516],childNum:1},geometry:{type:"Polygon",coordinates:["@@Å„ZÆ‚tĢ¬æßFuz¹j_Fi†[AOVOFME_RBb]XCAKQKRSBQWSPY\\HbUFSWSPoIOcCOHIPkYCQ]GdGGIFQYgSOAQLK`MFUIGa@aQ\\GGUFcHKNMh@\\OYKAigsCgLSF]GOQO]@GM]HyKSHKPW@Pxi@EMINYREXWRQ@MQcFGWIAwXGRH\\yDI`KJIdOCGRNPNtd\\UTMbQYi@]JeYOWaL[EcICMUJqWGDNZEXGJWFEXNbZRELFV]XQbAZFrYVUBCLNFCHmJaMIDDHXHEhQNXZ_TARFHVB@DTQIRR@YHAJVnAbKFUEMLd\\c^ÃÞ"],encodeOffsets:[[112711,20572]]}},{type:"Feature",id:"469006",properties:{name:"万å®å¸‚",cp:[110.3137,18.8388],childNum:1},geometry:{type:"Polygon",coordinates:["@@^J@ZTVbET^JBGLFPTHld]`FLQhcVanx\\\\ZbLHTGj\\FLP~fIZRZPVTQFSVAFJE^NDLEE[~LjsxVTG\\NZZNGlLRRGLJTV@hPZANN^@T\\NEPPbDZXO`d^HSvcJDIV\\XZAJUFCLNP@PQ¤@[ïKÂLÑIÃ]ÇE±I{uƒ­YÅ›UćFcYUmsVeBSVgB[RO@aYYPO^]@UVaNeDShMLG\\EfFVE\\F`"],encodeOffsets:[[112657,19182]]}},{type:"Feature",id:"469027",properties:{name:"澄迈县",cp:[109.9937,19.7314],childNum:1},geometry:{type:"Polygon",coordinates:["@@T\\GJCXJH@fJDDPNCNJENN^NLHBNSx@DDYbBLLDRbjZTj@`XXTlG^Xr@PJLW\\WLTlWR@HDJTD@X_PO@STMDNTMVV@NLDM`M\\XM\\JNBH[PYZ‡úYzŸ`ÄŠ\\ÃŽÃd]c[NKVFLEBaUmBIZGQ@JQSR@CUAEGBQ`SWYRMFgWGCGJCbNnIDGMEDKVAZUEqBYRa^WEUFKYQMaFWXEHIFWMYHCrXVIIiaK@aMCUYNSIISTwXALKH@XWXIEIJQCG[IEQDE_XSBaa[AIPW@]RS[FWS[CD]PEBYNGFSaSyJG]@ugEUDQlGHiBKHUIoNSKqHFaPMICK]UUHIPDJMuCA[SCPIDIOILGAEmU[POPBVSJDREBGS[QXWSGcT}]IO_X@TGHoHOLCX\\ELT@LYTD‚aFENF\\lj"],encodeOffsets:[[112385,19987]]}},{type:"Feature",id:"469030",properties:{name:"白沙黎æ—自治县",cp:[109.3703,19.211],childNum:1},geometry:{type:"Polygon",coordinates:["@@D\\RV]dTXELnHr]^@LETBBRTHPi^[@U`QTHDJ`MGSogDIPKdJ`WVNHCXHl_DJR@AH`FBVPUJLHKNTJOFFZON[ZEHFCJlMJ_ÂŒCn`CJVNGPLTNDFIdVTWEIPmRKMc_kDMWGGUTAtJLK~\\f{pqD[LAVXRCH{HC`eÂŒJ`}@W^U@I@_Ya[R[@MSC_aMO@aWFmMOM@‹haGGMEmaQ[@MESHaIQJQÂ…Â…MckBIw[AOSKKAMPSDSLOAV_@@`KJRbKRDfMdHZERgAWVsDMTUHqOUr@VQXTT@Tƒfg‚L^NH\\Â@heTCZaESNObHPƒHeZF\\X^ElM^F^"],encodeOffsets:[[111665,19890]]}},{type:"Feature",id:"469002",properties:{name:"ç¼æµ·å¸‚",cp:[110.4208,19.224],childNum:1},geometry:{type:"Polygon",coordinates:["@@TP\\pATHTGlZDJGAQjE\\Rb@jVBDCN`JZ[NCNHNXbULPrP\\KNbMTLjJJRFP`“pNLZz^FLRHjVPZ@hxVKbHBHMNNJFRlLzGPnNHhIrHHADcPWdUAmEMVQDSKYHY\\EhBN^HpXGNDBNNBnIÂߋÅ_g{³So]ã@ORO@KMEDIVYB[WJUICudGTc]P_YWaCOOMFS[]@MMYBgOU@ISHKQQkKMHYY[MSHwUit}KF\\KFMCF]EIUBETSROUKTLT[NKTWREfJbCHBZKTFTKh"],encodeOffsets:[[112763,19595]]}},{type:"Feature",id:"469031",properties:{name:"昌江黎æ—自治县",cp:[109.0407,19.2137],childNum:1},geometry:{type:"Polygon",coordinates:["@@`ZĤd–`òüˆ˜ “BSPGP@VSbQ`‡@]HC~T^SE]N]FkW]E[fY„GGOPaTMbFDYfS@g[ÂMGK]h„e@SSSRW@UVqrPVGNStCXUhBFQGYNcCeLQQaLI@_`@EUwcEaCUaMc@SK]Du`ÂMSkKI‡~BVNL@X`‚EvYŠwHcTU@MIe@SXJbIPNVCRXbWbSAWJCRXFFL]FMPSjCfWb_L}E[TaBm^YF[XcQk@WK‰Z“JYRIZwŒ¹ "],encodeOffsets:[[111208,19833]]}},{type:"Feature",id:"469028",properties:{name:"临高县",cp:[109.6957,19.8063],childNum:1},geometry:{type:"Polygon",coordinates:["@@jD`hNd\\^dZädÄ’H´Op@ˆùZY\\OAGIMN[[W_NCNMKU@NUMSNCTSP@`O@WSCCI@GXQSkXKX[IK@OWqH]SkWW@_SiiYQaKCAKZaCCw@MTGAMKM]FMMIMDSM_HGHRPKCBGSJJIYH[QOJCHMBDGQJECMTDQKFGTCEGTF`NFEDMFaGSNwIiTGhYJD\\KZODC^@FTKND`XBHKJNKFBNhG^FJMPcHEZF\\QPRjQTAdgNOPgQaRSê"],encodeOffsets:[[112122,20431]]}},{type:"Feature",id:"469034",properties:{name:"陵水黎æ—自治县",cp:[109.9924,18.5415],childNum:1},geometry:{type:"Polygon",coordinates:["@@R]NC`YL]FoN@V[vBXVFNL@TRZalnVFVP`DlOZkVSXEE_F[EUFeH[NKTgfCbMVU^@P]ZObZP@\\QhATUfAtUasñÂiÄEoI]eYǯ@aKmaeƒWuCºKÃœKpnbHbYfUDSNCPJTRAHJTDJSfDNLHXC``VBNGTYCQDIXMDSP@xLNEFRNXBIpVNLXah@RgF@`qOML@LJNSPLbaHAh@Jdj"],encodeOffsets:[[112409,19261]]}},{type:"Feature",id:"469026",properties:{name:"屯昌县",cp:[110.0377,19.362],childNum:1},geometry:{type:"Polygon",coordinates:["@@\\OnVBFKHPJCJOJTDB\\vDINOCGJVVL^JDONEbrGTLpMVJLGjAHGRkVChF@vH^zIbTETMHAZOFC^\\DXT\\EffAP\\PdAV@UIYfS|S@YPICMeM@sC[_A]VQEwyHSMuNcAUlQJMVGMS@mVBZPFO\\CSÂFQK[LqDMACiUa@[QiFBRIHYCHkGSBS[oSOqB‡IE^QHCRWHIXsHU\\UC}JEjMNAN_ZƒAIhSEYfWDQGaPMTLÂ’ERZTJb``NHV@"],encodeOffsets:[[112513,19852]]}},{type:"Feature",id:"469025",properties:{name:"定安县",cp:[110.3384,19.4698],childNum:1},geometry:{type:"Polygon",coordinates:["@@JjDNdJ\\FbKPXfZ^Ij@RZNaVSc[MsMOHQPDJcLIJ_zCG[HQxWJBHXdENRR@XQFWZQQGOFSWUCI[WCJuRGLXNMPLhCl[Ta@SqGgJMGOmyHkKEQMINMAGaGULgwY@UOGiKQ]EYyMK”oO_QEIIKiNSMa[LqOKOaVMWMGMDY\\_IKrL\\ERTÂ[DEPYOUA@nNTUHINkRBVMdNvGTxzRF^U`BD\\@tfNDNOJ@Z{TeTJZ@VU€cB[OBOeeQT@^OXBJb\\AbWTF`RCJFH\\RDJIJFXW@WLGBKxWTSJJMTVZND@bbL"],encodeOffsets:[[112903,20139]]}},{type:"Feature",id:"469035",properties:{name:"ä¿äº­é»Žæ—è‹—æ—自治县",cp:[109.6284,18.6108],childNum:1},geometry:{type:"Polygon",coordinates:["@@FJp@fxpQ\\ApN\\GNPNBM`HLMrXLXj\\PEHnI@WUCEM\\GTc\\GZYHTPBHRCPTd€H\\K\\@HXi–BJILJJAVNTOZJNtFPC`YxDPWci@IBgbGKaTOIM@KNKrP@_hE@QbgKWUMJoWAQMFEKM@wTONCJWRCZDHSAM_UD_GWMKeCITSCGIQBGXUHQoMEEGWDQIG]FMQBMaFGueFeSQDUSDSKOCSFMLƒUaPWM_PaEGFETMX]RCRR@HXKN@JNnXXEÂŒSPaDI\\£FkXWIAX]xB\\GN"],encodeOffsets:[[112031,19071]]}},{type:"Feature",id:"469001",properties:{name:"五指山市",cp:[109.5282,18.8299],childNum:1},geometry:{type:"Polygon",coordinates:["@@TCNOLBTLBPx\\AJdl†NR†RIbJTGNF\\@RcIYbmHoLQdKN_fCJYbDRRXKZFVEZVXBXIJBXMdESW[CUYHUVQFQAqsEIMPYMSBUIIJKAIj•GW[@[LGScDOGQOAGSYZ[HSd[HFNVD@XmJFG[OWiWKNqGKN_MAMO[HoM[BoRewo@Y^HpITSFENc`MVCdHNIVCLJFI`NFIÂŒP`@VZbaf[FFJG`O\\WRFA@PVPFPPH"],encodeOffsets:[[111973,19401]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/hei_long_jiang_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"2311",properties:{name:"黑河市",cp:[127.1448,49.2957],childNum:6},geometry:{type:"Polygon",coordinates:["@@VÂÈÞ@ÂŽkx˜nXŽ°VÈa°V@kôw„b‚š„JVškXlVUx„„@ÂŽlL@xkVV°ƒ„VbÂxlVUnVxk@ƒ„ƒKkÂŽVb„Il„Â@°kVl„@„™lÆnkll@@V„VXƒŽš@V„²bUlƒVlV„U„VÇn@nkJšŽlkVbÂœ@›x²V@n°VUnlKU„n`@n°bWLnVUblVUVVbknV`°kkÂŽl@@V°@nz„J@XšxlWXb°n@bƒĠlbXb™bVbƒJ@Všb„a@„„@lbUbšVmnÂœ@lšVmnIW‚œ@WbÞ@„n@x°@š„ĢaÆéϚnœ„‚lČ¯ĠŻÈwmÂ@ÂôçU™mm£Xy°UV™›@wÈ£Ǫ¯kõÃçUњ™Uķ‚ƒĢkVфÂÆšÂÞU°nŎ¥ČUÄŠx°m°¦żVÆÂÂœx°ƒÇ£@y„UônރÆ@Èĉ°Kô¦šW„kWU—bÇ»@™ÈĕWÇÈ£ŤU@›n£ÆUUKVamanwŃmÂÃJ¯k@JƒIkaVaUUÇbkaÆÑkWmÂÃUۙ™Ã@™ƒwnU±ƒ@ÂkkV¯KUkƒJƒ¼U¦ƒšÅ@ówÄ·aķůVÂ¥Uaó@Ã…wmƒƒ_kVƒwĉ‚ĉÂmmn_V»™a@U™ƒVwķóƒ‚U¦ÂLǫéóXÇmÅLǓÇķxÃkƒƒĉ™kÂmakbUĶ°@W¼„Â@bƒšÈÆ@Ė™L„l@„°J¯„mÂkl¯LÃıL—amJ@¼ƒ„™VƧUó„™UX˜ċb¯ńVbkÆÃI@llx„k°V²šV@Uxގ˜L@b„@b™`ƒšÇzkÂókä@Âğ¯ÂWĪLĉǙLmmÂnÄ‹VkbUaƒL@Ž¯„‚bU°ğLÂÃ@"],encodeOffsets:[[127744,50102]]}},{type:"Feature",id:"2327",properties:{name:"大兴安岭地区",cp:[124.1016,52.2345],childNum:3},geometry:{type:"Polygon",coordinates:["@@Âk›ƒϙmÆêġb™ƒ¯@@wƒmÃ@XV@IlÂŽl@ÂbUxl¯VlV™bV@ULVlUV™_kx™VVV™ÈÃJ@„¯šU„™lm¯x@xóÒĉ¼m„¯WƒxÅ£@Uz¯ƒWwnÂUwťƒ@knƒWƒ£óVƒUUwÄŸyó¦WI—Vmm™I@±kwÇ@@bƒ@ĉ¼ó@¯wó@¯aó¼›KŃaUwmWUwÃ…I@aƒKó@Ua™LƒaƒVÃ…wżUUÃl±I—¤VxÇx@zkJmnn‚mbnz™xlŽƒl¯ČkJl™°@„kb„Žmx@x™@kêmVnÂŽWxôXšxU°„bWLóJÂnÇWĵ„V¦™ŽƒUUb™b™ÆġK™šk¯™VU±aXmċÑUwĉKġ„k„™ŽVxk„ÇKkbƒIƒ‚ÛXWl¯bƒŽ™X¯K™bĊš„„ÞVƚnŽĸ²lxUŽ°n°òÈb‚¦—xVbƒŽƒ@¯„Vx@¯VķÞČlĊ°KĸŽȘI°¤ČIôŽò»ƨnÈ°KǬ¦ôWŎÈƨwlƒnKVXmbX`lbšwÂkVW‚XXŽ„L°a„ÂƾaĊ£nƒ°@°¥ŎzÞ¥‚»œalwôkÆ’J„a@ÂĶK„£„bU°ĊxźVÈUĠ¥ƨ™VI@ÂXU°x°Ln¥šw°UmwXmÃÂV¥ĢŽ°@nU@mÆ£š¯lKœšÜw@aÃ…U‚¥UaÃIkmV²‚nn@Ķ»@UkÂ¥VKÞ@ÞÛ@ƒkVmÄ¢a@_ƒJóÂmƒǖ¯Æw—óÇa@alƒUwšwĢřšk@wÆWXUWÂXƒWa™m@_ƒ»ÇéXaĸwVa@ÂÃKkUWkX‚kšKXxƒn@lÄŠV@¯Âm¯nřÆwš¥"],encodeOffsets:[[130084,52206]]}},{type:"Feature",id:"2301",properties:{name:"哈尔滨市",cp:[127.9688,45.368],childNum:11},geometry:{type:"Polygon",coordinates:["@@°`„_šJlUšŽ@„„@V¦°JUšŽnLôÂlnŤ@@šÈaUÃ’Vbkbl¤ƒzk°ÇVÛô°IlVUVôU„xÆU„Ž@bźĀ„º@¦šb@l²Â‚UVlÂœ@°ÒĠxšnXxÆVô¼Þ@Ãœx²KÞÂlƒVÑ°UȰôlwô@²ƒĸ°„lanV@„šVÅŽUll@bÈnÃœm„wÄ¢@la@ÃÞb°UXb˜lŎ²ƚkšV‚I@ÂŽnJnÂĠŽ°knĆbÄ¢wna@a˜kÞKƒĀ„a‚™œ‚‚IVbUÂ¥ÂwÄ wkô˜xnLƒċVçkaUıIUmÂnÄ¡W„°WôĉšalƒÞÅĵ¯@ÂW¹XÂÃaƒb¯a±X¯ºÂLƒaVƒmÂkLóƒƒbkaƒVUKVkkKV_@aÃykk±L@āU@yV_™aU¥ówÇx™@UkVƒn@lƒkÃ…lwšWVwUkĉmkklW@šašbVwnWWƒ—wWL™™@Ušƒ™UÂĂLšÇmƒ„Â@wƒJĉƒLÂÂ¥@ƒÃ_@a¯y„UWw¯ƒ¯UÄ¡x¯aÃXVmÂaU£ó±›¯nwƒa¯óÅVƒXman™„Uƒ›lUXkWa@mkI„›ÂÄŸaƒm™IklÇU™„kĊƒÂƒzkKƒš„lU„ÅĬlš™„@ÂŽnX°@llUxŹ²mKĉVWwk@UbUK@bmVmI—ƒVmwÂaWxXlWȚmºšÞÆbUxV@ĵńWÆĉLkWUbƒaWzkbĉ`U„±LklÅwUVã™UW`Uwk@mk¯VkaõVX@WbÂL™K@XƧºWzÂxƒK@lmX@bkVVÆk¼Vbk@Vn"],encodeOffsets:[[128712,46604]]}},{type:"Feature",id:"2302",properties:{name:"é½é½å“ˆå°”市",cp:[124.541,47.5818],childNum:11},geometry:{type:"Polygon",coordinates:["@@Þ@ÞÂÄ KV¯Âa°ƒ@„KVblaÄŒU‚mnnšKĊȚKX„°ŽĠÂ@ÂÞ£ôllÂÈy„™š_@a‚ƒ@a—KÃÂVwU@±™¯Uƒlkw@kÞJlÃ…Ua°ŃČaW—šVôƒƨVšU„ƒ@»nI˜b²Kބ°Klkn°ƒ¯I@ƒƒkšK@ĕÇń™@aƒÂX»¯@VĵlaÂÿVamI@aÃ…ÃउýƒĊȗJƒôÈÃ…kmƑۃ@kxÄ¡@@l™aVk¯»ƒīŹaƒkƒ¥Å¯™JUaWÂU@@w™aƒ»„KUkÆkUm„UmwÛ±±UUbUÂŽUXƒwWÂÂwÆÃk™lkUanaWwnKl™kal¯ka™Âƽa›kÃ…x™a¯@™amb¯V™lÇwÛĀ™V@x™šmêVƜVV‚aôV„wÈx@šˌx„¦VÞ¯VšlmX@‚ƒL@¯Ua¯LmV@„„°X„ċK™V™Âƒ@UƒÈ@‚¥@w—ƒġIU™km¥Źwƒ¦¯lmn@°kxVV@¦óam„n¦l@nx™lĉVóšmx™n™ÒĉĀĊ¼„þ„šǔêÞ°ˌĠÞÒ°ĀɲĀƨźˤȤƨĊ°w@£nymwnkUUV¥ôÑVmkÂÆmUUVa™mVIkmô„lxkXÞþƒbl„ƒl@ÂkV„ƆƒV„xV@š¼VÃ’@šŽUŽšnnނJ"],encodeOffsets:[[127744,50102]]}},{type:"Feature",id:"2310",properties:{name:"牡丹江市",cp:[129.7815,44.7089],childNum:7},geometry:{type:"Polygon",coordinates:["@@U`lLUlVL„Ulb„aô„lKnÂŽU„„b‚K°¹²W°b„aÞb˜knyUÂlUkamř²L@m°@lšmš²n`ôÅlK„x„ÂÃœKnxV@„Âl@œƒ›ÅXyW_k@™wm™ŹĕmƒX™»‚ƒÛ™l°ƒôšÈ„»š—ô˜ô_WW@UÂœal»šwU@@wšUVƒš@VƒXI@w‚ÂĢ͑ÞȻ›aU_@mUkly@¯óV»XmWUXUWmnÂmÂ¥nUUaWLkȮ²IÇa™wÃ…að¯nUa±a™ƒ™@¦õÆğ„@„™@Ã…b›xUÃœÂnÇłlb¯¦„ôó»mƒ—@±ƒUÂk@Wwƒa¯xU„V°ƒxXbǎÅÂUV™™ƒK@¹ƒKUaȯ@ÅÙXƒaÂl™ƒlÛkalÇUÂǫÇńÇakbÃƆ¯nlš¯Ž@¼™VUx@x¯ÂW¼™Æ¯šmĖ„Ĭ¯ČƒVk‚ķÅmxœ°ô²V¤‚bUnÞW°bÄ¢w°V°„XxƒV°z@bÞ`@„‚¦„KĊŽ„I@xƒŽn„™ÈÈK‚„šV™„@VššXK˜xX„mXUx™a™b@‚kXllÄŠnVlUx™XkxlÆk„m@U„Vlš@ÈwôxV¦šbU`@zÆV@„²KllÞz@b"],encodeOffsets:[[132672,46936]]}},{type:"Feature",id:"2312",properties:{name:"绥化市",cp:[126.7163,46.8018],childNum:10},geometry:{type:"Polygon",coordinates:["@@ऊþÆÞ@bnJUb‚ĀnblŽĊš„„ÞlĸwǔÈŎKÈnôWǬê‚KV¥„ÂĸôUxš„@VšbU¼m`nnĊŽĊ„xlUšmkaVÿšLšwš@°»UÂmbÂKmÙUšwUmVknKUUl¯ƒKU™ƒUȃ‚™nK@ÂÄ kX±lX„°„L@¯¥@wV_m›ĵ¯Ww™L¯ƒUkÅĂVÂU™l›w—V󱃯aƒVka°wVk°mÞ¯Ŧřƙl™²™Ŏk™U@ƒmUkb¯ƒķŽ±„ó@kxȯó¯VUÃ’k„ÃŽ±LÛwÃ@ó»ÅUWw™mÄŸw¯Ñ›@UkÂV±Â@k™a@¥ƒ¹Źÿ@aƒÂÃ…VƒwóVVUkU¯JÜóÈUl¯„yk£laUaVÑÇb@™ţ@kmóÂmK™ÂV¯IU¥ƒ@@ĪÂkV™Iƒ`@ô™¼„blU„lƒÂ™bÈb@xÇKkĢɳaÅɆÅ@ƒŽÂVƒK@z™@@¥ÆKnÂÃœ@@aÛÂUw›wÂnU‚ķ@ƒ_ƒV°Ž@„klVššnULVVÞbVl@°™@nx™n°LŚÆlV„ȃmU²@VmÄ Lƒx„n¯xkWƒzšJ‚wnLmbXbW°ÂšÆ‚™²™@™Žšx@ÂÂJVx„L‚Ā²Æ°I¯º‚È@Ã’nÈ"],encodeOffsets:[[128352,48421]]}},{type:"Feature",id:"2307",properties:{name:"伊春市",cp:[129.1992,47.9608],childNum:3},geometry:{type:"Polygon",coordinates:["@@ƒKƒ¯kWW²ğl@ÂŽmLšDŽ„VVš„Lk°VVmLUlVn™xšVnނLnaVŽ¯¼™@™x™KUÄ€lb™n„`n„Æxô@VbU¦ĸŰĸbôxÆ@„™V¥„»„IVl°LUÂŽll@²„mV„x@ššÞܚÞVnÂŽlXÃ…Ã’lbÈaVVUblb„J@I°lÞIn‚Æ„mxnbUbVLÃ…Vm¤@œţVǤXÈÇĖ@šÈ¼˜aXVÃœaXbWÂŽnzÅŽašř„KôbšUlw@¯naÆKnUU¯Üa@mkkVUÄŠm„™żÃ‚ÂǖŽ‚K„™°L²lÆI@ƒ¯¥ĉƛVaÞk@ÃVaÄ lnUVwƒÂϗmaƒ@™wĉ@™a™VƒxÂamX@aƒ@UaÃ…LƒaVWƒ_nWm£nWm_Ã…V¯ƒm@m„ó¤ÂšÃ¦ƒ¯ÅalmX£ƒÂ™ÂVWUŚw™mÇ@@IV™„WUw@ašI@„k@wŎ»Wƒ„ƒ™ÅVaÂœK›Ika@Â¥lUkUlwÃ…wVyÈwWU@a¯U°m—ÂÇ@UçƒaVa¯mVȁwÃUlƒUk™V@k„mUk‚ÂX£šw°@@ǃaÃIƒƒam™Ûam„¯lÄŸÂmÂmI@ÂÂJ™U™l±ÅÅŽ—kWa¯VÃa@ÞkbÄ¡@ƒxÛnÇm@akkÅVÅl±škšÅšťŚÃ°¯nUl¯xlb„U°b²„ô‚˜UÂœxšk‚VÈUŎ„Vl°„šKXxĶ°nÂœU`@x°¦@Â"],encodeOffsets:[[131637,48556]]}},{type:"Feature",id:"2308",properties:{name:"佳木斯市",cp:[133.0005,47.5763],childNum:7},geometry:{type:"Polygon",coordinates:["@@nš„b‚„ÞJ„b@ȯ@™xW¤ÂÂVlƒn@lšUVlk„ÞVÆxU¼°nUb„bVèÈ@˜ŽnIn‚@šÂÄ¢mlÂUw°™żƒ‚VUn@lnL@VôbšwĊ‚lœ„JķĸĢl„wôwƨxVÂVUƒÂŦšxšLź™Èš°`nnÄ wÅŽJÞÂĶwôJ„Â@¤Xn܄ĸlšn°¼È°lŽ„„Uš‚b„xš@„l@ÞÞÈm°„lôwšL°¼ĸ‚°Þ²nÄ @ôwÞ`ŤI„V„ÒĠU„„@„VJĸbƄ²@°ŽĊKšœ„JĶaÄ¢ÂÈ°@ô¥°nš¤‚bÄŒUš@Vx„mUw@aÃÂţƒÇ™ķƒ@Ä•Ä·Ä«U¯²Â@ÂÆmVÑô¯X¥ċç@™ĉ»UÂ¥ÃÂÅ£KWVÃ…kUVÃÅŽUmÇÂÃx¯aÄ·xÛUóL¯a±óÅb¯™ƒÑŃVÿƒ_Åķ„a@UƒK@wm@Van@UmmLVa—@VImmXUWƒÃUřƒKUwÃUUƒkVƒk@l¯X›‚Å_ƒJ¯k™Jm„ÅLƒa@Â¥U@¯Vƒz¯@ƒ`@¼šÂmxƥšÅKÛk@±laÛ@@Xm@™ƒ@xƽ@WÅŽnšˣĕÅ@@aÃ…@@nÃbǯ@ƒ_U›kUWƒkb™wÃU@ç„Wlw@anIƒ¯lyÂœX°m°VšašÛšm@„mVwÞK°ƒšXlaXmm_ƒ@UƒkwÃK@ƒVI™ƒXmV»ƒI@aƒ¯ğW™bÄ¡aU_¯JU¯ġŽƒ„ĉ„k„Å`±nÃÆk„™bóĊ¯Xƒ‚ĢX‚mVn²JV„lbUè„ČmK—wlóğx‚xV¦UaÂJ›ÂšƒbƑÿÃL—l@bmbÄ¡x"],encodeOffsets:[[132615,47740]]}},{type:"Feature",id:"2303",properties:{name:"鸡西市",cp:[132.7917,45.7361],childNum:4},geometry:{type:"Polygon",coordinates:["@@‚LšKVVnkšbVšÈb‚²U°VnklVlaÈL@anU°ÜmXV`ÂœnôLƒèšxlŽšLX„˜L²ašVVmÈX@ķ˜lnU„Èl`ȹš@ŤŽ°U@x„KnnV„mlnnUl‚lVnnaÅŽwlVÞ҄@n¦šLVŽ°lšwVk„Lšaގl„n҄š@xmLÞ¤Wnœ¼‚WÈLVVUxlÈô„„WVaU_VKšKXUÆbn™‚nôK„bÞw°bÆWXamÂVwÂœK˜™Uw¯WUk„UlJUwVÂUa™@@kmyÂzm›ĉw@kVwšÂkƒÂW¯ÅKU_Vmƒƒ™xÂU@aW@@ÂkK@w„a@Kƒ@@kVUƒaky°_Vm™kna¯K@™ƒL™wÄ¡Âk@@IÇóX™ƒwVakmV@mwXUWanƒlĉÂ@ǙUw™KƒƒóšܛNJۄm°Â@›w—Å@ıb¯Wƒ¹„WVwŹĕ¯kVmÅb¯w@aƒwmV™UUb™V™IkaVwķ™xk¼›b@VXXó`󗙘ƒ¼ÇÂ󙯄kŽÜšÂ„š¼WÂŽn„źĖnššxl@X`WzϮ"],encodeOffsets:[[133921,46716]]}},{type:"Feature",id:"2305",properties:{name:"åŒé¸­å±±å¸‚",cp:[133.5938,46.7523],childNum:5},geometry:{type:"Polygon",coordinates:["@@™UƒƒUwó™mÑÞÑUÃÃUkmmŃyV¯ī„¥ƒÂUÿĉ¯mÇkaWbÃ…X¯aÃxƒaóLÂmmšÅaWV™LULV`UbƒXóƒkÇVwUUÇKÂX›»XmãnK@wĪmÑkƒÃ™bƒKUl™x¯kU™Km¥ƒ@ÃÑkUÅxmbUmÂkVkmmnkUƒmmƒL@w¯Vţ™@Ǻk_ĂmV—k@ĸVx‚VÈ°lLkllšUbÅwƒnÂVW¼nlUx¯XmWUnÃ@™xÃUó¼¯J@LVbkJWnkb™W¯„ÃLUxƒn@‚™n™Ü™b¯U¯n›Wkz„°mJ@bkxƒX@èÞVšxlaX„lVVœ„`°@ÈÂÞa@mÆ@@bÆ@ˤĖm™XÅƾ@@wš„n@@WÃœ@kb@²ÜlÅLƦ™nw™Â@»„_°@„y°UV@@¦„bÆKnƒšI°l„IÆ`ϡW@k„llUV„ÞVVx„LƚÞVX„WVnnUJ˜@UbnKVnm@Ubn@@x„L@VƒbÆĸ„`UĀƄ„Ò°šŎa²ô°bôKÃœVĸw°bÞwȎVnÞÅVUÆlXU"],encodeOffsets:[[137577,48578]]}},{type:"Feature",id:"2306",properties:{name:"大庆市",cp:[124.7717,46.4282],childNum:5},geometry:{type:"Polygon",coordinates:["@@mÇ@ÑÂÇ°¹¯J±ÅÂÿƒKUw‚I@™wšÂš@š±Å‚™X¯WanamKÂx™I„ylX°wƒm„wÄŸKUn±@nVDŽUākƙ¯Kšmmwš@@¯UkÃaUUVK™mU™lk@ƒ¯Â„U„`ĸ@V‚mÂœxVxÃœÂ@bÛ@m‚ÅL@¦š@@y„L‚U„ÂÅŽ@ÆɅɴblġÈL@wÇaša„ƒkkVƒaš»@ó¯_ÃJ™wÇaÃ…Xny›U¯¥Å„@w™bÃa™LmmÂ@@ƒVUÂŽlbÄŸVmš™¯Xƒm_ƒ`¯_Ux™m™L™a¯b@mƒaó¦Çk™¤V„@bóJknVx™VXx±aƒLUbVxkLVlÂLWlƒ@nX@VÃ…bWlÈnƒx„bWšÅbmÂŽ@xÂœbml°b™„XbW„XVmnn`ƒLmšnbmb@šk@mwU@@š¯Jlbk°lbkšmLXxmbVbkllšÅނxX„xVWVÂVa²VܲnxƒVVnÃ…lVlƒL„¼šb@xV@XÂŽVbšIÆ°„¦„lźb„Ĭ°¼Ulšb@kÄ¢@lw„@Æ’ÃœlnȂƄóȘI„ĉ"],encodeOffsets:[[128352,48421]]}},{type:"Feature",id:"2304",properties:{name:"鹤岗市",cp:[130.4407,47.7081],childNum:3},geometry:{type:"Polygon",coordinates:["@@Þ¥‚™ô£nƒn@°„ÆUn`mXn¤mX„`UX„bÆKVb„@@bnW‚b„wšUšbÄŠ@šx„@nbšWVÂmƒÂ_mm@Âó»Um„ŘWXkĠ»²¯‚¯nķšwÅŽ@ĊšŎK°bĸUnјKȦĠÂÈbÆknJššÆUÄ¢V°IšŽšVƾƒwÂaV™ƒƒkÂǯ¯»™mÄ·kۃWm@£ƒÂóIĵxÃÂÅIÄŸxmm¯_ǙŹš™K™wťŽ„ÂUVUŽƧwóxƒxÄ¡kĸķƒIk›ĉ™xóa@UmK@kVmÂUŻ„¯šVxkÂŽÄ¡n™‚Â@mÂmJ¯n°V@bXVÇxUzÆxkxlVkV@¦lbÂœJ›LUbšÆƒ„X„ż@xƒl@™J@bVxƒXUš@JÈ@šn™xVÆUXš‚„ÂW¤knÆb„°"],encodeOffsets:[[132998,49478]]}},{type:"Feature",id:"2309",properties:{name:"七å°æ²³å¸‚",cp:[131.2756,45.9558],childNum:2},geometry:{type:"Polygon",coordinates:["@@²mÅŽ_lƒĊƒ„ƒĢÂV°°IV`Ä¢bšaÄ X„°@b„JU¼Wnš„UJ@„ÞLlxV„„@n`lIUa@K°Iô»ÞVšwÞ@VmnX°WVwmkX»‚U„mÅŽxVak™lkkKǯÂUUwÇWUn™U±b—KWĪKk™w„çóK›mU_nW¯ÛmV@bÇKkbkUml¯U±VÂÂÇaU™™amlUU™LÂK›„k@ƒÂU@mwÛLƒŽƒwkLóÆm_™±™nkŽ¯@@n±KnÅšlbkVV‚mz—lWÂXº@ÂĶ°"],encodeOffsets:[[133369,47228]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/he_bei_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"1308",properties:{name:"承德市",cp:[117.5757,41.4075],childNum:11},geometry:{type:"Polygon",coordinates:["@@lLnlmxn„„IVVlUnb@VVxXJWL@LގVnnV„J˜_@wkmšK„b‚x„wXk˜WXXšKlb²K@nVVVb„L@WlU²„lKVnUJVz@VVb@lżmVUVnbôaVX@°Ub@lWbXš@b@bVb°x„@VxÈLVlšaÆ@Þb²k°@lVUÂŽ@Xn@VW‚LXb@¤VXšKVVVLnm°_ƨ¤@aUIVa„alkX›°k„™V@„alwUÂVy„U@k󙰃na°UVUUmUÂÆw@mkLVUƒWVI„WšLnn@xlVnK„ÂmyU@ƒU°UXaV@U¥ƒU@Uƙ@aVUkWU¯ƒaU@WLUV@bkbmKULmKkUVUkmVIUwlWV²™Uml°U@W„LUwVm@UUK@_ƒKUUÃœaXw@ƒVKUU@mVIUUlmnIVVVbÈVlKnbVKš@nI˜@nVnwVLVK„K„„˜Vnb@aUIVW@In™°@lVnIš@lWÄ¢@°UVL@b„@VyUUƒa@wÂ@WUnU@Wǯ™K@ÂUkkJWaÛbmk@mVaÞU@amkÂWƒ@mXUKkÿƒ£@a„kl@Um°UXwla„al@nmlXnW°znW@aƒwV™@ƒakbĉ¥VmU@ƒIƒVƒUƒJÂkUmWU™KÂbmkUaƒKkUVU@KV@@klw—™WaU@kmƒXVènbmlUUƒKƒX¯JkbƒI@JmIUWU@ƒLml@XkJ@U™kƒK@aVKÂwWa—IWwƒmÂUƒ@mU@JÂ@UaÄ‹U™aUUƒVkI±ƒk@UUƒ@UbVVm@UVÂKƒLƒlkIWaULUWƒXUJU„ƒ@WbUb@lkXUxm@@JVn@J@b„nƒb@Vkx@bšLU‚Æn„JšaVXnKVVmzX‚°V@_lJXxWXƒK¯bÃ…amUƒ@ÂlUI›bñJ@LÇKkIÇ`kxWL@„ƒ@@bUVUb¯xWKk„Å„VlULW@ƒŽn¦Ul@I™lmUUUVm@ÂkWƒnkKma¯XUKWmnwVwÃL„mŽ™VUbUVWb@Lnxm„ÂxVÂŽmbXx›¦@„nb@`™„ƒVƒ@kbƒLU„mVUlkbVXkºmnm@@xk¦šbĢÜlš"],encodeOffsets:[[118868,42784]]}},{type:"Feature",id:"1307",properties:{name:"张家å£å¸‚",cp:[115.1477,40.8527],childNum:15},geometry:{type:"Polygon",coordinates:["@@k™ġۙalÂ¥@wn@nml¹UWlaVknUVƒ„Kla„@„Ušƒ@_ma@ƒœ¥WwnaU‚wnƒmw@KXaVUVašUnÂmWUk°™lƒnUVUXWVw™IWVóKUI@WÂXƒxUU@mma@kUKWLkw@yk@ƒaVkUUÄ‹aUU@Wk@Unm@UVmLÂm±IUƒkJ™kWƒ@a„I@m@U„ƒVƒ„Ula„@VXVƒXmVwnkWKƒKU_k@m¥ƒmX_™JmnU@km@U@KmU™VƒU@U™@Umk@@LƒmW@Û£Wƒka@wk™@aƒI@mmk@mUa@UmUƒIƒwÂW@aWUƒbU@kbÇ@kwƒ@makVUk™U@aƒm@aU@mxkUƒbƒKUXUıKXVWLUK@wkU@V™@WXUaÂ@WbUxƒJÂIƒŽ@¦VèVVX@±ê¯KUIƒ`¯UULVx@Vƒ@UKƒIƒVkLmVkKmš@nUJÃbkIUJVXšVVxVbU„VJ„Un™°bV„mlU°„XnK@Ul@lVÈVUXšx@W„@VXšV‚KÞb„n@VnbV„m`ƒUÂx™kW@UVkL™Km¼@lUnUJVnV„XV@Vm@@LV„klƒIkl@VƒÂWlÂÂŽULWKUL@ÂmJ„@blbUVUlmzUJUxm@UÂUbÄ‹Ãœk@Ub@VšLVV„¦ôbVÂŽmšUKUkU@m„„@VlVn¼WbUJ¯@@„°šnIllÈl˜@nXšWlLÂœk‚J@bkxlxkxlXUlkÂlJƒšXL@bW„n`@nƎXxlL@xl@Xb‚LÂœKlVlIXblVUbUJWÂ@lX@VL@VVŽšXšJšw„n@WnL°K„bVbl@VI@K„Â@U@ÂnmVmV@XUWI@aXm@™VUUkWmn@lmUUk@mUmK@UnwVĉ@ƒƒmU_V@XJôVVUšLVUn@šllUnJl_n@šml@XÂŽlLlw²LVJUL@VmbVbÂlVXmVnlš@Ť¦„nn@܎@bšl„@@XV`„Unb@VlLVb²J‚Xn¥ÆÑ@¥Þ@"],encodeOffsets:[[118868,42784]]}},{type:"Feature",id:"1306",properties:{name:"ä¿å®šå¸‚",cp:[115.0488,39.0948],childNum:23},geometry:{type:"Polygon",coordinates:["@@VbXWš@@UlV@xVLXKWU²LV„VW„L„alVnwV@@b„n@bšVVllUnb„@lxÈ@laV@„aXV@b‚X„x„J‚ÂnV@VVb@nnl@n„J@blšl@„ašƒU_VWUwVUškUm™Ukb±mVwÂœU@ÂVIUW@UWk„@VU@ynL„m@IV@‚bnK„LVaVmnIlaXwV@@WVL°@@xnX„@V`V@VbUVVLVKnwnL@ll@@_V@VVnaÆ@ÂœKVXÆ@nƒ@wƒKmU—™Wm@Âkm@kÃœKXU@ÑW±nIUwVƒ„Kla@I°wU±kškmm¯mƒ_ƒJÂnƒaƒwÂW@IVaUama@wƒUƒmU@mVw@aXk@mWa@£km@aƒ_kVmUnWW@¯bƒkUmk@ƒÂVÇm@@kUU™KUU™@UVUamVUaWIkb@xU@@amUkKƒVkam@@kVUkUWmÂKmUkLUb@xmJĪU@UImVÛVmnUwƒJƒU@VƒXÂ@UWm@Ub°¦UšmxklmX@`ULU@@UW@@xkn¯@makV™UmxUb™°ƒlUšƒbUbƒnUJƒUUVƒa™LkbUU›JUUÂ@mUUUƒJkaƒ@™xUIWJƒUÂnƒJ@V™zƒ@kb@`@bln@l™bƒŽ@X@š@š„@Xl‚bnbVb„@„„VJlInlšbVw@U„K„Âl@lbnan@Vb‚JôLn‚UzlV@lÈLVbVK@LVx—VWXX`WxXz‚bV`UXV¤nx@„bVlVnVlUL"],encodeOffsets:[[117304,40512]]}},{type:"Feature",id:"1302",properties:{name:"å”山市",cp:[118.4766,39.6826],childNum:11},geometry:{type:"Polygon",coordinates:["@@„@VVl@²„lJ„UVVšbÄŒVVb‚@@InV„@‚V„nXx˜JXb‚xUL@b„Lšl@VlI@Wnk„KV@VXnJ@I„Jla°I„W„LVVnkmaUç„WVkôaܯ„@nV°wnJlaV@VUnUUaW¯wXWWwna@£UaWKU¯ƒ¯@aVUkKUamUUƒn»‚an™„IVwUWlkš@„LlWVakU@K„_lƒšbÞU°@šy°n„@„KÈkWW™Âţ¥ĉŃkÄ¡WUw¯£¯ƒÇwÅ£wƒ@kK@kĴÃwÃ…bǤÛÂÅ¥V™lÂÂW°@ĸ™x@VVVULVLkl@V@Xƒ`Ub@Xm@UWÂbƒk@ÆVbnLWV@lnXUbl‚@X¯lmU™VkKWLkK@_UK@U@UmmUxmVXLWVULkU@`W@ULUK@XlJXzV@@xml@VU@UX@Kk@WbUK@Xn`ƒXmJnšmškxUÂVbUVlVVxUbV@nKlL„kVKÞbVKXI°KVšmVUIUKULVxVJVLkV@Vƒ@UbU@WUU@UbUK@b@nƒV@VkLmb@b"],encodeOffsets:[[120398,41159]]}},{type:"Feature",id:"1309",properties:{name:"沧州市",cp:[116.8286,38.2104],childNum:15},geometry:{type:"Polygon",coordinates:["@@@ln@UȄŽl@Vn„l°aX@mXnVlU„`@bln@¤Xb@nWl@bUx@nnV‚„„V@xnbVbUb@J‚X„x„b‚mXa@k„UVwlW„k„KôÂVm@w™kkK@kl»Èƒm™VKXkla°@XVV@VI@ml@@Vn@VX@V@J„@VxUzVVšš²blVk¦@šĠ@@»š@VK@VÈLlK@XnJ@alIUÂl„a„VVbš@„n@a„U@WUIV@mUn@mKXml@lL@LnWšb@XV@@a„VVb„V„@VV„IVWÈb˜IÈ»ƒǟlWšaVUÃ…Uƒƒ™ÂUm@kVU™WVkÂaUwmaóUƒJUU¯ÑUÂ¥mk™¯UaƒKÃ…nÇyóXmWÛX¯aÄ‹bÛa›J—ÂW™ÃÂU¯»ƒaóóÂUmÂ@IƒšÂVVl@bƒLUJWLX@@xšXUxl¤V@V„nVUV„XVbVš@Ž„@@VVn„°VÂŽ@ÂÅ£U¯VƒUmƒÂUWV@mUXƒaƒbUKUwUaÇKn„ƒVk¦Wb@VnLmV@bkV@n„xW`Ã…_UVƒV@bƒUklVX@VmlUƒx@VVL@x—VWVÂL@VW@UUm@"],encodeOffsets:[[118485,39280]]}},{type:"Feature",id:"1301",properties:{name:"石家庄市",cp:[114.4995,38.1006],childNum:19},geometry:{type:"Polygon",coordinates:["@@la„@šy@U„I‚m„VXIVJšw„@lb„IVVnV‚@VVÂœIVVlašK„bVU„VVI„mVa„aV™„kš¯VanwšVlUnb°@lm@wX@@VV@VK@_nWlknwV™¯¥Van@VX‚@„W@U„V„IVxnmÃœUnUVJV@„šnI@wValKnV@k‚mU£na@mVk°K„LVa@UU@UƒmknWWkXU@aWWÂ@@km@UaU@@klK@UkaWaUÂnamm@U„a¯wWÂU@UkƒL@ÂŽUn@x™V™lUXVJUb™LmU@aUWUkmKkLUUm@mW—XƒaƒmmkkWUÂm@@U¯JUUm™kU¯@mKĉxÃwÃÂ¥ÂLƒUóŽmwkUUUWVkKm™kKmLX„lxVLVxXJ@nVJnz@VWL@`nX@šƒxƒ@kVUUmJmIXx„JV„ƒnUVƒ@UVV„@LUšƒ`UXVVƒ„ƒlXL@l@b@VmX@b™xn°™UƒbkKWLXlW@@bƒK„mKULmakLUlmb@šXb@xmXU`V„b@`lLÂx@nWVXL@‚°ÂWlXnlb„KVK„XVb@˜X@l_lJ@V@XnŽ„I"],encodeOffsets:[[116562,39691]]}},{type:"Feature",id:"1305",properties:{name:"é‚¢å°å¸‚",cp:[114.8071,37.2821],childNum:18},geometry:{type:"Polygon",coordinates:["@@nKlLnšlLXUVVlVnxô„V‚KÞ¦ÞxÄŠwnL°@lVnšVV°I@Vn@V‚lXnl„n„b˜WnXn@VVlKnLVlVX@bnVšKVaUIVWškšU@wVm@¯@UÂ¥VmU_°lšK„k‚w@LX‚Va„U@wšUƒUUKlUóW@UVUÂœUlƒ°K„wlKU_na„KVnlKkkšWWa@IÂœJVa@IlJnU@„KVUUmVÂlaXUl@lm@kXWÃÑnkƒ™±™kÂ@wğ›@@UÂ@mKĉLmVÂJ@zmlnÂŽWLÂUÃJU_ƒ@@šmJkXUVlbklÃ@Ãa™b¯@¯Â±JÃ…wÄ¡aUU@ƒkU™@mVÂI±bUKƒL™WUXƒJkaƒLóKULWbUVkKmnk@@bmLUŽƒl@bÂ@mnmJkUULƒaƒbnÂŽmn@lVV@¦n@„l@b‚znx@`Vz@b„xnV@xl„lbnKVx"],encodeOffsets:[[116764,38346]]}},{type:"Feature",id:"1304",properties:{name:"邯郸市",cp:[114.4775,36.535],childNum:18},geometry:{type:"Polygon",coordinates:["@@„bVKlVnInm‚@@a„kVÂnK@al@nmlLVUXaVKôL„Klb„IVWšX„KVL²a‚JnUš@lV@„VVÄ¢bÆx²I°Ž°@šaÞbÞ@lkkaVUlWnI@™„@V`ÞI‚VXKmÂnk@y‚InUÄŠKĂkUUamUUkƒƒ@aU@U™ƒk@WUwVkVJVkkw°a@„ÂmK@UX@VV„LVW@wšwVa@¯XÂm@@lUIWaU@UWkXWmU@UwmUkKmn@lkVƒ²™VƒaULUVmJUUUwƒLma@™UmkIUm›L—mVšmx@b™LUamKÃ…L@VmbkU¯KÃamzkJUb±Vkb™L@lU@WIkJƒzkKmKƒnUaÂlWkkKW@@nkbk@WW¯XUVUJ@XlJ@Xƒ@XlWLkUƒ`VUnaWa„UV@UVIƒaUxUUmVƒK@I@WÂ@DŽU@@U@bƒ‚@nmKÂXmx™@UxkVWUX„@`VLlL@`™zX‚Ãb@b‚„@VUVkIUJVz°KVlnLlKnL„xlLVVUVlXUJ@nn‚„I@mVUlbn@@ÂŽm„@bV„nV"],encodeOffsets:[[116528,37885]]}},{type:"Feature",id:"1303",properties:{name:"秦皇岛市",cp:[119.2126,40.0232],childNum:5},geometry:{type:"Polygon",coordinates:["@@lnV@Xb˜škx@lU@@LUVlV„LVbnl‚ašLXVVn‚l„I„V„U„JV@UnĊ¦la„bš@nJ°UmƒV@„wn@VU„JVI°bnWlXnWVLVK²b‚akk„ÂlI@aUaVƒUwVUUalaVwnUVak¥šX@W‚kÂœLVÓm„mUK@_lWš@n_UK@alÃ…@ÂğÅƑŃÃÂmƒ@їţÇlƒLƒ@¯m™z¯@ÃV™ak„ƒ`@LlVUbkXƒK™@klVXUxƒJmšÂbm¼V„nVVblLUV@b„°V°XLVb@¤mbXxWX°xXÂŽVbmVUVU@kbmI¯xmUƒ@Û°óbUl"],encodeOffsets:[[121411,41254]]}},{type:"Feature",id:"1311",properties:{name:"衡水市",cp:[115.8838,37.7161],childNum:11},geometry:{type:"Polygon",coordinates:["@@„KVlV@X°xƒb@VnnmbVÂŽXblb@VkL@lV@Vbn@@l‚@XX@bWVXlmXnlV„V@@VUbƒK¯LUl@nmbV¤Ân@l‚LXnlVUV@ln@lb„UlLnV@bV@@wlaXJVbnUVbVUš@VVšLVVn@VVX@@U‚KXU˜U@wUK@U„wVÂnk@UUWlk„V@a„UVUÆ`X_ƒw@mlU@anUmK@UXal¥„UmƒÈLVbVxVL„a„bVW@nXU‚Vn„„V°UŤV@ÂUƒ¯Um@Uƒ@@ÂU™UaƒWVUmUUƒU@k£Vw™W@wW@XKƒIUa@wU@@al@UK@_mKXKƒbUU@aVKmš@Xmƒƒ±@kbÇakLÄŸÂVaUw@a@ƒmkUJƒk@ykw@£ƒÂWX@lknk@WVkbUÂŽVnUVƒL@‚mVkI@JUb›I@JXb™XllkLUmƒLmbV`kLƒx¯Lk„›VUV@VôXkVVL„V™V@xƒVUbWÂ@KÂxƒl™L¯kV`UnV¦°@"],encodeOffsets:[[118024,38549]]}},{type:"Feature",id:"1310",properties:{name:"廊åŠå¸‚",cp:[116.521,39.0509],childNum:9},geometry:{type:"MultiPolygon",coordinates:[["@@la„UšÂš@šUnL@VWbklWxnIVV„V@X„JlbUlšXVbn@@K„mV@@X°WVInJmn²@lmVbnL@amKV_kwlmX@@LVamaXaƒaVU@UnJVanLlUkaW@UaVakK@IlKUU@an@ln@alKUƒkIVa@a@klaUKUV@UkUV¯šKVƒV@kUmƒU@@a¯ImJUU@VV@UL@Uƒ@@WXUWa@Ukwm™@ƒX@@w@al@@aVIUmVUUUVWUknK@I@™lÂ¥kU±a™™UUVyUwƒ@@I@UUWm@@Uk@@nUJU@WU¯@kbWlULnšÇ„k¼@llLšl@xUnóŽƒLƒlkXUxƒV@lWb„I„`°nnn™llÂŽV²¯x@JkbƒLU„VxmJX²@Ã’WVÛL@lln@‚Xn˜šnV„L"],["@@@kX@ValaÂa@KWI@UXW@ÂWanaUIW@UaUKÄ·ÂŽk_W@UVUKUš@bƒ@UamxVXnJUbWVXLVbn@W°kb@U@Wó¼mIU¼k`V„@bVbl@„lX@lUôVlUÂœIV`lX„Vn@lUlVn@„l@UVaƒIUWl£Um™ÂVWU@@UUKlUUUnƒVL@KšUnLVWUa›@™U"]],encodeOffsets:[[[119037,40467]],[[119970,40776]]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/he_nan_geo",[],function(){
-return{type:"FeatureCollection",features:[{type:"Feature",id:"4113",properties:{name:"å—阳市",cp:[112.4011,33.0359],childNum:12},geometry:{type:"Polygon",coordinates:["@@lKl@nVV@„bn„@VVnm‚nL‚LXx@š„‚VLlKVU„IXWÃœ@șlbl@XUÄŠUlwnW„LÞw‚m@ÂÞUVmnVl@nX‚JXLm@VnnJla„I@VkxVb„@VÂŽln„J@knKVn„@°aVanal@XK°b„‚@š¯VJXIš„VK@al@nV„k‚@nK„a‚b„@XL@blVVKVLXK„@VaVI°mVaX@V_@a@yUkVw„VšIVašJ°™@anIlaV@nKnXÆm@wUUV±UUWÂUKnaWwXUWmůVƒam@kakImƒUKƒ»lan@VXXa˜W@ÂÂÂ@UlUUa@a@UlwUƒV@Xal@@anIVaUK@V™XmwVmUmV„LXl‚@nalLnal@„šnKlkV@@UnJ‚UXnl@nVl¦V@@VnJ@nUVVVVIn@Va„JƗn@@K@m„kƒa@kmWVaUI@a@™k@@aUL@mmaVIUKUVƒ@@IU@mƒUmmL@K@UÂUUU@mW@@nU@ğ»mVmbk@klW@UXnV@LƒJm„™lUnUJ™UUUWƒƒ@UnkKƒxmLÂa@ƒ@@lUU™bmUVWk@@nkUmam@UakJU_ƒVm@Ã…lÇLUVmVUwULƒKU@ƒk@UƒVUlU@@Uƒ@UaUUWaŎƒzÂJƒaWLkl™b@bmL@„kKƒaÂbWÂŽUVƒ_Â@mV@b¯JmXUbUK™¤ÇLUU@b@JkLWmkUWIkJ@VmX@JUbVXU`¯ÂVV¯blK@LXKl„UV@Um@@Uk@kxWÂŽkbƒL@KkbmL@‚UXmaU@@l@x@blX@xUJ@bULUlULÇ@@VšnU`W@@nÛ¼U@@VmKUkm@VVX@@xǚ@bUbVb@VX@@x‚LUb@lƒ¼XLlbUlVVU„Ub@n"],encodeOffsets:[[113671,34364]]}},{type:"Feature",id:"4115",properties:{name:"信阳市",cp:[114.8291,32.0197],childNum:9},geometry:{type:"Polygon",coordinates:["@@VllInJlknJVkVU@mXÂlUÞ`VnV™VU@U@y„@nXlKV„nJVkXKWaXI‚b@yVk„VUkVwn@‚K@ÂnW@k„KlUXVVUlbnUV`n@V_V@llX@@V„b@bV@@nlVUb¯‚WLnbmb@ÂŽnLnK˜b„U„bVWnLlaX@VVUX@Vln@`kL@ll@VXVJÈIVl@XÞJ°Una„LlylU@UXKlnn@lanLWWnbVI@KXKVL@LVWVL@UVKUIVWX@@XÆJ@In`@ÂlJVI@a„WšÛnK@UlK@UU@VK„nlm„nXal„UllLUbVVšknJ@nV@Vm@a„Âl@@xnV„„lJVUU@™w@aƒk„@XW@_mWnUlÅUmVKVÂ@ÂVÂXwW»XƒWaUwnkWUkÂVÂUƒU@@Â@WlaUkkaƒIWVkm¯xmIUmƒLUVƒaUIó»m@ÂmmwXk@a›mk¯¯Âl™@wƒmkLmmU@UbkUWJ@XUbƒJ@b@l@znÆmK@Xk@Ub@lm@ƒI@akmVKUUVUkU@U±JUbkƒ@IWmkxƒa@UUV™UWVkIUaW@UlÂLWn@VkJƒI@VkK@L@bmKƒÂkJmUUaUKWXk¼VxnJ@„V@@VULV¼ƒ@@UkaUlWL@U@W@IkKmL@KULUWULWKUXUJmIƒb—KƒŽƒ²UW™nWKUUkLUƒmUUam@UU™@ƒmUL@xkV@„VV@bmV@Vk@mwkUƒVUx@ÂmbX‚ÇnVb„‚UL¯šWÂŽnUVLVb@xnlWnU@UVUÂVVUbVVlVkn@llVUXUWUXVbUJ@bmLUJnb@nVK@bl@@š@bVJUbnX@l„b"],encodeOffsets:[[116551,33385]]}},{type:"Feature",id:"4103",properties:{name:"洛阳市",cp:[112.0605,34.3158],childNum:11},geometry:{type:"Polygon",coordinates:["@@VVUllLXl@LWn@J„@bƒKUVmnÂL@`VblLnbV@„b@JmL@LnV@VV@¯„VJVnXL˜@nm@aÞ@‚a„k@m„IšmVbXL‚ynLšk°@°aVJnUV@UVVXk@WJ@VXLlUnJVnnƒ°U@»°U„wl@šb„WmUXĮ@VLXU@m@U„a@I›mkb™a@ÂnaWW@_@WXUV@@U‚ƒ²@„K@I±U@Â¥kKWLóLÂlƒa@£Um@kWKXU@mlLXUVKUU±J¯_@`UL¯ÂWmk@Wa„kkƒlUnƒVUVaUÂ@KUU@mmK@_ƒa@KX@VaUIm±™k„aVKVUkw™@kaƒƒW@kbkL±UUaƒK@UUKVak£ƒ@UmmL@lƒIkmUƒ@Ualw@UƒJkbmIUmn@WKÂImWk@mUUnÃV@ÂŽÂnÃxƒKmXkxĉVWVk@kaċšÛ@WXƒJUV@zÂÂŽm„VWnbUbVbšLlUnŽ‚lUÃ’nÂWV—VWnk@@Vm@kxm@Un™l@Ll@@V@šXnƒškJV„šV@nlVXx˜U@l„n@aš@VLnWĊ¦nxš@lbVKXLl@ރVLƒ„XJl@XXl`lIXVl@Xl‚XUVšK„wV@lanx„zUbVJ@VVX@b"],encodeOffsets:[[114683,35551]]}},{type:"Feature",id:"4117",properties:{name:"驻马店市",cp:[114.1589,32.9041],childNum:10},geometry:{type:"Polygon",coordinates:["@@n@„b°UƂXnVlnLÃœ@VLÂœm@n˜@na@J„„m@k„@lVšVxXX@„V`lLV„XVV@VVÞLVV°„²@lašbnxV@@b„Lšmlm„_VWnIWUna@lšLšbnV°ƒVL@KšV„LVUVaVLXK@mÆXna@wVm„a‚@Xw@KlL@a„@Va@wUÂkaWÂnIVƒla@Kn@VÂn@VUl@nKVn„J@LnK@aVkVUUWƒ@VakUVanI‚²X‚W@UUU°KnUVLl@XaVK@ašU@KUI@W@_lm@KkLUKV_Uƒ@»@UVJ@XV@@mVL@K@U@Kk@VwUUm@kmWL@VkVkzƒKmb¯VÃI@WUkÇJUIUWk@@klK@_km@UVWUUW@kbmKUXƒaƒV—amLmK@ÂnamaXK°ÂVakU@mU@@aƒa@UW@kkU@U`m@U_mVkaUVWUkVƒL@lmX@ÂŽÂLm@UxVlƒUUl@zÂaWJXbWLUlmIUƒkLmWƒ@@z@VUVUšUmÃ_kVWÂŽ@nUVUlmIklmIkJUkƒl@n@Lm@؃IUbm@UJUUVU@mmI@UU@kÂ¥mUk@WmÂVmI@VU@klmLĪk@mbkKmbÂ@WkƒKUÂŽVnUnnxšW@UVLUbmJ@bk@WbU@V„kx@V@bVbkV@V‚Â@‚—XWbUWm@kb„¼VLn„lJlb"],encodeOffsets:[[115920,33863]]}},{type:"Feature",id:"4116",properties:{name:"周å£å¸‚",cp:[114.873,33.6951],childNum:10},geometry:{type:"Polygon",coordinates:["@@lšnb@xlJ@UnLlKXUlJl_„KnV@xVL@bkbVVUè@šWb@„Ubmš„ŽkšVšmbX„VJnUl@„a°@@b„LVbƒlXx˜InmnLVw‚anJÆw²IlmnXVl°VVbÈaVb„@lkn@VWnLlUVmÞUUklƒkƒVkUaVaVaUw™K@kkaVWmw„_„‚l@nU„VVb@b„aV@VV@zXJl@@kl@šlÂœk°WVnÆbnbUšVJ„Iš@VKVm@k™K@_kK@a@aU@@wW@@k@aUW@IUWVUnLlUlVXKVwmk@W@—VWa„¥@k@ÂlÂnƒUIÇKUaU@ƒUUVmIUV™Uk¥ƒVma@¯k@Wanwmƒ„@@Ân@@Âm@UIVƒkUVamUXWƒaV™U_™@ƒmUVUImW@aUIĉK@VmI™b@lU@@n™JƒkU™@KƒIUmmLk@UVm@UÂŽm@@LkbU„mJXÂlbV‚@xUbƒ@@bkK@LWxÂ@ƒbUn@xmbÃ…W@nWLUKUbUVƒK™U@LUK¯„mU@šVV@xULUÂŽVL@bU`WšUz¯aUamKUaƒ@@xkX@x"],encodeOffsets:[[116832,34527]]}},{type:"Feature",id:"4114",properties:{name:"商丘市",cp:[115.741,34.2828],childNum:8},geometry:{type:"Polygon",coordinates:["@@XVl@lLȃ„@VkV@V»UanƒWÂX@VaÆÇô@ÈaVX@xVJXUÞU‚aVLĸbXKl„V@šm°Vn_ny˜XX»mUkÂ¥lK@a„_@yšInaVKVa°_@WXI@ƒ@K‚VnIlbnaV@„l„@‚a@_Âw@ƒlwUKm™Xa@UV@š»Vƒšw@kUKVUUm@w±VUXUKUwmJUUƒ@Âkm@@±mXkmUI™@mm™KUwkbWakLWaUIkJmŽƒX@lÂ@@VUX@JWbX@VbULWbƒlUVULknlV@bVJk„mb¯KknWmk@@nmVkx™@ƒVmU¯KUnUL™@ƒJUIV™maÃ…aUm¯X›l™kk@@lk@WI@yUUU@ƒb@aUaƒUmVk@ƒÂƒ`nxUXlb@lšLVxUbUbVbUll„k„VlÃVUnkVmKUXm@klƒ@ƒnUx@xnxƒn@`VX@V²x@V@b@„Wl@zU`VÂUVVb„L@Vƒb™W@bkXllkLWV@V„@VVÈwlVÂœ@@X˜K²Llb„WnnÆL@VnJWn"],encodeOffsets:[[118024,35680]]}},{type:"Feature",id:"4112",properties:{name:"三门峡市",cp:[110.8301,34.3158],childNum:6},geometry:{type:"Polygon",coordinates:["@@WKUmUI°ƒU@@UmU@KnK@IƒaU@makKUa@_‚KnmVU„L@a‚ƒ@IXm@KWkkKVkUU@aUW@UUIVaƒymwkbU@ƒx™LVUÂWWkk@WUkJk_WWk@WI„ƒUKÄk@WKULka™@mwĉ¥mXUK™@@bƒm@k—VWwkU@m™UUƒlI„™Wm@™@Uk@@KškVmn@lwn@@Ul@Xm˜UXUmÂVÑÂkmÂkV™KUaVamaUXnƒ‚Â@ykLUKƒÂ@™WwÂKmKnÂUm@UmƒƒaU@mUk@kL@lƒxÄ‹xUnkVmnXxWb@`kzWJ@V—LmVUn™lmUÂL@lW@Ub@VšXUbš`VLUbUJ@nmnUlUUm@@bUJlnU„š‚U@lxkbƒ@@XƒJUnƒ@kb¯VVVmlXXlJlzn@VlkVWÂ@bkK™bmškÂŽUbVb„lƒXVxšKÈnšwÞlÄŠKlšVnKlwX@lL@xlUnVn„@šl@lmX@ƄÈb°¼ÈwVJlx„_°xšašlšUÈxlUnbVxnL@lllšbm„n@nb‚@@V„L@V„@@„VLšJnIVVlKnV„_"],encodeOffsets:[[114661,35911]]}},{type:"Feature",id:"4107",properties:{name:"新乡市",cp:[114.2029,35.3595],childNum:9},geometry:{type:"Polygon",coordinates:["@@XVlL„K°bUblbUbšl@nX@W„XVVKVkš@@ÂŽmb@„Ubn„W`kL„LƒV@VVLnKlVXIlVš@@a„@l£nWlƒkÂVa„@°bnUlLVlna‚bnUVUXKlU@ƒ@Âlk@a„I°y„@ôkUU@wšmôšnkWakml™UkVmkUlmUUm@nkUKWanamU„LXW@U‚VnUln„`l„œblL°KXV@ÂÄ J@L°„šJšUVw„anK@UUImmƒÂkK@¯±UÂm@IVmUmmÃ…nÂWaUK¯aUk„w@W±kÂVƒx™U™VƒwƒnÃ…JUIWaÃJóI—bm`ÃbÃ…ImJUI¯¥¯@mU¯UƒJmnUVóUkl±V@zXl„bWVXL@bm„mºÂ@@XmJUXU°llk„@nWJk@U„@¦U`m¯ŽWx"],encodeOffsets:[[116100,36349]]}},{type:"Feature",id:"4104",properties:{name:"平顶山市",cp:[112.9724,33.739],childNum:8},geometry:{type:"Polygon",coordinates:["@@l¤UbVL@V„LVb²VlKlaX@„„lbš@lxUVULƒbšln²VJUbW@@L„b@`nL@nVV@LVÂŽUbUVm„kVl„ƒlXbl@Xn°ŽVK@_°`²IVVV@VUVJnInaWK@Uš@„K„LÆ@nmlXXWVUUw@klKVa@knyVkVanI‚JXUl@XbVUl@@aša@mXk‚bnK@UlK@UUUVaXaWmkUmÂ¥n—WmXaWaÂœkl@VmÞb„KVL@aVI@mUwVm„Â@KÃ…ÂméUL™KVaUk@kUK@U˜WXI@VlKXU‚@VVnInVV@VLlK@UUƒkKU_@ƒWWUwU™@klƒn@ƒƒ@Imb—@@m›nUKÛ@mKUkWVXxmbVLXÂŽVVU²VV@xÃ…nmWmLU@kbmJ@b¯š™IUb™JƒUUxVl@z@bU`W@Ub¯nUJUbƒ@WLUKULkU@aWKƒ@ÂaƒbmLÂ@ƒlmUk@@bUL™ƒWJUI™°Â@ƒŽ¯aWLk@mbUb¯b"],encodeOffsets:[[114942,34527]]}},{type:"Feature",id:"4101",properties:{name:"郑州市",cp:[113.4668,34.6234],childNum:8},geometry:{type:"Polygon",coordinates:["@@@nWVUKÃ…@W„nVnI‚ŽV@ÂœkƂšwV@šnn@lxÞlnÂôJ˜zXJl@nalUÄŒVlƒl@²UlkôVVUnm„I°VnV°@°¦VJnIÆJÞan_VmUÂ@ama™@kU˜¥kaUklw@ÂUIVÂ¥kVUI@ƒmmUÃ…mUÂlƒwVU@amU—JWbUakVƒ—Vé¯Im`ƒk—@ƒwVWmLkU¯ŽƒXkWmLmxÂ@UUƒbm@@x™J@LÂbW@UUVWUkVKƒ@ka™IUamKUkkmmLƒUkJUVWXkWmnÃ…@ƒKƒL™@@VXLmbmJUIUVU@ULWVkK@nWVXL@lVn@¤„b‚kôKXKlL@¦²V@JƒL±@„@VU@WV@X@`XXmb@ŽšblaÂœn@Jƒb@V"],encodeOffsets:[[115617,35584]]}},{type:"Feature",id:"4105",properties:{name:"安阳市",cp:[114.5325,36.0022],childNum:6},geometry:{type:"Polygon",coordinates:["@@°kVaVÂ¥kÂVmUkWkÂWVkVKUwkkmKUU@a„wWWXÂWakKWkXmlašIVmX¥ƒU@a„@WÂnK@kƒƒ™V™I¯ƒ@KÄŸI@ÂWU¯LkK›akƒƒ_kmmVÂU@VWXƒKnVmbXbVLmln@VVknlVUnVlkšlnXbmlmlXblnÈlWbn@@nšK@V„L„bVV°VVzšlnš@V™xƒI™b™ŽU@WLUa¯V™UkWõ@¯kkÂmxk¼l‚„XUlVbVLnlULmU@lƒLkVUlƒX@xW@¯mUƒ@UmIUW™L@aXa˜kU™¯anƒWk°@k™kKmmUIWaÂambUkkKmV¯aƒ@UblÂŽk„mXk¤ƒ@@b™@UbULWVnb@lUVVnmšnVVU„J@bWXX@WJkL@blVU°UV@XlWnXUbW@UVkVšVWbnLUJWLUK@Lnn@blVU‚„nUblxVUVJXU„a˜@Ub„LnUVV@mVIVVn@UbV@‚ÂXbmbUV„_lVXUWanJVI@WkI@WVIVU°WXXl@la@mX@lLXl‚kVbÂœm‚X„ylIXJV@@kšKla²UVa„IVyÞb°LlVna@UÆKnLVbšK@anwU™"],encodeOffsets:[[117676,36917]]}},{type:"Feature",id:"4102",properties:{name:"å¼€å°å¸‚",cp:[114.5764,34.6124],childNum:6},geometry:{type:"Polygon",coordinates:["@@lUVbXa˜InV@bUV„x‚knVVÆnn@„VJlUU¦VJ@ÂkxVllb—¦lVš@nb@bVÂŽUn˜aôJÞIXbVJÆI„m„xšUšV„w‚U²l@XƒxVl°bVLXb‚`XklUnmVblLÂœ@lmšx°LVK@UXIVašWlL@Ukƒ°KkÂVaVUXmmI@UÃ…KmmƒXka±K—L@W›@kUÇxUUƒ@@UXUlKkklW@ašX„a@UƒKUaVUUÂV_@yXk@ƒ@a@U±w@UUW@_„mmw@wVw„mUaÇbUa¯UUkmWkn±JÃ…xmIÂbUxmKmn—JWw„kUaƒK@a¯@ƒbk@mVUIWƒ—Lmwm@UaÂ@WJUb@LUl™@UUmLUbWJ@VÂL@VmXÂWWzUJUꄘ"],encodeOffsets:[[116641,35280]]}},{type:"Feature",id:"4108",properties:{name:"焦作市",cp:[112.8406,35.1508],childNum:8},geometry:{type:"Polygon",coordinates:["@@V@VL@x@bXÂŽWV@XkššlUÂŽWX@J„@nI@KlL„KšUVaV@ÂœJlL@KUk@KÞL‚l²_‚@nWlL„UVVš@nLWVUJVn@anV@a„wÞUVLVx„b„@lW„@lbXn‚Vn@@¼šL°mšKVn@bnl@nVK@blb„L„W„U@VWLXV@nlKn@lVVbXw°ÂnÂV_@Â¥Vƒl@XI@mlƒkkV¯VWnI@W‚@n¹nƒ@aWKXUƒaWk@yk@k„ċUkVmbk@WI—yóImÂÃkkwm@™mU@™xślU@ÂÂmJƒX™ak@ƒx¯V@¼¯Vm„UmmIkVWK@UXIl@UWVUU@mVUI¯b¯@™lmKÂzWKUa™nƒJ@nƒlÂbÃ@@b"],encodeOffsets:[[114728,35888]]}},{type:"Feature",id:"4110",properties:{name:"许昌市",cp:[113.6975,34.0466],childNum:6},geometry:{type:"Polygon",coordinates:["@@lI„VnKlnVlnLVbšJlb„@ULVlUXVVX@‚a@KšI@wn@„aVV‚@nwnKlX„W°ÂlVnKUX„x˜@„ln_°JVIXy‚XnW@U‚K@UXIVanKVVš@Vk@KVaXI‚@Vbn@nx˜KnaU™l™ƒÂn™Va@ƒXa@™VçUUla@aUK@wmUƒLk`kIWVkLmK@V@XUlƒn@JXV@nm„™bU‚óIƒmUa±@@ÑóVUUk@UÂlKVU@akWVUUÂlUUaUK@UUKWbUkÃ…J@XWaƒ@XbmJ@nUJ@bUKƒLÃaUnk@›lXbWbXnm˜n¦lVXnWbUbVV@VkL@VmLÂaWl@n™b@bk@UVWak@WVÂImJUbUlmz@lUbkL@lVx"],encodeOffsets:[[115797,35089]]}},{type:"Feature",id:"4109",properties:{name:"濮阳市",cp:[115.1917,35.799],childNum:6},geometry:{type:"Polygon",coordinates:["@@lLXbW‚XXƒx@bVVnLllVxULUl‚XXlVlUnlÂŽU¦Ub¯l˜nÂœK@V‚bVb@šXbVL„KVxVVnIlašb„a„¥lU@wnalLnVVlVLXnlWVXn@@lVI@WnU@māW¥—aW_k@WwXy@kmƒ@wU„mš„š¦šlUxVLV@UwšJ°xš@VX„@Vb„@š`VX@VX@llšIVbnJlI„bšV„l„˜J@ƒmѯLóa@ƒƒKUa„k™ƒ™Xƒ@UK@wU@ƒlWUUïImW¯aƒLUKU@ƒkƒ»Âk@mƒwƒa@UnKWI@ƒUU@akVWK—k@a±ƒÂbóUWKXUmk™KUÂmLƒbUx„„@lmLXŽƒ@@b„VW¦Un™JkbWnXl"],encodeOffsets:[[117642,36501]]}},{type:"Feature",id:"4111",properties:{name:"漯河市",cp:[113.8733,33.6951],childNum:3},geometry:{type:"Polygon",coordinates:["@@@Lƒ‚UnVxnIWa„@Xb@WÆIVlXaVL@VVLVbkVVÂŽUVlX@bUVkLV‚l@VVôU@Ò²@Vb„nôJVšanƒ@mWU@I„mVk@WkI@wmak™@wlW@w„@VbnLVb°bVyX™V_@aUKVÂVK@wUU@™™a™K@kmbXVmJUXƒ`kn™nƒK@aU@mw™akb±@¯ƒUUÃKUUU@WU@VkLUKU@mUmJUUÂ@WVkL@UWJ—X@VVL@lVlUbšLVKnêƎ"],encodeOffsets:[[116348,34431]]}},{type:"Feature",id:"4106",properties:{name:"鹤å£å¸‚",cp:[114.3787,35.744],childNum:3},geometry:{type:"Polygon",coordinates:["@@ó™™n@xVVólƒ@¯zƒJ@bkl@Â@„kVWLUVmVXbVJnnlLlš¯@Xlm„°bVš—lWb@bšKVXnJ@VV„°nX@@w„WVklU„K@knVVKmkUKUaVkƒWkÂl»nwlŽ°lö@lXšV°UVbXKV@šÂša„Jšw@Um™™kUy¯UUUƒaƒK@U™L@mm@XaÇkkmWank"],encodeOffsets:[[117158,36338]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/hu_bei_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"4228",properties:{name:"æ©æ–½åœŸå®¶æ—è‹—æ—自治州",cp:[109.5007,30.2563],childNum:8},geometry:{type:"Polygon",coordinates:["@@VK‚bX@lbUVnL°„@VlVnUl@VUX@„aVƒmaXƒlašUUU@wmaVUn@Vƒnmmk@m™U@kna™aUÂ¥Vam™X_@WƒU™ÂmW@_kƒVaVKnL‚lÂœ@VÂVal@kÂ¥@kUW@kUKVUlUVÑÂW@kÇaU»VaÂÂlmkUVUVak™@aƒV¯_@W‚UkmVUlU@aœƒƒalI@akkVWUaWÂXUWwÂœWVbÆ@„„l„alIVK@U™m@ÂUU„W@al²a‚¯UağÇm@ƒbkk@wƒ@@W™aULmxƒIU‚™Âƒb¯@U`UX™JmL¯aƒKÂX›WUL@aknmK™@ÂaWUXaWm@I@UÃ…mVU@™™aUV@b™VƒI@WkU›bXkm@VakwUKULWKXÂmJ@XUK@ƒmL@KUwVaUI@KU@mmn™mXka@»V@@UUaƒw¯yVk@ƒUUVmmkÛÈU@mWUnmx„šmlUbV¦UlÂbWVUL@UUĪIUmÇKV„VbUVVxkn™LUxV`VX@š„„kJVVUXWaUVVlUnmKUbkI@WULmK@L@LVlƒLnmUIWV@aknƒ`VXUJÂIVlUVVbUX@¤mbnLm‚m@UXk@mm@UkaĴ@kV@@KkU@aUKWbkLWVkIVÂŽk@UbVlmX@bU@@mmL@bn`@Ln@llVLVk„@XVVU@`VXUš‚¼k`VÂULka@VllVIn¤VÂU@@bl܃bkx@bkL›škKƒn@bn@@b@JUnV`UnVbVKlVXUlbn@°ƒVx„@@b„nVbUllVn@V—VK@UnW@UVUšlnk‚VÈޚxVb„VVI„xVaÆ@@aka@UVaU@@a„k@Wl@nbVIƎ@Jk@„L@VlXnlla@ÂVJnw@UmwXU@aVK°ÒnÂllnLlb„xnKVaV@l¦²nVl@llL„x@XVVœ‚Ķš@našx@U@al™XUVa‚LÈþV°XxWXkK@šmLnlUb@b‚xnLVlVVkb@ÂUJ@xWXXš"],encodeOffsets:[[112816,32052]]}},{type:"Feature",id:"4203",properties:{name:"å堰市",cp:[110.5115,32.3877],childNum:9},geometry:{type:"MultiPolygon",coordinates:[["@@@a@w@kV@nbVK@ƒnUla„@la„Ål@nlVakwWX@WkLšaVmšwVÂ@anK@UlIXmWkk@@mmLkWlwk@U_mKXwWK@U¯K@UU@ƒVUa™kmƒkI™yUUVUmanU@mlwkƒ@_mWXaƒUWUÂ@ǃ@U@aUaVwUKUIƒVkK@UWIXƒmaV@k@Vm@UnwlƒUamk@V@„ULUamxUJkU@Iƒ`WkkK¯XWak@@W@IUV™LWJkXkaÇVUKƒ@kUmbmUUƒUKƒbkKWUkI@ƒkKÃ@@aƒUm»nI@mƒU@UnWV_@aUmWbkLUl¯b@a›kkÂk@WkkJm_k@UV±@ÂJ@b›nU@@WÃIUJVbXL@nlJkx@„Wn@VkJmb—LmUƒ`VbUL@xVn„@XVƒŽ@„mVVnnJVbU„ƒx@„V„nVUbVVƒx@šn„™bUK@bƒ„@bƒJ„šm²„VU‚lbXzVJV„„JVbn@@Xmb@V@bVJÈ@‚Vnkn@°aVVV@šX„KnalLVmšUnnVKVlnLWlXX„Klk°š™šXÂŽWškLUVVV@nU@ml¯nmbk@W`Ã…@mb—LWm¯UƒxnêVèk@mbƒVƒnUK™@kKmXk@@JUI›lÛLllnbVnlJ@LULnlÆaVLnÂŽV@nkVJ„@lkô@²bÆm°w„L„WV@VXšKšVXI@W°ÂÆVšK„b°U„JVIVV„¦XKVL@l‚InaVÃnUl@@bX@‚™nmVL@lVL„lVLVUnbVW@xXn˜bÂœU°¤V@š™„a@kWKUUn@VlnL@UV@Ü»@mX@V_ƒakaÞ@VK‚¯@kkW"],["@@mUkUUm@nllVKXXVK"]],encodeOffsets:[[[113918,33739]],[[113817,32811]]]}},{type:"Feature",id:"4205",properties:{name:"宜昌市",cp:[111.1707,30.7617],childNum:9},geometry:{type:"Polygon",coordinates:["@@°`„U@blšUbUVlVkn‚ŽUbV¼Èb@l‚XUÃ’kVUVVL@lVX@ll¦k@UbU‚›@ÂkmKULUbl„@`nXšŽ„V@XW`nšUbV¦šbmb@lšV@nnlmnU„m@UVnb@xVV™VkbW„nb‚VnÂVa@an@UaVU‚JXnWlXX@l„¦@ÂŽlKÆX„bX‚V@VV„@°¯°xXx‚XV@nV°UVWU_VWXkmaVÂnWVkn@lln@lb@UVLXWlnX@˜aXUmaVK@UXU„U@WVI‚W„XXV‚U@Â¥VKÂœ@‚Uގ„„‚a²LlV@kV@UanKma@UVUnK@UVLXyVL‚knJ@UV@@UXKWUXaV@Vb@mVLnKW„m@aUUm@@UkK@Ula„LXKWaXI@alKlmUk@wVKXL@m@ÂWWnÂ@UVa@K@wna@aW_XWWkXbVW@k@U¯WWwka@UUaVIVƒkU@m±@U@@wVKkaš_@VV@XUVwU¥‚šyUkm@ÂV±ÈUKkȂL„m˜mLk@ó£kmWwƒm@U„IkÂWKXwWU@ƒkLƒwkbmaƒbkK@VƒLkmWIUKkUUĂIÇ«J™XÃ…JULVŽÇLUVƒ@UK™@kI@WVI@ÂUaƒWmXVVULÂ`±kÃ…LmKkƒƒkƒÂÃ…@Ua›XXxWVXÂŽVbUXll@bkJ„b›„@bkVUVlnÂV@X"],encodeOffsets:[[112906,30961]]}},{type:"Feature",id:"4206",properties:{name:"襄樊市",cp:[111.9397,31.9263],childNum:7},geometry:{type:"Polygon",coordinates:["@@@Xl@Xb°WlLXl„_@JlVVInwVbVK@ƒ@UnlVbk„mx@VUnl@U@nbW„XJ@VlL„UVJVLUxVb@b@VȄ‚@XV„VWbnX@`l„kx@nmVnbUVVVšzlJn„šlVb„UV@@V°L@VXLWxnLV`l@kxlXnK@nl@XlWn„`Xnl@@UVa@VÈKš£VLVanW°U@UVU„@„`VIn‚mV@„nV@Xa@aVW@UšalkXKšblI„yÆÂXnlJXbl@@VV@nklU@`„nVK„LVKVb@V„U@UÈK„UVKšIlUX@V`lIVbn@nblVVmV@@XXJšUVV@knKVn@`@X‚VnK„wlLVmUUU@ƒU@aXL@WlU@UUW@UmU@KkLWaXkWmXUWm@U@ƒnk@UmK@U@UÂaUÂVUUKV_@al@namWUI@KUƒK@aVÂ@WUIƒbĴULUJkIm™ƒK@U@K™V@U@a@UkU@K@wVaUwlU@mUƒULmKUkV@@anIWmUK@I¯„mKkl@LUb±lUakLmkÂ@WwUKÃVUIm`¯n@Uk@makJU_@ƒƒJma¯ImwUVkKƒb™aUÃ…@wWaU@VU@mXIVmmUkJkwm@mIÂlUKWzUK@VmLUV@VnbmLVbU@@lkU±KÂbƒƒÃÂÂV›@UL@¦ÂVWUƒWÂXUJ@XƒVWV@VULnbWV—bW@kmWXUK@Vkam@kkm@UlmXUÂŽnbWlUXV`UX¯VmUU@Ul@Lll@nnJ@LƒnÂWmbmš@b™`ƒš","@@kUUm@nllVKXXVKmU"],encodeOffsets:[[113423,32597],[113794,32800]]}},{type:"Feature",id:"4211",properties:{name:"黄冈市",cp:[115.2686,30.6628],childNum:10},geometry:{type:"Polygon",coordinates:["@@VVUnWVXnVJ@„‚U@V@VXÂŽV@@IVJUÂnÂŽ@V@L@KlIVlVanLVbnVlI„ƒn@@a@Kl@@I„JlI@aXU@KlK„kVblJXU„VlU@V„bVkVKXn@VlxVa²I@VlVUxln@bšJXklaVWnLmÃ…@y@k@ašI@W@aXIlVVaV@nnlKnLVW@IUa@a@K„UVVlI@wXKVV@IUƒla„@lUXwWƒnƒnalLlxXLll°@XwVKVaXIl™nb˜@nln@Va@U@k°ƒUmÆUVaXI„JV¯ÇUÂmmkU@WaÂKmakÂVm@U@aVKkkmKkVmIkÇ°£@aUUVaVVnKlkX‚mkƒ@ƒlUVaX@@Um@‚™UmlUXV„UVU@w‚K²¥Ua@I@UV™l@U™V±UIUÇ°»VkUmVI@a@U™m™Âĉ™¯V±bŹĖğaÇL¯lmÂŽkX@‚óĀ@ÂŽmšÃêÂb±WkLƒn@xXx@ÂŽ@b@V@LW@UbƒlÅ£Xƒ`kxWnXô¯¦ÆV@L@JVLƒxkK@V@bkz°l‚lXz@J„UlVla@XUV„bVKXnW`XXV@laVV@V„X@V¯xƒx@xULVbUJ@n@LU@VmmakbUK@b™IWWUUVkUmkLm@VJkb@nUJƒÂ@`V@kX™aUaVmmLkUmJ@Uk@U„±lkzmJUb@b„VUxVXU¤ƒL@JƒX@VlL@JkLUVU@mnUl„¦@V"],encodeOffsets:[[117181,32063]]}},{type:"Feature",id:"4210",properties:{name:"è†å·žå¸‚",cp:[113.291,30.0092],childNum:7},geometry:{type:"Polygon",coordinates:["@@ÈJV„lVVLXJln„K@UlL„anbla„xlK@„XVWxXLlƒJ@V„nXxlnô¤l@nKn—‚ƒÈKl¼VL²Ç‚Un@Vl™zÂÂŽV¦UxWVU@@U™`lbUL@xV@²@@nlVU„UJVb@VlbXx°XVWX_VKUwVKVa@UVKUUVk@KnblaUU@wnWl@UX@lÆ@@a„IVmUk„™šxVJ„U„bܙ@Uk@WWnk@ÂVƒ„™Vm@I@m@Un@m™XUlVlUnJ@knJVU°@@aÆLX@ƒllL@¦nJV@XblLVa²U@UlWš@VX@`@LV@@bXJlIXml_lJÂœU°b„KÆLnVVl‚@ö—Vƒ‚mXaVIÄ¢llUlVnLVlX@@b‚ašnnxšV„L‚bn@°ÂÆÂXmmkĉƒ¯w±™Â™™UÄ‹@ÂKÃÅƧŃÃ癙Uw¯ƒm™¯k@W‚kV@¯UIUJW¼kb™Uƒwk@W`@¦Uônb@VƚlÈ@VU@ƒƒ£UWWnUÆUnmJkUÇ£VWUI@aUU@WkI@Uƒa@JW@k£kaWVUKmnkKƒb™kkVWb—VmUUÂmwU@kk›@UakUUa@V@nlx@lUb±lUbnnWLUyk@UamÂœUK™@mlk@Wb@VXL@x@xWI@a¯Ž¯V@bVn@LkKmL@`ÂXmKmVU@@bkL@V±bk@Uaƒa™L™KUVƒIƒ„™W™XÂamVVbUK@b@Lm@UWkxULWVUnm@UlUX"],encodeOffsets:[[113918,30764]]}},{type:"Feature",id:"4208",properties:{name:"è†é—¨å¸‚",cp:[112.6758,30.9979],childNum:4},geometry:{type:"Polygon",coordinates:["@@n@lxlInVUnWJ@nUVV@Xb@xVƚb„alLVUnx°Jnb„I@„V`lInbl@@V°mn_VJÞUVLXx‚@nllKVb²kVa@KlknL°ƒ@JVLXnmJ@bU@VlnLVKV„@nX@lUšKVaXal@VKnÂ@¥°L@Unw˜bnašV@KV@VUX@lVXI@KW@@IXWV@laVL„„KlaXUVVnkVWV@lwXblIXWVkVmšaU£VaUmVIkU@y@ÂWakKUamU@UUK@kmK@wÂ@@ÂmK@LƒV¯™U@WwkmULƒamVÂVUU@ƒƒIƒbUKUa™kmƒm@UakLmxU@UÃ’WlULţÿmwkIUm@a‚kÈblW@UÂVƒUUk@JW@XkWWUkUKUIlw@aUWknWUUmnIWĪaUwVaۚƒaƒVUI™wƒšVlUnƒJ@bÃ…@@kVWk@mX@xVVkbma@LUlVVUL@VUbULVxULW`UX@V@lUXWaXlWXX`@bmb@x@LUb@VmÂŽXX@‚@nWKUL@xVlknkL@bWJXbWLƒKkb@VlL@Vn@VV@bƒnX‚mLUK@nUaU@WbXVWL@VU@@V"],encodeOffsets:[[114548,31984]]}},{type:"Feature",id:"4212",properties:{name:"å’¸å®å¸‚",cp:[114.2578,29.6631],childNum:6},geometry:{type:"Polygon",coordinates:["@@ÞƂLÄŒ@šV‚š²š°xĊ„nlWnŎ¯Âm@ÂaƒK@„„°‚n„Jšwn™VIUaÆJšÅ@wšwV™XW@aV_l@²V°lÄŠwlaXLšwlUkalVVaX@lVXI@a˜UXJ@U°UUÂ¥VIVKVÂkÂlanLVa@VÈIVÂV@nk@aVa@mV_@a„K@klKUa@UnKWkÂ@@lU@@UW@@nUWUwmaVIXƒ„lV@mLXblJ@kV@kk@KU@WƒkUWVÃ…wkLmW@UmL@lUL™KULƒak@maUUÃwUJƒIÂb›KUUƒ@š™aWK@kUWVkUwVwÂ@™mÃ@™I@wkW@a›wÂw@LU¥™kƒJ@nVJƒIkVVnkV›UkyUIUl@xWUkaW@@°kz„ŽWxkLUWmzk@@bVVVš„b@‚@XlVÂœ@Vl@bVbUn™`Wn—@Wb„VVI@`„LVbXLV`mnU@@lƒL@LUŽƒak@ƒLk@WbUJn¦@lVb@xVb@n"],encodeOffsets:[[116303,30567]]}},{type:"Feature",id:"4213",properties:{name:"éšå·žå¸‚",cp:[113.4338,31.8768],childNum:2},geometry:{type:"Polygon",coordinates:["@@„@nš`lw„k„ƒ„UmUVWX@lk„@VanUĠ¼V@@mX@@nVV‚VXLmJVLnK@b„ÂV@@J„@VUn@VaVUUUVWVLV@@Kk_@almÂaVkUU@WVƒVUVLXmmk@wUaUKUV@°™@kmaUaÈmW„mUƒVklaX@lVnxl@@UnaUk@ƒVUVwVK„nš@VVn@VbVJUknUmmVmk_Vw„KUUm™VakÂ¥@UVKVIkW@UmIVWkIVƒkmmLkwmVUƒ@LƒUU@VVXL@JmLUbmK@UUKmÂkKUUmVUaUnÇlk¯™mJUnmLUaUJUaWL@UkJ™ÂƒUƒ@ƒaklkU@¯@KWLUmUUWVkbƒLƒŽUKkbU@WX@JX@@LWJkUW@UVU@@L™Umb—amx@V¯K@¦mÂŽULk@WbUb™LkVW@kVVxUb@x@LlV@V@b@VšU@L@V„LnšlJVIVK„¦„aVJ@XUÂŽ@b„LV‚@LVJnXmbk@@bU`VLUVV‚b@V@VnL@Vml@„@VXnWVXnWlXblK@LnV@VVX@VkV@XWK@b„VV@VV"],encodeOffsets:[[115830,33154]]}},{type:"Feature",id:"4209",properties:{name:"å­æ„Ÿå¸‚",cp:[113.9502,31.1188],childNum:7},geometry:{type:"Polygon",coordinates:["@@VnXK@L@°lVlk„b„@„VšÂlI@VXKVbVIVbnKVmnI°šlŽÈkVmVbnUVVlLnÂVL@VnLVanK@IWKUUV@„V@KV„nUlxnKlnU„lJUXnJ@VlXUJUL@Vl¦UbnšVVƒLUxl`UnnnmVVlnÂVK„bšmVX@a°Ã°LšaXJV@VUnKVXVK@LnKlLUbVVX@VwVJVn„@@UUÂ¥V@@UUK@ƒmaUÂVÂUkkJ@L@K@UmÂVÂUI@JU@WÂ@U@UÂV@ƒUIWmXUVmUUÇ@UVmIÂlmnmakK@akaW@UwVUkKVÂnUlKVwk™ƒVÂU_WKUkVW@UXaWkUa@w@ÂVU@ÂXaW±@IkbƒKƒb¯L@WƒXkWƒ@UakL@UV@UmVUmL@UXWVL@ašUƒÂVUUUVU@yUUƒIUa@wUKWVU@kƒ™™Wk¯UkwVKƒLUx™K@nVxUlUUWVÂUmw@wƒUUyÂXWlX¦WbUV@„U‚@blbUVVbXXƒl@lVL@bk@lxkVVnVx™¦ƒ`UnkL@V@L@Ž‚@@xnL@lVL@VnVVblLXb@‚@zlVUJVnUbV¤™bUnUlWXkJWakxU@UXml"],encodeOffsets:[[116033,32091]]}},{type:"Feature",id:"4201",properties:{name:"武汉市",cp:[114.3896,30.6628],childNum:1},geometry:{type:"Polygon",coordinates:["@@nbnm‚knJVUÈ@@UĴVknmV@VUlK@IkK@U„W@I„KV£UWVwƒU@aVanIly²kVƒl@@VnIlVnKUnVbšblWU@@_„‚VI@mlaUIn@lKVnUlVVXXšJ@aVLlanbUnV@@K@mVIUaVK@w„w°w@UƒW@UUUkbU@WWX_WmULƒaVU@WkbkUƒV@IWyÂk¯kly@a@UlL„wUK@I@KÃ…UW@ѱUÂm@wlÂ¥kaƒ@@_Vw@ķƒa@akw@ƒkKW£XÂVUVwVwUaU@VUU™™xWKkbĉx¯k±Uk@U`@bWXUš™x@x™ÆÅIVbUJmš™xƒIÂmƒ¯@ĪUmx™nUVVbnJV„@Lƒ@@ÂŽkV@bVnƒ@UVULlx°VXlššl„V@XUVL@xVb„JVV@zUVVVUV„™V@bUKWX@VnKUVVnU@@VlKVb„@lX„W@X°K„a„Lla@JX²Wb@ÂŽUV@Â@xVbXlWb@VUXVlXLV`Uš„lÂŽUxkLmVUÂŽlLUVVxX@lb@blL"],encodeOffsets:[[117e3,32097]]}},{type:"Feature",id:"4202",properties:{name:"黄石市",cp:[115.0159,29.9213],childNum:3},geometry:{type:"Polygon",coordinates:["@@VšUVV@VbUx„aWUÂœblUVmnKlX@bXJVIlVUxVVVIU‚Âzlx¯š@‚VbnL@x‚x@UVaXK„b˜@Xk‚WU_Vm²klW„XVK„Žl@nXV@@w„mlK²X‚aÞén™@Âôÿ@ÂlWn°kUKmmUљÂUmm@ƒwkImWU@UakL@bVLUVÄ‹@™bUK@alIXKWK@™nXnKmkUÂVwƒ@¯b@L„lUL±W™n@KULUaW@kL@lƒL@bU`@nUb@bmlU@UÂÇJ@UUbmKkblÂŽUÂULUJV¦¯V@VWI—V@bWJkUW@UbkUlbkV"],encodeOffsets:[[117282,30685]]}},{type:"Feature",id:"429021",properties:{name:"神农架林区",cp:[110.4565,31.5802],childNum:1},geometry:{type:"Polygon",coordinates:["@@n`lIXll@lÂÂœl@b°aVklKXaVn@bU`mX@V„V@nmJn¼„V@bÞ@lL@„lJXVlL„aVLV„nVnalV„@VLÈUlblWXIšKVU@J„™š_‚Â@an™na‚X„m@KmI@mkk@KVkÂWWw¯w¯°ƒ@UUU@WƒaÃ…WkL@ÂĴ@kWWXkWmÂIUVVbm@@bUbmÂÂUU„ƒbW@UVk@mVkU@U¯ƒmKVUkaW@ÂaULĮVbƒb@VÃ…@Un@VƒLWl¯Lš„"],encodeOffsets:[[112624,32266]]}},{type:"Feature",id:"429006",properties:{name:"天门市",cp:[113.0273,30.6409],childNum:1},geometry:{type:"Polygon",coordinates:["@@@K@UlKVm„_š¥UwUmlUkwl@@aUK@k„kWWUaVUka@aVÂ@ƒVUXaWÂ¥Xk@WWIklm@Ã…xmI™VÃUkxkaƒ„@bWJÂaUL@„W@™l¯UULU‚ƒbƒkV™Ua¯bm¤UnÇUkmUšUx˜b@VkXÇaÂl@bVnlJnxŤĀVKXkVÑV@nwlKVbn@n„šlVbVL„a„J@„VV‚UnU„bVKlnXxV@°š„U@KnL"],encodeOffsets:[[116056,31636]]}},{type:"Feature",id:"429004",properties:{name:"仙桃市",cp:[113.3789,30.3003],childNum:1},geometry:{type:"Polygon",coordinates:["@@VK°VškX@@ƒVK‚bXI@a„ƒlblwÞVšUnJÆwn@lkXJ@X‚WVz„V@xnx‚VXUVVVkUw@mšLVw„KVU„@Um@alU@„@@KUƒmIUaVUšmnwmw™mÂb@aW@UkmKkUkVÄ¡kUJWbÂnU„õ˜Â@UkmUÃ…KƒL¯a›VkIk`WnkJƒÂ@xVLUVVbUbk@WlXbm„VxnxUblbUV™@@VUV@nVL"],encodeOffsets:[[115662,31259]]}},{type:"Feature",id:"429005",properties:{name:"潜江市",cp:[112.7637,30.3607],childNum:1},geometry:{type:"Polygon",coordinates:["@@UbVxšbX„mJVnXVlmVX@bkxVJVLVlXXWlX@@IVl„V‚U—aVwV™lnÈVVmn£°aVbUš„l„aVÂUK@mVU@Uš@VUkaVamwUwnƒWaXkl@VaUaVUUK@w„ÂWI@aU@@K@_UW™@kX@V±VUbkKWaU@mI@Â¥kK„kW@Ã…K@b¯@UVmI@lmIkVkUWVnšm@@V@n@JUnƒšU„@ÂŽmlXXl@@V"],encodeOffsets:[[115234,31118]]}},{type:"Feature",id:"4207",properties:{name:"鄂州市",cp:[114.7302,30.4102],childNum:1},geometry:{type:"Polygon",coordinates:["@@°¥WóXmlw„_ŤW„kVaX@@K@U@a@ÂWwU@mWk@ƒÂULƒWkX±lUnV`ÂXWl—@ƒaWLUb@VÂw@wmKUa@°™kw‚yVÂUJUUVwkUUJWI@akWmLUnkV›aXVƒbUxUVWÂX¤lL@„lx@b„b@ĸUx@`„@lbk¦@x‚n²VƄX@"],encodeOffsets:[[117541,31349]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/hu_nan_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"4312",properties:{name:"怀化市",cp:[109.9512,27.4438],childNum:12},geometry:{type:"Polygon",coordinates:["@@@n„‚@b@XnJ@k°x@aVUnl‚UXnV@@VnJWÂUJV„nIVV°ŽUbVVVL@Ž²LUÂVa°V@aV@nm‚UXblLXWVXVmVLVK@an_„`@X@l°„VlXXW`nX@Jmn@b„@nV@Lm`„bUb‚n@VUVl@nIVbUlƒV@LkJUnVV@xVblVUbU@ƒzUKU@mx@xUnn@@WV@lbUb@šnVWXX‚V@VIV@VUnJ@VUz@JWbXllI@VXVVL@ÂŽVn@„„Wlb@„Žl„XVlL„aV@VJ@XX`„kVwVl@bk„‚bUÂŽlVXIlƒnLVa„mVwV@@nV@XaVJVbX@lwV@n„@nV@VWnIVVUŽÆ@Xx‚a@I„UUKmk@mVƒ„IXmWUš™VJnUVU@anaVwk™›U@UXa@W™@m_@a¯@@K@UVƒ„bnK@blIlbXa@WW_n@VƒU@¯bmyƒUkÂUJÇÅ@WÂU@kWKÃ…wƒÂnm°KVkmankVWnXVWV@UƒƒwXkV@mƒ„UlLnaƒÂVaX@VUn@VnVK@xlnXWšU@a™@@klak™Vw™mUaV@™wmIÛ`m—@mVUXmlIXƒV‚I@K@aU@UaV_UK@wkUmmUKWXÂÂŽmVkUƒL@mƒƒU_nK‚™@aVU@Ukak»@U™™@ymUƒ„¯™ƒUUƒVKkam@™nka@ƒmwkLWb¯mkaƒ_VaVKUĪIUw@ÂkKmÂU@WK@UnƒmaULkU@wUalWV¹U@@WUI@WU@‚_@W@UÂ@mƒU@WbÂbUK@Um@@UmbUwÂWWkk@WU„a@anUUwlWUwUU@wlJVUnnV@@mnI@m‚K@U@w„a@wUm@_mƒVUUaVUkƒƒÂƒ_kÄ‹Uk™VWLƒ@mlU@knÂ¥W@UwÂUWV@VÃU@lXLWVUbVLXlVIl‚knmU@VUJk@@„ƒ@™ÂkVmwmVkxU@@XmVUb@xnKVLl@VxUxkIU`@bWVXX@JWL@bkb„¤@bmUUU¯Kƒkmb@V™VU„VVn@@„Vb@`lnÂœxmb„lUn‚bk„@xU„mV@bmWÂbUÂV@VJ„Il@nVUb‚K@nn@VbnJVIlJVkXJ@X@lmx@bnnWVXJWXU@UlU@mÂk@@llb°x„IUbnJ@VWbXVmI@JVX@bk‚@bWL@JUXUK@U@Uƒ`n@@Xm@XVW@@nX@@`ƒImxU@@JUI@KƒLmK@UÃ…UUV@VW@™¯kUU@UamVUUmJ@n„xmLÂKƒkmJkwkKm_mKXU@aƒU@b@Wk@ma@zUJVUmbUlU@™xnXlWlXXblK„¤V@@nUVVLkVš„l@Xb@VVK‚nXKVx@znW@X‚@@lVK@X@JXbWbnn@JUamLVVXIVxnK@aWUX@˜x@VnI@WlI@anV„IVxk‚l@lbXXšxVVVJVInbV@@ln¦ml@XXVWbkJWb","@@XLVKVXVKUa@UUUmV@l"],encodeOffsets:[[112050,28384],[112174,27394]]}},{type:"Feature",id:"4311",properties:{name:"永州市",cp:[111.709,25.752],childNum:10},geometry:{type:"Polygon",coordinates:["@@lxUXV‚lXUVnlVĢ„JVbUXVJV@XUW¯„ÂVIUK@klW@Un@„nl@V`XUVL@l@šVx@„XXW`UnUbšxUlVnUšV„lb@VnJšUVVVInJlUšVnwVklKnw„LVJVšV@nIV@nbVa@KVVVUUa„KV_nVVJ@_VW„nV@nÂ¥lI@anƒlÂ¥X_VKlwVlULUVVVš@šU@VXL˜ƒ@IUmn@VU@wmKXUWU@m²šl@VIXWWkÂWUkWlkIVamUXamUnmWUU@@Un™lK@ÂXJl@kÂVÂUk@mWKXkl@@aVU@UVWUUVa„In`VUVLnw@U@K@Uƒƒ@w@UVmUUƒ™°K@UnV@bV@Xk@KVm@amk„aU£VWUUmUUwm`UbULka›KXU@kVmU™@aV_UWVIn@˜y„XXK@klmV„ÂV_kWVUn@WUU@UƒmaU@™wnwWanUmmXkƒam@UakLmK@b™xUUUU@KmÂ¥Vaƒ¯@ƒkÂUaVUlm„UUÂ@mUUÇmUk™ÂUyƒb™bUa™XUWWbÃ…LmL@V™aÂL@WWXUKmmkÂ@a@UUK™XWÂ¥kU@VƒUkxmVkUWbUJnÂVJ@nVJXzWxkÂŽ@lVbUX@VVL@`mbUnšŽUn™VV¼k@Ulm@mwÂLƒb@lmLUK@UÂamƒWÂkƒK@£Ua@ƒ›UkJkUmbVlkX@bWbUÂŽVÂŽnnUVl„@bšbVK@VX@lb„V@nU¤šx‚²„Knblb@x„V„ô@šlÂÂÂŽ@b@l@XWxnVl@„VV@XLVl‚LUÂŽUXV`šbXXmJU@@bm@UUkLW@UlUKWUUb™wUm™L@nklVVmVXXm@@bUKlÆn„‚XkllVUVVL@nUbV‚@V@nnV@xUn¯U@JW@UX@xĉ@™`m@@LÂV@b"],encodeOffsets:[[113671,26989]]}},{type:"Feature",id:"4305",properties:{name:"邵阳市",cp:[110.9619,26.8121],childNum:10},geometry:{type:"Polygon",coordinates:["@@XIlJšI„VVK@Ân@VVVKnLVwVmnLVK@U„@šw„J@wVIƚ°ÂX@ÜȄUÈxll@kn@VwVaXJWXn@@WVL@UUKVKV_U@@aVK„x@U„aV@lk„@XylbUaV_šVnalÂ@W„U@a„I@aV@@aVUl@Xm‚UXÂWaXml@@kk@ma@ÂV_UÂnUV™UUWJUa@kkaWLUmk@@LUVWUkJWkÂK@¼UnWJƒIkV@b@JUIm@Ul™V™Âm@Uw@a@kÂWƒXWKUknW@ƒWUU@k™mx™UkVmIUJUU™VmI@UkaUƒV™UmVk™wVaVmX_WW@ƒUw@™@kUKWVU_k@ƒmm@@VkX@lVLUJƒÂX°WVU@UIVWUaƒIUÄ¡mkVUkWUÂVWkwWXk`mI@Â¥kUVƒUƒUn±@Âm›XkWknV„UVmmU@@XƒVƒUk`@Xƒƒƒk@¥¯»mbĉó@mkU@kU™ƒƒ™KmX@˜UnmL@lULkKUƒWUU@ƒbUaUnƒ@Vb@l„¦Ub@l™@UKmnƒKUnl„UVVbUVn„@`Vn@xƒb@x@VÂL@nmJ@nU@mmUVkI@xVVVxkXVxmV@bƒbXVl@Xl‚XVxna@Vn@@VVL‚aXaV@n„‚@@V@XÂ`V@@XVJ@XV@UºkXVb@xlVVKnbm„@VXLV@n‚lL@ÂVxšJV„ULUb„`lb°nXalKnx@„lbšmn@lbULV„„V°š„ƒnV@zšš@Vl¼lb@VUV@bšmLV`„„@n„KlVnU‚ÂXWVLnnlV@xVLU`VbV@"],encodeOffsets:[[113535,28322]]}},{type:"Feature",id:"4310",properties:{name:"郴州市",cp:[113.2361,25.8673],childNum:10},geometry:{type:"Polygon",coordinates:["@@²zVaVlnVl@nšVk„Jl_XJlIVmnL@mV@VXn@lV@‚XzV@lyV¯²U@UlJ@XVKnVVIXl@UVLV`@n@J„I@mlI„KVLnUlVUVVLXašKVLl@nb@ÂŽW„XV°KUnVV„L@xVJ„L@b@LUVVVU„˜VXbmbVbn@@lUbm@Âx@XVVVÂŽ@Â@˜@bkImx@Vm@Xbƒb@l°XU¤„a‚L„mnL@bl@@™VUX@VxnV˜anLnƒWÂĴXKVwnUWÂXmVIUWÆLVx„L„w@wVmlU@Â¥XƒWUkwlÇn_Uw„WV@VU°wnÂU—ƒy@aVškVlnL@lVn„w@VlJ@b„X„x@bVKnb@U@WVUl@@Vnbl@XLlK@aVLVKnxÞn@a„LlmUaVU™ƒm@Ã…knUmaUKmVk@m™kk@UlWUkVm@w@kUU@W™ÂU¯™¥@w„Ç@aVIlUVÂ@kUWU@UUm»@kÂ@mKVkUKUwƒaUaUa›@k„kUWJkImaU@UK™@maUzk`@zƒy@XmJkL@UUJmUkV@z›@kÂŽkVmK@¦UbWL@aÂ@UbmKmwUK™Xk›VUUkmVkw@UUKmL@WUIWa—JW_k@@WmI@mk@WÂkWULUUVKUUVm@šU„bš@‚ÂnUǃ@U@w„™V@Ua@aƒL@ak„›l@k™UƒJƒwó@@L@V@„™`@œƒJ@xnn™šmV@bkJmUó@ƒn—JW„UUmƒU@UV@Lk„WlnnmVXbmxšxV@nbV„V@XVm@UVlXU`ƒÂUÂŽkn@lWLƒW—zm@UJVXU`@bVšUn@lWVÂœLlbVKVan_VxnVVVUXV¤ƒbnl@bUn@LWlU@@amU@V¯L„šVVUn@V@x„„@V@L@VmxUKUVm_ƒJUbVV"],encodeOffsets:[[114930,26747]]}},{type:"Feature",id:"4307",properties:{name:"常德市",cp:[111.4014,29.2676],childNum:8},geometry:{type:"Polygon",coordinates:["@@l™U™mkUwUyV™@VW@¯Va—ÂVmUU@KVUVUVLnaWƒnkUÓV_@mVU@Äw@ƒka@kVmƒUmK@IkaUamKkXWaUWÂ@WUk„™@@KVU@aU@™L@J@XÇVUKVak_mWkLWakVUbmLUUmlÂUVKUU@kUWW@UImJ@xkLkKm@@Xƒ@óÃ@UUk@UKƒV™ƒULƒKƒXkWWbkaƒIUƒWU@mUk@WLÂaUJġ™ƒ@@XÈÆVIl‚„Vnz°aV@U„m@X`@XWbkakJ@amLƒaU„@V@L°@@bn`š@@XWb@VÂœVlšUxmb@bUVmVUI™šXVWnƒJU„@nnlVLƒV@JÂbWzk`m@UÂVK²V‚x„k„LVl„@Vn@V„„°xVKVkÂœVVlUblx@bU„‚Æœ@@nVnUll„kx@VW@@VkLWxUL@bÃ@kKkVõV@bkXVVUVƒ@ƒVkUkV›LkV™a™@@™ƒ¯xUxmX@JVb°WXkK@Vm@k„Vb™bn¤‚xUXkJƒblxnXÆK²l‚_@Wnašn@ÂŽUL@b‚JnIlV„@lUÂœ@@¯ô@lWÈ‚IVKVm„U@aXaV@lwVXn@@K@UVKUUnU‚bn@lWšX„ƒlJnUšLšKV@„„l@²a@UlK@aV@naVX„WV_nKlL@KUm@a°U°Â@VXL@a@wWmXal@„k„@VLn›V@@bl@VnX@mwVa²aVU@mkÂ@Â"],encodeOffsets:[[114976,30201]]}},{type:"Feature",id:"4331",properties:{name:"湘西土家æ—è‹—æ—自治州",cp:[109.7864,28.6743],childNum:8},geometry:{type:"Polygon",coordinates:["@@@KšL@wnK±Ânƒnm‚—@WUk„ƒÜÈn@n»@mVamk„mšU„„l@V™nmmU@wUan¯VKšLn„VWlInyWUÂœI@WWk@KXU˜n@mnUmU@WœƒmkV@ƒkXašaVaUm‚IkƒƒÂ@ÂkaƒX@ƒUm@ÂUKWU@UkJWkXa@IVy@UmIUVU@UJU@WÂXWmU@™VakaU@@Xm@Vm@wnwV@VL„yV@VakUUa@wUUVmlI@K„UVkUamJk@VU@UÂmVaƒan_@KmUƒ@@anm@ImWX_WWUk¯ƒ@k@Wƒ_m`@bULUKUnUWWXkKWaÂVmnU@@b¯UUbVŽ±K@ÂUKUUVa¯ÂUUmJUƒVIXÂmI@UU@WmÂVmkUV@b¯w@lmI@W@aƒÂ@m¯LXbmJVLklWL@V@XXÂŽmbVVU@@VU²Ul@VlX@bš`Xx›zUmkUVÃ’lÂŽ@bXLWxXVlš@V„bkLma@nmVÂmULVbmVUb@lnzmbUÃ’Vl@°nLV„lJkn@bmJk_ƒVmmkblxÈx@LUb„xVb@V™n@JmLVÂŽUš@„nV@¦VbnJ@ÂlVVbkx™bm@UxVLV@n`UnVVV„kl°z„xVb@VU@@ÆlXnWm¦nbVK@XVVUVVl@X„KUV@nVL@WnIWÂŽXLVKVLlxUbVKXVWbn@@UnKVLVb„JšU@aVU°b"],encodeOffsets:[[112354,30325]]}},{type:"Feature",id:"4304",properties:{name:"衡阳市",cp:[112.4121,26.7902],childNum:9},geometry:{type:"Polygon",coordinates:["@@lšV@XV@„mXVlXL„W‚X@l@bVxn@šŽšUVkn@VJ@I@alU„JXIVm@»‚LXllIXVVU@Kl@VnXKlb@lVbXIVVUšmVVÂU`@Ânbl@@lXLVVVKVbnXWJ@VXbWxXb„Ul™VK„¦nLVVUVVbšb„K@U˜LnK@Un@VxlUV`UnnL@VVL@JV@VUnxnKVbV@@VšIVUnJUÂVUl@nW„XlÂlIUa„KVbÞLV¼²`V@VIUwlaVmXa@IWanK@U@m„kVƒVUVaX@lšnaVLÈ@‚¥@kkJUÂWJUaƒXkaUm‚wVÂXJ@_lWUU@Â¥n_‚KkamÂUK„™@amKƒnÂKƒbV£¯W@k„aWan@@UnwlJ@a@—@ÂUÂUU@W‚wn@Va@km@UanaWa—UVƒUUVU@K@aƒKUI@wƒKUUVm¯LWUXƒ@Âmak@UK™LWbUKVUkUmVUKƒLkJ@nƒJ@I@mU_UK@VWkUJmUUL@WkI@V±VU°kzU@Wy@ÂkUm@UWU@@nmKUnkJWIk`ƒIUlm™k@mUUkUb±yUX@VUV@bk@WlXL@nVlUÂl‚k@WI@ÂŽkLmš@VV@XVmnnVWbnVUblJXkVl‚XXlWXUJk@±™@nXVWVnL@xUVm@Vn@J—„WK@U™V™@UUVUVKUkkxULW`k¦m„@bkJm¦U@ƒmUX@`UImUU`ƒLVbUVUU@LUbmaU@mJU@U™UIƒKmxkLUl"],encodeOffsets:[[114222,27484]]}},{type:"Feature",id:"4306",properties:{name:"岳阳市",cp:[113.2361,29.1357],childNum:7},geometry:{type:"Polygon",coordinates:["@@@wUklmUÂUmU@@UVm@wUaV_mmUKmwkIkJmUUnm@™Â™@UUƒbUKUƒmÂÛamm¯xVLkbÇƃUƒVUzkVUlƒUUKWLX¦W@ƒVUUUaƒKUbmLÂKm„@akU@aƒmVaUUVIVWkk@wkƒƒ@@xmLÂlmÂÃ…wmbVlXlÃIWVkK@kkVƒL@VWKU@UblnÂaƒƒm@Âb@bšnW`@XUJk@UUWKƒk@UÂKƒnn‚@xmLUVm@kbVbV„nV@V„b‚Â@KnV„LWšXŽÆVĢ¦VblŽš„n„UJWz@ƙVóUVbkV™aÃ…x@¦lVUbVVknWKƒ„k@ƒwƒK™VU„Å„ƒl@zkb@`m_mJ@xX„mbVbÂœ@llV@n„@llbXL˜UXalUšl„alVnwnLVKlšVbX@@I„V@blJ@bVL@VVVUXȤ‚VnkVÑXmlbnš‚„VKkÑř@UmaVç@±XUlI„xlV„@VaX¯lUVVUšVJn—V@°°nŽ°„Vxĸł°¦šb²¦lJ@U@aUK@kUm@_m±VIXal@„Kl@„bVÂ@K„K@k„m@UmUUaƒK@_UJƒaXU˜@Xmš_VmUk@WUk›@kU@a@m@UƒaUÂUU@al@ny‚XXWWwkÂly@¯n@@bnV@k@mVI‚„œVlUUmlU„JUw„I‚bXƒVaUalÂ@K„b@ƒVKVkXVl@VkUU@ylUÂœVVaVL"],encodeOffsets:[[116888,29526]]}},{type:"Feature",id:"4309",properties:{name:"益阳市",cp:[111.731,28.3832],childNum:5},geometry:{type:"Polygon",coordinates:["@@„ŽÆxXL@l‚V„@ĢšVI‚bXKl@nVV@„XVŽ„JlbXalX„W„LVKš„„UVLl@VV„@ôބ@@Wn@lLlK@wnIVJX@VX@lVVUL‚VnkVVnKValUXblKnXl`UbVLÈU@W@IšKV@@bUV@Lš@lƒXV‚@VXXblWnLVblb@JnL„VUn@llb@„ƒx@ÞUV@nU`VÔmlX„mbUKUVUV@LVVUn˜ŽUb@°UXš@U‚VzVxnlVškšVnlVnaWƒ@wnIn`@_la@y„kƃVƒšU„L„xl@„ƒXLlmUUVakU@¥ÆwšblUUaôVšU@Ã…XyVImƒ™ƒkÂUaġ¥ÅUWÂX™ƒKmU@Lƒa@UmUUƒUalan@VUnK@wm„m‚L@V„lXLVVl@VI@WX_™m@a™¯mKUÂkwWÂ¥UK@_UWWLUVkUWL@WUIkVƒU@JƒwkLUUmJVI@WkXm@VmkKUIU@mmm_@VUV™@™„kJÄ‹wUU@KÂUWkkW@IWW@Âkm@klwkWVkkU™V¯m@kWLU`mIkmkXm@@`@L@xUKWkU@VL@JÂUU@mbUKVa¯ÂWVnL@`lXUVkU@xW@UbUWVU@UÂJ@„lnU@m‚nÈmVƒa@bUL™wUb™@@VkxmUUĪÂUV›K@IƒUƒmk@akm@wmIƒŽkK@b™VWXkm@wULUmm@UVW@Ub„ÂmbkKƒVn„U@Wl„xV„U@UXmWUXmlnbUl¯Lmn"],encodeOffsets:[[113378,28981]]}},{type:"Feature",id:"4301",properties:{name:"长沙市",cp:[113.0823,28.2568],childNum:5},geometry:{type:"Polygon",coordinates:["@@lVUllXkx@lln@‚XX@JlXXl‚V@LVVÄŒxlIšƒš@VU@Un`nnV@VJlLUnn@lW@XUJnIVVlK„x@I„VlUVJ@XXKlVVUXKVX@`VLX¦lxVÂŽnLš°‚an@„„‚bkmVaV@XL@U„KlU@llLXUÞJWkUknaÆxnŽ‚knK@w„@l„@xllUXUJVVUb„n@blV@bnƒ‚LnKVa„LVbVV„UX@WÂ¥XKVL„VVklUVy„U„VÈÅlaUK°wnnÃœbn‚V„VL„aVVš@šÂn@VmnVlIlJna„@Valkn@na@amwm@„UXw˜K@aUUVUUaVa—wWK@kU@UaW@kKUUƒƒ@k™W¯XWanÂ@k„™mmÃ…@@I@U@KmLkaVUƒKkLWVUƒk@UVmU@am@kkk¥ƒUƒVUK™„maUb@ÂŽUb™I@aƒKkkWmÂ@W¯K¯b@VmaULVxUXlVk@UxVJVbUb@xULƒ@ULWW—LƒĕmxÂVVL@šVb™KUwƒaŲWwX@@WƒUWLU@VbkV@aU@@VUnmJ@VUn@VƒLUK@U‚mUIk@UÇmÂU@@UW@ÂJ@LƒbUmVI@aUmW@@bkXUx@lmLUbm@UbkJ@V@XmlUbkKm@ma@kUaVU@aUKÂ@mImJUIkVƒUƒVUakbWwka@UWKkLUamKUXm`Ã…_U˜ƒÂULmaU@@lUV@X"],encodeOffsets:[[114582,28694]]}},{type:"Feature",id:"4302",properties:{name:"株洲市",cp:[113.5327,27.0319],childNum:6},geometry:{type:"Polygon",coordinates:["@@X‚‚Unw„Ė˜KXXVK„@VK@wVaUaUIVwl@kUVWUwVKnb@U°a°LXŽ‚@Xnll„L@bšJVa@ÂVanbšƒVL„U„V@al@@UV¯ÅÇ@Ummk™w@¯ƒyVwnUVVVUkÂmWV—nKVUƒa@WXkVKn@lUVU„VVVXIlV°VnI@VlKnV@ÂmwVm@LXKWkUÂ¥ÂwWwƒƒ@k@m„X@KX¯V@VUVa@VnKWkœƒV@VUkm@aWa@wkUWwkmV£VÿXUVL@mVIXaò@nW@ašUš@@am™@aUU„UmÂXmWUk@ƒƒnÂUW@_maVm™wUÂkamaUL@aƒwƒW@akI@UƒxUm@kmKUk™lUÂŽ@b„zV˜m¯xUVU@ƒXVxm`kÈlxXVW„@¦kVUn@xƒxƒKUwÃ…KVXUJWnXÂŽmVUxWL„¦XÂŽm„mK—bmUUwW@UV@šk@ƒšVLnÂŽlbÂLm`@¦VVkX@`WIUÂŽÂxVnlb„WVbXIV‚lI@l¦Ç@UKmbk™W@UbUVU„ƒl@n@VmLXb@JWbUnkbVxUJUxWXXlWL@V@V@XXJWx„zUVVVVKnXW`@bkIUl‚„nLVJUbUIWVXlWV@XklVbnn@xlš"],encodeOffsets:[[115774,28587]]}},{type:"Feature",id:"4308",properties:{name:"张家界市",cp:[110.5115,29.328],childNum:3},geometry:{type:"Polygon",coordinates:["@@@InWVw°wš„@š@šblUÂœKlUlV„U„@VUUUlW@aöUlUlLÞ@@aVKXwlK@UX@@UlwkƒVkUm@m›@ÂÃ…Vƒ@akwVaUk›UUlUL¯wƒƒ@UUmƒ@UkƒKƒlÂw±UULVÂn@l_XyWwÃ…@VÂUUmJUXU@@mmƒU@kxW@UaUIWbU@@mU@UxƒnUbmKk„WJkUVÂÂalƒ@aUkUxƒlW_@WUIU@ƒbkKWUÂJVnUb™bWb„lU@nl›„@XnVmV@n—mWV@LXl@X›JXVmzkJUXmĪKULm°Vb@xnVmnUšk@ƒƒ™VƒnnlUb@nm¼m@Ûǃ„Vl@X˜mnm„²ŽmL@x™K@LUl@nULÆx@V@VXVWbXX˜l„@nLlm@bVKÂœX‚W„L°bnUš@VaVUš@šmšÂVw„JnwVK°zn@V‚Vb„a„@Ċ¼"],encodeOffsets:[[113288,30471]]}},{type:"Feature",id:"4313",properties:{name:"娄底市",cp:[111.6431,27.7185],childNum:5},geometry:{type:"Polygon",coordinates:["@@lL„ÂnJ@xln@bnlV„‚„@JÂœLVUšŽV„nVlw@Uš@VašxVK@a„bnUmÇnÂV@km@ƒ‚I@VUVVXVaX@@wlVVUkW@_mKXU°‚UbVLnaV@‚V@IUKV@XlVL@w@K@_n@lWlnnJV_XK@l°nšU@WVU@kV@nbVK„ÂV—lƒ@ÂnLlƒ„LXU@ƒlmkw@nW@UKVa¯IVÂn@@aVUUKl@nXVKVn²a˜ŽXblKnLlmVI@KUU@akLUaVa‚UXm@aƒÂ@wVUVKnLnWlXl‚n@@U@anUVm@U‚Inm@IUK@UmKVmU_kVUwm@@VmL—K@VƒL™aUaVUUUmKĴULkšƒVWaXwWa@UXImWUaULUUWKk@WnXbWÂŽÂVWnk@UV@bU@@bƒJ@bƒV@XkÂŽmb™UU`VbkaWzƒ@klU@ƒb@VƒwUL@bV@U`ULVL@VUK@Xm@XWWIUbUxm@@lkkÇwƒVÛÇW@¯ÂřUJ@xƒI™xƒ@@VULmKUnUxmKULUUm@@‚ULƒU™JkIWJ@b@LÂJUÂW„kJWnUV@nn˜Ü_nJšxU@VbšnUxlškb@lš@"],encodeOffsets:[[113682,28699]]}},{type:"Feature",id:"4303",properties:{name:"湘潭市",cp:[112.5439,27.7075],childNum:4},geometry:{type:"Polygon",coordinates:["@@Æ`n_VWnLVblKXL@VlbXxlaVb„U„VlUVJnInJ‚@VL@bUVVb@lnbn@lLVank@W@UlIVan@VanK@kVwlW@aX@Vn@bUJVn„a@K‚IX@@VV@nÂŽVÈl@VJÂn@VVL„K@UVm@UnIVm@UV@@blUUaV@XK„V@XW@XxƱ„bVxšLUa@™UKWÂk™@wmmUalk@WXUWkXUVJVaUImKƒVklJ@aX_mWULUUVUƒyXwWI@W@U@UXKWkXWVwU@±_U»ÃKUaƒLVbkJkƒWmXk@UVVÂŽmIUV™J@UU@UamLmwUVU@mnÂJ@VUnmV@b@Vm@kÂkWmXmKULUV@x„Ž@bWnÂVUbVblK@bVV@LUJknmKkLWa—±bUmULmWk@VLUV@bm@U°JUbVLX@@mlxkn@„WVƒKk„mK@Âk„"],encodeOffsets:[[114683,28576]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/jiang_su_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"3209",properties:{name:"ç›åŸŽå¸‚",cp:[120.2234,33.5577],childNum:8},geometry:{type:"Polygon",coordinates:["@@„n@‚°ĀÞ°@¦ULWKkx@bkLWb@lUlVXXJVbƒnUKmxXV@bm@@Xš‚„LޚܦXlVnš‚mzVJ@n@‚²ÞôkƃÞaȰĉ‚wnljÜó„éVÛnÂĊīČlj‚ĉ@Å@KÞUlU@ƒkklÇÈњÑlÄ¡XÉ›@UġƒƒaU@U_ƒW@n™@kaUL@VW@kKmkUV@bkbWW@bkzmaÂ@ƒJWI@KUKULƒ@U¦™`@XUJ™U@KmXƒw¯KXkmy@aUIWJXXmV@K¯UU@@bVL@¤VLXbV@@JVXVK@„„JVn@bkKmakVVXUVVVlI@`U@nzVVƒb@¤n@@UlKXLVVšI@V@nV@V‚@ÈUx@šóVÅšƒkÃ…Wó@mU@bk@Ãwk@WbXxm@@J@zV@kVƒbV‚nLWVUX™WUXUÂŽWLUÂŽÂ@Wl°z@VkxU@UVWIÂxWJkbƒĬ„nW@@bUl"],
-encodeOffsets:[[122344,34504]]}},{type:"Feature",id:"3203",properties:{name:"å¾å·žå¸‚",cp:[117.5208,34.3268],childNum:7},geometry:{type:"Polygon",coordinates:["@@XKVX@WnIVx@K°Lnll@@I°K„nVašU°x²mlxš@VanU@aƒk@akmV@@w™@Ua@aUwVwUw@w›@UK@£kaĉlóIÇVkŽ±@@kUKmVkIkxW@Ua¯UUm@UVI@WVI„JVÂ@ƒ@Um@Uana„U@m‚I@J@XV@XaVÂlkXƒVaUUWLUyVIXmWak@ƒXkJókƒJUL@KWkk@ULU@Wa™lUIkJmI™mk„VbVš@lV°kXUKWKULU„mb@VUlVnƒb@VÂV@IVKUUmU@ak@@bmV@xklƒUƒU@UÂKmV@nƒJVbkXƒKUamLUJ¯UUVmI™bVV—Ll`@LƒLU`m@kXUVU@V„lxUK@xkIWbUKƒx@ÂV‚kVVn™b¯@@U™@ƒxk‚mbkLÇK™b™@@XnJ@LmVklƒ@@XƒlUƒVkxƒakVVb@bVnUbU@@x˜VUšVb@š„ŽnIÄŠ`šXVVôJš_„K@xlU²Klk„U„@VaVÂVÂÈm@kVUVmnamUUaVƒXIVJ„@‚ç@Â¥nkVLn›„@@XVK@VUX@JVUV@UnVJVLUJVLUVlšnI„b‚KnU@m°™VanI@anV‚KVL„an„lK„blš„KÞk@¦@¤@„VKnLVK„L„KVzlWšLX@VmV@VbnU°@Ualk™˜WXLVU„KWÂkUUWšƒ@£Wa"],encodeOffsets:[[121005,35213]]}},{type:"Feature",id:"3206",properties:{name:"å—通市",cp:[121.1023,32.1625],childNum:7},geometry:{type:"Polygon",coordinates:["@@VJ@bnzWl°L„xnW@LšVVI@Wš_V¥„@VKVL@LXJ„I‚@nbly@aXXla@aVUnllLX@@UVKlbš@@m„XV`V@„bĢ„lkČÇƃȘ¯šwnÄ•VĉVÿšUÆ’UĠƒŦğlÂXÑVǵ@±ÅLʵĖ¯lÇbÃÞ¯xk@Çkķé™n¯@ÄŸÂŽÄ¡Æ´Ç«@kVVlUbƒL@xULǂóLUÂl¤@nkVV°VLkxVb@l™aUXUKWÄ–klVX@¤UšƒUkb"],encodeOffsets:[[123087,33385]]}},{type:"Feature",id:"3208",properties:{name:"淮安市",cp:[118.927,33.4039],childNum:5},geometry:{type:"Polygon",coordinates:["@@šnźUôÒɴ胚l¦nÄ–V‚kbmš„X@xVlVL@xUb@bUJVnUx‚šœ„lKVLÈx‚m„zXV@lW@XV‚b@bȚVxnb‚ƒVIXa°L„aÆVVaXUlK@aXIƄVlXKVUlIXalK@alwXLVK@¥ï¯ÿ@ƒmVk@aX@ƒm„īlaXI‚wXJVUV@lw@U¯yÂb›UÂaƒUÄ¡UÃ…aUKVknaÄ¡m@kUm@wÆIV±nLÆw„ÇnUUkƒÂ@Æ…ÃU¯JÃI¯¦Ul@bƒ@@VVL@l@LƒLÃ…mƒL@b™@UaVaUWmLUKV¹ÂKƒLWKXÂ¥WI@mXk@UmaUVUU@VmL@W™bkIUWƒUmVóIkbmm™@UbVLUxmJkU@bkJWbnXU`Wz™KUÞÈlVb™Lmx@„kè@Æ"],encodeOffsets:[[121062,33975]]}},{type:"Feature",id:"3205",properties:{name:"è‹å·žå¸‚",cp:[120.6519,31.3989],childNum:6},geometry:{type:"Polygon",coordinates:["@@ôèĊVnX°¤²„lxƒÈÜ@²x@J@b@X‚`nIUƙUUV@bl@VVnL@L@xƒJ@X@blJXnW@@`XbW„kVƒ@UbVxƒXUxkV@LóxVbUVWš²šVJĸklUǬ@ĢƳĠ°@šmƒī°»ÈÂÇ¥ULUU±a@bU@¯ÂƒU@KnImUVWUk™mXUVU@ÂlIVaUUÂVWKUbUkWKUÂ¥n£WakJUkUL›K¯L™KkƒVIn@VaUƒVUUƒ›UkVk@ƒU@amUkJƒ@UUlwXÂ¥W@@UkVmk@JUakL›@kk¯ÃmJUn@nmVXlmbVVkn@„UJ@±WUxV¯a¯KÅbżÇxUxƒšUÂUlWL"],encodeOffsets:[[122794,31917]]}},{type:"Feature",id:"3213",properties:{name:"宿è¿å¸‚",cp:[118.5535,33.7775],childNum:4},geometry:{type:"Polygon",coordinates:["@@XbWnUJVzXKVVUbW„klUÂWbU@@W@IÂJ@nƒVmbVbn@@V@„UŽƒIUJ@XUJ@VVn°VVbX@lwlJnUVL@l²@lÂÈUôJÄŠklb@¤VLÂœ@@xVxUxVx@bVbš@@xU@ln„mnX˜mXLVmV@X@lxVnVJôL„LXa‚x@b„@@KVL@bn@@m@™@alLUUVaUÂ¥nIV±‚I@mXI@aWWXU@LlUXWW_XWmaUwǙ@aÂaWUX@@kWUƒyÂnÇwUKkL›ƒÂ™VwUmVI@aVa@wUKUk@wƒWn™laUÂmÄ•k¥„™ɳçóÑŹV™mmzkVmm@a@Ióƒk@@LWU@`—„WbXLWlkImJVn@`nXVbXÂŽmL@Vn@‚l@nUVl°Xx°U@LVÄ @z°˜@¦UV@Xn@VJmV"],encodeOffsets:[[121005,34560]]}},{type:"Feature",id:"3207",properties:{name:"连云港市",cp:[119.1248,34.552],childNum:5},geometry:{type:"Polygon",coordinates:["@@@‚lzXxmÆV„„@@¦„@l`XnlKšXXm‚KnLla„b„@„xmbm@kL@V@Vl@@VUXšJX„mbš@@„°Æ@èÈzlW°XÄ¢JlÂÈ`lInbšWV_@mš™@UUÄ·nƒôw°ÂÆmnaVƒVÛVmĸ»Ģw±Ã@Â@mUIny™ÂUmWkۥÙƒK™Â@Wn@@aWUnwVL„mUaWIUWVk@kkJUVWLUkŃWJ@bkLWVUbÃ…Uƒb¯KWbUJ„WXX`WXkV@KWVXX@bWJ@nÂJU²mJV¦UbVVkK@b@š@nm@@aUK@Lƒ@@aÂwWbƒKóKUIUmkwW@U@UnWK—nmWƒn@b„l@bmVUb™@kw±n¯w™VUb"],encodeOffsets:[[121253,35264]]}},{type:"Feature",id:"3210",properties:{name:"扬州市",cp:[119.4653,32.8162],childNum:5},geometry:{type:"Polygon",coordinates:["@@VUXblVVV„b@xV@kz„V@l‚wVLUbVV@VU@VbUbÂl‚b@nkĶ°IÞV@Ɔ„ÂVlmVƒÈÅxmKU²ÅJ@xVn@lÄ¢nmbUlVLÆbÄ¢V„V‚bÂœV‚aXk‚@VÂXKVÂVWšXVWXUmKU„aWaU@™¥@£XW‚UUÂV@@ynam_VWkUVUna@ÂÆV@mnkWmXkWU„W@k„@@akklƒlWUI@UnKl¥™I@VÂVma@a@I@U@a@anK@UmK@Ã…VUnJl™kI@aVwka@mVIUW@UWL@WÃ…bmIƒƒULka™UWƒUxkLUKWlXL@VƒImāVƒU™mĉL™Uól¯I±l@Ã’UbVbUVVXUJUnVV@lnbl@"],encodeOffsets:[[121928,33244]]}},{type:"Feature",id:"3201",properties:{name:"å—京市",cp:[118.8062,31.9208],childNum:3},geometry:{type:"Polygon",coordinates:["@@k@ma@kUUVmVIUWVUUaVa@Ѳk°Jôk@Wmk¯KmX¯aUakKƒƒWU„@XU‚LXaV@@mUaVÂUUl@VmkaUXm@ƒWUUna°IlÂÂÂmV™m™IUW‚Â@Uk@@aV@VVX@„V‚I°»nm„U@ÂVKVan@m»UaU@U_@WlIUa™aVaUala@¯n@‚ƒkaUkUUWKU@mwkUUmmL@KÂ@ƒLmUUVƒKƒVÃ…ImU—JƒÂƒVkVVLšèVLVU@W„L„V„š@nVÃœULVÂŽUL@bW@XbWbkJƒUUVUxVXmVk@WÂUUkVmIƒV@„nbnVWbƒJU„kUULƒa@Jma@XkK@VVL@L@JƒLUVU@V¼ƒnXlƒbm@kbUKmn@lVb@VXXV‚UV@b@LVbÆxXbl@@lV@U„VV@XVK²VlIš`„ÂUbVbUlVVn@WXn@@VUV@„@KmbVLXқLkKƒV@nX@VVUV@b™nVllbšmnb„IWVXU@`lLlknVnmlLlbUmVInK°nUƒU@l@VU@Vn@„ƒ@alI„`VIXaVaVa"],encodeOffsets:[[121928,33244]]}},{type:"Feature",id:"3212",properties:{name:"泰州市",cp:[120.0586,32.5525],childNum:5},geometry:{type:"Polygon",coordinates:["@@lUU@@y@In@WwXal@Þxl@@anVô@ÆX„lŎ™ôU@™Vw@ÇUÂU@@m@U™JUUWKkL@Vm@@£„aUUmyV@@_kJUUVUUWlUnblL@aUmƒI@ƒULUW@IU@WaUK@£UK@aV@°V@LnUWWXIla„VV™@£UWlkXÄ•VLVWšb@kUalwUKU¯lU@mk£VÂôKÈÂVK@w„KVaUkÄ·lUI±™ğ¥ÃUŹš™Ž¯ôm¦ƒĸ™‚@XXK@VVXUJ@nlbUx@blJkšmIUV@ÆnL@VmL@b@b@V@J@bnb‚U@UšJk¦mL@VVJkXk„ll@bƒ@@lƒXXVWlXnml@nÃ…U@ÂŽmbUVlVUXn`mb@zU@V‚ÂVWX@¤š¦V@Xb"],encodeOffsets:[[122592,34015]]}},{type:"Feature",id:"3202",properties:{name:"无锡市",cp:[120.3442,31.5527],childNum:3},geometry:{type:"Polygon",coordinates:["@@nLƒÒlxUVkL™am@™ƒkVWUULUxVVVbUV@bVLU‚nnź™ÞVĠ¦X™VUUaôw@KlUVw„WUwVa„@lUXƒWa@_X@WmkI@a@W„I@w@KmKUUk@@aVUšVVÃ…mJÂ_@W@a@I±wÛ@ƑÇkw±ƒ¯£mWĉUóçƒK¯VkUWK@XkV¯UWaÂbƒmUa™UUb™lln@b@xƒbXÂŽWÂX`@„VxUblL@bn@Vb@`m@XbWnn@l¤„n@xnVlU„™VLÆWÂœkV@VbÞJ‚_nƒl@nKVU@aU™UÂ@mVk°WVLUV¯bVÂXŽ˜bXlVn@VmL@x—V@bl„š‚@ÂœnW@X@VVJ@²VJVU"],encodeOffsets:[[123064,32513]]}},{type:"Feature",id:"3204",properties:{name:"常州市",cp:[119.4543,31.5582],childNum:3},geometry:{type:"Polygon",coordinates:["@@„L˜ŽnxUbVVƒL@xnnW‚nn@VVXn@‚yÂœImx„„°ƒšL„a‚¥n@VkšKVw„W@nX„VJ@b‚@UVn„ƒ@UnUV@L‚b@`VLklVÞn„Æ@VaXLl™ÈJšÂmmVÂUK@aVUUaUUVwVKXVlUš„n@šblKVUkw„ÑmKUVUI@±UI@U@WmX@›™Âkƒ@a˜U@wnK@UUmWk—aWÂU°aVUUK¯XUl@nVÂŽVš@bUVmLk@m„Â`ÃIUaU@›lÃ…XUKƒškVmU@wƒmk£m@XmWan@@_Uam@@akKVaUw@ƒW_XÂW„a@w@akmm@mL@UÂJmnUKƒ@@XnJWLkKUb@„Vxk„WƒL—aWVUImVULUK@L@lkLVVVllb„m@@°kbVbUbšbVbkJ@XV`V@Vbn¼"],encodeOffsets:[[122097,32389]]}},{type:"Feature",id:"3211",properties:{name:"镇江市",cp:[119.4763,31.9702],childNum:4},geometry:{type:"Polygon",coordinates:["@@šVÄŠKšn„VÆUn„„J@UWKXkVLlKVwX„šVlbVK„„nJÆašÂ„ķn¥°óÇIkšWKUbÃ…@mƒUÃlkUK@_Âa@KVUVm„@mƒVUÂ@@aUIWƒ@mƒXUx™LUlm@¦ƒb™K¯„ƒƒnw›JÂzm@UW@UmmXÂmm@w„KUUVamw—ƒKm@UbUL@ŽƒVmn¯¼ÂJƒUW@UUU@@bl@@VÂÂŽVXšJšnnU‚‚k¯JmbVV„Xn@VWlbUnk@VVUÂŽVb@nU@WbÂKWVƒ@XV„„lLVb°bnW°Lnl@X"],encodeOffsets:[[122097,32997]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/jiang_xi_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"3607",properties:{name:"赣州市",cp:[115.2795,25.8124],childNum:18},geometry:{type:"Polygon",coordinates:["@@„`l@Èbln„@„KVLl@„V@bȎlnšKXkVlVL@„lJnb„¦VKVVnX„W@w°@VU„mln„UV`šU„bVUV@„xnKVI°KXKVkVL@al@Xa„LVlULWV™VVL@b„x@VXVmb@x@V™ÂVV@nn¤„šlb°b°KXXWbX`lbXx‚z@x„`VIVUnK„L‚x„WXLVKVbVLVU@wnW°b„@nalX„‚mXVJn@U²mKkVl„U@@xlnÂœaVmlKnÂœ@JVLlÂŽnVššl@XXÆèVlUX@xVLXVšb°W@wnUWmXk@K‚LVwUmUkUKUw@wVaVK@kƒÂ@WnkUKWÂkwlmXL@KVUlLVKXmWU„L@ašL@mÂalaVk@aÂa‚ašƒnXš@VVUblb„Jn˜ƒXa„V‚wn£„K@UWmUk@ƒUaWIÂV@b™JWÂ@KÂmmU@aUUUkmKkÂVKlUU™nKVU„lVaV£Å¥WUUK@UkUUw@Âm@mIkƒƒUUWƒLƒK¯ÂUw°¯@wUKUbƒKmƒ@kkKUL@UUKVÂ¥U@manw@k@U@Wm@@ÂU@Wwkm„wWaUU@UUmV¯kwƒ@@kmƒkKkUW@UK@Ã…V@XWWkXa@Ul@Va@KVaUUU@ƒaXwla@UkVWaXk@K@ÂlmkUmV@Vmbk@ƒ»XIĴVUkƒVUVU@anKVUƒKUalU@wX@˜™@a@K—@ÃwƒL@ÂŽUnÇlUIkJmn@ŽƒbVVÂb@VmnkLƒV¯U@ıl—IWmƒ@kaUI@aÇU@K@KUIkbWbƒJUIUyƒX¯ƒUbU@méUUmUk„WK—xWIkJm@VÂ¥U_UJUwmVkšƒUU@ƒƒƒ@knƒwm@UmÂkWJkL@n@VW@@‚U@knm@kUml@xÃ…xƒ@@XUJlb„@VX„JVxn@lbV„@lULnV@VlÂnV@bWV@bXL@lVLVb„V@blLn@Vl„K@xln@bX@lašLVbnKUVVb„KlXVVkxƒV@nnVUb‚lV@@z—°WWkbƒIk‚WL@LUJ@bUI@b™`@UmI@mkK¯XW™™mUV¯@UUVUUam@@VULWUÂJƒIm`ÂIUJ›ÂÂKUkW@Uxn‚WbnnmlXbmIUVmV@Vnb@V™LUKWLnÃ’VVV@V„UL@„kJUV@bƒÈ@ŽšÂV°šŽ@XVV@l@xUz"],encodeOffsets:[[116753,26596]]}},{type:"Feature",id:"3608",properties:{name:"å‰å®‰å¸‚",cp:[114.884,26.9659],childNum:12},geometry:{type:"Polygon",coordinates:["@@lxnb@V@bV@ln@‚n„‚lInš@blVXK‚nk¼@VUKWL@b™L@`UXU`ƒ@V¦XLÄ @lJ„¦@„nV@l°nn@‚mVXnaš@nb‚K„n@l„IVƒš@VanJ@_lKVVnš„L@L‚K@Vn@VbšUVanKlLnbnJVbšnWVnVVanI@‚Vb@L„bVKVanXVbVJVU@aXLll„bôlƼXxVLVK@Xn@ƒxnVVVmb@LnVVKVXV@@mnaVXUVnV˜K@_UaUmšwnKV_‚anKVLš»„K@¯ÃU@›™UÂ@ÂkWlUn™lknK‚VnaUkma@ƒUIUwlȁw@ƒVwV@n™‚Ân@ÈXlKVmna@kVw@anm‚@n_WWk@™™mUkÂUK@Im›kLUn›bkm@wV@kƒlUnLV±m@UInWƒÂkWmbƒ@¯amX@xUVUKUaULWKƒXÂwƒKmLUVUJƒ_@wÂyWwkaW_XaWW¯L¯akaĪm£@mUUšÂ@U@wnaWU@Uƒw@aUKšUXUVKUkƒKWbk@@bUKUlWL¯LUJmLƒwU@UVƒa™VU_ƒVkmƒnUV¯@@xƒXmWUUULĴmakI@ƒUKUkWl™LkmÇÂ@aƒUk@UKƒLƒ@kmÇak@ƒ_VlkL@`lbnšlLVanLnbmVÆln@šÂkJlbknmKUbÃmmwULUK@bkLWKULUUma@Kk@UV@L@llbVzšxUxnl@bVLmŽšŽ@IVJXÂœVlƒLV`@bn²@J™@™V@Xmbñ@WbUJ@bm@@LUĬU‚„¦lV@xXb@blnUV"],encodeOffsets:[[116652,27608]]}},{type:"Feature",id:"3611",properties:{name:"上饶市",cp:[117.8613,28.7292],childNum:12},geometry:{type:"Polygon",coordinates:["@@„„@„V‚š„„I°`nÂm¤Â²@bVJUVVXUl@Vmb@xV@XbmVVÂœ@lkLmbn`VbnU‚@Va„UnbVllUXV„a@w°ÂVW@_VWšLššnVlbšLVbnl„KšnVK@IUW@_@am@™‚ÑUólK@U@WU@VwU@UI@aUU‚aXƒƒ@kwmJVÂ@yXÂ@k‚anƒƒÂ@mkwVmmI@aUU@aUUW@kÂVkV@@anKš»„XVWnIVUl`@_„W@wlUÂœV@UWKnU‚bnŽ°InJl„UV@VnI‚b„Wn@VklL@l@Vn²m@U`kI@bWJƒÂnV@°VXnJm„XVmx@VVL@bkLmWULUmU@ƒbWÂXb@llnX@‚xkxVV„nVV@¤nL‚nVxnJVXX@˜ššbn`VI„b„@„blmlLnaV@„blWXnlUnbl@„ƒšKVanUVmm_XK@kWWnašU@UnaWUXa›ƒXamUkKmXUWƒLX¯WakKm™nUWwXa@KW_„aXWW_@WnIVÂl@XU‚LnWVknK@ImyUUÆbXK„Û@W@IÆUnƒVÃlkVK@mUIVwkUVaUm@aVIVyXIƒaÈwmÂmk@UnanÂVUmÂÃ…aó»lwšW@kkUVmUK@ÂWKÂLƒUmWULkamK™Lk@Wa@wk@UU@ÂU@mbUIWVÂKUXWmkUmVÂm›U@LkakKƒw@w@U™¯ƒ‚ƒUUn¯l@bmn@xkJWxkL@VkI@mƒkmJUI@V@b@VVxnbWlkÈkVƒLƒbkKmVƒL@V@²nxW‚kLUL@xlKVx„bXÂmVnšWJ@ޙ°@n™xUKUw±ÂÂ`UImVmnU@kalm@akwƒU@UUJmxU@@Uƒ@kU@Um@@Kn™ƒVm@k™KmkU@@WUnkLWxkVUwmKmLkU™bmKUbVÂŽ@xUnkJ@n±ŽÂšUxVXUšWJ@LUb™lUnm@ƒW@nknUJUVm@kXllknVbÆK„VVbš¼V„@šUl"],encodeOffsets:[[119194,29751]]}},{type:"Feature",id:"3604",properties:{name:"ä¹æ±Ÿå¸‚",cp:[115.4224,29.3774],childNum:12},geometry:{type:"Polygon",coordinates:["@@WUkVUkmaƒVUbÂ@mVUam_nalK@kU›nUWaU@@wna@UVkUWVUUI@a‚±n£m¯_ƒJ™ƒUÂ@ƒƒƒĉ¦Ul@ÂUV™Km™mLÂlm@ğ¹m`Uk¯@@UVK¯™@UUK@amkmKkVVÂUa@UkUƒKƒŽUa™L@VVXUJ™@ƒnƒ@™š™WUbƒnVb¯V@LÃ…lÃIƒJÃ…kÙm@Ua™WUU@UmUXmmwVÂUUÂKWUX±mÂUam@kWƒzUaVmÇw@aÃ…LmKÂXƒ‚UÂWKkL@W¯IƒwVw™lkUƒJ@Um@ÛÈWÂŽÂKUxWkƒaUU@KkLVl@„UKUX±KUb@nVVUbUVmaUlUL@„ƒaUL@‚@nUlWzX`@„V@lx²„@Vlb@bšVÞ@°nl@UxVL@lUbVV@n²xVUVmnUÞb‚a„J@IšV°xnbl@nbÆ@VwnK@VnXlK°xnUlVX„V@Vl@L@lk@W_XK@KƒkWxUL@J„nVx@aX@VVUa˜IXlmL@bVVX@VbnK‚a²XVWƒk°a„@UnV¤nbmLmW@ÂXbmJUbVL„aÞK„L@K@U@aVKlbV@nXlJÂœxV@VnšŽVȚ„ÞKôbźĕČmV@ĊšŽ²xÆIšÂV@Þ¦ĸ¼ÞVlÂŽVÞnxln°JÂœk‚LXWVUVUVwnJVI@yn@lXlaXmWI@w—»ma@UmK@akKkXmW@_kaWakKWÂk@@K@IšWƒkUa„ƒ"],encodeOffsets:[[119487,30319]]}},{type:"Feature",id:"3610",properties:{name:"抚州市",cp:[116.4441,27.4933],childNum:11},geometry:{type:"Polygon",coordinates:["@@°V°UnÃœ@n@lnLlV@bšV°L„lnLllVzVVXlV„V@@L@xX@WlX„m@UVƒL@V@n„°škVmVUnKlaXxVbšnlU@lVVnaVI@aX@V„šJš@V„@b„b@šVbš‚@X@lUL@ÂŽ@VlIVm@wUÂVanLšalVnKnLVxlUXwlKVm@k@Una@mWIXKWUÛVƒk@a@UVWn@@kl@@W„XlW@_Um@UVK@a„LnalInWV@@xnI@¥‚K„—šm@ÂkKmƒnk@mlI„¤laXbVblknV@U‚KXVlUXa‚@@Unw@±mU@ak_±a@ƒUJUIƒVÂKW_Xa@aWU™šÂK@mmUVa@IXa@UWmšannlmX¯WKXwVUVwƒÂ@ÂXUlK@klJXa@kƒÂkmm@Uwƒw@¯ƒW¯Âkw@WmbULƒaUUU@mVUU™WmkUb™KmkkK@aƒkUƒ¯¥Uƒl—ƒm@akU@mšÂ@KVIVV@KUkUÂVUkaƒUWb—„mƒIkaVaUU™@mW™„Âb‚b@bUlkb‚b@n™K@bƒKXVWnULkKUV@LWKknlxXÂŽVLml@X„Ž@lULUb@xVxVLVlVnUxÂK@LWlXnmV@x¯X™aWUUK@wVWUkÅçm`Â@mn@bUx@lmbUnkLÇWm@ÂÂmšU@Ux@„Æxk¼VxVJ@„nbVlmbÂUmLklmškVlX@‚VÂœšV@°Þ"],encodeOffsets:[[118508,28396]]}},{type:"Feature",id:"3609",properties:{name:"宜春市",cp:[115.0159,28.3228],childNum:10},geometry:{type:"Polygon",coordinates:["@@@VlbnK@b@JšLlUnx±ĀXxÆW„X@lšÂ@V„@@blJ@nX@˜xUbVVUbVV@b—VmnmJœ„@bmbm@klUbƒLmbœš@lVb@xUX@bVVVbV¤@LVV„bXlVw‚LXÂÜÇn@@V„IlVškUx„x°J@XlKXLV„‚WnLÆK@bÈxUnVb„ylXn@Vbn‚W²XV‚LVVUÂŽnxWnnV@VVVšXVbn@ޚÆl„IÞJÆk@K°UUa„mVa@UUUš»@wV@VƒkkUKUVW£U@UmW@@aXkVUnVlKVV„UUkVmU™@kWaUanU„VVamIXÂ¥W@@aUaUÂVW@_mW@UnIVVn@VbVm@bVL@anKVUkƒWK„UXV‚Ikx‚@na„bVK„b@nVJ„_V›@ÂVw„‚VUVVXUlUUaV@X@VblašbnKlkVaXaƒ¯@m@U„KVUn@WƒXkW@@w@KU@UƒWkUUUykkmKƒk¯K™U@akUmK@k@mmÛ¯V¯U@‚ƒL™¼UKmLÂbU`mL™xVnVb@`—LmUVUUWmb@nU@UWULmU@KnaUUmU„wmJ¯IUJWIkVkaWVUIUlWaUIUVkKmbUIƒÒlVUnnÂŽ@VlLUJ@bUX¯@ƒaWVUKUXƒKUbm@UwÂKWa@a@VkUWn™@Uak@mbX„WJXbm@mL—aWVk@™wƒL@WmanU@knwWmkaWL—KWUXaƒU@Â¥l„UVVVbnwĴnKV™»@aUk@a@UƒJ@kƒmÂLma™@mbUWÂnm@ULǺ@LXnmxUÂŽm@UbkbW@@akLmWk@UXmJmUkV@VUXVlULmKUxkL@lmXnJ@X‚l°Vnb@bU@WbÂKUX@VmKUX"],encodeOffsets:[[116652,28666]]}},{type:"Feature",id:"3601",properties:{name:"å—昌市",cp:[116.0046,28.6633],childNum:6},geometry:{type:"Polygon",coordinates:["@@šXš™„@„mš@VIUW@UšKVb„„LlV@VVbUÂŽlUnLnl@bVL@V°šUL@V°@Vln_Ġºn@‚knKnššLVU@ÂVkÄŠÂ¥Vk@™Uƒ™»UaƒUÃ…LUalmkklWn@VUVIlm@m„Xn@VmškVa@KXIV™UWVw‚™²Â@m@U@ÂVK@k@W™ÂUa@™ƒa@aUĪ@™IUƒW@@bUJmbUU@kkV™mUaWwkbmLUVUn™lWbUbklmL™akbUaW@U@VbkVWVUUUVƒÂUx@‚Uœƒ`UI@mƒaULƒambÂ@lwÂJWUƒVXLl„UVmL@bUK@aUnUam@UUmJ@VnX@`UXVÂŽVb@bX@W¦nJUbƒUmVVbXb@lVšUnVlƒVUUkLmUUVWl@bX@VnV@X¤VUVLllU„U@@x™¼VV@V"],encodeOffsets:[[118249,29700]]}},{type:"Feature",id:"3602",properties:{name:"景德镇市",cp:[117.334,29.3225],childNum:3},geometry:{type:"Polygon",coordinates:["@@VVX@Vbmz„xUlU@mbmL@V²xVbUVVblbX@šVškVykÂValKVI@bn@n`lÂVWnX@l„L@™WKnƒVIVa@¯nK@alIXJVIVWUw‚ƒn@nU˜„nK@alI@a@anKm_™a—™W@UWmIUwÂmmK@£UUƒmUUlwÂwW@km@kWaX„aV@VnVKnXlK@aUK@UnwWUnƒmIUW@¯mU„ÂXI@alJV_n@m±@U@kkKUlm@ƒXÂamJ@UVUkƒmI¯JmÂÂamVXL@V›UkV@xƒX@`k_UVmJUXƒW™¼mL@bU@UllÂX@VV@bVV@bnJUnlx@n„Žm„Âb@lWÂŽ@zU‚nIlx„@W„ÂbVV@bVJV@UxV@@X@VkLVôÂ҂šn@@b@`VX@J"],encodeOffsets:[[119903,30409]]}},{type:"Feature",id:"3603",properties:{name:"è乡市",cp:[113.9282,27.4823],childNum:4},geometry:{type:"Polygon",coordinates:["@@VWnL@UVW‚LXaV@@ama¯UÂk@WmInW@klKVwnLVKUkVW@UlUnVnIVWl@nXlK@bX@laVan@VÂnwWm@KȹVK¯m@kmU@ƒƒ¥kIÄŸ@WKU¥„@V_VW@_šK@aXKVL@Ul»ÂmWLkU@am™kJƒÂmÂ@ÂkmU@@a@UmakwU@›„Xlƒ@VXk`UIW¼kWWX@‚œÂ@l‚xV¦XlW@Ubn„@ÂŽmUkL@UmJ¯UkUWVUaƒUÂlm@UXWl„nUJ@LmLU˜nXll@bUVUUmVUn„Ž@¦šxlÂŽnn@VÆÈU°kbV„VxllnL@VnVVUl@V„„anL"],encodeOffsets:[[116652,28666]]}},{type:"Feature",id:"3606",properties:{name:"鹰潭市",cp:[117.0813,28.2349],childNum:3},geometry:{type:"Polygon",coordinates:["@@@XV@nlšL@lUnš„mÂŽ@Ln@@VlV„@@VV@nwVI@V„Vlx@bknlbV@nmnUVJ‚_²‚VxVLšw@mš¯@ÃXIm™nUWƒaUwkL@wVKlKXÂmw@±@U„KnUlL„a„KlUlÇXkmaUw@U@a@UƒÂ™UkwUJ@zWJ™wÂ@WbkVWUÂL@VmUklUaWakbģkJ@nmln„lL@Ž™nƒ˜ÂL@¦mJ@wU@mXkJmbƒK@bUL@VVn@`kXƒW@Xk@@lm@UX@V@b„lÃœUXVWLXJ@nmb@V@l"],encodeOffsets:[[119599,29025]]}},{type:"Feature",id:"3605",properties:{name:"新余市",cp:[114.95,27.8174],childNum:2},geometry:{type:"Polygon",coordinates:["@@m@@WULUKWwÅ»ókƒakkWK@bUVUIUamWUbULƒa@KUa@ÂmJUbmUXU™mUamImakKmLUb™VUam@@UÂL@KƒKm™UUkL@`mIUb™@U„@V@bVl@bš¼UÂŽmL„¦mxUaUUƒVkÂŽ@¦„VWbXV˜LXKlbXnmx@lmVnb@X„Kšxl@XU˜bnKn@WaXIWƒnal@Vbš@XmlV@U@bXb‚LVxn@Va„LVWVLXU„b°@VW@aVIkK@UmÂVmkU„ÑVJnalLVUVJXbVkVJXUlblUXJVI°JnI"],encodeOffsets:[[118182,28542]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/ji_lin_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"2224",properties:{name:"延边æœé²œæ—自治州",cp:[129.397,43.2587],childNum:8},geometry:{type:"Polygon",coordinates:["@@Wxĵ„mš@„ó¤VÂX@@xܼƨš²xWxƒV„V@„XVƒ„„„ƒbWšXllaÞU°Ċ„@ô¼„LôÃWanÂV¥ƒÑnĉ°¥šÅX¥°¯@w°w@»°Âk£°mÈŹ‚mÈbƃŎ¦„K°z@ÂŽkxl¦UbU¤šššklV„KŤÞȰ@@bšV@nVVUlÞ¦lUllÂœVlU°ÑU¯Vƒ°w„bXxl@VŽ²„˜@n„ô¼ƒó°™kmVk²ĕ‚w@wV™ÞÂÞ@@ÂĠƒö»˜¯œ@‚„šbnb°mÞ¯°V°„ÈJmÂXÂ¥mam™UřƒUƒlaU¯™ƒ@w™Kk—l±n@@wƒkÃVUUl±¯I¯b™a™lƒ@™ÂkLmakbƒ@ġƒŹé°™Þb°ÂšékƒƒLm™„wX™‚aÃ…b@bVlƒbVb—ÒVbUb›UUanwƒakbVÂŽUV›ak„¯„UŽƒLmxV°UxnôŻX@J„Xkl‚bkbĉaƒbƒWU„ƒ@ƒk„WUU¯@@klmƒ@@™ÂÃ…@aƒwWÂXÂlKkI@ÂWbUaVIUanUƒƒ@ĕƒÂ¯K™„mUnWUwm@£ċèkUmbUmm@@nkJUalwk@@nmWUan_óaWmnw±KÂœIƒwl@UmƒI@an@@mlUÃ…mV_™KUkƒ@U`@_ƒKUÂmU™@U¯™mmb¯@kb™ImV¯ƒƒLkbƒKƒƒÛ@ÇnɱJóaÃÄ¢kb@„›x—ÒÇllÂÂœ@‚Ž²V‚„ÆUVV„UÂÇ°X„óxlV¯„lV@bƒV@n—x›@—¤@„șŎnxV¼knšJ‚nšKX°˜¦UlÂnVbUbÆVnÞWVX¦llšb@l°œVJôÒnLVbšbXÂŽ"],encodeOffsets:[[131086,44798]]}},{type:"Feature",id:"2202",properties:{name:"å‰æž—市",cp:[126.8372,43.6047],childNum:6},geometry:{type:"Polygon",coordinates:["@@ôl‚zšaÈV°„šK@„mŽ—LWl™nšVxUV‚È@ÂŽÃĬUÈn‚ôLša‚„²VmÄ€kV@„ĠĊnU@b„V@b˜@nl°UVnÞaôJ@bšÂ™V„¦mlkššbmVXx¯@Vxm„nbƒ„šbÈK‚V@bÈL„wÄ yônšmnbÃœ@nn„V˜x@n²K‚„„J@k„al@nxÞU„Lź±Vwkw¯LWWUš™kÂÅŽÄ«Vwƒw„°y„ÂVĕ°wÈVlkÛ»@wW@UÂô£@ƒn™ĶƒXwW™aUamKóÑUI¯›@k™akkWÂ¥XUmÃÃ…UVaUa‚mVk—¥W¯™LÂm™IlmU»mwÈšÅ@ƒ˜£kJUÂÇk@ÂÂam¯y¯UVwƒa@wÄ¡x¦ƒKƒƒ¯X°Ċ¯¦U°ċWULÃ…a±b¯@UkÃ…WmÂVƒ™ƒkIUlóŽċ¹™`óIƒlX„WÂŽXxmbÂUƒLÃbƧ@ƒx¯bƒÈ—l@xƒš¯zƒaä@nšm„VWb²bmn¯J¯Ò@n„š"],encodeOffsets:[[128701,44303]]}},{type:"Feature",id:"2208",properties:{name:"白城市",cp:[123.0029,45.2637],childNum:5},geometry:{type:"Polygon",coordinates:["@@ó™ǩÅ@WlwUaÆ‘wÛÅÇéĉamÂÂKƒÂÅÇ@Iƒ™ôġVƒÈÑŹçƒ™ÃUƧċĉwóóÃ@Ƒ»ğL¯ll²@ƆÅV@¦m‚Åb@nmlU²VxšlUn™@VbnW„bÇbk҃š„n@èlnlšU҄Ž°Lšx@¼ĉb@҄šUÂŽÄ‹xÃ…ÂďnLVxƒÒƒbÃ…J±a@_Ã…JÃ…nƒŽVb„Kl„nUÜĊ@„Uš™xXVÆn„mšVšÂšJÞ¯V™ĠwšƒXw°xWL„x„KV¦ôU„wVÃǬóÞޙ¼‚‚„ÞkÂŽVôȘxބU„lVn¦ÞšĊa°w„b°@šbÆw„lŤL²`„z°@V@@™nJVnl@@Â¥nUmmn„@mwnmmUnk@mlwUaƒLnƒ›wn¯°anƒWakI„ƒÇmXwÆamUXUlJXa‚UUklKUknmÞV@‚K@ÂVWÞ@VkUwVƒ"],encodeOffsets:[[127350,46553]]}},{type:"Feature",id:"2207",properties:{name:"æ¾åŽŸå¸‚",cp:[124.0906,44.7198],childNum:5},geometry:{type:"Polygon",coordinates:["@@„šźèȂÒU„óĢ„š@JŎȄ‚‚LnÂŽÄŠbÈêÜƃxVbkx@XǪłôš„kÞ`„šW„b@n°ašbšKšnVw°`š_X`W„š¦„ÂÄŠIkmVšakw‚K„x°UÞb„U@lšƒl@°¦œVW„šaÞbšxÞI@mVI@ƒVÂkŚUWK„¥nL‚a@ƒ„@È„@°ƒÆ@nU@KÞalkUwVékUWw„™kU›VkkƒJk¯@»ókƒV¯ÆÇI@bĉô¯@™ÂÄ·w¯nmmÃ…L¯wƒVƒUÞy@UówÇLkmm@@UóxkkĉÂmL¯wVwkWWX™mÂLõm@kűV_ƒƒô»ÛƒÆ¯@™Va™VšaÄ VÂÂlmÄŸwÄ·UóÃƽ£ÇJkbÇ«aƽLW@nxäkzƒy¯XÉ…m@VšôÇX¯Ė¯ºÃnUÂŽnLVlUÔmV"],encodeOffsets:[[126068,45580]]}},{type:"Feature",id:"2201",properties:{name:"长春市",cp:[125.8154,44.2584],childNum:5},geometry:{type:"Polygon",coordinates:["@@„U°xÆKnn°mĸxšÂ°@Ċó@aÈJ°Å„Uôl@¼l°„IllÂœUlVƒšXxlVUêVxkllnÈUVll@Vx²IÞ¤VUlVnIôlރlwô_„›„bVaĶLXÅÞÇ@K˜¯@wÛačn¥š¯WÂXyW¯XwƒUmmÛ@ma™nómÄŸzƒxÇK@aÂUÇL™a„ƒmanƒUw°@WwnU™al™nkƒ¥šU™Â@aóIÃbUm¯Vmk—@@aƒU@amVğĉ@ƒlUnÿ±UÂĪbóKmÂVÇÞī@ÂÂÇVUUw‚™šmXk˜KnÂ@ĪL¯ƒÇU™bÂyókÅè@b‚n@lÃX@x¯ô@ƙUÂÂV_maXm@aóƒJWxnX@ÂŽVVnÄ–VnUJ@nÅÆǼV¼kxƒLklÃw@xƒx@zV`Ã…bmxÂU±xU„nnm‚kn‚ŽğU™bUŽ‚šUb@šÅ°Ü„󼄄U`Ʋ@lön‚KšnXWlXUx°xnKÄŠÂllôw@Vn@lnÈKôx@VÃz„V"],encodeOffsets:[[128262,45940]]}},{type:"Feature",id:"2206",properties:{name:"白山市",cp:[127.2217,42.0941],childNum:5},geometry:{type:"Polygon",coordinates:["@@Ušl¦kÒÆ°„IlÃ’U¤ôz„¼lJš„U„n‚ÆXVl°@²aÆbVKÄŒXV¯°¥¯ĉ°W„„„L‚¥Ģw@x„bUx°V°zn‚‚b@ÂÈlVÂŽlIÂœ@˜w@m„U@akU°ƒkUôwWƒÈ¯VÂUƒVUā±U›@kÂÈk˜Ñœw@ƒlaÞġƒUÞ£@ƅ‚KnÑĢ¯@W‚aUaVUVkkw@a¯Â@¯™ÂÙƒVXnW@@WkXmK@xkKUb@bW@Uw¯„mmÂb@ÂWKUbmUÂbUaWbƒJĉIVW@I—l±LkšmU™bUm™@ƒnkKWa¯n™@„`Ubma™„ĉL@bƚ—@W`ƒL@n¯‚Xb‚@kb@x™Lƒ„™@V‚kL±™Â™mlUIUÂ¥mL@lÃ…x@_laƒƒ@U—aƒV@kmmƒK„£ƒƒÂLƒƒmKUnÃ…KVbmÂXVlèĉUUbml„ĢŤƒIlŽ¯bǦœl‚@ô¼Ģ„@x°„l¤„n„a„l@x™b"],encodeOffsets:[[129567,43262]]}},{type:"Feature",id:"2205",properties:{name:"通化市",cp:[125.9583,41.8579],childNum:7},geometry:{type:"Polygon",coordinates:["@@ÆlXnÄ xĢ°lÈ°š„K„°kXm‚@¦Vbk„ŤJšnäk„VÞVVkȄb°y„™@w˜k„Ç°a„wƨ@„aÞ„K‚VnaWwXÂWƒ„kôJš_ČºôÂVkƒ»óyV£kуJůlÑkÂ¥V™ša@wƒkƒbƒmk£¯ƒ@wġƒó»Â@›kÈ¥°ak„JÆ£ƒġnkVaÄŠVkçWUnÂUaÆLVmnL„„‚KU™±@—„m@a¯U„bmV¯m@_ƒK™™U™ƒaƒÅ™Wó¹ƒ@UanmWak@@wmI@y™@mk„JVa™@UaƒIkJ@n™@Um±kkxƒm™Ik„ƒbÇm@Ž°bXn„V@Ž°ÈmlÞ¼¯XVº¯Lm„kWWÂXLmVVlknƒ@@lÂnWƙ„VxÂbmšnšm„¯lÃaVÈÂè@¼V„„b™„ÆŽ°ÞUVšJ„„kx›I—xƒƒƒIV¤™ÒXxmn"],encodeOffsets:[[128273,43330]]}},{type:"Feature",id:"2203",properties:{name:"四平市",cp:[124.541,43.4894],childNum:5},geometry:{type:"Polygon",coordinates:["@@Ɇn°W„zlyÞ£mwX@ƾKǬblaÈIƾ¤ôÞĸVÄ xnÂmmVƒ²w‚VnwÆaU_@y„w@wÞxlk„KlwU»È»ŎÅ@mVIUmmÄ•UU@ÂmWXw„Iô‚@bWnnbU`‚šV@Å°ó@wÞW@kÂm@aŎ烙@m°Ñ°Inm±aXaƒU™n@mƑšU¦@šÇŽ¯aU£šaU™ġ¦ÅҙJÅUŻókUÇ@™¥¯ak¯mUVak@@aċçÅaUƒm¦Ã`XbƄ@nÂ`ƒI™xĊÞÅÞml@šUbÂ@Wl™_¯JkšÇUÃÆÅb@n™„llUb¯„±a@ƒ—ƒWÂĉJġĀ¯™Unóšm¤œxôaVnƒxôI@x„V@bmƙ„@lnLmޯޙxVb¯þ"],encodeOffsets:[[126293,45124]]}},{type:"Feature",id:"2204",properties:{name:"è¾½æºå¸‚",cp:[125.343,42.7643],childNum:3},geometry:{type:"Polygon",coordinates:["@@żôŎVšIÆÑĢ¥Vš™bV¤°bÈÂ@™V¥ƒ™Þ£lÇUUUÃlƒÞ£™mÅ£IlƒUa@Â¥nÂlWƒ¯ƒL¯™kÇġ¯ğwWmÃ…k¯UƒVU„„bWlXlmnƒbUx¯xVVknlÂŽUbV„ÇKUb@„™VnbmlnzUº±bÂÂmJUbWÈnèm҄š@ÂX`WL"],encodeOffsets:[[127879,44168]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/liao_ning_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"2102",properties:{name:"大连市",cp:[122.2229,39.4409],childNum:5},geometry:{type:"Polygon",coordinates:["@@‚IÞmVk@wXWÃœbnwlLnU„@‚ÂnLlbXW@a‚wnbl@XL‚aš@ÄŠÂ¥@LULnJ@xVnmV@VXXV@VJkn@VÃœKXXôJlb„xl@„IVbnJVLUbn‚lnVw„JVU@ƒXU‚aUUlwn@°ƒn„VKnV°_VJšwl@nwlV„IXWlIVVnK@IWmkIVaVU@WÈUlmUÂ@U„WUalkXÄ¡Å»@kIƒ»mm™akÂUm›ĉUÅV»²ġVÄ•@aUUØIɃ`ȃ@Âkƒw@ƒUƒmwĉ™@ƒWķÑÂIĉÂÇbÃLkymbÂIƒwÇmÛbmbU„¯ÜõÈkÆVbÅŽxnXVÆnšǪ¦„bš¤Uš™xÃnĉÒmÄŠVȄ¤Èš„bƼ„Ā„„ÆÆބźb„VVbX„‚°²¤"],encodeOffsets:[[124786,41102]]}},{type:"Feature",id:"2113",properties:{name:"æœé˜³å¸‚",cp:[120.0696,41.4899],childNum:6},geometry:{type:"Polygon",coordinates:["@@na@UVI@m„ÑW™kaVÂ¥UI@wl@„aÈbšm@wVašk„@@K@kĪ@a@UUmƒUUalmUÂ@KÇUű¯@±kUKVkUaƒaÂU@Â¥m@@¯k@WLUmkn@mmIkm@amU@wVmkU@Klk@U—m˜aXIWWUL™aULVbƒmk@UUmUk±™_Uym@mbkImaX¯WW™xWKÂzU@WƒkJWwkV™@UÂm@UbVVVVXb@VWX—@WÂŽ@Vkb@V™nUK±aUUlwX™ÇWKknU@mmUkƒLUVƒVUUVƒUaƒw™bkKmwnIĪkJ@nmbƒ`ÂkmVkLWwUm@UUU™K@UmaUa@UUaWKÂ@mUƒÂ¯Wkk¯VmUUŽ„xVXUVmL¯ymXkWUbmXUKƒVknWx¯JVnkLƒl@VVxnxlÄ€VL²WlX„l@bÃVUn@bnlÃœaXblIVl@šš@Ȧ@VmbXV‚@@x„VVnUn@`°@VnXU@K@„VV@VmbnVn@ln@b„xƒ°Ub@bšLV`Ã…nƒ„W@@lUšnnWVU@Vbkl@Xl`XxV„UblÂŽkX@Ž°¦V„UVVbUlkV›@UbVbkLUxmJkXšš@b‚bÂœxVKÆlXX˜bnÂŽnala@ƒUk@U„VVklKVUXKVU°KVan@VUnLšKVL„WVaU_@mmUXa@m˜wXwVkVWXk‚k@›„k@klm@wXKl@UÂ@KVUUUVaUƒV@„alL„xUx@b°°VnnVšxlIXJmx„LUVlV@bnX@Všb„aVx‚@XJ@b‚n@VÂÂŽVXȄl@llX@lU„Vô°°@ބVbn@‚V„k„@VW"],encodeOffsets:[[123919,43262]]}},{type:"Feature",id:"2106",properties:{name:"丹东市",cp:[124.541,40.4242],childNum:4},geometry:{type:"Polygon",coordinates:["@@lzXJ‚U@š²x‚@@Vš„@bUVmKUn„°n@lnVK„„nV@n@VlV„°WbXn@‚VzƒJ@¦@bkb‚bUl@bkbƒJ¯zƒWULWbklV„nb™¦VJ@„„K°U„kl@@W„bVn°@„Všm²U˜nX`„UÃœLXmVXlKVbUVVnUbn˜ƒX@VUL@lUbWxš@²kl`n@VÂlb„@nUVWVLVU@aV@²bl@ÈmšxWX„VÈU„JV„l@„„la„WnX‚KÈkÈ@Va°bÆm„@XV°IVV°UnalƒVUn@UwVU„@@VVJ„I@bl@XK@wWmXU‚UVbkJVXnJVI@mƒknwlKXL@`l@VI@UUaVKÞn„aVm@aÇ£XW„U@aÇUU@mbkKm£™@ÂWW™ƒL@Â@Kk@kl›U—bWKUkUU¯UõÂۃmUUaVU„U@WU_W@kVkJƒ_WKkV@bUL™¯¯ƒ±mk¯ġƒğÑ@UmwƒKUaÂkƒ™ƒa@a„Âm¥ÃÂIUWmk@w™Âmţ—L›KÊbÈ—KWÄ¢klVbƒX@VV‚knÇV@XUVUblJXn@J"],encodeOffsets:[[126372,40967]]}},{type:"Feature",id:"2112",properties:{name:"é“岭市",cp:[124.2773,42.7423],childNum:7},geometry:{type:"Polygon",coordinates:["@@XJm@¯šmXUlÂnVbUJƒU@bV@UJWL@VXLmJVbkXlJXxVL@b@V@n@b@`Vbk@lxknV@VV™V@bUL@bV@@bVK@VXLWLXJ@LV@nbWJ@IUV„x@LVJUXVxVx@VV@@LXJWL@VU@@L@VnL@bVVmVX@@VVInJmbnLWVnVULVVU@VVmÂX@@JVz‚l@„nVVKVXރ@mk_lm„UUWV_nJlUÞÑÞVVUVƒVL„UVJ@I„Vna‚@@KV@XwWknwnKlalU„w„aĉÚwšJl_@aUaƒKUUU@WU@WXUÆ@@UVK@Ân@UnVVšblK@bÂœllb@b„bW@Xbl@UlnLl°°bš¦nKlVnI„V@UWU@WXkƒw@am@nm@aVw@I@KUaVIm±XÑlknJVnVJšaX_VaUaVKmwnkmmn@lU@U@mnašXlKUmUIVmkÂlaUK@UlUVUÂW@U™kVm™a@UUU@JmUU@@bmb—KWV¯XUKm@ka@UVKVk@aUKmLkKUUÃUmbXbÇJ@k@WU_@m™™@klm@UXKVaUI@KWUXaƒÂÇWÂk™aWUkWUL±U@lUÂU@ƒUÂJƒI@V¯JmIm@@aU@Uwƒa™@UV@VkI›V¯aUkƒWkb@bVL„@@VVVUXW@Uaƒ@@b—‚ÃbUVÄ@ŽƒLmUkVUbVllLUV@LššXÂŽWbUXm@U`@„kxlnnJlbnIllšLX„lVlUXmVK„n‚V@L"],encodeOffsets:[[126720,43572]]}},{type:"Feature",id:"2101",properties:{name:"沈阳市",cp:[123.1238,42.1216],childNum:5},geometry:{type:"Polygon",coordinates:["@@ȚĊÜ°„b„L‚lÞxUbUn±‚@ÈnVÆL@xnLšlUVƒbƒxkImJkn@V±LUxkV@bšbšKVKnzVl@L°@Va„xÞUlbôxVVÂœ@@V±bnÂŽ@ÂllXL˜ŽöXĶŽnal@nkVJVI@aU@@aVK@ašUUUU@lmkwl@Ua@_@a@m@U@aUKWwkIlWUanIWK@UXKVIU@@a„VVIUa‚mVknW°™n@WI@KÂUƒmULWnkVkUWĪKkkmJkamIkmlw@ƒV_n@VWXaW™™@KVUkKUkValUnV„K@ÂރVUÞa˜Â@a„@VbX@VWUU@Uƒ@UK@ala@IkKmUUa@U@ƒVƒkk™WVwU_@KÃœUXbl@VÂ¥XUVmƒÂƒƒXa‚kŃlÂUUkIm`UIUJW@UIÂKmkm@ÂUUJƒImmU@ƒVUXU`mIUbUK@LƒJUU™l@Xƒ@UbƒJ™kU@ƒŽn„m@Uam@@ĪaUÂmLÂKƒwĪÂmWXUK@kUaÇa@JUIUa@aƒKVUƒUXmƒÂUy™_@lmbkLUKWLX`‚n@bVL@JXL„‚WX@Vnb@Vm@UbnVmL@V@x@LUbVV@V@LƒUVlÂ@mb¯U@xU@UVVV@X@VVblJ@bn„VKUn„x@llnÂL±¤™b@Âk`VXÆK@„kV@¼kl@bWIUl@VmLnbm@@JXXmb"],encodeOffsets:[[125359,43139]]}},{type:"Feature",id:"2104",properties:{name:"抚顺市",cp:[124.585,41.8579],childNum:4},geometry:{type:"Polygon",coordinates:["@@„XVl°bÂœUlJ@UVUš@„bVxV@@bn@nJ°I@U„J‚I„VV@VÂ@k²VVKlXXVšb‚lÈX„ŽWbXV@LVJUbWL@Vkn@lšš@nV`@X@lÈIWanaÞVVVlLnKVL@bUlUL@Vlbn@VL°WXU˜Lna@aV@nV@IVV@VšbUnšl@V‚XnKVa@U„UnyWkXaƒaVk@ašašbnm@_WKXmWanU@alaU—l@XJVLVxX@˜wnKnVlwƒƒ™@V_@a¯¥@UkKWUÂaUU‚anK@IƒaUÂ@WUaVw@klUVyUUVUUÇ@Iôbša@mnUma@kXa@UWak@Wa—l@a›Â@WÂUƒLmUÂ@U`mIUU™`mUk@@UUK±nkJƒbUam@kwm@@a@UU@Ua@Â@K@ƒVK@kmKU_UKƒUUaĉWmkkL@`™LƒnmlkLkbmK@k™@Ulmb@b™„@Ž„xUVƒIUlmVXXƒxm@™JUUk@WUk@ƒakx±@¯x¯Umb™KUUVmUU¯UmVVn™WkÂƄÂlWb„„„ŽUnWVU¦k@WaÛV@LV`UxšXllU„@„@VVbnVlL@J"],encodeOffsets:[[126754,42992]]}},{type:"Feature",id:"2114",properties:{name:"葫芦岛市",cp:[120.1575,40.578],childNum:4},geometry:{type:"Polygon",coordinates:["@@ll°X„ŽnV‚@XLVb@VVbnb@VšLVV@VVnXxlKnU‚l„_na@mlI„šmJnxlLša„xVbU„VV„UVU„KVlnnV@lmXLšÈWÂŽkxVV²bVLšm@Ula@UX˜@XW@UWaUUUUVan@V‚š@lUXxlIX„V@‚yXLšw‚ŽXXW°nblJnan@Vzš`l²nVVVl@„nUaVKšbVKnXVaUaVUšyšnXK@kVK‚@XÂ@m@m‚LXa„LWƒU¯„w@™ƒa@UVw„¥°™ó¯¯y¯ÂƒÂUǯ»›w¯Iƒm—¯Ç™UUl™¯»ţKċÑţÂÄ·m¯w@mU_ómk¼VnU`±IkbVlƒnnÂŽU¼±Lk`@X™Wl¦UbmVUxkXVlkbllU„Vb@bkVmx@XVV@JÂb±aULkKWXkWmX¯aUJmIkVm@ƒxU@n„"],encodeOffsets:[[122097,41575]]}},{type:"Feature",id:"2109",properties:{name:"阜新市",cp:[122.0032,42.2699],childNum:4},geometry:{type:"Polygon",coordinates:["@@šXnb°lš„VlnXVJ„LlVnl@zÆxnK@b„blKVLn@@V„aVLVK@L@Vl@XVVInVVKVwlUXwlKšL„ššVVb@aV@X„lUXbVW@n„lWnXKV@@V@XUVVLUVV@@bVVV@@ln@VbVUXV‚I„xVanJ@UšIVWšL@UV@@¤V@nInw˜W„k„lnIVx‚lnzUVÇJ¦VVÃœLĸUnW@aV_šWÄŠXXa‚Knkl@nm™L™a@alUVw²K@UlmnIlJ„w„aVU™kmK@wÃ…KmU@DzÂVmVaÃwÂkƒKƒaÛ¯șĉķ¥ğ¥ƒ@kUWkÆīÃ@@akU„K@KWIUm¯nƒU¯JmwUVmIkJÇLÂm@™UImJUU@aW@U@@nUb™JƒaƒbXVWnÂ@UVmX@V@b„š@l@Lƒ@™lUb@x™nÇaƒbk@@xVJU¦lbXšƒÒ@nUJ@Vmb"],encodeOffsets:[[123919,43262]]}},{type:"Feature",id:"2107",properties:{name:"锦州市",cp:[121.6626,41.4294],childNum:5},geometry:{type:"Polygon",coordinates:["@@nJ@nlmVnXKl@@°n@@¦‚V„bVbUlVL²l°@ƲÈV@LV‚knVb„VVnnWVU‚@XmWU„a„bšIVa@mV@X@@bVVnIVJ@š‚nÈKlInJVUnx°I„V°mVnXJ@LƒLlV@b„@ބÆĬXllV„@Ġ¦ĸ¦naWW@In@manK@UVkXJ@alk@»lU@āLUWl_@ša²£‚Kkm@kƒwVmULmƒ@akIUa@U@WUUVU™aÃ@ğ›wkƒƒmĉ£UWƒ@@bÇL@m—a@_mKƒlƒXUwÂKƒLţÓ@UWw@K@U„I@m™U@UV¥„@°UnJ°@@_™KUwƒW@UnaWÂUmmI@m™ķwUaÇLóVĵwÙUUW™¯šƒ¦Ux@V„b@šƒxV°X„ƒKWbÂK@n@nW‚Â@UL@lWL™m™zUVVbUbmWXXWJ—b˜n@Vkl@LlVUn@xnV@bln"],encodeOffsets:[[123694,42391]]}},{type:"Feature",id:"2103",properties:{name:"éžå±±å¸‚",cp:[123.0798,40.6055],childNum:4},geometry:{type:"Polygon",coordinates:["@@l„œxĠŽÞ@šbV@@w°Vna‚@Uk„V@K@UUUVa@K@w@UnKmUVan@@Uma@UXWƒÂWK@IUK@aÂmW_XKVLlKna@kmKVak@VU„@VmšU@anIÆan@‚a„šUVnb@blLV`ÞLlU„bna‚Kn@naVU@¥°IVK@anUUKVaƒUVak™@mJƒkXĪUVwkƒVUUa°U@WƒÂ@WlkXWlIXUlJlaÂœx‚IVVXLšll@nLV@lLXl„KÄŠzš¥maUƒlkXaVK„X°y„Ila@aVkÂala@a@¥„IUy@ÂWmXaƒ¯kU@U@mmUƒƒULkmm@ƒ¯VmnLVU@a™ƒ@UÂ@±w@™ÂVWIkymLUUkJWXƒJkUmxk@™xUI¯`mUULmƒ¯„m@kxVVÂbWV@„UVƒIUx@bkšVšVVšxUbVV@V@zšJVXU‚lnk@@lkLƒlƒLUU±Jkšm@UIUVƒLUVU@™K@UƒnnV@l@Ll„ƒaUJ@zn`@nWlƒIUVUUUV±Ln‚@nmL@VUVkLVlUxVLVlÃ…Xma™@@akLmWUX@JUnVJVkXJ@X@`WX„VUVUIlb„W@bVUVL@`Un@¦U`@bUV@z@Jm@@XV`„LUL¯J@IVKmKÃ…I@J™nWVnLnšVxV¤™z@bmV@VUV@bUL"],encodeOffsets:[[125123,42447]]}},{type:"Feature",id:"2105",properties:{name:"本溪市",cp:[124.1455,41.1987],childNum:3},geometry:{type:"Polygon",coordinates:["@@lb@Vn„lnVVUb@šVJ@nnJ@bmXUx@xVbkbkÂŽWLUxnl@Ul@„xWx@nUV@¼Ull„knkK@bmbnl‚LVJX@VIVJn_lJVVšXUmnU°VVVUnVVšLna°V°w²@lw„bl@XVl@VVšIn@„wWWnUVk„JVUƒw@šƒ@anaVkš@@lnLlalKnk„mšK@_lKnlÄŠXVb„VVLV`nL@lUL@„@L@‚VbV@@V@bn@lxn@Vb„alI²mVL@Vl@nVš_VVnJV_‚@nV„K‚V@Xœ‚@b˜kXbl@XblylUUkš™@ÂXa@UVIlK@UUWVU„Llm@UUUnKWU@K@UXm„XVa@U°KVUUWUk@ašUVKkaWkƒKUknaWa@U—Â@Âm@mÂk@ƒaUJk@@_WKkLmx„l@nUJmIUWlIUaÂVWVXn@xWLk@@aƒJUI@Uƒ@UVVxm@UVk„mb¯VUU¯JWUƒ@Ã…n¯aUbÇ@ÇlÂLmWƒXkbƒƒk@UƒƒIÇVƒUXW™wÇnk@±aU@@bUVUKUXmVƒ@kaUÂm@k_±l™@XwVa@kVK@U„Wm—VaUmVUUakLUWWnÛKƒVW_—m±V™nƒU¯@Umƒa@Xk@ƒl¯V"],encodeOffsets:[[126552,41839]]}},{type:"Feature",id:"2108",properties:{name:"è¥å£å¸‚",cp:[122.4316,40.4297],childNum:4},geometry:{type:"Polygon",coordinates:["@@ĊĖÆÂn¤„„°Ċ¯ŎWšô„@xXb‚wnKl@nX@VUVƒKmL@VU@UxÄ@Vlb„x„U@VUb@b‚kÂœ`‚IUlVUn„V@@UV@@JnXlK@bš@nbÆWUkUKVwUklKVU@UnK@mm²KVUVVVU„JXk@mm_@yVI„bkƒ@K@kmU„m@VšLV@VU„KVUVJn@l™²IVV„K„klK@kl@kmVÂUW™I@y@UUUVa™wUUU™l™@akmmÂVaUKmIUaƒJk@ƒwkaóIWWÛL@UlmUIU@WW@UnUUm@wmIVK@Kĉ¦™@ÂbWKk@maÂx@bWXkamKƒ@mVkKmxÛaWX@xUlÃnÂJ"],encodeOffsets:[[124786,41102]]}},{type:"Feature",id:"2110",properties:{name:"辽阳市",cp:[123.4094,41.1383],childNum:5},geometry:{type:"Polygon",coordinates:["@@š`Vz„‚Wn„VUV„L@bVbVJ@IÈbVb@lVLXW‚n„š„x‚LnKVŽšb@„n@Vbn@mƒ„ÂV@šl„IVa„@@WškVV„I@KVLVanJV_VW„UV@nn„JVI‚Vn@na@alLlmkƒVk@»VU@mXwƒwk@@VmkVwXKlÂlaUa@wVwnW@amI@mUI@™VaUUkmmƒ@UkaƒL@ƒUIĉyƒLWkkKU@mKk@™kWKUUÂJ›wkbkIWVkJWXkl@X„‚@X¯VVbUVl„UxšVW„„lnIš@l‚Ub„VUbVLmV@bUL¯J@¦UVmbm@ÂLmbƒakVÃKU_kK@amaVUĪÂbm@Ã…bmJ@b™VUnƒ@UVl@UbnL"],encodeOffsets:[[125562,42194]]}},{type:"Feature",id:"2111",properties:{name:"盘锦市",cp:[121.9482,41.0449],childNum:3},geometry:{type:"Polygon",coordinates:["@@Vbĸx‚š@nnJVnXÂŽmb@V„XVxšL@`¯@mI¯Vƒ@U¦@VšV@nƒJ@V@LXx@VŤÔ„K‚LVx„W„knL@`˜b@nÈK@a„@VXĊ¤„nVK@aVU@UnU@ašyU£Uwm™mKXUšm@IÆJnLUL@J°IVKƒKU_@Wn@@I@yVU@aV_@Â¥Vm@_UKUV@aƒXkaVJVUƒUXW@_@WWIUlUIVm@IVW@IU@@VU@mƒUVVkÂJ›_Âl@aVa@UƒVƒwka@UރVwV@@UnK„LVU@UmWk@mLÂxWa@wóƒUVUIÇÆĉ¦¯¦¯xÊŸJ"],encodeOffsets:[[124392,41822]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/nei_meng_gu_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"1507",properties:{name:"呼伦è´å°”市",cp:[120.8057,50.2185],childNum:13},geometry:{type:"Polygon",coordinates:["@@„m@Åkƒ™Žƒklƒôƒ@£kJ°ý™ɅķÑó¤ğLĉÅlÇğÅW¯¯›™ƥóÿlwkţÈéÃƛó™°ÞÅxV¤ĉĖWƒ¯lȭţυ̃ɱÿķƅˋğɱřÃţϙÈƧĊţ@¯kWKUKm¹Å@Ä·JU@ƧÑƧ„Å¥˹Ɔ@L@„Þ‚VLnš@VÅÄŒWJX¦@JÅ»bU@ţÞmVU@ÈýóbkWWLƒƒÅ™¯UWÄ¡Âkmóƒ±UŹôV¼ƽ¼ƒł̥ĖƽǬʉxĉŽŻÂÈ—KΕ̛ʵƨʟÞ˹»ƧÂţ»ǕÅ˷Ȍ±ȚʊĠUɾɜɨmÜ֞߼˸ƅȂ¯ǖKˢğÈÒǔnƾŎÅ‚@šĊbôô̼ƒ@ĊôĊŽÞĀ™xšĖƧL±ŽœŽ‚Uš°U„°ĬƒČ°ÜƒêɴȂVł°@ƒ„nxŎèƒbȄÞȌ΀ǸlŽ²IlxÄŠl²ÒmšôĖ™Èl„ĵºm„ÈêVþ„xɛČʉÇĵVmš„ÒƒÈɆôÆŰǀĊ°ÆǬĮƾb„yÄŠ@ĠšƒXǀċm»ôw°Ûk¥Çm¯ç™kkÇǫţǕéX_ĶWÇ–Ä«ÅŽaÆĵĸÂÄŠ@ȚȘ‚™ĊLĢĉ„VÆĉʊÂÇĕóaU¥šĉ°mkÅ°ġUÂÄ Å™k°mƒÑČÿ˜ÛƒWĸ£ʠšÆxÈÞŎÂÞ»ʈ²ĊÇČalÒ°ÂŤ±ĸz„ŽĊKȲm¤ŎÂ@Ò°¼nyÈ‚UźīǖƳÈē°@šÃĶƒ@ƒÈÂkÂl¥Ççkxk™›JXÂǃUÂÃ…@˜£k»„óƿīÛ@lÂÃ…Jl¥óý@¯ƽġÆÂÃ…an™ċ™°é¯¹"],encodeOffsets:[[128194,51014]]}},{type:"Feature",id:"1529",properties:{name:"阿拉善盟",cp:[102.019,40.1001],childNum:3},geometry:{type:"Polygon",coordinates:["@@™ÆnǟƨʫšŹɆÿ°¯ÆV²Âˢ™żÿ@ÃÆÅȰ¯ȀƳĉó™™@ÄŸkyš¹@īš›ƒwl£Źƒƒ¯Ŧé@™ÇÂÇxŋĉƩUUŃÅL™Ç™ĵóÃnƒóç@™™ó@ġƒƱ„¥ƒç™WUçÆŃÂ@é—çťK™çȭVһƽ̻aW¥ȣʵNJǓƲɳޗǔlÂżÞmĠóĬȂÂɲȮ@ÈĢŮźÔnĶŻǠšŎȭœгŃċóȭţΗÆƑÞƧÅΫóȘǫɱÈÄ¡lÛkÇ°ÈÈnšõl¯ô„ÞɛÃkĢóÂWĊ„zÇɼÊ@ÇÈķlUČÅÜķnέƒǓKȮŎŎb°ĢǀŌ@ȼôĬmÄ ÄŸÅ°ÅĖƧbЇƧÅx@ķó£Ål±ĀƧīXÃġƃêĉK°Ãʇƅ@ΌʉżÅÒϱʈ@Â˺ƾ֛।࡬ţશóЈèʞUš¤Ò_޸Ƒʠɽ̦ÃÉœL׈ɛϜóȂJϚÈ@ǟͪaÞ»Ȯź"],encodeOffsets:[[107764,42750]]}},{type:"Feature",id:"1525",properties:{name:"锡林郭勒盟",cp:[115.6421,44.176],childNum:12},geometry:{type:"Polygon",coordinates:["@@ʶĬĊIȘƨƨŽ@ĬÛĢșŤĉĬƒĀóšU‚ÈŚÜènŦÆȤȄłϰUƨťƾÑ܆ğɲƜǔÂÈèʈƲĊƞƒšɆ¯̼V˺Ò˺ȂŤVĢêU܃x„Āˌ˘ƨ„Æ°ѢmÞżU¼ÆlÅŽ@ĊçŎnÈÒͪŎźƒĸU°lżwUb°°°Vš£ÞlĠĉĊLÞÂɆnźÂބn¦ĊaȂīġŃ¯Iĉůl»kƒ„™Çý„¥Ŏ¯ƒén£ġљÃÈ­xƒÇ™@Åçķ»óƱŎ¥™çWÿÂmlÂóa£Çb™yVÅČÇV»ÃÂU¯™KĉýǕċţnġ¯ÂȂÂÅUm»ğƒљwÆbċÇŎċwˋÈÛÿʉÑ°Åkw@óÇ»ĉw™¥VÑŹU™mW»ğÂğljVÿŤÅźī@ř¯ğnõÆ@ÞÅnÅVljóJƒwĊÑkÄ•Ãw¯nkÂ¥Åaó¦ĉƒV¦Å`ğуÑÃ@mwn¯m±@óƒÛKËÆǓ±UšÙa¯lƒÂÅšșk„èƒĬގÂn@ŤġŰk°ċx@œĉ`Ƨĕ°Â@ÂţÒĉwmÂĉ@ƒƒnƒƒa„™¥ķnƒÞĉVóÆókĉŽķ@ÃkƧƧÛaƒ°Ç@ÃÈU˜óbü@„ÛÒV°™@V¼ˋL™ÞɅŤŹǠVÞȗŤÇĖŚÅbÈÆœ"],encodeOffsets:[[113817,44421]]}},{type:"Feature",id:"1506",properties:{name:"鄂尔多斯市",cp:[108.9734,39.2487],childNum:8},geometry:{type:"Polygon",coordinates:["@@ĶL²ĬVÅ‚Æ‘kkl@Ȏ™ŘWńÈĬȗ¯™ºlz@ĠššĊôŦô„ÒĠ°kÞܚ™n@¤„UĸèĸbŌÈXŽĸLlÃ’Ä¢xɲÂƤÈÛƾJÈðUšÅĶ»²VW¯ĸJôšbk‚V@ôÂlbnÂÄŠyÈzVÂôašb@Âĸ‚ÞUl°yǬ²Ǭm°ššk„±lbn°@È»˜JX„VŎÑÆJ@k„LšƒÆl²™Ġ²ʊůĊġ‚řóƛÞÅ@m„ƒmLUÿóĉƧ@™»ÂL@„›`ČĸmšȗÑţů±ĉğl¯Ā™wǎƒçƧŤÛI@±ÜĉǓçÅ°Uwô™ǫůķƳř±bÅ£™ÓÇwnÑó@Èƽ@™ƒÇƧĢón»ÅĕóĊ¯b„Å™™VȯÅImƒÅKU„™LǓ±Ãxċ—ŋ˜V±Āȗ°™„Źl±šÛ@WÃ’ÈŚŹÂÐŚÅèŌô„¼°ȰɞȂVÄŠ"],encodeOffsets:[[109542,39983]]}},{type:"Feature",id:"1504",properties:{name:"赤峰市",cp:[118.6743,43.2642],childNum:10},geometry:{type:"Polygon",coordinates:["@@ɲÅĢljĊwƾÅÞĭ°_ŎŃźȹƒUČÿl»¯ÂôķVÿǬƽ™ÂɅġÅÑǫ»ÌÂÊŸÈ£U™¯wVWÃÂÈġW»Þ¹mÃɛŎÿŎÅͩůV¹Â›Å™éċ™óŹÅVVĢǩʈ@Ä–Ä‹@ķšÛšV°¯xÇÅţ¥™»°Ûô™ĉʟ„¥WýČ¥™w‚ç»±mnÅķ¥ˋVƒbUÒġ»ÅxÄŸLƧ™ƒbWÄ–Ã…xš¦U°ÃVóŰlô²@š¥ÜÞÛô„V@²±`š¦™„™¯Ã@„ŽÅ„VÒżôš™¤V²ŹĬÇĊƑƒţxƒç¯Lk»ʟlƽýmÅ‚ÃÆÆ@mö°Ġ@ŚŹĬţÆUĀĠNJĠŽX¼šnźVUҚ¦Ċxȼ@ôlx¯łʊÒÜĀˌÇČxÆÂČÈÆašx„ÒĠŽn¼ŎVÈ‚¼Ģ°ŤmǖČĊþšLV°ÞŽU¼ċÈUƚzÈa‚¤ôbkŽ‚nXĀšè"],encodeOffsets:[[122232,46328]]}},{type:"Feature",id:"1508",properties:{name:"巴彦淖尔市",cp:[107.5562,41.3196],childNum:7},geometry:{type:"Polygon",coordinates:["@@²@Ζǀݴʶհĸ„˜ƒ¦Ķ™̒Uˌ¼ӾÇƾ¼̨UÞĉ˜Ƨ—éûƒĕĉ—ÆÈÂœÅǪakó‚ó¯a@™ôţ™aV¯Þ¯°@²él¥ĵğťwÅxó¯k±š—Vó@™aóbUÂÇyĉzmÂŽkaóŽU@l™aó‚ķIX°±Uĵ¼™Æ¯VÇÞƽIÇÜÅ£ɱŽġwkÑķKWÂŋÇķaķçƒV@£šmۙlÃğ¯ƒÑťóǿƴȯ°Åł@ÞŻĀˡš±ŽÅU¯°ɅĀ™źƧʬmǠšÆ"],encodeOffsets:[[107764,42750]]}},{type:"Feature",id:"1505",properties:{name:"通辽市",cp:[121.4758,43.9673],childNum:8},geometry:{type:"Polygon",coordinates:["@@ôƲĸ¼Æèš@„ÈȮwƾ»ʠÂĢ¥VÂÆ@²¥@»Ŏњ¯ĊJŤ£k»ÆÇX¯̼Åšī°aX£ôƒƾÈź¥„ƒ™aôÂŤ™ĢL°ƒĸ@Ȯ¼ÈÒʈŚôVXůÆaĠƛÈKƒķšĉôÿ@ğÈĉ™»ÇVn™ĉV›wXÂĠðšČÿĸwVƒ™¯¯ǵ±™ĉ‚ǫ™ÅÅm»²ÂŻ±ƽIm¥ţÈķ@¯šƧJV»ÞUÃç¯UġºU£ţŽóaÃ…Ã…lƒƒ™Ƨī¯K¯ÞÃğLÌ‘Èƽ@ÅÅŽÅĀƑɜnÞúX¼ÇĢގUX°xVšʠȤÌÂǬ¼ÆÒɆĢšŽǫƾUĀóĸ°‚k¼ċĀƑVŹȺÅń¯`ÃĮƽŎĉxġNJɱłÅ¦"],encodeOffsets:[[122097,46379]]}},{type:"Feature",id:"1509",properties:{name:"乌兰察布市",cp:[112.5769,41.77],childNum:11},geometry:{type:"Polygon",coordinates:["@@ʠǠÞĸɲȺƒÒȂƛŎaƙÈĕȘţUÃźǟɆţšÃËŒKU»š@U¯ÜÑ@ƒÞ»ôaV—ÞÇÈ@„¯ÜbƨƨÞlĸ@ÄŠÂôlôÅĊU„Ãĸmš¦ƒŽ„bm„„„Ċ@n‚ĊxŤÑ@¯‚ƨĖĊ_@›Čwl¯™ƒȭL›Ã„»ƽ¯ķů„Ǔ@ÇǓbċ™ÅÅÆwÂÿĠÇU£óaƒ¥¯aŎğĠţkw°»¯ůlÃĵkǻðɱƧǫaóôɱ»Çk¯ŃóƒʇÅŻ›ĉNJŻĢ„Ž¯ÒÈUl°ƒx°n„Ò™Ĭón™Ċğ°ÇŚĉ¦ʵVƒ°°ĬÛżÇJÈńʇʹó˂ƽŎ›Æţ¦"],encodeOffsets:[[112984,43763]]}},{type:"Feature",id:"1522",properties:{name:"兴安盟",cp:[121.3879,46.1426],childNum:6},geometry:{type:"Polygon",coordinates:["@@ÆXnlŎ°@LVLĠþœxÄŠUȮĊnU„ÂÄ ÂV@żaW¯XIŎġƒ¥ÃÂ@K@w@K@I˺ŻŎ¦ƨƒƨÒŎIÆ@X@VºnX°lÅŽ@ƾĉˤƒȘǷȘÑÃÚÂÞbVţĸÿŤxÈĖÆÂŽÂêÇKnÂĸ¥ô@›ķÞUnÃ’l@UŚaƒīˋƒ¯ÑƧx@±kXÅ™ÆÆÛéV™ˋ»lůĉ„ÅÇÓǫޗĖġV@Âğ»›°ĵ„ÇÞǓ¼¯m˜ÛÅŃĉÂĠÇƾb²çƒ™šéż¯VƒƒğÞml»ÅÑV痻V¯™¯šĕÆU¯y°k¯¯V»ôDŽѰa@Źk™ġKţšóŽšbƒ„Ź¦ƽȂó„W¤¯b™Ĭ̻ŎW°ÅÈl¼ţ¤ĉI™°ÅÃ’@¼±¦Å@UŽġ¦ʟŽƽ¼šÞĢÒm¤„êÅ°ƒ¦Èþƒšl„k¼ĊŰ°JĢńÈĬ„°ƒżn‚ÇbV„ü@¼óĸţ¤@°Ånšl"],encodeOffsets:[[122412,48482]]}},{type:"Feature",id:"1502",properties:{name:"包头市",cp:[110.3467,41.4899],childNum:5},geometry:{type:"Polygon",coordinates:["@@źxżĀǔÆǬVȘĀŤ¥œÅƾÅôËʈͳȂŃÈIÜŻ¯ī„¯Åm™¯ɱĖ¯ƒķÒÃIÃȁV™ƒlÅôфġ™ğVmÞnnƒWçkWÃœÂXÆÆwU»Șĕš£ĉÑ𱱚Åk™„ƒK@lÃ…IÅ҃UW‚—IǼ¯@m‚kaƒ²™l¯™ǫnǫ±¯zkÂŽÃVÄ·ÂUô™˜l²ô°ŎwŦxĶĠk¦±ê¯@ðU°šbóŤ@š°bÂôlôǩb›ŎÆȎĊ˜„ĖÞ¼˜ê—ƨÃÄŠ"],encodeOffsets:[[112017,43465]]}},{type:"Feature",id:"1501",
-properties:{name:"呼和浩特市",cp:[111.4124,40.4901],childNum:6},geometry:{type:"Polygon",coordinates:["@@ʶUĊ¥ÈřĠ¯šĉômšīƒÑ¯m„wk¯ÇV°ÑƒÂżġĊljǓɱţǓ›ÆóX¯ƒɛÒóa@nÃÆôƜÂŚĉĢʉŰĊҙ¤ȗĖV¼ÅxWƞۂlXXèm„ÃmUnšĠƒĢóÒkƚ„ÆUÞ¼ÞJĸÑ°„ɲĕš°Ŏn"],encodeOffsets:[[114098,42312]]}},{type:"Feature",id:"1503",properties:{name:"乌海市",cp:[106.886,39.4739],childNum:1},geometry:{type:"Polygon",coordinates:["@@Ș°ÇīXњŗ@ÈlkÆ’lUűīĵKżVŽÇôXĸ¯Ž@šťê„°ź„k¤„x™œ@Ĭ"],encodeOffsets:[[109317,40799]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/ning_xia_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"6403",properties:{name:"å´å¿ å¸‚",cp:[106.853,37.3755],childNum:4},geometry:{type:"Polygon",coordinates:["@@nLV‚@šVLšaÞbn@@l˜š@bUÂVlUV„zVx™¤kÞVèšXnš‚@nm°a@UƒÑ„@VÂŽXnV@Va„UšŽVKUUU@@U‚@@KVa@U²@‚wXkWÂnk„±lLnU@UmmVKnIVWnI@ÂUK›@UK@Â@UVKXkmWÂLWUXmlkVwUyVa@w„w@aVI„K@aVÂÈw„KlLVV@LnV„VVnU‚ܲ°WÈIUÆ@nÞ¼‚‚@¦™@UÞUVW@UxUxVn„b„K‚b¯ÞU`VbǬ™V@XXÆVVl°InmnUôƒ°¯‚anam£œWVX‚KXmškôaVU@ƒVak@@wmaƒn@K@UÛUWKXUƒÇƒ@UI™b@alW@akLUKV@@Ukw±Iš›nL@kmwkWmk@JUIƒůVmnÂnU@m@UƒK„ÂVKlkUwkƒƒnVÂUKmbkI±š—KƒkmVkKƒb@U@aƒVkUmn™`kIlaUK@UUKmbUIÚUa@mUa@aƒ„m@UUULUK@bmKkbWI@WXwlkXƒWa@k@ÂkKƒLVkkK@L@JUVmzUKlwUUnW˜£XVlKUwVU@aXI@aWaUw@W@_nam@¯‚UkWVkUWaU@nwmJkUVÂkWVUmUkJ@ImbUaƒ@@WÃ…_mJknmak@@mƒXƒaUV@„ƒxUšƒ„@‚ƒ„@VUnkVƒ@Vn@`ULUbWLXVW@kbUJ@XW`Â@ƒnÃ…Ä–WJƒ@—Âm°@xƒxšbnÂUa‚w²lƒÞ°xŤIVVULۂWbšbkVVXÆ`UbVL„@kx°LlV@Vœ„WbƒJÂn@bl¤ULV„°@lmL@ƒƒ£U@@aUwmKULVxUVVx@„™@kU™@mK¯LÇa¯@"],encodeOffsets:[[108124,38605]]}},{type:"Feature",id:"6405",properties:{name:"中å«å¸‚",cp:[105.4028,36.9525],childNum:3},geometry:{type:"Polygon",coordinates:["@@°@Èb°KnLš@lVš@@ƒUwVUUwVKnLVx@bV@„¤@„nK@k‚¯UƒVKk£@a‚m„IXa›ƒ@UkU¯Klwƒ@UKVaÃ…_UWlU™aXaÃœÂVKUUÅ£J¯w„ñkÂxVbmŽ™a„w@wn¯˜Â„@XIÆĕ„m‚@X_@WVIlaX@WUXKVaVK@_Um„@lUVm@U„ƒ@„ƒV™„w@ƒVUÛwm@@W@ImKUkU@Ua‚aXƒ@wWaUKkw@UVaUamLU™nk@»±`¯@k—W@Ua™ykbƒI„„@VWJkLWUkJƒwU@ƒn¤mL¯wm@Umƒ²XVWbnV@bmxƒVkxUblLUV@ÂkVWKU¼ƒŽkUƒ@mn@JnV@bUnmJUn@„k‚@XlxšLVVnKlLVV@š@LkKULVbk`WL@lkXW@kVƒ@UÞUlÇX™lkaUbmV¯@@L@šƒV@bkb@xƒlW„—bƒbW@—±@UJ@IU@mVk„VxV@@l„IllÂœn@Vm@ƒVUbl„@JÂLmKÛXmVkU›KULU`@LĉwƒKUX„lVUl@Vb„JX¦̼bÞxÅŽxɜĖĠ„Ŏaô@"],encodeOffsets:[[108124,38605]]}},{type:"Feature",id:"6404",properties:{name:"固原市",cp:[106.1389,35.9363],childNum:6},geometry:{type:"MultiPolygon",coordinates:[["@@Vnn@°xnK‚£„mV@„xlIXVlKXI@Uƒƒ„JlašzVbX@l˜°@²_@¼mlVšnKVbUb@VlxVLXb@xW„ÂbVbV@VlnL@J@Xn@Ãœx„b„W@nl@nblmnIÆ`@X„@Vbna@aVUUWVkƒ@kbWakbU@VwšW@_l@nmn@@alVlk@UkmVak@@a‚UXaƒL@¯@KVa@aÂxWI@KnkVaVJn_lJ@„X@‚m@nVanUVb@mXLlJ„ÂVWnLla„VVaVX@KXVVkVKlknKVa@aVU@KXb@klJUknUmƒ@K@_UW@alIUamaU¯kJma@IUK@U„@@UW@@aXLVƒVJVaXIƒKlaUkUV@ambUÂUJkIWJ@wUI™V@JU@UwV@@Um@™nU`@UkUmVUxWUUV@aÃ…b@aWXkKUUƒUUaWK@wnm@IVU@aXwm@UmVaUalk@anKUwlƒUwlÂkK@wmaƒUkmmIk@VmkUUbW@UVUnW@kV@xkVmbVnU‚™@UbUV@a›k@kkW@„kLW¤@„nV@VU@W_UV™UU`VLUV@IUVõVULU@UUUJ@wmkUJ@šWI@l@bkKkbVVƒbVbUL@UUJ@Vm@@L@xÂbVVVLVlVwX@Vb@bmUkbk@@JWIUVÃ…w@Km@UkWKXxWLÃ…@UVUnWK@xkVW„@KULÂwWVXVWzXVVKVXkV›V@VUbV@U„VV@š@LXxVL@V„b‚Ž„LnKVLVxXVmb@l"],["@@@J@aƒU@LWK¯UUxVVn@Ġ„„LUÂW@UbUUUa@KUX"]],encodeOffsets:[[[108023,37052]],[[108541,36299]]]}},{type:"Feature",id:"6401",properties:{name:"银å·å¸‚",cp:[106.3586,38.1775],childNum:4},geometry:{type:"Polygon",coordinates:["@@šUšwVK@UVWÞUšbšw„V@knV˜@@KU_VK@K„ƒn@W_XWlL@Vn@ÄŠw@UlaÂœ@WanamÄ«@aƒ»ŋó@aÆÅɲÿUaV_°ÃÂaƒLƒaUmVwVwX@VUVÚ@@Â¥ÂÂû@mVÅÇJ¯XÛ±VÂUmƒUmU@KUUkKƒLÇxUÂŽ@bƒLUJ@bƒx@xUbVzUxklWnXV‚KnXWlUL@V@ÂŽVLÂœ@VL@ÂŽmJUXmJULnn@VmVkKƒ²mlXÂWlÂx±@@VUb@LÂ@@VV@VVUL™ÂƒVUbU@WmUƒ@„Ò@V¯bmnÂ@VŽƒ„@lVnUšnVWÂŽXÂVl@¦VVUn@x‚š@‚XL@¦‚lXxš„Vb"],encodeOffsets:[[108563,39803]]}},{type:"Feature",id:"6402",properties:{name:"石嘴山市",cp:[106.4795,39.0015],childNum:2},geometry:{type:"Polygon",coordinates:["@@U¯ķó±ÇÛ¯™ķmbXb›@kb@Vĉxm@@UkKWXX`m@ƒ„@LULV`@L—@mU@lƒU™x™aÃVUX@VUL™x™VkLWVšš@J„nVLXVlÂŽUV@zl‚VL@V@b„„n@lU²WVLlLVbUÂŽVxUx@xÇ€L˜xôҜk‚K²ŽVa‚U@wXa@ÂW™ÈĉUa@‚bÈk„m@¯"],encodeOffsets:[[109542,39938]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/qing_hai_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"6328",properties:{name:"海西蒙å¤æ—è—æ—自治州",cp:[94.9768,37.1118],childNum:7},geometry:{type:"MultiPolygon",coordinates:[["@@„ÂV£°Âš@laÂœXô±źwš™ô@„UlƒżaÃœÂn™Kƒw@U„aƒ™ša²L‚mÈLƚÈxlaUa„wÞmÃœbÞUšÂnJ°a„kôƒ‚ÑkwÃVÄŸwÇ@ÃkkV¯¥@Âò„»„nŤ¥XImw@mVwša@ÂÃ…w™ÂmLkaW—wĴl»kçƒó„»@ƒWÑĉŽğÂ@ĉ„™‚Ń„ÂUwóřVómÂĵ»™™Ã@VǕ¯kšÃÄŠÃ…k™°ÓUklkU±šI„ÇÞkı@šÂƽJƒÂ™@UÂÄ¡Ik@W¦™VÂÑșÓÅnÅ¥KULnŽ¯X›ƒ@¯mUÛ@WřmóKknÅbƒxÃ@ƒŽU@kw@ÿÇLţšÃUkšmwƒŽÂk™lÄ‹VŚU¦™ŽƒLkUWlÅÑ@aƒ@ÅѱUóġŹ¼ƒÈĉmÅ»@@wkw™Kl¯U™ġ@—„lÇU™ӯ_ƒ‚Waĉ²Åló¼VbknƒKǎÅ@ƧĢÅ°Ã@ğ„W™ÅxUUm@™‚ÃXۂW„ULUè¯@mbUaƒLƒbUWÄ¡xÂIUJWz™a¯b™y™@ÅÈóLU`ÇXUl™UĉV¯n›mÛbÇ•LklƒUĉVƒšóaġ„ÆbÄ¡KÅ£nkbÃmmnÃWȭȃŽÃXÅ£WóÂkUÇl¯U¯‚ġUÉ…Ä€@°¯„„š¯„VÆnÂmJ@ÄŠÄ·nóJUbÃXUlVškL@lVxnnmb@¤Vzš`ÞÞŤ@„VnÂÆJV„°b„UôJkzlÂŽkl@²óš@ÆÇ°kĖƒšÇbÛU@lmb™XV˜kzƒV™ŽɅĀXË¢lń„ĬŹ@›éÅ@ĉńÆ°ğbUšlÂŽÉœ_°‚@xŦ˜škbVbÆ’KĢ„ŤVŎŽ°@żÈźlĊ„ôKôb@nôxŦ„Æ@ôŽŎL@þÆb@šnnšWËŒbÈx‚InaÅŽxlU@Ѳ±ƒğVUĢƒƨbɲ@Þ¥ôUUÂÄ·WVÂô¯ĊWʶnôaŤË@£nmnIôŽǪK°xUXô@Ŧa°m‚kXÂÆÂÞVÅŽkĊ°ÞLȄôyVašIlwX°UVwĢÑÜKôw@nV@Âœm°nmÂŽn„Ü‚ɞ£VbmÂŽXnƒ°ÜÒ@xÂx@V‚b²UlbkxVnšJUnVVĊ°KȚm°nxÇnn¤±¦@ÂŽUXVV@„ÂlV„„bmVVÈÂÂŽVxšÒ™°šIšbźaȃšbVwš@šƒVL„™ƾÑ@ƒŦÂô¯ĊkôÑ"],["@@„@šƒ„@n„òVÂœa‚w²bVxšxÃœaÄŒVô_ÄŠJšIVmšL„a°@ÅŽÂ¥XÂlK@ƒšk„l„KVbUb˜@nUÄ¢n‚aÈ@lmǬ»Ġ¯œn‚mnƒƨÂVy™Ñǖ™Ġ»ɲInŽ‚@@ÅĢƳ@¯°™ôV„KÈbVIÇ¥¯@Ãó„™@ÑnÄ«WKšƒk™‚k@¥š™¯™Åa™XıVÂÃ…w@±Ġ¯@»™Âš™n™WmÂw@ĪÂ@¯ƒVƒUUWçƒKĉ„Âa±VkkƒV¯w™x@šUJ‚x@bknÇb™mÃ…@Uw±U¯¦UŽ™Kmš¯I¯Žť¼ğĊ™@ǃŹÈ¯@ÃȂnË¡JƒbÛèÇnƒ„ÅK¯„ġĠŹÂW¼Ålm„@¤n²ƒŽÃb@b„š¯lƒÂ¯@ƒšÅ¤W„™¼nV@x„„°@Vx„@lbUblbX¼W‚œšÇ²lšUÂŽ@¼ÂÂŽV¦@bÇlVxUbVxÞbVšœbm¦ƒVV„"]],encodeOffsets:[[[100452,39719]],[[91980,35742]]]}},{type:"Feature",id:"6327",properties:{name:"玉树è—æ—自治州",cp:[93.5925,33.9368],childNum:6},geometry:{type:"Polygon",coordinates:["@@ɆÿĢV°Â°VÈklVôÂŤXÞW„ÂȮÇÞXnmÞnlaŤmÄ¢LÆaĢƒôb„™ĊU„VlkÇ–KÃœaÂœn°mÄŠUšVVkÈWV_ôKŎǚ@šz°ašbXyVI‚JÄ¢wVX„a„KVbna°@VçVKXĆÂÞWšÂn@VVÆwXšĠƒÞ@Ŏ¯ƨġÆ@È„LlmUaô»ÆkĊ±Xb„°`šÔV‚kȘƒĢ@Všk°šLlx@xż@ÄŠn„Çź»ôĢ²VÆ҄@@bÆÒXklV„KšÂV¥Æ™ČUšk‚l„Ânxl™Â烥ċç@±ÂÂm¥ƒwÃ…JƒÂ@™™™Vƒ„mÈIléÈa°ÂU¥™™@kÞV‚K²ÑWƒ°w²Ñ‚K²ñšyÆ„ÚVmw„»kkWĉ—JWUƒVÃ…wƒL™mÃ…@@ƒmw„knÂ¥Vу»°™°@@»„¯„Lla„JôÂnV‚UůƒU@W¯Umѯ¯k@WykU@¯„wV¥ƒkVwţƒk»šwWǜĉĶçšK„ƒÞ™ÇaĉbƒI™lUƒ@kwƒWƒXUƒ°w™±@UšKn£Wĉ—KWxƒkÂÄ•VƒšamwXw™@™„Wmnk@aƒVkĪbĉLƒl™Imm„wUÂǂÂÂWx™nÃJnÂ@¥Æ™kwƒaXƒÜĉ™¯ÅV¯¤mkƒx¯kķܙ²ÂVWôŹVUƒƒ@V£™¥@ƒ°wnÂ@™mÂ@¯@UbUôķŽmn@ÆÛ@ÇýVaUÂÇĊÂVƒ@Çlğ—¯xÃŤ™lVÈÈVƒx„ƒ¤Vx™„kK@™@ƒx@„kVƒĖġ¥kIWbXÂŽÅŽx@nƒxÃ…UW`ƒ_—@±ŽUa™LUxƒK¯„WbkVlb—bmŽƒLÛÆWIUwƒWkwÃV@ÂkI›ŽÂéUb›UUk™V¯Km¯k@Umïm¯Â›m—L›Þĉ‚ÛUm™ġ£UxkKm°™LÂw›šk@kšƒVm„ƒKÂVUk›@¯a¯Ģ™móKUU™x™ImlÃ…n™™ÇbXèVVU„°„@ŽšŽ@„‚xXnmš™ššŽ@¼ğ°@²ÆxU‚„²šWÆb°š™š@¦Âllš™„XLmĬ@҃šÞô°@ȦUJÇaƒLóU¯š@°ġƴ@ÆÂ@mÂɱJğ¼ǕššÒUzƧ‚m„Ân›mğ°ǫ¼knÇ@ÂbÄ¡mmV—@VaUaƒLƒk™l@„kLW‚Ŧ¯@ƒb™KUn™JĉIó`Ä‹UÛb™wUw±aÂx›bñUmƒƒ@™„ƒ@—bƒaƒbÇÂÃ…Xm˜„ƒÃ„ÅôVbގ™bl„UšÞVޚ„U‚°„VUxƒ@U„V„@l`™¼nL@Ċ„LW„„¤kXÄ·WÄ¡XUVVVķ„UbVb@°kVVxÈa‚@ȦĊbšaźJ„U@Ț„„˜Vœƒlš@XkôaWƒĢ™Þ@laĸUÆb²mÞLĠ™ÞÑôbšÒĊa„JVbm¦"],encodeOffsets:[[93285,37030]]}},{type:"Feature",id:"6326",properties:{name:"果洛è—æ—自治州",cp:[99.3823,34.0466],childNum:6},geometry:{type:"Polygon",coordinates:["@@ÞVŤ™ÈK@Ä€lxV@„ÂÞ@„wÅŽalmôLšnXÆÜ@nV‚°@Âœ„°WmÂVKŦLÆmȚԂҚUXÂ¥l@Ä¢JVš@„ŽƾI@w™W°™™Ån¥›kÃ…ÃVwôƒÈç„@lÑĊĕša„JnaÆLVw°kny°UnkÆVÄŒÂÄŠll¦„Vƾ@@™nUźƒÈǂIn°X„wÞKô¦VWV£„Â@£°ókċ±I™™am¯Va™»ČĉV¥°™@m„k„¥l@„ÂÄŠm@ašÂU™mwXƒ@wÆxšmÄ¢_„`VnÆbšKVw„@@ƒnUVÄŸVmVVöIlÂŽl@@çÛmģUDŽw°@VÂUƒ¯»m¯ƒJÅÄ–Ã…Lƒa@»ĉĢ±`U_k`ÇçšóƒkX™lK@ƒakÃރš£WÄ‹kÂÙkxƒJïÅw™xÄ·xmIÃ…x„Â@k±J@ýŋš›¤UÂœkÂŽmV™°ÅÂÃxkwmġƒnÃVU„š¦ƒŤÂlmšóXk¤™ÂUKƒç™@mVkK@klÂÂīƒ£mš¯VUbƒW¯¼ċb¯Âĵam¼mVX„m@k¤ÇX‚ÇbƒUƒ„¯J¯„¯È@˜™bVXVҙ¤V¼kxÚV„@l‚V—„WxÛ¦Wš¯šmKÂnlÂŽkŽ‚šU‚@nÆ‘Uĉ„Ã@ǺۄċUĉ¥™UƒÞÅ™z±òÂL±Ò¯xX„±ÒÂLÃU@lššV¦¯‚ÇbkêÇJƒnU„šš@š„‚ÆI„xn¦‚‚@²Č脦‚è"],encodeOffsets:[[99709,36130]]}},{type:"Feature",id:"6325",properties:{name:"æµ·å—è—æ—自治州",cp:[100.3711,35.9418],childNum:5},geometry:{type:"Polygon",coordinates:["@@VxƒŽÂńƒš@ÄŠÄ ÂŽÄŠÂXÒ°UƾĕÞm°£nb@‚@LUUW„Ûº@nlÆǬšĠ£ÞV°UXb‚VȂǵ„éƒ@ÂkWanm°@™x„z„K°¯ĠVšƒVƒkw™Lnm°kÞxÆa„¥@‚wnĉÆÂ@™œ_l›š_VwšmĸèŤÅČU@™˜WnÂ@ÑmKU™nğƒK@ƒ°¯UÿV£nmšLl™„UƒUÛé±óókkmƒnƒakV@Ç°óÃXƒWəÞťIÅ£xmm™VÛUVÂȂÓnÂWyÈĉkƒVš°WnkÄŠa„¥‚_ÂœK°ÿWÂna@ƒmU¯wƒlÃIU¤UXó¥ÃLƒx¯WmÂÂJÇÈŹ„mV@šƽ@ƒUk¥ĉkÄ‹ÂŽÃ…Uml¯Vmz¯lUxÃ…KmbƒI™bĉĖk҃@Çèó„UxÆޜlm¦šÆ¯ššX@x™Ž@Ž„²ÃlƒÈ™JV²klVl¯ÔlšĉƙްlUǖÞ@ššĶ¼nÂŽUôôŚ"],encodeOffsets:[[101712,37632]]}},{type:"Feature",id:"6322",properties:{name:"海北è—æ—自治州",cp:[100.3711,37.9138],childNum:4},geometry:{type:"Polygon",coordinates:["@@ÅmÄ¡xƽÂUm±Lǿþġԙ@kxmWƒb¯I¯‚mIUx@bƒbŹVǎƒkĵbƒlĉI¯¥ƒUšm@ƒÆ¯È@šašóšUlƒČ»@w›Âœ»›wXaƒƒó°ţçÄkUƒaV¥ÅbÃw¯lmnšKlxU„™„ğU¯°ƒLƒyšw¯@mnXb‚l„@ĐÈǶÂUWa¯VÃUğ¤ǫ™kÃ…@mܹXƒVV@K@Âma¯¤ÃnƽĖ¯V@„ƒ¼„ôlèk¼„¦˜xXÂŽlbnKšÂÆx@Ž™bUx@nnxWJţ¦ƒmƒ¼ñÂ@Ž°¦lUÞlÈ@Ä xÞUlxÂÒó„ƒl¯bmI™ŽÃVÛaÃnƒxVbkbÇwřÇKÂn±K™b„šƒb@V„xšLmŽÛŽŻbk„ƒVó@™šŹxó²›Wkb™@¯ÂU¤ƒÂźĊ@lUX„°lÆôU„ƒlLX‚aÂœV°wšxUb°xÜôÈKVkÈmlwškÈKšwšK™™VUŤĉŎ»„»„IlÂ¥na°LV»²¯Üy@wĢƒ°ÂĸwlwÄ¢w°±„_lVkš@°ƒbƒÆ¯zƒ‚„š„@l_„@Ģ±lŚVlÂUaރ„LVƒnKlnÈ°IllÄŒa˜wÞÑ°x„UU™@wƒÂVÂkmÄ Lô»„KÞýôaÞ¥ôĀÞmÆ„™‚mUƒŎÂV¥Èl°²°a²¥V„@@w„amm@Ñn@Æ£żƒVƒĠ£@W„¯ÞƒšÂl@š»@Uk@"],encodeOffsets:[[105087,37992]]}},{type:"Feature",id:"6323",properties:{name:"黄å—è—æ—自治州",cp:[101.5686,35.1178],childNum:4},geometry:{type:"Polygon",coordinates:["@@ôl²ôÜê„VƒVkš™KmnU¤VĀ¯°@„„LmÄ VšnLÈL@alb@al@n°Vš_XmWUÈamaVIn@n‚aV£œóVWĪU£°ašxÈ¥@™‚aÄŠwȹ@óša™ƒğbmÂ@k„w@mƒaÆw@ƒ„In¯mmƒ@UkkWƒÑÅ@@kÄ‹ÂÅçVkÃJÃ…kVykŹlÂ¥@¯š™ĢU܃X¥òý—mmX™ÃÃ…lmU@£™WlÂÂy™XWȁbƒl@aÂI›»k@klm@UxUUƒVƒ¼¯Xƒl™aUnķ‚ƒI@x™@¯„ƒK™„ĉUU`óšlČ¯ô@¤ƒÂÞJ„k°xVŽ„n@ÂŽmbXŽ¯Ā›LÂ`ƒ¦ĉbml¯X™ŽUÂŽl„ȂĊXzm‚ÈÔU‚ÜVšUnnŤwŦJɚÄXÞW¯ô@ÈlU„b„mln"],encodeOffsets:[[103984,36344]]}},{type:"Feature",id:"6321",properties:{name:"海东地区",cp:[102.3706,36.2988],childNum:6},geometry:{type:"Polygon",coordinates:["@@@҄bš¤ÆI°ôU¼š°UÂŽnnWx™š@b¯L@lUUWbXxWl„ƨnxVÂUllš„XVÂŽUÂŽnL@lȀý²KVnƾ‚ĢwV»ƒÂ@mÞ£nÂƃÞÑmL™ÂƒKUaVÂżĕƒWVk²ÂƒƒÆÃ@ƒXw°@„Âô™@a°wóUUÂmIk™™aVmÞwmknyƒ¹VÿƧnÃ…Âm£X»˜™naV±„ÂÃw@ašb@aƒm¯„ĉVó¦kÃWKUÂU@WanU™b@ôǺĉxÂb@šÇ¦™w¯bV¤„šUX›ôU¤ÂbmÂm@UJnbÇbXVWn™`¯UmÂk@@bka@bÇK"],encodeOffsets:[[104108,37030]]}},{type:"Feature",id:"6301",properties:{name:"西å®å¸‚",cp:[101.4038,36.8207],childNum:4},geometry:{type:"Polygon",coordinates:["@@@kmKVÂUƒWk™VkUÂmwƒƧXkWwXaVV@k°K@aš™XwmmV™¯V»¯óÅJ™£ƒamŽ—X@šċVţÆķç™nUx™`kœ›`@šÅÂmÄŠÂx@Žƒ¦U¦„blVރŤèô¯„„WbÂœx›¼œŽ@xċ¼k„™V™ô™bÇ@Å°@„™n„V°¦ĊJ„kĶa„lÈÂźU„a@aVwnJ°Â°J„anXlwš@ĢÓ"],encodeOffsets:[[104356,38042]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/shang_hai_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"310230",properties:{name:"崇明县",cp:[121.5637,31.5383],childNum:1},geometry:{type:"Polygon",coordinates:["@@uÅu»GPIV±ÃɃŜ{\\qJmC[W\\t„¾ÕjÕp‡nαÂÂ|ěÔe`²„ †nZzZ~V|B^IpUbU†{bs\\a\\OvQÂ’Kªs†Mň£RAhQĤ‹lA`GÄ‚A@Ä¥WÄO“"],encodeOffsets:[[124908,32105]]}},{type:"Feature",id:"310119",properties:{name:"å—汇区",cp:[121.8755,30.954],childNum:1},geometry:{type:"Polygon",coordinates:["@@`y”ĉNÇ•DwÇ»ƒÖLxCdJ`HB@LBTD@CPFXANC@@PGBKNECCBB@EBFHEDDDSNKAUNBDMNqf[HcDCCcFÂ…@EFGLEBa@ACoCCDDD@LGHD@DJFBBJED@BGAEGGFKIGDBDLBAD@FHBEF@RFDMLE@SGANFFJBANPH@@E@FJjRIACDMDOEKLFD@DbDAJI@AP@BGHFBCBGDCC@DCA@CECGH@FKCEHFJGBFDIHACEDNJDCVFBDCRKRLDLITB@CjNJI^DBCfNVDHDFKHAFGDIICDWBIF@@CFAjFJNJBBHD@CJ@AEFJ@@DH@BFBCPDBMFEQGDIFCNDHIP@HDABFACBJFHEBSZC@DP@@JDBƤ~"],encodeOffsets:[[124854,31907]]}},{type:"Feature",id:"310120",properties:{name:"奉贤区",cp:[121.5747,30.8475],childNum:1},geometry:{type:"Polygon",coordinates:["@@~T~JjZdDbLXDLCB_J@@FHFZJJIAGH@HGR@BENBLID@@LFCDF\\FpDBDb@FAHKFE†@dEDDdC\\GreNMACVMLBTMCCFCEGFAA@DAFDLMHA@OD@BMEWDOC@AS@KGAI_DcKw„ÕísÆ‘åĆctKbMBQ@EGEBEJ@@MBKL@BJB@FIBGKE@ABG@@FMFCPL@AjCD@ZOFCJIDICIlKJHNGJALH@@FPDCTJDGDBNCn"],encodeOffsets:[[124274,31722]]}},{type:"Feature",id:"310115",properties:{name:"浦东新区",cp:[121.6928,31.2561],childNum:1},geometry:{type:"Polygon",coordinates:["@@EN@JJLNHjLJNR^GRYVBNZJRBV@PDvbLNDN@LGNER@nCNQNuT_TIVFV\\Z\\XnDrI|[Ʉś²ÃJUHOÆ£}CA@IO@@CYDATGFIEDAEBBAGCO@GJMCEDCJRHEFANOCADAEG@@CI@FE@BDIC@AGIAIMiEEB@DE@AJCXJDCJEHGBELGCUCeMAD]CIJiM@DSAKJKCLQDQACUECDMIFCBDJGECHAEIWCK@GLMCCGEACNKCEJG@MMBMC@@CIJUINT@JAJSTEPZZCP"],encodeOffsets:[[124383,31915]]}},{type:"Feature",id:"310116",properties:{name:"金山区",cp:[121.2657,30.8112],childNum:1},geometry:{type:"Polygon",coordinates:["@@L@BIHFN@@EE@@EFBDGDAADVDD@@EF@CA@IIsRE@GDAF@BF@CV@|FBCHBLCNHAFCADBMDCFZXHILBVEEQA@MWFARJJ@DCX@@TEFBLHAAERE@AJABRPBNK\\BrJ\\VHGND@CNADKDADQjGAGNC@GJ@FCFFHC@JF@@dLBDSFADHVG\\DTEPDDHJALIJkJDJCDIPE@YDCBiK@DONE@EH@BAF@HLJA@EIA@ALKNA@@FIFAFHR@NALadsæąyQY@ƒA±DʼnXUVI^BF@FFF@HBJEDFFGFEBSRkVEXGHFBMFIVW@GAEEFOIAIPKABGWEKFSCQLQBSEIBC\\FdBLRR@JGACFDDEF@AWB@LJJYNABBA@CUEGPaO_AIE@MYMFIGAEFECHSAAKAO\\[JEDB@E@MMA@@AGBKMGDFFCDDFEDFJF@NPBAFLHFH@EDDHBADDC@DDCDHHCDDFDABDAD@FEFOBCJ[D@HEDDNJBDDHABJIBBvGLBJAH"],encodeOffsets:[[123901,31695]]}},{type:"Feature",id:"310118",properties:{name:"é’浦区",cp:[121.1751,31.1909],childNum:1},geometry:{type:"Polygon",coordinates:["@@RUNKdOFDJCbRFMLAHPLDN@JGL@@APBWYCKN@TU@SHGCEJIDIJKVIZVNM`iNY@CIE@CA@KBOEGEUFCCSADEIEFCDDDIDDHC@CKIeDCG@IG@DHWFEEGCH@@GO@@O]CNpeEQDBFME[JC]DGF@CKOA@QSB@GB@@GW@@ED@AQIJIAAFE@@DO@CFI@KNG@CDACAFEGKGBEGBDCCAIFCCLIECFI@MBCLDHGNAHSF@DMB@EEKBA@@C]DEICFG@ADBHGFKCDAKKHKD@@FHGAANGEEFCHKCECBCKG@ADKCNE\\[A[I@@mGBDQQEO@BCE@AI[AML@JGACLOAFKEMM@EQKC@CUCBCCBCHEA@FF@@FM@GEAJK@GNF@EXPH@FD@M^@HIADJCFDBER@DK@@DE@CAKFOCCBDHIBCNSB@GFC@GQEEOWFICGDUAEJIDBTAHJHEB@DIF@NE@H|HBDBEH@DKBAHEF@HEEUB@FGFGCCCE@AHOB@NH@PRLVNNFBX@RC€PbAvMtBfH@DJF@ELBFA@EH@HNED@FFB@HLC@CJ@@DJ@PIRf@HE@CFF@GPHD@DKE@FFBEFFD@DEFCA@DD@IjCRFBAHFDKD@HF@@PM@H@BlbDJDBFEF@DLXB@HCD@@IFCBIFEJD@FDC@FBALLF@PAACJERACAJCBD@EL@JD"],encodeOffsets:[[124061,32028]]}},{type:"Feature",id:"310117",properties:{name:"æ¾æ±ŸåŒº",cp:[121.1984,31.0268],childNum:1},geometry:{type:"Polygon",coordinates:["@@@DLDFRN@FNELPBDKHB@INK\\BBJF@ADP@RFCRHA@nJ@B\\[\\MFLDBCH@DLDADFGLEDFFMHBBGH@EC@GLLLCBLDHEAGBCH@DEFJ^C@DB@LAFFA@CNE@GTMBGHKCAD@NEJFDKJDDJEDBCDHAAFLHFHBEBDDCH@LMJ@DEP@@CF@BEJBJIBRC@@FX@@HA@@HTA@RPBDLE@CHD^\\INFAERCfFMo^D@PP@@HG@HDFFXECGH@@JDHfCLJ@DGDCCCJCCEDJFCFTBDDVEHFPFLAB@NBFCFKFC@CHIACNOHWHCAAFIDD@CDAGEI@ACFMF@R@R_@GQED@EGFEQEDE_IAHKAEÂXCQUOQCUDEN@ZI\\DDmAMHCICDSOC@EG@BKHIGMIBCGOCSF[CUHCGEBCTKA@cE@@IGDEEEDI@@HMDBHiHCRCBCLMB@DMCGH[UqI[AMLOAAQIB@BQFBFGBAKFE@SW@CDI@QIEBNXB@FRUFKAGJYWDENCCADBBEMGKDGAAD{EU@@DAEE@CB@HQFJt@JDBE@@FC@"],encodeOffsets:[[123933,31687]]}},{type:"Feature",id:"310114",properties:{name:"嘉定区",cp:[121.2437,31.3625],childNum:1},geometry:{type:"Polygon",coordinates:["@@F@LI@IDKJADKIEJICADGACFECCJ@HKCAFOHAJI@aCBEE@ICAEB[GFGCKL@FGEIFADMLCAEJM@ELQECEIG@BE^QKKLQCA@EHBIGQ[GEHOMGGDHKH@JOECFCjCBEFDNCACMBCILGTABDLEEOEIG@GFIMM@CGKFBFCDE@@GEAGEEACIcGaHMFITIHDN[AKF@FS@OA@BK@IHM@KCGOKBENaQIDECcPMLQVFHFB@BFBKLGD@FAJOVGIACQ@A`LPCB@JEF@RU@ANS@@RCL\\HIFpRBFRBBDKLLDADJDGBFDABHBEDNF@DGBBBADKDAHC@\\JJFBDEH[DEFDH\\LX@XLBLbT@DNJLDCEL@VJABJNDHB@HBHYFBAA@GNFB@@AFB@AFABFLFBHFCL@HJBAFBLC@DN@HN"],encodeOffsets:[[124213,32254]]}},{type:"Feature",id:"310113",properties:{name:"å®å±±åŒº",cp:[121.4346,31.4051],childNum:1},geometry:{type:"Polygon",coordinates:["@@ˆmÖoÖiƒ½[s[YEUJU`SCIEBCCWJY_LIICDWU@@FaBCJIB[ICH[@@CDKEE@MK@@IMCAEBCH@AMFI@SMGEFGB@FK@BHCAIFJNQD@FEBDFMBKGACG@ECWH@@CDDTOEEBGEK@GC@EE@GPHFR\\JHGA@FDBKRLL]RAFH@FJFDKR@FINBFKDCNEBFJEHK@DLEH\\HFADB@JFFDA@bIJGBEPDBGLI@DDEFBDCHDBIJJFCLIBCL@JKJE@ADHDBHJ@HIBBDFHBBAEIJ@BJFAVL¢ˆ"],encodeOffsets:[[124300,32302]]}},{type:"Feature",id:"310112",properties:{name:"闵行区",cp:[121.4992,31.0838],childNum:1},geometry:{type:"Polygon",coordinates:["@@T@@ELE\\BCMJGJSNEbGdHDJFBJAFIEIFCEWG@@gMENSFCVJFAxR~B@IH@AIiI@GE@FGEAFQPDRiV[\\DFSGMHAXHDOMCJCDETBBNVJJI@DD@ANNNH@FILDDMFBDHNDHKL@XDFGLD@EHGFD@DDB@CDDHCDAEAHG@ABOJ@BIaC@CECLKPFNCDCJBiQEIF@@@OGBMIAEEBMTHF@NKEC@QFEGA@EBCKAACHCLJHEFHHB@AFCAIEACIC@HG@KCCDC[ECEED@KC@KJMAAFQ@GHG@BHIJYIGE@EI@A`KDWCaKcCiY}I}S[CYJM@CFDVPRRVWDFžLBBG`JCFRFEFFHC@RF@HQ`Q@E@ENBDJ@HFCB@DCCEJBBGDGXMPBDGJ@DEDELEDMA@DJF@DMZ_jMNYUUJILCJIJDFGH@TSVM@DLXZ"],encodeOffsets:[[124165,32010]]}},{type:"Feature",id:"310110",properties:{name:"æ¨æµ¦åŒº",cp:[121.528,31.2966],childNum:1},geometry:{type:"Polygon",coordinates:["@@V@CXJDKJZ`XIDDFADJvSRMDM@mFQHM@KCMKMuaOCU@BDAJSX@HKJGD@PNJCJWAGT@R"],encodeOffsets:[[124402,32064]]}},{type:"Feature",id:"310107",properties:{name:"普陀区",cp:[121.3879,31.2602],childNum:1},geometry:{type:"Polygon",coordinates:["@@F@@FHDL@HFFAPFCSDC@@XGFDH@BDLHNACEFA@ERCIMJEDBAGL@@EHAFENHHJ\\ONQBQCIBC[MKACKI@GGGH@I_G@CW@[DMHCDIBMTDHN@JNHEH@FJFPKFACSBKHDJNABDMDECAFiDEDFDIPG@GLHCNH"],encodeOffsets:[[124248,32045]]}},{type:"Feature",id:"310104",properties:{name:"å¾æ±‡åŒº",cp:[121.4333,31.1607],childNum:1},geometry:{type:"Polygon",coordinates:["@@RADL\\NCPHFfLJaJ@FWLGMGIK@IFMDOYYFOTSBI@IMSAMSACFIDNDCPWGGBHNET[CU\\QjOCERFBEHF@@HjJBJG@@J"],encodeOffsets:[[124327,31941]]}},{type:"Feature",id:"310105",properties:{name:"é•¿å®åŒº",cp:[121.3852,31.2115],childNum:1},geometry:{type:"Polygon",coordinates:["@@HFFB@HF@DCAELENSJADCNG\\CX@@D`H@JHGHHJ@BINBFUGEDO[MCKQB}AwQEBUIEDMTNF@hH@FXEDFJEJIB"],encodeOffsets:[[124250,31987]]}},{type:"Feature",id:"310108",properties:{name:"闸北区",cp:[121.4511,31.2794],childNum:1},geometry:{type:"Polygon",coordinates:["@@CSG@BQGODUPWTOBQAAFMECKBGEMFKEOHADDJARMR[PGI@TEJBNG@ADBFND@JL@@NFFCL@D\\@DG\\JJADI"],encodeOffsets:[[124385,32068]]}},{type:"Feature",id:"310109",properties:{name:"虹å£åŒº",cp:[121.4882,31.2788],childNum:1},geometry:{type:"Polygon",coordinates:["@@bA@E@QHSXBDIMI@OHCLI@GTWBIACQAYIOFGCENBBARSPOXCVHPARH@DT"],encodeOffsets:[[124385,32068]]}},{type:"Feature",id:"310101",properties:{name:"黄浦区",cp:[121.4868,31.219],childNum:1},geometry:{type:"Polygon",coordinates:["@@NEHFLAFDHDPEAMZUHQQ]IMKJG@EPERABHBGRUCCNGV"],encodeOffsets:[[124379,31992]]}},{type:"Feature",id:"310103",properties:{name:"å¢æ¹¾åŒº",cp:[121.4758,31.2074],childNum:1},geometry:{type:"Polygon",coordinates:["@@VDHQGABAFQFOH@LIiKKHEXI@IbAFZB"],encodeOffsets:[[124385,31974]]}},{type:"Feature",id:"310106",properties:{name:"é™å®‰åŒº",cp:[121.4484,31.2286],childNum:1},geometry:{type:"Polygon",coordinates:["@@DLLB\\NPGLFHUDMYABEeKEVMAAJ"],encodeOffsets:[[124343,31979]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/shan_dong_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"3706",properties:{name:"烟å°å¸‚",cp:[120.7397,37.5128],childNum:9},geometry:{type:"Polygon",coordinates:["@@ŤLšLllVń²è°xżĢĠÆl҄šŤbœ„V¤ĊXnÂŽlÄ¢VĊ„Òš„È°ĊŰÞè˜L„±@ÑŸn»VUźċ²»ÆkôVɆkĊŃ²kŤVVwUUVmUaƒÂ@KkU@ƒmUmmk@UwUkmW@UVIXa@ƒmw@a™KULƒaƒx@Uk@UbWU@yULmK¯@kXƒVUwm@@JUUknWKUVƒLUbU@™wWykIƒa@w@mUI@ašUVynIWa„k„@@W„bl@@knmƒK@wnIl™°Kna@ÂV¥ğ@Ä¡Uķ»™¥@UÅJƒX¯¤k@™wmI¯‚k@mwƒak@@šlX@bUJ@VƒbknWxkLkxlŽšLVlkLmŽšb@bU@ƒbU@VbU`Vb@n„L@ÂŽmb—U@˜VnUVmnU@mm™@kIUWVIUK›VkkUJUnmL@VmLUaÂVWaXamU@™™U@KUUmVƒU—JƒU™VÇwÄŸn™mƒ@mXĉV@l¯xnô"],encodeOffsets:[[122446,38042]]}},{type:"Feature",id:"3713",properties:{name:"临沂市",cp:[118.3118,35.2936],childNum:10},geometry:{type:"Polygon",coordinates:["@@˜bXlƒl@zlV@lXXmÂŽkbVVlš„U@Vn@@Vmb@XšKšVX„WJ@XXl@„‚ŽÈbVLšUl`„@XXV@VVUxVbUxVbš¦„@‚WnXVJ@bnVUzl@„°Æx„U„KlU@mUUnUlUVWVUnVV@XX°V@Všll@Vk„aXVl@Ux@bmbXLlKlb@b@bUJn@@„„b@n°x°K@an@@UlLVKVbXb@bVVnK°LVa@UVa@™Xw‚KVxnLšU°@naV@UWUkWƒULmV—wÃKUUla@aó_@mƒK@aUU@ƒWUÂkwVm@aVI°W„@@IUw@a±¯@Â¥kUVUÂm@a‚wkw™@ƒK@kVKk@maXalI@alL„WXblaVLVU„V@LnKš@„l@w˜aXašLlnUl„LšmV@n°J@_VmnIVym£UKmI@WnIVm@anUVmÇ_kÂÄ¡IÃ…WUXÇm@U@ïÅ@Ī@naWĪIVW@IkK@klKn@naWIƒmk@ƒaƒbkKkLWn™WkLWmk_ƒ@UaVƒUKmLUw@mn£WwUmU™ƒaóV@UkUm@UKULUwmJUX@WW@XҙzVblJXÂŽWXk@UVWK—X‚¤UL@xU@ƒ@ƒVUaU@@XmVkLmWkXUyÃLmKXnVÂŽ@n@l™x@bWLnVVn™`knULmxUl„„WLXÂŽVb@VƒK@z¯x¯¼Wx™KUn@bk@ƒlƒVVVÂz"],encodeOffsets:[[120241,36119]]}},{type:"Feature",id:"3707",properties:{name:"æ½åŠå¸‚",cp:[119.0918,36.524],childNum:9},geometry:{type:"Polygon",coordinates:["@@l@@UšK@ÂŽ@L@bX@@VlL@JƒLUVnX@`ÃœXn`V²mJ@bU@@n„b@l°xnnĸVƚ°@„ƒĊ£Þ@lWnÑnkʶJmó°w@kk»VÂ@»ƒ¥k@V@kw@wVm„a˜Å„mšaô£ŎƒXI@mln„Kla@mV_UKƒ@kUkw@alW™IU»™mƒ—@WUIl±UUÃ…U›bkJƒÂ@a@wUKUaVIÆmXIWaka@m@Ul£XKVw@ƒUIƒJUkmJ™ƒVÂkU@a„ƒWK—ImVƒ@UxmL@bX`WXU@U`ÇkUak@@°UblXk‚mLUKmL@VULóƒƒVk@@Vlbn@Ub@ÂÄ‹aUJUbƒIUlVLUVVbVKX„VlVXU@mb¯@™VmKUwÂLWx@šUb@VUb¯KmLUU@aWaUaULkK@Vm@@b¯L¯w@mƒa@ƒm@UUU@U¦lJUXƒVƒmkb@nm„XVWÂŽkb™IVxUV@VUbWLXVƒLW`Ux@nk@Vn@x@VkJ@ÂœV`mXkÂŽ@V„xVÂ@lVššI@VULš˜VU„IV`°bVXXx„V@VWVnL@xV„Ub"],encodeOffsets:[[121332,37840]]}},{type:"Feature",id:"3702",properties:{name:"é’岛市",cp:[120.4651,36.3373],childNum:6},geometry:{type:"Polygon",coordinates:["@@„@nU˜JXLƒ„@blVU‚š„nIVl„IVJ@„UxWLk¤@V@nlbXbWJÃ…nUJVbVL@x@b„ŽlIÂœaÆVVVk²VJ@X„˜šnV¼šJkX@blxlV„@VLU`@nkbƒLkm@nWJÅ„ó¤™bƒn—ƃbUn@xlxU@l@„¦@¼UÂŽl¼ĊUnW„@šnÄ mÈxšU„V˜I„VnUVV@LšV@šnVWbXb‚UVbnK@UnKVmVIllÂœUVLUJVXlJš@nnV@nmVUUm@—˜Vna@ƒK@mUaV_UaV@„aV@@a™anÂlKUk™KkÂlwlKXwlm„a@UVI@akW@™l@„bnxl@°ÂnJšxl@°£„WÅŽIUÑn»lašmô¹Ŏ¥VaUUkƒmkÄ¡WɱIUUŹ`›@kk@ĉƨřVÂ¥Â_Ç@™Ĭƒ¤ÃL¯m¯£ƽóķwUW±ī¯kÅaĉĕ™kÄŸmó°ƒbW@UKkLUaƒVmz@V@ÂŽUxVn"],encodeOffsets:[[122389,36580]]}},{type:"Feature",id:"3717",properties:{name:"è泽市",cp:[115.6201,35.2057],childNum:9},geometry:{type:"Polygon",coordinates:["@@@¥šIVUÈmÞ»@UlU@Un@VW@UVmkk@aVUUKVÃ@UVknK@UV@VVnIVƒ@wnƒmwmKXaWaXI@UV@Vy²blkVKkam™U@kb@Um@VmUkmƒÂKmkXKWwkU@Ulƒ@UnK@UVUUm‚KXwšUVL„w‚K„U„@@Wl@@wUkV¥—@@I@W@_V@VWUw@UUa@aƒaWa—@@_mKUw™l¯amzmV—@WK™nU@kƒWLÄ·aUKÂbÃVmV@ÂUWÇbÛ@ƒX™°UbW@XÂŽm„Vlk²UJUbmLÇxÃ…WUzl‚¯Ll„@VkK™XUbWJ@bU@¯@™ƒkbƒLmKka™„@l™_WšXºVbUz@J‚n²V@¤lX„Ž„nV°šLn`WbXLôVlKVUšxXn˜lXLlU@bVV@„XJWLUVnVV@„„@n‚l„°nn‚V„KÈbVXÆJU°VnXV„kV@@xVL„@šWlb"],encodeOffsets:[[118654,36726]]}},{type:"Feature",id:"3708",properties:{name:"济å®å¸‚",cp:[116.8286,35.3375],childNum:11},geometry:{type:"Polygon",coordinates:["@@nam_nKlÂVLXa„Il`š_@KVVXI@m@w‚ƒ„@@k@Kšnô@n`VbV@@L„L@KVVn@VX@‚VL„Jl„š@VUUƒU@Uam@Uk„wšKWaXamÂkJmIUÂVUÈblašUnV@kVKl@@lXL°kVJ@VÈnVJUX@V‚LXl@xVLnU‚@VK„V@a„IUaV@„bÄŠU„x„K‚kVJXUlV„ƒ„UVašI@WUI@KlUnw„mWk@WXIWĪU™L@Wna@Um@@UƒVk™UUlanÂWW@kkU@y„kWk—aWVUlÃbUU@kƒJUIU@@ĪJmaókƒLÂKǃUUkKWLk@WbkUUaƒbmKn¯°¥V@XwV@VanaVaU_@Wlk@WÈ@VUÈVVۂm„akÂlKȯlLVUX@lK@aX@@kV@VmV@VwnJV_UWUwƒX™am@kW@wVUkKVIUUVmU@UV@IVK@aUL@aƒV@Lm„UKmx@ÂŽÂômLkUWJ@šnXmlUxUL@Vkn›VUšU„@V™L™`Ub±LkV@kUKÇbÛ@ƒU™Wó_mJƒÂ@Wk@@Xƒ@ƒVÂLƒxUK™VWxÂLVnUV@VmL@Vk„@VlVXxWLnl‚Ln„VlUnn@@VlaV@nšlbULkl±aUzU@@VWJXbWbnLnxm„@xU„mJUUU@@VmLUl@VUÞVLUV@bllUn@VUXm@@VkV@VüÇnUV™J@¦nnƒlnVlL@„Þb°KVV"],encodeOffsets:[[118834,36844]]}},{type:"Feature",id:"3714",properties:{name:"德州市",cp:[116.6858,37.2107],childNum:11},geometry:{type:"Polygon",coordinates:["@@„¤@VmbVXnVVbVJššXÂ@ÂŽll@z„lVInl@„@bVxUbĠ‚l@Èbla„IšxXVWb@L™@n‚ULWVXXšWWLnL@`@LUVVL@lVn„JšU@UUk‚a„™nš‚Vôô„b°¼V‚ÞÂXš˜‚œIÃœbÄŒa˜bôW„XÞWÈzÆmnLVJ°ÈnlV²lbnW@™@UƒUV™šmnwmkkKWƒÂkla@mVIUKUa™aUwmn™JU@@amIk@@bVlkX@mmUkÂlUUƒƒa@_UaUUƒV@wƒw™WkXmW@I@WUaÃU@UXaWUU@UUVW@UUUWUnÂ¥nUVa@m@k@alU@wk™LWaÂ@UUm@@wnÂmU™wla@anKn_@alK@Ù_ƒ@@WUUUmlÂkaƒIƒyU@UwU_Wa¯yU_mWUwkImm@InWWUk@@UVWV—kW¯U@VƒL@b¯b@l±¦@šVV@lUbV„@škxVnUšl¼XV@b@lV@nIWxnbƒ‚™@UU™LƒxÃ…xm¯ƒaUĪwU@mUÃ…VÃKULm@ÂbmKUXó@"],encodeOffsets:[[118542,37801]]}},{type:"Feature",id:"3716",properties:{name:"滨州市",cp:[117.8174,37.4963],childNum:7},geometry:{type:"Polygon",coordinates:["@@Vb@`„bV„kVlÂnV@nlWUk@al@nJ@bV@šInmVxšbVbVLUJ@nkb‚lX„lLnlmx™nUš„V@V@šmXn˜lbĸ@nnVx‚b@lnXV@UJ@nVxšxnxVbÆVn¯ƒĕ‚@@wÈçUÇlÄ·VIÂœb‚@„Çmk@Â¥k@UkUK@aWakUóJW_UW@wkkWK@U@Kš@XUƒƒUkmUUalKXala@U@kkWlkÈl@kšV„mVIVmU_‚a„ƒƒwnwVW@wƒwUƒ@wU£ƒwkJWIÂyUI±bk‚VÂUJ@nmV™Ukl„Xmx@lnbW„kVƒUkLWŽƒxkKUUmUkb™J±Â—LÇxUKmkUmkkW™™a„mUaVkšJÆ_²KÄ @U„W@w„U‚¥nUWwÂK@aÃUkÃ…VaVK@akLWƒƒƒ¯I@bnbVx¯JW„ñšWbUL@šƒŽnV@VmbkUUV@IÇak@@bWak@WJUÂœÂJWL@bXV@„‚@„V„Jlb@zUlUÂŽUImšnbV‚mz@°UV@V™bV@@V@L@xÂLmKUnmJVX„J@VkLW@UVUL@b"],encodeOffsets:[[120083,38442]]}},{type:"Feature",id:"3715",properties:{name:"èŠåŸŽå¸‚",cp:[115.9167,36.4032],childNum:8},geometry:{type:"Polygon",coordinates:["@@ô@VWnL‚an@VKÞLÆUnVV@šxV„„bn°Æw„wšKVVš@„ÂmaXwmJU@@k@aWUk»V™Umlw@™UƒVa@kUU@™²¥@k°a@a„K@U›ƒUÂÂ@mmm@ów—ѱ¥¯@@w™Kmw—IݴkU¯UmakJmIUaƒVkKUkm@VUUa™Uƒ@UaƒKUK¯@™w™UVÂŽUIUKVw™k™¥™wƒbVÂŽ@xn„@lWnXxlL@`„XlJX¦l°XxW¦@¦Ul™n@Ž™@@Um@@VXVmx@¯bllUnUJ@VULVn@b„xV‚VL@b„„VlnVVblV„ÈnVlIVJÂœLô„lJ@xl²„"],encodeOffsets:[[118542,37801]]}},{type:"Feature",id:"3705",properties:{name:"东è¥å¸‚",cp:[118.7073,37.5513],childNum:5},geometry:{type:"Polygon",coordinates:["@@ͬUǪlô@°UÂœw°ÅĠ¯š»Ģ炻XÇ@w™wÆ‘a™ÂǃkwVƑ¯@řķUmm¯w@kƒa@mV@@anIU±m_ÛW@_mWVU„K@IkK@UW@@a@K@™L@Vk@±UÂ@UV@lm@mUU@kLm„„xV¤@xV„„x@xUXmx„xƒ„ÂbV`UnUJƒn™U@lÇkkllX@l@VkbWbkLVbnVVl„„WV™@@L@VXLll@xVXX`ôIlVXb@bVLVll@@¦nlƒÈÂ@›aUJkĸVÈÇè@x"],encodeOffsets:[[121005,39066]]}},{type:"Feature",id:"3701",properties:{name:"济å—市",cp:[117.1582,36.8701],childNum:5},geometry:{type:"Polygon",coordinates:["@@²¦˜Òôxn@nn‚@V‚œ„°VlXU˜UX@Vl@XVmX@JnnlJVxnXV`°zXbV`VxV@„z„JlbkÂŽVnVV@X„@š`@ÞkL@bm`mL@bkbšxnVmÂ@xn@VV‚@XbšKlÂ@xkV@b@l@nUbmVm¦XVVV@VUXVVV@XVWb@VÞVVb@X@JnXlWšX„x@x„UVV@aVKVUX@lK@UƒIUWnIVmnL‚K@w@K@UU@ša@UVU@¯nyUÂman™VJVÂVk@ykaƒIƒUÂ@@ƒWU@aXK‚IV›XIl@Xb@al@Èb@JVUlVna@UmU„Â@™VKXaò™Xƒ°IUwma@aU@UU@wVW@фw@a™I±`kbƒUkw™UmJ@UkmÇUUkmKknUVƒ@mJUkÂaWkƒa@KÂÂmKkUƒLmyXa¯_@WmImmÂbƒLmUkVUbUVƒJ™bƒUkkWJkUƒl™IUm™k™Lƒ›„ÂlK@knaVmkI@mWaƒLUK™UU@@VmLUVÂLWK@UUUƒWUkkVmx@„Vl™¦"],encodeOffsets:[[119014,37041]]}},{type:"Feature",id:"3709",properties:{name:"泰安市",cp:[117.0264,36.0516],childNum:5},geometry:{type:"Polygon",coordinates:["@@n¼šŽW„nxšL@x°@š¥Uk@ƒnwlUVl„XVV@VXL‚KVUnK@UV@šVVL„KXb@nlJUnmb@lkLƒ‚„œšKšlVnšJ„klVXIll„Vša„IVUValUnV„K‚annnJ@X°`Wbnz„KlVnL‚Ž@L„bXl‚bVlnI„@VUU@UmVƒ@U@Uš¥@ÂVmV@@_Ua@m°@@ƒ„kmUUm@UVmn@nX‚@@a„anJVUVL„mlIVJn@nkVLVa@KVmVLXVVLš@@U°bn@VaV@@K@aVkÂœbWaXUVymU@aUImWÂXƒ@™¥UaVwUaVwUUU@WWƒ@k_™VUKÇaÂÂ@ƒƒnmxkV@LVJ@X™JUbƒVƒ„kUWVUIÂlƒLƒwĉVƒaU@VbƒJ@bƒUULÂ@mVUK@wWkÂK@UVWUIÇm@UUI¯lWK@kk@UL@lmU™VkbÇaUVVÂnJlIn‚WbXb™LƒxVln@VbV@V„UV™@kƒƒIUK@ÂUWm@UU@LƒK@KU@Uam_ó@™m@L@lƒ@„@x@nWJUU@L™`k_ƒJWbUKkÂmLn`mb"],encodeOffsets:[[118834,36844]]}},{type:"Feature",id:"3710",properties:{name:"å¨æµ·å¸‚",cp:[121.9482,37.1393],childNum:4},geometry:{type:"Polygon",coordinates:["@@VbUnVVUxĊ¼š¼ô@Þф¯‚WǬLÅŽUÆW„¹UǃůуÃkţ™™ţóġ™óL™ł̥U™wmÂ¥kÃmkkKóbÃ@U¦@‚mb¯LkšmJ@x„Lmn@lk@ƒa@Xƒ@ƒlXbmJUz™V@bVJ@n@x„blJXzšxV@Va„KVUXLlmVV@In@Vx„UlW°@nLVK@zXVVal@@V„w„bVKšL@bnx@„WbUJ@VnXVlVxl@nnnV@„lV@L„‚"],encodeOffsets:[[124842,38312]]}},{type:"Feature",id:"3711",properties:{name:"日照市",cp:[119.2786,35.5023],childNum:3},geometry:{type:"Polygon",coordinates:["@@UaVUUKVk„JVaVIÄŒb@ÂVam@ka@Ul@„Uô„VK@UnKVLnKlÂkWVa@¯l@VbÈlV_V@XWW_@anKVwUmVw@Â@Uny„UVblKVLX@„aô¯ó¥mÛĊÿÈ¥š™Þ¹lÂUīƒÂ¯Kĉ¼ʟbÇV™U™ŽUŽ™XmakJUnmV@bUnmJ@XnJVLn¤UzmJUn@`¯ImÂŽU@™nƒKVkkm™KWb—b@xƒk™@mL@KƒUUVUKkbWaƒXkK@bkJWbnbl@UL@l„Lš@lxÂx@b‚nUVlV@¦²°@bVx@Jƒ@¯XUJ@bUnlxVŽ„X@‚VV@b„L@nô`@bkbVVÞL˜xnU"],encodeOffsets:[[121883,36895]]}},{type:"Feature",id:"3703",properties:{name:"æ·„åšå¸‚",cp:[118.0371,36.6064],childNum:4},geometry:{type:"Polygon",coordinates:["@@nƒlKV@nVn@@kVU‚@²VVaUƒ@wmKXU@UƒUWwUW¯aU_ƒJUV™—VK@U™JU™@kUƒw@UlÂnWU_@›lI@U@wUml@@mVwX_„KWUXKVa@UVUUwšJlaXÂWUnƒ@mla„n„UVWkIVÂ¥V@VVVI@a@akakLWKna@aVwk@WUƒbUlk@™k@U¯UWWU@mUUVUXkVmVVV@nkVƒLƒVÃ…wƒ¯k@WVXb›aUl@bV@@b@xkVVXVxkJ@nk@@ÂŽVLUlVb‚VXUVVUzV‚™LVbUbV„ÂVWVkLmškJ@n±@UxU„VVkV@bƒx@Ã’UX@xVVV@°J„„X„lK@bULUblÆÞV@b‚LXxmV¦ƒV@xƒXVÂŽÄŸ@±LÃ…`™IUlVbƒnšbXšllVnnlVLÈw˜K²ŽšIlanVVVlL„wXÂlK„VlUXƒma@knwƒWlkšVnU@mVIUÂl²aVJ‚zXJlI"],encodeOffsets:[[121129,37891]]}},{type:"Feature",id:"3704",properties:{name:"枣庄市",cp:[117.323,34.8926],childNum:2},geometry:{type:"Polygon",coordinates:["@@‚yUU„U„kl@@aVmšLXw°»°w@y„L@UUaWÂXKƒƒVknwVKlmš_UmmUXK@ašw@k@mUÂWmUL@ƒ@™@£@KƒbÃV@akw™aULmƒƒbUK™LUU@lm@—°mL@nUJVxVXU`mIUxU@UnU@@lW@@bkLW@UVkKÇ°kLlŽƒbÂnUÜÇUUVÇ@@Xkl@XV`UbmbUbU@WxU@¯¦m°nL„aVblVXal@XKlLVVȄ‚L„KôlnbšI@„V@VJ„I@lVVÞaVkXU"],encodeOffsets:[[120241,36119]]}},{type:"Feature",id:"3712",properties:{name:"莱芜市",cp:[117.6526,36.2714],childNum:1},geometry:{type:"Polygon",coordinates:["@@lmnLVlÈVln@VnIšVlx„Vla²_šJlUUUVƒVw²@@mlIn™lKXU‚UUƒVaUašKUÂVyUUWVÂUUaVkUK@Âl@@mlIUwUWlU@w@aU@@LU@Ubm@¯a@V™@UKWUUKUn@LUbUKmlm@UIkJƒnUKUVmIƒb@bÂ@mWm@Un@VVnnVƒl@„¯@@nVb@`U@Un@Ž™¦@V@VU„VnV@"],encodeOffsets:[[120173,37334]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/shan_xi_1_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"6108",properties:{name:"榆林市",cp:[109.8743,38.205],childNum:12},geometry:{type:"Polygon",coordinates:["@@™ýVƒnIW»ƒW@»kUÇL—ÃU¯¥ÇIUWWїUWwX¯mƒ@»nÂ@ÂÃœÂÈķô™@a±kȱƒw„ÑmwÂçċmUȮkkÂVyÂIm™ĉÿ@ƒÃ¹ƒWnwÇVš™Åaƒzmmĉ¦ó™kVmx™xU¼VškVm_UlVlk„°IV‚kÂmJÂa›¦k™™LmmÂV@XmKnšlUÂô›VXbƒbƒ@UaÇLğܙ™ÅwģmKnmÄ‹wÃ…@UkƒbmaÂVƒƒƒn@m¯aU™Jm_k˜@kWÂXyl@@kÃ…amw™LU™Þ™ƒ™mWÃ…zUKƒš™Uk±@™b@nnK‚bX¤mzVšÂÂŽVxÇn„‚¯„@Ã’knWƒƒVUbkÂÄ·ÂÈÑWkk@Va™Â™U@„mUkbƒÃÃ…@Ã¥ÇbkĬ™XV`kLÇÂVmÂalUUa™nV±nwmkƒJ@Inƒ°KVw¯UnÃ…@¥™ƒ™U±bÂUU˜±œÂmWbÛKWnÂUm`UÆ’VK@bmnÂœm‚Èż@V„L@xƒxmš„Ť°ÂnÂŽ@VmK™Â²VlšlKk„ô@㐆V@VXLlmš¦UššV°ÂȘ¯²ÿ@¥š@ÆÂĊ˜²IšmĶnnb°b„KVƒĸLl„Þ@UȮšÂ™Ü°IVƒÞÃÞÂlÂŽÂœx@ÂŽÄ·Ä€WŽ„ÂUx㏮Â@š°ŽXnšlĊĖ°m„nƒšV„²V°ÒƦ„aބ„˜@zll@bÞĀšlš¼nKĊ¼óȂb²±šIǪÒ¯ĖÂV@„lxnVlk„JlaXwŌĉ„„@VnŽšÂšlÆĕ„UÆLœèŌŤôxȚlUÂœ@šxlaUÂÄ‹Ä•Xm„IWmnkšVVƒ„VW_@aÈWUUmk@ƒ¯çVm»™Â±W¯ÂnÂ¥V™mkXw±ÇVwƒ"],encodeOffsets:[[113592,39645]]}},{type:"Feature",id:"6106",properties:{name:"延安市",cp:[109.1052,36.4252],childNum:13},geometry:{type:"Polygon",coordinates:["@@@kkÇmIšmUwVkUƒƒU²WmšVkm@Âm`mIĢĕUƒVa@™mÂXƒƒÿVÂVÂkyUýšĕ@Âl_UmnƒW„KVkţ™™¥™aƒwÄŸ@™Â@a􃄃Wa„kUmƒa¯¯™a±£kx™mmxUwÃ@ÂxmU™b¯K™wó„Ã@kmm¹Ub@lklVbmnnVUV@x›UknƧJUX@ŽƒLÇWkw™LķƧÅwWJk„ƒLkþĉxWz™JUnǚkš@Æk¼ÜÔÈKšè@°lșÆk¦l„n@l¼@l¯L™°UU™VÇ°ƒ¹—`m¼mXk‚™bUaƒV@U¯x@¦™Ç™„UUmlmUÂVm„nnmlkw™@@šƒ¦Å‚ÇLmx¯Iklš„@¦mÆ°VUx¯Lm„@J„InlmxU²šmVbkV‚bUnȎlKU_šWlīÈaÞ¦Æ@„ÞlanV@ƒšVšÂUbl@XlÇÒĸÂlÂŽVa„UX„lm@Ñ°ƒƒÂÈmUw‚ÂU™nyW£ÂamL@mša²@lšV„™VLÆynX„šÃšVššKnxÆb@lk@WzXÂŽ@ll—n`šIV‚°b@n„m„„‚Unb„aVlÆ@ÄŒxmnnL„¤ÆxššĠÛÈKVb„@„aWaÂœU‚ókVm™nL@W‚UnnšKlšœ¥‚bnIlÂU¯JlƒUkVkn`lUU™V»šwnwlUôšĊ¥nn„yÆb"],encodeOffsets:[[113074,37862]]}},{type:"Feature",id:"6107",properties:{name:"汉中市",cp:[106.886,33.0139],childNum:11},geometry:{type:"Polygon",coordinates:["@@lKnb@n„lWb°bkxĸwVb@ł„nlŽ„ƒĊ¥šL@ÂXÂŽl™ÈƒVblÂÈK‚b„akÂVwôml²`‚nÂœ@‚nVKÂœl˜k²xŎƒ°¦VU„JÄŠw@çnÂWçރVkUÂóÛ@Â¥kwš™šUmƒX¯WšÑkƒ@ÂUymIUwlUn¥‚mUk²a°¯V»@™ÃVș„ÃÄ‹Ã…Ã…Vl»Â@lÂ@a°±@_kammÃ…b™a@ƒƒm@ż™KknõĠ—@mšƒ„¯LÃ…w›‚—LVxmb@¼kV™@mw¯wVakKW»ÂX±¼¯Vkxƒb„¼WÂŽ@nÂx@x±bóakbƒ@ÃmU™@ķÓÛL™kƒVUm™k¯¤ÃLUlÃ@Ãz™š„x@x™°™™™bƒmƒX¯aUJW¯—k@bÇWƒwÛwWxƒ@XÂWlÂb@Žƒ„VŽÈUlwšLnl°VlUô¦œU°¤VšUxVXUxlbkVVlƒI„°„ÅVlU°m@k„ÇU¯xUlƒLUlVL@b™°ĠInĠ°ÈnK‚„@xÞa²n‚aUyšXUKVkšWô¼Èa‚z°JXUVÇV_„JVƒšz@ÂŽnb"],encodeOffsets:[[109137,34392]]}},{type:"Feature",id:"6109",properties:{name:"安康市",cp:[109.1162,32.7722],childNum:10},geometry:{type:"Polygon",coordinates:["@@„bÄŠaƨèšwôÂô„¼šb°ašXVƒÞVUÂÞ@‚aXƒmÂ¥kImx¯¯ƒV@anU@UÇéğL@ƒ¯¥V£mƒ@ÃÈb„K‚™„X°wČÿ˜ƒ„b@xÈblxȯĊ„„mÆUVƒ„nÈ@ƨÂÃœLĢ¥ƒŹnƒ°Vnn˜K„aô_ȃšwU‚aXÂmÂnW‚¯Âkl›LXƒÇ™Å¦ÃaÃ…VmbÄŸUn¥±wÅéVƒan¥ƒÂ„U„»°am¥„£ƒÃ@ƒ„wVw™¥nU„уUmmVwÂmÄ·IÃ…aóVWxkblb@ból@œğÒĉ¤ċXƒ˜¯X™xk„Ç@óÆÅx@š™xÄ·_kmÃŽÇ£kblb@`¯²@bk‚‚@k¼ÆUČƃÞǚÞU@šU¼¯°±bVlÂnm¦kVVxnJVz@‚l„™ÒXÂW°n„™V™šlx@¦ôÜVÂUlÄXèmÂ@è"],encodeOffsets:[[110644,34521]]}},{type:"Feature",id:"6110",properties:{name:"商洛市",cp:[109.8083,33.761],childNum:7},geometry:{type:"Polygon",coordinates:["@@²nl‚ôbš„°aVwnKÞIš`°wšXôw°VĊ°@ŽÅš„ÞÆV„zÞK@xšŽ@a‚LŚ@b@ÂŽnLlƒ@šln„mnLVw„a„bVƒ‚VnbU¼„Vƒ°„bl„šbÈ@ĶÂŦb˜@nÇ@amIÂyUI@ÂÄ ÂVmôƒU™ƒVwkwlanJ„¯lwó¥@an°Jš_„‚@š™nóƒó@£lÂ¥UwmašÑ@ƒÂUm±V_ƒJ—£›J—UW¥¯@ƒ_k¯¼mUƒVUè¯b@wmL™»ğVmaÄŸI¯¤ċIUW™XƒKĵ¦ķaƒJUb™IƒlUÂóVmk@WÅÅÇ@ƒmU„ÅVƒnĉƒÇ°kwÇa@wƒa—„ċĀ¯xƒWšƒLÇa@Þn„U¤°¦@„ĠKÈê@VmV@b„U°°nwlJn¦W„ÂbÃ@VÂŽ"],encodeOffsets:[[111454,34628]]}},{type:"Feature",id:"6103",properties:{name:"å®é¸¡å¸‚",cp:[107.1826,34.3433],childNum:10},geometry:{type:"Polygon",coordinates:["@@@ƒ„£@›°Išb@¯°ynŹƒaUƒlƒU£„Umšĵĉ@@ylUÞ@@£kWU¯WaU£¯ÇV¥ƒ@kb¯wƒn™¥ÇkUÇnUƒÂ@¯±›kULÂm›@Âm±_kŽónUxlŽƒbÂaÇLkÂŽUaDŽkšWÂ@™Kĉ¦ƒ„kƒm@ÅUaÄ·xlw¯aXaƒk@mmakL@šmšÛŽ@¼m„@l„XV`ƒn™KUš°°@²š¤UÂÈ@VxmôƒxÂKl„VV²aVw„Xla„Vlx@ÂUVnŽÇnk°ƒVVL™lkI™šƒJÇk¯V@šknƘn@lznmlVkzVŽ„VVxš@Ux„z@x±¼VxÂxU„l‚kb˜@„¼Čk˜VXlÄ kôV²w‚LUKlwÂœJ@a‚IV¥Þƒn¯Ün„‚„@nk˜l²kÆ@š°„aVbnI@™š‚Ťn"],encodeOffsets:[[110408,35815]]}},{type:"Feature",id:"6105",properties:{name:"渭å—市",cp:[109.7864,35.0299],childNum:11},geometry:{type:"Polygon",coordinates:["@@@ÈôL„xUŽ°„Þ@mŽÈnl¤nUôL‚wX`@ÞÃL™ŽUšmLô„„ŽôbVbnºlnÞ@ôƒšx°LšanV‚wÞ@Vxnwšnlw²¤šb°°„bVnƒlXbƒ„ó„@bš‚Ġ@„xšbš¦ŤšV™Xġ„£W¥ƽɽƒó@ýóÆû„£X™mƅšÂÄŠkUƒ„@™™šó„kÅ¥aĵŽÇ@™akƒƒa„¯ƒUV»maÂUU„ƒaƒbUxmKƒnkm@™k„mK@ƒxó@¯n¯KǦ@ôÅèlxkx°nƒƾ¯KU¯WÄ·L@VÃIUb™yWbX¼Ç°"],encodeOffsets:[[111589,35657]]}},{type:"Feature",id:"6104",properties:{name:"咸阳市",cp:[108.4131,34.8706],childNum:14},geometry:{type:"Polygon",coordinates:["@@šIXyÄŠwlý„KlƒXIVaķƒ™»Âa›£„¯aVU@a™‚wÈÅ‚ašL²»‚VÂœUln°WȯW»XašzVaÞJ@Uƒ»@¯ÃbÄŸwly@£kÑţ±Wу@ka™IUƒƒnƒ@¯ƒómÅ£U™b™U¯lÇIÃb@¤Ã@kV@zÄŠ@™ĶnƒVV¤k„V„„bmź¯z@°™a¯J@œƒ¤@„„bUx™bƒ„@`™xUﱼVXÂœW‚„UnUJ‚LĢ¯ÈKlblmÈXŎ°šU„°LšŽlkÞKš@Èxl_°ĶUÃ’kblš"],encodeOffsets:[[111229,36394]]}},{type:"Feature",id:"6101",properties:{name:"西安市",cp:[109.1162,34.2004],childNum:5},geometry:{type:"Polygon",coordinates:["@@°²@‚„ÂmVVÈÈlš¦„m°xla„@U¦°ÈV¤XbV°lXÞaÈJ°kšVšaŤVôn°„„@„mV„šJlb„@XÒŤ²lÃ’@¤kzÄ xÞa@°„¼ĸK°XV‚°L„ƽ¯mlwkwÆç@óÈ¥°L°mô@„w@aƙÂK@b™Â@wÃLƒyÃ…UƒÃƙ@Âĉ¯¯Uóx™W¯x™_ÃJmLUx¯b™ƒóak±mÃUU„™W¯b™aƒ»óÂó™xƧçĉbƒaĉxƒIUV¯¥Å„±w—l"],encodeOffsets:[[110206,34532]]}},{type:"Feature",id:"6102",properties:{name:"é“œå·å¸‚",cp:[109.0393,35.1947],childNum:2},geometry:{type:"Polygon",coordinates:["@@ÆxĸƨšKlxÈX„K@ÂVWƨIlmÂœV@wVUmUnmUalk@kVaUaóaƒÂóƒnKV™šÂÞK@ÃW_ÂxóKmVk£ÇmnÂÃ@¯ƒVƒwóK@ǯXkm›VÂU±¼™KÂbÇŎÂx‚š@bUV°bƒÂœ¤‚bš¼ĸ„Ub"],encodeOffsets:[[111477,36192]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/shan_xi_2_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"1409",properties:{name:"忻州市",cp:[112.4561,38.8971],childNum:14},geometry:{type:"Polygon",coordinates:["@@Vx@lnbn¦WlnnUšmš°š²VšÂV‚VVVnUn„ºlz@l„„@Jƒ@kXWVXl@Lƒa@„ƒKUL„ŽlbnKlLnK‚LnKÆXn°šbVV@bUVl°Un@LnaVJUbW@UX²l‚@ÄŒwlVVIšWnkÆa°„„anV‚Kn°™UW¯@™aVUVk@Un@„aV@ValwUanmWU„k@WVUUanaVwnLVl°@nk@mVU@UVK@w„LVKVU@ƒ„K@UUKVUV@@bnL„a‚V„aôšlIXmlKX_°KVV@bVV„@šzV`kblI„V„Ul‚šL@bnV@V„ÂÄŠll„„VlIXW@k„a‚U²blKšVnIlJ„albXXlWVn°JnšnL@l@XlJlaX@„X˜W²@l_VmnKšU„blU@mnkVK„¯@U@ƒma@kXÂ¥VƒmakkƒLƒÂÂa@aƒ@WIUUVÂXÂWWnk@a°a@kkm@kUUmJmÂ@WUUUIk`m@V—kaWWkX™KmƒXk¯ƒ@ÂWKƒLkak@±bƒwÂ@ƒaƒa@akaƒ@ma¯@ƒL—KÇÅkKWbkmġ™±ÅUƒLUK™VVkƒm¯LUVVbƒ„UwUW¯bm„ƒUÂLƒxWJ—@ƒklmkUm@@KnwVkVK@akwƒ@@a¯bƒKkn›VUI™b¯mmbk@UbmKUL@xUUƒ@klmLUÂŽlVXI‚VVVUVUÂœU`mLXVWbXnW`Ų°xmÂŽÂxU@mÂĉƒƒwU@mbU@UƒmbkVW¦kJ™@ƒX@`¯Im@UlUVVnÂb@bWJXnmbƒJUU™UUaƒ@UamIkaƒxƒ@@x@b"],
-encodeOffsets:[[113614,39657]]}},{type:"Feature",id:"1411",properties:{name:"å•æ¢å¸‚",cp:[111.3574,37.7325],childNum:13},geometry:{type:"Polygon",coordinates:["@@@a@w„@„wlbnJVb„@VbšVVV„InaWmXI@a‚aUmVUVkn@°J@_„Wš@lIXÂ¥lUnaV„V@naV@„xĊ„n‚V@‚wn¯wƱX_WmXaWUnKV_V›VUUUÂUWJkUVÂnKlk¯Â™@@kmKUaűKkU@WmI@WUIlUUmVwXƒ‚w@ƒÂUlUVwÂœV‚@„Lnb‚W@anU@UšaVkô@l»n@na˜JnUÈLVaƃUUVm„ÂVKVƒ²L@mU_lK@UVWkU‚a@a@U¯aUaƒÑóÑUb™„ƒKk@@aƒk¯mVaUwVÂĄkWUÂmK@UUKmXUWÃwUa™LUU@aWJUUU@UaÄU@WL@VÂKVaVI@WnU@alIVKƒƒ@kIƒÂmIkJ@™m@ĪÂ@@_™K@xƒ@kaW@U„@Vmn@ÂŽUKÂ@mIƒJUXV¤XXWlkKƒkkK@XmJVakImJU@ó™¯LWKUV@nUVƒLkxmKkLma@kXKmmƒLƒaÂb™LmK@VÂ@mXVÆUxƒX@`nL„aV@@VmLUVnLlLš˜„b@„šŽ°²nx@b‚VUxlb@V¯bUV@zV‚XVÄŠXVx@lVn@VnnmÂŽUš@LlJXVƒz¯VWVXbšV@bmn™VUVk„Çþń@XVxmbUlV„Uln„W„@„Xl‚@VLXÃ’@bÞJ°¦„L˜ò„@nU‚b@°„X@ÂŽXbmVU„V„nb@x‚x"],encodeOffsets:[[113614,39657]]}},{type:"Feature",id:"1410",properties:{name:"临汾市",cp:[111.4783,36.1615],childNum:17},geometry:{type:"Polygon",coordinates:["@@nW‚@@UnLšK‚a„b„KnnWL@lnblKnLlw„KVU@mVUXL°KôšV@nIlJUbnI@WlL„llLXkWWU£VW„InJ‚@VL@Ânm@UVƒX@lb„@@wšL@`‚@„šn@V@lw„@n„VmVX„WmwnUlƒœa@_lK„wVlUn°xVKVXXWlUšVVI@K@K„n°KÂœwlVlU@kna@ÂV_„Wn‚m„UVm@kXml_@m„LlKXw°m@_ôJVUV@X™l@UaV@Va°I„lk»VwUkVÂmwÂUmmVÂn@V¯@KƒU—wmK@U¯wUVÃ@mJƒU—nWK™@@UnKVa„_lykUmKÛnm@™x@ƒUUlwVk™ƒXW@ƒa@Uƒ@@K@ƒkIV™nammVakUlƒ@wX@@kƒ™¯@ƒVVbml@„„°UbULmlVbnbÃ…K±ÂÂVƒKVXUJWaÂ@ULWaUÂU@@U@aWK@UkxUKƒLUUUJ±UkL@V±kk@kam@UV@l@LWl@Ân@VVUx„LlUUx@VUV™U@aƒIUl™L@°mLU‚ƒbkUUaWUUaUU@aWK—LWJ@bUL@VUVVbU@mÂ@a@ÂÂkmKmnĉlUK™XƒWUblb—xmIkƒƒU@xWb@lkšVx™LXÂŽmzVV@bklVVUzm˜@bk„@ÂVx@xlÂŽU„@lUbVÂnl@„Wxnl@n@ÂŽUbV„mL‚mƒb@`X@lUX@@xlnkLWaUJnnWV™Vn@l„@bULVV@l™V@XnJVX"],encodeOffsets:[[113063,37784]]}},{type:"Feature",id:"1407",properties:{name:"晋中市",cp:[112.7747,37.37],childNum:11},geometry:{type:"Polygon",coordinates:["@@@šlInJ„ÂlJ„@‚„ULkJ@bmV@XUJUb‚L@UXKV@ރVbV@VVXI@bVVšKVbÞxVXnWVL@VnLV‚lX„ÒUÂŽVxUb°n„l@bl@„LšƒVaô҄ÒVb°b@VnLnnV@lmn@lb„U„V@„‚JÂœUVV‚Xkl@lUzmJ@xšXkl‚bUn„JVšUb„nU‚lb„V@nlLX@lakšV`Ub°š@XVJnU‚L²KlxnI@KV@lbUbVV„KnVl@„zlm@Uš@nŽšI@WUaVÂl@@mVU„@XkWÂ@ƒnkVKVƒ„_Vw„y@knwVa‚@XalU„@šVnml@„X@V„L‚KVaÞbnnlJšI„mVKn„VVVInVlU„@„m@™mÂXK@UmyUI@mWUUakamw@wUwmLkakwVƒmK™w@wUam£Ây@am_ƒW@™UU@knmm„amU@WUa@knw@ƒUUUUV@nƒJmÂ@mVUkKVUUUkKmwƒKULƒKUImV@lUn™nÂÂŽm@mbUK@°™bUnmbUmkkƒWUb@am@UXkK@a±@™V™@ĉř„V‚UXVxUVkLWl¯@@bULUlm@@nm`—XƒlWakIkm›VUbUL@Vm@kIƒ@@Kšm@—VaX‚I@W@aU@kUƒVU_™KƒbƒJkkǎ™b@nkKmL™wÃ…W@kVUUƒVU@WUIƒJmIXmma@_kyVaUUlkUm@ƒkU›x¯Lƒm@L@LUJ™UkVWXUWUL¯wVmUkƒxkL@`›bk„mVnxƒXUWUnmƒƒ@kxU@"],encodeOffsets:[[114087,37682]]}},{type:"Feature",id:"1408",properties:{name:"è¿åŸŽå¸‚",cp:[111.1487,35.2002],childNum:13},geometry:{type:"Polygon",coordinates:["@@„Vl„nJ˜wkaVa„XšWVLÄŠknmnL‚l@Â@bn‚V@UaVU@UVK@aXI˜KXL@bVVVbXVVblV„aVÂnK@¯šKVk„J@bšVVU@UVwkVƒKVwUUm@@ÂXk@K@kVUn@lbl@²l@UlK²VVIVV„KVLlw@VXL@b@VV@VÂŽXbVK‚@XbVIUW„L‚U²ÂÆLmaUankVKVaƒ¯@ƒnkUa„U°@„š‚Ân@@kWa„UVaXUWÂ@IXKVw@U™ƒ„™WU@W@Â@UUƒU@mnÂ@ƒ`m@UUULkUmJ™IUƒ@@UƒK@UÂ@›anĪak_@wmKUwmakV™kmK™V™k¯b™wƒ`kwUIÇx¯»ÇaŃmnÂ@@™mƒmUkV@wkKW@kxmL™UkÂĉLÃk™xÃw¯lóVU„mV@Ä€VVX¦W¤kz@`Vx°„²ĸ‚š@„Ul@x„êĸNJ°¤V„VlXLWnXxmV@nUl@„"],encodeOffsets:[[113232,36597]]}},{type:"Feature",id:"1402",properties:{name:"大åŒå¸‚",cp:[113.7854,39.8035],childNum:8},geometry:{type:"Polygon",coordinates:["@@²£šyl@ȘĖ@bĸŽĢbĸ„˜ÂX„a‚KŤnn@ŎôllÈx„nVnÞDŽV@b‚nXllL°KšbVb@J@b—„‚„@ÂŽU„„xlKXLlKlÂXk„Â@Ulk„JlkUƒVKXUĂVIVm@_nǚLšašl‚w„VnU@UUwma@aƒaÃaÂLmUk@@Wƒ@U@@X™wVWÃUUUk@@VmLƒKV»nwUw™aUL@`mzƒJUIVƒUaUw™KUaVIlJôanÑlLVUn@ša„@VV„@@UUwVK°Vn_lJÆLώW@UUUÃ…@»lm@aÞIVwXW˜UUkkm@U@aƒU@ÂmwU£VWU_kWmƒXwW_°yUkkK@UÇK@kkUVymÂóK—U@KWIƒbUak@mJ@bkbmLkŽ™UmƒkVU„W¦@lnb@„@Vƒ°ULml@nkVƒa™VmLUnk`±@—XƒWW@kbǦXŽ¯„WxÂI@xmbmxXlWV„„@bÃ…ÂŽUz@J‚b@bÞb™ŽU@Wbk@ƒxk@WX¯VۙƒWÃbÃUkVUU@alI@a@akLWa™m@U¯UUmÇL@K@aU@¯VUkƒKmX@`@ÂœkJ@nV‚Ub@ÂlbVÆXVW„ULU`VbkLUV@XWl@bXJ˜@ÂÂVbV@Vl"],encodeOffsets:[[115335,41209]]}},{type:"Feature",id:"1404",properties:{name:"长治市",cp:[112.8625,36.4746],childNum:12},geometry:{type:"Polygon",coordinates:["@@Uk™Lky@I‚JVaÂÂ@mÞaWšy@_ÂW@_WƒXVlUVwš@nw°K@m„ÂUƒVaƒmVÂkU@mmmnLVUmKXa™U@IlKVUnK@UmWkX@WV_Vƒ@akU@a„KWIXyƒIUVmUn™Ua@ÂWaXUVKVmkUWVkUƒLU@@VƒbƒKÂbƒIUmƒ@mbVL—x›WUUkn±V¯wƒbÃ…JUbmLkbmKÃ…KƒbVnUbƒV™KUb™KUbmLÂKmƒb™aƒKkUm@UÂŽnn‚VnxUÂVlUxl¼ƒk¯JUbU@Vbk@WšU@UVóI@`¯nWxkLƒK@nk`Wn@lUnƒVÂnm‚ƒXU`@Âmb@lkV@„VnklVVUblz@`nbWnnJ„IVJ@XUVV„UV@lÆXšxnKlL@mšaÈÂll„I„ašLV`„UlVV@@b@XÂJWÂUb@˜™n@L„@lJn@@UVKVaÂœUlnlJXb„k˜Wn_@mn@VkVK@a°@XklKVUUwVWUšƒĊƚ@šU²@@blLVWn@@bVa„XllVnnaVmša@¯VLnan@‚šmVm@knUVJ"],encodeOffsets:[[116269,37637]]}},{type:"Feature",id:"1406",properties:{name:"朔州市",cp:[113.0713,39.6991],childNum:5},geometry:{type:"Polygon",coordinates:["@@XXWVXVWnnlnn@èƼ@„„xlš„ŽV„nblšššVŽÈÂUVl‚š@„blnÂœL܃ĊmUkU@Ua‚—@WI@aXk@WVUlKUaV_VKXƒWUUÃ…ka@ÂVaUÂ@mlI@›@_nW„LVl°UV@@b@LÈKVn°V@VšnXblK@b@bkJ@bVVlUÞVÞa„Xܚ°UXWl@„wl@XaV@šÂÃa@aÂa@IVyÆÂ@aƒƒXUWknwna@w‚JXw°ƒWÂÈ¥kI@W@kmKm™¯IUmkXWWkaƒbkImJ™UkL±aÂVƒb@lWXkJƒUkƒĉkƒÂ@UmU@a™KkƒVƒUkJlaU_™yƒ@UU@aUU¯LW`kLWnkJó™ƒbÂUƒbmK@aU@UVVL@VƒL@„UVULƒK@xUL@VUV@nml¯@UkmKUxmbVbUV@XƒlXVmnVbkxUbU@ƒbm@@VUlUVšb°@VX¯šm‚"],encodeOffsets:[[114615,40562]]}},{type:"Feature",id:"1405",properties:{name:"晋城市",cp:[112.7856,35.6342],childNum:6},geometry:{type:"Polygon",coordinates:["@@lV„Lšb„an‚LnKVašLVašL„UVaUm„aÆLnLlanKVaÆI„a°x²UlmVVÂœX˜wUKna„@Vn„J‚a„L„a@UV@@alUkKVKnkmmVwUk„w@Ī@kxWUXƒW@@mƒk@aUa@a¯aƒLkKmwkUm@kL@K@aWIXmƒVƒXƒWkUVakL@UVKƒw@aUK@UUKmLU@¯n™KUwVƒUIWJÂUWmka™@UXƒJƒk@UkmW@kLWKÂVƒx@bmI@VUaVU@a¯@UUmVÂKmXÂ@±`ÂkÃKVxUL±akL@V™bƒLkKmVƒ@XÂWVUbƒVXb@lm@ÂÂ@lW@@xk„lVUbnnmbUšlJ@„@L„@@V„b@‚WXš„UlkxVV@„šwn@ÃœmnLlVkzƒ`UbmL@Vš@XL˜m„VnIÞ@VU°x@VnL˜x„V@LU°"],encodeOffsets:[[115223,36895]]}},{type:"Feature",id:"1401",properties:{name:"太原市",cp:[112.3352,37.9413],childNum:5},geometry:{type:"Polygon",coordinates:["@@„@VV@wVKnLVal@na°nšaVJÂœUlm„L°a@b„@lx@bULUlmx@Ln@lVkn„l˜@XI„w‚K„Vnƒ°aVXVx„ƒUaVU°K„nUlšUVL„KÆVš²Ģ‚lnXalLÈƘL„KUaVkUanmWU™aÂ@WwkUWU¯y¯Ñ@anIl@@aVU„m„I„ymUƒLUUVakaU@@LmJkw±LÂKmVUI@W¯™VaU_l™kbW@kK@mƒUkaVƒmVaU™ƒIVmÂalk™W@wnIVy@klkÂWUU›VÂI@ƒƒUƒVkam@knU@mmmK@bÂblVUX@VkLV`@n±KU„ULƒ‚UnVVńUbÇKmV—Imbm@k¼ó@Ul™b@VmV@bÂXmaƒKÂ@›UUxkV‚V@„ÂxW„UxVnkVVJ@XnJ@XlV²LƂVbnL@lš@°Â"],encodeOffsets:[[114503,39134]]}},{type:"Feature",id:"1403",properties:{name:"阳泉市",cp:[113.4778,38.0951],childNum:3},geometry:{type:"Polygon",coordinates:["@@°@nb„@lb@b„b„b‚@„x²al@lb„KXU@m‚kUWkkmUUƒVwV@XUWÂ@™naVklKXblKnL‚ƒnLVanImaXKlL„ašV@U@KUKW„alƒXK@£WKXUV@VU„ƒUUVW„_V™@W@Â@K„@šƒUƒƒIWmXUmƒULƒn™JkImmÃaUbÂLƒK@UƒWk@mn™Uƒ@kVWbÂ@Ubmx@lƒzUxƒ`U„ULml@„XÂWlƒ@UV@nk@U‚Vb@X™Jm™@@Vknƒyk@ƒzƒJƒnUV@bk@mJ@b°Ò°zXVlVXx‚@šbXVmnVbUlVb"],encodeOffsets:[[115864,39336]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/si_chuan_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"5133",properties:{name:"甘孜è—æ—自治州",cp:[99.9207,31.0803],childNum:18},geometry:{type:"Polygon",coordinates:["@@ƒaXamƒ¯wmÂ@±°wUwV@UaVw²Kš™„U@UƒU„¥‚a„ƒ@£Þ™ôx‚Knkm™X¥™IUƒÃÂUwlk°V„Â@ƒÈ™‚KUwlkUyV¹„mšx²Xll„ÑW»šÂ„l„w°UŎ„nƒ„„˜Jœƒl¯°V@wôIVÇn™nUllšLšÂVǚLô¼XÂW£@±„Â@Â¥k_ÇJƒkUéƒkšƒƒwXa@ƒšLlw²™Vx„b‚mš¼ÈxlLȃ„VWÞn¯mǙÑUÃlÛkwlÂÂĉmƒULmwUJ™ç@wkm@ÑlUX™ƒÑôġƒÂVa™ƒUф¯@wķÓkbV„mnU@@y¯IÄ·KƒV@¹šaĎ@k„mÞU°¥@a¯Â@anKlblU„¥@óğç@ÂÇw@wkÂla„çñk¯±@ÄŸÃUÛmïwƒ@kb±Â¯akXWÃœkXUÆÇUš¤X_Æw„V@¤ƒXU‚ƒbÂUƒŽƒIUlÇUkÂŽÄ¡@™aXÄŒmlUÂlèUV@„mVk¦Vxš@¦±š¯ƒƒ¯¯anlWš¯nƒƒÅw@w°KVak£m@klƒKknÇU™»óKšīlaUaV£Â@™™¯@ƙU™VƒÛÃÇXÂĂl—ÓlŹ„»WUÄŸJ¯£mx™Lĵô›ºX„VlUll²bl„„lŽƒxónn°ÃšU¼mJUš¯nƒƒƒV@êĉ°Uĸ™w™@mƒ@¯kmÂXamѯaUwÃKU¥„ÂmÃ…nÂ¥Wmn™ƒ¹n±ƑƆÇôXê±NJnšƒ‚UôlÄ–kÈ‚VÒ¯¼VnƒȮ¯ĀnƆ˜Ģ@ÂŽk°V°¯ĢVlkšVxm¼X²™Ŏ@ÂŽVxknWÜ°ÂU‚¯n™ÆÃÂœ@`„ôòÂ҃‚Çzn‚mX@x„è°K°Å„UČĬóĖă˜ó¼ÅêƒÒƒbmšk@V„ÂŽ˜„@Ã’Âl@nĉܛê—x@Ä–mlśJ¯¦óxȭ°ÃÂmŽ¯Lĵè›Ā@Æ„l°żÂƒ‚šX@xmÂŽkV@z@‚„°blÂŽnÞ°J@bn@ƼUVƒUóŽóLƒ°X°ÃLƒxUn„°ƒĬƒn@lnL@ŽÆ@šn„KÆxnUnV˜InĬmÆnxŎ¼ĊIĢóÞ@ĊƒƨbUƒ‚mVÂÂÂ¥lÂkƒ‚wnL„mšÅÆ¥Xƒ˜wÂU@w‚wUÂޙ@alUUŚÂU™Vkkm°aU—°Ó°w°U„ƒ„b°ašÂ²K˜¯œĕ˜@ÈbÞÂÄŠaš»„XVm°In„‚Ĭk¼Vb„ašJšôš£VÂÄŠan™‚k„ů™™nĆU@anKnĮ‚bÈmƎš»nI‚霣Ġ™"],encodeOffsets:[[103073,33295]]}},{type:"Feature",id:"5132",properties:{name:"阿åè—æ—羌æ—自治州",cp:[102.4805,32.4536],childNum:13},geometry:{type:"Polygon",coordinates:["@@l@@þ²I@lƒ„VL°wnJ°Uĸ™Ŏè„Ilw„V°¤nĮ™¤Ã„lè„L@„ƒ„@x„l™è²ôĊ_ÄŠÄ¡VÈôJżīlbXšÆÈVÂŽkxÇVƒ„n°„¦Üb@è@nn@@°šUÈ¥WDŽ_Uala¯¯UǙkƒ»„mVwk»˜k²°VxlL@¤œ_@x‚`È‚Ėöb˜š@l²alX„a@bnK°¦VK@nnWmx@nUnl@@lƒlĉÂk°l°UXkmW@Unš`k„ÇL„ŽW„ÛÈVxšVVlVk@l„IXb@ylXÈW˜Į„WŤzÂœy@šmIƒŽ²ÂšJ‚š@nŽ°@V„„J°a„Å@ƒŎkVǚk™aUw„KVw™™Vƒ„@nkm™@±ôkô™ĊJš¼šInÑm±nIššÞ‚XȃĊxÄŠUÈbÃœyÈ£VÂkw@kVUV™„m@ša„»ÜbÈmƒUXwÃxƒUnÂ¥@°ġ™Å‚aÂœJVk™aW¯Û@W¥—UÅĶ™@¯ÂkUƒŃ@ašI@mmanwÞ‚W@ÂϪmw°»UÅ™k¹±W„xVx¯¦U°ƒzÅ£W™w@°ÇVÑk¯@„y°aš£š@šmšnl¼„ašÃÃakwUıaĉImlĵn@ƒm@kkVƒ¯Ñm™ĸ™°x„Âl™œ@˜ƒXVÞmlÛÙĉUÃ…Â¥mwÃ…Â¥VaUw›™XÂÄ¡ÂÂÂÄ‹aVůÛŹlwU¯ÂU™ó±™xÛV±¯¯n¯mċƒÂLmÂnÄŠm‚™@™_kJWaÂXmwUƒĉK™»™@mwXÃUDŽkKÇw™»ÂnƒaUw±škx™K@„Wb„x™„„lVê„lÈIl`@¦ƒŽ@²X¤WÂó»™KUșŽ™KkkmVmšUÈóJ@x¯Uk°›„—Iƒƒm„Ń¯Vƒxƒk™ŽX¼ƒÒkk±W™wƒnUºVzklVxÂLǚ@„ƒŽ¯UklVxÞÂV„šJW¦nšmlÂLówÚ@¤ƒ„Âbƒ¦„V@VƒV™š±LUxVbU@Vx¯x@²n‚°xn„Wb„b"],encodeOffsets:[[103073,33295]]}},{type:"Feature",id:"5134",properties:{name:"凉山å½æ—自治州",cp:[101.9641,27.6746],childNum:17},geometry:{type:"Polygon",coordinates:["@@ĶóšKnw°¤ĠIXVƒ¼kź˜Ôk‚„ÈWŽÞȄÜUÂVšÅš°@šš‚@U¤Vbkb™ĬôLš¼ÈVlm„Llkn@l¤Ub¯L@xÆx„„°mX™mk°b„°°„²™@¥‚™UwlÂ¥nU@ƒVUkçVÂnkWċšbÄ¢@lÂÈVVk„J„‚V„aV„W@£ƒUÆxW`™£ÈVVÃ…lWXÛlW°b²Âla„@°xnÞVÜĠÞ²@l°Þ²ƒèkblÂŽ@xÈx@ÂĠènal£nU‚Dz@‚ÂÞK„nn¤@¼˜°U¼„nV‚šXU‚šbn™ĠUVbUlVš°LX„@lV㏆UnK@_ƒyÂXVyUwmIU»Vƒ„kÇ¥šÿkkV¯m±nÂ@ƒn¯ÜanVVƄz@Ž‚bÂœwÃœb„m@wša@kƒmk»@™a@ÂVUUó„w˜@nb°mš„XÂŽmnVbގVÂôanwšJ‚ak£lw„˜šLšÅnÃ@wlÂ¥ÂIÇӃ@U™™Lƒ¼kVǃÅó¯kVmmw@ƒn_‚Vn»°LÅ»@éÇçŹīVÇÃ@ÃÄŸU™ƒaÂVÙ™š¯ķlÅ­ÂÄ¡lƒ@óÞۂċ@¯nkUӄ—m±™IVÄ¡UwóKUn±¯—K›w»ƒKÃÂV„nl@„óxUwţ›£ĉƒUmŗÇÃK™„ÃUÂlmKģÂUVÂŽ@ÞȎW¦„Ò@Ĭšnny‚@nÃ’mÂœVŽ—¼@°Vbl@VlnUUwl™°a@„œ„@llnk°lbnKWÄ€nÂŽU„VxUŽ‚²Å‚m¦Û›njƒaU„Vbš@¦m`móX™Umm™xÃ…@±Þn虲™U¯»m™ƒV—m@wƒU@wÚÃmÂLƒa@„™VÇUk„l°¯„VlkVƒ¦UšmxƒaULUèVx@„kIUxmWV¼¯VmȯšU„nl›È—@m»Å™ƒVWxÃ…bÃ…ÄŸW@kƒm@kVV¦mlnn@‚Å„l¦ÅƙxkÂœ"],encodeOffsets:[[102466,28756]]}},{type:"Feature",id:"5107",properties:{name:"绵阳市",cp:[104.7327,31.8713],childNum:8},geometry:{type:"Polygon",coordinates:["@@„ńlV°Âš@Åĵ˜VXȮUĊќJ‚w„@È»m»š£°Kšk@ÇnÑÆš@„w°JUwnw@wšbVbš@VlźLUw„aƒ»„aUklyUUVakwWÂXwWƒUxkLƒmnÂ¥mšwk™˜UX™lJ„w@aƒIk°X„¥Wƒ²Âl¥šaU™„IlmkklƒÈL@m°nlWU™ÂaW—š@Vƒ„@UaVÂ¥@ašk@Çk¹ƒK@a™K@kƒKkšÇX@VU@kx±V™èkIWwUVUkkKÇ@ƒa@wkml¯@kUWn£Wa„aVwnaVÃw¯@UaWx—n›JńUxUšma@L@„mbUÂŽÂU±VVnkxUƙ„VÂŽm@kÂkKW°„X@¤ÇUkÆÇnU¦¯ŽkƒmLVwÃ…K@UóbÇÆÂVƒ¦™L@ⱐX¦mVޚkÃœÃnWU—„›@kšƒŽ¯wķšnš°ÒU„lln@@„ĶmnkÄŠJ²bV„lxÞb™Þƒbk»™m™n™@™¤¯bƒz@ÂŽl°UÒ¯È@ŽšxŤX„yV¯°¥Uwƒw²XlºVŚ¯¼nx›š@ÂŽÂXÃÂmxnb@n™J@b"],encodeOffsets:[[106448,33694]]}},{type:"Feature",id:"5117",properties:{name:"达州市",cp:[107.6111,31.333],childNum:7},geometry:{type:"Polygon",coordinates:["@@Uxn°‚bnÂŽlUnÒƃnn@n‚¤„LnxlU„ššV@„Æl„x°XXxl`XœƒVW‚œL˜è—„±nÈbƒŽ°b@š²x°Kܼ°ĉ„V¦lJnU@¦šÞ‚JÞğ„mšLÞ»šxU„lb„VÆann„alŽ„VÆÂX@lnÅŽV„mU™maÃ…Xƒa@aWmÂœ@‚£@wĉJVƒkk‚kkmƒnk@ƒmna@šal„Kš™‚J@ÂÞwÂm‚ÅŃ@ambkUƒƒ@™™KUÂÄ¡KÂU@m‚ak¯±ƒ„a@aĉÑÅaVwšXlwƒ±—ÂVÂ¥l@@a™kƒ›Â@@£šmƒÂĉÃónWV@ÂŽÂnÃÇÇx—UmbƒaVkkÂk@m„Â@m°ƒÃýXm›akÂÅīƒ@@ƒmbÂ@@xmšnbƒ@mxšŽkÂWL@ƒ¯b@WUXmWÂœÂWKkbm@kx™Xmm@LUl„xlêóK™nUš„all™LƒlÂLó°m¯JVšU„K„„@x˜K²Āô¦l°"],encodeOffsets:[[109519,31917]]}},{type:"Feature",id:"5108",properties:{name:"广元市",cp:[105.6885,32.2284],childNum:5},geometry:{type:"Polygon",coordinates:["@@ÆL„ÂÄŠx°»Ŧ¦˜W„™šLȄ@xÞKÜ°ÞnVxÃ…Ä€lÃ’nJ°a@w„ÂV¯l@XÂWknKnw˜VȚ°XXa˜lX°VI°b„W„nšaššš¥@ƒw°™n@šyÆ@nkÞ@°¯lJn„°IÈl‚UšlXÃ…@Ä·lUVÂ¥VUUÃޙUUƒ@UwƒJUkĉm@ýƒƒlk™WUwVwÂÂWJk@VÂUK™ÂlUkaVƒUƒmLk„m@ƒƒÂ@Uƒ›Ik`@„™UmlUkV¯ÇXKÃ_mm¯@Uƒ`kwmƒl¼±KV¯—¯Vk±Vk±kzma™KUnDZ™bk¦±ŽX„ƒ¦¯Wl„J@bƒxkIWš—Vlš™xnÂŽm¦„nlKVwX„WxXÂŽlxUbVVkzVlƒb„¼ƒbVxŹKUk™@Ua™a@xmxVx¯Iƒx™@Ã…ÂŽmÃ’@șl¯L™¤n¼"],encodeOffsets:[[107146,33452]]}},{type:"Feature",id:"5118",properties:{name:"雅安市",cp:[102.6672,29.8938],childNum:8},geometry:{type:"Polygon",coordinates:["@@ln@xšèVInxVKn„‚ĊkÂlxkÃœVޚÒnÈm°nxš@š¼ĊLV„nx‚WXblIš`š@nÂmĉn‚KȄôÅlÂUÑmU„K²¹@ÂÇÅVÓůVýÞW„‚UVmX„ÆbnwšKUÿ‚™@UmmIUb¯¥Uwƒ™¯™Çmš™„çmanUm»UUƒl—kƒ¤ƒa¯bV™U_WÄ•ÂmÇŚ±ĢUlƒUÂl™ÛVčkUƒ@WŽ¯KU™VkUaÄŸVmš™aV™WUƒmV»—¯@»m£ƒmÃLÂŽ±@ÂÈmVk¤mb@ôƒ¦kVkamL@b°‚@b¯¦ÃVƒn@l„ê™b@º„UĸL°J@zV@nmUƒlaĸÔ@xƒ°VҚ„Ub„‚óĢ„ÒWškV@Ã’"],encodeOffsets:[[104727,30797]]}},{type:"Feature",id:"5115",properties:{name:"宜宾市",cp:[104.6558,28.548],childNum:10},geometry:{type:"Polygon",coordinates:["@@VlÈnl‚XnWLX`m„²nV‚@b°xĢçlnšVm‚nn„@@„°‚UzšlV°nޘÒkxl„w„`UnVb„mšL@albÞKÈۚmܼ°@XǚÂ@wmW@ńKÄŠL„lV„šLVÂŎçÞL²±‚ğkw@ÂUƒy@¹lKX™lKVa@w™™Č@‚w@ÂÂa˜ÇU¯n™@Â@wÄ¡ak—™aÅ‚ƒÂƒK@ÂÅ»VakUWmÄ·wkbÄŸÂ¥mL™akš™@ġރ°¯xVVÞ@VšxVš—VWx„XlxU‚™@k²WVŃULmèULVÄŠklĠ„VÂÂœJVx±nŃ¯¦mwÄŸ@mƒƒlÄŸkkl±@kšUk@¯±Ç™Kƒ—kxl¤Âb™Imx"],encodeOffsets:[[106099,29279]]}},{type:"Feature",id:"5111",properties:{name:"ä¹å±±å¸‚",cp:[103.5791,29.1742],childNum:9},geometry:{type:"Polygon",coordinates:["@@kšVÂŽk„ššÆkšV²UlºÈIlxƒLXèÜlU„„XU‚mkƒbVè„x°@„Â@¼°Knnn@m˜ÆIUbnJ@bVI°b°±@ÂnK@mVakkƒKl¯nbšmĸ„èl@VnÈl‚UUw„wmwnm°¥„L„™lLnÂU@Va™ImbkƒmK„ƒƒnk@mƒb™ƒƒLV„JVUUƒ„VnkVÂmb@a¯JUaÆkk¥„IW¥„Klw—ÑmÃU¯™kVy¯Â@ƒƒ@mmn™Ukmġè¯w@aU±mnƒW_XKWmkÂÇmUkóbUÂÃÂUanmW™ƒ¯nma—@ƒxVôUV@šb@‚l¼„n@l™b@xƒnÛa›xÂa@ƒyUÃ…mUÛbm°@„m‚n²U°ll™ĀȦƒlU„V¼nJVxUz‚W„z@`mL"],encodeOffsets:[[105480,29993]]}},{type:"Feature",id:"5113",properties:{name:"å—充市",cp:[106.2048,31.1517],childNum:7},geometry:{type:"Polygon",coordinates:["@@ȲVmšLnblyl²²UUl˜°U°²L‚»„knÂlx„_VŽ°@nnÞ`WL°ÈUÂŽVlnkšV@ƒl_ÂœJV„‚@„„n@lƒnKV£™Çšƒ„UV¯šm„@laX˜U„‚UbVx„@VkôJU°Jn™@™‚wUk°wnÂUƒV_nJmknmm¯Vwk¯ó¥±ÿ—L@wƒƒƒLVÂU™kU›bX¯mykI@a±Kk¦ULmaXƒƒVm¯ƒK—z±ƒklUIVbÇJšƒkL¯™l™ƒU™ÿ™UƒlUÂkJƒUmÂŽUUkVVklKk@@a™U@„™J„²ƒxƒ¦kĬ@¼±ºXnWb—xƒU@xƒx@lšL@b„Llº@șl@bU¦Vbƒ@U„™@X˜‚bVškX¯m@nÇKk„llknƒJVš"],encodeOffsets:[[107989,32282]]}},{type:"Feature",id:"5119",properties:{name:"巴中市",cp:[107.0618,31.9977],childNum:4},geometry:{type:"Polygon",coordinates:["@@V„U„lbkVšŽVLUÂŽl@XI‚ŽUxVxšXkl„„@þĊnVl„IVx„@VVÚVÞUVU¦kV@ĸWÆô²š@VÂÞnš@Vaôb²W@‚K@ÂXUmÑUW°¯°Ina@y„_lWn¼lLUbô¼„Kla@™nkUyô—Æx°@šÂn£™Ã@Â¥mVkIU¥Ċƒ‚¯Û»¯L±w@™¯a„ÂÇa²m˜ƒ—ç›KX„UW›k_Ww¯WƒwÃ…k@ĪUĪkVmwƒK£@mmmńmÑkVmÂÂamnnlmIU`V„m¯xVlÂx@šmš¯IV‚óIUlƒ@UwVaƒÂ—VW‚kbƒ@™nU°ƒV™„šÈU¤"],encodeOffsets:[[108957,32569]]}},{type:"Feature",id:"5105",properties:{name:"泸州市",cp:[105.4578,28.493],childNum:5},geometry:{type:"Polygon",coordinates:["@@VVXwVKn„˜wnVƒn„l@b¯xmKUbVn°°X°@blLšènV„@Vn‚l@U„LnmmUna„VV_ĶV@wnJ„„l@@kkKVólaUwnJm„wUÂlm@ašÂUaôKVÂnJWbޚ@VšwVLXÂ¥VVš_Þ`šw„ÂWƒÞŹmmnInÂ¥Wƒ@k„WV¯@ƒ°kI™ŽƒLk¼Ç@k¤±Xk˜™nmïUlÅÛKWV¯kƒlUwkLƒÓ™@U—@ƒ‚w@Ä¡XV„˜WX„š@UbVbšÂV›š_kÇV™lU°lnwŎ¦ÞaƯnmm¯šU„™mÂ¥nkVmkƒl_ó¥¯UÇl¯@™ƒ™L™kƒ`¯ÂÄ·LUy¯@mw—¼ķ°ġ_řU°mlšnÇVUޚ„@‚ƒšÂ_ƒJUnV‚UXšbl˜Ģb@x@ÂmšV°—È‚b@‚ÂxÄ‹@šš@xUbkLWškL@º„zV‚@ÂlxÂĠ±²"],encodeOffsets:[[107674,29639]]}},{type:"Feature",id:"5101",properties:{name:"æˆéƒ½å¸‚",cp:[103.9526,30.7617],childNum:11},geometry:{type:"Polygon",coordinates:["@@°n°m²°ÜUšw²ŽôÂVš°ŽVÂkxÜźUÅ°ÄŒb‚ŽĢÂlaÈL„»ƒÂ@k„wVǂ@„ƒnÛƻșUðKl_„V°Uš`Vbn@VbÈLšaVU@Âƨ»V™nIl™šUUa„±lIk±š@VÂnKmÂÃ…@WaƒK¦™lVÂÅškK™ÂÃ@maXÇmw¯IU‚@kƒVƒwUmVIƒƒƒç—ÿƒU±ŽÅ@¯È@xƒK@wƒLUbÇKÃ…Â@mã@yóUóóUxkI@WlIUaƒbƒaÂÂŽVĀ™LmxÃ…aWƒUnÂVƒÂÃXUþÆ°UÔÈÆ@±ºƒLnVVÃ’kÂóÆ"],encodeOffsets:[[105492,31534]]}},{type:"Feature",id:"5120",properties:{name:"资阳市",cp:[104.9744,30.1575],childNum:4},geometry:{type:"Polygon",coordinates:["@@„è„„UJVn„x„U@lV°JnxWÈnbÞ@šŽlLŎ™Ušk‚¥„LXbÆ@nÂŽmLU‚@zlbXmlnVynL„çšJVb‚UnómUnamU„anÂ¥lKV_²aValWô„n@nƒ‚bVÂÂœK°¯VblW@kkƒlUnlV£°W@w„UXk°KVwƒmVÂkwVyVI@wkmƒVÃ…_Umm@Uÿmbk£™xUaVw±V¼V¤kLWxU@Uk™bƒyƒXšómƒ°V@@zÃÃ’kKƒn™±U@@_VVkĂaVwnLWaÂlm@@kkVVl™¦kIV`±n@w„Kƒƒk²™aƒVUUV¤™nkxmUkVWVnLUbVbƒ`kUU„mLU‚mX@`Ã…bǚXbWLXŽ›n"],encodeOffsets:[[106695,31062]]}},{type:"Feature",id:"5104",properties:{name:"攀æžèŠ±å¸‚",cp:[101.6895,26.7133],childNum:3},geometry:{type:"Polygon",coordinates:["@@„b‚KÞnޙ@x„V@x˜n„Unš°¼šVš±mç²ÃÆ@šwnnšVWÂŽnôn_@¥‚™UaVƒ„bƙœÈ܎n¥Æ±VÂUwVƒmÂXÿmLkal¯km@k›ƒ@ƒ¯bkšVxmVUkk@Ua@¯˜»UÂn›mÑÂ@mz™m@īƒÑX¥ÇÂ@ÙxU¦ƒšÅŽÇUkx@šlb„UWVX„mV@xĵĖ±@@Ž¯xUšÆLnÆm„šx@nXL±lUUVwÂKWak@WxkbšÞƒŽĉbUn@‚ƒ@@xó¦„Ŏ"],encodeOffsets:[[103602,27816]]}},{type:"Feature",id:"5114",properties:{name:"眉山市",cp:[103.8098,30.0146],childNum:6},geometry:{type:"Polygon",coordinates:["@@„šVx°¦VanJVnš@„b„aVbkJ@XlJVwôôôV@zÞ¤@nƎÈLVa„K@x„L@w°ÇÆ@²Â„V˜ĀœmWÂXKWașÆa@_nWVÂnKVƒlV„_UaVamKXUWwnmmwτm£@ynUƒkWƒĉUkWVkkV±çkJmÂkKƒšƒK¯¦mnnxƒxVxÂVÇkUmk@ƒçķ™nmak°„LllUb@nmL@‚¯²¯aUJ@amIVaÃ…Jn—m@mm¯L@»ƒŽ¯@ƒwUç„anlVƒWVƒÛkWç„KkwÇJk¹±V™UÃ…l™™ġV™²ÈƂnXÄ–V`Uš°a„b„£˜l„kVVn¼mVnbƒè™šÈn°š"],encodeOffsets:[[105683,30685]]}},{type:"Feature",id:"5116",properties:{name:"广安市",cp:[106.6333,30.4376],childNum:5},geometry:{type:"Polygon",coordinates:["@@„VlIV‚„kšVšĀ„Vkš°šlK™„ÈIUaVJlk²„˜y„Ln°„UW„nbVKl¥²L@blJnzW°œalV°InÂô¯‚K„kšKkkƒbV™šmôLkéƒwVk@KnnšWlwn@laXL›ŽnXVW@X°a@„XKl™Ânw„@man™@w‚@na@„„@ƒw™ĕġġ™wUÂkUWb@mk@™¦ƒ¥mUÛb±yÃ…n@bml@ÂkV@„ƒlknVbmVnlmš—bÇk¯bWyk@V_UamJ@I—@WaƒVXamIVWkUkbVaƒUUxƒ@VnkVU¼›bkKUxmK™„Â@WšƒxnV@n"],encodeOffsets:[[108518,31208]]}},{type:"Feature",id:"5106",properties:{name:"德阳市",cp:[104.48,31.1133],childNum:6},geometry:{type:"Polygon",coordinates:["@@nUW¥²é@šK„¥‚UÈÅôa@VÆLUxnKl„°ÂV¥ÈmlÅÈV@£ƒWX¯lLlÂn@UšƒVÃ…lwUm²U‚VVÂna@ƒ@KnbV™VwƃœI˜mXwWƒkIVwÃÄ•ÂVUa™IďmKUzkmWnka@y™@l²kJƒ²Vb™VkšmJUšƧ¼@ÂUV™bÇKUam@Ua™_¯VƒUk`¯LVÞǚżm܃„Â@Uȃx@l„ƒ¼ÇKkbWŽœšVxUbƦnxƦĊV"],encodeOffsets:[[106594,32457]]}},{type:"Feature",id:"5110",properties:{name:"内江市",cp:[104.8535,29.6136],childNum:4},geometry:{type:"Polygon",coordinates:["@@²èlUUllXÄŠVX„„lmV@zn¤›ÒnxmnXxlUnVlwšmU£VV„Ušbl±„„ƒL@x²mU_lJš¥UklU@ln@‚kXbmKUxÈbl„UU@`V@š²„mlLÞÑ@yU@„¯ôn‚™„W„zšaVlV@XwlKU£‚»—aVaUwm@mwUVUwkƒlÂVDzLlƒ„KV™m_@yÂkUmƒ@mU™çkKmxkIU‚Ä@LUJ@n±„kº‚LXb™¼@mmIXa™@mamnkW™ÂƒKUƒƒxƒ_U`UklwUw™mUbƒV™²ƒakbƒmkn@`„UmҙšVxUb™I™`UƒaÃÈ"],encodeOffsets:[[106774,30342]]}},{type:"Feature",id:"5109",properties:{name:"é‚å®å¸‚",cp:[105.5347,30.6683],childNum:4},geometry:{type:"Polygon",coordinates:["@@ÞĖUxlJX„Vb°@„xUÞmbUxƒbXbm¤VX@lk°ln@x„bÈ@lLVlVUXxlJšç²UlwV@@UÈWl™„L„w@w„V˜wXaWm²¹@»lī„¥„wƒ±šI@ƒšV@bl@kLUllUVVnÂ@mmU„wX™ċbVbÂ@VUkbmamšÂW@kƒa@™™k@ƒlaUa™@¯b@šmmwó@@lkXUa¯°›LU‚Âam„m@óƒkXUb±bU`kLm¦ƒbnVmbnVmô"],encodeOffsets:[[107595,31270]]}},{type:"Feature",id:"5103",properties:{name:"自贡市",cp:[104.6667,29.2786],childNum:3},geometry:{type:"Polygon",coordinates:["@@lIÞDŽbVŽš_šJVaUwš™nуV@_lm„nla„bš±„UVašnVxkxVlV_„`„wV„„LšÂlXnmnbš@WbnJ@nš»WaÂKl¹²ƒ@mVI@KރVÂlJnw@aW¯¯¯UmVanL°w@aƒk„mmU—xmƒULWxUUÃKÅèU™KUƒƒkĉKƒL@ÆnX@x™‚Wȯ@Û»™nÇÜÃLka@b™KƒnUaVmƒ_ƒxkƒLX¦ƒJl¦ÅlVb°I@bnaUÂŽmlƒUV„UVƒIUŽ„Kš„„a@nml„„ƒŽnLl„našJUbV@"],encodeOffsets:[[106752,30347]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/tai_wan_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"7100",properties:{name:"å°æ¹¾",cp:[121.0295,23.6082],childNum:1},geometry:{type:"Polygon",coordinates:["@@\\sÂŽ@pSÂ}ÂaekgKSu™ÂSsMß`¡CqZ·be@Q^o@‹gieMp‹‰]}•}Ľc_KkÂ…{™ù“ÂA¡r‰[uom@ÑÂÄ¥Jiq©mʼnq¯Bq]ÙYgSÃ¥k_gwU­isTÂE…“‘ĕiqiUEkuÂe_‰OSsZ‹aWKo¡Â­q“ycÂY£w}‹ĩ™ĕS§Z©S™NÂ¥SyLÑ¡±Ks^IY‰PdƒY[Uo†Fp}´\\¬\\j]ˆeÃœÂò‹¤¡–Ä a\\bn™U㺹Ìs¼j®[cíȈEÂŽÄĆ`ļf¶Š®K|VØDÂdKGpVnU‚FjpH—F`†BÂ’[pMºxÖjbpÃŽxp€¬‚|ΟÜÒCŠ²®‚ÜAp„ZG~€Šd˜ÞàV¨|¸€`|Œ²tx~\\~|dFf^zG€ĄŚhÂœdL\\hĸž¼†ŠOªP®lV`p\\]Xpll˜æ¤œCpQ|oF}fMRi†NSon_²qämÂœM„NM‹\\•"],encodeOffsets:[[124853,25650]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/tian_jin_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"120225",properties:{name:"蓟县",cp:[117.4672,40.004],childNum:1},geometry:{type:"Polygon",coordinates:["@@EUDAEI@WNMNCBFAHFFNACDJDPBD@@GD@DIFFHEFGDBDEQOFG@EI_KG@OcJQM]RMEKBGPG@[LaCIICBWKÂCEEG@WBQHCDFD@HSLEJI@IHWECFGAAEKCGDBFCBSBIDCKKHEADMJMFABKOKEQAA@IEEG@GIQAEK@OZEESMOL“lu@SLUTYFQCMG@@SQUAYKAACA@IB@BDB@B@DC@@BGAEFAA@BEGKJCC@AGAIHA@@JC@QEIP@@A@EGIDC@O@C@@@@CJCWKABFLBBEBSQGBAAMIEM@AKBcJEN@BEBCFMAEFEF@J@BG@BFABECKFG@AFQ@@F@BEB@@A@@AAAKAE@GFGDECEFEECBKIKDELDFEDYH@EIACDCHKBEB@BAAC@ADBHABKJIAIJICEDGDCD@@A@A@DHCHJHDFEFGBKRKBGIK@GIMHSBCH_BOJECCJCFKKMD@DNJEDEGC@OJCJHRUL@HRJ@H[DCNKDZHCTFDHCFFKR`TANVDFZRDLFARB@HPAPG`ILAR@TERNDFNHDLCLDDCXDYbHF@FEB@LDDVE@JPNfXPINCVDJJD@NJPAJHLXHDNANHhB@DPNLRMTBFRBHHr@`NBFEBOCCBIAQJDHCHLHFA@HSDCRLFTB@HEFLNF@PELBDJALFLTC@EPFLLP@tUHQJDfIHGTB^JTCPDLKAIBATFPADIEGECEMJ@JIAIHGECFEAGDI\\SPOXAFCL@BQTQBBTMZECYGAHA@GJAE@HCAEME@IECFKJADDBABLTHHG@ILEAMNDJCDHEBF@@JNFJELDFKTOT@JETBFFHBHEHKI@@IJEJ@XKEOUMS@AF@CEB"],encodeOffsets:[[120575,41009]]}},{type:"Feature",id:"120114",properties:{name:"武清区",cp:[117.0621,39.4121],childNum:1},geometry:{type:"Polygon",coordinates:["@@FWôµ@IFCLIB@EHNBp]AGEAKAEDMGZKFGBGME@ILGP@HEFB@BXMEAHUGC@IHCLOD@X[NWHWPKAEF[@EKIOL@EKGBNMJ@EIEHKBIC@BAKMIACCFQZCF]DB@ERAKADIHGEIBCGIIECFaGLZO@EFCNGAGDGAKL@BMG@IE@ADSDEH[JGC@CGA@BMDeK@EIACFE@@GG@FIAMM@CCGC@EM@ADE@CFMAAGHBDKIEAJG@DOGCDEKAGIS@KFCHKAEHIE]BeKNO[IFIOELC@A]GMBKVYCDDgGAICARc@MW@AQE@DGI@@AQ@@BKBAIQQYEFW@CEADIGGBCEIiMEMF_LGEKMBBDWEBGRC@E_CHYGCH_IAED@FFBQh@FGJaJ}AHRAREF@bE\\C@CT`FHC@\\BBF@BID@HGDDJ@@FAHKBARECKDAZBJIVNHCTA@EREAMLHDAFFBVFFC@RNRETHD@FOJMACH@CAB@P@DF@@FGDWE@FFSIEMKQDYCCHKb^JADOCIDGNDBdBCFJB@EC\\A@BJEA@JAAAD@HHD@LFBCFF@BERDHNhZQHMBGHOACCEBWEGD@PSJKCGEUD@CINLFGHE@AJK@HDABBHTB@F`DBFLBBHEDARCFG@ABJBAPVFE^FBGLGCFG_BMLEXGAAFE@@JNRVJHFALFBEHQJCTbNDHCF@PlFLJSXCHFHfVBTNJ\\BPJXC^FAVNFCHFB@FFH@JF@\\ABCFD\\BDMCAAJKQBGAILOEGHILECQLWFENJHADC@QxNHFJNLDFA@CBA@D˜UÂmR@FBL@BD"],encodeOffsets:[[119959,40574]]}},{type:"Feature",id:"120115",properties:{name:"å®å»åŒº",cp:[117.4274,39.5913],childNum:1},geometry:{type:"Polygon",coordinates:["@@TZbB@JHD@DODCLM@AP@LL@BNH@ETFN@`E@DNG@CHLBCJA@AICFKDDBKA@\\N@AFNAGRBFjFFFL@DHLBLFQPcXAZMJ]GAVHAIZJFNE@JpDRRDCLFDGXA@EFF@CFFPDfEBDB@DCHCFCJDJIJBLI@I@CB@@ADBB@FALADGDC@@H@BB@FZGFCCE@@FMLALJDAFFFEFDFCB@@AHCF@L@@BBB@BB@FC@E@@R@BEL@HEFD@G@AH@AIB@@@FEFEBALDDEFAFO^IF@JCBBFPNJJ@D@PRDCEKBAXL@BIFD@T@JE@BHHJORFDI@@B@JGH@@B@BDDLIFFHCD@D@DEE@BAAAB@DAF@B@H@NGLJLMRDNMfGIEPMI@GDAKK@KIDIJ@GE@CFDN@FE@GFEPGV@TCDFKHBBF@RW@DD@@ID@TJFKIKLI@EP@IGBCLAEKLEN@KSHIGYACSD@SEAMBBMGEBMQBCMIGKFB[D@HDLPHDBC@IFITDLG@IIIFGVBNJDLN@VIRI@YIAIHIC@CLKZCBEE@JECEIHEAKGDGECBGEEM@@DA@CCCBBEGA[GEDBBoNAAH]MKiIAWKQoIIPMFQAEEDMH@FMSUYIeF@EK@BIOEKJEBICFKaKPÂFAFSE@LWCCFMHDDEKESBOGBKIEIODLG@CCDEQCEDWEMDIEIB@EHGEEDAEAa@@HqDEJGF[AECCFa@WCEIKAAEQB@FCAE^YDERDDJBLNABD@AJGLJF@FNIAMLH@FPKLJ@FE\\BFOLGXMXW\\C@KPGD@JHDGVFBWN@AEAGFO@KH@JNFAHEHYLNHFCLBFBBHo^MAFGA@KJED@Jó¶EX"],encodeOffsets:[[119959,40574]]}},{type:"Feature",id:"120223",properties:{name:"é™æµ·åŽ¿",cp:[116.9824,38.8312],childNum:1},geometry:{type:"Polygon",coordinates:["@@NGFMDATCNDR@CCbINEHNJA@C\\EEGVE@IhE–[˜w”epc¢·²›^QEKIEKIgiQDkehY£uSDBMkUDOJDHC@GF@CAFBFEN@C‹Q@BeP@@G@HD@@MHQKi@[IGCOCESE@GMA_OcCGDu`aˆ@VZzKDkJBLNXGDqKEWE@cFEFA@ƒISIi@@KMABJGBcMuFEzGVH\\ATSEUBeAÂLCEMG@CEBUHUCGXaBPtUBBFIBFTDFF@DDKBFNGBJPHXDDMDCLJ^mBIHIL@LR\\@LCR[@@z@NFD@LLBNb@RHDBNTPT\\F@BJF@BXCFBHHBDLFB@HODADE@@JHVXCPDHCFTLBBFNCDCCCU@@GAABEHHZHBCAEdEjFDD@GfD@DXFCHF@ERFDLBH@"],encodeOffsets:[[119688,40010]]}},{type:"Feature",id:"120221",properties:{name:"å®æ²³åŽ¿",cp:[117.6801,39.3853],childNum:1},geometry:{type:"Polygon",coordinates:["@@BFLBFJXDb@DEFD\\BHEFIrC@Gb@FBCBFFGH@FJAJFNCXFFCRDCFDDH@CKJPJFALPHTALFCFGCENDDKXF@ETEBO‚bLELJDFALIPFAJL@@FfEZJTVENG@CNFFRBNEJOpJLRBXjJNLG^BBpMAAFC\\HHBAFDADDB@@CN@FFAHFDCHLHFBJGFCFUNKJJTD\\XUXF\\^F@DDDQXXBRLRCBDFEVCDLVDpUl@LEDJHAPRFGL@CETGPBTCDDVI@CFF@GFDCCVGLKEK[Y@MECISG@BKNSCGCKWEAaEBEKNGFSECO@GGM@GYI@DÃ…CMLHPTF@DJHAVVNKEGDETJ^[TJNNd@NOAMFYJ@@GFANDPEJB^aOadSTQSI@MHBDIEOKCG@EEFCKCqXO@@DMFENCDDHCCGJ]AKFoDaGGHYFDHKJiCMFGC@EQ@AEHGAC@IEAATKOHGIC@IXIFEoƒGE[JCFCDHNmRADFZMF[EEBMO{GU@AOW@@]ZeHBDEHBKEfQkuIWBs‡@EC@d[@[^EDMTKCEEcI@cDAB@FCBCACmOCG{PYHeBgPwPFDDALFFFCHQGSD@BHFAR[TaFYXMASUiGFL@DQNCJI@@D@PLDN`ETEFIGMCGBCE‘~CAIFDPEHGEQPHJADFJGHCJLB"],encodeOffsets:[[120145,40295]]}},{type:"Feature",id:"120109",properties:{name:"大港区",cp:[117.3875,38.757],childNum:1},geometry:{type:"Polygon",coordinates:["@@JFFL°_`ONJKDDFIFZN xlb~yFVNRÂŒrdJGzDPVFBCTNND\\UR@E`F@@Ip@IWGUoawOEE@ÃDgK{Ä°EEMFëC—b…™@—KwOCDHHKBDJCDEEEAGHOABFABMCgDLSQ@CFEB‰MgYIDQINE@AUSwSAdYEHQMEyK[KI@GRMLE@@OqOoBOnpJ@BmEAFHL^FDB[C@BBDVFAHFJENB@sNEjQAMYsUgCSBGDJH@\\LjGR@NC@@G@HO@AfR@DÂŒM@EFEADBE@@HGDICCPlVANTC¤vgZlfRChjLJ"],encodeOffsets:[[120065,39771]]}},{type:"Feature",id:"120107",properties:{name:"塘沽区",cp:[117.6801,38.9987],childNum:1},geometry:{type:"Polygon",coordinates:["@@|ODHnPBDADEDA@CB@ddJFFLDNSFC\\]\\@@cFDˆ@nACOMW@M@ITURBRZNHNWRQšoO•j½f‡cqŸAqeiDÿÃyÓįFL|Ch@ÃFFxPpbHVJXo@@JCTR^BPABQA]^MB@bE@@FQBFVJRH@FXtPNZSBAja@@NƒDTÂŽLJrQTHFXZFB`"],encodeOffsets:[[120391,40118]]}},{type:"Feature",id:"120111",properties:{name:"西é’区",cp:[117.1829,39.0022],childNum:1},geometry:{type:"Polygon",coordinates:["@@@LHAHRHATh`LHNHDG`HDGZ`D@FQDAHXFACNAFLVRTBFOfHDCVBFQH@HSXHEPFB@LDBF[bDbLFKJBFLADBDjLvCPEI]FGEIGCBEUSjcFiBIVWfaHCjN^HtwBBFGPBJGjFBEGECGDONMFAP]TDHQOWCMGAMHKIJEIGQ]aDlUG]VGEGDC„{PEbBZmE@@GH@BCA@FMQCFMYMJECELCMI_P¯`]R±œ¡¸od“f—x•\\gF@JUFFH[F@DIBGMMFaJDDQ@MCSDCBENMH"],encodeOffsets:[[119688,40010]]}},{type:"Feature",id:"120113",properties:{name:"北辰区",cp:[117.1761,39.2548],childNum:1},geometry:{type:"Polygon",coordinates:["@@ROHFFGCOJEDBÂ’}DFHANDJHFEFSM_KC@O@CJ@DIRM@CEKKAÂ…LÂ…FKACHoLSJSIBETDJaEIIE]E]K[MYUYQILC@GF[MGNKEK@A@BCWECAIFEFYAGFOMI[OFuDiKACBCEKIAELaKaCE\\CA@KEAFOWGGTG@ERUACDeGEPSAUQKHE`FNjNFJADHHCJFB@DEXZFRRBJLA@AR@@BJ@CHF@BRX@@NQdDBBJhHCCZDLUNA^H@BKDPFEJ\\JMPfL^AJFFGLBDGLET@HJLBCFHDCPH@BIJFCLGABHNBDEF@BCN@@FHDDDN@BNEJH@@HF@DEJB@FfLNC@AHB@DHD\\IFGTCBCF@@JNH@ALKHBHCHBDMFEP@KYbHDEJF"],encodeOffsets:[[120139,40273]]}},{type:"Feature",id:"120110",properties:{name:"东丽区",cp:[117.4013,39.1223],childNum:1},geometry:{type:"Polygon",coordinates:["@@ZV\\N^L^FJFFJIbSCAFTJTIpKDGLB†E†KLBjHTVNBZWbE\\SBQGE@ATCRHDGEEKECBECxOhOfAZGA_YEEWSGqRKIS„C@Mb@BiTAMYsOEWG@IQEURA@EF@@acUOXQRYCUDCHDTEF[SUEgAYDcVGJM`iAWDWLQRMHUHgDsDBLHJFCFDFGHBFFVEAGHCJN@RJF‡PIhBD\\FENCPWA@LFBAFHBEJUEARCDIAEDQBRNa^"],encodeOffsets:[[120048,40134]]}},{type:"Feature",id:"120108",properties:{name:"汉沽区",cp:[117.8888,39.2191],childNum:1},geometry:{type:"Polygon",coordinates:["@@LMEI\\MTABKN@FCDMH@COAcH[AoÄ“A™M¡Wa[Meq™pQRMXMGQYQASV@J@NNXDPmBAtJXlveRLFGACFGAYf@^X@BPV@|HNPFA\\FNEEYBCnQGMDCDE\\IHFp„EFWJ@JJDGHLPBSFB@JBDGHBFR@@FHDNEjDLICGZEHGbHpCLE^BHIDDCGDCFMNE@CP@rWLDEDFFH@"],encodeOffsets:[[120859,40235]]}},{type:"Feature",id:"120112",properties:{name:"æ´¥å—区",cp:[117.3958,38.9603],childNum:1},geometry:{type:"Polygon",coordinates:["@@TLv@CNHFFBHGZFETNPhCVGNGRQXKXCjBN_HIdUZChBVF\\TFECSDGVCZDRQPWdVNA^]RBBAAOQ]DSE@F_Q@[VMCSMADUECOHycI‹qMQEU}zkaŸwENRDENB@ADG@@HF@YnaAOFƒ|CDFHUHH^kVbCR^JHIFLJNGHBDNPXGRSCO^EBMNCPDHHFAFiEIHOAEH"],encodeOffsets:[[120045,39982]]}},{type:"Feature",id:"120103",properties:{name:"河西区",cp:[117.2365,39.0804],childNum:1},geometry:{type:"Polygon",coordinates:["@@d@hZNFdcLYXKRCtCMOFSYEGHEAGEDMu@SKAAsx]GMTGt"],encodeOffsets:[[119992,40041]]}},{type:"Feature",id:"120102",properties:{name:"河东区",cp:[117.2571,39.1209],childNum:1},geometry:{type:"Polygon",coordinates:["@@ZBVFFIGABEEA@KXBDOFM[EACJgˆOIE@QIMGDBHUFEEGAEHECEDGIAKQDWLKZcdQPEP@FOFBJTJ@HNORJf@DBCN"],encodeOffsets:[[120063,40098]]}},{type:"Feature",id:"120104",properties:{name:"å—开区",cp:[117.1527,39.1065],childNum:1},geometry:{type:"Polygon",coordinates:["@@NMVDCG\\E^B@HlB@YEDS@CÂ…HsNSiMGDebUXAJEjidVTAFHDFJ"],encodeOffsets:[[119940,40093]]}},{type:"Feature",id:"120105",properties:{name:"河北区",cp:[117.2145,39.1615],childNum:1},geometry:{type:"Polygon",coordinates:["@@DBXFADB@L@LFHM\\NHED@JKZRb]QMRAFCJBDCBQYADMCAe@QIMP@GSIAIPE@E[EGH@ZEF]^HJAXK@KF"],encodeOffsets:[[119980,40125]]}},{type:"Feature",id:"120106",properties:{name:"红桥区",cp:[117.1596,39.1663],childNum:1},geometry:{type:"Polygon",coordinates:["@@J\\PNHEZBFEJELEL@BWGI^]FEkA@G]A[FDHUCMNEHJ^"],encodeOffsets:[[119942,40112]]}},{type:"Feature",id:"120101",properties:{name:"和平区",cp:[117.2008,39.1189],childNum:1},geometry:{type:"Polygon",coordinates:["@@D†T@FCHG\\FFOROMEgYc@"],encodeOffsets:[[119992,40041]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/world_geo",[],function(){return{type:"FeatureCollection",offset:{x:170,y:90},features:[{type:"Feature",id:"AFG",properties:{name:"Afghanistan"},geometry:{type:"Polygon",coordinates:["@@ࡪ͇وÅǬϠÚŶӂʮǚڦ۾njƀ̚ІɣʪÒ´MوǯʲĹ،˒˰Nj˖ϪԈiżŬĘͺβ̈ҔÈÄʱʪ¡ý۷ͪ˟̊ǰώĊԼϖׂ×ࢀAƬʋӧĥÑƹ७ĭࣗǭӫλȤΣĪллΛ–͑ɳ̡ߛ€ͦ։՗ɅΥԕ²ԋ͡ɿ̳þÙŋğɻسDҵӇ‡ÜથΓבôÇÈԇņ࠿űටіހހåզÙƚßՔ˟ڢάҢιŮɲؒ΂ਸ"],encodeOffsets:[[62680,36506]]}},{type:"Feature",id:"AGO",properties:{name:"Angola"},geometry:{type:"MultiPolygon",coordinates:[["@@ȸصʌԋȘ˕Íѯ֊æˤŠҬşŲɀɂӨԶ®ƤіHñ̡৴RfՉǞ͕ūԑÖԫ˪̷­ৃȼüκsԴŴϦ¹ĘʹĩСƨϿů̿îÌყZÂᦵ֤ۋպԽ໳ÎáŽÅ ×‹Ð–₭—ŵÃԃϞկ~Ô‰ÆЙDžÿՈŜ݊̂ޒªΰ˚ݶȨΆӘռËÏĘج«ӊʣ̜ɡԚȵԎ®Ǩʶͬʭ߼ǣ֚ÑÕĄǎΌŔʒg̎ĸៜ["],["@@ɉėɣلͼδʪƘ̀˽̩ǯÆÉλ"]],encodeOffsets:[[[16719,-6018]],[[12736,-5820]]]}},{type:"Feature",id:"ALB",properties:{name:"Albania"},geometry:{type:"Polygon",coordinates:["@@Ń˷ŢέΒȳiə˗ŧ»˙ϷСƛÃgȂү˰ñÐîֶŖʼƗƂÉˌθаÂƿɨôǴɥȪÄȨ̂"],encodeOffsets:[[21085,42860]]}},{type:"Feature",id:"ARE",properties:{name:"United Arab Emirates"},geometry:{type:"Polygon",coordinates:["@@Ƭ¤ŒɱڂƂ۞uÔ–{ֺ֪ظՠՎԮdž˹ŖڑѕGçճƪÅÏÇ‘EÎ…Ê“ÎuÍ·ÇDZᡋъÍà¡šÂÈš"],encodeOffsets:[[52818,24828]]}},{type:"Feature",id:"ARG",properties:{name:"Argentina"},geometry:{type:"MultiPolygon",coordinates:[["@@ߗ§ѓ̔ԑx࣑@Aሞ͒ϵрؿનԋ୲ȿϙп"],["@@Ӵ؇͠ڰॠ“ƊǷ໶ോۊŷਆاࡾ͡Ŧχࠡ౧ࡒɭ़ŷڔƈނ٢ƎÝжLjфÓiÚ£Û»Ò©ÖŸÎॅࠃ૭ଧȽڥɣࡹT࠷ǽȇÃիËѫ੨ܙŗ׃Հν§Ч߯àªà°›Ò‰á‹Ç©à¤‰ÄŽÇ°Ô…ǣػƺщԋÌࡱř̪͕߱ɗŜ࠳֨ʧҠˆʢѧޛʻڭԹūࡋȣ҇ßEڃљʋؿؙࠞߦÇ˿ݭ঳ӃձটÞͧ΅Ͽ˔à¢Ö”ӡΟ¨ީƀ᎓ŒΑӪhؾ֓ÃĮ̀óࢺ٤φˈՒĭьѾܔ̬૘ěӲξDŽę̈́ϵǚˢΜϛ͈Èॺ͸Ǣƙ਀ȠࡲɤݢԊ̨ʭà EÞšÙŽÕ¸oÛ°Ó’à ŽDޜɓƶϭà¸Ô¬à¡ºÃ¿à €ÌœÞ„ռ߂צԺʥ͢Ǭ˔ඔࣶд̀ࢎĹɂ۬ݺશȱ"]],encodeOffsets:[[[-67072,-56524]],[[-66524,-22605]]]}},{type:"Feature",id:"ARM",properties:{name:"Armenia"},geometry:{type:"Polygon",coordinates:["@@୞ƀǨə͌ƣǛÉ҄˽ÊˋΦɫϘÆl׋̣}΃ӢHżχCÊɤǩuͧʖرȼĄФƛ̒"],encodeOffsets:[[44629,42079]]}},{type:"Feature",id:"ATF",properties:{name:"French Southern and Antarctic Lands"},geometry:{type:"Polygon",coordinates:["@@ը˃ßĿˆDžɽϣಇÃq҂ŮΎÊǢ"],encodeOffsets:[[70590,-49792]]}},{type:"Feature",id:"AUS",properties:{name:"Australia"},geometry:{type:"MultiPolygon",coordinates:[["@@ߺÌҜŘپNJԎÉÃঽ˽Ìēگ̉ɰ×בǧ®ԫ€ԭܘŗֈÓܸtϬռõ"],["@@̢ڇբ̈́˦ΡЖ͟đϋǴܛŸнɄĹɬܕąѥ˖֭࣬ѭצЋ֞λŋȯӔՃࣧ͜ͲȂ;ηȴźƢࢹ׬ԩϸ͋ڀڹʀڭtÓËԳÐ܋µݓơϵɩݡjӕǕ׻χއثЭ̫ٱ˫гÊܧ͕нɅػʼnתˇӕ̇व‰ޡ·ϫ͙ԕέ۟ψԥƪżѬÒǃÝ؉ܩɪӉƄӑÔ߿ÊիԮƻْțьЭ;߱ĸˢРȯزЧ׉ÝƷѮҬŶӞ͘ЬãجÛܑԿ˽ÍڛٽΊ~ҀԿ،ѹ̀ǂȘઃԚןz߯ЦຓÄછÌख़˫ߡÈࢻљܯȗljѱ̳Ϳ܉qՅõݑƶ׿ğֽÂÔ҃ʕœуÊЗˋؕÂÖ›Bࢽ՜ҋDŽlӖкŘƚȒ‡̠ĺ×ģӼѻࡖÆӒ˜ӎͭնsʚϋͰĽڄӓڔřΪτε˳ެиʑʞ͗aјеڎă˄țʦĠӠǢȸŘрęӮΎ؀Úٕ΢׀ۀˬЦΪٜ̰ϤàɴĻڎ̺ԚĤŶȀɞüҬoࢨʖҚώɊ҆ӲÑœͲvҘט܎ΠܩΦǚ̗Ј˂ТψǻĸٖҠаȮͨцƜ`ɼτĭdɂτŦОŔبϫҲӽՂMՖÿDZҦДڪϜɘſȾκӒԘ̒јıۺǂeі؛ˢ҂Ū֎ȻҀ·ۼɋʈÄԶʵӬʊ͂ñȠNJϬеɡ͉҇ͻ˿ƒĮͱʙп̗ЭÔÊڜҫ٨ËÑ Ì؈ӻʂBÑ°ÉŶʷߤ˵ֈ˼ÇҊǠόľҤʰڞÅОÔʔīӔŌنLjǠŽˬȮѾdžҦtʈ̸̾ʂЩÎՃȾķ˜Λ̨ёÚӇ‡̥"]],encodeOffsets:[[[148888,-41771]],[[147008,-14093]]]}},{type:"Feature",id:"AUT",properties:{name:"Austria"},geometry:{type:"Polygon",coordinates:["@@Û΃ÓCǎǻ˧էLJƗܽsщÈۛÞயÉȉ̊ࠧƣĭDžԗŢѕxÏƶźȴÂƬʪ²ьɹŤɜݎ•׸ƮЖ}ˀǣþƜšո̠ń̒ϰز˓ӀΆÌÚٶʱЂªϰÇãŃČ̅"],encodeOffsets:[[17388,49279]]}},{type:"Feature",id:"AZE",properties:{name:"Azerbaijan"},geometry:{type:"MultiPolygon",coordinates:[["@@ʞɣψDGŻ΄ӡֽŒщϰƃ͆Ǫv"],["@@ϊËƞɈԈͺѴѵђ׭ϺŸʸɧۗãƣٵƟÌÌ­ÈvзȽ¥ԻѲ̂дÊʚ̿×যإk׌ϗÆΥɬʂˌ҃˾ǜɂ͋ƤǧɚȶƎضÊÒ¹ŘIJбҔɔŚʀ…׀ԙ"]],encodeOffsets:[[[46083,40694]],[[48511,42210]]]}},{type:"Feature",id:"BDI",properties:{name:"Burundi"},geometry:{type:"Polygon",coordinates:["@@Ã০ɃϢԜßʲӎҀŸͧǸÈT˗ȹǭ͛ѫ̧̥Ο"],encodeOffsets:[[30045,-4607]]}},{type:"Feature",id:"BEL",properties:{name:"Belgium"},geometry:{type:"Polygon",coordinates:["@@؜áުǪÕοҦÈħ֧ɕÂÄһܿϦћßדІϷͶϷ`ũ̒ڪǔ"],encodeOffsets:[[3395,52579]]}},{type:"Feature",id:"BEN",properties:{name:"Benin"},geometry:{type:"Polygon",coordinates:["@@ۛįȹ׆žኞǛǦÂЮ̇̌ʱʞņѶ̀ĨǠξЪĀȀʤˮʘ̠FÙ˜Ó™Â˩ȎӽǓͷĘɧСԳʵʳÇÕ‰t՗µണ"],encodeOffsets:[[2757,6410]]}},{type:"Feature",id:"BFA",properties:{name:"Burkina Faso"},geometry:{type:"Polygon",coordinates:["@@Ö¹ÉϽ‹ÌɃϗǰƥ˦ϙǾÅӦɮΤo˴ښۢŬּɲȴОœΚǢŘɎٴϖdžˀ޼ΒҦŢɀLJՠJáСŔϣӀչ€ÐॺÈmֻǿʣЩÿǟν˿ħÝlϳâ˓ƉωÖร¡qӉŘم"],encodeOffsets:[[-2895,9874]]}},{type:"Feature",id:"BGD",properties:{name:"Bangladesh"},geometry:{type:"Polygon",coordinates:["@@i׽̉ŶÆگʉѬµєDžКΕӨޟ’ü΋˃ҳΧǠũƵʃĠ͗øŽۖ̅لƜԒԫɤȆ̪Հ̼؅Ѽ֮̔ږεВ£ô×ߞřު^Ӟƛϯ܅ϕµʷÓҢѥƎ՞ɶFѶ೯"],encodeOffsets:[[94897,22571]]}},{type:"Feature",id:"BGR",properties:{name:"Bulgaria"},geometry:{type:"Polygon",coordinates:["@@ʎΉ͚Ö٦ſ௾«иɌবȜ̩ؒӴĕѥÎ̫׹˔ÓܣŒࡥ˃Uлޅÿס̊ڧɱة|Ñ֊ÑËÆ’Å¢ÄĴƘˌ͌ˀСδ÷̬ȸÈ"],encodeOffsets:[[23201,45297]]}},{type:"Feature",id:"BHS",properties:{name:"The Bahamas"},geometry:{type:"MultiPolygon",coordinates:[["@@ȵ£ɇӜ̿ÊǾՔʨ‘ۣ̎JÓ¥"],["@@ࣷƅÃ̴Ђäֈ{~É•"],["@@ƟׯƷņ`ѮϓͪCĪÚÏ—"]],encodeOffsets:[[[-79395,24330]],[[-79687,27218]],[[-78848,27229]]]}},{type:"Feature",id:"BIH",properties:{name:"Bosnia and Herzegovina"},geometry:{type:"Polygon",coordinates:["@@̦FȿσМ͓ūЃȡ™ƽû˙țūҥݓ͈ͅΘ͋Ȅϭ̾ǻʺЩϾǬΒ̞ȕǼǨϾnܠƓ׈\\Ϟȅ"],encodeOffsets:[[19462,45937]]}},{type:"Feature",id:"BLR",properties:{name:"Belarus"},geometry:{type:"Polygon",coordinates:["@@ß¼Mࣰ̈́ȚӄÛËÿϔԜƚ͖ࣘࢮÉŢȻѲĴࠒȧĊÐǷɧՄս΂Ƴ»Ʊ֦ƩʎɡÍǿڳˆljÿȠ˧ȸÕܹʵÈÃхͭĆݷ¡əȞ̿ƥÍŨÚjफȬࡕàٱmҡɩГÂeÏʷϴԌǢLͰɷ͌™ϊ"],encodeOffsets:[[24048,55207]]}},{type:"Feature",id:"BLZ",properties:{name:"Belize"},geometry:{type:"Polygon",coordinates:["@@OŮĸžƴı̞ԔDŽZHÅ«Ç„GaɭƋεôŻĕÌÀăīщǓɟƱÇ“Ì…Ê£@àॆPÚ˜"],encodeOffsets:[[-91282,18236]]}},{type:"Feature",id:"BMU",properties:{name:"Bermuda"},geometry:{type:"Polygon",coordinates:["@@OEMA]NOGNG\\Q^McMOI_OK@CQSGa@WNLVWHFLJXVFGJ`ZRTDLeeWKIHGIK@@[MQNi`]VDTBHCJAPBJLVFjT^LV\\RJZRn^RH`TfJjZHHOTTFJP_NOX[EYQQKMEJOLANJH@HQHAARF@ZEPS[U_IcRQXE@EEKKOCGGCQCOGISKYGUC"],encodeOffsets:[[-66334,33083]]}},{type:"Feature",id:"BOL",properties:{name:"Bolivia"},geometry:{type:"Polygon",coordinates:["@@य़”͟گӳ؈વȲ۫ݹ؅ŗ͡୆ҋऺˆ߾ѳ΢Å؆ЫֲՌ࣢αۺȖ˰ƭ̶͠рh܎¤נǸ˶ܩഠزíѠnȈʪ݀;Ѷ͂સƚęؽļ͓ãࣰ֛ݫऴƑ̻ͦ֨ǕÎÊ‘ÕˆTӦʟšӟÇÊ•ZγʓaÍ’à¦à¾–“ūӟĜͧҞɽȤԹƫڋɯÏÄ„ÓÊ¿Ç¥aʶ޳јޭ^ัʓЕ݋sҋͥ৕ƉǸ"],encodeOffsets:[[-64354,-22563]]}},{type:"Feature",id:"BRA",properties:{name:"Brazil"},geometry:{type:"Polygon",coordinates:["@@૮ନॆࠄ֠΂ۼҪjڤуӞеLJǒӜŖӼBҦ̡ƴ̿Ƌ̻œį͔ýޔƿʤ֥ɪ΃ÇࢱLjÈଜÊҴˀǦăÓɰςƬڌȣԺÒɾěͨŬӠྕ”͑à¦Ê”bYδÇʖ™ӠӥʠՇSÎʒ֧ǖ̼ͥळƒ࣯ݬä֜Ļ͔ĚؾષƙѵÍܿͽȇʩџmرîӃƟϡĪÈ౨ÛÓ·ÝvÍ…Ò„Ö¶DzΰұԞΓݴɜƶA΢ԖʎċҔɊ̈Ôϼ०ֲێNJŔŴݴŸϚᘰpθſӔÏ̬LØӀƒǚē†ÍӯĔYՀ࿖k˦̂ɸˉÇӷǂļҨѻٸÆnjʲشȞΊÆĮΤ׸ʆ¯Ǯ܅ðśՊ’֞ϓɒǀþجŅڜȿÊȤ؀žल̮͎̾ÅʂѪšȜȗʼnσ̀ŵȖϷɷÌÆ…ÜɌыÔϳԬϿЮ¥Ģǒˆ˜ϠƦ˚ɢҬíȲŠҚçøǢƗǘĎÊͺõЈĒӔDZξǥʺɪȊ•ŘɿДÒ͒͊ʴؤӼޒ˺¢ȺҫҼ฽҈Ƒxׅمەʾʩ๤ÆŠࡃٔրà©ÌŸà¶ŠÔ¡Ð¨Ó±Æҫ঎ʶà¿Ñ¹à°´ÂŽà°”Û੸व٪Êܖ‘̦˅˸੭Ɣԗͯ൹ёշஅୡՙोثܯȿgɻءÒ༽ɹಓęօˇͧƫ૱࡛઱ƛà¢Ú¹Î·ÈŸÔ‹à£¯Fೕ͓סÏवʗ঩Ú܅࠯ũطƔҫƽࡓÈЧחҥट๕݉ڗ֯Ͻϥߛ։ӑɷӈψЊӟֲڇҬࡹՠ̹{ࡅٰձę"],
-encodeOffsets:[[-59008,-30941]]}},{type:"Feature",id:"BRN",properties:{name:"Brunei"},geometry:{type:"Polygon",coordinates:["@@ͬ̾܎Ң›Я·՛Б€ǭ˹ϥѦ"],encodeOffsets:[[116945,4635]]}},{type:"Feature",id:"BTN",properties:{name:"Bhutan"},geometry:{type:"Polygon",coordinates:["@@΂ËÃÔ©Û‡{ۿÈՇſޅ͊kǚ֌زҒɈ׸șѺqπɥ"],encodeOffsets:[[93898,28439]]}},{type:"Feature",id:"BWA",properties:{name:"Botswana"},geometry:{type:"Polygon",coordinates:["@@ǜƭ˄ӡॎइήÄD̑ʚՑٰŹ՚Ï஑أݭع˩֓ʧÍҙãƧГÄʽÕțۤБɾΟĸХșȵГЉʧпϑ׻đȇÌüԠӽߚɧŲAរࠤˆ|Ჾش„ಖ͎̎Î՜ͤʮDӂȎưÙ͔ڣ"],encodeOffsets:[[26265,-18980]]}},{type:"Feature",id:"CAF",properties:{name:"Central African Republic"},geometry:{type:"Polygon",coordinates:["@@ۜÚƺɎƔgȾÈà©”ÍΤ͠Ѭ̌ĉÌʂüߺ½߆ϴ؊ࣺю;ÕƜĪΫӜԿF΃ƋΓÄʻ̆ÊٖοҢͻT˗֠ѫΖεɆԋغͩƊˉˣęաpكĘ̹ïųȱ˕}ͧDzधнϥĎŗÃÊ¥Ô•Ø·ÇؙĊ՗̴ۓ˸҉˓͛Ñùדգ²֩ƘԅѻѯޱėÊ›Ϧϧ˔̳Ѡï̠ЇѮæʢċΞÞٴȬƴц࡜"],encodeOffsets:[[15647,7601]]}},{type:"Feature",id:"CAN",properties:{name:"Canada"},geometry:{type:"MultiPolygon",coordinates:[["@@ØŽÅ“ÞªxЯ΅̵Å੥Φȿˬ͆ʸ̎С"],["@@Ð¥càªË‚ޯІ̄î૆É࡮Η|Æ·"],["@@Ñ…ÅൡϢʥ̘ݩ̌Ưʈࡻư͕ҜðȚࢨǿԨŵ߄ė˺̃дЋ࠼ÎΌҩ"],["@@։ܿո˴֠ǵÌ̉ݚɱϰȴ࠼ʵʹ؛טƞņѿʼԷÎ݉Ï‹փǂǾیɻńইܯԅ†צЂ߫Ȳࣙ¹࿅~ŹʠԼÌλɬ۸Ԓࢄ೾Զӎܲ̂϶™Njɫ҅Չ"],["@@@@@@@@߰äʥ॓ܶگͯDԑϪ̵ϮчʾƻτºˎЂŋ"],["@@͡ѳχîəʢ Î͖ʦΆkɈǣ"],["@@à¦Ò§×¥nǿɪزϲ଼SiÇ"],["@@ƼυјżӨɗं˽४ʽöÐؤÞ׶˥ݙ˃ಳȬҽϚ࠭Ò஡ѣ˿Ӯଗăܴдņڌ˺ޔ؈å"],["@@ष¥ȿЪΦҼޖŜپɷXέħřձʛ"],["@@Ô·ÌଉʬۃğଫϘ݊ʼטζࢼʃԎƯʦDžԠÍ"],["@@Gà¡­à«°Ú„à§Õ¥Ê¡Ø­ß¾Ö¥à¢šØˆØ–ܨ°ईஞÃఔūૼй¼зس҃פ҇ŃУ࿩חୡŻࢃʨʣуߵ۽ʓοই֩ளÇÚΡÇձà¦Ä¿à¨‰Ú»à£­à¥Í™Ú±উంƕϜ޻ϼّ୲ǔ༞εࡀ͋׺Ѕ੆ɳࢸΟ൶µࣴąÆܫʼࡋ،ळనߗ٨˚ҔࡺѭೢףѶഎЀ॒לҮהç֭֘܌৷لলࢤνݾ˫ಾגȘ෸ɫࡸć۠ɚ޴˵ਚӣʮ͙ຄÛ}۷˪ਜ਼ގſ،ӵ௖Ұߦऔ֌ϸٺݣબੳघ৙͵Յ૤ÓÝ°Ó“à´‚ÉÕ¢Ëͬ܃ټÅͶͅÖऻØÍ×½Ì൯̗à©Û‘෇ƋᅛǮà±PࢇÃ۱׽ੳω௉૗ॵޡ܌Æഘૄᄈ۪సČݔЫß֟ˊࣟ˜هતп൸ŨࡆीÎØժ̥ਣսᇷÔ࠯ͽयØٓÖÂ܆ฤ۞à´Âƒà¤£Ä¹Õ»Ó†BନÏÊ֛ƛ˧ɚٙىʱٹ̕ϡΥŽËÂ¥Äȹ໽Aà±¥MϛƷࢵ؃ĿßËÍÞ—Bà ›GϛƅƊǑøʯeÄષлࡽſউ҅É@˷ƂĥŦnĔȂ̎ЂҦʘӺǙܴǵނ࢕ЂľƬūĺɳ@ǛƆ¥ȤÇēɥ€¾ĊȡĊćɚٵËڹ˪ࠑ͘ß̨ݧʃËSਕɔڻʼnà Êºà¡«Æ†×•Â¾Ê»ÆœÆ«Ò¤Ë³IEÍ“áƒBá®Aá­¯@ᡃ@á ¿@៙@ᢡ@à ›@á @á›·@Å‘F྽ࠜ׵δຽÎҳݖŤԨ੻ΨƧڴ৭؎iѠҲКwՌෙ՘࡭ॠÕ׾ޑϚ֣ΈѿѢࡇ˕ࠇҹݛւדπࠋɸࠟ|Jâ·ŽNᷲ༬ȭ೘Й࢘û݆ΖৰˀఢĹ఼τ൘Ⱦ־ΑظȠȊЄ׈ęෆݫ૦֬ŖّਔÆ͆ʖৰ·౼Λዸ̭ୄƛࠖÄଊÑà®Ð·àº¶Ç·á—˜Ä²Ü’ƦࣆԋࣴьࡩΦժ˼৾žڦĎڴȩࡊҗरä๢ϛಬƄ௬oĭԺݞƦದ˵Kß‘Õ–Ú Ú°uϞࡊ࣑԰কͺäघশ؎ૌƇࡘχଞॅݗЭ༠Ç"],["@@нϿሎʬୠщॊіÞ˟یࠛфΒ׭ࡰ݊Ŭ࠲Ƈश͹ՆࠉʼץථеະЉÄσൡã՚͓˱ູ̯Ƃฃɪঋ»ཅ˷ᒃű๻ÄҕІଫɮݙģਛږ֔ĚಘƜஈ›રƦྷȞᅗã஗jѷ̴ዎͲಗ[ืɚ۶ـגͮᖬԠ࡬Nj"],["@@݉ևಹך˸Ş૸’ٔÈ"],["@@öɵࢿ|ࣟjࣿőʑ¼à¤Ñ¾Â˜Ì Ð˜ÃˆáŠÄ›à¸ŠÒ£"],["@@ڎԽޤڴᒆΈ෺ࢅůջဒʒߒͮሀыୄÐŊν༚È࢘՗áŽÍ©Ü¸Í¹ß޻໯ϹጘչೲÈீޙೖÇʽכ้ঋਗά೓߲ઙĿÅӕࢪӥଜϯΌɟմࠩÌ׿੕ɪá‘ڨஎܣ࢔ԕƎ̉ᗱͲᅩӤ৳Ц̌ʂయќ௥Т`Ê‘á¡Æ…܃˾ֆؤ཈dႸņ˫̜̊оચࠊɳϊ͕˾౿Рá³ËºÕžÉ†à¢·ÔºÝ‹Â´Ú˸҇ʛ຿ŅáµÈˆá„«Êšà´¹Å´Û¥Ì࢞Ϧà®Hˉ࡚٦ݨࡺ΄ᓪɢأի"],["@@৊ǯຄńɖʑ޷Е౜αƱݳàµÍ—߳ê׉͎á¡Ù®jˎ႖Ľà¤Õ¼à¦¸Ð "],["@@࣓عय़ŒԽ݆`кѮΨ࠰ɮც‡ྈȱళݟ৉Ç"],["@@á•Ð™Ñ·Ï‚ኹѺήΤ׌ؘܰւࠑԦᭊƀ஬ǧᒰ±ࠄʑࣖÎà©Éƒáןਫי@ν"],["@@ҙ͙à¯Ã˜à§±É–҂ϚீɨܼÌ̬ˇ"],["@@ٞϵ€љϣس൱đࣗƈjÓ¬àµÃÃٮࣜౌ˺ஂµÜŎ"],["@@̙͢ݠƘࢢ™ƪЩÔЋ᭗Žᑯη౩mŅ˜პϊ④ij୯Ʈପà ßˆÉ¾á›„˳๶ӻฺÛறߨޔ̪ࢄĭ˲Ð"],["@@ढ˓ကFܨˡȑÍ८ÈՔȧଊ™௬ë೸ǼႊðീÃ࣒ͅȊÎԽɟభǷ੽ĸᜱŻႫcഫļá–˔̃ҦĹжࡇξ჋ĺঅʼ͂ΈႾÃ"],["@@ŗ٣٩̇޹£à¼Î«à´Å¹à¬—Ǽ@@ුؼႮծಆ[ସŬ"],["@@Ï£y༽Âɡɼáœ]מƻĵĩ"],["@@༩ʋà°Ë”ڼˎ௮Äஈſ˩ʥ"],["@@৽ÇඉBbŤࡴʦҌÂદÇ"],["@@కǥۃȚέ͂áΎજ‘ӪÅà§Ì‡É«Ì£"],["@@͜ΕàµÄ¤àµ©Ë˜áˆÂŒßºÊ à§«È®Ã•Í࿶ŕᗢ̫ٞÐ"],["@@০˕ଽʟ༇ك๥Óდņࣗ΄^̦ڔɢ໡Oà¤Ë¨Õ‘Ϡ׌ώ׊ʲࡴÎοȖዜ¨੶҅මǵ൞ǃڒև"],["@@ᖢßᅮŅ໤ɫ™ɡá…η᎙ǟݻȉᆬJጡԙേʃ෯ۇႿƓՙǡᡷěୈĿׇƭ۞бߙ˽ಛʃЋ͡୫ʣŞÈà·¬ÂlȳᖟԋᔧɴឿŻధĸཟªĿЖ༊Èб؆ԢÃᖤγ଩բഹLjڼ͘๰Ȩʄ̊஋͠ΥѠᘞ—ڒÄ಼̪ቃĬ᰽Ã๣˸۩ͼগʘÈ˺దLjঘ‚࿲ƌం̺ਬ©ࣤɽٔҒà«ÆˆàºšÄ¢á¢²Â–Ò€ÄášÆšá†”ÃᆒÃ"]],encodeOffsets:[[[-65192,47668]],[[-63289,50284]],[[-126474,49675]],[[-57481,51904]],[[-135895,55337]],[[-81168,63651]],[[-83863,64216]],[[-87205,67234]],[[-77686,68761]],[[-97943,70767]],[[-92720,71166]],[[-116907,74877]],[[-107008,75183]],[[-78172,74858]],[[-88639,74914]],[[-102764,75617]],[[-95433,74519]],[[-123351,73097]],[[-95859,76780]],[[-100864,78562]],[[-110808,78031]],[[-96956,78949]],[[-118987,79509]],[[-96092,79381]],[[-112831,79562]],[[-112295,80489]],[[-98130,79931]],[[-102461,80205]],[[-89108,81572]],[[-70144,85101]]]}},{type:"Feature",id:"CHE",properties:{name:"Switzerland"},geometry:{type:"Polygon",coordinates:["@@ÂƫŹȳϞƵіwá΅χƙةŀǻ͹ÐơƄһ˵Л¡αǶ˽ςБſ^Ï ØšÒ¾ÂɈϤûɲƞ܎MǦǼ࣒ʱ"],encodeOffsets:[[9825,48666]]}},{type:"Feature",id:"CHL",properties:{name:"Chile"},geometry:{type:"MultiPolygon",coordinates:[["@@Báˆà£’@Ô’w˧ͻܛʻЭ‚ӻäØʨ࢟ŨੑҸ࡫Ҏୃशۘǭ୼֗૜̟ѢϬ˘ֺޠΎװı"],["@@͢୅؆ŘĺÉË¿à¢à£µÐ³Â€à¶“ǫ˓ʦ͡ץԹջß̛ރĀ߿ԫࡹϮà¸É”ƵCÞ›Ó‘à pÛ¯ÙÕ·Fޙʮà Ô‰Ì§É£Ý¡ÈŸà¡±Æšà§¿Í·Ç¡Èžà¥¹ÏœÍ‡Ë¡Î›Ï¶Ç™ÄšÍƒÎ½ÇƒÄœÓ±Ì«à«—ѽܓĮыˇՑ٣υôࢹÌ̧֔ÄgؽΒө᎔őުſÝPЙȷݷ̣Ɖ޹Σoॅ˚१ג@@ਲ਼ӔËՒʄӰх֒Ņ෤Φ߰ࢴٰౣʔߞݒ˸ඊतÌѮგÖɠʿ਻ՉŠ˂ல˺༒ϮָÊࠎéूΠ„Ԩപ׈എΤబȗ఼ʤۚĵਞӮਆưྺ˒ნˀሤÕ൘ǩ஄ќɌɦњЬֱÅ؅ѴΡ˅߽Ҍह"]],encodeOffsets:[[[-70281,-53899]],[[-69857,-22010]]]}},{type:"Feature",id:"CHN",properties:{name:"China"},geometry:{type:"MultiPolygon",coordinates:[["@@ԑഓΫÛѷ܂ĩخӶࠜڦَϨʡƣԓ","@@ܩЗÛʺyܢаϠࣾɾӚoÈŠÍσσșӟ"],["@@ฬË঺ׯͼ߃౨Cܰͨ൸ʜѳݱ͙̭˽ः֡ࠇ৵ƪÜ̑ɜܙť঳ѕwLÑթӺͯһಙαƀѹܩŒÐ˂ֽ׭ऑҋۃա୭ʑأϽà£É­Ò‚ϴǭ͞ږ֠ѹѲܷ̓ॉ×ԫթ࠙¡ѓϻѸ֩یÆ„ϕڔʕस׶ݚÍÕ¬uƌѱஓɻϻÒࠇућיࣜҥͦà ÔžÞ“Ö®Ù¥_دՅɯȪ҃ӶʻŻۃɇڗҷ÷ؗࣧڹિޭোିޡୟۻृĩԣÏ̃˘Ӈй୭ÑࢵŹ˻ࢱҭ·ə؎Ȧ͘ૻËЇÆà¡É”Ð΀ƄӜÞƶЙܑ̀҃ࠇīڡJ҉ȳѥūŶ॥҃x÷Ȣ}ÎŽØʓεƸر͂ʔۤÕǎȧޜࢱƓĴাߔۮ”ۚ{٠νȨ˭ӶӭÙࣟŲ˴ΜϿԺ׳Î۵ȸॷ՗އسڳĿοɦѹr׷Țґɇ֋رëڌԟǭওĈोȖڿτٵǔ˯ЖҽŦࡓոکʴΑȩà­×˜à ›Õ’ɽà¤×¾Å‘‚іͭјÄۆࣙঠ൧ͼÊ٦ةϼƫʌųӎˆ͜ԛȔ˟ÄɇިʈȔśȠߤЈ׈Çࢸő͆՜ંIJͮ̚೜ҔŠÈãÓּɔݱฦဘͲјȈ؆ຒဠˡҲϞ¢ࡆۦĀٖ֔͢èɚו۸ѽப̿׆ڱ͕ঙ̢ηূÆଆÅ৪ԻԲġϤޟӲӿऒnჄȉ૤Ŝࠦůఔԛ৮Bόʽà¦ÒŒà´¬Ìˆà°¾ÂŒà¦˜Ì’׾҈ך˰ƋˤË͔ѴըӀùࡺÇ࠸Ѿ౲͚؞֊נʆ௠ÅÚĥĠ̘ݿזګË٥̳ࠣžӇŃÉΆר࠾Цو৚̓ஆՎQτݸࢾҲËWҪңȦۜмਰƲ૜vసʡ݈̱԰à¡Í€Î±ÌŠÔ©Ì¶à •"]],encodeOffsets:[[[124701,24980],[112988,19127]],[[130722,50955]]]}},{type:"Feature",id:"CIV",properties:{name:"Ivory Coast"},geometry:{type:"Polygon",coordinates:["@@Ï£Uוǒ՟Wহƥ×Ê̯ࠫNjvÞۖĄŀ}ͨΣΚˉÈʕɲǾώÄО ʔƄB¸ξÃnjĄŜ̸ĶȹڨȗΎæ˸ǘÞŊúɸųٮOƸʖƢgʎĦžΫȞłΌŰϚǽƦ˥Ϙǯ̎ɄϾŒֺÉɠ஡Ο۷ɕेθܣ›ͧ"],encodeOffsets:[[-2924,5115]]}},{type:"Feature",id:"CMR",properties:{name:"Cameroon"},geometry:{type:"Polygon",coordinates:["@@Ľ°ӻŇÔŒЋÅ൅nŬڒ͟֊ϧƚǟϖɋŦXɶɎתЎ߸ʒRԄӮ͈bҾΉ־˲ĀΔȌͺžь҆ΊǞךDzȊŢѨɜ՚۾ٲ¬˨ĠƲͫͰ‚ˌʂ¶ͮ՟ÊÖ‹ÖҜޅҷTÊÃϥČǻЅӸөμƛŠÎˆ׃ſɩх࡛ȫƳÃٳČÎåʡЈѭð̴̟џϨ˓œϥĘÊÓґڛȤڷɜ੗Â"],encodeOffsets:[[13390,2322]]}},{type:"Feature",id:"COD",properties:{name:"Democratic Republic of the Congo"},geometry:{type:"Polygon",coordinates:["@@»ঙͶŕˑ̗͓ɟÍѫǯϷ±ګțÍOÙ‡Êɹ‹ԃŗÃýҟɄϡÂ৥ưÞċѧǘӣӤҹҒ੕ͥĒ૿ƙɣĵʇՙȊχƫষĻࡇɨƫטÍɲƴìٟࣟR·Ҧ̳ΨٟŠȋѰԣ˅ڧŞ˫ϢՕüϽqµʾÌrϥºԳųιtȻû®ৄ˩̸ÕԬŬԒÇÍ–eՊ৳Qò̢ѕG­ƣԵÂÉӧűȿҫŠˣş։åÍѰȗ˖ʋԌȷض៛\\ÌÄ·Ê‘h΋œşʼɊʀμƎɎ̪ǰɚđ˼ÍÒœSÄʃ̼ƩӶՄӨШɆ˃۔θࠆϬўքМĪˌt̰Ǝ̆«ӊŀݖÇԾʦ҈¸Ԕúה͜ÑҊ˔۔˷՘ؚ̳ĉظÇʦԖŘÞϦÄनоͨDZ˖~ŴȲ̺ðلėբoˤĚԘۙϘķɤƖϲÅҶDzȦΫ݊Ö"],encodeOffsets:[[31574,3594]]}},{type:"Feature",id:"COG",properties:{name:"Republic of the Congo"},geometry:{type:"Polygon",coordinates:["@@̿˾ʩƗͻγÛࢸٖҪ̓֌˾ɂ֦ĺäό҆ЗÝ•ʴЈł֒ÄڀЉӺζ঄ȽǘسçɻѢÔξ੘ÂڸɛڜȣÔҒѰ޲ԆѼ֪Ɨդ±·ԓʥ҇ÇԽĿݕ¬ӉÆÌ…s̯ĩˋփЛϫÑηࠅ„ۓɅËӧЧӵՃ̻ƪÃʄқTË»ÍəĒ"],encodeOffsets:[[13308,-4895]]}},{type:"Feature",id:"COL",properties:{name:"Colombia"},geometry:{type:"Polygon",coordinates:["@@ΫȤЭ˨ʅƅ܉Ŝȱΰƽ_࠿Ӓŕʺ̼ڛтȢ̦иÊΞՆÍѴ̳ȦDŽӦÈÞǸɚƃ܄ͻ҄ņТ˔ÑǂʠțӶĺŬѢـהΌĚT˦ƺ܂ӖϸՊfäǪڂéڌъ͞ȊОК̖»ɚɛÇ˱գƕɇп͗ʋʓ̷Ĺ׵ɷӭѢÇņϭȄÈâ͹ij̵ˆǫȸéȨ̉ઊĄӦŃעܡͼĚ؂­ÓĪ̔ƟƱÒȇ˯ß׻ǜ֑ʆʟ†ȉÑл̨ȃɠ̋ʰ࠹ÇÄ»ÇӸɷˊ˥Ìà¿•lZÔ¿Ó°Ä“Â…ÍǙĔҿƑKØÏŽÌ«Æ€Ó“oηϙᘯп҂ʣpժࡤٟϾÔị̈ƤҧÉصŀӵࢤϳÉËІ֑ЊɡÄ"],encodeOffsets:[[-77182,-155]]}},{type:"Feature",id:"CRI",properties:{name:"Costa Rica"},geometry:{type:"Polygon",coordinates:["@@җȆǟǮĬƤ‰ȄɷȪͥǔÌņÅʖəƮÄʑǗȩȓɸˑĊŗǞLʮŎˆÊŠȖnjŴňֆÉȖŊˊéƔǥʜÇȪDzɈҙ͖ͷЂΩ͗õLͷǪűűıÂƱëǟ©Ǖ"],encodeOffsets:[[-84956,8423]]}},{type:"Feature",id:"CUB",properties:{name:"Cuba"},geometry:{type:"Polygon",coordinates:["@@ܨÑڊW߄˹̭ͮ޺Ĩ̔ȡ܈ԳԺϛˢ\\ԆǟÕÊئ“ٌ΅ıȟ֑Ń֡¥׃âளą֜ҶÎɔէÈ̃ÊÈ¥ÓŽÓƒÂ޵ɦʥǬભž̋Ç̀ɀࠗ¨׿ѧÎ[ťȳеğΫĂѺʸǼ̤ϞȈіǎَĄȰĢ"],encodeOffsets:[[-84242,23746]]}},{type:"Feature",id:"-99",properties:{name:"Northern Cyprus"},geometry:{type:"Polygon",coordinates:["@@ÃJŨȮ؄Yކʢ֧ΧÔƿęˆLJÙűjÂ¥ÂiĎѾNjVɫïƿ¬"],encodeOffsets:[[33518,35984]]}},{type:"Feature",id:"CYP",properties:{name:"Cyprus"},geometry:{type:"Polygon",coordinates:["@@€ãࡱͿЩŊȟͶЎŒǀ«ɬðnjUÒ½jĦŽŲiLjÚ̇"],encodeOffsets:[[34789,35900]]}},{type:"Feature",id:"CZE",properties:{name:"Czech Republic"},geometry:{type:"Polygon",coordinates:["@@ϯǂЩٵʲÌÙҿ΅ر˔ӃΰѕȬėΠƧʠؒǾ̸Ⱦ׾ǎɂdžɜīϒĖЊ˓ؼñ¿ɳҘǧŲɒּĥĄʿز»ϮЯʡCŽƯȕ—ÅȑLJ¡wý˹ēϋbÅ¡È"],encodeOffsets:[[17368,49764]]}},{type:"Feature",id:"DEU",properties:{name:"Germany"},geometry:{type:"Polygon",coordinates:["@@d͗ࡔțS̗ࡢǂҾɰॊͧІˋȞёɹɣ̨̙Ⱥ҅ßÌΈ՛ϑĕɛĬÉÇ…×½Ç̷ȽؑǽƨʟĘΟіȫӄί̑ϯ̟ŃŢշýƛʿǤЕ~×·Æ­Ý–ţɛыɺʩ±࣑ʲǥǻÜNń״ьֺ௅ƸЇɘ´ςǗÈĨ֨ƗࢢԎ@Ɉ͂Ⱦޔƿ˴ÇDz۰°Ƽȃ֮вȓ̀ÂÓˆÙŒÅՠŸ"],encodeOffsets:[[10161,56303]]}},{type:"Feature",id:"DJI",properties:{name:"Djibouti"},geometry:{type:"Polygon",coordinates:["@@ȤʹΑÓȩήɯ̱҇ȅƬȭÃÒ·b_ʮßɶ˴ЀÌϊήñʪȴ"],encodeOffsets:[[44116,13005]]}},{type:"Feature",id:"DNK",properties:{name:"Denmark"},geometry:{type:"MultiPolygon",coordinates:[["@@ԋڹ࢟ӄÅΒ௼˨ˎу"],["@@ȵ̓ʡĞØØɮХ՟ŷًŎͽҲ}࡬Ɣɪʌʦ݌ÀÌɴڮʂƒÑʟ˙ĶɽҘŵ"]],encodeOffsets:[[[12995,56945]],[[11175,57814]]]}},{type:"Feature",id:"DOM",properties:{name:"Dominican Republic"},geometry:{type:"Polygon",coordinates:["@@ŀƞپIÓ¾ÉÉœtÆ´Ì•Ò hÂʡωЮ̷̯ͿÐǼϫ•ˡ¢ƱƵ͑½ŷȲˣťͳֻÉƆ§ʎjɬÉʦȲƚÞ͒óҜ"],encodeOffsets:[[-73433,20188]]}},{type:"Feature",id:"DZA",properties:{name:"Algeria"},geometry:{type:"Polygon",coordinates:["@@ᮩཽá©à¿·à®‡Ï‘टćU՘ϵƌԹʊȧЀᬻᆴᬻᆴṕᎠfÇŒ@ÊQ঺ബب࠼Ÿێɦ͎тচͪ˜جӢòϞ̶સƚƸ͜ɛDz̃ࢲ¹ԞÍՠ߰ҠࣦƢՌΎ߶ʰ෎Ƭർæшůߊͨ࣌P΀Èֺ¾ǟћƄߟȡۙԭҵôمۊԃRȯԮ͹ΪàºË–Ý°ϵƧۇÔϥŃҟòՇͫΗӺؓŽέ̘ҵϼƸڒϷςՃ"],encodeOffsets:[[12288,24035]]}},{type:"Feature",id:"ECU",properties:{name:"Ecuador"},geometry:{type:"Polygon",coordinates:["@@҂غǻξÍϵԉςǞʀƙބ̎ŴƺԼ͆զÃ΄ҢǸ׀Ͱࡀӑƾ`Ȳί܊śʆƆЮ˧άȣŞٓʽճࣷ࢟য়ͧԥܵǃ֣Ӆ΋ΙъͻĞÎáw̮ʈȨıΔ"],encodeOffsets:[[-82229,-3486]]}},{type:"Feature",id:"EGY",properties:{name:"Egypt"},geometry:{type:"Polygon",coordinates:["@@ɽͷǹىɫѩÈƥ˩˔ϛϒ׵ஸđùÎࢯԪࡋٌವ̴ҙ˒ӃݮछǗƣ‚ճ঒ݭƨǣΏ@Ὁ@â©@@ᶶ@á²´Ê¥Ú²É԰Żά̤Ж૦bß²É࠲ʛϴſ٨ˊΌʊݎêװŃɮеȜ˜ڨȣټ³аɄւ෽"],encodeOffsets:[[35761,30210]]}},{type:"Feature",id:"ERI",properties:{name:"Eritrea"},geometry:{type:"Polygon",coordinates:["@@˻˖ΉӰϋ˒Éܷ̄ͶֻXȭǬӯȡԛϢʽط঑ǬęʹβఀĊ֒ˆʴؤÆьӒӦঃɴޗҢУବßÒ²ÓÒ–Óˀ˿аʧʩȳέò"],encodeOffsets:[[43368,12844]]}},{type:"Feature",id:"ESP",properties:{name:"Spain"},geometry:{type:"Polygon",coordinates:["@@¦״΃θஒ؆ਊƱ૾NࣂÆۦªമƒͰ͛໺ϡ̨ǺीÏআŊ®ӥߓ֓àªÇ¯ÃµË±Ô©Ò¯Í•Û͞ӑӟϑǹճىǗש٥੧_ߟhՃ̓ÍͅЩê̵˴ʃӚ޷žé˦̶̀Śɬ̃ʢɶրͳԌδè’ЈƎŬZپϲɪɻфөˆÆÅÓ¹CÉЬ΃ū̥ɇ"],encodeOffsets:[[-9251,42886]]}},{type:"Feature",id:"EST",properties:{name:"Estonia"},geometry:{type:"Polygon",coordinates:["@@ĮӸ̱ÅՓ̘ñӘਫ਼ɼ੔Ũ࣮Ƒࢂ|ŴƣׯÓʞ޵ΫˉۙDܡ̸ÏļÜÆ©"],encodeOffsets:[[24897,59181]]}},{type:"Feature",id:"ETH",properties:{name:"Ethiopia"},geometry:{type:"Polygon",coordinates:["@@ԜϡӰȢȮǫּWܸ͵É̃όˑΊӯ˼˕Ìω˳Ͽàɵ`Ê­Ò¸aÈ®ÃȆƫǽ̴̕ҧ̴Й̛͎ᩨঽۺNᛛᡃફ™ݟףաeɯ˅ַB͹˴ÞΙÊΓ֕àȃĬȟwˇT੟܌ב@˹ˢ@ҾѧƘӻࣴϥȚƧʹÑЦԧÒ˸ÓÒ€rŲʰ[ݲʞࢠЊɾĎ΄ήٜԔи΀ࠠƆܠ঒ǫʾظ"],encodeOffsets:[[38816,15319]]}},{type:"Feature",id:"FIN",properties:{name:"Finland"},geometry:{type:"Polygon",coordinates:["@@ūיಀ֓ޡى঎ख़֡ܛݴس΅յఘֻÍѓޭӟᅡੵໃá๑̯ൃǯӡҞ߿ˠȈࠢСݶÐӪނՆ኎࣮֖Ǭē΢ୟЈ˳͜uಒ಻ֲ૩ЪԊɞतѻલ¦ࣘȭߠϊЬ؞ಬ˶઄ͯΡכ"],encodeOffsets:[[29279,70723]]}},{type:"Feature",id:"FJI",properties:{name:"Fiji"},geometry:{type:"MultiPolygon",coordinates:[["@@Ì‚ÊƓѭԳŗҩļąτ͖̀ϤĻȼÆ"],["@@՛ǯŅ̼оǤˊ°Ӱˀ@ЧՕȷ"],["@@é­@ШǨžĽЗ"]],encodeOffsets:[[[182655,-17756]],[[183669,-17204]],[[-184235,-16897]]]}},{type:"Feature",id:"FLK",properties:{name:"Falkland Islands"},geometry:{type:"Polygon",coordinates:["@@৘Ԍ܎ȿԌʹڦϙʥ̋ଋʥϙ̌܋ϙпϚ"],encodeOffsets:[[-62668,-53094]]}},{type:"Feature",id:"FRA",properties:{name:"France"},geometry:{type:"MultiPolygon",coordinates:[["@@ˣ٭ϡǠș֢ǜ̺ը͎Ɯܛ"],["@@הЅќà݀ϥȊñʎjЈɗெƷыֹŃ׳ɱÆϣü‚ɇؙҽ]ϟВƀ˾Ï“Êʚ̿̅ʯÉٱҖŃĩηݿӅစɬ௧˗ĩԑঅʼnिϞ̧ǹ໹Ϣͯ͜ѢԎdžူà¢à¢¤Ø¥ÑŽà±¹Í’ÄؖઠǾථɡॎߌέዠپʨێܾǞŪ̑ϸ_ϸ͵"]],encodeOffsets:[[[9790,43165]],[[3675,51589]]]}},{type:"Feature",id:"GAB",properties:{name:"Gabon"},geometry:{type:"Polygon",coordinates:["@@ࡹࡔ։ۚԙࢄ‚˨ǾˎȲؔǜخ˴¶௢SOৠЌÆԞőӼňľ¯ÓνɼѡشèȾǗεঃЊӹĞٿÅ֑ʳЇÝ–҅Иãϋ֥Ĺ˽ÉÍ„Ö‹Ù•Ò©"],encodeOffsets:[[11361,-4074]]}},{type:"Feature",id:"GBR",properties:{name:"United Kingdom"},geometry:{type:"MultiPolygon",coordinates:[["@@҉ֽًǦԱ[ǦҊǥ҈۴–ࣔԳ"],["@@࣋ࣧࡦŘऄIɕۅݯݩࢄÃäĕݠ঱ֺƇԬà¥ÊˆÍ§à§°Ç…Ä·ÕѓʗͲѣݱѯ૳Rà·É±Ï»Ç’։ϿޥĪ×ÍÒǘ௼ࢨݪǺOBಽƔʃͰ࢜ʺҡÒdžռఢ÷D@ŮӤ֛Ԯ_\\৵ƨȧɬ̨ϒˡɴÒЇ·߶щє̨ࢆٶھڤá০ì"]],encodeOffsets:[[[-5797,55864]],[[-3077,60043]]]}},{type:"Feature",id:"GEO",properties:{name:"Georgia"},geometry:{type:"Polygon",coordinates:["@@Ųάȿִӟ̲ҭĬ̯ʴĺIJ܄ÆఆƋଦЕƦƻԚƂ޶ǭʴ·ՆșɓřвғŗıÒºصʎȵÆà­Å¿ß³Ð®à£…¡"],encodeOffsets:[[42552,42533]]}},{type:"Feature",id:"GHA",properties:{name:"Ghana"},geometry:{type:"Polygon",coordinates:["@@೉ӯҳ˽ݳʑݡʆœͨηܤɖैΠ۸ɟ஢ŗنrӊฤ¢ϊÕ˔ƊϴáÕʿΖџCØÄ„Úɂ̫ȅݳäйɢՓȈÌ"],encodeOffsets:[[1086,6072]]}},{type:"Feature",id:"GIN",properties:{name:"Guinea"},geometry:{type:"Polygon",coordinates:["@@ʃtÇ¡Í·ÊJÇǴÈͶΗԨɕħǵmɳ³V̮Ƈɘ‚ʔǻΜɹ̜ڥDÈ›ÇɵoÆǷīɹ҅σÏӼ͛͢ɋŊȿǖħϊūȂʓÆώЦʮeɖƘȄDƄŎï˨ĢĖd˶МU؀ȱȄlÚĤҜáŨ´¶̭ƆBɖŒƔƒɸɇάãɲǺ˖ŒȬŠǚuȈÈĴɳΆΙǣÉÂ˙ǴĊŀį«ʡʲÊÇ—Ãå˷ȘÎȺڧ̷ĵăśÞNj·νƃA"],encodeOffsets:[[-8641,7871]]}},{type:"Feature",id:"GMB",properties:{name:"Gambia"},geometry:{type:"Polygon",coordinates:["@@ņόࣶzȎȦˊ`ͨȷʼIˢƚǞÊεȋιdέǰ̷ȗƭQÈ«ÅÞ‡l"],encodeOffsets:[[-17245,13468]]}},{type:"Feature",id:"GNB",properties:{name:"Guinea Bissau"},geometry:{type:"Polygon",coordinates:["@@҅ΘÎÈȕʀLŸʯǴÃǶѼƌ˦ÂɦĨ༈•c˵ġĕð˧ƃÅȃCÉ•Æ—Ê­fÏÐ¥"],encodeOffsets:[[-15493,11306]]}},{type:"Feature",id:"GNQ",properties:{name:"Equatorial Guinea"},geometry:{type:"Polygon",coordinates:["@@ƿŴ़̀െmPয়௡T˳µ"],encodeOffsets:[[9721,1035]]}},{type:"Feature",id:"GRC",properties:{name:"Greece"},geometry:{type:"MultiPolygon",coordinates:[["@@Ҡ˱ٺ¶شÑqƣҜĶĿʛ௃íTÆ’à¨ÇŽÆºÎ¦"],["@@ʹÕȥĥԟ|ѫĀৱɓ׌ҿÑÆ‹Ò³AѻўƿÈÈŠÔ…Ñ€Ð̓ǿҴϯжʑ^ӅޥɠʜѕՓĕ͈ÝÖYÛμ̿ڦƧ֒ÍϮљÓÉʆϸТ¼˚˘Ũjɚռö͌ȀҖgƒƦdž„ت{ڨɲע̉ކĀVмЦÉ"]],encodeOffsets:[[[24269,36562]],[[27243,42560]]]}},{type:"Feature",id:"GRL",properties:{name:"Greenland"},geometry:{type:"Polygon",coordinates:["@@ᬜԆ᱒›ੴ̴ᲈĄ䀦Ŀ㉊ڗ༅͕ộ™â­Ä‡ÑˆÆ«á²Ä á¡šÌ࿈ʴۦÌइӧᒞ̺✘͚ᠼNjҾΫâƒ×±ÓƒÈ•á§‘ơወ¡ছؕگկ€ध৚շಽ“൧ˇ༂ѽȢ܋à£Ã½àªžÜ¡áˆ…ÑঈÎ˟̑இŽ୥E੆֩\\ÏပÎћɣଌȿ઼ԣ͈ڱàºÇ‰Ù«Í–ਣӘ˼֭উѵᕖ•୆¯ᖯܵᗿÚឧÌओIࢅ͓ୟࢱᅵכׅ“૧ȷ஽ÈܛԱ[כыտോڧͺٿϗÛÑ™à à®…½à°Ûˆá€¿Là Ò¢Ö•à à¸à¨²Ñոŗݮ୓ޢ̢ئ֗̒ࠪচొ̺ͨΘǬڀॡ̕қůݯţà¨ËœÃ‰Ö°Í¢Ò‚Þ¬\\႔ɟ෿Քݩ˾࠷ş۫ȼम޴Ô̺ڗ׈ৡࢼ੯͚XΚᖷӮᄻÖᖟ‘á…×ইˌวՈᕂ˄ášÂ¬â‰¹É–቉΄Ś͜ẊИᶎИ̪͘ᗗ̠ܺͰ᯲ז௢ĚΓϘጲɜᣚƂᣖRࣺʽᕺҨá˜Ì½à­ºÃ¡áƒžË™á…ÒŘή"],encodeOffsets:[[-47886,84612]]}},{type:"Feature",id:"GTM",properties:{name:"Guatemala"},geometry:{type:"Polygon",coordinates:["@@ћƦԻfÏ©Ç–ÒÎŒrʖĮȠšƾКۆ઄Ft˸Ƌ¾ġǺ̵Ț̹ˬϜDBÓ‚Þ¸BÞ¦UOڗßॅʤ@˚ƱòŰʘŃϥÍЉɻÃljâǑǧɇȟ½¬ıƿġ˽Ƀ}Å­"],encodeOffsets:[[-92257,14065]]}},{type:"Feature",id:"GUF",properties:{name:"French Guiana"},geometry:{type:"Polygon",coordinates:["@@͉͑ГÑŗʀȉ–ʹɩνǦɈΪòϤƢή͛ӸáֺѪܠ˸ğؤȥࢸۿƔ·ӻޑʳأ"],encodeOffsets:[[-53817,2565]]}},{type:"Feature",id:"GUY",properties:{name:"Guyana"},geometry:{type:"Polygon",coordinates:["@@ր̯ԴյzÑŸÍ„o҈Чͪ̇Ƈݱԛɕ°ȣƹџϊØËAŎӃԢܳȱ‰ҫî˙ɡϟƥ˅—ġǑЭ¦ԫЀÓϴɋьƆÜɸÌȕϸ˿ŶŊτțȘѩ™ْ֩ɬɲiϲԬƊȾƾ˽̸ô̬ږӲ"],encodeOffsets:[[-61192,8568]]}},{type:"Feature",id:"HND",properties:{name:"Honduras"},geometry:{type:"Polygon",coordinates:["@@ơˀʭòÃʹŗĞǣÒσij‹ŔʩƈǷǚʛìǨɈáǒÃNJЊɼϦ͎ĔÂȂƨʊ\\þ垦ϸùϲv˒ĢİĦˎ©ȪÉɘnǖòϨśƄkʲƿÊį̏Źɜɳ˽jśŕ̇ŋɃAȅŃǙœƛźĕ{ŇȩăRaǥ̉ɳƹıđĽʛǞǹɣǫPÈŸqlЭūQĿȓʽ“"],encodeOffsets:[[-89412,13297]]}},{type:"Feature",id:"HRV",properties:{name:"Croatia"},geometry:{type:"Polygon",coordinates:["@@Ȳ͗ˊʇ͓̓ÏȆׇ[ܟƔϽmǻǧÌȖǫΑЪϽǼʹϮ̽͌ȃ͆Ηݔ͇ġƛ߃̶ӣ̢ޑʠ۹ؤǞØϥΞe˲եƄʱγÊË®n̆Šbג…Ƹƚ˸ÆͤgGɼ̈ĒĈͺڞɠˊĻؼέۜlj̼Ų"],encodeOffsets:[[19282,47011]]}},{type:"Feature",id:"HTI",properties:{name:"Haiti"},geometry:{type:"Polygon",coordinates:["@@Ԣ™ܰÆôқÃ͑ȱƙɎʥiÉ«ÖƜЅÃԡÔϽƿ҉ʾö˔ޜśيã̢ȈϧθP͎ՋžȌɶ"],encodeOffsets:[[-74946,20394]]}},{type:"Feature",id:"HUN",properties:{name:"Hungary"},geometry:{type:"Polygon",coordinates:["@@˨ըÇǼӂDÜ΄ђɋ̲ğ۸ļäǚͮ~ЦžĜÃЂŀȠȢˠ¼࣒ʭǴĒҲɭÎɣԡǭЉ֫ԕ֭کÇԽš١ə̻űۛNJػήˉļÇË´Æ—V"],encodeOffsets:[[16592,47977]]}},{type:"Feature",id:"IDN",properties:{name:"Indonesia"},geometry:{type:"MultiPolygon",coordinates:[["@@Λeà«×šÞ´Ç’Ѵʭ̎ʭ»ɩ"],["@@Ü™ÈijĶø˸ΰԢࠨͬÄÇ“fʫշع"],["@@̢ɣԲèȼΥॿǛ׉őÒPÌ€ÓšÒ¤Pɤ̖"],["@@ūұ౅ʅૣľE̬ښǪՂʥ֔Üݬ̮"],["@@ྔċȂΌ༘З̪կీƵà¨Ó¿à¥ŸÍ‹à¤Í¸Ý»wà¢Ã˜Þ»Æ°à¦…ÍŽØČΓÅ໕ΌƣΰޑØּߤ৶·ڴ͡ΒÛŘ̗"],["@@ÑֱćنƬ̠Ǭ˴ȒʗCÐ"],["@@̿˥ׅƸÇΰࡘ¢Ⱦˣ"],["@@̨ÙۿΌۯìӃÅׇˆȦҦਠ”ऎʕ"],["@@ɼയ࢈ԉ۰ࢼ८ԔݜBܘ̉خ̛ࣘLJbá©‘bá©‘ÝŸÛ࡟ǜȷʇ੡}ΦۂՈɺɕࣲЕ۸࿃܆ۗêృަʛУ͑óÈÌ®GκٛЮ̢ࣞ״gëɠ௵DͩԄݥƺΡдଈȰњ˜ഘ·Ƃ̹"],["@@ڭ࠭كlj߱Çඓ¥ܽŧţÙݪݛҒϠ༪˸çϯλŪιӯ͙݉ߒ੿Ƶ˿ݲॻQտ҅ʙ͡ÌМی࠙͗ȻɶŊ͖؅ӲØࠌ֕ʭîও”றՓũίʚʌޜŽ߸ΛPʻֺΎվŤښф౎ǮΎ܎ذپʛ੖śॴ–ࠨ؎Ʀȉ"],["@@©ܽџĈŷÔΌѷɽĵ͹Ւʟ੺ǚڤ˨̨ÔÒӸóĀ΃"],["@@सާহį˫ֵšݿַ߱u࠷͕౻ŭ̚ॕϙͫԤ׳´лËৃ̟̩Оս¯ۗĬŹૺнɺЕܘÅ݀ĮުԂÖƖָ֗ӅըǠ՜ÑӪъЖôߒɽۆǶњୠ͔̈̆क़ॲ@Ü°Æ™Óݷآߓơϭ"],["@@छkۻ۰અۊέԚÙۄзؾٕ୴۪݅ʙܠ̳ڀݵՊѭܘمҺࢗऒóђզ‘ಢNjݔࠓٮ֫ҪΓߔࣙࡢ_ۺֹӠ۳٘ϥͳۉӖ̞̅sƜו̊ҵؠõФÕÉ਱‘ಟ"]],encodeOffsets:[[[123613,-10485]],[[127423,-10383]],[[120730,-8289]],[[125854,-8288]],[[111231,-6940]],[[137959,-6363]],[[130304,-3542]],[[133603,-3168]],[[137363,-1179]],[[128247,1454]],[[131777,1160]],[[120705,1872]],[[108358,-5992]]]}},{type:"Feature",id:"IND",properties:{name:"India"},geometry:{type:"Polygon",coordinates:["@@ࣚটÄۅͮїÂѕ׽Œɾà¤à œÕ‘୞חՑϟ͛޻ࠀͅߊЭરһସʼnӜёٮÄৠÈÛªbĪͪŋՖÞβԠǮìڋlǙކ͉Ոƀ܀Çۈ|ÃÔªÎˎڴŀވشॸ՘۶ȷ״ΞЀԹ˳Λ࣠űÜ͇ÌƷèԫ׷Ʋછׅ~ӓҩ۵§ХÏÛ—ÚÈ’ÂࢇÈ˹ĚΣгȥѵ೰ɵEÆÕҡѦʸӎϖ¶ϰ܆ÓƜީ]ߌó×Б¤ڕζ֭̓؆ѻԿ̻ȅ̩Ԭɣƛԑ̆كžەţֱ̫Zਛǩ´ك҃ӻ௃֡ळ঩كՋ࠷ջCϭлȹݳÌϽ«ʥٙǪધ®ۡΣߙI෗ѣ¡ϣٙʰˣދʃ˱֯͵Êߑ޸ϳ୴͑ࡒÌЈѿ߰ȻੂơՀޅ଼Α࿀ʣ੾HৰÇ޾௣ԉףĶ઱৲И̤Êͤড܊֖֔ᇜCǗܞҽюĩ٨ջϘऒࢢঊÙ࢞ࢢՄ࡞ࠄࡈ_״ܒӠڳд֪݂̇̕Ьβ౤ȱपŰߺ۸"],encodeOffsets:[[79706,36346]]}},{type:"Feature",id:"IRL",properties:{name:"Ireland"},geometry:{type:"Polygon",coordinates:["@@ƒ׷ًݣ๯ӹ஑Ŷڼ࢚ѭࡢତڄٌϼǦ҇ǥ҉Բ\\ٌǥ"],encodeOffsets:[[-6346,55161]]}},{type:"Feature",id:"IRN",properties:{name:"Iran"},geometry:{type:"Polygon",coordinates:["@@݈njװӔ֚{τƾװýघÑڤğ।ݓظ‰òۻÎ਷ɱؑκŭΫҡˠڡàՓÙƙæեݿݿжѵ͸ԓߦυx݉ДƋêϯ௉ѡ̓উà½Êªà£·È–ेŊΧà¨Ð•ÆªÙ£Æ­à¡‘Ðਇ˦ࡑ٦߳ʈ֗ߘا૪ÒƋՕ˦̻ÍÒ­Ñ´SÒ‚Ë@ÆØŒÑÙ”à¨Ò¢×‰ßœÈœÙ¾Ñ†Ì‚ÙӬտʨխ৊ҟڨÇʼʿ६ּʈƄͅъϯ־ő̤~রئ̀ØʞʙÌгԼѱȾ¦ˈإߖǩ׎у஠ƟಾɞĄȞ"],encodeOffsets:[[55216,38092]]}},{type:"Feature",id:"IRQ",properties:{name:"Iraq"},geometry:{type:"Polygon",coordinates:["@@րʧÚӫхÌțٽ׊ߛ਎ҡўٓÆØ‹ËŽ@TÒҮѳӿ¤֟êØ߭༟äá›á–ఫךৡɪ͹৾ᇶ࢔͆৬ÄؘҢȺјԾΰž঎ŇÌɉЖƚծ৉"],encodeOffsets:[[46511,36842]]}},{type:"Feature",id:"ISL",properties:{name:"Iceland"},geometry:{type:"Polygon",coordinates:["@@șիॊֵથٙá“ֹܣƵૉŮᚑˈࠠψᆧЪ๪ǎ—ʘᄋȜ֨նౠŰಸ֭౨Ҝ੒ʃൌ҄ආÑ"],encodeOffsets:[[-14856,68051]]}},{type:"Feature",id:"ISR",properties:{name:"Israel"},geometry:{type:"Polygon",coordinates:["@@ƥ˅̣Ŝǫ֓ɂĥɋř—ɛЄŖp͛нഉÖ෾ʔˢ˶ɞϼǠيŤɆzVˬCþƦɤ\\`·ŕŵhM"],encodeOffsets:[[36578,33495]]}},{type:"Feature",id:"ITA",properties:{name:"Italy"},geometry:{type:"MultiPolygon",coordinates:[["@@̟ڋŲʹǭÑÙÍ„Ñ‘Äžà­©ÑŞќজûࡪĠْò"],["@@Ԍ׭ş૕ϣÂÎ˫͇ɞ‘২ȓӒҨ¥рʼ"],["@@à®°ÉÄЯȬΧÚŪÛ̗²зĻʇˠё߀чцۛदڱچLȲȃɽǗݪ̥ؠʩܜѫĔƿƽ̛үϼܳÆÎի؈̷ıѫΗ¹҅ܛΕÃHʲǢҊǼǶÍӤʱшΑŀʛδգƴεͶثÆٿϜޑմ֯ӜʿࠪйĮÛˤϯŕÓϵΓÕĪθҕńÉٲ̆ʰʙ̀”ʂβǵМ¢Ҽ˶ƢƃЀǼͺتĿψƚâΆԘšĮdžࠨƤȊ̉"]],encodeOffsets:[[[15893,39149]],[[9432,42200]],[[12674,47890]]]}},{type:"Feature",id:"JAM",properties:{name:"Jamaica"},geometry:{type:"Polygon",coordinates:["@@֢÷ҀȫƔɯןeʭƗҹƊӑ̪ĶȔΜÎȒƒ"],encodeOffsets:[[-79431,18935]]}},{type:"Feature",id:"JOR",properties:{name:"Jordan"},geometry:{type:"Polygon",coordinates:["@@Ʀˆपͫ࿪ࣆͺ৽Džųá…у࠸࠿ˣƛƑ˭ٙřȩ̡εʵधƆƒŨоഊo͜Ůʚ@Ô¤"],encodeOffsets:[[36399,33172]]}},{type:"Feature",id:"JPN",properties:{name:"Japan"},geometry:{type:"MultiPolygon",coordinates:[["@@ņ˽ҿԕΉËљțÉӭշʈRЊҬԆӌīΊΜؠǹ"],["@@ÍڡƤÑѩף੹Ѓà¹Â½à®£à¥¡Ö¡Í”“غษȃষЃà¦e࡞أ֗෗իÎÐ͜ȶݶÕÊ’Í¿Ö¾ßʶѲՈࡌѢ؞ָာʤ࣎ǣࢠ๺֔Б௾ࡀӌ͜ՈਈƟा΢ՎࣀƸҞୗ}Ú»Þ¥à¡bà¢"],["@@נǵרΤȈहà°É¯Ý࠱೓ָқà¤à¤£]ř࠴д٨࣌²ʖà­ÊœÙ¼à¦¨à¢“٤˯"]],encodeOffsets:[[[137870,34969]],[[144360,38034]],[[147365,45235]]]}},{type:"Feature",id:"KAZ",properties:{name:"Kazakhstan"},geometry:{type:"Polygon",coordinates:["@@ӕƹà«×“ο׹̹KɱЊ੫‚ǡێХNÚࡆ৓ؘ෷ßডũߣݶۋ͆ಥ׼ƽðᓗӹÂᶽљ£יچ֧ɼॕǩχ˧±ȲȶΖDž̊অ˺ϛݮҩɆ…˜ࠊÄŽؘ܎ƎܼűƲࠎƭԲ࠿£Üȴঃσ޵ǭÑÆŒÄўՙ֘دw܉֬ӞÙʕǢڢऊࡺӣŀؘჄࣴಾtᇢ׉঺ͻࢼΠ೰j੺ѥʔʠ୼—ɂЊഷ׀߮Цƿɮ߮ɔ؅ֺϬ˼Ḯ̈ШȺᑆ̴ݰΒຢǹ˄ࢉ࢚Ȳઆ˹éÒ߮´ᑌߎ̭Ë੶٭ሠᒑ҄ѰୄӛீɎҪƯКӟטNjΨΥ઎ŒѾԣٕ֓ۥÿ¡ࡅұÏဟˢ؅ຑїȇဗͱݲลֻɓäÓԭŬу̠à°Ä–ඃx̧ġ஥ΞӉǧŽӹ൩̂փşȉÏ"],encodeOffsets:[[72666,43281]]}},{type:"Feature",id:"KEN",properties:{name:"Kenya"},geometry:{type:"Polygon",coordinates:["@@ӾۙיͱȹΕ̿Õšףˑ͹Ç֑ͷ˥஻ࡀËӤáµá‚ŒÆ™Ä¢Sࢺʊ;а֌̨ؔσ॰įтЉ׎ԬԈ֬ֆѨƗ@ҽ˺ˡג@੠܋ˈSÈ xȄī֖ßʞΔގΚͺ˳ָAܽ॑Xáµ£"],encodeOffsets:[[41977,-878]]}},{type:"Feature",id:"KGZ",properties:{name:"Kyrgyzstan"},geometry:{type:"Polygon",coordinates:["@@ȊςքŠ൪ÌžӺӊǨ஦Į̂Ģ඄wఞĕф̟ԮūşÈ೛ғ̙ͭàªÄ±Í…՛ࢷŒׇÇߣЇŜȟʇȓཟŵਡ˘࣫ÃĂӜࣴƕ̮ʸٖĉ੾؂঻ѸױȽإ͂۶ծʟĊ"],encodeOffsets:[[72666,43281]]}},{type:"Feature",id:"KHM",properties:{name:"Cambodia"},geometry:{type:"Polygon",coordinates:["@@ÎѬыࢄȣ২ՠۨઘdž߀ťۚ͡Ϟׄݖ̱Ȝ֕Ļ৕ඳ٧τԙࢥÓܫͷ۱Ū"],encodeOffsets:[[105982,10888]]}},{type:"Feature",id:"KOR",properties:{name:"South Korea"},geometry:{type:"Polygon",coordinates:["@@ܨযȺխPॷ̓ҥݽljڥÎݳïĥҚƼـχ࢔ذƚֻܘÂúϒ‡͞Ϝצ¢ΨÈŨȮ"],encodeOffsets:[[131431,39539]]}},{type:"Feature",id:"CS-KM",properties:{name:"Kosovo"},geometry:{type:"Polygon",coordinates:["@@›ǣŃPĘ́ȩÄdzɦƾȌȪÒŜ˨ư²Ţşƾ¿ŌƅƒŸǎƻŢLĥȳijij„×ȉÂӹŻ"],encodeOffsets:[[21261,43062]]}},{type:"Feature",id:"KWT",properties:{name:"Kuwait"},geometry:{type:"Polygon",coordinates:["@@Ǭχõȓ˔هשuȽÐݟĆ؞߮֠é"],encodeOffsets:[[49126,30696]]}},{type:"Feature",id:"LAO",properties:{name:"Laos"},geometry:{type:"Polygon",coordinates:["@@˚Ϝœ܆ڹܸ¿ٕࠦھÙÎǛ̉ӯyʣƨࢯԅoݬȸࢮ֧ž³ԎηʸǴ̲Üնøȡ҄wŵ०ѦŬӮÚϖޅਚO͚ܹÕɗʉ̟৔ԉۦ঳Ռ݋َ×ɄץƵ࠿ݕ̲Ï׃ۙ͢"],encodeOffsets:[[107745,14616]]}},{type:"Feature",id:"LBN",properties:{name:"Lebanon"},geometry:{type:"Polygon",coordinates:["@@É£[ýƥ˫D̘ۄмעfˆϘ§Æͣқ̓ȷҟ"],encodeOffsets:[[36681,34077]]}},{type:"Feature",id:"LBR",properties:{name:"Liberia"},geometry:{type:"Polygon",coordinates:["@@É—QࡽÐÞ…Ù–ÜҢ֣ըȪˬʔϜҘϺϺǶnɖĨΘԧÇ͵ÇdzʂIǢ͸ʄsŸʓĎÐǽÏʖɱˊÇΤΙ~ͧăĿÃÛ•"],encodeOffsets:[[-7897,4470]]}},{type:"Feature",id:"LBY",properties:{name:"Libya"},geometry:{type:"Polygon",coordinates:["@@ק̷ҿҤ೧βÏՄڑϸϻƷ̗ҶÂήӹؔͬΘñՈńҠÓϦƨۈ¯϶˕ÝШȜðΠėΒ־͔ʶËЦʌ´٦দÌΜðۮƓ૞ϓЀݛݮÇஆΙࣆйЦɔЖϮț٠˂Ф؄ЀׂŘ଒ǣ˺ϑ̺Iˌƛ࠴ıȲˣ̣ЕżΫÉԯʦڱ@á²³@ᶵ@့ॱGYΙ‧à¾â€§à¾’à¡“ÒŸ"],encodeOffsets:[[15208,23412]]}},{type:"Feature",id:"LKA",properties:{name:"Sri Lanka"},geometry:{type:"Polygon",coordinates:["@@ų࢓ΙʇܵȓÐڜƫீϠ഼׆ұϺסО࢓"],encodeOffsets:[[83751,7704]]}},{type:"Feature",id:"LSO",properties:{name:"Lesotho"},geometry:{type:"Polygon",coordinates:["@@̆ʩʳУƛ˛ҳſƹË̛ċؿ٨҄ÕҖ͢ϼǠξʵ"],encodeOffsets:[[29674,-29650]]}},{type:"Feature",id:"LTU",properties:{name:"Lithuania"},geometry:{type:"Polygon",coordinates:["@@ãɊĚɲχƄࢡƨDZ۸२ʴඬÃࠜĊŞǩ҂Ã߲СĀϓÛËșӃ࣯̓߻NȫʶљĜ"],encodeOffsets:[[23277,55632]]}},{type:"Feature",id:"LUX",properties:{name:"Luxembourg"},geometry:{type:"Polygon",coordinates:["@@ǘȳÏÊiȉòĞҼɖŽ"],encodeOffsets:[[6189,51332]]}},{type:"Feature",id:"LVA",properties:{name:"Latvia"},geometry:{type:"Polygon",coordinates:["@@†نЮՆߊ˼ڜعڪhÇŠÙ¤ÜƪςĻܢ̷ۚCКȕîС˒ӷ͕ࣗԛƙ߱ТÒÄÅǪࠛĉණÂ१ʳ"],encodeOffsets:[[21562,57376]]}},{type:"Feature",id:"MAR",properties:{name:"Morocco"},geometry:{type:"Polygon",coordinates:["@@ԒΥߜÎࢊȃκU͂՟ºÔ̄ࢱɜDZƷ͛ષƙÏ̵ӡñ—ثঙͩÍÑÛɥ࠻ŷഫاRহŷ@@@pÒ‰Ô±ÂË“È‘Ï¡@̥Ŋ۹ě˛ٻʿÕÐ੕ୟ࣡ˣୋ΅ϗĵ̡ቅãaD ϶͒ɮ˞ѪÃ˶̀פҴՖ˲ƊɞӬp҂̤Բ̪֔Ւ࡬f\\ц͔ްĢڎָтɠۮۮȿਸ਼͊ܢŔѶդ֨ࡈϦخÎ֘࢈˄ԪؤI"],encodeOffsets:[[-5318,36614]]}},{type:"Feature",id:"MDA",properties:{name:"Moldova"},geometry:{type:"Polygon",coordinates:["@@ȨŮ֒ĊؤʽΊÂϞɥÑ˵̪ÆŨΗ̊ɇÃűƾÄÉ×ӷ|ĉŜǫãÒƭɱËƥ˽ÉÄƯϦĘΪÏ‚ÓԂˉΠʹʠʯĈ"],encodeOffsets:[[27259,49379]]}},{type:"Feature",id:"MDG",properties:{name:"Madagascar"},geometry:{type:"Polygon",coordinates:["@@ɠΥȺ։Ɗà§É’ϽĉЗƩʙ˷ӰÇÊLjثõΥɵȗ¿܅ͧওб୅ԯཧ͑ୟϛইÛȣܻΡӛɊڙ̜ɳѺÇݘ̑ڠù؂Ʈ؄ϰƢD˪ДÙø՚șЈǃՌãޠ̊ҺŔՒмŒҶǤ̶Ʋτ\\ÓӎۖԮʦцŗάΦĵҪ׎fÔ˦ϔ̊ί"],encodeOffsets:[[50733,-12769]]}},{type:"Feature",id:"MEX",properties:{name:"Mexico"},geometry:{type:"Polygon",coordinates:["@@͙݅ƥØÕ૷ąЧƤқʺЧǚٳ֎سȞÓ͢бࢾÉÎΙ݄ɾٚĎؼưՊƠՖ΂ȨӬè۸Ƣʖ֬ɚࢶȚݔ‡ԚîȬDZ…ЙҋÔÈ¥ÔƸƥűγÉٽɅɎǭcǃYÌԓƳIJķÂPÅ­Þ¥VÞ·AAÓÏ›C̺˫̶șĢǹƌ½s˷ઃEЙۅŢƽĭȟqÊ•à¥à£žÑŸË˜Û‡É–ҷÓګÍчĉץɜؿDŽ޹ϬؿŠà¥Ï¸Û±Ð’Ƀɤҹº࡯ˈΓϦࣗӊÑՌȧЦ˪ĈđʈȖɔJ̄˱Ϙùͮ˭ъ݋࠴ࡋڀУԼÜ΄ƷȴŸԲѓȞӹФȽהÒæӣѸϿФ™ˀÒو̓٠^͔؇ͬ˫™ӑɴƇͿƔЕĆÙ̀΋خ׃ȡŸÓŎ˽Ƭ\\ǜթʮɇǴ̕Նё˨ޯʠÏɸϿ²ѷКƒͶϡ̨ϑqÆ­Î̱ƫJɛԞջӎ؃РїɈ„ؚŵҖÐʺֿϒÅŇɃɖԭȰӷӦÖÚΊ³̸̼ŽϜ٩׶ӱɶ̱Հ̷վϳڦͿݲॖÞ੪ĞÿǑ౔СኀףဪPÚ˜@DΌผ@̪̕јˇԀσ˨ѭȾҥѢʩۤʥՊڒۊhפͱфֹ̄ӯӸÓȂחɾЃپʹ׮ÈÍž|"],encodeOffsets:[[-99471,26491]]}},{type:"Feature",id:"MKD",properties:{name:"Macedonia"},geometry:{type:"Polygon",coordinates:["@@Å„OœǤӺżȊÂ˺¶ϴbÑ‚ËÒ։DžƒƑƥҕh͋ǿջõΑȴšήń˸"],encodeOffsets:[[21085,42860]]}},{type:"Feature",id:"MLI",properties:{name:"Mali"},geometry:{type:"Polygon",coordinates:["@@˰ƶƘӶˊpזɻӄǖ͖ÇŴȈâš^ȈךƣļЛ⋈Л⋆౾dᬼᆳᬼᆳȨϿԺʉ϶ƋV՗ठĈFካҟ֗íԭݛƃ଩ï̳̗աÂÕŸIȿLjҥš޻ΑDžʿٳϕŗÉΙǡÐŔɱȳūֻڙۡp˳ɭΣÆӥ΋ůÈÅŽάÊĥơhÆ·Ê•Ù­PɷŴʼnùʱʎ¬ʢĿİdzĉÂ˚ǤÉ΅ΚijɴȇȂǙvȫş˕őɱǹΫäɷɈƓ„ɕőƅAµ̮žʾí̽͘ʀǓӔÂÔº"],encodeOffsets:[[-12462,14968]]}},{type:"Feature",id:"MMR",properties:{name:"Myanmar"},geometry:{type:"Polygon",coordinates:["@@ӫηץ›ϥࣥΟƳО݅ՔؗΈօ̭ܵ̃ƹȪу֖ڙĪҷ_ϵ͠ދң޵Сࡷăذʴ٠˯ӼæࣸͽѤ˛৔Ʊਗ਼εۢօуॕ׳ҽöԳȠ̂ਪǫ޾څॺļ̢ӭņ׭ۆÅڰ̊ŵj׾дȦęΤÈ˺Ž࢈ڂȑÏۘ¨ЦҪ۶}Ӕજ׆׸ƱçԬ̎ƸÛ͈ӮÚˮӵξȧ|ٟ“ۙߓۭijঽࢲƔȨޛÕÇʓۣزÍζƷ؞ʔ~ÎÜյdẕӓȗ"],encodeOffsets:[[101933,20672]]}},{type:"Feature",id:"MNE",properties:{name:"Montenegro"},geometry:{type:"Polygon",coordinates:["@@ÃǀηЯÊˋǫÞɽ˞εǖĢƜŬҦ˚ȜƾüɠƟŬśˠě͌ǧçïƽȋɧó"],encodeOffsets:[[20277,43521]]}},{type:"Feature",id:"MNG",properties:{name:"Mongolia"},geometry:{type:"Polygon",coordinates:["@@ࢮƢ྄ܤ౬Єܴʳ࢚]֘Ͻ࠼‰à¯ÉࠈגͿӶࢊࢊशÎނįনÉLjؿஜΛßƺਫ਼ŌࡆÅࠖЗԚѕެT੒Ƌޜȼૈƒ௸פԌÄѰ˭ৌêХهק࠽É΅ӈńࠤŽ٦̴ڬËހוğ̗ÚĦ௟ÅןʅØ։౱͙࠷ѽࡹǞҿúѳէˎ͓ƌˣי˯׽҇গ̑ఽ‹ഫ̇à¦Ò‹Ï‹Ê¾à§­AఓԜࠥŰૣśჃȊऑmӱԀϣޠԱĢ৩ԼଅŞà§ÆžÌ¡Î¸Í–চׅڲன̀۷Ѿəז"],encodeOffsets:[[89858,50481]]}},{type:"Feature",id:"MOZ",properties:{name:"Mozambique"},geometry:{type:"Polygon",coordinates:["@@لæ৞Êɖńגt̚ʦԌaऀ͜ڞӤƊϕ“࠷ľ݅ÂಿƨЫʣ׷͙×Õ—ÔµÞ͉ृСॉ͓ࣕƵוׯ΋ȗí׳ЌÙǔӱZʣƪ¦{ࠗƋϷȤÆűΓΗ̗ۗ˳য়ҕÏ̳ðΟɊÉíѵّRïϊůϖí̠ƬपɓװГஂࢬ॔ɜ؆ŶúĨӶƉʞ˜غÇ׌E੠ѥ˒ÐÔǹȼϳǰ۫gÅ̼ÄװᢈۘӚЕɴüͨɅ¸͵ǯϷØסոԱʲ׌ζǰíઊΙ؈̣˖̅]ɽદɾٔ"],encodeOffsets:[[35390,-11796]]}},{type:"Feature",id:"MRT",properties:{name:"Mauritania"},geometry:{type:"Polygon",coordinates:["@@և־ԗؤÖɞГʚҵUЧǽйð˽ËïÒɺаŀߊģࠨĵкČмɑЎѵδǾˬᾔMǃ௎ȴќ߀øÂᒸ᪂©F౞Ṗ᎟౽cМ⋅М⋇ƤĻȇיâ™]ųȇ͕ÈӃǕוɼˉoƗӵ˯Ƶ"],encodeOffsets:[[-12462,14968]]}},{type:"Feature",id:"MWI",properties:{name:"Malawi"},geometry:{type:"Polygon",coordinates:["@@ɽٓɾથ̆^̤˕Κ؇îઉεǯʱ׋շԲ×עǰϸ·ͶͧɆɳûәЖѵɔʮޮ˄̈LJۢǚڼƞɪɉ܌ЅÏ࠘ƽǜɵ˶Ϲɾଡ"],encodeOffsets:[[35390,-11796]]}},{type:"Feature",id:"MYS",properties:{name:"Malaysia"},geometry:{type:"MultiPolygon",coordinates:[["@@àћֈĶ˞ΈȘýӸԓΜ֛¶֣ęϡĆ˿Öӻ̒ɵͤݑe˳׫Éߑخ঵ښįђӟ֚ś̡۠ҜĠؔȃΤƤƮۈÏ"],["@@أ˹ܯƚॱ@̅ॗ͓̇љୟۅǵߑɾЕóөщ՛Òէǟַӆƕ֘؜˽ٮǀǜ܆άǂ৖Ǻ׾ڔЬÕϦѥǮ˺В¸՜œа٪×шڀͼHќыžιֆɻ۬ʧÑ͡Ö¥ƮЧ"]],encodeOffsets:[[[103502,6354]],[[121466,4586]]]}},{type:"Feature",id:"NAM",properties:{name:"Namibia"},geometry:{type:"Polygon",coordinates:["@@رٌؖ͡ȃࠊȷ،˯ಒm৒ŅҞ͛Όѡۜѳ৘ǽՆۃà Â»Ù¢ÐšÇ†ÔŠÆžÕ°}Ô„ÏŶÃ₮˜׌Е᎞ş໴΂یȒհµͨÈPéÓÈÊ­C՛ͣÍΎಕÌسƒ{Ჽࠣ‡Báž™A᷋ݣѕҋÕՇDŽϗÔƗάͩɰГг"],encodeOffsets:[[16738,-29262]]}},{type:"Feature",id:"NCL",properties:{name:"New Caledonia"},geometry:{type:"Polygon",coordinates:["@@ÛԵѨϭ͉ȫҥɪ׹ϚէѼ։פś˶β[Һ˹φ˷ˎɻ"],encodeOffsets:[[169759,-21585]]}},{type:"Feature",id:"NER",properties:{name:"Niger"},geometry:{type:"Polygon",coordinates:["@@nּॹÈОҿպœϤâТբÂ̴̘ପðݜƄîԮҠ֘Eኬஈϒáªà¿¸á®ªà½¾à³¨Î±Ó€Ò£×¨Ì¸È¸à²¯Ì¾É“`ˋΔ˽ǻί͕á»Â«àª§à©³ß‹Î³à«‰Î”̵CÕ¥Õ¢mÄЃÊµÂË‹Æ»m֩ंȟ’ÚҷٱʔÒ¸ÊÅŸÓ¯~ӷΧѓq৯ѢЉȵѓb̿͆ࡅ̼ࣗıɕǻşӗʋ͹ÃݣٗӚ̟EË­Ê—"],encodeOffsets:[[2207,12227]]}},{type:"Feature",id:"NGA",properties:{name:"Nigeria"},geometry:{type:"Polygon",coordinates:["@@à¢Ì¡Í‰Â¬Í“ȉڥl҇Ղˡ؊שֆكYÝB¶തs՘ǂՊʶʴТԴėɨǔ͸ÈÓ¾Â˪ÎݤʌͺŠӘɖǼࣘIJࡆ̻̀ͅєaЊȶৰѡєrӸΨӰ}ÊŠҎ·ٲʓڂҸȠ‘֪à¤Æ¼nͬͯğƱ«˧۽ٱɛՙšѧDZȉÇי҅ΉŽыȋ͹ÿΓֽ˱ҽΊ͇aÔƒÓ­Ê‘QÐß·Éש"],encodeOffsets:[[8705,4887]]}},{type:"Feature",id:"NIC",properties:{name:"Nicaragua"},geometry:{type:"Polygon",coordinates:["@@̃ˆϽͺÈ˲Ο˄ÑϜĤžƒŵÚÒʾ”ŀȔŬRkЮȠrǬOǺɤʜÇĒľƺIJ̊ɴbǦĄQňȪĖ|ƜŹǚ›ȆńɄB̈ŌŜŖ˾iïă§ȉÄ̫ȗ˹ěͷÂυ®ÉtϙŹĉýΫÌɛǣɋ ɩźÆȩDZʛÈƓǦˉêȕʼnօɞųŇ"],encodeOffsets:[[-87769,11355]]}},{type:"Feature",id:"NLD",properties:{name:"Netherlands"},geometry:{type:"Polygon",coordinates:["@@Û¦yǀ˳ȽޓɇÍÔ@ƘࢡҥȞÕπީǩ؛âѠɲ݀ఆଲΘ"],encodeOffsets:[[6220,54795]]}},{type:"Feature",id:"NOR",properties:{name:"Norway"},geometry:{type:"MultiPolygon",coordinates:[["@@᥆ؙàªÉ£à¤„Յෛ͵ڵû΢לઃͰಫ˵ЫØߟωࣗȮ઱¥णѼԉÉԷ“ūփནƊÉҵ߭Hևױ࠿à¤à²«à®Ì¨Ë¹Ì‡Í«à ¯bձ޿¾૟՞Ñ˥ধֻۧυӛÖԪဋà¦à««ÈŸà­Ñ”̛ࣚˇ኶ޞզᕠ۶ဌࢂ໤୦áºà¾´à¶¦Ù„ᘼ੊ᇎπ൪­౮ۢ໖›ພǘ"],["@@áˆÎ…à¹Èœ×†Éԕˎეǚͮ̿ொÈ"],["@@᪖صᑟͥұأ݅ÇÐۡৣÂᅵԢނ̘ఽÊ࿕܂ٷڄᘎ̜Ң̋஦\\͊˼௾ˆ੖̋"],["@@à¿®Ìà°Òá±Ä±áŸ™Æ–ƫɴஹdà¤Ï¬á£´É¼à¯žÈ«à¡˜Ê¤á‘ºÈ½"]],encodeOffsets:[[[28842,72894]],[[25318,79723]],[[18690,81615]],[[26059,82338]]]}},{type:"Feature",id:"NPL",properties:{name:"Nepal"},geometry:{type:"Polygon",coordinates:["@@ÃαŌՕĩͩ۩aয়Ȟ٭ĂӛђଷŊયҼ߉Ю߿͆͜޼ՒϠΒȪڪʳࡔշҾť˰ЕٶǓۀσौȕঔć"],encodeOffsets:[[90236,28546]]}},{type:"Feature",id:"NZL",properties:{name:"New Zealand"},geometry:{type:"MultiPolygon",coordinates:[["@@Ȓ΋װ;ÊΡBÎ̹ϳչإїͷ̴З٭Yܗ̓ɣջӋࡗڇϓнʇÞlխˢࣱÃƗ̰Ҍذà©à ¦ÕªÇ€×¾ÍŒÜœÑ°ÔŽÑ¦ÏŽØ¸ÍˆÉ†Å°Ò¶×œÏ´È†Î§"],["@@،ࢫlָϜɯŲًڰ˛֨ãӒ͎юĭȯݗʯӫٛjɡʭþαūƻͅÒзֹ٭ͯƟɘΕŨӞ۔˟ҨࣛͲz̦؈̌ƚ٨Ÿլͻ֜vƪБΎڋݔΗת̸àҚұٺɑʂݡ"]],encodeOffsets:[[[177173,-41901]],[[178803,-37024]]]}},{type:"Feature",id:"OMN",properties:{name:"Oman"},geometry:{type:"MultiPolygon",coordinates:[["@@ֹ̻ϟªǩȧƉÑļ֗ÿĻϯFԽ̻ćХȓǯԹP͡ɃJͻПɷҩĂ֗˳ϱ³Ëטٿ൴ᠾ࠾֖á‚ϩתv͸ʔÎFΆϞǒƩŞèմіHϖֵҸ̧؞ŋӼƳϜӕɨ˧̞ŃCȉ̩ԃƅɽΟË"],["@@ʼnƳDž˺ʔ˺ľñÄÎ"]],encodeOffsets:[[[60274,21621]],[[57745,26518]]]}},{type:"Feature",id:"PAK",properties:{name:"Pakistan"},geometry:{type:"Polygon",coordinates:["@@تϻʞ٥൨ͻ߹۷ऩůౣȲЫα̖Ý̈֩ڴгܑӟ`׳ࠃࡇՃà¡à¢à¢¡à¦‰Ãšà¤‘ࢡռϗĪ٧ҾÑǘÜᇛD֓֕؛Ɇʣ؀٭٘໻Çà´¿eஃÅ̈́ঊொѢéϰГƌw݊ߥφͷԔеѶඨѕࡀŲԈŅǞȂגóદĈ܎ҶӈشCĠɼٞŌ̴ý͢ʀ±ԌΦԖ՘Ɇͥ֊ߜɴ̢•͒мΜĩмȣΤӬμࣘǮ८ĮÑƺӨĦ"],encodeOffsets:[[76962,38025]]}},{type:"Feature",id:"PAN",properties:{name:"Panama"},geometry:{type:"Polygon",coordinates:["@@˫ʎǵҒȺɢɅÎƿˤлɸοÃÇ̇ͻÉǽ‡ĉǩВҗɯŅŧŭϷ©ơԈŋƛˡ¸Ç͸·ÈɓİέCǻĩŶªǖìǠÂƲŲIJǩŲK͸͘ö̠ÌiDZͲ›ĀæɴȵЮÔΨɄԜǞ˺ʤҬ·‹ĉҶ…ώơ˜ʧ̈́ɵĹūȜӵÇʟ˓ÒŅС"],encodeOffsets:[[-79750,7398]]}},{type:"Feature",id:"PER",properties:{name:"Peru"},geometry:{type:"Polygon",coordinates:["@@ɥљћɋࡅӘñΈရࡊທࣾ٫԰ÎÛœÆʎ܅ાࠣ༄ßီ΅Ϥ˃ؤٷպױͼ˖ϒПߢʼךڢՎIJΓʇȧx̭ΎâͼÄΚщӆΌDŽ֤ԦܶৠͨࣸࢠʾմÅٔɢĂ֒ЉˎЅϴÉӶࢣضĿҨɞ̤ƣԎð٠ϽթࡣʤoÑ€Òݳ œųÛlj॥ֱÓϻɉ̇ČғԕÊBΡɛƵΔݳҲÔDZίÖµ͆҃ÝuÛӸÇ౧ϢĩӄƠܪടǷ˵£ןgÜ͟пƮ̵ȕ˯β۹Ջ࣡"],encodeOffsets:[[-71260,-18001]]}},{type:"Feature",id:"PHL",properties:{name:"Philippines"},geometry:{type:"MultiPolygon",coordinates:[["@@ÄÖºҽ˹ޑ̫ࡨϽÑˎإʉϿ঩Ӧɿ؊ʰЎՑЈËΑЃÂثҵƑʖ͢۾ՌʀҜ̈́̔ÏٔɰƎϒרv·ٰڼЋêхÃ̱"],["@@ÌŸË¡ËÕ˃Êԫ׈ǦɤɂɾĢԸҨ¸Ɖ֣جߺÄß¡"],["@@ૣߕЬט؈԰Ԏ׊Ѱ࠲Ʈۅևҧѳֿ"],["@@Ԏʹ՘BgΗϳΣՕʧ‡ϸÒєŽÐ"],["@@ʀभ٫ɞj˭ȶԯÐȋ•עʧªÆԘӶãY͈ԣٜ߮mÉ´Ì»"],["@@ɟܩέоѓ٘ܚ‰̡̈"],["@@ԮʉʶɖüɇÆΑ˼׻ɛۥӷ˥ÆڳȊÚѾġϊIJਾүăҙ˜ȫēϯٻЮ̵ѴÉ̯՗ԊރůлȆ¨ΎˀɊʣȘŇ̡бӚűμÂߨͺˡĔೄ˜ހԘA"]],encodeOffsets:[[[129410,8617]],[[126959,10526]],[[121349,9540]],[[124809,12178]],[[128515,12455]],[[124445,13384]],[[124234,18949]]]}},{type:"Feature",id:"PNG",properties:{name:"Papua New Guinea"},geometry:{type:"MultiPolygon",coordinates:[["@@ɽÄε͔ÏՔǷ٘ŜĆĜʡʬÈРՑЈ˵Åɽ"],["@@ѯçƃɽҟȱћȟѽBÛʔӑɺêʺݬũҠàŶЖŦrĆѽÓÜʂ˼Ҹ̚ġӸԌfÇœÆgү˯ԡ"],["@@ݤտղࢻӖ„‘ω٬ƛʥÇࣀÎÄ¡ÊÖ‹ÃȷɔܟĦࡕŴٷ՚ӉҦѧ݀ભπ܇ʇԡˣńإڇ˿һƖࢅ–aá©’aᩒภ׃༊ӓׄїҴхŸӵඔԱȲѽޛěȄ֕"],["@@Ê¿É¡ÇÓ¸È͘ÏËžÓΪ؇ʚɺȮҒɻ˸ÈΜȫʹΛ͊ËĶѧ"]],encodeOffsets:[[[159622,-6983]],[[155631,-5609]],[[150725,-7565]],[[156816,-4607]]]}},{type:"Feature",id:"POL",properties:{name:"Poland"},geometry:{type:"Polygon",coordinates:["@@·՜à̂ȹ̧҆̚ɺɤÈђָʘ಼ϴ੒˴࠼ƙÚȱ߸Yਚħ໶^њěȬʵšωɸ͋KͯԋǡʸϳfÏцܻěɽзįރۥɒϗǿ¶ߙ͔ØšЇĒӹǵч̖Ήŕ³¼ϭаر¼ăˀֻĦűɑҗǨÀɴػòЉ˔"],encodeOffsets:[[15378,52334]]}},{type:"Feature",id:"PRI",properties:{name:"Puerto Rico"},geometry:{type:"Polygon",coordinates:["@@јõưǕɋɃمLӫ‡·άŢŬیK"],encodeOffsets:[[-67873,18960]]}},{type:"Feature",id:"PRK",properties:{name:"North Korea"},geometry:{type:"Polygon",coordinates:["@@Şƥ͉ºη˵ʣ˷Ž׽ѣȅƫƧ̓ÊÖ“ÆηɥηįġͰƋӈσŧȭΧÇץ¡ÍϛϑˆÃùСdžĵƿʙé‡ǀɑüɥƆɰφȤİõƶɆҒÅƎөĠЇɤۄբऒҌ־׮ЎËܪ‹ſѺಚβͰҼժӹ"],encodeOffsets:[[133776,43413]]}},{type:"Feature",id:"PRT",properties:{name:"Portugal"},geometry:{type:"Polygon",coordinates:["@@̦Ɉ΄ŬɂЫӺDƞłӪ‡ɼуϱɩYÙ½Æū‘Їγçʹԋɵտ̄ʡřɫ̵̿ê˥ͷɓѷŠџġŸڂÿԬϓþȩ͈äռͰ̨ÒͼǪԎkΤǙ̠™˲"],encodeOffsets:[[-9251,42886]]}},{type:"Feature",id:"PRY",properties:{name:"Paraguay"},geometry:{type:"Polygon",coordinates:["@@ͦ৖tҌЖ݌าʔޮ]Þ´Ñ—bʵʞҳÇଛࢲLJ΄Ç֦ɩǀʣþޓİ͓̼›̀ƌ̢ƳAҥŕӻǑӛÆÝÞ١ړƇऻŸࡑɮࠢ౨ťψࡽ͢ਅبۉŸ໵ൌ"],encodeOffsets:[[-64189,-22783]]}},{type:"Feature",id:"QAT",properties:{name:"Qatar"},geometry:{type:"Polygon",coordinates:["@@ÇؔɨѲɰĜʬËdӯǽӳɵÑʫǖ"],encodeOffsets:[[52030,25349]]}},{type:"Feature",id:"ROU",properties:{name:"Romania"},geometry:{type:"Polygon",coordinates:["@@δǶԴġՠGϸȳ˺źبĄɄȠΠ@ʰćʺʟˊΟӞÔ€ÏėΩưϥϒƹЂƊϠƟpÉПǹʯĀɻ৥ӳĖ̪ؑফțзɋ௽¬٥ƀ͙ÕÊΊƵƦȚƘȷŀ˃ȋөʔßΌԟȢĥˌҕͤڪǂԖ֮Њ֬ԢǮ"],encodeOffsets:[[23256,49032]]}},{type:"Feature",id:"RUS",properties:{name:"Russia"},geometry:{type:"MultiPolygon",coordinates:[["@@ࡌ๫కˤԫà¯à Œà¡³yוÙԒսٱƻ۸Ĥࠊħ࣢Țٌš૴ӯࠜôରަϮͭϴÏŠɔ։̆ߵuà ŸÎŽà¡‘"],["@@໵]ਙĨȒτ୊˚ࢢƧψƃęɱäɉ"],["@@֦ȽțØᗸű࿨޻࠭λ൛ēsࠑͳǩ޽~ٗ̊ૣʖȉθ࡟Ǝॗʼnҗ̎Ǽ̸৓ȥϚЃӉΣ@„ášÙ›á”ºà ³Ã¯Ô·"],["@@ः©ƭˌੲΖ@Ö·"],["@@ળ»@ָň–܈E௒ʉïŗࡽȩ"],["@@ౡMႣĤƧ¬ߘͪੀþஞÍĸə"],["@@ॿͩഉø༛ͨȪ˖༨ųᑔɗ"],["@@ډرᶽzඃȣမղҎ׀૎ǂᕞ™ᴬѽ"],["@@ӹóᩣŊɟώູɦūҒ࡮Ƕ…Ҟသܒޙĺá¨Ý†É©Ï¢áˆ¤ÑºáªªÕ¢á« Ç€à·´Ì¸à¿ÅŠ×ͩ֟ʻᲗз᢭Ðᤙßà°«à à³‰ß±Ç Û¥à¾ŽÛ"],["@@ɨгÞȲឤYቈЧڬ̿ȽѧङÊá•…Ò¯ÙʟਬşఖɃݴDŽєաτɔഊƂ᧪ƑȴϽ↲ů´ٜᄼƥഄLബѷϮÕӹΙੌڋ೔Ϳ߸ࢦഖϙ෢ɦྼʵؤʀൖş؅ޮà«Î¶ä¢€Õ±Üӿᔲٛ₎DŽာƑ۪ÎĹؙਜʇ૴Ǥ๰vཚǑཪĢะݛਪˎڷ՞Ïώᧆɻფºá‚Б୲ν@â€MKઇσàªÃ–ݶÒԄەϲɧĮÎÉ‘É༧ǾášÙ…ݛĭ౽ן௛ԧ̱ϣய׊ᔗڇϣ̸ߵΫ૱Ř˓Ö৙߽Šͻड़ȋő௣ޭ‹Ϋ۱Δα฽ѕ̅ॡభȳʥ࡟ே޳ׂ̳έ௬ҵለИ୘܀ԆªϾರȊຊ੒คࡺຢڢڮஆ৷ëÔۗᒉइÛਖᓧ˷ᑃටۚԧሙɕà²Ä“Ô؊ಯŶ਩ЭᢵƠáªÊŸá¨©à¿›á»§áŒà³šÅаՃࠄȅ՞оईÃௌà¤Â†ÜÚ࠽ëà§Ï›à´‰à±à¯“˯ׇଙ঑ଇॻթӹ૩ӱՉYՇФૻؙſ˩ÅƦKÑÑ–xŦ঴ɛܚܞ̒৶Ʃ֢ࠈ˾ऄ͚̮Ѵݲ൷ʛܯͧ౧Dͻ߄হװหˎ̵ࠖ̉Ԫ̿βԯà¡Ý‡Ì²à°·Ê¢à«›uਯƱۛлҤȥXҩұˑݷࢻRσஅÕ৙̈́োéѯˮԋĞ௷ףેƑޛȻੑƌޫSԙіࠕИࡅŎà©Å‹ßƹ஛ΜLJـধɎÞİवΎࢉࢉ΀ӵࠇבà¯É‚࠻Š֗Ͼ࢙^ܳʴ౫Ѓྃܣࢭơ͡çѽԤàªÅ‘ΧΦחnjЙӠҩưிÉୃӜ҃ѯሟᒒੵٮ̮˂ᑋß߭³êҞઅ˺࢙ȱ˃ࢊມǺݯΑᑅ̳Чȹḭ̇ϫ˻؆ֹ߭ɓǀɭ߭ХസֿÉЉ୻˜ʓʟ੹Ѧ೯iࢻΟহͼᇡ׊ಽsჃࣳĿؗࡹӤڡउʖǡÓÙÜŠÖ«Ø°xÕšÖ—ÄÑÑƋϥӽ߿Ƒ࠳à¢Þ†ß•Ä‰Ö£à£¼à¦«Ô‡Í¹ÆɇωÌֿԚɿ†ՅȚʳΈ޵ǮԙÆƥƼଥЖఅƌ܃ƞĹıੱ܂य़̈́ܩӴؒƈۤ۰ҹͪఌ΄uȀݯƉ‚ώѠɼ߼ÖƄ˪ȅҪ΀ѰWʚఉ˚ӭUԯЀ١ƃ੩Ìlǒ̗θڟ¤éʼɀǞÕӈࢋąʭ¦Ƀȑ̽”ȷ՞ȟ˨NJĀڴ‡͞ȀÊɢ֥ƪ¼ƲÎƴՃվǸɨĉЂࠑȨѱijšȼࢭɂˑӸíТЙȖάˊÊ޶װӞųƤक़ҬࢡЎᅢ੶ޮӠ͂єగּΆնݳش֢ܜà¦à¥šÞ¢ÙŠà±¿Ö”ŬךڶüොͶࢀ̈൦ԕᘨȧṺो٤ЋÆ֓टѳàµÉ¡â·Ù”؟Ńൌ؛ÂϵÆ࡫ઌʯڂɓňРԑΰ՘͈᎖Թ۾Ȳ֣؜ዦࠖޢµ޸̋Ӫ׀۫ԄЪԊءԶᚠˑӔҹ੡ĻNҳڌ˽ಜǼȶ՚ჶÐᰪܞي£ࠣԙਬĕ׼˼༾xà°¢Îफ़Ôॖ֌ࢡӢѪˤ២ʫ୒ʿᴾॣ֚ѰࡡѺ{ǴৣĈˢЌ҅ټ}Ë༄ݾրކزǒᕮɛǬұߕڽԺˋ˒חÈଵऒԧέ֕࿫à®à¥¦Å­Í®Ì¢à¤ŽÉŽÉžÐ¶Ü®ÐŽÓ©ÓŒÏ¼Öˆà£¿ÃªÈ«Ò²Ú¢à¡ˆàª£Û†àº’֦șװмnѴүͧ߷à£ÆµÏ¥Ø„ඤͦლ¬༈Óݛ۪ċࣆศǞá¾Â™á†˜ÅŒÛѮংւॲx࿎иᕠÅ˪ɲᕂþیȋሴҀ໲aɶδߤΨጤΈ෸˗ଥȷበŹ"],["@@ⵙ͕ໞીےĦقÃᒈӋʟͿ"],["@@૽ÅݱÛśÆঙƑ࣫ȦÓʾáˆ~࿞ƶ౨XǢɧӘȬߊÆఞǿ͗ŷ"],["@@ᆳĿᚉʎඅ͎٣׾଩ǔᔆָᆎȎ࿌чኬ߻ȹݯ"]],encodeOffsets:[[[147096,51966]],[[23277,55632]],[[-179214,68183]],[[184320,72533]],[[-182982,72595]],[[147051,74970]],[[154350,76887]],[[148569,77377]],[[58917,72418]],[[109538,78822]],[[107598,80187]],[[52364,82481]],[[102339,80775]]]}},{type:"Feature",id:"RWA",properties:{name:"Rwanda"},geometry:{type:"Polygon",coordinates:["@@ͬӃµӵÊÅѿÆʱÓԛàþҠŘތԄʎɺȰÄԈʸ"],encodeOffsets:[[31150,-1161]]}},{type:"Feature",id:"ESH",properties:{name:"Western Sahara"},geometry:{type:"Polygon",coordinates:["@@oҊŸ@@ÉeÇ‹Eà±áªÂªÂ‚ᒷ޿÷ȳћDŽà¯á¾“Nǽ˫˜΢bCቆäĶ̢ΆϘˤୌୠ࣢Ђ੖ˀÖ˜ټۺĜ̦ʼnϢ@˔ȒԲ‚"],encodeOffsets:[[-9005,27772]]}},{type:"Feature",id:"SAU",properties:{name:"Saudi Arabia"},geometry:{type:"Polygon",coordinates:["@@ʼnΪʩʨÃͲѡ̞҃۴Êۆׇ׀ϑÆ֋ߠīזӾӕञϿ͠ґǨˡӖ°ȎɹѦʕȊÍزԟڴѓ־лIžҦœ̌ļͲनƅζʶȪ̢ٚŚƒˮˤƜ࠷ࡀá†Ñ„džŴৢɩబיᛎá•à¼ Ã£Ý Ä…ȾÐתv͠ܥаȓƠÌִΛ¼Îċ˩ł˯ʎɽÅ˟ŲȵʬǕɶÒdžÍÂŽÈ™Í࡙ᡌщǞDzϪש֕áᠽ࠽á‘͑޷ϙ׻ࢥϹƕÉˬͧ߻ĎƷČॹmɫùΉɔÉЭĒΟÏË‹"],encodeOffsets:[[43807,16741]]}},{type:"Feature",id:"SDN",properties:{name:"Sudan"},geometry:{type:"Polygon",coordinates:["@@Å›hdмĵ̀џͨĵ؄ĶبϳÌÃȇÔ©ȬʕðÔңңл؅џđ۹Ӫͅǥđʓџǃ…ǥ࠵@řǦ؃†̡ÆɳîÑӬƟɲ؃ŗɱϵÉݣ˿Çʳğå ̅ʎÃʼƌΔE΄ӛՀĩάZȰ̱ʜUӦǭ̵͖Ď̰ɒΖħÎˢʴǫȞɞ԰ϨئܦÃ¥ ZΚॲH@းâª@Ὂ@ῼ@˔ࠗÈƳŪࡻ̰à§ÍŒÈ·Ò Ì³Ñ‹Ó‘Ø£Æ˅ʳĉ֑α௿ĚͳƅܟͿࠟԓзέٛÄ΃ЉɽÊ࢟Dij"],encodeOffsets:[[34779,9692]]}},{type:"Feature",id:"SDS",properties:{name:"South Sudan"},geometry:{type:"Polygon",coordinates:["@@XٽűʯѿqË·ÓԨÑюХƨͳϦșӼࣳ֫օԫԇԫϭסFگȟՕȊ΋ɭ݉ÖȥάҵDZϱÆɣƕϗĸԗۚƉˊعͪɅԌΕζ֟ѬS˘ҡͼ֯͠ʴĠ̀ǂÉݤɲ϶؄ŘƠɱўӫɴí̢ƞ؄…Śǥ࠶@†ǦѠDŽĒʔ͆ǦۺөѠĒм؆ҤҤïԎȫʖԎªÎȈϴËĵاĶ؃ѠͧĶ˿cлŜg"],encodeOffsets:[[34779,9692]]}},{type:"Feature",id:"SEN",properties:{name:"Senegal"},geometry:{type:"Polygon",coordinates:["@@Îٺн̚φDŽРמȦќ˾ËкïШǾҶVДʙ֎ÉԘأֈֽžԹǔӓ̾ɿî͗Âʽŧ³қâÙģȃk׿ȲЛV༇–ɥħ˥‚ѻƋÆÙ¢ÞˆkȬŞƮR̸ȘήǯκcζȌÇÊˡƙʻJͧȸˉ_Èȥࣵy"],encodeOffsets:[[-17114,13922]]}},{type:"Feature",id:"SLB",properties:{name:"Solomon Islands"},geometry:{type:"MultiPolygon",coordinates:[["@@ɾ˿חN͉ԬԈȯǜ‰"],["@@ÍmԧĎǫżÀͮֈƘǭƎə"],["@@ųƹحܰǫԈ˺@̠ڥʹЗ"],["@@–ǛڅΦҟ̠̿˪ŰÄϮȫÛϭȢˉ"],["@@Ǘ³οȒ·Ί¨ƖԈΡͰ˛"]],encodeOffsets:[[[166010,-10734]],[[164713,-10109]],[[165561,-9830]],[[163713,-8537]],[[161320,-7524]]]}},{type:"Feature",id:"SLE",properties:{name:"Sierra Leone"},geometry:{type:"Polygon",coordinates:["@@ɧØØͺѩ҈Ƨ̬Ĺت҆τĬɺƞǸɶpȜǂڦCɺ̛ǼΛÂʓƈɗṶɴ´ϹϹϛҗ«ʓȩË"],encodeOffsets:[[-11713,6949]]}},{type:"Feature",id:"SLV",properties:{name:"El Salvador"},geometry:{type:"Polygon",coordinates:["@@Ä¡È¡Ó¡^Ì¡Ä„ÎǘұÀʃǶ~Ů˾ɄǀĢ«IJȠ¾ʜëǸǙʪƇŒœτĴǤÑŘÄÃͳ"],encodeOffsets:[[-89900,13706]]}},{type:"Feature",id:"-99",properties:{name:"Somaliland"},geometry:{type:"Polygon",coordinates:["@@ϛԩד۫۹MᩧাÍ̜̳К̳ҨǾ̖̲҈˚ƹǒÎϜΗкGߊɌࣴĴ݌ʼиÆ̚ƶӎˆKaE΋Aà¡‘@Ñ«"],
-encodeOffsets:[[50113,9679]]}},{type:"Feature",id:"SOM",properties:{name:"Somalia"},geometry:{type:"Polygon",coordinates:["@@ѼĎЊ˾͈FpɵýӧHѳǯ̣ÊࣥЙयԱ੷Ü௷ܓवধ଩à¡Ú¹à°·à ¯Þ³Ù•à¤à§±È—Ñ·ÈÈ£Ó½ÛšWᵤܾ॒ɰˆբfݠפબšᛜᡄה۬ϜԪ@ѬBà¡’FÎŒLbËhÏ°Å°"],encodeOffsets:[[50923,11857]]}},{type:"Feature",id:"SRB",properties:{name:"Republic of Serbia"},geometry:{type:"Polygon",coordinates:["@@Ԡȡà΋Ӫʓ˄ȌȸĿșƗƶƥȷÈø̫Тγ͋ʿƗˋĞijƑšϳa˹µƒØĴĴĦȴšKÇƼƑ ŋƆƽÀšŠƯ±ś˧ȩÑèð͋Ǩ˟ĜūŜɟƠȢšŬЄЛ͔ɀτ̥Ë͔́ˉʈȱ͘٢ɚԾ™ҖͣĦˋ"],encodeOffsets:[[21376,46507]]}},{type:"Feature",id:"SUR",properties:{name:"Suriname"},geometry:{type:"Polygon",coordinates:["@@৔ǙĞưڶÔࣚɥѩܟâֹͤӽƥίóϩɉΛӓDzЇđ͹öÄÊƘǗ÷ǡҙèԡܴÅÓ„ËBωØƺѠ¯ȤԜɖƈݲ"],encodeOffsets:[[-58518,6117]]}},{type:"Feature",id:"SVK",properties:{name:"Slovakia"},geometry:{type:"Polygon",coordinates:["@@´»ΊŖш̕ӺǶЈđ؂Ţߚ͓ɷɓÇ͹dzđ࣑ʮ˟»ȟȡÐĿěÄХŽͭ}ãǙ۷Ļ̱ĠёɌċ̆äńŢȂόa˺ĔxþLj¢ÆȒȖ˜žưʢD"],encodeOffsets:[[19306,50685]]}},{type:"Feature",id:"SVN",properties:{name:"Slovenia"},geometry:{type:"Polygon",coordinates:["@@ÛœÃÑŠÈܾtLjƘƘUǎ˳Úɟć͹̇đHɻͣh˷ƎƷƙב†ȈúȫΨĞа"],encodeOffsets:[[14138,47626]]}},{type:"Feature",id:"SWE",properties:{name:"Sweden"},geometry:{type:"Polygon",coordinates:["@@à ×•Æ€Ô¥à³¹Ú­à¾±Ü¡Ø“ஃײףߦүޗॅ࢑ÈÍතӋ޿৳ĆӅڗঃÂˉß۳॔ٓà®Ï†ÓœÛ¨Ö¼Ë¦à¦¨Õю½ૠղ߀࠰ä̧ͬ˺ಬஂࡀञֈײ߮GɞҶཔƉŬքԸ”૪Щ಼ֱv಑˴͛ฃʃ"],encodeOffsets:[[22716,67302]]}},{type:"Feature",id:"SWZ",properties:{name:"Swaziland"},geometry:{type:"Polygon",coordinates:["@@Ç¡ÏӭěԅҖS̄ɰ̀ĂʔÊÒшƵŰϕðω"],encodeOffsets:[[32842,-27375]]}},{type:"Feature",id:"SYR",properties:{name:"Syria"},geometry:{type:"Polygon",coordinates:["@@࿩ࣅऩͬgNŖŶ_ΈȸҠҜ̈́Æͤϗ¨ÿٞȶΌɤȀɤȀ°Ҹ˞Çऎɺ҂ƿۖFॴ̀Òaक़žїԽҡȹĂؗͅ৫ᇵ࢓"],encodeOffsets:[[39724,34180]]}},{type:"Feature",id:"TCD",properties:{name:"Chad"},geometry:{type:"Polygon",coordinates:["@@ĎЄաnDզΓ̶δ૊ੴߌ¬ન͖á¼Ç¼Î°Î“˾_ˌ̽ɔȷರࡔҠ…ྑ…à¾Â¦â€Ü¥ÃϧإÉԯǬÈˡʳĨÎɑΕÄ̯̎¶Ǯ͕Vӥ̲ʛYȯÕÆ›Ñͽ؉ࣹ߅ϳ߹¾ÊûĊÌѫ̋Σ͟੓ÍȽÈÆ“hƹÉۛÙƀɪ˅ׄşÎλƜӷӪǼІϦċʂÃÒ¸SқކŒÖÉÖÍ­Õ "],encodeOffsets:[[14844,13169]]}},{type:"Feature",id:"TGO",properties:{name:"Togo"},geometry:{type:"Polygon",coordinates:["@@ڱdzȇ̎ɡՔãкȆݴÉ̬ăڎD؎ΕѠÖˀ݂kŅѵʲÊ̈̋ŽЭǜǥÂáŠÈº×…"],encodeOffsets:[[1911,6290]]}},{type:"Feature",id:"THA",properties:{name:"Thailand"},geometry:{type:"Polygon",coordinates:["@@ݭϬܗeŬڈ݉Káऋґ௯˙ÝÌ؋ն΀ދưܭҶӓԚĭѤѧË·ևĵßќۇςƣƭͧ͒ÆжÒӄПЌÆӳǃҲĠԾʚ߬ТࡸҤ޶͟ތ`϶ĩҸ֕ښȩф̄ƺ̮ܶ·ֆՓؘÐ݆ΠƴϦࣦצœӬθӔȘθʷ´ÔÖ¨ÂȷࢭpݫࢰԆʤƧӰzǜَ̊ÃٖڽÀࠥںܷ›܅˙ϛ޿ŦગDž՟ۧȤ১"],encodeOffsets:[[105047,12480]]}},{type:"Feature",id:"TJK",properties:{name:"Tajikistan"},geometry:{type:"Polygon",coordinates:["@@̭ʷࣳƖÄӛ࣬Þਢ˗འŶɈާˠÄԜȓ‡͛ŴÓà¡¿B×ØԻϕÏĉ̉ǯͩˠþ۸ʩ¢ĞʲғÈα̇ė͹Żūԇj˕ϩ˯nj؋ˑʱĺӀࡘǹض؟ȨɔφۮŸЌҬˌբ૲ȜǩϵŤɹΎv"],encodeOffsets:[[72719,41211]]}},{type:"Feature",id:"TKM",properties:{name:"Turkmenistan"},geometry:{type:"Polygon",coordinates:["@@ñۼطŠॣݔڣĠगюׯþσƽ֙|ׯӓ݇NjƻרŪ࢞ٽ˶ɎֺÖ¸Ȇ۾ߊȵ݈ˎؓԎʉӔڱɋÄ؛ʿհψ˨ॖǪ֨ɻךڅњ¤ॆ\\Æцܖ̂۾ӦଆѹĜڡÍǣࣦžˮƳаࡽ०ׇոЃ࢞Щ૤Ϋwԥʩ€Ѕɤſ̙۽NjǙڥÓÊ­ÚŵǫϟهÅࡩ͈"],encodeOffsets:[[62680,36506]]}},{type:"Feature",id:"TLS",properties:{name:"East Timor"},geometry:{type:"Polygon",coordinates:["@@IJȤܢȌז†ˀŀ͆Ľ̯ɫ࢕ο۳ʋeʬÄÇ”"],encodeOffsets:[[127968,-9106]]}},{type:"Feature",id:"TTO",properties:{name:"Trinidad and Tobago"},geometry:{type:"Polygon",coordinates:["@@ӚŊǮ‡‘صۭġƯúʒɲiͪ"],encodeOffsets:[[-63160,11019]]}},{type:"Feature",id:"TUN",properties:{name:"Tunisia"},geometry:{type:"Polygon",coordinates:["@@ΩພԭͺQȰۉԄóنԮҶȢۚƃߠǠќࣶͺךĵ}ы܊̲ÒljпЫMϱ̆ȽÅܫփхDŽқѤaÉ„Ð͊ſ³٥ХʋʵËֽ͓ĘΑïΟЧț"],encodeOffsets:[[9710,31035]]}},{type:"Feature",id:"TUR",properties:{name:"Turkey"},geometry:{type:"MultiPolygon",coordinates:[["@@஺͗à¦Å¼Ü¤Ãµà¦²Ñ¬à£†Â¢ß´Ð­ÆœÌ‘ăУزȻͨʕֻʇˀ५ÇʻҠڧЕƙÌÉŠà¦ÅˆÎ¯Å½à¥—ŽÒbॳ̿ەEÒÇ€à¤É¹Ëǯҷɣǿɣǿ̱Ϡ͈͂ԟí۱ȖֿәౣĥڹҊࣟ†ȗΑׇij߻҄ࣻeӽ࠶ؗҰЦٸՓВठߨಒ’ΜྀٔÅ৞հ঒ʄർlุף"],["@@Û«Ò˃Ϻ\\ǦȦĦʺՂХɞࡦ˄ܤőĴ͓ܼ˓Ƶȵি±Ωʷ"]],encodeOffsets:[[[37800,42328]],[[27845,41668]]]}},{type:"Feature",id:"TZA",properties:{name:"United Republic of Tanzania"},geometry:{type:"Polygon",coordinates:["@@ƚġᵂႋÌӣ஼࠿ϱਙ¸Ӊՠ̩~ɓɳԓ¶ʭÇГ̌ՃÎà ¡Ì°Ç¿Úӣࣿ͛ԋb̙ʥבsɕŃà§Ê‚كåɽଢ˵ϺǛɶࠗƾӉʨՕƘͯƘΗɈґ੖ӣҺǗӤČѨƯޞΎ ̨̦͜ѬȺǮS˘ǷÈ·ͨÊł¶Ӷͫӄ̎Ķऄ[ႎà"],encodeOffsets:[[34718,-972]]}},{type:"Feature",id:"UGA",properties:{name:"Uganda"},geometry:{type:"Polygon",coordinates:["@@ः\\ÌĵԇʷȯÄPوȜ͎²ڬǰϸ͎Ѭ͔ɠ˒̘͵Ŗ¼চΌɮՖȉڰȠעEԬϮЊ×Ä°Ñτ९̧ؓЯ֋ʉͽTࢹá‚ß"],encodeOffsets:[[32631,-1052]]}},{type:"Feature",id:"UKR",properties:{name:"Ukraine"},geometry:{type:"Polygon",coordinates:["@@̾“ɄȒʮ¥ࢌĆ՞ӇȿÇêʻڠ£̘ηkǑ੪Ì٢Ƅ԰ϿӮVà°ŠË™XʙͿѯȆҩƃ˩߻ÕџɻÂÏڡã֑˕޽«ܣ̻¸ԹЪȭࡨ¼ÇÌ›à¤Æ¡à¬›ÓŸÒ±Ç È„ЂࣽʘƨLjߪ˪ʑȔಯɆË̼ީĻ̷ҧٱةϟƠÐƉϑƺɂĞƦ˾ɲˎÑƮǬäĊśӸ{ɞØƽĎÃŲ̉ɈŧΘ̩ÆÒ˶ÏɦΉŽأʾ֑ĉȧŭΟ@Ƀȟاă˹ŹϷȴ՟HԳĢγǵÃɤұɮÇͺɸɔȀµɑϘބۦиİĜɾхܼДÂҢɪٲnࡖßबȫڎi͂ŧ̀ƦɚÈݸ¢ͮąÄцʶȂܞº"],encodeOffsets:[[32549,53353]]}},{type:"Feature",id:"URY",properties:{name:"Uruguay"},geometry:{type:"Polygon",coordinates:["@@ղĚࡆٯ̺|ࡺ՟ڈҫӠֱχЉɸӇεՇॉұاǚғěޥΰ֫ÂԟҬÞլǾȈS࠸ɤࡺȾڦ"],encodeOffsets:[[-59008,-30941]]}},{type:"Feature",id:"USA",properties:{name:"United States of America"},geometry:{type:"MultiPolygon",coordinates:[["@@ũƕȽŤ|ɾƓ̨¦ĤƤƎÃǔ¸þÜeÍƙƬñƌőɊÌq¯͟ǵËÅ¿"],["@@˭ÑƟǮīèQÀĈî̘ÄɘŹëĵ"],["@@ÄÒ‰|Úĸа•"],["@@­µÓŻˆŃȒÂ’ɤŚêÃÊË¥"],["@@ıĉ˱ƴªÖŸĈȘijÈ"],["@@Ƭңʼƛז½࡬ƅࠂʹڼŊਖɓ˞Tݨʄ߂̧ࠒ͗ں˩ٶËĈəȢĉ½ĉɦǎĔ¦ȣǜƅɴ@ŬĹĽƫ࢖ÐǶÞǚܳʗӹÐÒ¥ÈÌmēĦť˸ÆÉ‚@ঊ҆ࡾƀસмfÄ÷ʰƉǒϜƆࠜHÞ˜Aˎ͞ŀàࢶ؄ϜƸ౦N໾BĎȺË¦Φž̖Ϣʲٺٚي˨ə֜ƜώÊAଧռӅƢË࣋Пࡷ̃ࢱÊѻӿƛȋSѽˤѽΒsė̬ʦȇãʇ֥ƋЗhةƥλ¥ӥ¥۫Êఀǂʠǃ୳ʥ՗C|ĺʭɷʚÂǹ׽ؑ٧×ɎȪ˟ɀǪÒȼƭ^Í…Ë͛ҿڡûÂʺֲѕ͎įۦljεǴՑևƀׂ˓˜ߛʊÃĖ̃Šà¡Õ•Ø¯à¢‡ÊÖӱнÃṈ̃ţ˭इձÓÐЅӽŻׯƪ×ˬܗώשLεЊঅÂ֥—͛ȿԡʣŃЯĺÆς͋ȖѻܢϹٞű͢ǤÖɽҦٻ۲͟źࡑϡƭ¦СϼՃȺोÅݗĤٙÃÎſƲɟaͽǴǓLJÅ̵ŮÍǃØ€طѺܻĿØÈšÔ¹ÃÛ»Èއح࠳γÒБȕϗUׅ¨ЕDŽ˹Í{׭ȂٽʺɽЄÈטӷÓ̃ӰуֺףͲۉgՉڑۣʦѡʪȽҦ˧Ѯӿτїˈ̩̖ป@C΋ڗ@ဩOቿפ౓ТĀǒ੩ÄॕÃƙіխӚϻĴğʌһ¦ÌɪޭĊɉƌĹҢà à¡ŠÛ©à­ ÂˆÈšÏ‡Ë¤Ù¯Û´Å™Û†ÒƒÒžÈ€Û¢Â…ÜœË٢͠ߊĸނĺނƱૼˇܘʓ϶ĸÇ௒˷҂ߋȺɜƇÛ˷ێᛸ@á ‚@à œ@ᢢ@៚@á¡€@á¡„@á­°@ᮞBáƒAF͔˴J"],["@@࠽͋ѕÉŽЀބ̘҆ŸÖÉΤʻܫÐ"],["@@ԧŽսƾԛɮࠦƞښùĂ͑"],["@@԰DžԾĒڸɛ࠲őéÄÙDZٕǾ͋Ʋݵȧôº̈́"],["@@؊ϛώnjහ»¹ȕ౾ƛࡨČᄚ˅ྤÄ٨ʼn૦ƎౢʧࣲÅ@@Má·±Iâ·à  {ࠌɵהÏÝœÖࠈҺࡈ˖Ҁѡ֤·ޒϙՂ׽࡮य़ේ՗xՋұЙҥ͂ÝˌʃܺàªÚºÒߎ߯Ä೷rটʌ჉ࢎߩDŽ฽̜୑í࿻ϬৃΨटǯǦ×Ò«Ãà¦Ç«Ý‰Ë±à¤Ç³Å¥Ó¶Ïšà šà£€Ê¶É±É‚ੱҵֵ֑௅ױؚСß׿ࣗΗà¡Ê±È»Ï‰à²½Ñ¡Ë…ϿছΫֽÞ޷ɻà¡Ë¹Û§Ë«à·¹Ê‰Å¿Æ˜à¤€Ï¾à ”ʸࣆҠਬĨвΈ୘ԊȈǚب̒ƢْђӸॹʫ˓Ơҕ̧շюɧÌ̽м࠿ͳԩBïԄƲ̮ե̚થLJÜЀַȬIӈ٩Ϊ͘ӘۆҸ̚њںÖ־ƇڴМ؎ï٘ʼƻϨҹưج͖ԩWࢻǽʯȃÚÈ„à®Ä¥à¯·È¬Î›Í¸à©ŸÓ¦à­¾Î˜áˆ˜Ð¨Û”@ŕнᄢŽڽԶਕ͌ױр߫ΨଽˈҺѲ๰‚ਗ਼ϦȨФ࡬ЎࠊĪཪώޜÉà²Ò„ౚǭ"]],encodeOffsets:[[[-159275,19542]],[[-159825,21140]],[[-160520,21686]],[[-161436,21834]],[[-163169,22510]],[[-97093,50575]],[[-156678,58487]],[[-169553,61348]],[[-175853,65314]],[[-158789,72856]]]}},{type:"Feature",id:"UZB",properties:{name:"Uzbekistan"},geometry:{type:"Polygon",coordinates:["@@xԦૣάà¢ÐªÕ·Ð„॥׈Яࡾ˭ƴࣥÂÍǤěڢଅѺ۽ӥܕÌÆхॅ[ÂᶾᓘӺƾïದ׻یͅߤݵঢŪ෸à৔ؗÙࡅЦMÇ¢Û੬ÂɲЉ̺Lπ׺૎הӖƺʠĉ۵խئÍײȾ়ѷ੽ØÙ•ÄŠÎuţɺǪ϶૱țˋաЋҫۭ ɓυؠȧǺصҿࡗهǰҳN"],encodeOffsets:[[68116,38260]]}},{type:"Feature",id:"VEN",properties:{name:"Venezuela"},geometry:{type:"Polygon",coordinates:["@@yȣӱĭ˜ϡYѭυӥ͆ڙδÆȌ؈ʻ̒§َਸ਼΀řІ̎ˆ̞ןל_Õ´ÒµÂ˧ݮQ࣌ĔӖϕٞĻҼʾXɄਨ¼৖\\܉ʛ˼Їڦ×ÙЯƆڧѬn͢ȣڕӱó̫˾̷ȽƽԫƉjϱɫɱّ֪ÅÊÌ­Íऱ̽׿ŽÊȣڛɀثņƿýϔɑ‘ÖŜՉ܆ï°ǭ׷ʅĭΣΉÆسÈNjʱٷÅҧѼʯ࠺ɟ̧̌Ȅюм…ȊʅʠǛ֒à׼Ȉ˰ƲҎ̓ƠÓÄ©Ø®ͻęסܢӥńઉăȧ̊ȷê‡ǬĴ̶áͺȃȂŅϮѡÈɸӮĺ׶ʔ̸͘ʌɈрդƖ"],encodeOffsets:[[-73043,12059]]}},{type:"Feature",id:"VNM",properties:{name:"Vietnam"},geometry:{type:"Polygon",coordinates:["@@à«­Ü—Û«ßÈ×٠ࢭ޺ળނԱԞګϪà¼Å•à¹“۫փ१եۇ۫਷ޱ̧ՠʀ֬دӌܬ͸ࢦÔσԚප٨ļ৖ț֖ƶࡀɃצÙ×Ջ݌ۥ঴৓Ԋʊ̠՞ɘ͙ܺਙPÏ•Þ†Ó­ÚÒŠÈ´Ú¢IࠈĬܒ҄К̿ÞƵƃӛÐÍ¿à¡ŽÉ“"],encodeOffsets:[[110644,22070]]}},{type:"Feature",id:"VUT",properties:{name:"Vanuatu"},geometry:{type:"MultiPolygon",coordinates:[["@@Ë£Å˭ςŒɤՆӗ"],["@@ƌڱɥŀǩ­ťɴi٢Дʵ"]],encodeOffsets:[[[171874,-16861]],[[171119,-15292]]]}},{type:"Feature",id:"PSE",properties:{name:"West Bank"},geometry:{type:"Polygon",coordinates:["@@@ԣŭʙЃŕ˜ɜɌŚÉĦǬ̤֔ś"],encodeOffsets:[[36399,33172]]}},{type:"Feature",id:"YEM",properties:{name:"Yemen"},geometry:{type:"Polygon",coordinates:["@@؉ɥNjÏo˹࠷Οഇϻݩףυ±ʥºӭΑ՗lj۷©ɃµǿɛəÕŻɇеlËœ׉¨ɓӬzÒ ÆʜǑتʋΊǚ¤đϨĸNJ™ξςˌđΠɞЮΊɓɬúॺnƸċ߼Äͨɂ˫ϺƖ׼ࢦ޸Ϛá’͒ڀ൳˞ח"],encodeOffsets:[[54384,17051]]}},{type:"Feature",id:"ZAF",properties:{name:"South Africa"},geometry:{type:"Polygon",coordinates:["@@ÇŧΣÑɻћӇ׻ोà¢×£Ô‹Ù‹Ï£à¢›Í™Ñ“«ŇɷԛŰеDž࣫NJԙĹάࡿͩܓƃԱͅϡoΣ̚˳fαϒŸśÅɦLӰ˙֞˔ƴs٤ս޼х܈AF׽તДдͪɯƘΫϘÓՈǃҌÖݤіB᷌ɨűӾߙûԟȈÌ׼ĒрϒЊʨȶДЦȚΠķВɽۂ£՞ȜÄʾƨДҚäʨ͂˪֔ݮغஒؤ΂UОƛ˲Ķ҂ċДà®É”ׯƫऩî̟чƶÊÑÄʓɯ̿T̃ԆҕӮĜǢώْQȿؑıۥɑϛֵщ","@@νʶϻǟҕ҃͡Õـ٧̜ČƺˎҴƀƜ˜ʴФ̅ʪ"],encodeOffsets:[[32278,-29959],[29674,-29650]]}},{type:"Feature",id:"ZMB",properties:{name:"Zambia"},geometry:{type:"Polygon",coordinates:["@@ІÏÉŠÜ‹ÆɩǙڻLjۡ˃̇ʭޭѶɓᢇۗĂׯÙÅ™ÓͯĹ̛̅ßܵۓҭխ˳o˗ĬऱĠƯÚOêͧȎկ¶ۋȑչԾ֣یžᦶშYí̂Ű̀ƧЀĪТėʺ̂q¶ʽϾrՖûˬϡڨÅԤˆȌѯ٠ş̴ΧΈҥ٠Që࣠ɱƳח͞ɧƬļࡈƬসȉψʈ՚ɤĶ଀ƚͦđΘɇͰƗՖƗӊʧ"],encodeOffsets:[[33546,-9452]]}},{type:"Feature",id:"ZWE",properties:{name:"Zimbabwe"},geometry:{type:"Polygon",coordinates:["@@ÒČ˱ĵÐÆœÎVՙϞٯźʙՒC̒έĞà¥à¤ˆËƒÓ¢Ç›Æ®Í“ڤलğ˘ī˴pҮծܶ۔̜àĺ̆ӎͰَŚÆ̻۬hϴǯǺȻÐÓѦˑFà©ŸÇ׋—عƊÊħӵŵùɛ؅ࢫ॓"],encodeOffsets:[[31941,-22785]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/xiang_gang_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"8100",properties:{name:"香港",cp:[114.2784,22.3057],childNum:1},geometry:{type:"Polygon",coordinates:["@@™@}ScTÊŸ@cWuJÖ]„l¦RLj¼BĄà˜ ŽH@TOHCTDDDHDNAT@PEHDDNJLX@BABALHFF@DKHADBBLDHHFBLEJB@GDBBFBADDB@@KFAFBBJJA@BB@@FFDDADFF@FADDDBJC@AFBD@@DDD@DAA@D@DB@DHHBFJBBFEHDFAN@DGDC@DLCBDDCFDlAFBFCBEF@BC@GDAB@FD@DZJ‚X´HÄMja@Ã`Âp_PCZ@lLnRGSDMFK|a\\ÂYÂ}­ƒ§™ÂÂMën"],encodeOffsets:[[117078,22678]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/xin_jiang_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"6528",properties:{name:"巴音郭楞蒙å¤è‡ªæ²»å·ž",cp:[88.1653,39.6002],childNum:9},geometry:{type:"Polygon",coordinates:["@@˜@ÈÒĊanwÅŽV„™Ȯ¦ͪŃĢ„ÜÅȂçČéÆÂżLɆóĊ‚Ċaʊű¯²Um»ˌmÈ»V™ʠţWÑůǓ郙ôƑƒğÆīŎī@Ƿ™wô™˺LÞ¯ƨVǪуšĢ™ȘV°wĢŽôk°¯ƒ»΀@Ȃ»ĸŽǔ@΀ƒ͔ôôLɆóÌÃÉœLɲÅͪƒƨóŤK@Ä«@IUÂ܃ÛmȻţǩÃ˹ÛljťǓǫÅ@Ʋ¯VçÅKÍ¿ÅΗÇţ»ƽ™ɅÂÆ‘LÂÓÅÂÅÅɱV@ÃÄŠU¯ÑĊĭÞLšÞŎJ±̃XȣˌÅlƒUÂȯŎKÆƅ°™XÑܱnÅ—Ä¡V¯™óaUƒƧUÅÅ„Ñ™±„çɲ¥lĉkğ°ƒk¥˜ƒnÄŸÅ£L¯ÃÃUƽĬÎlķ°@„Å„XÿïV»ŹLʉÞɱŤĉÂó°ÃJ™¦ÃKãţܙÈĉ@ƒxÇ©UÄ‹ÂÆ‘@ky͓¹™`U²ĉVġ»ğa¯¥ť@ĉ™‚ó@ŻÛÛJƒw¯nó¯ġWƽʩķÃÉ›wĉĕüȭÞķÂÅ@ó£Å΀ƑŽ¯ôȯÞ¯Ȱ™ÆÅèĉXǼó@Únºƒĸ„ÞVƜĸȚUʶõˀĵĖɱŎÃÄ–VࢰӒѢ°˘nÏšVˌ™ÈmɼĵŦW¤öʊõʔ@°ÈXVŽ™ènÅŽÈb¯ÂÇ«Âĉ„±Èğ`Ä¡wÅÔğ»mVVŽ„åó@™ĸķô@ššbX„ĶmV²²`Þ_˜˜ɴbͪÈ°„ÞWĸÈŌmބškɲŽÈUÆ»n¼ǬVķĸźô¯°n¦ɄǜÈ"],encodeOffsets:[[86986,44534]]}},{type:"Feature",id:"6532",properties:{name:"和田地区",cp:[81.167,36.9855],childNum:8},geometry:{type:"Polygon",coordinates:["@@ƨ¥šèź٨ΘƑᩄbUࢯÞĕɲÅĶĕöʿVʵķșUƛƒÃ„ķm¹Þ™ô@È»ĊWŎçšÅ°ȯȰðóƒÂÆͿĉ»̽çnƒmÂɱĵƧºóU™™ƽ@±wóL¯°̻L±Æ¯VÂÆ´Ä·b¯VÇ¥ğ²Ǖbk¥ÇKlÂÂÅɱġ@у™óK@™ÇaÃXÄŸÂÅ£xĉČǫÂķê¯K@уaŹ„ƑKƒ¼¯VóaónÄ¡w™óÞéU™ġbóĉğÇl¹™aUóğKW„ÂVůÂn›ÇŋƑ›ķnʇ»óxĉw™çÇ°Åw™°ċ„XŽ™„ób±ƒkÈÇJ—ƒm²ţx@Ã’ÃŽšŦǺn„ó¼n°ÇbUÒ±¼XĸĠłƽXmwĉºƒzÈÜmÂnxmx²ĖmҚbnŽƧêUºĊêÆVóĖóUĉ¼ÅĬƑ°ɆƆŻŚlłÞLš¼nĠƒ¼@ޙšÞź@ŎÞ°VšɄɴжϼÙ͈Ŏ„"],encodeOffsets:[[81293,39764]]}},{type:"Feature",id:"6522",properties:{name:"哈密地区",cp:[93.7793,42.9236],childNum:3},geometry:{type:"Polygon",coordinates:["@@WnÅÆĶLĢ¦ţºź„lxÅĸƽŚ‚Ʉ—Į˜è@ô²ÞUÄ”ÆÅ„V°¯ĸX¦ÆmÌbƒ»Ɇa΀šĢ™ÆLˤ™ȘÑnƒІljĸÿn¯ĶaŎ¯ĢĕȘ¯°Â΂œla¯¥™ǕǔwˤӱlťО̻nÅ»mÂɃĕċţUw°WUóƨÅţķ°ýV±óÅǓéʉ¯ƽÅĎÅÇ–ÈÃÆůǕw˹ǫȗǓƧǕVý™é@ĬţLƧôͩ„ɱŎɛKÌÞɅôóK@²@°Åؚ¼lŦ¯ŰóƜÛlV¼ķ¼ƒ°kȰ™Ű„ĠƒǬ™ŚÃÅŽmÄ–Â`@ÂÇÜn„"],encodeOffsets:[[93387,44539]]}},{type:"Feature",id:"6529",properties:{name:"阿克è‹åœ°åŒº",cp:[82.9797,41.0229],childNum:10},geometry:{type:"Polygon",coordinates:["@@VƚxˌŎÞŎƒ°n„ȂÒ°²VĊ¯VğƾËǬƨÞÞKÈÞĊVźôɆÞĢèŌÂôWČ²ŤVÞĸʶbl‚¯ôn_VÆĸlmÞnVź_ĸ¼Ȯmǖ„šéĸÂW°°„ĸJ„kʠ¼Æw°¤ÈƒlxɆzČºĶI²ÆǔUš°ô@Þ¦‚ƒUÂnUĠ¼ŎÓĢxÄ _²ÇĊƒǬ°ŽȂamÅšçUÂÇW@¯öʓõʉX£ĶťnɻšÇUË‹mϙ¯˗ӑѡᩃaΗƒœɜ°xWÆ´UxɃÒˣ¤Ʌwğ„ʉÅóÃŹÂ±°ȗ@¯„ƃ²¼","@@Å™гwÈ¥Ƨ°ŹÑķV™¼ÞêĊ»‚lĵšm¦ÅW@ĀôÈźaÉœxÈbÞÆĶIОŘnIÇŃÛÃĊÑĠÆ"],encodeOffsets:[[80022,41294],[83914,41474]]}},{type:"Feature",id:"6543",properties:{name:"阿勒泰地区",cp:[88.2971,47.0929],childNum:7},geometry:{type:"Polygon",coordinates:["@@ɲˣĊIÈ¥‚ÅU±ĊýkÅ°ƒĉƽó»ĶƽXóʵʵ™ȯƑÅÈɅ¯ĉ@ÇሗKÖ›@@ˤV֜ʵрƒǬVĸƑŎ@ƆϯÑóŽķ@ʇ»ķ¦έmlÈĸĊX¼WźÛÞÃѸ‚ĢČþ„ĀĊôάVö¼ĊUƨ°°èŎČUÜÆÂóôVôôŽ²êȘlˌç°`n²ǬŽĊaš™ƒÛ°±kÂÄŸmm»š@°ÃɆÛÅÇVaÃÂVm͔ğôÃÈb‚„@„ÂĪn¯š™ÜUĢÑĊ@źīżWŤÈǖWôÅÆI²ÓƨL@ÂŽÄŠX„mmÑÆ»ȰÑkƒĶÅ@ý°m—¯"],encodeOffsets:[[92656,48460]]}},{type:"Feature",id:"6531",properties:{name:"喀什地区",cp:[77.168,37.8534],childNum:13},geometry:{type:"Polygon",coordinates:["@@ÄŒ@°ƒĠ„ôÓô@Ŏĉ@Ƴĸ@Ť£ĢlVÂôWVÂóřXĉŤêÞ@ÆÒĢÑlèÈV@šĠIk°ÆŘ@ÈÈĀ@ǶťÒğ@š„@ÒĉlÅ»_@šƧĖÅĬÅÆ@bźÞnƒƒlVÂœÃĬšWƼʇ„ƒÃÃ…@ÇÅÈwWóĉ±ğz‚ĬČƨƂÃIĉïbÇÑĉƒ¯ʈV°xUŰĊ¤ƪ_ôÓɚI@lÈšXȮ™ŎlɴȘ՘š„¦ɲÆʈ_ɴŽźŽôÞʊŎĠƒɆxˤ£ɄÑVwXƳ¯w›ɛŹ٧™çƧ¦ÅƒÙ͇еϻɃɳU™Ã¯@ÅÃŹš™@Ä»mğ™»ÃKkÅżřɅƅƒ¯ÆīĊ»ôVôĕÅUĉéV¹ƨém™anѱĕnwmwnÂÇۄyĉ¹ŹlÅkĵèķmÅÞġKñÔċKÅèĉzƒŽ„ômxȗÿƿI@þÅČÃKð@¼ÈÂVºš@ÅĢšÆUÂÄ‹Å‚n„ÃÆǕČĵJm£ÃJ¦@ĊƒxV°ÆLċ¼ǩ™@™m@ÅĢómÇÆğ¹Çš™ÆšĖÞKšx„wô¦ÆÑÆL²ÆƾŽU„Ž±ŚÅÂŻĖ@ĬŤÈñ„@ǔÇx„Èǃ","@@VÂǙţ°ğUĠ¯mk¯ó¥ķIġÿÆbƒ„ĉa±ÒĸĀlKU„_m»nwšŽ„m@ÈŤ¦ĉbÞ°±Þżł̦°ĢÅVé"],encodeOffsets:[[76624,39196],[81507,40877]]}},{type:"Feature",id:"6542",properties:{name:"塔城地区",cp:[86.6272,45.8514],childNum:7},geometry:{type:"Polygon",coordinates:["@@ήnĸ¥ʈ¼ĸ@ôÂÏ°Ã’@Æ…Æ’ÅUķƑǫʶпU֛܃LÚ«K@΋ĸ@Æ£ÞġÂÅĠċšLVÄ»™@Å»Ãnm¯š»nŻĊ@nÂķŃ@¯ómóÛÃǟ¯aÃóȭ¥ƒšÅUmxĉbÇї@›bUº¯X¯ÆƧbVÒĉnÇ•w¯°ƑŽV„—ŽÇ@kx±Uƒšɱn™ŽÅKƒ„¯ƒĠǠU°ɜL@°ƒxnĬ‚ĀŋŎÇLƒŽğšϱÞέƜkôÅĀǕłƒĸĊŤUŰĢ°„¦ȂϰÜɨ°x@°żǠÆƈČVĠ»ČL°ÇšbĊÑÌóÞlĶwބɆVÞwǬxǪţȼÜLÅĶˢ@","@@óKĵĀV͈ĉłƾNJÆŤƒzXl°ƒÆL²¼źŽôÈĢǔ™¦l„ô°ɜÞʊÂĠğŃm»ʵƳƑÊÈ—Ä«V¥¯ĉ°Ñ@ŃÅI™»ĉÂmÄŸn™ƒašÂƒċƨbš™Vğ—w›ġ¯@UÂÅa™ĉÃJğÑÆŎkŎÞĀlźƒ¦"],encodeOffsets:[[87593,48184],[86884,45760]]}},{type:"Feature",id:"6523",properties:{name:"昌å‰å›žæ—自治州",cp:[89.6814,44.4507],childNum:7},geometry:{type:"MultiPolygon",coordinates:[["@@መL@È°ĊȂɆƒÆĊ£„ťôÂWÓɆbĢÅŎƒÆ¦ČÑW¥°ķU¯ÆŃVē±Ã@ó—ç˜ĭÂɃƾřÆķkwŹƒŤ¹ġ¥ĵKÅÃ…XmËÂщwǓ¤ƑÂ@wóÂÅVķ£ɱšġôÛa±ÒÈ„óèţIVŽƽ¼k¤ó¹ġJmx—»ÃUƒ²™@ÅƃĸǫŎ„ĊmŎǬ՘"],["@@Þô°bÞǠôÜôn@°ĸń˜Ƕkłƒ¼UޙKğȂÆÃĢŤķ@@ΌڬLÜ„K@ˣȂ˭lĉńW¥ĵVÆý@ŃÞēUŃȗƅ@ŹƩǕĉ»k»Ç™VğóřX™ÂÅ»KÆŽċêÈèÛŎġƒͩń"]],encodeOffsets:[[[90113,46080]],[[87638,44579]]]}},{type:"Feature",id:"6530",properties:{name:"克孜勒è‹æŸ¯å°”克孜自治州",cp:[74.6301,39.5233],childNum:4},geometry:{type:"Polygon",coordinates:["@@ˎǫĠƽ°UUĉ¯±ÈÑmƒ„¯ÃÅË‹Å™wUű»ÅƑ°ƒȘ@²¯ɳÂʇ`ɱŃ¥՗™ɳȗÅkȭšșW@kÉ™JóÔƩ`ĉ£Vů¯wU°ʇĊ„ÈÒ°aĊÞÞJÃ…ÂċƧÂÄ«Ä yĊ²XôÇxÈÆÆ@„ÞʈƒÅ»™XÞīU›Ƒkm„ŹÃ@aŎÅÆīƨĕ@™ż`ÄŠk@љƒĠ@ŦÑ@ǵÇÿ@ÇÅŗl¯ğJ@™ÇUkçġÒÆÑÃ@ţéWĊôŚUŽóXUÂÄ¡kţ¤ķ@@Æ´ÅĊó@óÔğƒ¯„ċ@@Қ¤kôˣŰ͓„k»ƒKX¯ċwƧôğÉšÒôIVƙš¯UķǬķšnŽ™¼ôb°ÒȰVVÈÞ°ƒĸó¤V¼°„V°²êƒlĢ҂Uƨ¦ôÂÈ°Æ´ÄŠVV¼ǖIċĊ„ÞɜéšnÄŒW˸Ǹša„řÈw±īšçĸ¤ĊšôšwšŽĸUĢ¦˜éǖĬ„Āô¼lÞkÒ°x°ƆÞx„šÆV²Âǔ»„b°wގȘ¥°n„šŎV@°„„ʠè‚ŰȂb"],encodeOffsets:[[80269,42396]]}},{type:"Feature",id:"6521",properties:{name:"åé²ç•ªåœ°åŒº",cp:[89.6375,42.4127],childNum:3},geometry:{type:"Polygon",coordinates:["@@ôK„ĉǪa²¼lÜô@ʠê°Ĭ™ôȂƒ²ÑÜbĢóɲ™ĸ¤ŎUôÂ@xƒŽǔ£ъxËŽÂmƒÈÛ@‚_nĕÞÅšř„ǫƒğšůlȯ„¯ĸ»UȆkôƛ°ůkť™»Ŏŗ@¯@±͓óͿ„Ǔ@Ä·ÂȼͿ@Ƒ¼¯°ólġ¯xÈ—UġšƑ™ǩÒƧUð˹Kóššx@ǸÅĬÅĬƑĠ󃄚ǔêÆ°XÒʟŤUšÇ¼ˋnn¼±V²°ȂUÅŒÃÂœbʟǔɅô@żǬaҎÈ"],encodeOffsets:[[90248,44371]]}},{type:"Feature",id:"6540",properties:{name:"伊çŠå“ˆè¨å…‹è‡ªæ²»å·ž",cp:[82.5513,43.5498],childNum:10},geometry:{type:"MultiPolygon",coordinates:[["@@ĉ„ÆŘÈÌmÞ¯ĀX°±¼@ƾ¯ƴ°ŎÃþŋ¦WÜÞbȂĉźUςmwVUȂóô@È°Ã΀ÂnÂÆJn™ƾ™ʠ™ŌLČóǪ¯œ¥ǔaǖšŌaôÃÄ¢Lšx„ƒÆLšÂɲm„™²VlwÈ@˜ÂUƒƒÂ°¯ǖxÄŠmUÑƨa°Å°WV¹œa›ÇɃÈm¥°¯ŹóĸķǫUm»Å¼ÇVɱ™lÃŋnķÇÃX¯ƒͩÇɳa——Ã`±_U±ĵnWĪa@™ĸóšķ™¯ǓV±ÅĵJċ¹ɅykwDŽ¯£Åxʟ»ƒlÄ·I¯ƒX¯ķ‚™êǕƒȭnķ»Ź`±„kÞ@Žš„Ãô@Þ°xšŤŎIƨÆUxÅš¯²ǔĬǬlUÅš"],["@@ÞĀlźƒ¦¯ĸŤKޙšÂƒċƨbš™Vğ—w›ġ¯@Å£ÂƽJ"]],encodeOffsets:[[[82722,44337]],[[86817,45456]]]}},{type:"Feature",id:"6527",properties:{name:"åšå°”塔拉蒙å¤è‡ªæ²»å·ž",cp:[81.8481,44.6979],childNum:3},geometry:{type:"Polygon",coordinates:["@@ήƛϲÃĠ™„ÂÈKÅŒÅÂÿmī„w@¯ɛKV¯ğǟ°Ƒ™wÄ¡KóÞŋbǕ™Ǔb›¦ǩ°ċôŋKʟšƽšmšÅImŽͿŽȯÞó@ÈôUVnx›ÈŹVÈÄŠÃaÂbŻ£¯°l„óxȂŤĸkĊšÞyĊêĊmÄ¢xV„ƨÂȎĠX„ŽΘÆĠÔź‚Ɇţ°LXÂƾÂŤÂŤb"],encodeOffsets:[[84555,46311]]}},{type:"Feature",id:"6501",properties:{name:"乌é²æœ¨é½å¸‚",cp:[87.9236,43.5883],childNum:4},geometry:{type:"Polygon",coordinates:["@@šŽWŽôŚUĠȚl¼Ċ¼ƪǖ@źȘƆ@ýlܚXVŘޙš¦V¼kĖó҃èkÄŠÈˮ֜@Ç«Õ—nŃĉǬÅ„ķÆŚ@„±ÞV˜¼nwÄ¢Iôºl£ƾ»UÂŤJôçšó¯īʟéó@kÛ±»ǩbƒĊóLÒÇǫb@ŻɆóʠǓ›aŋÞÈVʉłĉbĉÂɅô"],encodeOffsets:[[88887,44146]]}},{type:"Feature",id:"6502",properties:{name:"克拉玛ä¾å¸‚",cp:[85.2869,45.5054],childNum:2},geometry:{type:"MultiPolygon",coordinates:[["@@ɜÞʊÂĊýVaŃm»ʵƳƑÊÈ—Ä«V¥¯ĉ°Ñ@ŃÅI™»ĉÂmÄŸn™ƒaÚţL°ķóKĵĀV͈ĉłƾNJÆŤƒzXl°ƒÆL²¼źŽôÈĢǔ™¦l„ô°"],["@@ƾIŤÂ@UUwÅa™ĉÃJğÑÆŎkÅŽ"]],encodeOffsets:[[[87424,47245]],[[86817,45456]]]}},{type:"Feature",id:"659002",properties:{name:"阿拉尔市",cp:[81.2769,40.6549],childNum:1},geometry:{type:"Polygon",coordinates:["@@nIÇŃÛÃĊÑĠÆÅ™гwÈ¥Ƨ°ŹÑķV™¼ÞêĊ»‚lĵšm¦ÅW@ĀôÈźaÉœxÈbÞÆĶIОŘ"],encodeOffsets:[[83824,41929]]}},{type:"Feature",id:"659003",properties:{name:"图木舒克市",cp:[79.1345,39.8749],childNum:1},geometry:{type:"Polygon",coordinates:["@@VéVÂǙţ°ğUĠ¯mk¯ó¥ķIġÿÆbƒ„ĉa±ÒĸĀlKU„_m»nwšŽ„m@ÈŤ¦ĉbÞ°±Þżł̦°ĢÅ"],encodeOffsets:[[81496,40962]]}},{type:"Feature",id:"659004",properties:{name:"五家渠市",cp:[87.5391,44.3024],childNum:1},geometry:{type:"Polygon",coordinates:["@@„çôÑlÄ•U»™¥ÃšUŗ™WkÛ@þVÅ„ÃÄ”@ńÅþĶUX¦Æƒ"],encodeOffsets:[[89674,45636]]}},{type:"Feature",id:"659001",properties:{name:"石河å­å¸‚",cp:[86.0229,44.2914],childNum:1},geometry:{type:"Polygon",coordinates:["@@lÅ—ǵm‚ĉ@mż™¼n°ÞmƼš@"],encodeOffsets:[[88178,45529]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/xi_zang_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"5424",properties:{name:"那曲地区",cp:[88.1982,33.3215],childNum:10},geometry:{type:"Polygon",coordinates:["@@ƨʔĸbܺÞwnxźbÞ°ô@„ÂĶŽĸIȼĊJŎÈôUšÃƒ¤ǔLÞÂÅŽ@ĢŽȘblƒôL„ÇźçȤôLš¥ÞIÞ¯Ķxʊťƨ™ƿÑĉXVķŦ¯ȂKÇǕšÑ¯IUš£¯Óƿ£VÄ•Ã…ÂÞÿÆwƒƑ„£ǖxÞĕ±ÇÃaUÑȃU¯‚ÂUÅÈÃwWÅĵ™±Ã„óĢÿ°IÞ±mÅĢ¯mÿ„¥°UnÑŤÂĢĕĶwǬŻͪwŎ¼źÇĢ„ĠĕˎÅ°óƨ¼Èa‚mÂÂ@¥°wǔ„ǖ°ŽƨÇŤœšġƨ„ŎŃôbÈÛŎĊ°@Ä w²ÑÞJƃÆb²ƒ°êĊUނlȲƒV„ÈKĊÒĸĉ›»ÅÂôťUÅǃk¯@ǂÑkÂlÇÂÃ…l™Ģ™VÑóƒ@°@„ÛĸƒV¯ƒÇĊ™n¯UĕšÂƽ¯m›¯b™È@Ò°Ĭƒbĵ›¼„‚kxķýÇJk£ÃaUÑÅóĶǟkÓʉnĉƒÃ¼Ƒ„ó»Þmn£m™Č¯@ƒȮÿV¯ĸƒ™k@Ãówƒ»ğ„ġ±ǓLÅ„ƒšV¼Æèķĉ™è±b@Òţ„UÑóakƒl£™Ó@¯L@™ÇlUóÈš¯aġÈÅĕÃLķ¯Ė¯@WĬ—x‚ÒÈnW°ţôU²ǓÓġ²V°¯ôƒǔÃL—Âċšk™š»Ã»Ãš¯ÞƒVƒwۄÃÇÅͩÈĉċ»ĉm¯£W¥ţKkóġÆÂW@¯±kÅÂŽÂțb@җšÇaƒÆ¯a™„ƒkóŽÛƒÇ¦Ãa¯šÃ™ĉ@ǻۄmƒǓxķƛ¯lVĀÅÞġb™™ÇJUÂÃ…V™ĖƑW™zŻŚƒW™n@è¯ÞóVkwÆ©nkźÇބҙޯƒƒýğÇUxÆÈnè±bĉÂûÈуwšwÞ@m»ÈV@ýÇ°ķ™Âxƒa„ïXċ¥ƒÈóW@ôkxlnÂxVÈóĊkŤġ¼@°¯ŰƑL̻۱ŎÃV—Þ›VƒÇÞŎÇakƞ‚š@èğŎĸżšƾ°ÒšLÞôĠKȰĖźVÈÒĠ„¤™ÂVôšŽU„ÈþťL@ôǬÞlÜÈnÇÒUŚ™@šĊƨW°™°Xƒ‚@ČÇþ„ƴĉÒķ¦@ŽĢôWĀôłUÞĢǬ™ź°¼š@ƒôV°„bUÆnzm¤ƽĸƒÈ"],encodeOffsets:[[88133,36721]]}},{type:"Feature",id:"5425",properties:{name:"阿里地区",cp:[82.3645,32.7667],childNum:7},geometry:{type:"Polygon",coordinates:["@@„Çƾķn£myVŃaU¯„ó™@¯»šŹġǫVÃóÅXÿġó@Âĸ¥ĊуƳÈý@ċ„ÂWš¯X¯ĉƧ‚™š@VřÈÑÇmkÛǫÃ@óŦKÇýVĪÂUóšÂƒ£ğÂÇÑŹUȯĕğLÃó™K¯Ñ™ƽķŻĠÅ@ç™lÆÈbÆÂÈ„œU˜ÃÞU²Å̼ůƒK°ů@¯UK±Â—ĊƧbÅÇmçÈġƒóšÅób™™źóš¥kīƯól™ç™KôĵUƒÅ„VŃķ¥nÃ…Åm¯¹Å‚™»@ÑÇÂóxÃkʇȤU¤ķb@ƒ¯ĊÇx¯ĸĉKm°šĀk¦l„„KnĬȀƾÛ¦WÆÅÂmNJĉ°ÅUţ¤UšŎ°šŎKÞłÆ„Ǔ¦ƒÞ™‚™Â„ř¯bmÂUÂÃl¯Um™ğl¯£șwÃ…ÂŽÇ«aÃnĉĶƒk@¯™K™šÅ»ĉn™aÞ»ťnkml™ĸ¥UŚŻkÑťƒÂĉV™ôó°LôīĠU„ÿĉǕÅz±Kƒ¤„²Å¤¯Ė¯UÃÂ¥Vĵ™óÈťÃwķșÑk¤ó„™ƒWýĵĕ™„VĠƒVóƒŽǓ„ķ°k±VU±ţ¦UÇŸÃřJVљ¥XUÄ‹UÃ…ÂŽlÂÛƆǕÆȗƆ¯wÅÞÅ@™šĉlÃÂóŽƒÒ™nUôńlxólÃôێ±™™LÛôÃL@‚ġ¯X¯ÇUżóa󤛼XÒġŎóLk¦‚ôżĸĠ™¼™KġƆô¦„ÆƑÔĉĶ¯ImÒ°¦n°¯Þl˜ÃÄŒn„ƒÒšKĠޚĕkƒlýƾťœšôI‚ĖŤÒnÆœm¼¯lnżóÞ@Ůó¦™ôƽĖċŚn°Ã°ôÈUƜƒblÞóŽ@Žǖô°UÈƆ°X„þôŽô‚lѢšŽ²Ėm¦°š@¤™ÂXÂŽÄŠblܚzkºƒĖmX„šŎWVšóÞn°lÂÄ xÈša°»żLźƒ„b@Æ°XÄ ÃÈšxĊĕŤaȚ‚°È@„„@èŤ¦Ü¼œW˜ÞkŽÈ@V°lŤkŎ±²¦ÆUšlj°aÈÑŎbĢƒŎbÆ¥ÞIȘlššôVÈU‚™šb„kɲĶn„mnXb̼òƾĖŎ@Ä¢ÂȂÑôÓĠĖʊšĊÔ"],encodeOffsets:[[88133,36721]]}},{type:"Feature",id:"5423",properties:{name:"日喀则地区",cp:[86.2427,29.5093],childNum:18},geometry:{type:"Polygon",coordinates:["@@ĶĖXþš„ôƒl£šÒĸÇÞxÇŦšôUĶÞ¦°V°ĕŎ£ƒ±„£²LÆyĊǖƒĀğVóĬ¯KóôUš‚ĊŦ„lҙżVÆķ¦kšlnŦmüšbÄŠmŎ¼š™šL@°„lĊĵÞmǬbÆÂÈšx°¤Ġknš°VÞkVÂn°aƒŚš‚šÂ„Ãǔ¥ÅƒÃÅÅL¯™ÅÂV™Ť£ŎVĊ¯nljÆÂXÅÜ¥ǿƽmīƒLkƒl¥™ÿn¯ĊL°ķÈw°ĉ@ƑĸaV£ʈȣÞlôwȎ@Қ¼Æ°ºÅnmÆĸ¦UńƃV„óĶšLšèôkÅ°lĬ™¦Źôššôa™Æ„ôÇĢnèŎÈƨa˜ĉ²‚VLĢ»lţôĉUǂwkmlw@óôX„ÇȦ°WƒÞ„b‚wĸšÈ¯@þÇUn¼Ã@™x„xÇńÞ¼ĊŽ²amçÅÇVwĠȄþ°„šÃƒÑÈÃlŹƪmlxôU°Ã@çšm„XŎ™Ŏ¼šyÆ’XšĕÆUVÂÈIššĢaÆÃUÿ°kĸƜǔwn„܃ȼĊ@ޚ°™Þbȥ܄ô„lšƒ°b„ÅÈb˜™@ќa‚ǯUU¯Vġš»ƒ™¯aV¯ǰřmnÑŤçǬVǬ™±ĉ¯¥Vĕ¯Ãk£˜Å—w@±ġÛ°ÇVїƒ@ۘa@ÂÄŒL™Ƴ™„ƒÂÇa¯¤ÃIĵ¼U¥ƿÂÅķÅţŻókÃóĕ‚¥¯™U»Æ£X¯ġŃÛkðV°ó¼¯èWôÞĖ„ȎƒŽkĀƧĀówm¥¯JŹÃJÙÅVVÃ…ÂaÃÂÆ‘@ƒ˜ğŭǂ¯_ƒ˜ĵ—›VnxŃón›ƒĵxÇĖĉVÃÈğV™Òóƒ¯Â±Żĉ£ķÆÅL™Ljĉý˜ţۃ¯VƒnV¤ÃÈ@°ÅÞä™ŰğÅm¦ÃxóKƒ¥ɱÈUĠôêVôÛ¼ÇWÃçĵaŦóĖƧlÇĢƑŽnŎDŽV¼Â¼‚ºÛ@m¦ƽ„ĉmm¯ÃKÛç¯bÅÅ‚ÂĬ™bƒ¼ÅLmŽ„xť°ÅU™šÃXkÂŽÃmĉ¦W„¯K„ÒknÃaV„Ãè¯KÉ…Å„ÃKnÞ¯¼"],encodeOffsets:[[84117,30927]]}},{type:"Feature",id:"5426",properties:{name:"æž—èŠåœ°åŒº",cp:[95.4602,29.1138],childNum:7},geometry:{type:"Polygon",coordinates:["@@‚VÈłVôÈk@š°K@ŽšÔk¤l„ôbVÒŤƒ@ѲašçĸĊÆçU»„™ŎƒǔKĢ²Ġƒ„¼ôx@ޚlƨĬ„Ul¯ÈLV‚šÂÞJ„°Ünʊ„wÃœbXê‚VÞ¯°ššanaU°wƼɴÑWÑ°mÈýÈam¥Þ£Ť@„¥ôblÞĢ„ź¥ôxÈÅmÚ™ƒĕŃV»ĉÅŤÅnóƒ»ÈīķIUƒĠÑ°ġĸLÞ¯VÒƂ@Ä€Âbš¼WôÈ@V¼ôóŤKÈÑU»šwVǫżnWÒÈx™¼‚lŦ£ĊÅŤx²¯@ƒÆƒU¯šçÆ@„¤°£„é°k°lšůÈó@¯ŤÇÈĉƒkkÿó¥ÃXķљÜ@ÒóŚÃ¯°ĉówÂDZ¦ÅJUÒĉĀķw¯°mĖ¯„±akxÃÃ…nƒ™»lуK@¯lU™¯UVѯóĊ¯mÅÄŸVǓƅƒÞƒWÃÈÛ@ƿô¯ÜġzÅþ¯ÂólmôʇÂÄ¡ÄŠÃ…UÍ¿Å™ÅÈË‹ÅóÇˡÅƧƒÇb™w°Ķôk¦šÒƒnUþġҙÔkǔķèó@ƒ²@ŘÅńĵyƒzÄ¡aäÅIƒ¤ɃÂť¦ğѯ¤ķbóš¯ó±ŽU²°¤ČÂÃœVnÈƂ„ŚŎ°ôĢ„þÆzÂèVĀǎÂĀǘƒXŹÑ¯¤ówÄ‹Ä·k¦šłUÃ’Ä¡zÇ@ƒ™ÆÃx@²Þ@Ƥ„Uô¦Uš°x„U"],encodeOffsets:[[94737,30809]]}},{type:"Feature",id:"5421",properties:{name:"昌都地区",cp:[97.0203,30.7068],childNum:11},geometry:{type:"Polygon",coordinates:["@@™ŽVÄ–m°ĉš„ÈU°ķ„ƒÜ¯@@Âô„UÒġškš‚ÆkÈlÂŽÂÃ’@Èl°È„VÆóŦƂœ¼‚a„ÅĢ™ɄwnÂÅw@¥Ŏ¦°ŹÞmVš°wnÿƒw„wÃw@¯šmÞŗ°wĠ˜ĸkÞğlĔ²¦°@„ĕĸwVóšal@nĢÇĊn°@¦šŽźUXçǔůĸVš™ÆK„ÈÃĠš²ÅĔô@lšŽÈ_m˜„zÇ–Âl„šaU¼ôwV°¯¦‚ĬÈa„l@Čǎ„¼™„nŽ˜I„xô»ɜ@ƨ¥ɆÅ„ŃǪÈkƛƨÈʊȡóĭ›@—ÈÇVƒůރĸƅmēƨť™ÅÈʉVǵ°ġVŭÅɧ°ÿnɛš£mƒķ²ŃóÑUĉ°mÇ»¯@mxUĀ¯èţ°ÈÃç„ġU¯ÆÇţÈ@°Çô™Ű¯k¯lƒê¯¤ƒ£Å@™èV°Å„@„±°ţwĉŎť¤Âkš»ÇwXÑŻmUǬ™xV¼ÇÒţLóôUȂ@X󙻂a@ÿÅÂUÑðķK¯ĢğÒV„ĸJÇĬ„¼môţŎĊŎU¼Æ„„Ė™šnÞÇÆówŹ¦ġƒkÃóaƒ¦ţ@än¦ÇbÇþ¯nXÒɳÒÅ»¯xVÂmb™b¯™Ã°ÂUWéÛaƒxʉÂÛmƒ¯ÃI™‚UÂÇKk°ƒVƧīķ„U°ȭĀ@„ċ°nšm¤Ãnô¼ƒƒÞ»Ċ„ʊmlÔĵǠÆôVÒÞbl¤ÈIĸþlwƒÂœ»ĶŽ„a¯ī@њǰanœƾ°"],encodeOffsets:[[97302,31917]]}},{type:"Feature",id:"5422",properties:{name:"å±±å—地区",cp:[92.2083,28.3392],childNum:12},geometry:{type:"Polygon",coordinates:["@@°ÞUĖ°¦²ĊôÇÜLǖĀɜŽȘŰÞLĸÂźêÞ@UÂÃœUŤ°ɞ¯Ü„°WŦĀmŎ„¦ĢyVљÅl¥Čĸôx°£źÒ„Wȗ‚ÿÈÂUÿ‚çÅyƒýóġůƒřÅÂmÇÛUċŽ¯£V±²Â°ôô™ĸa°£ĠÒŦ¥ɄŽ„£ÆJÞ£Ģb„yĶzŎŃ@ŗ„±ô@ĸçlǓšÓĢÑVý„m™Ñl¥ĵó‚¯̻̥™ƛǫÃһÇƧÂĉyţ¼ÒÄ“VĶĉŎ°ĸmšÞVÃĸ™ÒÛaċ„ó™ŹĖƒèÈÈl¼k¤ÃX@`ÞÂżÂÆżÇçĉKUÃãğ¤@¦ġl¯ÒġÂĉ¯óš™móxÃÞğVšƴċK@—b@ܘ„UÒ¯ÈĢÜ@²˜x—Ŏl¤"],encodeOffsets:[[92363,29672]]}},{type:"Feature",id:"5401",properties:{name:"拉è¨å¸‚",cp:[91.1865,30.1465],childNum:8},geometry:{type:"Polygon",coordinates:["@@Ŏ²l@°‚XÄ¢ÆlôŤLX¦°¤ĊnČ¼ÇĊŎͪÞÈ܃„x„U°Ãޙ޼™¼lšČ™˜ŽÞK„Ǔ°óU¯Ģ±ǔÔV±ŤóX¯ÇmÂјwXī°@°ĕĸÂÞKÆĖĢÇ°bȂ™ÇÅÂUƒV¯wV™ó¥ƒVÅ£Ã@@±ÞwšÅ‚„È@ĴnÅťÿ¯XۃÉ°ţ¯ÛVVÂÃ@ŹéķÂÃKȗůɛÂǕÿÛKóÈǫšǫUţèmҚn¯Æ°ÈU‚°b„š™¼UÄ¢V°°V"],encodeOffsets:[[92059,30696]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/yun_nan_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"5308",properties:{name:"普洱市",cp:[100.7446,23.4229],childNum:10},geometry:{type:"Polygon",coordinates:["@@U‚ô²‚a@Ž²²Ķ¥œV°šĶ²bl¤kÂVxl‚@Âœ°‚Ś²@˜„„y„@ô¦¯„@xƒxVxU„VššbVšÂÃœm¼Ŏ„„ĢmºXXWÆ@ĀœšmÂŽmXU°ÅÒm¼Þx°w„@°‚XêĠ°»nV°U„l@k„@V±ôī@£‚ƒČŃÆ£„KÞý@¥‚k@y„a@—nWV„UVƒšwƒmģÂJƒknm@wmkn‚X„˜šX„¥mUUÂlUnbš¯°ŽnkƒÂVInÂlIUw°Ân™mÂk@@mlanXlanmšk@wVWUw™_@éĠašÂnmUaÜ£ƒmXƒ¥¯@@„óUmï¯ÞÃlKnxô£š»„»Ġ„J°aV„UÃÿV¥ÛbƒI@wmŽón¯yÛL@ƒWkÃ…ÂŽmș`ÂIWa¯K@¯mUnÂmaXm™bmak„¯ŽƒĢ™ÒÃm¯ÂmV¯KÇb¯KۜWW™X@a™V™ÂknÄ‹LUWV™kXóW@k™a@ƒób¯UƒwmbÂÂ¥UUlaUÂ¥U£maķšƒKXkƒmÃ@kwmѯÂk±ċbUUVakaġ¦ƒƒkL@`ƒœ™a¯xƒm™ÂљLUWƒ@Ä‹nÃ…ÂŽUV°LkL@b°°@¤š²ƒ‚šnôôk„l°kè›ÒÈzV¤È„WôôƒnV@„ƒ¦@¼Ux"],encodeOffsets:[[101903,23637]]}},{type:"Feature",id:"5325",properties:{name:"红河哈尼æ—å½æ—自治州",cp:[103.0408,23.6041],childNum:13},geometry:{type:"Polygon",coordinates:["@@°°nÞôV@ƒ°@„¦WŽ„nÛ¤Vbmn™ÂÄŸb@êš`VxUX@xš„ÆÂÞUnn˜WÞĸĢƒšÈ@ŽÇè@zÛÜWšÅêlš²„˜KnV¯ĖĊx@bk@@„°JÆ£Èbl„nnm°nlÂUkVUUwVm„Kn„‚nVŽÞxVLXÂ¥laX@@xl@VzȎVmšk@b°šÈĸmÂŽV¦Â`W„XšƒbUb‚bX¼°x@ašVVkn@lþnXUlVxŤÅ„y‚IUƒka‚IÅŽÄŠ@lXx@b„z@‚ô„ƒ¥„_V@l‚n@„Âôy@al_l`nÂmƒÈ»@kƒmXwWK™U¯»™a™Å@wƒmUÂÃKUa™UUĪwWƒ@w²»@kƃV£—mm£VKkÑV@@»nwƒ¥™ƒ@kƙnllIVlnLVakalknJšÂWmnaUaVÑVVÞÂnÂ¥mÂ@ƒ„¯Uÿl™@™™™VçƒaXaV¯UyVLVkš@nJlšXLlÂŽkxlbla²Òl@nÂVJVkšx„KlkUaÂVÄ·ÂÃÑUÂ@Ã…m¯@±™Uó°ğńķĠmU™Ñ@ǯ¯Å¼@nml@°¯Â¯`@w™£@¯Çƒk@ƒ»nmċ¯U»™I™Ž¯LÇĶÛn@bó°™U›šÂwmŽ¯„™Umǯa„™ƒ™ƒI@ykIƒVUŽ¯bƒIğŽƒ¼™¼ó¤mwkLÃÞ"],encodeOffsets:[[104243,23429]]}},{type:"Feature",id:"5326",properties:{name:"文山壮æ—è‹—æ—自治州",cp:[104.8865,23.5712],childNum:8},geometry:{type:"Polygon",coordinates:["@@šwô„š@²¯maUmôUÆxš@Xš˜bÞInlVUVw„JVaU„K°¥„xmÞXnlKlnna°@ÄŠÂȄÆwUmnkl@°ƒƒ£nyn@VÂV@Vak™ƒ@@kÞÄbmx°Vnw°klÂÞInĖÞVlKl™@ÂXa°„„KlV„U@šJnx‚U@ÈĢbUKlm@ak_‚wšanWUk°ƒl»„k@Wk@lwU_ƒ@UalóU¥ƒÇnÂĪkJWƒ@ÂÂmVXx±bƒK@nÂV±a@™Åa™£ÃK²ƒWknamKknÇÂk¯ƒaV™™V¯ĀƒU™„™ÒÂ¥ƒI@mm¯¯xÃ…ÂW@@`k@ó»ƒUU¯lm£ÅWlĵ„w@mmwÃ…mWÂÂU@y±U—xmwU„¯UĴÃ¥¯£m@kŽÇVUÂV°VbklƒL™wUlUIm‚k@±ÑkbkalwkÂWKk™mI™@UlUKVzU°Wb„bU蚚@škšVĀƒ°@„n‚m¦ÃÂŽUUUÃ’VbmbXn™‚mIkllbUbmKUkkJmkŚ@lš„„¦mx@¼U@lÃ’ULn¤˜nU¤Å„@l±¼@xX„šxV„šVVbÞLVŽ„n@xšÆšb°¼šV"],encodeOffsets:[[106504,25037]]}},{type:"Feature",id:"5303",properties:{name:"曲é–市",cp:[103.9417,25.7025],childNum:9},geometry:{type:"Polygon",coordinates:["@@ȦlKÞĕUÂV¯Um¯„ÇVUnVVUƒĉn™ĊÇƾLn°°È„JÆw„@lbÞa„¦V„XJ°¯W¯„aÞJVkUša„ƒ@ÂlKnÃ…mWUk¯a¯»@Âm±@уkkbWWX_WÓU»Â_l™kÑm@U»m@Âl@IWÄ‹n¯l@VanV„UV™UÂVwVx„KȄVmUē‚@„ƒn@VÃÆL„w„VVwnVlmkUVÑÇ°ka@k™ÿÃaÞUl£™›Â—ċĕX±±ĉƒa@UnVnalónk@wl™UVmkÃJ—aW™™@Ã…wóVVnnb±°™@óƒ™xXLWx„n@lǼn„m‚k_k`@bózƒ‚m@kÂU@ƒ`„¦óƒ@nWš@ÜÅXWwÂ@ƒyƒb¦@Ã’lnUb@x™lÃœÂk‚@²Ç@Uƒ¯bmy@ÂkV@bƒb„¦U`lLVx@b—Ll¼Þ¤@„°VVބU@WÞÂUb›J@nnš@lnnm„šxUŽƒUUbƒK@šÇwklkUƒVWakn@ÂŽlbU@@„ULVxkKUn‚°¯Ò@¼™„kmƒ¦m@kl™Ȱ@lU„l¦„@Vl°wšnnþĊUÆbUx™b„ŽV„šĖU°„a‚nnašV„al@@b"],encodeOffsets:[[106099,27653]]}},{type:"Feature",id:"5323",properties:{name:"楚雄å½æ—自治州",cp:[101.6016,25.3619],childNum:10},geometry:{type:"Polygon",coordinates:["@@mÃ’ÂXU`Wnšš™@Xl±¦š„Uxnbl°knmKUx„„ƒxVôUx°¼ôÒȄ°JlnÞKÄ ÂÂœW°¦ƒ„Vx²JVwš_°¥@UV@@wnymknK¯I@‚™²b°ƒš£V¥šwU‚V„¤nLškÆJÈwôô°„l»Č¯ƒġVƒUU@Â@ƒ°ƒƒÃXÂl@U»°Å„@U„¯@w±¯VmÂUUlm@m™„ÑnIVyUwmak£Vwm±—@Çw@nƒ@UxkwlÇnL‚mkř@±Žk™ka@kóJV¯Ç»U£lw¯™Xalbl¥¯UXƒ@a˜™UaÈL@ÇVIVƒkaU¯mm™akLWkUJ¯Umxnšƒ@ƒkUx¯xƒ„mWÃ…Ä«ÃkkbƒŤƒbkxWmXwWk¯wƒKkƒƒLŤċń„@¤óĬU²ƒ@@lƒk¯VmU¯¼@xV@k°l°kbUš°nm‚VnUš@°„š„UVèރÆbUÒÞnU¦›V—¼lô„@Vl"],encodeOffsets:[[103433,26196]]}},{type:"Feature",id:"5329",properties:{name:"大ç†ç™½æ—自治州",cp:[99.9536,25.6805],childNum:12},geometry:{type:"Polygon",coordinates:["@@lbÂœKVIUa˜@²m@b™xôÒÜxXLmbnšl@š„„K°šš¼k„Uô‚xôlV¦nJ„Uš™Ænšm„@šx„ÂÆwšbXšÆÂôô„LUÂVwôK@wlmšaVwÂœ@WknmƒIUmlÂnJla@_™@kÃmKUašÑm¯Xw°aUaVÂl»²JV„bÆJkôĶĀ²VVk„mšbVwUó„wƒƒVwnLlmk¯maVw™ƒ²¥Wkš@™™XmV_‚WnÑUkƒ@k󘻜UVÂ¥ÃmVÑÅaÄUçƒVĪ@¯V™Umn¯mV™lak¯l¯U@@wÄŸÂŽWé¯Âƒ@¯xÃw¯š¯JÄ‹a¯ÂUÂ¥mLU¤„bÞȤƒbÇLÂWUwmIUVW¼kbš`U„Vb¯L±ĊÛkƒÿÃKkwƒKţê™UĉþƒÈƒV¯ÞVbUŽ°KVšk²Ã‚mI—ƒmV@kƒm™UkšVxm„¯KXÈķJU¦V°ULWxšL@môƒšb@bkx±LnVUÂŽVLnkÃœWnwlLÃ…Æ’mW@kkJU_ƒV„šWĊ„Þ"],encodeOffsets:[[101408,26770]]}},{type:"Feature",id:"5309",properties:{name:"临沧市",cp:[99.613,24.0546],childNum:8},geometry:{type:"Polygon",coordinates:["@@‚xĢ„l`²X°ŽV„šx@x°Þ°KXašğUњW‚bnIl`X²°b„xl°„„šV@xVxk¦mb„l@xšXV‚ÆzX¤™ÂƘk°„kx@lźêlaX»VUnJVx‚XÈK„aÃȣƒaV£nKV¦°‚Čb°I°™n»ÆÑV¯nWn›™@ÿXÃ…WWn¹ƒġŃn»‚ÛU™™aU™VƒUw„w@w°ƒó¥ƒ@ƒz—ƒ±@Âř›¯@ÂkÂUwlÂk£±aĵŽ¯™›Uĵ¦±±@ÂÂbó±VÂÃ@ó¤ƒw¯I@mńóm±ÂXŽ¯IólƒK@š°Ullb™zkKlln@@ԙºƒUmVk²ôҙx™ŎUVóLƒb„ŽmÈnÂŽmbnl‚a„x@z„@Ǝ„¦kš"],encodeOffsets:[[101251,24734]]}},{type:"Feature",id:"5334",properties:{name:"迪庆è—æ—自治州",cp:[99.4592,27.9327],childNum:3},geometry:{type:"Polygon",coordinates:["@@W™XwĪ@akk@y›—k°īX¥›Uóķ¯w@Ân»UaVaUۃ¯ƒmÂV¼k‚™Þċô@n¯xÛÒm„V‚¯Ô@xƒ‚@šk™wm™Åa@ƒUa‚ïVŃyV„a@ÿšÂn»ÃVmank™mmÞÅôƒ@n£±›ğzÇmU¦™Vm„nÃœmbnÂ@°nV@xmzÃ…@mºV¦k°ln¤š¼õô„n@xkƃIUxUš@Ťƒ¦VšmVkmkXW¤XzVx@ƚx™¼ƒÞ¯b@lVš™ĸގV„m¼XÂŽm¦V„ÂŽÞ@Ǝš¹Vón¥ÆKn„‚KX¯x@èĊȱłXšaÆxnlV@UÛlÈ»kÄŸV¥„Âm²ljmÅÞĕƒƛm°„ÆmÂX¤mznƃŽV¦ÞVVb°bnÞWbnŽ°l@ÂV„È@„‚VĵĊ±@ó„InxÆw„¥@£Þ›W¯ĸ£UƒUK‚ƒk±akkkbmWmÂÈķ„aÆÇU—ȃÆW@wmknmU¯"],encodeOffsets:[[102702,28401]]}},{type:"Feature",id:"5306",properties:{name:"昭通市",cp:[104.0955,27.6031],childNum:11},geometry:{type:"Polygon",coordinates:["@@mƒnK@wmƒUř¥mšóXÇ“ÅmX@Ž—VƒÂmL@xţ™nk@mlUšŻÒğŋ@ƒL@mmLkm™š@b™XÃ…ÂŽW¼ka¯lÇŹ¯aÇ»™ÃÃ_@m„@@a™@UklwUm@ak@ƒb™UmbÂmƒbV¯™ĕUƒƒÂšaVwÃ…aĉVmý™m¯xUkƒ@kÂ¥VƒUXƒ¤VÈm`@„—ńÇÜ@Ä€kn‚ĔkƞÆĠ„™Þš‚U„VôƆÞI@ÂŽUxƦn„l@ÄŠÄŠnxUÒ°¦Vb¯WUnWÂŽÂIml@xn„Ubô¤‚¼ÈxlI„»šKVš„@ÈԂJkšUĖ±ÆVb@nœ„VÃœVUVƒšL„wÄ l„kn„Ġ@nx°¥Æ„²mUwƒ@m™mÃ…Ul¯UњÑUm„Lll„Il±š@VÂkwƒW@w°@U»™kUÂóI°ƒ„»ĢтL„™š`nUĠ²lm„bôV@n„JUxƦX¦l@š‚ŎÂUƒV„@lV„KVřÂV£UaÞU™ƒnW@¯VU@ó™Â"],encodeOffsets:[[107787,28244]]}},{type:"Feature",id:"5301",properties:{name:"昆明市",cp:[102.9199,25.4663],childNum:11},geometry:{type:"Polygon",coordinates:["@@n@Vk‚VUn²°@xƒ°Vƒ@¯ÆV¼k@WŽ„Þ¯„@„@‚VVU„„Ģċ°k¼V„Ċxœ¤ŌÂÂœx°mVkƒÑÈšL‚°„x°XϡVmÄŠLVxUĖ°bX¦VW@kšȯlkn@„¥lnšƒ@»°Ñ¯VmlLUwVK@ƒV@ka@ÂlmXb„UlVlkÈx@™„LVa„VV™wnƒmm@km™@mÂœIVaÃÂ@XƒVUïU@ƒÃ£k»˜K@aUwkKV_ƒ¥„a@alU@Ânz°aV„È@@±lÂÛšk@wVakm@т¥„a„z‚@XxÆW@ÛX™@m@ƒy@aWw@kÅĉÂJlbV„ÂJƒzţÆUwVkmWkým@Ul™U@b¯wVºƒU™VUêšĠƒXUaUbVÄŠUÂŽWXUmkK™™WnUUU™V™ÂƒƒVV™Ã@kk±‚™¯ƒƒLÂkƒš±WkXlVklƒ@ƒwXbmLƒ›VUIVmk@Ubma@kkaVKUĪkmlXLWn™J¯ÒĊ°@zkºlLUŤn@@n›ôÂ@lÆÂnmKkÈlxVw„@@mÈx˜@n²Uxl¤nbVxUzmJƒÒnš"],encodeOffsets:[[104828,25999]]}},{type:"Feature",id:"5307",properties:{name:"丽江市",cp:[100.448,26.955],childNum:5},geometry:{type:"Polygon",coordinates:["@@lÂ@™„Â@w°ÓUÂnƒÜÑ°w@mČóšÃlÂU»n°„„ÂVÃœUbVbm¼@Ž°xôĸœVW¦¯ĬlÂœ˜@zll@b„šWxXš‚a„ÂX@ÆĠÆaXwl@XaƦn¼˜JnÂ@mnKW¯È»V¯°ak™VanXVwl@VyUÄ•VU„bÈīlaUk°ƒk¯lƒ²V˜UkƛôÂ@ƒ„I@mVwÄŠa„™ƒÂVaka㪮bUÂŽVLšaXIWKUw™ƒ„aWÑÅKUaVk°ƒ@ÂUw„ƒ¯¥›XÄŸÂÃLkm¯Iǃóѯ»™aƒnUl±UĵÿlóÅIƒaU‚±Ik¼UÂŽVb¯bWxn°™ÒVbnLlޚ@@`kbmIkÂŽVn„JmnXl›@Ux™bkn@xóLUxVŽƒKóóÅÂW™™aÃ…xƒŽ™wƒ@™nÃ…m™šƒV™„ƒôX„ƒLlVU¤ƒb¦m¼™Ž@ĀƒbU‚„zUƂ°ÂÞVb@„Æbnššx"],encodeOffsets:[[101937,28227]]}},{type:"Feature",id:"5328",properties:{name:"西åŒç‰ˆçº³å‚£æ—自治州",cp:[100.8984,21.8628],childNum:3},geometry:{type:"Polygon",coordinates:["@@l²°ŽnÃ’lxÞ@„nWl„Lĸ™nbV¤V¦kbVV‚¦na„x°Vôa@„šb@lôXlWUšVXÄŒKlmšÂšU@bšWXXܛ°LÈa°LnU°‚ÞnšÑ„ġ°Âlƒnbšaƒ¯¯KWƒœó@kmK@UšĉV@k°„VV¹„a@y‚_ÂÄ‹l_nÓlL@anI@ƒóWl£VU—ƒl™kÄ•l™šKVw„U@™kVƒam¯ÅL@bƒ‚Ãk@Vn„UbÇbÃwÃ…@ċ¥¯lk‚¼ÅŽ™Ò°b@¦nlUn@ŽÇV„ÂmÆÂbWôU@ÃÃ…Åm™¯ƒaU™™mk™WWw—@±ƒ™n¯U™è™a™LƒÂ¯mƒL™škwƒl@°mnÈÒ¯šów@V™xƒĀU¤°Įƒ°Xl"],encodeOffsets:[[102376,22579]]}},{type:"Feature",id:"5305",properties:{name:"ä¿å±±å¸‚",cp:[99.0637,24.9884],childNum:5},geometry:{type:"Polygon",coordinates:["@@X°„Il‚@¦ƒŽÈ¼m¼ÞaÞÅl„ÈxV¼šlVôÈÆlLޣȺlkUƒ‚ƒUw„¯UÄ•VwÄŠ@n¦mlnVĸIWÇ°LnƒUwl™šV„n@lnU˜„nJÞÂl±U™¯LVÂUa°Ã„U„ÇĊýšVŤé„LlxÞL„ĀÜl²ĉ°KUaVĪ_Źé@klw¯ƒlÂŗšÂW£ÅyU™W@wƒknalÂ¥Uw@w™Uƒƒk¯ƒw¯aW±k_mJÂa™XVҙĠWb¯L¯Ã@w™wUƒ¯Â±Wk_ġƒÂwƒwÅKmb@¤„bk°lĖƒô„ÂUJƒšVnÃ…lÅ¥ÂUš¯°VbnbWxX„m„ÞššWUĀ™L™yWzÛKmbUxVKknÃkÂŽVšĀċ¤Ux„Â@Ž¯Žm@ƒ¦"],encodeOffsets:[[100440,25943]]}},{type:"Feature",id:"5304",properties:{name:"玉溪市",cp:[101.9312,23.8898],childNum:9},geometry:{type:"Polygon",coordinates:["@@l„„L°xXlWxXnlw„a„ţlaÞlÆĬnX„ƒ°wVw„l„@m™nw°VVIXllKšbnnV°lbU„UJ@ÈÇKVb—š@bW„°Vk¦kaWb°škxV¤È¼U°ôI@llblš²Âš@‚@ϗ@mm@VÅ£kKl¹@yĉ¯°ÑšIXmWKnkšlV„ULlb@lnbVal@UnVJÂœU‚„nKWa„x„@lkkUlW²X„™‚l„K°„šl²@lšÞUŽ„U‚„UšVšVVXmššlLVnXWVÂUĉVaVb„W™ğVéšU„VU¹W»ÂaVa„aW™Xƒ‚_UÂ¥nÂÇķ¯™@a™lUnÇÂUyk@@wW@kbW¦UKÃwUÂÂmmƒƒLUnVxUVVlk¯mmnƒmkÂÇaŤ¯I@ƒl@@aĉw°ĕmU—L±ƒk™ÆéX™ÜÛ@yÈç@™Çġ„Ãķ—XmmÃVřƒ™lmnkbmWkb@nl@nÂŽmš¯ÂVxkJmÂUJ„Âml¯Â™°makVVÂnVƒ¦™Wƒ—ÂWmÂnl@xmn„l‚I„¤„n™xU„ƒVUÂŽmX@˜ƒb@zÂl@¦Ãþ"],encodeOffsets:[[103703,24874]]}},{type:"Feature",id:"5333",properties:{name:"怒江傈僳æ—自治州",cp:[99.1516,26.5594],childNum:4},geometry:{type:"Polygon",coordinates:["@@WyX£lWlnnUU™„¥@Å£V™Vw„JlÃ…@wƒmö󙻂£kml¯UÂ¥n¹Æ@ny@wmU@¯mÂnamÛnƒšUV¥ÈnÄ y²œm¤„@ÆónÚnmlnbÞU‚¥„aV£kU„KWƒ„óšƒmIU¥ókÂwVólƒ™»¯™ƒL™ƒk@m™naWKÛwóњw@a±n—@VbUJ›LkaƒÃXĉƒ™„UV`lI@lnXÆƑkKmxÛXmlUKVÂmU²Klw@a™aó„@n™KXwVKU¯VÂ¥mUnkm¥ĉ@UxVĖƒ°Vx„V„klmޙÂkKWÄ€kVWšnl°Lnm@°ŽUxlV@nk¦™JVÈ°ŽVÃ’@nX°@ÆlÂUômlnôƒ²nxmÅ‚nVV„¯x@Èm°XblVUšl°@xkXU¤WXX‚W„Xƃ„mkÃ…JmÞÂw±bƒxUÄ«kKmÂÃ…VUÄ–ÃèV„kx@š›lX„lnk¤ƒLkŽ‚Ėk¦‚xUššL°‚¯Ė@LnK@b°xVI„¥Ua°Ñ@»nm@¹‚KŎÞÈWln²n"],encodeOffsets:[[101071,28891]]}},{type:"Feature",id:"5331",properties:{name:"å¾·å®å‚£æ—景颇æ—自治州",cp:[98.1299,24.5874],childNum:5},geometry:{type:"Polygon",coordinates:["@@„¥n@°Â@ƒÂVwČ£™ÿUÂlÂބlmULVwnaÃœLXyšzšKVÿ™XÙnƒWƒXwmaUa°¯V™ŦŽÆkUm„™VIƒÂ„ókÄ•l¯ƒa@£nama™@¯m¯œó@óyÅ£bÄ¡kÃ…m±ÂÛammVkƒLÂwU`Wk@VƒkUmŃlUUKmbkkUVUwƒ¦óŽ°¼šbn°ô¦lºƒz@xšŽ¯„™@UŽ°nƒšU¤ţU„°VƆ@ÈmlnzÞl°¦Æa„xUxƒLkxWÆ’n@‚š²ŰšW„™‚@°ÈXl°Llx"],encodeOffsets:[[100440,25943]]}}],UTF8Encoding:!0}}),i("echarts/util/mapData/geoJson/zhe_jiang_geo",[],function(){return{type:"FeatureCollection",features:[{type:"Feature",id:"3311",properties:{name:"丽水市",cp:[119.5642,28.1854],childNum:9},geometry:{type:"Polygon",coordinates:["@@@V‚bVl@Xn‚UXƒKVÂŽ@¦nxlUXV‚n„KVmnL‚ÂUV@bn¤lLXK˜²„`nnlJXIVJ‚I„Vnn°KnnVll@VLXWV@UkVaVK„zV@„ƒšVVaUK@ÂU»VUl@@WnUUƒ@wVLn@Vwl@XW°LVbn@VU‚@X„l`@XnKVbkl@XVJlUnlV„„xlL@lnXl„@VšUnV°Â°„@a„UVLXblWVXn@VVUV@Lš¤VLV„U‚VbnalLUUVÂX_laVa„WVzXKV@@a@KUÂmImmXama@kÂU@yVIUK‚aVa@kXK@aWU@VÂIUmW@kkVm„Uš@VwUa@K@k@Uƒ`@kUKVk@UV@VaUm²ÂVy@klUUWUkVmUa@_ƒKVaXa›ÂXmƒU@mUÂlWkaUXƒ@mmkL@w™JƒnVVÃ…bWKXa™@@I@aƒJUUÇ@V„UL™W@akLmb@K@a™XXw@mƒVmUVkUy@£@aU@@VkUWm@kUKƒXUWU_mW@wkkmJUUkLWWUXƒW@IkJ@k@mW_kӃ_Ul™Lƒm@I@aUa¯m@kƒa¯LUJƒ@mVVxUb™a@LUKkXƒbm@Uak@@a@Um`ƒIUbUJ@nUVW@@LnVV@lšUbVlUX@`š@blXklW„Ušm„Xlm¦U@@V¯bml@š@nUb@llnn@VbX@lV@ÂŽUVULmU@JVn„bVbkb™VWxU@@nUVk@"],encodeOffsets:[[121546,28992]]}},{type:"Feature",id:"3301",properties:{name:"æ­å·žå¸‚",cp:[119.5313,29.8773],childNum:6},geometry:{type:"Polygon",coordinates:["@@X@l„°KXXlW„b@²„`šššb‚I„šX`l@„Â@bWl@n@VnLUV@V„@°¦@šl@XVlU@š@xVbUb@Vkb@‚@XVJVz™J@Lޚ@VmLUxUJ@LU„Vx‚b„xXUl@VaÈw„b‚aÞa@Vl@XUVx@V@V„LlbnV„al@lb„Vnn‚LnKnL@VlbVJXalIšb@KUU@mVInJ˜„U„Vl@xUšVLnUš@UÂÞaV@lkV@UanK„L@UlKVUnbÆmn@@nUlVnVJl@@UXU„L@WVIVJVxVLXV@IÃœKnbn@VÂ¥V@@I@ƒƒÂ„y°b@UUwnk°ÆƨVlUšçXmݣÂaƒÇ™IkVƒ@WVÂ@@aWIUWUIkb@WW@UnƒK@UU@kaWVkƒVIVVnU@ÂUWVUV@VmVÂkKkÂWIkVWaULU`UImJUImm—U@ƒƒwmwUV™IUWVkUamaU@mV—kƒb@KVU@aVU@anKULVJ‚U@kÛU™JUV›kkƒVakU@ƒaVwkW@UWkXmWaULUaUK@XƒJUUmƒVU@UÂVƒUkJ@ImwmKU@k„@lU„W@@akKm„kamIkWl_UwVm@UkaVUUaƒ@UamakbWlkL@aUalU@mkL@U@U™lmK@XkKm@Ãakb@xƒnXbƒ`ƒnUUU@›™U@™wU@@ƒmKkkƒV¯U@lULUbVbUb@V‚a@L™ºÃb@bÂLmK™x@VUL@bk@mxULWl"],encodeOffsets:[[121185,30184]]}},{type:"Feature",id:"3303",properties:{name:"温州市",cp:[120.498,27.8119],childNum:9},geometry:{type:"Polygon",coordinates:["@@ll@xnXV`VX„WVL@lXnlV@UV@@b@¤VzUlnV„U@nWxšW@b@LnalK@bšXVKUƒÈ@VV„I@b@Jš@WbXLÆaUU„mšI@xlKnn„@VWlbkXV‚@n„VWnœ‚WbUb„L@`VbUnVlVXkV@lUz±‚VnUbU@@VUlVL@l„_@V@l@LVbV@XLV`VÈlxn@lU@aÂœaVV‚k„@XJ@nl@@LU`°LVb„L°a@a„UVy@anI@a„a‚nV@²wÃœJX@VšVV°k„Âna@WVk„aWwÂU@m@™ƒkƒaUĕ™ÃšÃŤnÈa„aóI›»@±X™WkUÄ·@kV±kw™ƒUkWw„™UƒÃ»ÛkɳlÂImaUaWóXÿǬk‚UnWVÂmmÂk™KÅ£nÅÞğl™„UlUx@XWb„V@JkXƒ°mb@VULVxUVk@@LWWk@WIkšƒUkJmUkVmI@yƒ@Ua™ÂkLm‚U@mUUUkaVk™@mK@UÂlUU@UmKmbUUUJ@n@KVLUL@VkJWXX`mnULWlkL@JVLVb@°kxkU@LVŽ™V@„VLV`UL@VUX"],encodeOffsets:[[122502,28334]]}},{type:"Feature",id:"3302",properties:{name:"å®æ³¢å¸‚",cp:[121.5967,29.6466],childNum:6},geometry:{type:"Polygon",coordinates:["@@Ċ¦ĸĀ°‚nXÞVšKškƨƑźÿ°»n„Â@wô¥ÜbÂœU°ÂÆXÞWóçĉñIUƒÈ¥@U°wÆ»²mm_@aXƒVKÞVlk@akk›̅@£X»VwÆÂXÂWa¯aÈ—b™KƽۃĊ™xƒLóŽk@ƒƒƒ@¯nƒKUL@xkL݄kWULUUmJUXVÂŽU@mÂŽUX¯@V`mbXbV@@nn¤WXšx@škJ@nVVUVl²UbÃVUVk@Wx@V@„ƒVXzmlÂaƒL@VlLU`„XUVVVUnl@VbnJlnUVVnƒlUKkbmnn„VxlJnxmbU@UL@KUV™X@xmb@lk@mnVVUš™è"],encodeOffsets:[[123784,30977]]}},{type:"Feature",id:"3309",properties:{name:"舟山市",cp:[122.2559,30.2234],childNum:3},geometry:{type:"Polygon",coordinates:["@@l΢ƒÂʠþÆVÄ¢LĊƒǬXĊ܄XôV„ÑÆw„ƒlšÆÈóVÄ­VÇ“@ƒĉwÉ›kmK@ĉXÄ«WaĉUĵÃmƒ¯ĉƒwĉ±±nż¯x@VǦV„²JĊÞôèÃXÃ…W¯Â›VÛaó¦@xƒŽmŽ¯¼ŹĀ"],
-encodeOffsets:[[124437,30983]]}},{type:"Feature",id:"3310",properties:{name:"å°å·žå¸‚",cp:[121.1353,28.6688],childNum:7},geometry:{type:"Polygon",coordinates:["@@lV„IVWVz@bXJl@Xal@°„nLll@nVxnV„K@ÂUJVbƒ¦°„k`UIWJXnƚ@bUJ„Xl@lb„Wn@UzVV@bVVšmVnnJVXna‚bšKUKnUVVUnVLlKVLXa„Jm£@mU@WanaU_°@VWnÂV@UÂVWnIVVVKlXœÒlK@wVK„L°m„@„„l@ô„Kšw„ĉƾůUƒl£@»UƒÂVk„m@Æ…UƒƒaÛIÅmUk@m„w@a™£ƒWk@ţšƒIm±@ankôUlaU™Uw¯ƒÅaƒbÇbÅ£m™ÞšÞVĖ„b„l@š@n‚VXxƒbUl@XmbƒŽ¯lUUU™W@ÛI±xU@Âmƒb@bmJ@bUzƒV@b¯bƒKUa¯KV_@Kk@@mWIƒ@ÂlUU›b@bkVm@kwUÇU_WKU@Ux™@ƒVUnllX@Vn‚J@UXV@bWL@lUbÂbVLUJ@z‚V@lnbWbnnnJVÂŽ@L"],encodeOffsets:[[123312,29526]]}},{type:"Feature",id:"3307",properties:{name:"金åŽå¸‚",cp:[120.0037,29.1028],childNum:8},geometry:{type:"Polygon",coordinates:["@@nbVb„@VbUVlb@VUnVxk`lXnJlbnƒlL@bX@Vƒ@klƒV@nLnx@JlI„V‚U@VUVn„VV„I@WVLVbVKXbWnXl@VlXUx„b@ÂŽlVUbl„œlVUšIÃœVnalKX@@bV@@aUUlUƒwUw„@naWW„UVaUUšaVb„LlxXJVk°ƒUƒlkUÂ¥@k„a@LVlXLVlšVWznVn@lxšJl_@WX_@mVa„a@alU@kVVna„KVLlK„b@UUaVašbnUWmXU@k@yVI@ařWmXIVJl_¯ƒ„¥UaVI@ƒLmUUw@mkkmK¯ƒk@Wbk@WI@aUyUXƒJkU@bU@WLUyƒXUbkbW`UÂVVkKmbUaVÂUƒUK™£@KVUUUm@UWkXWaUKƒV@b¯ƒ¯ÂmU™V@UkƒmW@kkKƒwUƒmkkVUI@WlkUamL@Wk_WƒÂ@UVm@Ua¯KWXk@Uxm@UK@xV„mV@Xk@UVV¼@‚VLUb™Uƒ„U@ƒyULUbVlU@@XlVUVVbƒU@lXXVW@XUVl@@VUVƒÈn@VVU„@lVa@„U„mL@`ÂX@`WL@VUX@lUL@xlx"],encodeOffsets:[[122119,29948]]}},{type:"Feature",id:"3308",properties:{name:"衢州市",cp:[118.6853,28.8666],childNum:5},geometry:{type:"Polygon",coordinates:["@@XkVKnwl@@aVK@UšwnL‚K@aÞaš¹@KÂb@UVaUaVaVK@k°V„UllnL@„V@šxV@œšV@VV„m„_Wa„m@wlaÞbn@lL@WnLšk@V@VlK@nkVVb@blKXklakw@wVK@kVW@UXK@_‚W@_nKVƒ@ƒUb@kVƒUUm@„ÇVU@Uk@VU@WUXWW@k„VUaVUkU@WWXUKk@Ukmm¯LmmƒUÂJUIWJkImmƒ_—±WLkKm£@aVUÂÂmKUnƒLÂmWUkVmw@Â¥U„LVWmÂ@WUkÂa@UmÂmLÂmm@@bUX™@@WUIm@UVUK@UVUUU™VVJmb@b„Xn‚mVƒ¼nnn¦mJUVƒL„V@VW@UzUlVnUbl`UnVl@XU@kl@bmÈUx™Vk@@J@„ƒ¼W@Ã…aVVnzmVƒ„Â@WJk@kÂWJ@ƒlXbWbXxmVnšlLXb@°lKVXnWšbWV„„X„mbV@Xl‚bšI@Kn@@x@šVLlm"],encodeOffsets:[[121185,30184]]}},{type:"Feature",id:"3306",properties:{name:"ç»å…´å¸‚",cp:[120.564,29.7565],childNum:6},geometry:{type:"Polygon",coordinates:["@@„x@„˜VnnVJnIVJV_VKXblUXJlÂŽlLUÂŽUnU@UVVX@ÂŽmVUUUJl„XUlbV@@V„LVmX@@XlaVJVXXJ@b‚@XU„@lUšJ„È‚bœ¤Ō„JšçV™UUnml@@kna@wšWVU@LVKV@namwkIUwmƒnmlaVL„kUmVUkmmIUak@VmUUVUƒWV_kK@U„K‚bnkWy„U@ƒ@UXwl@VUÞUVak±VUUU@mlI@™™wXWƒIWbUKkLUKVmUUmVVL™LÂambUWmIUm™nUU@aUUVym@ƒXkak@ƒW@z@lWVXnmV™aUbVb@VƒakLUKƒLmbUU@lkV@bƒbUb@nW`@Xk`™Ikwm@mUXy™UUkWKUk@Kƒb@lV¦klV„¯„UlWIkwƒKUa™bVVUbƒVXXmbƒ@Vx„xkVVV@bU@@aW@kLmb@lÂVUIVKmL@bUV@bUV@L„a˜lnUV@nbVbUlVXšJVUnx"],encodeOffsets:[[122997,30561]]}},{type:"Feature",id:"3304",properties:{name:"嘉兴市",cp:[120.9155,30.6354],childNum:6},geometry:{type:"Polygon",coordinates:["@@@blIX@@VÃœVUnn@l‚k„lKnI°Þl`²LVKVbnbVaVLUVn@W¦@VkVVb„@VI„`@blLnL‚aX@„VVb@U‚@XlVa„@@kVaUKV»U_lWXUƒƒ@alb„k@VllnLVKn@@UVIUw@y°IVVXU@VV@lw„m@wVkƾaÂœJ‚LkΡƧƒ™l™LÃUmW¯Âķÿĉ¥ƒIÅ‹ÂŽWn™èkVƧU¯ÅmlVx@V¯aƒz„Ž@„@JU@U¦m@@šnVmn@V„LV‚"],encodeOffsets:[[123233,31382]]}},{type:"Feature",id:"3305",properties:{name:"湖州市",cp:[119.8608,30.7782],childNum:4},geometry:{type:"Polygon",coordinates:["@@kLlƒkÂm@VmÛU@UW@kJ@aUƒK@UnmmU@™maÛL@JWUUKUwUIUJ@XƒKWV@Vk@UIUmVk@mm@Ã…nmaUVkL@VƒKmLVbU@klU@ÃbV™@mVUKV™@wUkVƒ—ƒmIUJ@nVV@L™akJWbUIka@UmKmLÂKmmƒUUVk@@nmLX`WXUV@ÂŽ@nUl™kmlU@Ub„„ƒxVVšIlV„Žšnn„@@n˜„UҚ@„°n@@xmb@„VbnV@šš„@b@`@L@L@x@blVklVbnnV@‚aXb°VlU@W„b°U„LXWVUV™„™VwÈwÜ»ĸaÄ nUÂVw²X@V@lVU@wlaUUVm@knUV›"],encodeOffsets:[[123379,31500]]}}],UTF8Encoding:!0}}),i("echarts/chart/gauge",["require","./base","../util/shape/GaugePointer","zrender/shape/Text","zrender/shape/Line","zrender/shape/Rectangle","zrender/shape/Circle","zrender/shape/Sector","../config","../util/ecData","../util/accMath","zrender/tool/util","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("../util/shape/GaugePointer"),a=e("zrender/shape/Text"),o=e("zrender/shape/Line"),r=e("zrender/shape/Rectangle"),s=e("zrender/shape/Circle"),l=e("zrender/shape/Sector"),h=e("../config");h.gauge={zlevel:0,z:2,center:["50%","50%"],clickable:!0,legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,min:0,max:100,splitNumber:10,axisLine:{show:!0,lineStyle:{color:[[.2,"#228b22"],[.8,"#48b"],[1,"#ff4500"]],width:30}},axisTick:{show:!0,splitNumber:5,length:8,lineStyle:{color:"#eee",width:1,type:"solid"}},axisLabel:{show:!0,textStyle:{color:"auto"}},splitLine:{show:!0,length:30,lineStyle:{color:"#eee",width:2,type:"solid"}},pointer:{show:!0,length:"80%",width:8,color:"auto"},title:{show:!0,offsetCenter:[0,"-40%"],textStyle:{color:"#333",fontSize:15}},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:40,offsetCenter:[0,"40%"],textStyle:{color:"auto",fontSize:30}}};var m=e("../util/ecData"),V=e("../util/accMath"),U=e("zrender/tool/util");return t.prototype={type:h.CHART_TYPE_GAUGE,_buildShape:function(){var e=this.series;this._paramsMap={},this.selectedMap={};for(var t=0,i=e.length;i>t;t++)e[t].type===h.CHART_TYPE_GAUGE&&(this.selectedMap[e[t].name]=!0,e[t]=this.reformOption(e[t]),this.legendHoverLink=e[t].legendHoverLink||this.legendHoverLink,this._buildSingleGauge(t),this.buildMark(t));this.addShapeList()},_buildSingleGauge:function(e){var t=this.series[e];this._paramsMap[e]={center:this.parseCenter(this.zr,t.center),radius:this.parseRadius(this.zr,t.radius),startAngle:t.startAngle.toFixed(2)-0,endAngle:t.endAngle.toFixed(2)-0},this._paramsMap[e].totalAngle=this._paramsMap[e].startAngle-this._paramsMap[e].endAngle,this._colorMap(e),this._buildAxisLine(e),this._buildSplitLine(e),this._buildAxisTick(e),this._buildAxisLabel(e),this._buildPointer(e),this._buildTitle(e),this._buildDetail(e)},_buildAxisLine:function(e){var t=this.series[e];if(t.axisLine.show)for(var i,n,a=t.min,o=t.max-a,r=this._paramsMap[e],s=r.center,l=r.startAngle,h=r.totalAngle,V=r.colorArray,U=t.axisLine.lineStyle,d=this.parsePercent(U.width,r.radius[1]),p=r.radius[1],c=p-d,u=l,y=0,g=V.length;g>y;y++)n=l-h*(V[y][0]-a)/o,i=this._getSector(s,c,p,n,u,V[y][1],U,t.zlevel,t.z),u=n,i._animationAdd="r",m.set(i,"seriesIndex",e),m.set(i,"dataIndex",y),this.shapeList.push(i)},_buildSplitLine:function(e){var t=this.series[e];if(t.splitLine.show)for(var i,n,a,r=this._paramsMap[e],s=t.splitNumber,l=t.min,h=t.max-l,m=t.splitLine,V=this.parsePercent(m.length,r.radius[1]),U=m.lineStyle,d=U.color,p=r.center,c=r.startAngle*Math.PI/180,u=r.totalAngle*Math.PI/180,y=r.radius[1],g=y-V,b=0;s>=b;b++)i=c-u/s*b,n=Math.sin(i),a=Math.cos(i),this.shapeList.push(new o({zlevel:t.zlevel,z:t.z+1,hoverable:!1,style:{xStart:p[0]+a*y,yStart:p[1]-n*y,xEnd:p[0]+a*g,yEnd:p[1]-n*g,strokeColor:"auto"===d?this._getColor(e,l+h/s*b):d,lineType:U.type,lineWidth:U.width,shadowColor:U.shadowColor,shadowBlur:U.shadowBlur,shadowOffsetX:U.shadowOffsetX,shadowOffsetY:U.shadowOffsetY}}))},_buildAxisTick:function(e){var t=this.series[e];if(t.axisTick.show)for(var i,n,a,r=this._paramsMap[e],s=t.splitNumber,l=t.min,h=t.max-l,m=t.axisTick,V=m.splitNumber,U=this.parsePercent(m.length,r.radius[1]),d=m.lineStyle,p=d.color,c=r.center,u=r.startAngle*Math.PI/180,y=r.totalAngle*Math.PI/180,g=r.radius[1],b=g-U,f=0,k=s*V;k>=f;f++)f%V!==0&&(i=u-y/k*f,n=Math.sin(i),a=Math.cos(i),this.shapeList.push(new o({zlevel:t.zlevel,z:t.z+1,hoverable:!1,style:{xStart:c[0]+a*g,yStart:c[1]-n*g,xEnd:c[0]+a*b,yEnd:c[1]-n*b,strokeColor:"auto"===p?this._getColor(e,l+h/k*f):p,lineType:d.type,lineWidth:d.width,shadowColor:d.shadowColor,shadowBlur:d.shadowBlur,shadowOffsetX:d.shadowOffsetX,shadowOffsetY:d.shadowOffsetY}})))},_buildAxisLabel:function(e){var t=this.series[e];if(t.axisLabel.show)for(var i,n,o,r,s=t.splitNumber,l=t.min,h=t.max-l,m=t.axisLabel.textStyle,U=this.getFont(m),d=m.color,p=this._paramsMap[e],c=p.center,u=p.startAngle,y=p.totalAngle,g=p.radius[1]-this.parsePercent(t.splitLine.length,p.radius[1])-5,b=0;s>=b;b++)r=V.accAdd(l,V.accMul(V.accDiv(h,s),b)),i=u-y/s*b,n=Math.sin(i*Math.PI/180),o=Math.cos(i*Math.PI/180),i=(i+360)%360,this.shapeList.push(new a({zlevel:t.zlevel,z:t.z+1,hoverable:!1,style:{x:c[0]+o*g,y:c[1]-n*g,color:"auto"===d?this._getColor(e,r):d,text:this._getLabelText(t.axisLabel.formatter,r),textAlign:i>=110&&250>=i?"left":70>=i||i>=290?"right":"center",textBaseline:i>=10&&170>=i?"top":i>=190&&350>=i?"bottom":"middle",textFont:U,shadowColor:m.shadowColor,shadowBlur:m.shadowBlur,shadowOffsetX:m.shadowOffsetX,shadowOffsetY:m.shadowOffsetY}}))},_buildPointer:function(e){var t=this.series[e];if(t.pointer.show){var i=t.max-t.min,a=t.pointer,o=this._paramsMap[e],r=this.parsePercent(a.length,o.radius[1]),l=this.parsePercent(a.width,o.radius[1]),h=o.center,V=this._getValue(e);V=V<t.max?V:t.max;var U=(o.startAngle-o.totalAngle/i*(V-t.min))*Math.PI/180,d="auto"===a.color?this._getColor(e,V):a.color,p=new n({zlevel:t.zlevel,z:t.z+1,clickable:this.query(t,"clickable"),style:{x:h[0],y:h[1],r:r,startAngle:o.startAngle*Math.PI/180,angle:U,color:d,width:l,shadowColor:a.shadowColor,shadowBlur:a.shadowBlur,shadowOffsetX:a.shadowOffsetX,shadowOffsetY:a.shadowOffsetY},highlightStyle:{brushType:"fill",width:l>2?2:l/2,color:"#fff"}});m.pack(p,this.series[e],e,this.series[e].data[0],0,this.series[e].data[0].name,V),this.shapeList.push(p),this.shapeList.push(new s({zlevel:t.zlevel,z:t.z+2,hoverable:!1,style:{x:h[0],y:h[1],r:a.width/2.5,color:"#fff"}}))}},_buildTitle:function(e){var t=this.series[e];if(t.title.show){var i=t.data[0],n=null!=i.name?i.name:"";if(""!==n){var o=t.title,r=o.offsetCenter,s=o.textStyle,l=s.color,h=this._paramsMap[e],m=h.center[0]+this.parsePercent(r[0],h.radius[1]),V=h.center[1]+this.parsePercent(r[1],h.radius[1]);this.shapeList.push(new a({zlevel:t.zlevel,z:t.z+(Math.abs(m-h.center[0])+Math.abs(V-h.center[1])<2*s.fontSize?2:1),hoverable:!1,style:{x:m,y:V,color:"auto"===l?this._getColor(e):l,text:n,textAlign:"center",textFont:this.getFont(s),shadowColor:s.shadowColor,shadowBlur:s.shadowBlur,shadowOffsetX:s.shadowOffsetX,shadowOffsetY:s.shadowOffsetY}}))}}},_buildDetail:function(e){var t=this.series[e];if(t.detail.show){var i=t.detail,n=i.offsetCenter,a=i.backgroundColor,o=i.textStyle,s=o.color,l=this._paramsMap[e],h=this._getValue(e),m=l.center[0]-i.width/2+this.parsePercent(n[0],l.radius[1]),V=l.center[1]+this.parsePercent(n[1],l.radius[1]);this.shapeList.push(new r({zlevel:t.zlevel,z:t.z+(Math.abs(m+i.width/2-l.center[0])+Math.abs(V+i.height/2-l.center[1])<o.fontSize?2:1),hoverable:!1,style:{x:m,y:V,width:i.width,height:i.height,brushType:"both",color:"auto"===a?this._getColor(e,h):a,lineWidth:i.borderWidth,strokeColor:i.borderColor,shadowColor:i.shadowColor,shadowBlur:i.shadowBlur,shadowOffsetX:i.shadowOffsetX,shadowOffsetY:i.shadowOffsetY,text:this._getLabelText(i.formatter,h),textFont:this.getFont(o),textPosition:"inside",textColor:"auto"===s?this._getColor(e,h):s}}))}},_getValue:function(e){return this.getDataFromOption(this.series[e].data[0])},_colorMap:function(e){var t=this.series[e],i=t.min,n=t.max-i,a=t.axisLine.lineStyle.color;a instanceof Array||(a=[[1,a]]);for(var o=[],r=0,s=a.length;s>r;r++)o.push([a[r][0]*n+i,a[r][1]]);this._paramsMap[e].colorArray=o},_getColor:function(e,t){null==t&&(t=this._getValue(e));for(var i=this._paramsMap[e].colorArray,n=0,a=i.length;a>n;n++)if(i[n][0]>=t)return i[n][1];return i[i.length-1][1]},_getSector:function(e,t,i,n,a,o,r,s,h){return new l({zlevel:s,z:h,hoverable:!1,style:{x:e[0],y:e[1],r0:t,r:i,startAngle:n,endAngle:a,brushType:"fill",color:o,shadowColor:r.shadowColor,shadowBlur:r.shadowBlur,shadowOffsetX:r.shadowOffsetX,shadowOffsetY:r.shadowOffsetY}})},_getLabelText:function(e,t){if(e){if("function"==typeof e)return e.call(this.myChart,t);if("string"==typeof e)return e.replace("{value}",t)}return t},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},U.inherits(t,i),e("../chart").define("gauge",t),t}),i("echarts/util/shape/GaugePointer",["require","zrender/shape/Base","zrender/tool/util","./normalIsCover"],function(e){function t(e){i.call(this,e)}var i=e("zrender/shape/Base"),n=e("zrender/tool/util");return t.prototype={type:"gauge-pointer",buildPath:function(e,t){var i=t.r,n=t.width,a=t.angle,o=t.x-Math.cos(a)*n*(n>=i/3?1:2),r=t.y+Math.sin(a)*n*(n>=i/3?1:2);a=t.angle-Math.PI/2,e.moveTo(o,r),e.lineTo(t.x+Math.cos(a)*n,t.y-Math.sin(a)*n),e.lineTo(t.x+Math.cos(t.angle)*i,t.y-Math.sin(t.angle)*i),e.lineTo(t.x-Math.cos(a)*n,t.y+Math.sin(a)*n),e.lineTo(o,r)},getRect:function(e){if(e.__rect)return e.__rect;var t=2*e.width,i=e.x,n=e.y,a=i+Math.cos(e.angle)*e.r,o=n-Math.sin(e.angle)*e.r;return e.__rect={x:Math.min(i,a)-t,y:Math.min(n,o)-t,width:Math.abs(i-a)+t,height:Math.abs(n-o)+t},e.__rect},isCover:e("./normalIsCover")},n.inherits(t,i),t}),i("echarts/chart/funnel",["require","./base","zrender/shape/Text","zrender/shape/Line","zrender/shape/Polygon","../config","../util/ecData","../util/number","zrender/tool/util","zrender/tool/color","zrender/tool/area","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Line"),o=e("zrender/shape/Polygon"),r=e("../config");r.funnel={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,x:80,y:60,x2:80,y2:60,min:0,max:100,minSize:"0%",maxSize:"100%",sort:"descending",gap:0,funnelAlign:"center",itemStyle:{normal:{borderColor:"#fff",borderWidth:1,label:{show:!0,position:"outer"},labelLine:{show:!0,length:10,lineStyle:{width:1,type:"solid"}}},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!0},labelLine:{show:!0}}}};var s=e("../util/ecData"),l=e("../util/number"),h=e("zrender/tool/util"),m=e("zrender/tool/color"),V=e("zrender/tool/area");return t.prototype={type:r.CHART_TYPE_FUNNEL,_buildShape:function(){var e=this.series,t=this.component.legend;this._paramsMap={},this._selected={},this.selectedMap={};for(var i,n=0,a=e.length;a>n;n++)if(e[n].type===r.CHART_TYPE_FUNNEL){if(e[n]=this.reformOption(e[n]),this.legendHoverLink=e[n].legendHoverLink||this.legendHoverLink,i=e[n].name||"",this.selectedMap[i]=t?t.isSelected(i):!0,!this.selectedMap[i])continue;this._buildSingleFunnel(n),this.buildMark(n)}this.addShapeList()},_buildSingleFunnel:function(e){var t=this.component.legend,i=this.series[e],n=this._mapData(e),a=this._getLocation(e);this._paramsMap[e]={location:a,data:n};for(var o,r=0,s=[],h=0,m=n.length;m>h;h++)o=n[h].name,this.selectedMap[o]=t?t.isSelected(o):!0,this.selectedMap[o]&&!isNaN(n[h].value)&&(s.push(n[h]),r++);if(0!==r){for(var V,U,d,p,c=this._buildFunnelCase(e),u=i.funnelAlign,y=i.gap,g=r>1?(a.height-(r-1)*y)/r:a.height,b=a.y,f="descending"===i.sort?this._getItemWidth(e,s[0].value):l.parsePercent(i.minSize,a.width),k="descending"===i.sort?1:0,x=a.centerX,_=[],h=0,m=s.length;m>h;h++)if(o=s[h].name,this.selectedMap[o]&&!isNaN(s[h].value)){switch(V=m-2>=h?this._getItemWidth(e,s[h+k].value):"descending"===i.sort?l.parsePercent(i.minSize,a.width):l.parsePercent(i.maxSize,a.width),u){case"left":U=a.x;break;case"right":U=a.x+a.width-f;break;default:U=x-f/2}d=this._buildItem(e,s[h]._index,t?t.getColor(o):this.zr.getColor(s[h]._index),U,b,f,V,g,u),b+=g+y,p=d.style.pointList,_.unshift([p[0][0]-10,p[0][1]]),_.push([p[1][0]+10,p[1][1]]),0===h&&(0===f?(p=_.pop(),"center"==u&&(_[0][0]+=10),"right"==u&&(_[0][0]=p[0]),_[0][1]-="center"==u?10:15,1==m&&(p=d.style.pointList)):(_[_.length-1][1]-=5,_[0][1]-=5)),f=V}c&&(_.unshift([p[3][0]-10,p[3][1]]),_.push([p[2][0]+10,p[2][1]]),0===f?(p=_.pop(),"center"==u&&(_[0][0]+=10),"right"==u&&(_[0][0]=p[0]),_[0][1]+="center"==u?10:15):(_[_.length-1][1]+=5,_[0][1]+=5),c.style.pointList=_)}},_buildFunnelCase:function(e){var t=this.series[e];if(this.deepQuery([t,this.option],"calculable")){var i=this._paramsMap[e].location,n=10,a={hoverable:!1,style:{pointListd:[[i.x-n,i.y-n],[i.x+i.width+n,i.y-n],[i.x+i.width+n,i.y+i.height+n],[i.x-n,i.y+i.height+n]],brushType:"stroke",lineWidth:1,strokeColor:t.calculableHolderColor||this.ecTheme.calculableHolderColor||r.calculableHolderColor}};return s.pack(a,t,e,void 0,-1),this.setCalculable(a),a=new o(a),this.shapeList.push(a),a}},_getLocation:function(e){var t=this.series[e],i=this.zr.getWidth(),n=this.zr.getHeight(),a=this.parsePercent(t.x,i),o=this.parsePercent(t.y,n),r=null==t.width?i-a-this.parsePercent(t.x2,i):this.parsePercent(t.width,i);return{x:a,y:o,width:r,height:null==t.height?n-o-this.parsePercent(t.y2,n):this.parsePercent(t.height,n),centerX:a+r/2}},_mapData:function(e){function t(e,t){return"-"===e.value?1:"-"===t.value?-1:t.value-e.value}function i(e,i){return-t(e,i)}for(var n=this.series[e],a=h.clone(n.data),o=0,r=a.length;r>o;o++)a[o]._index=o;return"none"!=n.sort&&a.sort("descending"===n.sort?t:i),a},_buildItem:function(e,t,i,n,a,o,r,l,h){var m=this.series,V=m[e],U=V.data[t],d=this.getPolygon(e,t,i,n,a,o,r,l,h);s.pack(d,m[e],e,m[e].data[t],t,m[e].data[t].name),this.shapeList.push(d);var p=this.getLabel(e,t,i,n,a,o,r,l,h);s.pack(p,m[e],e,m[e].data[t],t,m[e].data[t].name),this.shapeList.push(p),this._needLabel(V,U,!1)||(p.invisible=!0);var c=this.getLabelLine(e,t,i,n,a,o,r,l,h);this.shapeList.push(c),this._needLabelLine(V,U,!1)||(c.invisible=!0);var u=[],y=[];return this._needLabelLine(V,U,!0)&&(u.push(c.id),y.push(c.id)),this._needLabel(V,U,!0)&&(u.push(p.id),y.push(d.id)),d.hoverConnect=u,p.hoverConnect=y,d},_getItemWidth:function(e,t){var i=this.series[e],n=this._paramsMap[e].location,a=i.min,o=i.max,r=l.parsePercent(i.minSize,n.width),s=l.parsePercent(i.maxSize,n.width);return(t-a)*(s-r)/(o-a)+r},getPolygon:function(e,t,i,n,a,r,s,l,h){var V,U=this.series[e],d=U.data[t],p=[d,U],c=this.deepMerge(p,"itemStyle.normal")||{},u=this.deepMerge(p,"itemStyle.emphasis")||{},y=this.getItemStyleColor(c.color,e,t,d)||i,g=this.getItemStyleColor(u.color,e,t,d)||("string"==typeof y?m.lift(y,-.2):y);switch(h){case"left":V=n;break;case"right":V=n+(r-s);break;default:V=n+(r-s)/2}var b={zlevel:U.zlevel,z:U.z,clickable:this.deepQuery(p,"clickable"),style:{pointList:[[n,a],[n+r,a],[V+s,a+l],[V,a+l]],brushType:"both",color:y,lineWidth:c.borderWidth,strokeColor:c.borderColor},highlightStyle:{color:g,lineWidth:u.borderWidth,strokeColor:u.borderColor}};return this.deepQuery([d,U,this.option],"calculable")&&(this.setCalculable(b),b.draggable=!0),new o(b)},getLabel:function(e,t,i,a,o,r,s,l,U){var d,p=this.series[e],c=p.data[t],u=this._paramsMap[e].location,y=h.merge(h.clone(c.itemStyle)||{},p.itemStyle),g="normal",b=y[g].label,f=b.textStyle||{},k=y[g].labelLine.length,x=this.getLabelText(e,t,g),_=this.getFont(f),L=i;b.position=b.position||y.normal.label.position,"inner"===b.position||"inside"===b.position||"center"===b.position?(d=U,L=Math.max(r,s)/2>V.getTextWidth(x,_)?"#fff":m.reverse(i)):d="left"===b.position?"right":"left";var W={zlevel:p.zlevel,z:p.z+1,style:{x:this._getLabelPoint(b.position,a,u,r,s,k,U),y:o+l/2,color:f.color||L,text:x,textAlign:f.align||d,textBaseline:f.baseline||"middle",textFont:_}};return g="emphasis",b=y[g].label||b,f=b.textStyle||f,k=y[g].labelLine.length||k,b.position=b.position||y.normal.label.position,x=this.getLabelText(e,t,g),_=this.getFont(f),L=i,"inner"===b.position||"inside"===b.position||"center"===b.position?(d=U,L=Math.max(r,s)/2>V.getTextWidth(x,_)?"#fff":m.reverse(i)):d="left"===b.position?"right":"left",W.highlightStyle={x:this._getLabelPoint(b.position,a,u,r,s,k,U),color:f.color||L,text:x,textAlign:f.align||d,textFont:_,brushType:"fill"},new n(W)},getLabelText:function(e,t,i){var n=this.series,a=n[e],o=a.data[t],r=this.deepQuery([o,a],"itemStyle."+i+".label.formatter");return r?"function"==typeof r?r.call(this.myChart,{seriesIndex:e,seriesName:a.name||"",series:a,dataIndex:t,data:o,name:o.name,value:o.value}):"string"==typeof r?r=r.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}").replace("{a0}",a.name).replace("{b0}",o.name).replace("{c0}",o.value):void 0:o.name},getLabelLine:function(e,t,i,n,o,r,s,l,m){var V=this.series[e],U=V.data[t],d=this._paramsMap[e].location,p=h.merge(h.clone(U.itemStyle)||{},V.itemStyle),c="normal",u=p[c].labelLine,y=p[c].labelLine.length,g=u.lineStyle||{},b=p[c].label;b.position=b.position||p.normal.label.position;var f={zlevel:V.zlevel,z:V.z+1,hoverable:!1,style:{xStart:this._getLabelLineStartPoint(n,d,r,s,m),yStart:o+l/2,xEnd:this._getLabelPoint(b.position,n,d,r,s,y,m),yEnd:o+l/2,strokeColor:g.color||i,lineType:g.type,lineWidth:g.width}};return c="emphasis",u=p[c].labelLine||u,y=p[c].labelLine.length||y,g=u.lineStyle||g,b=p[c].label||b,b.position=b.position,f.highlightStyle={xEnd:this._getLabelPoint(b.position,n,d,r,s,y,m),strokeColor:g.color||i,lineType:g.type,lineWidth:g.width},new a(f)},_getLabelPoint:function(e,t,i,n,a,o,r){switch(e="inner"===e||"inside"===e?"center":e){case"center":return"center"==r?t+n/2:"left"==r?t+10:t+n-10;case"left":return"auto"===o?i.x-10:"center"==r?i.centerX-Math.max(n,a)/2-o:"right"==r?t-(a>n?a-n:0)-o:i.x-o;default:return"auto"===o?i.x+i.width+10:"center"==r?i.centerX+Math.max(n,a)/2+o:"right"==r?i.x+i.width+o:t+Math.max(n,a)+o}},_getLabelLineStartPoint:function(e,t,i,n,a){return"center"==a?t.centerX:n>i?e+Math.min(i,n)/2:e+Math.max(i,n)/2},_needLabel:function(e,t,i){return this.deepQuery([t,e],"itemStyle."+(i?"emphasis":"normal")+".label.show")},_needLabelLine:function(e,t,i){return this.deepQuery([t,e],"itemStyle."+(i?"emphasis":"normal")+".labelLine.show")},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},h.inherits(t,i),e("../chart").define("funnel",t),t}),i("echarts/chart/eventRiver",["require","./base","../layout/eventRiver","zrender/shape/Polygon","../component/axis","../component/grid","../component/dataZoom","../config","../util/ecData","../util/date","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o);var r=this;r._ondragend=function(){r.isDragend=!0},this.refresh(a)}var i=e("./base"),n=e("../layout/eventRiver"),a=e("zrender/shape/Polygon");e("../component/axis"),e("../component/grid"),e("../component/dataZoom");var o=e("../config");o.eventRiver={zlevel:0,z:2,clickable:!0,legendHoverLink:!0,itemStyle:{normal:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!0,position:"inside",formatter:"{b}"}},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1,label:{show:!0}}}};var r=e("../util/ecData"),s=e("../util/date"),l=e("zrender/tool/util"),h=e("zrender/tool/color");return t.prototype={type:o.CHART_TYPE_EVENTRIVER,_buildShape:function(){var e=this.series;this.selectedMap={},this._dataPreprocessing();for(var t=this.component.legend,i=[],a=0;a<e.length;a++)if(e[a].type===this.type){e[a]=this.reformOption(e[a]),this.legendHoverLink=e[a].legendHoverLink||this.legendHoverLink;var o=e[a].name||"";if(this.selectedMap[o]=t?t.isSelected(o):!0,!this.selectedMap[o])continue;this.buildMark(a),i.push(this.series[a])}n(i,this._intervalX,this.component.grid.getArea()),this._drawEventRiver(),this.addShapeList()},_dataPreprocessing:function(){for(var e,t,i=this.series,n=0,a=i.length;a>n;n++)if(i[n].type===this.type){e=this.component.xAxis.getAxis(i[n].xAxisIndex||0);for(var o=0,r=i[n].data.length;r>o;o++){t=i[n].data[o].evolution;for(var l=0,h=t.length;h>l;l++)t[l].timeScale=e.getCoord(s.getNewDate(t[l].time)-0),t[l].valueScale=Math.pow(t[l].value,.8)}}this._intervalX=Math.round(this.component.grid.getWidth()/40)},_drawEventRiver:function(){for(var e=this.series,t=0;t<e.length;t++){var i=e[t].name||"";if(e[t].type===this.type&&this.selectedMap[i])for(var n=0;n<e[t].data.length;n++)this._drawEventBubble(e[t].data[n],t,n)}},_drawEventBubble:function(e,t,i){var n=this.series,o=n[t],s=o.name||"",l=o.data[i],m=[l,o],V=this.component.legend,U=V?V.getColor(s):this.zr.getColor(t),d=this.deepMerge(m,"itemStyle.normal")||{},p=this.deepMerge(m,"itemStyle.emphasis")||{},c=this.getItemStyleColor(d.color,t,i,l)||U,u=this.getItemStyleColor(p.color,t,i,l)||("string"==typeof c?h.lift(c,-.2):c),y=this._calculateControlPoints(e),g={zlevel:o.zlevel,z:o.z,clickable:this.deepQuery(m,"clickable"),style:{pointList:y,smooth:"spline",brushType:"both",lineJoin:"round",color:c,lineWidth:d.borderWidth,strokeColor:d.borderColor},highlightStyle:{color:u,lineWidth:p.borderWidth,strokeColor:p.borderColor},draggable:"vertical",ondragend:this._ondragend};g=new a(g),this.addLabel(g,o,l,e.name),r.pack(g,n[t],t,n[t].data[i],i,n[t].data[i].name),this.shapeList.push(g)},_calculateControlPoints:function(e){var t=this._intervalX,i=e.y,n=e.evolution,a=n.length;if(!(1>a)){for(var o=[],r=[],s=0;a>s;s++)o.push(n[s].timeScale),r.push(n[s].valueScale);var l=[];l.push([o[0],i]);var s=0;for(s=0;a-1>s;s++)l.push([(o[s]+o[s+1])/2,r[s]/-2+i]);for(l.push([(o[s]+(o[s]+t))/2,r[s]/-2+i]),l.push([o[s]+t,i]),l.push([(o[s]+(o[s]+t))/2,r[s]/2+i]),s=a-1;s>0;s--)l.push([(o[s]+o[s-1])/2,r[s-1]/2+i]);return l}},ondragend:function(e,t){this.isDragend&&e.target&&(t.dragOut=!0,t.dragIn=!0,t.needRefresh=!1,this.isDragend=!1)},refresh:function(e){e&&(this.option=e,this.series=e.series),this.backupShapeList(),this._buildShape()}},l.inherits(t,i),e("../chart").define("eventRiver",t),t}),i("echarts/layout/eventRiver",["require"],function(){function e(e,i,o){function r(e,t){var i=e.importance,n=t.importance;return i>n?-1:n>i?1:0}for(var s=4,l=0;l<e.length;l++){for(var h=0;h<e[l].data.length;h++){null==e[l].data[h].weight&&(e[l].data[h].weight=1);for(var m=0,V=0;V<e[l].data[h].evolution.length;V++)m+=e[l].data[h].evolution[V].valueScale;e[l].data[h].importance=m*e[l].data[h].weight}e[l].data.sort(r)}for(var l=0;l<e.length;l++){null==e[l].weight&&(e[l].weight=1);for(var m=0,h=0;h<e[l].data.length;h++)m+=e[l].data[h].weight;e[l].importance=m*e[l].weight}e.sort(r);for(var U=Number.MAX_VALUE,d=0,l=0;l<e.length;l++)for(var h=0;h<e[l].data.length;h++)for(var V=0;V<e[l].data[h].evolution.length;V++){var p=e[l].data[h].evolution[V].timeScale;U=Math.min(U,p),d=Math.max(d,p)}U=~~U,d=~~d;for(var c=function(){var e=d-U+1+~~i;if(0>=e)return[0];for(var t=[];e--;)t.push(0);return t}(),u=c.slice(0),y=[],g=0,b=0,l=0;l<e.length;l++)for(var h=0;h<e[l].data.length;h++){var f=e[l].data[h];f.time=[],f.value=[];for(var k,x=0,V=0;V<e[l].data[h].evolution.length;V++)k=e[l].data[h].evolution[V],f.time.push(k.timeScale),f.value.push(k.valueScale),x=Math.max(x,k.valueScale);n(f,i,U),f.y=a(u,f,function(e,t){return e.ypx[t]}),f._offset=a(c,f,function(){return s}),g=Math.max(g,f.y+x),b=Math.max(b,f._offset),y.push(f)}t(y,o,g,b)}function t(e,t,i,n){for(var a=t.height,o=n/a>.5?.5:1,r=t.y,s=(t.height-n)/i,l=0,h=e.length;h>l;l++){var m=e[l];m.y=r+s*m.y+m._offset*o,delete m.time,delete m.value,delete m.xpx,delete m.ypx,delete m._offset;for(var V=m.evolution,U=0,d=V.length;d>U;U++)V[U].valueScale*=s}}function i(e,t,i,n){if(e===i)throw new Error("x0 is equal with x1!!!");if(t===n)return function(){return t};var a=(t-n)/(e-i),o=(n*e-t*i)/(e-i);return function(e){return a*e+o}}function n(e,t,n){var a=~~t,o=e.time.length;e.xpx=[],e.ypx=[];for(var r,s=0,l=0,h=0,m=0,V=0;o>s;s++){l=~~e.time[s],m=e.value[s]/2,s===o-1?(h=l+a,V=0):(h=~~e.time[s+1],V=e.value[s+1]/2),r=i(l,m,h,V);for(var U=l;h>U;U++)e.xpx.push(U-n),e.ypx.push(r(U))}e.xpx.push(h-n),e.ypx.push(V)}function a(e,t,i){for(var n,a=0,o=t.xpx.length,r=0;o>r;r++)n=i(t,r),a=Math.max(a,n+e[t.xpx[r]]);for(r=0;o>r;r++)n=i(t,r),e[t.xpx[r]]=a+n;return a}return e}),i("echarts/chart/venn",["require","./base","zrender/shape/Text","zrender/shape/Circle","zrender/shape/Path","../config","../util/ecData","zrender/tool/util","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("zrender/shape/Circle"),o=e("zrender/shape/Path"),r=e("../config");r.venn={zlevel:0,z:1,calculable:!1};var s=e("../util/ecData"),l=e("zrender/tool/util");return t.prototype={type:r.CHART_TYPE_VENN,_buildShape:function(){this.selectedMap={},this._symbol=this.option.symbolList,this._queryTarget,this._dropBoxList=[],this._vennDataCounter=0;for(var e=this.series,t=this.component.legend,i=0;i<e.length;i++)if(e[i].type===r.CHART_TYPE_VENN){e[i]=this.reformOption(e[i]);var n=e[i].name||"";if(this.selectedMap[n]=t?t.isSelected(n):!0,!this.selectedMap[n])continue;this._buildVenn(i)}this.addShapeList()},_buildVenn:function(e){var t,i,n=this.series[e],a=n.data;a[0].value>a[1].value?(t=this.zr.getHeight()/3,i=t*Math.sqrt(a[1].value)/Math.sqrt(a[0].value)):(i=this.zr.getHeight()/3,t=i*Math.sqrt(a[0].value)/Math.sqrt(a[1].value));var o=this.zr.getWidth()/2-t,r=(t+i)/2*Math.sqrt(a[2].value)/Math.sqrt((a[0].value+a[1].value)/2),s=t+i;0!==a[2].value&&(s=this._getCoincideLength(a[0].value,a[1].value,a[2].value,t,i,r,Math.abs(t-i),t+i));var l=o+s,h=this.zr.getHeight()/2;if(this._buildItem(e,0,a[0],o,h,t),this._buildItem(e,1,a[1],l,h,i),0!==a[2].value&&a[2].value!==a[0].value&&a[2].value!==a[1].value){var m=(t*t-i*i)/(2*s)+s/2,V=s/2-(t*t-i*i)/(2*s),U=Math.sqrt(t*t-m*m),d=0,p=0;a[0].value>a[1].value&&o+m>l&&(p=1),a[0].value<a[1].value&&o+V>l&&(d=1),this._buildCoincideItem(e,2,a[2],o+m,h-U,h+U,t,i,d,p)}},_getCoincideLength:function(e,t,i,n,a,o,r,s){var l=(n*n-a*a)/(2*o)+o/2,h=o/2-(n*n-a*a)/(2*o),m=Math.acos(l/n),V=Math.acos(h/a),U=n*n*Math.PI,d=m*n*n-l*n*Math.sin(m)+V*a*a-h*a*Math.sin(V),p=d/U,c=i/e,u=Math.abs(p/c);return u>.999&&1.001>u?o:.999>=u?(s=o,o=(o+r)/2,this._getCoincideLength(e,t,i,n,a,o,r,s)):(r=o,o=(o+s)/2,this._getCoincideLength(e,t,i,n,a,o,r,s))},_buildItem:function(e,t,i,n,a,o){var r=this.series,l=r[e],h=this.getCircle(e,t,i,n,a,o);if(s.pack(h,l,e,i,t,i.name),this.shapeList.push(h),l.itemStyle.normal.label.show){var m=this.getLabel(e,t,i,n,a,o);s.pack(m,l,e,l.data[t],t,l.data[t].name),this.shapeList.push(m)}},_buildCoincideItem:function(e,t,i,n,a,r,l,h,m,V){var U=this.series,d=U[e],p=[i,d],c=this.deepMerge(p,"itemStyle.normal")||{},u=this.deepMerge(p,"itemStyle.emphasis")||{},y=c.color||this.zr.getColor(t),g=u.color||this.zr.getColor(t),b="M"+n+","+a+"A"+l+","+l+",0,"+m+",1,"+n+","+r+"A"+h+","+h+",0,"+V+",1,"+n+","+a,f={color:y,path:b},k={zlevel:d.zlevel,z:d.z,style:f,highlightStyle:{color:g,lineWidth:u.borderWidth,strokeColor:u.borderColor}};k=new o(k),k.buildPathArray&&(k.style.pathArray=k.buildPathArray(f.path)),s.pack(k,U[e],0,i,t,i.name),this.shapeList.push(k)},getCircle:function(e,t,i,n,o,r){var s=this.series[e],l=[i,s],h=this.deepMerge(l,"itemStyle.normal")||{},m=this.deepMerge(l,"itemStyle.emphasis")||{},V=h.color||this.zr.getColor(t),U=m.color||this.zr.getColor(t),d={zlevel:s.zlevel,z:s.z,clickable:!0,style:{x:n,y:o,r:r,brushType:"fill",opacity:1,color:V},highlightStyle:{color:U,lineWidth:m.borderWidth,strokeColor:m.borderColor}};return this.deepQuery([i,s,this.option],"calculable")&&(this.setCalculable(d),d.draggable=!0),new a(d)},getLabel:function(e,t,i,a,o,r){var s=this.series[e],l=s.itemStyle,h=[i,s],m=this.deepMerge(h,"itemStyle.normal")||{},V="normal",U=l[V].label,d=U.textStyle||{},p=this.getLabelText(t,i,V),c=this.getFont(d),u=m.color||this.zr.getColor(t),y=d.fontSize||12,g={zlevel:s.zlevel,z:s.z,style:{x:a,y:o-r-y,color:d.color||u,text:p,textFont:c,textAlign:"center"}};return new n(g)},getLabelText:function(e,t,i){var n=this.series,a=n[0],o=this.deepQuery([t,a],"itemStyle."+i+".label.formatter");return o?"function"==typeof o?o(a.name,t.name,t.value):"string"==typeof o?(o=o.replace("{a}","{a0}").replace("{b}","{b0}").replace("{c}","{c0}"),o=o.replace("{a0}",a.name).replace("{b0}",t.name).replace("{c0}",t.value)):void 0:t.name},refresh:function(e){e&&(this.option=e,this.series=e.series),this._buildShape()}},l.inherits(t,i),e("../chart").define("venn",t),t}),i("echarts/chart/treemap",["require","./base","zrender/tool/area","zrender/shape/Rectangle","zrender/shape/Text","zrender/shape/Line","../layout/TreeMap","../data/Tree","../config","../util/ecData","zrender/config","zrender/tool/event","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a);var r=this;r._onclick=function(e){return r.__onclick(e)},r.zr.on(V.EVENT.CLICK,r._onclick)}var i=e("./base"),n=e("zrender/tool/area"),a=e("zrender/shape/Rectangle"),o=e("zrender/shape/Text"),r=e("zrender/shape/Line"),s=e("../layout/TreeMap"),l=e("../data/Tree"),h=e("../config");h.treemap={zlevel:0,z:1,calculable:!1,clickable:!0,center:["50%","50%"],size:["80%","80%"],root:"",itemStyle:{normal:{label:{
-show:!0,x:5,y:12,textStyle:{align:"left",color:"#000",fontFamily:"Arial",fontSize:13,fontStyle:"normal",fontWeight:"normal"}},breadcrumb:{show:!0,textStyle:{}},borderWidth:1,borderColor:"#ccc",childBorderWidth:1,childBorderColor:"#ccc"},emphasis:{}}};var m=e("../util/ecData"),V=e("zrender/config"),U=(e("zrender/tool/event"),e("zrender/tool/util")),d=e("zrender/tool/color");return t.prototype={type:h.CHART_TYPE_TREEMAP,refresh:function(e){this.clear(),e&&(this.option=e,this.series=this.option.series),this._treesMap={};for(var t=this.series,i=this.component.legend,n=0;n<t.length;n++)if(t[n].type===h.CHART_TYPE_TREEMAP){t[n]=this.reformOption(t[n]);var a=t[n].name||"";if(this.selectedMap[a]=i?i.isSelected(a):!0,!this.selectedMap[a])continue;this._buildSeries(t[n],n)}},_buildSeries:function(e,t){var i=l.fromOptionData(e.name,e.data);this._treesMap[t]=i;var n=e.root&&i.getNodeById(e.root)||i.root;this._buildTreemap(n,t)},_buildTreemap:function(e,t){for(var i=this.shapeList,n=0;n<i.length;){var a=i[n];m.get(a,"seriesIndex")===t?(this.zr.delShape(i[n]),i.splice(n,1)):n++}for(var o=i.length,r=this.series[t],l=r.itemStyle,h=this.parsePercent(r.size[0],this.zr.getWidth())||400,V=this.parsePercent(r.size[1],this.zr.getHeight())||500,U=this.parseCenter(this.zr,r.center),d=U[0]-.5*h,p=U[1]-.5*V,c=h*V,u=0,y=[],g=e.children,n=0;n<g.length;n++)u+=g[n].data.value;for(var b=0;b<g.length;b++)y.push(g[b].data.value*c/u);for(var f=new s({x:d,y:p,width:h,height:V}),k=f.run(y),x=0;x<k.length;x++){var _=g[x].data,L=k[x],W=[_.itemStyle,l],X=this.deepMerge(W);X.normal.color||(X.normal.color=this.zr.getColor(x)),X.emphasis.color||(X.emphasis.color=X.normal.color),this._buildItem(_,X,L,t,x),_.children&&this._buildChildrenTreemap(_.children,X,L,t)}this.query(r,"itemStyle.normal.breadcrumb.show")&&this._buildBreadcrumb(e,t,d,p+V);for(var n=o;n<i.length;n++)this.zr.addShape(i[n])},_buildItem:function(e,t,i,n,a){var o=this.series,r=this.getRectangle(e,t,i);m.pack(r,o[n],n,e,a,e.name),this.shapeList.push(r)},getRectangle:function(e,t,i){var n=t.emphasis,o=t.normal,r=this.getLabel(t,i,e.name,e.value),s=this.option.hoverable,l={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:s,clickable:!0,style:U.merge({x:i.x,y:i.y,width:i.width,height:i.height,brushType:"both",color:o.color,lineWidth:o.borderWidth,strokeColor:o.borderColor},r.style,!0),highlightStyle:U.merge({color:n.color,lineWidth:n.borderWidth,strokeColor:n.borderColor},r.highlightStyle,!0)};return new a(l)},getLabel:function(e,t,i,a){var o=e.normal.label.textStyle,r=[e.emphasis.label.textStyle,o],s=this.deepMerge(r),l=e.normal.label.formatter,h=this.getLabelText(i,a,l),m=this.getFont(o),V=n.getTextWidth(h,m),U=n.getTextHeight(h,m),d=this.deepQuery([e.emphasis,e.normal],"label.formatter"),p=this.getLabelText(i,a,d),c=this.getFont(s),u=n.getTextWidth(h,c),y=n.getTextHeight(h,c);e.normal.label.show?(e.normal.label.x+V>t.width||e.normal.label.y+U>t.height)&&(h=""):h="",e.emphasis.label.show?(s.x+u>t.width||s.y+y>t.height)&&(p=""):p="";var g={style:{textX:t.x+e.normal.label.x,textY:t.y+e.normal.label.y,text:h,textPosition:"specific",textColor:o.color,textFont:m},highlightStyle:{textX:t.x+e.emphasis.label.x,textY:t.y+e.emphasis.label.y,text:p,textColor:s.color,textPosition:"specific"}};return g},getLabelText:function(e,t,i){return i?"function"==typeof i?i.call(this.myChart,e,t):"string"==typeof i?(i=i.replace("{b}","{b0}").replace("{c}","{c0}"),i=i.replace("{b0}",e).replace("{c0}",t)):void 0:e},_buildChildrenTreemap:function(e,t,i,n){for(var a=i.width*i.height,o=0,r=[],l=0;l<e.length;l++)o+=e[l].value;for(var h=0;h<e.length;h++)r.push(e[h].value*a/o);for(var V=new s({x:i.x,y:i.y,width:i.width,height:i.height}),U=V.run(r),d=t.normal.childBorderWidth,p=t.normal.childBorderColor,c=0;c<U.length;c++){var u=U[c],y=[];i.y.toFixed(2)!==u.y.toFixed(2)&&y.push(this._getLine(u.x,u.y,u.x+u.width,u.y,d,p)),i.x.toFixed(2)!==u.x.toFixed(2)&&y.push(this._getLine(u.x,u.y,u.x,u.y+u.height,d,p)),(i.y+i.height).toFixed(2)!==(u.y+u.height).toFixed(2)&&y.push(this._getLine(u.x,u.y+u.height,u.x+u.width,u.y+u.height,d,p)),(i.x+i.width).toFixed(2)!==(u.x+u.width).toFixed(2)&&y.push(this._getLine(u.x+u.width,u.y,u.x+u.width,u.y+u.height,d,p));for(var g=0;g<y.length;g++)m.set(y[g],"seriesIndex",n),this.shapeList.push(y[g])}},_getLine:function(e,t,i,n,a,o){var s={zlevel:this.getZlevelBase(),z:this.getZBase(),hoverable:!1,style:{xStart:e,yStart:t,xEnd:i,yEnd:n,lineWidth:a,strokeColor:o}};return new r(s)},_buildBreadcrumb:function(e,t,i,n){for(var a=[],r=e;r;)a.unshift(r.data.name),r=r.parent;for(var s=this.series[t],l=this.query(s,"itemStyle.normal.breadcrumb.textStyle")||{},h=this.query(s,"itemStyle.emphasis.breadcrumb.textStyle")||{},V={y:n+10,textBaseline:"top",textAlign:"left",color:l.color,textFont:this.getFont(l)},p={brushType:"fill",color:h.color||d.lift(l.color,-.3),textFont:this.getFont(h)},c=0;c<a.length;c++){var u=new o({zlevel:this.getZlevelBase(),z:this.getZBase(),style:U.merge({x:i,text:a[c]+(a.length-1-c?" > ":"")},V),clickable:!0,highlightStyle:p});m.set(u,"seriesIndex",t),m.set(u,"name",a[c]),i+=u.getRect(u.style).width,this.shapeList.push(u)}},__onclick:function(e){var t=e.target;if(t){var i=m.get(t,"seriesIndex"),n=m.get(t,"name"),a=this._treesMap[i],o=a.getNodeById(n);o&&o.children.length&&this._buildTreemap(o,i)}}},U.inherits(t,i),e("../chart").define("treemap",t),t}),i("echarts/layout/TreeMap",["require"],function(){function e(e){({x:e.x,y:e.y,width:e.width,height:e.height});this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height}return e.prototype.run=function(e){var t=[];return this._squarify(e,{x:this.x,y:this.y,width:this.width,height:this.height},t),t},e.prototype._squarify=function(e,t,i){var n="VERTICAL",a=t.width,o=t.height;t.width<t.height&&(n="HORIZONTAL",a=t.height,o=t.width);for(var r=this._getShapeListInAbstractRow(e,a,o),s=0;s<r.length;s++){r[s].x=0,r[s].y=0;for(var l=0;s>l;l++)r[s].y+=r[l].height}var h={};if("VERTICAL"==n){for(var m=0;m<r.length;m++)i.push({x:r[m].x+t.x,y:r[m].y+t.y,width:r[m].width,height:r[m].height});h={x:r[0].width+t.x,y:t.y,width:t.width-r[0].width,height:t.height}}else{for(var V=0;V<r.length;V++)i.push({x:r[V].y+t.x,y:r[V].x+t.y,width:r[V].height,height:r[V].width});h={x:t.x,y:t.y+r[0].width,width:t.width,height:t.height-r[0].width}}var U=e.slice(r.length);0!==U.length&&this._squarify(U,h,i)},e.prototype._getShapeListInAbstractRow=function(e,t,i){if(1===e.length)return[{width:t,height:i}];for(var n=1;n<e.length;n++){var a=this._placeFixedNumberRectangles(e.slice(0,n),t,i),o=this._placeFixedNumberRectangles(e.slice(0,n+1),t,i);if(this._isFirstBetter(a,o))return a}},e.prototype._placeFixedNumberRectangles=function(e,t,i){for(var n=e.length,a=[],o=0,r=0;r<e.length;r++)o+=e[r];for(var s=o/i,l=0;n>l;l++){var h=i*e[l]/o;a.push({width:s,height:h})}return a},e.prototype._isFirstBetter=function(e,t){var i=e[0].height/e[0].width;i=i>1?1/i:i;var n=t[0].height/t[0].width;return n=n>1?1/n:n,Math.abs(i-1)<=Math.abs(n-1)?!0:!1},e}),i("echarts/data/Tree",["require","zrender/tool/util"],function(e){function t(e,t){this.id=e,this.depth=0,this.height=0,this.children=[],this.parent=null,this.data=t||null}function i(e){this.root=new t(e)}var n=e("zrender/tool/util");return t.prototype.add=function(e){var t=this.children;e.parent!==this&&(t.push(e),e.parent=this)},t.prototype.remove=function(e){var t=this.children,i=n.indexOf(t,e);i>=0&&(t.splice(i,1),e.parent=null)},t.prototype.traverse=function(e,t){e.call(t,this);for(var i=0;i<this.children.length;i++)this.children[i].traverse(e,t)},t.prototype.updateDepthAndHeight=function(e){var t=0;this.depth=e;for(var i=0;i<this.children.length;i++){var n=this.children[i];n.updateDepthAndHeight(e+1),n.height>t&&(t=n.height)}this.height=t+1},t.prototype.getNodeById=function(e){if(this.id===e)return this;for(var t=0;t<this.children.length;t++){var i=this.children[t].getNodeById(e);if(i)return i}},i.prototype.traverse=function(e,t){this.root.traverse(e,t)},i.prototype.getSubTree=function(e){var t=this.getNodeById(e);if(t){var n=new i(t.id);return n.root=t,n}},i.prototype.getNodeById=function(e){return this.root.getNodeById(e)},i.fromOptionData=function(e,n){function a(e,i){var n=new t(e.name,e);i.add(n);var o=e.children;if(o)for(var r=0;r<o.length;r++)a(o[r],n)}var o=new i(e),r=o.root;r.data={name:e,children:n};for(var s=0;s<n.length;s++)a(n[s],r);return o.root.updateDepthAndHeight(0),o},i.fromGraph=function(e){function n(t){for(var i=e.getNodeById(t.id),a=0;a<i.outEdges.length;a++){var r=i.outEdges[a],s=o[r.node2.id];t.children.push(s),n(s)}}for(var a={},o={},r=0;r<e.nodes.length;r++){var s,l=e.nodes[r];0===l.inDegree()?(a[l.id]=new i(l.id),s=a[l.id].root):s=new t(l.id),s.data=l.data,o[l.id]=s}var h=[];for(var m in a)n(a[m].root),a[m].root.updateDepthAndHeight(0),h.push(a[m]);return h},i}),i("echarts/chart/tree",["require","./base","../util/shape/Icon","zrender/shape/Image","zrender/shape/Line","zrender/shape/BezierCurve","../layout/Tree","../data/Tree","../config","../util/ecData","zrender/config","zrender/tool/event","zrender/tool/util","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=.618,a=e("../util/shape/Icon"),o=e("zrender/shape/Image"),r=e("zrender/shape/Line"),s=e("zrender/shape/BezierCurve"),l=e("../layout/Tree"),h=e("../data/Tree"),m=e("../config");m.tree={zlevel:1,z:2,calculable:!1,clickable:!0,rootLocation:{},orient:"vertical",symbol:"circle",symbolSize:20,nodePadding:30,layerPadding:100,itemStyle:{normal:{label:{show:!0},lineStyle:{width:1,color:"#777",type:"curve"}},emphasis:{}}};var V=e("../util/ecData"),U=(e("zrender/config"),e("zrender/tool/event"),e("zrender/tool/util"));return t.prototype={type:m.CHART_TYPE_TREE,_buildShape:function(e,t){var i=e.data[0];this.tree=h.fromOptionData(i.name,i.children),this.tree.root.data=i,this._setTreeShape(e),this.tree.traverse(function(i){this._buildItem(i,e,t),i.children.length>0&&this._buildLink(i,e)},this);var n=e.roam===!0||"move"===e.roam,a=e.roam===!0||"scale"===e.roam;this.zr.modLayer(this.getZlevelBase(),{panable:n,zoomable:a}),(this.query("markPoint.effect.show")||this.query("markLine.effect.show"))&&this.zr.modLayer(m.EFFECT_ZLEVEL,{panable:n,zoomable:a}),this.addShapeList()},_buildItem:function(e,t,i){var n=[e.data,t],r=this.deepQuery(n,"symbol"),s=this.deepMerge(n,"itemStyle.normal")||{},l=this.deepMerge(n,"itemStyle.emphasis")||{},h=s.color||this.zr.getColor(),m=l.color||this.zr.getColor(),U=-e.layout.angle||0;e.id===this.tree.root.id&&(U=0);var d="right";Math.abs(U)>=Math.PI/2&&Math.abs(U)<3*Math.PI/2&&(U+=Math.PI,d="left");var p=[U,e.layout.position[0],e.layout.position[1]],c=new a({zlevel:this.getZlevelBase(),z:this.getZBase()+1,rotation:p,clickable:this.deepQuery(n,"clickable"),style:{x:e.layout.position[0]-.5*e.layout.width,y:e.layout.position[1]-.5*e.layout.height,width:e.layout.width,height:e.layout.height,iconType:r,color:h,brushType:"both",lineWidth:s.borderWidth,strokeColor:s.borderColor},highlightStyle:{color:m,lineWidth:l.borderWidth,strokeColor:l.borderColor}});c.style.iconType.match("image")&&(c.style.image=c.style.iconType.replace(new RegExp("^image:\\/\\/"),""),c=new o({rotation:p,style:c.style,highlightStyle:c.highlightStyle,clickable:c.clickable,zlevel:this.getZlevelBase(),z:this.getZBase()})),this.deepQuery(n,"itemStyle.normal.label.show")&&(c.style.text=null==e.data.label?e.id:e.data.label,c.style.textPosition=this.deepQuery(n,"itemStyle.normal.label.position"),"radial"===t.orient&&"inside"!==c.style.textPosition&&(c.style.textPosition=d),c.style.textColor=this.deepQuery(n,"itemStyle.normal.label.textStyle.color"),c.style.textFont=this.getFont(this.deepQuery(n,"itemStyle.normal.label.textStyle")||{})),this.deepQuery(n,"itemStyle.emphasis.label.show")&&(c.highlightStyle.textPosition=this.deepQuery(n,"itemStyle.emphasis.label.position"),c.highlightStyle.textColor=this.deepQuery(n,"itemStyle.emphasis.label.textStyle.color"),c.highlightStyle.textFont=this.getFont(this.deepQuery(n,"itemStyle.emphasis.label.textStyle")||{})),V.pack(c,t,i,e.data,0,e.id),this.shapeList.push(c)},_buildLink:function(e,t){var i=t.itemStyle.normal.lineStyle;if("broken"===i.type)return void this._buildBrokenLine(e,i,t);for(var n=0;n<e.children.length;n++){var a=e.layout.position[0],o=e.layout.position[1],r=e.children[n].layout.position[0],s=e.children[n].layout.position[1];switch(i.type){case"curve":this._buildBezierCurve(e,e.children[n],i,t);break;case"broken":break;default:var l=this._getLine(a,o,r,s,i);this.shapeList.push(l)}}},_buildBrokenLine:function(e,t,i){var a=U.clone(t);a.type="solid";var o=[],r=e.layout.position[0],s=e.layout.position[1],l=i.orient,h=e.children[0].layout.position[1],m=r,V=s+(h-s)*(1-n),d=e.children[0].layout.position[0],p=V,c=e.children[e.children.length-1].layout.position[0],u=V;if("horizontal"===l){var y=e.children[0].layout.position[0];m=r+(y-r)*(1-n),V=s,d=m,p=e.children[0].layout.position[1],c=m,u=e.children[e.children.length-1].layout.position[1]}o.push(this._getLine(r,s,m,V,a)),o.push(this._getLine(d,p,c,u,a));for(var g=0;g<e.children.length;g++)y=e.children[g].layout.position[0],h=e.children[g].layout.position[1],"horizontal"===l?p=h:d=y,o.push(this._getLine(d,p,y,h,a));this.shapeList=this.shapeList.concat(o)},_getLine:function(e,t,i,n,a){return e===i&&(e=i=this.subPixelOptimize(e,a.width)),t===n&&(t=n=this.subPixelOptimize(t,a.width)),new r({zlevel:this.getZlevelBase(),hoverable:!1,style:U.merge({xStart:e,yStart:t,xEnd:i,yEnd:n,lineType:a.type,strokeColor:a.color,lineWidth:a.width},a,!0)})},_buildBezierCurve:function(e,t,i,a){var o=n,r=a.orient,l=e.layout.position[0],h=e.layout.position[1],m=t.layout.position[0],V=t.layout.position[1],d=l,p=(V-h)*o+h,c=m,u=(V-h)*(1-o)+h;if("horizontal"===r)d=(m-l)*o+l,p=h,c=(m-l)*(1-o)+l,u=V;else if("radial"===r)if(e.id===this.tree.root.id)d=(m-l)*o+l,p=(V-h)*o+h,c=(m-l)*(1-o)+l,u=(V-h)*(1-o)+h;else{var y=e.layout.originPosition[0],g=e.layout.originPosition[1],b=t.layout.originPosition[0],f=t.layout.originPosition[1],k=this.tree.root.layout.position[0],x=this.tree.root.layout.position[1];d=y,p=(f-g)*o+g,c=b,u=(f-g)*(1-o)+g;var _=(d-this.minX)/this.width*Math.PI*2;d=p*Math.cos(_)+k,p=p*Math.sin(_)+x,_=(c-this.minX)/this.width*Math.PI*2,c=u*Math.cos(_)+k,u=u*Math.sin(_)+x}var L=new s({zlevel:this.getZlevelBase(),hoverable:!1,style:U.merge({xStart:l,yStart:h,cpX1:d,cpY1:p,cpX2:c,cpY2:u,xEnd:m,yEnd:V,strokeColor:i.color,lineWidth:i.width},i,!0)});this.shapeList.push(L)},_setTreeShape:function(e){var t=new l({nodePadding:e.nodePadding,layerPadding:e.layerPadding});this.tree.traverse(function(t){var i=[t.data,e],n=this.deepQuery(i,"symbolSize");"number"==typeof n&&(n=[n,n]),t.layout={width:n[0],height:n[1]}},this),t.run(this.tree);var i=e.orient,n=e.rootLocation.x,a=e.rootLocation.y,o=this.zr.getWidth(),r=this.zr.getHeight();n="center"===n?.5*o:this.parsePercent(n,o),a="center"===a?.5*r:this.parsePercent(a,r),a=this.parsePercent(a,r),"horizontal"===i&&(n=isNaN(n)?10:n,a=isNaN(a)?.5*r:a),"radial"===i?(n=isNaN(n)?.5*o:n,a=isNaN(a)?.5*r:a):(n=isNaN(n)?.5*o:n,a=isNaN(a)?10:a);var s=this.tree.root.layout.position[0];if("radial"===i){var h=1/0,m=0,V=0;this.tree.traverse(function(e){m=Math.max(m,e.layout.position[0]),h=Math.min(h,e.layout.position[0]),V=Math.max(V,e.layout.width)}),this.width=m-h+2*V,this.minX=h}this.tree.traverse(function(t){var o,r;if("vertical"===i&&"inverse"===e.direction)o=t.layout.position[0]-s+n,r=a-t.layout.position[1];else if("vertical"===i)o=t.layout.position[0]-s+n,r=t.layout.position[1]+a;else if("horizontal"===i&&"inverse"===e.direction)r=t.layout.position[0]-s+a,o=n-t.layout.position[1];else if("horizontal"===i)r=t.layout.position[0]-s+a,o=t.layout.position[1]+n;else{o=t.layout.position[0],r=t.layout.position[1],t.layout.originPosition=[o,r];var l=r,m=(o-h)/this.width*Math.PI*2;o=l*Math.cos(m)+n,r=l*Math.sin(m)+a,t.layout.angle=m}t.layout.position[0]=o,t.layout.position[1]=r},this)},refresh:function(e){this.clear(),e&&(this.option=e,this.series=this.option.series);for(var t=this.series,i=this.component.legend,n=0;n<t.length;n++)if(t[n].type===m.CHART_TYPE_TREE){t[n]=this.reformOption(t[n]);var a=t[n].name||"";if(this.selectedMap[a]=i?i.isSelected(a):!0,!this.selectedMap[a])continue;this._buildSeries(t[n],n)}},_buildSeries:function(e,t){this._buildShape(e,t)}},U.inherits(t,i),e("../chart").define("tree",t),t}),i("echarts/layout/Tree",["require","zrender/tool/vector"],function(e){function t(e){e=e||{},this.nodePadding=e.nodePadding||30,this.layerPadding=e.layerPadding||100,this._layerOffsets=[],this._layers=[]}var i=e("zrender/tool/vector");return t.prototype.run=function(e){this._layerOffsets.length=0;for(var t=0;t<e.root.height+1;t++)this._layerOffsets[t]=0,this._layers[t]=[];this._updateNodeXPosition(e.root);var i=e.root;this._updateNodeYPosition(i,0,i.layout.height)},t.prototype._updateNodeXPosition=function(e){var t=1/0,n=-(1/0);e.layout.position=e.layout.position||i.create();for(var a=0;a<e.children.length;a++){var o=e.children[a];this._updateNodeXPosition(o);var r=o.layout.position[0];t>r&&(t=r),r>n&&(n=r)}e.layout.position[0]=e.children.length>0?(t+n)/2:0;var s=this._layerOffsets[e.depth]||0;if(s>e.layout.position[0]){var l=s-e.layout.position[0];this._shiftSubtree(e,l);for(var a=e.depth+1;a<e.height+e.depth;a++)this._layerOffsets[a]+=l}this._layerOffsets[e.depth]=e.layout.position[0]+e.layout.width+this.nodePadding,this._layers[e.depth].push(e)},t.prototype._shiftSubtree=function(e,t){e.layout.position[0]+=t;for(var i=0;i<e.children.length;i++)this._shiftSubtree(e.children[i],t)},t.prototype._updateNodeYPosition=function(e,t,i){e.layout.position[1]=t;for(var n=0,a=0;a<e.children.length;a++)n=Math.max(e.children[a].layout.height,n);var o=this.layerPadding;"function"==typeof o&&(o=o(e.depth));for(var a=0;a<e.children.length;a++)this._updateNodeYPosition(e.children[a],t+o+i,n)},t}),i("echarts/chart/wordCloud",["require","./base","zrender/shape/Text","../layout/WordCloud","../component/grid","../component/dataRange","../config","../util/ecData","zrender/tool/util","zrender/tool/color","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("zrender/shape/Text"),a=e("../layout/WordCloud");e("../component/grid"),e("../component/dataRange");var o=e("../config"),r=e("../util/ecData"),s=e("zrender/tool/util"),l=e("zrender/tool/color");return o.wordCloud={zlevel:0,z:2,clickable:!0,center:["50%","50%"],size:["40%","40%"],textRotation:[0,90],textPadding:0,autoSize:{enable:!0,minSize:12},itemStyle:{normal:{textStyle:{fontSize:function(e){return e.value}}}}},t.prototype={type:o.CHART_TYPE_WORDCLOUD,refresh:function(e){e&&(this.option=e,this.series=e.series),this._init()},_init:function(){var e=this.series;this.backupShapeList();for(var t=this.component.legend,i=0;i<e.length;i++)if(e[i].type===o.CHART_TYPE_WORDCLOUD){e[i]=this.reformOption(e[i]);var n=e[i].name||"";if(this.selectedMap[n]=t?t.isSelected(n):!0,!this.selectedMap[n])continue;this.buildMark(i),this._initSerie(e[i])}},_initSerie:function(e){var t=e.itemStyle.normal.textStyle,i=[this.parsePercent(e.size[0],this.zr.getWidth())||200,this.parsePercent(e.size[1],this.zr.getHeight())||200],n=this.parseCenter(this.zr,e.center),o={size:i,wordletype:{autoSizeCal:e.autoSize},center:n,rotate:e.textRotation,padding:e.textPadding,font:t.fontFamily,fontSize:t.fontSize,fontWeight:t.fontWeight,fontStyle:t.fontStyle,text:function(e){return e.name},data:e.data},r=new a(o),s=this;r.end(function(e){s._buildShapes(e)}),r.start()},_buildShapes:function(e){for(var t=e.length,i=0;t>i;i++)this._buildTextShape(e[i],0,i);this.addShapeList()},_buildTextShape:function(e,t,i){var a=this.series,o=a[t],s=o.name||"",h=o.data[i],m=[h,o],V=this.component.legend,U=V?V.getColor(s):this.zr.getColor(t),d=this.deepMerge(m,"itemStyle.normal")||{},p=this.deepMerge(m,"itemStyle.emphasis")||{},c=this.getItemStyleColor(d.color,t,i,h)||U,u=this.getItemStyleColor(p.color,t,i,h)||("string"==typeof c?l.lift(c,-.2):c),y=new n({zlevel:o.zlevel,z:o.z,hoverable:!0,clickable:this.deepQuery(m,"clickable"),style:{x:0,y:0,text:e.text,color:c,textFont:[e.style,e.weight,e.size+"px",e.font].join(" "),textBaseline:"alphabetic",textAlign:"center"},highlightStyle:{brushType:p.borderWidth?"both":"fill",color:u,lineWidth:p.borderWidth||0,strokeColor:p.borderColor},position:[e.x,e.y],rotation:[-e.rotate/180*Math.PI,0,0]});r.pack(y,o,t,h,i,h.name),this.shapeList.push(y)}},s.inherits(t,i),e("../chart").define("wordCloud",t),t}),i("echarts/layout/WordCloud",["require","../layout/WordCloudRectZero","zrender/tool/util"],function(e){function t(e){this._init(e)}var i=e("../layout/WordCloudRectZero"),n=e("zrender/tool/util");return t.prototype={start:function(){function e(){p.totalArea=r,U.autoSizeCal.enable&&p._autoCalTextSize(m,r,a,o,U.autoSizeCal.minSize),V.timer&&clearInterval(V.timer),V.timer=setInterval(t,0),t()}function t(){for(var e,t=+new Date,i=m.length;+new Date-t<V.timeInterval&&++s<i&&V.timer;)e=m[s],e.x=d[0]>>1,e.y=d[1]>>1,p._cloudSprite(e,m,s),e.hasText&&p._place(n,e,h)&&(l.push(e),e.x-=d[0]>>1,e.y-=d[1]>>1);s>=i&&(p.stop(),p._fixTagPosition(l),V.endcallback(l))}var n=null,a=0,o=0,r=0,s=-1,l=[],h=null,m=this.wordsdata,V=this.defaultOption,U=V.wordletype,d=V.size,p=this,c=new i({type:U.type,width:d[0],height:d[1]});return c.calculate(function(t){n=t.initarr,a=t.maxWit,o=t.maxHit,r=t.area,h=t.imgboard,e()},this),this},_fixTagPosition:function(e){for(var t=this.defaultOption.center,i=0,n=e.length;n>i;i++)e[i].x+=t[0],e[i].y+=t[1]},stop:function(){return this.defaultOption.timer&&(clearInterval(this.defaultOption.timer),this.defaultOption.timer=null),this},end:function(e){return e&&(this.defaultOption.endcallback=e),this},_init:function(e){this.defaultOption={},this._initProperty(e),this._initMethod(e),this._initCanvas(),this._initData(e.data)},_initData:function(e){var t=this,i=t.defaultOption;this.wordsdata=e.map(function(e,n){return e.text=i.text.call(t,e,n),e.font=i.font.call(t,e,n),e.style=i.fontStyle.call(t,e,n),e.weight=i.fontWeight.call(t,e,n),e.rotate=i.rotate.call(t,e,n),e.size=~~i.fontSize.call(t,e,n),e.padding=i.padding.call(t,e,n),e}).sort(function(e,t){return t.value-e.value})},_initMethod:function(e){function t(e){return e.name}function i(){return"sans-serif"}function n(){return"normal"}function a(e){return e.value}function o(){return 0}function r(e){return function(){return e[Math.round(Math.random()*(e.length-1))]}}function s(){return 0}function l(e){var t=e[0]/e[1];return function(e){return[t*(e*=.1)*Math.cos(e),e*Math.sin(e)]}}function h(e){var t=4,i=t*e[0]/e[1],n=0,a=0;return function(e){var o=0>e?-1:1;switch(Math.sqrt(1+4*o*e)-o&3){case 0:n+=i;break;case 1:a+=t;break;case 2:n-=i;break;default:a-=t}return[n,a]}}function m(e){return"function"==typeof e?e:function(){return e}}var V=this.defaultOption;V.text=e.text?m(e.text):t,V.font=e.font?m(e.font):i,V.fontSize=e.fontSize?m(e.fontSize):a,V.fontStyle=e.fontStyle?m(e.fontStyle):n,V.fontWeight=e.fontWeight?m(e.fontWeight):n,V.rotate=e.rotate?r(e.rotate):o,V.padding=e.padding?m(e.padding):s,V.center=e.center,V.spiral=l,V.endcallback=function(){},V.rectangularSpiral=h,V.archimedeanSpiral=l},_initProperty:function(e){var t=this.defaultOption;t.size=e.size||[256,256],t.wordletype=e.wordletype,t.words=e.words||[],t.timeInterval=1/0,t.timer=null,t.spirals={archimedean:t.archimedeanSpiral,rectangular:t.rectangularSpiral},n.merge(t,{size:[256,256],wordletype:{type:"RECT",areaPresent:.058,autoSizeCal:{enable:!0,minSize:12}}})},_initCanvas:function(){var e,t=Math.PI/180,i=64,n=2048,a=1;"undefined"!=typeof document?(e=document.createElement("canvas"),e.width=1,e.height=1,a=Math.sqrt(e.getContext("2d").getImageData(0,0,1,1).data.length>>2),e.width=(i<<5)/a,e.height=n/a):e=new Canvas(i<<5,n);var o=e.getContext("2d");o.fillStyle=o.strokeStyle="red",o.textAlign="center",this.defaultOption.c=o,this.defaultOption.cw=i,this.defaultOption.ch=n,this.defaultOption.ratio=a,this.defaultOption.cloudRadians=t},_cloudSprite:function(e,t,i){if(!e.sprite){var n=this.defaultOption.cw,a=this.defaultOption.ch,o=this.defaultOption.c,r=this.defaultOption.ratio,s=this.defaultOption.cloudRadians;o.clearRect(0,0,(n<<5)/r,a/r);var l=0,h=0,m=0,V=t.length;for(--i;++i<V;){e=t[i],o.save(),o.font=e.style+" "+e.weight+" "+~~((e.size+1)/r)+"px "+e.font;var U=o.measureText(e.text+"m").width*r,d=e.size<<1;if(e.rotate){var p=Math.sin(e.rotate*s),c=Math.cos(e.rotate*s),u=U*c,y=U*p,g=d*c,b=d*p;U=Math.max(Math.abs(u+b),Math.abs(u-b))+31>>5<<5,d=~~Math.max(Math.abs(y+g),Math.abs(y-g))}else U=U+31>>5<<5;if(d>m&&(m=d),l+U>=n<<5&&(l=0,h+=m,m=0),h+d>=a)break;o.translate((l+(U>>1))/r,(h+(d>>1))/r),e.rotate&&o.rotate(e.rotate*s),o.fillText(e.text,0,0),e.padding&&(o.lineWidth=2*e.padding,o.strokeText(e.text,0,0)),o.restore(),e.width=U,e.height=d,e.xoff=l,e.yoff=h,e.x1=U>>1,e.y1=d>>1,e.x0=-e.x1,e.y0=-e.y1,e.hasText=!0,l+=U}for(var f=o.getImageData(0,0,(n<<5)/r,a/r).data,k=[];--i>=0;)if(e=t[i],e.hasText){for(var U=e.width,x=U>>5,d=e.y1-e.y0,_=0;d*x>_;_++)k[_]=0;if(l=e.xoff,null==l)return;h=e.yoff;for(var L=0,W=-1,X=0;d>X;X++){for(var _=0;U>_;_++){var v=x*X+(_>>5),w=f[(h+X)*(n<<5)+(l+_)<<2]?1<<31-_%32:0;k[v]|=w,L|=w}L?W=X:(e.y0++,d--,X--,h++)}e.y1=e.y0+W,e.sprite=k.slice(0,(e.y1-e.y0)*x)}}},_place:function(e,t,i){function n(e,t,i){i>>=5;for(var n,a=e.sprite,o=e.width>>5,r=e.x-(o<<4),s=127&r,l=32-s,h=e.y1-e.y0,m=(e.y+e.y0)*i+(r>>5),V=0;h>V;V++){n=0;for(var U=0;o>=U;U++)if((n<<l|(o>U?(n=a[V*o+U])>>>s:0))&t[m+U])return!0;m+=i}return!1}function a(e,t){return t.row[e.y]&&t.cloumn[e.x]&&e.x>=t.row[e.y].start&&e.x<=t.row[e.y].end&&e.y>=t.cloumn[e.x].start&&e.y<=t.cloumn[e.x].end}for(var o,r,s,l=this.defaultOption.size,h=([{x:0,y:0},{x:l[0],y:l[1]}],t.x),m=t.y,V=Math.sqrt(l[0]*l[0]+l[1]*l[1]),U=this.defaultOption.spiral(l),d=Math.random()<.5?1:-1,p=-d;(o=U(p+=d))&&(r=~~o[0],s=~~o[1],!(Math.min(r,s)>V));)if(t.x=h+r,t.y=m+s,!(t.x+t.x0<0||t.y+t.y0<0||t.x+t.x1>l[0]||t.y+t.y1>l[1])&&!n(t,e,l[0])&&a(t,i)){for(var c,u=t.sprite,y=t.width>>5,g=l[0]>>5,b=t.x-(y<<4),f=127&b,k=32-f,x=t.y1-t.y0,_=(t.y+t.y0)*g+(b>>5),L=0;x>L;L++){c=0;for(var W=0;y>=W;W++)e[_+W]|=c<<k|(y>W?(c=u[L*y+W])>>>f:0);_+=g}return delete t.sprite,!0}return!1},_autoCalTextSize:function(e,t,i,n,a){function o(e){c.clearRect(0,0,(d<<5)/u,p/u),c.save(),c.font=e.style+" "+e.weight+" "+~~((e.size+1)/u)+"px "+e.font;var t=c.measureText(e.text+"m").width*u,r=e.size<<1;t=t+31>>5<<5,c.restore(),e.aw=t,e.ah=r;var s,l,h;if(e.rotate){var m=Math.sin(e.rotate*y),V=Math.cos(e.rotate*y),g=t*V,b=t*m,f=r*V,k=r*m;l=Math.max(Math.abs(g+k),Math.abs(g-k))+31>>5<<5,h=~~Math.max(Math.abs(b+f),Math.abs(b-f))}return e.size<=U||e.rotate&&t*r<=e.area&&i>=l&&n>=h||t*r<=e.area&&i>=t&&n>=r?void(e.area=t*r):(s=e.rotate&&l>i&&h>n?Math.min(i/l,n/h):t>i||r>n?Math.min(i/t,n/r):Math.sqrt(e.area/(e.aw*e.ah)),e.size=~~(s*e.size),e.size<a?void(e.size=a):o(e))}function r(e,t){for(var i=e.length,n=0;i--;)n+=t(e[i]);return n}for(var s,l,h=r(e,function(e){return e.size}),m=e.length,V=.25,U=a,d=this.defaultOption.cw,p=this.defaultOption.ch,c=this.defaultOption.c,u=this.defaultOption.ratio,y=this.defaultOption.cloudRadians;m--;)s=e[m],l=s.size/h,s.areapre=V?V>l?l:V:l,s.area=t*s.areapre,s.totalarea=t,o(s)}},t}),i("echarts/layout/WordCloudRectZero",["require"],function(){function e(e){this.defaultOption={type:"RECT"},this._init(e)}return e.prototype={RECT:"_calculateRect",_init:function(e){this._initOption(e),this._initCanvas()},_initOption:function(e){for(k in e)this.defaultOption[k]=e[k]},_initCanvas:function(){var e=document.createElement("canvas");e.width=1,e.height=1;var t=Math.sqrt(e.getContext("2d").getImageData(0,0,1,1).data.length>>2);if(e.width=this.defaultOption.width,e.height=this.defaultOption.height,e.getContext)var i=e.getContext("2d");this.canvas=e,this.ctx=i,this.ratio=t},calculate:function(e,t){var i=this.defaultOption.type,n=this[i];this[n].call(this,e,t)},_calculateReturn:function(e,t,i){t.call(i,e)},_calculateRect:function(e,t){var i={},n=this.defaultOption.width>>5<<5,a=this.defaultOption.height;i.initarr=this._rectZeroArray(n*a),i.area=n*a,i.maxHit=a,i.maxWit=n,i.imgboard=this._rectBoard(n,a),this._calculateReturn(i,e,t)},_rectBoard:function(e,t){for(var i=[],n=0;t>n;n++)i.push({y:n,start:0,end:e});for(var a=[],n=0;e>n;n++)a.push({x:n,start:0,end:t});return{row:i,cloumn:a}},_rectZeroArray:function(e){for(var t=[],i=e,n=-1;++n<i;)t[n]=0;return t}},e}),i("echarts/chart/heatmap",["require","./base","../layer/heatmap","../config","../util/ecData","zrender/tool/util","zrender/tool/color","zrender/shape/Image","../chart"],function(e){function t(e,t,n,a,o){i.call(this,e,t,n,a,o),this.refresh(a)}var i=e("./base"),n=e("../layer/heatmap"),a=e("../config"),o=(e("../util/ecData"),e("zrender/tool/util")),r=(e("zrender/tool/color"),e("zrender/shape/Image"));return a.heatmap={zlevel:0,z:2,clickable:!0},t.prototype={type:a.CHART_TYPE_HEATMAP,refresh:function(e){this.clear(),e&&(this.option=e,this.series=e.series),this._init()},_init:function(){var e=this.series;this.backupShapeList();for(var t=e.length,i=0;t>i;++i)if(e[i].type===a.CHART_TYPE_HEATMAP){e[i]=this.reformOption(e[i]);var o=new n(e[i]),s=o.getCanvas(e[i].data,this.zr.getWidth(),this.zr.getHeight()),l=new r({position:[0,0],scale:[1,1],hoverable:this.option.hoverable,style:{x:0,y:0,image:s,width:s.width,height:s.height}});this.shapeList.push(l)}this.addShapeList()}},o.inherits(t,i),e("../chart").define("heatmap",t),t});var n=t("zrender");n.tool={color:t("zrender/tool/color"),math:t("zrender/tool/math"),util:t("zrender/tool/util"),vector:t("zrender/tool/vector"),area:t("zrender/tool/area"),event:t("zrender/tool/event")},n.animation={Animation:t("zrender/animation/Animation"),Cip:t("zrender/animation/Clip"),easing:t("zrender/animation/easing")};var a=t("echarts");a.config=t("echarts/config"),a.util={mapData:{params:t("echarts/util/mapData/params")}},t("echarts/chart/line"),t("echarts/chart/bar"),t("echarts/chart/scatter"),t("echarts/chart/k"),t("echarts/chart/pie"),t("echarts/chart/radar"),t("echarts/chart/chord"),t("echarts/chart/force"),t("echarts/chart/map"),t("echarts/chart/gauge"),t("echarts/chart/funnel"),t("echarts/chart/eventRiver"),t("echarts/chart/venn"),t("echarts/chart/treemap"),t("echarts/chart/tree"),t("echarts/chart/wordCloud"),t("echarts/chart/heatmap"),e.echarts=a,e.zrender=n}(window); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/images/sort_both.png b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/images/sort_both.png
deleted file mode 100644
index 289a8f7..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/images/sort_both.png
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/jquery.i18n/jquery.i18n.properties-1.0.9.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/jquery.i18n/jquery.i18n.properties-1.0.9.js
deleted file mode 100644
index 00482d7..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/jquery.i18n/jquery.i18n.properties-1.0.9.js
+++ /dev/null
@@ -1,480 +0,0 @@
-
-/******************************************************************************
- * jquery.i18n.properties
- *
- * Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and
- * MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses.
- *
- * @version 1.0.x
- * @author Nuno Fernandes
- * @url www.codingwithcoffee.com
- * @inspiration Localisation assistance for jQuery (http://keith-wood.name/localisation.html)
- * by Keith Wood (kbwood{at}iinet.com.au) June 2007
- *
- *****************************************************************************/
-
-(function($) {
-$.i18n = {};
-
-/** Map holding bundle keys (if mode: 'map') */
-$.i18n.map = {};
-
-/**
- * Load and parse message bundle files (.properties),
- * making bundles keys available as javascript variables.
- *
- * i18n files are named <name>.js, or <name>_<language>.js or <name>_<language>_<country>.js
- * Where:
- * The <language> argument is a valid ISO Language Code. These codes are the lower-case,
- * two-letter codes as defined by ISO-639. You can find a full list of these codes at a
- * number of sites, such as: http://www.loc.gov/standards/iso639-2/englangn.html
- * The <country> argument is a valid ISO Country Code. These codes are the upper-case,
- * two-letter codes as defined by ISO-3166. You can find a full list of these codes at a
- * number of sites, such as: http://www.iso.ch/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html
- *
- * Sample usage for a bundles/Messages.properties bundle:
- * $.i18n.properties({
- * name: 'Messages',
- * language: 'en_US',
- * path: 'bundles'
- * });
- * @param name (string/string[], optional) names of file to load (eg, 'Messages' or ['Msg1','Msg2']). Defaults to "Messages"
- * @param language (string, optional) language/country code (eg, 'en', 'en_US', 'pt_PT'). if not specified, language reported by the browser will be used instead.
- * @param path (string, optional) path of directory that contains file to load
- * @param mode (string, optional) whether bundles keys are available as JavaScript variables/functions or as a map (eg, 'vars' or 'map')
- * @param cache (boolean, optional) whether bundles should be cached by the browser, or forcibly reloaded on each page load. Defaults to false (i.e. forcibly reloaded)
- * @param encoding (string, optional) the encoding to request for bundles. Property file resource bundles are specified to be in ISO-8859-1 format. Defaults to UTF-8 for backward compatibility.
- * @param callback (function, optional) callback function to be called after script is terminated
- */
-$.i18n.properties = function(settings) {
- // set up settings
- var defaults = {
- name: 'Messages',
- language: '',
- path: '',
- mode: 'vars',
- cache: false,
- encoding: 'UTF-8',
- callback: null
- };
- settings = $.extend(defaults, settings);
- if(settings.language === null || settings.language == '') {
- settings.language = $.i18n.browserLang();
- }
- if(settings.language === null) {settings.language='';}
-
- // load and parse bundle files
- var files = getFiles(settings.name);
- for(i=0; i<files.length; i++) {
- // 1. load base (eg, Messages.properties)
- //loadAndParseFile(settings.path + files[i] + '.properties', settings);
- // 2. with language code (eg, Messages_pt.properties)
- //if(settings.language.length >= 2) {
- // loadAndParseFile(settings.path + files[i] + '-' + settings.language.substring(0, 2) +'.properties', settings);
- //}
- // 3. with language code and country code (eg, Messages_pt_PT.properties)
- // 将寻找资æºæ–‡ä»¶çš„顺åºå€’ç½®
- if(settings.language.length >= 5) {
- loadAndParseFile(settings.path + files[i] + '-' + settings.language.substring(0, 5) +'.properties', settings);
- } else if(settings.language.length >= 2) {
- loadAndParseFile(settings.path + files[i] + '-' + settings.language.substring(0, 2) +'.properties', settings);
- } else {
- loadAndParseFile(settings.path + files[i] + '.properties', settings);
- }
- }
-
- // call callback
- if(settings.callback){ settings.callback(); }
-};
-
-
-/**
- * When configured with mode: 'map', allows access to bundle values by specifying its key.
- * Eg, jQuery.i18n.prop('com.company.bundles.menu_add')
- */
-$.i18n.prop = function(key /* Add parameters as function arguments as necessary */) {
- var value = $.i18n.map[key];
- if (value == null)
- return '[' + key + ']';
-
-// if(arguments.length < 2) // No arguments.
-// //if(key == 'spv.lbl.modified') {alert(value);}
-// return value;
-
-// if (!$.isArray(placeHolderValues)) {
-// // If placeHolderValues is not an array, make it into one.
-// placeHolderValues = [placeHolderValues];
-// for (var i=2; i<arguments.length; i++)
-// placeHolderValues.push(arguments[i]);
-// }
-
- // Place holder replacement
- /**
- * Tested with:
- * test.t1=asdf ''{0}''
- * test.t2=asdf '{0}' '{1}'{1}'zxcv
- * test.t3=This is \"a quote" 'a''{0}''s'd{fgh{ij'
- * test.t4="'''{'0}''" {0}{a}
- * test.t5="'''{0}'''" {1}
- * test.t6=a {1} b {0} c
- * test.t7=a 'quoted \\ s\ttringy' \t\t x
- *
- * Produces:
- * test.t1, p1 ==> asdf 'p1'
- * test.t2, p1 ==> asdf {0} {1}{1}zxcv
- * test.t3, p1 ==> This is "a quote" a'{0}'sd{fgh{ij
- * test.t4, p1 ==> "'{0}'" p1{a}
- * test.t5, p1 ==> "'{0}'" {1}
- * test.t6, p1 ==> a {1} b p1 c
- * test.t6, p1, p2 ==> a p2 b p1 c
- * test.t6, p1, p2, p3 ==> a p2 b p1 c
- * test.t7 ==> a quoted \ s tringy x
- */
-
- var i;
- if (typeof(value) == 'string') {
- // Handle escape characters. Done separately from the tokenizing loop below because escape characters are
- // active in quoted strings.
- i = 0;
- while ((i = value.indexOf('\\', i)) != -1) {
- if (value[i+1] == 't')
- value = value.substring(0, i) + '\t' + value.substring((i++) + 2); // tab
- else if (value[i+1] == 'r')
- value = value.substring(0, i) + '\r' + value.substring((i++) + 2); // return
- else if (value[i+1] == 'n')
- value = value.substring(0, i) + '\n' + value.substring((i++) + 2); // line feed
- else if (value[i+1] == 'f')
- value = value.substring(0, i) + '\f' + value.substring((i++) + 2); // form feed
- else if (value[i+1] == '\\')
- value = value.substring(0, i) + '\\' + value.substring((i++) + 2); // \
- else
- value = value.substring(0, i) + value.substring(i+1); // Quietly drop the character
- }
-
- // Lazily convert the string to a list of tokens.
- var arr = [], j, index;
- i = 0;
- while (i < value.length) {
- if (value[i] == '\'') {
- // Handle quotes
- if (i == value.length-1)
- value = value.substring(0, i); // Silently drop the trailing quote
- else if (value[i+1] == '\'')
- value = value.substring(0, i) + value.substring(++i); // Escaped quote
- else {
- // Quoted string
- j = i + 2;
- while ((j = value.indexOf('\'', j)) != -1) {
- if (j == value.length-1 || value[j+1] != '\'') {
- // Found start and end quotes. Remove them
- value = value.substring(0,i) + value.substring(i+1, j) + value.substring(j+1);
- i = j - 1;
- break;
- }
- else {
- // Found a double quote, reduce to a single quote.
- value = value.substring(0,j) + value.substring(++j);
- }
- }
-
- if (j == -1) {
- // There is no end quote. Drop the start quote
- value = value.substring(0,i) + value.substring(i+1);
- }
- }
- }
- else if (value[i] == '{') {
- // Beginning of an unquoted place holder.
- j = value.indexOf('}', i+1);
- if (j == -1)
- i++; // No end. Process the rest of the line. Java would throw an exception
- else {
- // Add 1 to the index so that it aligns with the function arguments.
- index = parseInt(value.substring(i+1, j));
- if (!isNaN(index) && index >= 0) {
- // Put the line thus far (if it isn't empty) into the array
- var s = value.substring(0, i);
- if (s != "")
- arr.push(s);
- // Put the parameter reference into the array
- arr.push(index);
- // Start the processing over again starting from the rest of the line.
- i = 0;
- value = value.substring(j+1);
- }
- else
- i = j + 1; // Invalid parameter. Leave as is.
- }
- }
- else
- i++;
- }
-
- // Put the remainder of the no-empty line into the array.
- if (value != "")
- arr.push(value);
- value = arr;
-
- // Make the array the value for the entry.
- $.i18n.map[key] = arr;
- }
-
- if (value.length == 0)
- return "";
- if (value.lengh == 1 && typeof(value[0]) == "string")
- return value[0];
-
- var s = "";
- for (i=0; i<value.length; i++) {
- if (typeof(value[i]) == "string")
- s += value[i];
- // Must be a number
- else if (value[i] + 1 < arguments.length)
- s += arguments[value[i] + 1];
- else
- s += "{"+ value[i] +"}";
- }
-
- return s;
-};
-
-/** Language reported by browser, normalized code */
-$.i18n.browserLang = function() {
- return normaliseLanguageCode(navigator.language /* Mozilla */ || navigator.userLanguage /* IE */);
-}
-
-
-/** Load and parse .properties files */
-function loadAndParseFile(filename, settings) {
- $.ajax({
- url: filename,
- async: false,
- cache: settings.cache,
- contentType:'text/plain;charset='+ settings.encoding,
- dataType: 'text',
- success: function(data, status) {
- parseData(data, settings.mode);
- }
- });
-}
-
-/** Parse .properties files */
-function parseData(data, mode) {
- var parsed = '';
- var parameters = data.split( /\n/ );
- var regPlaceHolder = /(\{\d+\})/g;
- var regRepPlaceHolder = /\{(\d+)\}/g;
- var unicodeRE = /(\\u.{4})/ig;
- for(var i=0; i<parameters.length; i++ ) {
- parameters[i] = parameters[i].replace( /^\s\s*/, '' ).replace( /\s\s*$/, '' ); // trim
- if(parameters[i].length > 0 && parameters[i].match("^#")!="#") { // skip comments
- var pair = parameters[i].split('=');
- if(pair.length > 0) {
- /** Process key & value */
- var name = unescape(pair[0]).replace( /^\s\s*/, '' ).replace( /\s\s*$/, '' ); // trim
- var value = pair.length == 1 ? "" : pair[1];
- // process multi-line values
- while(value.match(/\\$/)=="\\") {
- value = value.substring(0, value.length - 1);
- value += parameters[++i].replace( /\s\s*$/, '' ); // right trim
- }
- // Put values with embedded '='s back together
- for(var s=2;s<pair.length;s++){ value +='=' + pair[s]; }
- value = value.replace( /^\s\s*/, '' ).replace( /\s\s*$/, '' ); // trim
-
- /** Mode: bundle keys in a map */
- if(mode == 'map' || mode == 'both') {
- // handle unicode chars possibly left out
- var unicodeMatches = value.match(unicodeRE);
- if(unicodeMatches) {
- for(var u=0; u<unicodeMatches.length; u++) {
- value = value.replace( unicodeMatches[u], unescapeUnicode(unicodeMatches[u]));
- }
- }
- // add to map
- $.i18n.map[name] = value;
- }
-
- /** Mode: bundle keys as vars/functions */
- if(mode == 'vars' || mode == 'both') {
- value = value.replace( /"/g, '\\"' ); // escape quotation mark (")
-
- // make sure namespaced key exists (eg, 'some.key')
- checkKeyNamespace(name);
-
- // value with variable substitutions
- if(regPlaceHolder.test(value)) {
- var parts = value.split(regPlaceHolder);
- // process function args
- var first = true;
- var fnArgs = '';
- var usedArgs = [];
- for(var p=0; p<parts.length; p++) {
- if(regPlaceHolder.test(parts[p]) && (usedArgs.length == 0 || usedArgs.indexOf(parts[p]) == -1)) {
- if(!first) {fnArgs += ',';}
- fnArgs += parts[p].replace(regRepPlaceHolder, 'v$1');
- usedArgs.push(parts[p]);
- first = false;
- }
- }
- parsed += name + '=function(' + fnArgs + '){';
- // process function body
- var fnExpr = '"' + value.replace(regRepPlaceHolder, '"+v$1+"') + '"';
- parsed += 'return ' + fnExpr + ';' + '};';
-
- // simple value
- }else{
- parsed += name+'="'+value+'";';
- }
- } // END: Mode: bundle keys as vars/functions
- } // END: if(pair.length > 0)
- } // END: skip comments
- }
- eval(parsed);
-}
-
-/** Make sure namespace exists (for keys with dots in name) */
-// TODO key parts that start with numbers quietly fail. i.e. month.short.1=Jan
-function checkKeyNamespace(key) {
- var regDot = /\./;
- if(regDot.test(key)) {
- var fullname = '';
- var names = key.split( /\./ );
- for(var i=0; i<names.length; i++) {
- if(i>0) {fullname += '.';}
- fullname += names[i];
- if(eval('typeof '+fullname+' == "undefined"')) {
- eval(fullname + '={};');
- }
- }
- }
-}
-
-/** Make sure filename is an array */
-function getFiles(names) {
- return (names && names.constructor == Array) ? names : [names];
-}
-
-/** Ensure language code is in the format aa_AA. */
-function normaliseLanguageCode(lang) {
- lang = lang.toLowerCase();
- if(lang.length > 3) {
- lang = lang.substring(0, 3) + lang.substring(3).toUpperCase();
- }
- return lang;
-}
-
-/** Unescape unicode chars ('\u00e3') */
-function unescapeUnicode(str) {
- // unescape unicode codes
- var codes = [];
- var code = parseInt(str.substr(2), 16);
- if (code >= 0 && code < Math.pow(2, 16)) {
- codes.push(code);
- }
- // convert codes to text
- var unescaped = '';
- for (var i = 0; i < codes.length; ++i) {
- unescaped += String.fromCharCode(codes[i]);
- }
- return unescaped;
-}
-
-/* Cross-Browser Split 1.0.1
-(c) Steven Levithan <stevenlevithan.com>; MIT License
-An ECMA-compliant, uniform cross-browser split method */
-var cbSplit;
-// avoid running twice, which would break `cbSplit._nativeSplit`'s reference to the native `split`
-if (!cbSplit) {
- cbSplit = function(str, separator, limit) {
- // if `separator` is not a regex, use the native `split`
- if (Object.prototype.toString.call(separator) !== "[object RegExp]") {
- if(typeof cbSplit._nativeSplit == "undefined")
- return str.split(separator, limit);
- else
- return cbSplit._nativeSplit.call(str, separator, limit);
- }
-
- var output = [],
- lastLastIndex = 0,
- flags = (separator.ignoreCase ? "i" : "") +
- (separator.multiline ? "m" : "") +
- (separator.sticky ? "y" : ""),
- separator = RegExp(separator.source, flags + "g"), // make `global` and avoid `lastIndex` issues by working with a copy
- separator2, match, lastIndex, lastLength;
-
- str = str + ""; // type conversion
- if (!cbSplit._compliantExecNpcg) {
- separator2 = RegExp("^" + separator.source + "$(?!\\s)", flags); // doesn't need /g or /y, but they don't hurt
- }
-
- /* behavior for `limit`: if it's...
- - `undefined`: no limit.
- - `NaN` or zero: return an empty array.
- - a positive number: use `Math.floor(limit)`.
- - a negative number: no limit.
- - other: type-convert, then use the above rules. */
- if (limit === undefined || +limit < 0) {
- limit = Infinity;
- } else {
- limit = Math.floor(+limit);
- if (!limit) {
- return [];
- }
- }
-
- while (match = separator.exec(str)) {
- lastIndex = match.index + match[0].length; // `separator.lastIndex` is not reliable cross-browser
-
- if (lastIndex > lastLastIndex) {
- output.push(str.slice(lastLastIndex, match.index));
-
- // fix browsers whose `exec` methods don't consistently return `undefined` for nonparticipating capturing groups
- if (!cbSplit._compliantExecNpcg && match.length > 1) {
- match[0].replace(separator2, function () {
- for (var i = 1; i < arguments.length - 2; i++) {
- if (arguments[i] === undefined) {
- match[i] = undefined;
- }
- }
- });
- }
-
- if (match.length > 1 && match.index < str.length) {
- Array.prototype.push.apply(output, match.slice(1));
- }
-
- lastLength = match[0].length;
- lastLastIndex = lastIndex;
-
- if (output.length >= limit) {
- break;
- }
- }
-
- if (separator.lastIndex === match.index) {
- separator.lastIndex++; // avoid an infinite loop
- }
- }
-
- if (lastLastIndex === str.length) {
- if (lastLength || !separator.test("")) {
- output.push("");
- }
- } else {
- output.push(str.slice(lastLastIndex));
- }
-
- return output.length > limit ? output.slice(0, limit) : output;
- };
-
- cbSplit._compliantExecNpcg = /()??/.exec("")[1] === undefined; // NPCG: nonparticipating capturing group
- cbSplit._nativeSplit = String.prototype.split;
-
-} // end `if (!cbSplit)`
-String.prototype.split = function (separator, limit) {
- return cbSplit(this, separator, limit);
-};
-
-})(jQuery);
- \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsChart.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsChart.js
deleted file mode 100644
index 7c97387..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsChart.js
+++ /dev/null
@@ -1,420 +0,0 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-var metricsChart = {};
-
-
-metricsChart.memoryPieMetrics = function(data){
- var memoryPieChart = echarts.init(document.getElementById('memoryPieChartDiv'));
-
- var labelTop = {
- normal : {
- label : {
- show : true,
- position : 'center',
- formatter : '{b}',
- textStyle: {
- baseline : 'bottom'
- }
- },
- labelLine : {
- show : false
- }
- }
-};
-var labelFromatter = {
- normal : {
- label : {
- formatter : function (params){
- return (100 - params.value).toFixed(1) + '%'
- },
- textStyle: {
- baseline : 'top'
- }
- }
- },
-}
-var labelBottom = {
- normal : {
- color: '#ccc',
- label : {
- show : true,
- position : 'center'
- },
- labelLine : {
- show : false
- }
- },
- emphasis: {
- color: 'rgba(0,0,0,0)'
- }
-};
-var radius = [40, 55];
-option = {
- legend: {
- x : 'center',
- y:"bottom",
- data:[
- 'Code-Cache','Eden-Space','Perm-Gen','Survivor-Space','Tenured-Gen'
- ]
- },
- title : {
- text: $.i18n.prop('org_openo_msb_metrics_jvm_memory_radius'),
- subtext: '',
- x: 'center'
- },
- toolbox: {
- show : true,
- feature : {
-
- saveAsImage : {
- show : true,
- title : $.i18n.prop('org_openo_msb_metrics_chart_save_picture'),
- type : 'png',
- lang : [$.i18n.prop('org_openo_msb_metrics_chart_click_save')]
- }
- }
- },
- series : [
- {
- type : 'pie',
- center : ['10%', '55%'],
- radius : radius,
- x: '0%', // for funnel
- itemStyle : labelFromatter,
- data : [
- {name:'other', value:100-data.CodeCache, itemStyle : labelBottom},
- {name:'Code-Cache', value:data.CodeCache,itemStyle : labelTop}
- ]
- },
- {
- type : 'pie',
- center : ['30%', '55%'],
- radius : radius,
- x:'20%', // for funnel
- itemStyle : labelFromatter,
- data : [
- {name:'other', value:100-data.EdenSpace, itemStyle : labelBottom},
- {name:'Eden-Space', value:data.EdenSpace,itemStyle : labelTop}
- ]
- },
- {
- type : 'pie',
- center : ['50%', '55%'],
- radius : radius,
- x:'40%', // for funnel
- itemStyle : labelFromatter,
- data : [
- {name:'other', value:100-data.PermGen, itemStyle : labelBottom},
- {name:'Perm-Gen', value:data.PermGen,itemStyle : labelTop}
- ]
- },
- {
- type : 'pie',
- center : ['70%', '55%'],
- radius : radius,
- x:'60%', // for funnel
- itemStyle : labelFromatter,
- data : [
- {name:'other', value:100-data.SurvivorSpace, itemStyle : labelBottom},
- {name:'Survivor-Space', value:data.SurvivorSpace,itemStyle : labelTop}
- ]
- },
- {
- type : 'pie',
- center : ['90%', '55%'],
- radius : radius,
- x:'80%', // for funnel
- itemStyle : labelFromatter,
- data : [
- {name:'other', value:100-data.TenuredGen, itemStyle : labelBottom},
- {name:'Tenured-Gen', value:data.TenuredGen,itemStyle : labelTop}
- ]
- }
- ]
-};
-
-
- // load data for echarts objects
- memoryPieChart.setOption(option);
- window.onresize = memoryPieChart.resize;
-
-
-}
-
-
-metricsChart.memoryBarMetrics = function(data){
- var memoryBarChart = echarts.init(document.getElementById('memoryBarChartDiv'));
-var option = {
- title : {
- text: $.i18n.prop('org_openo_msb_metrics_jvm_memory_bar'),
- x:'center'
- },
- tooltip : {
- trigger: 'axis'
- },
- legend: {
- data:[
- $.i18n.prop('org_openo_msb_metrics_jvm_memory_bar_init'),$.i18n.prop('org_openo_msb_metrics_jvm_memory_bar_used'),$.i18n.prop('org_openo_msb_metrics_jvm_memory_bar_total')
- ],
- x:'left'
- },
- toolbox: {
- show : true,
- feature : {
-
- saveAsImage : {
- show : true,
- title : $.i18n.prop('org_openo_msb_metrics_chart_save_picture'),
- type : 'png',
- lang : [$.i18n.prop('org_openo_msb_metrics_chart_click_save')]
- }
- }
- },
- yAxis : [
- {
- type : 'category',
- data : [$.i18n.prop('org_openo_msb_metrics_jvm_memory_bar_heap'),$.i18n.prop('org_openo_msb_metrics_jvm_memory_bar_non-heap'),$.i18n.prop('org_openo_msb_metrics_jvm_memory_bar_total-heap')]
- }
-
- ],
- xAxis : [
- {
- type : 'value',
- axisLabel:{formatter:'{value} M'}
- }
- ],
- series : [
- {
- name:$.i18n.prop('org_openo_msb_metrics_jvm_memory_bar_init'),
- type:'bar',
- stack:'barGroup',
- itemStyle: {normal: {color:'rgba(92, 184, 92, 0.24)', label:{show:true}}},
- data:data.init
- },
-
- {
- name:$.i18n.prop('org_openo_msb_metrics_jvm_memory_bar_used'),
- type:'bar',
- stack:'barGroup',
- itemStyle: {normal: {color:'rgba(73, 163, 73, 0.56)', label:{show:true,formatter:function(p){return p.value > 0 ? (p.value +'\n'):'';}}}},
- data:data.used
- },
-
- {
- name:$.i18n.prop('org_openo_msb_metrics_jvm_memory_bar_total'),
- type:'bar',
- stack:'barGroup',
- itemStyle: {normal: {color:'#49A349', label:{show:true,formatter:function(p){return p.value > 0 ? (p.value +'\n'):'';}}}},
- data:data.max
- },
-
-
- ]
-};
-
-
-
-
- memoryBarChart.setOption(option);
- window.onresize = memoryBarChart.resize;
-
-}
-
-
-
-
-metricsChart.threadsMetrics = function(data){
-
- var threadsChart = echarts.init(document.getElementById('threadsChartDiv'));
-
-
- var option = {
- title : {
- text: $.i18n.prop('org_openo_msb_metrics_jvm_thread_chart'),
- subtext: '',
- x:'center'
- },
- tooltip : {
- trigger: 'item',
- formatter: "{b}{a}: <br/> {c} ({d}%)"
- },
- color:["#ff7f50","#6495ed","#da70d6","#32cd32"],
- legend: {
- orient : 'vertical',
- x : 'left',
- data:['Blocked','Waiting','Timed waiting','Runnable']
- },
- toolbox: {
- show : true,
- feature : {
-
- saveAsImage : {
- show : true,
- title : $.i18n.prop('org_openo_msb_metrics_chart_save_picture'),
- type : 'png',
- lang : [$.i18n.prop('org_openo_msb_metrics_chart_click_save')]
- }
- }
- },
- calculable : true,
- series : [
- {
- name:$.i18n.prop('org_openo_msb_metrics_thread'),
- type:'pie',
- radius : '55%',
- center: ['50%', '60%'],
- data:data
- }
- ]
-};
-
-
- threadsChart.setOption(option);
- window.onresize = threadsChart.resize;
-
-
-
-}
-
-
-metricsChart.restMetrics = function(data){
-
-
- var labelFromatter=function (value){
- if(value.length>12) return value.substring(0,12)+"\n"+value.substring(12);
- else return value;
- }
-
-
-var restChart = echarts.init(document.getElementById('restChartDiv'));
-var option = {
- title : {
- text: 'top10',
- subtext: ''
- },
- color:["#1790cf"],
- tooltip : {
- trigger: 'axis'
- },
- legend: {
- data:[$.i18n.prop('org_openo_msb_metrics_rest_bar_count')]
- },
- toolbox: {
- show : true,
- feature : {
-
- magicType: {show: true, title:$.i18n.prop('org_openo_msb_metrics_chart_line_change'),type: ['line', 'bar']},
- saveAsImage : {
- show : true,
- title : $.i18n.prop('org_openo_msb_metrics_chart_save_picture'),
- type : 'png',
- lang : [$.i18n.prop('org_openo_msb_metrics_chart_click_save')]
- }
- }
- },
- calculable : true,
- xAxis : [
- {
- type : 'value',
- boundaryGap : [0, 0.01]
- }
- ],
- yAxis : [
- {
- type : 'category',
- data : data.restName,
- axisLabel:{
- margin:4,
- clickable:true,
- formatter:labelFromatter
-
- }
- }
- ],
- series : [
- {
- name:$.i18n.prop('org_openo_msb_metrics_rest_bar_count'),
- type:'bar',
- data:data.restCount
- }
-
- ]
-};
-
- restChart.setOption(option);
- window.onresize = restChart.resize;
-}
-
-
-metricsChart.requestsMetrics = function(data){
-var requestsChart = echarts.init(document.getElementById('requestsChartDiv'));
-
-option = {
- title : {
- text: '',
- subtext: ''
- },
- tooltip : {
- trigger: 'axis'
- },
- legend: {
- data:[$.i18n.prop('org_openo_msb_metrics_rest_bar_count')]
- },
- toolbox: {
- show : true,
- feature : {
-
- magicType : {show: true,title:$.i18n.prop('org_openo_msb_metrics_chart_line_change'), type: ['line', 'bar']},
- saveAsImage : {
- show : true,
- title : $.i18n.prop('org_openo_msb_metrics_chart_save_picture'),
- type : 'png',
- lang : [$.i18n.prop('org_openo_msb_metrics_chart_click_save')]
- }
- }
- },
- calculable : true,
- yAxis : [
- {
- type : 'category',
- data : ['get','post','put','delete','other']
- }
- ],
- xAxis : [
- {
- type : 'value'
- }
- ],
- series : [
- {
- name:$.i18n.prop('org_openo_msb_metrics_rest_bar_count'),
- type:'bar',
- data:[data.get, data.post, data.put, data.delete, data.other]
- }
- ]
-};
-
-
- requestsChart.setOption(option);
- window.onresize = requestsChart.resize;
-}
-
-
-
-
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsController.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsController.js
deleted file mode 100644
index 6197f2d..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsController.js
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-var vm = avalon
- .define({
- $id : "metricsController",
- routeTargetTitle:$.i18n.prop("org_openo_msb_route_content_title"),
- $metricsUrl : '/admin/metrics',
- metricsLoading:false,
- metricsArray : [],
- threadNum:"",
- isErr:false,
- jvmTime:"",
- restArray:[],
-
- $dataTableLanguage: {
- "sProcessing": "<img src='../img/loading-spinner-grey.gif'/><span>&nbsp;&nbsp;Loadding...</span>",
- "sLengthMenu": $.i18n.prop("org_openo_msb_route-table-sLengthMenu"),
- "sZeroRecords": $.i18n.prop("org_openo_msb_route-table-sZeroRecords"),
- "sInfo": "<span class='seperator'> </span>" + $.i18n.prop("org_openo_msb_route-table-sInfo"),
- "sInfoEmpty": $.i18n.prop("org_openo_msb_route-table-sInfoEmpty"),
- "sGroupActions": $.i18n.prop("org_openo_msb_route-table-sGroupActions"),
- "sAjaxRequestGeneralError": $.i18n.prop("org_openo_msb_route-table-sAjaxRequestGeneralError"),
- "sEmptyTable": $.i18n.prop("org_openo_msb_route-table-sEmptyTable"),
- "oPaginate": {
- "sPrevious": $.i18n.prop("org_openo_msb_route-table-sPrevious"),
- "sNext": $.i18n.prop("org_openo_msb_route-table-sNext"),
- "sPage": $.i18n.prop("org_openo_msb_route-table-sPage"),
- "sPageOf": $.i18n.prop("org_openo_msb_route-table-sPageOf")
- },
- "sSearch": $.i18n.prop("org_openo_msb_route-table-search"),
- "sInfoFiltered": $.i18n.prop("org_openo_msb_route-table-infofilter")
- },
- initMetrics : function() {
-
-
- $.ajax({
- "type": 'get',
- "url": url,
- "dataType": "json",
- success: function (resp) {
- vm.isErr=false;
- var restJson = resp;
- // var restJson = metricsUtil.restJson;
-
- var testRestJson=restJson.timers;
- var gaugesJson=restJson.gauges;
-
- //jvm Time
- var jvmTime=gaugesJson["jvm.attribute.uptime"].value;
-
- vm.jvmTime=metricsUtil.formatSeconds(jvmTime);
-
-
- //Initialize the JVM memory usage
- var Eden_Space_usage;
- if(gaugesJson["jvm.memory.pools.Eden-Space.usage"]==null){
- if(gaugesJson["jvm.memory.pools.PS-Eden-Space.usage"]==null)
- {
- Eden_Space_usage=0;
- }
- else{
- Eden_Space_usage=gaugesJson["jvm.memory.pools.PS-Eden-Space.usage"].value;
- }
- }
- else{
- Eden_Space_usage=gaugesJson["jvm.memory.pools.Eden-Space.usage"].value;
- }
-
-
-
-
- var Perm_Gen_usage;
- if(gaugesJson["jvm.memory.pools.Perm-Gen.usage"]==null){
- if(gaugesJson["jvm.memory.pools.PS-Perm-Gen.usage"]==null)
- {
- Perm_Gen_usage=0;
- }
- else{
- Perm_Gen_usage=gaugesJson["jvm.memory.pools.PS-Perm-Gen.usage"].value;
- }
- }
- else{
- Perm_Gen_usage=gaugesJson["jvm.memory.pools.Perm-Gen.usage"].value;
- }
-
-
- var Survivor_Space_usage;
- if(gaugesJson["jvm.memory.pools.Survivor-Space.usage"]==null){
- if(gaugesJson["jvm.memory.pools.PS-Survivor-Space.usage"]==null)
- {
- Survivor_Space_usage=0;
- }
- else{
- Survivor_Space_usage=gaugesJson["jvm.memory.pools.PS-Survivor-Space.usage"].value;
- }
- }
- else{
- Survivor_Space_usage=gaugesJson["jvm.memory.pools.Survivor-Space.usage"].value;
- }
-
-
- var Tenured_Gen_usage;
- if(gaugesJson["jvm.memory.pools.Tenured-Gen.usage"]==null){
- if(gaugesJson["jvm.memory.pools.PS-Old-Gen.usage"]==null)
- {
- Tenured_Gen_usage=0;
- }
- else{
- Tenured_Gen_usage=gaugesJson["jvm.memory.pools.PS-Old-Gen.usage"].value;
- }
- }
- else{
- Tenured_Gen_usage=gaugesJson["jvm.memory.pools.Tenured-Gen.usage"].value;
- }
-
-
- var memoryPieMetrics_data={
- CodeCache:(gaugesJson["jvm.memory.pools.Code-Cache.usage"].value*100).toFixed(1),
- EdenSpace:(Eden_Space_usage*100).toFixed(1),
- PermGen:(Perm_Gen_usage*100).toFixed(1),
- SurvivorSpace:(Survivor_Space_usage*100).toFixed(1),
- TenuredGen:(Tenured_Gen_usage*100).toFixed(1)
- };
- metricsChart.memoryPieMetrics(memoryPieMetrics_data);
-
- // initialize the JVM memory map
- var heap_init=Math.round(gaugesJson["jvm.memory.heap.init"].value/1000000);
- var non_heap_init=Math.round(gaugesJson["jvm.memory.non-heap.init"].value/1000000);
-
- var heap_used=Math.round(gaugesJson["jvm.memory.heap.used"].value/1000000);
- var non_heap_used=Math.round(gaugesJson["jvm.memory.non-heap.used"].value/1000000);
-
- var heap_max=Math.round(gaugesJson["jvm.memory.heap.max"].value/1000000);
- var non_heap_max=Math.round(gaugesJson["jvm.memory.non-heap.max"].value/1000000);
-
- var memoryBarMetrics_data={
- init:[
- heap_init,
- non_heap_init,
- non_heap_init+heap_init
- ],
- used:[
- heap_used,
- non_heap_used,
- non_heap_used+heap_used
- ],
- max:[
- heap_max,
- non_heap_max,
- non_heap_max+heap_max
- ]
- };
- metricsChart.memoryBarMetrics(memoryBarMetrics_data);
-
- //Initializes the thread profile
- var threadsMetrics_data= [{value:gaugesJson["jvm.threads.runnable.count"].value, name:'Runnable'},
- {value:gaugesJson["jvm.threads.timed_waiting.count"].value, name:'Timed waiting'},
- {value:gaugesJson["jvm.threads.waiting.count"].value, name:'Waiting'},
- {value:gaugesJson["jvm.threads.blocked.count"].value, name:'Blocked'}];
- vm.threadNum=gaugesJson["jvm.threads.count"].value;
- metricsChart.threadsMetrics(threadsMetrics_data);
-
- //Initialize the Rest interface traffic map
- var restMetrics_data={restName:[],restCount:[]};
- $.each(testRestJson,function(name,value) {
- if(name=="io.dropwizard.jetty.MutableServletContextHandler.connect-requests") return false;
- var nameArray=name.split(".");
-
- restMetrics_data.restName.push(nameArray[nameArray.length-1]);
- restMetrics_data.restCount.push(value.count);
-
- });
-
-
- metricsChart.restMetrics(restMetrics_data);
-
-
- //Initialize the HTTP traffic
- var requestsMetrics_data={get:"",post:"",put:"",delete:"",other:""};
- requestsMetrics_data.get=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.get-requests"].count;
- requestsMetrics_data.post=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.post-requests"].count;
- requestsMetrics_data.put=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.put-requests"].count;
- requestsMetrics_data.delete=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.delete-requests"].count;
- requestsMetrics_data.other=testRestJson["io.dropwizard.jetty.MutableServletContextHandler.other-requests"].count;
- metricsChart.requestsMetrics(requestsMetrics_data);
-
- //Initialize the HTTP access list in detail
- $.each(testRestJson,function(name,value) {
- if(name.indexOf("org.eclipse.jetty.server.HttpConnectionFactory") == 0) return true;
- var obj=value;
- obj.name=name;
- vm.restArray.push(obj);
- });
-
- $('#restTable').DataTable({
- responsive: true,
- destroy: true,
- "oLanguage": vm.$dataTableLanguage
- });
-
- },
- error: function(XMLHttpRequest, textStatus, errorThrown) {
-
- vm.isErr=true;
- }
- });
-
- }
-
-
- });
-avalon.scan();
-vm.initMetrics();
-
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsUtil.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsUtil.js
deleted file mode 100644
index 29bc7be..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-metrics/js/metricsUtil.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-var metricsUtil = {};
-
-
-metricsUtil.methodShortName=function(methodName){
-
- var methodNameArray=methodName.split(".");
- return methodNameArray[methodNameArray.length-2]+"."+methodNameArray[methodNameArray.length-1];
-
-}
-
-metricsUtil.formatSeconds=function (value) {
- var theTime = parseInt(value/1000);
- var theTime1 = 0;
- var theTime2 = 0;
- if(theTime > 60) {
- theTime1 = parseInt(theTime/60);
- theTime = parseInt(theTime%60);
- if(theTime1 > 60) {
- theTime2 = parseInt(theTime1/60);
- theTime1 = parseInt(theTime1%60);
- }
- }
- var result = ""+parseInt(theTime)+ $.i18n.prop("org_openo_msb_metrics_second");
- if(theTime1 > 0) {
- result = ""+parseInt(theTime1)+$.i18n.prop("org_openo_msb_metrics_minute")+result;
- }
- if(theTime2 > 0) {
- result = ""+parseInt(theTime2)+$.i18n.prop("org_openo_msb_metrics_hour")+result;
- }
- return result;
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/css/animate.min.css b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/css/animate.min.css
deleted file mode 100644
index 88b94d5..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/css/animate.min.css
+++ /dev/null
@@ -1,6 +0,0 @@
-@charset "UTF-8";/*!
-Animate.css - http://daneden.me/animate
-Licensed under the MIT license - http://opensource.org/licenses/MIT
-
-Copyright (c) 2014 Daniel Eden
-*/.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}@-webkit-keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);-ms-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);-ms-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);-ms-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);-ms-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);-ms-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);-ms-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);-ms-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);-ms-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);-ms-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);-ms-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);-ms-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);-ms-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);-ms-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);-ms-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);-ms-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);-ms-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{0%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);-ms-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);-ms-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);-ms-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;-ms-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);-ms-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);-ms-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);-ms-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);-ms-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);-ms-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);-ms-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);-ms-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);-ms-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);-ms-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);-ms-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);-ms-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);-ms-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);-ms-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);-ms-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);-ms-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);-ms-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);-ms-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);-ms-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);-ms-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);-ms-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);-ms-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);-ms-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);-ms-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);-ms-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);-ms-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);-ms-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);-ms-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);-ms-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);-ms-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);-ms-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);-ms-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);-ms-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);-ms-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);-ms-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);-ms-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);-ms-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);-ms-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);-ms-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);-ms-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);-ms-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);-ms-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);-ms-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);-ms-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-ms-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-ms-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);-ms-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;-ms-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-ms-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-ms-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);-ms-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);-ms-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);-ms-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);-ms-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-ms-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-ms-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);-ms-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);-ms-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);-ms-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);-ms-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);-ms-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);-ms-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);-ms-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);-ms-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);-ms-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);-ms-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);-ms-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0,0,1,45deg);transform:rotate(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0,0,1,45deg);-ms-transform:rotate(0,0,1,45deg);transform:rotate(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);-ms-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);-ms-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);-ms-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);-ms-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);-ms-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);-ms-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);-ms-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);-ms-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-ms-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-ms-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);-ms-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;-ms-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);-ms-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;-ms-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp} \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/default.html b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/default.html
deleted file mode 100644
index 4f43cd4..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/default.html
+++ /dev/null
@@ -1,144 +0,0 @@
-<!--
-
- Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<!DOCTYPE html>
-<html>
-<head lang="en">
-<meta charset="UTF-8">
-<title id="org_openo_msb_route_title" name_i18n="org_openo_msb_route_ui_i18n"></title>
-<link
- href="js/fontAwesome/css/font-awesome.min.css"
- rel="stylesheet" />
-<link
- href="js/bootstrap/css/bootstrap.min.css"
- rel="stylesheet" />
- <link href="css/newRoute.css" rel="stylesheet" type="text/css" />
- <script type="text/javascript">
-
- function setIframeUrl(type){
- var url;
- switch(type){
- case 1:url="/iui/microservices/index.html";break;
- case 2:url="/iui/msdiscover/index.html";break;
- case 3:url="/iui/msdiscover/admin.html";break;
- }
-
- $('#msbPage').attr("src",url);
- }
- </script>
-
-</head>
-<body >
- <div class="header navbar mega-menu navbar-static-top">
- <div class="header-inner">
- <span class="navbar-brand zte-navbar-brand hidden-sm hidden-xs" >
- <img id="com_zte_ums_ict_framework_img_netnumenLogo" src="./img/logo.png" alt="logo" style="display: inline;">
-
- </span>
-
-
- </div>
- <div class="chineseTitle" id="org_openo_msb_route_chinese_name" name_i18n="org_openo_msb_route_ui_i18n"></div>
- <div class="englishTitle" id="org_openo_msb_route_english_name" name_i18n="org_openo_msb_route_ui_i18n">
- </div>
-</div>
-
-<div>
- <div class="page-sidebar" >
- <div class="sidebar-toggler hidden-xs hidden-sm" ></div>
- <div class="sideBar">
- <a onclick="setIframeUrl(1)" class="router-link-active"><div class="menu"><div class="menu-left"></div><i aria-hidden="true" class="icon fa fa-link"></i><br><label id="org_openo_msb_route_sideBar_serviceroute" name_i18n="org_openo_msb_route_ui_i18n"></label>
-
- </div>
-
- </a>
-
- <a onclick="setIframeUrl(2)" ><div class="menu"><div class="menu-left"></div><i aria-hidden="true" class="icon fa fa-search-plus"></i><br><label id="org_openo_msb_route_sideBar_servicediscover" name_i18n="org_openo_msb_route_ui_i18n"></label>
-
- </div>
-
- </a>
-
- <a onclick="setIframeUrl(3)" >
- <div class="menu">
- <div class="menu-left"></div>
- <i aria-hidden="true" class="icon fa fa-cogs"></i><br><label id="org_openo_msb_route_sideBar_servicemng" name_i18n="org_openo_msb_route_ui_i18n"></label>
-
- </div>
-
- </a>
- </div>
- </div>
-<div class="page-content" >
- <div class="page-content-body">
-
- <div id="pdiv_page-mainIframeisWare">
- <iframe src="/iui/microservices/index.html" width="100%" scrolling="no" marginheight="0" frameborder="0" id="msbPage" name="msbPage" class="page-mainIframeisWare" ></iframe>
- </div>
- </div>
- </div>
-</div>
-<script type="text/javascript" src="js/jquery/jquery-1.10.2.min.js"></script>
-<script type="text/javascript" src="js/iframeResizer/iframeResizer.min.js"></script>
-<script type="text/javascript" src="js/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>
-<script src="i18n/loadi18nApp_iui-route_view.js"></script>
-<script type="text/javascript">
-
-
-
-$(function(){
-
- loadPropertiesSideMenu('', 'msb-iui-route-i18n', 'i18n/');
-
- //Get window height
- var winHeight=610;
- if (window.innerHeight)
- winHeight = window.innerHeight;
- else if ((document.body) && (document.body.clientHeight))
- winHeight = document.body.clientHeight;
- //Through in-depth internal Document to test the body, for the window size
- if (document.documentElement && document.documentElement.clientHeight ) {
- winHeight = document.documentElement.clientHeight;
-
- }
- winHeight=winHeight-55;
-$('iframe').iFrameResize({minHeight:winHeight});
-
- $(".sideBar a").on({
- click: function(){
- $(".sideBar a").removeClass("router-link-active");
- $(this).addClass("router-link-active");
- }
- });
-
-$(".sidebar-toggler").click(function(){
- $("body").toggleClass("page-sidebar-closed");
-});
-
-
-
-});
-
-
-</script>
-
-
-</body>
-</html> \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties
deleted file mode 100644
index 89acc60..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-en-US.properties
+++ /dev/null
@@ -1,168 +0,0 @@
-#
-# Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
-
-org_openo_msb_route_title=Open-O micro-services
-
-org_openo_msb_route_sideBar_serviceroute=Service Route
-org_openo_msb_route_sideBar_servicediscover=Service Discover
-org_openo_msb_route_sideBar_servicemng=Service Manage
-
-org_openo_msb_route_chinese_name=
-org_openo_msb_route_english_name=MicroService Bus
-
-org_openo_msb_route_banner_title=MicroService Bus
-org_openo_msb_route_btn_export=Service Export
-org_openo_msb_route_tab_api=API Service
-org_openo_msb_route_tab_iui=IUI Service
-org_openo_msb_route_tab_custom=Custom Service
-org_openo_msb_route_tab_msb=MSB Service
-org_openo_msb_route_btn_add_api=Add API Service
-org_openo_msb_route_form_sourceservice=Source Service
-org_openo_msb_route_form_address=Host
-org_openo_msb_route_form_host_tip=Add Host(format--IP:Port)
-org_openo_msb_route_form_node_no=No
-org_openo_msb_route_form_node_control=operate
-org_openo_msb_route_form_url=URL
-org_openo_msb_route_form_target_tip=Published as
-org_openo_msb_route_form_target_service=Published URL
-org_openo_msb_route_form_servicename=Name
-org_openo_msb_route_form_version=Version
-org_openo_msb_route_form_version_tip=format:v(lowercase) + digital
-org_openo_msb_route_form_swagger=API Define
-org_openo_msb_route_form_swagger_address=API Address
-org_openo_msb_route_form_target_address= Target Address:
-org_openo_msb_route_form_publish_address=Published Address:
-org_openo_msb_route_form_metrics=Metrics Define
-org_openo_msb_route_form_metrics_address=Metrics Address
-org_openo_msb_route_form_btn_cancel=Cancel
-org_openo_msb_route_form_btn_save=Save
-org_openo_msb_route_form_btn_close=Close
-
-org_openo_msb_route_box_version=version:
-org_openo_msb_route_box_btn_disable=Disable
-org_openo_msb_route_box_btn_able=Enable
-org_openo_msb_route_box_btn_delete=Delete
-org_openo_msb_route_box_btn_update=Edit
-org_openo_msb_route_form_btn_addhost=Add Host
-org_openo_msb_route_form_btn_delhost=Delete Host
-org_openo_msb_route_box_btn_view=View
-
-org_openo_msb_route_btn_add_iui=Add IUI Service
-org_openo_msb_route_form_iui_tip=Target service registration at the same time corresponding Api service can be accessed through this address
-org_openo_msb_route_btn_add_custom=Add Custom Service
-org_openo_msb_route_btn_add_msb=Add MSB Service
-org_openo_msb_route_form_protocol=Protocol
-org_openo_msb_route_form_visualrange=VisualRange
-org_openo_msb_route_form_intersystem=OutSystem
-org_openo_msb_route_form_insystem=InSystem
-org_openo_msb_route_form_msb_host=Host
-org_openo_msb_route_form_ttl_tip=Add TTL
-
-org_openo_msb_route_servicecontent_swagger=Rest Interface
-org_openo_msb_route_servicecontent_metrics=Metrics
-
-org_openo_msb_route_msb_info=Basic Information
-org_openo_msb_route_msb_hostlist=Host List
-
-org_openo_msb_route_content_title=Service Detail
-org_openo_msb_route_swagger_type_predefined=predeFined
-org_openo_msb_route_swagger_type_custominput=customInput
-
-
-//table
-org_openo_msb_route-table-sLengthMenu=View _MENU_ records
-org_openo_msb_route-table-sZeroRecords=No matching records found
-org_openo_msb_route-table-sInfo=Found total _TOTAL_ records
-org_openo_msb_route-table-sInfoEmpty=No records found to show
-org_openo_msb_route-table-sGroupActions=_TOTAL_ records selected:
-org_openo_msb_route-table-sAjaxRequestGeneralError=Could not complete request. Please check your internet connection.
-org_openo_msb_route-table-sEmptyTable=No data available in table
-org_openo_msb_route-table-sPrevious=Prev
-org_openo_msb_route-table-sNext=Next
-org_openo_msb_route-table-sPage=Page
-org_openo_msb_route-table-sPageOf=of
-org_openo_msb_route-table-search=Search:
-org_openo_msb_route-table-infofilter=(Filter from _MAX_ Records)
-
-org_openo_msb_route_err_host_empty=The new Host cannot be empty
-org_openo_msb_route_err_ttl_empty=The new TTL cannot be empty
-org_openo_msb_route_err_host_format=Wrong Host format (format IP: port)
-org_openo_msb_route_err_ttl_format=TTL can only for Numbers
-org_openo_msb_route_err_host_repeat=The services (Host: {0}) has been in existence
-org_openo_msb_route_err_host_del=Are you sure to delete [Host: {0}:{1}]?
-
-org_openo_msb_route_title_add_msb=Add MSB Service
-org_openo_msb_route_title_edit_msb=Edit MSB Service
-org_openo_msb_route_title_view_msb=View MSB Service
-org_openo_msb_route_title_add_iui=Add IUI Service
-org_openo_msb_route_title_edit_iui=Edit IUI Service
-org_openo_msb_route_title_view_iui=View IUI Service
-org_openo_msb_route_title_add_api=Add API Service
-org_openo_msb_route_title_edit_api=Edit API Service
-org_openo_msb_route_title_view_api=View API Service
-org_openo_msb_route_title_add_custom=Add Custom Service
-org_openo_msb_route_title_edit_custom=Edit Custom Service
-org_openo_msb_route_title_view_custom=View Custom Service
-org_openo_msb_route_err_service_repeat=Service(Name:{0}) has been published
-org_openo_msb_route_err_api_repeat=Service(Name:{0}-Version:{1}) has been published
-org_openo_msb_route_err_service_del_ask=Sure to delete[Name:{0} - Version:{1}]Service?
-org_openo_msb_route_err_service2_del_ask=Sure to delete[Name:{0}]Service?
-org_openo_msb_route_err_service_save=Service save failed:
-org_openo_msb_route_service_save= - Save success
-org_openo_msb_route_service_update= - Edit success
-org_openo_msb_route_err_host_leastone=Please enter at least one HOST address
-org_openo_msb_route_err_visualrange_empty= Please select the service visibleRange
-org_openo_msb_route_status_enable=Enable service success
-org_openo_msb_route_status_disable=Disable service success
-org_openo_msb_route_err_status=Service status update failed:
-
-org_openo_msb_route_service_del_success= - Delete success
-org_openo_msb_route_service_del_fail=Service delete failed:
-
-org_openo_msb_route_metric_content_title=Metrics Detail
-org_openo_msb_route_iui_content_title=IUI Service Detail
-
-//Input efficacy suggested
-org_openo_msb_route_validator_ip_format=Please fill in the correct IP
-org_openo_msb_route_validator_url_head_format=url address Begin with /, cannot end with /
-org_openo_msb_route_validator_url_head_only_format=url address Begin with/
-org_openo_msb_route_validator_url_format=The service URL format:ip:port/url
-org_openo_msb_route_validator_url_line_format=Name cannot contain /
-org_openo_msb_route_validator_content_format=Special symbols and Chinese name can not be filled in
-org_openo_msb_route_validator_name_empty=Please enter the service name
-org_openo_msb_route_validator_url_empty=Please enter the URL address
-org_openo_msb_route_validator_server_empty=Please enter the Host address
-org_openo_msb_route_validator_protocol_empty=Please select a service protocol
-org_openo_msb_route_validator_type_empty=Please select a service type
-org_openo_msb_route_validator_digits=Please enter an integer
-org_openo_msb_route_validator_min=Not a negative
-
-
-org_openo_msb_route_property_ttl=Tip:
-org_openo_msb_route_property_root=Root Service
-org_openo_msb_route_property_other_group=other
-org_openo_msb_route_property_normal=normal
-org_openo_msb_route_property_disable=disable
-org_openo_msb_route_property_unknown=unknown
-
-
-
-
-
-
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties
deleted file mode 100644
index 391ac12..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/i18n/msb-iui-route-i18n-zh-CN.properties
+++ /dev/null
@@ -1,163 +0,0 @@
-#
-# Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
-
-org_openo_msb_route_title=å¾®æœåŠ¡
-
-org_openo_msb_route_sideBar_serviceroute=æœåŠ¡è·¯ç”±
-org_openo_msb_route_sideBar_servicediscover=æœåŠ¡å‘现
-org_openo_msb_route_sideBar_servicemng=æœåŠ¡ç®¡ç†
-
-
-org_openo_msb_route_chinese_name=å¾®æœåŠ¡
-org_openo_msb_route_english_name=MicroService Bus
-
-org_openo_msb_route_banner_title= —— å¾®æœåŠ¡
-org_openo_msb_route_btn_export=æœåŠ¡å¯¼å‡º
-org_openo_msb_route_tab_api=APIæœåŠ¡
-org_openo_msb_route_tab_iui=IUIæœåŠ¡
-org_openo_msb_route_tab_custom=自定义æœåŠ¡
-org_openo_msb_route_tab_msb=MSBæœåŠ¡
-org_openo_msb_route_btn_add_api=添加APIæœåŠ¡
-org_openo_msb_route_form_sourceservice=æºæœåŠ¡
-org_openo_msb_route_form_address=æœåŠ¡å™¨åœ°å€
-org_openo_msb_route_form_host_tip=添加host地å€(æ ¼å¼ IP:Port)
-org_openo_msb_route_form_node_no=åºå·
-org_openo_msb_route_form_node_control=æ“作
-org_openo_msb_route_form_url=URL地å€
-org_openo_msb_route_form_target_tip=å‘布为
-org_openo_msb_route_form_target_service=å‘布æœåŠ¡
-org_openo_msb_route_form_servicename=æœåŠ¡å
-org_openo_msb_route_form_version=版本å·
-org_openo_msb_route_form_version_tip=æ ¼å¼ï¼šv(å°å†™)+æ•°å­—
-org_openo_msb_route_form_swagger=API定义
-org_openo_msb_route_form_swagger_address=API地å€
-org_openo_msb_route_form_target_address=目标地å€ï¼š
-org_openo_msb_route_form_publish_address=å‘布地å€ï¼š
-org_openo_msb_route_form_metrics=性能指标定义
-org_openo_msb_route_form_metrics_address=性能指标地å€
-org_openo_msb_route_form_btn_cancel=å–消
-org_openo_msb_route_form_btn_save=ä¿å­˜
-org_openo_msb_route_form_btn_close=关闭
-
-org_openo_msb_route_box_version=版本:
-org_openo_msb_route_box_btn_disable=ç¦ç”¨
-org_openo_msb_route_box_btn_able=å¯ç”¨
-org_openo_msb_route_box_btn_delete=删除
-org_openo_msb_route_box_btn_update=修改
-org_openo_msb_route_form_btn_addhost=添加Host
-org_openo_msb_route_form_btn_delhost=删除Host
-org_openo_msb_route_box_btn_view=查看
-
-org_openo_msb_route_btn_add_iui=添加IUIæœåŠ¡
-org_openo_msb_route_form_iui_tip=目标æœåŠ¡åŒæ—¶æ³¨å†Œå¯¹åº”ApiæœåŠ¡æ‰èƒ½é€šè¿‡æ­¤åœ°å€è®¿é—®
-org_openo_msb_route_btn_add_custom=添加自定义æœåŠ¡
-org_openo_msb_route_btn_add_msb=添加MSBæœåŠ¡
-org_openo_msb_route_form_protocol=æœåŠ¡åè®®
-org_openo_msb_route_form_visualrange=æœåŠ¡å¯è§èŒƒå›´
-org_openo_msb_route_form_intersystem=系统间
-org_openo_msb_route_form_insystem=系统内
-org_openo_msb_route_form_msb_host=æœåŠ¡HOST
-org_openo_msb_route_form_ttl_tip=添加TTL数字
-
-org_openo_msb_route_servicecontent_swagger=接å£
-org_openo_msb_route_servicecontent_metrics=性能
-
-org_openo_msb_route_msb_info=基本信æ¯
-org_openo_msb_route_msb_hostlist=æœåŠ¡å®žä¾‹åˆ—表
-
-org_openo_msb_route_content_title=å¾®æœåŠ¡è¯¦æƒ…
-org_openo_msb_route_swagger_type_predefined=预定义选择
-org_openo_msb_route_swagger_type_custominput=自定义输入
-
-
-//表格相关
-org_openo_msb_route-table-sLengthMenu=æ¯é¡µ _MENU_ æ¡ç»“æžœ
-org_openo_msb_route-table-sZeroRecords=没有匹é…结果
-org_openo_msb_route-table-sInfo=总共找到 _TOTAL_ æ¡ç»“æžœ
-org_openo_msb_route-table-sInfoEmpty=共 0 项
-org_openo_msb_route-table-sGroupActions=_TOTAL_ æ¡ç»“果被选择:
-org_openo_msb_route-table-sAjaxRequestGeneralError=ä¸èƒ½å®Œæˆè¯·æ±‚,请检查您的网络连接情况。
-org_openo_msb_route-table-sEmptyTable=表中数æ®ä¸ºç©º
-org_openo_msb_route-table-sPrevious=å‰é¡µ
-org_openo_msb_route-table-sNext=下页
-org_openo_msb_route-table-sPage=第
-org_openo_msb_route-table-sPageOf=页,总页数:
-org_openo_msb_route-table-search=æœç´¢ï¼š
-org_openo_msb_route-table-infofilter=(从 _MAX_ æ¡è®°å½•è¿‡æ»¤)
-
-org_openo_msb_route_err_host_empty=新增HOSTä¸èƒ½ä¸ºç©º
-org_openo_msb_route_err_ttl_empty=新增HOSTçš„TTLä¸èƒ½ä¸ºç©º
-org_openo_msb_route_err_host_format=HOSTæ ¼å¼æœ‰è¯¯(æ ¼å¼ ip:port)
-org_openo_msb_route_err_ttl_format=TTLåªèƒ½ä¸ºæ•°å­—
-org_openo_msb_route_err_host_repeat=æœåŠ¡(HOST:{0})已存在
-org_openo_msb_route_err_host_del=确定删除[HOST:{0}:{1}]?
-
-org_openo_msb_route_title_add_msb=添加MSBæœåŠ¡å®žä¾‹
-org_openo_msb_route_title_edit_msb=修改MSBæœåŠ¡å®žä¾‹
-org_openo_msb_route_title_view_msb=查看MSBæœåŠ¡å®žä¾‹
-org_openo_msb_route_title_add_iui=添加IUIæœåŠ¡å®žä¾‹
-org_openo_msb_route_title_edit_iui=修改IUIæœåŠ¡å®žä¾‹
-org_openo_msb_route_title_view_iui=查看IUIæœåŠ¡å®žä¾‹
-org_openo_msb_route_title_add_api=添加APIæœåŠ¡å®žä¾‹
-org_openo_msb_route_title_edit_api=修改APIæœåŠ¡å®žä¾‹
-org_openo_msb_route_title_view_api=查看APIæœåŠ¡å®žä¾‹
-org_openo_msb_route_title_add_custom=添加自定义æœåŠ¡å®žä¾‹
-org_openo_msb_route_title_edit_custom=修改自定义æœåŠ¡å®žä¾‹
-org_openo_msb_route_title_view_custom=查看自定义æœåŠ¡å®žä¾‹
-org_openo_msb_route_err_service_repeat=æœåŠ¡(æœåŠ¡å:{0})å·²å‘布
-org_openo_msb_route_err_api_repeat=æœåŠ¡(æœåŠ¡å:{0}-版本å·ï¼š{1})å·²å‘布
-org_openo_msb_route_err_service_del_ask=确定删除[æœåŠ¡å:{0} - 版本å·ï¼š{1}]æœåŠ¡?
-org_openo_msb_route_err_service2_del_ask=确定删除[æœåŠ¡å:{0}]æœåŠ¡?
-org_openo_msb_route_err_service_save=æœåŠ¡ä¿å­˜å¤±è´¥ï¼š
-org_openo_msb_route_service_save=ä¿å­˜æˆåŠŸ
-org_openo_msb_route_service_update=修改æˆåŠŸ
-org_openo_msb_route_err_host_leastone=请至少输入一个HOST地å€
-org_openo_msb_route_err_visualrange_empty=请选择æœåŠ¡å¯è§èŒƒå›´
-org_openo_msb_route_status_enable=激活æˆåŠŸ
-org_openo_msb_route_status_disable=ç¦ç”¨æˆåŠŸ
-org_openo_msb_route_err_status=æœåŠ¡çŠ¶æ€æ“作失败:
-
-org_openo_msb_route_service_del_success=删除æˆåŠŸ
-org_openo_msb_route_service_del_fail=æœåŠ¡åˆ é™¤å¤±è´¥:
-
-org_openo_msb_route_metric_content_title=性能详情
-org_openo_msb_route_iui_content_title=IUIæœåŠ¡è¯¦æƒ…
-
-//输入效验æ示
-org_openo_msb_route_validator_ip_format=请填写正确的IP地å€
-org_openo_msb_route_validator_url_head_format=url地å€ä»¥/开头,ä¸èƒ½ä»¥/结尾
-org_openo_msb_route_validator_url_head_only_format=url地å€ä»¥/开头
-org_openo_msb_route_validator_url_format=æœåŠ¡åœ°å€æ ¼å¼ï¼šip:port/url
-org_openo_msb_route_validator_url_line_format=å称ä¸èƒ½åŒ…å«/
-org_openo_msb_route_validator_content_format=å称ä¸èƒ½è¾“入特殊符å·å’Œä¸­æ–‡
-org_openo_msb_route_validator_name_empty=请输入æœåŠ¡å
-org_openo_msb_route_validator_url_empty=请输入URL地å€
-org_openo_msb_route_validator_server_empty=请输入æœåŠ¡å™¨åœ°å€
-org_openo_msb_route_validator_protocol_empty=请选择æœåŠ¡åè®®
-org_openo_msb_route_validator_type_empty=请选择æœåŠ¡ç±»åž‹
-org_openo_msb_route_validator_digits=请输入整数
-org_openo_msb_route_validator_min=ä¸èƒ½ä¸ºè´Ÿæ•°
-
-
-org_openo_msb_route_property_ttl=æ示:
-org_openo_msb_route_property_root=æ ¹æœåŠ¡
-org_openo_msb_route_property_other_group=其他
-org_openo_msb_route_property_normal=正常
-org_openo_msb_route_property_disable=åœç”¨
-org_openo_msb_route_property_unknown=未知 \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/conductor-logo.png b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/conductor-logo.png
deleted file mode 100644
index d4476b2..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/conductor-logo.png
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/loading-spinner-grey.gif b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/loading-spinner-grey.gif
deleted file mode 100644
index 6d614d3..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/loading-spinner-grey.gif
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/logo.png b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/logo.png
deleted file mode 100644
index d4476b2..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/logo.png
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/netnumenLogo.png b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/netnumenLogo.png
deleted file mode 100644
index 289a8f7..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/netnumenLogo.png
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/openo_logo_16.png b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/openo_logo_16.png
deleted file mode 100644
index dd70bbc..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/openo_logo_16.png
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/throbber.gif b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/throbber.gif
deleted file mode 100644
index 0639388..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/img/throbber.gif
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js
deleted file mode 100644
index 5eae6ca..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/avalon.js
+++ /dev/null
@@ -1,5820 +0,0 @@
-
-/*==================================================
- Copyright (c) 2013-2015 å¸å¾’正美 and other contributors
- http://www.cnblogs.com/rubylouvre/
- https://github.com/RubyLouvre
- http://weibo.com/jslouvre/
-
- Released under the MIT license
- avalon.js 1.45 built in 2015.7.17
- support IE6+ and other browsers
- ==================================================*/
-(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 avalon.
- // 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 avalon = require("avalon")(window);
- module.exports = global.document ? factory(global, true) : function(w) {
- if (!w.document) {
- throw new Error("Avalon 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){
-
-/*********************************************************************
- * 全局å˜é‡åŠæ–¹æ³• *
- **********************************************************************/
-var expose = new Date() - 0
-//http://stackoverflow.com/questions/7290086/javascript-use-strict-and-nicks-find-global-function
-var DOC = window.document
-var head = DOC.getElementsByTagName("head")[0] //HEAD元素
-var ifGroup = head.insertBefore(document.createElement("avalon"), head.firstChild) //é¿å…IE6 base标签BUG
-ifGroup.innerHTML = "X<style id='avalonStyle'>.avalonHide{ display: none!important }</style>"
-ifGroup.setAttribute("ms-skip", "1")
-ifGroup.className = "avalonHide"
-var rnative = /\[native code\]/ //判定是å¦åŽŸç”Ÿå‡½æ•°
-function log() {
- if (window.console && avalon.config.debug) {
- // http://stackoverflow.com/questions/8785624/how-to-safely-wrap-console-log
- Function.apply.call(console.log, console, arguments)
- }
-}
-
-
-var subscribers = "$" + expose
-var otherRequire = window.require
-var otherDefine = window.define
-var innerRequire
-var stopRepeatAssign = false
-var rword = /[^, ]+/g //切割字符串为一个个å°å—,以空格或豆å·åˆ†å¼€å®ƒä»¬ï¼Œç»“åˆreplace实现字符串的forEach
-var rcomplexType = /^(?:object|array)$/
-var rsvg = /^\[object SVG\w*Element\]$/
-var rwindow = /^\[object (?:Window|DOMWindow|global)\]$/
-var oproto = Object.prototype
-var ohasOwn = oproto.hasOwnProperty
-var serialize = oproto.toString
-var ap = Array.prototype
-var aslice = ap.slice
-var Registry = {} //将函数æ›å…‰åˆ°æ­¤å¯¹è±¡ä¸Šï¼Œæ–¹ä¾¿è®¿é—®å™¨æ”¶é›†ä¾èµ–
-var W3C = window.dispatchEvent
-var root = DOC.documentElement
-var avalonFragment = DOC.createDocumentFragment()
-var cinerator = DOC.createElement("div")
-var class2type = {}
-"Boolean Number String Function Array Date RegExp Object Error".replace(rword, function (name) {
- class2type["[object " + name + "]"] = name.toLowerCase()
-})
-
-
-function noop() {
-}
-
-
-function oneObject(array, val) {
- if (typeof array === "string") {
- array = array.match(rword) || []
- }
- var result = {},
- value = val !== void 0 ? val : 1
- for (var i = 0, n = array.length; i < n; i++) {
- result[array[i]] = value
- }
- return result
-}
-
-//生æˆUUID http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript
-var generateID = function (prefix) {
- prefix = prefix || "avalon"
- return String(Math.random() + Math.random()).replace(/\d\.\d{4}/, prefix)
-}
-function IE() {
- if (window.VBArray) {
- var mode = document.documentMode
- return mode ? mode : window.XMLHttpRequest ? 7 : 6
- } else {
- return NaN
- }
-}
-var IEVersion = IE()
-
-avalon = function (el) { //创建jQueryå¼çš„æ— new 实例化结构
- return new avalon.init(el)
-}
-
-avalon.profile = function () {
- if (window.console && avalon.config.profile) {
- Function.apply.call(console.log, console, arguments)
- }
-}
-
-/*视æµè§ˆå™¨æƒ…况采用最快的异步回调*/
-avalon.nextTick = new function () {// jshint ignore:line
- var tickImmediate = window.setImmediate
- var tickObserver = window.MutationObserver
- var tickPost = W3C && window.postMessage
- if (tickImmediate) {
- return tickImmediate.bind(window)
- }
-
- var queue = []
- function callback() {
- var n = queue.length
- for (var i = 0; i < n; i++) {
- queue[i]()
- }
- queue = queue.slice(n)
- }
-
- if (tickObserver) {
- var node = document.createTextNode("avalon")
- new tickObserver(callback).observe(node, {characterData: true})// jshint ignore:line
- return function (fn) {
- queue.push(fn)
- node.data = Math.random()
- }
- }
-
- if (tickPost) {
- window.addEventListener("message", function (e) {
- var source = e.source
- if ((source === window || source === null) && e.data === "process-tick") {
- e.stopPropagation()
- callback()
- }
- })
-
- return function (fn) {
- queue.push(fn)
- window.postMessage('process-tick', '*')
- }
- }
-
- return function (fn) {
- setTimeout(fn, 0)
- }
-}// jshint ignore:line
-/*********************************************************************
- * avalonçš„é™æ€æ–¹æ³•å®šä¹‰åŒº *
- **********************************************************************/
-avalon.init = function (el) {
- this[0] = this.element = el
-}
-avalon.fn = avalon.prototype = avalon.init.prototype
-
-avalon.type = function (obj) { //å–得目标的类型
- if (obj == null) {
- return String(obj)
- }
- // 早期的webkit内核æµè§ˆå™¨å®žçŽ°äº†å·²åºŸå¼ƒçš„ecma262v4标准,å¯ä»¥å°†æ­£åˆ™å­—é¢é‡å½“作函数使用,因此typeof在判定正则时会返回function
- return typeof obj === "object" || typeof obj === "function" ?
- class2type[serialize.call(obj)] || "object" :
- typeof obj
-}
-
-var isFunction = typeof alert === "object" ? function (fn) {
- try {
- return /^\s*\bfunction\b/.test(fn + "")
- } catch (e) {
- return false
- }
-} : function (fn) {
- return serialize.call(fn) === "[object Function]"
-}
-avalon.isFunction = isFunction
-
-avalon.isWindow = function (obj) {
- if (!obj)
- return false
- // 利用IE678 window == document为true,document == window竟然为false的神奇特性
- // 标准æµè§ˆå™¨åŠIE9,IE10等使用 正则检测
- return obj == obj.document && obj.document != obj //jshint ignore:line
-}
-
-function isWindow(obj) {
- return rwindow.test(serialize.call(obj))
-}
-if (isWindow(window)) {
- avalon.isWindow = isWindow
-}
-var enu
-for (enu in avalon({})) {
- break
-}
-var enumerateBUG = enu !== "0" //IE6下为true, 其他为false
-/*判定是å¦æ˜¯ä¸€ä¸ªæœ´ç´ çš„javascript对象(Object),ä¸æ˜¯DOM对象,ä¸æ˜¯BOM对象,ä¸æ˜¯è‡ªå®šä¹‰ç±»çš„实例*/
-avalon.isPlainObject = function (obj, key) {
- if (!obj || avalon.type(obj) !== "object" || obj.nodeType || avalon.isWindow(obj)) {
- return false;
- }
- try { //IE内置对象没有constructor
- if (obj.constructor && !ohasOwn.call(obj, "constructor") && !ohasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
- return false;
- }
- } catch (e) { //IE8 9会在这里抛错
- return false;
- }
- if (enumerateBUG) {
- for (key in obj) {
- return ohasOwn.call(obj, key)
- }
- }
- for (key in obj) {
- }
- return key === void 0 || ohasOwn.call(obj, key)
-}
-if (rnative.test(Object.getPrototypeOf)) {
- avalon.isPlainObject = function (obj) {
- // 简å•çš„ typeof obj === "object"检测,会致使用isPlainObject(window)在opera下通ä¸è¿‡
- return serialize.call(obj) === "[object Object]" && Object.getPrototypeOf(obj) === oproto
- }
-}
-//与jQuery.extend方法,å¯ç”¨äºŽæµ…æ‹·è´ï¼Œæ·±æ‹·è´
-avalon.mix = avalon.fn.mix = function () {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false
-
- // 如果第一个å‚数为布尔,判定是å¦æ·±æ‹·è´
- if (typeof target === "boolean") {
- deep = target
- target = arguments[1] || {}
- i++
- }
-
- //ç¡®ä¿æŽ¥å—方为一个å¤æ‚çš„æ•°æ®ç±»åž‹
- if (typeof target !== "object" && !isFunction(target)) {
- target = {}
- }
-
- //如果åªæœ‰ä¸€ä¸ªå‚数,那么新æˆå‘˜æ·»åŠ äºŽmix所在的对象上
- if (i === length) {
- target = this
- i--
- }
-
- for (; i < length; i++) {
- //åªå¤„ç†éžç©ºå‚æ•°
- if ((options = arguments[i]) != null) {
- for (name in options) {
- src = target[name]
- try {
- copy = options[name] //当options为VBS对象时报错
- } catch (e) {
- continue
- }
-
- // 防止环引用
- if (target === copy) {
- continue
- }
- if (deep && copy && (avalon.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {
-
- if (copyIsArray) {
- copyIsArray = false
- clone = src && Array.isArray(src) ? src : []
-
- } else {
- clone = src && avalon.isPlainObject(src) ? src : {}
- }
-
- target[name] = avalon.mix(deep, clone, copy)
- } else if (copy !== void 0) {
- target[name] = copy
- }
- }
- }
- }
- return target
-}
-
-function _number(a, len) { //用于模拟slice, splice的效果
- a = Math.floor(a) || 0
- return a < 0 ? Math.max(len + a, 0) : Math.min(a, len);
-}
-avalon.mix({
- rword: rword,
- subscribers: subscribers,
- version: 1.45,
- ui: {},
- log: log,
- slice: W3C ? function (nodes, start, end) {
- return aslice.call(nodes, start, end)
- } : function (nodes, start, end) {
- var ret = []
- var len = nodes.length
- if (end === void 0)
- end = len
- if (typeof end === "number" && isFinite(end)) {
- start = _number(start, len)
- end = _number(end, len)
- for (var i = start; i < end; ++i) {
- ret[i - start] = nodes[i]
- }
- }
- return ret
- },
- noop: noop,
- /*如果ä¸ç”¨Error对象å°è£…一下,str在控制å°ä¸‹å¯èƒ½ä¼šä¹±ç */
- error: function (str, e) {
- throw (e || Error)(str)
- },
- /*将一个以空格或逗å·éš”开的字符串或数组,转æ¢æˆä¸€ä¸ªé”®å€¼éƒ½ä¸º1的对象*/
- oneObject: oneObject,
- /* avalon.range(10)
- => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- avalon.range(1, 11)
- => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- avalon.range(0, 30, 5)
- => [0, 5, 10, 15, 20, 25]
- avalon.range(0, -10, -1)
- => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
- avalon.range(0)
- => []*/
- range: function (start, end, step) { // 用于生æˆæ•´æ•°æ•°ç»„
- step || (step = 1)
- if (end == null) {
- end = start || 0
- start = 0
- }
- var index = -1,
- length = Math.max(0, Math.ceil((end - start) / step)),
- result = new Array(length)
- while (++index < length) {
- result[index] = start
- start += step
- }
- return result
- },
- eventHooks: [],
- /*绑定事件*/
- bind: function(el, type, fn, phase) {
- var hooks = avalon.eventHooks
- var hook = hooks[type]
- if (typeof hook === "object") {
- type = hook.type
- if (hook.deel) {
- fn = hook.deel(el, type, fn, phase)
- }
- }
- var callback = W3C ? fn : function(e) {
- fn.call(el, fixEvent(e));
- }
- if (W3C) {
- el.addEventListener(type, callback, !!phase)
- } else {
- el.attachEvent("on" + type, callback)
- }
- return callback
- },
- /*å¸è½½äº‹ä»¶*/
- unbind: function(el, type, fn, phase) {
- var hooks = avalon.eventHooks
- var hook = hooks[type]
- var callback = fn || noop
- if (typeof hook === "object") {
- type = hook.type
- if (hook.deel) {
- fn = hook.deel(el, type, fn, false)
- }
- }
- if (W3C) {
- el.removeEventListener(type, callback, !!phase)
- } else {
- el.detachEvent("on" + type, callback)
- }
- },
- /*读写删除元素节点的样å¼*/
- css: function (node, name, value) {
- if (node instanceof avalon) {
- node = node[0]
- }
- var prop = /[_-]/.test(name) ? camelize(name) : name, fn
- name = avalon.cssName(prop) || prop
- if (value === void 0 || typeof value === "boolean") { //获å–æ ·å¼
- fn = cssHooks[prop + ":get"] || cssHooks["@:get"]
- if (name === "background") {
- name = "backgroundColor"
- }
- var val = fn(node, name)
- return value === true ? parseFloat(val) || 0 : val
- } else if (value === "") { //请除样å¼
- node.style[name] = ""
- } else { //设置样å¼
- if (value == null || value !== value) {
- return
- }
- if (isFinite(value) && !avalon.cssNumber[prop]) {
- value += "px"
- }
- fn = cssHooks[prop + ":set"] || cssHooks["@:set"]
- fn(node, name, value)
- }
- },
- /*é历数组与对象,回调的第一个å‚数为索引或键å,第二个或元素或键值*/
- each: function (obj, fn) {
- if (obj) { //排除null, undefined
- var i = 0
- if (isArrayLike(obj)) {
- for (var n = obj.length; i < n; i++) {
- if (fn(i, obj[i]) === false)
- break
- }
- } else {
- for (i in obj) {
- if (obj.hasOwnProperty(i) && fn(i, obj[i]) === false) {
- break
- }
- }
- }
- }
- },
- //收集元素的data-{{prefix}}-*属性,并转æ¢ä¸ºå¯¹è±¡
- getWidgetData: function (elem, prefix) {
- var raw = avalon(elem).data()
- var result = {}
- for (var i in raw) {
- if (i.indexOf(prefix) === 0) {
- result[i.replace(prefix, "").replace(/\w/, function (a) {
- return a.toLowerCase()
- })] = raw[i]
- }
- }
- return result
- },
- Array: {
- /*åªæœ‰å½“å‰æ•°ç»„ä¸å­˜åœ¨æ­¤å…ƒç´ æ—¶åªæ·»åŠ å®ƒ*/
- ensure: function (target, item) {
- if (target.indexOf(item) === -1) {
- return target.push(item)
- }
- },
- /*移除数组中指定ä½ç½®çš„元素,返回布尔表示æˆåŠŸä¸Žå¦*/
- removeAt: function (target, index) {
- return !!target.splice(index, 1).length
- },
- /*移除数组中第一个匹é…ä¼ å‚的那个元素,返回布尔表示æˆåŠŸä¸Žå¦*/
- remove: function (target, item) {
- var index = target.indexOf(item)
- if (~index)
- return avalon.Array.removeAt(target, index)
- return false
- }
- }
-})
-
-var bindingHandlers = avalon.bindingHandlers = {}
-var bindingExecutors = avalon.bindingExecutors = {}
-
-/*判定是å¦ç±»æ•°ç»„,如节点集åˆï¼Œçº¯æ•°ç»„,arguments与拥有éžè´Ÿæ•´æ•°çš„length属性的纯JS对象*/
-function isArrayLike(obj) {
- if (!obj)
- return false
- var n = obj.length
- if (n === (n >>> 0)) { //检测length属性是å¦ä¸ºéžè´Ÿæ•´æ•°
- var type = serialize.call(obj).slice(8, -1)
- if (/(?:regexp|string|function|window|global)$/i.test(type))
- return false
- if (type === "Array")
- return true
- try {
- if ({}.propertyIsEnumerable.call(obj, "length") === false) { //如果是原生对象
- return /^\s?function/.test(obj.item || obj.callee)
- }
- return true
- } catch (e) { //IE的NodeList直接抛错
- return !obj.window //IE6-8 window
- }
- }
- return false
-}
-
-
-// https://github.com/rsms/js-lru
-var Cache = new function() {// jshint ignore:line
- function LRU(maxLength) {
- this.size = 0
- this.limit = maxLength
- this.head = this.tail = void 0
- this._keymap = {}
- }
-
- var p = LRU.prototype
-
- p.put = function(key, value) {
- var entry = {
- key: key,
- value: value
- }
- this._keymap[key] = entry
- if (this.tail) {
- this.tail.newer = entry
- entry.older = this.tail
- } else {
- this.head = entry
- }
- this.tail = entry
- if (this.size === this.limit) {
- this.shift()
- } else {
- this.size++
- }
- return value
- }
-
- p.shift = function() {
- var entry = this.head
- if (entry) {
- this.head = this.head.newer
- this.head.older =
- entry.newer =
- entry.older =
- this._keymap[entry.key] = void 0
- }
- }
- p.get = function(key) {
- var entry = this._keymap[key]
- if (entry === void 0)
- return
- if (entry === this.tail) {
- return entry.value
- }
- // HEAD--------------TAIL
- // <.older .newer>
- // <--- add direction --
- // A B C <D> E
- if (entry.newer) {
- if (entry === this.head) {
- this.head = entry.newer
- }
- entry.newer.older = entry.older // C <-- E.
- }
- if (entry.older) {
- entry.older.newer = entry.newer // C. --> E
- }
- entry.newer = void 0 // D --x
- entry.older = this.tail // D. --> E
- if (this.tail) {
- this.tail.newer = entry // E. <-- D
- }
- this.tail = entry
- return entry.value
- }
- return LRU
-}// jshint ignore:line
-
-/*********************************************************************
- * javascript åº•å±‚è¡¥ä¸ *
- **********************************************************************/
-if (!"å¸å¾’正美".trim) {
- var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g
- String.prototype.trim = function () {
- return this.replace(rtrim, "")
- }
-}
-var hasDontEnumBug = !({
- 'toString': null
-}).propertyIsEnumerable('toString'),
- hasProtoEnumBug = (function () {
- }).propertyIsEnumerable('prototype'),
- dontEnums = [
- "toString",
- "toLocaleString",
- "valueOf",
- "hasOwnProperty",
- "isPrototypeOf",
- "propertyIsEnumerable",
- "constructor"
- ],
- dontEnumsLength = dontEnums.length;
-if (!Object.keys) {
- Object.keys = function (object) { //ecma262v5 15.2.3.14
- var theKeys = []
- var skipProto = hasProtoEnumBug && typeof object === "function"
- if (typeof object === "string" || (object && object.callee)) {
- for (var i = 0; i < object.length; ++i) {
- theKeys.push(String(i))
- }
- } else {
- for (var name in object) {
- if (!(skipProto && name === "prototype") && ohasOwn.call(object, name)) {
- theKeys.push(String(name))
- }
- }
- }
-
- if (hasDontEnumBug) {
- var ctor = object.constructor,
- skipConstructor = ctor && ctor.prototype === object
- for (var j = 0; j < dontEnumsLength; j++) {
- var dontEnum = dontEnums[j]
- if (!(skipConstructor && dontEnum === "constructor") && ohasOwn.call(object, dontEnum)) {
- theKeys.push(dontEnum)
- }
- }
- }
- return theKeys
- }
-}
-if (!Array.isArray) {
- Array.isArray = function (a) {
- return serialize.call(a) === "[object Array]"
- }
-}
-
-if (!noop.bind) {
- Function.prototype.bind = function (scope) {
- if (arguments.length < 2 && scope === void 0)
- return this
- var fn = this,
- argv = arguments
- return function () {
- var args = [],
- i
- for (i = 1; i < argv.length; i++)
- args.push(argv[i])
- for (i = 0; i < arguments.length; i++)
- args.push(arguments[i])
- return fn.apply(scope, args)
- }
- }
-}
-
-function iterator(vars, body, ret) {
- var fun = 'for(var ' + vars + 'i=0,n = this.length; i < n; i++){' + body.replace('_', '((i in this) && fn.call(scope,this[i],i,this))') + '}' + ret
- /* jshint ignore:start */
- return Function("fn,scope", fun)
- /* jshint ignore:end */
-}
-if (!rnative.test([].map)) {
- avalon.mix(ap, {
- //定ä½æ“作,返回数组中第一个等于给定å‚数的元素的索引值。
- indexOf: function (item, index) {
- var n = this.length,
- i = ~~index
- if (i < 0)
- i += n
- for (; i < n; i++)
- if (this[i] === item)
- return i
- return -1
- },
- //定ä½æ“作,åŒä¸Šï¼Œä¸è¿‡æ˜¯ä»ŽåŽé历。
- lastIndexOf: function (item, index) {
- var n = this.length,
- i = index == null ? n - 1 : index
- if (i < 0)
- i = Math.max(0, n + i)
- for (; i >= 0; i--)
- if (this[i] === item)
- return i
- return -1
- },
- //迭代æ“作,将数组的元素挨个儿传入一个函数中执行。Prototype.js的对应å字为each。
- forEach: iterator("", '_', ""),
- //迭代类 在数组中的æ¯ä¸ªé¡¹ä¸Šè¿è¡Œä¸€ä¸ªå‡½æ•°ï¼Œå¦‚果此函数的值为真,则此元素作为新数组的元素收集起æ¥ï¼Œå¹¶è¿”回新数组
- filter: iterator('r=[],j=0,', 'if(_)r[j++]=this[i]', 'return r'),
- //收集æ“作,将数组的元素挨个儿传入一个函数中执行,然åŽæŠŠå®ƒä»¬çš„返回值组æˆä¸€ä¸ªæ–°æ•°ç»„返回。Prototype.js的对应å字为collect。
- map: iterator('r=[],', 'r[i]=_', 'return r'),
- //åªè¦æ•°ç»„中有一个元素满足æ¡ä»¶ï¼ˆæ”¾è¿›ç»™å®šå‡½æ•°è¿”回true),那么它就返回true。Prototype.js的对应å字为any。
- some: iterator("", 'if(_)return true', 'return false'),
- //åªæœ‰æ•°ç»„中的元素都满足æ¡ä»¶ï¼ˆæ”¾è¿›ç»™å®šå‡½æ•°è¿”回true),它æ‰è¿”回true。Prototype.js的对应å字为all。
- every: iterator("", 'if(!_)return false', 'return true')
- })
-}
-/*********************************************************************
- * DOM åº•å±‚è¡¥ä¸ *
- **********************************************************************/
-
-function fixContains(root, el) {
- try { //IE6-8,游离于DOM树外的文本节点,访问parentNode有时会抛错
- while ((el = el.parentNode))
- if (el === root)
- return true
- return false
- } catch (e) {
- return false
- }
-}
-avalon.contains = fixContains
-//IE6-11的文档对象没有contains
-if (!DOC.contains) {
- DOC.contains = function (b) {
- return fixContains(DOC, b)
- }
-}
-
-function outerHTML() {
- return new XMLSerializer().serializeToString(this)
-}
-
-if (window.SVGElement) {
- //safari5+是把contains方法放在Element.prototype上而ä¸æ˜¯Node.prototype
- if (!DOC.createTextNode("x").contains) {
- Node.prototype.contains = function (arg) {//IE6-8没有Node对象
- return !!(this.compareDocumentPosition(arg) & 16)
- }
- }
- var svgns = "http://www.w3.org/2000/svg"
- var svg = DOC.createElementNS(svgns, "svg")
- svg.innerHTML = '<circle cx="50" cy="50" r="40" fill="red" />'
- if (!rsvg.test(svg.firstChild)) { // #409
- function enumerateNode(node, targetNode) {// jshint ignore:line
- if (node && node.childNodes) {
- var nodes = node.childNodes
- for (var i = 0, el; el = nodes[i++]; ) {
- if (el.tagName) {
- var svg = DOC.createElementNS(svgns,
- el.tagName.toLowerCase())
- ap.forEach.call(el.attributes, function (attr) {
- svg.setAttribute(attr.name, attr.value) //å¤åˆ¶å±žæ€§
- })// jshint ignore:line
- // 递归处ç†å­èŠ‚点
- enumerateNode(el, svg)
- targetNode.appendChild(svg)
- }
- }
- }
- }
- Object.defineProperties(SVGElement.prototype, {
- "outerHTML": {//IE9-11,firefoxä¸æ”¯æŒSVG元素的innerHTML,outerHTML属性
- enumerable: true,
- configurable: true,
- get: outerHTML,
- set: function (html) {
- var tagName = this.tagName.toLowerCase(),
- par = this.parentNode,
- frag = avalon.parseHTML(html)
- // æ“作的svg,直接æ’å…¥
- if (tagName === "svg") {
- par.insertBefore(frag, this)
- // svg节点的å­èŠ‚点类似
- } else {
- var newFrag = DOC.createDocumentFragment()
- enumerateNode(frag, newFrag)
- par.insertBefore(newFrag, this)
- }
- par.removeChild(this)
- }
- },
- "innerHTML": {
- enumerable: true,
- configurable: true,
- get: function () {
- var s = this.outerHTML
- var ropen = new RegExp("<" + this.nodeName + '\\b(?:(["\'])[^"]*?(\\1)|[^>])*>', "i")
- var rclose = new RegExp("<\/" + this.nodeName + ">$", "i")
- return s.replace(ropen, "").replace(rclose, "")
- },
- set: function (html) {
- if (avalon.clearHTML) {
- avalon.clearHTML(this)
- var frag = avalon.parseHTML(html)
- enumerateNode(frag, this)
- }
- }
- }
- })
- }
-}
-if (!root.outerHTML && window.HTMLElement) { //firefox 到11æ—¶æ‰æœ‰outerHTML
- HTMLElement.prototype.__defineGetter__("outerHTML", outerHTML);
-}
-
-
-//============================= event binding =======================
-var rmouseEvent = /^(?:mouse|contextmenu|drag)|click/
-function fixEvent(event) {
- var ret = {}
- for (var i in event) {
- ret[i] = event[i]
- }
- var target = ret.target = event.srcElement
- if (event.type.indexOf("key") === 0) {
- ret.which = event.charCode != null ? event.charCode : event.keyCode
- } else if (rmouseEvent.test(event.type)) {
- var doc = target.ownerDocument || DOC
- var box = doc.compatMode === "BackCompat" ? doc.body : doc.documentElement
- ret.pageX = event.clientX + (box.scrollLeft >> 0) - (box.clientLeft >> 0)
- ret.pageY = event.clientY + (box.scrollTop >> 0) - (box.clientTop >> 0)
- ret.wheelDeltaY = ret.wheelDelta
- ret.wheelDeltaX = 0
- }
- ret.timeStamp = new Date() - 0
- ret.originalEvent = event
- ret.preventDefault = function () { //阻止默认行为
- event.returnValue = false
- }
- ret.stopPropagation = function () { //阻止事件在DOM树中的传播
- event.cancelBubble = true
- }
- return ret
-}
-
-var eventHooks = avalon.eventHooks
-//针对firefox, chrome修正mouseenter, mouseleave
-if (!("onmouseenter" in root)) {
- avalon.each({
- mouseenter: "mouseover",
- mouseleave: "mouseout"
- }, function (origType, fixType) {
- eventHooks[origType] = {
- type: fixType,
- deel: function (elem, _, fn) {
- return function (e) {
- var t = e.relatedTarget
- if (!t || (t !== elem && !(elem.compareDocumentPosition(t) & 16))) {
- delete e.type
- e.type = origType
- return fn.call(elem, e)
- }
- }
- }
- }
- })
-}
-//针对IE9+, w3c修正animationend
-avalon.each({
- AnimationEvent: "animationend",
- WebKitAnimationEvent: "webkitAnimationEnd"
-}, function (construct, fixType) {
- if (window[construct] && !eventHooks.animationend) {
- eventHooks.animationend = {
- type: fixType
- }
- }
-})
-//针对IE6-8修正input
-if (!("oninput" in DOC.createElement("input"))) {
- eventHooks.input = {
- type: "propertychange",
- deel: function (elem, _, fn) {
- return function (e) {
- if (e.propertyName === "value") {
- e.type = "input"
- return fn.call(elem, e)
- }
- }
- }
- }
-}
-if (DOC.onmousewheel === void 0) {
- /* IE6-11 chrome mousewheel wheelDetla 下 -120 上 120
- firefox DOMMouseScroll detail 下3 上-3
- firefox wheel detlaY 下3 上-3
- IE9-11 wheel deltaY 下40 上-40
- chrome wheel deltaY 下100 上-100 */
- var fixWheelType = DOC.onwheel !== void 0 ? "wheel" : "DOMMouseScroll"
- var fixWheelDelta = fixWheelType === "wheel" ? "deltaY" : "detail"
- eventHooks.mousewheel = {
- type: fixWheelType,
- deel: function (elem, _, fn) {
- return function (e) {
- e.wheelDeltaY = e.wheelDelta = e[fixWheelDelta] > 0 ? -120 : 120
- e.wheelDeltaX = 0
- if (Object.defineProperty) {
- Object.defineProperty(e, "type", {
- value: "mousewheel"
- })
- }
- fn.call(elem, e)
- }
- }
- }
-}
-
-
-
-/*********************************************************************
- * é…置系统 *
- **********************************************************************/
-
-function kernel(settings) {
- for (var p in settings) {
- if (!ohasOwn.call(settings, p))
- continue
- var val = settings[p]
- if (typeof kernel.plugins[p] === "function") {
- kernel.plugins[p](val)
- } else if (typeof kernel[p] === "object") {
- avalon.mix(kernel[p], val)
- } else {
- kernel[p] = val
- }
- }
- return this
-}
-var openTag, closeTag, rexpr, rexprg, rbind, rregexp = /[-.*+?^${}()|[\]\/\\]/g
-
-function escapeRegExp(target) {
- //http://stevenlevithan.com/regex/xregexp/
- //将字符串安全格å¼åŒ–为正则表达å¼çš„æºç 
- return (target + "").replace(rregexp, "\\$&")
-}
-
-var plugins = {
- loader: function (builtin) {
- var flag = innerRequire && builtin
- window.require = flag ? innerRequire : otherRequire
- window.define = flag ? innerRequire.define : otherDefine
- },
- interpolate: function (array) {
- openTag = array[0]
- closeTag = array[1]
- if (openTag === closeTag) {
- throw new SyntaxError("openTag!==closeTag")
- var test = openTag + "test" + closeTag
- cinerator.innerHTML = test
- if (cinerator.innerHTML !== test && cinerator.innerHTML.indexOf("&lt;") > -1) {
- throw new SyntaxError("此定界符ä¸åˆæ³•")
- }
- cinerator.innerHTML = ""
- }
- var o = escapeRegExp(openTag),
- c = escapeRegExp(closeTag)
- rexpr = new RegExp(o + "(.*?)" + c)
- rexprg = new RegExp(o + "(.*?)" + c, "g")
- rbind = new RegExp(o + ".*?" + c + "|\\sms-")
- }
-}
-
-kernel.debug = true
-kernel.plugins = plugins
-kernel.plugins['interpolate'](["{{", "}}"])
-kernel.paths = {}
-kernel.shim = {}
-kernel.maxRepeatSize = 100
-avalon.config = kernel
-var ravalon = /(\w+)\[(avalonctrl)="(\S+)"\]/
-var findNodes = DOC.querySelectorAll ? function(str) {
- return DOC.querySelectorAll(str)
-} : function(str) {
- var match = str.match(ravalon)
- var all = DOC.getElementsByTagName(match[1])
- var nodes = []
- for (var i = 0, el; el = all[i++]; ) {
- if (el.getAttribute(match[2]) === match[3]) {
- nodes.push(el)
- }
- }
- return nodes
-}
-/*********************************************************************
- * 事件总线 *
- **********************************************************************/
-var EventBus = {
- $watch: function (type, callback) {
- if (typeof callback === "function") {
- var callbacks = this.$events[type]
- if (callbacks) {
- callbacks.push(callback)
- } else {
- this.$events[type] = [callback]
- }
- } else { //é‡æ–°å¼€å§‹ç›‘å¬æ­¤VM的第一é‡ç®€å•å±žæ€§çš„å˜åŠ¨
- this.$events = this.$watch.backup
- }
- return this
- },
- $unwatch: function (type, callback) {
- var n = arguments.length
- if (n === 0) { //让此VM的所有$watch回调无效化
- this.$watch.backup = this.$events
- this.$events = {}
- } else if (n === 1) {
- this.$events[type] = []
- } else {
- var callbacks = this.$events[type] || []
- var i = callbacks.length
- while (~--i < 0) {
- if (callbacks[i] === callback) {
- return callbacks.splice(i, 1)
- }
- }
- }
- return this
- },
- $fire: function (type) {
- var special, i, v, callback
- if (/^(\w+)!(\S+)$/.test(type)) {
- special = RegExp.$1
- type = RegExp.$2
- }
- var events = this.$events
- if (!events)
- return
- var args = aslice.call(arguments, 1)
- var detail = [type].concat(args)
- if (special === "all") {
- for (i in avalon.vmodels) {
- v = avalon.vmodels[i]
- if (v !== this) {
- v.$fire.apply(v, detail)
- }
- }
- } else if (special === "up" || special === "down") {
- var elements = events.expr ? findNodes(events.expr) : []
- if (elements.length === 0)
- return
- for (i in avalon.vmodels) {
- v = avalon.vmodels[i]
- if (v !== this) {
- if (v.$events.expr) {
- var eventNodes = findNodes(v.$events.expr)
- if (eventNodes.length === 0) {
- continue
- }
- //循环两个vmodel中的节点,查找匹é…(å‘上匹é…或者å‘下匹é…)的节点并设置标识
- /* jshint ignore:start */
- ap.forEach.call(eventNodes, function (node) {
- ap.forEach.call(elements, function (element) {
- var ok = special === "down" ? element.contains(node) : //å‘下æ•èŽ·
- node.contains(element) //å‘上冒泡
- if (ok) {
- node._avalon = v //符åˆæ¡ä»¶çš„加一个标识
- }
- });
- })
- /* jshint ignore:end */
- }
- }
- }
- var nodes = DOC.getElementsByTagName("*") //实现节点排åº
- var alls = []
- ap.forEach.call(nodes, function (el) {
- if (el._avalon) {
- alls.push(el._avalon)
- el._avalon = ""
- el.removeAttribute("_avalon")
- }
- })
- if (special === "up") {
- alls.reverse()
- }
- for (i = 0; callback = alls[i++]; ) {
- if (callback.$fire.apply(callback, detail) === false) {
- break
- }
- }
- } else {
- var callbacks = events[type] || []
- var all = events.$all || []
- for (i = 0; callback = callbacks[i++]; ) {
- if (isFunction(callback))
- callback.apply(this, args)
- }
- for (i = 0; callback = all[i++]; ) {
- if (isFunction(callback))
- callback.apply(this, arguments)
- }
- }
- }
-}
-
-/*********************************************************************
- * modelFactory *
- **********************************************************************/
-//avalon最核心的方法的两个方法之一(å¦ä¸€ä¸ªæ˜¯avalon.scan),返回一个ViewModel(VM)
-var VMODELS = avalon.vmodels = {} //所有vmodel都储存在这里
-avalon.define = function (id, factory) {
- var $id = id.$id || id
- if (!$id) {
- log("warning: vm必须指定$id")
- }
- if (VMODELS[$id]) {
- log("warning: " + $id + " å·²ç»å­˜åœ¨äºŽavalon.vmodels中")
- }
- if (typeof id === "object") {
- var model = modelFactory(id)
- } else {
- var scope = {
- $watch: noop
- }
- factory(scope) //得到所有定义
-
- model = modelFactory(scope) //å·å¤©æ¢æ—¥ï¼Œå°†scopeæ¢ä¸ºmodel
- stopRepeatAssign = true
- factory(model)
- stopRepeatAssign = false
- }
- model.$id = $id
- return VMODELS[$id] = model
-}
-
-//一些ä¸éœ€è¦è¢«ç›‘å¬çš„属性
-var $$skipArray = String("$id,$watch,$unwatch,$fire,$events,$model,$skipArray,$proxy,$reinitialize,$propertyNames").match(rword)
-var defineProperty = Object.defineProperty
-var canHideOwn = true
-//如果æµè§ˆå™¨ä¸æ”¯æŒecma262v5çš„Object.defineProperties或者存在BUG,比如IE8
-//标准æµè§ˆå™¨ä½¿ç”¨__defineGetter__, __defineSetter__实现
-try {
- defineProperty({}, "_", {
- value: "x"
- })
- var defineProperties = Object.defineProperties
-} catch (e) {
- canHideOwn = false
-}
-
-function modelFactory(source, $special, $model) {
- if (Array.isArray(source)) {
- var arr = source.concat()
- source.length = 0
- var collection = arrayFactory(source)
- collection.pushArray(arr)
- return collection
- }
- //0 null undefined || Node || VModel(fix IE6-8 createWithProxy $val: val引å‘çš„BUG)
- if (!source || source.nodeType > 0 || (source.$id && source.$events)) {
- return source
- }
- var $skipArray = Array.isArray(source.$skipArray) ? source.$skipArray : []
- $skipArray.$special = $special || {} //强制è¦ç›‘å¬çš„属性
- var $vmodel = {} //è¦è¿”回的对象, 它在IE6-8下å¯èƒ½è¢«å·é¾™è½¬å‡¤
- $model = $model || {} //vmodels.$model属性
- var $events = {} //vmodel.$events属性
- var accessors = {} //监控属性
- var computed = []
- $$skipArray.forEach(function (name) {
- delete source[name]
- })
- var names = Object.keys(source)
- /* jshint ignore:start */
- names.forEach(function (name, accessor) {
- var val = source[name]
- $model[name] = val
- if (isObservable(name, val, $skipArray)) {
- //总共产生三ç§accessor
- $events[name] = []
- var valueType = avalon.type(val)
- //总共产生三ç§accessor
- if (valueType === "object" && isFunction(val.get) && Object.keys(val).length <= 2) {
- accessor = makeComputedAccessor(name, val)
- computed.push(accessor)
- } else if (rcomplexType.test(valueType)) {
- accessor = makeComplexAccessor(name, val, valueType, $events[name])
- } else {
- accessor = makeSimpleAccessor(name, val)
- }
- accessors[name] = accessor
- }
- })
- /* jshint ignore:end */
-
- $vmodel = defineProperties($vmodel, descriptorFactory(accessors), source) //生æˆä¸€ä¸ªç©ºçš„ViewModel
- for (var i = 0; i < names.length; i++) {
- var name = names[i]
- if (!accessors[name]) {
- $vmodel[name] = source[name]
- }
- }
- //添加$id, $model, $events, $watch, $unwatch, $fire
- $vmodel.$propertyNames = names.join("&shy;")
- $vmodel.$id = generateID()
- $vmodel.$model = $model
- $vmodel.$events = $events
- for (i in EventBus) {
- var fn = EventBus[i]
- if (!W3C) { //在IE6-8下,VB对象的方法里的this并ä¸æŒ‡å‘自身,需è¦ç”¨bind处ç†ä¸€ä¸‹
- fn = fn.bind($vmodel)
- }
- $vmodel[i] = fn
- }
- if (canHideOwn) {
- Object.defineProperty($vmodel, "hasOwnProperty", hasOwnDescriptor)
- } else {
- /* jshint ignore:start */
- $vmodel.hasOwnProperty = function (name) {
- return name in $vmodel.$model
- }
- /* jshint ignore:end */
- }
-
- $vmodel.$reinitialize = function () {
- computed.forEach(function (accessor) {
- delete accessor._value
- delete accessor.oldArgs
- accessor.digest = function () {
- accessor.call($vmodel)
- }
- dependencyDetection.begin({
- callback: function (vm, dependency) {//dependency为一个accessor
- var name = dependency._name
- if (dependency !== accessor) {
- var list = vm.$events[name]
- injectDependency(list, accessor.digest)
- }
- }
- })
- try {
- accessor.get.call($vmodel)
- } finally {
- dependencyDetection.end()
- }
- })
- }
- $vmodel.$reinitialize()
- return $vmodel
-}
-
-var hasOwnDescriptor = {
- value: function (name) {
- return name in this.$model
- },
- writable: false,
- enumerable: false,
- configurable: true
-}
-//创建一个简å•è®¿é—®å™¨
-function makeSimpleAccessor(name, value) {
- function accessor(value) {
- var oldValue = accessor._value
- if (arguments.length > 0) {
- if (!stopRepeatAssign && !isEqual(value, oldValue)) {
- accessor.updateValue(this, value)
- accessor.notify(this, value, oldValue)
- }
- return this
- } else {
- dependencyDetection.collectDependency(this, accessor)
- return oldValue
- }
- }
- accessorFactory(accessor, name)
- accessor._value = value
- return accessor;
-}
-
-//创建一个计算访问器
-function makeComputedAccessor(name, options) {
- function accessor(value) {//计算属性
- var oldValue = accessor._value
- var init = ("_value" in accessor)
- if (arguments.length > 0) {
- if (stopRepeatAssign) {
- return this
- }
- if (typeof accessor.set === "function") {
- if (accessor.oldArgs !== value) {
- accessor.oldArgs = value
- var $events = this.$events
- var lock = $events[name]
- $events[name] = [] //清空回调,防止内部冒泡而触å‘多次$fire
- accessor.set.call(this, value)
- $events[name] = lock
- value = accessor.get.call(this)
- if (value !== oldValue) {
- accessor.updateValue(this, value)
- accessor.notify(this, value, oldValue) //触å‘$watch回调
- }
- }
- }
- return this
- } else {
- //å°†ä¾èµ–于自己的高层访问器或视图刷新函数(以绑定对象形å¼ï¼‰æ”¾åˆ°è‡ªå·±çš„订阅数组中
- //将自己注入到低层访问器的订阅数组中
- value = accessor.get.call(this)
- accessor.updateValue(this, value)
- if (init && oldValue !== value) {
- accessor.notify(this, value, oldValue) //触å‘$watch回调
- }
- return value
- }
- }
- accessor.set = options.set
- accessor.get = options.get
- accessorFactory(accessor, name)
- return accessor
-}
-
-//创建一个å¤æ‚访问器
-function makeComplexAccessor(name, initValue, valueType, list) {
- function accessor(value) {
- var oldValue = accessor._value
-
- var son = accessor._vmodel
- if (arguments.length > 0) {
- if (stopRepeatAssign) {
- return this
- }
- if (valueType === "array") {
- var a = son, b = value,
- an = a.length,
- bn = b.length
- a.$lock = true
- if (an > bn) {
- a.splice(bn, an - bn)
- } else if (bn > an) {
- a.push.apply(a, b.slice(an))
- }
- var n = Math.min(an, bn)
- for (var i = 0; i < n; i++) {
- a.set(i, b[i])
- }
- delete a.$lock
- a._fire("set")
- } else if (valueType === "object") {
- var newPropertyNames = Object.keys(value).join("&shy;")
- if (son.$propertyNames === newPropertyNames) {
- for (i in value) {
- son[i] = value[i]
- }
- } else {
- var sson = accessor._vmodel = modelFactory(value)
- var sevent = sson.$events
- var oevent = son.$events
- for (var i in sevent) {
- var arr = sevent[i]
- if (Array.isArray(arr)) {
- arr = arr.concat(oevent[i])
- }
- }
- sevent[subscribers] = oevent[subscribers]
- sson.$proxy = son.$proxy
- son = sson
- }
- }
- accessor.updateValue(this, son.$model)
- accessor.notify(this, this._value, oldValue)
- return this
- } else {
- dependencyDetection.collectDependency(this, accessor)
- return son
- }
- }
- accessorFactory(accessor, name)
- var son = accessor._vmodel = modelFactory(initValue)
- son.$events[subscribers] = list
- return accessor
-}
-
-function globalUpdateValue(vmodel, value) {
- vmodel.$model[this._name] = this._value = value
-}
-
-function globalNotify(vmodel, value, oldValue) {
- var name = this._name
- var array = vmodel.$events[name] //刷新值
- if (array) {
- fireDependencies(array) //åŒæ­¥è§†å›¾
- EventBus.$fire.call(vmodel, name, value, oldValue) //触å‘$watch回调
- }
-}
-
-function accessorFactory(accessor, name) {
- accessor._name = name
- //åŒæ—¶æ›´æ–°_value与model
- accessor.updateValue = globalUpdateValue
- accessor.notify = globalNotify
-}
-
-//比较两个值是å¦ç›¸ç­‰
-var isEqual = Object.is || function (v1, v2) {
- if (v1 === 0 && v2 === 0) {
- return 1 / v1 === 1 / v2
- } else if (v1 !== v1) {
- return v2 !== v2
- } else {
- return v1 === v2
- }
-}
-
-function isObservable(name, value, $skipArray) {
- if (isFunction(value) || value && value.nodeType) {
- return false
- }
- if ($skipArray.indexOf(name) !== -1) {
- return false
- }
- var $special = $skipArray.$special
- if (name && name.charAt(0) === "$" && !$special[name]) {
- return false
- }
- return true
-}
-
-var descriptorFactory = W3C ? function (obj) {
- var descriptors = {}
- for (var i in obj) {
- descriptors[i] = {
- get: obj[i],
- set: obj[i],
- enumerable: true,
- configurable: true
- }
- }
- return descriptors
-} : function (a) {
- return a
-}
-
-//===================ä¿®å¤æµè§ˆå™¨å¯¹Object.defineProperties的支æŒ=================
-if (!canHideOwn) {
- if ("__defineGetter__" in avalon) {
- defineProperty = function (obj, prop, desc) {
- if ('value' in desc) {
- obj[prop] = desc.value
- }
- if ("get" in desc) {
- obj.__defineGetter__(prop, desc.get)
- }
- if ('set' in desc) {
- obj.__defineSetter__(prop, desc.set)
- }
- return obj
- }
- defineProperties = function (obj, descs) {
- for (var prop in descs) {
- if (descs.hasOwnProperty(prop)) {
- defineProperty(obj, prop, descs[prop])
- }
- }
- return obj
- }
- }
- if (IEVersion) {
- var VBClassPool = {}
- window.execScript([// jshint ignore:line
- "Function parseVB(code)",
- "\tExecuteGlobal(code)",
- "End Function" //转æ¢ä¸€æ®µæ–‡æœ¬ä¸ºVB代ç 
- ].join("\n"), "VBScript")
- function VBMediator(instance, accessors, name, value) {// jshint ignore:line
- var accessor = accessors[name]
- if (arguments.length === 4) {
- accessor.call(instance, value)
- } else {
- return accessor.call(instance)
- }
- }
- defineProperties = function (name, accessors, properties) {
- // jshint ignore:line
- var buffer = []
- buffer.push(
- "\r\n\tPrivate [__data__], [__proxy__]",
- "\tPublic Default Function [__const__](d, p)",
- "\t\tSet [__data__] = d: set [__proxy__] = p",
- "\t\tSet [__const__] = Me", //链å¼è°ƒç”¨
- "\tEnd Function")
- //添加普通属性,因为VBScript对象ä¸èƒ½åƒJS那样éšæ„增删属性,必须在这里预先定义好
- for (name in properties) {
- if (!accessors.hasOwnProperty(name)) {
- buffer.push("\tPublic [" + name + "]")
- }
- }
- $$skipArray.forEach(function (name) {
- if (!accessors.hasOwnProperty(name)) {
- buffer.push("\tPublic [" + name + "]")
- }
- })
- buffer.push("\tPublic [" + 'hasOwnProperty' + "]")
- //添加访问器属性
- for (name in accessors) {
- buffer.push(
- //由于ä¸çŸ¥å¯¹æ–¹ä¼šä¼ å…¥ä»€ä¹ˆ,å› æ­¤set, let都用上
- "\tPublic Property Let [" + name + "](val" + expose + ")", //setter
- "\t\tCall [__proxy__](Me,[__data__], \"" + name + "\", val" + expose + ")",
- "\tEnd Property",
- "\tPublic Property Set [" + name + "](val" + expose + ")", //setter
- "\t\tCall [__proxy__](Me,[__data__], \"" + name + "\", val" + expose + ")",
- "\tEnd Property",
- "\tPublic Property Get [" + name + "]", //getter
- "\tOn Error Resume Next", //必须优先使用set语å¥,å¦åˆ™å®ƒä¼šè¯¯å°†æ•°ç»„当字符串返回
- "\t\tSet[" + name + "] = [__proxy__](Me,[__data__],\"" + name + "\")",
- "\tIf Err.Number <> 0 Then",
- "\t\t[" + name + "] = [__proxy__](Me,[__data__],\"" + name + "\")",
- "\tEnd If",
- "\tOn Error Goto 0",
- "\tEnd Property")
-
- }
-
- buffer.push("End Class")
- var body = buffer.join("\r\n")
- var className =VBClassPool[body]
- if (!className) {
- className = generateID("VBClass")
- window.parseVB("Class " + className + body)
- window.parseVB([
- "Function " + className + "Factory(a, b)", //创建实例并传入两个关键的å‚æ•°
- "\tDim o",
- "\tSet o = (New " + className + ")(a, b)",
- "\tSet " + className + "Factory = o",
- "End Function"
- ].join("\r\n"))
- VBClassPool[body] = className
- }
- var ret = window[className + "Factory"](accessors, VBMediator) //得到其产å“
- return ret //得到其产å“
- }
- }
-}
-
-/*********************************************************************
- * 监控数组(与ms-each, ms-repeaté…åˆä½¿ç”¨ï¼‰ *
- **********************************************************************/
-
-function arrayFactory(model) {
- var array = []
- array.$id = generateID()
- array.$model = model //æ•°æ®æ¨¡åž‹
- array.$events = {}
- array.$events[subscribers] = []
- array._ = modelFactory({
- length: model.length
- })
- array._.$watch("length", function (a, b) {
- array.$fire("length", a, b)
- })
- for (var i in EventBus) {
- array[i] = EventBus[i]
- }
- avalon.mix(array, arrayPrototype)
- return array
-}
-
-function mutateArray(method, pos, n, index, method2, pos2, n2) {
- var oldLen = this.length, loop = 2
- while (--loop) {
- switch (method) {
- case "add":
- /* jshint ignore:start */
- var array = this.$model.slice(pos, pos + n).map(function (el) {
- if (rcomplexType.test(avalon.type(el))) {
- return el.$id ? el : modelFactory(el, 0, el)
- } else {
- return el
- }
- })
- /* jshint ignore:end */
- _splice.apply(this, [pos, 0].concat(array))
- this._fire("add", pos, n)
- break
- case "del":
- var ret = this._splice(pos, n)
- this._fire("del", pos, n)
- break
- }
- if (method2) {
- method = method2
- pos = pos2
- n = n2
- loop = 2
- method2 = 0
- }
- }
- this._fire("index", index)
- if (this.length !== oldLen) {
- this._.length = this.length
- }
- return ret
-}
-
-var _splice = ap.splice
-var arrayPrototype = {
- _splice: _splice,
- _fire: function (method, a, b) {
- fireDependencies(this.$events[subscribers], method, a, b)
- },
- size: function () { //å–得数组长度,这个函数å¯ä»¥åŒæ­¥è§†å›¾ï¼Œlengthä¸èƒ½
- return this._.length
- },
- pushArray: function (array) {
- var m = array.length, n = this.length
- if (m) {
- ap.push.apply(this.$model, array)
- mutateArray.call(this, "add", n, m, Math.max(0, n - 1))
- }
- return m + n
- },
- push: function () {
- //http://jsperf.com/closure-with-arguments
- var array = []
- var i, n = arguments.length
- for (i = 0; i < n; i++) {
- array[i] = arguments[i]
- }
- return this.pushArray(array)
- },
- unshift: function () {
- var m = arguments.length, n = this.length
- if (m) {
- ap.unshift.apply(this.$model, arguments)
- mutateArray.call(this, "add", 0, m, 0)
- }
- return m + n //IE67çš„unshiftä¸ä¼šè¿”回长度
- },
- shift: function () {
- if (this.length) {
- var el = this.$model.shift()
- mutateArray.call(this, "del", 0, 1, 0)
- return el //返回被移除的元素
- }
- },
- pop: function () {
- var n = this.length
- if (n) {
- var el = this.$model.pop()
- mutateArray.call(this, "del", n - 1, 1, Math.max(0, n - 2))
- return el //返回被移除的元素
- }
- },
- splice: function (start) {
- var m = arguments.length, args = [], change
- var removed = _splice.apply(this.$model, arguments)
- if (removed.length) { //如果用户删掉了元素
- args.push("del", start, removed.length, 0)
- change = true
- }
- if (m > 2) { //如果用户添加了元素
- if (change) {
- args.splice(3, 1, 0, "add", start, m - 2)
- } else {
- args.push("add", start, m - 2, 0)
- }
- change = true
- }
- if (change) { //返回被移除的元素
- return mutateArray.apply(this, args)
- } else {
- return []
- }
- },
- contains: function (el) { //判定是å¦åŒ…å«
- return this.indexOf(el) !== -1
- },
- remove: function (el) { //移除第一个等于给定值的元素
- return this.removeAt(this.indexOf(el))
- },
- removeAt: function (index) { //移除指定索引上的元素
- if (index >= 0) {
- this.$model.splice(index, 1)
- return mutateArray.call(this, "del", index, 1, 0)
- }
- return []
- },
- clear: function () {
- this.$model.length = this.length = this._.length = 0 //清空数组
- this._fire("clear", 0)
- return this
- },
- removeAll: function (all) { //移除N个元素
- if (Array.isArray(all)) {
- for (var i = this.length - 1; i >= 0; i--) {
- if (all.indexOf(this[i]) !== -1) {
- this.removeAt(i)
- }
- }
- } else if (typeof all === "function") {
- for ( i = this.length - 1; i >= 0; i--) {
- var el = this[i]
- if (all(el, i)) {
- this.removeAt(i)
- }
- }
- } else {
- this.clear()
- }
- },
- ensure: function (el) {
- if (!this.contains(el)) { //åªæœ‰ä¸å­˜åœ¨æ‰push
- this.push(el)
- }
- return this
- },
- set: function (index, val) {
- if (index >= 0) {
- var valueType = avalon.type(val)
- if (val && val.$model) {
- val = val.$model
- }
- var target = this[index]
- if (valueType === "object") {
- for (var i in val) {
- if (target.hasOwnProperty(i)) {
- target[i] = val[i]
- }
- }
- } else if (valueType === "array") {
- target.clear().push.apply(target, val)
- } else if (target !== val) {
- this[index] = val
- this.$model[index] = val
- this._fire("set", index, val)
- }
- }
- return this
- }
-}
-//相当于原æ¥bindingExecutors.repeat çš„index分支
-function resetIndex(array, pos) {
- var last = array.length - 1
- for (var el; el = array[pos]; pos++) {
- el.$index = pos
- el.$first = pos === 0
- el.$last = pos === last
- }
-}
-
-function sortByIndex(array, indexes) {
- var map = {};
- for (var i = 0, n = indexes.length; i < n; i++) {
- map[i] = array[i] // preserve
- var j = indexes[i]
- if (j in map) {
- array[i] = map[j]
- delete map[j]
- } else {
- array[i] = array[j]
- }
- }
-}
-
-"sort,reverse".replace(rword, function (method) {
- arrayPrototype[method] = function () {
- var newArray = this.$model//这是è¦æŽ’åºçš„新数组
- var oldArray = newArray.concat() //ä¿æŒåŽŸæ¥çŠ¶æ€çš„旧数组
- var mask = Math.random()
- var indexes = []
- var hasSort
- ap[method].apply(newArray, arguments) //排åº
- for (var i = 0, n = oldArray.length; i < n; i++) {
- var neo = newArray[i]
- var old = oldArray[i]
- if (isEqual(neo, old)) {
- indexes.push(i)
- } else {
- var index = oldArray.indexOf(neo)
- indexes.push(index)//得到新数组的æ¯ä¸ªå…ƒç´ åœ¨æ—§æ•°ç»„对应的ä½ç½®
- oldArray[index] = mask //å±è”½å·²ç»æ‰¾è¿‡çš„元素
- hasSort = true
- }
- }
- if (hasSort) {
- sortByIndex(this, indexes)
- // sortByIndex(this.$proxy, indexes)
- this._fire("move", indexes)
- this._fire("index", 0)
- }
- return this
- }
-})
-
-
-/*********************************************************************
- * ä¾èµ–调度系统 *
- **********************************************************************/
-//检测两个对象间的ä¾èµ–关系
-var dependencyDetection = (function () {
- var outerFrames = []
- var currentFrame
- return {
- begin: function (accessorObject) {
- //accessorObject为一个拥有callback的对象
- outerFrames.push(currentFrame)
- currentFrame = accessorObject
- },
- end: function () {
- currentFrame = outerFrames.pop()
- },
- collectDependency: function (vmodel, accessor) {
- if (currentFrame) {
- //被dependencyDetection.begin调用
- currentFrame.callback(vmodel, accessor);
- }
- }
- };
-})()
-//将绑定对象注入到其ä¾èµ–项的订阅数组中
-var ronduplex = /^(duplex|on)$/
-avalon.injectBinding = function (data) {
- var valueFn = data.evaluator
- if (valueFn) { //如果是求值函数
- dependencyDetection.begin({
- callback: function (vmodel, dependency) {
- injectDependency(vmodel.$events[dependency._name], data)
- }
- })
- try {
- var value = ronduplex.test(data.type) ? data : valueFn.apply(0, data.args)
- if(value === void 0){
- delete data.evaluator
- }
- data.handler(value, data.element, data)
- } catch (e) {
- //log("warning:exception throwed in [avalon.injectBinding] " + e)
- delete data.evaluator
- var node = data.element
- if (node.nodeType === 3) {
- var parent = node.parentNode
- if (kernel.commentInterpolate) {
- parent.replaceChild(DOC.createComment(data.value), node)
- } else {
- node.data = openTag + (data.oneTime ? "::" : "") + data.value + closeTag
- }
- }
- } finally {
- dependencyDetection.end()
- }
- }
-}
-
-//å°†ä¾èµ–项(比它高层的访问器或构建视图刷新函数的绑定对象)注入到订阅者数组
-function injectDependency(list, data) {
- if (data.oneTime)
- return
- if (list && avalon.Array.ensure(list, data) && data.element) {
- injectDisposeQueue(data, list)
- }
-}
-
-//通知ä¾èµ–于这个访问器的订阅者更新自身
-function fireDependencies(list) {
- if (list && list.length) {
- if (new Date() - beginTime > 444 && typeof list[0] === "object") {
- rejectDisposeQueue()
- }
- var args = aslice.call(arguments, 1)
- for (var i = list.length, fn; fn = list[--i]; ) {
- var el = fn.element
- if (el && el.parentNode) {
- try {
- var valueFn = fn.evaluator
- if (fn.$repeat) {
- fn.handler.apply(fn, args) //处ç†ç›‘控数组的方法
- }else if("$repeat" in fn || !valueFn ){//如果没有eval,先eval
- bindingHandlers[fn.type](fn, fn.vmodels)
- } else if (fn.type !== "on") { //事件绑定åªèƒ½ç”±ç”¨æˆ·è§¦å‘,ä¸èƒ½ç”±ç¨‹åºè§¦å‘
- var value = valueFn.apply(0, fn.args || [])
- fn.handler(value, el, fn)
- }
- } catch (e) { }
- }
- }
- }
-}
-/*********************************************************************
- * 定时GC回收机制 *
- **********************************************************************/
-var disposeCount = 0
-var disposeQueue = avalon.$$subscribers = []
-var beginTime = new Date()
-var oldInfo = {}
-var uuid2Node = {}
-function getUid(obj, makeID) { //IE9+,标准æµè§ˆå™¨
- if (!obj.uuid && !makeID) {
- obj.uuid = ++disposeCount
- uuid2Node[obj.uuid] = obj
- }
- return obj.uuid
-}
-function getNode(uuid) {
- return uuid2Node[uuid]
-}
-//添加到回收列队中
-function injectDisposeQueue(data, list) {
- var elem = data.element
- if (!data.uuid) {
- if (elem.nodeType !== 1) {
- data.uuid = data.type + (data.pos || 0) + "-" + getUid(elem.parentNode)
- } else {
- data.uuid = data.name + "-" + getUid(elem)
- }
- }
- var lists = data.lists || (data.lists = [])
- avalon.Array.ensure(lists, list)
- list.$uuid = list.$uuid || generateID()
- if (!disposeQueue[data.uuid]) {
- disposeQueue[data.uuid] = 1
- disposeQueue.push(data)
- }
-}
-
-function rejectDisposeQueue(data) {
- if (avalon.optimize)
- return
- var i = disposeQueue.length
- var n = i
- var allTypes = []
- var iffishTypes = {}
- var newInfo = {}
- //对页é¢ä¸Šæ‰€æœ‰ç»‘定对象进行分门别类, åªæ£€æµ‹ä¸ªæ•°å‘生å˜åŒ–的类型
- while (data = disposeQueue[--i]) {
- var type = data.type
- if (newInfo[type]) {
- newInfo[type]++
- } else {
- newInfo[type] = 1
- allTypes.push(type)
- }
- }
- var diff = false
- allTypes.forEach(function (type) {
- if (oldInfo[type] !== newInfo[type]) {
- iffishTypes[type] = 1
- diff = true
- }
- })
- i = n
- if (diff) {
- while (data = disposeQueue[--i]) {
- if (!data.element)
- continue
- if (iffishTypes[data.type] && shouldDispose(data.element)) { //如果它没有在DOM树
- disposeQueue.splice(i, 1)
- delete disposeQueue[data.uuid]
- delete uuid2Node[data.element.uuid]
- var lists = data.lists
- for (var k = 0, list; list = lists[k++]; ) {
- avalon.Array.remove(lists, list)
- avalon.Array.remove(list, data)
- }
- disposeData(data)
- }
- }
- }
- oldInfo = newInfo
- beginTime = new Date()
-}
-
-function disposeData(data) {
- data.element = null
- data.rollback && data.rollback()
- for (var key in data) {
- data[key] = null
- }
-}
-
-function shouldDispose(el) {
- try {//IE下,如果文本节点脱离DOM树,访问parentNode会报错
- if (!el.parentNode) {
- return true
- }
- } catch (e) {
- return true
- }
-
- return el.msRetain ? 0 : (el.nodeType === 1 ? !root.contains(el) : !avalon.contains(root, el))
-}
-
-/************************************************************************
- * HTML处ç†(parseHTML, innerHTML, clearHTML) *
- ************************************************************************/
-// We have to close these tags to support XHTML
-var tagHooks = {
- area: [1, "<map>", "</map>"],
- param: [1, "<object>", "</object>"],
- col: [2, "<table><colgroup>", "</colgroup></table>"],
- legend: [1, "<fieldset>", "</fieldset>"],
- option: [1, "<select multiple='multiple'>", "</select>"],
- thead: [1, "<table>", "</table>"],
- tr: [2, "<table>", "</table>"],
- td: [3, "<table><tr>", "</tr></table>"],
- g: [1, '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">', '</svg>'],
- //IE6-8在用innerHTML生æˆèŠ‚点时,ä¸èƒ½ç›´æŽ¥åˆ›å»ºno-scope元素与HTML5的新标签
- _default: W3C ? [0, "", ""] : [1, "X<div>", "</div>"] //divå¯ä»¥ä¸ç”¨é—­åˆ
-}
-tagHooks.th = tagHooks.td
-tagHooks.optgroup = tagHooks.option
-tagHooks.tbody = tagHooks.tfoot = tagHooks.colgroup = tagHooks.caption = tagHooks.thead
-String("circle,defs,ellipse,image,line,path,polygon,polyline,rect,symbol,text,use").replace(rword, function (tag) {
- tagHooks[tag] = tagHooks.g //处ç†SVG
-})
-var rtagName = /<([\w:]+)/ //å–å¾—å…¶tagName
-var rxhtml = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig
-var rcreate = W3C ? /[^\d\D]/ : /(<(?:script|link|style|meta|noscript))/ig
-var scriptTypes = oneObject(["", "text/javascript", "text/ecmascript", "application/ecmascript", "application/javascript"])
-var rnest = /<(?:tb|td|tf|th|tr|col|opt|leg|cap|area)/ //需è¦å¤„ç†å¥—嵌关系的标签
-var script = DOC.createElement("script")
-var rhtml = /<|&#?\w+;/
-avalon.parseHTML = function (html) {
- var fragment = avalonFragment.cloneNode(false)
- if (typeof html !== "string") {
- return fragment
- }
- if (!rhtml.test(html)) {
- fragment.appendChild(DOC.createTextNode(html))
- return fragment
- }
- html = html.replace(rxhtml, "<$1></$2>").trim()
- var tag = (rtagName.exec(html) || ["", ""])[1].toLowerCase(),
- //å–得其标签å
- wrap = tagHooks[tag] || tagHooks._default,
- wrapper = cinerator,
- firstChild, neo
- if (!W3C) { //fix IE
- html = html.replace(rcreate, "<br class=msNoScope>$1") //在link style script等标签之å‰æ·»åŠ ä¸€ä¸ªè¡¥ä¸
- }
- wrapper.innerHTML = wrap[1] + html + wrap[2]
- var els = wrapper.getElementsByTagName("script")
- if (els.length) { //使用innerHTML生æˆçš„script节点ä¸ä¼šå‘出请求与执行text属性
- for (var i = 0, el; el = els[i++]; ) {
- if (scriptTypes[el.type]) {
- //以å·é¾™è½¬å‡¤æ–¹å¼æ¢å¤æ‰§è¡Œè„šæœ¬åŠŸèƒ½
- neo = script.cloneNode(false) //FFä¸èƒ½çœç•¥å‚æ•°
- ap.forEach.call(el.attributes, function (attr) {
- if (attr && attr.specified) {
- neo[attr.name] = attr.value //å¤åˆ¶å…¶å±žæ€§
- neo.setAttribute(attr.name, attr.value)
- }
- }) // jshint ignore:line
- neo.text = el.text
- el.parentNode.replaceChild(neo, el) //替æ¢èŠ‚点
- }
- }
- }
- if (!W3C) { //fix IE
- var target = wrap[1] === "X<div>" ? wrapper.lastChild.firstChild : wrapper.lastChild
- if (target && target.tagName === "TABLE" && tag !== "tbody") {
- //IE6-7å¤„ç† <thead> --> <thead>,<tbody>
- //<tfoot> --> <tfoot>,<tbody>
- //<table> --> <table><tbody></table>
- for (els = target.childNodes, i = 0; el = els[i++]; ) {
- if (el.tagName === "TBODY" && !el.innerHTML) {
- target.removeChild(el)
- break
- }
- }
- }
- els = wrapper.getElementsByTagName("br")
- var n = els.length
- while (el = els[--n]) {
- if (el.className === "msNoScope") {
- el.parentNode.removeChild(el)
- }
- }
- for (els = wrapper.all, i = 0; el = els[i++]; ) { //fix VML
- if (isVML(el)) {
- fixVML(el)
- }
- }
- }
- //移除我们为了符åˆå¥—嵌关系而添加的标签
- for (i = wrap[0]; i--; wrapper = wrapper.lastChild) {
- }
- while (firstChild = wrapper.firstChild) { // å°†wrapper上的节点转移到文档碎片上ï¼
- fragment.appendChild(firstChild)
- }
- return fragment
-}
-
-function isVML(src) {
- var nodeName = src.nodeName
- return nodeName.toLowerCase() === nodeName && src.scopeName && src.outerText === ""
-}
-
-function fixVML(node) {
- if (node.currentStyle.behavior !== "url(#default#VML)") {
- node.style.behavior = "url(#default#VML)"
- node.style.display = "inline-block"
- node.style.zoom = 1 //hasLayout
- }
-}
-avalon.innerHTML = function (node, html) {
- if (!W3C && (!rcreate.test(html) && !rnest.test(html))) {
- try {
- node.innerHTML = html
- return
- } catch (e) {
- }
- }
- var a = this.parseHTML(html)
- this.clearHTML(node).appendChild(a)
-}
-avalon.clearHTML = function (node) {
- node.textContent = ""
- while (node.firstChild) {
- node.removeChild(node.firstChild)
- }
- return node
-}
-
-/*********************************************************************
- * avalon的原型方法定义区 *
- **********************************************************************/
-
-function hyphen(target) {
- //转æ¢ä¸ºè¿žå­—符线风格
- return target.replace(/([a-z\d])([A-Z]+)/g, "$1-$2").toLowerCase()
-}
-
-function camelize(target) {
- //æå‰åˆ¤æ–­ï¼Œæ高getStyle等的效率
- if (!target || target.indexOf("-") < 0 && target.indexOf("_") < 0) {
- return target
- }
- //转æ¢ä¸ºé©¼å³°é£Žæ ¼
- return target.replace(/[-_][^-_]/g, function(match) {
- return match.charAt(1).toUpperCase()
- })
-}
-
-var fakeClassListMethods = {
- _toString: function() {
- var node = this.node
- var cls = node.className
- var str = typeof cls === "string" ? cls : cls.baseVal
- return str.split(/\s+/).join(" ")
- },
- _contains: function(cls) {
- return (" " + this + " ").indexOf(" " + cls + " ") > -1
- },
- _add: function(cls) {
- if (!this.contains(cls)) {
- this._set(this + " " + cls)
- }
- },
- _remove: function(cls) {
- this._set((" " + this + " ").replace(" " + cls + " ", " "))
- },
- __set: function(cls) {
- cls = cls.trim()
- var node = this.node
- if (rsvg.test(node)) {
- //SVG元素的className是一个对象 SVGAnimatedString { baseVal="", animVal=""},åªèƒ½é€šè¿‡set/getAttributeæ“作
- node.setAttribute("class", cls)
- } else {
- node.className = cls
- }
- } //toggle存在版本差异,因此ä¸ä½¿ç”¨å®ƒ
-}
-
- function fakeClassList(node) {
- if (!("classList" in node)) {
- node.classList = {
- node: node
- }
- for (var k in fakeClassListMethods) {
- node.classList[k.slice(1)] = fakeClassListMethods[k]
- }
- }
- return node.classList
- }
-
-
- "add,remove".replace(rword, function(method) {
- avalon.fn[method + "Class"] = function(cls) {
- var el = this[0]
- //https://developer.mozilla.org/zh-CN/docs/Mozilla/Firefox/Releases/26
- if (cls && typeof cls === "string" && el && el.nodeType === 1) {
- cls.replace(/\S+/g, function(c) {
- fakeClassList(el)[method](c)
- })
- }
- return this
- }
- })
- avalon.fn.mix({
- hasClass: function(cls) {
- var el = this[0] || {}
- return el.nodeType === 1 && fakeClassList(el).contains(cls)
- },
- toggleClass: function(value, stateVal) {
- var className, i = 0
- var classNames = String(value).split(/\s+/)
- var isBool = typeof stateVal === "boolean"
- while ((className = classNames[i++])) {
- var state = isBool ? stateVal : !this.hasClass(className)
- this[state ? "addClass" : "removeClass"](className)
- }
- return this
- },
- attr: function(name, value) {
- if (arguments.length === 2) {
- this[0].setAttribute(name, value)
- return this
- } else {
- return this[0].getAttribute(name)
- }
- },
- data: function(name, value) {
- name = "data-" + hyphen(name || "")
- switch (arguments.length) {
- case 2:
- this.attr(name, value)
- return this
- case 1:
- var val = this.attr(name)
- return parseData(val)
- case 0:
- var ret = {}
- ap.forEach.call(this[0].attributes, function(attr) {
- if (attr) {
- name = attr.name
- if (!name.indexOf("data-")) {
- name = camelize(name.slice(5))
- ret[name] = parseData(attr.value)
- }
- }
- })
- return ret
- }
- },
- removeData: function(name) {
- name = "data-" + hyphen(name)
- this[0].removeAttribute(name)
- return this
- },
- css: function(name, value) {
- if (avalon.isPlainObject(name)) {
- for (var i in name) {
- avalon.css(this, i, name[i])
- }
- } else {
- var ret = avalon.css(this, name, value)
- }
- return ret !== void 0 ? ret : this
- },
- position: function() {
- var offsetParent, offset,
- elem = this[0],
- parentOffset = {
- top: 0,
- left: 0
- }
- if (!elem) {
- return
- }
- if (this.css("position") === "fixed") {
- offset = elem.getBoundingClientRect()
- } else {
- offsetParent = this.offsetParent() //得到真正的offsetParent
- offset = this.offset() // 得到正确的offsetParent
- if (offsetParent[0].tagName !== "HTML") {
- parentOffset = offsetParent.offset()
- }
- parentOffset.top += avalon.css(offsetParent[0], "borderTopWidth", true)
- parentOffset.left += avalon.css(offsetParent[0], "borderLeftWidth", true)
-
- // Subtract offsetParent scroll positions
- parentOffset.top -= offsetParent.scrollTop()
- parentOffset.left -= offsetParent.scrollLeft()
- }
- return {
- top: offset.top - parentOffset.top - avalon.css(elem, "marginTop", true),
- left: offset.left - parentOffset.left - avalon.css(elem, "marginLeft", true)
- }
- },
- offsetParent: function() {
- var offsetParent = this[0].offsetParent
- while (offsetParent && avalon.css(offsetParent, "position") === "static") {
- offsetParent = offsetParent.offsetParent;
- }
- return avalon(offsetParent || root)
- },
- bind: function(type, fn, phase) {
- if (this[0]) { //此方法ä¸ä¼šé“¾
- return avalon.bind(this[0], type, fn, phase)
- }
- },
- unbind: function(type, fn, phase) {
- if (this[0]) {
- avalon.unbind(this[0], type, fn, phase)
- }
- return this
- },
- val: function(value) {
- var node = this[0]
- if (node && node.nodeType === 1) {
- var get = arguments.length === 0
- var access = get ? ":get" : ":set"
- var fn = valHooks[getValType(node) + access]
- if (fn) {
- var val = fn(node, value)
- } else if (get) {
- return (node.value || "").replace(/\r/g, "")
- } else {
- node.value = value
- }
- }
- return get ? val : this
- }
- })
-
- function parseData(data) {
- try {
- if (typeof data === "object")
- return data
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null : +data + "" === data ? +data : rbrace.test(data) ? avalon.parseJSON(data) : data
- } catch (e) {}
- return data
- }
-var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
- rvalidchars = /^[\],:{}\s]*$/,
- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
- rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g
-avalon.parseJSON = window.JSON ? JSON.parse : function(data) {
- if (typeof data === "string") {
- data = data.trim();
- if (data) {
- if (rvalidchars.test(data.replace(rvalidescape, "@")
- .replace(rvalidtokens, "]")
- .replace(rvalidbraces, ""))) {
- return (new Function("return " + data))() // jshint ignore:line
- }
- }
- avalon.error("Invalid JSON: " + data)
- }
- return data
-}
-
-//生æˆavalon.fn.scrollLeft, avalon.fn.scrollTop方法
-avalon.each({
- scrollLeft: "pageXOffset",
- scrollTop: "pageYOffset"
-}, function(method, prop) {
- avalon.fn[method] = function(val) {
- var node = this[0] || {}, win = getWindow(node),
- top = method === "scrollTop"
- if (!arguments.length) {
- return win ? (prop in win) ? win[prop] : root[method] : node[method]
- } else {
- if (win) {
- win.scrollTo(!top ? val : avalon(win).scrollLeft(), top ? val : avalon(win).scrollTop())
- } else {
- node[method] = val
- }
- }
- }
-})
-
-function getWindow(node) {
- return node.window && node.document ? node : node.nodeType === 9 ? node.defaultView || node.parentWindow : false;
-}
-//=============================css相关=======================
-var cssHooks = avalon.cssHooks = {}
-var prefixes = ["", "-webkit-", "-o-", "-moz-", "-ms-"]
-var cssMap = {
- "float": W3C ? "cssFloat" : "styleFloat"
-}
-avalon.cssNumber = oneObject("columnCount,order,fillOpacity,fontWeight,lineHeight,opacity,orphans,widows,zIndex,zoom")
-
-avalon.cssName = function(name, host, camelCase) {
- if (cssMap[name]) {
- return cssMap[name]
- }
- host = host || root.style
- for (var i = 0, n = prefixes.length; i < n; i++) {
- camelCase = camelize(prefixes[i] + name)
- if (camelCase in host) {
- return (cssMap[name] = camelCase)
- }
- }
- return null
-}
-cssHooks["@:set"] = function(node, name, value) {
- try { //node.style.width = NaN;node.style.width = "xxxxxxx";node.style.width = undefine 在旧å¼IE下会抛异常
- node.style[name] = value
- } catch (e) {}
-}
-if (window.getComputedStyle) {
- cssHooks["@:get"] = function(node, name) {
- if (!node || !node.style) {
- throw new Error("getComputedStyleè¦æ±‚传入一个节点 " + node)
- }
- var ret, styles = getComputedStyle(node, null)
- if (styles) {
- ret = name === "filter" ? styles.getPropertyValue(name) : styles[name]
- if (ret === "") {
- ret = node.style[name] //其他æµè§ˆå™¨éœ€è¦æˆ‘们手动å–内è”æ ·å¼
- }
- }
- return ret
- }
- cssHooks["opacity:get"] = function(node) {
- var ret = cssHooks["@:get"](node, "opacity")
- return ret === "" ? "1" : ret
- }
-} else {
- var rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i
- var rposition = /^(top|right|bottom|left)$/
- var ralpha = /alpha\([^)]*\)/i
- var ie8 = !! window.XDomainRequest
- var salpha = "DXImageTransform.Microsoft.Alpha"
- var border = {
- thin: ie8 ? '1px' : '2px',
- medium: ie8 ? '3px' : '4px',
- thick: ie8 ? '5px' : '6px'
- }
- cssHooks["@:get"] = function(node, name) {
- //å–得精确值,ä¸è¿‡å®ƒæœ‰å¯èƒ½æ˜¯å¸¦em,pc,mm,pt,%ç­‰å•ä½
- var currentStyle = node.currentStyle
- var ret = currentStyle[name]
- if ((rnumnonpx.test(ret) && !rposition.test(ret))) {
- //①,ä¿å­˜åŽŸæœ‰çš„style.left, runtimeStyle.left,
- var style = node.style,
- left = style.left,
- rsLeft = node.runtimeStyle.left
- //②由于③处的style.left = xxx会影å“到currentStyle.left,
- //因此把它currentStyle.left放到runtimeStyle.left,
- //runtimeStyle.left拥有最高优先级,ä¸ä¼šstyle.leftå½±å“
- node.runtimeStyle.left = currentStyle.left
- //③将精确值赋给到style.left,然åŽé€šè¿‡IEçš„å¦ä¸€ä¸ªç§æœ‰å±žæ€§ style.pixelLeft
- //得到å•ä½ä¸ºpx的结果;fontSize的分支è§http://bugs.jquery.com/ticket/760
- style.left = name === 'fontSize' ? '1em' : (ret || 0)
- ret = style.pixelLeft + "px"
- //④还原 style.left,runtimeStyle.left
- style.left = left
- node.runtimeStyle.left = rsLeft
- }
- if (ret === "medium") {
- name = name.replace("Width", "Style")
- //border width 默认值为medium,å³ä½¿å…¶ä¸º0"
- if (currentStyle[name] === "none") {
- ret = "0px"
- }
- }
- return ret === "" ? "auto" : border[ret] || ret
- }
- cssHooks["opacity:set"] = function(node, name, value) {
- var style = node.style
- var opacity = isFinite(value) && value <= 1 ? "alpha(opacity=" + value * 100 + ")" : ""
- var filter = style.filter || "";
- style.zoom = 1
- //ä¸èƒ½ä½¿ç”¨ä»¥ä¸‹æ–¹å¼è®¾ç½®é€æ˜Žåº¦
- //node.filters.alpha.opacity = value * 100
- style.filter = (ralpha.test(filter) ?
- filter.replace(ralpha, opacity) :
- filter + " " + opacity).trim()
- if (!style.filter) {
- style.removeAttribute("filter")
- }
- }
- cssHooks["opacity:get"] = function(node) {
- //这是最快的获å–IEé€æ˜Žå€¼çš„æ–¹å¼ï¼Œä¸éœ€è¦åŠ¨ç”¨æ­£åˆ™äº†ï¼
- var alpha = node.filters.alpha || node.filters[salpha],
- op = alpha && alpha.enabled ? alpha.opacity : 100
- return (op / 100) + "" //ç¡®ä¿è¿”回的是字符串
- }
-}
-
-"top,left".replace(rword, function(name) {
- cssHooks[name + ":get"] = function(node) {
- var computed = cssHooks["@:get"](node, name)
- return /px$/.test(computed) ? computed :
- avalon(node).position()[name] + "px"
- }
-})
-
-var cssShow = {
- position: "absolute",
- visibility: "hidden",
- display: "block"
-}
-
-var rdisplayswap = /^(none|table(?!-c[ea]).+)/
-
- function showHidden(node, array) {
- //http://www.cnblogs.com/rubylouvre/archive/2012/10/27/2742529.html
- if (node.offsetWidth <= 0) { //opera.offsetWidthå¯èƒ½å°äºŽ0
- if (rdisplayswap.test(cssHooks["@:get"](node, "display"))) {
- var obj = {
- node: node
- }
- for (var name in cssShow) {
- obj[name] = node.style[name]
- node.style[name] = cssShow[name]
- }
- array.push(obj)
- }
- var parent = node.parentNode
- if (parent && parent.nodeType === 1) {
- showHidden(parent, array)
- }
- }
- }
- "Width,Height".replace(rword, function(name) { //fix 481
- var method = name.toLowerCase(),
- clientProp = "client" + name,
- scrollProp = "scroll" + name,
- offsetProp = "offset" + name
- cssHooks[method + ":get"] = function(node, which, override) {
- var boxSizing = -4
- if (typeof override === "number") {
- boxSizing = override
- }
- which = name === "Width" ? ["Left", "Right"] : ["Top", "Bottom"]
- var ret = node[offsetProp] // border-box 0
- if (boxSizing === 2) { // margin-box 2
- return ret + avalon.css(node, "margin" + which[0], true) + avalon.css(node, "margin" + which[1], true)
- }
- if (boxSizing < 0) { // padding-box -2
- ret = ret - avalon.css(node, "border" + which[0] + "Width", true) - avalon.css(node, "border" + which[1] + "Width", true)
- }
- if (boxSizing === -4) { // content-box -4
- ret = ret - avalon.css(node, "padding" + which[0], true) - avalon.css(node, "padding" + which[1], true)
- }
- return ret
- }
- cssHooks[method + "&get"] = function(node) {
- var hidden = [];
- showHidden(node, hidden);
- var val = cssHooks[method + ":get"](node)
- for (var i = 0, obj; obj = hidden[i++];) {
- node = obj.node
- for (var n in obj) {
- if (typeof obj[n] === "string") {
- node.style[n] = obj[n]
- }
- }
- }
- return val;
- }
- avalon.fn[method] = function(value) { //会忽视其display
- var node = this[0]
- if (arguments.length === 0) {
- if (node.setTimeout) { //å–得窗å£å°ºå¯¸,IE9åŽå¯ä»¥ç”¨node.innerWidth /innerHeight代替
- return node["inner" + name] || node.document.documentElement[clientProp]
- }
- if (node.nodeType === 9) { //å–得页é¢å°ºå¯¸
- var doc = node.documentElement
- //FF chrome html.scrollHeight< body.scrollHeight
- //IE æ ‡å‡†æ¨¡å¼ : html.scrollHeight> body.scrollHeight
- //IE æ€ªå¼‚æ¨¡å¼ : html.scrollHeight 最大等于å¯è§†çª—å£å¤šä¸€ç‚¹ï¼Ÿ
- return Math.max(node.body[scrollProp], doc[scrollProp], node.body[offsetProp], doc[offsetProp], doc[clientProp])
- }
- return cssHooks[method + "&get"](node)
- } else {
- return this.css(method, value)
- }
- }
- avalon.fn["inner" + name] = function() {
- return cssHooks[method + ":get"](this[0], void 0, -2)
- }
- avalon.fn["outer" + name] = function(includeMargin) {
- return cssHooks[method + ":get"](this[0], void 0, includeMargin === true ? 2 : 0)
- }
- })
- avalon.fn.offset = function() { //å–å¾—è·ç¦»é¡µé¢å·¦å³è§’çš„åæ ‡
- var node = this[0],
- box = {
- left: 0,
- top: 0
- }
- if (!node || !node.tagName || !node.ownerDocument) {
- return box
- }
- var doc = node.ownerDocument,
- body = doc.body,
- root = doc.documentElement,
- win = doc.defaultView || doc.parentWindow
- if (!avalon.contains(root, node)) {
- return box
- }
- //http://hkom.blog1.fc2.com/?mode=m&no=750 bodyçš„å移é‡æ˜¯ä¸åŒ…å«marginçš„
- //我们å¯ä»¥é€šè¿‡getBoundingClientRectæ¥èŽ·å¾—元素相对于clientçš„rect.
- //http://msdn.microsoft.com/en-us/library/ms536433.aspx
- if (node.getBoundingClientRect) {
- box = node.getBoundingClientRect() // BlackBerry 5, iOS 3 (original iPhone)
- }
- //chrome/IE6: body.scrollTop, firefox/other: root.scrollTop
- var clientTop = root.clientTop || body.clientTop,
- clientLeft = root.clientLeft || body.clientLeft,
- scrollTop = Math.max(win.pageYOffset || 0, root.scrollTop, body.scrollTop),
- scrollLeft = Math.max(win.pageXOffset || 0, root.scrollLeft, body.scrollLeft)
- // 把滚动è·ç¦»åŠ åˆ°left,top中去。
- // IE一些版本中会自动为HTML元素加上2pxçš„border,我们需è¦åŽ»æŽ‰å®ƒ
- // http://msdn.microsoft.com/en-us/library/ms533564(VS.85).aspx
- return {
- top: box.top + scrollTop - clientTop,
- left: box.left + scrollLeft - clientLeft
- }
- }
-
- //==================================val相关============================
-
- function getValType(elem) {
- var ret = elem.tagName.toLowerCase()
- return ret === "input" && /checkbox|radio/.test(elem.type) ? "checked" : ret
- }
-var roption = /^<option(?:\s+\w+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?)*\s+value[\s=]/i
-var valHooks = {
- "option:get": IEVersion ? function(node) {
- //在IE11åŠW3C,如果没有指定value,那么node.value默认为node.text(存在trim作),但IE9-10则是å–innerHTML(没trimæ“作)
- //specified并ä¸å¯é ï¼Œå› æ­¤é€šè¿‡åˆ†æžouterHTML判定用户有没有显示定义value
- return roption.test(node.outerHTML) ? node.value : node.text.trim()
- } : function(node) {
- return node.value
- },
- "select:get": function(node, value) {
- var option, options = node.options,
- index = node.selectedIndex,
- getter = valHooks["option:get"],
- one = node.type === "select-one" || index < 0,
- values = one ? null : [],
- max = one ? index + 1 : options.length,
- i = index < 0 ? max : one ? index : 0
- for (; i < max; i++) {
- option = options[i]
- //æ—§å¼IE在resetåŽä¸ä¼šæ”¹å˜selected,需è¦æ”¹ç”¨i === index判定
- //我们过滤所有disabledçš„option元素,但在safari5下,如果设置select为disable,那么其所有孩å­éƒ½disable
- //因此当一个元素为disable,需è¦æ£€æµ‹å…¶æ˜¯å¦æ˜¾å¼è®¾ç½®äº†disableåŠå…¶çˆ¶èŠ‚点的disable情况
- if ((option.selected || i === index) && !option.disabled) {
- value = getter(option)
- if (one) {
- return value
- }
- //收集所有selected值组æˆæ•°ç»„返回
- values.push(value)
- }
- }
- return values
- },
- "select:set": function(node, values, optionSet) {
- values = [].concat(values) //强制转æ¢ä¸ºæ•°ç»„
- var getter = valHooks["option:get"]
- for (var i = 0, el; el = node.options[i++];) {
- if ((el.selected = values.indexOf(getter(el)) > -1)) {
- optionSet = true
- }
- }
- if (!optionSet) {
- node.selectedIndex = -1
- }
- }
-}
-
-/*********************************************************************
- * 编译系统 *
- **********************************************************************/
-var meta = {
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '"': '\\"',
- '\\': '\\\\'
-}
-var quote = window.JSON && JSON.stringify || function(str) {
- return '"' + str.replace(/[\\\"\x00-\x1f]/g, function(a) {
- var c = meta[a];
- return typeof c === 'string' ? c :
- '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
- }) + '"'
-}
-
-var keywords = [
- "break,case,catch,continue,debugger,default,delete,do,else,false",
- "finally,for,function,if,in,instanceof,new,null,return,switch,this",
- "throw,true,try,typeof,var,void,while,with", /* 关键字*/
- "abstract,boolean,byte,char,class,const,double,enum,export,extends",
- "final,float,goto,implements,import,int,interface,long,native",
- "package,private,protected,public,short,static,super,synchronized",
- "throws,transient,volatile", /*ä¿ç•™å­—*/
- "arguments,let,yield,undefined" /* ECMA 5 - use strict*/].join(",")
-var rrexpstr = /\/\*[\w\W]*?\*\/|\/\/[^\n]*\n|\/\/[^\n]*$|"(?:[^"\\]|\\[\w\W])*"|'(?:[^'\\]|\\[\w\W])*'|[\s\t\n]*\.[\s\t\n]*[$\w\.]+/g
-var rsplit = /[^\w$]+/g
-var rkeywords = new RegExp(["\\b" + keywords.replace(/,/g, '\\b|\\b') + "\\b"].join('|'), 'g')
-var rnumber = /\b\d[^,]*/g
-var rcomma = /^,+|,+$/g
-var variablePool = new Cache(512)
-var getVariables = function (code) {
- var key = "," + code.trim()
- var ret = variablePool.get(key)
- if (ret) {
- return ret
- }
- var match = code
- .replace(rrexpstr, "")
- .replace(rsplit, ",")
- .replace(rkeywords, "")
- .replace(rnumber, "")
- .replace(rcomma, "")
- .split(/^$|,+/)
- return variablePool.put(key, uniqSet(match))
-}
-/*添加赋值语å¥*/
-
-function addAssign(vars, scope, name, data) {
- var ret = [],
- prefix = " = " + name + "."
- for (var i = vars.length, prop; prop = vars[--i]; ) {
- if (scope.hasOwnProperty(prop)) {
- ret.push(prop + prefix + prop)
- data.vars.push(prop)
- if (data.type === "duplex") {
- vars.get = name + "." + prop
- }
- vars.splice(i, 1)
- }
- }
- return ret
-}
-
-function uniqSet(array) {
- var ret = [],
- unique = {}
- for (var i = 0; i < array.length; i++) {
- var el = array[i]
- var id = el && typeof el.$id === "string" ? el.$id : el
- if (!unique[id]) {
- unique[id] = ret.push(el)
- }
- }
- return ret
-}
-//缓存求值函数,以便多次利用
-var evaluatorPool = new Cache(128)
-//å–得求值函数åŠå…¶ä¼ å‚
-var rduplex = /\w\[.*\]|\w\.\w/
-var rproxy = /(\$proxy\$[a-z]+)\d+$/
-var rthimRightParentheses = /\)\s*$/
-var rthimOtherParentheses = /\)\s*\|/g
-var rquoteFilterName = /\|\s*([$\w]+)/g
-var rpatchBracket = /"\s*\["/g
-var rthimLeftParentheses = /"\s*\(/g
-function parseFilter(val, filters) {
- filters = filters
- .replace(rthimRightParentheses, "")//处ç†æœ€åŽçš„å°æ‹¬å·
- .replace(rthimOtherParentheses, function () {//处ç†å…¶ä»–å°æ‹¬å·
- return "],|"
- })
- .replace(rquoteFilterName, function (a, b) { //处ç†|åŠå®ƒåŽé¢çš„过滤器的åå­—
- return "[" + quote(b)
- })
- .replace(rpatchBracket, function () {
- return '"],["'
- })
- .replace(rthimLeftParentheses, function () {
- return '",'
- }) + "]"
- return "return avalon.filters.$filter(" + val + ", " + filters + ")"
-}
-
-function parseExpr(code, scopes, data) {
- var dataType = data.type
- var filters = data.filters || ""
- var exprId = scopes.map(function (el) {
- return String(el.$id).replace(rproxy, "$1")
- }) + code + dataType + filters
- var vars = getVariables(code).concat(),
- assigns = [],
- names = [],
- args = [],
- prefix = ""
- //args 是一个对象数组, names 是将è¦ç”Ÿæˆçš„求值函数的å‚æ•°
- scopes = uniqSet(scopes)
- data.vars = []
- for (var i = 0, sn = scopes.length; i < sn; i++) {
- if (vars.length) {
- var name = "vm" + expose + "_" + i
- names.push(name)
- args.push(scopes[i])
- assigns.push.apply(assigns, addAssign(vars, scopes[i], name, data))
- }
- }
- if (!assigns.length && dataType === "duplex") {
- return
- }
- if (dataType !== "duplex" && (code.indexOf("||") > -1 || code.indexOf("&&") > -1)) {
- //https://github.com/RubyLouvre/avalon/issues/583
- data.vars.forEach(function (v) {
- var reg = new RegExp("\\b" + v + "(?:\\.\\w+|\\[\\w+\\])+", "ig")
- code = code.replace(reg, function (_) {
- var c = _.charAt(v.length)
- var r = IEVersion ? code.slice(arguments[1] + _.length) : RegExp.rightContext
- var method = /^\s*\(/.test(r)
- if (c === "." || c === "[" || method) {//比如v为aa,我们åªåŒ¹é…aa.bb,aa[cc],ä¸åŒ¹é…aaa.xxx
- var name = "var" + String(Math.random()).replace(/^0\./, "")
- if (method) {//array.size()
- var array = _.split(".")
- if (array.length > 2) {
- var last = array.pop()
- assigns.push(name + " = " + array.join("."))
- return name + "." + last
- } else {
- return _
- }
- }
- assigns.push(name + " = " + _)
- return name
- } else {
- return _
- }
- })
- })
- }
- //---------------args----------------
- data.args = args
- //---------------cache----------------
- delete data.vars
- var fn = evaluatorPool.get(exprId) //直接从缓存,å…å¾—é‡å¤ç”Ÿæˆ
- if (fn) {
- data.evaluator = fn
- return
- }
- prefix = assigns.join(", ")
- if (prefix) {
- prefix = "var " + prefix
- }
- if (/\S/.test(filters)) { //文本绑定,åŒå·¥ç»‘定æ‰æœ‰è¿‡æ»¤å™¨
- if (!/text|html/.test(data.type)) {
- throw Error("ms-" + data.type + "ä¸æ”¯æŒè¿‡æ»¤å™¨")
- }
- code = "\nvar ret" + expose + " = " + code + ";\r\n"
- code += parseFilter("ret" + expose, filters)
- } else if (dataType === "duplex") { //åŒå·¥ç»‘定
- var _body = "'use strict';\nreturn function(vvv){\n\t" +
- prefix +
- ";\n\tif(!arguments.length){\n\t\treturn " +
- code +
- "\n\t}\n\t" + (!rduplex.test(code) ? vars.get : code) +
- "= vvv;\n} "
- try {
- fn = Function.apply(noop, names.concat(_body))
- data.evaluator = evaluatorPool.put(exprId, fn)
- } catch (e) {
- log("debug: parse error," + e.message)
- }
- return
- } else if (dataType === "on") { //事件绑定
- if (code.indexOf("(") === -1) {
- code += ".call(this, $event)"
- } else {
- code = code.replace("(", ".call(this,")
- }
- names.push("$event")
- code = "\nreturn " + code + ";" //IE全家 Function("return ")出错,需è¦Function("return ;")
- var lastIndex = code.lastIndexOf("\nreturn")
- var header = code.slice(0, lastIndex)
- var footer = code.slice(lastIndex)
- code = header + "\n" + footer
- } else { //其他绑定
- code = "\nreturn " + code + ";" //IE全家 Function("return ")出错,需è¦Function("return ;")
- }
- try {
- fn = Function.apply(noop, names.concat("'use strict';\n" + prefix + code))
- data.evaluator = evaluatorPool.put(exprId, fn)
- } catch (e) {
- log("debug: parse error," + e.message)
- } finally {
- vars = assigns = names = null //释放内存
- }
-}
-
-
-//parseExpr的智能引用代ç†
-
-function parseExprProxy(code, scopes, data, tokens, noRegister) {
- if (Array.isArray(tokens)) {
- code = tokens.map(function (el) {
- return el.expr ? "(" + el.value + ")" : quote(el.value)
- }).join(" + ")
- }
- parseExpr(code, scopes, data)
- if (data.evaluator && !noRegister) {
- data.handler = bindingExecutors[data.handlerName || data.type]
- //方便调试
- //这里éžå¸¸é‡è¦,我们通过判定视图刷新函数的element是å¦åœ¨DOM树决定
- //将它移出订阅者列表
- avalon.injectBinding(data)
- }
-}
-avalon.parseExprProxy = parseExprProxy
-/*********************************************************************
- * 扫æ系统 *
- **********************************************************************/
-
-avalon.scan = function(elem, vmodel) {
- elem = elem || root
- var vmodels = vmodel ? [].concat(vmodel) : []
- scanTag(elem, vmodels)
-}
-
-//http://www.w3.org/TR/html5/syntax.html#void-elements
-var stopScan = oneObject("area,base,basefont,br,col,command,embed,hr,img,input,link,meta,param,source,track,wbr,noscript,script,style,textarea".toUpperCase())
-
-function checkScan(elem, callback, innerHTML) {
- var id = setTimeout(function() {
- var currHTML = elem.innerHTML
- clearTimeout(id)
- if (currHTML === innerHTML) {
- callback()
- } else {
- checkScan(elem, callback, currHTML)
- }
- })
-}
-
-
-function createSignalTower(elem, vmodel) {
- var id = elem.getAttribute("avalonctrl") || vmodel.$id
- elem.setAttribute("avalonctrl", id)
- vmodel.$events.expr = elem.tagName + '[avalonctrl="' + id + '"]'
-}
-
-var getBindingCallback = function(elem, name, vmodels) {
- var callback = elem.getAttribute(name)
- if (callback) {
- for (var i = 0, vm; vm = vmodels[i++]; ) {
- if (vm.hasOwnProperty(callback) && typeof vm[callback] === "function") {
- return vm[callback]
- }
- }
- }
-}
-
-function executeBindings(bindings, vmodels) {
- for (var i = 0, data; data = bindings[i++]; ) {
- data.vmodels = vmodels
- bindingHandlers[data.type](data, vmodels)
- if (data.evaluator && data.element && data.element.nodeType === 1) { //移除数æ®ç»‘定,防止被二次解æž
- //chrome使用removeAttributeNode移除ä¸å­˜åœ¨çš„特性节点时会报错 https://github.com/RubyLouvre/avalon/issues/99
- data.element.removeAttribute(data.name)
- }
- }
- bindings.length = 0
-}
-
-//https://github.com/RubyLouvre/avalon/issues/636
-var mergeTextNodes = IEVersion && window.MutationObserver ? function (elem) {
- var node = elem.firstChild, text
- while (node) {
- var aaa = node.nextSibling
- if (node.nodeType === 3) {
- if (text) {
- text.nodeValue += node.nodeValue
- elem.removeChild(node)
- } else {
- text = node
- }
- } else {
- text = null
- }
- node = aaa
- }
-} : 0
-var roneTime = /^\s*::/
-var rmsAttr = /ms-(\w+)-?(.*)/
-var priorityMap = {
- "if": 10,
- "repeat": 90,
- "data": 100,
- "widget": 110,
- "each": 1400,
- "with": 1500,
- "duplex": 2000,
- "on": 3000
-}
-
-var events = oneObject("animationend,blur,change,input,click,dblclick,focus,keydown,keypress,keyup,mousedown,mouseenter,mouseleave,mousemove,mouseout,mouseover,mouseup,scan,scroll,submit")
-var obsoleteAttrs = oneObject("value,title,alt,checked,selected,disabled,readonly,enabled")
-function bindingSorter(a, b) {
- return a.priority - b.priority
-}
-
-function scanAttr(elem, vmodels, match) {
- var scanNode = true
- if (vmodels.length) {
- var attributes = getAttributes ? getAttributes(elem) : elem.attributes
- var bindings = []
- var fixAttrs = []
- var msData = {}
- for (var i = 0, attr; attr = attributes[i++]; ) {
- if (attr.specified) {
- if (match = attr.name.match(rmsAttr)) {
- //如果是以指定å‰ç¼€å‘½åçš„
- var type = match[1]
- var param = match[2] || ""
- var value = attr.value
- var name = attr.name
- if (events[type]) {
- param = type
- type = "on"
- } else if (obsoleteAttrs[type]) {
- if (type === "enabled") {//åƒæŽ‰ms-enabled绑定,用ms-disabled代替
- log("warning!ms-enabled或ms-attr-enabledå·²ç»è¢«åºŸå¼ƒ")
- type = "disabled"
- value = "!(" + value + ")"
- }
- param = type
- type = "attr"
- name = "ms-" + type + "-"+ param
- fixAttrs.push([attr.name, name, value])
- }
- msData[name] = value
- if (typeof bindingHandlers[type] === "function") {
- var newValue = value.replace(roneTime, "")
- var oneTime = value !== newValue
- var binding = {
- type: type,
- param: param,
- element: elem,
- name: name,
- value: newValue,
- oneTime: oneTime,
- uuid: name+"-"+getUid(elem),
- //chrome与firefox下Number(param)得到的值ä¸ä¸€æ · #855
- priority: (priorityMap[type] || type.charCodeAt(0) * 10 )+ (Number(param.replace(/\D/g, "")) || 0)
- }
- if (type === "html" || type === "text") {
- var token = getToken(value)
- avalon.mix(binding, token)
- binding.filters = binding.filters.replace(rhasHtml, function () {
- binding.type = "html"
- binding.group = 1
- return ""
- })// jshint ignore:line
- } else if (type === "duplex") {
- var hasDuplex = name
- } else if (name === "ms-if-loop") {
- binding.priority += 100
- }
- bindings.push(binding)
- if (type === "widget") {
- elem.msData = elem.msData || msData
- }
- }
- }
- }
- }
- if (bindings.length) {
- bindings.sort(bindingSorter)
- fixAttrs.forEach(function (arr) {
- log("warning!请改用" + arr[1] + "代替" + arr[0] + "!")
- elem.removeAttribute(arr[0])
- elem.setAttribute(arr[1], arr[2])
- })
- //http://bugs.jquery.com/ticket/7071
- //在IE下对VML读å–type属性,会让此元素所有属性都å˜æˆ<Failed>
- if (hasDuplex) {
- if (msData["ms-attr-checked"]) {
- log("warning!一个控件ä¸èƒ½åŒæ—¶å®šä¹‰ms-attr-checked与" + hasDuplex)
- }
- if (msData["ms-attr-value"]) {
- log("warning!一个控件ä¸èƒ½åŒæ—¶å®šä¹‰ms-attr-value与" + hasDuplex)
- }
- }
- for (i = 0; binding = bindings[i]; i++) {
- type = binding.type
- if (rnoscanAttrBinding.test(type)) {
- return executeBindings(bindings.slice(0, i + 1), vmodels)
- } else if (scanNode) {
- scanNode = !rnoscanNodeBinding.test(type)
- }
- }
- executeBindings(bindings, vmodels)
- }
- }
- if (scanNode && !stopScan[elem.tagName] && rbind.test(elem.innerHTML.replace(rlt, "<").replace(rgt, ">"))) {
- mergeTextNodes && mergeTextNodes(elem)
- scanNodeList(elem, vmodels) //扫æå­å­™å…ƒç´ 
- }
-}
-var rnoscanAttrBinding = /^if|widget|repeat$/
-var rnoscanNodeBinding = /^each|with|html|include$/
-//IE67下,在循环绑定中,一个节点如果是通过cloneNode得到,自定义属性的specified为false,无法进入里é¢çš„分支,
-//但如果我们去掉scanAttr中的attr.specified检测,一个元素会有80+个特性节点(因为它ä¸åŒºåˆ†å›ºæœ‰å±žæ€§ä¸Žè‡ªå®šä¹‰å±žæ€§ï¼‰ï¼Œå¾ˆå®¹æ˜“å¡æ­»é¡µé¢
-if (!"1" [0]) {
- var attrPool = new Cache(512)
- var rattrs = /\s+(ms-[^=\s]+)(?:=("[^"]*"|'[^']*'|[^\s>]+))?/g,
- rquote = /^['"]/,
- rtag = /<\w+\b(?:(["'])[^"]*?(\1)|[^>])*>/i,
- ramp = /&amp;/g
- //IE6-8解æžHTML5新标签,会将它分解两个元素节点与一个文本节点
- //<body><section>ddd</section></body>
- // window.onload = function() {
- // var body = document.body
- // for (var i = 0, el; el = body.children[i++]; ) {
- // avalon.log(el.outerHTML)
- // }
- // }
- //ä¾æ¬¡è¾“出<SECTION>, </SECTION>
- var getAttributes = function (elem) {
- var html = elem.outerHTML
- //处ç†IE6-8解æžHTML5新标签的情况,åŠ<br>ç­‰åŠé—­åˆæ ‡ç­¾outerHTML为空的情况
- if (html.slice(0, 2) === "</" || !html.trim()) {
- return []
- }
- var str = html.match(rtag)[0]
- var attributes = [],
- match,
- k, v
- var ret = attrPool.get(str)
- if (ret) {
- return ret
- }
- while (k = rattrs.exec(str)) {
- v = k[2]
- if (v) {
- v = (rquote.test(v) ? v.slice(1, -1) : v).replace(ramp, "&")
- }
- var name = k[1].toLowerCase()
- match = name.match(rmsAttr)
- var binding = {
- name: name,
- specified: true,
- value: v || ""
- }
- attributes.push(binding)
- }
- return attrPool.put(str, attributes)
- }
-}
-
-function scanNodeList(parent, vmodels) {
- var nodes = avalon.slice(parent.childNodes)
- scanNodeArray(nodes, vmodels)
-}
-
-function scanNodeArray(nodes, vmodels) {
- for (var i = 0, node; node = nodes[i++];) {
- switch (node.nodeType) {
- case 1:
- scanTag(node, vmodels) //扫æ元素节点
- if (node.msCallback) {
- node.msCallback()
- node.msCallback = void 0
- }
- break
- case 3:
- if(rexpr.test(node.nodeValue)){
- scanText(node, vmodels, i) //扫æ文本节点
- }
- break
- }
- }
-}
-
-
-function scanTag(elem, vmodels, node) {
- //扫æé¡ºåº ms-skip(0) --> ms-important(1) --> ms-controller(2) --> ms-if(10) --> ms-repeat(100)
- //--> ms-if-loop(110) --> ms-attr(970) ...--> ms-each(1400)-->ms-with(1500)--〉ms-duplex(2000)åž«åŽ
- var a = elem.getAttribute("ms-skip")
- //#360 在旧å¼IE中 Object标签在引入Flash等资æºæ—¶,å¯èƒ½å‡ºçŽ°æ²¡æœ‰getAttributeNode,innerHTML的情形
- if (!elem.getAttributeNode) {
- return log("warning " + elem.tagName + " no getAttributeNode method")
- }
- var b = elem.getAttributeNode("ms-important")
- var c = elem.getAttributeNode("ms-controller")
- if (typeof a === "string") {
- return
- } else if (node = b || c) {
- var newVmodel = avalon.vmodels[node.value]
- if (!newVmodel) {
- return
- }
- //ms-importantä¸åŒ…å«çˆ¶VM,ms-controller相å
- vmodels = node === b ? [newVmodel] : [newVmodel].concat(vmodels)
- var name = node.name
- elem.removeAttribute(name) //removeAttributeNodeä¸ä¼šåˆ·æ–°[ms-controller]æ ·å¼è§„则
- avalon(elem).removeClass(name)
- createSignalTower(elem, newVmodel)
- }
- scanAttr(elem, vmodels) //扫æ特性节点
-}
-var rhasHtml = /\|\s*html(?:\b|$)/,
- r11a = /\|\|/g,
- rlt = /&lt;/g,
- rgt = /&gt;/g,
- rstringLiteral = /(['"])(\\\1|.)+?\1/g
-function getToken(value) {
- if (value.indexOf("|") > 0) {
- var scapegoat = value.replace(rstringLiteral, function (_) {
- return Array(_.length + 1).join("1")// jshint ignore:line
- })
- var index = scapegoat.replace(r11a, "\u1122\u3344").indexOf("|") //干掉所有短路或
- if (index > -1) {
- return {
- filters: value.slice(index),
- value: value.slice(0, index),
- expr: true
- }
- }
- }
- return {
- value: value,
- filters: "",
- expr: true
- }
-}
-
-function scanExpr(str) {
- var tokens = [],
- value, start = 0,
- stop
- do {
- stop = str.indexOf(openTag, start)
- if (stop === -1) {
- break
- }
- value = str.slice(start, stop)
- if (value) { // {{ 左边的文本
- tokens.push({
- value: value,
- filters: "",
- expr: false
- })
- }
- start = stop + openTag.length
- stop = str.indexOf(closeTag, start)
- if (stop === -1) {
- break
- }
- value = str.slice(start, stop)
- if (value) { //处ç†{{ }}æ’值表达å¼
- tokens.push(getToken(value, start))
- }
- start = stop + closeTag.length
- } while (1)
- value = str.slice(start)
- if (value) { //}} å³è¾¹çš„文本
- tokens.push({
- value: value,
- expr: false,
- filters: ""
- })
- }
- return tokens
-}
-
-function scanText(textNode, vmodels, index) {
- var bindings = []
- tokens = scanExpr(textNode.data)
- if (tokens.length) {
- for (var i = 0; token = tokens[i++]; ) {
- var node = DOC.createTextNode(token.value) //将文本转æ¢ä¸ºæ–‡æœ¬èŠ‚点,并替æ¢åŽŸæ¥çš„文本节点
- if (token.expr) {
- token.value = token.value.replace(roneTime, function () {
- token.oneTime = true
- return ""
- })
- token.type = "text"
- token.element = node
- token.filters = token.filters.replace(rhasHtml, function (a, b,c) {
- token.type = "html"
- return ""
- })// jshint ignore:line
- token.pos = index * 1000 + i
- bindings.push(token) //收集带有æ’值表达å¼çš„文本
- }
- avalonFragment.appendChild(node)
- }
- textNode.parentNode.replaceChild(avalonFragment, textNode)
- if (bindings.length)
- executeBindings(bindings, vmodels)
- }
-}
-
-var bools = ["autofocus,autoplay,async,allowTransparency,checked,controls",
- "declare,disabled,defer,defaultChecked,defaultSelected",
- "contentEditable,isMap,loop,multiple,noHref,noResize,noShade",
- "open,readOnly,selected"
-].join(",")
-var boolMap = {}
-bools.replace(rword, function(name) {
- boolMap[name.toLowerCase()] = name
-})
-
-var propMap = { //属性å映射
- "accept-charset": "acceptCharset",
- "char": "ch",
- "charoff": "chOff",
- "class": "className",
- "for": "htmlFor",
- "http-equiv": "httpEquiv"
-}
-
-var anomaly = ["accessKey,bgColor,cellPadding,cellSpacing,codeBase,codeType,colSpan",
- "dateTime,defaultValue,frameBorder,longDesc,maxLength,marginWidth,marginHeight",
- "rowSpan,tabIndex,useMap,vSpace,valueType,vAlign"
-].join(",")
-anomaly.replace(rword, function(name) {
- propMap[name.toLowerCase()] = name
-})
-
-var rnoscripts = /<noscript.*?>(?:[\s\S]+?)<\/noscript>/img
-var rnoscriptText = /<noscript.*?>([\s\S]+?)<\/noscript>/im
-
-var getXHR = function() {
- return new(window.XMLHttpRequest || ActiveXObject)("Microsoft.XMLHTTP") // jshint ignore:line
-}
-
-var templatePool = avalon.templateCache = {}
-
-bindingHandlers.attr = function(data, vmodels) {
- var text = data.value.trim(),
- simple = true
- if (text.indexOf(openTag) > -1 && text.indexOf(closeTag) > 2) {
- simple = false
- if (rexpr.test(text) && RegExp.rightContext === "" && RegExp.leftContext === "") {
- simple = true
- text = RegExp.$1
- }
- }
- if (data.type === "include") {
- var elem = data.element
- data.includeRendered = getBindingCallback(elem, "data-include-rendered", vmodels)
- data.includeLoaded = getBindingCallback(elem, "data-include-loaded", vmodels)
- var outer = data.includeReplace = !! avalon(elem).data("includeReplace")
- if (avalon(elem).data("includeCache")) {
- data.templateCache = {}
- }
- data.startInclude = DOC.createComment("ms-include")
- data.endInclude = DOC.createComment("ms-include-end")
- if (outer) {
- data.element = data.startInclude
- elem.parentNode.insertBefore(data.startInclude, elem)
- elem.parentNode.insertBefore(data.endInclude, elem.nextSibling)
- } else {
- elem.insertBefore(data.startInclude, elem.firstChild)
- elem.appendChild(data.endInclude)
- }
- }
- data.handlerName = "attr" //handleName用于处ç†å¤šç§ç»‘定共用åŒä¸€ç§bindingExecutor的情况
- parseExprProxy(text, vmodels, data, (simple ? 0 : scanExpr(data.value)))
-}
-
-bindingExecutors.attr = function(val, elem, data) {
- var method = data.type,
- attrName = data.param
- if (method === "css") {
- avalon(elem).css(attrName, val)
- } else if (method === "attr") {
-
- // ms-attr-class="xxx" vm.xxx="aaa bbb ccc"将元素的className设置为aaa bbb ccc
- // ms-attr-class="xxx" vm.xxx=false 清空元素的所有类å
- // ms-attr-name="yyy" vm.yyy="ooo" 为元素设置name属性
- var toRemove = (val === false) || (val === null) || (val === void 0)
-
- if (!W3C && propMap[attrName]) { //æ—§å¼IE下需è¦è¿›è¡Œå字映射
- attrName = propMap[attrName]
- }
- var bool = boolMap[attrName]
- if (typeof elem[bool] === "boolean") {
- elem[bool] = !! val //布尔属性必须使用el.xxx = true|falseæ–¹å¼è®¾å€¼
- if (!val) { //如果为false, IE全系列下相当于setAttribute(xxx,''),会影å“到样å¼,需è¦è¿›ä¸€æ­¥å¤„ç†
- toRemove = true
- }
- }
- if (toRemove) {
- return elem.removeAttribute(attrName)
- }
- //SVGåªèƒ½ä½¿ç”¨setAttribute(xxx, yyy), VMLåªèƒ½ä½¿ç”¨elem.xxx = yyy ,HTML的固有属性必须elem.xxx = yyy
- var isInnate = rsvg.test(elem) ? false : (DOC.namespaces && isVML(elem)) ? true : attrName in elem.cloneNode(false)
- if (isInnate) {
- elem[attrName] = val+""
- } else {
- elem.setAttribute(attrName, val)
- }
- } else if (method === "include" && val) {
- var vmodels = data.vmodels
- var rendered = data.includeRendered
- var loaded = data.includeLoaded
- var replace = data.includeReplace
- var target = replace ? elem.parentNode : elem
- var scanTemplate = function(text) {
- if (loaded) {
- var newText = loaded.apply(target, [text].concat(vmodels))
- if (typeof newText === "string")
- text = newText
- }
- if (rendered) {
- checkScan(target, function() {
- rendered.call(target)
- }, NaN)
- }
- var lastID = data.includeLastID
- if (data.templateCache && lastID && lastID !== val) {
- var lastTemplate = data.templateCache[lastID]
- if (!lastTemplate) {
- lastTemplate = data.templateCache[lastID] = DOC.createElement("div")
- ifGroup.appendChild(lastTemplate)
- }
- }
- data.includeLastID = val
- while (true) {
- var node = data.startInclude.nextSibling
- if (node && node !== data.endInclude) {
- target.removeChild(node)
- if (lastTemplate)
- lastTemplate.appendChild(node)
- } else {
- break
- }
- }
- var dom = getTemplateNodes(data, val, text)
- var nodes = avalon.slice(dom.childNodes)
- target.insertBefore(dom, data.endInclude)
- scanNodeArray(nodes, vmodels)
- }
-
- if (data.param === "src") {
- if (typeof templatePool[val] === "string") {
- avalon.nextTick(function() {
- scanTemplate(templatePool[val])
- })
- } else if (Array.isArray(templatePool[val])) { //#805 防止在循环绑定中å‘出许多相åŒçš„请求
- templatePool[val].push(scanTemplate)
- } else {
- var xhr = getXHR()
- xhr.onreadystatechange = function() {
- if (xhr.readyState === 4) {
- var s = xhr.status
- if (s >= 200 && s < 300 || s === 304 || s === 1223) {
- var text = xhr.responseText
- for (var f = 0, fn; fn = templatePool[val][f++];) {
- fn(text)
- }
- templatePool[val] = text
- }
- }
- }
- templatePool[val] = [scanTemplate]
- xhr.open("GET", val, true)
- if ("withCredentials" in xhr) {
- xhr.withCredentials = true
- }
- xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest")
- xhr.send(null)
- }
- } else {
- //IE系列与够新的标准æµè§ˆå™¨æ”¯æŒé€šè¿‡IDå–得元素(firefox14+)
- //http://tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/
- var el = val && val.nodeType === 1 ? val : DOC.getElementById(val)
- if (el) {
- if (el.tagName === "NOSCRIPT" && !(el.innerHTML || el.fixIE78)) { //IE7-8 innerText,innerHTML都无法å–得其内容,IE6能å–å¾—å…¶innerHTML
- xhr = getXHR() //IE9-11与chromeçš„innerHTML会得到转义的内容,它们的innerTextå¯ä»¥
- xhr.open("GET", location, false) //谢谢Nodejs 乱炖群 深圳-纯属虚构
- xhr.send(null)
- //http://bbs.csdn.net/topics/390349046?page=1#post-393492653
- var noscripts = DOC.getElementsByTagName("noscript")
- var array = (xhr.responseText || "").match(rnoscripts) || []
- var n = array.length
- for (var i = 0; i < n; i++) {
- var tag = noscripts[i]
- if (tag) { //IE6-8中noscript标签的innerHTML,innerText是åªè¯»çš„
- tag.style.display = "none" //http://haslayout.net/css/noscript-Ghost-Bug
- tag.fixIE78 = (array[i].match(rnoscriptText) || ["", "&nbsp;"])[1]
- }
- }
- }
- avalon.nextTick(function() {
- scanTemplate(el.fixIE78 || el.value || el.innerText || el.innerHTML)
- })
- }
- }
- } else {
- if (!root.hasAttribute && typeof val === "string" && (method === "src" || method === "href")) {
- val = val.replace(/&amp;/g, "&") //处ç†IE67自动转义的问题
- }
- elem[method] = val
- if (window.chrome && elem.tagName === "EMBED") {
- var parent = elem.parentNode //#525 chrome1-37下embed标签动æ€è®¾ç½®srcä¸èƒ½å‘生请求
- var comment = document.createComment("ms-src")
- parent.replaceChild(comment, elem)
- parent.replaceChild(elem, comment)
- }
- }
-}
-
-function getTemplateNodes(data, id, text) {
- var div = data.templateCache && data.templateCache[id]
- if (div) {
- var dom = DOC.createDocumentFragment(),
- firstChild
- while (firstChild = div.firstChild) {
- dom.appendChild(firstChild)
- }
- return dom
- }
- return avalon.parseHTML(text)
-}
-
-//这几个指令都å¯ä»¥ä½¿ç”¨æ’值表达å¼ï¼Œå¦‚ms-src="aaa/{{b}}/{{c}}.html"
-"title,alt,src,value,css,include,href".replace(rword, function(name) {
- bindingHandlers[name] = bindingHandlers.attr
-})
-//æ ¹æ®VM的属性值或表达å¼çš„值切æ¢ç±»å,ms-class="xxx yyy zzz:flag"
-//http://www.cnblogs.com/rubylouvre/archive/2012/12/17/2818540.html
-bindingHandlers["class"] = function(data, vmodels) {
- var oldStyle = data.param,
- text = data.value,
- rightExpr
- data.handlerName = "class"
- if (!oldStyle || isFinite(oldStyle)) {
- data.param = "" //去掉数字
- var noExpr = text.replace(rexprg, function(a) {
- return a.replace(/./g, "0")
- //return Math.pow(10, a.length - 1) //å°†æ’值表达å¼æ’å…¥10çš„N-1次方æ¥å ä½
- })
- var colonIndex = noExpr.indexOf(":") //å–得第一个冒å·çš„ä½ç½®
- if (colonIndex === -1) { // 比如 ms-class="aaa bbb ccc" 的情况
- var className = text
- } else { // 比如 ms-class-1="ui-state-active:checked" 的情况
- className = text.slice(0, colonIndex)
- rightExpr = text.slice(colonIndex + 1)
- parseExpr(rightExpr, vmodels, data) //决定是添加还是删除
- if (!data.evaluator) {
- log("debug: ms-class '" + (rightExpr || "").trim() + "' ä¸å­˜åœ¨äºŽVM中")
- return false
- } else {
- data._evaluator = data.evaluator
- data._args = data.args
- }
- }
- var hasExpr = rexpr.test(className) //比如ms-class="width{{w}}"的情况
- if (!hasExpr) {
- data.immobileClass = className
- }
- parseExprProxy("", vmodels, data, (hasExpr ? scanExpr(className) : 0))
- } else {
- data.immobileClass = data.oldStyle = data.param
- parseExprProxy(text, vmodels, data)
- }
-}
-
-bindingExecutors["class"] = function(val, elem, data) {
- var $elem = avalon(elem),
- method = data.type
- if (method === "class" && data.oldStyle) { //如果是旧风格
- $elem.toggleClass(data.oldStyle, !! val)
- } else {
- //如果存在冒å·å°±æœ‰æ±‚值函数
- data.toggleClass = data._evaluator ? !! data._evaluator.apply(elem, data._args) : true
- data.newClass = data.immobileClass || val
- if (data.oldClass && data.newClass !== data.oldClass) {
- $elem.removeClass(data.oldClass)
- }
- data.oldClass = data.newClass
- switch (method) {
- case "class":
- $elem.toggleClass(data.newClass, data.toggleClass)
- break
- case "hover":
- case "active":
- if (!data.hasBindEvent) { //ç¡®ä¿åªç»‘定一次
- var activate = "mouseenter" //在移出移入时切æ¢ç±»å
- var abandon = "mouseleave"
- if (method === "active") { //在èšç„¦å¤±ç„¦ä¸­åˆ‡æ¢ç±»å
- elem.tabIndex = elem.tabIndex || -1
- activate = "mousedown"
- abandon = "mouseup"
- var fn0 = $elem.bind("mouseleave", function() {
- data.toggleClass && $elem.removeClass(data.newClass)
- })
- }
- var fn1 = $elem.bind(activate, function() {
- data.toggleClass && $elem.addClass(data.newClass)
- })
- var fn2 = $elem.bind(abandon, function() {
- data.toggleClass && $elem.removeClass(data.newClass)
- })
- data.rollback = function() {
- $elem.unbind("mouseleave", fn0)
- $elem.unbind(activate, fn1)
- $elem.unbind(abandon, fn2)
- }
- data.hasBindEvent = true
- }
- break;
- }
- }
-}
-
-"hover,active".replace(rword, function(method) {
- bindingHandlers[method] = bindingHandlers["class"]
-})
-//ms-controller绑定已ç»åœ¨scanTag 方法中实现
-//ms-css绑定已由ms-attr绑定实现
-
-
-// bindingHandlers.data 定义在if.js
-bindingExecutors.data = function(val, elem, data) {
- var key = "data-" + data.param
- if (val && typeof val === "object") {
- elem[key] = val
- } else {
- elem.setAttribute(key, String(val))
- }
-}
-//åŒå·¥ç»‘定
-var duplexBinding = bindingHandlers.duplex = function(data, vmodels) {
- var elem = data.element,
- hasCast
- parseExprProxy(data.value, vmodels, data, 0, 1)
-
- data.changed = getBindingCallback(elem, "data-duplex-changed", vmodels) || noop
- if (data.evaluator && data.args) {
- var params = []
- var casting = oneObject("string,number,boolean,checked")
- if (elem.type === "radio" && data.param === "") {
- data.param = "checked"
- }
- if (elem.msData) {
- elem.msData["ms-duplex"] = data.value
- }
- data.param.replace(/\w+/g, function(name) {
- if (/^(checkbox|radio)$/.test(elem.type) && /^(radio|checked)$/.test(name)) {
- if (name === "radio")
- log("ms-duplex-radioå·²ç»æ›´å为ms-duplex-checked")
- name = "checked"
- data.isChecked = true
- }
- if (name === "bool") {
- name = "boolean"
- log("ms-duplex-boolå·²ç»æ›´å为ms-duplex-boolean")
- } else if (name === "text") {
- name = "string"
- log("ms-duplex-textå·²ç»æ›´å为ms-duplex-string")
- }
- if (casting[name]) {
- hasCast = true
- }
- avalon.Array.ensure(params, name)
- })
- if (!hasCast) {
- params.push("string")
- }
- data.param = params.join("-")
- data.bound = function(type, callback) {
- if (elem.addEventListener) {
- elem.addEventListener(type, callback, false)
- } else {
- elem.attachEvent("on" + type, callback)
- }
- var old = data.rollback
- data.rollback = function() {
- elem.avalonSetter = null
- avalon.unbind(elem, type, callback)
- old && old()
- }
- }
- for (var i in avalon.vmodels) {
- var v = avalon.vmodels[i]
- v.$fire("avalon-ms-duplex-init", data)
- }
- var cpipe = data.pipe || (data.pipe = pipe)
- cpipe(null, data, "init")
- var tagName = elem.tagName
- duplexBinding[tagName] && duplexBinding[tagName](elem, data.evaluator.apply(null, data.args), data)
- }
-}
-//ä¸å­˜åœ¨ bindingExecutors.duplex
-
- function fixNull(val) {
- return val == null ? "" : val
- }
-avalon.duplexHooks = {
- checked: {
- get: function(val, data) {
- return !data.element.oldValue
- }
- },
- string: {
- get: function(val) { //åŒæ­¥åˆ°VM
- return val
- },
- set: fixNull
- },
- "boolean": {
- get: function(val) {
- return val === "true"
- },
- set: fixNull
- },
- number: {
- get: function(val, data) {
- var number = parseFloat(val)
- if (-val === -number) {
- return number
- }
- var arr = /strong|medium|weak/.exec(data.element.getAttribute("data-duplex-number")) || ["medium"]
- switch (arr[0]) {
- case "strong":
- return 0
- case "medium":
- return val === "" ? "" : 0
- case "weak":
- return val
- }
- },
- set: fixNull
- }
-}
-
-function pipe(val, data, action, e) {
- data.param.replace(/\w+/g, function(name) {
- var hook = avalon.duplexHooks[name]
- if (hook && typeof hook[action] === "function") {
- val = hook[action](val, data)
- }
- })
- return val
-}
-
-var TimerID, ribbon = []
-
- avalon.tick = function(fn) {
- if (ribbon.push(fn) === 1) {
- TimerID = setInterval(ticker, 60)
- }
- }
-
- function ticker() {
- for (var n = ribbon.length - 1; n >= 0; n--) {
- var el = ribbon[n]
- if (el() === false) {
- ribbon.splice(n, 1)
- }
- }
- if (!ribbon.length) {
- clearInterval(TimerID)
- }
- }
-
-var watchValueInTimer = noop
-var rmsinput = /text|password|hidden/
-new function() { // jshint ignore:line
- try { //#272 IE9-IE11, firefox
- var setters = {}
- var aproto = HTMLInputElement.prototype
- var bproto = HTMLTextAreaElement.prototype
- function newSetter(value) { // jshint ignore:line
- setters[this.tagName].call(this, value)
- if (rmsinput.test(this.type) && !this.msFocus && this.avalonSetter) {
- this.avalonSetter()
- }
- }
- var inputProto = HTMLInputElement.prototype
- Object.getOwnPropertyNames(inputProto) //æ•…æ„引å‘IE6-8ç­‰æµè§ˆå™¨æŠ¥é”™
- setters["INPUT"] = Object.getOwnPropertyDescriptor(aproto, "value").set
-
- Object.defineProperty(aproto, "value", {
- set: newSetter
- })
- setters["TEXTAREA"] = Object.getOwnPropertyDescriptor(bproto, "value").set
- Object.defineProperty(bproto, "value", {
- set: newSetter
- })
- } catch (e) {
- //在chrome 43中 ms-duplex终于ä¸éœ€è¦ä½¿ç”¨å®šæ—¶å™¨å®žçŽ°åŒå‘绑定了
- // http://updates.html5rocks.com/2015/04/DOM-attributes-now-on-the-prototype
- // https://docs.google.com/document/d/1jwA8mtClwxI-QJuHT7872Z0pxpZz8PBkf2bGAbsUtqs/edit?pli=1
- watchValueInTimer = avalon.tick
- }
-} // jshint ignore:line
-if (IEVersion) {
- avalon.bind(DOC, "selectionchange", function(e) {
- var el = DOC.activeElement
- if (el && typeof el.avalonSetter === "function") {
- el.avalonSetter()
- }
- })
-}
-
-//处ç†radio, checkbox, text, textarea, password
-duplexBinding.INPUT = function(element, evaluator, data) {
- var $type = element.type,
- bound = data.bound,
- $elem = avalon(element),
- composing = false
-
- function callback(value) {
- data.changed.call(this, value, data)
- }
-
- function compositionStart() {
- composing = true
- }
-
- function compositionEnd() {
- composing = false
- }
- //当valueå˜åŒ–时改å˜model的值
- var updateVModel = function() {
- if (composing) //处ç†ä¸­æ–‡è¾“入法在minlengh下引å‘çš„BUG
- return
- var val = element.oldValue = element.value //防止递归调用形æˆæ­»å¾ªçŽ¯
- var lastValue = data.pipe(val, data, "get")
- if ($elem.data("duplexObserve") !== false) {
- evaluator(lastValue)
- callback.call(element, lastValue)
- if ($elem.data("duplex-focus")) {
- avalon.nextTick(function() {
- element.focus()
- })
- }
- }
- }
- //当modelå˜åŒ–æ—¶,它就会改å˜value的值
- data.handler = function() {
- var val = data.pipe(evaluator(), data, "set") + "" //fix #673
- if (val !== element.oldValue) {
- element.value = val
- }
- }
- if (data.isChecked || $type === "radio") {
- var IE6 = IEVersion === 6
- updateVModel = function() {
- if ($elem.data("duplexObserve") !== false) {
- var lastValue = data.pipe(element.value, data, "get")
- evaluator(lastValue)
- callback.call(element, lastValue)
- }
- }
- data.handler = function() {
- var val = evaluator()
- var checked = data.isChecked ? !! val : val + "" === element.value
- element.oldValue = checked
- if (IE6) {
- setTimeout(function() {
- //IE8 checkbox, radio是使用defaultChecked控制选中状æ€ï¼Œ
- //并且è¦å…ˆè®¾ç½®defaultCheckedåŽè®¾ç½®checked
- //并且必须设置延迟
- element.defaultChecked = checked
- element.checked = checked
- }, 31)
- } else {
- element.checked = checked
- }
- }
- bound("click", updateVModel)
- } else if ($type === "checkbox") {
- updateVModel = function() {
- if ($elem.data("duplexObserve") !== false) {
- var method = element.checked ? "ensure" : "remove"
- var array = evaluator()
- if (!Array.isArray(array)) {
- log("ms-duplex应用于checkbox上è¦å¯¹åº”一个数组")
- array = [array]
- }
- var val = data.pipe(element.value, data, "get")
- avalon.Array[method](array, val)
- callback.call(element, array)
- }
- }
-
- data.handler = function() {
- var array = [].concat(evaluator()) //强制转æ¢ä¸ºæ•°ç»„
- var val = data.pipe(element.value, data, "get")
- element.checked = array.indexOf(val) > -1
- }
- bound(W3C ? "change" : "click", updateVModel)
- } else {
- var events = element.getAttribute("data-duplex-event") || "input"
- if (element.attributes["data-event"]) {
- log("data-event指令已ç»åºŸå¼ƒï¼Œè¯·æ”¹ç”¨data-duplex-event")
- }
-
- function delay(e) { // jshint ignore:line
- setTimeout(function() {
- updateVModel(e)
- })
- }
- events.replace(rword, function(name) {
- switch (name) {
- case "input":
- if (!IEVersion) { // W3C
- bound("input", updateVModel)
- //éžIEæµè§ˆå™¨æ‰ç”¨è¿™ä¸ª
- bound("compositionstart", compositionStart)
- bound("compositionend", compositionEnd)
- bound("DOMAutoComplete", updateVModel)
- } else { //onpropertychange事件无法区分是程åºè§¦å‘还是用户触å‘
- // IE下通过selectionchange事件监å¬IE9+点击inputå³è¾¹çš„X的清空行为,åŠç²˜è´´ï¼Œå‰ªåˆ‡ï¼Œåˆ é™¤è¡Œä¸º
- if (IEVersion > 8) {
- bound("input", updateVModel) //IE9使用propertychange无法监å¬ä¸­æ–‡è¾“入改动
- } else {
- bound("propertychange", function(e) { //IE6-8下第一次修改时ä¸ä¼šè§¦å‘,需è¦ä½¿ç”¨keydown或selectionchange修正
- if (e.propertyName === "value") {
- updateVModel()
- }
- })
- }
- bound("dragend", delay)
- //http://www.cnblogs.com/rubylouvre/archive/2013/02/17/2914604.html
- //http://www.matts411.com/post/internet-explorer-9-oninput/
- }
- break
- default:
- bound(name, updateVModel)
- break
- }
- })
- bound("focus", function() {
- element.msFocus = true
- })
- bound("blur", function() {
- element.msFocus = false
- })
-
- if (rmsinput.test($type)) {
- watchValueInTimer(function() {
- if (root.contains(element)) {
- if (!element.msFocus && element.oldValue !== element.value) {
- updateVModel()
- }
- } else if (!element.msRetain) {
- return false
- }
- })
- }
-
- element.avalonSetter = updateVModel //#765
- }
-
- element.oldValue = element.value
- avalon.injectBinding(data)
- callback.call(element, element.value)
-}
-duplexBinding.TEXTAREA = duplexBinding.INPUT
-duplexBinding.SELECT = function(element, evaluator, data) {
- var $elem = avalon(element)
-
- function updateVModel() {
- if ($elem.data("duplexObserve") !== false) {
- var val = $elem.val() //字符串或字符串数组
- if (Array.isArray(val)) {
- val = val.map(function(v) {
- return data.pipe(v, data, "get")
- })
- } else {
- val = data.pipe(val, data, "get")
- }
- if (val + "" !== element.oldValue) {
- evaluator(val)
- }
- data.changed.call(element, val, data)
- }
- }
- data.handler = function() {
- var val = evaluator()
- val = val && val.$model || val
- if (Array.isArray(val)) {
- if (!element.multiple) {
- log("ms-duplex在<select multiple=true>上è¦æ±‚对应一个数组")
- }
- } else {
- if (element.multiple) {
- log("ms-duplex在<select multiple=false>ä¸èƒ½å¯¹åº”一个数组")
- }
- }
- //å¿…é¡»å˜æˆå­—符串åŽæ‰èƒ½æ¯”较
- val = Array.isArray(val) ? val.map(String) : val + ""
- if (val + "" !== element.oldValue) {
- $elem.val(val)
- element.oldValue = val + ""
- }
- }
- data.bound("change", updateVModel)
- element.msCallback = function() {
- avalon.injectBinding(data)
- data.changed.call(element, evaluator(), data)
- }
-}
-// bindingHandlers.html 定义在if.js
-bindingExecutors.html = function (val, elem, data) {
- var isHtmlFilter = elem.nodeType !== 1
- var parent = isHtmlFilter ? elem.parentNode : elem
- if (!parent)
- return
- val = val == null ? "" : val
- if (data.oldText !== val) {
- data.oldText = val
- } else {
- return
- }
- if (elem.nodeType === 3) {
- var signature = generateID("html")
- parent.insertBefore(DOC.createComment(signature), elem)
- data.element = DOC.createComment(signature + ":end")
- parent.replaceChild(data.element, elem)
- elem = data.element
- }
- if (typeof val !== "object") {//string, number, boolean
- var fragment = avalon.parseHTML(String(val))
- } else if (val.nodeType === 11) { //å°†val转æ¢ä¸ºæ–‡æ¡£ç¢Žç‰‡
- fragment = val
- } else if (val.nodeType === 1 || val.item) {
- var nodes = val.nodeType === 1 ? val.childNodes : val.item
- fragment = avalonFragment.cloneNode(true)
- while (nodes[0]) {
- fragment.appendChild(nodes[0])
- }
- }
-
- nodes = avalon.slice(fragment.childNodes)
- //æ’å…¥å ä½ç¬¦, 如果是过滤器,需è¦æœ‰èŠ‚制地移除指定的数é‡,如果是html指令,直接清空
- if (isHtmlFilter) {
- var endValue = elem.nodeValue.slice(0, -4)
- while (true) {
- var node = elem.previousSibling
- if (!node || node.nodeType === 8 && node.nodeValue === endValue) {
- break
- } else {
- parent.removeChild(node)
- }
- }
- parent.insertBefore(fragment, elem)
- } else {
- avalon.clearHTML(elem).appendChild(fragment)
- }
- scanNodeArray(nodes, data.vmodels)
-}
-bindingHandlers["if"] =
- bindingHandlers.data =
- bindingHandlers.text =
- bindingHandlers.html =
- function(data, vmodels) {
- parseExprProxy(data.value, vmodels, data)
-}
-
-bindingExecutors["if"] = function(val, elem, data) {
- try {
- if(!elem.parentNode) return
- } catch(e) {return}
- if (val) { //æ’回DOMæ ‘
- if (elem.nodeType === 8) {
- elem.parentNode.replaceChild(data.template, elem)
- // animate.enter(data.template, elem.parentNode)
- elem = data.element = data.template //这时å¯èƒ½ä¸ºnull
- }
- if (elem.getAttribute(data.name)) {
- elem.removeAttribute(data.name)
- scanAttr(elem, data.vmodels)
- }
- data.rollback = null
- } else { //移出DOM树,并用注释节点å æ®åŽŸä½ç½®
- if (elem.nodeType === 1) {
- var node = data.element = DOC.createComment("ms-if")
- elem.parentNode.replaceChild(node, elem)
- // animate.leave(elem, node.parentNode, node)
- data.template = elem //元素节点
- ifGroup.appendChild(elem)
- data.rollback = function() {
- if (elem.parentNode === ifGroup) {
- ifGroup.removeChild(elem)
- }
- }
- }
- }
-}
-//ms-important绑定已ç»åœ¨scanTag 方法中实现
-//ms-include绑定已由ms-attr绑定实现
-
-var rdash = /\(([^)]*)\)/
-bindingHandlers.on = function(data, vmodels) {
- var value = data.value
- data.type = "on"
- var eventType = data.param.replace(/-\d+$/, "") // ms-on-mousemove-10
- if (typeof bindingHandlers.on[eventType + "Hook"] === "function") {
- bindingHandlers.on[eventType + "Hook"](data)
- }
- if (value.indexOf("(") > 0 && value.indexOf(")") > -1) {
- var matched = (value.match(rdash) || ["", ""])[1].trim()
- if (matched === "" || matched === "$event") { // aaa() aaa($event)当æˆaaa处ç†
- value = value.replace(rdash, "")
- }
- }
- parseExprProxy(value, vmodels, data)
-}
-
-bindingExecutors.on = function(callback, elem, data) {
- callback = function(e) {
- var fn = data.evaluator || noop
- return fn.apply(this, data.args.concat(e))
- }
- var eventType = data.param.replace(/-\d+$/, "") // ms-on-mousemove-10
- if (eventType === "scan") {
- callback.call(elem, {
- type: eventType
- })
- } else if (typeof data.specialBind === "function") {
- data.specialBind(elem, callback)
- } else {
- var removeFn = avalon.bind(elem, eventType, callback)
- }
- data.rollback = function() {
- if (typeof data.specialUnbind === "function") {
- data.specialUnbind()
- } else {
- avalon.unbind(elem, eventType, removeFn)
- }
- }
-}
-bindingHandlers.repeat = function (data, vmodels) {
- var type = data.type
- parseExprProxy(data.value, vmodels, data, 0, 1)
- data.proxies = []
- var freturn = false
- try {
- var $repeat = data.$repeat = data.evaluator.apply(0, data.args || [])
- var xtype = avalon.type($repeat)
- if (xtype !== "object" && xtype !== "array") {
- freturn = true
- avalon.log("warning:" + data.value + "åªèƒ½æ˜¯å¯¹è±¡æˆ–数组")
- }
- } catch (e) {
- freturn = true
- }
- var arr = data.value.split(".") || []
- if (arr.length > 1) {
- arr.pop()
- var n = arr[0]
- for (var i = 0, v; v = vmodels[i++]; ) {
- if (v && v.hasOwnProperty(n)) {
- var events = v[n].$events || {}
- events[subscribers] = events[subscribers] || []
- events[subscribers].push(data)
- break
- }
- }
- }
-
- var elem = data.element
- if (elem.nodeType === 1) {
- elem.removeAttribute(data.name)
- data.sortedCallback = getBindingCallback(elem, "data-with-sorted", vmodels)
- data.renderedCallback = getBindingCallback(elem, "data-" + type + "-rendered", vmodels)
- var signature = generateID(type)
- var start = DOC.createComment(signature)
- var end = DOC.createComment(signature + ":end")
- data.signature = signature
- data.template = avalonFragment.cloneNode(false)
- if (type === "repeat") {
- var parent = elem.parentNode
- parent.replaceChild(end, elem)
- parent.insertBefore(start, end)
- data.template.appendChild(elem)
- } else {
- while (elem.firstChild) {
- data.template.appendChild(elem.firstChild)
- }
- elem.appendChild(start)
- elem.appendChild(end)
- }
- data.element = end
- data.handler = bindingExecutors.repeat
- data.rollback = function () {
- var elem = data.element
- if (!elem)
- return
- data.handler("clear")
- }
- }
-
- if (freturn) {
- return
- }
-
- data.$outer = {}
- var check0 = "$key"
- var check1 = "$val"
- if (Array.isArray($repeat)) {
- check0 = "$first"
- check1 = "$last"
- }
-
- for (i = 0; v = vmodels[i++]; ) {
- if (v.hasOwnProperty(check0) && v.hasOwnProperty(check1)) {
- data.$outer = v
- break
- }
- }
- var $events = $repeat.$events
- var $list = ($events || {})[subscribers]
- injectDependency($list, data)
- if (xtype === "object") {
- data.$with = true
- $repeat.$proxy || ($repeat.$proxy = {})
- data.handler("append", $repeat)
- } else if ($repeat.length) {
- data.handler("add", 0, $repeat.length)
- }
-}
-
-bindingExecutors.repeat = function (method, pos, el) {
- if (!method && this.$with) {
- method = "append"
- var flag = "update"
- }
- if (method) {
- var data = this, start, fragment
- var end = data.element
- var comments = getComments(data)
- var parent = end.parentNode
- var proxies = data.proxies
- var transation = avalonFragment.cloneNode(false)
- switch (method) {
- case "add": //在posä½ç½®åŽæ·»åŠ el数组(pos为æ’å…¥ä½ç½®,el为è¦æ’入的个数)
- var n = pos + el
- var fragments = []
- for (var i = pos; i < n; i++) {
- var proxy = eachProxyAgent(i, data)
- proxies.splice(i, 0, proxy)
- shimController(data, transation, proxy, fragments)
- }
- var now = new Date() - 0
- avalon.optimize = avalon.optimize || now
- for (i = 0; fragment = fragments[i++]; ) {
- scanNodeArray(fragment.nodes, fragment.vmodels)
- fragment.nodes = fragment.vmodels = null
- }
- if (avalon.optimize === now) {
- avalon.optimize = null
- }
- parent.insertBefore(transation, comments[pos] || end)
- avalon.profile("æ’å…¥æ“作花费了 " + (new Date - now))
- break
- case "del": //å°†posåŽçš„el个元素删掉(pos, el都是数字)
- sweepNodes(comments[pos], comments[pos + el] || end)
- var removed = proxies.splice(pos, el)
- recycleProxies(removed, "each")
- break
- case "clear":
- start = comments[0]
- if (start) {
- sweepNodes(start, end)
- if (data.$with) {
- parent.insertBefore(start, end)
- }
- }
- recycleProxies(proxies, "each")
- break
- case "move":
- start = comments[0]
- if (start) {
- var signature = start.nodeValue
- var rooms = []
- var room = [],
- node
- sweepNodes(start, end, function () {
- room.unshift(this)
- if (this.nodeValue === signature) {
- rooms.unshift(room)
- room = []
- }
- })
- sortByIndex(rooms, pos)
- sortByIndex(proxies, pos)
- while (room = rooms.shift()) {
- while (node = room.shift()) {
- transation.appendChild(node)
- }
- }
- parent.insertBefore(transation, end)
- }
- break
- case "index": //å°†proxies中的第pos个起的所有元素é‡æ–°ç´¢å¼•
- var last = proxies.length - 1
- for (; el = proxies[pos]; pos++) {
- el.$index = pos
- el.$first = pos === 0
- el.$last = pos === last
- }
- return
- case "set": //å°†proxies中的第pos个元素的VM设置为el(pos为数字,elä»»æ„)
- proxy = proxies[pos]
- if (proxy) {
- fireDependencies(proxy.$events[data.param || "el"])
- }
- break
- case "append":
- var object = data.$repeat //原æ¥ç¬¬2å‚数, 被循环对象
- var oldProxy = object.$proxy //代ç†å¯¹è±¡ç»„æˆçš„hash
- var keys = []
- now = new Date() - 0
- avalon.optimize = avalon.optimize || now
- if (flag === "update") {
- if (!data.evaluator) {
- parseExprProxy(data.value, data.vmodels, data, 0, 1)
- }
- object = data.$repeat = data.evaluator.apply(0, data.args || [])
- object.$proxy = oldProxy
- }
- var pool = object.$proxy || {}
- removed = []
- var nodes = data.element.parentNode.childNodes
- var add = false
- for (i = 0; node = nodes[i++]; ) {
- if (node.nodeValue === data.signature) {
- add = true
- } else if (node.nodeValue === data.signature + ":end") {
- add = false
- }
- if (add) {
- removed.push(node)
- }
- }
-
- var indexNode = [], item
- var keyIndex = data.keyIndex || (data.keyIndex = {})
- //将现有的节点全部移出DOM树
- for ( i = 0; i < removed.length; i++) {
- el = removed[i]
- if (el.nodeValue === data.signature) {
- item = avalonFragment.cloneNode(false)
- indexNode.push(item)
- }
- item.appendChild(el)
- }
-
-
- for (var key in object) { //当å‰å¯¹è±¡çš„所有键å
- if (object.hasOwnProperty(key) && key !== "hasOwnProperty" && key !== "$proxy") {
- keys.push(key)
- }
- }
-
- for (var i = 0; key = keys[i++]; ) {
- if (!pool.hasOwnProperty(key)) {//添加缺失的代ç†VM
- pool[key] = withProxyAgent(pool[key], key, data)
- } else {
- pool[key].$val = object[key]
- }
- }
-
- for ( key in pool) {
- if (keys.indexOf(key) === -1) {//删除没用的代ç†VM
- proxyRecycler(pool[key], withProxyPool) //去掉之å‰çš„代ç†VM
- delete pool[key]
- }
- }
- var fragments = []
- var renderKeys = keys //需è¦æ¸²æŸ“到DOM树去的键å
- var end = data.element
- if (data.sortedCallback) { //如果有回调,则让它们排åº
- var keys2 = data.sortedCallback.call(parent, keys)
- if (keys2 && Array.isArray(keys2)) {
- renderKeys = keys2
- }
- }
-
- for (i = 0; i < renderKeys.length; i++) {
- key = renderKeys[i]
- if (typeof keyIndex[key] === "number") {
- transation.appendChild(indexNode[keyIndex[key]])
- fragments.push({})
- } else {
- shimController(data, transation, pool[key], fragments)
- }
- }
-
- for (i = 0; i < renderKeys.length; i++) {
- keyIndex[renderKeys[i]] = i
- }
-
- for (i = 0; fragment = fragments[i++]; ) {
- if (fragment.nodes) {
- scanNodeArray(fragment.nodes, fragment.vmodels)
- fragment.nodes = fragment.vmodels = null
- }
- }
- if (avalon.optimize === now) {
- avalon.optimize = null
- }
- parent.insertBefore(transation, end)
- avalon.profile("æ’å…¥æ“作花费了 " + (new Date - now))
- break
- }
- if (!data.$repeat || data.$repeat.hasOwnProperty("$lock")) //IE6-8 VBScript对象会报错, 有时候data.$repeatä¸å­˜åœ¨
- return
- if (method === "clear")
- method = "del"
- var callback = data.renderedCallback || noop,
- args = arguments
- if (parent.oldValue && parent.tagName === "SELECT") { //fix #503
- avalon(parent).val(parent.oldValue.split(","))
- }
- callback.apply(parent, args)
- }
-}
-"with,each".replace(rword, function (name) {
- bindingHandlers[name] = bindingHandlers.repeat
-})
-
-function shimController(data, transation, proxy, fragments) {
- var content = data.template.cloneNode(true)
- var nodes = avalon.slice(content.childNodes)
- content.insertBefore(DOC.createComment(data.signature), content.firstChild)
- transation.appendChild(content)
- var nv = [proxy].concat(data.vmodels)
- var fragment = {
- nodes: nodes,
- vmodels: nv
- }
- fragments.push(fragment)
-}
-
-function getComments(data) {
- var ret = []
- var nodes = data.element.parentNode.childNodes
- for(var i= 0, node; node = nodes[i++];){
- if(node.nodeValue === data.signature){
- ret.push( node )
- }else if(node.nodeValue === data.signature+":end"){
- break
- }
- }
- return ret
-}
-
-
-//移除掉start与end之间的节点(ä¿ç•™end)
-function sweepNodes(start, end, callback) {
- while (true) {
- var node = end.previousSibling
- if (!node)
- break
- node.parentNode.removeChild(node)
- callback && callback.call(node)
- if (node === start) {
- break
- }
- }
-}
-
-// 为ms-each,ms-with, ms-repeat会创建一个代ç†VM,
-// 通过它们ä¿æŒä¸€ä¸ªä¸‹ä¸Šæ–‡ï¼Œè®©ç”¨æˆ·èƒ½è°ƒç”¨$index,$first,$last,$remove,$key,$val,$outer等属性与方法
-// 所有代ç†VM的产生,消费,收集,存放通过xxxProxyFactory,xxxProxyAgent, recycleProxies,xxxProxyPool实现
-var withProxyPool = []
-function withProxyFactory() {
- var proxy = modelFactory({
- $key: "",
- $outer: {},
- $host: {},
- $val: {
- get: function () {
- return this.$host[this.$key]
- },
- set: function (val) {
- this.$host[this.$key] = val
- }
- }
- }, {
- $val: 1
- })
- proxy.$id = generateID("$proxy$with")
- return proxy
-}
-
-function withProxyAgent(proxy, key, data) {
- proxy = proxy || withProxyPool.pop()
- if (!proxy) {
- proxy = withProxyFactory()
- } else {
- proxy.$reinitialize()
- }
- var host = data.$repeat
- proxy.$key = key
- proxy.$host = host
- proxy.$outer = data.$outer
- if (host.$events) {
- proxy.$events.$val = host.$events[key]
- } else {
- proxy.$events = {}
- }
- return proxy
-}
-
-
-function recycleProxies(proxies) {
- eachProxyRecycler(proxies)
-}
-function eachProxyRecycler(proxies) {
- proxies.forEach(function (proxy) {
- proxyRecycler(proxy, eachProxyPool)
- })
- proxies.length = 0
-}
-
-
-var eachProxyPool = []
-function eachProxyFactory(name) {
- var source = {
- $host: [],
- $outer: {},
- $index: 0,
- $first: false,
- $last: false,
- $remove: avalon.noop
- }
- source[name] = {
- get: function () {
- var e = this.$events
- var array = e.$index
- e.$index = e[name] //#817 通过$index为el收集ä¾èµ–
- try {
- return this.$host[this.$index]
- } finally {
- e.$index = array
- }
- },
- set: function (val) {
- try {
- var e = this.$events
- var array = e.$index
- e.$index = []
- this.$host.set(this.$index, val)
- } finally {
- e.$index = array
- }
- }
- }
- var second = {
- $last: 1,
- $first: 1,
- $index: 1
- }
- var proxy = modelFactory(source, second)
- proxy.$id = generateID("$proxy$each")
- return proxy
-}
-
-function eachProxyAgent(index, data) {
- var param = data.param || "el",
- proxy
- for (var i = 0, n = eachProxyPool.length; i < n; i++) {
- var candidate = eachProxyPool[i]
- if (candidate && candidate.hasOwnProperty(param)) {
- proxy = candidate
- eachProxyPool.splice(i, 1)
- }
- }
- if (!proxy) {
- proxy = eachProxyFactory(param)
- }
- var host = data.$repeat
- var last = host.length - 1
- proxy.$index = index
- proxy.$first = index === 0
- proxy.$last = index === last
- proxy.$host = host
- proxy.$outer = data.$outer
- proxy.$remove = function () {
- return host.removeAt(proxy.$index)
- }
- return proxy
-}
-
-
-function proxyRecycler(proxy, proxyPool) {
- for (var i in proxy.$events) {
- if (Array.isArray(proxy.$events[i])) {
- proxy.$events[i].forEach(function (data) {
- if (typeof data === "object")
- disposeData(data)
- })// jshint ignore:line
- proxy.$events[i].length = 0
- }
- }
- proxy.$host = proxy.$outer = {}
- if (proxyPool.unshift(proxy) > kernel.maxRepeatSize) {
- proxyPool.pop()
- }
-}
-/*********************************************************************
- * å„ç§æŒ‡ä»¤ *
- **********************************************************************/
-//ms-skip绑定已ç»åœ¨scanTag 方法中实现
-// bindingHandlers.text 定义在if.js
-bindingExecutors.text = function(val, elem) {
- val = val == null ? "" : val //ä¸åœ¨é¡µé¢ä¸Šæ˜¾ç¤ºundefined null
- if (elem.nodeType === 3) { //绑定在文本节点上
- try { //IE对游离于DOM树外的节点赋值会报错
- elem.data = val
- } catch (e) {}
- } else { //绑定在特性节点上
- if ("textContent" in elem) {
- elem.textContent = val
- } else {
- elem.innerText = val
- }
- }
-}
-function parseDisplay(nodeName, val) {
- //用于å–得此类标签的默认display值
- var key = "_" + nodeName
- if (!parseDisplay[key]) {
- var node = DOC.createElement(nodeName)
- root.appendChild(node)
- if (W3C) {
- val = getComputedStyle(node, null).display
- } else {
- val = node.currentStyle.display
- }
- root.removeChild(node)
- parseDisplay[key] = val
- }
- return parseDisplay[key]
-}
-
-avalon.parseDisplay = parseDisplay
-
-bindingHandlers.visible = function(data, vmodels) {
- var elem = data.element
- var display = elem.style.display
- if(display === "none"){
- display = parseDisplay(elem.nodeName)
- }
- data.display = display
- parseExprProxy(data.value, vmodels, data)
-}
-
-bindingExecutors.visible = function(val, elem, data) {
- elem.style.display = val ? data.display : "none"
-}
-bindingHandlers.widget = function(data, vmodels) {
- var args = data.value.match(rword)
- var elem = data.element
- var widget = args[0]
- var id = args[1]
- if (!id || id === "$") { //没有定义或为$时,å–组件å+éšæœºæ•°
- id = generateID(widget)
- }
- var optName = args[2] || widget //没有定义,å–组件å
- var constructor = avalon.ui[widget]
- if (typeof constructor === "function") { //ms-widget="tabs,tabsAAA,optname"
- vmodels = elem.vmodels || vmodels
- for (var i = 0, v; v = vmodels[i++];) {
- if (v.hasOwnProperty(optName) && typeof v[optName] === "object") {
- var vmOptions = v[optName]
- vmOptions = vmOptions.$model || vmOptions
- break
- }
- }
- if (vmOptions) {
- var wid = vmOptions[widget + "Id"]
- if (typeof wid === "string") {
- log("warning!ä¸å†æ”¯æŒ" + widget + "Id")
- id = wid
- }
- }
- //抽å–data-tooltip-textã€data-tooltip-attr属性,组æˆä¸€ä¸ªé…置对象
- var widgetData = avalon.getWidgetData(elem, widget)
- data.value = [widget, id, optName].join(",")
- data[widget + "Id"] = id
- data.evaluator = noop
- elem.msData["ms-widget-id"] = id
- var options = data[widget + "Options"] = avalon.mix({}, constructor.defaults, vmOptions || {}, widgetData)
- elem.removeAttribute("ms-widget")
- var vmodel = constructor(elem, data, vmodels) || {} //防止组件ä¸è¿”回VM
- if (vmodel.$id) {
- avalon.vmodels[id] = vmodel
- createSignalTower(elem, vmodel)
- try {
- vmodel.$init(function() {
- avalon.scan(elem, [vmodel].concat(vmodels))
- if (typeof options.onInit === "function") {
- options.onInit.call(elem, vmodel, options, vmodels)
- }
- })
- } catch (e) {}
- data.rollback = function() {
- try {
- vmodel.widgetElement = null
- vmodel.$remove()
- } catch (e) {}
- elem.msData = {}
- delete avalon.vmodels[vmodel.$id]
- }
- injectDisposeQueue(data, widgetList)
- if (window.chrome) {
- elem.addEventListener("DOMNodeRemovedFromDocument", function() {
- setTimeout(rejectDisposeQueue)
- })
- }
- } else {
- avalon.scan(elem, vmodels)
- }
- } else if (vmodels.length) { //如果该组件还没有加载,那么ä¿å­˜å½“å‰çš„vmodels
- elem.vmodels = vmodels
- }
-}
-var widgetList = []
-//ä¸å­˜åœ¨ bindingExecutors.widget
-/*********************************************************************
- * 自带过滤器 *
- **********************************************************************/
-var rscripts = /<script[^>]*>([\S\s]*?)<\/script\s*>/gim
-var ron = /\s+(on[^=\s]+)(?:=("[^"]*"|'[^']*'|[^\s>]+))?/g
-var ropen = /<\w+\b(?:(["'])[^"]*?(\1)|[^>])*>/ig
-var rsanitize = {
- a: /\b(href)\=("javascript[^"]*"|'javascript[^']*')/ig,
- img: /\b(src)\=("javascript[^"]*"|'javascript[^']*')/ig,
- form: /\b(action)\=("javascript[^"]*"|'javascript[^']*')/ig
-}
-var rsurrogate = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g
-var rnoalphanumeric = /([^\#-~| |!])/g;
-
-function numberFormat(number, decimals, point, thousands) {
- //form http://phpjs.org/functions/number_format/
- //number 必需,è¦æ ¼å¼åŒ–çš„æ•°å­—
- //decimals å¯é€‰ï¼Œè§„定多少个å°æ•°ä½ã€‚
- //point å¯é€‰ï¼Œè§„定用作å°æ•°ç‚¹çš„字符串(默认为 . )。
- //thousands å¯é€‰ï¼Œè§„定用作åƒä½åˆ†éš”符的字符串(默认为 , ),如果设置了该å‚数,那么所有其他å‚数都是必需的。
- number = (number + '')
- .replace(/[^0-9+\-Ee.]/g, '')
- var n = !isFinite(+number) ? 0 : +number,
- prec = !isFinite(+decimals) ? 3 : Math.abs(decimals),
- sep = thousands || ",",
- dec = point || ".",
- s = '',
- toFixedFix = function(n, prec) {
- var k = Math.pow(10, prec)
- return '' + (Math.round(n * k) / k)
- .toFixed(prec)
- }
- // Fix for IE parseFloat(0.55).toFixed(0) = 0;
- s = (prec ? toFixedFix(n, prec) : '' + Math.round(n))
- .split('.')
- if (s[0].length > 3) {
- s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep)
- }
- if ((s[1] || '')
- .length < prec) {
- s[1] = s[1] || ''
- s[1] += new Array(prec - s[1].length + 1)
- .join('0')
- }
- return s.join(dec)
-}
-
-
-var filters = avalon.filters = {
- uppercase: function(str) {
- return str.toUpperCase()
- },
- lowercase: function(str) {
- return str.toLowerCase()
- },
- truncate: function(str, length, truncation) {
- //length,新字符串长度,truncation,新字符串的结尾的字段,返回新字符串
- length = length || 30
- truncation = typeof truncation === "string" ? truncation : "..."
- return str.length > length ? str.slice(0, length - truncation.length) + truncation : String(str)
- },
- $filter: function(val) {
- for (var i = 1, n = arguments.length; i < n; i++) {
- var array = arguments[i]
- var fn = avalon.filters[array.shift()]
- if (typeof fn === "function") {
- var arr = [val].concat(array)
- val = fn.apply(null, arr)
- }
- }
- return val
- },
- camelize: camelize,
- //https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
- // <a href="javasc&NewLine;ript&colon;alert('XSS')">chrome</a>
- // <a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">chrome</a>
- // <a href="jav ascript:alert('XSS');">IE67chrome</a>
- // <a href="jav&#x09;ascript:alert('XSS');">IE67chrome</a>
- // <a href="jav&#x0A;ascript:alert('XSS');">IE67chrome</a>
- sanitize: function(str) {
- return str.replace(rscripts, "").replace(ropen, function(a, b) {
- var match = a.toLowerCase().match(/<(\w+)\s/)
- if (match) { //处ç†a标签的href属性,img标签的src属性,form标签的action属性
- var reg = rsanitize[match[1]]
- if (reg) {
- a = a.replace(reg, function(s, name, value) {
- var quote = value.charAt(0)
- return name + "=" + quote + "javascript:void(0)" + quote// jshint ignore:line
- })
- }
- }
- return a.replace(ron, " ").replace(/\s+/g, " ") //移除onXXX事件
- })
- },
- escape: function(str) {
- //将字符串ç»è¿‡ str 转义得到适åˆåœ¨é¡µé¢ä¸­æ˜¾ç¤ºçš„内容, ä¾‹å¦‚æ›¿æ¢ < 为 &lt
- return String(str).
- replace(/&/g, '&amp;').
- replace(rsurrogate, function(value) {
- var hi = value.charCodeAt(0)
- var low = value.charCodeAt(1)
- return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';'
- }).
- replace(rnoalphanumeric, function(value) {
- return '&#' + value.charCodeAt(0) + ';'
- }).
- replace(/</g, '&lt;').
- replace(/>/g, '&gt;')
- },
- currency: function(amount, symbol, fractionSize) {
- return (symbol || "\uFFE5") + numberFormat(amount, isFinite(fractionSize) ? fractionSize : 2)
- },
- number: numberFormat
-}
-/*
- 'yyyy': 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)
- 'yy': 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)
- 'y': 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)
- 'MMMM': Month in year (January-December)
- 'MMM': Month in year (Jan-Dec)
- 'MM': Month in year, padded (01-12)
- 'M': Month in year (1-12)
- 'dd': Day in month, padded (01-31)
- 'd': Day in month (1-31)
- 'EEEE': Day in Week,(Sunday-Saturday)
- 'EEE': Day in Week, (Sun-Sat)
- 'HH': Hour in day, padded (00-23)
- 'H': Hour in day (0-23)
- 'hh': Hour in am/pm, padded (01-12)
- 'h': Hour in am/pm, (1-12)
- 'mm': Minute in hour, padded (00-59)
- 'm': Minute in hour (0-59)
- 'ss': Second in minute, padded (00-59)
- 's': Second in minute (0-59)
- 'a': am/pm marker
- 'Z': 4 digit (+sign) representation of the timezone offset (-1200-+1200)
- format string can also be one of the following predefined localizable formats:
-
- 'medium': equivalent to 'MMM d, y h:mm:ss a' for en_US locale (e.g. Sep 3, 2010 12:05:08 pm)
- 'short': equivalent to 'M/d/yy h:mm a' for en_US locale (e.g. 9/3/10 12:05 pm)
- 'fullDate': equivalent to 'EEEE, MMMM d,y' for en_US locale (e.g. Friday, September 3, 2010)
- 'longDate': equivalent to 'MMMM d, y' for en_US locale (e.g. September 3, 2010
- 'mediumDate': equivalent to 'MMM d, y' for en_US locale (e.g. Sep 3, 2010)
- 'shortDate': equivalent to 'M/d/yy' for en_US locale (e.g. 9/3/10)
- 'mediumTime': equivalent to 'h:mm:ss a' for en_US locale (e.g. 12:05:08 pm)
- 'shortTime': equivalent to 'h:mm a' for en_US locale (e.g. 12:05 pm)
- */
-new function() {// jshint ignore:line
- function toInt(str) {
- return parseInt(str, 10) || 0
- }
-
- function padNumber(num, digits, trim) {
- var neg = ""
- if (num < 0) {
- neg = '-'
- num = -num
- }
- num = "" + num
- while (num.length < digits)
- num = "0" + num
- if (trim)
- num = num.substr(num.length - digits)
- return neg + num
- }
-
- function dateGetter(name, size, offset, trim) {
- return function(date) {
- var value = date["get" + name]()
- if (offset > 0 || value > -offset)
- value += offset
- if (value === 0 && offset === -12) {
- value = 12
- }
- return padNumber(value, size, trim)
- }
- }
-
- function dateStrGetter(name, shortForm) {
- return function(date, formats) {
- var value = date["get" + name]()
- var get = (shortForm ? ("SHORT" + name) : name).toUpperCase()
- return formats[get][value]
- }
- }
-
- function timeZoneGetter(date) {
- var zone = -1 * date.getTimezoneOffset()
- var paddedZone = (zone >= 0) ? "+" : ""
- paddedZone += padNumber(Math[zone > 0 ? "floor" : "ceil"](zone / 60), 2) + padNumber(Math.abs(zone % 60), 2)
- return paddedZone
- }
- //å–得上åˆä¸‹åˆ
-
- function ampmGetter(date, formats) {
- return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]
- }
- var DATE_FORMATS = {
- yyyy: dateGetter("FullYear", 4),
- yy: dateGetter("FullYear", 2, 0, true),
- y: dateGetter("FullYear", 1),
- MMMM: dateStrGetter("Month"),
- MMM: dateStrGetter("Month", true),
- MM: dateGetter("Month", 2, 1),
- M: dateGetter("Month", 1, 1),
- dd: dateGetter("Date", 2),
- d: dateGetter("Date", 1),
- HH: dateGetter("Hours", 2),
- H: dateGetter("Hours", 1),
- hh: dateGetter("Hours", 2, -12),
- h: dateGetter("Hours", 1, -12),
- mm: dateGetter("Minutes", 2),
- m: dateGetter("Minutes", 1),
- ss: dateGetter("Seconds", 2),
- s: dateGetter("Seconds", 1),
- sss: dateGetter("Milliseconds", 3),
- EEEE: dateStrGetter("Day"),
- EEE: dateStrGetter("Day", true),
- a: ampmGetter,
- Z: timeZoneGetter
- }
- var rdateFormat = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/
- var raspnetjson = /^\/Date\((\d+)\)\/$/
- filters.date = function(date, format) {
- var locate = filters.date.locate,
- text = "",
- parts = [],
- fn, match
- format = format || "mediumDate"
- format = locate[format] || format
- if (typeof date === "string") {
- if (/^\d+$/.test(date)) {
- date = toInt(date)
- } else if (raspnetjson.test(date)) {
- date = +RegExp.$1
- } else {
- var trimDate = date.trim()
- var dateArray = [0, 0, 0, 0, 0, 0, 0]
- var oDate = new Date(0)
- //å–得年月日
- trimDate = trimDate.replace(/^(\d+)\D(\d+)\D(\d+)/, function(_, a, b, c) {
- var array = c.length === 4 ? [c, a, b] : [a, b, c]
- dateArray[0] = toInt(array[0]) //å¹´
- dateArray[1] = toInt(array[1]) - 1 //月
- dateArray[2] = toInt(array[2]) //æ—¥
- return ""
- })
- var dateSetter = oDate.setFullYear
- var timeSetter = oDate.setHours
- trimDate = trimDate.replace(/[T\s](\d+):(\d+):?(\d+)?\.?(\d)?/, function(_, a, b, c, d) {
- dateArray[3] = toInt(a) //å°æ—¶
- dateArray[4] = toInt(b) //分钟
- dateArray[5] = toInt(c) //秒
- if (d) { //毫秒
- dateArray[6] = Math.round(parseFloat("0." + d) * 1000)
- }
- return ""
- })
- var tzHour = 0
- var tzMin = 0
- trimDate = trimDate.replace(/Z|([+-])(\d\d):?(\d\d)/, function(z, symbol, c, d) {
- dateSetter = oDate.setUTCFullYear
- timeSetter = oDate.setUTCHours
- if (symbol) {
- tzHour = toInt(symbol + c)
- tzMin = toInt(symbol + d)
- }
- return ""
- })
-
- dateArray[3] -= tzHour
- dateArray[4] -= tzMin
- dateSetter.apply(oDate, dateArray.slice(0, 3))
- timeSetter.apply(oDate, dateArray.slice(3))
- date = oDate
- }
- }
- if (typeof date === "number") {
- date = new Date(date)
- }
- if (avalon.type(date) !== "date") {
- return
- }
- while (format) {
- match = rdateFormat.exec(format)
- if (match) {
- parts = parts.concat(match.slice(1))
- format = parts.pop()
- } else {
- parts.push(format)
- format = null
- }
- }
- parts.forEach(function(value) {
- fn = DATE_FORMATS[value]
- text += fn ? fn(date, locate) : value.replace(/(^'|'$)/g, "").replace(/''/g, "'")
- })
- return text
- }
- var locate = {
- AMPMS: {
- 0: "上åˆ",
- 1: "下åˆ"
- },
- DAY: {
- 0: "星期日",
- 1: "星期一",
- 2: "星期二",
- 3: "星期三",
- 4: "星期四",
- 5: "星期五",
- 6: "星期六"
- },
- MONTH: {
- 0: "1月",
- 1: "2月",
- 2: "3月",
- 3: "4月",
- 4: "5月",
- 5: "6月",
- 6: "7月",
- 7: "8月",
- 8: "9月",
- 9: "10月",
- 10: "11月",
- 11: "12月"
- },
- SHORTDAY: {
- "0": "周日",
- "1": "周一",
- "2": "周二",
- "3": "周三",
- "4": "周四",
- "5": "周五",
- "6": "周六"
- },
- fullDate: "y年M月d日EEEE",
- longDate: "y年M月d日",
- medium: "yyyy-M-d H:mm:ss",
- mediumDate: "yyyy-M-d",
- mediumTime: "H:mm:ss",
- "short": "yy-M-d ah:mm",
- shortDate: "yy-M-d",
- shortTime: "ah:mm"
- }
- locate.SHORTMONTH = locate.MONTH
- filters.date.locate = locate
-}// jshint ignore:line
-/*********************************************************************
- * AMD加载器 *
- **********************************************************************/
-//https://www.devbridge.com/articles/understanding-amd-requirejs/
-//http://maxogden.com/nested-dependencies.html
-var modules = avalon.modules = {
- "domReady!": {
- exports: avalon,
- state: 3
- },
- "avalon": {
- exports: avalon,
- state: 4
- }
-}
-//Object(modules[id]).state拥有如下值
-// undefined 没有定义
-// 1(send) å·²ç»å‘出请求
-// 2(loading) å·²ç»è¢«æ‰§è¡Œä½†è¿˜æ²¡æœ‰æ‰§è¡Œå®Œæˆï¼Œåœ¨è¿™ä¸ªé˜¶æ®µdefine方法会被执行
-// 3(loaded) 执行完毕,通过onload/onreadystatechange回调判定,在这个阶段checkDeps方法会执行
-// 4(execute) å…¶ä¾èµ–也执行完毕, 值放到exports对象上,在这个阶段fireFactory方法会执行
-modules.exports = modules.avalon
-
-new function () {// jshint ignore:line
- var loadings = [] //正在加载中的模å—列表
- var factorys = [] //放置define方法的factory函数
- var rjsext = /\.js$/i
- function makeRequest(name, config) {
-//1. 去掉资æºå‰ç¼€
- var res = "js"
- name = name.replace(/^(\w+)\!/, function (a, b) {
- res = b
- return ""
- })
- if (res === "ready") {
- log("debug: ready!å·²ç»è¢«åºŸå¼ƒï¼Œè¯·ä½¿ç”¨domReady!")
- res = "domReady"
- }
-//2. 去掉querystring, hash
- var query = ""
- name = name.replace(rquery, function (a) {
- query = a
- return ""
- })
- //3. 去掉扩展å
- var suffix = "." + res
- var ext = /js|css/.test(suffix) ? suffix : ""
- name = name.replace(/\.[a-z0-9]+$/g, function (a) {
- if (a === suffix) {
- ext = a
- return ""
- } else {
- return a
- }
- })
- var req = avalon.mix({
- query: query,
- ext: ext,
- res: res,
- name: name,
- toUrl: toUrl
- }, config)
- req.toUrl(name)
- return req
- }
-
- function fireRequest(req) {
- var name = req.name
- var res = req.res
- //1. 如果该模å—å·²ç»å‘出请求,直接返回
- var module = modules[name]
- var urlNoQuery = name && req.urlNoQuery
- if (module && module.state >= 1) {
- return name
- }
- module = modules[urlNoQuery]
- if (module && module.state >= 3) {
- innerRequire(module.deps || [], module.factory, urlNoQuery)
- return urlNoQuery
- }
- if (name && !module) {
- module = modules[urlNoQuery] = {
- id: urlNoQuery,
- state: 1 //send
- }
- var wrap = function (obj) {
- resources[res] = obj
- obj.load(name, req, function (a) {
- if (arguments.length && a !== void 0) {
- module.exports = a
- }
- module.state = 4
- checkDeps()
- })
- }
-
- if (!resources[res]) {
- innerRequire([res], wrap)
- } else {
- wrap(resources[res])
- }
- }
- return name ? urlNoQuery : res + "!"
- }
-
-//核心API之一 require
- var requireQueue = []
- var isUserFirstRequire = false
- innerRequire = avalon.require = function (array, factory, parentUrl, defineConfig) {
- if (!isUserFirstRequire) {
- requireQueue.push(avalon.slice(arguments))
- if (arguments.length <= 2) {
- isUserFirstRequire = true
- var queue = requireQueue.splice(0, requireQueue.length), args
- while (args = queue.shift()) {
- innerRequire.apply(null, args)
- }
- }
- return
- }
-
- if (!Array.isArray(array)) {
- avalon.error("require方法的第一个å‚数应为数组 " + array)
- }
- var deps = [] // 放置所有ä¾èµ–项的完整路径
- var uniq = {}
- var id = parentUrl || "callback" + setTimeout("1")// jshint ignore:line
- defineConfig = defineConfig || {}
- defineConfig.baseUrl = kernel.baseUrl
- var isBuilt = !!defineConfig.built
- if (parentUrl) {
- defineConfig.parentUrl = parentUrl.substr(0, parentUrl.lastIndexOf("/"))
- defineConfig.mapUrl = parentUrl.replace(rjsext, "")
- }
- if (isBuilt) {
- var req = makeRequest(defineConfig.defineName, defineConfig)
- id = req.urlNoQuery
- } else {
- array.forEach(function (name) {
- var req = makeRequest(name, defineConfig)
- var url = fireRequest(req) //加载资æºï¼Œå¹¶è¿”回该资æºçš„完整地å€
- if (url) {
- if (!uniq[url]) {
- deps.push(url)
- uniq[url] = "å¸å¾’正美" //去é‡
- }
- }
- })
- }
-
- var module = modules[id]
- if (!module || module.state !== 4) {
- modules[id] = {
- id: id,
- deps: isBuilt ? array.concat() : deps,
- factory: factory || noop,
- state: 3
- }
- }
- if (!module) {
- //如果此模å—是定义在å¦ä¸€ä¸ªJS文件中, 那必须等该文件加载完毕, æ‰èƒ½æ”¾åˆ°æ£€æµ‹åˆ—队中
- loadings.push(id)
- }
- checkDeps()
- }
-
-//核心API之二 require
- innerRequire.define = function (name, deps, factory) { //模å—å,ä¾èµ–列表,模å—本身
- if (typeof name !== "string") {
- factory = deps
- deps = name
- name = "anonymous"
- }
- if (!Array.isArray(deps)) {
- factory = deps
- deps = []
- }
- var config = {
- built: !isUserFirstRequire, //用r.js打包åŽ,所有define会放到requirejs之å‰
- defineName: name
- }
- var args = [deps, factory, config]
- factory.require = function (url) {
- args.splice(2, 0, url)
- if (modules[url]) {
- modules[url].state = 3 //loaded
- var isCycle = false
- try {
- isCycle = checkCycle(modules[url].deps, url)
- } catch (e) {
- }
- if (isCycle) {
- avalon.error(url + "模å—与之å‰çš„模å—存在循环ä¾èµ–,请ä¸è¦ç›´æŽ¥ç”¨script标签引入" + url + "模å—")
- }
- }
- delete factory.require //释放内存
- innerRequire.apply(null, args) //0,1,2 --> 1,2,0
- }
-//æ ¹æ®æ ‡å‡†,所有éµå¾ªW3C标准的æµè§ˆå™¨,script标签会按标签的出现顺åºæ‰§è¡Œã€‚
-//è€çš„æµè§ˆå™¨ä¸­ï¼ŒåŠ è½½ä¹Ÿæ˜¯æŒ‰é¡ºåºçš„:一个文件下载完æˆåŽï¼Œæ‰å¼€å§‹ä¸‹è½½ä¸‹ä¸€ä¸ªæ–‡ä»¶ã€‚
-//较新的æµè§ˆå™¨ä¸­ï¼ˆIE8+ ã€FireFox3.5+ ã€Chrome4+ ã€Safari4+),为了å‡å°è¯·æ±‚时间以优化体验,
-//下载å¯ä»¥æ˜¯å¹¶è¡Œçš„,但是执行顺åºè¿˜æ˜¯æŒ‰ç…§æ ‡ç­¾å‡ºçŽ°çš„顺åºã€‚
-//但如果script标签是动æ€æ’入的, 就未必按照先请求先执行的原则了,目测åªæœ‰firefoxéµå®ˆ
-//唯一比较一致的是,IE10+åŠå…¶ä»–标准æµè§ˆå™¨,一旦开始解æžè„šæœ¬, 就会一直堵在那里,直接脚本解æžå®Œæ¯•
-//亦å³ï¼Œå…ˆè¿›å…¥loading阶段的script标签(模å—)必然会先进入loaded阶段
- var url = config.built ? "unknown" : getCurrentScript()
- if (url) {
- var module = modules[url]
- if (module) {
- module.state = 2
- }
- factory.require(url)
- } else {//åˆå¹¶å‰åŽçš„safari,åˆå¹¶åŽçš„IE6-9走此分支
- factorys.push(factory)
- }
- }
-//核心API之三 require.config(settings)
- innerRequire.config = kernel
- //核心API之四 define.amd 标识其符åˆAMD规范
- innerRequire.define.amd = modules
-
- //==========================对用户é…置项进行å†åŠ å·¥==========================
- var allpaths = kernel["orig.paths"] = {}
- var allmaps = kernel["orig.map"] = {}
- var allpackages = kernel["packages"] = []
- var allargs = kernel["orig.args"] = {}
- avalon.mix(plugins, {
- paths: function (hash) {
- avalon.mix(allpaths, hash)
- kernel.paths = makeIndexArray(allpaths)
- },
- map: function (hash) {
- avalon.mix(allmaps, hash)
- var list = makeIndexArray(allmaps, 1, 1)
- avalon.each(list, function (_, item) {
- item.val = makeIndexArray(item.val)
- })
- kernel.map = list
- },
- packages: function (array) {
- array = array.concat(allpackages)
- var uniq = {}
- var ret = []
- for (var i = 0, pkg; pkg = array[i++]; ) {
- pkg = typeof pkg === "string" ? {name: pkg} : pkg
- var name = pkg.name
- if (!uniq[name]) {
- var url = joinPath(pkg.location || name, pkg.main || "main")
- url = url.replace(rjsext, "")
- ret.push(pkg)
- uniq[name] = pkg.location = url
- pkg.reg = makeMatcher(name)
- }
- }
- kernel.packages = ret.sort()
- },
- urlArgs: function (hash) {
- if (typeof hash === "string") {
- hash = {"*": hash}
- }
- avalon.mix(allargs, hash)
- kernel.urlArgs = makeIndexArray(allargs, 1)
- },
- baseUrl: function (url) {
- if (!isAbsUrl(url)) {
- var baseElement = head.getElementsByTagName("base")[0]
- if (baseElement) {
- head.removeChild(baseElement)
- }
- var node = DOC.createElement("a")
- node.href = url
- url = getFullUrl(node, "href")
- if (baseElement) {
- head.insertBefore(baseElement, head.firstChild)
- }
- }
- if (url.length > 3)
- kernel.baseUrl = url
- },
- shim: function (obj) {
- for (var i in obj) {
- var value = obj[i]
- if (Array.isArray(value)) {
- value = obj[i] = {
- deps: value
- }
- }
- if (!value.exportsFn && (value.exports || value.init)) {
- value.exportsFn = makeExports(value)
- }
- }
- kernel.shim = obj
- }
-
- })
-
-
- //==============================内部方法=================================
- function checkCycle(deps, nick) {
- //检测是å¦å­˜åœ¨å¾ªçŽ¯ä¾èµ–
- for (var i = 0, id; id = deps[i++]; ) {
- if (modules[id].state !== 4 &&
- (id === nick || checkCycle(modules[id].deps, nick))) {
- return true
- }
- }
- }
-
- function checkFail(node, onError, fuckIE) {
- var id = trimQuery(node.src) //检测是å¦æ­»é“¾
- node.onload = node.onreadystatechange = node.onerror = null
- if (onError || (fuckIE && modules[id] && !modules[id].state)) {
- setTimeout(function () {
- head.removeChild(node)
- node = null // 处ç†æ—§å¼IE下的循环引用问题
- })
- log("debug: 加载 " + id + " 失败" + onError + " " + (!modules[id].state))
- } else {
- return true
- }
- }
-
- function checkDeps() {
- //检测此JS模å—çš„ä¾èµ–是å¦éƒ½å·²å®‰è£…完毕,是则安装自身
- loop: for (var i = loadings.length, id; id = loadings[--i]; ) {
- var obj = modules[id],
- deps = obj.deps
- if (!deps)
- continue
- for (var j = 0, key; key = deps[j]; j++) {
- if (Object(modules[key]).state !== 4) {
- continue loop
- }
- }
- //如果deps是空对象或者其ä¾èµ–的模å—的状æ€éƒ½æ˜¯2
- if (obj.state !== 4) {
- loadings.splice(i, 1) //必须先移除å†å®‰è£…,防止在IE下DOM树建完åŽæ‰‹åŠ¨åˆ·æ–°é¡µé¢ï¼Œä¼šå¤šæ¬¡æ‰§è¡Œå®ƒ
- fireFactory(obj.id, obj.deps, obj.factory)
- checkDeps() //如果æˆåŠŸ,则å†æ‰§è¡Œä¸€æ¬¡,以防有些模å—就差本模å—没有安装好
- }
- }
- }
-
- var rreadyState = /complete|loaded/
- function loadJS(url, id, callback) {
- //通过script节点加载目标模å—
- var node = DOC.createElement("script")
- node.className = subscribers //让getCurrentScriptåªå¤„ç†ç±»å为subscribersçš„script节点
- var supportLoad = "onload" in node
- var onEvent = supportLoad ? "onload" : "onreadystatechange"
- function onload() {
- var factory = factorys.pop()
- factory && factory.require(id)
- if (callback) {
- callback()
- }
- if (checkFail(node, false, !supportLoad)) {
- log("debug: å·²æˆåŠŸåŠ è½½ " + url)
- id && loadings.push(id)
- checkDeps()
- }
- }
- var index = 0, loadID
- node[onEvent] = supportLoad ? onload : function () {
- if (rreadyState.test(node.readyState)) {
- ++index
- if (index === 1) {
- loadID = setTimeout(onload, 500)
- } else {
- clearTimeout(loadID)
- onload()
- }
- }
- }
- node.onerror = function () {
- checkFail(node, true)
- }
-
- head.insertBefore(node, head.firstChild) //chrome下第二个å‚æ•°ä¸èƒ½ä¸ºnull
- node.src = url //æ’入到head的第一个节点å‰ï¼Œé˜²æ­¢IE6下head标签没闭åˆå‰ä½¿ç”¨appendChild抛错
- log("debug: 正准备加载 " + url) //æ›´é‡è¦çš„是IE6下å¯ä»¥æ”¶çª„getCurrentScript的寻找范围
- }
-
- var resources = innerRequire.plugins = {
- //三大常用资æºæ’件 js!, css!, text!, ready!
- ready: {
- load: noop
- },
- js: {
- load: function (name, req, onLoad) {
- var url = req.url
- var id = req.urlNoQuery
- var shim = kernel.shim[name.replace(rjsext, "")]
- if (shim) { //shim机制
- innerRequire(shim.deps || [], function () {
- var args = avalon.slice(arguments)
- loadJS(url, id, function () {
- onLoad(shim.exportsFn ? shim.exportsFn.apply(0, args) : void 0)
- })
- })
- } else {
- loadJS(url, id)
- }
- }
- },
- css: {
- load: function (name, req, onLoad) {
- var url = req.url
- var node = DOC.createElement("link")
- node.rel = "stylesheet"
- node.href = url
- head.insertBefore(node, head.firstChild)
- log("debug: å·²æˆåŠŸåŠ è½½ " + url)
- onLoad()
- }
- },
- text: {
- load: function (name, req, onLoad) {
- var url = req.url
- var xhr = getXHR()
- xhr.onreadystatechange = function () {
- if (xhr.readyState === 4) {
- var status = xhr.status;
- if (status > 399 && status < 600) {
- avalon.error(url + " 对应资æºä¸å­˜åœ¨æˆ–æ²¡æœ‰å¼€å¯ CORS")
- } else {
- log("debug: å·²æˆåŠŸåŠ è½½ " + url)
- onLoad(xhr.responseText)
- }
- }
- }
- var time = "_=" + (new Date() - 0)
- var _url = url.indexOf("?") === -1 ? url + "?" + time : url + "&" + time
- xhr.open("GET", _url, true)
- if ("withCredentials" in xhr) {//这是处ç†è·¨åŸŸ
- xhr.withCredentials = true
- }
- xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest")//告诉åŽç«¯è¿™æ˜¯AJAX请求
- xhr.send()
- log("debug: 正准备加载 " + url)
- }
- }
- }
- innerRequire.checkDeps = checkDeps
-
- var rquery = /(\?[^#]*)$/
- function trimQuery(url) {
- return (url || "").replace(rquery, "")
- }
-
- function isAbsUrl(path) {
- //http://stackoverflow.com/questions/10687099/how-to-test-if-a-url-string-is-absolute-or-relative
- return /^(?:[a-z]+:)?\/\//i.test(String(path))
- }
-
- function getFullUrl(node, src) {
- return"1"[0] ? node[src] : node.getAttribute(src, 4)
- }
-
- function getCurrentScript() {
- // inspireb by https://github.com/samyk/jiagra/blob/master/jiagra.js
- var stack
- try {
- a.b.c() //强制报错,以便æ•èŽ·e.stack
- } catch (e) { //safari5çš„sourceURL,firefoxçš„fileName,它们的效果与e.stackä¸ä¸€æ ·
- stack = e.stack
- if (!stack && window.opera) {
- //opera 9没有e.stack,但有e.Backtrace,但ä¸èƒ½ç›´æŽ¥å–å¾—,需è¦å¯¹e对象转字符串进行抽å–
- stack = (String(e).match(/of linked script \S+/g) || []).join(" ")
- }
- }
- if (stack) {
- /**e.stack最åŽä¸€è¡Œåœ¨æ‰€æœ‰æ”¯æŒçš„æµè§ˆå™¨å¤§è‡´å¦‚下:
- *chrome23:
- * at http://113.93.50.63/data.js:4:1
- *firefox17:
- *@http://113.93.50.63/query.js:4
- *opera12:http://www.oldapps.com/opera.php?system=Windows_XP
- *@http://113.93.50.63/data.js:4
- *IE10:
- * at Global code (http://113.93.50.63/data.js:4:1)
- * //firefox4+ å¯ä»¥ç”¨document.currentScript
- */
- stack = stack.split(/[@ ]/g).pop() //å–得最åŽä¸€è¡Œ,最åŽä¸€ä¸ªç©ºæ ¼æˆ–@之åŽçš„部分
- stack = stack[0] === "(" ? stack.slice(1, -1) : stack.replace(/\s/, "") //去掉æ¢è¡Œç¬¦
- return trimQuery(stack.replace(/(:\d+)?:\d+$/i, "")) //去掉行å·ä¸Žæˆ–许存在的出错字符起始ä½ç½®
- }
- var nodes = head.getElementsByTagName("script") //åªåœ¨head标签中寻找
- for (var i = nodes.length, node; node = nodes[--i]; ) {
- if (node.className === subscribers && node.readyState === "interactive") {
- var url = getFullUrl(node, "src")
- return node.className = trimQuery(url)
- }
- }
- }
-
- var rcallback = /^callback\d+$/
- function fireFactory(id, deps, factory) {
- var module = Object(modules[id])
- module.state = 4
- for (var i = 0, array = [], d; d = deps[i++]; ) {
- if (d === "exports") {
- var obj = module.exports || (module.exports = {})
- array.push(obj)
- } else {
- array.push(modules[d].exports)
- }
- }
- try {
- var ret = factory.apply(window, array)
- } catch (e) {
- log("执行[" + id + "]模å—çš„factory抛错: ", e)
- }
- if (ret !== void 0) {
- module.exports = ret
- }
- if (rcallback.test(id)) {
- delete modules[id]
- }
- delete module.factory
- return ret
- }
- function toUrl(id) {
- if (id.indexOf(this.res + "!") === 0) {
- id = id.slice(this.res.length + 1) //处ç†define("css!style",[], function(){})的情况
- }
- var url = id
- //1. 是å¦å‘½ä¸­pathsé…置项
- var usePath = 0
- var baseUrl = this.baseUrl
- var rootUrl = this.parentUrl || baseUrl
- eachIndexArray(id, kernel.paths, function (value, key) {
- url = url.replace(key, value)
- usePath = 1
- })
- //2. 是å¦å‘½ä¸­packagesé…置项
- if (!usePath) {
- eachIndexArray(id, kernel.packages, function (value, key, item) {
- url = url.replace(item.name, item.location)
- })
- }
- //3. 是å¦å‘½ä¸­mapé…置项
- if (this.mapUrl) {
- eachIndexArray(this.mapUrl, kernel.map, function (array) {
- eachIndexArray(url, array, function (mdValue, mdKey) {
- url = url.replace(mdKey, mdValue)
- rootUrl = baseUrl
- })
- })
- }
- var ext = this.ext
- if (ext && usePath && url.slice(-ext.length) === ext) {
- url = url.slice(0, -ext.length)
- }
- //4. 转æ¢ä¸ºç»å¯¹è·¯å¾„
- if (!isAbsUrl(url)) {
- rootUrl = this.built || /^\w/.test(url) ? baseUrl : rootUrl
- url = joinPath(rootUrl, url)
- }
- //5. 还原扩展å,query
- var urlNoQuery = url + ext
- url = urlNoQuery + this.query
- //6. 处ç†urlArgs
- eachIndexArray(id, kernel.urlArgs, function (value) {
- url += (url.indexOf("?") === -1 ? "?" : "&") + value;
- })
- this.url = url
- return this.urlNoQuery = urlNoQuery
- }
-
- function makeIndexArray(hash, useStar, part) {
- //创建一个ç»è¿‡ç‰¹æ®Šç®—法排好åºçš„数组
- var index = hash2array(hash, useStar, part)
- index.sort(descSorterByName)
- return index
- }
-
- function makeMatcher(prefix) {
- return new RegExp('^' + prefix + '(/|$)')
- }
-
- function makeExports(value) {
- return function () {
- var ret
- if (value.init) {
- ret = value.init.apply(window, arguments)
- }
- return ret || (value.exports && getGlobal(value.exports))
- }
- }
-
-
- function hash2array(hash, useStar, part) {
- var array = [];
- for (var key in hash) {
- if (ohasOwn.call(hash, key)) {
- var item = {
- name: key,
- val: hash[key]
- }
- array.push(item)
- item.reg = key === "*" && useStar ? /^/ : makeMatcher(key)
- if (part && key !== "*") {
- item.reg = new RegExp('\/' + key.replace(/^\//, "") + '(/|$)')
- }
- }
- }
- return array
- }
-
- function eachIndexArray(moduleID, array, matcher) {
- array = array || []
- for (var i = 0, el; el = array[i++]; ) {
- if (el.reg.test(moduleID)) {
- matcher(el.val, el.name, el)
- return false
- }
- }
- }
- // æ ¹æ®å…ƒç´ çš„name项进行数组字符数逆åºçš„排åºå‡½æ•°
- function descSorterByName(a, b) {
- var aaa = a.name
- var bbb = b.name
- if (bbb === "*") {
- return -1
- }
- if (aaa === "*") {
- return 1
- }
- return bbb.length - aaa.length
- }
-
- var rdeuce = /\/\w+\/\.\./
- function joinPath(a, b) {
- if (a.charAt(a.length - 1) !== "/") {
- a += "/"
- }
- if (b.slice(0, 2) === "./") { //相对于兄弟路径
- return a + b.slice(2)
- }
- if (b.slice(0, 2) === "..") { //相对于父路径
- a += b
- while (rdeuce.test(a)) {
- a = a.replace(rdeuce, "")
- }
- return a
- }
- if (b.slice(0, 1) === "/") {
- return a + b.slice(1)
- }
- return a + b
- }
-
- function getGlobal(value) {
- if (!value) {
- return value
- }
- var g = window
- value.split(".").forEach(function (part) {
- g = g[part]
- })
- return g
- }
-
- var mainNode = DOC.scripts[DOC.scripts.length - 1]
- var dataMain = mainNode.getAttribute("data-main")
- if (dataMain) {
- plugins.baseUrl(dataMain)
- var href = kernel.baseUrl
- kernel.baseUrl = href.slice(0, href.lastIndexOf("/") + 1)
- loadJS(href.replace(rjsext, "") + ".js")
- } else {
- var loaderUrl = trimQuery(getFullUrl(mainNode, "src"))
- kernel.baseUrl = loaderUrl.slice(0, loaderUrl.lastIndexOf("/") + 1)
- }
-}// jshint ignore:line
-
-/*********************************************************************
- * DOMReady *
- **********************************************************************/
-
-var readyList = [], isReady
-var fireReady = function(fn) {
- isReady = true
- if (innerRequire) {
- modules["domReady!"].state = 4
- innerRequire.checkDeps()
- }
- while(fn = readyList.shift()){
- fn(avalon)
- }
-}
-
-function doScrollCheck() {
- try { //IE下通过doScrollCheck检测DOM树是å¦å»ºå®Œ
- root.doScroll("left")
- fireReady()
- } catch (e) {
- setTimeout(doScrollCheck)
- }
-}
-
-if (DOC.readyState === "complete") {
- setTimeout(fireReady) //如果在domReady之外加载
-} else if (W3C) {
- DOC.addEventListener("DOMContentLoaded", fireReady)
-} else {
- DOC.attachEvent("onreadystatechange", function() {
- if (DOC.readyState === "complete") {
- fireReady()
- }
- })
- try {
- var isTop = window.frameElement === null
- } catch (e) {
- }
- if (root.doScroll && isTop && window.external) {//fix IE iframe BUG
- doScrollCheck()
- }
-}
-avalon.bind(window, "load", fireReady)
-
-avalon.ready = function(fn) {
- if (!isReady) {
- readyList.push(fn)
- } else {
- fn(avalon)
- }
-}
-
-avalon.config({
- loader: true
-})
-
-avalon.ready(function() {
- avalon.scan(DOC.body)
-})
-
-// Register as a named AMD module, since avalon can be concatenated with other
-// files that may use define, but not via a proper concatenation script that
-// understands anonymous AMD modules. A named AMD is safest and most robust
-// way to register. Lowercase avalon is used because AMD module names are
-// derived from file names, and Avalon is normally delivered in a lowercase
-// file name. Do this after creating the global so that if an AMD module wants
-// to call noConflict to hide this version of avalon, it will work.
-
-// Note that for maximum portability, libraries that are not avalon should
-// declare themselves as anonymous modules, and avoid setting a global if an
-// AMD loader is present. avalon is a special case. For more information, see
-// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
- if (typeof define === "function" && define.amd) {
- define("avalon", [], function() {
- return avalon
- })
- }
-// Map over avalon in case of overwrite
- var _avalon = window.avalon
- avalon.noConflict = function(deep) {
- if (deep && window.avalon === avalon) {
- window.avalon = _avalon
- }
- return avalon
- }
-// Expose avalon identifiers, even in AMD
-// and CommonJS for browser emulators
- if (noGlobal === void 0) {
- window.avalon = avalon
- }
- return avalon
-
-})); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css
deleted file mode 100644
index 8ec95e1..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/css/bootstrap-dt.css
+++ /dev/null
@@ -1,5798 +0,0 @@
-/*! normalize.css v3.0.0 | MIT License | git.io/normalize */
-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,
-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: 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;
- -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"] {
- 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 {
-}
-@media print {
- * {
- color: #000 !important;
- text-shadow: none !important;
- background: transparent !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^="javascript:"]:after,
- a[href^="#"]: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;
- }
- select {
- background: #fff !important;
- }
- .navbar {
- display: none;
- }
- .table td,
- .table th {
- background-color: #fff !important;
- }
- .btn > .caret,
- .dropup > .btn > .caret {
- border-top-color: #000 !important;
- }
- .label {
- border: 1px solid #000;
- }
- .table {
- border-collapse: collapse !important;
- }
- .table-bordered th,
- .table-bordered td {
- border: 1px solid #ddd !important;
- }
-}
-.dataTableWrapperDiv div {
- -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: 62.5%;
-
- -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: #428bca;
- text-decoration: none;
-}
-a:hover,
-a:focus {
- color: #2a6496;
- text-decoration: underline;
-}
-a:focus {
- outline: thin dotted;
- 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;
- 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;
-}
-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: #999;
-}
-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: 200;
- line-height: 1.4;
-}
-@media (min-width: 768px) {
- .lead {
- font-size: 21px;
- }
-}
-small,
-.small {
- font-size: 85%;
-}
-cite {
- font-style: normal;
-}
-.text-left {
- text-align: left;
-}
-.text-right {
- text-align: right;
-}
-.text-center {
- text-align: center;
-}
-.text-justify {
- text-align: justify;
-}
-.text-muted {
- color: #999;
-}
-.text-primary {
- color: #428bca;
-}
-a.text-primary:hover {
- color: #3071a9;
-}
-.text-success {
- color: #3c763d;
-}
-a.text-success:hover {
- color: #2b542c;
-}
-.text-info {
- color: #31708f;
-}
-a.text-info:hover {
- color: #245269;
-}
-.text-warning {
- color: #8a6d3b;
-}
-a.text-warning:hover {
- color: #66512c;
-}
-.text-danger {
- color: #a94442;
-}
-a.text-danger:hover {
- color: #843534;
-}
-.bg-primary {
- color: #fff;
- background-color: #428bca;
-}
-a.bg-primary:hover {
- background-color: #3071a9;
-}
-.bg-success {
- background-color: #dff0d8;
-}
-a.bg-success:hover {
- background-color: #c1e2b3;
-}
-.bg-info {
- background-color: #d9edf7;
-}
-a.bg-info:hover {
- background-color: #afd9ee;
-}
-.bg-warning {
- background-color: #fcf8e3;
-}
-a.bg-warning:hover {
- background-color: #f7ecb5;
-}
-.bg-danger {
- background-color: #f2dede;
-}
-a.bg-danger:hover {
- 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 #999;
-}
-.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: #999;
-}
-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';
-}
-blockquote:before,
-blockquote:after {
- content: "";
-}
-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;
- white-space: nowrap;
- background-color: #f9f2f4;
- border-radius: 4px;
-}
-kbd {
- padding: 2px 4px;
- font-size: 90%;
- color: #fff;
- background-color: #333;
- border-radius: 3px;
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
-}
-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: 0;
-}
-.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: 0;
-}
-.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: 0;
- }
- .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: 0;
- }
- .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: 0;
- }
- .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: 0;
- }
- .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: 0;
- }
- .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: 0;
- }
- .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 {
- max-width: 100%;
- background-color: transparent;
-}
-th {
- text-align: left;
-}
-.table {
- 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-child(odd) > td,
-.table-striped > tbody > tr:nth-child(odd) > th {
- background-color: #f9f9f9;
-}
-.table-hover > tbody > tr:hover > td,
-.table-hover > tbody > tr:hover > th {
- /*background-color: #f5f5f5;*/
- background-color:#dbedff;
-}
-.dataTableTdSelected{
- background-color:#dbedff !important;
-}
-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.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.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.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.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.danger:hover > th {
- background-color: #ebcccc;
-}
-@media (max-width: 767px) {
- .table-responsive {
- width: 100%;
- margin-bottom: 15px;
- overflow-x: scroll;
- overflow-y: hidden;
- -webkit-overflow-scrolling: touch;
- -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;
- 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;
- /* IE8-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: thin dotted;
- 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, 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[disabled],
-.form-control[readonly],
-fieldset[disabled] .form-control {
- cursor: not-allowed;
- background-color: #eee;
- opacity: 1;
-}
-textarea.form-control {
- height: auto;
-}
-input[type="search"] {
- -webkit-appearance: none;
-}
-input[type="date"] {
- line-height: 34px;
-}
-.form-group {
- margin-bottom: 15px;
-}
-.radio,
-.checkbox {
- display: block;
- min-height: 20px;
- padding-left: 20px;
- margin-top: 10px;
- margin-bottom: 10px;
-}
-.radio label,
-.checkbox label {
- display: inline;
- font-weight: normal;
- cursor: pointer;
-}
-.radio input[type="radio"],
-.radio-inline input[type="radio"],
-.checkbox input[type="checkbox"],
-.checkbox-inline input[type="checkbox"] {
- float: left;
- margin-left: -20px;
-}
-.radio + .radio,
-.checkbox + .checkbox {
- margin-top: -5px;
-}
-.radio-inline,
-.checkbox-inline {
- 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],
-.radio[disabled],
-.radio-inline[disabled],
-.checkbox[disabled],
-.checkbox-inline[disabled],
-fieldset[disabled] input[type="radio"],
-fieldset[disabled] input[type="checkbox"],
-fieldset[disabled] .radio,
-fieldset[disabled] .radio-inline,
-fieldset[disabled] .checkbox,
-fieldset[disabled] .checkbox-inline {
- cursor: not-allowed;
-}
-.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;
-}
-.input-lg {
- height: 46px;
- padding: 10px 16px;
- font-size: 18px;
- line-height: 1.33;
- border-radius: 6px;
-}
-select.input-lg {
- height: 46px;
- line-height: 46px;
-}
-textarea.input-lg,
-select[multiple].input-lg {
- height: auto;
-}
-.has-feedback {
- position: relative;
-}
-.has-feedback .form-control {
- padding-right: 42.5px;
-}
-.has-feedback .form-control-feedback {
- position: absolute;
- top: 25px;
- right: 0;
- display: block;
- width: 34px;
- height: 34px;
- line-height: 34px;
- text-align: center;
-}
-.has-success .help-block,
-.has-success .control-label,
-.has-success .radio,
-.has-success .checkbox,
-.has-success .radio-inline,
-.has-success .checkbox-inline {
- 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 {
- 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 {
- 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;
-}
-.form-control-static {
- margin-bottom: 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 .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;
- padding-left: 0;
- margin-top: 0;
- margin-bottom: 0;
- vertical-align: middle;
- }
- .form-inline .radio input[type="radio"],
- .form-inline .checkbox input[type="checkbox"] {
- float: none;
- margin-left: 0;
- }
- .form-inline .has-feedback .form-control-feedback {
- top: 0;
- }
-}
-.form-horizontal .control-label,
-.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;
-}
-.form-horizontal .form-control-static {
- padding-top: 7px;
-}
-@media (min-width: 768px) {
- .form-horizontal .control-label {
- text-align: right;
- }
-}
-.form-horizontal .has-feedback .form-control-feedback {
- top: 0;
- right: 15px;
-}
-.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;
- 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 {
- outline: thin dotted;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-.btn:hover,
-.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 {
- pointer-events: none;
- cursor: not-allowed;
- filter: alpha(opacity=65);
- -webkit-box-shadow: none;
- box-shadow: none;
- opacity: .65;
-}
-.btn.default {
- color: #333333;
- text-shadow: none;
- background-color: #e5e5e5;
- height:12px;
-}
-.btn.default:hover,
-.btn.default:focus,
-.btn.default:active,
-.btn.default.active,
-.btn.default[disabled],
-.btn.default.disabled {
- color: #333333;
- background-color: #d8d8d8 !important;
- outline: none !important;
-}
-
-.btn-default:hover,
-.btn-default:focus,
-.btn-default:active,
-.btn-default.active,
-.open .dropdown-toggle.btn-default {
- color: #333;
- background-color: #ebebeb;
- border-color: #adadad;
-}
-.btn-default:active,
-.btn-default.active,
-.open .dropdown-toggle.btn-default {
- background-image: none;
-}
-.btn-default.disabled,
-.btn-default[disabled],
-fieldset[disabled] .btn-default,
-.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:active,
-.btn-default[disabled]:active,
-fieldset[disabled] .btn-default:active,
-.btn-default.disabled.active,
-.btn-default[disabled].active,
-fieldset[disabled] .btn-default.active {
- background-color: #fff;
- border-color: #ccc;
-}
-.btn-default .badge {
- color: #fff;
- background-color: #333;
-}
-.btn-primary {
- color: #fff;
- background-color: #428bca;
- border-color: #357ebd;
-}
-.btn-primary:hover,
-.btn-primary:focus,
-.btn-primary:active,
-.btn-primary.active,
-.open .dropdown-toggle.btn-primary {
- color: #fff;
- background-color: #3276b1;
- border-color: #285e8e;
-}
-.btn-primary:active,
-.btn-primary.active,
-.open .dropdown-toggle.btn-primary {
- background-image: none;
-}
-.btn-primary.disabled,
-.btn-primary[disabled],
-fieldset[disabled] .btn-primary,
-.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:active,
-.btn-primary[disabled]:active,
-fieldset[disabled] .btn-primary:active,
-.btn-primary.disabled.active,
-.btn-primary[disabled].active,
-fieldset[disabled] .btn-primary.active {
- background-color: #428bca;
- border-color: #357ebd;
-}
-.btn-primary .badge {
- color: #428bca;
- background-color: #fff;
-}
-.btn-success {
- color: #fff;
- background-color: #5cb85c;
- border-color: #4cae4c;
-}
-.btn-success:hover,
-.btn-success:focus,
-.btn-success:active,
-.btn-success.active,
-.open .dropdown-toggle.btn-success {
- color: #fff;
- background-color: #47a447;
- border-color: #398439;
-}
-.btn-success:active,
-.btn-success.active,
-.open .dropdown-toggle.btn-success {
- background-image: none;
-}
-.btn-success.disabled,
-.btn-success[disabled],
-fieldset[disabled] .btn-success,
-.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:active,
-.btn-success[disabled]:active,
-fieldset[disabled] .btn-success:active,
-.btn-success.disabled.active,
-.btn-success[disabled].active,
-fieldset[disabled] .btn-success.active {
- 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:hover,
-.btn-info:focus,
-.btn-info:active,
-.btn-info.active,
-.open .dropdown-toggle.btn-info {
- color: #fff;
- background-color: #39b3d7;
- border-color: #269abc;
-}
-.btn-info:active,
-.btn-info.active,
-.open .dropdown-toggle.btn-info {
- background-image: none;
-}
-.btn-info.disabled,
-.btn-info[disabled],
-fieldset[disabled] .btn-info,
-.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:active,
-.btn-info[disabled]:active,
-fieldset[disabled] .btn-info:active,
-.btn-info.disabled.active,
-.btn-info[disabled].active,
-fieldset[disabled] .btn-info.active {
- 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:hover,
-.btn-warning:focus,
-.btn-warning:active,
-.btn-warning.active,
-.open .dropdown-toggle.btn-warning {
- color: #fff;
- background-color: #ed9c28;
- border-color: #d58512;
-}
-.btn-warning:active,
-.btn-warning.active,
-.open .dropdown-toggle.btn-warning {
- background-image: none;
-}
-.btn-warning.disabled,
-.btn-warning[disabled],
-fieldset[disabled] .btn-warning,
-.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:active,
-.btn-warning[disabled]:active,
-fieldset[disabled] .btn-warning:active,
-.btn-warning.disabled.active,
-.btn-warning[disabled].active,
-fieldset[disabled] .btn-warning.active {
- 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:hover,
-.btn-danger:focus,
-.btn-danger:active,
-.btn-danger.active,
-.open .dropdown-toggle.btn-danger {
- color: #fff;
- background-color: #d2322d;
- border-color: #ac2925;
-}
-.btn-danger:active,
-.btn-danger.active,
-.open .dropdown-toggle.btn-danger {
- background-image: none;
-}
-.btn-danger.disabled,
-.btn-danger[disabled],
-fieldset[disabled] .btn-danger,
-.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:active,
-.btn-danger[disabled]:active,
-fieldset[disabled] .btn-danger:active,
-.btn-danger.disabled.active,
-.btn-danger[disabled].active,
-fieldset[disabled] .btn-danger.active {
- background-color: #d9534f;
- border-color: #d43f3a;
-}
-.btn-danger .badge {
- color: #d9534f;
- background-color: #fff;
-}
-.btn-link {
- font-weight: normal;
- color: #428bca;
- cursor: pointer;
- border-radius: 0;
-}
-.btn-link,
-.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: #2a6496;
- 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: #999;
- text-decoration: none;
-}
-.btn-lg,
-.btn-group-lg > .btn {
- padding: 10px 16px;
- font-size: 18px;
- line-height: 1.33;
- border-radius: 6px;
-}
-.btn-sm,
-.btn-group-sm > .btn {
- padding: 5px 10px;
- font-size: 12px;
- line-height: 1.5;
- border-radius: 3px;
-}
-.btn-sm {
- padding: 2px 10px 8px 10px;
-}
-.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%;
- padding-right: 0;
- padding-left: 0;
-}
-.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;
- transition: opacity .15s linear;
-}
-.fade.in {
- opacity: 1;
-}
-.collapse {
- display: none;
-}
-.collapse.in {
- display: block;
-}
-.collapsing {
- position: relative;
- height: 0;
- overflow: hidden;
- -webkit-transition: height .35s ease;
- transition: height .35s ease;
-}
-@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.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: "\2a";
-}
-.glyphicon-plus:before {
- content: "\2b";
-}
-.glyphicon-euro: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";
-}
-.caret {
- display: inline-block;
- width: 0;
- height: 0;
- margin-left: 2px;
- vertical-align: middle;
- border-top: 4px solid;
- border-right: 4px solid transparent;
- border-left: 4px solid transparent;
-}
-.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;
- list-style: none;
- background-color: #fff;
- 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: #428bca;
- outline: 0;
-}
-.dropdown-menu > .disabled > a,
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
- color: #999;
-}
-.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: #999;
-}
-.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 solid;
-}
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-bottom: 1px;
-}
-@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:focus,
-.btn-group-vertical > .btn:focus {
- outline: none;
-}
-.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-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 > .btn:last-child,
-.btn-group > .btn-group:first-child > .dropdown-toggle {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-.btn-group > .btn-group:last-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-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-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%;
-}
-[data-toggle="buttons"] > .btn > input[type="radio"],
-[data-toggle="buttons"] > .btn > input[type="checkbox"] {
- display: 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-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.33;
- 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 {
- 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: #999;
-}
-.nav > li.disabled > a:hover,
-.nav > li.disabled > a:focus {
- color: #999;
- 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: #428bca;
-}
-.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: #428bca;
-}
-.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 {
- max-height: 340px;
- padding-right: 15px;
- padding-left: 15px;
- overflow-x: visible;
- -webkit-overflow-scrolling: touch;
- border-top: 1px solid transparent;
- 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;
- 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;
- }
-}
-.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;
-}
-@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: none;
-}
-.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;
- 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-nav.navbar-right:last-child {
- margin-right: -15px;
- }
-}
-@media (min-width: 768px) {
- .navbar-left {
- float: left !important;
- }
- .navbar-right {
- float: right !important;
- }
-}
-.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 .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;
- padding-left: 0;
- margin-top: 0;
- margin-bottom: 0;
- vertical-align: middle;
- }
- .navbar-form .radio input[type="radio"],
- .navbar-form .checkbox input[type="checkbox"] {
- float: none;
- margin-left: 0;
- }
- .navbar-form .has-feedback .form-control-feedback {
- top: 0;
- }
-}
-@media (max-width: 767px) {
- .navbar-form .form-group {
- margin-bottom: 5px;
- }
-}
-@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-form.navbar-right:last-child {
- margin-right: -15px;
- }
-}
-.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 {
- 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;
- }
- .navbar-text.navbar-right:last-child {
- 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-inverse {
- background-color: #222;
- border-color: #080808;
-}
-.navbar-inverse .navbar-brand {
- color: #999;
-}
-.navbar-inverse .navbar-brand:hover,
-.navbar-inverse .navbar-brand:focus {
- color: #fff;
- background-color: transparent;
-}
-.navbar-inverse .navbar-text {
- color: #999;
-}
-.navbar-inverse .navbar-nav > li > a {
- color: #999;
-}
-.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: #999;
- }
- .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: #999;
-}
-.navbar-inverse .navbar-link:hover {
- color: #fff;
-}
-.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: #999;
-}
-.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: #428bca;
- 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 {
- color: #2a6496;
- 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: 2;
- color: #fff;
- cursor: default;
- background-color: #428bca;
- border-color: #428bca;
-}
-.pagination > .disabled > span,
-.pagination > .disabled > span:hover,
-.pagination > .disabled > span:focus,
-.pagination > .disabled > a,
-.pagination > .disabled > a:hover,
-.pagination > .disabled > a:focus {
- color: #999;
- cursor: not-allowed;
- background-color: #fff;
- border-color: #ddd;
-}
-.pagination-lg > li > a,
-.pagination-lg > li > span {
- padding: 10px 16px;
- font-size: 18px;
-}
-.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;
-}
-.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: #999;
- 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;
-}
-.label[href]:hover,
-.label[href]:focus {
- color: #fff;
- text-decoration: none;
- cursor: pointer;
-}
-.label:empty {
- display: none;
-}
-.btn .label {
- position: relative;
- top: -1px;
-}
-.label-default {
- background-color: #999;
-}
-.label-default[href]:hover,
-.label-default[href]:focus {
- background-color: #808080;
-}
-.label-primary {
- background-color: #428bca;
-}
-.label-primary[href]:hover,
-.label-primary[href]:focus {
- background-color: #3071a9;
-}
-.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: baseline;
- background-color: #999;
- border-radius: 10px;
-}
-.badge:empty {
- display: none;
-}
-.btn .badge {
- position: relative;
- top: -1px;
-}
-.btn-xs .badge {
- top: 0;
- padding: 1px 5px;
-}
-a.badge:hover,
-a.badge:focus {
- color: #fff;
- text-decoration: none;
- cursor: pointer;
-}
-a.list-group-item.active > .badge,
-.nav-pills > .active > a > .badge {
- color: #428bca;
- background-color: #fff;
-}
-.nav-pills > li > a > .badge {
- margin-left: 3px;
-}
-.jumbotron {
- padding: 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;
-}
-.container .jumbotron {
- border-radius: 6px;
-}
-.jumbotron .container {
- max-width: 100%;
-}
-@media screen and (min-width: 768px) {
- .jumbotron {
- padding-top: 48px;
- padding-bottom: 48px;
- }
- .container .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: all .2s ease-in-out;
- transition: all .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: #428bca;
-}
-.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 {
- padding-right: 35px;
-}
-.alert-dismissable .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;
- }
-}
-@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: #428bca;
- -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;
- transition: width .6s ease;
-}
-.progress-striped .progress-bar {
- 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: 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-size: 40px 40px;
-}
-.progress.active .progress-bar {
- -webkit-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: 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: 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: 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: 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,
-.media-body {
- overflow: hidden;
- zoom: 1;
-}
-.media,
-.media .media {
- margin-top: 15px;
-}
-.media:first-child {
- margin-top: 0;
-}
-.media-object {
- display: block;
-}
-.media-heading {
- margin: 0 0 5px;
-}
-.media > .pull-left {
- margin-right: 10px;
-}
-.media > .pull-right {
- margin-left: 10px;
-}
-.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;
-}
-.list-group-item > .badge {
- float: right;
-}
-.list-group-item > .badge + .badge {
- margin-right: 5px;
-}
-a.list-group-item {
- color: #555;
-}
-a.list-group-item .list-group-item-heading {
- color: #333;
-}
-a.list-group-item:hover,
-a.list-group-item:focus {
- text-decoration: none;
- background-color: #f5f5f5;
-}
-a.list-group-item.active,
-a.list-group-item.active:hover,
-a.list-group-item.active:focus {
- z-index: 2;
- color: #fff;
- background-color: #428bca;
- border-color: #428bca;
-}
-a.list-group-item.active .list-group-item-heading,
-a.list-group-item.active:hover .list-group-item-heading,
-a.list-group-item.active:focus .list-group-item-heading {
- color: inherit;
-}
-a.list-group-item.active .list-group-item-text,
-a.list-group-item.active:hover .list-group-item-text,
-a.list-group-item.active:focus .list-group-item-text {
- color: #e1edf7;
-}
-.list-group-item-success {
- color: #3c763d;
- background-color: #dff0d8;
-}
-a.list-group-item-success {
- color: #3c763d;
-}
-a.list-group-item-success .list-group-item-heading {
- color: inherit;
-}
-a.list-group-item-success:hover,
-a.list-group-item-success:focus {
- color: #3c763d;
- background-color: #d0e9c6;
-}
-a.list-group-item-success.active,
-a.list-group-item-success.active:hover,
-a.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 {
- color: #31708f;
-}
-a.list-group-item-info .list-group-item-heading {
- color: inherit;
-}
-a.list-group-item-info:hover,
-a.list-group-item-info:focus {
- color: #31708f;
- background-color: #c4e3f3;
-}
-a.list-group-item-info.active,
-a.list-group-item-info.active:hover,
-a.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 {
- color: #8a6d3b;
-}
-a.list-group-item-warning .list-group-item-heading {
- color: inherit;
-}
-a.list-group-item-warning:hover,
-a.list-group-item-warning:focus {
- color: #8a6d3b;
- background-color: #faf2cc;
-}
-a.list-group-item-warning.active,
-a.list-group-item-warning.active:hover,
-a.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 {
- color: #a94442;
-}
-a.list-group-item-danger .list-group-item-heading {
- color: inherit;
-}
-a.list-group-item-danger:hover,
-a.list-group-item-danger:focus {
- color: #a94442;
- background-color: #ebcccc;
-}
-a.list-group-item-danger.active,
-a.list-group-item-danger.active:hover,
-a.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 {
- 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 {
- margin-bottom: 0;
-}
-.panel > .list-group .list-group-item {
- border-width: 1px 0;
- border-radius: 0;
-}
-.panel > .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 {
- border-bottom: 0;
- border-bottom-right-radius: 3px;
- border-bottom-left-radius: 3px;
-}
-.panel-heading + .list-group .list-group-item:first-child {
- border-top-width: 0;
-}
-.panel > .table,
-.panel > .table-responsive > .table {
- margin-bottom: 0;
-}
-.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 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 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 {
- 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;
- overflow: hidden;
- 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 {
- 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-footer + .panel-collapse .panel-body {
- border-bottom-color: #ddd;
-}
-.panel-primary {
- border-color: #428bca;
-}
-.panel-primary > .panel-heading {
- color: #fff;
- background-color: #428bca;
- border-color: #428bca;
-}
-.panel-primary > .panel-heading + .panel-collapse .panel-body {
- border-top-color: #428bca;
-}
-.panel-primary > .panel-footer + .panel-collapse .panel-body {
- border-bottom-color: #428bca;
-}
-.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-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-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-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-footer + .panel-collapse .panel-body {
- border-bottom-color: #ebccd1;
-}
-.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: auto;
- overflow-y: scroll;
- -webkit-overflow-scrolling: touch;
- outline: 0;
-}
-.modal.fade .modal-dialog {
- -webkit-transition: -webkit-transform .3s ease-out;
- -moz-transition: -moz-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%);
- transform: translate(0, -25%);
-}
-.modal.in .modal-dialog {
- -webkit-transform: translate(0, 0);
- -ms-transform: translate(0, 0);
- transform: translate(0, 0);
-}
-.modal-dialog {
- position: relative;
- width: auto;
- margin: 10px;
-}
-.modal-content {
- position: relative;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid #999;
- border: 1px solid rgba(0, 0, 0, .2);
- border-radius: 6px;
- outline: none;
- -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;*/
- background-color: #fff;
-}
-.modal-backdrop.fade {
- filter: alpha(opacity=0);
- opacity: 0;
-}
-.modal-backdrop.in {
- filter: alpha(opacity=50);
- opacity: .5;
-}
-.modal-header {
- min-height: 16.42857143px;
- 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: 20px;
-}
-.modal-footer {
- padding: 19px 20px 20px;
- margin-top: 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;
-}
-@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: 1030;
- display: block;
- font-size: 12px;
- line-height: 1.4;
- visibility: visible;
- filter: alpha(opacity=0);
- opacity: 0;
-}
-.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;
- text-decoration: none;
- 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 {
- bottom: 0;
- left: 5px;
- border-width: 5px 5px 0;
- border-top-color: #000;
-}
-.tooltip.top-right .tooltip-arrow {
- right: 5px;
- bottom: 0;
- 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;
- left: 5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000;
-}
-.tooltip.bottom-right .tooltip-arrow {
- top: 0;
- right: 5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000;
-}
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1010;
- display: none;
- max-width: 276px;
- padding: 1px;
- text-align: left;
- white-space: normal;
- background-color: #fff;
- 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);
-}
-.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;
- font-weight: normal;
- line-height: 18px;
- 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;
- transition: .6s ease-in-out left;
-}
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
- line-height: 1;
-}
-.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);
- filter: alpha(opacity=50);
- opacity: .5;
-}
-.carousel-control.left {
- background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .5) 0%), color-stop(rgba(0, 0, 0, .0001) 100%));
- 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, color-stop(rgba(0, 0, 0, .0001) 0%), color-stop(rgba(0, 0, 0, .5) 100%));
- 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: none;
- 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;
-}
-.carousel-control .icon-prev,
-.carousel-control .glyphicon-chevron-left {
- left: 50%;
-}
-.carousel-control .icon-next,
-.carousel-control .glyphicon-chevron-right {
- right: 50%;
-}
-.carousel-control .icon-prev,
-.carousel-control .icon-next {
- width: 20px;
- height: 20px;
- margin-top: -10px;
- margin-left: -10px;
- font-family: serif;
-}
-.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: -15px;
- margin-left: -15px;
- font-size: 30px;
- }
- .carousel-caption {
- right: 20%;
- left: 20%;
- padding-bottom: 30px;
- }
- .carousel-indicators {
- bottom: 20px;
- }
-}
-.clearfix:before,
-.clearfix: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-footer:before,
-.modal-footer:after {
- display: table;
- content: " ";
-}
-.clearfix: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-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;
- visibility: hidden !important;
-}
-.affix {
- position: fixed;
-}
-@-ms-viewport {
- width: device-width;
-}
-.visible-xs,
-.visible-sm,
-.visible-md,
-.visible-lg {
- display: none !important;
-}
-@media (max-width: 767px) {
- .visible-xs {
- display: block !important;
- }
- table.visible-xs {
- display: table;
- }
- tr.visible-xs {
- display: table-row !important;
- }
- th.visible-xs,
- td.visible-xs {
- display: table-cell !important;
- }
-}
-@media (min-width: 768px) and (max-width: 991px) {
- .visible-sm {
- display: block !important;
- }
- table.visible-sm {
- display: table;
- }
- tr.visible-sm {
- display: table-row !important;
- }
- th.visible-sm,
- td.visible-sm {
- display: table-cell !important;
- }
-}
-@media (min-width: 992px) and (max-width: 1199px) {
- .visible-md {
- display: block !important;
- }
- table.visible-md {
- display: table;
- }
- tr.visible-md {
- display: table-row !important;
- }
- th.visible-md,
- td.visible-md {
- display: table-cell !important;
- }
-}
-@media (min-width: 1200px) {
- .visible-lg {
- display: block !important;
- }
- table.visible-lg {
- display: table;
- }
- tr.visible-lg {
- display: table-row !important;
- }
- th.visible-lg,
- td.visible-lg {
- display: table-cell !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;
- }
- tr.visible-print {
- display: table-row !important;
- }
- th.visible-print,
- td.visible-print {
- display: table-cell !important;
- }
-}
-@media print {
- .hidden-print {
- display: none !important;
- }
-}
-/*# sourceMappingURL=bootstrap.css.map */
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js
deleted file mode 100644
index a5271e0..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.js
+++ /dev/null
@@ -1,1945 +0,0 @@
-if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
-
-/* ========================================================================
- * Bootstrap: transition.js v3.1.1
- * http://getbootstrap.com/javascript/#transitions
- * ========================================================================
- * Copyright 2011-2014 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, $el = this
- $(this).one($.support.transition.end, function () { called = true })
- var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
- setTimeout(callback, duration)
- return this
- }
-
- $(function () {
- $.support.transition = transitionEnd()
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: alert.js v3.1.1
- * http://getbootstrap.com/javascript/#alerts
- * ========================================================================
- * Copyright 2011-2014 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.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)
-
- if (e) e.preventDefault()
-
- if (!$parent.length) {
- $parent = $this.hasClass('alert') ? $this : $this.parent()
- }
-
- $parent.trigger(e = $.Event('close.bs.alert'))
-
- if (e.isDefaultPrevented()) return
-
- $parent.removeClass('in')
-
- function removeElement() {
- $parent.trigger('closed.bs.alert').remove()
- }
-
- $.support.transition && $parent.hasClass('fade') ?
- $parent
- .one($.support.transition.end, removeElement)
- .emulateTransitionEnd(150) :
- removeElement()
- }
-
-
- // ALERT PLUGIN DEFINITION
- // =======================
-
- var old = $.fn.alert
-
- $.fn.alert = function (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)
- })
- }
-
- $.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.1.1
- * http://getbootstrap.com/javascript/#buttons
- * ========================================================================
- * Copyright 2011-2014 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.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 = state + 'Text'
-
- if (!data.resetText) $el.data('resetText', $el[val]())
-
- $el[val](data[state] || this.options[state])
-
- // push to event loop to allow forms to submit
- setTimeout($.proxy(function () {
- if (state == 'loadingText') {
- this.isLoading = true
- $el.addClass(d).attr(d, d)
- } else if (this.isLoading) {
- this.isLoading = false
- $el.removeClass(d).removeAttr(d)
- }
- }, 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') && this.$element.hasClass('active')) changed = false
- else $parent.find('.active').removeClass('active')
- }
- if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
- }
-
- if (changed) this.$element.toggleClass('active')
- }
-
-
- // BUTTON PLUGIN DEFINITION
- // ========================
-
- var old = $.fn.button
-
- $.fn.button = function (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)
- })
- }
-
- $.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)
- if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
- $btn.button('toggle')
- e.preventDefault()
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: carousel.js v3.1.1
- * http://getbootstrap.com/javascript/#carousel
- * ========================================================================
- * Copyright 2011-2014 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 =
- this.sliding =
- this.interval =
- this.$active =
- this.$items = null
-
- this.options.pause == 'hover' && this.$element
- .on('mouseenter', $.proxy(this.pause, this))
- .on('mouseleave', $.proxy(this.cycle, this))
- }
-
- Carousel.DEFAULTS = {
- interval: 5000,
- pause: 'hover',
- wrap: true
- }
-
- 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.getActiveIndex = function () {
- this.$active = this.$element.find('.item.active')
- this.$items = this.$active.parent().children()
-
- return this.$items.index(this.$active)
- }
-
- Carousel.prototype.to = function (pos) {
- var that = this
- var activeIndex = this.getActiveIndex()
-
- if (pos > (this.$items.length - 1) || pos < 0) return
-
- if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
- if (activeIndex == pos) return this.pause().cycle()
-
- return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[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 || $active[type]()
- var isCycling = this.interval
- var direction = type == 'next' ? 'left' : 'right'
- var fallback = type == 'next' ? 'first' : 'last'
- var that = this
-
- if (!$next.length) {
- if (!this.options.wrap) return
- $next = this.$element.find('.item')[fallback]()
- }
-
- if ($next.hasClass('active')) return this.sliding = false
-
- var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
- this.$element.trigger(e)
- if (e.isDefaultPrevented()) return
-
- this.sliding = true
-
- isCycling && this.pause()
-
- if (this.$indicators.length) {
- this.$indicators.find('.active').removeClass('active')
- this.$element.one('slid.bs.carousel', function () {
- var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
- $nextIndicator && $nextIndicator.addClass('active')
- })
- }
-
- if ($.support.transition && this.$element.hasClass('slide')) {
- $next.addClass(type)
- $next[0].offsetWidth // force reflow
- $active.addClass(direction)
- $next.addClass(direction)
- $active
- .one($.support.transition.end, function () {
- $next.removeClass([type, direction].join(' ')).addClass('active')
- $active.removeClass(['active', direction].join(' '))
- that.sliding = false
- setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)
- })
- .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
- } else {
- $active.removeClass('active')
- $next.addClass('active')
- this.sliding = false
- this.$element.trigger('slid.bs.carousel')
- }
-
- isCycling && this.cycle()
-
- return this
- }
-
-
- // CAROUSEL PLUGIN DEFINITION
- // ==========================
-
- var old = $.fn.carousel
-
- $.fn.carousel = function (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()
- })
- }
-
- $.fn.carousel.Constructor = Carousel
-
-
- // CAROUSEL NO CONFLICT
- // ====================
-
- $.fn.carousel.noConflict = function () {
- $.fn.carousel = old
- return this
- }
-
-
- // CAROUSEL DATA-API
- // =================
-
- $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
- var $this = $(this), href
- var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
- var options = $.extend({}, $target.data(), $this.data())
- var slideIndex = $this.attr('data-slide-to')
- if (slideIndex) options.interval = false
-
- $target.carousel(options)
-
- if (slideIndex = $this.attr('data-slide-to')) {
- $target.data('bs.carousel').to(slideIndex)
- }
-
- e.preventDefault()
- })
-
- $(window).on('load', function () {
- $('[data-ride="carousel"]').each(function () {
- var $carousel = $(this)
- $carousel.carousel($carousel.data())
- })
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: collapse.js v3.1.1
- * http://getbootstrap.com/javascript/#collapse
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // COLLAPSE PUBLIC CLASS DEFINITION
- // ================================
-
- var Collapse = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, Collapse.DEFAULTS, options)
- this.transitioning = null
-
- if (this.options.parent) this.$parent = $(this.options.parent)
- if (this.options.toggle) this.toggle()
- }
-
- 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 startEvent = $.Event('show.bs.collapse')
- this.$element.trigger(startEvent)
- if (startEvent.isDefaultPrevented()) return
-
- var actives = this.$parent && this.$parent.find('> .panel > .in')
-
- if (actives && actives.length) {
- var hasData = actives.data('bs.collapse')
- if (hasData && hasData.transitioning) return
- actives.collapse('hide')
- hasData || actives.data('bs.collapse', null)
- }
-
- var dimension = this.dimension()
-
- this.$element
- .removeClass('collapse')
- .addClass('collapsing')
- [dimension](0)
-
- this.transitioning = 1
-
- var complete = function () {
- this.$element
- .removeClass('collapsing')
- .addClass('collapse in')
- [dimension]('auto')
- 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($.support.transition.end, $.proxy(complete, this))
- .emulateTransitionEnd(350)
- [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')
- .removeClass('in')
-
- this.transitioning = 1
-
- var complete = function () {
- this.transitioning = 0
- this.$element
- .trigger('hidden.bs.collapse')
- .removeClass('collapsing')
- .addClass('collapse')
- }
-
- if (!$.support.transition) return complete.call(this)
-
- this.$element
- [dimension](0)
- .one($.support.transition.end, $.proxy(complete, this))
- .emulateTransitionEnd(350)
- }
-
- Collapse.prototype.toggle = function () {
- this[this.$element.hasClass('in') ? 'hide' : 'show']()
- }
-
-
- // COLLAPSE PLUGIN DEFINITION
- // ==========================
-
- var old = $.fn.collapse
-
- $.fn.collapse = function (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 && option == 'show') option = !option
- if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.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), href
- var target = $this.attr('data-target')
- || e.preventDefault()
- || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
- var $target = $(target)
- var data = $target.data('bs.collapse')
- var option = data ? 'toggle' : $this.data()
- var parent = $this.attr('data-parent')
- var $parent = parent && $(parent)
-
- if (!data || !data.transitioning) {
- if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
- $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
- }
-
- $target.collapse(option)
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: dropdown.js v3.1.1
- * http://getbootstrap.com/javascript/#dropdowns
- * ========================================================================
- * Copyright 2011-2014 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.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
- $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
- }
-
- var relatedTarget = { relatedTarget: this }
- $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
-
- if (e.isDefaultPrevented()) return
-
- $parent
- .toggleClass('open')
- .trigger('shown.bs.dropdown', relatedTarget)
-
- $this.focus()
- }
-
- return false
- }
-
- Dropdown.prototype.keydown = function (e) {
- if (!/(38|40|27)/.test(e.keyCode)) 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 || (isActive && e.keyCode == 27)) {
- if (e.which == 27) $parent.find(toggle).focus()
- return $this.click()
- }
-
- var desc = ' li:not(.divider):visible a'
- var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)
-
- if (!$items.length) return
-
- var index = $items.index($items.filter(':focus'))
-
- if (e.keyCode == 38 && index > 0) index-- // up
- if (e.keyCode == 40 && index < $items.length - 1) index++ // down
- if (!~index) index = 0
-
- $items.eq(index).focus()
- }
-
- function clearMenus(e) {
- $(backdrop).remove()
- $(toggle).each(function () {
- var $parent = getParent($(this))
- var relatedTarget = { relatedTarget: this }
- if (!$parent.hasClass('open')) return
- $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
- if (e.isDefaultPrevented()) return
- $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
- })
- }
-
- 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()
- }
-
-
- // DROPDOWN PLUGIN DEFINITION
- // ==========================
-
- var old = $.fn.dropdown
-
- $.fn.dropdown = function (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)
- })
- }
-
- $.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 + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: modal.js v3.1.1
- * http://getbootstrap.com/javascript/#modals
- * ========================================================================
- * Copyright 2011-2014 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.$element = $(element)
- this.$backdrop =
- this.isShown = null
-
- if (this.options.remote) {
- this.$element
- .find('.modal-content')
- .load(this.options.remote, $.proxy(function () {
- this.$element.trigger('loaded.bs.modal')
- }, this))
- }
- }
-
- Modal.DEFAULTS = {
- backdrop: true,
- keyboard: true,
- show: true
- }
-
- Modal.prototype.toggle = function (_relatedTarget) {
- return this[!this.isShown ? 'show' : 'hide'](_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.escape()
-
- this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
-
- this.backdrop(function () {
- var transition = $.support.transition && that.$element.hasClass('fade')
-
- if (!that.$element.parent().length) {
- that.$element.appendTo(document.body) // don't move modals dom position
- }
-
- that.$element
- .show()
- .scrollTop(0)
-
- if (transition) {
- that.$element[0].offsetWidth // force reflow
- }
-
- that.$element
- .addClass('in')
- .attr('aria-hidden', false)
-
- that.enforceFocus()
-
- var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
-
- transition ?
- that.$element.find('.modal-dialog') // wait for modal to slide in
- .one($.support.transition.end, function () {
- that.$element.focus().trigger(e)
- })
- .emulateTransitionEnd(300) :
- that.$element.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()
-
- $(document).off('focusin.bs.modal')
-
- this.$element
- .removeClass('in')
- .attr('aria-hidden', true)
- .off('click.dismiss.bs.modal')
-
- $.support.transition && this.$element.hasClass('fade') ?
- this.$element
- .one($.support.transition.end, $.proxy(this.hideModal, this))
- .emulateTransitionEnd(300) :
- this.hideModal()
- }
-
- Modal.prototype.enforceFocus = function () {
- $(document)
- .off('focusin.bs.modal') // guard against infinite focus loop
- .on('focusin.bs.modal', $.proxy(function (e) {
- if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
- this.$element.focus()
- }
- }, this))
- }
-
- Modal.prototype.escape = function () {
- if (this.isShown && this.options.keyboard) {
- this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
- e.which == 27 && this.hide()
- }, this))
- } else if (!this.isShown) {
- this.$element.off('keyup.dismiss.bs.modal')
- }
- }
-
- Modal.prototype.hideModal = function () {
- var that = this
- this.$element.hide()
- this.backdrop(function () {
- that.removeBackdrop()
- that.$element.trigger('hidden.bs.modal')
- })
- }
-
- Modal.prototype.removeBackdrop = function () {
- this.$backdrop && this.$backdrop.remove()
- this.$backdrop = null
- }
-
- Modal.prototype.backdrop = function (callback) {
- var animate = this.$element.hasClass('fade') ? 'fade' : ''
-
- if (this.isShown && this.options.backdrop) {
- var doAnimate = $.support.transition && animate
-
- this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
- .appendTo(document.body)
-
- this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
- if (e.target !== e.currentTarget) return
- this.options.backdrop == 'static'
- ? this.$element[0].focus.call(this.$element[0])
- : this.hide.call(this)
- }, this))
-
- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
-
- this.$backdrop.addClass('in')
-
- if (!callback) return
-
- doAnimate ?
- this.$backdrop
- .one($.support.transition.end, callback)
- .emulateTransitionEnd(150) :
- callback()
-
- } else if (!this.isShown && this.$backdrop) {
- this.$backdrop.removeClass('in')
-
- $.support.transition && this.$element.hasClass('fade') ?
- this.$backdrop
- .one($.support.transition.end, callback)
- .emulateTransitionEnd(150) :
- callback()
-
- } else if (callback) {
- callback()
- }
- }
-
-
- // MODAL PLUGIN DEFINITION
- // =======================
-
- var old = $.fn.modal
-
- $.fn.modal = function (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)
- })
- }
-
- $.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
- .modal(option, this)
- .one('hide', function () {
- $this.is(':visible') && $this.focus()
- })
- })
-
- $(document)
- .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
- .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tooltip.js v3.1.1
- * http://getbootstrap.com/javascript/#tooltip
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ========================================================================
- * Copyright 2011-2014 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 =
- this.options =
- this.enabled =
- this.timeout =
- this.hoverState =
- this.$element = null
-
- this.init('tooltip', element, options)
- }
-
- Tooltip.DEFAULTS = {
- animation: true,
- placement: 'top',
- selector: false,
- template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
- trigger: 'hover focus',
- title: '',
- delay: 0,
- html: false,
- container: false
- }
-
- Tooltip.prototype.init = function (type, element, options) {
- this.enabled = true
- this.type = type
- this.$element = $(element)
- this.options = this.getOptions(options)
-
- 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)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
-
- 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.leave = function (obj) {
- var self = obj instanceof this.constructor ?
- obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
-
- 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)
-
- if (e.isDefaultPrevented()) return
- var that = this;
-
- var $tip = this.tip()
-
- this.setContent()
-
- 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)
-
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
-
- var pos = this.getPosition()
- var actualWidth = $tip[0].offsetWidth
- var actualHeight = $tip[0].offsetHeight
-
- if (autoPlace) {
- var $parent = this.$element.parent()
-
- var orgPlacement = placement
- var docScroll = document.documentElement.scrollTop || document.body.scrollTop
- var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()
- var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
- var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
-
- placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
- placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
- placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
- placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
- placement
-
- $tip
- .removeClass(orgPlacement)
- .addClass(placement)
- }
-
- var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
-
- this.applyPlacement(calculatedOffset, placement)
- this.hoverState = null
-
- var complete = function() {
- that.$element.trigger('shown.bs.' + that.type)
- }
-
- $.support.transition && this.$tip.hasClass('fade') ?
- $tip
- .one($.support.transition.end, complete)
- .emulateTransitionEnd(150) :
- complete()
- }
- }
-
- Tooltip.prototype.applyPlacement = function (offset, placement) {
- var replace
- 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 = offset.top + marginTop
- offset.left = 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) {
- replace = true
- offset.top = offset.top + height - actualHeight
- }
-
- if (/bottom|top/.test(placement)) {
- var delta = 0
-
- if (offset.left < 0) {
- delta = offset.left * -2
- offset.left = 0
-
- $tip.offset(offset)
-
- actualWidth = $tip[0].offsetWidth
- actualHeight = $tip[0].offsetHeight
- }
-
- this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
- } else {
- this.replaceArrow(actualHeight - height, actualHeight, 'top')
- }
-
- if (replace) $tip.offset(offset)
- }
-
- Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
- this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
- }
-
- 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 () {
- var that = this
- var $tip = this.tip()
- var e = $.Event('hide.bs.' + this.type)
-
- function complete() {
- if (that.hoverState != 'in') $tip.detach()
- that.$element.trigger('hidden.bs.' + that.type)
- }
-
- this.$element.trigger(e)
-
- if (e.isDefaultPrevented()) return
-
- $tip.removeClass('in')
-
- $.support.transition && this.$tip.hasClass('fade') ?
- $tip
- .one($.support.transition.end, complete)
- .emulateTransitionEnd(150) :
- 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 () {
- var el = this.$element[0]
- return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
- width: el.offsetWidth,
- height: el.offsetHeight
- }, this.$element.offset())
- }
-
- 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.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.tip = function () {
- return this.$tip = this.$tip || $(this.options.template)
- }
-
- Tooltip.prototype.arrow = function () {
- return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
- }
-
- Tooltip.prototype.validate = function () {
- if (!this.$element[0].parentNode) {
- this.hide()
- this.$element = null
- this.options = null
- }
- }
-
- 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 = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
- self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
- }
-
- Tooltip.prototype.destroy = function () {
- clearTimeout(this.timeout)
- this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
- }
-
-
- // TOOLTIP PLUGIN DEFINITION
- // =========================
-
- var old = $.fn.tooltip
-
- $.fn.tooltip = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.tooltip')
- var options = typeof option == 'object' && option
-
- if (!data && option == 'destroy') return
- if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.tooltip.Constructor = Tooltip
-
-
- // TOOLTIP NO CONFLICT
- // ===================
-
- $.fn.tooltip.noConflict = function () {
- $.fn.tooltip = old
- return this
- }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: popover.js v3.1.1
- * http://getbootstrap.com/javascript/#popovers
- * ========================================================================
- * Copyright 2011-2014 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.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
- placement: 'right',
- trigger: 'click',
- content: '',
- template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
- })
-
-
- // 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')[ // 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.prototype.tip = function () {
- if (!this.$tip) this.$tip = $(this.options.template)
- return this.$tip
- }
-
-
- // POPOVER PLUGIN DEFINITION
- // =========================
-
- var old = $.fn.popover
-
- $.fn.popover = function (option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.popover')
- var options = typeof option == 'object' && option
-
- if (!data && option == 'destroy') return
- if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.popover.Constructor = Popover
-
-
- // POPOVER NO CONFLICT
- // ===================
-
- $.fn.popover.noConflict = function () {
- $.fn.popover = old
- return this
- }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: scrollspy.js v3.1.1
- * http://getbootstrap.com/javascript/#scrollspy
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // SCROLLSPY CLASS DEFINITION
- // ==========================
-
- function ScrollSpy(element, options) {
- var href
- var process = $.proxy(this.process, this)
-
- this.$element = $(element).is('body') ? $(window) : $(element)
- this.$body = $('body')
- this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
- this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
- this.selector = (this.options.target
- || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
- || '') + ' .nav li > a'
- this.offsets = $([])
- this.targets = $([])
- this.activeTarget = null
-
- this.refresh()
- this.process()
- }
-
- ScrollSpy.DEFAULTS = {
- offset: 10
- }
-
- ScrollSpy.prototype.refresh = function () {
- var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
-
- this.offsets = $([])
- this.targets = $([])
-
- var self = this
- var $targets = 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 + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
- })
- .sort(function (a, b) { return a[0] - b[0] })
- .each(function () {
- self.offsets.push(this[0])
- self.targets.push(this[1])
- })
- }
-
- ScrollSpy.prototype.process = function () {
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
- var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
- var maxScroll = scrollHeight - this.$scrollElement.height()
- var offsets = this.offsets
- var targets = this.targets
- var activeTarget = this.activeTarget
- var i
-
- if (scrollTop >= maxScroll) {
- return activeTarget != (i = targets.last()[0]) && this.activate(i)
- }
-
- if (activeTarget && scrollTop <= offsets[0]) {
- return activeTarget != (i = targets[0]) && this.activate(i)
- }
-
- for (i = offsets.length; i--;) {
- activeTarget != targets[i]
- && scrollTop >= offsets[i]
- && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
- && this.activate( targets[i] )
- }
- }
-
- ScrollSpy.prototype.activate = function (target) {
- this.activeTarget = target
-
- $(this.selector)
- .parentsUntil(this.options.target, '.active')
- .removeClass('active')
-
- 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 PLUGIN DEFINITION
- // ===========================
-
- var old = $.fn.scrollspy
-
- $.fn.scrollspy = function (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]()
- })
- }
-
- $.fn.scrollspy.Constructor = ScrollSpy
-
-
- // SCROLLSPY NO CONFLICT
- // =====================
-
- $.fn.scrollspy.noConflict = function () {
- $.fn.scrollspy = old
- return this
- }
-
-
- // SCROLLSPY DATA-API
- // ==================
-
- $(window).on('load', function () {
- $('[data-spy="scroll"]').each(function () {
- var $spy = $(this)
- $spy.scrollspy($spy.data())
- })
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tab.js v3.1.1
- * http://getbootstrap.com/javascript/#tabs
- * ========================================================================
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // TAB CLASS DEFINITION
- // ====================
-
- var Tab = function (element) {
- this.element = $(element)
- }
-
- 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')[0]
- var e = $.Event('show.bs.tab', {
- relatedTarget: previous
- })
-
- $this.trigger(e)
-
- if (e.isDefaultPrevented()) return
-
- var $target = $(selector)
-
- this.activate($this.parent('li'), $ul)
- this.activate($target, $target.parent(), function () {
- $this.trigger({
- type: 'shown.bs.tab',
- relatedTarget: previous
- })
- })
- }
-
- Tab.prototype.activate = function (element, container, callback) {
- var $active = container.find('> .active')
- var transition = callback
- && $.support.transition
- && $active.hasClass('fade')
-
- function next() {
- $active
- .removeClass('active')
- .find('> .dropdown-menu > .active')
- .removeClass('active')
-
- element.addClass('active')
-
- if (transition) {
- element[0].offsetWidth // reflow for transition
- element.addClass('in')
- } else {
- element.removeClass('fade')
- }
-
- if (element.parent('.dropdown-menu')) {
- element.closest('li.dropdown').addClass('active')
- }
-
- callback && callback()
- }
-
- transition ?
- $active
- .one($.support.transition.end, next)
- .emulateTransitionEnd(150) :
- next()
-
- $active.removeClass('in')
- }
-
-
- // TAB PLUGIN DEFINITION
- // =====================
-
- var old = $.fn.tab
-
- $.fn.tab = function ( 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]()
- })
- }
-
- $.fn.tab.Constructor = Tab
-
-
- // TAB NO CONFLICT
- // ===============
-
- $.fn.tab.noConflict = function () {
- $.fn.tab = old
- return this
- }
-
-
- // TAB DATA-API
- // ============
-
- $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
- e.preventDefault()
- $(this).tab('show')
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: affix.js v3.1.1
- * http://getbootstrap.com/javascript/#affix
- * ========================================================================
- * Copyright 2011-2014 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.$window = $(window)
- .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 =
- this.unpin =
- this.pinnedOffset = null
-
- this.checkPosition()
- }
-
- Affix.RESET = 'affix affix-top affix-bottom'
-
- Affix.DEFAULTS = {
- offset: 0
- }
-
- Affix.prototype.getPinnedOffset = function () {
- if (this.pinnedOffset) return this.pinnedOffset
- this.$element.removeClass(Affix.RESET).addClass('affix')
- var scrollTop = this.$window.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 scrollHeight = $(document).height()
- var scrollTop = this.$window.scrollTop()
- var position = this.$element.offset()
- var offset = this.options.offset
- var offsetTop = offset.top
- var offsetBottom = offset.bottom
-
- if (this.affixed == 'top') position.top += scrollTop
-
- 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.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
- offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
- offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
-
- if (this.affixed === affix) return
- if (this.unpin) 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($.Event(affixType.replace('affix', 'affixed')))
-
- if (affix == 'bottom') {
- this.$element.offset({ top: scrollHeight - offsetBottom - this.$element.height() })
- }
- }
-
-
- // AFFIX PLUGIN DEFINITION
- // =======================
-
- var old = $.fn.affix
-
- $.fn.affix = function (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]()
- })
- }
-
- $.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) data.offset.bottom = data.offsetBottom
- if (data.offsetTop) data.offset.top = data.offsetTop
-
- $spy.affix(data)
- })
- })
-
-}(jQuery);
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.min.js
deleted file mode 100644
index c6c087b..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/bootstrap/js/bootstrap.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")),f&&this.cycle(),this)};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("collapse in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);!e&&f.toggle&&"show"==c&&(c=!c),e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(b){a(d).remove(),a(e).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown",h),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=" li:not(.divider):visible a",i=f.find("[role=menu]"+h+", [role=listbox]"+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu], [role=listbox]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());c.is("a")&&b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this,d=this.tip();this.setContent(),this.options.animation&&d.addClass("fade");var e="function"==typeof this.options.placement?this.options.placement.call(this,d[0],this.$element[0]):this.options.placement,f=/\s?auto?\s?/i,g=f.test(e);g&&(e=e.replace(f,"")||"top"),d.detach().css({top:0,left:0,display:"block"}).addClass(e),this.options.container?d.appendTo(this.options.container):d.insertAfter(this.$element);var h=this.getPosition(),i=d[0].offsetWidth,j=d[0].offsetHeight;if(g){var k=this.$element.parent(),l=e,m=document.documentElement.scrollTop||document.body.scrollTop,n="body"==this.options.container?window.innerWidth:k.outerWidth(),o="body"==this.options.container?window.innerHeight:k.outerHeight(),p="body"==this.options.container?0:k.offset().left;e="bottom"==e&&h.top+h.height+j-m>o?"top":"top"==e&&h.top-m-j<0?"bottom":"right"==e&&h.right+i>n?"left":"left"==e&&h.left-i<p?"right":e,d.removeClass(l).addClass(e)}var q=this.getCalculatedOffset(e,h,i,j);this.applyPlacement(q,e),this.hoverState=null;var r=function(){c.$element.trigger("shown.bs."+c.type)};a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,r).emulateTransitionEnd(150):r()}},b.prototype.applyPlacement=function(b,c){var d,e=this.tip(),f=e[0].offsetWidth,g=e[0].offsetHeight,h=parseInt(e.css("margin-top"),10),i=parseInt(e.css("margin-left"),10);isNaN(h)&&(h=0),isNaN(i)&&(i=0),b.top=b.top+h,b.left=b.left+i,a.offset.setOffset(e[0],a.extend({using:function(a){e.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),e.addClass("in");var j=e[0].offsetWidth,k=e[0].offsetHeight;if("top"==c&&k!=g&&(d=!0,b.top=b.top+g-k),/bottom|top/.test(c)){var l=0;b.left<0&&(l=-2*b.left,b.left=0,e.offset(b),j=e[0].offsetWidth,k=e[0].offsetHeight),this.replaceArrow(l-f+j,j,"left")}else this.replaceArrow(k-g,k,"top");d&&e.offset(b)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(a(c).is("body")?window:c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);{var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})}},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(b.RESET).addClass("affix");var a=this.$window.scrollTop(),c=this.$element.offset();return this.pinnedOffset=c.top-a},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"top"==this.affixed&&(e.top+=d),"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(b.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:c-h-this.$element.height()}))}}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.css b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.css
deleted file mode 100644
index 4279313..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.css
+++ /dev/null
@@ -1,309 +0,0 @@
-
-div.dataTables_length label {
- font-weight: normal;
- text-align: left;
- white-space: nowrap;
-}
-
-div.dataTables_length select {
- width: 75px;
- display: inline-block;
-}
-
-div.dataTables_filter {
- text-align: right;
-}
-
-div.dataTables_filter label {
- font-weight: normal;
- white-space: nowrap;
- text-align: left;
-}
-
-div.dataTables_filter input {
- margin-left: 0.5em;
- display: inline-block;
-}
-
-div.dataTables_info {
- padding-top: 8px;
- white-space: nowrap;
-}
-
-div.dataTables_paginate {
- margin: 0;
- white-space: nowrap;
- text-align: right;
-}
-
-div.dataTables_paginate ul.pagination {
- margin: 2px 0;
- white-space: nowrap;
-}
-
-@media screen and (max-width: 767px) {
- div.dataTables_length,
- div.dataTables_filter,
- div.dataTables_info,
- div.dataTables_paginate {
- text-align: center;
- }
-}
-
-
-table.dataTable td,
-table.dataTable th {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-
-
-table.dataTable {
- clear: both;
- margin-top: 6px !important;
- margin-bottom: 6px !important;
- max-width: none !important;
-}
-
-table.dataTable thead .sorting,
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc,
-table.dataTable thead .sorting_asc_disabled,
-table.dataTable thead .sorting_desc_disabled {
- cursor: pointer;
-}
-
-
-table.dataTable thead > tr > th {
- padding-left: 18px;
- padding-right: 18px;
-}
-
-table.dataTable th:active {
- outline: none;
-}
-
-/* Scrolling */
-div.dataTables_scrollHead table {
- margin-bottom: 0 !important;
- border-bottom-left-radius: 0;
- border-bottom-right-radius: 0;
-}
-
-div.dataTables_scrollHead table thead tr:last-child th:first-child,
-div.dataTables_scrollHead table thead tr:last-child td:first-child {
- border-bottom-left-radius: 0 !important;
- border-bottom-right-radius: 0 !important;
-}
-
-div.dataTables_scrollBody table {
- border-top: none;
- margin-top: 0 !important;
- margin-bottom: 0 !important;
-}
-
-div.dataTables_scrollBody tbody tr:first-child th,
-div.dataTables_scrollBody tbody tr:first-child td {
- border-top: none;
-}
-
-div.dataTables_scrollFoot table {
- margin-top: 0 !important;
- border-top: none;
-}
-
-/* Frustratingly the border-collapse:collapse used by Bootstrap makes the column
- width calculations when using scrolling impossible to align columns. We have
- to use separate
- */
-table.table-bordered.dataTable {
- border-collapse: separate !important;
-}
-table.table-bordered thead th,
-table.table-bordered thead td {
- border-left-width: 0;
- border-top-width: 0;
-}
-table.table-bordered tbody th,
-table.table-bordered tbody td {
- border-left-width: 0;
- border-bottom-width: 0;
-}
-table.table-bordered th:last-child,
-table.table-bordered td:last-child {
- border-right-width: 0;
-}
-div.dataTables_scrollHead table.table-bordered {
- border-bottom-width: 0;
-}
-
-
-
-
-/*
- * TableTools styles
- */
-.table.dataTable tbody tr.active td,
-.table.dataTable tbody tr.active th {
- background-color: #08C;
- color: white;
-}
-
-.table.dataTable tbody tr.active:hover td,
-.table.dataTable tbody tr.active:hover th {
- background-color: #0075b0 !important;
-}
-
-.table.dataTable tbody tr.active th > a,
-.table.dataTable tbody tr.active td > a {
- color: white;
-}
-
-.table-striped.dataTable tbody tr.active:nth-child(odd) td,
-.table-striped.dataTable tbody tr.active:nth-child(odd) th {
- background-color: #017ebc;
-}
-
-table.DTTT_selectable tbody tr {
- cursor: pointer;
-}
-
-div.DTTT .btn:hover {
- text-decoration: none !important;
-}
-
-ul.DTTT_dropdown.dropdown-menu {
- z-index: 2003;
-}
-
-ul.DTTT_dropdown.dropdown-menu a {
- color: #333 !important; /* needed only when demo_page.css is included */
-}
-
-ul.DTTT_dropdown.dropdown-menu li {
- position: relative;
-}
-
-ul.DTTT_dropdown.dropdown-menu li:hover a {
- background-color: #0088cc;
- color: white !important;
-}
-
-div.DTTT_collection_background {
- z-index: 2002;
-}
-
-/* TableTools information display */
-div.DTTT_print_info {
- position: fixed;
- top: 50%;
- left: 50%;
- width: 400px;
- height: 150px;
- margin-left: -200px;
- margin-top: -75px;
- text-align: center;
- color: #333;
- padding: 10px 30px;
- opacity: 0.95;
-
- background-color: white;
- border: 1px solid rgba(0, 0, 0, 0.2);
- border-radius: 6px;
-
- -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
- box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
-}
-
-div.DTTT_print_info h6 {
- font-weight: normal;
- font-size: 28px;
- line-height: 28px;
- margin: 1em;
-}
-
-div.DTTT_print_info p {
- font-size: 14px;
- line-height: 20px;
-}
-
-div.dataTables_processing {
- position: absolute;
- top: 50%;
- left: 50%;
- width: 100%;
- height: 60px;
- margin-left: -50%;
- margin-top: -25px;
- padding-top: 20px;
- padding-bottom: 20px;
- text-align: center;
- font-size: 1.2em;
- background-color: white;
- background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));
- background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
- background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
- background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
- background: -o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
- background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
-}
-
-
-
-/*
- * FixedColumns styles
- */
-div.DTFC_LeftHeadWrapper table,
-div.DTFC_LeftFootWrapper table,
-div.DTFC_RightHeadWrapper table,
-div.DTFC_RightFootWrapper table,
-table.DTFC_Cloned tr.even {
- background-color: white;
- margin-bottom: 0;
-}
-
-div.DTFC_RightHeadWrapper table ,
-div.DTFC_LeftHeadWrapper table {
- border-bottom: none !important;
- margin-bottom: 0 !important;
- border-top-right-radius: 0 !important;
- border-bottom-left-radius: 0 !important;
- border-bottom-right-radius: 0 !important;
-}
-
-div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child,
-div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child,
-div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,
-div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child {
- border-bottom-left-radius: 0 !important;
- border-bottom-right-radius: 0 !important;
-}
-
-div.DTFC_RightBodyWrapper table,
-div.DTFC_LeftBodyWrapper table {
- border-top: none;
- margin: 0 !important;
-}
-
-div.DTFC_RightBodyWrapper tbody tr:first-child th,
-div.DTFC_RightBodyWrapper tbody tr:first-child td,
-div.DTFC_LeftBodyWrapper tbody tr:first-child th,
-div.DTFC_LeftBodyWrapper tbody tr:first-child td {
- border-top: none;
-}
-
-div.DTFC_RightFootWrapper table,
-div.DTFC_LeftFootWrapper table {
- border-top: none;
- margin-top: 0 !important;
-}
-
-
-/*
- * FixedHeader styles
- */
-div.FixedHeader_Cloned table {
- margin: 0 !important
-}
-
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.min.js
deleted file mode 100644
index f0d09b9..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/dataTables.bootstrap.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/*!
- DataTables Bootstrap 3 integration
- ©2011-2014 SpryMedia Ltd - datatables.net/license
-*/
-(function(){var f=function(c,b){c.extend(!0,b.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-6'i><'col-sm-6'p>>",renderer:"bootstrap"});c.extend(b.ext.classes,{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm"});b.ext.renderer.pageButton.bootstrap=function(g,f,p,k,h,l){var q=new b.Api(g),r=g.oClasses,i=g.oLanguage.oPaginate,d,e,o=function(b,f){var j,m,n,a,k=function(a){a.preventDefault();
-c(a.currentTarget).hasClass("disabled")||q.page(a.data.action).draw(!1)};j=0;for(m=f.length;j<m;j++)if(a=f[j],c.isArray(a))o(b,a);else{e=d="";switch(a){case "ellipsis":d="&hellip;";e="disabled";break;case "first":d=i.sFirst;e=a+(0<h?"":" disabled");break;case "previous":d=i.sPrevious;e=a+(0<h?"":" disabled");break;case "next":d=i.sNext;e=a+(h<l-1?"":" disabled");break;case "last":d=i.sLast;e=a+(h<l-1?"":" disabled");break;default:d=a+1,e=h===a?"active":""}d&&(n=c("<li>",{"class":r.sPageButton+" "+
-e,"aria-controls":g.sTableId,tabindex:g.iTabIndex,id:0===p&&"string"===typeof a?g.sTableId+"_"+a:null}).append(c("<a>",{href:"#"}).html(d)).appendTo(b),g.oApi._fnBindAction(n,{action:a},k))}};o(c(f).empty().html('<ul class="pagination"/>').children("ul"),k)};b.TableTools&&(c.extend(!0,b.TableTools.classes,{container:"DTTT btn-group",buttons:{normal:"btn btn-default",disabled:"disabled"},collection:{container:"DTTT_dropdown dropdown-menu",buttons:{normal:"",disabled:"disabled"}},print:{info:"DTTT_print_info"},
-select:{row:"active"}}),c.extend(!0,b.TableTools.DEFAULTS.oTags,{collection:{container:"ul",button:"li",liner:"a"}}))};"function"===typeof define&&define.amd?define(["jquery","datatables"],f):"object"===typeof exports?f(require("jquery"),require("datatables")):jQuery&&f(jQuery,jQuery.fn.dataTable)})(window,document);
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/jquery.dataTables.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/jquery.dataTables.min.js
deleted file mode 100644
index 85dd817..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/dataTables/jquery.dataTables.min.js
+++ /dev/null
@@ -1,160 +0,0 @@
-/*! DataTables 1.10.7
- * ©2008-2015 SpryMedia Ltd - datatables.net/license
- */
-(function(Ea,Q,k){var P=function(h){function W(a){var b,c,e={};h.each(a,function(d){if((b=d.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=d.replace(b[0],b[2].toLowerCase()),e[c]=d,"o"===b[1]&&W(a[d])});a._hungarianMap=e}function H(a,b,c){a._hungarianMap||W(a);var e;h.each(b,function(d){e=a._hungarianMap[d];if(e!==k&&(c||b[e]===k))"o"===e.charAt(0)?(b[e]||(b[e]={}),h.extend(!0,b[e],b[d]),H(a[e],b[e],c)):b[e]=b[d]})}function P(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;
-!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&E(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&E(a,a,"sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&db(a)}function eb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");
-A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&H(m.models.oSearch,a[b])}function fb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;b&&!h.isArray(b)&&(a.aDataSort=[b])}function gb(a){var a=a.oBrowser,b=h("<div/>").css({position:"absolute",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",
-top:1,left:1,width:100,overflow:"scroll"}).append(h('<div class="test"/>').css({width:"100%",height:10}))).appendTo("body"),c=b.find(".test");a.bScrollOversize=100===c[0].offsetWidth;a.bScrollbarLeft=1!==Math.round(c.offset().left);b.remove()}function hb(a,b,c,e,d,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;e!==d;)a.hasOwnProperty(e)&&(g=j?b(g,a[e],e,a):a[e],j=!0,e+=f);return g}function Fa(a,b){var c=m.defaults.column,e=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:Q.createElement("th"),sTitle:c.sTitle?
-c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[e],mData:c.mData?c.mData:e,idx:e});a.aoColumns.push(c);c=a.aoPreSearchCols;c[e]=h.extend({},m.models.oSearch,c[e]);ka(a,e,h(b).data())}function ka(a,b,c){var b=a.aoColumns[b],e=a.oClasses,d=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=d.attr("width")||null;var f=(d.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(fb(c),H(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&
-(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),E(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),E(b,c,"aDataSort"));var g=b.mData,j=R(g),i=b.mRender?R(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b.fnGetData=function(a,b,c){var e=j(a,b,k,c);return i&&b?i(e,b,a,c):e};b.fnSetData=function(a,b,c){return S(g)(a,b,c)};"number"!==typeof g&&
-(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,d.addClass(e.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=e.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=e.sSortableAsc,b.sSortingClassJUI=e.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=e.sSortableDesc,b.sSortingClassJUI=e.sSortJUIDescAllowed):(b.sSortingClass=e.sSortable,b.sSortingClassJUI=e.sSortJUI)}function X(a){if(!1!==a.oFeatures.bAutoWidth){var b=
-a.aoColumns;Ga(a);for(var c=0,e=b.length;c<e;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&Y(a);w(a,null,"column-sizing",[a])}function la(a,b){var c=Z(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function $(a,b){var c=Z(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}function aa(a){return Z(a,"bVisible").length}function Z(a,b){var c=[];h.map(a.aoColumns,function(a,d){a[b]&&c.push(d)});return c}function Ha(a){var b=a.aoColumns,c=a.aoData,e=m.ext.type.detect,d,
-f,g,j,i,h,l,q,n;d=0;for(f=b.length;d<f;d++)if(l=b[d],n=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=e.length;g<j;g++){i=0;for(h=c.length;i<h;i++){n[i]===k&&(n[i]=x(a,i,d,"type"));q=e[g](n[i],a);if(!q&&g!==e.length-1)break;if("html"===q)break}if(q){l.sType=q;break}}l.sType||(l.sType="string")}}function ib(a,b,c,e){var d,f,g,j,i,o,l=a.aoColumns;if(b)for(d=b.length-1;0<=d;d--){o=b[d];var q=o.targets!==k?o.targets:o.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f<
-g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Fa(a);e(q[f],o)}else if("number"===typeof q[f]&&0>q[f])e(l.length+q[f],o);else if("string"===typeof q[f]){j=0;for(i=l.length;j<i;j++)("_all"==q[f]||h(l[j].nTh).hasClass(q[f]))&&e(j,o)}}if(c){d=0;for(a=c.length;d<a;d++)e(d,c[d])}}function K(a,b,c,e){var d=a.aoData.length,f=h.extend(!0,{},m.models.oRow,{src:c?"dom":"data"});f._aData=b;a.aoData.push(f);for(var b=a.aoColumns,f=0,g=b.length;f<g;f++)c&&Ia(a,d,f,x(a,d,f)),b[f].sType=null;a.aiDisplayMaster.push(d);
-(c||!a.oFeatures.bDeferRender)&&Ja(a,d,c,e);return d}function ma(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,d){c=na(a,d);return K(a,c.data,d,c.cells)})}function x(a,b,c,e){var d=a.iDraw,f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,c=f.fnGetData(g,e,{settings:a,row:b,col:c});if(c===k)return a.iDrawError!=d&&null===j&&(I(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b,4),a.iDrawError=d),j;if((c===g||null===c)&&
-null!==j)c=j;else if("function"===typeof c)return c.call(g);return null===c&&"display"==e?"":c}function Ia(a,b,c,e){a.aoColumns[c].fnSetData(a.aoData[b]._aData,e,{settings:a,row:b,col:c})}function Ka(a){return h.map(a.match(/(\\.|[^\.])+/g),function(a){return a.replace(/\\./g,".")})}function R(a){if(h.isPlainObject(a)){var b={};h.each(a,function(a,c){c&&(b[a]=R(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==k?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,
-c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var g,j;if(""!==f){j=Ka(f);for(var i=0,h=j.length;i<h;i++){f=j[i].match(ba);g=j[i].match(T);if(f){j[i]=j[i].replace(ba,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=j.join(".");i=0;for(h=a.length;i<h;i++)g.push(c(a[i],b,j));a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(T,"");a=a[j[i]]();continue}if(null===a||a[j[i]]===
-k)return k;a=a[j[i]]}}return a};return function(b,d){return c(b,d,a)}}return function(b){return b[a]}}function S(a){if(h.isPlainObject(a))return S(a._);if(null===a)return function(){};if("function"===typeof a)return function(b,e,d){a(b,"set",e,d)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,e,d){var d=Ka(d),f;f=d[d.length-1];for(var g,j,i=0,h=d.length-1;i<h;i++){g=d[i].match(ba);j=d[i].match(T);if(g){d[i]=d[i].replace(ba,"");a[d[i]]=[];
-f=d.slice();f.splice(0,i+1);g=f.join(".");j=0;for(h=e.length;j<h;j++)f={},b(f,e[j],g),a[d[i]].push(f);return}j&&(d[i]=d[i].replace(T,""),a=a[d[i]](e));if(null===a[d[i]]||a[d[i]]===k)a[d[i]]={};a=a[d[i]]}if(f.match(T))a[f.replace(T,"")](e);else a[f.replace(ba,"")]=e};return function(c,e){return b(c,e,a)}}return function(b,e){b[a]=e}}function La(a){return D(a.aoData,"_aData")}function oa(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0}function pa(a,b,c){for(var e=-1,d=0,f=a.length;d<
-f;d++)a[d]==b?e=d:a[d]>b&&a[d]--; -1!=e&&c===k&&a.splice(e,1)}function ca(a,b,c,e){var d=a.aoData[b],f,g=function(c,f){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=x(a,b,f,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===d.src)d._aData=na(a,d,e,e===k?k:d._aData).data;else{var j=d.anCells;if(j)if(e!==k)g(j[e],e);else{c=0;for(f=j.length;c<f;c++)g(j[c],c)}}d._aSortData=null;d._aFilterData=null;g=a.aoColumns;if(e!==k)g[e].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null;
-Ma(d)}}function na(a,b,c,e){var d=[],f=b.firstChild,g,j=0,i,o=a.aoColumns,l=a._rowReadObject,e=e||l?{}:[],q=function(a,b){if("string"===typeof a){var c=a.indexOf("@");-1!==c&&(c=a.substring(c+1),S(a)(e,b.getAttribute(c)))}},a=function(a){if(c===k||c===j)g=o[j],i=h.trim(a.innerHTML),g&&g._bAttrSrc?(S(g.mData._)(e,i),q(g.mData.sort,a),q(g.mData.type,a),q(g.mData.filter,a)):l?(g._setter||(g._setter=S(g.mData)),g._setter(e,i)):e[j]=i;j++};if(f)for(;f;){b=f.nodeName.toUpperCase();if("TD"==b||"TH"==b)a(f),
-d.push(f);f=f.nextSibling}else{d=b.anCells;f=0;for(b=d.length;f<b;f++)a(d[f])}return{data:e,cells:d}}function Ja(a,b,c,e){var d=a.aoData[b],f=d._aData,g=[],j,i,h,l,q;if(null===d.nTr){j=c||Q.createElement("tr");d.nTr=j;d.anCells=g;j._DT_RowIndex=b;Ma(d);l=0;for(q=a.aoColumns.length;l<q;l++){h=a.aoColumns[l];i=c?e[l]:Q.createElement(h.sCellType);g.push(i);if(!c||h.mRender||h.mData!==l)i.innerHTML=x(a,b,l,"display");h.sClass&&(i.className+=" "+h.sClass);h.bVisible&&!c?j.appendChild(i):!h.bVisible&&c&&
-i.parentNode.removeChild(i);h.fnCreatedCell&&h.fnCreatedCell.call(a.oInstance,i,x(a,b,l),f,b,l)}w(a,"aoRowCreatedCallback",null,[j,f,b])}d.nTr.setAttribute("role","row")}function Ma(a){var b=a.nTr,c=a._aData;if(b){c.DT_RowId&&(b.id=c.DT_RowId);if(c.DT_RowClass){var e=c.DT_RowClass.split(" ");a.__rowc=a.__rowc?Na(a.__rowc.concat(e)):e;h(b).removeClass(a.__rowc.join(" ")).addClass(c.DT_RowClass)}c.DT_RowAttr&&h(b).attr(c.DT_RowAttr);c.DT_RowData&&h(b).data(c.DT_RowData)}}function jb(a){var b,c,e,d,
-f,g=a.nTHead,j=a.nTFoot,i=0===h("th, td",g).length,o=a.oClasses,l=a.aoColumns;i&&(d=h("<tr/>").appendTo(g));b=0;for(c=l.length;b<c;b++)f=l[b],e=h(f.nTh).addClass(f.sClass),i&&e.appendTo(d),a.oFeatures.bSort&&(e.addClass(f.sSortingClass),!1!==f.bSortable&&(e.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Oa(a,f.nTh,b))),f.sTitle!=e.html()&&e.html(f.sTitle),Pa(a,"header")(a,e,f,o);i&&da(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(o.sHeaderTH);
-h(j).find(">tr>th, >tr>td").addClass(o.sFooterTH);if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}function ea(a,b,c){var e,d,f,g=[],j=[],i=a.aoColumns.length,o;if(b){c===k&&(c=!1);e=0;for(d=b.length;e<d;e++){g[e]=b[e].slice();g[e].nTr=b[e].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[e].splice(f,1);j.push([])}e=0;for(d=g.length;e<d;e++){if(a=g[e].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[e].length;f<b;f++)if(o=
-i=1,j[e][f]===k){a.appendChild(g[e][f].cell);for(j[e][f]=1;g[e+i]!==k&&g[e][f].cell==g[e+i][f].cell;)j[e+i][f]=1,i++;for(;g[e][f+o]!==k&&g[e][f].cell==g[e][f+o].cell;){for(c=0;c<i;c++)j[e+c][f+o]=1;o++}h(g[e][f].cell).attr("rowspan",i).attr("colspan",o)}}}}function M(a){var b=w(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))C(a,!1);else{var b=[],c=0,e=a.asStripeClasses,d=e.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==B(a),i=a.aiDisplay;a.bDrawing=!0;g!==k&&-1!==g&&(a._iDisplayStart=
-j?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);var g=a._iDisplayStart,o=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!kb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:o;for(j=j?0:g;j<f;j++){var l=i[j],q=a.aoData[l];null===q.nTr&&Ja(a,l);l=q.nTr;if(0!==d){var n=e[c%d];q._sRowStripe!=n&&(h(l).removeClass(q._sRowStripe).addClass(n),q._sRowStripe=n)}w(a,"aoRowCallback",null,[l,q._aData,c,j]);b.push(l);c++}}else c=f.sZeroRecords,
-1==a.iDraw&&"ajax"==B(a)?c=f.sLoadingRecords:f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":d?e[0]:""}).append(h("<td />",{valign:"top",colSpan:aa(a),"class":a.oClasses.sRowEmpty}).html(c))[0];w(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],La(a),g,o,i]);w(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],La(a),g,o,i]);e=h(a.nTBody);e.children().detach();e.append(h(b));w(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=
-!1}}function N(a,b){var c=a.oFeatures,e=c.bFilter;c.bSort&&lb(a);e?fa(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;M(a);a._drawHold=!1}function mb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),e=a.oFeatures,d=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=d[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,o,l,q,n=0;n<f.length;n++){g=
-null;j=f[n];if("<"==j){i=h("<div/>")[0];o=f[n+1];if("'"==o||'"'==o){l="";for(q=2;f[n+q]!=o;)l+=f[n+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(o=l.split("."),i.id=o[0].substr(1,o[0].length-1),i.className=o[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;n+=q}d.append(i);d=h(i)}else if(">"==j)d=d.parent();else if("l"==j&&e.bPaginate&&e.bLengthChange)g=nb(a);else if("f"==j&&e.bFilter)g=ob(a);else if("r"==j&&e.bProcessing)g=pb(a);else if("t"==j)g=qb(a);else if("i"==
-j&&e.bInfo)g=rb(a);else if("p"==j&&e.bPaginate)g=sb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(o=i.length;q<o;q++)if(j==i[q].cFeature){g=i[q].fnInit(a);break}}g&&(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),d.append(g))}c.replaceWith(d)}function da(a,b){var c=h(b).children("tr"),e,d,f,g,j,i,o,l,q,n;a.splice(0,a.length);f=0;for(i=c.length;f<i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){e=c[f];for(d=e.firstChild;d;){if("TD"==d.nodeName.toUpperCase()||"TH"==d.nodeName.toUpperCase()){l=
-1*d.getAttribute("colspan");q=1*d.getAttribute("rowspan");l=!l||0===l||1===l?1:l;q=!q||0===q||1===q?1:q;g=0;for(j=a[f];j[g];)g++;o=g;n=1===l?!0:!1;for(j=0;j<l;j++)for(g=0;g<q;g++)a[f+g][o+j]={cell:d,unique:n},a[f+g].nTr=e}d=d.nextSibling}}}function qa(a,b,c){var e=[];c||(c=a.aoHeader,b&&(c=[],da(c,b)));for(var b=0,d=c.length;b<d;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!e[f]||!a.bSortCellsTop))e[f]=c[b][f].cell;return e}function ra(a,b,c){w(a,"aoServerParams","serverParams",[b]);
-if(b&&h.isArray(b)){var e={},d=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(d);c?(c=c[0],e[c]||(e[c]=[]),e[c].push(b.value)):e[b.name]=b.value});b=e}var f,g=a.ajax,j=a.oInstance,i=function(b){w(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var o=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&o?o:h.extend(!0,b,o);delete g.data}o={data:b,success:function(b){var c=b.error||b.sError;c&&I(a,0,c);a.json=b;i(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,
-c){var f=w(a,null,"xhr",[a,null,a.jqXHR]);-1===h.inArray(!0,f)&&("parsererror"==c?I(a,0,"Invalid JSON response",1):4===b.readyState&&I(a,0,"Ajax error",7));C(a,!1)}};a.oAjaxData=b;w(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),i,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(o,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(o,g)),g.data=f)}function kb(a){return a.bAjaxDataGet?
-(a.iDraw++,C(a,!0),ra(a,tb(a),function(b){ub(a,b)}),!1):!0}function tb(a){var b=a.aoColumns,c=b.length,e=a.oFeatures,d=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,o,l,q=U(a);g=a._iDisplayStart;i=!1!==e.bPaginate?a._iDisplayLength:-1;var n=function(a,b){j.push({name:a,value:b})};n("sEcho",a.iDraw);n("iColumns",c);n("sColumns",D(b,"sName").join(","));n("iDisplayStart",g);n("iDisplayLength",i);var k={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:d.sSearch,regex:d.bRegex}};for(g=
-0;g<c;g++)o=b[g],l=f[g],i="function"==typeof o.mData?"function":o.mData,k.columns.push({data:i,name:o.sName,searchable:o.bSearchable,orderable:o.bSortable,search:{value:l.sSearch,regex:l.bRegex}}),n("mDataProp_"+g,i),e.bFilter&&(n("sSearch_"+g,l.sSearch),n("bRegex_"+g,l.bRegex),n("bSearchable_"+g,o.bSearchable)),e.bSort&&n("bSortable_"+g,o.bSortable);e.bFilter&&(n("sSearch",d.sSearch),n("bRegex",d.bRegex));e.bSort&&(h.each(q,function(a,b){k.order.push({column:b.col,dir:b.dir});n("iSortCol_"+a,b.col);
-n("sSortDir_"+a,b.dir)}),n("iSortingCols",q.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:k:b?j:k}function ub(a,b){var c=sa(a,b),e=b.sEcho!==k?b.sEcho:b.draw,d=b.iTotalRecords!==k?b.iTotalRecords:b.recordsTotal,f=b.iTotalDisplayRecords!==k?b.iTotalDisplayRecords:b.recordsFiltered;if(e){if(1*e<a.iDraw)return;a.iDraw=1*e}oa(a);a._iRecordsTotal=parseInt(d,10);a._iRecordsDisplay=parseInt(f,10);e=0;for(d=c.length;e<d;e++)K(a,c[e]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;
-M(a);a._bInitComplete||ta(a,b);a.bAjaxDataGet=!0;C(a,!1)}function sa(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==k?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?R(c)(b):b}function ob(a){var b=a.oClasses,c=a.sTableId,e=a.oLanguage,d=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=e.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),
-f=function(){var b=!this.value?"":this.value;b!=d.sSearch&&(fa(a,{sSearch:b,bRegex:d.bRegex,bSmart:d.bSmart,bCaseInsensitive:d.bCaseInsensitive}),a._iDisplayStart=0,M(a))},g=null!==a.searchDelay?a.searchDelay:"ssp"===B(a)?400:0,i=h("input",b).val(d.sSearch).attr("placeholder",e.sSearchPlaceholder).bind("keyup.DT search.DT input.DT paste.DT cut.DT",g?ua(f,g):f).bind("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==
-Q.activeElement&&i.val(d.sSearch)}catch(f){}});return b[0]}function fa(a,b,c){var e=a.oPreviousSearch,d=a.aoPreSearchCols,f=function(a){e.sSearch=a.sSearch;e.bRegex=a.bRegex;e.bSmart=a.bSmart;e.bCaseInsensitive=a.bCaseInsensitive};Ha(a);if("ssp"!=B(a)){vb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<d.length;b++)wb(a,d[b].sSearch,b,d[b].bEscapeRegex!==k?!d[b].bEscapeRegex:d[b].bRegex,d[b].bSmart,d[b].bCaseInsensitive);xb(a)}else f(b);a.bFiltered=
-!0;w(a,null,"search",[a])}function xb(a){for(var b=m.ext.search,c=a.aiDisplay,e,d,f=0,g=b.length;f<g;f++){for(var j=[],i=0,h=c.length;i<h;i++)d=c[i],e=a.aoData[d],b[f](a,e._aFilterData,d,e._aData,i)&&j.push(d);c.length=0;c.push.apply(c,j)}}function wb(a,b,c,e,d,f){if(""!==b)for(var g=a.aiDisplay,e=Qa(b,e,d,f),d=g.length-1;0<=d;d--)b=a.aoData[g[d]]._aFilterData[c],e.test(b)||g.splice(d,1)}function vb(a,b,c,e,d,f){var e=Qa(b,e,d,f),d=a.oPreviousSearch.sSearch,f=a.aiDisplayMaster,g;0!==m.ext.search.length&&
-(c=!0);g=yb(a);if(0>=b.length)a.aiDisplay=f.slice();else{if(g||c||d.length>b.length||0!==b.indexOf(d)||a.bSorted)a.aiDisplay=f.slice();b=a.aiDisplay;for(c=b.length-1;0<=c;c--)e.test(a.aoData[b[c]]._sFilterRow)||b.splice(c,1)}}function Qa(a,b,c,e){a=b?a:va(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,e?"i":"")}function va(a){return a.replace(Yb,"\\$1")}
-function yb(a){var b=a.aoColumns,c,e,d,f,g,j,i,h,l=m.ext.type.search;c=!1;e=0;for(f=a.aoData.length;e<f;e++)if(h=a.aoData[e],!h._aFilterData){j=[];d=0;for(g=b.length;d<g;d++)c=b[d],c.bSearchable?(i=x(a,e,d,"filter"),l[c.sType]&&(i=l[c.sType](i)),null===i&&(i=""),"string"!==typeof i&&i.toString&&(i=i.toString())):i="",i.indexOf&&-1!==i.indexOf("&")&&(wa.innerHTML=i,i=Zb?wa.textContent:wa.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join(" ");c=!0}return c}
-function zb(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function Ab(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function rb(a){var b=a.sTableId,c=a.aanFeatures.i,e=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Bb,sName:"information"}),e.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return e[0]}function Bb(a){var b=
-a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,e=a._iDisplayStart+1,d=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Cb(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,e,d,f,g,j));h(b).html(j)}}function Cb(a,b){var c=a.fnFormatNumber,e=a._iDisplayStart+1,d=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===d;return b.replace(/_START_/g,c.call(a,e)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,
-c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(e/d))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/d)))}function ga(a){var b,c,e=a.iInitDisplayStart,d=a.aoColumns,f;c=a.oFeatures;if(a.bInitialised){mb(a);jb(a);ea(a,a.aoHeader);ea(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ga(a);b=0;for(c=d.length;b<c;b++)f=d[b],f.sWidth&&(f.nTh.style.width=s(f.sWidth));N(a);d=B(a);"ssp"!=d&&("ajax"==d?ra(a,[],function(c){var f=sa(a,c);for(b=0;b<f.length;b++)K(a,f[b]);
-a.iInitDisplayStart=e;N(a);C(a,!1);ta(a,c)},a):(C(a,!1),ta(a)))}else setTimeout(function(){ga(a)},200)}function ta(a,b){a._bInitComplete=!0;b&&X(a);w(a,"aoInitComplete","init",[a,b])}function Ra(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Sa(a);w(a,null,"length",[a,c])}function nb(a){for(var b=a.oClasses,c=a.sTableId,e=a.aLengthMenu,d=h.isArray(e[0]),f=d?e[0]:e,e=d?e[1]:e,d=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g<j;g++)d[0][g]=new Option(e[g],
-f[g]);var i=h("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",d[0].outerHTML));h("select",i).val(a._iDisplayLength).bind("change.DT",function(){Ra(a,h(this).val());M(a)});h(a.nTable).bind("length.dt.DT",function(b,c,f){a===c&&h("select",i).val(f)});return i[0]}function sb(a){var b=a.sPaginationType,c=m.ext.pager[b],e="function"===typeof c,d=function(a){M(a)},b=h("<div/>").addClass(a.oClasses.sPaging+b)[0],
-f=a.aanFeatures;e||c.fnInit(a,b,d);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(e){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),q,l=0;for(q=f.p.length;l<q;l++)Pa(a,"pageButton")(a,f.p[l],l,h,b,i)}else c.fnUpdate(a,d)},sName:"pagination"}));return b}function Ta(a,b,c){var e=a._iDisplayStart,d=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===d?e=0:"number"===typeof b?(e=b*d,e>f&&(e=0)):
-"first"==b?e=0:"previous"==b?(e=0<=d?e-d:0,0>e&&(e=0)):"next"==b?e+d<f&&(e+=d):"last"==b?e=Math.floor((f-1)/d)*d:I(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==e;a._iDisplayStart=e;b&&(w(a,null,"page",[a]),c&&M(a));return b}function pb(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");w(a,
-null,"processing",[a,b])}function qb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var e=c.sX,d=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),o=h(b[0].cloneNode(!1)),l=b.children("tfoot");c.sX&&"100%"===b.attr("width")&&b.removeAttr("width");l.length||(l=null);c=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,
-width:e?!e?null:s(e):"100%"}).append(h("<div/>",{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("<div/>",{"class":f.sScrollBody}).css({overflow:"auto",height:!d?null:s(d),width:!e?null:s(e)}).append(b));l&&c.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:e?!e?null:s(e):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(o.removeAttr("id").css("margin-left",
-0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=c.children(),q=b[0],f=b[1],n=l?b[2]:null;if(e)h(f).on("scroll.DT",function(){var a=this.scrollLeft;q.scrollLeft=a;l&&(n.scrollLeft=a)});a.nScrollHead=q;a.nScrollBody=f;a.nScrollFoot=n;a.aoDrawCallback.push({fn:Y,sName:"scrolling"});return c[0]}function Y(a){var b=a.oScroll,c=b.sX,e=b.sXInner,d=b.sY,f=b.iBarWidth,g=h(a.nScrollHead),j=g[0].style,i=g.children("div"),o=i[0].style,l=i.children("table"),i=a.nScrollBody,q=h(i),n=i.style,
-k=h(a.nScrollFoot).children("div"),p=k.children("table"),m=h(a.nTHead),r=h(a.nTable),t=r[0],O=t.style,L=a.nTFoot?h(a.nTFoot):null,ha=a.oBrowser,w=ha.bScrollOversize,v,u,y,x,z,A=[],B=[],C=[],D,E=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};r.children("thead, tfoot").remove();z=m.clone().prependTo(r);v=m.find("tr");y=z.find("tr");z.find("th, td").removeAttr("tabindex");L&&(x=L.clone().prependTo(r),u=L.find("tr"),x=x.find("tr"));
-c||(n.width="100%",g[0].style.width="100%");h.each(qa(a,z),function(b,c){D=la(a,b);c.style.width=a.aoColumns[D].sWidth});L&&G(function(a){a.style.width=""},x);b.bCollapse&&""!==d&&(n.height=q[0].offsetHeight+m[0].offsetHeight+"px");g=r.outerWidth();if(""===c){if(O.width="100%",w&&(r.find("tbody").height()>i.offsetHeight||"scroll"==q.css("overflow-y")))O.width=s(r.outerWidth()-f)}else""!==e?O.width=s(e):g==q.width()&&q.height()<r.height()?(O.width=s(g-f),r.outerWidth()>g-f&&(O.width=s(g))):O.width=
-s(g);g=r.outerWidth();G(E,y);G(function(a){C.push(a.innerHTML);A.push(s(h(a).css("width")))},y);G(function(a,b){a.style.width=A[b]},v);h(y).height(0);L&&(G(E,x),G(function(a){B.push(s(h(a).css("width")))},x),G(function(a,b){a.style.width=B[b]},u),h(x).height(0));G(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+C[b]+"</div>";a.style.width=A[b]},y);L&&G(function(a,b){a.innerHTML="";a.style.width=B[b]},x);if(r.outerWidth()<g){u=i.scrollHeight>i.offsetHeight||
-"scroll"==q.css("overflow-y")?g+f:g;if(w&&(i.scrollHeight>i.offsetHeight||"scroll"==q.css("overflow-y")))O.width=s(u-f);(""===c||""!==e)&&I(a,1,"Possible column misalignment",6)}else u="100%";n.width=s(u);j.width=s(u);L&&(a.nScrollFoot.style.width=s(u));!d&&w&&(n.height=s(t.offsetHeight+f));d&&b.bCollapse&&(n.height=s(d),b=c&&t.offsetWidth>i.offsetWidth?f:0,t.offsetHeight<i.offsetHeight&&(n.height=s(t.offsetHeight+b)));b=r.outerWidth();l[0].style.width=s(b);o.width=s(b);l=r.height()>i.clientHeight||
-"scroll"==q.css("overflow-y");ha="padding"+(ha.bScrollbarLeft?"Left":"Right");o[ha]=l?f+"px":"0px";L&&(p[0].style.width=s(b),k[0].style.width=s(b),k[0].style[ha]=l?f+"px":"0px");q.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)i.scrollTop=0}function G(a,b,c){for(var e=0,d=0,f=b.length,g,j;d<f;){g=b[d].firstChild;for(j=c?c[d].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,e):a(g,e),e++),g=g.nextSibling,j=c?j.nextSibling:null;d++}}function Ga(a){var b=a.nTable,c=a.aoColumns,e=a.oScroll,d=e.sY,f=e.sX,
-g=e.sXInner,j=c.length,e=Z(a,"bVisible"),i=h("th",a.nTHead),o=b.getAttribute("width"),l=b.parentNode,k=!1,n,m;(n=b.style.width)&&-1!==n.indexOf("%")&&(o=n);for(n=0;n<e.length;n++)m=c[e[n]],null!==m.sWidth&&(m.sWidth=Db(m.sWidthOrig,l),k=!0);if(!k&&!f&&!d&&j==aa(a)&&j==i.length)for(n=0;n<j;n++)c[n].sWidth=s(i.eq(n).width());else{j=h(b).clone().css("visibility","hidden").removeAttr("id");j.find("tbody tr").remove();var p=h("<tr/>").appendTo(j.find("tbody"));j.find("tfoot th, tfoot td").css("width",
-"");i=qa(a,j.find("thead")[0]);for(n=0;n<e.length;n++)m=c[e[n]],i[n].style.width=null!==m.sWidthOrig&&""!==m.sWidthOrig?s(m.sWidthOrig):"";if(a.aoData.length)for(n=0;n<e.length;n++)k=e[n],m=c[k],h(Eb(a,k)).clone(!1).append(m.sContentPadding).appendTo(p);j.appendTo(l);f&&g?j.width(g):f?(j.css("width","auto"),j.width()<l.offsetWidth&&j.width(l.offsetWidth)):d?j.width(l.offsetWidth):o&&j.width(o);Fb(a,j[0]);if(f){for(n=g=0;n<e.length;n++)m=c[e[n]],d=h(i[n]).outerWidth(),g+=null===m.sWidthOrig?d:parseInt(m.sWidth,
-10)+d-h(i[n]).width();j.width(s(g));b.style.width=s(g)}for(n=0;n<e.length;n++)if(m=c[e[n]],d=h(i[n]).width())m.sWidth=s(d);b.style.width=s(j.css("width"));j.remove()}o&&(b.style.width=s(o));if((o||f)&&!a._reszEvt)b=function(){h(Ea).bind("resize.DT-"+a.sInstance,ua(function(){X(a)}))},a.oBrowser.bScrollOversize?setTimeout(b,1E3):b(),a._reszEvt=!0}function ua(a,b){var c=b!==k?b:200,e,d;return function(){var b=this,g=+new Date,j=arguments;e&&g<e+c?(clearTimeout(d),d=setTimeout(function(){e=k;a.apply(b,
-j)},c)):(e=g,a.apply(b,j))}}function Db(a,b){if(!a)return 0;var c=h("<div/>").css("width",s(a)).appendTo(b||Q.body),e=c[0].offsetWidth;c.remove();return e}function Fb(a,b){var c=a.oScroll;if(c.sX||c.sY)c=!c.sX?c.iBarWidth:0,b.style.width=s(h(b).outerWidth()-c)}function Eb(a,b){var c=Gb(a,b);if(0>c)return null;var e=a.aoData[c];return!e.nTr?h("<td/>").html(x(a,c,b,"display"))[0]:e.anCells[b]}function Gb(a,b){for(var c,e=-1,d=-1,f=0,g=a.aoData.length;f<g;f++)c=x(a,f,b,"display")+"",c=c.replace($b,""),
-c.length>e&&(e=c.length,d=f);return d}function s(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function Hb(){var a=m.__scrollbarWidth;if(a===k){var b=h("<p/>").css({position:"absolute",top:0,left:0,width:"100%",height:150,padding:0,overflow:"scroll",visibility:"hidden"}).appendTo("body"),a=b[0].offsetWidth-b[0].clientWidth;m.__scrollbarWidth=a;b.remove()}return a}function U(a){var b,c,e=[],d=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var o=[];
-f=function(a){a.length&&!h.isArray(a[0])?o.push(a):o.push.apply(o,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<o.length;a++){i=o[a][0];f=d[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=d[g].sType||"string",o[a]._idx===k&&(o[a]._idx=h.inArray(o[a][1],d[g].asSorting)),e.push({src:i,col:g,dir:o[a][1],index:o[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return e}function lb(a){var b,c,e=[],d=m.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h;
-Ha(a);h=U(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Ib(a,j.col);if("ssp"!=B(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)e[i[b]]=b;g===h.length?i.sort(function(a,b){var c,d,g,j,i=h.length,k=f[a]._aSortData,m=f[b]._aSortData;for(g=0;g<i;g++)if(j=h[g],c=k[j.col],d=m[j.col],c=c<d?-1:c>d?1:0,0!==c)return"asc"===j.dir?c:-c;c=e[a];d=e[b];return c<d?-1:c>d?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,r=f[b]._aSortData;for(j=0;j<k;j++)if(i=h[j],c=m[i.col],g=r[i.col],i=d[i.type+
-"-"+i.dir]||d["string-"+i.dir],c=i(c,g),0!==c)return c;c=e[a];g=e[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Jb(a){for(var b,c,e=a.aoColumns,d=U(a),a=a.oLanguage.oAria,f=0,g=e.length;f<g;f++){c=e[f];var j=c.asSorting;b=c.sTitle.replace(/<.*?>/g,"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<d.length&&d[0].col==f?(i.setAttribute("aria-sort","asc"==d[0].dir?"ascending":"descending"),c=j[d[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label",
-b)}}function Ua(a,b,c,e){var d=a.aaSorting,f=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===k&&(c=h.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof d[0]&&(d=a.aaSorting=[d]);c&&a.oFeatures.bSortMulti?(c=h.inArray(b,D(d,"0")),-1!==c?(b=g(d[c],!0),null===b&&1===d.length&&(b=0),null===b?d.splice(c,1):(d[c][1]=f[b],d[c]._idx=b)):(d.push([b,f[0],0]),d[d.length-1]._idx=0)):d.length&&d[0][0]==b?(b=g(d[0]),d.length=1,d[0][1]=f[b],d[0]._idx=b):(d.length=0,d.push([b,f[0]]),d[0]._idx=
-0);N(a);"function"==typeof e&&e(a)}function Oa(a,b,c,e){var d=a.aoColumns[c];Va(b,{},function(b){!1!==d.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Ua(a,c,b.shiftKey,e);"ssp"!==B(a)&&C(a,!1)},0)):Ua(a,c,b.shiftKey,e))})}function xa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,e=U(a),d=a.oFeatures,f,g;if(d.bSort&&d.bSortClasses){d=0;for(f=b.length;d<f;d++)g=b[d].src,h(D(a.aoData,"anCells",g)).removeClass(c+(2>d?d+1:3));d=0;for(f=e.length;d<f;d++)g=e[d].src,h(D(a.aoData,"anCells",
-g)).addClass(c+(2>d?d+1:3))}a.aLastSort=e}function Ib(a,b){var c=a.aoColumns[b],e=m.ext.order[c.sSortDataType],d;e&&(d=e.call(a.oInstance,a,b,$(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j<i;j++)if(c=a.aoData[j],c._aSortData||(c._aSortData=[]),!c._aSortData[b]||e)f=e?d[j]:x(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function ya(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),
-search:zb(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,e){return{visible:b.bVisible,search:zb(a.aoPreSearchCols[e])}})};w(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function Kb(a){var b,c,e=a.aoColumns;if(a.oFeatures.bStateSave){var d=a.fnStateLoadCallback.call(a.oInstance,a);if(d&&d.time&&(b=w(a,"aoStateLoadParams","stateLoadParams",[a,d]),-1===h.inArray(!1,b)&&(b=a.iStateDuration,!(0<b&&d.time<+new Date-1E3*b)&&e.length===
-d.columns.length))){a.oLoadedState=h.extend(!0,{},d);d.start!==k&&(a._iDisplayStart=d.start,a.iInitDisplayStart=d.start);d.length!==k&&(a._iDisplayLength=d.length);d.order!==k&&(a.aaSorting=[],h.each(d.order,function(b,c){a.aaSorting.push(c[0]>=e.length?[0,c[1]]:c)}));d.search!==k&&h.extend(a.oPreviousSearch,Ab(d.search));b=0;for(c=d.columns.length;b<c;b++){var f=d.columns[b];f.visible!==k&&(e[b].bVisible=f.visible);f.search!==k&&h.extend(a.aoPreSearchCols[b],Ab(f.search))}w(a,"aoStateLoaded","stateLoaded",
-[a,d])}}}function za(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function I(a,b,c,e){c="DataTables warning: "+(null!==a?"table id="+a.sTableId+" - ":"")+c;e&&(c+=". For more information about this error, please see http://datatables.net/tn/"+e);if(b)Ea.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,w(a,null,"error",[a,e,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,e,c)}}function E(a,b,c,e){h.isArray(c)?
-h.each(c,function(c,f){h.isArray(f)?E(a,b,f[0],f[1]):E(a,b,f)}):(e===k&&(e=c),b[c]!==k&&(a[e]=b[c]))}function Lb(a,b,c){var e,d;for(d in b)b.hasOwnProperty(d)&&(e=b[d],h.isPlainObject(e)?(h.isPlainObject(a[d])||(a[d]={}),h.extend(!0,a[d],e)):a[d]=c&&"data"!==d&&"aaData"!==d&&h.isArray(e)?e.slice():e);return a}function Va(a,b,c){h(a).bind("click.DT",b,function(b){a.blur();c(b)}).bind("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).bind("selectstart.DT",function(){return!1})}function z(a,
-b,c,e){c&&a[b].push({fn:c,sName:e})}function w(a,b,c,e){var d=[];b&&(d=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,e)}));null!==c&&(b=h.Event(c+".dt"),h(a.nTable).trigger(b,e),d.push(b.result));return d}function Sa(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),e=a._iDisplayLength;b>=c&&(b=c-e);b-=b%e;if(-1===e||0>b)b=0;a._iDisplayStart=b}function Pa(a,b){var c=a.renderer,e=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?e[c[b]]||e._:"string"===typeof c?e[c]||e._:e._}function B(a){return a.oFeatures.bServerSide?
-"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Wa(a,b){var c=[],c=Mb.numbers_length,e=Math.floor(c/2);b<=c?c=V(0,b):a<=e?(c=V(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-e?c=V(b-(c-2),b):(c=V(a-e+2,a+e-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function db(a){h.each({num:function(b){return Aa(b,a)},"num-fmt":function(b){return Aa(b,a,Xa)},"html-num":function(b){return Aa(b,a,Ba)},"html-num-fmt":function(b){return Aa(b,a,Ba,Xa)}},function(b,
-c){u.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(u.type.search[b+a]=u.type.search.html)})}function Nb(a){return function(){var b=[za(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m,u,t,r,v,Ya={},Ob=/[\r\n]/g,Ba=/<.*?>/g,ac=/^[\w\+\-]/,bc=/[\w\+\-]$/,Yb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Xa=/[',$\u00a3\u20ac\u00a5%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,J=function(a){return!a||!0===a||
-"-"===a?!0:!1},Pb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Qb=function(a,b){Ya[b]||(Ya[b]=RegExp(va(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Ya[b],"."):a},Za=function(a,b,c){var e="string"===typeof a;if(J(a))return!0;b&&e&&(a=Qb(a,b));c&&e&&(a=a.replace(Xa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Rb=function(a,b,c){return J(a)?!0:!(J(a)||"string"===typeof a)?null:Za(a.replace(Ba,""),b,c)?!0:null},D=function(a,b,c){var e=[],d=0,f=a.length;
-if(c!==k)for(;d<f;d++)a[d]&&a[d][b]&&e.push(a[d][b][c]);else for(;d<f;d++)a[d]&&e.push(a[d][b]);return e},ia=function(a,b,c,e){var d=[],f=0,g=b.length;if(e!==k)for(;f<g;f++)a[b[f]][c]&&d.push(a[b[f]][c][e]);else for(;f<g;f++)d.push(a[b[f]][c]);return d},V=function(a,b){var c=[],e;b===k?(b=0,e=a):(e=b,b=a);for(var d=b;d<e;d++)c.push(d);return c},Sb=function(a){for(var b=[],c=0,e=a.length;c<e;c++)a[c]&&b.push(a[c]);return b},Na=function(a){var b=[],c,e,d=a.length,f,g=0;e=0;a:for(;e<d;e++){c=a[e];for(f=
-0;f<g;f++)if(b[f]===c)continue a;b.push(c);g++}return b},A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},ba=/\[.*?\]$/,T=/\(\)$/,wa=h("<div>")[0],Zb=wa.textContent!==k,$b=/<.*?>/g;m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new t(za(this[u.iApiIndex])):new t(this)};this.fnAddData=function(a,b){var c=this.api(!0),e=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===
-k||b)&&c.draw();return e.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],e=c.oScroll;a===k||a?b.draw(!1):(""!==e.sX||""!==e.sY)&&Y(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var e=this.api(!0),a=e.rows(a),d=a.settings()[0],h=d.aoData[a[0][0]];a.remove();b&&b.call(this,d,h);(c===k||c)&&e.draw();return h};
-this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,e,d,h){d=this.api(!0);null===b||b===k?d.search(a,c,e,h):d.column(b).search(a,c,e,h);d.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var e=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==e||"th"==e?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};
-this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===
-k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return za(this[u.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,e,d){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(d===k||d)&&h.columns.adjust();(e===k||e)&&h.draw();return 0};this.fnVersionCheck=u.fnVersionCheck;var b=this,c=a===k,e=this.length;c&&(a={});this.oApi=this.internal=u.internal;for(var d in m.ext.internal)d&&
-(this[d]=Nb(d));this.each(function(){var d={},d=1<e?Lb(d,a,!0):a,g=0,j,i=this.getAttribute("id"),o=!1,l=m.defaults,q=h(this);if("table"!=this.nodeName.toLowerCase())I(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{eb(l);fb(l.column);H(l,l,!0);H(l.column,l.column,!0);H(l,h.extend(d,q.data()));var n=m.settings,g=0;for(j=n.length;g<j;g++){var r=n[g];if(r.nTable==this||r.nTHead.parentNode==this||r.nTFoot&&r.nTFoot.parentNode==this){g=d.bRetrieve!==k?d.bRetrieve:l.bRetrieve;if(c||g)return r.oInstance;
-if(d.bDestroy!==k?d.bDestroy:l.bDestroy){r.oInstance.fnDestroy();break}else{I(r,0,"Cannot reinitialise DataTable",3);return}}if(r.sTableId==this.id){n.splice(g,1);break}}if(null===i||""===i)this.id=i="DataTables_Table_"+m.ext._unique++;var p=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:i,sTableId:i});p.nTable=this;p.oApi=b.internal;p.oInit=d;n.push(p);p.oInstance=1===b.length?b:q.dataTable();eb(d);d.oLanguage&&P(d.oLanguage);d.aLengthMenu&&!d.iDisplayLength&&(d.iDisplayLength=
-h.isArray(d.aLengthMenu[0])?d.aLengthMenu[0][0]:d.aLengthMenu[0]);d=Lb(h.extend(!0,{},l),d);E(p.oFeatures,d,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));E(p,d,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback",
-"renderer","searchDelay",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);E(p.oScroll,d,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);E(p.oLanguage,d,"fnInfoCallback");z(p,"aoDrawCallback",d.fnDrawCallback,"user");z(p,"aoServerParams",d.fnServerParams,"user");z(p,"aoStateSaveParams",d.fnStateSaveParams,"user");z(p,"aoStateLoadParams",
-d.fnStateLoadParams,"user");z(p,"aoStateLoaded",d.fnStateLoaded,"user");z(p,"aoRowCallback",d.fnRowCallback,"user");z(p,"aoRowCreatedCallback",d.fnCreatedRow,"user");z(p,"aoHeaderCallback",d.fnHeaderCallback,"user");z(p,"aoFooterCallback",d.fnFooterCallback,"user");z(p,"aoInitComplete",d.fnInitComplete,"user");z(p,"aoPreDrawCallback",d.fnPreDrawCallback,"user");i=p.oClasses;d.bJQueryUI?(h.extend(i,m.ext.oJUIClasses,d.oClasses),d.sDom===l.sDom&&"lfrtip"===l.sDom&&(p.sDom='<"H"lfr>t<"F"ip>'),p.renderer)?
-h.isPlainObject(p.renderer)&&!p.renderer.header&&(p.renderer.header="jqueryui"):p.renderer="jqueryui":h.extend(i,m.ext.classes,d.oClasses);q.addClass(i.sTable);if(""!==p.oScroll.sX||""!==p.oScroll.sY)p.oScroll.iBarWidth=Hb();!0===p.oScroll.sX&&(p.oScroll.sX="100%");p.iInitDisplayStart===k&&(p.iInitDisplayStart=d.iDisplayStart,p._iDisplayStart=d.iDisplayStart);null!==d.iDeferLoading&&(p.bDeferLoading=!0,g=h.isArray(d.iDeferLoading),p._iRecordsDisplay=g?d.iDeferLoading[0]:d.iDeferLoading,p._iRecordsTotal=
-g?d.iDeferLoading[1]:d.iDeferLoading);var t=p.oLanguage;h.extend(!0,t,d.oLanguage);""!==t.sUrl&&(h.ajax({dataType:"json",url:t.sUrl,success:function(a){P(a);H(l.oLanguage,a);h.extend(true,t,a);ga(p)},error:function(){ga(p)}}),o=!0);null===d.asStripeClasses&&(p.asStripeClasses=[i.sStripeOdd,i.sStripeEven]);var g=p.asStripeClasses,s=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(g,function(a){return s.hasClass(a)}))&&(h("tbody tr",this).removeClass(g.join(" ")),p.asDestroyStripes=g.slice());
-n=[];g=this.getElementsByTagName("thead");0!==g.length&&(da(p.aoHeader,g[0]),n=qa(p));if(null===d.aoColumns){r=[];g=0;for(j=n.length;g<j;g++)r.push(null)}else r=d.aoColumns;g=0;for(j=r.length;g<j;g++)Fa(p,n?n[g]:null);ib(p,d.aoColumnDefs,r,function(a,b){ka(p,a,b)});if(s.length){var u=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h.each(na(p,s[0]).cells,function(a,b){var c=p.aoColumns[a];if(c.mData===a){var d=u(b,"sort")||u(b,"order"),e=u(b,"filter")||u(b,"search");if(d!==null||e!==
-null){c.mData={_:a+".display",sort:d!==null?a+".@data-"+d:k,type:d!==null?a+".@data-"+d:k,filter:e!==null?a+".@data-"+e:k};ka(p,a)}}})}var v=p.oFeatures;d.bStateSave&&(v.bStateSave=!0,Kb(p,d),z(p,"aoDrawCallback",ya,"state_save"));if(d.aaSorting===k){n=p.aaSorting;g=0;for(j=n.length;g<j;g++)n[g][1]=p.aoColumns[g].asSorting[0]}xa(p);v.bSort&&z(p,"aoDrawCallback",function(){if(p.bSorted){var a=U(p),b={};h.each(a,function(a,c){b[c.src]=c.dir});w(p,null,"order",[p,a,b]);Jb(p)}});z(p,"aoDrawCallback",
-function(){(p.bSorted||B(p)==="ssp"||v.bDeferRender)&&xa(p)},"sc");gb(p);g=q.children("caption").each(function(){this._captionSide=q.css("caption-side")});j=q.children("thead");0===j.length&&(j=h("<thead/>").appendTo(this));p.nTHead=j[0];j=q.children("tbody");0===j.length&&(j=h("<tbody/>").appendTo(this));p.nTBody=j[0];j=q.children("tfoot");if(0===j.length&&0<g.length&&(""!==p.oScroll.sX||""!==p.oScroll.sY))j=h("<tfoot/>").appendTo(this);0===j.length||0===j.children().length?q.addClass(i.sNoFooter):
-0<j.length&&(p.nTFoot=j[0],da(p.aoFooter,p.nTFoot));if(d.aaData)for(g=0;g<d.aaData.length;g++)K(p,d.aaData[g]);else(p.bDeferLoading||"dom"==B(p))&&ma(p,h(p.nTBody).children("tr"));p.aiDisplay=p.aiDisplayMaster.slice();p.bInitialised=!0;!1===o&&ga(p)}});b=null;return this};var Tb=[],y=Array.prototype,cc=function(a){var b,c,e=m.settings,d=h.map(e,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,d),-1!==b?[e[b]]:
-null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,d);return-1!==b?e[b]:null}).toArray()};t=function(a,b){if(!(this instanceof t))return new t(a,b);var c=[],e=function(a){(a=cc(a))&&c.push.apply(c,a)};if(h.isArray(a))for(var d=0,f=a.length;d<f;d++)e(a[d]);else e(a);this.context=Na(c);b&&this.push.apply(this,b.toArray?b.toArray():b);this.selector={rows:null,cols:null,opts:null};
-t.extend(this,this,Tb)};m.Api=t;t.prototype={any:function(){return 0!==this.flatten().length},concat:y.concat,context:[],each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new t(b[a],this[a]):null},filter:function(a){var b=[];if(y.filter)b=y.filter.call(this,a,this);else for(var c=0,e=this.length;c<e;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new t(this.context,b)},flatten:function(){var a=[];
-return new t(this.context,a.concat.apply(a,this.toArray()))},join:y.join,indexOf:y.indexOf||function(a,b){for(var c=b||0,e=this.length;c<e;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,e){var d=[],f,g,h,i,o,l=this.context,q,n,m=this.selector;"string"===typeof a&&(e=c,c=b,b=a,a=!1);g=0;for(h=l.length;g<h;g++){var p=new t(l[g]);if("table"===b)f=c.call(p,l[g],g),f!==k&&d.push(f);else if("columns"===b||"rows"===b)f=c.call(p,l[g],this[g],g),f!==k&&d.push(f);else if("column"===b||"column-rows"===
-b||"row"===b||"cell"===b){n=this[g];"column-rows"===b&&(q=Ca(l[g],m.opts));i=0;for(o=n.length;i<o;i++)f=n[i],f="cell"===b?c.call(p,l[g],f.row,f.column,g,i):c.call(p,l[g],f,g,i,q),f!==k&&d.push(f)}}return d.length||e?(a=new t(l,a?d.concat.apply([],d):d),b=a.selector,b.rows=m.rows,b.cols=m.cols,b.opts=m.opts,a):this},lastIndexOf:y.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(y.map)b=y.map.call(this,a,this);else for(var c=
-0,e=this.length;c<e;c++)b.push(a.call(this,this[c],c));return new t(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:y.pop,push:y.push,reduce:y.reduce||function(a,b){return hb(this,a,b,0,this.length,1)},reduceRight:y.reduceRight||function(a,b){return hb(this,a,b,this.length-1,-1,-1)},reverse:y.reverse,selector:null,shift:y.shift,sort:y.sort,splice:y.splice,toArray:function(){return y.slice.call(this)},to$:function(){return h(this)},toJQuery:function(){return h(this)},
-unique:function(){return new t(this.context,Na(this))},unshift:y.unshift};t.extend=function(a,b,c){if(c.length&&b&&(b instanceof t||b.__dt_wrapper)){var e,d,f,g=function(a,b,c){return function(){var d=b.apply(a,arguments);t.extend(d,d,c.methodExt);return d}};e=0;for(d=c.length;e<d;e++)f=c[e],b[f.name]="function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,t.extend(a,b[f.name],f.propExt)}};t.register=r=function(a,b){if(h.isArray(a))for(var c=0,e=a.length;c<
-e;c++)t.register(a[c],b);else for(var d=a.split("."),f=Tb,g,j,c=0,e=d.length;c<e;c++){g=(j=-1!==d[c].indexOf("()"))?d[c].replace("()",""):d[c];var i;a:{i=0;for(var o=f.length;i<o;i++)if(f[i].name===g){i=f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===e-1?i.val=b:f=j?i.methodExt:i.propExt}};t.registerPlural=v=function(a,b,c){t.register(a,c);t.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof t?a.length?h.isArray(a[0])?new t(a.context,
-a[0]):a[0]:k:a})};r("tables()",function(a){var b;if(a){b=t;var c=this.context;if("number"===typeof a)a=[c[a]];else var e=h.map(c,function(a){return a.nTable}),a=h(e).filter(a).map(function(){var a=h.inArray(this,e);return c[a]}).toArray();b=new b(a)}else b=this;return b});r("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new t(b[0]):a});v("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});v("tables().body()","table().body()",
-function(){return this.iterator("table",function(a){return a.nTBody},1)});v("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});v("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});v("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});r("draw()",function(a){return this.iterator("table",function(b){N(b,
-!1===a)})});r("page()",function(a){return a===k?this.page.info().page:this.iterator("table",function(b){Ta(b,a)})});r("page.info()",function(){if(0===this.context.length)return k;var a=this.context[0],b=a._iDisplayStart,c=a._iDisplayLength,e=a.fnRecordsDisplay(),d=-1===c;return{page:d?0:Math.floor(b/c),pages:d?1:Math.ceil(e/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:e}});r("page.len()",function(a){return a===k?0!==this.context.length?this.context[0]._iDisplayLength:
-k:this.iterator("table",function(b){Ra(b,a)})});var Ub=function(a,b,c){if(c){var e=new t(a);e.one("draw",function(){c(e.ajax.json())})}"ssp"==B(a)?N(a,b):(C(a,!0),ra(a,[],function(c){oa(a);for(var c=sa(a,c),e=0,g=c.length;e<g;e++)K(a,c[e]);N(a,b);C(a,!1)}))};r("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});r("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});r("ajax.reload()",function(a,b){return this.iterator("table",function(c){Ub(c,
-!1===b,a)})});r("ajax.url()",function(a){var b=this.context;if(a===k){if(0===b.length)return k;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});r("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Ub(c,!1===b,a)})});var $a=function(a,b,c,e,d){var f=[],g,j,i,o,l,q;i=typeof b;if(!b||"string"===i||"function"===i||b.length===k)b=[b];i=0;for(o=b.length;i<o;i++){j=
-b[i]&&b[i].split?b[i].split(","):[b[i]];l=0;for(q=j.length;l<q;l++)(g=c("string"===typeof j[l]?h.trim(j[l]):j[l]))&&g.length&&f.push.apply(f,g)}a=u.selector[a];if(a.length){i=0;for(o=a.length;i<o;i++)f=a[i](e,d,f)}return f},ab=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none",order:"current",page:"all"},a)},bb=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},
-Ca=function(a,b){var c,e,d,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;e=b.order;d=b.page;if("ssp"==B(a))return"removed"===j?[]:V(0,c.length);if("current"==d){c=a._iDisplayStart;for(e=a.fnDisplayEnd();c<e;c++)f.push(g[c])}else if("current"==e||"applied"==e)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c,function(a){return-1===h.inArray(a,g)?a:null});else if("index"==e||"original"==e){c=0;for(e=a.aoData.length;c<e;c++)"none"==j?f.push(c):(d=h.inArray(c,g),(-1===d&&"removed"==j||0<=d&&
-"applied"==j)&&f.push(c))}return f};r("rows()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var d=b;return $a("row",a,function(a){var b=Pb(a);if(b!==null&&!d)return[b];var j=Ca(c,d);if(b!==null&&h.inArray(b,j)!==-1)return[b];if(!a)return j;if(typeof a==="function")return h.map(j,function(b){var d=c.aoData[b];return a(b,d._aData,d.nTr)?b:null});b=Sb(ia(c.aoData,j,"nTr"));return a.nodeName&&h.inArray(a,b)!==-1?[a._DT_RowIndex]:h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()},
-c,d)},1);c.selector.rows=a;c.selector.opts=b;return c});r("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||k},1)});r("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return ia(a.aoData,b,"_aData")},1)});v("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var e=b.aoData[c];return"search"===a?e._aFilterData:e._aSortData},1)});v("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",
-function(b,c){ca(b,c,a)})});v("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});v("rows().remove()","row().remove()",function(){var a=this;return this.iterator("row",function(b,c,e){var d=b.aoData;d.splice(c,1);for(var f=0,g=d.length;f<g;f++)null!==d[f].nTr&&(d[f].nTr._DT_RowIndex=f);h.inArray(c,b.aiDisplay);pa(b.aiDisplayMaster,c);pa(b.aiDisplay,c);pa(a[e],c,!1);Sa(b)})});r("rows.add()",function(a){var b=this.iterator("table",function(b){var c,
-f,g,h=[];f=0;for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(ma(b,c)[0]):h.push(K(b,c));return h},1),c=this.rows(-1);c.pop();c.push.apply(c,b.toArray());return c});r("row()",function(a,b){return bb(this.rows(a,b))});r("row().data()",function(a){var b=this.context;if(a===k)return b.length&&this.length?b[0].aoData[this[0]]._aData:k;b[0].aoData[this[0]]._aData=a;ca(b[0],this[0],"data");return this});r("row().node()",function(){var a=this.context;return a.length&&this.length?
-a[0].aoData[this[0]].nTr||null:null});r("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?ma(b,a)[0]:K(b,a)});return this.row(b[0])});var cb=function(a,b){var c=a.context;c.length&&(c=c[0].aoData[b!==k?b:a[0]],c._details&&(c._details.remove(),c._detailsShow=k,c._details=k))},Vb=function(a,b){var c=a.context;if(c.length&&a.length){var e=c[0].aoData[a[0]];if(e._details){(e._detailsShow=b)?e._details.insertAfter(e.nTr):
-e._details.detach();var d=c[0],f=new t(d),g=d.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<D(g,"_details").length&&(f.on("draw.dt.DT_details",function(a,b){d===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",function(a,b){if(d===b)for(var c,e=aa(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",e)}),f.on("destroy.dt.DT_details",
-function(a,b){if(d===b)for(var c=0,e=g.length;c<e;c++)g[c]._details&&cb(f,c)}))}}};r("row().child()",function(a,b){var c=this.context;if(a===k)return c.length&&this.length?c[0].aoData[this[0]]._details:k;if(!0===a)this.child.show();else if(!1===a)cb(this);else if(c.length&&this.length){var e=c[0],c=c[0].aoData[this[0]],d=[],f=function(a,b){if(h.isArray(a)||a instanceof h)for(var c=0,k=a.length;c<k;c++)f(a[c],b);else a.nodeName&&"tr"===a.nodeName.toLowerCase()?d.push(a):(c=h("<tr><td/></tr>").addClass(b),
-h("td",c).addClass(b).html(a)[0].colSpan=aa(e),d.push(c[0]))};f(a,b);c._details&&c._details.remove();c._details=h(d);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});r(["row().child.show()","row().child().show()"],function(){Vb(this,!0);return this});r(["row().child.hide()","row().child().hide()"],function(){Vb(this,!1);return this});r(["row().child.remove()","row().child().remove()"],function(){cb(this);return this});r("row().child.isShown()",function(){var a=this.context;return a.length&&
-this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var dc=/^(.+):(name|visIdx|visible)$/,Wb=function(a,b,c,e,d){for(var c=[],e=0,f=d.length;e<f;e++)c.push(x(a,d[e],b));return c};r("columns()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var d=a,f=b,g=c.aoColumns,j=D(g,"sName"),i=D(g,"nTh");return $a("column",d,function(a){var b=Pb(a);if(a==="")return V(g.length);if(b!==null)return[b>=0?b:g.length+b];if(typeof a==="function"){var d=Ca(c,
-f);return h.map(g,function(b,f){return a(f,Wb(c,f,0,0,d),i[f])?f:null})}var k=typeof a==="string"?a.match(dc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});return[m[m.length+b]]}return[la(c,b)];case "name":return h.map(j,function(a,b){return a===k[1]?b:null})}else return h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray()},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});v("columns().header()",
-"column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});v("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});v("columns().data()","column().data()",function(){return this.iterator("column-rows",Wb,1)});v("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});v("columns().cache()","column().cache()",
-function(a){return this.iterator("column-rows",function(b,c,e,d,f){return ia(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});v("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,e,d){return ia(a.aoData,d,"anCells",b)},1)});v("columns().visible()","column().visible()",function(a,b){return this.iterator("column",function(c,e){if(a===k)return c.aoColumns[e].bVisible;var d=c.aoColumns,f=d[e],g=c.aoData,j,i,m;if(a!==k&&f.bVisible!==a){if(a){var l=
-h.inArray(!0,D(d,"bVisible"),e+1);j=0;for(i=g.length;j<i;j++)m=g[j].nTr,d=g[j].anCells,m&&m.insertBefore(d[e],d[l]||null)}else h(D(c.aoData,"anCells",e)).detach();f.bVisible=a;ea(c,c.aoHeader);ea(c,c.aoFooter);if(b===k||b)X(c),(c.oScroll.sX||c.oScroll.sY)&&Y(c);w(c,null,"column-visibility",[c,e,a]);ya(c)}})});v("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?$(b,c):c},1)});r("columns.adjust()",function(){return this.iterator("table",
-function(a){X(a)},1)});r("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return la(c,b);if("fromData"===a||"toVisible"===a)return $(c,b)}});r("column()",function(a,b){return bb(this.columns(a,b))});r("cells()",function(a,b,c){h.isPlainObject(a)&&(a.row===k?(c=a,a=null):(c=b,b=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===k)return this.iterator("table",function(b){var d=a,e=ab(c),f=b.aoData,g=Ca(b,e),i=Sb(ia(f,g,"anCells")),
-j=h([].concat.apply([],i)),l,m=b.aoColumns.length,o,r,t,s,u,v;return $a("cell",d,function(a){var c=typeof a==="function";if(a===null||a===k||c){o=[];r=0;for(t=g.length;r<t;r++){l=g[r];for(s=0;s<m;s++){u={row:l,column:s};if(c){v=b.aoData[l];a(u,x(b,l,s),v.anCells?v.anCells[s]:null)&&o.push(u)}else o.push(u)}}return o}return h.isPlainObject(a)?[a]:j.filter(a).map(function(a,b){l=b.parentNode._DT_RowIndex;return{row:l,column:h.inArray(b,f[l].anCells)}}).toArray()},b,e)});var e=this.columns(b,c),d=this.rows(a,
-c),f,g,j,i,m,l=this.iterator("table",function(a,b){f=[];g=0;for(j=d[b].length;g<j;g++){i=0;for(m=e[b].length;i<m;i++)f.push({row:d[b][g],column:e[b][i]})}return f},1);h.extend(l.selector,{cols:b,rows:a,opts:c});return l});v("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b].anCells)?a[c]:k},1)});r("cells().data()",function(){return this.iterator("cell",function(a,b,c){return x(a,b,c)},1)});v("cells().cache()","cell().cache()",function(a){a=
-"search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,e){return b.aoData[c][a][e]},1)});v("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,e){return x(b,c,e,a)},1)});v("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:$(a,c)}},1)});v("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,e){ca(b,c,a,e)})});r("cell()",
-function(a,b,c){return bb(this.cells(a,b,c))});r("cell().data()",function(a){var b=this.context,c=this[0];if(a===k)return b.length&&c.length?x(b[0],c[0].row,c[0].column):k;Ia(b[0],c[0].row,c[0].column,a);ca(b[0],c[0].row,"data",c[0].column);return this});r("order()",function(a,b){var c=this.context;if(a===k)return 0!==c.length?c[0].aaSorting:k;"number"===typeof a?a=[[a,b]]:h.isArray(a[0])||(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});
-r("order.listener()",function(a,b,c){return this.iterator("table",function(e){Oa(e,a,b,c)})});r(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,e){var d=[];h.each(b[e],function(b,c){d.push([c,a])});c.aaSorting=d})});r("search()",function(a,b,c,e){var d=this.context;return a===k?0!==d.length?d[0].oPreviousSearch.sSearch:k:this.iterator("table",function(d){d.oFeatures.bFilter&&fa(d,h.extend({},d.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:
-b,bSmart:null===c?!0:c,bCaseInsensitive:null===e?!0:e}),1)})});v("columns().search()","column().search()",function(a,b,c,e){return this.iterator("column",function(d,f){var g=d.aoPreSearchCols;if(a===k)return g[f].sSearch;d.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===e?!0:e}),fa(d,d.oPreviousSearch,1))})});r("state()",function(){return this.context.length?this.context[0].oSavedState:null});r("state.clear()",function(){return this.iterator("table",
-function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});r("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});r("state.save()",function(){return this.iterator("table",function(a){ya(a)})});m.versionCheck=m.fnVersionCheck=function(a){for(var b=m.version.split("."),a=a.split("."),c,e,d=0,f=a.length;d<f;d++)if(c=parseInt(b[d],10)||0,e=parseInt(a[d],10)||0,c!==e)return c>e;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;h.each(m.settings,
-function(a,d){var f=d.nScrollHead?h("table",d.nScrollHead)[0]:null,g=d.nScrollFoot?h("table",d.nScrollFoot)[0]:null;if(d.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){return h.map(m.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable})};m.util={throttle:ua,escapeRegex:va};m.camelToHungarian=H;r("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,
-b){r(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0].match(/\.dt\b/)||(a[0]+=".dt");var e=h(this.tables().nodes());e[b].apply(e,a);return this})});r("clear()",function(){return this.iterator("table",function(a){oa(a)})});r("settings()",function(){return new t(this.context,this.context)});r("init()",function(){var a=this.context;return a.length?a[0].oInit:null});r("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});r("destroy()",
-function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,e=b.oClasses,d=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(d),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),q;b.bDestroying=!0;w(b,"aoDestroyCallback","destroy",[b]);a||(new t(b)).columns().visible(!0);k.unbind(".DT").find(":not(tbody *)").unbind(".DT");h(Ea).unbind(".DT-"+b.sInstance);d!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&d!=j.parentNode&&(i.children("tfoot").detach(),
-i.append(j));i.detach();k.detach();b.aaSorting=[];b.aaSortingFixed=[];xa(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(e.sSortable+" "+e.sSortableAsc+" "+e.sSortableDesc+" "+e.sSortableNone);b.bJUI&&(h("th span."+e.sSortIcon+", td span."+e.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+e.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));!a&&c&&c.insertBefore(d,b.nTableReinsertBefore);f.children().detach();f.append(l);i.css("width",b.sDestroyWidth).removeClass(e.sTable);
-(q=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%q])});c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column","row","cell"],function(a,b){r(b+"s().every()",function(a){return this.iterator(b,function(e,d,f){a.call((new t(e))[b](d,f))})})});r("i18n()",function(a,b,c){var e=this.context[0],a=R(a)(e.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);return a.replace("%d",c)});m.version="1.10.7";m.settings=
-[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",
-sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,
-fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,
-fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},
-sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,
-sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null};W(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};W(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,
-bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],
-sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,
-bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==B(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==B(this)?1*this._iRecordsDisplay:
-this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,e=this.aiDisplay.length,d=this.oFeatures,f=d.bPaginate;return d.bServerSide?!1===f||-1===a?b+e:Math.min(b+a,this._iRecordsDisplay):!f||c>e||-1===a?e:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{}};m.ext=u={buttons:{},classes:{},errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},
-header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(u,{afnFiltering:u.search,aTypes:u.type.detect,ofnSearch:u.type.search,oSort:u.type.order,afnSortData:u.order,aoFeatures:u.feature,oApi:u.internal,oStdClasses:u.classes,oPagination:u.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",
-sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",
-sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Da="",Da="",F=Da+"ui-state-default",ja=Da+"css_right ui-icon ui-icon-",Xb=Da+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m.ext.oJUIClasses,
-m.ext.classes,{sPageButton:"fg-button ui-button "+F,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:F+" sorting_asc",sSortDesc:F+" sorting_desc",sSortable:F+" sorting",sSortableAsc:F+" sorting_asc_disabled",sSortableDesc:F+" sorting_desc_disabled",sSortableNone:F+" sorting_disabled",sSortJUIAsc:ja+"triangle-1-n",sSortJUIDesc:ja+"triangle-1-s",sSortJUI:ja+"carat-2-n-s",
-sSortJUIAscAllowed:ja+"carat-1-n",sSortJUIDescAllowed:ja+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+F,sScrollFoot:"dataTables_scrollFoot "+F,sHeaderTH:F,sFooterTH:F,sJUIHeader:Xb+" ui-corner-tl ui-corner-tr",sJUIFooter:Xb+" ui-corner-bl ui-corner-br"});var Mb=m.ext.pager;h.extend(Mb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},simple_numbers:function(a,b){return["previous",
-Wa(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Wa(a,b),"next","last"]},_numbers:Wa,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,e,d,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i,k,l=0,m=function(b,e){var n,r,t,s,u=function(b){Ta(a,b.data.action,true)};n=0;for(r=e.length;n<r;n++){s=e[n];if(h.isArray(s)){t=h("<"+(s.DT_el||"div")+"/>").appendTo(b);m(t,s)}else{k=i="";switch(s){case "ellipsis":b.append('<span class="ellipsis">&#x2026;</span>');break;
-case "first":i=j.sFirst;k=s+(d>0?"":" "+g.sPageButtonDisabled);break;case "previous":i=j.sPrevious;k=s+(d>0?"":" "+g.sPageButtonDisabled);break;case "next":i=j.sNext;k=s+(d<f-1?"":" "+g.sPageButtonDisabled);break;case "last":i=j.sLast;k=s+(d<f-1?"":" "+g.sPageButtonDisabled);break;default:i=s+1;k=d===s?g.sPageButtonActive:""}if(i){t=h("<a>",{"class":g.sPageButton+" "+k,"aria-controls":a.sTableId,"data-dt-idx":l,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(i).appendTo(b);
-Va(t,{action:s},u);l++}}}},n;try{n=h(Q.activeElement).data("dt-idx")}catch(r){}m(h(b).empty(),e);n&&h(b).find("[data-dt-idx="+n+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&(!ac.test(a)||!bc.test(a)))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||J(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;
-return Rb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c,!0)?"html-num-fmt"+c:null},function(a){return J(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search,{html:function(a){return J(a)?a:"string"===typeof a?a.replace(Ob," ").replace(Ba,""):""},string:function(a){return J(a)?a:"string"===typeof a?a.replace(Ob," "):a}});var Aa=function(a,b,c,e){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Qb(a,b));a.replace&&(c&&(a=a.replace(c,"")),
-e&&(a=a.replace(e,"")));return 1*a};h.extend(u.type.order,{"date-pre":function(a){return Date.parse(a)||0},"html-pre":function(a){return J(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return J(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});db("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,e){h(a.nTable).on("order.dt.DT",function(d,
-f,g,h){if(a===f){d=c.idx;b.removeClass(c.sSortingClass+" "+e.sSortAsc+" "+e.sSortDesc).addClass(h[d]=="asc"?e.sSortAsc:h[d]=="desc"?e.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,e){h("<div/>").addClass(e.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(e.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",function(d,f,g,h){if(a===f){d=c.idx;b.removeClass(e.sSortAsc+" "+e.sSortDesc).addClass(h[d]=="asc"?e.sSortAsc:h[d]=="desc"?e.sSortDesc:c.sSortingClass);
-b.find("span."+e.sSortIcon).removeClass(e.sSortJUIAsc+" "+e.sSortJUIDesc+" "+e.sSortJUI+" "+e.sSortJUIAscAllowed+" "+e.sSortJUIDescAllowed).addClass(h[d]=="asc"?e.sSortJUIAsc:h[d]=="desc"?e.sSortJUIDesc:c.sSortingClassJUI)}})}}});m.render={number:function(a,b,c,e){return{display:function(d){if("number"!==typeof d&&"string"!==typeof d)return d;var f=0>d?"-":"",d=Math.abs(parseFloat(d)),g=parseInt(d,10),d=c?b+(d-g).toFixed(c).substring(2):"";return f+(e||"")+g.toString().replace(/\B(?=(\d{3})+(?!\d))/g,
-a)+d}}}};h.extend(m.ext.internal,{_fnExternApiFunc:Nb,_fnBuildAjax:ra,_fnAjaxUpdate:kb,_fnAjaxParameters:tb,_fnAjaxUpdateDraw:ub,_fnAjaxDataSrc:sa,_fnAddColumn:Fa,_fnColumnOptions:ka,_fnAdjustColumnSizing:X,_fnVisibleToColumnIndex:la,_fnColumnIndexToVisible:$,_fnVisbleColumns:aa,_fnGetColumns:Z,_fnColumnTypes:Ha,_fnApplyColumnDefs:ib,_fnHungarianMap:W,_fnCamelToHungarian:H,_fnLanguageCompat:P,_fnBrowserDetect:gb,_fnAddData:K,_fnAddTr:ma,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:
-null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:x,_fnSetCellData:Ia,_fnSplitObjNotation:Ka,_fnGetObjectDataFn:R,_fnSetObjectDataFn:S,_fnGetDataMaster:La,_fnClearTable:oa,_fnDeleteIndex:pa,_fnInvalidate:ca,_fnGetRowElements:na,_fnCreateTr:Ja,_fnBuildHead:jb,_fnDrawHead:ea,_fnDraw:M,_fnReDraw:N,_fnAddOptionsHtml:mb,_fnDetectHeader:da,_fnGetUniqueThs:qa,_fnFeatureHtmlFilter:ob,_fnFilterComplete:fa,_fnFilterCustom:xb,_fnFilterColumn:wb,_fnFilter:vb,_fnFilterCreateSearch:Qa,
-_fnEscapeRegex:va,_fnFilterData:yb,_fnFeatureHtmlInfo:rb,_fnUpdateInfo:Bb,_fnInfoMacros:Cb,_fnInitialise:ga,_fnInitComplete:ta,_fnLengthChange:Ra,_fnFeatureHtmlLength:nb,_fnFeatureHtmlPaginate:sb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:pb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:qb,_fnScrollDraw:Y,_fnApplyToChildren:G,_fnCalculateColumnWidths:Ga,_fnThrottle:ua,_fnConvertToWidth:Db,_fnScrollingWidthAdjust:Fb,_fnGetWidestNode:Eb,_fnGetMaxLenString:Gb,_fnStringToCss:s,_fnScrollBarWidth:Hb,_fnSortFlatten:U,
-_fnSort:lb,_fnSortAria:Jb,_fnSortListener:Ua,_fnSortAttachListener:Oa,_fnSortingClasses:xa,_fnSortData:Ib,_fnSaveState:ya,_fnLoadState:Kb,_fnSettingsFromNode:za,_fnLog:I,_fnMap:E,_fnBindAction:Va,_fnCallbackReg:z,_fnCallbackFire:w,_fnLengthOverflow:Sa,_fnRenderer:Pa,_fnDataSource:B,_fnRowAttributes:Ma,_fnCalculateEnd:function(){}});h.fn.dataTable=m;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=
-b});return h.fn.dataTable};"function"===typeof define&&define.amd?define("datatables",["jquery"],P):"object"===typeof exports?module.exports=P(require("jquery")):jQuery&&!jQuery.fn.dataTable&&P(jQuery)})(window,document);
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css
deleted file mode 100644
index 880eb82..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css
+++ /dev/null
@@ -1,2026 +0,0 @@
-/*!
- * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */
-/* FONT PATH
- * -------------------------- */
-@font-face {
- font-family: 'FontAwesome';
- src: url('../fonts/fontawesome-webfont.eot?v=4.4.0');
- src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');
- font-weight: normal;
- font-style: normal;
-}
-.fa {
- display: inline-block;
- font: normal normal normal 14px/1 FontAwesome;
- font-size: inherit;
- text-rendering: auto;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-/* makes the font 33% larger relative to the icon container */
-.fa-lg {
- font-size: 1.33333333em;
- line-height: 0.75em;
- vertical-align: -15%;
-}
-.fa-2x {
- font-size: 2em;
-}
-.fa-3x {
- font-size: 3em;
-}
-.fa-4x {
- font-size: 4em;
-}
-.fa-5x {
- font-size: 5em;
-}
-.fa-fw {
- width: 1.28571429em;
- text-align: center;
-}
-.fa-ul {
- padding-left: 0;
- margin-left: 2.14285714em;
- list-style-type: none;
-}
-.fa-ul > li {
- position: relative;
-}
-.fa-li {
- position: absolute;
- left: -2.14285714em;
- width: 2.14285714em;
- top: 0.14285714em;
- text-align: center;
-}
-.fa-li.fa-lg {
- left: -1.85714286em;
-}
-.fa-border {
- padding: .2em .25em .15em;
- border: solid 0.08em #eeeeee;
- border-radius: .1em;
-}
-.fa-pull-left {
- float: left;
-}
-.fa-pull-right {
- float: right;
-}
-.fa.fa-pull-left {
- margin-right: .3em;
-}
-.fa.fa-pull-right {
- margin-left: .3em;
-}
-/* Deprecated as of 4.4.0 */
-.pull-right {
- float: right;
-}
-.pull-left {
- float: left;
-}
-.fa.pull-left {
- margin-right: .3em;
-}
-.fa.pull-right {
- margin-left: .3em;
-}
-.fa-spin {
- -webkit-animation: fa-spin 2s infinite linear;
- animation: fa-spin 2s infinite linear;
-}
-.fa-pulse {
- -webkit-animation: fa-spin 1s infinite steps(8);
- animation: fa-spin 1s infinite steps(8);
-}
-@-webkit-keyframes fa-spin {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(359deg);
- transform: rotate(359deg);
- }
-}
-@keyframes fa-spin {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(359deg);
- transform: rotate(359deg);
- }
-}
-.fa-rotate-90 {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
- -webkit-transform: rotate(90deg);
- -ms-transform: rotate(90deg);
- transform: rotate(90deg);
-}
-.fa-rotate-180 {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
- -webkit-transform: rotate(180deg);
- -ms-transform: rotate(180deg);
- transform: rotate(180deg);
-}
-.fa-rotate-270 {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
- -webkit-transform: rotate(270deg);
- -ms-transform: rotate(270deg);
- transform: rotate(270deg);
-}
-.fa-flip-horizontal {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
- -webkit-transform: scale(-1, 1);
- -ms-transform: scale(-1, 1);
- transform: scale(-1, 1);
-}
-.fa-flip-vertical {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
- -webkit-transform: scale(1, -1);
- -ms-transform: scale(1, -1);
- transform: scale(1, -1);
-}
-:root .fa-rotate-90,
-:root .fa-rotate-180,
-:root .fa-rotate-270,
-:root .fa-flip-horizontal,
-:root .fa-flip-vertical {
- filter: none;
-}
-.fa-stack {
- position: relative;
- display: inline-block;
- width: 2em;
- height: 2em;
- line-height: 2em;
- vertical-align: middle;
-}
-.fa-stack-1x,
-.fa-stack-2x {
- position: absolute;
- left: 0;
- width: 100%;
- text-align: center;
-}
-.fa-stack-1x {
- line-height: inherit;
-}
-.fa-stack-2x {
- font-size: 2em;
-}
-.fa-inverse {
- color: #ffffff;
-}
-/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
- readers do not read off random characters that represent icons */
-.fa-glass:before {
- content: "\f000";
-}
-.fa-music:before {
- content: "\f001";
-}
-.fa-search:before {
- content: "\f002";
-}
-.fa-envelope-o:before {
- content: "\f003";
-}
-.fa-heart:before {
- content: "\f004";
-}
-.fa-star:before {
- content: "\f005";
-}
-.fa-star-o:before {
- content: "\f006";
-}
-.fa-user:before {
- content: "\f007";
-}
-.fa-film:before {
- content: "\f008";
-}
-.fa-th-large:before {
- content: "\f009";
-}
-.fa-th:before {
- content: "\f00a";
-}
-.fa-th-list:before {
- content: "\f00b";
-}
-.fa-check:before {
- content: "\f00c";
-}
-.fa-remove:before,
-.fa-close:before,
-.fa-times:before {
- content: "\f00d";
-}
-.fa-search-plus:before {
- content: "\f00e";
-}
-.fa-search-minus:before {
- content: "\f010";
-}
-.fa-power-off:before {
- content: "\f011";
-}
-.fa-signal:before {
- content: "\f012";
-}
-.fa-gear:before,
-.fa-cog:before {
- content: "\f013";
-}
-.fa-trash-o:before {
- content: "\f014";
-}
-.fa-home:before {
- content: "\f015";
-}
-.fa-file-o:before {
- content: "\f016";
-}
-.fa-clock-o:before {
- content: "\f017";
-}
-.fa-road:before {
- content: "\f018";
-}
-.fa-download:before {
- content: "\f019";
-}
-.fa-arrow-circle-o-down:before {
- content: "\f01a";
-}
-.fa-arrow-circle-o-up:before {
- content: "\f01b";
-}
-.fa-inbox:before {
- content: "\f01c";
-}
-.fa-play-circle-o:before {
- content: "\f01d";
-}
-.fa-rotate-right:before,
-.fa-repeat:before {
- content: "\f01e";
-}
-.fa-refresh:before {
- content: "\f021";
-}
-.fa-list-alt:before {
- content: "\f022";
-}
-.fa-lock:before {
- content: "\f023";
-}
-.fa-flag:before {
- content: "\f024";
-}
-.fa-headphones:before {
- content: "\f025";
-}
-.fa-volume-off:before {
- content: "\f026";
-}
-.fa-volume-down:before {
- content: "\f027";
-}
-.fa-volume-up:before {
- content: "\f028";
-}
-.fa-qrcode:before {
- content: "\f029";
-}
-.fa-barcode:before {
- content: "\f02a";
-}
-.fa-tag:before {
- content: "\f02b";
-}
-.fa-tags:before {
- content: "\f02c";
-}
-.fa-book:before {
- content: "\f02d";
-}
-.fa-bookmark:before {
- content: "\f02e";
-}
-.fa-print:before {
- content: "\f02f";
-}
-.fa-camera:before {
- content: "\f030";
-}
-.fa-font:before {
- content: "\f031";
-}
-.fa-bold:before {
- content: "\f032";
-}
-.fa-italic:before {
- content: "\f033";
-}
-.fa-text-height:before {
- content: "\f034";
-}
-.fa-text-width:before {
- content: "\f035";
-}
-.fa-align-left:before {
- content: "\f036";
-}
-.fa-align-center:before {
- content: "\f037";
-}
-.fa-align-right:before {
- content: "\f038";
-}
-.fa-align-justify:before {
- content: "\f039";
-}
-.fa-list:before {
- content: "\f03a";
-}
-.fa-dedent:before,
-.fa-outdent:before {
- content: "\f03b";
-}
-.fa-indent:before {
- content: "\f03c";
-}
-.fa-video-camera:before {
- content: "\f03d";
-}
-.fa-photo:before,
-.fa-image:before,
-.fa-picture-o:before {
- content: "\f03e";
-}
-.fa-pencil:before {
- content: "\f040";
-}
-.fa-map-marker:before {
- content: "\f041";
-}
-.fa-adjust:before {
- content: "\f042";
-}
-.fa-tint:before {
- content: "\f043";
-}
-.fa-edit:before,
-.fa-pencil-square-o:before {
- content: "\f044";
-}
-.fa-share-square-o:before {
- content: "\f045";
-}
-.fa-check-square-o:before {
- content: "\f046";
-}
-.fa-arrows:before {
- content: "\f047";
-}
-.fa-step-backward:before {
- content: "\f048";
-}
-.fa-fast-backward:before {
- content: "\f049";
-}
-.fa-backward:before {
- content: "\f04a";
-}
-.fa-play:before {
- content: "\f04b";
-}
-.fa-pause:before {
- content: "\f04c";
-}
-.fa-stop:before {
- content: "\f04d";
-}
-.fa-forward:before {
- content: "\f04e";
-}
-.fa-fast-forward:before {
- content: "\f050";
-}
-.fa-step-forward:before {
- content: "\f051";
-}
-.fa-eject:before {
- content: "\f052";
-}
-.fa-chevron-left:before {
- content: "\f053";
-}
-.fa-chevron-right:before {
- content: "\f054";
-}
-.fa-plus-circle:before {
- content: "\f055";
-}
-.fa-minus-circle:before {
- content: "\f056";
-}
-.fa-times-circle:before {
- content: "\f057";
-}
-.fa-check-circle:before {
- content: "\f058";
-}
-.fa-question-circle:before {
- content: "\f059";
-}
-.fa-info-circle:before {
- content: "\f05a";
-}
-.fa-crosshairs:before {
- content: "\f05b";
-}
-.fa-times-circle-o:before {
- content: "\f05c";
-}
-.fa-check-circle-o:before {
- content: "\f05d";
-}
-.fa-ban:before {
- content: "\f05e";
-}
-.fa-arrow-left:before {
- content: "\f060";
-}
-.fa-arrow-right:before {
- content: "\f061";
-}
-.fa-arrow-up:before {
- content: "\f062";
-}
-.fa-arrow-down:before {
- content: "\f063";
-}
-.fa-mail-forward:before,
-.fa-share:before {
- content: "\f064";
-}
-.fa-expand:before {
- content: "\f065";
-}
-.fa-compress:before {
- content: "\f066";
-}
-.fa-plus:before {
- content: "\f067";
-}
-.fa-minus:before {
- content: "\f068";
-}
-.fa-asterisk:before {
- content: "\f069";
-}
-.fa-exclamation-circle:before {
- content: "\f06a";
-}
-.fa-gift:before {
- content: "\f06b";
-}
-.fa-leaf:before {
- content: "\f06c";
-}
-.fa-fire:before {
- content: "\f06d";
-}
-.fa-eye:before {
- content: "\f06e";
-}
-.fa-eye-slash:before {
- content: "\f070";
-}
-.fa-warning:before,
-.fa-exclamation-triangle:before {
- content: "\f071";
-}
-.fa-plane:before {
- content: "\f072";
-}
-.fa-calendar:before {
- content: "\f073";
-}
-.fa-random:before {
- content: "\f074";
-}
-.fa-comment:before {
- content: "\f075";
-}
-.fa-magnet:before {
- content: "\f076";
-}
-.fa-chevron-up:before {
- content: "\f077";
-}
-.fa-chevron-down:before {
- content: "\f078";
-}
-.fa-retweet:before {
- content: "\f079";
-}
-.fa-shopping-cart:before {
- content: "\f07a";
-}
-.fa-folder:before {
- content: "\f07b";
-}
-.fa-folder-open:before {
- content: "\f07c";
-}
-.fa-arrows-v:before {
- content: "\f07d";
-}
-.fa-arrows-h:before {
- content: "\f07e";
-}
-.fa-bar-chart-o:before,
-.fa-bar-chart:before {
- content: "\f080";
-}
-.fa-twitter-square:before {
- content: "\f081";
-}
-.fa-facebook-square:before {
- content: "\f082";
-}
-.fa-camera-retro:before {
- content: "\f083";
-}
-.fa-key:before {
- content: "\f084";
-}
-.fa-gears:before,
-.fa-cogs:before {
- content: "\f085";
-}
-.fa-comments:before {
- content: "\f086";
-}
-.fa-thumbs-o-up:before {
- content: "\f087";
-}
-.fa-thumbs-o-down:before {
- content: "\f088";
-}
-.fa-star-half:before {
- content: "\f089";
-}
-.fa-heart-o:before {
- content: "\f08a";
-}
-.fa-sign-out:before {
- content: "\f08b";
-}
-.fa-linkedin-square:before {
- content: "\f08c";
-}
-.fa-thumb-tack:before {
- content: "\f08d";
-}
-.fa-external-link:before {
- content: "\f08e";
-}
-.fa-sign-in:before {
- content: "\f090";
-}
-.fa-trophy:before {
- content: "\f091";
-}
-.fa-github-square:before {
- content: "\f092";
-}
-.fa-upload:before {
- content: "\f093";
-}
-.fa-lemon-o:before {
- content: "\f094";
-}
-.fa-phone:before {
- content: "\f095";
-}
-.fa-square-o:before {
- content: "\f096";
-}
-.fa-bookmark-o:before {
- content: "\f097";
-}
-.fa-phone-square:before {
- content: "\f098";
-}
-.fa-twitter:before {
- content: "\f099";
-}
-.fa-facebook-f:before,
-.fa-facebook:before {
- content: "\f09a";
-}
-.fa-github:before {
- content: "\f09b";
-}
-.fa-unlock:before {
- content: "\f09c";
-}
-.fa-credit-card:before {
- content: "\f09d";
-}
-.fa-feed:before,
-.fa-rss:before {
- content: "\f09e";
-}
-.fa-hdd-o:before {
- content: "\f0a0";
-}
-.fa-bullhorn:before {
- content: "\f0a1";
-}
-.fa-bell:before {
- content: "\f0f3";
-}
-.fa-certificate:before {
- content: "\f0a3";
-}
-.fa-hand-o-right:before {
- content: "\f0a4";
-}
-.fa-hand-o-left:before {
- content: "\f0a5";
-}
-.fa-hand-o-up:before {
- content: "\f0a6";
-}
-.fa-hand-o-down:before {
- content: "\f0a7";
-}
-.fa-arrow-circle-left:before {
- content: "\f0a8";
-}
-.fa-arrow-circle-right:before {
- content: "\f0a9";
-}
-.fa-arrow-circle-up:before {
- content: "\f0aa";
-}
-.fa-arrow-circle-down:before {
- content: "\f0ab";
-}
-.fa-globe:before {
- content: "\f0ac";
-}
-.fa-wrench:before {
- content: "\f0ad";
-}
-.fa-tasks:before {
- content: "\f0ae";
-}
-.fa-filter:before {
- content: "\f0b0";
-}
-.fa-briefcase:before {
- content: "\f0b1";
-}
-.fa-arrows-alt:before {
- content: "\f0b2";
-}
-.fa-group:before,
-.fa-users:before {
- content: "\f0c0";
-}
-.fa-chain:before,
-.fa-link:before {
- content: "\f0c1";
-}
-.fa-cloud:before {
- content: "\f0c2";
-}
-.fa-flask:before {
- content: "\f0c3";
-}
-.fa-cut:before,
-.fa-scissors:before {
- content: "\f0c4";
-}
-.fa-copy:before,
-.fa-files-o:before {
- content: "\f0c5";
-}
-.fa-paperclip:before {
- content: "\f0c6";
-}
-.fa-save:before,
-.fa-floppy-o:before {
- content: "\f0c7";
-}
-.fa-square:before {
- content: "\f0c8";
-}
-.fa-navicon:before,
-.fa-reorder:before,
-.fa-bars:before {
- content: "\f0c9";
-}
-.fa-list-ul:before {
- content: "\f0ca";
-}
-.fa-list-ol:before {
- content: "\f0cb";
-}
-.fa-strikethrough:before {
- content: "\f0cc";
-}
-.fa-underline:before {
- content: "\f0cd";
-}
-.fa-table:before {
- content: "\f0ce";
-}
-.fa-magic:before {
- content: "\f0d0";
-}
-.fa-truck:before {
- content: "\f0d1";
-}
-.fa-pinterest:before {
- content: "\f0d2";
-}
-.fa-pinterest-square:before {
- content: "\f0d3";
-}
-.fa-google-plus-square:before {
- content: "\f0d4";
-}
-.fa-google-plus:before {
- content: "\f0d5";
-}
-.fa-money:before {
- content: "\f0d6";
-}
-.fa-caret-down:before {
- content: "\f0d7";
-}
-.fa-caret-up:before {
- content: "\f0d8";
-}
-.fa-caret-left:before {
- content: "\f0d9";
-}
-.fa-caret-right:before {
- content: "\f0da";
-}
-.fa-columns:before {
- content: "\f0db";
-}
-.fa-unsorted:before,
-.fa-sort:before {
- content: "\f0dc";
-}
-.fa-sort-down:before,
-.fa-sort-desc:before {
- content: "\f0dd";
-}
-.fa-sort-up:before,
-.fa-sort-asc:before {
- content: "\f0de";
-}
-.fa-envelope:before {
- content: "\f0e0";
-}
-.fa-linkedin:before {
- content: "\f0e1";
-}
-.fa-rotate-left:before,
-.fa-undo:before {
- content: "\f0e2";
-}
-.fa-legal:before,
-.fa-gavel:before {
- content: "\f0e3";
-}
-.fa-dashboard:before,
-.fa-tachometer:before {
- content: "\f0e4";
-}
-.fa-comment-o:before {
- content: "\f0e5";
-}
-.fa-comments-o:before {
- content: "\f0e6";
-}
-.fa-flash:before,
-.fa-bolt:before {
- content: "\f0e7";
-}
-.fa-sitemap:before {
- content: "\f0e8";
-}
-.fa-umbrella:before {
- content: "\f0e9";
-}
-.fa-paste:before,
-.fa-clipboard:before {
- content: "\f0ea";
-}
-.fa-lightbulb-o:before {
- content: "\f0eb";
-}
-.fa-exchange:before {
- content: "\f0ec";
-}
-.fa-cloud-download:before {
- content: "\f0ed";
-}
-.fa-cloud-upload:before {
- content: "\f0ee";
-}
-.fa-user-md:before {
- content: "\f0f0";
-}
-.fa-stethoscope:before {
- content: "\f0f1";
-}
-.fa-suitcase:before {
- content: "\f0f2";
-}
-.fa-bell-o:before {
- content: "\f0a2";
-}
-.fa-coffee:before {
- content: "\f0f4";
-}
-.fa-cutlery:before {
- content: "\f0f5";
-}
-.fa-file-text-o:before {
- content: "\f0f6";
-}
-.fa-building-o:before {
- content: "\f0f7";
-}
-.fa-hospital-o:before {
- content: "\f0f8";
-}
-.fa-ambulance:before {
- content: "\f0f9";
-}
-.fa-medkit:before {
- content: "\f0fa";
-}
-.fa-fighter-jet:before {
- content: "\f0fb";
-}
-.fa-beer:before {
- content: "\f0fc";
-}
-.fa-h-square:before {
- content: "\f0fd";
-}
-.fa-plus-square:before {
- content: "\f0fe";
-}
-.fa-angle-double-left:before {
- content: "\f100";
-}
-.fa-angle-double-right:before {
- content: "\f101";
-}
-.fa-angle-double-up:before {
- content: "\f102";
-}
-.fa-angle-double-down:before {
- content: "\f103";
-}
-.fa-angle-left:before {
- content: "\f104";
-}
-.fa-angle-right:before {
- content: "\f105";
-}
-.fa-angle-up:before {
- content: "\f106";
-}
-.fa-angle-down:before {
- content: "\f107";
-}
-.fa-desktop:before {
- content: "\f108";
-}
-.fa-laptop:before {
- content: "\f109";
-}
-.fa-tablet:before {
- content: "\f10a";
-}
-.fa-mobile-phone:before,
-.fa-mobile:before {
- content: "\f10b";
-}
-.fa-circle-o:before {
- content: "\f10c";
-}
-.fa-quote-left:before {
- content: "\f10d";
-}
-.fa-quote-right:before {
- content: "\f10e";
-}
-.fa-spinner:before {
- content: "\f110";
-}
-.fa-circle:before {
- content: "\f111";
-}
-.fa-mail-reply:before,
-.fa-reply:before {
- content: "\f112";
-}
-.fa-github-alt:before {
- content: "\f113";
-}
-.fa-folder-o:before {
- content: "\f114";
-}
-.fa-folder-open-o:before {
- content: "\f115";
-}
-.fa-smile-o:before {
- content: "\f118";
-}
-.fa-frown-o:before {
- content: "\f119";
-}
-.fa-meh-o:before {
- content: "\f11a";
-}
-.fa-gamepad:before {
- content: "\f11b";
-}
-.fa-keyboard-o:before {
- content: "\f11c";
-}
-.fa-flag-o:before {
- content: "\f11d";
-}
-.fa-flag-checkered:before {
- content: "\f11e";
-}
-.fa-terminal:before {
- content: "\f120";
-}
-.fa-code:before {
- content: "\f121";
-}
-.fa-mail-reply-all:before,
-.fa-reply-all:before {
- content: "\f122";
-}
-.fa-star-half-empty:before,
-.fa-star-half-full:before,
-.fa-star-half-o:before {
- content: "\f123";
-}
-.fa-location-arrow:before {
- content: "\f124";
-}
-.fa-crop:before {
- content: "\f125";
-}
-.fa-code-fork:before {
- content: "\f126";
-}
-.fa-unlink:before,
-.fa-chain-broken:before {
- content: "\f127";
-}
-.fa-question:before {
- content: "\f128";
-}
-.fa-info:before {
- content: "\f129";
-}
-.fa-exclamation:before {
- content: "\f12a";
-}
-.fa-superscript:before {
- content: "\f12b";
-}
-.fa-subscript:before {
- content: "\f12c";
-}
-.fa-eraser:before {
- content: "\f12d";
-}
-.fa-puzzle-piece:before {
- content: "\f12e";
-}
-.fa-microphone:before {
- content: "\f130";
-}
-.fa-microphone-slash:before {
- content: "\f131";
-}
-.fa-shield:before {
- content: "\f132";
-}
-.fa-calendar-o:before {
- content: "\f133";
-}
-.fa-fire-extinguisher:before {
- content: "\f134";
-}
-.fa-rocket:before {
- content: "\f135";
-}
-.fa-maxcdn:before {
- content: "\f136";
-}
-.fa-chevron-circle-left:before {
- content: "\f137";
-}
-.fa-chevron-circle-right:before {
- content: "\f138";
-}
-.fa-chevron-circle-up:before {
- content: "\f139";
-}
-.fa-chevron-circle-down:before {
- content: "\f13a";
-}
-.fa-html5:before {
- content: "\f13b";
-}
-.fa-css3:before {
- content: "\f13c";
-}
-.fa-anchor:before {
- content: "\f13d";
-}
-.fa-unlock-alt:before {
- content: "\f13e";
-}
-.fa-bullseye:before {
- content: "\f140";
-}
-.fa-ellipsis-h:before {
- content: "\f141";
-}
-.fa-ellipsis-v:before {
- content: "\f142";
-}
-.fa-rss-square:before {
- content: "\f143";
-}
-.fa-play-circle:before {
- content: "\f144";
-}
-.fa-ticket:before {
- content: "\f145";
-}
-.fa-minus-square:before {
- content: "\f146";
-}
-.fa-minus-square-o:before {
- content: "\f147";
-}
-.fa-level-up:before {
- content: "\f148";
-}
-.fa-level-down:before {
- content: "\f149";
-}
-.fa-check-square:before {
- content: "\f14a";
-}
-.fa-pencil-square:before {
- content: "\f14b";
-}
-.fa-external-link-square:before {
- content: "\f14c";
-}
-.fa-share-square:before {
- content: "\f14d";
-}
-.fa-compass:before {
- content: "\f14e";
-}
-.fa-toggle-down:before,
-.fa-caret-square-o-down:before {
- content: "\f150";
-}
-.fa-toggle-up:before,
-.fa-caret-square-o-up:before {
- content: "\f151";
-}
-.fa-toggle-right:before,
-.fa-caret-square-o-right:before {
- content: "\f152";
-}
-.fa-euro:before,
-.fa-eur:before {
- content: "\f153";
-}
-.fa-gbp:before {
- content: "\f154";
-}
-.fa-dollar:before,
-.fa-usd:before {
- content: "\f155";
-}
-.fa-rupee:before,
-.fa-inr:before {
- content: "\f156";
-}
-.fa-cny:before,
-.fa-rmb:before,
-.fa-yen:before,
-.fa-jpy:before {
- content: "\f157";
-}
-.fa-ruble:before,
-.fa-rouble:before,
-.fa-rub:before {
- content: "\f158";
-}
-.fa-won:before,
-.fa-krw:before {
- content: "\f159";
-}
-.fa-bitcoin:before,
-.fa-btc:before {
- content: "\f15a";
-}
-.fa-file:before {
- content: "\f15b";
-}
-.fa-file-text:before {
- content: "\f15c";
-}
-.fa-sort-alpha-asc:before {
- content: "\f15d";
-}
-.fa-sort-alpha-desc:before {
- content: "\f15e";
-}
-.fa-sort-amount-asc:before {
- content: "\f160";
-}
-.fa-sort-amount-desc:before {
- content: "\f161";
-}
-.fa-sort-numeric-asc:before {
- content: "\f162";
-}
-.fa-sort-numeric-desc:before {
- content: "\f163";
-}
-.fa-thumbs-up:before {
- content: "\f164";
-}
-.fa-thumbs-down:before {
- content: "\f165";
-}
-.fa-youtube-square:before {
- content: "\f166";
-}
-.fa-youtube:before {
- content: "\f167";
-}
-.fa-xing:before {
- content: "\f168";
-}
-.fa-xing-square:before {
- content: "\f169";
-}
-.fa-youtube-play:before {
- content: "\f16a";
-}
-.fa-dropbox:before {
- content: "\f16b";
-}
-.fa-stack-overflow:before {
- content: "\f16c";
-}
-.fa-instagram:before {
- content: "\f16d";
-}
-.fa-flickr:before {
- content: "\f16e";
-}
-.fa-adn:before {
- content: "\f170";
-}
-.fa-bitbucket:before {
- content: "\f171";
-}
-.fa-bitbucket-square:before {
- content: "\f172";
-}
-.fa-tumblr:before {
- content: "\f173";
-}
-.fa-tumblr-square:before {
- content: "\f174";
-}
-.fa-long-arrow-down:before {
- content: "\f175";
-}
-.fa-long-arrow-up:before {
- content: "\f176";
-}
-.fa-long-arrow-left:before {
- content: "\f177";
-}
-.fa-long-arrow-right:before {
- content: "\f178";
-}
-.fa-apple:before {
- content: "\f179";
-}
-.fa-windows:before {
- content: "\f17a";
-}
-.fa-android:before {
- content: "\f17b";
-}
-.fa-linux:before {
- content: "\f17c";
-}
-.fa-dribbble:before {
- content: "\f17d";
-}
-.fa-skype:before {
- content: "\f17e";
-}
-.fa-foursquare:before {
- content: "\f180";
-}
-.fa-trello:before {
- content: "\f181";
-}
-.fa-female:before {
- content: "\f182";
-}
-.fa-male:before {
- content: "\f183";
-}
-.fa-gittip:before,
-.fa-gratipay:before {
- content: "\f184";
-}
-.fa-sun-o:before {
- content: "\f185";
-}
-.fa-moon-o:before {
- content: "\f186";
-}
-.fa-archive:before {
- content: "\f187";
-}
-.fa-bug:before {
- content: "\f188";
-}
-.fa-vk:before {
- content: "\f189";
-}
-.fa-weibo:before {
- content: "\f18a";
-}
-.fa-renren:before {
- content: "\f18b";
-}
-.fa-pagelines:before {
- content: "\f18c";
-}
-.fa-stack-exchange:before {
- content: "\f18d";
-}
-.fa-arrow-circle-o-right:before {
- content: "\f18e";
-}
-.fa-arrow-circle-o-left:before {
- content: "\f190";
-}
-.fa-toggle-left:before,
-.fa-caret-square-o-left:before {
- content: "\f191";
-}
-.fa-dot-circle-o:before {
- content: "\f192";
-}
-.fa-wheelchair:before {
- content: "\f193";
-}
-.fa-vimeo-square:before {
- content: "\f194";
-}
-.fa-turkish-lira:before,
-.fa-try:before {
- content: "\f195";
-}
-.fa-plus-square-o:before {
- content: "\f196";
-}
-.fa-space-shuttle:before {
- content: "\f197";
-}
-.fa-slack:before {
- content: "\f198";
-}
-.fa-envelope-square:before {
- content: "\f199";
-}
-.fa-wordpress:before {
- content: "\f19a";
-}
-.fa-openid:before {
- content: "\f19b";
-}
-.fa-institution:before,
-.fa-bank:before,
-.fa-university:before {
- content: "\f19c";
-}
-.fa-mortar-board:before,
-.fa-graduation-cap:before {
- content: "\f19d";
-}
-.fa-yahoo:before {
- content: "\f19e";
-}
-.fa-google:before {
- content: "\f1a0";
-}
-.fa-reddit:before {
- content: "\f1a1";
-}
-.fa-reddit-square:before {
- content: "\f1a2";
-}
-.fa-stumbleupon-circle:before {
- content: "\f1a3";
-}
-.fa-stumbleupon:before {
- content: "\f1a4";
-}
-.fa-delicious:before {
- content: "\f1a5";
-}
-.fa-digg:before {
- content: "\f1a6";
-}
-.fa-pied-piper:before {
- content: "\f1a7";
-}
-.fa-pied-piper-alt:before {
- content: "\f1a8";
-}
-.fa-drupal:before {
- content: "\f1a9";
-}
-.fa-joomla:before {
- content: "\f1aa";
-}
-.fa-language:before {
- content: "\f1ab";
-}
-.fa-fax:before {
- content: "\f1ac";
-}
-.fa-building:before {
- content: "\f1ad";
-}
-.fa-child:before {
- content: "\f1ae";
-}
-.fa-paw:before {
- content: "\f1b0";
-}
-.fa-spoon:before {
- content: "\f1b1";
-}
-.fa-cube:before {
- content: "\f1b2";
-}
-.fa-cubes:before {
- content: "\f1b3";
-}
-.fa-behance:before {
- content: "\f1b4";
-}
-.fa-behance-square:before {
- content: "\f1b5";
-}
-.fa-steam:before {
- content: "\f1b6";
-}
-.fa-steam-square:before {
- content: "\f1b7";
-}
-.fa-recycle:before {
- content: "\f1b8";
-}
-.fa-automobile:before,
-.fa-car:before {
- content: "\f1b9";
-}
-.fa-cab:before,
-.fa-taxi:before {
- content: "\f1ba";
-}
-.fa-tree:before {
- content: "\f1bb";
-}
-.fa-spotify:before {
- content: "\f1bc";
-}
-.fa-deviantart:before {
- content: "\f1bd";
-}
-.fa-soundcloud:before {
- content: "\f1be";
-}
-.fa-database:before {
- content: "\f1c0";
-}
-.fa-file-pdf-o:before {
- content: "\f1c1";
-}
-.fa-file-word-o:before {
- content: "\f1c2";
-}
-.fa-file-excel-o:before {
- content: "\f1c3";
-}
-.fa-file-powerpoint-o:before {
- content: "\f1c4";
-}
-.fa-file-photo-o:before,
-.fa-file-picture-o:before,
-.fa-file-image-o:before {
- content: "\f1c5";
-}
-.fa-file-zip-o:before,
-.fa-file-archive-o:before {
- content: "\f1c6";
-}
-.fa-file-sound-o:before,
-.fa-file-audio-o:before {
- content: "\f1c7";
-}
-.fa-file-movie-o:before,
-.fa-file-video-o:before {
- content: "\f1c8";
-}
-.fa-file-code-o:before {
- content: "\f1c9";
-}
-.fa-vine:before {
- content: "\f1ca";
-}
-.fa-codepen:before {
- content: "\f1cb";
-}
-.fa-jsfiddle:before {
- content: "\f1cc";
-}
-.fa-life-bouy:before,
-.fa-life-buoy:before,
-.fa-life-saver:before,
-.fa-support:before,
-.fa-life-ring:before {
- content: "\f1cd";
-}
-.fa-circle-o-notch:before {
- content: "\f1ce";
-}
-.fa-ra:before,
-.fa-rebel:before {
- content: "\f1d0";
-}
-.fa-ge:before,
-.fa-empire:before {
- content: "\f1d1";
-}
-.fa-git-square:before {
- content: "\f1d2";
-}
-.fa-git:before {
- content: "\f1d3";
-}
-.fa-y-combinator-square:before,
-.fa-yc-square:before,
-.fa-hacker-news:before {
- content: "\f1d4";
-}
-.fa-tencent-weibo:before {
- content: "\f1d5";
-}
-.fa-qq:before {
- content: "\f1d6";
-}
-.fa-wechat:before,
-.fa-weixin:before {
- content: "\f1d7";
-}
-.fa-send:before,
-.fa-paper-plane:before {
- content: "\f1d8";
-}
-.fa-send-o:before,
-.fa-paper-plane-o:before {
- content: "\f1d9";
-}
-.fa-history:before {
- content: "\f1da";
-}
-.fa-circle-thin:before {
- content: "\f1db";
-}
-.fa-header:before {
- content: "\f1dc";
-}
-.fa-paragraph:before {
- content: "\f1dd";
-}
-.fa-sliders:before {
- content: "\f1de";
-}
-.fa-share-alt:before {
- content: "\f1e0";
-}
-.fa-share-alt-square:before {
- content: "\f1e1";
-}
-.fa-bomb:before {
- content: "\f1e2";
-}
-.fa-soccer-ball-o:before,
-.fa-futbol-o:before {
- content: "\f1e3";
-}
-.fa-tty:before {
- content: "\f1e4";
-}
-.fa-binoculars:before {
- content: "\f1e5";
-}
-.fa-plug:before {
- content: "\f1e6";
-}
-.fa-slideshare:before {
- content: "\f1e7";
-}
-.fa-twitch:before {
- content: "\f1e8";
-}
-.fa-yelp:before {
- content: "\f1e9";
-}
-.fa-newspaper-o:before {
- content: "\f1ea";
-}
-.fa-wifi:before {
- content: "\f1eb";
-}
-.fa-calculator:before {
- content: "\f1ec";
-}
-.fa-paypal:before {
- content: "\f1ed";
-}
-.fa-google-wallet:before {
- content: "\f1ee";
-}
-.fa-cc-visa:before {
- content: "\f1f0";
-}
-.fa-cc-mastercard:before {
- content: "\f1f1";
-}
-.fa-cc-discover:before {
- content: "\f1f2";
-}
-.fa-cc-amex:before {
- content: "\f1f3";
-}
-.fa-cc-paypal:before {
- content: "\f1f4";
-}
-.fa-cc-stripe:before {
- content: "\f1f5";
-}
-.fa-bell-slash:before {
- content: "\f1f6";
-}
-.fa-bell-slash-o:before {
- content: "\f1f7";
-}
-.fa-trash:before {
- content: "\f1f8";
-}
-.fa-copyright:before {
- content: "\f1f9";
-}
-.fa-at:before {
- content: "\f1fa";
-}
-.fa-eyedropper:before {
- content: "\f1fb";
-}
-.fa-paint-brush:before {
- content: "\f1fc";
-}
-.fa-birthday-cake:before {
- content: "\f1fd";
-}
-.fa-area-chart:before {
- content: "\f1fe";
-}
-.fa-pie-chart:before {
- content: "\f200";
-}
-.fa-line-chart:before {
- content: "\f201";
-}
-.fa-lastfm:before {
- content: "\f202";
-}
-.fa-lastfm-square:before {
- content: "\f203";
-}
-.fa-toggle-off:before {
- content: "\f204";
-}
-.fa-toggle-on:before {
- content: "\f205";
-}
-.fa-bicycle:before {
- content: "\f206";
-}
-.fa-bus:before {
- content: "\f207";
-}
-.fa-ioxhost:before {
- content: "\f208";
-}
-.fa-angellist:before {
- content: "\f209";
-}
-.fa-cc:before {
- content: "\f20a";
-}
-.fa-shekel:before,
-.fa-sheqel:before,
-.fa-ils:before {
- content: "\f20b";
-}
-.fa-meanpath:before {
- content: "\f20c";
-}
-.fa-buysellads:before {
- content: "\f20d";
-}
-.fa-connectdevelop:before {
- content: "\f20e";
-}
-.fa-dashcube:before {
- content: "\f210";
-}
-.fa-forumbee:before {
- content: "\f211";
-}
-.fa-leanpub:before {
- content: "\f212";
-}
-.fa-sellsy:before {
- content: "\f213";
-}
-.fa-shirtsinbulk:before {
- content: "\f214";
-}
-.fa-simplybuilt:before {
- content: "\f215";
-}
-.fa-skyatlas:before {
- content: "\f216";
-}
-.fa-cart-plus:before {
- content: "\f217";
-}
-.fa-cart-arrow-down:before {
- content: "\f218";
-}
-.fa-diamond:before {
- content: "\f219";
-}
-.fa-ship:before {
- content: "\f21a";
-}
-.fa-user-secret:before {
- content: "\f21b";
-}
-.fa-motorcycle:before {
- content: "\f21c";
-}
-.fa-street-view:before {
- content: "\f21d";
-}
-.fa-heartbeat:before {
- content: "\f21e";
-}
-.fa-venus:before {
- content: "\f221";
-}
-.fa-mars:before {
- content: "\f222";
-}
-.fa-mercury:before {
- content: "\f223";
-}
-.fa-intersex:before,
-.fa-transgender:before {
- content: "\f224";
-}
-.fa-transgender-alt:before {
- content: "\f225";
-}
-.fa-venus-double:before {
- content: "\f226";
-}
-.fa-mars-double:before {
- content: "\f227";
-}
-.fa-venus-mars:before {
- content: "\f228";
-}
-.fa-mars-stroke:before {
- content: "\f229";
-}
-.fa-mars-stroke-v:before {
- content: "\f22a";
-}
-.fa-mars-stroke-h:before {
- content: "\f22b";
-}
-.fa-neuter:before {
- content: "\f22c";
-}
-.fa-genderless:before {
- content: "\f22d";
-}
-.fa-facebook-official:before {
- content: "\f230";
-}
-.fa-pinterest-p:before {
- content: "\f231";
-}
-.fa-whatsapp:before {
- content: "\f232";
-}
-.fa-server:before {
- content: "\f233";
-}
-.fa-user-plus:before {
- content: "\f234";
-}
-.fa-user-times:before {
- content: "\f235";
-}
-.fa-hotel:before,
-.fa-bed:before {
- content: "\f236";
-}
-.fa-viacoin:before {
- content: "\f237";
-}
-.fa-train:before {
- content: "\f238";
-}
-.fa-subway:before {
- content: "\f239";
-}
-.fa-medium:before {
- content: "\f23a";
-}
-.fa-yc:before,
-.fa-y-combinator:before {
- content: "\f23b";
-}
-.fa-optin-monster:before {
- content: "\f23c";
-}
-.fa-opencart:before {
- content: "\f23d";
-}
-.fa-expeditedssl:before {
- content: "\f23e";
-}
-.fa-battery-4:before,
-.fa-battery-full:before {
- content: "\f240";
-}
-.fa-battery-3:before,
-.fa-battery-three-quarters:before {
- content: "\f241";
-}
-.fa-battery-2:before,
-.fa-battery-half:before {
- content: "\f242";
-}
-.fa-battery-1:before,
-.fa-battery-quarter:before {
- content: "\f243";
-}
-.fa-battery-0:before,
-.fa-battery-empty:before {
- content: "\f244";
-}
-.fa-mouse-pointer:before {
- content: "\f245";
-}
-.fa-i-cursor:before {
- content: "\f246";
-}
-.fa-object-group:before {
- content: "\f247";
-}
-.fa-object-ungroup:before {
- content: "\f248";
-}
-.fa-sticky-note:before {
- content: "\f249";
-}
-.fa-sticky-note-o:before {
- content: "\f24a";
-}
-.fa-cc-jcb:before {
- content: "\f24b";
-}
-.fa-cc-diners-club:before {
- content: "\f24c";
-}
-.fa-clone:before {
- content: "\f24d";
-}
-.fa-balance-scale:before {
- content: "\f24e";
-}
-.fa-hourglass-o:before {
- content: "\f250";
-}
-.fa-hourglass-1:before,
-.fa-hourglass-start:before {
- content: "\f251";
-}
-.fa-hourglass-2:before,
-.fa-hourglass-half:before {
- content: "\f252";
-}
-.fa-hourglass-3:before,
-.fa-hourglass-end:before {
- content: "\f253";
-}
-.fa-hourglass:before {
- content: "\f254";
-}
-.fa-hand-grab-o:before,
-.fa-hand-rock-o:before {
- content: "\f255";
-}
-.fa-hand-stop-o:before,
-.fa-hand-paper-o:before {
- content: "\f256";
-}
-.fa-hand-scissors-o:before {
- content: "\f257";
-}
-.fa-hand-lizard-o:before {
- content: "\f258";
-}
-.fa-hand-spock-o:before {
- content: "\f259";
-}
-.fa-hand-pointer-o:before {
- content: "\f25a";
-}
-.fa-hand-peace-o:before {
- content: "\f25b";
-}
-.fa-trademark:before {
- content: "\f25c";
-}
-.fa-registered:before {
- content: "\f25d";
-}
-.fa-creative-commons:before {
- content: "\f25e";
-}
-.fa-gg:before {
- content: "\f260";
-}
-.fa-gg-circle:before {
- content: "\f261";
-}
-.fa-tripadvisor:before {
- content: "\f262";
-}
-.fa-odnoklassniki:before {
- content: "\f263";
-}
-.fa-odnoklassniki-square:before {
- content: "\f264";
-}
-.fa-get-pocket:before {
- content: "\f265";
-}
-.fa-wikipedia-w:before {
- content: "\f266";
-}
-.fa-safari:before {
- content: "\f267";
-}
-.fa-chrome:before {
- content: "\f268";
-}
-.fa-firefox:before {
- content: "\f269";
-}
-.fa-opera:before {
- content: "\f26a";
-}
-.fa-internet-explorer:before {
- content: "\f26b";
-}
-.fa-tv:before,
-.fa-television:before {
- content: "\f26c";
-}
-.fa-contao:before {
- content: "\f26d";
-}
-.fa-500px:before {
- content: "\f26e";
-}
-.fa-amazon:before {
- content: "\f270";
-}
-.fa-calendar-plus-o:before {
- content: "\f271";
-}
-.fa-calendar-minus-o:before {
- content: "\f272";
-}
-.fa-calendar-times-o:before {
- content: "\f273";
-}
-.fa-calendar-check-o:before {
- content: "\f274";
-}
-.fa-industry:before {
- content: "\f275";
-}
-.fa-map-pin:before {
- content: "\f276";
-}
-.fa-map-signs:before {
- content: "\f277";
-}
-.fa-map-o:before {
- content: "\f278";
-}
-.fa-map:before {
- content: "\f279";
-}
-.fa-commenting:before {
- content: "\f27a";
-}
-.fa-commenting-o:before {
- content: "\f27b";
-}
-.fa-houzz:before {
- content: "\f27c";
-}
-.fa-vimeo:before {
- content: "\f27d";
-}
-.fa-black-tie:before {
- content: "\f27e";
-}
-.fa-fonticons:before {
- content: "\f280";
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css.map b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css.map
deleted file mode 100644
index 60763a8..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.css.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-"version": 3,
-"mappings": ";;;;;;;AAGA,UAUC;EATC,WAAW,EAAE,aAAa;EAC1B,GAAG,EAAE,+CAAgE;EACrE,GAAG,EAAE,ySAAmG;EAKxG,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;ACTpB,GAAmB;EACjB,OAAO,EAAE,YAAY;EACrB,IAAI,EAAE,uCAAwD;EAC9D,SAAS,EAAE,OAAO;EAClB,cAAc,EAAE,IAAI;EACpB,sBAAsB,EAAE,WAAW;EACnC,uBAAuB,EAAE,SAAS;EAClC,SAAS,EAAE,eAAe;;;ACN5B,MAAsB;EACpB,SAAS,EAAE,SAAS;EACpB,WAAW,EAAE,MAAS;EACtB,cAAc,EAAE,IAAI;;AAEtB,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;ACVtC,MAAsB;EACpB,KAAK,EAAE,SAAW;EAClB,UAAU,EAAE,MAAM;;ACDpB,MAAsB;EACpB,YAAY,EAAE,CAAC;EACf,WAAW,ECKU,SAAS;EDJ9B,eAAe,EAAE,IAAI;EACrB,WAAK;IAAE,QAAQ,EAAE,QAAQ;;AAE3B,MAAsB;EACpB,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,UAAa;EACnB,KAAK,ECFgB,SAAS;EDG9B,GAAG,EAAE,SAAU;EACf,UAAU,EAAE,MAAM;EAClB,YAAuB;IACrB,IAAI,EAAE,UAA0B;;AEbpC,UAA0B;EACxB,OAAO,EAAE,gBAAgB;EACzB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,IAAI;;AAGrB,WAAY;EAAE,KAAK,EAAE,KAAK;;AAC1B,UAAW;EAAE,KAAK,EAAE,IAAI;;AAGtB,aAAY;EAAE,YAAY,EAAE,IAAI;AAChC,cAAa;EAAE,WAAW,EAAE,IAAI;;ACXlC,QAAwB;EACtB,iBAAiB,EAAE,0BAA0B;EACrC,SAAS,EAAE,0BAA0B;;AAG/C,SAAyB;EACvB,iBAAiB,EAAE,4BAA4B;EACvC,SAAS,EAAE,4BAA4B;;AAGjD,0BASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;AAIrC,kBASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;AC5BrC,aAA8B;ECY5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,aAAgB;EAC/B,aAAa,EAAE,aAAgB;EAC3B,SAAS,EAAE,aAAgB;;ADdrC,cAA8B;ECW5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;ADbrC,cAA8B;ECU5B,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;ADXrC,mBAAmC;ECejC,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;ADjBzC,iBAAmC;ECcjC,MAAM,EAAE,wDAAmE;EAC3E,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;ADZzC;;;;uBAIuC;EACrC,MAAM,EAAE,IAAI;;AEfd,SAAyB;EACvB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,WAAW,EAAE,GAAG;EAChB,cAAc,EAAE,MAAM;;AAExB,0BAAyD;EACvD,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;;AAEpB,YAA4B;EAAE,WAAW,EAAE,OAAO;;AAClD,YAA4B;EAAE,SAAS,EAAE,GAAG;;AAC5C,WAA2B;EAAE,KAAK,ELVZ,IAAI;;;;AMN1B,gBAAgC;EAAE,OAAO,ENoQ1B,GAAO;;AMnQtB,gBAAgC;EAAE,OAAO,EN0W1B,GAAO;;AMzWtB,iBAAiC;EAAE,OAAO,ENmb1B,GAAO;;AMlbvB,qBAAqC;EAAE,OAAO,ENmL1B,GAAO;;AMlL3B,gBAAgC;EAAE,OAAO,ENkR1B,GAAO;;AMjRtB,eAA+B;EAAE,OAAO,ENke1B,GAAO;;AMjerB,iBAAiC;EAAE,OAAO,ENse1B,GAAO;;AMrevB,eAA+B;EAAE,OAAO,EN+iB1B,GAAO;;AM9iBrB,eAA+B;EAAE,OAAO,ENyN1B,GAAO;;AMxNrB,mBAAmC;EAAE,OAAO,ENggB1B,GAAO;;AM/fzB,aAA6B;EAAE,OAAO,EN8f1B,GAAO;;AM7fnB,kBAAkC;EAAE,OAAO,EN+f1B,GAAO;;AM9fxB,gBAAgC;EAAE,OAAO,ENoG1B,GAAO;;AMnGtB;;gBAEgC;EAAE,OAAO,ENkgB1B,GAAO;;AMjgBtB,sBAAsC;EAAE,OAAO,ENua1B,GAAO;;AMta5B,uBAAuC;EAAE,OAAO,ENqa1B,GAAO;;AMpa7B,oBAAoC;EAAE,OAAO,EN+X1B,GAAO;;AM9X1B,iBAAiC;EAAE,OAAO,ENsb1B,GAAO;;AMrbvB;cAC8B;EAAE,OAAO,ENwH1B,GAAO;;AMvHpB,kBAAkC;EAAE,OAAO,ENygB1B,GAAO;;AMxgBxB,eAA+B;EAAE,OAAO,ENmQ1B,GAAO;;AMlQrB,iBAAiC;EAAE,OAAO,EN6L1B,GAAO;;AM5LvB,kBAAkC;EAAE,OAAO,EN0G1B,GAAO;;AMzGxB,eAA+B;EAAE,OAAO,EN+Y1B,GAAO;;AM9YrB,mBAAmC;EAAE,OAAO,ENiJ1B,GAAO;;AMhJzB,8BAA8C;EAAE,OAAO,ENI1B,GAAO;;AMHpC,4BAA4C;EAAE,OAAO,ENM1B,GAAO;;AMLlC,gBAAgC;EAAE,OAAO,ENkQ1B,GAAO;;AMjQtB,wBAAwC;EAAE,OAAO,EN4W1B,GAAO;;AM3W9B;iBACiC;EAAE,OAAO,ENmY1B,GAAO;;AMlYvB,kBAAkC;EAAE,OAAO,EN8X1B,GAAO;;AM7XxB,mBAAmC;EAAE,OAAO,ENiS1B,GAAO;;AMhSzB,eAA+B;EAAE,OAAO,ENoS1B,GAAO;;AMnSrB,eAA+B;EAAE,OAAO,ENgM1B,GAAO;;AM/LrB,qBAAqC;EAAE,OAAO,EN+O1B,GAAO;;AM9O3B,qBAAqC;EAAE,OAAO,EN8hB1B,GAAO;;AM7hB3B,sBAAsC;EAAE,OAAO,EN4hB1B,GAAO;;AM3hB5B,oBAAoC;EAAE,OAAO,EN6hB1B,GAAO;;AM5hB1B,iBAAiC;EAAE,OAAO,EN2W1B,GAAO;;AM1WvB,kBAAkC;EAAE,OAAO,ENW1B,GAAO;;AMVxB,cAA8B;EAAE,OAAO,ENod1B,GAAO;;AMndpB,eAA+B;EAAE,OAAO,ENod1B,GAAO;;AMndrB,eAA+B;EAAE,OAAO,EN2B1B,GAAO;;AM1BrB,mBAAmC;EAAE,OAAO,EN2B1B,GAAO;;AM1BzB,gBAAgC;EAAE,OAAO,ENkW1B,GAAO;;AMjWtB,iBAAiC;EAAE,OAAO,ENwC1B,GAAO;;AMvCvB,eAA+B;EAAE,OAAO,EN8L1B,GAAO;;AM7LrB,eAA+B;EAAE,OAAO,ENmB1B,GAAO;;AMlBrB,iBAAiC;EAAE,OAAO,ENoP1B,GAAO;;AMnPvB,sBAAsC;EAAE,OAAO,ENid1B,GAAO;;AMhd5B,qBAAqC;EAAE,OAAO,ENid1B,GAAO;;AMhd3B,qBAAqC;EAAE,OAAO,EN1C1B,GAAO;;AM2C3B,uBAAuC;EAAE,OAAO,EN7C1B,GAAO;;AM8C7B,sBAAsC;EAAE,OAAO,EN3C1B,GAAO;;AM4C5B,wBAAwC;EAAE,OAAO,EN9C1B,GAAO;;AM+C9B,eAA+B;EAAE,OAAO,ENwQ1B,GAAO;;AMvQrB;kBACkC;EAAE,OAAO,ENmT1B,GAAO;;AMlTxB,iBAAiC;EAAE,OAAO,ENmO1B,GAAO;;AMlOvB,uBAAuC;EAAE,OAAO,ENigB1B,GAAO;;AMhgB7B;;oBAEoC;EAAE,OAAO,EN+T1B,GAAO;;AM9T1B,iBAAiC;EAAE,OAAO,ENwT1B,GAAO;;AMvTvB,qBAAqC;EAAE,OAAO,EN+Q1B,GAAO;;AM9Q3B,iBAAiC;EAAE,OAAO,EN5D1B,GAAO;;AM6DvB,eAA+B;EAAE,OAAO,EN8c1B,GAAO;;AM7crB;0BAC0C;EAAE,OAAO,ENqT1B,GAAO;;AMpThC,yBAAyC;EAAE,OAAO,ENuX1B,GAAO;;AMtX/B,yBAAyC;EAAE,OAAO,EN0C1B,GAAO;;AMzC/B,iBAAiC;EAAE,OAAO,ENjC1B,GAAO;;AMkCvB,wBAAwC;EAAE,OAAO,ENma1B,GAAO;;AMla9B,wBAAwC;EAAE,OAAO,EN4H1B,GAAO;;AM3H9B,mBAAmC;EAAE,OAAO,EN7B1B,GAAO;;AM8BzB,eAA+B;EAAE,OAAO,EN0T1B,GAAO;;AMzTrB,gBAAgC;EAAE,OAAO,ENwS1B,GAAO;;AMvStB,eAA+B;EAAE,OAAO,ENia1B,GAAO;;AMharB,kBAAkC;EAAE,OAAO,ENgK1B,GAAO;;AM/JxB,uBAAuC;EAAE,OAAO,ENuH1B,GAAO;;AMtH7B,uBAAuC;EAAE,OAAO,EN4Z1B,GAAO;;AM3Z7B,gBAAgC;EAAE,OAAO,EN4F1B,GAAO;;AM3FtB,uBAAuC;EAAE,OAAO,ENoC1B,GAAO;;AMnC7B,wBAAwC;EAAE,OAAO,ENoC1B,GAAO;;AMnC9B,sBAAsC;EAAE,OAAO,ENsT1B,GAAO;;AMrT5B,uBAAuC;EAAE,OAAO,ENyQ1B,GAAO;;AMxQ7B,uBAAuC;EAAE,OAAO,ENwb1B,GAAO;;AMvb7B,uBAAuC;EAAE,OAAO,ENsB1B,GAAO;;AMrB7B,0BAA0C;EAAE,OAAO,EN2T1B,GAAO;;AM1ThC,sBAAsC;EAAE,OAAO,ENsM1B,GAAO;;AMrM5B,qBAAqC;EAAE,OAAO,EN6D1B,GAAO;;AM5D3B,yBAAyC;EAAE,OAAO,ENob1B,GAAO;;AMnb/B,yBAAyC;EAAE,OAAO,ENkB1B,GAAO;;AMjB/B,cAA8B;EAAE,OAAO,EN/C1B,GAAO;;AMgDpB,qBAAqC;EAAE,OAAO,EN3D1B,GAAO;;AM4D3B,sBAAsC;EAAE,OAAO,EN3D1B,GAAO;;AM4D5B,mBAAmC;EAAE,OAAO,EN3D1B,GAAO;;AM4DzB,qBAAqC;EAAE,OAAO,EN/D1B,GAAO;;AMgE3B;gBACgC;EAAE,OAAO,ENqV1B,GAAO;;AMpVtB,iBAAiC;EAAE,OAAO,ENuF1B,GAAO;;AMtFvB,mBAAmC;EAAE,OAAO,EN4C1B,GAAO;;AM3CzB,eAA+B;EAAE,OAAO,ENmS1B,GAAO;;AMlSrB,gBAAgC;EAAE,OAAO,ENsP1B,GAAO;;AMrPtB,mBAAmC;EAAE,OAAO,EN9D1B,GAAO;;AM+DzB,6BAA6C;EAAE,OAAO,ENgF1B,GAAO;;AM/EnC,eAA+B;EAAE,OAAO,EN+I1B,GAAO;;AM9IrB,eAA+B;EAAE,OAAO,ENoM1B,GAAO;;AMnMrB,eAA+B;EAAE,OAAO,ENmH1B,GAAO;;AMlHrB,cAA8B;EAAE,OAAO,ENiF1B,GAAO;;AMhFpB,oBAAoC;EAAE,OAAO,ENiF1B,GAAO;;AMhF1B;+BAC+C;EAAE,OAAO,EN0E1B,GAAO;;AMzErC,gBAAgC;EAAE,OAAO,ENmR1B,GAAO;;AMlRtB,mBAAmC;EAAE,OAAO,EN/B1B,GAAO;;AMgCzB,iBAAiC;EAAE,OAAO,ENoS1B,GAAO;;AMnSvB,kBAAkC;EAAE,OAAO,ENwB1B,GAAO;;AMvBxB,iBAAiC;EAAE,OAAO,ENqN1B,GAAO;;AMpNvB,qBAAqC;EAAE,OAAO,ENE1B,GAAO;;AMD3B,uBAAuC;EAAE,OAAO,ENF1B,GAAO;;AMG7B,kBAAkC;EAAE,OAAO,EN2S1B,GAAO;;AM1SxB,wBAAwC;EAAE,OAAO,ENyU1B,GAAO;;AMxU9B,iBAAiC;EAAE,OAAO,EN8G1B,GAAO;;AM7GvB,sBAAsC;EAAE,OAAO,EN+G1B,GAAO;;AM9G5B,mBAAmC;EAAE,OAAO,ENnF1B,GAAO;;AMoFzB,mBAAmC;EAAE,OAAO,ENrF1B,GAAO;;AMsFzB;oBACoC;EAAE,OAAO,EN/E1B,GAAO;;AMgF1B,yBAAyC;EAAE,OAAO,ENua1B,GAAO;;AMta/B,0BAA0C;EAAE,OAAO,ENmE1B,GAAO;;AMlEhC,uBAAuC;EAAE,OAAO,EN5C1B,GAAO;;AM6C7B,cAA8B;EAAE,OAAO,ENqK1B,GAAO;;AMpKpB;eAC+B;EAAE,OAAO,ENK1B,GAAO;;AMJrB,mBAAmC;EAAE,OAAO,ENQ1B,GAAO;;AMPzB,sBAAsC;EAAE,OAAO,ENmY1B,GAAO;;AMlY5B,wBAAwC;EAAE,OAAO,ENiY1B,GAAO;;AMhY9B,oBAAoC;EAAE,OAAO,EN2V1B,GAAO;;AM1V1B,kBAAkC;EAAE,OAAO,ENyI1B,GAAO;;AMxIxB,mBAAmC;EAAE,OAAO,ENyT1B,GAAO;;AMxTzB,0BAA0C;EAAE,OAAO,ENiL1B,GAAO;;AMhLhC,qBAAqC;EAAE,OAAO,EN0X1B,GAAO;;AMzX3B,wBAAwC;EAAE,OAAO,EN8C1B,GAAO;;AM7C9B,kBAAkC;EAAE,OAAO,ENoT1B,GAAO;;AMnTxB,iBAAiC;EAAE,OAAO,EN8Y1B,GAAO;;AM7YvB,wBAAwC;EAAE,OAAO,EN6G1B,GAAO;;AM5G9B,iBAAiC;EAAE,OAAO,EN8Z1B,GAAO;;AM7ZvB,kBAAkC;EAAE,OAAO,EN+J1B,GAAO;;AM9JxB,gBAAgC;EAAE,OAAO,ENsO1B,GAAO;;AMrOtB,mBAAmC;EAAE,OAAO,EN2U1B,GAAO;;AM1UzB,qBAAqC;EAAE,OAAO,EN/E1B,GAAO;;AMgF3B,uBAAuC;EAAE,OAAO,ENoO1B,GAAO;;AMnO7B,kBAAkC;EAAE,OAAO,EN8Y1B,GAAO;;AM7YxB;mBACmC;EAAE,OAAO,ENuC1B,GAAO;;AMtCzB,iBAAiC;EAAE,OAAO,ENiG1B,GAAO;;AMhGvB,iBAAiC;EAAE,OAAO,ENiZ1B,GAAO;;AMhZvB,sBAAsC;EAAE,OAAO,ENR1B,GAAO;;AMS5B,cAA8B;EAAE,OAAO,EN4Q1B,GAAO;;AM3QpB,gBAAgC;EAAE,OAAO,ENgH1B,GAAO;;AM/GtB,mBAAmC;EAAE,OAAO,ENnF1B,GAAO;;AMoFzB,eAA+B;EAAE,OAAO,ENzG1B,GAAO;;AM0GrB,sBAAsC;EAAE,OAAO,ENzD1B,GAAO;;AM0D5B,uBAAuC;EAAE,OAAO,EN0G1B,GAAO;;AMzG7B,sBAAsC;EAAE,OAAO,ENwG1B,GAAO;;AMvG5B,oBAAoC;EAAE,OAAO,ENyG1B,GAAO;;AMxG1B,sBAAsC;EAAE,OAAO,ENqG1B,GAAO;;AMpG5B,4BAA4C;EAAE,OAAO,EN5I1B,GAAO;;AM6IlC,6BAA6C;EAAE,OAAO,ENxI1B,GAAO;;AMyInC,0BAA0C;EAAE,OAAO,ENxI1B,GAAO;;AMyIhC,4BAA4C;EAAE,OAAO,ENhJ1B,GAAO;;AMiJlC,gBAAgC;EAAE,OAAO,ENsF1B,GAAO;;AMrFtB,iBAAiC;EAAE,OAAO,ENia1B,GAAO;;AMhavB,gBAAgC;EAAE,OAAO,ENiV1B,GAAO;;AMhVtB,iBAAiC;EAAE,OAAO,ENgD1B,GAAO;;AM/CvB,oBAAoC;EAAE,OAAO,ENvG1B,GAAO;;AMwG1B,qBAAqC;EAAE,OAAO,ENzI1B,GAAO;;AM0I3B;gBACgC;EAAE,OAAO,ENqY1B,GAAO;;AMpYtB;eAC+B;EAAE,OAAO,ENuI1B,GAAO;;AMtIrB,gBAAgC;EAAE,OAAO,ENpD1B,GAAO;;AMqDtB,gBAAgC;EAAE,OAAO,EN+C1B,GAAO;;AM9CtB;mBACmC;EAAE,OAAO,ENwP1B,GAAO;;AMvPzB;kBACkC;EAAE,OAAO,ENkC1B,GAAO;;AMjCxB,oBAAoC;EAAE,OAAO,ENsL1B,GAAO;;AMrL1B;mBACmC;EAAE,OAAO,EN0C1B,GAAO;;AMzCzB,iBAAiC;EAAE,OAAO,ENiS1B,GAAO;;AMhSvB;;eAE+B;EAAE,OAAO,EN9I1B,GAAO;;AM+IrB,kBAAkC;EAAE,OAAO,ENgI1B,GAAO;;AM/HxB,kBAAkC;EAAE,OAAO,EN8H1B,GAAO;;AM7HxB,wBAAwC;EAAE,OAAO,EN4S1B,GAAO;;AM3S9B,oBAAoC;EAAE,OAAO,ENoW1B,GAAO;;AMnW1B,gBAAgC;EAAE,OAAO,ENmT1B,GAAO;;AMlTtB,gBAAgC;EAAE,OAAO,ENkI1B,GAAO;;AMjItB,gBAAgC;EAAE,OAAO,ENuV1B,GAAO;;AMtVtB,oBAAoC;EAAE,OAAO,ENwL1B,GAAO;;AMvL1B,2BAA2C;EAAE,OAAO,ENyL1B,GAAO;;AMxLjC,6BAA6C;EAAE,OAAO,ENyD1B,GAAO;;AMxDnC,sBAAsC;EAAE,OAAO,ENuD1B,GAAO;;AMtD5B,gBAAgC;EAAE,OAAO,ENsJ1B,GAAO;;AMrJtB,qBAAqC;EAAE,OAAO,ENtH1B,GAAO;;AMuH3B,mBAAmC;EAAE,OAAO,ENhH1B,GAAO;;AMiHzB,qBAAqC;EAAE,OAAO,ENvH1B,GAAO;;AMwH3B,sBAAsC;EAAE,OAAO,ENvH1B,GAAO;;AMwH5B,kBAAkC;EAAE,OAAO,ENvE1B,GAAO;;AMwExB;eAC+B;EAAE,OAAO,EN2P1B,GAAO;;AM1PrB;oBACoC;EAAE,OAAO,EN+P1B,GAAO;;AM9P1B;mBACmC;EAAE,OAAO,EN4P1B,GAAO;;AM3PzB,mBAAmC;EAAE,OAAO,ENxC1B,GAAO;;AMyCzB,mBAAmC;EAAE,OAAO,ENkG1B,GAAO;;AMjGzB;eAC+B;EAAE,OAAO,EN8U1B,GAAO;;AM7UrB;gBACgC;EAAE,OAAO,ENqB1B,GAAO;;AMpBtB;qBACqC;EAAE,OAAO,EN2R1B,GAAO;;AM1R3B,oBAAoC;EAAE,OAAO,ENpF1B,GAAO;;AMqF1B,qBAAqC;EAAE,OAAO,ENnF1B,GAAO;;AMoF3B;eAC+B;EAAE,OAAO,ENjK1B,GAAO;;AMkKrB,kBAAkC;EAAE,OAAO,ENkO1B,GAAO;;AMjOxB,mBAAmC;EAAE,OAAO,ENkU1B,GAAO;;AMjUzB;oBACoC;EAAE,OAAO,EN1G1B,GAAO;;AM2G1B,sBAAsC;EAAE,OAAO,ENgF1B,GAAO;;AM/E5B,mBAAmC;EAAE,OAAO,ENnD1B,GAAO;;AMoDzB,yBAAyC;EAAE,OAAO,ENzG1B,GAAO;;AM0G/B,uBAAuC;EAAE,OAAO,ENzG1B,GAAO;;AM0G7B,kBAAkC;EAAE,OAAO,ENsU1B,GAAO;;AMrUxB,sBAAsC;EAAE,OAAO,EN+P1B,GAAO;;AM9P5B,mBAAmC;EAAE,OAAO,ENsQ1B,GAAO;;AMrQzB,iBAAiC;EAAE,OAAO,ENvL1B,GAAO;;AMwLvB,iBAAiC;EAAE,OAAO,ENzG1B,GAAO;;AM0GvB,kBAAkC;EAAE,OAAO,ENtF1B,GAAO;;AMuFxB,sBAAsC;EAAE,OAAO,EN3B1B,GAAO;;AM4B5B,qBAAqC;EAAE,OAAO,ENxK1B,GAAO;;AMyK3B,qBAAqC;EAAE,OAAO,ENkC1B,GAAO;;AMjC3B,oBAAoC;EAAE,OAAO,EN3O1B,GAAO;;AM4O1B,iBAAiC;EAAE,OAAO,ENiG1B,GAAO;;AMhGvB,sBAAsC;EAAE,OAAO,EN/C1B,GAAO;;AMgD5B,eAA+B;EAAE,OAAO,ENpM1B,GAAO;;AMqMrB,mBAAmC;EAAE,OAAO,ENe1B,GAAO;;AMdzB,sBAAsC;EAAE,OAAO,ENgJ1B,GAAO;;AM/I5B,4BAA4C;EAAE,OAAO,EN5O1B,GAAO;;AM6OlC,6BAA6C;EAAE,OAAO,EN5O1B,GAAO;;AM6OnC,0BAA0C;EAAE,OAAO,EN5O1B,GAAO;;AM6OhC,4BAA4C;EAAE,OAAO,ENhP1B,GAAO;;AMiPlC,qBAAqC;EAAE,OAAO,EN5O1B,GAAO;;AM6O3B,sBAAsC;EAAE,OAAO,EN5O1B,GAAO;;AM6O5B,mBAAmC;EAAE,OAAO,EN5O1B,GAAO;;AM6OzB,qBAAqC;EAAE,OAAO,ENhP1B,GAAO;;AMiP3B,kBAAkC;EAAE,OAAO,ENlG1B,GAAO;;AMmGxB,iBAAiC;EAAE,OAAO,ENuC1B,GAAO;;AMtCvB,iBAAiC;EAAE,OAAO,ENoP1B,GAAO;;AMnPvB;iBACiC;EAAE,OAAO,ENyF1B,GAAO;;AMxFvB,mBAAmC;EAAE,OAAO,EN9I1B,GAAO;;AM+IzB,qBAAqC;EAAE,OAAO,EN0I1B,GAAO;;AMzI3B,sBAAsC;EAAE,OAAO,EN0I1B,GAAO;;AMzI5B,kBAAkC;EAAE,OAAO,ENgN1B,GAAO;;AM/MxB,iBAAiC;EAAE,OAAO,ENnJ1B,GAAO;;AMoJvB;gBACgC;EAAE,OAAO,ENkJ1B,GAAO;;AMjJtB,qBAAqC;EAAE,OAAO,ENnB1B,GAAO;;AMoB3B,mBAAmC;EAAE,OAAO,ENxC1B,GAAO;;AMyCzB,wBAAwC;EAAE,OAAO,ENvC1B,GAAO;;AMwC9B,kBAAkC;EAAE,OAAO,EN0L1B,GAAO;;AMzLxB,kBAAkC;EAAE,OAAO,ENpC1B,GAAO;;AMqCxB,gBAAgC;EAAE,OAAO,ENoE1B,GAAO;;AMnEtB,kBAAkC;EAAE,OAAO,ENpC1B,GAAO;;AMqCxB,qBAAqC;EAAE,OAAO,ENkB1B,GAAO;;AMjB3B,iBAAiC;EAAE,OAAO,ENrD1B,GAAO;;AMsDvB,yBAAyC;EAAE,OAAO,ENvD1B,GAAO;;AMwD/B,mBAAmC;EAAE,OAAO,ENuO1B,GAAO;;AMtOzB,eAA+B;EAAE,OAAO,ENtJ1B,GAAO;;AMuJrB;oBACoC;EAAE,OAAO,ENqI1B,GAAO;;AMpI1B;;sBAEsC;EAAE,OAAO,ENuM1B,GAAO;;AMtM5B,yBAAyC;EAAE,OAAO,ENkC1B,GAAO;;AMjC/B,eAA+B;EAAE,OAAO,EN5I1B,GAAO;;AM6IrB,oBAAoC;EAAE,OAAO,EN7J1B,GAAO;;AM8J1B;uBACuC;EAAE,OAAO,EN1L1B,GAAO;;AM2L7B,mBAAmC;EAAE,OAAO,EN4G1B,GAAO;;AM3GzB,eAA+B;EAAE,OAAO,ENT1B,GAAO;;AMUrB,sBAAsC;EAAE,OAAO,ENhH1B,GAAO;;AMiH5B,sBAAsC;EAAE,OAAO,EN8M1B,GAAO;;AM7M5B,oBAAoC;EAAE,OAAO,ENyM1B,GAAO;;AMxM1B,iBAAiC;EAAE,OAAO,ENvH1B,GAAO;;AMwHvB,uBAAuC;EAAE,OAAO,ENmG1B,GAAO;;AMlG7B,qBAAqC;EAAE,OAAO,EN8C1B,GAAO;;AM7C3B,2BAA2C;EAAE,OAAO,EN8C1B,GAAO;;AM7CjC,iBAAiC;EAAE,OAAO,ENgJ1B,GAAO;;AM/IvB,qBAAqC;EAAE,OAAO,EN5N1B,GAAO;;AM6N3B,4BAA4C;EAAE,OAAO,ENjF1B,GAAO;;AMkFlC,iBAAiC;EAAE,OAAO,ENoH1B,GAAO;;AMnHvB,iBAAiC;EAAE,OAAO,ENkC1B,GAAO;;AMjCvB,8BAA8C;EAAE,OAAO,ENlM1B,GAAO;;AMmMpC,+BAA+C;EAAE,OAAO,ENlM1B,GAAO;;AMmMrC,4BAA4C;EAAE,OAAO,ENlM1B,GAAO;;AMmMlC,8BAA8C;EAAE,OAAO,ENtM1B,GAAO;;AMuMpC,gBAAgC;EAAE,OAAO,EN/B1B,GAAO;;AMgCtB,eAA+B;EAAE,OAAO,ENjK1B,GAAO;;AMkKrB,iBAAiC;EAAE,OAAO,EN9S1B,GAAO;;AM+SvB,qBAAqC;EAAE,OAAO,ENmP1B,GAAO;;AMlP3B,mBAAmC;EAAE,OAAO,EN9O1B,GAAO;;AM+OzB,qBAAqC;EAAE,OAAO,EN/I1B,GAAO;;AMgJ3B,qBAAqC;EAAE,OAAO,EN/I1B,GAAO;;AMgJ3B,qBAAqC;EAAE,OAAO,EN4G1B,GAAO;;AM3G3B,sBAAsC;EAAE,OAAO,ENsE1B,GAAO;;AMrE5B,iBAAiC;EAAE,OAAO,EN2M1B,GAAO;;AM1MvB,uBAAuC;EAAE,OAAO,EN6B1B,GAAO;;AM5B7B,yBAAyC;EAAE,OAAO,EN6B1B,GAAO;;AM5B/B,mBAAmC;EAAE,OAAO,ENhB1B,GAAO;;AMiBzB,qBAAqC;EAAE,OAAO,ENlB1B,GAAO;;AMmB3B,uBAAuC;EAAE,OAAO,ENvN1B,GAAO;;AMwN7B,wBAAwC;EAAE,OAAO,ENiD1B,GAAO;;AMhD9B,+BAA+C;EAAE,OAAO,EN3I1B,GAAO;;AM4IrC,uBAAuC;EAAE,OAAO,ENkH1B,GAAO;;AMjH7B,kBAAkC;EAAE,OAAO,EN1L1B,GAAO;;AM2LxB;8BAC8C;EAAE,OAAO,ENjP1B,GAAO;;AMkPpC;4BAC4C;EAAE,OAAO,ENhP1B,GAAO;;AMiPlC;+BAC+C;EAAE,OAAO,ENnP1B,GAAO;;AMoPrC;cAC8B;EAAE,OAAO,EN7J1B,GAAO;;AM8JpB,cAA8B;EAAE,OAAO,EN/F1B,GAAO;;AMgGpB;cAC8B;EAAE,OAAO,EN4N1B,GAAO;;AM3NpB;cAC8B;EAAE,OAAO,ENvD1B,GAAO;;AMwDpB;;;cAG8B;EAAE,OAAO,ENrD1B,GAAO;;AMsDpB;;cAE8B;EAAE,OAAO,EN8E1B,GAAO;;AM7EpB;cAC8B;EAAE,OAAO,ENtD1B,GAAO;;AMuDpB;cAC8B;EAAE,OAAO,ENzR1B,GAAO;;AM0RpB,eAA+B;EAAE,OAAO,ENzJ1B,GAAO;;AM0JrB,oBAAoC;EAAE,OAAO,EN7I1B,GAAO;;AM8I1B,yBAAyC;EAAE,OAAO,EN2G1B,GAAO;;AM1G/B,0BAA0C;EAAE,OAAO,EN2G1B,GAAO;;AM1GhC,0BAA0C;EAAE,OAAO,EN2G1B,GAAO;;AM1GhC,2BAA2C;EAAE,OAAO,EN2G1B,GAAO;;AM1GjC,2BAA2C;EAAE,OAAO,EN8G1B,GAAO;;AM7GjC,4BAA4C;EAAE,OAAO,EN8G1B,GAAO;;AM7GlC,oBAAoC;EAAE,OAAO,ENgK1B,GAAO;;AM/J1B,sBAAsC;EAAE,OAAO,EN4J1B,GAAO;;AM3J5B,yBAAyC;EAAE,OAAO,ENwO1B,GAAO;;AMvO/B,kBAAkC;EAAE,OAAO,ENqO1B,GAAO;;AMpOxB,eAA+B;EAAE,OAAO,EN+N1B,GAAO;;AM9NrB,sBAAsC;EAAE,OAAO,EN+N1B,GAAO;;AM9N5B,uBAAuC;EAAE,OAAO,ENmO1B,GAAO;;AMlO7B,kBAAkC;EAAE,OAAO,ENxM1B,GAAO;;AMyMxB,yBAAyC;EAAE,OAAO,EN+G1B,GAAO;;AM9G/B,oBAAoC;EAAE,OAAO,ENnF1B,GAAO;;AMoF1B,iBAAiC;EAAE,OAAO,EN/I1B,GAAO;;AMgJvB,cAA8B;EAAE,OAAO,ENhX1B,GAAO;;AMiXpB,oBAAoC;EAAE,OAAO,ENxT1B,GAAO;;AMyT1B,2BAA2C;EAAE,OAAO,ENxT1B,GAAO;;AMyTjC,iBAAiC;EAAE,OAAO,ENyK1B,GAAO;;AMxKvB,wBAAwC;EAAE,OAAO,ENyK1B,GAAO;;AMxK9B,0BAA0C;EAAE,OAAO,ENtD1B,GAAO;;AMuDhC,wBAAwC;EAAE,OAAO,ENpD1B,GAAO;;AMqD9B,0BAA0C;EAAE,OAAO,ENvD1B,GAAO;;AMwDhC,2BAA2C;EAAE,OAAO,ENvD1B,GAAO;;AMwDjC,gBAAgC;EAAE,OAAO,ENxW1B,GAAO;;AMyWtB,kBAAkC;EAAE,OAAO,EN0M1B,GAAO;;AMzMxB,kBAAkC;EAAE,OAAO,ENpX1B,GAAO;;AMqXxB,gBAAgC;EAAE,OAAO,ENpE1B,GAAO;;AMqEtB,mBAAmC;EAAE,OAAO,EN1N1B,GAAO;;AM2NzB,gBAAgC;EAAE,OAAO,ENqE1B,GAAO;;AMpEtB,qBAAqC;EAAE,OAAO,ENtJ1B,GAAO;;AMuJ3B,iBAAiC;EAAE,OAAO,ENuJ1B,GAAO;;AMtJvB,iBAAiC;EAAE,OAAO,EN/L1B,GAAO;;AMgMvB,eAA+B;EAAE,OAAO,EN1D1B,GAAO;;AM2DrB;mBACmC;EAAE,OAAO,ENnI1B,GAAO;;AMoIzB,gBAAgC;EAAE,OAAO,EN2G1B,GAAO;;AM1GtB,iBAAiC;EAAE,OAAO,ENxC1B,GAAO;;AMyCvB,kBAAkC;EAAE,OAAO,ENrX1B,GAAO;;AMsXxB,cAA8B;EAAE,OAAO,ENpU1B,GAAO;;AMqUpB,aAA6B;EAAE,OAAO,ENgL1B,GAAO;;AM/KnB,gBAAgC;EAAE,OAAO,ENqL1B,GAAO;;AMpLtB,iBAAiC;EAAE,OAAO,ENa1B,GAAO;;AMZvB,oBAAoC;EAAE,OAAO,ENrC1B,GAAO;;AMsC1B,yBAAyC;EAAE,OAAO,EN8E1B,GAAO;;AM7E/B,+BAA+C;EAAE,OAAO,ENtX1B,GAAO;;AMuXrC,8BAA8C;EAAE,OAAO,ENxX1B,GAAO;;AMyXpC;8BAC8C;EAAE,OAAO,EN3T1B,GAAO;;AM4TpC,uBAAuC;EAAE,OAAO,ENjP1B,GAAO;;AMkP7B,qBAAqC;EAAE,OAAO,EN+K1B,GAAO;;AM9K3B,uBAAuC;EAAE,OAAO,ENmK1B,GAAO;;AMlK7B;cAC8B;EAAE,OAAO,ENoI1B,GAAO;;AMnIpB,wBAAwC;EAAE,OAAO,ENjB1B,GAAO;;AMkB9B,wBAAwC;EAAE,OAAO,EN6D1B,GAAO;;AM5D9B,gBAAgC;EAAE,OAAO,EN2C1B,GAAO;;AM1CtB,0BAA0C;EAAE,OAAO,EN7O1B,GAAO;;AM8OhC,oBAAoC;EAAE,OAAO,EN2K1B,GAAO;;AM1K1B,iBAAiC;EAAE,OAAO,ENvD1B,GAAO;;AMwDvB;;qBAEqC;EAAE,OAAO,ENsI1B,GAAO;;AMrI3B;yBACyC;EAAE,OAAO,ENjK1B,GAAO;;AMkK/B,gBAAgC;EAAE,OAAO,ENwK1B,GAAO;;AMvKtB,iBAAiC;EAAE,OAAO,ENvK1B,GAAO;;AMwKvB,iBAAiC;EAAE,OAAO,ENhB1B,GAAO;;AMiBvB,wBAAwC;EAAE,OAAO,ENhB1B,GAAO;;AMiB9B,6BAA6C;EAAE,OAAO,ENsE1B,GAAO;;AMrEnC,sBAAsC;EAAE,OAAO,ENoE1B,GAAO;;AMnE5B,oBAAoC;EAAE,OAAO,EN7Q1B,GAAO;;AM8Q1B,eAA+B;EAAE,OAAO,EN1Q1B,GAAO;;AM2QrB,qBAAqC;EAAE,OAAO,ENjD1B,GAAO;;AMkD3B,yBAAyC;EAAE,OAAO,ENjD1B,GAAO;;AMkD/B,iBAAiC;EAAE,OAAO,ENvQ1B,GAAO;;AMwQvB,iBAAiC;EAAE,OAAO,EN9I1B,GAAO;;AM+IvB,mBAAmC;EAAE,OAAO,ENzI1B,GAAO;;AM0IzB,cAA8B;EAAE,OAAO,EN9O1B,GAAO;;AM+OpB,mBAAmC;EAAE,OAAO,EN3W1B,GAAO;;AM4WzB,gBAAgC;EAAE,OAAO,EN9T1B,GAAO;;AM+TtB,cAA8B;EAAE,OAAO,ENnE1B,GAAO;;AMoEpB,gBAAgC;EAAE,OAAO,ENoC1B,GAAO;;AMnCtB,eAA+B;EAAE,OAAO,ENjS1B,GAAO;;AMkSrB,gBAAgC;EAAE,OAAO,ENjS1B,GAAO;;AMkStB,kBAAkC;EAAE,OAAO,ENtY1B,GAAO;;AMuYxB,yBAAyC;EAAE,OAAO,ENtY1B,GAAO;;AMuY/B,gBAAgC;EAAE,OAAO,EN2C1B,GAAO;;AM1CtB,uBAAuC;EAAE,OAAO,EN2C1B,GAAO;;AM1C7B,kBAAkC;EAAE,OAAO,ENvC1B,GAAO;;AMwCxB;cAC8B;EAAE,OAAO,EN3W1B,GAAO;;AM4WpB;eAC+B;EAAE,OAAO,EN2D1B,GAAO;;AM1DrB,eAA+B;EAAE,OAAO,ENuF1B,GAAO;;AMtFrB,kBAAkC;EAAE,OAAO,ENwB1B,GAAO;;AMvBxB,qBAAqC;EAAE,OAAO,ENpS1B,GAAO;;AMqS3B,qBAAqC;EAAE,OAAO,ENkB1B,GAAO;;AMjB3B,mBAAmC;EAAE,OAAO,EN1S1B,GAAO;;AM2SzB,qBAAqC;EAAE,OAAO,ENxP1B,GAAO;;AMyP3B,sBAAsC;EAAE,OAAO,ENjP1B,GAAO;;AMkP5B,uBAAuC;EAAE,OAAO,EN9P1B,GAAO;;AM+P7B,4BAA4C;EAAE,OAAO,ENxP1B,GAAO;;AMyPlC;;uBAEuC;EAAE,OAAO,ENjQ1B,GAAO;;AMkQ7B;yBACyC;EAAE,OAAO,ENvQ1B,GAAO;;AMwQ/B;uBACuC;EAAE,OAAO,ENxQ1B,GAAO;;AMyQ7B;uBACuC;EAAE,OAAO,EN7P1B,GAAO;;AM8P7B,sBAAsC;EAAE,OAAO,EN1Q1B,GAAO;;AM2Q5B,eAA+B;EAAE,OAAO,ENsG1B,GAAO;;AMrGrB,kBAAkC;EAAE,OAAO,ENlV1B,GAAO;;AMmVxB,mBAAmC;EAAE,OAAO,ENnL1B,GAAO;;AMoLzB;;;;oBAIoC;EAAE,OAAO,ENxK1B,GAAO;;AMyK1B,yBAAyC;EAAE,OAAO,ENpW1B,GAAO;;AMqW/B;gBACgC;EAAE,OAAO,EN1E1B,GAAO;;AM2EtB;iBACiC;EAAE,OAAO,ENpT1B,GAAO;;AMqTvB,qBAAqC;EAAE,OAAO,EN1O1B,GAAO;;AM2O3B,cAA8B;EAAE,OAAO,EN5O1B,GAAO;;AM6OpB,sBAAsC;EAAE,OAAO,EN7N1B,GAAO;;AM8N5B,wBAAwC;EAAE,OAAO,ENwB1B,GAAO;;AMvB9B,aAA6B;EAAE,OAAO,ENzF1B,GAAO;;AM0FnB;iBACiC;EAAE,OAAO,EN2F1B,GAAO;;AM1FvB;sBACsC;EAAE,OAAO,EN9H1B,GAAO;;AM+H5B;wBACwC;EAAE,OAAO,EN/H1B,GAAO;;AMgI9B,kBAAkC;EAAE,OAAO,EN3N1B,GAAO;;AM4NxB;sBACsC;EAAE,OAAO,ENrX1B,GAAO;;AMsX5B,iBAAiC;EAAE,OAAO,ENnO1B,GAAO;;AMoOvB,oBAAoC;EAAE,OAAO,ENlI1B,GAAO;;AMmI1B,kBAAkC;EAAE,OAAO,EN1C1B,GAAO;;AM2CxB,oBAAoC;EAAE,OAAO,EN7D1B,GAAO;;AM8D1B,2BAA2C;EAAE,OAAO,EN7D1B,GAAO;;AM8DjC,eAA+B;EAAE,OAAO,ENpb1B,GAAO;;AMqbrB;mBACmC;EAAE,OAAO,ENzQ1B,GAAO;;AM0QzB,cAA8B;EAAE,OAAO,ENsC1B,GAAO;;AMrCpB,qBAAqC;EAAE,OAAO,EN/b1B,GAAO;;AMgc3B,eAA+B;EAAE,OAAO,ENrH1B,GAAO;;AMsHrB,qBAAqC;EAAE,OAAO,ENlD1B,GAAO;;AMmD3B,iBAAiC;EAAE,OAAO,ENsC1B,GAAO;;AMrCvB,eAA+B;EAAE,OAAO,ENiF1B,GAAO;;AMhFrB,sBAAsC;EAAE,OAAO,ENvJ1B,GAAO;;AMwJ5B,eAA+B;EAAE,OAAO,ENuE1B,GAAO;;AMtErB,qBAAqC;EAAE,OAAO,ENjb1B,GAAO;;AMkb3B,iBAAiC;EAAE,OAAO,EN9I1B,GAAO;;AM+IvB,wBAAwC;EAAE,OAAO,ENhQ1B,GAAO;;AMiQ9B,kBAAkC;EAAE,OAAO,EN9Z1B,GAAO;;AM+ZxB,wBAAwC;EAAE,OAAO,ENla1B,GAAO;;AMma9B,sBAAsC;EAAE,OAAO,ENpa1B,GAAO;;AMqa5B,kBAAkC;EAAE,OAAO,ENta1B,GAAO;;AMuaxB,oBAAoC;EAAE,OAAO,ENpa1B,GAAO;;AMqa1B,oBAAoC;EAAE,OAAO,ENpa1B,GAAO;;AMqa1B,qBAAqC;EAAE,OAAO,ENld1B,GAAO;;AMmd3B,uBAAuC;EAAE,OAAO,ENld1B,GAAO;;AMmd7B,gBAAgC;EAAE,OAAO,ENY1B,GAAO;;AMXtB,oBAAoC;EAAE,OAAO,EN3X1B,GAAO;;AM4X1B,aAA6B;EAAE,OAAO,ENre1B,GAAO;;AMsenB,qBAAqC;EAAE,OAAO,ENjV1B,GAAO;;AMkV3B,sBAAsC;EAAE,OAAO,ENpK1B,GAAO;;AMqK5B,wBAAwC;EAAE,OAAO,ENrd1B,GAAO;;AMsd9B,qBAAqC;EAAE,OAAO,EN3f1B,GAAO;;AM4f3B,oBAAoC;EAAE,OAAO,ENvJ1B,GAAO;;AMwJ1B,qBAAqC;EAAE,OAAO,EN5N1B,GAAO;;AM6N3B,iBAAiC;EAAE,OAAO,EN1O1B,GAAO;;AM2OvB,wBAAwC;EAAE,OAAO,EN1O1B,GAAO;;AM2O9B,qBAAqC;EAAE,OAAO,ENN1B,GAAO;;AMO3B,oBAAoC;EAAE,OAAO,ENN1B,GAAO;;AMO1B,kBAAkC;EAAE,OAAO,EN/d1B,GAAO;;AMgexB,cAA8B;EAAE,OAAO,EN7c1B,GAAO;;AM8cpB,kBAAkC;EAAE,OAAO,EN1P1B,GAAO;;AM2PxB,oBAAoC;EAAE,OAAO,ENhhB1B,GAAO;;AMihB1B,aAA6B;EAAE,OAAO,EN7b1B,GAAO;;AM8bnB;;cAE8B;EAAE,OAAO,ENxQ1B,GAAO;;AMyQpB,mBAAmC;EAAE,OAAO,EN7M1B,GAAO;;AM8MzB,qBAAqC;EAAE,OAAO,ENpd1B,GAAO;;AMqd3B,yBAAyC;EAAE,OAAO,ENnZ1B,GAAO;;AMoZ/B,mBAAmC;EAAE,OAAO,ENxY1B,GAAO;;AMyYzB,mBAAmC;EAAE,OAAO,EN1T1B,GAAO;;AM2TzB,kBAAkC;EAAE,OAAO,ENxP1B,GAAO;;AMyPxB,iBAAiC;EAAE,OAAO,ENrH1B,GAAO;;AMsHvB,uBAAuC;EAAE,OAAO,ENzG1B,GAAO;;AM0G7B,sBAAsC;EAAE,OAAO,ENrG1B,GAAO;;AMsG5B,mBAAmC;EAAE,OAAO,ENpG1B,GAAO;;AMqGzB,oBAAoC;EAAE,OAAO,EN5c1B,GAAO;;AM6c1B,0BAA0C;EAAE,OAAO,EN9c1B,GAAO;;AM+chC,kBAAkC;EAAE,OAAO,EN3Y1B,GAAO;;AM4YxB,eAA+B;EAAE,OAAO,ENhH1B,GAAO;;AMiHrB,sBAAsC;EAAE,OAAO,ENI1B,GAAO;;AMH5B,qBAAqC;EAAE,OAAO,EN5M1B,GAAO;;AM6M3B,sBAAsC;EAAE,OAAO,ENpE1B,GAAO;;AMqE5B,oBAAoC;EAAE,OAAO,ENhS1B,GAAO;;AMiS1B,gBAAgC;EAAE,OAAO,ENG1B,GAAO;;AMFtB,eAA+B;EAAE,OAAO,ENtO1B,GAAO;;AMuOrB,kBAAkC;EAAE,OAAO,EN7N1B,GAAO;;AM8NxB,sBAAsC;EAAE,OAAO,ENhC1B,GAAO;;AMiC5B,0BAA0C;EAAE,OAAO,ENhC1B,GAAO;;AMiChC,uBAAuC;EAAE,OAAO,END1B,GAAO;;AME7B,sBAAsC;EAAE,OAAO,EN1O1B,GAAO;;AM2O5B,qBAAqC;EAAE,OAAO,ENF1B,GAAO;;AMG3B,sBAAsC;EAAE,OAAO,EN3O1B,GAAO;;AM4O5B,wBAAwC;EAAE,OAAO,EN1O1B,GAAO;;AM2O9B,wBAAwC;EAAE,OAAO,EN5O1B,GAAO;;AM6O9B,iBAAiC;EAAE,OAAO,ENvN1B,GAAO;;AMwNvB,4BAA4C;EAAE,OAAO,EN9X1B,GAAO;;AM+XlC,sBAAsC;EAAE,OAAO,ENhM1B,GAAO;;AMiM5B,mBAAmC;EAAE,OAAO,ENI1B,GAAO;;AMHzB,iBAAiC;EAAE,OAAO,EN7I1B,GAAO;;AM8IvB,oBAAoC;EAAE,OAAO,ENjB1B,GAAO;;AMkB1B,qBAAqC;EAAE,OAAO,ENhB1B,GAAO;;AMiB3B;cAC8B;EAAE,OAAO,ENphB1B,GAAO;;AMqhBpB,kBAAkC;EAAE,OAAO,ENd1B,GAAO;;AMexB,gBAAgC;EAAE,OAAO,ENnD1B,GAAO;;AMoDtB,iBAAiC;EAAE,OAAO,ENvF1B,GAAO;;AMwFvB,iBAAiC;EAAE,OAAO,ENrP1B,GAAO",
-"sources": ["../scss/_path.scss","../scss/_core.scss","../scss/_larger.scss","../scss/_fixed-width.scss","../scss/_list.scss","../scss/_variables.scss","../scss/_bordered-pulled.scss","../scss/_animated.scss","../scss/_rotated-flipped.scss","../scss/_mixins.scss","../scss/_stacked.scss","../scss/_icons.scss"],
-"names": [],
-"file": "font-awesome.css"
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.min.css b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.min.css
deleted file mode 100644
index eada490..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/css/font-awesome.min.css
+++ /dev/null
@@ -1 +0,0 @@
-@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/FontAwesome.otf b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/FontAwesome.otf
deleted file mode 100644
index 681bdd4..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/FontAwesome.otf
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.eot b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.eot
deleted file mode 100644
index a30335d..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.eot
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.svg b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.svg
deleted file mode 100644
index 6fd19ab..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,640 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
-<metadata></metadata>
-<defs>
-<font id="fontawesomeregular" horiz-adv-x="1536" >
-<font-face units-per-em="1792" ascent="1536" descent="-256" />
-<missing-glyph horiz-adv-x="448" />
-<glyph unicode=" " horiz-adv-x="448" />
-<glyph unicode="&#x09;" horiz-adv-x="448" />
-<glyph unicode="&#xa0;" horiz-adv-x="448" />
-<glyph unicode="&#xa8;" horiz-adv-x="1792" />
-<glyph unicode="&#xa9;" horiz-adv-x="1792" />
-<glyph unicode="&#xae;" horiz-adv-x="1792" />
-<glyph unicode="&#xb4;" horiz-adv-x="1792" />
-<glyph unicode="&#xc6;" horiz-adv-x="1792" />
-<glyph unicode="&#xd8;" horiz-adv-x="1792" />
-<glyph unicode="&#x2000;" horiz-adv-x="768" />
-<glyph unicode="&#x2001;" horiz-adv-x="1537" />
-<glyph unicode="&#x2002;" horiz-adv-x="768" />
-<glyph unicode="&#x2003;" horiz-adv-x="1537" />
-<glyph unicode="&#x2004;" horiz-adv-x="512" />
-<glyph unicode="&#x2005;" horiz-adv-x="384" />
-<glyph unicode="&#x2006;" horiz-adv-x="256" />
-<glyph unicode="&#x2007;" horiz-adv-x="256" />
-<glyph unicode="&#x2008;" horiz-adv-x="192" />
-<glyph unicode="&#x2009;" horiz-adv-x="307" />
-<glyph unicode="&#x200a;" horiz-adv-x="85" />
-<glyph unicode="&#x202f;" horiz-adv-x="307" />
-<glyph unicode="&#x205f;" horiz-adv-x="384" />
-<glyph unicode="&#x2122;" horiz-adv-x="1792" />
-<glyph unicode="&#x221e;" horiz-adv-x="1792" />
-<glyph unicode="&#x2260;" horiz-adv-x="1792" />
-<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
-<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
-<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
-<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
-<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
-<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
-<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
-<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
-<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
-<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
-<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
-<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
-<glyph unicode="&#xf016;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " />
-<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
-<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
-<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
-<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
-<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
-<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
-<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
-<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
-<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
-<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
-<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
-<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
-<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
-<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
-<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
-<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
-<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
-<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
-<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
-<glyph unicode="&#xf035;" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
-<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
-<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
-<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
-<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
-<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
-<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
-<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
-<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
-<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
-<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
-<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
-<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
-<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
-<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
-<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
-<glyph unicode="&#xf053;" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
-<glyph unicode="&#xf054;" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
-<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
-<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
-<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
-<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
-<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
-<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
-<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
-<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
-<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
-<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
-<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
-<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
-<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
-<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
-<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
-<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
-<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
-<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
-<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf077;" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
-<glyph unicode="&#xf078;" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
-<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
-<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="&#xf080;" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
-<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf082;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960z" />
-<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
-<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
-<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
-<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
-<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
-<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
-<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
-<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
-<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
-<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
-<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
-<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
-<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
-<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
-<glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
-<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
-<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
-<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
-<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
-<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
-<glyph unicode="&#xf0a2;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
-<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
-<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
-<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
-<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
-<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
-<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
-<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
-<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
-<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
-<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
-<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
-<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
-<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
-<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
-<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
-<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
-<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
-<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
-<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
-<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
-<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
-<glyph unicode="&#xf0d4;" d="M829 318q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5zM755 863q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5 t-57.5 96.5t-17.5 106q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107zM861 1120l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95 q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83zM1152 672h128v64h-128v128h-64v-128 h-128v-64h128v-160h64v160zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M735 740q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4 q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65t-59.5 -61.5t-24.5 -66zM589 836q38 0 78 16.5t66 43.5q53 57 53 159q0 58 -17 125t-48.5 129.5 t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26zM591 -37q58 0 111.5 13t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2 q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5zM1401 839h213v-108h-213v-219h-105v219h-212v108h212v217h105v-217z" />
-<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
-<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
-<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
-<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
-<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
-<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
-<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
-<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
-<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
-<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
-<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
-<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
-<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
-<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
-<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
-<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
-<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
-<glyph unicode="&#xf0f3;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
-<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0f6;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
-<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
-<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
-<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
-<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
-<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
-<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
-<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
-<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
-<glyph unicode="&#xf110;" horiz-adv-x="1792" d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
-<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
-<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
-<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
-<glyph unicode="&#xf116;" horiz-adv-x="1792" />
-<glyph unicode="&#xf117;" horiz-adv-x="1792" />
-<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
-<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
-<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
-<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
-<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
-<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
-<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
-<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
-<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
-<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
-<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
-<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
-<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
-<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
-<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
-<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
-<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
-<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
-<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
-<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
-<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
-<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
-<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
-<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
-<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
-<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
-<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
-<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
-<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
-<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
-<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
-<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
-<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
-<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
-<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
-<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
-<glyph unicode="&#xf15b;" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
-<glyph unicode="&#xf15c;" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
-<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
-<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
-<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
-<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
-<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
-<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
-<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
-<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
-<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
-<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
-<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
-<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
-<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
-<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
-<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" />
-<glyph unicode="&#xf174;" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
-<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
-<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
-<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
-<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
-<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
-<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
-<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
-<glyph unicode="&#xf180;" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
-<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
-<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
-<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
-<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
-<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
-<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
-<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
-<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
-<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
-<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
-<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
-<glyph unicode="&#xf194;" d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179 q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf197;" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
-<glyph unicode="&#xf198;" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
-<glyph unicode="&#xf199;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
-<glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" />
-<glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
-<glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
-<glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
-<glyph unicode="&#xf19e;" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
-<glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M981 197q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13t99 39t73 73t27.5 109zM864 1055 q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5q53 56 53 159zM752 1536h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5 t-59.5 -93t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5 t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32z" />
-<glyph unicode="&#xf1a1;" horiz-adv-x="1792" d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26 t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37 q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191 t348 71t348 -71t286 -191t191 -286t71 -348z" />
-<glyph unicode="&#xf1a2;" d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54 q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83 q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf1a3;" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
-<glyph unicode="&#xf1a5;" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
-<glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" />
-<glyph unicode="&#xf1a7;" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
-<glyph unicode="&#xf1a9;" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
-<glyph unicode="&#xf1aa;" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" />
-<glyph unicode="&#xf1ab;" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" />
-<glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
-<glyph unicode="&#xf1ad;" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
-<glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
-<glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" />
-<glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
-<glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " />
-<glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" />
-<glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
-<glyph unicode="&#xf1b5;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
-<glyph unicode="&#xf1b6;" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
-<glyph unicode="&#xf1b7;" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " />
-<glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
-<glyph unicode="&#xf1b9;" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
-<glyph unicode="&#xf1ba;" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
-<glyph unicode="&#xf1bb;" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
-<glyph unicode="&#xf1bc;" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf1bd;" horiz-adv-x="1024" d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
-<glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
-<glyph unicode="&#xf1c0;" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
-<glyph unicode="&#xf1c1;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
-<glyph unicode="&#xf1c2;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" />
-<glyph unicode="&#xf1c3;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" />
-<glyph unicode="&#xf1c4;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
-<glyph unicode="&#xf1c5;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
-<glyph unicode="&#xf1c6;" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
-<glyph unicode="&#xf1c7;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
-<glyph unicode="&#xf1c8;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
-<glyph unicode="&#xf1c9;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
-<glyph unicode="&#xf1ca;" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
-<glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
-<glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" />
-<glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
-<glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5z" />
-<glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
-<glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-<glyph unicode="&#xf1d2;" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
-<glyph unicode="&#xf1d4;" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
-<glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
-<glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
-<glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
-<glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" />
-<glyph unicode="&#xf1da;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf1db;" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" />
-<glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
-<glyph unicode="&#xf1de;" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
-<glyph unicode="&#xf1e0;" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
-<glyph unicode="&#xf1e1;" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
-<glyph unicode="&#xf1e3;" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
-<glyph unicode="&#xf1e4;" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
-<glyph unicode="&#xf1e5;" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf1e6;" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" />
-<glyph unicode="&#xf1e7;" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
-<glyph unicode="&#xf1e8;" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
-<glyph unicode="&#xf1e9;" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
-<glyph unicode="&#xf1ea;" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
-<glyph unicode="&#xf1eb;" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
-<glyph unicode="&#xf1ec;" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf1ed;" d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246 q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598 q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" />
-<glyph unicode="&#xf1ee;" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 -160 -72 -311q-17 131 -63 246q25 174 -5 361q-27 178 -94 342 q114 -90 212 -211q9 -37 15 -80q26 -179 7 -347zM1520 1440q9 -17 23.5 -49.5t43.5 -117.5t50.5 -178t34 -227.5t5 -269t-47 -300t-112.5 -323.5q-22 -48 -66 -75.5t-95 -27.5q-39 0 -74 16q-67 31 -92.5 100t4.5 136q58 126 90 257.5t37.5 239.5t-3.5 213.5t-26.5 180.5 t-38.5 138.5t-32.5 90t-15.5 32.5q-34 65 -11.5 135.5t87.5 104.5q37 20 81 20q49 0 91.5 -25.5t66.5 -70.5z" />
-<glyph unicode="&#xf1f0;" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf1f1;" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf1f2;" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
-<glyph unicode="&#xf1f3;" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
-<glyph unicode="&#xf1f4;" horiz-adv-x="2304" d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16 t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76 q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59 t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489 l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66 q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf1f5;" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf1f6;" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" />
-<glyph unicode="&#xf1f7;" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
-<glyph unicode="&#xf1f8;" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf1f9;" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf1fa;" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
-<glyph unicode="&#xf1fb;" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
-<glyph unicode="&#xf1fc;" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
-<glyph unicode="&#xf1fd;" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
-<glyph unicode="&#xf1fe;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
-<glyph unicode="&#xf200;" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="&#xf201;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" />
-<glyph unicode="&#xf202;" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
-<glyph unicode="&#xf203;" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf204;" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
-<glyph unicode="&#xf205;" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
-<glyph unicode="&#xf206;" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
-<glyph unicode="&#xf207;" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
-<glyph unicode="&#xf208;" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
-<glyph unicode="&#xf209;" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
-<glyph unicode="&#xf20a;" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
-<glyph unicode="&#xf20b;" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
-<glyph unicode="&#xf20c;" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
-<glyph unicode="&#xf20d;" d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
-<glyph unicode="&#xf20e;" horiz-adv-x="2048" d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360q2 0 4.5 -1t5.5 -2.5l5 -2.5l188 199v347l-187 194 q-13 -8 -29 -10zM986 1438h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13 zM552 226h402l64 66l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224 l213 -225zM1023 946l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196 l-48 -227l130 227h-82zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
-<glyph unicode="&#xf210;" d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
-<glyph unicode="&#xf211;" d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
-<glyph unicode="&#xf212;" horiz-adv-x="2048" d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 q209 0 374 -102q172 107 374 102z" />
-<glyph unicode="&#xf213;" horiz-adv-x="2048" d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
-<glyph unicode="&#xf214;" d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 t-43 -34t-16.5 -53.5z" />
-<glyph unicode="&#xf215;" horiz-adv-x="2048" d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
-<glyph unicode="&#xf216;" horiz-adv-x="2048" d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126.5t-103.5 132.5t-108.5 126t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
-<glyph unicode="&#xf217;" horiz-adv-x="1664" d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf218;" horiz-adv-x="1664" d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
-<glyph unicode="&#xf219;" horiz-adv-x="2048" d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
-<glyph unicode="&#xf21a;" horiz-adv-x="2048" d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
-<glyph unicode="&#xf21b;" d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
-<glyph unicode="&#xf21c;" horiz-adv-x="2304" d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
-<glyph unicode="&#xf21d;" d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5z" />
-<glyph unicode="&#xf21e;" horiz-adv-x="1792" d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 t127 -344z" />
-<glyph unicode="&#xf221;" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
-<glyph unicode="&#xf222;" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5 q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="&#xf223;" horiz-adv-x="1280" d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="&#xf224;" d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="&#xf225;" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="&#xf226;" horiz-adv-x="1792" d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 q0 -226 -154 -391q103 -57 218 -57z" />
-<glyph unicode="&#xf227;" horiz-adv-x="1920" d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -29 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
-<glyph unicode="&#xf228;" horiz-adv-x="2048" d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
-<glyph unicode="&#xf229;" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5 t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="&#xf22a;" horiz-adv-x="1280" d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="&#xf22b;" horiz-adv-x="2048" d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5 t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5 t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="&#xf22c;" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="&#xf22d;" horiz-adv-x="1280" d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123 t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" />
-<glyph unicode="&#xf22e;" horiz-adv-x="1792" />
-<glyph unicode="&#xf22f;" horiz-adv-x="1792" />
-<glyph unicode="&#xf230;" d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
-<glyph unicode="&#xf231;" horiz-adv-x="1280" d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
-<glyph unicode="&#xf232;" d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
-<glyph unicode="&#xf233;" horiz-adv-x="1792" d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
-<glyph unicode="&#xf234;" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
-<glyph unicode="&#xf235;" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
-<glyph unicode="&#xf236;" horiz-adv-x="2048" d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 q-26 0 -45 -19t-19 -45v-384h1152z" />
-<glyph unicode="&#xf237;" d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
-<glyph unicode="&#xf238;" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
-<glyph unicode="&#xf239;" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
-<glyph unicode="&#xf23a;" horiz-adv-x="1792" d="M1792 204v-209h-642v209h134v926h-6l-314 -1135h-243l-310 1135h-8v-926h135v-209h-538v209h69q21 0 43 19.5t22 37.5v881q0 18 -22 40t-43 22h-69v209h672l221 -821h6l223 821h670v-209h-71q-19 0 -41 -22t-22 -40v-881q0 -18 21.5 -37.5t41.5 -19.5h71z" />
-<glyph unicode="&#xf23b;" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
-<glyph unicode="&#xf23c;" horiz-adv-x="2296" d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5 q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5 q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42 q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37 q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5 q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139 q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 4 5 8q16 18 60 23h13q5 18 19 30t33 8 t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132 q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132 q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-106 2 -211 0v1q-1 -27 2.5 -86 t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103 q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34l3 9v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4l-10 -2.5t-12 -2 l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-2 0 -3 -0.5t-3 -0.5h-3q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130t-73 70 q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -2 -1 -5t-1 -4q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150 q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12 q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" />
-<glyph unicode="&#xf23d;" horiz-adv-x="2304" d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5 t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5 t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" />
-<glyph unicode="&#xf23e;" horiz-adv-x="1792" d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348 t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23 t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512 q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" />
-<glyph unicode="&#xf240;" horiz-adv-x="2304" d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113 v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="&#xf241;" horiz-adv-x="2304" d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
-<glyph unicode="&#xf242;" horiz-adv-x="2304" d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
-<glyph unicode="&#xf243;" horiz-adv-x="2304" d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
-<glyph unicode="&#xf244;" horiz-adv-x="2304" d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23 v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
-<glyph unicode="&#xf245;" horiz-adv-x="1280" d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" />
-<glyph unicode="&#xf246;" horiz-adv-x="1024" d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" />
-<glyph unicode="&#xf247;" horiz-adv-x="2048" d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128 h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
-<glyph unicode="&#xf248;" horiz-adv-x="2304" d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256 v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" />
-<glyph unicode="&#xf249;" d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" />
-<glyph unicode="&#xf24a;" d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68 z" />
-<glyph unicode="&#xf24b;" horiz-adv-x="2304" d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5 t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88 t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90 t90 38h2048q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf24c;" horiz-adv-x="2304" d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294 t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf24d;" horiz-adv-x="1792" d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113 zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf24e;" horiz-adv-x="2304" d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64 q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91 t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5 t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" />
-<glyph unicode="&#xf250;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5 t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
-<glyph unicode="&#xf251;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" />
-<glyph unicode="&#xf252;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" />
-<glyph unicode="&#xf253;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196 h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
-<glyph unicode="&#xf254;" d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87 t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9 h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" />
-<glyph unicode="&#xf255;" d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25 q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27 t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21 q72 69 174 69z" />
-<glyph unicode="&#xf256;" horiz-adv-x="1792" d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33 t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52 h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" />
-<glyph unicode="&#xf257;" horiz-adv-x="1792" d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668 q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17 t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5 q0 -42 -23 -78t-61 -53l-310 -141h91z" />
-<glyph unicode="&#xf258;" horiz-adv-x="2048" d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32 q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68 q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" />
-<glyph unicode="&#xf259;" horiz-adv-x="2048" d="M816 1408q-48 0 -79.5 -34t-31.5 -82q0 -14 3 -28l150 -624h-26l-116 482q-9 38 -39.5 62t-69.5 24q-47 0 -79 -34t-32 -81q0 -11 4 -29q3 -13 39 -161t68 -282t32 -138v-227l-307 230q-34 26 -77 26q-52 0 -89.5 -36.5t-37.5 -88.5q0 -67 56 -110l507 -379 q34 -26 76 -26h694q33 0 59 20.5t34 52.5l100 401q8 30 10 88t9 86l116 478q3 12 3 26q0 46 -33 79t-80 33q-38 0 -69 -25.5t-40 -62.5l-99 -408h-26l132 547q3 14 3 28q0 47 -32 80t-80 33q-38 0 -68.5 -24t-39.5 -62l-145 -602h-127l-164 682q-9 38 -39.5 62t-68.5 24z M1461 -256h-694q-85 0 -153 51l-507 380q-50 38 -78.5 94t-28.5 118q0 105 75 179t180 74q25 0 49.5 -5.5t41.5 -11t41 -20.5t35 -23t38.5 -29.5t37.5 -28.5l-123 512q-7 35 -7 59q0 93 60 162t152 79q14 87 80.5 144.5t155.5 57.5q83 0 148 -51.5t85 -132.5l103 -428 l83 348q20 81 85 132.5t148 51.5q87 0 152.5 -54t82.5 -139q93 -10 155 -78t62 -161q0 -30 -7 -57l-116 -477q-5 -22 -5 -67q0 -51 -13 -108l-101 -401q-19 -75 -79.5 -122.5t-137.5 -47.5z" />
-<glyph unicode="&#xf25a;" horiz-adv-x="1792" d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5 q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5 v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32 v-384h32z" />
-<glyph unicode="&#xf25b;" d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181 v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46 q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5 q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308 q0 -53 37.5 -90.5t90.5 -37.5h668z" />
-<glyph unicode="&#xf25c;" horiz-adv-x="1973" d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5 t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141 q13 0 22 -8.5t10 -20.5z" />
-<glyph unicode="&#xf25d;" horiz-adv-x="1792" d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109 t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640 q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-<glyph unicode="&#xf25e;" horiz-adv-x="1792" d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13t-23.5 -14.5t-28.5 -13.5t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78 q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13t-23.5 -14.5t-28.5 -13.5t-33.5 -9.5 t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376 q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" />
-<glyph unicode="&#xf260;" horiz-adv-x="2048" d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
-<glyph unicode="&#xf261;" horiz-adv-x="1792" d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
-<glyph unicode="&#xf262;" horiz-adv-x="2304" d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57 t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197 t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5 t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5 t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5 q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" />
-<glyph unicode="&#xf263;" horiz-adv-x="1280" d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5 t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94 q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" />
-<glyph unicode="&#xf264;" d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32 q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5 zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="&#xf265;" horiz-adv-x="1720" d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33 l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" />
-<glyph unicode="&#xf266;" horiz-adv-x="2304" d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540 q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81 l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" />
-<glyph unicode="&#xf267;" horiz-adv-x="1792" d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640 q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5 t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5 t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5 t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191 t191 -286t71 -348z" />
-<glyph unicode="&#xf268;" horiz-adv-x="1792" d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962 q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" />
-<glyph unicode="&#xf269;" horiz-adv-x="1792" d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5 q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5 q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" />
-<glyph unicode="&#xf26a;" d="M768 -92q77 0 139.5 63t100.5 166t59 234.5t21 268.5t-21 268.5t-59 234.5t-100.5 166t-139.5 63t-139.5 -63t-100.5 -166t-59 -234.5t-21 -268.5t21 -268.5t59 -234.5t100.5 -166t139.5 -63zM768 -256q-184 0 -333 77t-240 203t-141 287t-50 329t50 329t141 287t240 203 t333 77q148 0 274 -50t214.5 -136t151.5 -201t92.5 -244t29.5 -265t-29.5 -265t-92.5 -244t-151.5 -201t-214.5 -136t-274 -50z" />
-<glyph unicode="&#xf26b;" horiz-adv-x="1792" d="M716 -69q-143 35 -261.5 114t-197.5 191q-139 -300 -17 -398q26 -21 85 -24.5t127.5 9.5t141 41.5t122.5 66.5zM693 762h452q0 108 -61.5 169t-168.5 61q-103 0 -162.5 -62.5t-59.5 -167.5zM1724 1137h-34q26 102 22.5 170t-25 110t-63.5 57t-93.5 11t-115 -26.5 t-128.5 -56.5t-134 -79q129 -37 238.5 -113.5t185 -179t110 -231.5t15.5 -262h-1005q0 -60 10 -106t34 -85t69.5 -60t112.5 -21q87 0 142.5 44t72.5 122h540q-71 -230 -281.5 -377t-477.5 -147q-83 0 -159 15q-35 -40 -151 -94t-248 -78t-219 35q-78 60 -100 159t7 214 t88 242t143.5 248t173.5 226.5t177.5 183.5t156.5 112v24q-120 -37 -258.5 -137.5t-240.5 -207t-159 -195.5q4 106 34 201t80 169t118 135.5t147.5 100.5t168 65.5t180.5 29.5t185 -8q310 186 503 189h7q57 0 103 -18q80 -30 98 -132.5t-30 -248.5z" />
-<glyph unicode="&#xf26c;" horiz-adv-x="2048" d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23 v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="&#xf26d;" horiz-adv-x="1792" d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34 h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100 q-68 175 -180 287z" />
-<glyph unicode="&#xf26e;" horiz-adv-x="2304" d="M1391 390v0l-1 1q-15 18 -34.5 37.5t-62.5 57.5t-93.5 62t-95.5 24q-48 0 -83 -21.5t-51 -54t-23 -59t-7 -47.5v0v0q0 -21 7 -48t23 -59t51 -53.5t83 -21.5q45 0 95.5 24t94 62.5t62 57t34.5 37.5zM2103 390q0 21 -7 47.5t-23 59t-51 54t-83 21.5q-45 0 -95.5 -24 t-94 -62.5t-62 -57t-34.5 -37.5l-1 -1v0v0l1 -1q15 -18 34.5 -37.5t62.5 -57.5t93.5 -62t95.5 -24q48 0 83 21.5t51 53.5t23 59t7 48zM2304 393q0 -69 -24 -137.5t-68 -126t-116 -93.5t-159 -36q-68 0 -134 24t-113.5 58.5t-84.5 69.5t-59.5 59t-25.5 24t-22.5 -24 t-54.5 -58.5t-81.5 -69.5t-115 -59t-143.5 -24q-65 0 -123.5 22.5t-96.5 54t-66.5 66.5t-41 59.5t-12.5 32.5q0 -8 -8.5 -26.5t-25 -45.5t-47 -55t-69 -52.5t-96.5 -40t-125 -15.5q-71 0 -130 15.5t-98.5 39.5t-70.5 56.5t-48 63.5t-27.5 63.5t-14 54t-3.5 36.5h217 q0 -55 49 -107.5t126 -52.5q79 0 134.5 67t55.5 148q0 80 -52 136.5t-138 56.5q-5 0 -13 -0.5t-31 -5t-43 -12t-42 -24.5t-34 -40h-195l102 583h602v-174h-445q-27 -159 -41 -248q4 0 16.5 13t31.5 28.5t65 28.5t108 13t114 -20.5t82.5 -49.5t51.5 -58.5t31 -50t11 -20.5 t13 25t36.5 60.5t60.5 71.5t97 61t133 25t140.5 -25t115.5 -60.5t83.5 -71.5t56.5 -61t21 -25q2 0 22 25t56 60.5t83.5 71.5t115.5 61t140 25q92 0 164.5 -35t115.5 -93t65 -125t22 -137z" />
-<glyph unicode="&#xf270;" horiz-adv-x="1792" d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30 q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57 t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133 q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" />
-<glyph unicode="&#xf271;" horiz-adv-x="1792" d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9 h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224 v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" />
-<glyph unicode="&#xf272;" horiz-adv-x="1792" d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23 t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47 t47 -113v-96h128q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf273;" horiz-adv-x="1792" d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf274;" horiz-adv-x="1792" d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47 t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-<glyph unicode="&#xf275;" horiz-adv-x="1792" d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" />
-<glyph unicode="&#xf276;" horiz-adv-x="1024" d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q61 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249 q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" />
-<glyph unicode="&#xf277;" horiz-adv-x="1792" d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768 q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" />
-<glyph unicode="&#xf278;" horiz-adv-x="2048" d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173 v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
-<glyph unicode="&#xf279;" horiz-adv-x="1792" d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472 q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" />
-<glyph unicode="&#xf27a;" horiz-adv-x="1792" d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37 t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
-<glyph unicode="&#xf27b;" horiz-adv-x="1792" d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5 t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51 t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" />
-<glyph unicode="&#xf27c;" horiz-adv-x="1024" d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
-<glyph unicode="&#xf27d;" horiz-adv-x="1792" d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246 q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" />
-<glyph unicode="&#xf27e;" d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
-<glyph unicode="&#xf280;" d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72 h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275 l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" />
-<glyph unicode="&#xf281;" horiz-adv-x="1792" />
-<glyph unicode="&#xf282;" horiz-adv-x="1792" />
-<glyph unicode="&#xf283;" horiz-adv-x="1792" />
-<glyph unicode="&#xf284;" horiz-adv-x="1792" />
-<glyph unicode="&#xf285;" horiz-adv-x="1792" />
-<glyph unicode="&#xf286;" horiz-adv-x="1792" />
-<glyph unicode="&#xf287;" horiz-adv-x="1792" />
-<glyph unicode="&#xf288;" horiz-adv-x="1792" />
-<glyph unicode="&#xf289;" horiz-adv-x="1792" />
-<glyph unicode="&#xf28a;" horiz-adv-x="1792" />
-<glyph unicode="&#xf28b;" horiz-adv-x="1792" />
-<glyph unicode="&#xf28c;" horiz-adv-x="1792" />
-<glyph unicode="&#xf28d;" horiz-adv-x="1792" />
-<glyph unicode="&#xf28e;" horiz-adv-x="1792" />
-<glyph unicode="&#xf500;" horiz-adv-x="1792" />
-</font>
-</defs></svg> \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.ttf b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.ttf
deleted file mode 100644
index d7994e1..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.ttf
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff
deleted file mode 100644
index 6fd4ede..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff2 b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff2
deleted file mode 100644
index 5560193..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/fonts/fontawesome-webfont.woff2
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/animated.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/animated.less
deleted file mode 100644
index 66ad52a..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/animated.less
+++ /dev/null
@@ -1,34 +0,0 @@
-// Animated Icons
-// --------------------------
-
-.@{fa-css-prefix}-spin {
- -webkit-animation: fa-spin 2s infinite linear;
- animation: fa-spin 2s infinite linear;
-}
-
-.@{fa-css-prefix}-pulse {
- -webkit-animation: fa-spin 1s infinite steps(8);
- animation: fa-spin 1s infinite steps(8);
-}
-
-@-webkit-keyframes fa-spin {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(359deg);
- transform: rotate(359deg);
- }
-}
-
-@keyframes fa-spin {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(359deg);
- transform: rotate(359deg);
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/bordered-pulled.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/bordered-pulled.less
deleted file mode 100644
index f1c8ad7..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/bordered-pulled.less
+++ /dev/null
@@ -1,25 +0,0 @@
-// Bordered & Pulled
-// -------------------------
-
-.@{fa-css-prefix}-border {
- padding: .2em .25em .15em;
- border: solid .08em @fa-border-color;
- border-radius: .1em;
-}
-
-.@{fa-css-prefix}-pull-left { float: left; }
-.@{fa-css-prefix}-pull-right { float: right; }
-
-.@{fa-css-prefix} {
- &.@{fa-css-prefix}-pull-left { margin-right: .3em; }
- &.@{fa-css-prefix}-pull-right { margin-left: .3em; }
-}
-
-/* Deprecated as of 4.4.0 */
-.pull-right { float: right; }
-.pull-left { float: left; }
-
-.@{fa-css-prefix} {
- &.pull-left { margin-right: .3em; }
- &.pull-right { margin-left: .3em; }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/core.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/core.less
deleted file mode 100644
index c577ac8..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/core.less
+++ /dev/null
@@ -1,12 +0,0 @@
-// Base Class Definition
-// -------------------------
-
-.@{fa-css-prefix} {
- display: inline-block;
- font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
- font-size: inherit; // can't have font-size inherit on line above, so need to override
- text-rendering: auto; // optimizelegibility throws things off #1094
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/fixed-width.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/fixed-width.less
deleted file mode 100644
index 110289f..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/fixed-width.less
+++ /dev/null
@@ -1,6 +0,0 @@
-// Fixed Width Icons
-// -------------------------
-.@{fa-css-prefix}-fw {
- width: (18em / 14);
- text-align: center;
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/font-awesome.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/font-awesome.less
deleted file mode 100644
index e3f89c8..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/font-awesome.less
+++ /dev/null
@@ -1,17 +0,0 @@
-/*!
- * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */
-
-@import "variables.less";
-@import "mixins.less";
-@import "path.less";
-@import "core.less";
-@import "larger.less";
-@import "fixed-width.less";
-@import "list.less";
-@import "bordered-pulled.less";
-@import "animated.less";
-@import "rotated-flipped.less";
-@import "stacked.less";
-@import "icons.less";
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/icons.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/icons.less
deleted file mode 100644
index 6ebe966..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/icons.less
+++ /dev/null
@@ -1,677 +0,0 @@
-/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
- readers do not read off random characters that represent icons */
-
-.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }
-.@{fa-css-prefix}-music:before { content: @fa-var-music; }
-.@{fa-css-prefix}-search:before { content: @fa-var-search; }
-.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }
-.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }
-.@{fa-css-prefix}-star:before { content: @fa-var-star; }
-.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }
-.@{fa-css-prefix}-user:before { content: @fa-var-user; }
-.@{fa-css-prefix}-film:before { content: @fa-var-film; }
-.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }
-.@{fa-css-prefix}-th:before { content: @fa-var-th; }
-.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }
-.@{fa-css-prefix}-check:before { content: @fa-var-check; }
-.@{fa-css-prefix}-remove:before,
-.@{fa-css-prefix}-close:before,
-.@{fa-css-prefix}-times:before { content: @fa-var-times; }
-.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }
-.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }
-.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }
-.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }
-.@{fa-css-prefix}-gear:before,
-.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }
-.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }
-.@{fa-css-prefix}-home:before { content: @fa-var-home; }
-.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }
-.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }
-.@{fa-css-prefix}-road:before { content: @fa-var-road; }
-.@{fa-css-prefix}-download:before { content: @fa-var-download; }
-.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }
-.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }
-.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }
-.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }
-.@{fa-css-prefix}-rotate-right:before,
-.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }
-.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }
-.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }
-.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }
-.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }
-.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }
-.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }
-.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }
-.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }
-.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }
-.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }
-.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }
-.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }
-.@{fa-css-prefix}-book:before { content: @fa-var-book; }
-.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }
-.@{fa-css-prefix}-print:before { content: @fa-var-print; }
-.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }
-.@{fa-css-prefix}-font:before { content: @fa-var-font; }
-.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }
-.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }
-.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }
-.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }
-.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }
-.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }
-.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }
-.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }
-.@{fa-css-prefix}-list:before { content: @fa-var-list; }
-.@{fa-css-prefix}-dedent:before,
-.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }
-.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }
-.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }
-.@{fa-css-prefix}-photo:before,
-.@{fa-css-prefix}-image:before,
-.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }
-.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }
-.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }
-.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }
-.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }
-.@{fa-css-prefix}-edit:before,
-.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }
-.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }
-.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }
-.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }
-.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }
-.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }
-.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }
-.@{fa-css-prefix}-play:before { content: @fa-var-play; }
-.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }
-.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }
-.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }
-.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }
-.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }
-.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }
-.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }
-.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }
-.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }
-.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }
-.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }
-.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }
-.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }
-.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }
-.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }
-.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }
-.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }
-.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }
-.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }
-.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }
-.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }
-.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }
-.@{fa-css-prefix}-mail-forward:before,
-.@{fa-css-prefix}-share:before { content: @fa-var-share; }
-.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }
-.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }
-.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }
-.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }
-.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }
-.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }
-.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }
-.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }
-.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }
-.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }
-.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }
-.@{fa-css-prefix}-warning:before,
-.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }
-.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }
-.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }
-.@{fa-css-prefix}-random:before { content: @fa-var-random; }
-.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }
-.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }
-.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }
-.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }
-.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }
-.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }
-.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }
-.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }
-.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }
-.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }
-.@{fa-css-prefix}-bar-chart-o:before,
-.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }
-.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }
-.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }
-.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }
-.@{fa-css-prefix}-key:before { content: @fa-var-key; }
-.@{fa-css-prefix}-gears:before,
-.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }
-.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }
-.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }
-.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }
-.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }
-.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }
-.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }
-.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }
-.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }
-.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }
-.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }
-.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }
-.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }
-.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }
-.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }
-.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }
-.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }
-.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }
-.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }
-.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }
-.@{fa-css-prefix}-facebook-f:before,
-.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }
-.@{fa-css-prefix}-github:before { content: @fa-var-github; }
-.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }
-.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }
-.@{fa-css-prefix}-feed:before,
-.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }
-.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }
-.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }
-.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }
-.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }
-.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }
-.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }
-.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }
-.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }
-.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }
-.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }
-.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }
-.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }
-.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }
-.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }
-.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }
-.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }
-.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }
-.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }
-.@{fa-css-prefix}-group:before,
-.@{fa-css-prefix}-users:before { content: @fa-var-users; }
-.@{fa-css-prefix}-chain:before,
-.@{fa-css-prefix}-link:before { content: @fa-var-link; }
-.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }
-.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }
-.@{fa-css-prefix}-cut:before,
-.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }
-.@{fa-css-prefix}-copy:before,
-.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }
-.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }
-.@{fa-css-prefix}-save:before,
-.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }
-.@{fa-css-prefix}-square:before { content: @fa-var-square; }
-.@{fa-css-prefix}-navicon:before,
-.@{fa-css-prefix}-reorder:before,
-.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }
-.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }
-.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }
-.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }
-.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }
-.@{fa-css-prefix}-table:before { content: @fa-var-table; }
-.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }
-.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }
-.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }
-.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }
-.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }
-.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }
-.@{fa-css-prefix}-money:before { content: @fa-var-money; }
-.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }
-.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }
-.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }
-.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }
-.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }
-.@{fa-css-prefix}-unsorted:before,
-.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }
-.@{fa-css-prefix}-sort-down:before,
-.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }
-.@{fa-css-prefix}-sort-up:before,
-.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }
-.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }
-.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }
-.@{fa-css-prefix}-rotate-left:before,
-.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }
-.@{fa-css-prefix}-legal:before,
-.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }
-.@{fa-css-prefix}-dashboard:before,
-.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }
-.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }
-.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }
-.@{fa-css-prefix}-flash:before,
-.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }
-.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }
-.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }
-.@{fa-css-prefix}-paste:before,
-.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }
-.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }
-.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }
-.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }
-.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }
-.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }
-.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }
-.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }
-.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }
-.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }
-.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }
-.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }
-.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }
-.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }
-.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }
-.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }
-.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }
-.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }
-.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }
-.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }
-.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }
-.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }
-.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }
-.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }
-.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }
-.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }
-.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }
-.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }
-.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }
-.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }
-.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }
-.@{fa-css-prefix}-mobile-phone:before,
-.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }
-.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }
-.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }
-.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }
-.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }
-.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }
-.@{fa-css-prefix}-mail-reply:before,
-.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }
-.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }
-.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }
-.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }
-.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }
-.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }
-.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }
-.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }
-.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }
-.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }
-.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }
-.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }
-.@{fa-css-prefix}-code:before { content: @fa-var-code; }
-.@{fa-css-prefix}-mail-reply-all:before,
-.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }
-.@{fa-css-prefix}-star-half-empty:before,
-.@{fa-css-prefix}-star-half-full:before,
-.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }
-.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }
-.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }
-.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }
-.@{fa-css-prefix}-unlink:before,
-.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }
-.@{fa-css-prefix}-question:before { content: @fa-var-question; }
-.@{fa-css-prefix}-info:before { content: @fa-var-info; }
-.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }
-.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }
-.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }
-.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }
-.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }
-.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }
-.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }
-.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }
-.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }
-.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }
-.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }
-.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }
-.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }
-.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }
-.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }
-.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }
-.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }
-.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }
-.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }
-.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }
-.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }
-.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }
-.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }
-.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }
-.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }
-.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }
-.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }
-.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }
-.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }
-.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }
-.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }
-.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }
-.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }
-.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }
-.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }
-.@{fa-css-prefix}-toggle-down:before,
-.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }
-.@{fa-css-prefix}-toggle-up:before,
-.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }
-.@{fa-css-prefix}-toggle-right:before,
-.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }
-.@{fa-css-prefix}-euro:before,
-.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }
-.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }
-.@{fa-css-prefix}-dollar:before,
-.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }
-.@{fa-css-prefix}-rupee:before,
-.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }
-.@{fa-css-prefix}-cny:before,
-.@{fa-css-prefix}-rmb:before,
-.@{fa-css-prefix}-yen:before,
-.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }
-.@{fa-css-prefix}-ruble:before,
-.@{fa-css-prefix}-rouble:before,
-.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }
-.@{fa-css-prefix}-won:before,
-.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }
-.@{fa-css-prefix}-bitcoin:before,
-.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }
-.@{fa-css-prefix}-file:before { content: @fa-var-file; }
-.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }
-.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }
-.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }
-.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }
-.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }
-.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }
-.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }
-.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }
-.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }
-.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }
-.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }
-.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }
-.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }
-.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }
-.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }
-.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }
-.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }
-.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }
-.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }
-.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }
-.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }
-.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }
-.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }
-.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }
-.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }
-.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }
-.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }
-.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }
-.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }
-.@{fa-css-prefix}-android:before { content: @fa-var-android; }
-.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }
-.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }
-.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }
-.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }
-.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }
-.@{fa-css-prefix}-female:before { content: @fa-var-female; }
-.@{fa-css-prefix}-male:before { content: @fa-var-male; }
-.@{fa-css-prefix}-gittip:before,
-.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; }
-.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }
-.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }
-.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }
-.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }
-.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }
-.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }
-.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }
-.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }
-.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }
-.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }
-.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }
-.@{fa-css-prefix}-toggle-left:before,
-.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }
-.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }
-.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }
-.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }
-.@{fa-css-prefix}-turkish-lira:before,
-.@{fa-css-prefix}-try:before { content: @fa-var-try; }
-.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }
-.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }
-.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }
-.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }
-.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }
-.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }
-.@{fa-css-prefix}-institution:before,
-.@{fa-css-prefix}-bank:before,
-.@{fa-css-prefix}-university:before { content: @fa-var-university; }
-.@{fa-css-prefix}-mortar-board:before,
-.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }
-.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }
-.@{fa-css-prefix}-google:before { content: @fa-var-google; }
-.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }
-.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }
-.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }
-.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }
-.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }
-.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }
-.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }
-.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }
-.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }
-.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }
-.@{fa-css-prefix}-language:before { content: @fa-var-language; }
-.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }
-.@{fa-css-prefix}-building:before { content: @fa-var-building; }
-.@{fa-css-prefix}-child:before { content: @fa-var-child; }
-.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }
-.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }
-.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }
-.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }
-.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }
-.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }
-.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }
-.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }
-.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }
-.@{fa-css-prefix}-automobile:before,
-.@{fa-css-prefix}-car:before { content: @fa-var-car; }
-.@{fa-css-prefix}-cab:before,
-.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }
-.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }
-.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }
-.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }
-.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }
-.@{fa-css-prefix}-database:before { content: @fa-var-database; }
-.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }
-.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }
-.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }
-.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }
-.@{fa-css-prefix}-file-photo-o:before,
-.@{fa-css-prefix}-file-picture-o:before,
-.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }
-.@{fa-css-prefix}-file-zip-o:before,
-.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }
-.@{fa-css-prefix}-file-sound-o:before,
-.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }
-.@{fa-css-prefix}-file-movie-o:before,
-.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }
-.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }
-.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }
-.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }
-.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }
-.@{fa-css-prefix}-life-bouy:before,
-.@{fa-css-prefix}-life-buoy:before,
-.@{fa-css-prefix}-life-saver:before,
-.@{fa-css-prefix}-support:before,
-.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }
-.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }
-.@{fa-css-prefix}-ra:before,
-.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }
-.@{fa-css-prefix}-ge:before,
-.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }
-.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }
-.@{fa-css-prefix}-git:before { content: @fa-var-git; }
-.@{fa-css-prefix}-y-combinator-square:before,
-.@{fa-css-prefix}-yc-square:before,
-.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }
-.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }
-.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }
-.@{fa-css-prefix}-wechat:before,
-.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }
-.@{fa-css-prefix}-send:before,
-.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }
-.@{fa-css-prefix}-send-o:before,
-.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }
-.@{fa-css-prefix}-history:before { content: @fa-var-history; }
-.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }
-.@{fa-css-prefix}-header:before { content: @fa-var-header; }
-.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }
-.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }
-.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }
-.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }
-.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }
-.@{fa-css-prefix}-soccer-ball-o:before,
-.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }
-.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }
-.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }
-.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }
-.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }
-.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }
-.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }
-.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }
-.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }
-.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }
-.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }
-.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }
-.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }
-.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }
-.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }
-.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }
-.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }
-.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }
-.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }
-.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }
-.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }
-.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }
-.@{fa-css-prefix}-at:before { content: @fa-var-at; }
-.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }
-.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }
-.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }
-.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }
-.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }
-.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }
-.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }
-.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }
-.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }
-.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }
-.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }
-.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }
-.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }
-.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }
-.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }
-.@{fa-css-prefix}-shekel:before,
-.@{fa-css-prefix}-sheqel:before,
-.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }
-.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }
-.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; }
-.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; }
-.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; }
-.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; }
-.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; }
-.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; }
-.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; }
-.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; }
-.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; }
-.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; }
-.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; }
-.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; }
-.@{fa-css-prefix}-ship:before { content: @fa-var-ship; }
-.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; }
-.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; }
-.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; }
-.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; }
-.@{fa-css-prefix}-venus:before { content: @fa-var-venus; }
-.@{fa-css-prefix}-mars:before { content: @fa-var-mars; }
-.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; }
-.@{fa-css-prefix}-intersex:before,
-.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; }
-.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; }
-.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; }
-.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; }
-.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; }
-.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; }
-.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; }
-.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; }
-.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; }
-.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; }
-.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; }
-.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; }
-.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; }
-.@{fa-css-prefix}-server:before { content: @fa-var-server; }
-.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; }
-.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; }
-.@{fa-css-prefix}-hotel:before,
-.@{fa-css-prefix}-bed:before { content: @fa-var-bed; }
-.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; }
-.@{fa-css-prefix}-train:before { content: @fa-var-train; }
-.@{fa-css-prefix}-subway:before { content: @fa-var-subway; }
-.@{fa-css-prefix}-medium:before { content: @fa-var-medium; }
-.@{fa-css-prefix}-yc:before,
-.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; }
-.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; }
-.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; }
-.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; }
-.@{fa-css-prefix}-battery-4:before,
-.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; }
-.@{fa-css-prefix}-battery-3:before,
-.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; }
-.@{fa-css-prefix}-battery-2:before,
-.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; }
-.@{fa-css-prefix}-battery-1:before,
-.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; }
-.@{fa-css-prefix}-battery-0:before,
-.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; }
-.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; }
-.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; }
-.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; }
-.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; }
-.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; }
-.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; }
-.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; }
-.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; }
-.@{fa-css-prefix}-clone:before { content: @fa-var-clone; }
-.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; }
-.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; }
-.@{fa-css-prefix}-hourglass-1:before,
-.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; }
-.@{fa-css-prefix}-hourglass-2:before,
-.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; }
-.@{fa-css-prefix}-hourglass-3:before,
-.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; }
-.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; }
-.@{fa-css-prefix}-hand-grab-o:before,
-.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; }
-.@{fa-css-prefix}-hand-stop-o:before,
-.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; }
-.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; }
-.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; }
-.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; }
-.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; }
-.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; }
-.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; }
-.@{fa-css-prefix}-registered:before { content: @fa-var-registered; }
-.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; }
-.@{fa-css-prefix}-gg:before { content: @fa-var-gg; }
-.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; }
-.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; }
-.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; }
-.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; }
-.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; }
-.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; }
-.@{fa-css-prefix}-safari:before { content: @fa-var-safari; }
-.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; }
-.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; }
-.@{fa-css-prefix}-opera:before { content: @fa-var-opera; }
-.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; }
-.@{fa-css-prefix}-tv:before,
-.@{fa-css-prefix}-television:before { content: @fa-var-television; }
-.@{fa-css-prefix}-contao:before { content: @fa-var-contao; }
-.@{fa-css-prefix}-500px:before { content: @fa-var-500px; }
-.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; }
-.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; }
-.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; }
-.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; }
-.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; }
-.@{fa-css-prefix}-industry:before { content: @fa-var-industry; }
-.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; }
-.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; }
-.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; }
-.@{fa-css-prefix}-map:before { content: @fa-var-map; }
-.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; }
-.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; }
-.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; }
-.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; }
-.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; }
-.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; }
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/larger.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/larger.less
deleted file mode 100644
index c9d6467..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/larger.less
+++ /dev/null
@@ -1,13 +0,0 @@
-// Icon Sizes
-// -------------------------
-
-/* makes the font 33% larger relative to the icon container */
-.@{fa-css-prefix}-lg {
- font-size: (4em / 3);
- line-height: (3em / 4);
- vertical-align: -15%;
-}
-.@{fa-css-prefix}-2x { font-size: 2em; }
-.@{fa-css-prefix}-3x { font-size: 3em; }
-.@{fa-css-prefix}-4x { font-size: 4em; }
-.@{fa-css-prefix}-5x { font-size: 5em; }
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/list.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/list.less
deleted file mode 100644
index 0b44038..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/list.less
+++ /dev/null
@@ -1,19 +0,0 @@
-// List Icons
-// -------------------------
-
-.@{fa-css-prefix}-ul {
- padding-left: 0;
- margin-left: @fa-li-width;
- list-style-type: none;
- > li { position: relative; }
-}
-.@{fa-css-prefix}-li {
- position: absolute;
- left: -@fa-li-width;
- width: @fa-li-width;
- top: (2em / 14);
- text-align: center;
- &.@{fa-css-prefix}-lg {
- left: (-@fa-li-width + (4em / 14));
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/mixins.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/mixins.less
deleted file mode 100644
index d5a43a1..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/mixins.less
+++ /dev/null
@@ -1,26 +0,0 @@
-// Mixins
-// --------------------------
-
-.fa-icon() {
- display: inline-block;
- font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
- font-size: inherit; // can't have font-size inherit on line above, so need to override
- text-rendering: auto; // optimizelegibility throws things off #1094
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-
-}
-
-.fa-icon-rotate(@degrees, @rotation) {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);
- -webkit-transform: rotate(@degrees);
- -ms-transform: rotate(@degrees);
- transform: rotate(@degrees);
-}
-
-.fa-icon-flip(@horiz, @vert, @rotation) {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1);
- -webkit-transform: scale(@horiz, @vert);
- -ms-transform: scale(@horiz, @vert);
- transform: scale(@horiz, @vert);
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/path.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/path.less
deleted file mode 100644
index 9211e66..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/path.less
+++ /dev/null
@@ -1,15 +0,0 @@
-/* FONT PATH
- * -------------------------- */
-
-@font-face {
- font-family: 'FontAwesome';
- src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
- src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
- url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),
- url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
- url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
- url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
-// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
- font-weight: normal;
- font-style: normal;
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/rotated-flipped.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/rotated-flipped.less
deleted file mode 100644
index f6ba814..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/rotated-flipped.less
+++ /dev/null
@@ -1,20 +0,0 @@
-// Rotated & Flipped Icons
-// -------------------------
-
-.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
-.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
-.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
-
-.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
-.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
-
-// Hook for IE8-9
-// -------------------------
-
-:root .@{fa-css-prefix}-rotate-90,
-:root .@{fa-css-prefix}-rotate-180,
-:root .@{fa-css-prefix}-rotate-270,
-:root .@{fa-css-prefix}-flip-horizontal,
-:root .@{fa-css-prefix}-flip-vertical {
- filter: none;
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/stacked.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/stacked.less
deleted file mode 100644
index fc53fb0..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/stacked.less
+++ /dev/null
@@ -1,20 +0,0 @@
-// Stacked Icons
-// -------------------------
-
-.@{fa-css-prefix}-stack {
- position: relative;
- display: inline-block;
- width: 2em;
- height: 2em;
- line-height: 2em;
- vertical-align: middle;
-}
-.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
- position: absolute;
- left: 0;
- width: 100%;
- text-align: center;
-}
-.@{fa-css-prefix}-stack-1x { line-height: inherit; }
-.@{fa-css-prefix}-stack-2x { font-size: 2em; }
-.@{fa-css-prefix}-inverse { color: @fa-inverse; }
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/variables.less b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/variables.less
deleted file mode 100644
index 00418e7..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/less/variables.less
+++ /dev/null
@@ -1,688 +0,0 @@
-// Variables
-// --------------------------
-
-@fa-font-path: "../fonts";
-@fa-font-size-base: 14px;
-@fa-line-height-base: 1;
-//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.4.0/fonts"; // for referencing Bootstrap CDN font files directly
-@fa-css-prefix: fa;
-@fa-version: "4.4.0";
-@fa-border-color: #eee;
-@fa-inverse: #fff;
-@fa-li-width: (30em / 14);
-
-@fa-var-500px: "\f26e";
-@fa-var-adjust: "\f042";
-@fa-var-adn: "\f170";
-@fa-var-align-center: "\f037";
-@fa-var-align-justify: "\f039";
-@fa-var-align-left: "\f036";
-@fa-var-align-right: "\f038";
-@fa-var-amazon: "\f270";
-@fa-var-ambulance: "\f0f9";
-@fa-var-anchor: "\f13d";
-@fa-var-android: "\f17b";
-@fa-var-angellist: "\f209";
-@fa-var-angle-double-down: "\f103";
-@fa-var-angle-double-left: "\f100";
-@fa-var-angle-double-right: "\f101";
-@fa-var-angle-double-up: "\f102";
-@fa-var-angle-down: "\f107";
-@fa-var-angle-left: "\f104";
-@fa-var-angle-right: "\f105";
-@fa-var-angle-up: "\f106";
-@fa-var-apple: "\f179";
-@fa-var-archive: "\f187";
-@fa-var-area-chart: "\f1fe";
-@fa-var-arrow-circle-down: "\f0ab";
-@fa-var-arrow-circle-left: "\f0a8";
-@fa-var-arrow-circle-o-down: "\f01a";
-@fa-var-arrow-circle-o-left: "\f190";
-@fa-var-arrow-circle-o-right: "\f18e";
-@fa-var-arrow-circle-o-up: "\f01b";
-@fa-var-arrow-circle-right: "\f0a9";
-@fa-var-arrow-circle-up: "\f0aa";
-@fa-var-arrow-down: "\f063";
-@fa-var-arrow-left: "\f060";
-@fa-var-arrow-right: "\f061";
-@fa-var-arrow-up: "\f062";
-@fa-var-arrows: "\f047";
-@fa-var-arrows-alt: "\f0b2";
-@fa-var-arrows-h: "\f07e";
-@fa-var-arrows-v: "\f07d";
-@fa-var-asterisk: "\f069";
-@fa-var-at: "\f1fa";
-@fa-var-automobile: "\f1b9";
-@fa-var-backward: "\f04a";
-@fa-var-balance-scale: "\f24e";
-@fa-var-ban: "\f05e";
-@fa-var-bank: "\f19c";
-@fa-var-bar-chart: "\f080";
-@fa-var-bar-chart-o: "\f080";
-@fa-var-barcode: "\f02a";
-@fa-var-bars: "\f0c9";
-@fa-var-battery-0: "\f244";
-@fa-var-battery-1: "\f243";
-@fa-var-battery-2: "\f242";
-@fa-var-battery-3: "\f241";
-@fa-var-battery-4: "\f240";
-@fa-var-battery-empty: "\f244";
-@fa-var-battery-full: "\f240";
-@fa-var-battery-half: "\f242";
-@fa-var-battery-quarter: "\f243";
-@fa-var-battery-three-quarters: "\f241";
-@fa-var-bed: "\f236";
-@fa-var-beer: "\f0fc";
-@fa-var-behance: "\f1b4";
-@fa-var-behance-square: "\f1b5";
-@fa-var-bell: "\f0f3";
-@fa-var-bell-o: "\f0a2";
-@fa-var-bell-slash: "\f1f6";
-@fa-var-bell-slash-o: "\f1f7";
-@fa-var-bicycle: "\f206";
-@fa-var-binoculars: "\f1e5";
-@fa-var-birthday-cake: "\f1fd";
-@fa-var-bitbucket: "\f171";
-@fa-var-bitbucket-square: "\f172";
-@fa-var-bitcoin: "\f15a";
-@fa-var-black-tie: "\f27e";
-@fa-var-bold: "\f032";
-@fa-var-bolt: "\f0e7";
-@fa-var-bomb: "\f1e2";
-@fa-var-book: "\f02d";
-@fa-var-bookmark: "\f02e";
-@fa-var-bookmark-o: "\f097";
-@fa-var-briefcase: "\f0b1";
-@fa-var-btc: "\f15a";
-@fa-var-bug: "\f188";
-@fa-var-building: "\f1ad";
-@fa-var-building-o: "\f0f7";
-@fa-var-bullhorn: "\f0a1";
-@fa-var-bullseye: "\f140";
-@fa-var-bus: "\f207";
-@fa-var-buysellads: "\f20d";
-@fa-var-cab: "\f1ba";
-@fa-var-calculator: "\f1ec";
-@fa-var-calendar: "\f073";
-@fa-var-calendar-check-o: "\f274";
-@fa-var-calendar-minus-o: "\f272";
-@fa-var-calendar-o: "\f133";
-@fa-var-calendar-plus-o: "\f271";
-@fa-var-calendar-times-o: "\f273";
-@fa-var-camera: "\f030";
-@fa-var-camera-retro: "\f083";
-@fa-var-car: "\f1b9";
-@fa-var-caret-down: "\f0d7";
-@fa-var-caret-left: "\f0d9";
-@fa-var-caret-right: "\f0da";
-@fa-var-caret-square-o-down: "\f150";
-@fa-var-caret-square-o-left: "\f191";
-@fa-var-caret-square-o-right: "\f152";
-@fa-var-caret-square-o-up: "\f151";
-@fa-var-caret-up: "\f0d8";
-@fa-var-cart-arrow-down: "\f218";
-@fa-var-cart-plus: "\f217";
-@fa-var-cc: "\f20a";
-@fa-var-cc-amex: "\f1f3";
-@fa-var-cc-diners-club: "\f24c";
-@fa-var-cc-discover: "\f1f2";
-@fa-var-cc-jcb: "\f24b";
-@fa-var-cc-mastercard: "\f1f1";
-@fa-var-cc-paypal: "\f1f4";
-@fa-var-cc-stripe: "\f1f5";
-@fa-var-cc-visa: "\f1f0";
-@fa-var-certificate: "\f0a3";
-@fa-var-chain: "\f0c1";
-@fa-var-chain-broken: "\f127";
-@fa-var-check: "\f00c";
-@fa-var-check-circle: "\f058";
-@fa-var-check-circle-o: "\f05d";
-@fa-var-check-square: "\f14a";
-@fa-var-check-square-o: "\f046";
-@fa-var-chevron-circle-down: "\f13a";
-@fa-var-chevron-circle-left: "\f137";
-@fa-var-chevron-circle-right: "\f138";
-@fa-var-chevron-circle-up: "\f139";
-@fa-var-chevron-down: "\f078";
-@fa-var-chevron-left: "\f053";
-@fa-var-chevron-right: "\f054";
-@fa-var-chevron-up: "\f077";
-@fa-var-child: "\f1ae";
-@fa-var-chrome: "\f268";
-@fa-var-circle: "\f111";
-@fa-var-circle-o: "\f10c";
-@fa-var-circle-o-notch: "\f1ce";
-@fa-var-circle-thin: "\f1db";
-@fa-var-clipboard: "\f0ea";
-@fa-var-clock-o: "\f017";
-@fa-var-clone: "\f24d";
-@fa-var-close: "\f00d";
-@fa-var-cloud: "\f0c2";
-@fa-var-cloud-download: "\f0ed";
-@fa-var-cloud-upload: "\f0ee";
-@fa-var-cny: "\f157";
-@fa-var-code: "\f121";
-@fa-var-code-fork: "\f126";
-@fa-var-codepen: "\f1cb";
-@fa-var-coffee: "\f0f4";
-@fa-var-cog: "\f013";
-@fa-var-cogs: "\f085";
-@fa-var-columns: "\f0db";
-@fa-var-comment: "\f075";
-@fa-var-comment-o: "\f0e5";
-@fa-var-commenting: "\f27a";
-@fa-var-commenting-o: "\f27b";
-@fa-var-comments: "\f086";
-@fa-var-comments-o: "\f0e6";
-@fa-var-compass: "\f14e";
-@fa-var-compress: "\f066";
-@fa-var-connectdevelop: "\f20e";
-@fa-var-contao: "\f26d";
-@fa-var-copy: "\f0c5";
-@fa-var-copyright: "\f1f9";
-@fa-var-creative-commons: "\f25e";
-@fa-var-credit-card: "\f09d";
-@fa-var-crop: "\f125";
-@fa-var-crosshairs: "\f05b";
-@fa-var-css3: "\f13c";
-@fa-var-cube: "\f1b2";
-@fa-var-cubes: "\f1b3";
-@fa-var-cut: "\f0c4";
-@fa-var-cutlery: "\f0f5";
-@fa-var-dashboard: "\f0e4";
-@fa-var-dashcube: "\f210";
-@fa-var-database: "\f1c0";
-@fa-var-dedent: "\f03b";
-@fa-var-delicious: "\f1a5";
-@fa-var-desktop: "\f108";
-@fa-var-deviantart: "\f1bd";
-@fa-var-diamond: "\f219";
-@fa-var-digg: "\f1a6";
-@fa-var-dollar: "\f155";
-@fa-var-dot-circle-o: "\f192";
-@fa-var-download: "\f019";
-@fa-var-dribbble: "\f17d";
-@fa-var-dropbox: "\f16b";
-@fa-var-drupal: "\f1a9";
-@fa-var-edit: "\f044";
-@fa-var-eject: "\f052";
-@fa-var-ellipsis-h: "\f141";
-@fa-var-ellipsis-v: "\f142";
-@fa-var-empire: "\f1d1";
-@fa-var-envelope: "\f0e0";
-@fa-var-envelope-o: "\f003";
-@fa-var-envelope-square: "\f199";
-@fa-var-eraser: "\f12d";
-@fa-var-eur: "\f153";
-@fa-var-euro: "\f153";
-@fa-var-exchange: "\f0ec";
-@fa-var-exclamation: "\f12a";
-@fa-var-exclamation-circle: "\f06a";
-@fa-var-exclamation-triangle: "\f071";
-@fa-var-expand: "\f065";
-@fa-var-expeditedssl: "\f23e";
-@fa-var-external-link: "\f08e";
-@fa-var-external-link-square: "\f14c";
-@fa-var-eye: "\f06e";
-@fa-var-eye-slash: "\f070";
-@fa-var-eyedropper: "\f1fb";
-@fa-var-facebook: "\f09a";
-@fa-var-facebook-f: "\f09a";
-@fa-var-facebook-official: "\f230";
-@fa-var-facebook-square: "\f082";
-@fa-var-fast-backward: "\f049";
-@fa-var-fast-forward: "\f050";
-@fa-var-fax: "\f1ac";
-@fa-var-feed: "\f09e";
-@fa-var-female: "\f182";
-@fa-var-fighter-jet: "\f0fb";
-@fa-var-file: "\f15b";
-@fa-var-file-archive-o: "\f1c6";
-@fa-var-file-audio-o: "\f1c7";
-@fa-var-file-code-o: "\f1c9";
-@fa-var-file-excel-o: "\f1c3";
-@fa-var-file-image-o: "\f1c5";
-@fa-var-file-movie-o: "\f1c8";
-@fa-var-file-o: "\f016";
-@fa-var-file-pdf-o: "\f1c1";
-@fa-var-file-photo-o: "\f1c5";
-@fa-var-file-picture-o: "\f1c5";
-@fa-var-file-powerpoint-o: "\f1c4";
-@fa-var-file-sound-o: "\f1c7";
-@fa-var-file-text: "\f15c";
-@fa-var-file-text-o: "\f0f6";
-@fa-var-file-video-o: "\f1c8";
-@fa-var-file-word-o: "\f1c2";
-@fa-var-file-zip-o: "\f1c6";
-@fa-var-files-o: "\f0c5";
-@fa-var-film: "\f008";
-@fa-var-filter: "\f0b0";
-@fa-var-fire: "\f06d";
-@fa-var-fire-extinguisher: "\f134";
-@fa-var-firefox: "\f269";
-@fa-var-flag: "\f024";
-@fa-var-flag-checkered: "\f11e";
-@fa-var-flag-o: "\f11d";
-@fa-var-flash: "\f0e7";
-@fa-var-flask: "\f0c3";
-@fa-var-flickr: "\f16e";
-@fa-var-floppy-o: "\f0c7";
-@fa-var-folder: "\f07b";
-@fa-var-folder-o: "\f114";
-@fa-var-folder-open: "\f07c";
-@fa-var-folder-open-o: "\f115";
-@fa-var-font: "\f031";
-@fa-var-fonticons: "\f280";
-@fa-var-forumbee: "\f211";
-@fa-var-forward: "\f04e";
-@fa-var-foursquare: "\f180";
-@fa-var-frown-o: "\f119";
-@fa-var-futbol-o: "\f1e3";
-@fa-var-gamepad: "\f11b";
-@fa-var-gavel: "\f0e3";
-@fa-var-gbp: "\f154";
-@fa-var-ge: "\f1d1";
-@fa-var-gear: "\f013";
-@fa-var-gears: "\f085";
-@fa-var-genderless: "\f22d";
-@fa-var-get-pocket: "\f265";
-@fa-var-gg: "\f260";
-@fa-var-gg-circle: "\f261";
-@fa-var-gift: "\f06b";
-@fa-var-git: "\f1d3";
-@fa-var-git-square: "\f1d2";
-@fa-var-github: "\f09b";
-@fa-var-github-alt: "\f113";
-@fa-var-github-square: "\f092";
-@fa-var-gittip: "\f184";
-@fa-var-glass: "\f000";
-@fa-var-globe: "\f0ac";
-@fa-var-google: "\f1a0";
-@fa-var-google-plus: "\f0d5";
-@fa-var-google-plus-square: "\f0d4";
-@fa-var-google-wallet: "\f1ee";
-@fa-var-graduation-cap: "\f19d";
-@fa-var-gratipay: "\f184";
-@fa-var-group: "\f0c0";
-@fa-var-h-square: "\f0fd";
-@fa-var-hacker-news: "\f1d4";
-@fa-var-hand-grab-o: "\f255";
-@fa-var-hand-lizard-o: "\f258";
-@fa-var-hand-o-down: "\f0a7";
-@fa-var-hand-o-left: "\f0a5";
-@fa-var-hand-o-right: "\f0a4";
-@fa-var-hand-o-up: "\f0a6";
-@fa-var-hand-paper-o: "\f256";
-@fa-var-hand-peace-o: "\f25b";
-@fa-var-hand-pointer-o: "\f25a";
-@fa-var-hand-rock-o: "\f255";
-@fa-var-hand-scissors-o: "\f257";
-@fa-var-hand-spock-o: "\f259";
-@fa-var-hand-stop-o: "\f256";
-@fa-var-hdd-o: "\f0a0";
-@fa-var-header: "\f1dc";
-@fa-var-headphones: "\f025";
-@fa-var-heart: "\f004";
-@fa-var-heart-o: "\f08a";
-@fa-var-heartbeat: "\f21e";
-@fa-var-history: "\f1da";
-@fa-var-home: "\f015";
-@fa-var-hospital-o: "\f0f8";
-@fa-var-hotel: "\f236";
-@fa-var-hourglass: "\f254";
-@fa-var-hourglass-1: "\f251";
-@fa-var-hourglass-2: "\f252";
-@fa-var-hourglass-3: "\f253";
-@fa-var-hourglass-end: "\f253";
-@fa-var-hourglass-half: "\f252";
-@fa-var-hourglass-o: "\f250";
-@fa-var-hourglass-start: "\f251";
-@fa-var-houzz: "\f27c";
-@fa-var-html5: "\f13b";
-@fa-var-i-cursor: "\f246";
-@fa-var-ils: "\f20b";
-@fa-var-image: "\f03e";
-@fa-var-inbox: "\f01c";
-@fa-var-indent: "\f03c";
-@fa-var-industry: "\f275";
-@fa-var-info: "\f129";
-@fa-var-info-circle: "\f05a";
-@fa-var-inr: "\f156";
-@fa-var-instagram: "\f16d";
-@fa-var-institution: "\f19c";
-@fa-var-internet-explorer: "\f26b";
-@fa-var-intersex: "\f224";
-@fa-var-ioxhost: "\f208";
-@fa-var-italic: "\f033";
-@fa-var-joomla: "\f1aa";
-@fa-var-jpy: "\f157";
-@fa-var-jsfiddle: "\f1cc";
-@fa-var-key: "\f084";
-@fa-var-keyboard-o: "\f11c";
-@fa-var-krw: "\f159";
-@fa-var-language: "\f1ab";
-@fa-var-laptop: "\f109";
-@fa-var-lastfm: "\f202";
-@fa-var-lastfm-square: "\f203";
-@fa-var-leaf: "\f06c";
-@fa-var-leanpub: "\f212";
-@fa-var-legal: "\f0e3";
-@fa-var-lemon-o: "\f094";
-@fa-var-level-down: "\f149";
-@fa-var-level-up: "\f148";
-@fa-var-life-bouy: "\f1cd";
-@fa-var-life-buoy: "\f1cd";
-@fa-var-life-ring: "\f1cd";
-@fa-var-life-saver: "\f1cd";
-@fa-var-lightbulb-o: "\f0eb";
-@fa-var-line-chart: "\f201";
-@fa-var-link: "\f0c1";
-@fa-var-linkedin: "\f0e1";
-@fa-var-linkedin-square: "\f08c";
-@fa-var-linux: "\f17c";
-@fa-var-list: "\f03a";
-@fa-var-list-alt: "\f022";
-@fa-var-list-ol: "\f0cb";
-@fa-var-list-ul: "\f0ca";
-@fa-var-location-arrow: "\f124";
-@fa-var-lock: "\f023";
-@fa-var-long-arrow-down: "\f175";
-@fa-var-long-arrow-left: "\f177";
-@fa-var-long-arrow-right: "\f178";
-@fa-var-long-arrow-up: "\f176";
-@fa-var-magic: "\f0d0";
-@fa-var-magnet: "\f076";
-@fa-var-mail-forward: "\f064";
-@fa-var-mail-reply: "\f112";
-@fa-var-mail-reply-all: "\f122";
-@fa-var-male: "\f183";
-@fa-var-map: "\f279";
-@fa-var-map-marker: "\f041";
-@fa-var-map-o: "\f278";
-@fa-var-map-pin: "\f276";
-@fa-var-map-signs: "\f277";
-@fa-var-mars: "\f222";
-@fa-var-mars-double: "\f227";
-@fa-var-mars-stroke: "\f229";
-@fa-var-mars-stroke-h: "\f22b";
-@fa-var-mars-stroke-v: "\f22a";
-@fa-var-maxcdn: "\f136";
-@fa-var-meanpath: "\f20c";
-@fa-var-medium: "\f23a";
-@fa-var-medkit: "\f0fa";
-@fa-var-meh-o: "\f11a";
-@fa-var-mercury: "\f223";
-@fa-var-microphone: "\f130";
-@fa-var-microphone-slash: "\f131";
-@fa-var-minus: "\f068";
-@fa-var-minus-circle: "\f056";
-@fa-var-minus-square: "\f146";
-@fa-var-minus-square-o: "\f147";
-@fa-var-mobile: "\f10b";
-@fa-var-mobile-phone: "\f10b";
-@fa-var-money: "\f0d6";
-@fa-var-moon-o: "\f186";
-@fa-var-mortar-board: "\f19d";
-@fa-var-motorcycle: "\f21c";
-@fa-var-mouse-pointer: "\f245";
-@fa-var-music: "\f001";
-@fa-var-navicon: "\f0c9";
-@fa-var-neuter: "\f22c";
-@fa-var-newspaper-o: "\f1ea";
-@fa-var-object-group: "\f247";
-@fa-var-object-ungroup: "\f248";
-@fa-var-odnoklassniki: "\f263";
-@fa-var-odnoklassniki-square: "\f264";
-@fa-var-opencart: "\f23d";
-@fa-var-openid: "\f19b";
-@fa-var-opera: "\f26a";
-@fa-var-optin-monster: "\f23c";
-@fa-var-outdent: "\f03b";
-@fa-var-pagelines: "\f18c";
-@fa-var-paint-brush: "\f1fc";
-@fa-var-paper-plane: "\f1d8";
-@fa-var-paper-plane-o: "\f1d9";
-@fa-var-paperclip: "\f0c6";
-@fa-var-paragraph: "\f1dd";
-@fa-var-paste: "\f0ea";
-@fa-var-pause: "\f04c";
-@fa-var-paw: "\f1b0";
-@fa-var-paypal: "\f1ed";
-@fa-var-pencil: "\f040";
-@fa-var-pencil-square: "\f14b";
-@fa-var-pencil-square-o: "\f044";
-@fa-var-phone: "\f095";
-@fa-var-phone-square: "\f098";
-@fa-var-photo: "\f03e";
-@fa-var-picture-o: "\f03e";
-@fa-var-pie-chart: "\f200";
-@fa-var-pied-piper: "\f1a7";
-@fa-var-pied-piper-alt: "\f1a8";
-@fa-var-pinterest: "\f0d2";
-@fa-var-pinterest-p: "\f231";
-@fa-var-pinterest-square: "\f0d3";
-@fa-var-plane: "\f072";
-@fa-var-play: "\f04b";
-@fa-var-play-circle: "\f144";
-@fa-var-play-circle-o: "\f01d";
-@fa-var-plug: "\f1e6";
-@fa-var-plus: "\f067";
-@fa-var-plus-circle: "\f055";
-@fa-var-plus-square: "\f0fe";
-@fa-var-plus-square-o: "\f196";
-@fa-var-power-off: "\f011";
-@fa-var-print: "\f02f";
-@fa-var-puzzle-piece: "\f12e";
-@fa-var-qq: "\f1d6";
-@fa-var-qrcode: "\f029";
-@fa-var-question: "\f128";
-@fa-var-question-circle: "\f059";
-@fa-var-quote-left: "\f10d";
-@fa-var-quote-right: "\f10e";
-@fa-var-ra: "\f1d0";
-@fa-var-random: "\f074";
-@fa-var-rebel: "\f1d0";
-@fa-var-recycle: "\f1b8";
-@fa-var-reddit: "\f1a1";
-@fa-var-reddit-square: "\f1a2";
-@fa-var-refresh: "\f021";
-@fa-var-registered: "\f25d";
-@fa-var-remove: "\f00d";
-@fa-var-renren: "\f18b";
-@fa-var-reorder: "\f0c9";
-@fa-var-repeat: "\f01e";
-@fa-var-reply: "\f112";
-@fa-var-reply-all: "\f122";
-@fa-var-retweet: "\f079";
-@fa-var-rmb: "\f157";
-@fa-var-road: "\f018";
-@fa-var-rocket: "\f135";
-@fa-var-rotate-left: "\f0e2";
-@fa-var-rotate-right: "\f01e";
-@fa-var-rouble: "\f158";
-@fa-var-rss: "\f09e";
-@fa-var-rss-square: "\f143";
-@fa-var-rub: "\f158";
-@fa-var-ruble: "\f158";
-@fa-var-rupee: "\f156";
-@fa-var-safari: "\f267";
-@fa-var-save: "\f0c7";
-@fa-var-scissors: "\f0c4";
-@fa-var-search: "\f002";
-@fa-var-search-minus: "\f010";
-@fa-var-search-plus: "\f00e";
-@fa-var-sellsy: "\f213";
-@fa-var-send: "\f1d8";
-@fa-var-send-o: "\f1d9";
-@fa-var-server: "\f233";
-@fa-var-share: "\f064";
-@fa-var-share-alt: "\f1e0";
-@fa-var-share-alt-square: "\f1e1";
-@fa-var-share-square: "\f14d";
-@fa-var-share-square-o: "\f045";
-@fa-var-shekel: "\f20b";
-@fa-var-sheqel: "\f20b";
-@fa-var-shield: "\f132";
-@fa-var-ship: "\f21a";
-@fa-var-shirtsinbulk: "\f214";
-@fa-var-shopping-cart: "\f07a";
-@fa-var-sign-in: "\f090";
-@fa-var-sign-out: "\f08b";
-@fa-var-signal: "\f012";
-@fa-var-simplybuilt: "\f215";
-@fa-var-sitemap: "\f0e8";
-@fa-var-skyatlas: "\f216";
-@fa-var-skype: "\f17e";
-@fa-var-slack: "\f198";
-@fa-var-sliders: "\f1de";
-@fa-var-slideshare: "\f1e7";
-@fa-var-smile-o: "\f118";
-@fa-var-soccer-ball-o: "\f1e3";
-@fa-var-sort: "\f0dc";
-@fa-var-sort-alpha-asc: "\f15d";
-@fa-var-sort-alpha-desc: "\f15e";
-@fa-var-sort-amount-asc: "\f160";
-@fa-var-sort-amount-desc: "\f161";
-@fa-var-sort-asc: "\f0de";
-@fa-var-sort-desc: "\f0dd";
-@fa-var-sort-down: "\f0dd";
-@fa-var-sort-numeric-asc: "\f162";
-@fa-var-sort-numeric-desc: "\f163";
-@fa-var-sort-up: "\f0de";
-@fa-var-soundcloud: "\f1be";
-@fa-var-space-shuttle: "\f197";
-@fa-var-spinner: "\f110";
-@fa-var-spoon: "\f1b1";
-@fa-var-spotify: "\f1bc";
-@fa-var-square: "\f0c8";
-@fa-var-square-o: "\f096";
-@fa-var-stack-exchange: "\f18d";
-@fa-var-stack-overflow: "\f16c";
-@fa-var-star: "\f005";
-@fa-var-star-half: "\f089";
-@fa-var-star-half-empty: "\f123";
-@fa-var-star-half-full: "\f123";
-@fa-var-star-half-o: "\f123";
-@fa-var-star-o: "\f006";
-@fa-var-steam: "\f1b6";
-@fa-var-steam-square: "\f1b7";
-@fa-var-step-backward: "\f048";
-@fa-var-step-forward: "\f051";
-@fa-var-stethoscope: "\f0f1";
-@fa-var-sticky-note: "\f249";
-@fa-var-sticky-note-o: "\f24a";
-@fa-var-stop: "\f04d";
-@fa-var-street-view: "\f21d";
-@fa-var-strikethrough: "\f0cc";
-@fa-var-stumbleupon: "\f1a4";
-@fa-var-stumbleupon-circle: "\f1a3";
-@fa-var-subscript: "\f12c";
-@fa-var-subway: "\f239";
-@fa-var-suitcase: "\f0f2";
-@fa-var-sun-o: "\f185";
-@fa-var-superscript: "\f12b";
-@fa-var-support: "\f1cd";
-@fa-var-table: "\f0ce";
-@fa-var-tablet: "\f10a";
-@fa-var-tachometer: "\f0e4";
-@fa-var-tag: "\f02b";
-@fa-var-tags: "\f02c";
-@fa-var-tasks: "\f0ae";
-@fa-var-taxi: "\f1ba";
-@fa-var-television: "\f26c";
-@fa-var-tencent-weibo: "\f1d5";
-@fa-var-terminal: "\f120";
-@fa-var-text-height: "\f034";
-@fa-var-text-width: "\f035";
-@fa-var-th: "\f00a";
-@fa-var-th-large: "\f009";
-@fa-var-th-list: "\f00b";
-@fa-var-thumb-tack: "\f08d";
-@fa-var-thumbs-down: "\f165";
-@fa-var-thumbs-o-down: "\f088";
-@fa-var-thumbs-o-up: "\f087";
-@fa-var-thumbs-up: "\f164";
-@fa-var-ticket: "\f145";
-@fa-var-times: "\f00d";
-@fa-var-times-circle: "\f057";
-@fa-var-times-circle-o: "\f05c";
-@fa-var-tint: "\f043";
-@fa-var-toggle-down: "\f150";
-@fa-var-toggle-left: "\f191";
-@fa-var-toggle-off: "\f204";
-@fa-var-toggle-on: "\f205";
-@fa-var-toggle-right: "\f152";
-@fa-var-toggle-up: "\f151";
-@fa-var-trademark: "\f25c";
-@fa-var-train: "\f238";
-@fa-var-transgender: "\f224";
-@fa-var-transgender-alt: "\f225";
-@fa-var-trash: "\f1f8";
-@fa-var-trash-o: "\f014";
-@fa-var-tree: "\f1bb";
-@fa-var-trello: "\f181";
-@fa-var-tripadvisor: "\f262";
-@fa-var-trophy: "\f091";
-@fa-var-truck: "\f0d1";
-@fa-var-try: "\f195";
-@fa-var-tty: "\f1e4";
-@fa-var-tumblr: "\f173";
-@fa-var-tumblr-square: "\f174";
-@fa-var-turkish-lira: "\f195";
-@fa-var-tv: "\f26c";
-@fa-var-twitch: "\f1e8";
-@fa-var-twitter: "\f099";
-@fa-var-twitter-square: "\f081";
-@fa-var-umbrella: "\f0e9";
-@fa-var-underline: "\f0cd";
-@fa-var-undo: "\f0e2";
-@fa-var-university: "\f19c";
-@fa-var-unlink: "\f127";
-@fa-var-unlock: "\f09c";
-@fa-var-unlock-alt: "\f13e";
-@fa-var-unsorted: "\f0dc";
-@fa-var-upload: "\f093";
-@fa-var-usd: "\f155";
-@fa-var-user: "\f007";
-@fa-var-user-md: "\f0f0";
-@fa-var-user-plus: "\f234";
-@fa-var-user-secret: "\f21b";
-@fa-var-user-times: "\f235";
-@fa-var-users: "\f0c0";
-@fa-var-venus: "\f221";
-@fa-var-venus-double: "\f226";
-@fa-var-venus-mars: "\f228";
-@fa-var-viacoin: "\f237";
-@fa-var-video-camera: "\f03d";
-@fa-var-vimeo: "\f27d";
-@fa-var-vimeo-square: "\f194";
-@fa-var-vine: "\f1ca";
-@fa-var-vk: "\f189";
-@fa-var-volume-down: "\f027";
-@fa-var-volume-off: "\f026";
-@fa-var-volume-up: "\f028";
-@fa-var-warning: "\f071";
-@fa-var-wechat: "\f1d7";
-@fa-var-weibo: "\f18a";
-@fa-var-weixin: "\f1d7";
-@fa-var-whatsapp: "\f232";
-@fa-var-wheelchair: "\f193";
-@fa-var-wifi: "\f1eb";
-@fa-var-wikipedia-w: "\f266";
-@fa-var-windows: "\f17a";
-@fa-var-won: "\f159";
-@fa-var-wordpress: "\f19a";
-@fa-var-wrench: "\f0ad";
-@fa-var-xing: "\f168";
-@fa-var-xing-square: "\f169";
-@fa-var-y-combinator: "\f23b";
-@fa-var-y-combinator-square: "\f1d4";
-@fa-var-yahoo: "\f19e";
-@fa-var-yc: "\f23b";
-@fa-var-yc-square: "\f1d4";
-@fa-var-yelp: "\f1e9";
-@fa-var-yen: "\f157";
-@fa-var-youtube: "\f167";
-@fa-var-youtube-play: "\f16a";
-@fa-var-youtube-square: "\f166";
-
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_animated.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_animated.scss
deleted file mode 100644
index 8a020db..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_animated.scss
+++ /dev/null
@@ -1,34 +0,0 @@
-// Spinning Icons
-// --------------------------
-
-.#{$fa-css-prefix}-spin {
- -webkit-animation: fa-spin 2s infinite linear;
- animation: fa-spin 2s infinite linear;
-}
-
-.#{$fa-css-prefix}-pulse {
- -webkit-animation: fa-spin 1s infinite steps(8);
- animation: fa-spin 1s infinite steps(8);
-}
-
-@-webkit-keyframes fa-spin {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(359deg);
- transform: rotate(359deg);
- }
-}
-
-@keyframes fa-spin {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(359deg);
- transform: rotate(359deg);
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_bordered-pulled.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_bordered-pulled.scss
deleted file mode 100644
index d4b85a0..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_bordered-pulled.scss
+++ /dev/null
@@ -1,25 +0,0 @@
-// Bordered & Pulled
-// -------------------------
-
-.#{$fa-css-prefix}-border {
- padding: .2em .25em .15em;
- border: solid .08em $fa-border-color;
- border-radius: .1em;
-}
-
-.#{$fa-css-prefix}-pull-left { float: left; }
-.#{$fa-css-prefix}-pull-right { float: right; }
-
-.#{$fa-css-prefix} {
- &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
- &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
-}
-
-/* Deprecated as of 4.4.0 */
-.pull-right { float: right; }
-.pull-left { float: left; }
-
-.#{$fa-css-prefix} {
- &.pull-left { margin-right: .3em; }
- &.pull-right { margin-left: .3em; }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_core.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_core.scss
deleted file mode 100644
index 7425ef8..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_core.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-// Base Class Definition
-// -------------------------
-
-.#{$fa-css-prefix} {
- display: inline-block;
- font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
- font-size: inherit; // can't have font-size inherit on line above, so need to override
- text-rendering: auto; // optimizelegibility throws things off #1094
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_fixed-width.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_fixed-width.scss
deleted file mode 100644
index b221c98..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_fixed-width.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-// Fixed Width Icons
-// -------------------------
-.#{$fa-css-prefix}-fw {
- width: (18em / 14);
- text-align: center;
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_icons.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_icons.scss
deleted file mode 100644
index 62d9767..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_icons.scss
+++ /dev/null
@@ -1,677 +0,0 @@
-/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
- readers do not read off random characters that represent icons */
-
-.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }
-.#{$fa-css-prefix}-music:before { content: $fa-var-music; }
-.#{$fa-css-prefix}-search:before { content: $fa-var-search; }
-.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }
-.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }
-.#{$fa-css-prefix}-star:before { content: $fa-var-star; }
-.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }
-.#{$fa-css-prefix}-user:before { content: $fa-var-user; }
-.#{$fa-css-prefix}-film:before { content: $fa-var-film; }
-.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }
-.#{$fa-css-prefix}-th:before { content: $fa-var-th; }
-.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }
-.#{$fa-css-prefix}-check:before { content: $fa-var-check; }
-.#{$fa-css-prefix}-remove:before,
-.#{$fa-css-prefix}-close:before,
-.#{$fa-css-prefix}-times:before { content: $fa-var-times; }
-.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }
-.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }
-.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }
-.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }
-.#{$fa-css-prefix}-gear:before,
-.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }
-.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }
-.#{$fa-css-prefix}-home:before { content: $fa-var-home; }
-.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }
-.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }
-.#{$fa-css-prefix}-road:before { content: $fa-var-road; }
-.#{$fa-css-prefix}-download:before { content: $fa-var-download; }
-.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }
-.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }
-.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }
-.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }
-.#{$fa-css-prefix}-rotate-right:before,
-.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }
-.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }
-.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }
-.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }
-.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }
-.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }
-.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }
-.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }
-.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }
-.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }
-.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }
-.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }
-.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }
-.#{$fa-css-prefix}-book:before { content: $fa-var-book; }
-.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }
-.#{$fa-css-prefix}-print:before { content: $fa-var-print; }
-.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }
-.#{$fa-css-prefix}-font:before { content: $fa-var-font; }
-.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }
-.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }
-.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }
-.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }
-.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }
-.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }
-.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }
-.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }
-.#{$fa-css-prefix}-list:before { content: $fa-var-list; }
-.#{$fa-css-prefix}-dedent:before,
-.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }
-.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }
-.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }
-.#{$fa-css-prefix}-photo:before,
-.#{$fa-css-prefix}-image:before,
-.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }
-.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }
-.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }
-.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }
-.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }
-.#{$fa-css-prefix}-edit:before,
-.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }
-.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }
-.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }
-.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }
-.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }
-.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }
-.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }
-.#{$fa-css-prefix}-play:before { content: $fa-var-play; }
-.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }
-.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }
-.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }
-.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }
-.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }
-.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }
-.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }
-.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }
-.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }
-.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }
-.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }
-.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }
-.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }
-.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }
-.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }
-.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }
-.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }
-.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }
-.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }
-.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }
-.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }
-.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }
-.#{$fa-css-prefix}-mail-forward:before,
-.#{$fa-css-prefix}-share:before { content: $fa-var-share; }
-.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }
-.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }
-.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }
-.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }
-.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }
-.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }
-.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }
-.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }
-.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }
-.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }
-.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }
-.#{$fa-css-prefix}-warning:before,
-.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }
-.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }
-.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }
-.#{$fa-css-prefix}-random:before { content: $fa-var-random; }
-.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }
-.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }
-.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }
-.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }
-.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }
-.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }
-.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }
-.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }
-.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }
-.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }
-.#{$fa-css-prefix}-bar-chart-o:before,
-.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }
-.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }
-.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }
-.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }
-.#{$fa-css-prefix}-key:before { content: $fa-var-key; }
-.#{$fa-css-prefix}-gears:before,
-.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }
-.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }
-.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }
-.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }
-.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }
-.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }
-.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }
-.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }
-.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }
-.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }
-.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }
-.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }
-.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }
-.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }
-.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }
-.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }
-.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }
-.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }
-.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }
-.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }
-.#{$fa-css-prefix}-facebook-f:before,
-.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }
-.#{$fa-css-prefix}-github:before { content: $fa-var-github; }
-.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }
-.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }
-.#{$fa-css-prefix}-feed:before,
-.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }
-.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }
-.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }
-.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }
-.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }
-.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }
-.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }
-.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }
-.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }
-.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }
-.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }
-.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }
-.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }
-.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }
-.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }
-.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }
-.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }
-.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }
-.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }
-.#{$fa-css-prefix}-group:before,
-.#{$fa-css-prefix}-users:before { content: $fa-var-users; }
-.#{$fa-css-prefix}-chain:before,
-.#{$fa-css-prefix}-link:before { content: $fa-var-link; }
-.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }
-.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }
-.#{$fa-css-prefix}-cut:before,
-.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }
-.#{$fa-css-prefix}-copy:before,
-.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }
-.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }
-.#{$fa-css-prefix}-save:before,
-.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }
-.#{$fa-css-prefix}-square:before { content: $fa-var-square; }
-.#{$fa-css-prefix}-navicon:before,
-.#{$fa-css-prefix}-reorder:before,
-.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }
-.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }
-.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }
-.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }
-.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }
-.#{$fa-css-prefix}-table:before { content: $fa-var-table; }
-.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }
-.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }
-.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }
-.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }
-.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }
-.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }
-.#{$fa-css-prefix}-money:before { content: $fa-var-money; }
-.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }
-.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }
-.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }
-.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }
-.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }
-.#{$fa-css-prefix}-unsorted:before,
-.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }
-.#{$fa-css-prefix}-sort-down:before,
-.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }
-.#{$fa-css-prefix}-sort-up:before,
-.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }
-.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }
-.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }
-.#{$fa-css-prefix}-rotate-left:before,
-.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }
-.#{$fa-css-prefix}-legal:before,
-.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }
-.#{$fa-css-prefix}-dashboard:before,
-.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }
-.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }
-.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }
-.#{$fa-css-prefix}-flash:before,
-.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }
-.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }
-.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }
-.#{$fa-css-prefix}-paste:before,
-.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }
-.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }
-.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }
-.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }
-.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }
-.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }
-.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }
-.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }
-.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }
-.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }
-.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }
-.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }
-.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }
-.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }
-.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }
-.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }
-.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }
-.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }
-.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }
-.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }
-.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }
-.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }
-.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }
-.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }
-.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }
-.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }
-.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }
-.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }
-.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }
-.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }
-.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }
-.#{$fa-css-prefix}-mobile-phone:before,
-.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }
-.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }
-.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }
-.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }
-.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }
-.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }
-.#{$fa-css-prefix}-mail-reply:before,
-.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }
-.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }
-.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }
-.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }
-.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }
-.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }
-.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }
-.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }
-.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }
-.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }
-.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }
-.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }
-.#{$fa-css-prefix}-code:before { content: $fa-var-code; }
-.#{$fa-css-prefix}-mail-reply-all:before,
-.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }
-.#{$fa-css-prefix}-star-half-empty:before,
-.#{$fa-css-prefix}-star-half-full:before,
-.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }
-.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }
-.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }
-.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }
-.#{$fa-css-prefix}-unlink:before,
-.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }
-.#{$fa-css-prefix}-question:before { content: $fa-var-question; }
-.#{$fa-css-prefix}-info:before { content: $fa-var-info; }
-.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }
-.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }
-.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }
-.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }
-.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }
-.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }
-.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }
-.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }
-.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }
-.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }
-.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }
-.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }
-.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }
-.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }
-.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }
-.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }
-.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }
-.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }
-.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }
-.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }
-.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }
-.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }
-.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }
-.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }
-.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }
-.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }
-.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }
-.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }
-.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }
-.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }
-.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }
-.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }
-.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }
-.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }
-.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }
-.#{$fa-css-prefix}-toggle-down:before,
-.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }
-.#{$fa-css-prefix}-toggle-up:before,
-.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }
-.#{$fa-css-prefix}-toggle-right:before,
-.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }
-.#{$fa-css-prefix}-euro:before,
-.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }
-.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }
-.#{$fa-css-prefix}-dollar:before,
-.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }
-.#{$fa-css-prefix}-rupee:before,
-.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }
-.#{$fa-css-prefix}-cny:before,
-.#{$fa-css-prefix}-rmb:before,
-.#{$fa-css-prefix}-yen:before,
-.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }
-.#{$fa-css-prefix}-ruble:before,
-.#{$fa-css-prefix}-rouble:before,
-.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }
-.#{$fa-css-prefix}-won:before,
-.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }
-.#{$fa-css-prefix}-bitcoin:before,
-.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }
-.#{$fa-css-prefix}-file:before { content: $fa-var-file; }
-.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }
-.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }
-.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }
-.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }
-.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }
-.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }
-.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }
-.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }
-.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }
-.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }
-.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }
-.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }
-.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }
-.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }
-.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }
-.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }
-.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }
-.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }
-.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }
-.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }
-.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }
-.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }
-.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }
-.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }
-.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }
-.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }
-.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }
-.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }
-.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }
-.#{$fa-css-prefix}-android:before { content: $fa-var-android; }
-.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }
-.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }
-.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }
-.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }
-.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }
-.#{$fa-css-prefix}-female:before { content: $fa-var-female; }
-.#{$fa-css-prefix}-male:before { content: $fa-var-male; }
-.#{$fa-css-prefix}-gittip:before,
-.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }
-.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }
-.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }
-.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }
-.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }
-.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }
-.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }
-.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }
-.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }
-.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }
-.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }
-.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }
-.#{$fa-css-prefix}-toggle-left:before,
-.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }
-.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }
-.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }
-.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }
-.#{$fa-css-prefix}-turkish-lira:before,
-.#{$fa-css-prefix}-try:before { content: $fa-var-try; }
-.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }
-.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }
-.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }
-.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }
-.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }
-.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }
-.#{$fa-css-prefix}-institution:before,
-.#{$fa-css-prefix}-bank:before,
-.#{$fa-css-prefix}-university:before { content: $fa-var-university; }
-.#{$fa-css-prefix}-mortar-board:before,
-.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }
-.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }
-.#{$fa-css-prefix}-google:before { content: $fa-var-google; }
-.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }
-.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }
-.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }
-.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }
-.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }
-.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }
-.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }
-.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }
-.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }
-.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }
-.#{$fa-css-prefix}-language:before { content: $fa-var-language; }
-.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }
-.#{$fa-css-prefix}-building:before { content: $fa-var-building; }
-.#{$fa-css-prefix}-child:before { content: $fa-var-child; }
-.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }
-.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }
-.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }
-.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }
-.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }
-.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }
-.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }
-.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }
-.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }
-.#{$fa-css-prefix}-automobile:before,
-.#{$fa-css-prefix}-car:before { content: $fa-var-car; }
-.#{$fa-css-prefix}-cab:before,
-.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }
-.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }
-.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }
-.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }
-.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }
-.#{$fa-css-prefix}-database:before { content: $fa-var-database; }
-.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }
-.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }
-.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }
-.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }
-.#{$fa-css-prefix}-file-photo-o:before,
-.#{$fa-css-prefix}-file-picture-o:before,
-.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }
-.#{$fa-css-prefix}-file-zip-o:before,
-.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }
-.#{$fa-css-prefix}-file-sound-o:before,
-.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }
-.#{$fa-css-prefix}-file-movie-o:before,
-.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }
-.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }
-.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }
-.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }
-.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }
-.#{$fa-css-prefix}-life-bouy:before,
-.#{$fa-css-prefix}-life-buoy:before,
-.#{$fa-css-prefix}-life-saver:before,
-.#{$fa-css-prefix}-support:before,
-.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }
-.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }
-.#{$fa-css-prefix}-ra:before,
-.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }
-.#{$fa-css-prefix}-ge:before,
-.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }
-.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }
-.#{$fa-css-prefix}-git:before { content: $fa-var-git; }
-.#{$fa-css-prefix}-y-combinator-square:before,
-.#{$fa-css-prefix}-yc-square:before,
-.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }
-.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }
-.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }
-.#{$fa-css-prefix}-wechat:before,
-.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }
-.#{$fa-css-prefix}-send:before,
-.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }
-.#{$fa-css-prefix}-send-o:before,
-.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }
-.#{$fa-css-prefix}-history:before { content: $fa-var-history; }
-.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }
-.#{$fa-css-prefix}-header:before { content: $fa-var-header; }
-.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }
-.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }
-.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }
-.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }
-.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }
-.#{$fa-css-prefix}-soccer-ball-o:before,
-.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }
-.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }
-.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }
-.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }
-.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }
-.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }
-.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }
-.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }
-.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }
-.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }
-.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }
-.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }
-.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }
-.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }
-.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }
-.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }
-.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }
-.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }
-.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }
-.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }
-.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }
-.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }
-.#{$fa-css-prefix}-at:before { content: $fa-var-at; }
-.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }
-.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }
-.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }
-.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }
-.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }
-.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }
-.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }
-.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }
-.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }
-.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }
-.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }
-.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }
-.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }
-.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }
-.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }
-.#{$fa-css-prefix}-shekel:before,
-.#{$fa-css-prefix}-sheqel:before,
-.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }
-.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }
-.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }
-.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }
-.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }
-.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }
-.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }
-.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }
-.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }
-.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }
-.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }
-.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }
-.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }
-.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }
-.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }
-.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }
-.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }
-.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }
-.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }
-.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }
-.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }
-.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }
-.#{$fa-css-prefix}-intersex:before,
-.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }
-.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }
-.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }
-.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }
-.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }
-.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }
-.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }
-.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }
-.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }
-.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }
-.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }
-.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }
-.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }
-.#{$fa-css-prefix}-server:before { content: $fa-var-server; }
-.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }
-.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }
-.#{$fa-css-prefix}-hotel:before,
-.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }
-.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }
-.#{$fa-css-prefix}-train:before { content: $fa-var-train; }
-.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }
-.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }
-.#{$fa-css-prefix}-yc:before,
-.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }
-.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }
-.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }
-.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }
-.#{$fa-css-prefix}-battery-4:before,
-.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }
-.#{$fa-css-prefix}-battery-3:before,
-.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }
-.#{$fa-css-prefix}-battery-2:before,
-.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }
-.#{$fa-css-prefix}-battery-1:before,
-.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }
-.#{$fa-css-prefix}-battery-0:before,
-.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }
-.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }
-.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }
-.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }
-.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }
-.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }
-.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }
-.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }
-.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }
-.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }
-.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }
-.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }
-.#{$fa-css-prefix}-hourglass-1:before,
-.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }
-.#{$fa-css-prefix}-hourglass-2:before,
-.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }
-.#{$fa-css-prefix}-hourglass-3:before,
-.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }
-.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }
-.#{$fa-css-prefix}-hand-grab-o:before,
-.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }
-.#{$fa-css-prefix}-hand-stop-o:before,
-.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }
-.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }
-.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }
-.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }
-.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }
-.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }
-.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }
-.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }
-.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }
-.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }
-.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }
-.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }
-.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }
-.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }
-.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }
-.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }
-.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }
-.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }
-.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }
-.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }
-.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }
-.#{$fa-css-prefix}-tv:before,
-.#{$fa-css-prefix}-television:before { content: $fa-var-television; }
-.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }
-.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }
-.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }
-.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }
-.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }
-.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }
-.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }
-.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }
-.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }
-.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }
-.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }
-.#{$fa-css-prefix}-map:before { content: $fa-var-map; }
-.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }
-.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }
-.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }
-.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }
-.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }
-.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_larger.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_larger.scss
deleted file mode 100644
index 41e9a81..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_larger.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-// Icon Sizes
-// -------------------------
-
-/* makes the font 33% larger relative to the icon container */
-.#{$fa-css-prefix}-lg {
- font-size: (4em / 3);
- line-height: (3em / 4);
- vertical-align: -15%;
-}
-.#{$fa-css-prefix}-2x { font-size: 2em; }
-.#{$fa-css-prefix}-3x { font-size: 3em; }
-.#{$fa-css-prefix}-4x { font-size: 4em; }
-.#{$fa-css-prefix}-5x { font-size: 5em; }
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_list.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_list.scss
deleted file mode 100644
index 7d1e4d5..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_list.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-// List Icons
-// -------------------------
-
-.#{$fa-css-prefix}-ul {
- padding-left: 0;
- margin-left: $fa-li-width;
- list-style-type: none;
- > li { position: relative; }
-}
-.#{$fa-css-prefix}-li {
- position: absolute;
- left: -$fa-li-width;
- width: $fa-li-width;
- top: (2em / 14);
- text-align: center;
- &.#{$fa-css-prefix}-lg {
- left: -$fa-li-width + (4em / 14);
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_mixins.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_mixins.scss
deleted file mode 100644
index f96719b..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_mixins.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-// Mixins
-// --------------------------
-
-@mixin fa-icon() {
- display: inline-block;
- font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
- font-size: inherit; // can't have font-size inherit on line above, so need to override
- text-rendering: auto; // optimizelegibility throws things off #1094
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-
-}
-
-@mixin fa-icon-rotate($degrees, $rotation) {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
- -webkit-transform: rotate($degrees);
- -ms-transform: rotate($degrees);
- transform: rotate($degrees);
-}
-
-@mixin fa-icon-flip($horiz, $vert, $rotation) {
- filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
- -webkit-transform: scale($horiz, $vert);
- -ms-transform: scale($horiz, $vert);
- transform: scale($horiz, $vert);
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_path.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_path.scss
deleted file mode 100644
index bb457c2..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_path.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-/* FONT PATH
- * -------------------------- */
-
-@font-face {
- font-family: 'FontAwesome';
- src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
- src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
- url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
- url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
- url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
- url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
-// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
- font-weight: normal;
- font-style: normal;
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_rotated-flipped.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_rotated-flipped.scss
deleted file mode 100644
index a3558fd..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_rotated-flipped.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-// Rotated & Flipped Icons
-// -------------------------
-
-.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
-.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
-.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
-
-.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
-.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
-
-// Hook for IE8-9
-// -------------------------
-
-:root .#{$fa-css-prefix}-rotate-90,
-:root .#{$fa-css-prefix}-rotate-180,
-:root .#{$fa-css-prefix}-rotate-270,
-:root .#{$fa-css-prefix}-flip-horizontal,
-:root .#{$fa-css-prefix}-flip-vertical {
- filter: none;
-}
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_stacked.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_stacked.scss
deleted file mode 100644
index aef7403..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_stacked.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-// Stacked Icons
-// -------------------------
-
-.#{$fa-css-prefix}-stack {
- position: relative;
- display: inline-block;
- width: 2em;
- height: 2em;
- line-height: 2em;
- vertical-align: middle;
-}
-.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
- position: absolute;
- left: 0;
- width: 100%;
- text-align: center;
-}
-.#{$fa-css-prefix}-stack-1x { line-height: inherit; }
-.#{$fa-css-prefix}-stack-2x { font-size: 2em; }
-.#{$fa-css-prefix}-inverse { color: $fa-inverse; }
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_variables.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_variables.scss
deleted file mode 100644
index c10cd47..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/_variables.scss
+++ /dev/null
@@ -1,688 +0,0 @@
-// Variables
-// --------------------------
-
-$fa-font-path: "../fonts" !default;
-$fa-font-size-base: 14px !default;
-$fa-line-height-base: 1 !default;
-//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.4.0/fonts" !default; // for referencing Bootstrap CDN font files directly
-$fa-css-prefix: fa !default;
-$fa-version: "4.4.0" !default;
-$fa-border-color: #eee !default;
-$fa-inverse: #fff !default;
-$fa-li-width: (30em / 14) !default;
-
-$fa-var-500px: "\f26e";
-$fa-var-adjust: "\f042";
-$fa-var-adn: "\f170";
-$fa-var-align-center: "\f037";
-$fa-var-align-justify: "\f039";
-$fa-var-align-left: "\f036";
-$fa-var-align-right: "\f038";
-$fa-var-amazon: "\f270";
-$fa-var-ambulance: "\f0f9";
-$fa-var-anchor: "\f13d";
-$fa-var-android: "\f17b";
-$fa-var-angellist: "\f209";
-$fa-var-angle-double-down: "\f103";
-$fa-var-angle-double-left: "\f100";
-$fa-var-angle-double-right: "\f101";
-$fa-var-angle-double-up: "\f102";
-$fa-var-angle-down: "\f107";
-$fa-var-angle-left: "\f104";
-$fa-var-angle-right: "\f105";
-$fa-var-angle-up: "\f106";
-$fa-var-apple: "\f179";
-$fa-var-archive: "\f187";
-$fa-var-area-chart: "\f1fe";
-$fa-var-arrow-circle-down: "\f0ab";
-$fa-var-arrow-circle-left: "\f0a8";
-$fa-var-arrow-circle-o-down: "\f01a";
-$fa-var-arrow-circle-o-left: "\f190";
-$fa-var-arrow-circle-o-right: "\f18e";
-$fa-var-arrow-circle-o-up: "\f01b";
-$fa-var-arrow-circle-right: "\f0a9";
-$fa-var-arrow-circle-up: "\f0aa";
-$fa-var-arrow-down: "\f063";
-$fa-var-arrow-left: "\f060";
-$fa-var-arrow-right: "\f061";
-$fa-var-arrow-up: "\f062";
-$fa-var-arrows: "\f047";
-$fa-var-arrows-alt: "\f0b2";
-$fa-var-arrows-h: "\f07e";
-$fa-var-arrows-v: "\f07d";
-$fa-var-asterisk: "\f069";
-$fa-var-at: "\f1fa";
-$fa-var-automobile: "\f1b9";
-$fa-var-backward: "\f04a";
-$fa-var-balance-scale: "\f24e";
-$fa-var-ban: "\f05e";
-$fa-var-bank: "\f19c";
-$fa-var-bar-chart: "\f080";
-$fa-var-bar-chart-o: "\f080";
-$fa-var-barcode: "\f02a";
-$fa-var-bars: "\f0c9";
-$fa-var-battery-0: "\f244";
-$fa-var-battery-1: "\f243";
-$fa-var-battery-2: "\f242";
-$fa-var-battery-3: "\f241";
-$fa-var-battery-4: "\f240";
-$fa-var-battery-empty: "\f244";
-$fa-var-battery-full: "\f240";
-$fa-var-battery-half: "\f242";
-$fa-var-battery-quarter: "\f243";
-$fa-var-battery-three-quarters: "\f241";
-$fa-var-bed: "\f236";
-$fa-var-beer: "\f0fc";
-$fa-var-behance: "\f1b4";
-$fa-var-behance-square: "\f1b5";
-$fa-var-bell: "\f0f3";
-$fa-var-bell-o: "\f0a2";
-$fa-var-bell-slash: "\f1f6";
-$fa-var-bell-slash-o: "\f1f7";
-$fa-var-bicycle: "\f206";
-$fa-var-binoculars: "\f1e5";
-$fa-var-birthday-cake: "\f1fd";
-$fa-var-bitbucket: "\f171";
-$fa-var-bitbucket-square: "\f172";
-$fa-var-bitcoin: "\f15a";
-$fa-var-black-tie: "\f27e";
-$fa-var-bold: "\f032";
-$fa-var-bolt: "\f0e7";
-$fa-var-bomb: "\f1e2";
-$fa-var-book: "\f02d";
-$fa-var-bookmark: "\f02e";
-$fa-var-bookmark-o: "\f097";
-$fa-var-briefcase: "\f0b1";
-$fa-var-btc: "\f15a";
-$fa-var-bug: "\f188";
-$fa-var-building: "\f1ad";
-$fa-var-building-o: "\f0f7";
-$fa-var-bullhorn: "\f0a1";
-$fa-var-bullseye: "\f140";
-$fa-var-bus: "\f207";
-$fa-var-buysellads: "\f20d";
-$fa-var-cab: "\f1ba";
-$fa-var-calculator: "\f1ec";
-$fa-var-calendar: "\f073";
-$fa-var-calendar-check-o: "\f274";
-$fa-var-calendar-minus-o: "\f272";
-$fa-var-calendar-o: "\f133";
-$fa-var-calendar-plus-o: "\f271";
-$fa-var-calendar-times-o: "\f273";
-$fa-var-camera: "\f030";
-$fa-var-camera-retro: "\f083";
-$fa-var-car: "\f1b9";
-$fa-var-caret-down: "\f0d7";
-$fa-var-caret-left: "\f0d9";
-$fa-var-caret-right: "\f0da";
-$fa-var-caret-square-o-down: "\f150";
-$fa-var-caret-square-o-left: "\f191";
-$fa-var-caret-square-o-right: "\f152";
-$fa-var-caret-square-o-up: "\f151";
-$fa-var-caret-up: "\f0d8";
-$fa-var-cart-arrow-down: "\f218";
-$fa-var-cart-plus: "\f217";
-$fa-var-cc: "\f20a";
-$fa-var-cc-amex: "\f1f3";
-$fa-var-cc-diners-club: "\f24c";
-$fa-var-cc-discover: "\f1f2";
-$fa-var-cc-jcb: "\f24b";
-$fa-var-cc-mastercard: "\f1f1";
-$fa-var-cc-paypal: "\f1f4";
-$fa-var-cc-stripe: "\f1f5";
-$fa-var-cc-visa: "\f1f0";
-$fa-var-certificate: "\f0a3";
-$fa-var-chain: "\f0c1";
-$fa-var-chain-broken: "\f127";
-$fa-var-check: "\f00c";
-$fa-var-check-circle: "\f058";
-$fa-var-check-circle-o: "\f05d";
-$fa-var-check-square: "\f14a";
-$fa-var-check-square-o: "\f046";
-$fa-var-chevron-circle-down: "\f13a";
-$fa-var-chevron-circle-left: "\f137";
-$fa-var-chevron-circle-right: "\f138";
-$fa-var-chevron-circle-up: "\f139";
-$fa-var-chevron-down: "\f078";
-$fa-var-chevron-left: "\f053";
-$fa-var-chevron-right: "\f054";
-$fa-var-chevron-up: "\f077";
-$fa-var-child: "\f1ae";
-$fa-var-chrome: "\f268";
-$fa-var-circle: "\f111";
-$fa-var-circle-o: "\f10c";
-$fa-var-circle-o-notch: "\f1ce";
-$fa-var-circle-thin: "\f1db";
-$fa-var-clipboard: "\f0ea";
-$fa-var-clock-o: "\f017";
-$fa-var-clone: "\f24d";
-$fa-var-close: "\f00d";
-$fa-var-cloud: "\f0c2";
-$fa-var-cloud-download: "\f0ed";
-$fa-var-cloud-upload: "\f0ee";
-$fa-var-cny: "\f157";
-$fa-var-code: "\f121";
-$fa-var-code-fork: "\f126";
-$fa-var-codepen: "\f1cb";
-$fa-var-coffee: "\f0f4";
-$fa-var-cog: "\f013";
-$fa-var-cogs: "\f085";
-$fa-var-columns: "\f0db";
-$fa-var-comment: "\f075";
-$fa-var-comment-o: "\f0e5";
-$fa-var-commenting: "\f27a";
-$fa-var-commenting-o: "\f27b";
-$fa-var-comments: "\f086";
-$fa-var-comments-o: "\f0e6";
-$fa-var-compass: "\f14e";
-$fa-var-compress: "\f066";
-$fa-var-connectdevelop: "\f20e";
-$fa-var-contao: "\f26d";
-$fa-var-copy: "\f0c5";
-$fa-var-copyright: "\f1f9";
-$fa-var-creative-commons: "\f25e";
-$fa-var-credit-card: "\f09d";
-$fa-var-crop: "\f125";
-$fa-var-crosshairs: "\f05b";
-$fa-var-css3: "\f13c";
-$fa-var-cube: "\f1b2";
-$fa-var-cubes: "\f1b3";
-$fa-var-cut: "\f0c4";
-$fa-var-cutlery: "\f0f5";
-$fa-var-dashboard: "\f0e4";
-$fa-var-dashcube: "\f210";
-$fa-var-database: "\f1c0";
-$fa-var-dedent: "\f03b";
-$fa-var-delicious: "\f1a5";
-$fa-var-desktop: "\f108";
-$fa-var-deviantart: "\f1bd";
-$fa-var-diamond: "\f219";
-$fa-var-digg: "\f1a6";
-$fa-var-dollar: "\f155";
-$fa-var-dot-circle-o: "\f192";
-$fa-var-download: "\f019";
-$fa-var-dribbble: "\f17d";
-$fa-var-dropbox: "\f16b";
-$fa-var-drupal: "\f1a9";
-$fa-var-edit: "\f044";
-$fa-var-eject: "\f052";
-$fa-var-ellipsis-h: "\f141";
-$fa-var-ellipsis-v: "\f142";
-$fa-var-empire: "\f1d1";
-$fa-var-envelope: "\f0e0";
-$fa-var-envelope-o: "\f003";
-$fa-var-envelope-square: "\f199";
-$fa-var-eraser: "\f12d";
-$fa-var-eur: "\f153";
-$fa-var-euro: "\f153";
-$fa-var-exchange: "\f0ec";
-$fa-var-exclamation: "\f12a";
-$fa-var-exclamation-circle: "\f06a";
-$fa-var-exclamation-triangle: "\f071";
-$fa-var-expand: "\f065";
-$fa-var-expeditedssl: "\f23e";
-$fa-var-external-link: "\f08e";
-$fa-var-external-link-square: "\f14c";
-$fa-var-eye: "\f06e";
-$fa-var-eye-slash: "\f070";
-$fa-var-eyedropper: "\f1fb";
-$fa-var-facebook: "\f09a";
-$fa-var-facebook-f: "\f09a";
-$fa-var-facebook-official: "\f230";
-$fa-var-facebook-square: "\f082";
-$fa-var-fast-backward: "\f049";
-$fa-var-fast-forward: "\f050";
-$fa-var-fax: "\f1ac";
-$fa-var-feed: "\f09e";
-$fa-var-female: "\f182";
-$fa-var-fighter-jet: "\f0fb";
-$fa-var-file: "\f15b";
-$fa-var-file-archive-o: "\f1c6";
-$fa-var-file-audio-o: "\f1c7";
-$fa-var-file-code-o: "\f1c9";
-$fa-var-file-excel-o: "\f1c3";
-$fa-var-file-image-o: "\f1c5";
-$fa-var-file-movie-o: "\f1c8";
-$fa-var-file-o: "\f016";
-$fa-var-file-pdf-o: "\f1c1";
-$fa-var-file-photo-o: "\f1c5";
-$fa-var-file-picture-o: "\f1c5";
-$fa-var-file-powerpoint-o: "\f1c4";
-$fa-var-file-sound-o: "\f1c7";
-$fa-var-file-text: "\f15c";
-$fa-var-file-text-o: "\f0f6";
-$fa-var-file-video-o: "\f1c8";
-$fa-var-file-word-o: "\f1c2";
-$fa-var-file-zip-o: "\f1c6";
-$fa-var-files-o: "\f0c5";
-$fa-var-film: "\f008";
-$fa-var-filter: "\f0b0";
-$fa-var-fire: "\f06d";
-$fa-var-fire-extinguisher: "\f134";
-$fa-var-firefox: "\f269";
-$fa-var-flag: "\f024";
-$fa-var-flag-checkered: "\f11e";
-$fa-var-flag-o: "\f11d";
-$fa-var-flash: "\f0e7";
-$fa-var-flask: "\f0c3";
-$fa-var-flickr: "\f16e";
-$fa-var-floppy-o: "\f0c7";
-$fa-var-folder: "\f07b";
-$fa-var-folder-o: "\f114";
-$fa-var-folder-open: "\f07c";
-$fa-var-folder-open-o: "\f115";
-$fa-var-font: "\f031";
-$fa-var-fonticons: "\f280";
-$fa-var-forumbee: "\f211";
-$fa-var-forward: "\f04e";
-$fa-var-foursquare: "\f180";
-$fa-var-frown-o: "\f119";
-$fa-var-futbol-o: "\f1e3";
-$fa-var-gamepad: "\f11b";
-$fa-var-gavel: "\f0e3";
-$fa-var-gbp: "\f154";
-$fa-var-ge: "\f1d1";
-$fa-var-gear: "\f013";
-$fa-var-gears: "\f085";
-$fa-var-genderless: "\f22d";
-$fa-var-get-pocket: "\f265";
-$fa-var-gg: "\f260";
-$fa-var-gg-circle: "\f261";
-$fa-var-gift: "\f06b";
-$fa-var-git: "\f1d3";
-$fa-var-git-square: "\f1d2";
-$fa-var-github: "\f09b";
-$fa-var-github-alt: "\f113";
-$fa-var-github-square: "\f092";
-$fa-var-gittip: "\f184";
-$fa-var-glass: "\f000";
-$fa-var-globe: "\f0ac";
-$fa-var-google: "\f1a0";
-$fa-var-google-plus: "\f0d5";
-$fa-var-google-plus-square: "\f0d4";
-$fa-var-google-wallet: "\f1ee";
-$fa-var-graduation-cap: "\f19d";
-$fa-var-gratipay: "\f184";
-$fa-var-group: "\f0c0";
-$fa-var-h-square: "\f0fd";
-$fa-var-hacker-news: "\f1d4";
-$fa-var-hand-grab-o: "\f255";
-$fa-var-hand-lizard-o: "\f258";
-$fa-var-hand-o-down: "\f0a7";
-$fa-var-hand-o-left: "\f0a5";
-$fa-var-hand-o-right: "\f0a4";
-$fa-var-hand-o-up: "\f0a6";
-$fa-var-hand-paper-o: "\f256";
-$fa-var-hand-peace-o: "\f25b";
-$fa-var-hand-pointer-o: "\f25a";
-$fa-var-hand-rock-o: "\f255";
-$fa-var-hand-scissors-o: "\f257";
-$fa-var-hand-spock-o: "\f259";
-$fa-var-hand-stop-o: "\f256";
-$fa-var-hdd-o: "\f0a0";
-$fa-var-header: "\f1dc";
-$fa-var-headphones: "\f025";
-$fa-var-heart: "\f004";
-$fa-var-heart-o: "\f08a";
-$fa-var-heartbeat: "\f21e";
-$fa-var-history: "\f1da";
-$fa-var-home: "\f015";
-$fa-var-hospital-o: "\f0f8";
-$fa-var-hotel: "\f236";
-$fa-var-hourglass: "\f254";
-$fa-var-hourglass-1: "\f251";
-$fa-var-hourglass-2: "\f252";
-$fa-var-hourglass-3: "\f253";
-$fa-var-hourglass-end: "\f253";
-$fa-var-hourglass-half: "\f252";
-$fa-var-hourglass-o: "\f250";
-$fa-var-hourglass-start: "\f251";
-$fa-var-houzz: "\f27c";
-$fa-var-html5: "\f13b";
-$fa-var-i-cursor: "\f246";
-$fa-var-ils: "\f20b";
-$fa-var-image: "\f03e";
-$fa-var-inbox: "\f01c";
-$fa-var-indent: "\f03c";
-$fa-var-industry: "\f275";
-$fa-var-info: "\f129";
-$fa-var-info-circle: "\f05a";
-$fa-var-inr: "\f156";
-$fa-var-instagram: "\f16d";
-$fa-var-institution: "\f19c";
-$fa-var-internet-explorer: "\f26b";
-$fa-var-intersex: "\f224";
-$fa-var-ioxhost: "\f208";
-$fa-var-italic: "\f033";
-$fa-var-joomla: "\f1aa";
-$fa-var-jpy: "\f157";
-$fa-var-jsfiddle: "\f1cc";
-$fa-var-key: "\f084";
-$fa-var-keyboard-o: "\f11c";
-$fa-var-krw: "\f159";
-$fa-var-language: "\f1ab";
-$fa-var-laptop: "\f109";
-$fa-var-lastfm: "\f202";
-$fa-var-lastfm-square: "\f203";
-$fa-var-leaf: "\f06c";
-$fa-var-leanpub: "\f212";
-$fa-var-legal: "\f0e3";
-$fa-var-lemon-o: "\f094";
-$fa-var-level-down: "\f149";
-$fa-var-level-up: "\f148";
-$fa-var-life-bouy: "\f1cd";
-$fa-var-life-buoy: "\f1cd";
-$fa-var-life-ring: "\f1cd";
-$fa-var-life-saver: "\f1cd";
-$fa-var-lightbulb-o: "\f0eb";
-$fa-var-line-chart: "\f201";
-$fa-var-link: "\f0c1";
-$fa-var-linkedin: "\f0e1";
-$fa-var-linkedin-square: "\f08c";
-$fa-var-linux: "\f17c";
-$fa-var-list: "\f03a";
-$fa-var-list-alt: "\f022";
-$fa-var-list-ol: "\f0cb";
-$fa-var-list-ul: "\f0ca";
-$fa-var-location-arrow: "\f124";
-$fa-var-lock: "\f023";
-$fa-var-long-arrow-down: "\f175";
-$fa-var-long-arrow-left: "\f177";
-$fa-var-long-arrow-right: "\f178";
-$fa-var-long-arrow-up: "\f176";
-$fa-var-magic: "\f0d0";
-$fa-var-magnet: "\f076";
-$fa-var-mail-forward: "\f064";
-$fa-var-mail-reply: "\f112";
-$fa-var-mail-reply-all: "\f122";
-$fa-var-male: "\f183";
-$fa-var-map: "\f279";
-$fa-var-map-marker: "\f041";
-$fa-var-map-o: "\f278";
-$fa-var-map-pin: "\f276";
-$fa-var-map-signs: "\f277";
-$fa-var-mars: "\f222";
-$fa-var-mars-double: "\f227";
-$fa-var-mars-stroke: "\f229";
-$fa-var-mars-stroke-h: "\f22b";
-$fa-var-mars-stroke-v: "\f22a";
-$fa-var-maxcdn: "\f136";
-$fa-var-meanpath: "\f20c";
-$fa-var-medium: "\f23a";
-$fa-var-medkit: "\f0fa";
-$fa-var-meh-o: "\f11a";
-$fa-var-mercury: "\f223";
-$fa-var-microphone: "\f130";
-$fa-var-microphone-slash: "\f131";
-$fa-var-minus: "\f068";
-$fa-var-minus-circle: "\f056";
-$fa-var-minus-square: "\f146";
-$fa-var-minus-square-o: "\f147";
-$fa-var-mobile: "\f10b";
-$fa-var-mobile-phone: "\f10b";
-$fa-var-money: "\f0d6";
-$fa-var-moon-o: "\f186";
-$fa-var-mortar-board: "\f19d";
-$fa-var-motorcycle: "\f21c";
-$fa-var-mouse-pointer: "\f245";
-$fa-var-music: "\f001";
-$fa-var-navicon: "\f0c9";
-$fa-var-neuter: "\f22c";
-$fa-var-newspaper-o: "\f1ea";
-$fa-var-object-group: "\f247";
-$fa-var-object-ungroup: "\f248";
-$fa-var-odnoklassniki: "\f263";
-$fa-var-odnoklassniki-square: "\f264";
-$fa-var-opencart: "\f23d";
-$fa-var-openid: "\f19b";
-$fa-var-opera: "\f26a";
-$fa-var-optin-monster: "\f23c";
-$fa-var-outdent: "\f03b";
-$fa-var-pagelines: "\f18c";
-$fa-var-paint-brush: "\f1fc";
-$fa-var-paper-plane: "\f1d8";
-$fa-var-paper-plane-o: "\f1d9";
-$fa-var-paperclip: "\f0c6";
-$fa-var-paragraph: "\f1dd";
-$fa-var-paste: "\f0ea";
-$fa-var-pause: "\f04c";
-$fa-var-paw: "\f1b0";
-$fa-var-paypal: "\f1ed";
-$fa-var-pencil: "\f040";
-$fa-var-pencil-square: "\f14b";
-$fa-var-pencil-square-o: "\f044";
-$fa-var-phone: "\f095";
-$fa-var-phone-square: "\f098";
-$fa-var-photo: "\f03e";
-$fa-var-picture-o: "\f03e";
-$fa-var-pie-chart: "\f200";
-$fa-var-pied-piper: "\f1a7";
-$fa-var-pied-piper-alt: "\f1a8";
-$fa-var-pinterest: "\f0d2";
-$fa-var-pinterest-p: "\f231";
-$fa-var-pinterest-square: "\f0d3";
-$fa-var-plane: "\f072";
-$fa-var-play: "\f04b";
-$fa-var-play-circle: "\f144";
-$fa-var-play-circle-o: "\f01d";
-$fa-var-plug: "\f1e6";
-$fa-var-plus: "\f067";
-$fa-var-plus-circle: "\f055";
-$fa-var-plus-square: "\f0fe";
-$fa-var-plus-square-o: "\f196";
-$fa-var-power-off: "\f011";
-$fa-var-print: "\f02f";
-$fa-var-puzzle-piece: "\f12e";
-$fa-var-qq: "\f1d6";
-$fa-var-qrcode: "\f029";
-$fa-var-question: "\f128";
-$fa-var-question-circle: "\f059";
-$fa-var-quote-left: "\f10d";
-$fa-var-quote-right: "\f10e";
-$fa-var-ra: "\f1d0";
-$fa-var-random: "\f074";
-$fa-var-rebel: "\f1d0";
-$fa-var-recycle: "\f1b8";
-$fa-var-reddit: "\f1a1";
-$fa-var-reddit-square: "\f1a2";
-$fa-var-refresh: "\f021";
-$fa-var-registered: "\f25d";
-$fa-var-remove: "\f00d";
-$fa-var-renren: "\f18b";
-$fa-var-reorder: "\f0c9";
-$fa-var-repeat: "\f01e";
-$fa-var-reply: "\f112";
-$fa-var-reply-all: "\f122";
-$fa-var-retweet: "\f079";
-$fa-var-rmb: "\f157";
-$fa-var-road: "\f018";
-$fa-var-rocket: "\f135";
-$fa-var-rotate-left: "\f0e2";
-$fa-var-rotate-right: "\f01e";
-$fa-var-rouble: "\f158";
-$fa-var-rss: "\f09e";
-$fa-var-rss-square: "\f143";
-$fa-var-rub: "\f158";
-$fa-var-ruble: "\f158";
-$fa-var-rupee: "\f156";
-$fa-var-safari: "\f267";
-$fa-var-save: "\f0c7";
-$fa-var-scissors: "\f0c4";
-$fa-var-search: "\f002";
-$fa-var-search-minus: "\f010";
-$fa-var-search-plus: "\f00e";
-$fa-var-sellsy: "\f213";
-$fa-var-send: "\f1d8";
-$fa-var-send-o: "\f1d9";
-$fa-var-server: "\f233";
-$fa-var-share: "\f064";
-$fa-var-share-alt: "\f1e0";
-$fa-var-share-alt-square: "\f1e1";
-$fa-var-share-square: "\f14d";
-$fa-var-share-square-o: "\f045";
-$fa-var-shekel: "\f20b";
-$fa-var-sheqel: "\f20b";
-$fa-var-shield: "\f132";
-$fa-var-ship: "\f21a";
-$fa-var-shirtsinbulk: "\f214";
-$fa-var-shopping-cart: "\f07a";
-$fa-var-sign-in: "\f090";
-$fa-var-sign-out: "\f08b";
-$fa-var-signal: "\f012";
-$fa-var-simplybuilt: "\f215";
-$fa-var-sitemap: "\f0e8";
-$fa-var-skyatlas: "\f216";
-$fa-var-skype: "\f17e";
-$fa-var-slack: "\f198";
-$fa-var-sliders: "\f1de";
-$fa-var-slideshare: "\f1e7";
-$fa-var-smile-o: "\f118";
-$fa-var-soccer-ball-o: "\f1e3";
-$fa-var-sort: "\f0dc";
-$fa-var-sort-alpha-asc: "\f15d";
-$fa-var-sort-alpha-desc: "\f15e";
-$fa-var-sort-amount-asc: "\f160";
-$fa-var-sort-amount-desc: "\f161";
-$fa-var-sort-asc: "\f0de";
-$fa-var-sort-desc: "\f0dd";
-$fa-var-sort-down: "\f0dd";
-$fa-var-sort-numeric-asc: "\f162";
-$fa-var-sort-numeric-desc: "\f163";
-$fa-var-sort-up: "\f0de";
-$fa-var-soundcloud: "\f1be";
-$fa-var-space-shuttle: "\f197";
-$fa-var-spinner: "\f110";
-$fa-var-spoon: "\f1b1";
-$fa-var-spotify: "\f1bc";
-$fa-var-square: "\f0c8";
-$fa-var-square-o: "\f096";
-$fa-var-stack-exchange: "\f18d";
-$fa-var-stack-overflow: "\f16c";
-$fa-var-star: "\f005";
-$fa-var-star-half: "\f089";
-$fa-var-star-half-empty: "\f123";
-$fa-var-star-half-full: "\f123";
-$fa-var-star-half-o: "\f123";
-$fa-var-star-o: "\f006";
-$fa-var-steam: "\f1b6";
-$fa-var-steam-square: "\f1b7";
-$fa-var-step-backward: "\f048";
-$fa-var-step-forward: "\f051";
-$fa-var-stethoscope: "\f0f1";
-$fa-var-sticky-note: "\f249";
-$fa-var-sticky-note-o: "\f24a";
-$fa-var-stop: "\f04d";
-$fa-var-street-view: "\f21d";
-$fa-var-strikethrough: "\f0cc";
-$fa-var-stumbleupon: "\f1a4";
-$fa-var-stumbleupon-circle: "\f1a3";
-$fa-var-subscript: "\f12c";
-$fa-var-subway: "\f239";
-$fa-var-suitcase: "\f0f2";
-$fa-var-sun-o: "\f185";
-$fa-var-superscript: "\f12b";
-$fa-var-support: "\f1cd";
-$fa-var-table: "\f0ce";
-$fa-var-tablet: "\f10a";
-$fa-var-tachometer: "\f0e4";
-$fa-var-tag: "\f02b";
-$fa-var-tags: "\f02c";
-$fa-var-tasks: "\f0ae";
-$fa-var-taxi: "\f1ba";
-$fa-var-television: "\f26c";
-$fa-var-tencent-weibo: "\f1d5";
-$fa-var-terminal: "\f120";
-$fa-var-text-height: "\f034";
-$fa-var-text-width: "\f035";
-$fa-var-th: "\f00a";
-$fa-var-th-large: "\f009";
-$fa-var-th-list: "\f00b";
-$fa-var-thumb-tack: "\f08d";
-$fa-var-thumbs-down: "\f165";
-$fa-var-thumbs-o-down: "\f088";
-$fa-var-thumbs-o-up: "\f087";
-$fa-var-thumbs-up: "\f164";
-$fa-var-ticket: "\f145";
-$fa-var-times: "\f00d";
-$fa-var-times-circle: "\f057";
-$fa-var-times-circle-o: "\f05c";
-$fa-var-tint: "\f043";
-$fa-var-toggle-down: "\f150";
-$fa-var-toggle-left: "\f191";
-$fa-var-toggle-off: "\f204";
-$fa-var-toggle-on: "\f205";
-$fa-var-toggle-right: "\f152";
-$fa-var-toggle-up: "\f151";
-$fa-var-trademark: "\f25c";
-$fa-var-train: "\f238";
-$fa-var-transgender: "\f224";
-$fa-var-transgender-alt: "\f225";
-$fa-var-trash: "\f1f8";
-$fa-var-trash-o: "\f014";
-$fa-var-tree: "\f1bb";
-$fa-var-trello: "\f181";
-$fa-var-tripadvisor: "\f262";
-$fa-var-trophy: "\f091";
-$fa-var-truck: "\f0d1";
-$fa-var-try: "\f195";
-$fa-var-tty: "\f1e4";
-$fa-var-tumblr: "\f173";
-$fa-var-tumblr-square: "\f174";
-$fa-var-turkish-lira: "\f195";
-$fa-var-tv: "\f26c";
-$fa-var-twitch: "\f1e8";
-$fa-var-twitter: "\f099";
-$fa-var-twitter-square: "\f081";
-$fa-var-umbrella: "\f0e9";
-$fa-var-underline: "\f0cd";
-$fa-var-undo: "\f0e2";
-$fa-var-university: "\f19c";
-$fa-var-unlink: "\f127";
-$fa-var-unlock: "\f09c";
-$fa-var-unlock-alt: "\f13e";
-$fa-var-unsorted: "\f0dc";
-$fa-var-upload: "\f093";
-$fa-var-usd: "\f155";
-$fa-var-user: "\f007";
-$fa-var-user-md: "\f0f0";
-$fa-var-user-plus: "\f234";
-$fa-var-user-secret: "\f21b";
-$fa-var-user-times: "\f235";
-$fa-var-users: "\f0c0";
-$fa-var-venus: "\f221";
-$fa-var-venus-double: "\f226";
-$fa-var-venus-mars: "\f228";
-$fa-var-viacoin: "\f237";
-$fa-var-video-camera: "\f03d";
-$fa-var-vimeo: "\f27d";
-$fa-var-vimeo-square: "\f194";
-$fa-var-vine: "\f1ca";
-$fa-var-vk: "\f189";
-$fa-var-volume-down: "\f027";
-$fa-var-volume-off: "\f026";
-$fa-var-volume-up: "\f028";
-$fa-var-warning: "\f071";
-$fa-var-wechat: "\f1d7";
-$fa-var-weibo: "\f18a";
-$fa-var-weixin: "\f1d7";
-$fa-var-whatsapp: "\f232";
-$fa-var-wheelchair: "\f193";
-$fa-var-wifi: "\f1eb";
-$fa-var-wikipedia-w: "\f266";
-$fa-var-windows: "\f17a";
-$fa-var-won: "\f159";
-$fa-var-wordpress: "\f19a";
-$fa-var-wrench: "\f0ad";
-$fa-var-xing: "\f168";
-$fa-var-xing-square: "\f169";
-$fa-var-y-combinator: "\f23b";
-$fa-var-y-combinator-square: "\f1d4";
-$fa-var-yahoo: "\f19e";
-$fa-var-yc: "\f23b";
-$fa-var-yc-square: "\f1d4";
-$fa-var-yelp: "\f1e9";
-$fa-var-yen: "\f157";
-$fa-var-youtube: "\f167";
-$fa-var-youtube-play: "\f16a";
-$fa-var-youtube-square: "\f166";
-
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/font-awesome.scss b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/font-awesome.scss
deleted file mode 100644
index ebd9646..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/fontAwesome/scss/font-awesome.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-/*!
- * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */
-
-@import "variables";
-@import "mixins";
-@import "path";
-@import "core";
-@import "larger";
-@import "fixed-width";
-@import "list";
-@import "bordered-pulled";
-@import "animated";
-@import "rotated-flipped";
-@import "stacked";
-@import "icons";
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.js
deleted file mode 100644
index c173234..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_de.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Localized default methods for the jQuery validation plugin.
- * Locale: DE
- */
-$.extend($.validator.methods, {
- date: function(value, element) {
- return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value);
- },
- number: function(value, element) {
- return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
- }
-});
-
-})); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.js
deleted file mode 100644
index e0840ad..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_es_CL.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Localized default methods for the jQuery validation plugin.
- * Locale: ES_CL
- */
-$.extend($.validator.methods, {
- date: function(value, element) {
- return this.optional(element) || /^\d\d?\-\d\d?\-\d\d\d?\d?$/.test(value);
- },
- number: function(value, element) {
- return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
- }
-});
-
-})); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.js
deleted file mode 100644
index b8afcbc..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_fi.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Localized default methods for the jQuery validation plugin.
- * Locale: FI
- */
-$.extend($.validator.methods, {
- date: function(value, element) {
- return this.optional(element) || /^\d{1,2}\.\d{1,2}\.\d{4}$/.test(value);
- },
- number: function(value, element) {
- return this.optional(element) || /^-?(?:\d+)(?:,\d+)?$/.test(value);
- }
-});
-
-})); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.js
deleted file mode 100644
index 35f9058..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_nl.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Localized default methods for the jQuery validation plugin.
- * Locale: NL
- */
-$.extend($.validator.methods, {
- date: function(value, element) {
- return this.optional(element) || /^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test(value);
- }
-});
-
-})); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.js
deleted file mode 100644
index 1ff2221..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery-validation/localization/methods_pt.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
- *
- * Author: Zhaoxing Meng
- * email: meng.zhaoxing1@zte.com.cn
- */
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Localized default methods for the jQuery validation plugin.
- * Locale: PT_BR
- */
-$.extend($.validator.methods, {
- date: function(value, element) {
- return this.optional(element) || /^\d\d?\/\d\d?\/\d\d\d?\d?$/.test(value);
- }
-});
-
-})); \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery/jquery-1.10.2.min.js b/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery/jquery-1.10.2.min.js
deleted file mode 100644
index 73f33fb..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/iui-route/js/jquery/jquery-1.10.2.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="<select t=''><option selected=''></option></select>",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=jb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=kb(b);function nb(){}nb.prototype=d.filters=d.pseudos,d.setFilters=new nb;function ob(a,b){var c,e,f,g,h,i,j,k=x[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=Q.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?db.error(a):x(a,i).slice(0)}function pb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f
-}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},W=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a>",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=$.test(e)?this.mouseHooks:Z.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||z),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||z,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==db()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===db()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=z.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===L&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&(a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault())?bb:cb):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:cb,isPropagationStopped:cb,isImmediatePropagationStopped:cb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=bb,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=bb,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submitBubbles||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?b.form:void 0;c&&!n._data(c,"submitBubbles")&&(n.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),n._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.changeBubbles||(n.event.special.change={setup:function(){return Y.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),n.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),n.event.simulate("change",this,a,!0)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;Y.test(b.nodeName)&&!n._data(b,"changeBubbles")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a,!0)}),n._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!Y.test(this.nodeName)}}),l.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=cb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return n().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=cb),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});function eb(a){var b=fb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var fb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gb=/ jQuery\d+="(?:null|\d+)"/g,hb=new RegExp("<(?:"+fb+")[\\s/>]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/<tbody/i,mb=/<|&#?\w+;/,nb=/<(?:script|style|link)/i,ob=/checked\s*(?:[^=]|=\s*.checked.)/i,pb=/^$|\/(?:java|ecma)script/i,qb=/^true\/(.*)/,rb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,sb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1></$2>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?"<table>"!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Db[0].contentWindow||Db[0].contentDocument).document,b.write(),b.close(),c=Fb(a,b),Db.detach()),Eb[a]=c),c}!function(){var a,b,c=z.createElement("div"),d="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";c.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],a.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(a.style.opacity),l.cssFloat=!!a.style.cssFloat,c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===c.style.backgroundClip,a=c=null,l.shrinkWrapBlocks=function(){var a,c,e,f;if(null==b){if(a=z.getElementsByTagName("body")[0],!a)return;f="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",c=z.createElement("div"),e=z.createElement("div"),a.appendChild(c).appendChild(e),b=!1,typeof e.style.zoom!==L&&(e.style.cssText=d+";width:1px;padding:1px;zoom:1",e.innerHTML="<div></div>",e.firstChild.style.width="5px",b=3!==e.offsetWidth),a.removeChild(c),a=c=e=null}return b}}();var Hb=/^margin/,Ib=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Jb,Kb,Lb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Jb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),Ib.test(g)&&Hb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):z.documentElement.currentStyle&&(Jb=function(a){return a.currentStyle},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ib.test(g)&&!Lb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Mb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h=z.createElement("div"),i="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",j="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";h.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",b=h.getElementsByTagName("a")[0],b.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(b.style.opacity),l.cssFloat=!!b.style.cssFloat,h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,b=h=null,n.extend(l,{reliableHiddenOffsets:function(){if(null!=c)return c;var a,b,d,e=z.createElement("div"),f=z.getElementsByTagName("body")[0];if(f)return e.setAttribute("className","t"),e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=z.createElement("div"),a.style.cssText=i,f.appendChild(a).appendChild(e),e.innerHTML="<table><tr><td></td><td>t</td></tr></table>",b=e.getElementsByTagName("td"),b[0].style.cssText="padding:0;margin:0;border:0;display:none",d=0===b[0].offsetHeight,b[0].style.display="",b[1].style.display="none",c=d&&0===b[0].offsetHeight,f.removeChild(a),e=f=null,c},boxSizing:function(){return null==d&&k(),d},boxSizingReliable:function(){return null==e&&k(),e},pixelPosition:function(){return null==f&&k(),f},reliableMarginRight:function(){var b,c,d,e;if(null==g&&a.getComputedStyle){if(b=z.getElementsByTagName("body")[0],!b)return;c=z.createElement("div"),d=z.createElement("div"),c.style.cssText=i,b.appendChild(c).appendChild(d),e=d.appendChild(z.createElement("div")),e.style.cssText=d.style.cssText=j,e.style.marginRight=e.style.width="0",d.style.width="1px",g=!parseFloat((a.getComputedStyle(e,null)||{}).marginRight),b.removeChild(c)}return g}});function k(){var b,c,h=z.getElementsByTagName("body")[0];h&&(b=z.createElement("div"),c=z.createElement("div"),b.style.cssText=i,h.appendChild(b).appendChild(c),c.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;display:block;padding:1px;border:1px;width:4px;margin-top:1%;top:1%",n.swap(h,null!=h.style.zoom?{zoom:1}:{},function(){d=4===c.offsetWidth}),e=!0,f=!1,g=!0,a.getComputedStyle&&(f="1%"!==(a.getComputedStyle(c,null)||{}).top,e="4px"===(a.getComputedStyle(c,null)||{width:"4px"}).width),h.removeChild(b),c=h=null)}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Nb=/alpha\([^)]*\)/i,Ob=/opacity\s*=\s*([^)]*)/,Pb=/^(none|table(?!-c[ea]).+)/,Qb=new RegExp("^("+T+")(.*)$","i"),Rb=new RegExp("^([+-])=("+T+")","i"),Sb={position:"absolute",visibility:"hidden",display:"block"},Tb={letterSpacing:0,fontWeight:400},Ub=["Webkit","O","Moz","ms"];function Vb(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ub.length;while(e--)if(b=Ub[e]+c,b in a)return b;return d}function Wb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=n._data(d,"olddisplay",Gb(d.nodeName)))):f[g]||(e=V(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Xb(a,b,c){var d=Qb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Yb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Zb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Jb(a),g=l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Kb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ib.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Yb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Kb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=Vb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Rb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]="",i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Vb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Kb(a,b,d)),"normal"===f&&b in Tb&&(f=Tb[b]),""===c||c?(e=parseFloat(f),c===!0||n.isNumeric(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?0===a.offsetWidth&&Pb.test(n.css(a,"display"))?n.swap(a,Sb,function(){return Zb(a,b,d)}):Zb(a,b,d):void 0},set:function(a,c,d){var e=d&&Jb(a);return Xb(a,c,d?Yb(a,b,d,l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Ob.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Nb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Nb.test(f)?f.replace(Nb,e):f+" "+e)}}),n.cssHooks.marginRight=Mb(l.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},Kb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Hb.test(a)||(n.cssHooks[a+b].set=Xb)}),n.fn.extend({css:function(a,b){return W(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Jb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)
-},a,b,arguments.length>1)},show:function(){return Wb(this,!0)},hide:function(){return Wb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function $b(a,b,c,d,e){return new $b.prototype.init(a,b,c,d,e)}n.Tween=$b,$b.prototype={constructor:$b,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=$b.propHooks[this.prop];return a&&a.get?a.get(this):$b.propHooks._default.get(this)},run:function(a){var b,c=$b.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):$b.propHooks._default.set(this),this}},$b.prototype.init.prototype=$b.prototype,$b.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},$b.propHooks.scrollTop=$b.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=$b.prototype.init,n.fx.step={};var _b,ac,bc=/^(?:toggle|show|hide)$/,cc=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),dc=/queueHooks$/,ec=[jc],fc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=cc.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&cc.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function gc(){return setTimeout(function(){_b=void 0}),_b=n.now()}function hc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=U[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function ic(a,b,c){for(var d,e=(fc[b]||[]).concat(fc["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function jc(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&V(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k=Gb(a.nodeName),"none"===j&&(j=k),"inline"===j&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==k?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],bc.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}if(!n.isEmptyObject(o)){r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=ic(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function kc(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function lc(a,b,c){var d,e,f=0,g=ec.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=_b||gc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:_b||gc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(kc(k,j.opts.specialEasing);g>f;f++)if(d=ec[f].call(j,a,k,j.opts))return d;return n.map(k,ic,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(lc,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],fc[c]=fc[c]||[],fc[c].unshift(b)},prefilter:function(a,b){b?ec.unshift(a):ec.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=lc(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&dc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(hc(b,!0),a,d,e)}}),n.each({slideDown:hc("show"),slideUp:hc("hide"),slideToggle:hc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(_b=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),_b=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ac||(ac=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(ac),ac=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e=z.createElement("div");e.setAttribute("className","t"),e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=e.getElementsByTagName("a")[0],c=z.createElement("select"),d=c.appendChild(z.createElement("option")),b=e.getElementsByTagName("input")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==e.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=d.selected,l.enctype=!!z.createElement("form").enctype,c.disabled=!0,l.optDisabled=!d.disabled,b=z.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value,a=b=c=d=e=null}();var mc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(mc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.text(a)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(l.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var nc,oc,pc=n.expr.attrHandle,qc=/^(?:checked|selected)$/i,rc=l.getSetAttribute,sc=l.input;n.fn.extend({attr:function(a,b){return W(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===L?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?oc:nc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(F);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?sc&&rc||!qc.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(rc?c:d)},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),oc={set:function(a,b,c){return b===!1?n.removeAttr(a,c):sc&&rc||!qc.test(c)?a.setAttribute(!rc&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=pc[b]||n.find.attr;pc[b]=sc&&rc||!qc.test(b)?function(a,b,d){var e,f;return d||(f=pc[b],pc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,pc[b]=f),e}:function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),sc&&rc||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):nc&&nc.set(a,b,c)}}),rc||(nc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},pc.id=pc.name=pc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:nc.set},n.attrHooks.contenteditable={set:function(a,b,c){nc.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var tc=/^(?:input|select|textarea|button|object)$/i,uc=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return W(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):tc.test(a.nodeName)||uc.test(a.nodeName)&&a.href?0:-1}}}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var vc=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(F)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===L||"boolean"===c)&&(this.className&&n._data(this,"__className__",this.className),this.className=this.className||a===!1?"":n._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(vc," ").indexOf(b)>=0)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var wc=n.now(),xc=/\?/,yc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(yc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var zc,Ac,Bc=/#.*$/,Cc=/([?&])_=[^&]*/,Dc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Ec=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Fc=/^(?:GET|HEAD)$/,Gc=/^\/\//,Hc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ic={},Jc={},Kc="*/".concat("*");try{Ac=location.href}catch(Lc){Ac=z.createElement("a"),Ac.href="",Ac=Ac.href}zc=Hc.exec(Ac.toLowerCase())||[];function Mc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(F)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nc(a,b,c,d){var e={},f=a===Jc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Oc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Pc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Qc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ac,type:"GET",isLocal:Ec.test(zc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Oc(Oc(a,n.ajaxSettings),b):Oc(n.ajaxSettings,a)},ajaxPrefilter:Mc(Ic),ajaxTransport:Mc(Jc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Dc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||Ac)+"").replace(Bc,"").replace(Gc,zc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(F)||[""],null==k.crossDomain&&(c=Hc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===zc[1]&&c[2]===zc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(zc[3]||("http:"===zc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),Nc(Ic,k,b,v),2===t)return v;h=k.global,h&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Fc.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(xc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Cc.test(e)?e.replace(Cc,"$1_="+wc++):e+(xc.test(e)?"&":"?")+"_="+wc++)),k.ifModified&&(n.lastModified[e]&&v.setRequestHeader("If-Modified-Since",n.lastModified[e]),n.etag[e]&&v.setRequestHeader("If-None-Match",n.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Kc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Nc(Jc,k,b,v)){v.readyState=1,h&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Pc(k,v,c)),u=Qc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(n.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!l.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||n.css(a,"display"))},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var Rc=/%20/g,Sc=/\[\]$/,Tc=/\r?\n/g,Uc=/^(?:submit|button|image|reset|file)$/i,Vc=/^(?:input|select|textarea|keygen)/i;function Wc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Sc.test(a)?d(a,e):Wc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Wc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Wc(c,a[c],b,e);return d.join("&").replace(Rc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Vc.test(this.nodeName)&&!Uc.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Tc,"\r\n")}}):{name:b.name,value:c.replace(Tc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&$c()||_c()}:$c;var Xc=0,Yc={},Zc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Yc)Yc[a](void 0,!0)}),l.cors=!!Zc&&"withCredentials"in Zc,Zc=l.ajax=!!Zc,Zc&&n.ajaxTransport(function(a){if(!a.crossDomain||l.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Xc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Yc[g],b=void 0,f.onreadystatechange=n.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Yc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function $c(){try{return new a.XMLHttpRequest}catch(b){}}function _c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=z.head||n("head")[0]||z.documentElement;return{send:function(d,e){b=z.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var ad=[],bd=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=ad.pop()||n.expando+"_"+wc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(bd.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&bd.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(bd,"$1"+e):b.jsonp!==!1&&(b.url+=(xc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,ad.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||z;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var cd=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&cd)return cd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=a.slice(h,a.length),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&n.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var dd=a.document.documentElement;function ed(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?(typeof e.getBoundingClientRect!==L&&(d=e.getBoundingClientRect()),c=ed(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||dd;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||dd})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return W(this,function(a,d,e){var f=ed(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Mb(l.pixelPosition,function(a,c){return c?(c=Kb(a,b),Ib.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return W(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var fd=a.jQuery,gd=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=gd),b&&a.jQuery===n&&(a.jQuery=fd),n},typeof b===L&&(a.jQuery=a.$=n),n});
diff --git a/msb-core/apiroute/apiroute-service/src/main/resources/swagger.properties b/msb-core/apiroute/apiroute-service/src/main/resources/swagger.properties
deleted file mode 100644
index 3fa2ad3..0000000
--- a/msb-core/apiroute/apiroute-service/src/main/resources/swagger.properties
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 2017 Huawei Technologies Co., Ltd.
-#
-# 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.
-
-# Used to do swagger configuration.
-# Open-O Service REST API version
-api-version=1.0.0
-
-# Open-O Service REST API swagger document title
-api-title=MicroService Bus rest API
-
-# Open-O Service REST API swagger document description
-api-description=MicroService Bus rest API
-
-# Open-O Service REST API supported protocols
-api-schemas=http,https
-
-# Open-O Service REST API ROOT URI
-api-base-path=/api/microservices/v1
-
-# swagger.json URI on top of api-base-path. so final URI would as follows
-#<api-base-path>/<api-swagger-uri>/swagger.json
-api-swagger-uri=
-
-# Set the root level java package path, where REST API implemented.
-api-rest-package=org.openo.msb.resources
-
-# Enables swagger to scan the ROA defining the REST API
-api-rest-package-scan=true
-
-# License details emebeded in generated swagger.json
-api-license=https://wiki.open-o.org/display/REL/License.txt
-
-# if service-config-file-path does not have api-host-ip and api-host-port,
-# then ip and port defined here will be used as default
-api-host-ip=127.0.0.1
-api-host-port=80
-
-# Set the below file path to service specific configuration file path
-service-config-file-path=
-
diff --git a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/ApiRouteServiceWrapperTest.java b/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/ApiRouteServiceWrapperTest.java
deleted file mode 100644
index 6815f16..0000000
--- a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/ApiRouteServiceWrapperTest.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openo.msb.api.ApiRouteInfo;
-import org.openo.msb.api.RouteServer;
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
-import org.openo.msb.api.exception.ExtendedNotFoundException;
-
-public class ApiRouteServiceWrapperTest {
- private static ApiRouteServiceWrapper apiRouteServiceWrapper;
-
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- apiRouteServiceWrapper=ApiRouteServiceWrapper.getInstance();
- }
-
- @Before
- public void setUp() {
- ApiRouteInfo apiRouteInfo=new ApiRouteInfo();
- apiRouteInfo.setServiceName("testForJunit");
- apiRouteInfo.setVersion("v1");
- apiRouteInfo.setUrl("/api/test/v1");
- RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};
- apiRouteInfo.setServers(servers);
- try {
- apiRouteServiceWrapper.saveApiRouteInstance(apiRouteInfo, "");
- }
- catch(ExtendedInternalServerErrorException e){
- }
- catch (Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
-
- }
-
- @After
- public void tearDown() {
- try {
- apiRouteServiceWrapper.deleteApiRoute("testForJunit", "v1", "*", "");
- }
- catch(ExtendedInternalServerErrorException e){
-
- }catch (Exception e) {
- Assert.fail("Exception" + e.getMessage());
- }
- }
-
- @Test
- public void testGetAllApiRouteInstances(){
- try {
- ApiRouteInfo[] apiRouteInfoList=apiRouteServiceWrapper.getAllApiRouteInstances();
- Assert.assertTrue(apiRouteInfoList.length >= 0);
- }
- catch(ExtendedInternalServerErrorException e){
-
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
-
- }
-
- @Test
- public void testGetApiRouteInstance_not_exist(){
- ApiRouteInfo apiRouteInfo = null;
- try {
- apiRouteInfo=apiRouteServiceWrapper.getApiRouteInstance("testForJunit", "v2");
- Assert.assertNotNull(apiRouteInfo);
- }
- catch(ExtendedInternalServerErrorException e){
-
- }
- catch(ExtendedNotFoundException e){
- Assert.assertNull(apiRouteInfo);
- }
-
- }
-
- @Test
- public void testGetApiRouteInstance_exist(){
- try {
- ApiRouteInfo apiRouteInfo=apiRouteServiceWrapper.getApiRouteInstance("testForJunit", "v1");
- Assert.assertNotNull(apiRouteInfo);
- }
- catch(ExtendedInternalServerErrorException e){
-
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
-
- }
-
- @Test
- public void testUpdateApiRouteInstance(){
- try {
-
- ApiRouteInfo apiRouteInfo=new ApiRouteInfo();
- apiRouteInfo.setServiceName("testForJunit");
- apiRouteInfo.setVersion("v1");
- apiRouteInfo.setUrl("/api/test_update/v1");
- RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};
- apiRouteInfo.setServers(servers);
-
- ApiRouteInfo new_apiRouteInfo= apiRouteServiceWrapper.updateApiRouteInstance("testForJunit", "v1", apiRouteInfo, "");
- Assert.assertEquals("/api/test_update/v1", new_apiRouteInfo.getUrl());
- }
- catch(ExtendedInternalServerErrorException e){
-
- }
- catch(Exception e){
- Assert.assertEquals("Get Jedis from pool failed!",e.getMessage());
-
-// Assert.fail("Exception" + e.getMessage());
-
- }
- }
-
- @Test
- public void testUpdateApiRouteStatus(){
- try {
- ApiRouteInfo new_apiRouteInfo= apiRouteServiceWrapper.updateApiRouteStatus("testForJunit", "v1", "0");
- Assert.assertEquals("0",new_apiRouteInfo.getStatus());
- }
- catch(ExtendedInternalServerErrorException e){
-
- }catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
-
- }
- }
-
- @Test
- public void testGetApiGatewayPort(){
- try {
- String port= apiRouteServiceWrapper.getApiGatewayPort();
- Assert.assertEquals("10080",port);
- }catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
-
- }
- }
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/CustomRouteServiceWrapperTest.java b/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/CustomRouteServiceWrapperTest.java
deleted file mode 100644
index 38a63c7..0000000
--- a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/CustomRouteServiceWrapperTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openo.msb.api.CustomRouteInfo;
-import org.openo.msb.api.RouteServer;
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
-import org.openo.msb.api.exception.ExtendedNotFoundException;
-
-public class CustomRouteServiceWrapperTest {
-
- private static CustomRouteServiceWrapper customRouteServiceWrapper;
-
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- customRouteServiceWrapper=CustomRouteServiceWrapper.getInstance();
- }
-
- @Before
- public void setUp() {
- CustomRouteInfo customRouteInfo=new CustomRouteInfo();
- customRouteInfo.setServiceName("/testForJunit");
- customRouteInfo.setUrl("/test");
- RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};
- customRouteInfo.setServers(servers);
- try {
- customRouteServiceWrapper.saveCustomRouteInstance(customRouteInfo,"");
- }
- catch(ExtendedInternalServerErrorException e){
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
-
- }
-
- @After
- public void tearDown() {
- try {
- customRouteServiceWrapper.deleteCustomRoute("/testForJunit", "*","");
- }
- catch(ExtendedInternalServerErrorException e){
- }catch (Exception e) {
- Assert.fail("Exception" + e.getMessage());
- }
- }
-
- @Test
- public void testGetAllCustomRouteInstances(){
- try {
- CustomRouteInfo[] customRouteInfoList=customRouteServiceWrapper.getAllCustomRouteInstances();
- Assert.assertTrue(customRouteInfoList.length >= 0);
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
-
- }
-
- @Test
- public void testGetCustomRouteInstance_not_exist(){
- CustomRouteInfo customRouteInfo = null;
- try {
- customRouteInfo=customRouteServiceWrapper.getCustomRouteInstance("/testForJunit2");
- Assert.assertNotNull(customRouteInfo);
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(ExtendedNotFoundException e){
- Assert.assertNull(customRouteInfo);
- }
-
- }
-
- @Test
- public void testGetCustomRouteInstance_exist(){
- try {
- CustomRouteInfo customRouteInfo=customRouteServiceWrapper.getCustomRouteInstance("/testForJunit");
- Assert.assertNotNull(customRouteInfo);
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
-
- }
-
- @Test
- public void testUpdateCustomRouteInstance(){
- try {
-
- CustomRouteInfo customRouteInfo=new CustomRouteInfo();
- customRouteInfo.setServiceName("/testForJunit");
- customRouteInfo.setUrl("/test_update");
- RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};
- customRouteInfo.setServers(servers);
-
- CustomRouteInfo new_customRouteInfo= customRouteServiceWrapper.updateCustomRouteInstance("/testForJunit", customRouteInfo,"");
- Assert.assertEquals("/test_update", new_customRouteInfo.getUrl());
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
-
- }
- }
-
- @Test
- public void testUpdateCustomRouteStatus(){
- try {
- CustomRouteInfo new_CustomRouteInfo= customRouteServiceWrapper.updateCustomRouteStatus("/testForJunit", "0");
- Assert.assertEquals("0",new_CustomRouteInfo.getStatus());
- }catch(ExtendedInternalServerErrorException e){
- }catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
-
- }
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/IuiRouteServiceWrapperTest.java b/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/IuiRouteServiceWrapperTest.java
deleted file mode 100644
index 343b26e..0000000
--- a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/IuiRouteServiceWrapperTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openo.msb.api.IuiRouteInfo;
-import org.openo.msb.api.RouteServer;
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
-import org.openo.msb.api.exception.ExtendedNotFoundException;
-
-public class IuiRouteServiceWrapperTest {
- private static IuiRouteServiceWrapper iuiRouteServiceWrapper;
-
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- iuiRouteServiceWrapper=IuiRouteServiceWrapper.getInstance();
- }
-
- @Before
- public void setUp() {
- IuiRouteInfo iuiRouteInfo=new IuiRouteInfo();
- iuiRouteInfo.setServiceName("testForJunit");
- iuiRouteInfo.setUrl("/iui/test");
- RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};
- iuiRouteInfo.setServers(servers);
- try {
- iuiRouteServiceWrapper.saveIuiRouteInstance(iuiRouteInfo);
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
-
- }
-
- @After
- public void tearDown() {
- try {
- iuiRouteServiceWrapper.deleteIuiRoute("testForJunit", "*");
- }catch(ExtendedInternalServerErrorException e){
- } catch (Exception e) {
- Assert.fail("Exception" + e.getMessage());
- }
- }
-
- @Test
- public void testGetAllIuiRouteInstances(){
- try {
- IuiRouteInfo[] iuiRouteInfoList=iuiRouteServiceWrapper.getAllIuiRouteInstances();
- Assert.assertTrue(iuiRouteInfoList.length >= 0);
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
-
- }
-
- @Test
- public void testGetIuiRouteInstance_not_exist(){
- IuiRouteInfo iuiRouteInfo = null;
- try {
- iuiRouteInfo=iuiRouteServiceWrapper.getIuiRouteInstance("testForJunit2");
- Assert.assertNotNull(iuiRouteInfo);
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(ExtendedNotFoundException e){
- Assert.assertNull(iuiRouteInfo);
- }
-
- }
-
- @Test
- public void testGetIuiRouteInstance_exist(){
- try {
- IuiRouteInfo iuiRouteInfo=iuiRouteServiceWrapper.getIuiRouteInstance("testForJunit");
- Assert.assertNotNull(iuiRouteInfo);
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
-
- }
-
- @Test
- public void testUpdateIuiRouteInstance(){
- try {
-
- IuiRouteInfo iuiRouteInfo=new IuiRouteInfo();
- iuiRouteInfo.setServiceName("testForJunit");
- iuiRouteInfo.setUrl("/iui/test_update");
- RouteServer[] servers=new RouteServer[]{new RouteServer("127.0.0.1","80")};
- iuiRouteInfo.setServers(servers);
-
- IuiRouteInfo new_iuiRouteInfo= iuiRouteServiceWrapper.updateIuiRouteInstance("testForJunit", iuiRouteInfo);
- Assert.assertEquals("/iui/test_update", new_iuiRouteInfo.getUrl());
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
-
- }
- }
-
- @Test
- public void testUpdateIuiRouteStatus(){
- try {
- IuiRouteInfo new_iuiRouteInfo= iuiRouteServiceWrapper.updateIuiRouteStatus("testForJunit", "0");
- Assert.assertEquals("0",new_iuiRouteInfo.getStatus());
- }catch(ExtendedInternalServerErrorException e){
- }catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
-
- }
- }
-
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/MicroServiceWrapperTest.java b/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/MicroServiceWrapperTest.java
deleted file mode 100644
index 20be0b4..0000000
--- a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/MicroServiceWrapperTest.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openo.msb.api.MicroServiceFullInfo;
-import org.openo.msb.api.MicroServiceInfo;
-import org.openo.msb.api.Node;
-import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
-import org.openo.msb.api.exception.ExtendedNotFoundException;
-
-public class MicroServiceWrapperTest {
- private static MicroServiceWrapper microServiceWrapper;
-
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- microServiceWrapper=microServiceWrapper.getInstance();
- }
-
- @Before
- public void setUp() {
- MicroServiceInfo microServiceInfo=new MicroServiceInfo();
- microServiceInfo.setServiceName("testForJunit");
- microServiceInfo.setVersion("v1");
- microServiceInfo.setUrl("/api/test/v1");
- microServiceInfo.setProtocol("REST");
- microServiceInfo.setVisualRange("0");
- Set<Node> nodes=new HashSet<Node>();
- nodes.add(new Node("127.0.0.1","8080",0));
- microServiceInfo.setNodes(nodes);
- try {
- microServiceWrapper.saveMicroServiceInstance(microServiceInfo,true,"","");
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
-
- }
-
- @After
- public void tearDown() {
- try {
- microServiceWrapper.deleteMicroService("testForJunit", "v1", "");
- }catch(ExtendedInternalServerErrorException e){
- } catch (Exception e) {
- Assert.fail("Exception" + e.getMessage());
- }
- }
-
- @Test
- public void testGetAllMicroServiceInstances(){
- try {
- MicroServiceFullInfo[] MicroServiceInfoList=microServiceWrapper.getAllMicroServiceInstances();
- Assert.assertTrue(MicroServiceInfoList.length >= 0);
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
-
- }
-
- @Test
- public void testGetMicroServiceInstance_not_exist(){
- MicroServiceFullInfo microServiceInfo = null;
- try {
- microServiceInfo=microServiceWrapper.getMicroServiceInstance("testForJunit", "v2","");
- Assert.assertNotNull(microServiceInfo);
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(ExtendedNotFoundException e){
- Assert.assertNull(microServiceInfo);
- }
-
- }
-
- @Test
- public void testGetMicroServiceInstance_exist(){
- try {
- MicroServiceFullInfo microServiceInfo=microServiceWrapper.getMicroServiceInstance("testForJunit", "v1","");
- Assert.assertNotNull(microServiceInfo);
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
-
- }
-
- @Test
- public void testUpdateMicroServiceInstance(){
- try {
-
- MicroServiceInfo microServiceInfo=new MicroServiceInfo();
- microServiceInfo.setServiceName("testForJunit");
- microServiceInfo.setVersion("v1");
- microServiceInfo.setUrl("/api/test2/v1");
- microServiceInfo.setProtocol("REST");
- microServiceInfo.setVisualRange("0");
- Set<Node> nodes=new HashSet<Node>();
- nodes.add(new Node("127.0.0.1","8080",0));
- microServiceInfo.setNodes(nodes);
-
- MicroServiceFullInfo new_MicroServiceInfo= microServiceWrapper.updateMicroServiceInstance("testForJunit", "v1", microServiceInfo);
- Assert.assertEquals("/api/test2/v1", new_MicroServiceInfo.getUrl());
- }catch(ExtendedInternalServerErrorException e){
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
-
- }
- }
-
- @Test
- public void testUpdateMicroServiceStatus(){
- try {
- MicroServiceFullInfo new_MicroServiceInfo= microServiceWrapper.updateMicroServiceStatus("testForJunit", "v1", "0");
- Assert.assertEquals("0",new_MicroServiceInfo.getStatus());
- }catch(ExtendedInternalServerErrorException e){
- }catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
-
- }
- }
-
-
-}
diff --git a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/util/JacksonJsonUtilTest.java b/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/util/JacksonJsonUtilTest.java
deleted file mode 100644
index 1d36fc6..0000000
--- a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/util/JacksonJsonUtilTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.util;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.openo.msb.api.RouteServer;
-
-
-public class JacksonJsonUtilTest {
- @Test
- public void testBeanToJson(){
- try{
- RouteServer server=new RouteServer("127.0.0.1","80");
- String json=JacksonJsonUtil.beanToJson(server);
- Assert.assertEquals("{\"ip\":\"127.0.0.1\",\"port\":\"80\",\"weight\":0}",json);
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
- }
-
- @Test
- public void testJsonToBean(){
- try{
- String json="{\"ip\":\"127.0.0.1\",\"port\":\"80\",\"weight\":0}";
- RouteServer server=(RouteServer) JacksonJsonUtil.jsonToBean(json, RouteServer.class);
- Assert.assertEquals("127.0.0.1",server.getIp());
- Assert.assertEquals("80",server.getPort());
- }
- catch(Exception e){
- Assert.fail("Exception" + e.getMessage());
- }
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/util/RegExpTestUtilTest.java b/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/util/RegExpTestUtilTest.java
deleted file mode 100644
index e3c4d3e..0000000
--- a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/util/RegExpTestUtilTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.util;
-
-import org.junit.Assert;
-
-import org.junit.Test;
-
-public class RegExpTestUtilTest {
-
- @Test
- public void testHostRegExpTest(){
- boolean result=RegExpTestUtil.hostRegExpTest("127.0.0.1:8080");
- Assert.assertTrue(result);
-
- boolean err_result=RegExpTestUtil.hostRegExpTest("0.0.0.1:89");
- Assert.assertFalse(err_result);
- }
-
- @Test
- public void testIpRegExpTest(){
- boolean result=RegExpTestUtil.ipRegExpTest("127.0.0.1");
- Assert.assertTrue(result);
-
- boolean err_result=RegExpTestUtil.ipRegExpTest("127.0.0.1.5");
- Assert.assertFalse(err_result);
- }
-
- @Test
- public void testPortRegExpTest(){
- boolean result=RegExpTestUtil.portRegExpTest("80");
- Assert.assertTrue(result);
-
- boolean err_result=RegExpTestUtil.portRegExpTest("898989");
- Assert.assertFalse(err_result);
- }
-
- @Test
- public void testVersionRegExpTest(){
- boolean result=RegExpTestUtil.versionRegExpTest("v1");
- Assert.assertTrue(result);
-
- boolean err_result=RegExpTestUtil.versionRegExpTest("23");
- Assert.assertFalse(err_result);
- }
-
- @Test
- public void testurlRegExpTest(){
- boolean result=RegExpTestUtil.urlRegExpTest("/test");
- Assert.assertTrue(result);
-
- boolean err_result=RegExpTestUtil.urlRegExpTest("test");
- Assert.assertFalse(err_result);
- }
-
- @Test
- public void testapiRouteUrlRegExpTest(){
- boolean result=RegExpTestUtil.apiRouteUrlRegExpTest("/api/test/v1");
- Assert.assertTrue(result);
-
- boolean err_result=RegExpTestUtil.apiRouteUrlRegExpTest("/test");
- Assert.assertFalse(err_result);
- }
-
- @Test
- public void testiuiRouteUrlRegExpTest(){
- boolean result=RegExpTestUtil.iuiRouteUrlRegExpTest("/iui/test");
- Assert.assertTrue(result);
-
- boolean err_result=RegExpTestUtil.iuiRouteUrlRegExpTest("/test");
- Assert.assertFalse(err_result);
- }
-}
diff --git a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/util/RouteUtilTest.java b/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/util/RouteUtilTest.java
deleted file mode 100644
index f665bd3..0000000
--- a/msb-core/apiroute/apiroute-service/src/test/java/org/openo/msb/wrapper/util/RouteUtilTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * Copyright 2016 ZTE Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.openo.msb.wrapper.util;
-
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class RouteUtilTest {
-
- @Test
- public void testGetPrefixedKey(){
- String path=RouteUtil.getPrefixedKey("","test","v1");
- Assert.assertEquals("msb:routing:test:v1",path);
- }
-
- @Test
- public void testConcat(){
- Object[] str1=new String[]{"test1","test2"};
- Object[] str2=new String[]{"test3"};
- Object[] str3=RouteUtil.concat(str1, str2);
-
- Assert.assertEquals(3,str3.length);
- }
-
- @Test
- public void testContainStr(){
- String value="1";
- String array[]={"1","2"};
- boolean result=RouteUtil.contain(array, value);
- Assert.assertTrue(result);
- }
-
- @Test
- public void testContainArray(){
- String value[]={"0"};
- String array[]={"1","2"};
- boolean result=RouteUtil.contain(array, value);
- Assert.assertFalse(result);
-
- }
-
- @Test
- public void testShow(){
- String array[]={"1","2"};
- String result=RouteUtil.show(array);
- Assert.assertEquals("1|2",result);
-
- }
-
-}
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/apirouteService.exe b/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/apirouteService.exe
deleted file mode 100644
index c6e8fc2..0000000
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/apirouteService.exe
+++ /dev/null
Binary files differ
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/apirouteService.xml b/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/apirouteService.xml
deleted file mode 100644
index 617c66e..0000000
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/apirouteService.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<service>
- <id>msb_apiroute</id>
- <name>msb_apiroute</name>
- <description>This service runs apiroute.</description>
- <workingdirectory>%BASE%</workingdirectory>
- <env name="JAVA_HOME" value="c:\jdk"/>
- <env name="RUNHOME" value="%BASE%"/>
- <executable>java</executable>
- <arguments>-jar "apiroute-service.jar" server "conf/apiroute.yml"</arguments>
- <stopexecutable>stop.bat</stopexecutable>
- <logmode>rotate</logmode>
- <!-- stopparentprocessfirst>true</stopparentprocessfirst -->
-</service> \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/conf/apiroute.yml b/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/conf/apiroute.yml
deleted file mode 100644
index 4fe697d..0000000
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/conf/apiroute.yml
+++ /dev/null
@@ -1,71 +0,0 @@
-#
-# Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
-
-defaultWorkspace: ../apiroute-works
-
-defaultName: ${DW_DEFAULT_NAME:-Stranger}
-
-propertiesName: redis.properties
-propertiesDir: conf
-
-# use the discover config if you want to monitor a discover service and register microservices change
-discoverInfo:
- ip: 127.0.0.1
- port: 10081
- enabled: false
-
-consulInfo:
- ip: 127.0.0.1
- port: 8500
-
-# use the simple server factory if you only want to run on a single port
-server:
- type: simple
- rootPath: '/api/microservices/v1/*'
- applicationContextPath: /
- adminContextPath: /admin
- connector:
- type: http
- port: 8086
-
-# Logging settings.
-logging:
-
- # The default level of all loggers. Can be OFF, ERROR, WARN, INFO, DEBUG, TRACE, or ALL.
- level: ALL
-
- # Logger-specific levels.
- loggers:
-
- # Sets the level for 'com.example.app' to DEBUG.
- com.example: DEBUG
-
- appenders:
- - type: console
- threshold: INFO
- timeZone: UTC
- logFormat: "%-6level [%d{HH:mm:ss.SSS}] [%t] %logger{5} - %X{code} %msg %n"
- - type: file
- threshold: INFO
- logFormat: "%-6level [%d{HH:mm:ss.SSS}] [%t] %logger{5} - %X{code} %msg %n"
- currentLogFilename: ../apiroute-works/logs/application.log
- archivedLogFilenamePattern: ../apiroute-works/logs/application-%d{yyyy-MM-dd}-%i.log.gz
- archivedFileCount: 7
- timeZone: UTC
-
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initUrlRootPath/initUrlRootPath.json b/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initUrlRootPath/initUrlRootPath.json
deleted file mode 100644
index 8684dee..0000000
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initUrlRootPath/initUrlRootPath.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "iuiRootPath" : "openoui",
- "apiRootPath" : "openoapi"
-}
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initVisualRange/initVisualRangeMatches.json b/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initVisualRange/initVisualRangeMatches.json
deleted file mode 100644
index 4554783..0000000
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initVisualRange/initVisualRangeMatches.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "visualRange" : "0,1"
-}
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initVisualRange/readme.txt b/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initVisualRange/readme.txt
deleted file mode 100644
index 36e9244..0000000
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/ext/initVisualRange/readme.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-====
- Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-====
-
-########################## initialize default visualRange Matches from msdiscover to redis ##########################
-
-
-visualRange:����Ŀɼ���Χ ϵͳ��:0 ϵͳ��:1
-
-#when msb is starting, it will automatically read this json file named "initVisualRangeMatches.json"
-
-#when msdiscover will sysn datas to apiGateway,only visualRange Matches will be save to redis.
-
-
-
-# JSON File content must be format array like below examples:
-
-0 or 1 or 0,1 \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/find_kill_process.bat b/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/find_kill_process.bat
deleted file mode 100644
index 6700cfe..0000000
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/find_kill_process.bat
+++ /dev/null
@@ -1,27 +0,0 @@
-@REM
-@REM Copyright 2016 ZTE Corporation.
-@REM
-@REM Licensed under the Apache License, Version 2.0 (the "License");
-@REM you may not use this file except in compliance with the License.
-@REM You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-@REM
-@REM Author: Zhaoxing Meng
-@REM email: meng.zhaoxing1@zte.com.cn
-@REM
-
-echo %1 | findstr %2 | findstr %3>NUL
-echo ERRORLEVEL=%ERRORLEVEL%
-IF ERRORLEVEL 1 goto findend
-for /f "tokens=1" %%a in (%1) do (
- echo kill %1
- taskkill /F /pid %%a
-)
-:findend \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/run.bat b/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/run.bat
deleted file mode 100644
index a67407a..0000000
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/run.bat
+++ /dev/null
@@ -1,59 +0,0 @@
-@REM
-@REM Copyright 2016 ZTE Corporation.
-@REM
-@REM Licensed under the Apache License, Version 2.0 (the "License");
-@REM you may not use this file except in compliance with the License.
-@REM You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-@REM
-@REM Author: Zhaoxing Meng
-@REM email: meng.zhaoxing1@zte.com.cn
-@REM
-
-@echo off
-title apiroute-service
-
-set RUNHOME=%~dp0
-echo ### RUNHOME: %RUNHOME%
-
-echo ### Starting apiroute-service
-rem cd /d %RUNHOME%
-
-rem set JAVA_HOME=D:\JDK1.7\jdk\jdk\windows
-set JAVA="%JAVA_HOME%\bin\java.exe"
-set port=8777
-
-setlocal enabledelayedexpansion
-set index=1
-FOR /F "tokens=3 delims= " %%a in ('"%JAVA% -version 2>&1"')do (
- if !index! equ 1 set JAVA_VERSION=%%a
- set /a index=index+1
-)
-set JAVA_VERSION=%JAVA_VERSION:~1,3%
-if "%JAVA_VERSION%"=="1.8" (
- set jvm_opts=-Xms16m -Xmx128m -XX:+UseSerialGC -XX:MaxMetaspaceSize=64m -XX:NewRatio=2
-) else (
- set jvm_opts=-Xms16m -Xmx128m -XX:+UseSerialGC -XX:MaxPermSize=64m -XX:NewRatio=2
-)
-
-set jvm_opts=%jvm_opts% -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=%port%,server=y,suspend=n
-set class_path=%RUNHOME%;%RUNHOME%apiroute-service.jar
-echo ### jvm_opts: %jvm_opts%
-echo ### class_path: %class_path%
-
-%JAVA% -classpath %class_path% %jvm_opts% org.openo.msb.ApiRouteApp server %RUNHOME%conf/apiroute.yml
-
-IF ERRORLEVEL 1 goto showerror
-exit
-:showerror
-echo WARNING: Error occurred during startup or Server abnormally stopped by way of killing the process,Please check!
-echo After checking, press any key to close
-pause
-exit \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/stop.bat b/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/stop.bat
deleted file mode 100644
index 2782930..0000000
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/stop.bat
+++ /dev/null
@@ -1,38 +0,0 @@
-@REM
-@REM Copyright 2016 ZTE Corporation.
-@REM
-@REM Licensed under the Apache License, Version 2.0 (the "License");
-@REM you may not use this file except in compliance with the License.
-@REM You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-@REM
-@REM Author: Zhaoxing Meng
-@REM email: meng.zhaoxing1@zte.com.cn
-@REM
-
-@echo off
-title stopping apiroute-service
-
-set HOME=%~dp0
-set APIROUTE_Main_Class="org.openo.msb.ApiRouteApp"
-
-echo ================== apiroute info =============================================
-echo HOME=$HOME
-echo APIROUTE_Main_Class=%APIROUTE_Main_Class%
-echo ===============================================================================
-
-echo ### Stopping apiroute-service
-cd /d %HOME%
-
-rem set JAVA_HOME=D:\WorkSoftware\jdk1.7.0_60
-for /f "delims=" %%i in ('%JAVA_HOME%\bin\jcmd') do (
- call find_kill_process "%%i" %APIROUTE_Main_Class% %HOME%
-)
-exit \ No newline at end of file
diff --git a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/stop.sh b/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/stop.sh
deleted file mode 100644
index d9b33e9..0000000
--- a/msb-core/apiroute/apiroute-standalone/src/assembly/resource/apiroute/stop.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2016 ZTE Corporation.
-#
-# 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.
-#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
-
-DIRNAME=`dirname $0`
-HOME=`cd $DIRNAME/; pwd`
-APIROUTE_Main_Class="org.openo.msb.ApiRouteApp"
-
-echo ================== apiroute info =============================================
-echo HOME=$HOME
-echo APIROUTE_Main_Class=$APIROUTE_Main_Class
-echo ===============================================================================
-cd $HOME; pwd
-
-echo @WORK_DIR@ $HOME
-
-function save_apiroute_pid(){
- apiroute_id=`ps -ef | grep $APIROUTE_Main_Class | grep $HOME | grep -v grep | awk '{print $2}'`
- echo $apiroute_id
-}
-
-function kill_apiroute_process(){
- ps -p $apiroute_id
- if [ $? == 0 ]; then
- kill -9 $apiroute_id
- fi
-}
-
-save_apiroute_pid;
-echo @C_CMD@ kill -9 $apiroute_id
-kill_apiroute_process; \ No newline at end of file
diff --git a/msb-core/apiroute/pom.xml b/msb-core/apiroute/pom.xml
deleted file mode 100644
index dc39f06..0000000
--- a/msb-core/apiroute/pom.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>msb-core-parent</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>apiroute-parent</artifactId>
- <name>common-services-microservice-bus/msb-core/apiroute</name>
- <packaging>pom</packaging>
- <version>1.1.0-SNAPSHOT</version>
-
- <modules>
- <module>apiroute-service</module>
- <module>apiroute-standalone</module>
- </modules>
-
-</project>
diff --git a/msb-core/distributions/pom.xml b/msb-core/distributions/pom.xml
deleted file mode 100644
index 977a42d..0000000
--- a/msb-core/distributions/pom.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>msb-core-parent</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>distributions-parent</artifactId>
- <name>common-services-microservice-bus/msb-core/distributions</name>
- <packaging>pom</packaging>
- <version>1.1.0-SNAPSHOT</version>
-
- <modules>
- <module>standalone</module>
- </modules>
-
- <properties>
- <version.output>target/version</version.output>
- <dockerFileDir>src/main/docker</dockerFileDir>
- </properties>
-
-</project>
diff --git a/msb-core/distributions/standalone/pom.xml b/msb-core/distributions/standalone/pom.xml
deleted file mode 100644
index f279928..0000000
--- a/msb-core/distributions/standalone/pom.xml
+++ /dev/null
@@ -1,250 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <parent>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>distributions-parent</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>msb-core-standalone</artifactId>
- <name>common-services-microservice-bus/msb-core/distributions/standalone</name>
- <packaging>pom</packaging>
- <version>1.1.0-SNAPSHOT</version>
-
- <properties>
- <packageid>msb-standalone</packageid>
- <linux64id>linux64</linux64id>
- <win64id>win64</win64id>
- <linux64outputdir>target/assembly/${linux64id}</linux64outputdir>
- <win64outputdir>target/assembly/${win64id}</win64outputdir>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>apiroute-standalone</artifactId>
- <version>${project.version}</version>
- <type>zip</type>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>redis-ext</artifactId>
- <type>tar.gz</type>
- <classifier>linux64</classifier>
- <version>${project.version}</version>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>openresty-ext</artifactId>
- <type>tar.gz</type>
- <classifier>linux64</classifier>
- <version>${project.version}</version>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>eag-openresty-ext</artifactId>
- <type>zip</type>
- <version>${project.version}</version>
- <optional>true</optional>
- </dependency>
-
-
- </dependencies>
- <build>
-
- <plugins>
- <plugin>
- <artifactId>maven-resources-plugin</artifactId>
- <executions>
- <execution>
- <id>copy-resources-dockerfile</id>
- <phase>prepare-package</phase>
- <goals>
- <goal>copy-resources</goal>
- </goals>
- <configuration>
- <outputDirectory>${version.output}</outputDirectory>
- <includeEmptyDirs>true</includeEmptyDirs>
- <resources>
- <resource>
- <directory>${dockerFileDir}</directory>
- <filtering>false</filtering>
- <includes>
- <include>**/*</include>
- </includes>
- </resource>
- </resources>
- <overwrite>true</overwrite>
- </configuration>
- </execution>
- <execution>
- <id>copy-msb-resources-${linux64id}</id>
- <phase>prepare-package</phase>
- <goals>
- <goal>copy-resources</goal>
- </goals>
- <configuration>
- <outputDirectory>${linux64outputdir}</outputDirectory>
- <includeEmptyDirs>true</includeEmptyDirs>
- <resources>
- <resource>
- <directory>src/assembly/resource/</directory>
- <filtering>false</filtering>
- <includes>
- <include>**/*</include>
- </includes>
- <excludes>
- <exclude>**/*.bat</exclude>
- </excludes>
- </resource>
- </resources>
- <overwrite>true</overwrite>
- </configuration>
- </execution>
- </executions>
- </plugin>
-
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <id>unpacktolinux64</id>
- <goals>
- <goal>unpack</goal>
- </goals>
- <phase>prepare-package</phase>
- <configuration>
- <artifactItems>
- <artifactItem>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>apiroute-standalone</artifactId>
- <type>zip</type>
- </artifactItem>
- <artifactItem>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>redis-ext</artifactId>
- <type>tar.gz</type>
- <classifier>linux64</classifier>
- </artifactItem>
- <artifactItem>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>openresty-ext</artifactId>
- <type>tar.gz</type>
- <classifier>linux64</classifier>
- </artifactItem>
- </artifactItems>
- <excludes>**/*.bat,*.cmd</excludes>
- <outputDirectory>${linux64outputdir}</outputDirectory>
- <overWriteReleases>false</overWriteReleases>
- <overWriteSnapshots>true</overWriteSnapshots>
- <outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
- </configuration>
- </execution>
-
- <execution>
- <id>eag-unpacktolinux64</id>
- <goals>
- <goal>unpack</goal>
- </goals>
- <phase>prepare-package</phase>
- <configuration>
- <artifactItems>
- <artifactItem>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>openresty-ext</artifactId>
- <type>tar.gz</type>
- <classifier>linux64</classifier>
- </artifactItem>
- <artifactItem>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>eag-openresty-ext</artifactId>
- <type>zip</type>
- </artifactItem>
- </artifactItems>
- <excludes>**/*.bat,*.cmd</excludes>
- <outputDirectory>${linux64outputdir}/eag</outputDirectory>
- <overWriteReleases>false</overWriteReleases>
- <overWriteSnapshots>true</overWriteSnapshots>
- <outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
- </configuration>
- </execution>
- </executions>
- </plugin>
-
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-antrun-plugin</artifactId>
- <executions>
-
- <execution>
- <id>prepare-eag-openresty-linux</id>
- <phase>prepare-package</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <target>
- <copy todir="${linux64outputdir}/eag/">
- <fileset dir="${linux64outputdir}/eag/openresty"/>
- </copy>
- <delete dir="${linux64outputdir}/eag/openresty" includeemptydirs="true"/>
- </target>
- </configuration>
- </execution>
-
- <execution>
- <id>distribution</id>
- <phase>package</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <target name="distribution">
- <tar destfile="${version.output}/${packageid}-${project.version}-linux64.tar.gz" longfile="posix" compression="gzip">
- <tarfileset dir="target/assembly/linux64" filemode="0644" dirmode="0755">
- <exclude name="**/*.sh"/>
- <exclude name="openresty/nginx/sbin/nginx"/>
- <exclude name="eag/nginx/sbin/nginx"/>
- <exclude name="redis/redis-*"/>
- </tarfileset>
- <tarfileset dir="target/assembly/linux64" filemode="0755" dirmode="0755">
- <include name="**/*.sh"/>
- <include name="openresty/nginx/sbin/nginx"/>
- <include name="eag/nginx/sbin/nginx"/>
- <include name="redis/redis-*"/>
- </tarfileset>
- </tar>
- <attachartifact file="${version.output}/${packageid}-${project.version}-linux64.tar.gz" classifier="linux64" type="tar.gz"/>
- </target>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
-</project>
diff --git a/msb-core/distributions/standalone/src/assembly/resource/servicesInstall.bat b/msb-core/distributions/standalone/src/assembly/resource/servicesInstall.bat
deleted file mode 100644
index d04d064..0000000
--- a/msb-core/distributions/standalone/src/assembly/resource/servicesInstall.bat
+++ /dev/null
@@ -1,38 +0,0 @@
-@REM
-@REM Copyright 2016 ZTE Corporation.
-@REM
-@REM Licensed under the Apache License, Version 2.0 (the "License");
-@REM you may not use this file except in compliance with the License.
-@REM You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-@REM
-@REM Author: Zhaoxing Meng
-@REM email: meng.zhaoxing1@zte.com.cn
-@REM
-
-@echo off
-title msb install services
-
-set RUNHOME=%~dp0
-
-echo ### install redis
-cd "%RUNHOME%\redis"
-redisService.exe install
-
-echo ### install apiroute
-cd "%RUNHOME%\apiroute"
-apirouteService.exe install
-
-echo ### install openresty
-cd "%RUNHOME%\openresty\nginx"
-openrestyService.exe install
-
-:finalend
-cd "%RUNHOME%" \ No newline at end of file
diff --git a/msb-core/distributions/standalone/src/assembly/resource/servicesRestart.bat b/msb-core/distributions/standalone/src/assembly/resource/servicesRestart.bat
deleted file mode 100644
index c66a6e3..0000000
--- a/msb-core/distributions/standalone/src/assembly/resource/servicesRestart.bat
+++ /dev/null
@@ -1,38 +0,0 @@
-@REM
-@REM Copyright 2016 ZTE Corporation.
-@REM
-@REM Licensed under the Apache License, Version 2.0 (the "License");
-@REM you may not use this file except in compliance with the License.
-@REM You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-@REM
-@REM Author: Zhaoxing Meng
-@REM email: meng.zhaoxing1@zte.com.cn
-@REM
-
-@echo off
-title msb restart services
-
-set RUNHOME=%~dp0
-
-echo ### restart redis
-cd "%RUNHOME%\redis"
-redisService.exe restart
-
-echo ### restart apiroute
-cd "%RUNHOME%\apiroute"
-apirouteService.exe restart
-
-echo ### restart openresty
-cd "%RUNHOME%\openresty\nginx"
-openrestyService.exe restart
-
-:finalend
-cd "%RUNHOME%" \ No newline at end of file
diff --git a/msb-core/distributions/standalone/src/assembly/resource/servicesStatus.bat b/msb-core/distributions/standalone/src/assembly/resource/servicesStatus.bat
deleted file mode 100644
index 3415747..0000000
--- a/msb-core/distributions/standalone/src/assembly/resource/servicesStatus.bat
+++ /dev/null
@@ -1,38 +0,0 @@
-@REM
-@REM Copyright 2016 ZTE Corporation.
-@REM
-@REM Licensed under the Apache License, Version 2.0 (the "License");
-@REM you may not use this file except in compliance with the License.
-@REM You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-@REM
-@REM Author: Zhaoxing Meng
-@REM email: meng.zhaoxing1@zte.com.cn
-@REM
-
-@echo off
-title msb status services
-
-set RUNHOME=%~dp0
-
-echo ### status redis
-cd "%RUNHOME%\redis"
-redisService.exe status
-
-echo ### status apiroute
-cd "%RUNHOME%\apiroute"
-apirouteService.exe status
-
-echo ### status openresty
-cd "%RUNHOME%\openresty\nginx"
-openrestyService.exe status
-
-:finalend
-cd "%RUNHOME%" \ No newline at end of file
diff --git a/msb-core/distributions/standalone/src/assembly/resource/servicesUninstall.bat b/msb-core/distributions/standalone/src/assembly/resource/servicesUninstall.bat
deleted file mode 100644
index 5a5bc0b..0000000
--- a/msb-core/distributions/standalone/src/assembly/resource/servicesUninstall.bat
+++ /dev/null
@@ -1,41 +0,0 @@
-@REM
-@REM Copyright 2016 ZTE Corporation.
-@REM
-@REM Licensed under the Apache License, Version 2.0 (the "License");
-@REM you may not use this file except in compliance with the License.
-@REM You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-@REM
-@REM Author: Zhaoxing Meng
-@REM email: meng.zhaoxing1@zte.com.cn
-@REM
-
-@echo off
-title msb uninstall services
-
-set RUNHOME=%~dp0
-
-echo ### uninstall redis
-cd "%RUNHOME%\redis"
-redisService.exe stop
-redisService.exe uninstall
-
-echo ### uninstall apiroute
-cd "%RUNHOME%\apiroute"
-apirouteService.exe stop
-apirouteService.exe uninstall
-
-echo ### uninstall openresty
-cd "%RUNHOME%\openresty\nginx"
-openrestyService.exe stop
-openrestyService.exe uninstall
-
-:finalend
-cd "%RUNHOME%" \ No newline at end of file
diff --git a/msb-core/distributions/standalone/src/assembly/resource/startup.bat b/msb-core/distributions/standalone/src/assembly/resource/startup.bat
deleted file mode 100644
index 30e23de..0000000
--- a/msb-core/distributions/standalone/src/assembly/resource/startup.bat
+++ /dev/null
@@ -1,46 +0,0 @@
-@REM
-@REM Copyright 2016 ZTE Corporation.
-@REM
-@REM Licensed under the Apache License, Version 2.0 (the "License");
-@REM you may not use this file except in compliance with the License.
-@REM You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-@REM
-@REM Author: Zhaoxing Meng
-@REM email: meng.zhaoxing1@zte.com.cn
-@REM
-
-@echo off
-title msb
-
-set RUNHOME=%~dp0
-echo ##RUNHOME %RUNHOME%
-
-rem dir /B /S run.bat > %~dp0\run.tmp
-rem For /f %%i in (%~dp0\run.tmp) DO start %%i
-
-echo ### Starting redis
-start /D %RUNHOME%redis run.bat
-
-echo ### Starting apiroute
-start /D %RUNHOME%apiroute run.bat run
-
-echo ### Starting openresty
-start /D %RUNHOME%openresty run.bat
-
-echo ### Starting external API gateway
-start /D %RUNHOME%eag run.bat
-
-echo Startup will be finished in background...
-echo + Run "start .\apiroute-works\logs\application.log" to see what's happening
-echo + Wait a minute
-echo + Open "http://<HOST>" in your browser to access the microservice bus !
-rem del run.tmp
-:finalend \ No newline at end of file
diff --git a/msb-core/distributions/standalone/src/assembly/resource/stop.bat b/msb-core/distributions/standalone/src/assembly/resource/stop.bat
deleted file mode 100644
index 0ebe78e..0000000
--- a/msb-core/distributions/standalone/src/assembly/resource/stop.bat
+++ /dev/null
@@ -1,44 +0,0 @@
-@REM
-@REM Copyright 2016 ZTE Corporation.
-@REM
-@REM Licensed under the Apache License, Version 2.0 (the "License");
-@REM you may not use this file except in compliance with the License.
-@REM You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-@REM
-@REM Author: Zhaoxing Meng
-@REM email: meng.zhaoxing1@zte.com.cn
-@REM
-
-@echo off
-title stopping msb
-
-set RUNHOME=%~dp0
-echo ##RUNHOME %RUNHOME%
-
-rem dir /B /S stop.bat > %~dp0\stop.tmp
-rem For /f %%i in (%~dp0\stop.tmp) DO start %%i
-
-echo ### Stopping openresty
-start /D %RUNHOME%openresty stop.bat
-
-echo ### Stopping external API gateway
-start /D %RUNHOME%eag stop.bat
-
-echo ### Stopping apiroute
-start /D %RUNHOME%apiroute stop.bat
-
-echo ### Stopping redis
-start /D %RUNHOME%redis stop.bat
-
-echo "Closing signal has been sent!";
-echo "Stopping in background,wait for a moment";
-rem del stop.tmp
-:finalend \ No newline at end of file
diff --git a/msb-core/eag-openresty-ext/pom.xml b/msb-core/eag-openresty-ext/pom.xml
deleted file mode 100644
index e9a2551..0000000
--- a/msb-core/eag-openresty-ext/pom.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>msb-core-parent</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- </parent>
-
-
- <modelVersion>4.0.0</modelVersion>
- <artifactId>eag-openresty-ext</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <name>common-services-microservice-bus/msb-core/eag-openresty-ext</name>
- <packaging>pom</packaging>
-
- <properties>
- <outputdir>target/assembly</outputdir>
- <packageid>eag-openresty-ext</packageid>
- </properties>
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-resources-plugin</artifactId>
- <configuration>
- <includeEmptyDirs>true</includeEmptyDirs>
- </configuration>
- <executions>
- <execution>
- <id>copy-resources</id>
- <phase>process-resources</phase>
- <goals>
- <goal>copy-resources</goal>
- </goals>
- <configuration>
- <outputDirectory>${outputdir}</outputDirectory>
- <resources>
- <resource>
- <directory>../openresty-ext/src/assembly/resources/</directory>
- <filtering>false</filtering>
- <includes>
- <include>**/*</include>
- </includes>
- </resource>
- </resources>
- <overwrite>true</overwrite>
- </configuration>
- </execution>
-
- <execution>
- <id>eag-copy-resources</id>
- <phase>process-resources</phase>
- <goals>
- <goal>copy-resources</goal>
- </goals>
- <configuration>
- <outputDirectory>${outputdir}</outputDirectory>
- <resources>
- <resource>
- <directory>src/assembly/resources/</directory>
- <filtering>false</filtering>
- <includes>
- <include>**/*</include>
- </includes>
- </resource>
- </resources>
- <overwrite>true</overwrite>
- </configuration>
- </execution>
-
- </executions>
- </plugin>
-
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-antrun-plugin</artifactId>
- <executions>
- <execution>
- <id>distribution</id>
- <phase>package</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <target name="distribution">
- <zip destfile="target/${packageid}-${project.version}.zip" update="true">
- <zipfileset dir="target/assembly/" includes="**"/>
- </zip>
- <attachartifact file="target/${packageid}-${project.version}.zip" type="zip"/>
- </target>
- </configuration>
- </execution>
- </executions>
- </plugin>
-
- </plugins>
- </build>
-
-
-</project>
diff --git a/msb-core/eag-openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/openomsb.conf b/msb-core/eag-openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/openomsb.conf
deleted file mode 100644
index 6bf5e07..0000000
--- a/msb-core/eag-openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/openomsb.conf
+++ /dev/null
@@ -1,181 +0,0 @@
-#
-# Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
-
-server {
- listen 8181;
- default_type text/html;
- add_header X-Cache-Status $upstream_cache_status;
-
- location = / {
- rewrite ^ /openoui/common/login.html redirect;
- }
-
- location = /openoui/microservices {
- rewrite /openoui/microservices /openoui/microservices/index.html redirect;
- }
-
- location / {
- set $server "fallback";
- set $url "";
- set $key "";
-
- # Lua files
- rewrite_by_lua_file luaext/customrouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_pass http://$server;
- }
- location ~ ^/api/(.*) {
- rewrite ^/api/(.*) /openoapi/$1 last;
- }
- location ~ ^/iui/(.*) {
- rewrite ^/iui/(.*) /openoui/$1 last;
- }
-
- location ^~ /openoapi/driver_ {
- set $backend "";
- # Lua files
- access_by_lua_block {
- local driver_manager = require('plugins.driver_manager')
- driver_manager.access()
- }
- proxy_pass http://$backend;
- }
- location ~ ^/openoapi/([^/]+)(/[Vv][^/]*)?(.*) {
-
- #Send requests to Driver Mgr. if 'X_Driver_Parameter' header found in the request
- if ($http_X_Driver_Parameter) {
- rewrite_by_lua_block {
- local driver_manager = require('plugins.driver_manager')
- driver_manager.access()
- }
- }
-
- set $apiname $1;
- set $apiversion $2;
- set $apiserver "fallback";
- set $apiurl "";
-
- # Lua files
- rewrite_by_lua_file luaext/openoapirouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_pass http://$apiserver;
- }
-
- location ~ ^/openoui/([^/]+)(.*) {
- location ~* ^/iui/([^/]+)(.*)\.(?:png|jpg|jpeg|js|css|html|gif|ico|bmp|woff)$ {
- set $iuiname $1;
- set $iuiparam $2;
- set $iuiserver "fallback";
- set $iuiurl "";
-
- # Lua files
- rewrite_by_lua_file luaext/openouirouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_cache nginx_cache;
- proxy_cache_key $host$uri$is_args$args;
- proxy_cache_valid 200 304 12h ;
- proxy_cache_valid 301 302 1m ;
- proxy_cache_valid any 1m ;
- expires 12h;
-
- proxy_pass http://$iuiserver;
- }
- set $iuiname $1;
- set $iuiparam $2;
- set $iuiserver "fallback";
- set $iuiurl "";
-
- # Lua files
- rewrite_by_lua_file luaext/openouirouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_pass http://$iuiserver;
- }
-
- location ~ ^/admin/([^/]+)(/[Vv][^/]*)?(.*) {
- set $apiname $1;
- set $apiversion $2;
- set $apiserver "fallback";
- set $adminurl "";
-
- # Lua files
- rewrite_by_lua_file luaext/openoadminrouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_pass http://$apiserver;
- }
-
- location ~ ^/apijson/([^/]+)(/[Vv][^/]*)?(.*) {
- location ~* ^/apijson/([^/]+)(/[v][^/]*)?(.*)\.(?:png|jpg|jpeg|js|css|html|gif|ico|bmp|woff)$ {
- set $apiname $1;
- set $apiversion $2;
- set $apiserver "fallback";
- set $apijsonurl "";
-
- # Lua files
- rewrite_by_lua_file luaext/openoapijsonrouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_cache nginx_cache;
- proxy_cache_key $host$uri$is_args$args;
- proxy_cache_valid 200 304 12h ;
- proxy_cache_valid 301 302 1m ;
- proxy_cache_valid any 1m ;
- expires 12h;
-
- proxy_pass http://$apiserver;
- }
- set $apiname $1;
- set $apiversion $2;
- set $apiserver "fallback";
- set $apijsonurl "";
-
- # Lua files
- rewrite_by_lua_file luaext/openoapijsonrouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_pass http://$apiserver;
- }
-
- location ~* \.(?:png|jpg|jpeg|js|css|html|gif|ico|bmp|woff)$ {
- set $server "fallback";
- set $url "";
- set $key "";
-
- # Lua files
- rewrite_by_lua_file luaext/customrouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_cache nginx_cache;
- proxy_cache_key $host$uri$is_args$args;
- proxy_cache_valid 200 304 12h ;
- proxy_cache_valid 301 302 1m ;
- proxy_cache_valid any 1m ;
- expires 12h;
-
- proxy_pass http://$server;
- }
-
- location = /favicon.ico {
- log_not_found off;
- }
-} \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/lualib/resty/http.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/lualib/resty/http.lua
deleted file mode 100644
index 94f9813..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/lualib/resty/http.lua
+++ /dev/null
@@ -1,850 +0,0 @@
-local http_headers = require "resty.http_headers"
-
-local ngx_socket_tcp = ngx.socket.tcp
-local ngx_req = ngx.req
-local ngx_req_socket = ngx_req.socket
-local ngx_req_get_headers = ngx_req.get_headers
-local ngx_req_get_method = ngx_req.get_method
-local str_gmatch = string.gmatch
-local str_lower = string.lower
-local str_upper = string.upper
-local str_find = string.find
-local str_sub = string.sub
-local str_gsub = string.gsub
-local tbl_concat = table.concat
-local tbl_insert = table.insert
-local ngx_encode_args = ngx.encode_args
-local ngx_re_match = ngx.re.match
-local ngx_re_gsub = ngx.re.gsub
-local ngx_log = ngx.log
-local ngx_DEBUG = ngx.DEBUG
-local ngx_ERR = ngx.ERR
-local ngx_NOTICE = ngx.NOTICE
-local ngx_var = ngx.var
-local co_yield = coroutine.yield
-local co_create = coroutine.create
-local co_status = coroutine.status
-local co_resume = coroutine.resume
-
-
--- http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.5.1
-local HOP_BY_HOP_HEADERS = {
- ["connection"] = true,
- ["keep-alive"] = true,
- ["proxy-authenticate"] = true,
- ["proxy-authorization"] = true,
- ["te"] = true,
- ["trailers"] = true,
- ["transfer-encoding"] = true,
- ["upgrade"] = true,
- ["content-length"] = true, -- Not strictly hop-by-hop, but Nginx will deal
- -- with this (may send chunked for example).
-}
-
-
--- Reimplemented coroutine.wrap, returning "nil, err" if the coroutine cannot
--- be resumed. This protects user code from inifite loops when doing things like
--- repeat
--- local chunk, err = res.body_reader()
--- if chunk then -- <-- This could be a string msg in the core wrap function.
--- ...
--- end
--- until not chunk
-local co_wrap = function(func)
- local co = co_create(func)
- if not co then
- return nil, "could not create coroutine"
- else
- return function(...)
- if co_status(co) == "suspended" then
- return select(2, co_resume(co, ...))
- else
- return nil, "can't resume a " .. co_status(co) .. " coroutine"
- end
- end
- end
-end
-
-
-local _M = {
- _VERSION = '0.09',
-}
-_M._USER_AGENT = "lua-resty-http/" .. _M._VERSION .. " (Lua) ngx_lua/" .. ngx.config.ngx_lua_version
-
-local mt = { __index = _M }
-
-
-local HTTP = {
- [1.0] = " HTTP/1.0\r\n",
- [1.1] = " HTTP/1.1\r\n",
-}
-
-local DEFAULT_PARAMS = {
- method = "GET",
- path = "/",
- version = 1.1,
-}
-
-
-function _M.new(self)
- local sock, err = ngx_socket_tcp()
- if not sock then
- return nil, err
- end
- return setmetatable({ sock = sock, keepalive = true }, mt)
-end
-
-
-function _M.set_timeout(self, timeout)
- local sock = self.sock
- if not sock then
- return nil, "not initialized"
- end
-
- return sock:settimeout(timeout)
-end
-
-
-function _M.ssl_handshake(self, ...)
- local sock = self.sock
- if not sock then
- return nil, "not initialized"
- end
-
- self.ssl = true
-
- return sock:sslhandshake(...)
-end
-
-
-function _M.connect(self, ...)
- local sock = self.sock
- if not sock then
- return nil, "not initialized"
- end
-
- self.host = select(1, ...)
- self.port = select(2, ...)
-
- -- If port is not a number, this is likely a unix domain socket connection.
- if type(self.port) ~= "number" then
- self.port = nil
- end
-
- self.keepalive = true
-
- return sock:connect(...)
-end
-
-
-function _M.set_keepalive(self, ...)
- local sock = self.sock
- if not sock then
- return nil, "not initialized"
- end
-
- if self.keepalive == true then
- return sock:setkeepalive(...)
- else
- -- The server said we must close the connection, so we cannot setkeepalive.
- -- If close() succeeds we return 2 instead of 1, to differentiate between
- -- a normal setkeepalive() failure and an intentional close().
- local res, err = sock:close()
- if res then
- return 2, "connection must be closed"
- else
- return res, err
- end
- end
-end
-
-
-function _M.get_reused_times(self)
- local sock = self.sock
- if not sock then
- return nil, "not initialized"
- end
-
- return sock:getreusedtimes()
-end
-
-
-function _M.close(self)
- local sock = self.sock
- if not sock then
- return nil, "not initialized"
- end
-
- return sock:close()
-end
-
-
-local function _should_receive_body(method, code)
- if method == "HEAD" then return nil end
- if code == 204 or code == 304 then return nil end
- if code >= 100 and code < 200 then return nil end
- return true
-end
-
-
-function _M.parse_uri(self, uri)
- local m, err = ngx_re_match(uri, [[^(http[s]?)://([^:/]+)(?::(\d+))?(.*)]],
- "jo")
-
- if not m then
- if err then
- return nil, "failed to match the uri: " .. uri .. ", " .. err
- end
-
- return nil, "bad uri: " .. uri
- else
- if m[3] then
- m[3] = tonumber(m[3])
- else
- if m[1] == "https" then
- m[3] = 443
- else
- m[3] = 80
- end
- end
- if not m[4] or "" == m[4] then m[4] = "/" end
- return m, nil
- end
-end
-
-
-local function _format_request(params)
- local version = params.version
- local headers = params.headers or {}
-
- local query = params.query or ""
- if query then
- if type(query) == "table" then
- query = "?" .. ngx_encode_args(query)
- end
- end
-
- -- Initialize request
- local req = {
- str_upper(params.method),
- " ",
- params.path,
- query,
- HTTP[version],
- -- Pre-allocate slots for minimum headers and carriage return.
- true,
- true,
- true,
- }
- local c = 6 -- req table index it's faster to do this inline vs table.insert
-
- -- Append headers
- for key, values in pairs(headers) do
- if type(values) ~= "table" then
- values = {values}
- end
-
- key = tostring(key)
- for _, value in pairs(values) do
- req[c] = key .. ": " .. tostring(value) .. "\r\n"
- c = c + 1
- end
- end
-
- -- Close headers
- req[c] = "\r\n"
-
- return tbl_concat(req)
-end
-
-
-local function _receive_status(sock)
- local line, err = sock:receive("*l")
- if not line then
- return nil, nil, nil, err
- end
-
- return tonumber(str_sub(line, 10, 12)), tonumber(str_sub(line, 6, 8)), str_sub(line, 14)
-end
-
-
-
-local function _receive_headers(sock)
- local headers = http_headers.new()
-
- repeat
- local line, err = sock:receive("*l")
- if not line then
- return nil, err
- end
-
- for key, val in str_gmatch(line, "([^:%s]+):%s*(.+)") do
- if headers[key] then
- if type(headers[key]) ~= "table" then
- headers[key] = { headers[key] }
- end
- tbl_insert(headers[key], tostring(val))
- else
- headers[key] = tostring(val)
- end
- end
- until str_find(line, "^%s*$")
-
- return headers, nil
-end
-
-
-local function _chunked_body_reader(sock, default_chunk_size)
- return co_wrap(function(max_chunk_size)
- local max_chunk_size = max_chunk_size or default_chunk_size
- local remaining = 0
- local length
-
- repeat
- -- If we still have data on this chunk
- if max_chunk_size and remaining > 0 then
-
- if remaining > max_chunk_size then
- -- Consume up to max_chunk_size
- length = max_chunk_size
- remaining = remaining - max_chunk_size
- else
- -- Consume all remaining
- length = remaining
- remaining = 0
- end
- else -- This is a fresh chunk
-
- -- Receive the chunk size
- local str, err = sock:receive("*l")
- if not str then
- co_yield(nil, err)
- end
-
- length = tonumber(str, 16)
-
- if not length then
- co_yield(nil, "unable to read chunksize")
- end
-
- if max_chunk_size and length > max_chunk_size then
- -- Consume up to max_chunk_size
- remaining = length - max_chunk_size
- length = max_chunk_size
- end
- end
-
- if length > 0 then
- local str, err = sock:receive(length)
- if not str then
- co_yield(nil, err)
- end
-
- max_chunk_size = co_yield(str) or default_chunk_size
-
- -- If we're finished with this chunk, read the carriage return.
- if remaining == 0 then
- sock:receive(2) -- read \r\n
- end
- else
- -- Read the last (zero length) chunk's carriage return
- sock:receive(2) -- read \r\n
- end
-
- until length == 0
- end)
-end
-
-
-local function _body_reader(sock, content_length, default_chunk_size)
- return co_wrap(function(max_chunk_size)
- local max_chunk_size = max_chunk_size or default_chunk_size
-
- if not content_length and max_chunk_size then
- -- We have no length, but wish to stream.
- -- HTTP 1.0 with no length will close connection, so read chunks to the end.
- repeat
- local str, err, partial = sock:receive(max_chunk_size)
- if not str and err == "closed" then
- max_chunk_size = tonumber(co_yield(partial, err) or default_chunk_size)
- end
-
- max_chunk_size = tonumber(co_yield(str) or default_chunk_size)
- if max_chunk_size and max_chunk_size < 0 then max_chunk_size = nil end
-
- if not max_chunk_size then
- ngx_log(ngx_ERR, "Buffer size not specified, bailing")
- break
- end
- until not str
-
- elseif not content_length then
- -- We have no length but don't wish to stream.
- -- HTTP 1.0 with no length will close connection, so read to the end.
- co_yield(sock:receive("*a"))
-
- elseif not max_chunk_size then
- -- We have a length and potentially keep-alive, but want everything.
- co_yield(sock:receive(content_length))
-
- else
- -- We have a length and potentially a keep-alive, and wish to stream
- -- the response.
- local received = 0
- repeat
- local length = max_chunk_size
- if received + length > content_length then
- length = content_length - received
- end
-
- if length > 0 then
- local str, err = sock:receive(length)
- if not str then
- max_chunk_size = tonumber(co_yield(nil, err) or default_chunk_size)
- end
- received = received + length
-
- max_chunk_size = tonumber(co_yield(str) or default_chunk_size)
- if max_chunk_size and max_chunk_size < 0 then max_chunk_size = nil end
-
- if not max_chunk_size then
- ngx_log(ngx_ERR, "Buffer size not specified, bailing")
- break
- end
- end
-
- until length == 0
- end
- end)
-end
-
-
-local function _no_body_reader()
- return nil
-end
-
-
-local function _read_body(res)
- local reader = res.body_reader
-
- if not reader then
- -- Most likely HEAD or 304 etc.
- return nil, "no body to be read"
- end
-
- local chunks = {}
- local c = 1
-
- local chunk, err
- repeat
- chunk, err = reader()
-
- if err then
- return nil, err, tbl_concat(chunks) -- Return any data so far.
- end
- if chunk then
- chunks[c] = chunk
- c = c + 1
- end
- until not chunk
-
- return tbl_concat(chunks)
-end
-
-
-local function _trailer_reader(sock)
- return co_wrap(function()
- co_yield(_receive_headers(sock))
- end)
-end
-
-
-local function _read_trailers(res)
- local reader = res.trailer_reader
- if not reader then
- return nil, "no trailers"
- end
-
- local trailers = reader()
- setmetatable(res.headers, { __index = trailers })
-end
-
-
-local function _send_body(sock, body)
- if type(body) == 'function' then
- repeat
- local chunk, err, partial = body()
-
- if chunk then
- local ok,err = sock:send(chunk)
-
- if not ok then
- return nil, err
- end
- elseif err ~= nil then
- return nil, err, partial
- end
-
- until chunk == nil
- elseif body ~= nil then
- local bytes, err = sock:send(body)
-
- if not bytes then
- return nil, err
- end
- end
- return true, nil
-end
-
-
-local function _handle_continue(sock, body)
- local status, version, reason, err = _receive_status(sock)
- if not status then
- return nil, nil, err
- end
-
- -- Only send body if we receive a 100 Continue
- if status == 100 then
- local ok, err = sock:receive("*l") -- Read carriage return
- if not ok then
- return nil, nil, err
- end
- _send_body(sock, body)
- end
- return status, version, err
-end
-
-
-function _M.send_request(self, params)
- -- Apply defaults
- setmetatable(params, { __index = DEFAULT_PARAMS })
-
- local sock = self.sock
- local body = params.body
- local headers = http_headers.new()
-
- local params_headers = params.headers
- if params_headers then
- -- We assign one by one so that the metatable can handle case insensitivity
- -- for us. You can blame the spec for this inefficiency.
- for k,v in pairs(params_headers) do
- headers[k] = v
- end
- end
-
- -- Ensure minimal headers are set
- if type(body) == 'string' and not headers["Content-Length"] then
- headers["Content-Length"] = #body
- end
- if not headers["Host"] then
- if (str_sub(self.host, 1, 5) == "unix:") then
- return nil, "Unable to generate a useful Host header for a unix domain socket. Please provide one."
- end
- -- If we have a port (i.e. not connected to a unix domain socket), and this
- -- port is non-standard, append it to the Host heaer.
- if self.port then
- if self.ssl and self.port ~= 443 then
- headers["Host"] = self.host .. ":" .. self.port
- elseif not self.ssl and self.port ~= 80 then
- headers["Host"] = self.host .. ":" .. self.port
- else
- headers["Host"] = self.host
- end
- else
- headers["Host"] = self.host
- end
- end
- if not headers["User-Agent"] then
- headers["User-Agent"] = _M._USER_AGENT
- end
- if params.version == 1.0 and not headers["Connection"] then
- headers["Connection"] = "Keep-Alive"
- end
-
- params.headers = headers
-
- -- Format and send request
- local req = _format_request(params)
- ngx_log(ngx_DEBUG, "\n", req)
- local bytes, err = sock:send(req)
-
- if not bytes then
- return nil, err
- end
-
- -- Send the request body, unless we expect: continue, in which case
- -- we handle this as part of reading the response.
- if headers["Expect"] ~= "100-continue" then
- local ok, err, partial = _send_body(sock, body)
- if not ok then
- return nil, err, partial
- end
- end
-
- return true
-end
-
-
-function _M.read_response(self, params)
- local sock = self.sock
-
- local status, version, reason, err
-
- -- If we expect: continue, we need to handle this, sending the body if allowed.
- -- If we don't get 100 back, then status is the actual status.
- if params.headers["Expect"] == "100-continue" then
- local _status, _version, _err = _handle_continue(sock, params.body)
- if not _status then
- return nil, _err
- elseif _status ~= 100 then
- status, version, err = _status, _version, _err
- end
- end
-
- -- Just read the status as normal.
- if not status then
- status, version, reason, err = _receive_status(sock)
- if not status then
- return nil, err
- end
- end
-
-
- local res_headers, err = _receive_headers(sock)
- if not res_headers then
- return nil, err
- end
-
- -- keepalive is true by default. Determine if this is correct or not.
- local ok, connection = pcall(str_lower, res_headers["Connection"])
- if ok then
- if (version == 1.1 and connection == "close") or
- (version == 1.0 and connection ~= "keep-alive") then
- self.keepalive = false
- end
- else
- -- no connection header
- if version == 1.0 then
- self.keepalive = false
- end
- end
-
- local body_reader = _no_body_reader
- local trailer_reader, err = nil, nil
- local has_body = false
-
- -- Receive the body_reader
- if _should_receive_body(params.method, status) then
- local ok, encoding = pcall(str_lower, res_headers["Transfer-Encoding"])
- if ok and version == 1.1 and encoding == "chunked" then
- body_reader, err = _chunked_body_reader(sock)
- has_body = true
- else
-
- local ok, length = pcall(tonumber, res_headers["Content-Length"])
- if ok then
- body_reader, err = _body_reader(sock, length)
- has_body = true
- end
- end
- end
-
- if res_headers["Trailer"] then
- trailer_reader, err = _trailer_reader(sock)
- end
-
- if err then
- return nil, err
- else
- return {
- status = status,
- reason = reason,
- headers = res_headers,
- has_body = has_body,
- body_reader = body_reader,
- read_body = _read_body,
- trailer_reader = trailer_reader,
- read_trailers = _read_trailers,
- }
- end
-end
-
-
-function _M.request(self, params)
- local res, err = self:send_request(params)
- if not res then
- return res, err
- else
- return self:read_response(params)
- end
-end
-
-
-function _M.request_pipeline(self, requests)
- for i, params in ipairs(requests) do
- if params.headers and params.headers["Expect"] == "100-continue" then
- return nil, "Cannot pipeline request specifying Expect: 100-continue"
- end
-
- local res, err = self:send_request(params)
- if not res then
- return res, err
- end
- end
-
- local responses = {}
- for i, params in ipairs(requests) do
- responses[i] = setmetatable({
- params = params,
- response_read = false,
- }, {
- -- Read each actual response lazily, at the point the user tries
- -- to access any of the fields.
- __index = function(t, k)
- local res, err
- if t.response_read == false then
- res, err = _M.read_response(self, t.params)
- t.response_read = true
-
- if not res then
- ngx_log(ngx_ERR, err)
- else
- for rk, rv in pairs(res) do
- t[rk] = rv
- end
- end
- end
- return rawget(t, k)
- end,
- })
- end
- return responses
-end
-
-
-function _M.request_uri(self, uri, params)
- if not params then params = {} end
-
- local parsed_uri, err = self:parse_uri(uri)
- if not parsed_uri then
- return nil, err
- end
-
- local scheme, host, port, path = unpack(parsed_uri)
- if not params.path then params.path = path end
-
- local c, err = self:connect(host, port)
- if not c then
- return nil, err
- end
-
- if scheme == "https" then
- local verify = true
- if params.ssl_verify == false then
- verify = false
- end
- local ok, err = self:ssl_handshake(nil, host, verify)
- if not ok then
- return nil, err
- end
- end
-
- local res, err = self:request(params)
- if not res then
- return nil, err
- end
-
- local body, err = res:read_body()
- if not body then
- return nil, err
- end
-
- res.body = body
-
- local ok, err = self:set_keepalive()
- if not ok then
- ngx_log(ngx_ERR, err)
- end
-
- return res, nil
-end
-
-
-function _M.get_client_body_reader(self, chunksize, sock)
- local chunksize = chunksize or 65536
- if not sock then
- local ok, err
- ok, sock, err = pcall(ngx_req_socket)
-
- if not ok then
- return nil, sock -- pcall err
- end
-
- if not sock then
- if err == "no body" then
- return nil
- else
- return nil, err
- end
- end
- end
-
- local headers = ngx_req_get_headers()
- local length = headers.content_length
- local encoding = headers.transfer_encoding
- if length then
- return _body_reader(sock, tonumber(length), chunksize)
- elseif encoding and str_lower(encoding) == 'chunked' then
- -- Not yet supported by ngx_lua but should just work...
- return _chunked_body_reader(sock, chunksize)
- else
- return nil
- end
-end
-
-
-function _M.proxy_request(self, chunksize)
- return self:request{
- method = ngx_req_get_method(),
- path = ngx_re_gsub(ngx_var.uri, "\\s", "%20", "jo") .. ngx_var.is_args .. (ngx_var.query_string or ""),
- body = self:get_client_body_reader(chunksize),
- headers = ngx_req_get_headers(),
- }
-end
-
-
-function _M.proxy_response(self, response, chunksize)
- if not response then
- ngx_log(ngx_ERR, "no response provided")
- return
- end
-
- ngx.status = response.status
-
- -- Filter out hop-by-hop headeres
- for k,v in pairs(response.headers) do
- if not HOP_BY_HOP_HEADERS[str_lower(k)] then
- ngx.header[k] = v
- end
- end
-
- local reader = response.body_reader
- repeat
- local chunk, err = reader(chunksize)
- if err then
- ngx_log(ngx_ERR, err)
- break
- end
-
- if chunk then
- local res, err = ngx.print(chunk)
- if not res then
- ngx_log(ngx_ERR, err)
- break
- end
- end
- until not chunk
-end
-
-
-return _M
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/lualib/resty/http_headers.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/lualib/resty/http_headers.lua
deleted file mode 100644
index 24b53b5..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/lualib/resty/http_headers.lua
+++ /dev/null
@@ -1,62 +0,0 @@
-local rawget, rawset, setmetatable =
- rawget, rawset, setmetatable
-
-local str_gsub = string.gsub
-local str_lower = string.lower
-
-
-local _M = {
- _VERSION = '0.01',
-}
-
-
--- Returns an empty headers table with internalised case normalisation.
--- Supports the same cases as in ngx_lua:
---
--- headers.content_length
--- headers["content-length"]
--- headers["Content-Length"]
-function _M.new(self)
- local mt = {
- normalised = {},
- }
-
-
- mt.__index = function(t, k)
- local k_hyphened = str_gsub(k, "_", "-")
- local matched = rawget(t, k)
- if matched then
- return matched
- else
- local k_normalised = str_lower(k_hyphened)
- return rawget(t, mt.normalised[k_normalised])
- end
- end
-
-
- -- First check the normalised table. If there's no match (first time) add an entry for
- -- our current case in the normalised table. This is to preserve the human (prettier) case
- -- instead of outputting lowercased header names.
- --
- -- If there's a match, we're being updated, just with a different case for the key. We use
- -- the normalised table to give us the original key, and perorm a rawset().
- mt.__newindex = function(t, k, v)
- -- we support underscore syntax, so always hyphenate.
- local k_hyphened = str_gsub(k, "_", "-")
-
- -- lowercase hyphenated is "normalised"
- local k_normalised = str_lower(k_hyphened)
-
- if not mt.normalised[k_normalised] then
- mt.normalised[k_normalised] = k_hyphened
- rawset(t, k_hyphened, v)
- else
- rawset(t, mt.normalised[k_normalised], v)
- end
- end
-
- return setmetatable({}, mt)
-end
-
-
-return _M
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/conf/nginx.conf b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/conf/nginx.conf
deleted file mode 100644
index ea434b7..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/conf/nginx.conf
+++ /dev/null
@@ -1,72 +0,0 @@
-#
-# Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
-
-#user xfs xfs;
-worker_processes 1;
-
-error_log logs/error.log warn;
-pid logs/nginx.pid;
-
-events {
- worker_connections 1024;
-}
-
-http {
- # Basic Settings
- default_type application/octet-stream;
- sendfile on;
- tcp_nopush on;
- server_names_hash_bucket_size 128;
- keepalive_timeout 120s;
-
- #the maximum allowed size of the client request body,current 10G
- client_max_body_size 10240m;
- client_body_buffer_size 128k;
-
- #set the time wait for connect to proxy_pass target,avoid waiting too long
- proxy_connect_timeout 10s;
- proxy_read_timeout 120s;
- proxy_send_timeout 120s;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header Host $host;
- proxy_buffers 4 32k;
-
- #set the nginx_cache parameter
- proxy_cache_path temp/proxy_cache levels=1:2 keys_zone=nginx_cache:256m inactive=1d max_size=1g;
-
- # Logging
- access_log off;
-
- # Lua settings
- lua_package_path "$prefix/../lualib/?.lua;$prefix/luaext/?.lua;;";
- lua_package_cpath "$prefix/../lualib/?.so;;";
-
- lua_shared_dict ceryx 10M;
- lua_code_cache on;
-
- # see https://github.com/openresty/lua-resty-core
- #init_by_lua '
- # require "resty.core"
- #';
-
- # Includes
- include mime.types;
- include ../sites-enabled/*.conf;
-}
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua
deleted file mode 100644
index 46d0b8a..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/customrouter.lua
+++ /dev/null
@@ -1,187 +0,0 @@
---[[
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
-]]
--- put red into the connection pool of size 100,
--- with 10 seconds max idle time
-local function close_redis(red)
- if not red then
- return
- end
- --release connection to the pool
- local pool_max_idle_time = 10000
- local pool_size = 100
- local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
- if not ok then
- ngx.log(ngx.ERR, "set keepalive error:", err)
- end
- return
-end
-
-local function query_ipurl_updatecache(red,key)
- local keyprefix = "msb:routing:custom:"..key
-
-
- local infokey=keyprefix..":info"
- -- first of all check whether the status is 1(enabled)
- local status = red:hget(infokey,"status")
- if not (status=="1") then
- ngx.log(ngx.WARN, key.."is disabled.status=", status)
- return nil
- end
-
- -- Try to get url for key
- local url, err = red:hget(infokey,"url")
- ngx.log(ngx.WARN, "==url:", url)
- if not url or url == ngx.null then
- return nil
- end
-
- -- Try to get ip:port for key
- local serverkey=keyprefix..":lb:server1"
- local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port")
- ngx.log(ngx.WARN, "==server:", server)
- if not server or server == ngx.null then
- return nil
- end
-
- -- get the local cache
- local cache = ngx.shared.ceryx
- local uri = ngx.var.uri
- -- Save found key to local cache for 5 seconds
- cache:set("custom:key:"..uri,key,5)
- cache:set("custom:server:"..uri,server,5)
- cache:set("custom:url:"..uri,url,5)
-
- ngx.var.key = key
- ngx.var.server = server
- ngx.var.url = url
- return true
-end
-
-local function query_allkeys_updatecache(red)
- -- Try to get all keys start with "msb:routing:custom:"
- local allkeys, err = red:keys("msb:routing:custom:*")
- if not allkeys or allkeys == ngx.null then
- ngx.log(ngx.ERR,err)
- return ""
- end
- local key_set={}
- for key, value in ipairs(allkeys) do
- name = string.gsub(string.gsub(string.gsub(value,"msb:routing:custom:",""),":info",""),":lb:server1","")
- key_set[name]=true
- end
- local key_table = {}
- local index = 1
- for key,_ in pairs(key_set) do
- key_table[index] = key
- index = index + 1
- end
- table.sort(key_table, function (a, b)
- return a > b
- end)
-
- local servicenames = ""
- local delimiter = "<>"
- for i=1,#key_table do
- servicenames=servicenames..key_table[i]..delimiter
- end
-
- -- get the local cache
- local cache = ngx.shared.ceryx
- -- Save all keys to local cache for 30 seconds(0.5 minutes)
- cache:set("customrouter:allkeys", servicenames, 30)
- return servicenames;
-end
-
-local function query_router_info()
- local uri = ngx.var.uri
- ngx.log(ngx.WARN, "==uri:", uri)
-
- -- Check if key exists in local cache
- local cache = ngx.shared.ceryx
- local key, flags = cache:get("custom:key:"..uri)
- local server, flags = cache:get("custom:server:"..uri)
- local url, flags = cache:get("custom:url:"..uri)
- if key and server and url then
- ngx.var.key = key
- ngx.var.server = server
- ngx.var.url = url
- ngx.log(ngx.WARN, "==using custom cache:", key.."&&"..server.."&&"..url)
- return
- end
-
- local redis = require "resty.redis"
- local red = redis:new()
- red:set_timeout(1000) -- 1000 ms
- local redis_host = "127.0.0.1"
- local redis_port = 6379
- local res, err = red:connect(redis_host, redis_port)
-
- -- Return if could not connect to Redis
- if not res then
- ngx.log(ngx.ERR, "connect to redis error:", err)
- return
- end
-
- -- Check if all servicenames exists in local cache
- local servicenames, flags = cache:get("customrouter:allkeys")
- if servicenames then
- ngx.log(ngx.WARN,"==get all keys from cache:",servicenames)
- else
- servicenames = query_allkeys_updatecache(red)
- end
-
- local delimiter = "<>"
- for key in string.gmatch(servicenames,"(.-)"..delimiter) do
- ngx.log(ngx.WARN, "==key_table key:", key)
- local from, to, err = ngx.re.find(uri, "^"..key.."(/(.*))?$", "jo")
- if from then
- ngx.log(ngx.WARN,"Matched! start-end:",from,"-",to)
- local result = query_ipurl_updatecache(red,key)
- if result then
- break
- end
- else
- ngx.log(ngx.WARN,"not Matched")
- if err then
- ngx.log(ngx.WARN,"ngx.re.find throw error: ",err)
- return
- end
- end
- end
-
- return close_redis(red)
-end
-
-local function rewrite_router_url()
- local server=ngx.var.server
- if server=="fallback" then
- ngx.status = ngx.HTTP_NOT_FOUND
- ngx.exit(ngx.status)
- end
- local url=ngx.var.url
- local key=ngx.var.key
- local rewriteduri = ngx.re.sub(ngx.var.uri, "^"..key.."(.*)", url.."$1", "o")
- ngx.log(ngx.WARN, "==rewrited uri:", rewriteduri)
- ngx.req.set_uri(rewriteduri)
-end
-
-query_router_info()
-rewrite_router_url() \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoadminrouter.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoadminrouter.lua
deleted file mode 100644
index 938a017..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoadminrouter.lua
+++ /dev/null
@@ -1,110 +0,0 @@
---[[
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
-]]
--- put red into the connection pool of size 100,
--- with 10 seconds max idle time
-local function close_redis(red)
- if not red then
- return
- end
- --release connection to the pool
- local pool_max_idle_time = 10000
- local pool_size = 100
- local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
- if not ok then
- ngx.log(ngx.ERR, "set keepalive error:", err)
- end
- return
-end
-
-local function rewrite_admin_url()
- local apiserver=ngx.var.apiserver
- if apiserver=="fallback" then
- ngx.status = ngx.HTTP_NOT_FOUND
- ngx.exit(ngx.status)
- end
- local adminurl=ngx.var.adminurl
- local uri = ngx.re.sub(ngx.var.uri, "^/admin/([^/]+)(/[Vv][^/]*)?(.*)", adminurl.."$3", "o")
- ngx.req.set_uri(uri)
-end
-
-local function query_admin_info()
- local apiserver = ngx.var.apiserver
- local apiname = ngx.var.apiname
- local apiversion = ngx.var.apiversion
- apiversion=string.sub(apiversion,2,string.len(apiversion))
-
- -- Check if key exists in local cache
- local cache = ngx.shared.ceryx
- local server, flags = cache:get("server:admin:"..apiname..":"..apiversion)
- local url, flags = cache:get("url:admin:"..apiname..":"..apiversion)
- if server and url then
- ngx.var.apiserver = server
- ngx.var.adminurl = url
- ngx.log(ngx.WARN, "==using admin cache:", server.."&&"..url)
- return
- end
-
- local redis = require "resty.redis"
- local red = redis:new()
- red:set_timeout(1000) -- 1000 ms
- local redis_host = "127.0.0.1"
- local redis_port = 6379
- local res, err = red:connect(redis_host, redis_port)
-
- -- Return if could not connect to Redis
- if not res then
- ngx.log(ngx.ERR, "connect to redis error:", err)
- return
- end
-
- -- Construct Redis key
- local prefix = "msb"
- local keyprefix = prefix..":routing:api:"..apiname..":"..apiversion
-
-
- -- Try to get ip:port for apiname
- local serverkey=keyprefix..":lb:server1"
- local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port")
- ngx.log(ngx.WARN, "==adminserver:", server)
- if not server or server == ngx.null then
- return close_redis(red)
- end
-
- -- Try to get admin url for apiname
- local infokey=keyprefix..":info"
- local url, err = red:hget(infokey,"metricsUrl")
- ngx.log(ngx.WARN, "==adminurl:", url)
- if not url or url == ngx.null then
- return close_redis(red)
- end
-
- -- Save found key to local cache for 5 seconds
- cache:set("server:admin:"..apiname..":"..apiversion, server, 5)
- cache:set("url:admin:"..apiname..":"..apiversion, url, 5)
-
- ngx.log(ngx.WARN, "==admin result:", server.."&&"..url)
- ngx.var.apiserver = server
- ngx.var.adminurl = url
-
- return close_redis(red)
-end
-query_admin_info()
-rewrite_admin_url() \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapijsonrouter.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapijsonrouter.lua
deleted file mode 100644
index 9255a65..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapijsonrouter.lua
+++ /dev/null
@@ -1,110 +0,0 @@
---[[
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
-]]
--- put red into the connection pool of size 100,
--- with 10 seconds max idle time
-local function close_redis(red)
- if not red then
- return
- end
- --release connection to the pool
- local pool_max_idle_time = 10000
- local pool_size = 100
- local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
- if not ok then
- ngx.log(ngx.ERR, "set keepalive error:", err)
- end
- return
-end
-
-local function rewrite_apijson_url()
- local apiserver=ngx.var.apiserver
- if apiserver=="fallback" then
- ngx.status = ngx.HTTP_NOT_FOUND
- ngx.exit(ngx.status)
- end
- local apijsonurl=ngx.var.apijsonurl
- local uri = ngx.re.sub(ngx.var.uri, "^/apijson/([^/]+)(/[Vv][^/]*)?(.*)", apijsonurl.."$3", "o")
- ngx.req.set_uri(uri)
-end
-
-local function query_apijson_info()
- local apiserver = ngx.var.apiserver
- local apiname = ngx.var.apiname
- local apiversion = ngx.var.apiversion
- apiversion=string.sub(apiversion,2,string.len(apiversion))
-
- -- Check if key exists in local cache
- local cache = ngx.shared.ceryx
- local server, flags = cache:get("server:apijson:"..apiname..":"..apiversion)
- local url, flags = cache:get("url:apijson:"..apiname..":"..apiversion)
- if server and url then
- ngx.var.apiserver = server
- ngx.var.apijsonurl = url
- ngx.log(ngx.WARN, "==using apijson cache:", server.."&&"..url)
- return
- end
-
- local redis = require "resty.redis"
- local red = redis:new()
- red:set_timeout(1000) -- 1000 ms
- local redis_host = "127.0.0.1"
- local redis_port = 6379
- local res, err = red:connect(redis_host, redis_port)
-
- -- Return if could not connect to Redis
- if not res then
- ngx.log(ngx.ERR, "connect to redis error:", err)
- return
- end
-
- -- Construct Redis key
- local prefix = "msb"
- local keyprefix = prefix..":routing:api:"..apiname..":"..apiversion
-
-
- -- Try to get ip:port for apiname
- local serverkey=keyprefix..":lb:server1"
- local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port")
- ngx.log(ngx.WARN, "==apijsonserver:", server)
- if not server or server == ngx.null then
- return close_redis(red)
- end
-
- -- Try to get apijson url for apiname
- local infokey=keyprefix..":info"
- local url, err = red:hget(infokey,"apijson")
- ngx.log(ngx.WARN, "==apijsonurl:", url)
- if not url or url == ngx.null then
- return close_redis(red)
- end
-
- -- Save found key to local cache for 5 seconds
- cache:set("server:apijson:"..apiname..":"..apiversion, server, 5)
- cache:set("url:apijson:"..apiname..":"..apiversion, url, 5)
-
- ngx.log(ngx.WARN, "==apijson result:", server.."&&"..url)
- ngx.var.apiserver = server
- ngx.var.apijsonurl = url
-
- return close_redis(red)
-end
-query_apijson_info()
-rewrite_apijson_url() \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapirouter.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapirouter.lua
deleted file mode 100644
index 717bd1a..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openoapirouter.lua
+++ /dev/null
@@ -1,117 +0,0 @@
---[[
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
-]]
--- put red into the connection pool of size 100,
--- with 10 seconds max idle time
-local function close_redis(red)
- if not red then
- return
- end
- --release connection to the pool
- local pool_max_idle_time = 10000
- local pool_size = 100
- local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
- if not ok then
- ngx.log(ngx.ERR, "set keepalive error:", err)
- end
- return
-end
-
-local function rewrite_api_url()
- local apiserver=ngx.var.apiserver
- if apiserver=="fallback" then
- ngx.status = ngx.HTTP_NOT_FOUND
- ngx.exit(ngx.status)
- end
- local apiurl=ngx.var.apiurl
- local uri = ngx.re.sub(ngx.var.uri, "^/openoapi/([^/]+)(/[Vv][^/]*)?(.*)", apiurl.."$3", "o")
- ngx.req.set_uri(uri)
-end
-
-local function query_api_info()
- local apiserver = ngx.var.apiserver
- local apiname = ngx.var.apiname
- local apiversion = ngx.var.apiversion
- apiversion=string.sub(apiversion,2,string.len(apiversion))
-
- -- Check if key exists in local cache
- local cache = ngx.shared.ceryx
- local server, flags = cache:get("server:api:"..apiname..":"..apiversion)
- local url, flags = cache:get("url:api:"..apiname..":"..apiversion)
- if server and url then
- ngx.var.apiserver = server
- ngx.var.apiurl = url
- ngx.log(ngx.WARN, "==using api cache:", server.."&&"..url)
- return
- end
-
- local redis = require "resty.redis"
- local red = redis:new()
- red:set_timeout(1000) -- 1000 ms
- local redis_host = "127.0.0.1"
- local redis_port = 6379
- local res, err = red:connect(redis_host, redis_port)
-
- -- Return if could not connect to Redis
- if not res then
- ngx.log(ngx.ERR, "connect to redis error:", err)
- return
- end
-
- -- Construct Redis key
- local prefix = "msb"
- local keyprefix = prefix..":routing:api:"..apiname..":"..apiversion
-
- local infokey=keyprefix..":info"
- -- first of all check whether the status is 1(enabled)
- local status = red:hget(infokey,"status")
- if not (status=="1") then
- ngx.log(ngx.WARN, keyprefix.."is disabled.status=", status)
- return close_redis(red)
- end
-
- -- Try to get url for apiname
- local url, err = red:hget(infokey,"url")
- ngx.log(ngx.WARN, "==url:", url)
- if not url or url == ngx.null then
- return close_redis(red)
- end
-
- -- Try to get ip:port for apiname
- local serverkey=keyprefix..":lb:server1"
- local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port")
- ngx.log(ngx.WARN, "==server:", server)
- if not server or server == ngx.null then
- return close_redis(red)
- end
-
-
- -- Save found key to local cache for 5 seconds
- cache:set("server:api:"..apiname..":"..apiversion, server, 5)
- cache:set("url:api:"..apiname..":"..apiversion, url, 5)
-
- ngx.log(ngx.WARN, "==api result:", server.."&&"..url)
- ngx.var.apiserver = server
- ngx.var.apiurl = url
-
- return close_redis(red)
-end
-query_api_info()
-rewrite_api_url() \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua
deleted file mode 100644
index c36057e..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/openouirouter.lua
+++ /dev/null
@@ -1,115 +0,0 @@
---[[
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
-]]
--- put red into the connection pool of size 100,
--- with 10 seconds max idle time
-local function close_redis(red)
- if not red then
- return
- end
- --release connection to the pool
- local pool_max_idle_time = 10000
- local pool_size = 100
- local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
- if not ok then
- ngx.log(ngx.ERR, "set keepalive error:", err)
- end
- return
-end
-
-local function rewrite_iui_url()
- local iuiserver=ngx.var.iuiserver
- if iuiserver=="fallback" then
- ngx.status = ngx.HTTP_NOT_FOUND
- ngx.exit(ngx.status)
- end
- local iuiurl=ngx.var.iuiurl
- local uri = ngx.re.sub(ngx.var.uri, "^/openoui/([^/]+)(.*)", iuiurl.."$2", "o")
- ngx.req.set_uri(uri)
-end
-
-local function query_iui_info()
- local iuiserver = ngx.var.iuiserver
- local iuiname = ngx.var.iuiname
-
- -- Check if key exists in local cache
- local cache = ngx.shared.ceryx
- local server, flags = cache:get("server:iui:"..iuiname)
- local url, flags = cache:get("url:iui:"..iuiname)
- if server and url then
- ngx.var.iuiserver = server
- ngx.var.iuiurl = url
- ngx.log(ngx.WARN, "==using iui cache:", server.."&&"..url)
- return
- end
-
- local redis = require "resty.redis"
- local red = redis:new()
- red:set_timeout(1000) -- 1000 ms
- local redis_host = "127.0.0.1"
- local redis_port = 6379
- local res, err = red:connect(redis_host, redis_port)
-
- -- Return if could not connect to Redis
- if not res then
- ngx.log(ngx.ERR, "connect to redis error:", err)
- return
- end
-
- -- Construct Redis key
- local prefix = "msb"
- local keyprefix = prefix..":routing:iui:"..iuiname
-
- local infokey=keyprefix..":info"
- -- first of all check whether the status is 1(enabled)
- local status = red:hget(infokey,"status")
- if not (status=="1") then
- ngx.log(ngx.WARN, keyprefix.."is disabled.status=", status)
- return close_redis(red)
- end
-
- -- Try to get url for iuiname
- local url, err = red:hget(infokey,"url")
- ngx.log(ngx.WARN, "==url:", url)
- if not url or url == ngx.null then
- return close_redis(red)
- end
-
- -- Try to get ip:port for iuiname
- local serverkey=keyprefix..":lb:server1"
- local server, err = red:hget(serverkey,"ip")..":"..red:hget(serverkey,"port")
- ngx.log(ngx.WARN, "==server:", server)
- if not server or server == ngx.null then
- return close_redis(red)
- end
-
-
- -- Save found key to local cache for 5 seconds
- cache:set("server:iui:"..iuiname, server, 5)
- cache:set("url:iui:"..iuiname, url, 5)
-
- ngx.log(ngx.WARN, "==iui result:", server.."&&"..url)
- ngx.var.iuiserver = server
- ngx.var.iuiurl = url
-
- return close_redis(red)
-end
-query_iui_info()
-rewrite_iui_url() \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/auth.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/auth.lua
deleted file mode 100644
index 1572060..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/auth.lua
+++ /dev/null
@@ -1,171 +0,0 @@
---[[
-
- Copyright 2016 2015-2016 OEPN-O. and others. 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.
-
-]]
-local _M = {}
-_M._VERSION = '1.0.0'
-local auth_url = '/openoapi/auth/v1';
-local auth_token_url = auth_url..'/tokens';
-local auth_token_key = "X-Auth-Token";
-local redirect_url = "/openoui/common/login.html"
-
-local white_list= {
- auth_token_url,
- redirect_url,
- '/openoui/common/css',
- '/openoui/common/js',
- '/openoui/common/thirdparty',
- '/openoui/common/i18n',
- '/openoui/common/image',
- '/openoui/common/login.html',
- '/openoui/common/json'
-};
-
-local function verify_value(value)
- if (nil == value or 0 == #value)
- then
- return false;
- else
- return true;
- end
-end
-
---[[checks str2 starts with str1]]--
-local function starts_with(str1, str2)
- return string.sub(str2, 1, string.len(str1)) == str1;
-end
-
--- Check and ignore the request if it is from auth module.--
-local function is_white_list(url)
- for i, value in ipairs(white_list)
- do
- if (starts_with(value, url))
- then
- return true;
- end
- end
- return false;
-end
-
-local function set_header(tokens)
- for key,value in pairs(tokens)
- do
- ngx.log (ngx.ERR, "Headers: ", key, value);
- ngx.req.set_header(key, value);
- end
-
-end
---[[ validates the token with auth ]]--
-local function validate_token(tokens)
- -- auth expects the token in header.
- set_header(tokens);
- -- call auth token check url to validate.
- local res = ngx.location.capture(auth_token_url, { method = ngx.HTTP_HEAD});
- ngx.log (ngx.ERR, "Auth Result:", res.status);
- if (nil == res)
- then
- return false;
- end
- return (ngx.HTTP_OK == res.status);
-end
-
---[[ get auth token from cookies ]]--
-local function get_cookies()
- local cookie_name = "cookie_"..auth_token_key;
- local auth_token = ngx.var[cookie_name];
- local tokens = {};
- -- verify whether its empty or null.
- if (verify_value(auth_token))
- then
- ngx.log(ngx.ERR, "token : ", auth_token );
- tokens[auth_token_key] = auth_token;
- end
- return tokens;
-end
-
-local function get_service_url()
- -- get host.
- local host = ngx.var.host;
- --get port
- local port = ":"..ngx.var.server_port;
- local proto = "";
- --get protocol
- if (ngx.var.https == "on")
- then
- proto = "https://";
- else
- proto = "http://";
- end
- --get url
- local uri = ngx.var.uri;
- --form complete service url.
- --local complete_url = proto..host..port..url
- local complete_url = uri;
- local service = "?service="
- --add arguments if any.
- if ngx.var.args ~= nil
- then
- complete_url = complete_url.."?"..ngx.var.args;
- end
- ngx.log(ngx.ERR, "service url : ", complete_url);
- return service..ngx.escape_uri(complete_url);
-end
-
-local function redirect(url)
- local service = get_service_url();
- ngx.log(ngx.ERR, "redirect: ", url..service);
- ngx.redirect(url..service);
-end
-
-function _M.access()
-
- ngx.log(ngx.ERR, "==============start check token===============: ");
- local url = ngx.var.uri;
- ngx.log(ngx.ERR, "Url : ", url);
-
- -- ignore token validation if auth request.
- if (is_white_list(url))
- then
- return;
- end
-
-
-
- -- get auth token from cookies.
- local auth_tokens = get_cookies();
-
- -- check if auth token is empty,
- -- redirect it to login page in that case.
- if (nil == next(auth_tokens))
- then
- ngx.log(ngx.ERR, "Token Invalidate, redirect to ", redirect_url);
- redirect(redirect_url);
- return;
- end
-
- -- validate the token with auth module.
- -- continue if success, else redirect to login page.
- if(validate_token(auth_tokens))
- then
- ngx.log(ngx.ERR, "Token Validate.");
- return;
- else
- redirect(redirect_url);
- end
- ngx.log(ngx.INFO, "running auth plugin")
- end
-
-return _M \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/driver_manager.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/driver_manager.lua
deleted file mode 100644
index 45d327d..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/driver_manager.lua
+++ /dev/null
@@ -1,127 +0,0 @@
---[[
-
- Copyright 2016 2015-2016 OPEN-O. and others. 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.
-
-]]
-local _M = {}
-_M._VERSION = '1.0.0'
-local _HEADER = "X-Driver-Parameter"
-
---extract driver header if present in request
-local function get_driver_header()
- local header = ""
- local driver_header = ngx.req.get_headers()[_HEADER]
- if (driver_header ~= nil)
- then
- header = driver_header
- end
- return header
-end
-
--- generate query url
-local function get_query_url(x_driver_header)
- local drivermgr_uri = '/openoapi/drivermgr/v1/drivers'
- local url = drivermgr_uri.."?".._HEADER.."="..tostring(ngx.escape_uri(x_driver_header)).."&service_url="..ngx.var.uri
- return url
-end
-
--- generate driver url
-local function get_driver_url(driver_header)
- local cjson = require "cjson"
- local query_url = get_query_url(driver_header)
- local driver_header_value = get_driver_header();
- ngx.req.clear_header(_HEADER)
- local res = ngx.location.capture(query_url, { method = ngx.HTTP_GET})
- ngx.req.set_header(_HEADER, driver_header_value);
- ngx.log (ngx.ERR, "Driver manager resp url : ", tostring(res.body))
- if (res.status == 200 and res.body ~= nil and res.body ~= '')
- then
- return tostring(cjson.new().decode(res.body).url)
- else
- return ''
- end
-end
-
--- get the ori query param string
-local function get_ori_query()
- local args = ngx.req.get_uri_args();
- local ori_query_param = "?"..ngx.encode_args(args);
- ngx.log(ngx.ERR, "The original request query parameter is ", ori_query_param);
- return ori_query_param;
-end
-
--- get headers
-local function get_headers()
- local headers = {}
- local h = ngx.req.get_headers()
- for k, value in pairs(h)
- do
- headers[k] = value
- end
- return headers
-end
-
-local function get_body_params()
- ngx.req.read_body()
- local actual_body = ""
- local body_param = ngx.req.get_body_data()
- if(body_param ~= nil)
- then
- actual_body = tostring(body_param)
- end
- return actual_body
-end
-
-function _M.access()
- ngx.log(ngx.ERR, "DRIVER MANAGER LUA", "***********************")
-
- -- extract X-Driver-Parameter header param
- local driver_header = get_driver_header()
- ngx.log(ngx.ERR, "X-Driver-Parameter: ", driver_header)
-
-
- -- ignore driver redirection if not driver manager request.
- if (driver_header ~= "")
- then
-
- local driver_url = get_driver_url(driver_header)..get_ori_query();
- ngx.log (ngx.ERR, "Driver manager URl:: ", driver_url)
-
- local http = require "resty.http"
- local actual_headers = get_headers()
- local actual_body = get_body_params()
-
- ngx.log(ngx.ERR, "HTTP request to driver... ", " Request to driver manager")
- local httpc = http.new();
- httpc:set_timeout(300000);
- local res, err = httpc:request_uri(driver_url, {
- method = ngx.req.get_method(),
- body = actual_body,
- headers = actual_headers
- })
-
- if not res then
- ngx.say("Request to driver failed : ", err)
- return
- end
- ngx.log(ngx.ERR, "Response from driver : ", tostring(res.body))
- ngx.say(res.body)
-
- else
- ngx.log(ngx.ERR, "X-Driver-Parameter not present", " Redirect to same url")
- end
-end
-
-return _M \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/openomsb.conf b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/openomsb.conf
deleted file mode 100644
index ad0bf1c..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/openomsb.conf
+++ /dev/null
@@ -1,181 +0,0 @@
-#
-# Copyright 2016 2015-2016 ZTE, Inc. and others. 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.
-#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
-
-server {
- listen 80;
- default_type text/html;
- add_header X-Cache-Status $upstream_cache_status;
-
- location = / {
- rewrite ^ /openoui/microservices/index.html redirect;
- }
-
- location = /openoui/microservices {
- rewrite /openoui/microservices /openoui/microservices/index.html redirect;
- }
-
- location / {
- set $server "fallback";
- set $url "";
- set $key "";
-
- # Lua files
- rewrite_by_lua_file luaext/customrouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_pass http://$server;
- }
- location ~ ^/api/(.*) {
- rewrite ^/api/(.*) /openoapi/$1 last;
- }
- location ~ ^/iui/(.*) {
- rewrite ^/iui/(.*) /openoui/$1 last;
- }
-
- location ^~ /openoapi/driver_ {
- set $backend "";
- # Lua files
- access_by_lua_block {
- local driver_manager = require('plugins.driver_manager')
- driver_manager.access()
- }
- proxy_pass http://$backend;
- }
- location ~ ^/openoapi/([^/]+)(/[Vv][^/]*)?(.*) {
-
- #Send requests to Driver Mgr. if 'X_Driver_Parameter' header found in the request
- if ($http_X_Driver_Parameter) {
- rewrite_by_lua_block {
- local driver_manager = require('plugins.driver_manager')
- driver_manager.access()
- }
- }
-
- set $apiname $1;
- set $apiversion $2;
- set $apiserver "fallback";
- set $apiurl "";
-
- # Lua files
- rewrite_by_lua_file luaext/openoapirouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_pass http://$apiserver;
- }
-
- location ~ ^/openoui/([^/]+)(.*) {
- location ~* ^/iui/([^/]+)(.*)\.(?:png|jpg|jpeg|js|css|html|gif|ico|bmp|woff)$ {
- set $iuiname $1;
- set $iuiparam $2;
- set $iuiserver "fallback";
- set $iuiurl "";
-
- # Lua files
- rewrite_by_lua_file luaext/openouirouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_cache nginx_cache;
- proxy_cache_key $host$uri$is_args$args;
- proxy_cache_valid 200 304 12h ;
- proxy_cache_valid 301 302 1m ;
- proxy_cache_valid any 1m ;
- expires 12h;
-
- proxy_pass http://$iuiserver;
- }
- set $iuiname $1;
- set $iuiparam $2;
- set $iuiserver "fallback";
- set $iuiurl "";
-
- # Lua files
- rewrite_by_lua_file luaext/openouirouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_pass http://$iuiserver;
- }
-
- location ~ ^/admin/([^/]+)(/[Vv][^/]*)?(.*) {
- set $apiname $1;
- set $apiversion $2;
- set $apiserver "fallback";
- set $adminurl "";
-
- # Lua files
- rewrite_by_lua_file luaext/openoadminrouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_pass http://$apiserver;
- }
-
- location ~ ^/apijson/([^/]+)(/[Vv][^/]*)?(.*) {
- location ~* ^/apijson/([^/]+)(/[v][^/]*)?(.*)\.(?:png|jpg|jpeg|js|css|html|gif|ico|bmp|woff)$ {
- set $apiname $1;
- set $apiversion $2;
- set $apiserver "fallback";
- set $apijsonurl "";
-
- # Lua files
- rewrite_by_lua_file luaext/openoapijsonrouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_cache nginx_cache;
- proxy_cache_key $host$uri$is_args$args;
- proxy_cache_valid 200 304 12h ;
- proxy_cache_valid 301 302 1m ;
- proxy_cache_valid any 1m ;
- expires 12h;
-
- proxy_pass http://$apiserver;
- }
- set $apiname $1;
- set $apiversion $2;
- set $apiserver "fallback";
- set $apijsonurl "";
-
- # Lua files
- rewrite_by_lua_file luaext/openoapijsonrouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_pass http://$apiserver;
- }
-
- location ~* \.(?:png|jpg|jpeg|js|css|html|gif|ico|bmp|woff)$ {
- set $server "fallback";
- set $url "";
- set $key "";
-
- # Lua files
- rewrite_by_lua_file luaext/customrouter.lua;
- access_by_lua_file luaext/execute_auth.lua;
-
- proxy_cache nginx_cache;
- proxy_cache_key $host$uri$is_args$args;
- proxy_cache_valid 200 304 12h ;
- proxy_cache_valid 301 302 1m ;
- proxy_cache_valid any 1m ;
- expires 12h;
-
- proxy_pass http://$server;
- }
-
- location = /favicon.ico {
- log_not_found off;
- }
-} \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/run.bat b/msb-core/openresty-ext/src/assembly/resources/openresty/run.bat
deleted file mode 100644
index 0efc55a..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/run.bat
+++ /dev/null
@@ -1,55 +0,0 @@
-@REM
-@REM Copyright 2016 ZTE Corporation.
-@REM
-@REM Licensed under the Apache License, Version 2.0 (the "License");
-@REM you may not use this file except in compliance with the License.
-@REM You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-@REM
-@REM Author: Zhaoxing Meng
-@REM email: meng.zhaoxing1@zte.com.cn
-@REM
-
-@echo off
-title openresty-server
-@if not "%ECHO%" == "" echo %ECHO%
-@if "%OS%" == "Windows_NT" setlocal
-
-set DIRNAME=.
-
-if "%OS%" == "Windows_NT" set DIRNAME=%~dp0%
-
-set ARGS=
-:loop
-if [%1] == [] goto endloop
- set ARGS=%ARGS% %1
- shift
- goto loop
-:endloop
-
-set HOME=%DIRNAME%nginx
-set _NGINXCMD=%HOME%\nginx.exe
-
-echo =========== openresty config info ============================================
-echo HOME=%HOME%
-echo _NGINXCMD=%_NGINXCMD%
-echo ===============================================================================
-
-cd /d "%HOME%"
-echo @WORK_DIR@%HOME%
-echo @C_CMD@ "%_NGINXCMD%"
-%_NGINXCMD%
-IF ERRORLEVEL 1 goto showerror
-exit
-:showerror
-echo WARNING: Error occurred during startup or Server abnormally stopped by way of killing the process,Please check!
-echo After checking, press any key to close
-pause
-exit \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/stop.bat b/msb-core/openresty-ext/src/assembly/resources/openresty/stop.bat
deleted file mode 100644
index 3609162..0000000
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/stop.bat
+++ /dev/null
@@ -1,54 +0,0 @@
-@REM
-@REM Copyright 2016 ZTE Corporation.
-@REM
-@REM Licensed under the Apache License, Version 2.0 (the "License");
-@REM you may not use this file except in compliance with the License.
-@REM You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-@REM
-@REM Author: Zhaoxing Meng
-@REM email: meng.zhaoxing1@zte.com.cn
-@REM
-
-@echo off
-title close openresty-server
-@if not "%ECHO%" == "" echo %ECHO%
-@if "%OS%" == "Windows_NT" setlocal
-
-set DIRNAME=.
-
-if "%OS%" == "Windows_NT" set DIRNAME=%~dp0%
-
-set ARGS=
-:loop
-if [%1] == [] goto endloop
- set ARGS=%ARGS% %1
- shift
- goto loop
-:endloop
-
-set HOME=%DIRNAME%nginx
-set _NGINXCMD=%HOME%\nginx.exe
-
-
-echo =========== openresty config info ============================================
-echo HOME=%HOME%
-echo _NGINXCMD=%_NGINXCMD%
-echo ===============================================================================
-
-
-cd /d "%HOME%"
-echo @WORK_DIR@%HOME%
-echo @C_CMD@ "%_NGINXCMD% -s stop"
-
-%_NGINXCMD% -s stop
-echo closing signal has been sent,stopping in background,WAIT...
-timeout /t 5 /nobreak > nul
-exit
diff --git a/msb-core/pom.xml b/msb-core/pom.xml
deleted file mode 100644
index 0ddadf6..0000000
--- a/msb-core/pom.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>msb-core-root</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>msb-core-parent</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <name>common-services-microservice-bus/msb-core</name>
- <packaging>pom</packaging>
- <properties>
- <openresty.version>1.11.2.2</openresty.version>
- <redis.version>3.2.6</redis.version>
- <classifier.linux64>linux64</classifier.linux64>
- <linux64outputdir>target/assembly/${classifier.linux64}/</linux64outputdir>
- <version.output>target/version</version.output>
- </properties>
- <modules>
- <module>openresty-ext</module>
- <module>eag-openresty-ext</module>
- <module>redis-ext</module>
- <module>apiroute</module>
- <module>distributions</module>
- </modules>
-</project>
diff --git a/msb-parent/README.md b/msb-parent/README.md
deleted file mode 100644
index 700d593..0000000
--- a/msb-parent/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-modeldesign-parent
-============
-
-Root Pom of Project modeldesign
-
-**modeldesignparent-lite is descripe the maven repo and maven plugin .**
-
-**modeldesignparent is the parent pom of the this project ,which descripe the dependency Management of the thirdparty Supporting Libraries**
-
-you can use the following section to reference it .
-
-~~~
- <groupId>org.openo.orchestrator.modeldesignparent</groupId>
- <artifactId>modeldesignparent</artifactId>
- <version>1.0.0</version>
-~~~
-
diff --git a/msb-parent/msbparent-lite/pom.xml b/msb-parent/msbparent-lite/pom.xml
deleted file mode 100644
index 9eab8c1..0000000
--- a/msb-parent/msbparent-lite/pom.xml
+++ /dev/null
@@ -1,240 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.openo.oparent</groupId>
- <artifactId>oparent</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <relativePath/>
- </parent>
-
-
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>msbparent-lite</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <packaging>pom</packaging>
- <name>common-services-microservice-bus/msb-parent/msbparent-lite</name>
-
- <properties>
- <stream>latest</stream><!-- CI should pass in -Dstream={stream} -->
-
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-
- <!-- Java Versions -->
- <!-- FIXME: confirm these two are picked by maven-compiler-plugin -->
- <maven.compiler.source>1.7</maven.compiler.source>
- <maven.compiler.target>1.7</maven.compiler.target>
- <java.version.source>${maven.compiler.source}</java.version.source>
- <java.version.target>${maven.compiler.target}</java.version.target>
-
-
- <!-- Maven plugin versions, in the 'canonical' format -->
- <maven.antrun.plugin.version>1.8</maven.antrun.plugin.version>
- <maven.bundle.version>3.0.0</maven.bundle.version>
- <maven.clean.plugin.version>2.6.1</maven.clean.plugin.version>
- <maven.compile.plugin.version>3.3</maven.compile.plugin.version>
- <maven.jar.version>2.6</maven.jar.version>
- <maven.javadoc.version>2.10.3</maven.javadoc.version>
- <maven.plugin.version>3.4</maven.plugin.version>
- <maven.release.version>2.5.2</maven.release.version>
- <maven.surefire.version>2.18.1</maven.surefire.version>
-
- <!-- Maven plugin versions, in random formats -->
- <checkstyle.version>2.16</checkstyle.version>
- <compiler.version>${maven.compile.plugin.version}</compiler.version>
- <enforcer.version>1.4</enforcer.version>
- </properties>
-
- <build>
- <extensions>
- <extension>
- <groupId>org.apache.maven.wagon</groupId>
- <artifactId>wagon-ssh</artifactId>
- <version>2.10</version>
- </extension>
- <extension>
- <groupId>org.apache.maven.wagon</groupId>
- <artifactId>wagon-ftp</artifactId>
- <version>2.10</version>
- </extension>
- <extension>
- <groupId>org.apache.maven.wagon</groupId>
- <artifactId>wagon-webdav-jackrabbit</artifactId>
- <version>2.10</version>
- </extension>
- </extensions>
- <resources>
- <resource>
- <filtering>false</filtering>
- <directory>src/main/resources</directory>
- <includes>
- <include>**/*</include>
- </includes>
- </resource>
- <resource>
- <filtering>true</filtering>
- <directory>src/main/filters</directory>
- <includes>
- <include>**/*</include>
- </includes>
- </resource>
- </resources>
- <testResources>
- <testResource>
- <filtering>false</filtering>
- <directory>src/test/resources</directory>
- <includes>
- <include>**/*</include>
- </includes>
- </testResource>
- <testResource>
- <filtering>true</filtering>
- <directory>src/test/filters</directory>
- <includes>
- <include>**/*</include>
- </includes>
- </testResource>
- </testResources>
-
- <pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-site-plugin</artifactId>
- <version>3.4</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-project-info-reports-plugin</artifactId>
- <version>2.8.1</version>
- </plugin>
-
- <!-- Official maven plugins, alpha-sorted by artifactId.
- We do not need to specify the groupId. -->
- <plugin>
- <artifactId>maven-antrun-plugin</artifactId>
- <version>${maven.antrun.plugin.version}</version>
- </plugin>
-
- <plugin>
- <artifactId>maven-clean-plugin</artifactId>
- <version>${maven.clean.plugin.version}</version>
- </plugin>
- <plugin>
- <artifactId>maven-install-plugin</artifactId>
- <version>2.5.2</version>
- </plugin>
- <plugin>
- <artifactId>maven-deploy-plugin</artifactId>
- <version>2.8.2</version>
- </plugin>
- <plugin>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>${maven.compile.plugin.version}</version>
- </plugin>
- <plugin>
- <artifactId>maven-enforcer-plugin</artifactId>
- <version>${enforcer.version}</version>
- </plugin>
- <plugin>
- <artifactId>maven-failsafe-plugin</artifactId>
- <version>2.19.1</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-invoker-plugin</artifactId>
- <version>2.0.0</version>
- </plugin>
- <plugin>
- <artifactId>maven-jar-plugin</artifactId>
- <version>${maven.jar.version}</version>
- </plugin>
- <plugin>
- <artifactId>maven-javadoc-plugin</artifactId>
- <version>${maven.javadoc.version}</version>
- <configuration>
- <!-- Keep things quiet except for warnings/errors -->
- <quiet>true</quiet>
- </configuration>
- <executions>
- <execution>
- <id>attach-javadocs</id>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <artifactId>maven-release-plugin</artifactId>
- <version>${maven.release.version}</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <version>2.10</version>
- </plugin>
-
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-plugin-plugin</artifactId>
- <version>${maven.plugin.version}</version>
- </plugin>
-
- <plugin>
- <artifactId>maven-resources-plugin</artifactId>
- <version>2.7</version>
- </plugin>
- <plugin>
- <artifactId>maven-shade-plugin</artifactId>
- <version>2.4.1</version>
- </plugin>
- <plugin>
- <artifactId>maven-source-plugin</artifactId>
- <version>2.4</version>
- <executions>
- <execution>
- <id>attach-sources</id>
- <goals>
- <goal>jar-no-fork</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <artifactId>maven-surefire-plugin</artifactId>
- <version>${maven.surefire.version}</version>
- <configuration>
- <redirectTestOutputToFile>true</redirectTestOutputToFile>
- </configuration>
- </plugin>
-
- </plugins>
- </pluginManagement>
- </build>
-
-
-
-</project>
diff --git a/msb-parent/pom.xml b/msb-parent/pom.xml
deleted file mode 100644
index 5dedb3b..0000000
--- a/msb-parent/pom.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-<modelVersion>4.0.0</modelVersion>
-
-<parent>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>msbparent-lite</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <relativePath>msbparent-lite</relativePath>
-</parent>
-
-<artifactId>msbparent-aggregator</artifactId>
-<version>1.0.0</version>
-<name>common-services-microservice-bus/msb-parent</name>
-<packaging>pom</packaging>
-
-
-<modules>
- <module>msbparent</module>
- <module>msbparent-lite</module>
-</modules>
-
-<build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-deploy-plugin</artifactId>
- <version>2.8.2</version>
- <configuration>
- <skip>true</skip>
- </configuration>
- </plugin>
- </plugins>
-</build>
-
-</project>
diff --git a/msb-core/openresty-ext/pom.xml b/openresty-ext/pom.xml
index 57a6af5..2f122da 100644
--- a/msb-core/openresty-ext/pom.xml
+++ b/openresty-ext/pom.xml
@@ -1,54 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
-
- Copyright 2016 ZTE Corporation.
-
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
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
-
+
+ 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
+
-->
+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>msb-core-parent</artifactId>
- <version>1.1.0-SNAPSHOT</version>
+ <groupId>org.onap.msb.apigateway</groupId>
+ <artifactId>msb-apigateway-parent</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
+ <groupId>org.onap.msb.apigateway</groupId>
<artifactId>openresty-ext</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <name>common-services-microservice-bus/msb-core/openresty-ext</name>
+ <version>0.0.1-SNAPSHOT</version>
+ <name>onap/msb/apigateway/openresty-ext</name>
<packaging>pom</packaging>
<properties>
<outputdir>target/assembly</outputdir>
<packageid>openresty-ext</packageid>
+ <sdk-packageid>openresty-ext-sdk</sdk-packageid>
</properties>
- <dependencies>
- <dependency>
- <groupId>org.openresty.centos.6</groupId>
- <artifactId>openresty</artifactId>
- <version>${openresty.version}</version>
- <type>tar.gz</type>
- </dependency>
- </dependencies>
- <build>
- <plugins>
+ <profiles>
+ <profile>
+ <id>linux</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <dependencies>
+ <!--
+ <dependency>
+ <groupId>org.openresty.centos.6</groupId>
+ <artifactId>openresty</artifactId>
+ <version>${openresty.version}</version>
+ <type>tar.gz</type>
+ </dependency>
+ -->
+ </dependencies>
+ <build>
+ <plugins>
+ <!--
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
@@ -58,16 +67,15 @@
<goals>
<goal>unpack</goal>
</goals>
- <!--解压顺åºï¼Œåœ¨æœ€å‰é¢-->
<phase>generate-resources</phase>
<configuration>
<artifactItems>
<artifactItem>
- <groupId>org.openresty.centos.6</groupId>
+ <groupId>org.openresty.centos.6</groupId>
<artifactId>openresty</artifactId>
<type>tar.gz</type>
<outputDirectory>${linux64outputdir}</outputDirectory>
- </artifactItem>
+ </artifactItem>
</artifactItems>
<excludes>**/pod/**,**/*.pdb</excludes>
<overWriteReleases>false</overWriteReleases>
@@ -96,7 +104,8 @@
</execution>
</executions>
</plugin>
-
+ -->
+
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
@@ -152,14 +161,24 @@
</tarfileset>
</tar>
<attachartifact file="${version.output}/${packageid}-${project.version}-${classifier.linux64}.tar.gz" classifier="${classifier.linux64}" type="tar.gz"/>
+ <tar destfile="${version.output}/${sdk-packageid}-${project.version}.tar.gz" longfile="posix" compression="gzip">
+ <tarfileset dir="src/assembly/resources/openresty/nginx/luaext" filemode="0644" dirmode="0755">
+ </tarfileset>
+ </tar>
</target>
</configuration>
</execution>
</executions>
</plugin>
- </plugins>
- </build>
+ </plugins>
+ </build>
+ </profile>
+
+ </profiles>
+
+
+
-</project>
+</project> \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/conf/mime.types b/openresty-ext/src/assembly/resources/openresty/nginx/conf/mime.types
new file mode 100644
index 0000000..829e8ba
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/conf/mime.types
@@ -0,0 +1,94 @@
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+types {
+ text/html html htm shtml;
+ text/css css;
+ text/xml xml rss;
+ image/gif gif;
+ image/jpeg jpeg jpg;
+ application/x-javascript js;
+ application/atom+xml atom;
+
+ text/mathml mml;
+ text/plain txt;
+ text/vnd.sun.j2me.app-descriptor jad;
+ text/vnd.wap.wml wml;
+ text/x-component htc;
+
+ image/png png;
+ image/tiff tif tiff;
+ image/vnd.wap.wbmp wbmp;
+ image/x-icon ico;
+ image/x-jng jng;
+ image/x-ms-bmp bmp;
+ image/svg+xml svg svgz;
+
+ application/java-archive jar war ear;
+ application/json json;
+ application/mac-binhex40 hqx;
+ application/msword doc;
+ application/pdf pdf;
+ application/postscript ps eps ai;
+ application/rtf rtf;
+ application/vnd.ms-excel xls;
+ application/vnd.ms-powerpoint ppt;
+ application/vnd.wap.wmlc wmlc;
+ application/vnd.google-earth.kml+xml kml;
+ application/vnd.google-earth.kmz kmz;
+ application/x-7z-compressed 7z;
+ application/x-cocoa cco;
+ application/x-java-archive-diff jardiff;
+ application/x-java-jnlp-file jnlp;
+ application/x-makeself run;
+ application/x-perl pl pm;
+ application/x-pilot prc pdb;
+ application/x-rar-compressed rar;
+ application/x-redhat-package-manager rpm;
+ application/x-sea sea;
+ application/x-shockwave-flash swf;
+ application/x-stuffit sit;
+ application/x-tcl tcl tk;
+ application/x-x509-ca-cert der pem crt;
+ application/x-xpinstall xpi;
+ application/xhtml+xml xhtml;
+ application/zip zip;
+
+ application/octet-stream bin exe dll;
+ application/octet-stream deb;
+ application/octet-stream dmg;
+ application/octet-stream eot;
+ application/octet-stream iso img;
+ application/octet-stream msi msp msm;
+ application/ogg ogx;
+
+ audio/midi mid midi kar;
+ audio/mpeg mpga mpega mp2 mp3 m4a;
+ audio/ogg oga ogg spx;
+ audio/x-realaudio ra;
+ audio/webm weba;
+
+ video/3gpp 3gpp 3gp;
+ video/mp4 mp4;
+ video/mpeg mpeg mpg mpe;
+ video/ogg ogv;
+ video/quicktime mov;
+ video/webm webm;
+ video/x-flv flv;
+ video/x-mng mng;
+ video/x-ms-asf asx asf;
+ video/x-ms-wmv wmv;
+ video/x-msvideo avi;
+} \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/conf/nginx.conf b/openresty-ext/src/assembly/resources/openresty/nginx/conf/nginx.conf
new file mode 100644
index 0000000..c51d10a
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/conf/nginx.conf
@@ -0,0 +1,72 @@
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+
+#user nobody;
+worker_processes 8;
+worker_rlimit_nofile 65535;
+
+error_log logs/error.log warn;
+pid logs/nginx.pid;
+
+env ROUTER_SUBDOMAIN;
+env HTTP_OVERWRITE_PORT;
+env HTTPS_OVERWRITE_PORT;
+
+events {
+ #there is normally no need to specify the following directive explicitly
+ #use epoll;
+ worker_connections 10000;
+ multi_accept on;
+}
+
+http {
+ include mime.types;
+ #default_type text/html;
+
+ log_format main '$remote_addr - $remote_user [$time_local] $request_id "$request" '
+ '$status request_processing_time:$request_time upstream_response_time:$upstream_response_time '
+ '"$http_referer" "$http_user_agent" "$http_x_forwarded_for"';
+
+ access_log logs/access.log main;
+ #access_log off;
+
+ sendfile on;
+ tcp_nopush on;
+ tcp_nodelay on;
+
+ server_tokens off;
+
+ keepalive_timeout 120s;
+ keepalive_requests 200;
+ types_hash_max_size 2048;
+
+ #open_file_cache max=200000 inactive=300s;
+ #open_file_cache_valid 300s;
+ #open_file_cache_min_uses 2;
+ #open_file_cache_errors on;
+
+ gzip on;
+ gzip_min_length 1000;
+ gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml;
+
+ include ../msb-enabled/*.conf;
+ include ../sites-enabled/*.conf;
+ include ../sites-enabled-mount/*.conf;
+}
+
+stream {
+ include ../stream-enabled/*.conf;
+}
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/html/cert/ca.crt b/openresty-ext/src/assembly/resources/openresty/nginx/html/cert/ca.crt
new file mode 100644
index 0000000..62da777
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/html/cert/ca.crt
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnoCCQCHtNgoWafiHzANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMC
+Q04xETAPBgNVBAgMCHNpY2h1YW5nMRAwDgYDVQQHDAdjaGVuZ2R1MQwwCgYDVQQK
+DAN6dGUxDjAMBgNVBAsMBXplbmFwMTgwNgYDVQQDDC9aVEUgT3BlblBhbGV0dGUg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxNzAeFw0xNzAzMTcwMTU2MjBa
+Fw0yNzAzMTUwMTU2MjBaMIGKMQswCQYDVQQGEwJDTjERMA8GA1UECAwIc2ljaHVh
+bmcxEDAOBgNVBAcMB2NoZW5nZHUxDDAKBgNVBAoMA3p0ZTEOMAwGA1UECwwFemVu
+YXAxODA2BgNVBAMML1pURSBPcGVuUGFsZXR0ZSBSb290IENlcnRpZmljYXRlIEF1
+dGhvcml0eSAyMDE3MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA23LK
+Eq56pVzsRbYJ6NMdk82QfLjnp+f7KzdQ46SfwldG3gmipasPwDXV9jT9FvUlX8s/
+mRphOyuZ7vDzL2QjlS/FBATTWrJ2VCJmBVlzVu4STZ6YrxpQrSAalGkiYd9uT2Yt
+2quNUPCsZSlJ8qJCYs098bJ2XTsK0JBby94j3nTdvNWhhErrheWdG/CHje32sKog
+6BxN4GzMeZ2fUd0vKsqBs89M0pApdjpRMqEGHg+Lri4iiE9kKa/Y8S3V6ggJZjbp
+7xs7N0miy/paeosjfFe5U6mhumUSZPFy8ueAgGxqBkwvLJwCY3HYcrsFGaXTu+c3
+p2q1Adygif1h43HrvQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAb/cgmsCxvQmvu
+5e4gpn5WEMo0k7F6IAghd8139i9vmtQ88reYZvfiVsp/5ZjNnNj75lLbjjexDkPA
+bdnAiJfRKOrMaPqY6Bem4v8lPu1B/kj1umn4BXOCC1kpcH/2JCmvI8uh49SSlT9J
+wUSKWw8Qhy9XKN692y02QZke9Xp2HoFvMUlntglmQUIRO5eBYLQCSWpfv/iyMs6w
+ar7Tk1p2rURpRh02P7WFQ5j5fxXEOrkMT7FX80EB3AddSthstj2iDlUcqfG3jXH/
+FA5r1q45kMUaMYxV9WIE67Vt0RaxrUJYWDR2kDSSox7LR5GpjWiSlPAfcLCeVuA3
+3lR7lW/J
+-----END CERTIFICATE-----
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/logs/placeholder.txt b/openresty-ext/src/assembly/resources/openresty/nginx/logs/placeholder.txt
index e69de29..e69de29 100644
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/logs/placeholder.txt
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/logs/placeholder.txt
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/msbinit.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/msbinit.lua
new file mode 100644
index 0000000..bc8a13f
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/msbinit.lua
@@ -0,0 +1,58 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local modulename = "msbinit"
+local _M = {}
+_M._VERSION = '1.0.0'
+
+local str_util = require('lib.utils.str_util')
+local mark_empty_as_nil = str_util.mark_empty_as_nil
+
+_M.systemConf = {
+ ["defaultport"] = mark_empty_as_nil(os.getenv("HTTP_OVERWRITE_PORT")) or "80",
+ ["defaulthttpsport"] = mark_empty_as_nil(os.getenv("HTTPS_OVERWRITE_PORT")) or "443",
+ ["defaultprefix"] = "msb:routing",
+ ["enablefullsearch"] = true, --whether test against the custom services after common match processing
+ ["enablerefercheck"] = true, --whether use refer to test against the service names as the last solution
+ ["useconsultemplate"] = true --whether using consul template or not
+}
+_M.redisConf = {
+ ["host"] = "127.0.0.1",
+ ["port"] = 6379,
+ ["poolsize"] = 100,
+ ["idletimeout"] = 90000,
+ ["timeout"] = 1000,
+ ["dbid"] = 0
+}
+_M.cacheConf = {
+ ["positive_ttl"] = 5, --shcache use,in seconds
+ ["negative_ttl"] = 2, --shcache use,in seconds
+ ["actualize_ttl"] = 120, --shcache use,in seconds
+ ["lru_ttl"] = 2 --in seconds
+}
+_M.routerConf = {
+ -- cross-domain plugin uses this field in init_by_lua context, ngx.re.gsub is not allowed in this context, using string.gsub instead
+ --["subdomain"] = ngx.re.gsub(os.getenv("ROUTER_SBUDOMAIN") or "openpalette.zte.com.cn", "\\.", "\\.", "o"),
+ ["subdomain"] = string.gsub(mark_empty_as_nil(os.getenv("ROUTER_SUBDOMAIN")) or "openpalette.zte.com.cn", "%.", "\\."),
+ ["defaultprefix"]= "msb:host"
+}
+_M.server = {
+ ["fail_timeout"] = 10,
+ ["max_fails"] = 1
+}
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/svcconf.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/svcconf.lua
new file mode 100644
index 0000000..df6356e
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/svcconf.lua
@@ -0,0 +1,34 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local _M = {}
+_M._VERSION = '1.0.0'
+
+_M.apiRelatedTypes = {
+ ["api"] = true,
+ ["admin"] = true,
+ ["apijson"] = true
+}
+_M.urlfieldMap = {
+ ["api"] = "url",
+ ["admin"] = "metricsUrl",
+ ["apijson"] = "apijson",
+ ["iui"] = "url",
+ ["custom"] = "url"
+}
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/dao.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/dao.lua
new file mode 100644
index 0000000..58d058c
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/dao.lua
@@ -0,0 +1,123 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+--This module integrates the shcache with an abstraction for various databases(redis and so on)
+local _M = {}
+_M._VERSION = '1.0.0'
+
+local shcache = require("vendor.shcache")
+local cjson_safe = require "cjson.safe"
+local msbConf = require('conf.msbinit')
+
+local DB = require('dao.redis_db')
+local options = msbConf.redisConf
+
+local cacheConf = msbConf.cacheConf
+local positive_ttl = cacheConf.positive_ttl or 60
+local negative_ttl = cacheConf.negative_ttl or 2
+local actualize_ttl = cacheConf.actualize_ttl or 120
+
+local svc_shcache = ngx.shared.svc_cache
+
+local function load_serviceinfo(key)
+
+ -- closure to perform external lookup to redis
+ local fetch_svcinfo_from_db = function ()
+ local _db = DB:new(options)
+ return _db:getserviceinfo(key)
+ end
+
+ local svcinfo_cache_table = shcache:new(
+ svc_shcache,
+ { external_lookup = fetch_svcinfo_from_db,
+ --encode = cmsgpack.pack,
+ --encode = cjson_safe.encode,
+ --decode = cmsgpack.unpack
+ --decode = cjson_safe.decode
+ },
+ { positive_ttl = positive_ttl, -- default cache good data for 60s
+ negative_ttl = negative_ttl, -- default cache failed lookup for 5s
+ actualize_ttl = actualize_ttl,
+ name = 'svcinfo_cache' -- "named" cache, useful for debug / report
+ }
+ )
+
+ local serviceinfo, from_cache = svcinfo_cache_table:load(key)
+
+ return serviceinfo
+end
+_M.load_serviceinfo = load_serviceinfo
+
+local function load_backservers(keypattern)
+
+ -- closure to perform external lookup to redis
+ local fetch_servers_from_db = function ()
+ local _db = DB:new(options)
+ return _db:getbackservers(keypattern)
+ end
+
+ local servers_cache_table = shcache:new(
+ svc_shcache,
+ { external_lookup = fetch_servers_from_db,
+ --encode = cmsgpack.pack,
+ encode = cjson_safe.encode,
+ --decode = cmsgpack.unpack
+ decode = cjson_safe.decode
+ },
+ { positive_ttl = positive_ttl, -- default cache good data for 60s
+ negative_ttl = negative_ttl, -- default cache failed lookup for 5s
+ name = 'servers_cache' -- "named" cache, useful for debug / report
+ }
+ )
+
+ local servers_table, from_cache = servers_cache_table:load(keypattern)
+
+ return servers_table
+end
+_M.load_backservers = load_backservers
+
+
+local function load_customsvcnames(keypattern)
+ -- closure to perform external lookup to redis
+ local fetch_svcnames_from_db = function ()
+ local _db = DB:new(options)
+ return _db:getcustomsvcnames(keypattern)
+ end
+
+ local svcnames_cache_table = shcache:new(
+ svc_shcache,
+ { external_lookup = fetch_svcnames_from_db,
+ --encode = cmsgpack.pack,
+ encode = cjson_safe.encode,
+ --decode = cmsgpack.unpack
+ decode = cjson_safe.decode
+ },
+ { positive_ttl = positive_ttl, -- default cache good data for 60s
+ negative_ttl = negative_ttl, -- default cache failed lookup for 5s
+ actualize_ttl = actualize_ttl,
+ name = 'svcnames_cache' -- "named" cache, useful for debug / report
+ }
+ )
+
+ local service_names, from_cache = svcnames_cache_table:load(keypattern)
+
+ return service_names
+end
+_M.load_customsvcnames = load_customsvcnames
+
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/db_access.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/db_access.lua
new file mode 100644
index 0000000..35572cc
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/db_access.lua
@@ -0,0 +1,85 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+-- unified layer to access back DB, using two levels of cache mechanism(LRUCache and shcache)
+local _M = {}
+_M._VERSION = '1.0.0'
+
+local cache = require('lib.tools.db_cache')
+local dao = require('dao.dao')
+local msbConf = require('conf.msbinit')
+local cjson_safe = require "cjson.safe"
+local cacheConf = msbConf.cacheConf
+local lru_ttl = cacheConf.lru_ttl or 10
+
+function _M.load_serviceinfo(key)
+ -- Try to get from cache
+ local cached_value = cache.get(key)
+ if cached_value then
+ if cache.is_empty(cached_value) then
+ return nil
+ end
+ return cached_value
+ end
+ -- Get from shcache or backend redis
+ local svcinfo_str = dao.load_serviceinfo(key)
+ local value,err
+ if svcinfo_str then
+ value, err = cjson_safe.decode(svcinfo_str)
+ if err then
+ value = nil
+ ngx.log(ngx.WARN, "decode service info error: ", err, " service info: ", svcinfo_str)
+ end
+ else
+ value = nil
+ end
+ cache.set(key, value, lru_ttl)
+ return value
+end
+
+function _M.load_backservers(keypattern)
+ local value, err
+ -- Try to get from cache
+ value = cache.get(keypattern)
+ if not value then
+ -- Get from shcache or backend redis
+ value = dao.load_backservers(keypattern)
+ cache.set(keypattern, value, lru_ttl)
+ end
+ if cache.is_empty(value) then
+ return nil
+ end
+ return value
+end
+
+function _M.load_customsvcnames(keypattern)
+ local value, err
+ -- Try to get from cache
+ value = cache.get(keypattern)
+ if not value then
+ -- Get from shcache or backend redis
+ value = dao.load_customsvcnames(keypattern)
+ cache.set(keypattern, value, lru_ttl)
+ end
+ if cache.is_empty(value) then
+ return nil
+ end
+ return value
+end
+
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/redis_db.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/redis_db.lua
new file mode 100644
index 0000000..d35cb8e
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/redis_db.lua
@@ -0,0 +1,199 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+-- the client for redis, include the connection pool management and api implements
+local redis = require('resty.redis')
+local tbl_util = require('lib.utils.table_util')
+
+local _M = {
+}
+_M._VERSION = '0.0.1'
+_M._DESCRIPTION = 'msb_redis_module'
+
+local mt = { __index = _M }
+
+local tbl_insert = table.insert
+local tbl_sort = table.sort
+local tbl_isempty = tbl_util.isempty
+
+function _M.new(self, conf)
+ self.host = conf.host
+ self.port = conf.port
+ self.timeout = conf.timeout
+ self.dbid = conf.dbid
+ self.poolsize = conf.poolsize
+ self.idletimeout = conf.idletimeout
+
+ local red = redis:new()
+ return setmetatable({redis = red}, mt)
+end
+
+function _M.connectdb(self)
+ local host = self.host
+ local port = self.port
+ local dbid = self.dbid
+ local red = self.redis
+
+ if not (host and port) then
+ return nil, 'no host:port avaliable provided'
+ end
+
+ --set default value
+ if not dbid then dbid = 0 end
+ local timeout = self.timeout
+ if not timeout then
+ timeout = 1000 -- 1s
+ end
+
+ red:set_timeout(timeout)
+
+ local ok, err
+ if host and port then
+ ok, err = red:connect(host, port)
+ if ok then return red:select(dbid) end
+ end
+
+ return ok, err
+end
+
+function _M.keepalivedb(self)
+ local max_idle_timeout = self.idletimeout --ms
+ local pool_size = self.poolsize
+
+ if not pool_size then pool_size = 100 end
+ if not max_idle_timeout then max_idle_timeout = 90000 end --90s
+
+ local ok, err = self.redis:set_keepalive(max_idle_timeout, pool_size)
+ if not ok then
+ ngx.log(ngx.ERR, "redis pool keepalive error",err)
+ return
+ end
+ return
+end
+
+--inner function,only used in this module
+local function _hgetall(red,key)
+ local resp,err = red:hgetall(key)
+ --if not resp or next(resp) == nil then
+ if tbl_isempty(resp) then
+ return nil, "key "..key.." not found"
+ end
+ local hashinfo = red:array_to_hash(resp)
+ return hashinfo,nil
+end
+
+function _M.getserviceinfo(self,key)
+ if not key then
+ return nil,'no key is provided'
+ end
+ local c, err = self:connectdb()
+ if not c then
+ return nil, err
+ end
+
+ local red = self.redis
+ local resp,err = red:get(key) --the key will create dynamically
+ self:keepalivedb()
+ if not resp or resp == ngx.null then
+ return nil, "key "..key.." not found"
+ else
+ return resp,nil
+ end
+end
+
+function _M.getbackservers(self,keypattern)
+ if not keypattern then
+ return nil,'no keypattern is provided'
+ end
+ local c, err = self:connectdb()
+ if not c then
+ return nil, err
+ end
+
+ local red = self.redis
+
+ local resp, err = red:keys(keypattern)
+ if tbl_isempty(resp) then
+ self:keepalivedb()
+ return nil, "no server matched"
+ end
+
+ local servers = {}
+ for i, v in ipairs(resp) do
+ local serverinfo,err = _hgetall(red,v)
+ if serverinfo then
+ tbl_insert(servers,serverinfo)
+ end
+ end
+ self:keepalivedb()
+ return servers,nil
+end
+
+function _M.getcustomsvcnames(self,keypattern)
+ if not keypattern then
+ return nil,'no keypattern is provided'
+ end
+ local c, err = self:connectdb()
+ if not c then
+ return nil, err
+ end
+
+ local red = self.redis
+ --store svc names into the Set
+ local svcname_set={}
+
+ local res, err = red:scan("0","count",50,"match",keypattern)
+ if not res then
+ self:keepalivedb()
+ return {}, "failed to scan in getcustomsvcnames()"
+ end
+
+ local cursor, keys, err = unpack(res)
+ for _, svckey in ipairs(keys) do
+ local m, err = ngx.re.match(svckey, "^.+:custom:([^:]+)", "o")
+ if m then
+ svcname_set[m[1]]=true
+ end
+ end
+
+ while( cursor ~= "0" )
+ do
+ res = red:scan(cursor,"count",50,"match",keypattern)
+ if not res then
+ break
+ end
+ cursor, keys, err = unpack(res)
+ for _, svckey in ipairs(keys) do
+ local m, err = ngx.re.match(svckey, "^.+:custom:([^:]+)", "o")
+ if m then
+ svcname_set[m[1]]=true
+ end
+ end
+ end
+ self:keepalivedb()
+ local svcnames = {}
+ for svcname,_ in pairs(svcname_set) do
+ tbl_insert(svcnames,svcname)
+ end
+ --sort the key_table in reverse order
+ tbl_sort(svcnames, function (a, b)
+ return a > b
+ end)
+ return svcnames,nil
+end
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/tools/db_cache.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/tools/db_cache.lua
new file mode 100644
index 0000000..7f40590
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/tools/db_cache.lua
@@ -0,0 +1,54 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+-- db cache over LRUCache, used within one worker processes
+local _M = {}
+_M._VERSION = '1.0.0'
+
+local lrucache = require "resty.lrucache"
+
+local EMPTY_DATA = '_EMPTY_'
+
+-- we need to initialize the cache on the lua module level so that
+-- it can be shared by all the requests served by each nginx worker process:
+local cache,err = lrucache.new(200) -- allow up to 200 items in the cache
+if not cache then
+ return ngx.log(ngx.ERR,"failed to create the cache: " .. (err or "unknown"))
+end
+
+function _M.get(key)
+ return cache:get(key)
+end
+
+function _M.set(key,value)
+ return _M:set(key, value, nil)
+end
+
+function _M.set(key,value,ttl)
+ if not value then
+ value = EMPTY_DATA
+ end
+ return cache:set(key, value, ttl)
+end
+
+-- check if the data returned by get() is considered empty
+function _M.is_empty(data)
+ return data == EMPTY_DATA
+end
+
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/tools/rr_cache.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/tools/rr_cache.lua
new file mode 100644
index 0000000..bfcc157
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/tools/rr_cache.lua
@@ -0,0 +1,40 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+-- round-robin cache over LRUCache, used within one worker processes
+local _M = {}
+_M._VERSION = '1.0.0'
+
+local lrucache = require "resty.lrucache"
+
+-- we need to initialize the cache on the lua module level so that
+-- it can be shared by all the requests served by each nginx worker process:
+local rrcache,err = lrucache.new(500) -- allow up to 200 items in the cache
+if not rrcache then
+ return ngx.log(ngx.ERR,"failed to create the cache: " .. (err or "unknown"))
+end
+
+function _M.get(key)
+ return rrcache:get(key)
+end
+
+function _M.set(key,value)
+ rrcache:set(key, value)
+end
+
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/error_handler.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/error_handler.lua
new file mode 100644
index 0000000..784eb86
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/error_handler.lua
@@ -0,0 +1,48 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local _M = {}
+_M._VERSION = '1.0.0'
+local msbConf = require('conf.msbinit')
+local enablefullsearch = msbConf.systemConf.enablefullsearch
+local ngx_var = ngx.var
+local error_page_head = '<html><head><title>502 Bad Gateway</title></head><body bgcolor="white"><center><h1>502 Bad Gateway</h1></center><center>error message:'
+local error_page_foot = '</center><hr><center>nginx</center></body></html>'
+local upstream_not_found_err = "service info is incorrect:using own upstream flag is on but upstream name is empty"
+
+function _M.svc_not_found(err_info,detail_info)
+ ngx.log(ngx.WARN, ngx.var.request_id.." "..(err_info or "").." detail_info:"..(detail_info or ""))
+ if enablefullsearch and ngx_var.svc_type ~= "custom" then
+ -- test against the custom services after the commonrewrite phase
+ --ngx.status = ngx.HTTP_GONE
+ return ngx.exec("@commonnotfound");
+ else
+ ngx.status = ngx.HTTP_BAD_GATEWAY
+ ngx.print(error_page_head..err_info..error_page_foot)
+ end
+ return ngx.exit(ngx.status)
+end
+
+function _M.upstream_not_found()
+ ngx.log(ngx.WARN, ngx.var.request_id.." "..upstream_not_found_err)
+ ngx.status = ngx.HTTP_BAD_GATEWAY
+ ngx.print(error_page_head..upstream_not_found_err..error_page_foot)
+ return ngx.exit(ngx.status)
+end
+
+return _M \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/setnocacheflag.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/log_util.lua
index 8b57660..67b0e26 100644
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/setnocacheflag.lua
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/log_util.lua
@@ -1,29 +1,28 @@
---[[
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
-]]
-local from, to, err = ngx.re.find(ngx.var.uri, "\\.(gif|jpg|jpeg|png|bmp|ico)$", "jo")
---Based on the request file type to determine whether to cache
-if from then
- --use cache
- return 0
-else
- --do not use cache
- return 1
-end \ No newline at end of file
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local _M = {}
+_M._VERSION = '1.0.0'
+
+function _M.log(k, v)
+ --if empty,initialize it
+ if not ngx.ctx.logtbl then ngx.ctx.logtbl = {} end
+ ngx.ctx.logtbl[k] = v
+end
+
+return _M \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/execute_auth.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/str_util.lua
index 946f561..6fa8d39 100644
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/execute_auth.lua
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/str_util.lua
@@ -1,25 +1,30 @@
---[[
-
- Copyright 2016 ZTE Corporation.
-
- 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
-]]
-local auth_plugin = require('plugins.auth')
-local msbconf = require('msbconf')
-if(msbconf.auth_plugin_status == "on") then
- auth_plugin.access()
-end \ No newline at end of file
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local _M = {}
+_M._VERSION = '1.0.0'
+
+function _M.mark_empty_as_nil(t)
+ if t == "" then
+ return nil
+ else
+ return t
+ end
+end
+
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/svc_util.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/svc_util.lua
new file mode 100644
index 0000000..226e31f
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/svc_util.lua
@@ -0,0 +1,96 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local _M = {}
+_M._VERSION = '1.0.0'
+
+local msbConf= require('conf.msbinit')
+local svcConf = require('conf.svcconf')
+local log_util = require('lib.utils.log_util')
+
+local log = log_util.log
+local ngx_var = ngx.var
+
+local defaultport = msbConf.systemConf.defaultport
+local defaulthttpsport = msbConf.systemConf.defaulthttpsport
+local defaultprefix = msbConf.systemConf.defaultprefix
+local router_subdomain = msbConf.routerConf.subdomain
+local router_defaultprefix = msbConf.routerConf.defaultprefix
+local useconsultemplate = msbConf.systemConf.useconsultemplate
+local urlfieldMap = svcConf.urlfieldMap
+local apiRelatedTypes = svcConf.apiRelatedTypes
+
+function _M.isactive(svcinfo)
+ if svcinfo["status"] == "1" then
+ return true
+ else
+ return false
+ end
+end
+
+function _M.use_own_upstream(svcinfo)
+ if useconsultemplate and svcinfo.spec.useOwnUpstream == "1" then
+ log("useOwnUpstream",true)
+ return true
+ else
+ return false
+ end
+end
+
+function _M.get_url(svcinfo,svc_type)
+ return svcinfo.spec[urlfieldMap[svc_type]]
+end
+
+function _M.get_backend_protocol(svcinfo)
+ local svc_enable_ssl = svcinfo.spec["enable_ssl"]
+ if svc_enable_ssl then
+ return "https"
+ else
+ return "http"
+ end
+end
+
+function _M.get_key_prefix()
+ --now assemble the key prefix according the svc_name and server_port
+ local key_prefix = ""
+ local server_port = ngx_var.server_port
+ local svc_name = ngx_var.svc_name
+ if (svc_name == "microservices" or svc_name == "msdiscover") then
+ key_prefix = defaultprefix
+ elseif (server_port == defaultport or server_port == defaulthttpsport) then
+ local m, err = ngx.re.match(ngx_var.host, "(?<hostname>.+)\\."..router_subdomain,"o")
+ if m then
+ key_prefix = router_defaultprefix..":"..m["hostname"]
+ else
+ key_prefix = defaultprefix
+ end
+ else
+ key_prefix = "msb:"..server_port
+ end
+ return key_prefix
+end
+
+function _M.is_api_related_types(svc_type)
+ if(apiRelatedTypes[svc_type]) then
+ return true
+ else
+ return false
+ end
+end
+
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/table_util.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/table_util.lua
new file mode 100644
index 0000000..c1ddbfe
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/table_util.lua
@@ -0,0 +1,30 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local _M = {}
+_M._VERSION = '1.0.0'
+
+function _M.isempty(t)
+ if t == nil or next(t) == nil then
+ return true
+ else
+ return false
+ end
+end
+
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/balancer.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/balancer.lua
new file mode 100644
index 0000000..48dc1d8
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/balancer.lua
@@ -0,0 +1,50 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local b = require "ngx.balancer"
+local baseupstream = require "loadbalance.baseupstream"
+local log_util = require('lib.utils.log_util')
+local error_handler = require('lib.utils.error_handler')
+
+local log = log_util.log
+local ngx_ctx = ngx.ctx
+local servers = ngx_ctx.backservers
+local svc_key = ngx_ctx.svc_key
+local error_svc_not_found = error_handler.svc_not_found
+
+local status = b.get_last_failure()
+if status == nil then
+ --only reset the server status table of the service in the first attempt
+ baseupstream.check_and_reset_srv_status_ifneed(svc_key,servers)
+elseif status == "failed" then
+ local last_peer = ngx.ctx.last_peer
+ --mark the srv failed one time
+ baseupstream.mark_srv_failed(svc_key,last_peer)
+end
+
+local server,err = baseupstream.get_backserver(svc_key,servers)
+if server == nil then
+ ngx.log(ngx.WARN, ngx.var.request_id.." ".."No active backend server found! detail_info: key--"..svc_key.." "..(err or ""))
+ return
+end
+if baseupstream.can_retry(svc_key,servers) then
+ b.set_more_tries(1)
+end
+b.set_current_peer(server["ip"],server["port"])
+--log("upstreamserver",server["ip"]..":"..server["port"])
+ngx.ctx.last_peer = { ip=server["ip"], port=server["port"] } \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/baseupstream.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/baseupstream.lua
new file mode 100644
index 0000000..4af6dfa
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/baseupstream.lua
@@ -0,0 +1,66 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local _M = {
+ _VERSION = '1.0.0'
+}
+local policymodule = require "loadbalance.policy.roundrobin"
+local tbl_util = require('lib.utils.table_util')
+local peerwatcher = require "loadbalance.peerwatcher"
+local tbl_isempty = tbl_util.isempty
+
+function _M.get_backserver(svc_key,servers)
+ if tbl_isempty(servers) then return nil,"server list is empty" end
+
+ local servers_num = #servers
+ if not ngx.ctx.tried_num then
+ ngx.ctx.tried_num = 0
+ end
+ local server
+ if servers_num==1 then
+ ngx.ctx.tried_num = ngx.ctx.tried_num+1
+ -- return it directly if there is only one server
+ server = servers[1]
+ if peerwatcher.is_server_ok(svc_key,server) then
+ return server,""
+ else
+ return nil,"only one server but is not available"
+ end
+ end
+ for i=ngx.ctx.tried_num+1,servers_num do
+ ngx.ctx.tried_num = ngx.ctx.tried_num+1
+ server = policymodule.select_backserver(servers,svc_key)
+ if peerwatcher.is_server_ok(svc_key,server) then
+ return server,""
+ end
+ end
+ return nil,"serveral server but no one is available"
+end
+
+function _M.can_retry(svc_key,servers)
+ return ngx.ctx.tried_num < #servers
+end
+
+function _M.mark_srv_failed(svc_key, srv)
+ peerwatcher.set_srv_status(svc_key, srv, true)
+end
+
+function _M.check_and_reset_srv_status_ifneed(svc_key, servers)
+ peerwatcher.check_and_reset_srv_status_ifneed(svc_key,servers)
+end
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/peerwatcher.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/peerwatcher.lua
new file mode 100644
index 0000000..6b7e522
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/peerwatcher.lua
@@ -0,0 +1,107 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local _M = {
+ _VERSION = '1.0.0',
+ STATUS_OK = 0, STATUS_UNSTABLE = 1, STATUS_ERR = 2
+}
+local msbConf = require('conf.msbinit')
+local str_format = string.format
+local now = ngx.now
+local fail_timeout = msbConf.server.fail_timeout or 10
+local max_fails = msbConf.server.max_fails or 1
+
+local cluster_status = {}
+_M.cluster_status = cluster_status
+
+function _M.is_server_ok(skey, srv)
+ return _M.get_srv_status(skey, srv)==_M.STATUS_OK
+end
+
+function _M.get_srv_status(skey, srv)
+ local server_status = cluster_status[skey]
+ if not server_status then
+ return _M.STATUS_OK
+ end
+
+ local srv_key = str_format("%s:%d", srv.ip, srv.port)
+ local srv_status = server_status[srv_key]
+
+ if srv_status and srv_status.lastmodify + fail_timeout > now() then
+ return srv_status.status
+ end
+
+ return _M.STATUS_OK
+end
+
+function _M.set_srv_status(skey, srv, failed)
+ local server_status = cluster_status[skey]
+ if not server_status then
+ server_status = {}
+ cluster_status[skey] = server_status
+ end
+
+ local time_now = now()
+ local srv_key = str_format("%s:%d", srv.ip, srv.port)
+ local srv_status = server_status[srv_key]
+ if not srv_status then -- first set
+ srv_status = {
+ status = _M.STATUS_OK,
+ failed_count = 0,
+ lastmodify = time_now
+ }
+ server_status[srv_key] = srv_status
+ elseif srv_status.lastmodify + fail_timeout < time_now then -- srv_status expired
+ srv_status.status = _M.STATUS_OK
+ srv_status.failed_count = 0
+ srv_status.lastmodify = time_now
+ end
+
+ if failed then
+ srv_status.failed_count = srv_status.failed_count + 1
+ if srv_status.failed_count >= max_fails then
+ srv_status.status = _M.STATUS_ERR
+ end
+ end
+end
+
+function _M.check_and_reset_srv_status_ifneed(skey,servers)
+ local server_status = cluster_status[skey]
+ --if disabled servers of the service is empty,do nothing
+ if not server_status then
+ ngx.log(ngx.DEBUG, "service:",skey," server_status is nil")
+ return
+ end
+ local need_reset = true
+ for _, srv in ipairs(servers) do
+ local srv_key = str_format("%s:%d", srv.ip, srv.port)
+ local srv_status = server_status[srv_key]
+ if not (srv_status and srv_status.status == _M.STATUS_ERR and srv_status.lastmodify + fail_timeout > now()) then
+ --once find the server is not disabled now, no need to reset the status table. break the loop
+ ngx.log(ngx.DEBUG, "service:",skey," donot need reset,break the loop")
+ need_reset = false
+ break
+ end
+ end
+ if need_reset then
+ ngx.log(ngx.DEBUG, "service:",skey," need reset")
+ cluster_status[skey] = {}
+ end
+end
+
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy/roundrobin.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy/roundrobin.lua
new file mode 100644
index 0000000..0a1b8e8
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy/roundrobin.lua
@@ -0,0 +1,68 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local _M = {}
+_M._VERSION = '1.0.0'
+
+local tbl_util = require('lib.utils.table_util')
+local tbl_isempty = tbl_util.isempty
+local rrcache = require('lib.tools.rr_cache')
+
+function _M.select_backserver(servers,svckey)
+ local length = #servers
+ local index = ngx.ctx.last_peer_index
+
+ if index then
+ --if it is a retry request,use the index in the context as the base
+ index = index%length+1
+ else
+ --if it is a normal request,fetch index from cache as the base
+ index = rrcache.get(svckey) or 0
+ index = index%length+1
+ rrcache.set(svckey,index)
+ end
+ ngx.ctx.last_peer_index = index
+
+ --[[
+ local resty_lock = require "resty.lock"
+ local roundrobin_cache = ngx.shared.rr_cache
+
+ --step1:acquire lock
+ local opts = {["timeout"] = 0.002,["exptime"] = 0.05}--this can be set using the conf file
+ local rrlock = resty_lock:new("rr_locks",opts)
+ local elapsed, err = rrlock:lock(svckey)
+ if not elapsed then
+ --return fail("failed to acquire the lock: ", err)
+ end
+ --step2:lock successfully acquired!incr the index
+ local index, err = roundrobin_cache:get(svckey)
+ if not index then
+ index = 0
+ end
+ index = index%length+1
+
+ --step3:update the shm cache with the new index
+ roundrobin_cache:set(svckey,index)
+
+ --step4:release the lock
+ local ok, err = rrlock:unlock()
+ ]]
+ return servers[index],nil
+end
+
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/log/logger.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/log/logger.lua
new file mode 100644
index 0000000..6d1e8b5
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/log/logger.lua
@@ -0,0 +1,24 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local cjson = require "cjson"
+
+if ngx.ctx.logtbl then
+ local jsonData = cjson.encode(ngx.ctx.logtbl)
+ ngx.log(ngx.INFO, ngx.var.request_id.." "..string.gsub(jsonData,"\\/","/"))
+end \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/msb.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/msb.lua
new file mode 100644
index 0000000..f791bdb
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/msb.lua
@@ -0,0 +1,90 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+local _M = {
+}
+_M._VERSION = '1.0.0'
+_M._DESCRIPTION = 'msb plugins controller'
+
+local default_conf = require('plugins.config_default')
+local custom_conf = require('plugins.config_custom')
+local table_insert = table.insert
+local string_find = string.find
+local str_low = string.lower
+
+--- Borrowed from Kong
+--- Try to load a module.
+-- Will not throw an error if the module was not found, but will throw an error if the
+-- loading failed for another reason (eg: syntax error).
+-- @param module_name Path of the module to load (ex: kong.plugins.keyauth.api).
+-- @return success A boolean indicating wether the module was found.
+-- @return module The retrieved module.
+local load_module_if_exists = function(module_name)
+ local status, res = pcall(require, module_name)
+ if status then
+ return true, res
+ -- Here we match any character because if a module has a dash '-' in its name, we would need to escape it.
+ elseif type(res) == "string" and string_find(res, "module '"..module_name.."' not found", nil, true) then
+ return false
+ else
+ error(res)
+ end
+end
+
+
+function _M.load_plugins()
+ local pluginnames = {}
+ for _, plugin in ipairs(default_conf.plugins_default) do
+ if(str_low(plugin.status) =="on") then
+ table_insert(pluginnames,plugin.name)
+ end
+ end
+ for _, plugin in ipairs(custom_conf.plugins_custom) do
+ if(str_low(plugin.status) =="on") then
+ table_insert(pluginnames,plugin.name)
+ end
+ end
+ local plugins = {}
+ for _, v in ipairs(pluginnames) do
+ local loaded, plugin_handler_mod = load_module_if_exists("plugins."..v..".handler")
+ if not loaded then
+ error("The following plugin has been enabled in the configuration but it is not installed on the system: "..v)
+ end
+ ngx.log(ngx.DEBUG, "Loading plugin: "..v)
+ table_insert(plugins, {
+ name = v,
+ handler = plugin_handler_mod()
+ })
+ end
+ package.loaded.plugins = plugins
+end
+
+function _M.access()
+ local plugins = package.loaded.plugins
+ for _, plugin in ipairs(plugins) do
+ plugin.handler:access()
+ end
+end
+
+function _M.header_filter()
+ local plugins = package.loaded.plugins
+ for _, plugin in ipairs(plugins) do
+ plugin.handler:header_filter()
+ end
+end
+
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/base_plugin.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/base_plugin.lua
new file mode 100644
index 0000000..5ad9c78
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/base_plugin.lua
@@ -0,0 +1,35 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local Object = require "vendor.classic"
+local BasePlugin = Object:extend()
+
+function BasePlugin:new(name)
+ self._name = name
+ ngx.log(ngx.DEBUG, "executing plugin \""..self._name.."\": new")
+end
+
+function BasePlugin:access()
+ ngx.log(ngx.DEBUG, "executing plugin \""..self._name.."\": access")
+end
+
+function BasePlugin:header_filter()
+ ngx.log(ngx.DEBUG, " executing plugin \""..self._name.."\": header_filter")
+end
+
+return BasePlugin \ No newline at end of file
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/msbconf.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/config_custom.lua
index 48b04c7..bc84ebc 100644
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/msbconf.lua
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/config_custom.lua
@@ -1,12 +1,12 @@
--[[
- Copyright 2016 ZTE Corporation.
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
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
+ 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,
@@ -14,13 +14,14 @@
See the License for the specific language governing permissions and
limitations under the License.
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
+--]]
-]]
local _M = {}
_M._VERSION = '1.0.0'
+_M._DESCRIPTION = 'config_custom'
-return {
- auth_plugin_status = "off"
-} \ No newline at end of file
+_M.plugins_custom = {
+ {["name"] = "sampleplugin",["status"] = "off"}
+}
+
+return _M \ No newline at end of file
diff --git a/msb-core/eag-openresty-ext/src/assembly/resources/openresty/nginx/luaext/msbconf.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/config_default.lua
index dfcfe37..cbb3107 100644
--- a/msb-core/eag-openresty-ext/src/assembly/resources/openresty/nginx/luaext/msbconf.lua
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/config_default.lua
@@ -1,12 +1,12 @@
--[[
- Copyright 2016 ZTE Corporation.
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
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
+ 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,
@@ -14,13 +14,14 @@
See the License for the specific language governing permissions and
limitations under the License.
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
-]]
+--]]
local _M = {}
_M._VERSION = '1.0.0'
+_M._DESCRIPTION = 'config_default'
+
+
+_M.plugins_default = {
+ {["name"] = "redirect-transformer",["status"] = "on"}
+}
-return {
- auth_plugin_status = "on"
-} \ No newline at end of file
+return _M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/redirect-transformer/handler.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/redirect-transformer/handler.lua
new file mode 100644
index 0000000..72e3330
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/redirect-transformer/handler.lua
@@ -0,0 +1,42 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local BasePlugin = require "plugins.base_plugin"
+local msbConf = require('conf.msbinit')
+local log_util = require('lib.utils.log_util')
+local log = log_util.log
+
+local RedirectTransformerPluginHandler = BasePlugin:extend()
+
+function RedirectTransformerPluginHandler:new()
+ RedirectTransformerPluginHandler.super.new(self, "redirect-transformer-plugin")
+end
+
+function RedirectTransformerPluginHandler:header_filter()
+ RedirectTransformerPluginHandler.super.header_filter(self)
+ local originloc = ngx.header.Location
+ if(originloc) then
+ local newloc = ngx.re.sub(originloc, "^(https|http)(.*)", ngx.var.scheme.."$2", "oi")
+ ngx.header["Location"] = newloc
+ log("origin Location:",originloc)
+ log("req scheme:",ngx.var.scheme)
+ log("new Location:",newloc)
+ end
+end
+
+return RedirectTransformerPluginHandler \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/sampleplugin/handler.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/sampleplugin/handler.lua
new file mode 100644
index 0000000..539053a
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/plugins/sampleplugin/handler.lua
@@ -0,0 +1,50 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local BasePlugin = require "plugins.base_plugin"
+
+local SamplePluginHandler = BasePlugin:extend()
+
+function SamplePluginHandler:new()
+ SamplePluginHandler.super.new(self, "sampleplugin")
+end
+
+function SamplePluginHandler:access()
+ SamplePluginHandler.super.access(self)
+ --[[more about the use of APIs please refer to github doc
+ https://github.com/openresty/lua-nginx-module
+ ]]
+ --validate and rewrite
+ if(ngx.req.get_method() == "GET") then
+ ngx.req.set_uri("/sayhello")
+ ngx.var.backend = "127.0.0.1:10089"
+ else
+ ngx.status = ngx.HTTP_NOT_ALLOWED
+ ngx.exit(ngx.status)
+ end
+ --access
+ --[[
+ local client_ip = ngx.var.remote_addr
+ if(client_ip ~= "127.0.0.1") then
+ ngx.status = ngx.HTTP_FORBIDDEN
+ ngx.exit(ngx.status)
+ end
+ ]]
+end
+
+return SamplePluginHandler \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/commonrewrite.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/commonrewrite.lua
new file mode 100644
index 0000000..6bea893
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/commonrewrite.lua
@@ -0,0 +1,138 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local dbclient = require('dao.db_access')
+local tbl_util = require('lib.utils.table_util')
+local svc_util = require('lib.utils.svc_util')
+local log_util = require('lib.utils.log_util')
+local error_handler = require('lib.utils.error_handler')
+
+local tbl_concat = table.concat
+local tbl_isempty = tbl_util.isempty
+local svc_isactive = svc_util.isactive
+local svc_get_url = svc_util.get_url
+local svc_get_backend_protocol = svc_util.get_backend_protocol
+local svc_use_own_upstream = svc_util.use_own_upstream
+local svc_get_key_prefix = svc_util.get_key_prefix
+local svc_is_api_related_types = svc_util.is_api_related_types
+local error_svc_not_found = error_handler.svc_not_found
+local error_upstream_not_found = error_handler.upstream_not_found
+
+local str_sub = string.sub
+local str_len = string.len
+local str_low = string.lower
+local ngx_var = ngx.var
+local ngx_ctx = ngx.ctx
+local log = log_util.log
+
+---------------------------------------------------------------
+--preCheck:
+-- determine whether it is websocket request
+-- and do internal redirect
+---------------------------------------------------------------
+local http_upgrade = ngx_var.http_upgrade
+if(ngx_var.websocket_internal_redirect == "on") and http_upgrade and str_low(http_upgrade) == "websocket" then
+ --ngx.log(ngx.ERR, "Websocket request and redirect to @commonwebsocket")
+ return ngx.exec("@commonwebsocket");
+end
+
+---------------------------------------------------------------
+--step0:Preparation
+-- svc_info_key
+-- svc_server_keypattern
+---------------------------------------------------------------
+local svc_name = ngx_var.svc_name
+local req_res = ngx_var.req_res
+local svc_type = ngx_var.svc_type
+
+local key_prefix = svc_get_key_prefix()
+
+local svc_key = ""
+if(svc_is_api_related_types(svc_type)) then
+ -- process version info first
+ local version1 = ngx_var.svc_version1
+ local version2 = ngx_var.svc_version2
+ local version = ""
+ -- check version info appearing befor or after
+ if(not version2) then version2 = "" end --convert nil to empty sting avoiding throw error
+ if(not version1 or version1 == "") then
+ version = version2
+ else
+ version = version1
+ req_res = version2..req_res
+ end
+ -- remove the slash in front of the version (e.g. /V1.0)
+ local svc_version=str_sub(version,2,str_len(version))
+ svc_key = tbl_concat({key_prefix,"api",svc_name,svc_version},":")
+else
+ svc_key = tbl_concat({key_prefix,"iui",svc_name},":")
+end
+
+---------------------------------------------------------------
+--step1:query the service info from share memory or back db
+-- svcinfo: the requested service information
+---------------------------------------------------------------
+local svcinfo = dbclient.load_serviceinfo(svc_key)
+if tbl_isempty(svcinfo) then
+ error_svc_not_found("No route found for this request!","common not match. key--"..svc_key)
+end
+if not svc_isactive(svcinfo) then
+ error_svc_not_found("Service is disabled!","common not match. key--"..svc_key)
+end
+
+local svc_url = svc_get_url(svcinfo,svc_type)
+
+---------------------------------------------------------------
+--step2:rewrite the request uri using the svcinfo
+---------------------------------------------------------------
+local rewrited_uri = svc_url..req_res
+--special handling: avoid throws internal error when it is empty
+--if (rewrited_uri == "") then rewrited_uri = "/" end
+if (rewrited_uri == "") then return ngx.redirect(ngx.var.uri.."/") end
+ngx.req.set_uri(rewrited_uri)
+
+log("matched",svc_name)
+--log("rewrited_uri",rewrited_uri)
+---------------------------------------------------------------
+--step2.1:store the svcinfo in the context, plugins may use it
+---------------------------------------------------------------
+ngx_ctx.svcinfo = svcinfo
+
+---------------------------------------------------------------
+--step3:process the proxy upstream part
+-- con1-using consul template:set the upstream name
+-- con2-using msb balancer:query the server list and store in the ctx
+---------------------------------------------------------------
+--set the http_protocol used by proxy_pass directive
+ngx_var.http_protocol = svc_get_backend_protocol(svcinfo)
+
+if svc_use_own_upstream(svcinfo) then
+ local consul_servicename = svcinfo.spec["consulServiceName"]
+ if not consul_servicename or consul_servicename == "" then
+ error_upstream_not_found()
+ end
+ ngx_var.backend = consul_servicename
+ ngx.ctx.use_ownupstream = true
+else
+ local backservers = svcinfo.spec.nodes
+ if tbl_isempty(backservers) then
+ error_svc_not_found("No active backend server found!"," key--"..svc_key)
+ end
+ ngx_ctx.backservers = backservers
+ ngx_ctx.svc_key = svc_key
+end \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/customrewrite.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/customrewrite.lua
new file mode 100644
index 0000000..89a829d
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/customrewrite.lua
@@ -0,0 +1,203 @@
+--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ 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.
+
+--]]
+
+local msbConf = require('conf.msbinit')
+local dbclient = require('dao.db_access')
+local tbl_util = require('lib.utils.table_util')
+local svc_util = require('lib.utils.svc_util')
+local log_util = require('lib.utils.log_util')
+local error_handler = require('lib.utils.error_handler')
+
+local tbl_concat = table.concat
+local tbl_isempty = tbl_util.isempty
+local svc_isactive = svc_util.isactive
+local svc_get_url = svc_util.get_url
+local svc_get_backend_protocol = svc_util.get_backend_protocol
+local svc_use_own_upstream = svc_util.use_own_upstream
+local svc_get_key_prefix = svc_util.get_key_prefix
+local str_low = string.lower
+local ngx_var = ngx.var
+local ngx_ctx = ngx.ctx
+local log = log_util.log
+local error_svc_not_found = error_handler.svc_not_found
+local error_upstream_not_found = error_handler.upstream_not_found
+
+local enablerefercheck = msbConf.systemConf.enablerefercheck
+local useconsultemplate = msbConf.systemConf.useconsultemplate
+
+---------------------------------------------------------------
+--preCheck:
+-- determine whether it is websocket request
+-- and do internal redirect
+---------------------------------------------------------------
+if ngx.var.uri == "/" then
+ local m, err = ngx.re.match(ngx.var.host, "^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$","o")
+ if m then
+ return ngx.exec("@defaultpage")
+ end
+end
+
+local http_upgrade = ngx_var.http_upgrade
+if(ngx_var.websocket_internal_redirect == "on") and http_upgrade and str_low(http_upgrade)== "websocket" then
+ --ngx.log(ngx.ERR, "Websocket request and redirect to @customwebsocket")
+ return ngx.exec("@customwebsocket")
+end
+
+---------------------------------------------------------------
+--step0:Preparation
+-- svcnames:service names registered under this port
+---------------------------------------------------------------
+local req_res = ngx_var.uri
+local svc_type = ngx_var.svc_type
+local key_prefix = svc_get_key_prefix()
+
+local custom_svc_keypattern = tbl_concat({key_prefix,"custom","*"},":")
+
+local get_svckey_custom = function(svcname)
+ return tbl_concat({key_prefix,"custom",svcname},":")
+end
+
+local svcnames,err = dbclient.load_customsvcnames(custom_svc_keypattern)
+if not svcnames then
+ error_svc_not_found("Failed to load the route table!","keypattern--"..custom_svc_keypattern)
+end
+
+---------------------------------------------------------------
+--step1:run the match process(check whether the request
+-- match the name in the svcnames one by one)
+-- and return the matched serice info
+---------------------------------------------------------------
+local matchedsvcname
+local svcinfo
+local svc_key = ""
+--add by wangyg:20160418 special handler for refer
+local matched_usingrefer = false
+--end of add by wangyg:20160418 special handler for refer
+for _, svcname in ipairs(svcnames) do
+ if (svcname == "/") then
+ svc_key = get_svckey_custom(svcname)
+ local svc_info,err = dbclient.load_serviceinfo(svc_key)
+ if svc_info and svc_isactive(svc_info)then
+ matchedsvcname = svcname
+ svcinfo = svc_info
+ break
+ end
+ end
+ local from, to, err = ngx.re.find(req_res, "^"..svcname.."(/(.*))?$", "jo")
+ --check whether svcname is the prefix of the req uri
+ if from then
+ svc_key = get_svckey_custom(svcname)
+ local svc_info,err = dbclient.load_serviceinfo(svc_key)
+ if svc_info and svc_isactive(svc_info) then
+ matchedsvcname = svcname
+ svcinfo = svc_info
+ break
+ end
+ else
+ --do nothing
+ end
+end
+---------------------------------------------------------------
+--step1.1:additional process,test against the refer
+-- similar to step1
+---------------------------------------------------------------
+--add by wangyg:20160418 special handler for refer
+if not matchedsvcname and enablerefercheck then
+ local refer = ngx_var.http_referer
+ if(refer and refer~="") then
+ for _, svcname in ipairs(svcnames) do
+ local urlreg ="^(https://|http://|)(([1-9]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5])))\\.)(([0-9]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5])))\\.){2}([1-9]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5])))(:\\d{1,5})?"..svcname.."(/(.*))?$";
+ local from, to, err = ngx.re.find(refer, urlreg, "jo")
+ ----check whether svcname is the prefix of the req refer
+ if from then
+ svc_key = get_svckey_custom(svcname)
+ local svc_info,err = dbclient.load_serviceinfo(svc_key)
+ if svc_info and svc_isactive(svc_info) then
+ matchedsvcname = svcname
+ svcinfo = svc_info
+ matched_usingrefer = true
+ break
+ end
+ end
+ end
+ end
+end
+--end of add by wangyg:20160418 special handler for refer
+
+if not matchedsvcname or tbl_isempty(svcinfo) then
+ error_svc_not_found("No route found for this request!","custom not match")
+end
+
+local svc_url = svc_get_url(svcinfo,svc_type)
+
+---------------------------------------------------------------
+--step2:rewrite the request uri using the svcinfo
+---------------------------------------------------------------
+local rewrited_uri =""
+if (matchedsvcname == "/") then
+ --special handling: if "/" matched, contact directly
+ rewrited_uri = svc_url..req_res
+else
+ --rewrited_uri = ngx.re.sub(req_res, "^"..matchedsvcname.."(.*)", svc_url.."$1", "o")
+ local newuri,n,err = ngx.re.sub(req_res, "^"..matchedsvcname.."(/.*)?", svc_url.."$1", "o")
+ --add by wangyg:20160418 special handler for refer
+ if(n==0 and matched_usingrefer) then newuri = svc_url..req_res end --special handling if matched using refer
+ --end of add by wangyg:20160418 special handler for refer
+ rewrited_uri = newuri
+end
+--if (rewrited_uri == "") then rewrited_uri = "/" end --avoid throws internal error when it is empty
+if (rewrited_uri == "") then return ngx.redirect(ngx.var.uri.."/") end
+ngx.req.set_uri(rewrited_uri)
+
+--set the matched service info,used in the proxy_redirect directive
+ngx_var.svc_name = matchedsvcname
+ngx_var.svc_url = svc_url
+
+--log the route info
+log("matched",matchedsvcname)
+if(matched_usingrefer) then log("matched_usingrefer",true) end
+--log("rewrited_uri",rewrited_uri)
+
+---------------------------------------------------------------
+--step2.1:store the svcinfo in the context, plugins may use it
+---------------------------------------------------------------
+ngx_ctx.svcinfo = svcinfo
+
+---------------------------------------------------------------
+--step3:process the proxy upstream part
+-- con1-using consul template:set the upstream name
+-- con2-using msb balancer:query the backserver list and store in the ctx
+---------------------------------------------------------------
+--set the http_protocol used by proxy_pass directive
+ngx_var.http_protocol = svc_get_backend_protocol(svcinfo)
+
+if svc_use_own_upstream(svcinfo) then
+ local consul_servicename = svcinfo.spec["consulServiceName"]
+ if not consul_servicename or consul_servicename == "" then
+ error_upstream_not_found()
+ end
+ ngx_var.backend = consul_servicename
+ ngx.ctx.use_ownupstream = true
+else
+ local backservers = svcinfo.spec.nodes
+ if tbl_isempty(backservers) then
+ error_svc_not_found("No active backend server found!","key--"..svc_key)
+ end
+ ngx_ctx.backservers = backservers
+ ngx_ctx.svc_key = svc_key
+end \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/vendor/classic.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/vendor/classic.lua
new file mode 100644
index 0000000..d9402f9
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/vendor/classic.lua
@@ -0,0 +1,68 @@
+--
+-- classic, object model.
+--
+-- Copyright (c) 2014, rxi
+--
+-- This module is free software; you can redistribute it and/or modify it under
+-- the terms of the MIT license. See LICENSE for details.
+--
+-- Base object model used with Kong, see [classic github repo](https://github.com/rxi/classic) for usage information
+
+local Object = {}
+Object.__index = Object
+
+
+function Object:new()
+end
+
+
+function Object:extend()
+ local cls = {}
+ for k, v in pairs(self) do
+ if k:find("__") == 1 then
+ cls[k] = v
+ end
+ end
+ cls.__index = cls
+ cls.super = self
+ setmetatable(cls, self)
+ return cls
+end
+
+
+function Object:implement(...)
+ for _, cls in pairs({...}) do
+ for k, v in pairs(cls) do
+ if self[k] == nil and type(v) == "function" then
+ self[k] = v
+ end
+ end
+ end
+end
+
+
+function Object:is(T)
+ local mt = getmetatable(self)
+ while mt do
+ if mt == T then
+ return true
+ end
+ mt = getmetatable(mt)
+ end
+ return false
+end
+
+
+function Object:__tostring()
+ return "Object"
+end
+
+
+function Object:__call(...)
+ local obj = setmetatable({}, self)
+ obj:new(...)
+ return obj
+end
+
+
+return Object
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/vendor/shcache.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/vendor/shcache.lua
new file mode 100644
index 0000000..32a9b6c
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/vendor/shcache.lua
@@ -0,0 +1,440 @@
+-- Copyright (C) 2013 Matthieu Tourne
+-- @author Matthieu Tourne <matthieu@cloudflare.com>
+
+-- small overlay over shdict, smart cache load mechanism
+
+local M = {}
+
+local resty_lock = require("resty.lock")
+
+local DEBUG = false
+
+-- defaults in secs
+local DEFAULT_POSITIVE_TTL = 10 -- cache for, successful lookup
+local DEFAULT_NEGATIVE_TTL = 2 -- cache for, failed lookup
+local DEFAULT_ACTUALIZE_TTL = 2 -- stale data, actualize data for
+
+-- default lock options, in secs
+local function _get_default_lock_options()
+ return {
+ exptime = 1, -- max wait if failing to call unlock()
+ timeout = 0.5, -- max waiting time of lock()
+ max_step = 0.1, -- max sleeping interval
+ }
+end
+
+local function prequire(m)
+ local ok, err_or_module = pcall(require, m)
+ if not ok then
+ return nil, err_or_module
+ end
+ return err_or_module
+end
+
+local conf = prequire("conf")
+if conf then
+ DEFAULT_NEGATIVE_TTL = conf.DEFAULT_NEGATIVE_TTL or DEFAULT_NEGATIVE_TTL
+ DEFAULT_ACTUALIZE_TTL = conf.DEFAULT_ACTUALIZE_TTL or DEFAULT_ACTUALIZE_TTL
+end
+
+local band = bit.band
+local bor = bit.bor
+local st_format = string.format
+
+-- there are only really 5 states total
+ -- is_stale is_neg is_from_cache
+local MISS_STATE = 0 -- 0 0 0
+local HIT_POSITIVE_STATE = 1 -- 0 0 1
+local HIT_NEGATIVE_STATE = 3 -- 0 1 1
+local STALE_POSITIVE_STATE = 5 -- 1 0 1
+
+-- stale negative doesn't really make sense, use HIT_NEGATIVE instead
+-- local STALE_NEGATIVE_STATE = 7 -- 1 1 1
+
+-- xor to set
+local NEGATIVE_FLAG = 2
+local STALE_FLAG = 4
+
+local STATES = {
+ [MISS_STATE] = 'MISS',
+ [HIT_POSITIVE_STATE] = 'HIT',
+ [HIT_NEGATIVE_STATE] = 'HIT_NEGATIVE',
+ [STALE_POSITIVE_STATE] = 'STALE',
+ -- [STALE_NEGATIVE_STATE] = 'STALE_NEGATIVE',
+}
+
+local function get_status(flags)
+ return STATES[flags] or st_format('UNDEF (0x%x)', flags)
+end
+
+local EMPTY_DATA = '_EMPTY_'
+
+-- install debug functions
+if DEBUG then
+ local resty_lock_lock = resty_lock.lock
+
+ resty_lock.lock = function (...)
+ local _, key = unpack({...})
+ print("lock key: ", tostring(key))
+ return resty_lock_lock(...)
+ end
+
+ local resty_lock_unlock = resty_lock.unlock
+
+ resty_lock.unlock = function (...)
+ print("unlock")
+ return resty_lock_unlock(...)
+ end
+end
+
+
+-- store the object in the context
+-- useful for debugging and tracking cache status
+local function _store_object(self, name)
+ if DEBUG then
+ print('storing shcache: ', name, ' into ngx.ctx')
+ end
+
+ local ngx_ctx = ngx.ctx
+
+ if not ngx_ctx.shcache then
+ ngx_ctx.shcache = {}
+ end
+ ngx_ctx.shcache[name] = self
+end
+
+local obj_mt = {
+ __index = M,
+}
+
+-- default function for callbacks.encode / decode.
+local function _identity(data)
+ return data
+end
+
+-- shdict: ngx.shared.DICT, created by the lua_shared_dict directive
+-- callbacks: see shcache state machine for user defined functions
+-- * callbacks.external_lookup is required
+-- * callbacks.encode : optional encoding before saving to shmem
+-- * callbacks.decode : optional decoding when retreiving from shmem
+-- opts:
+-- * opts.positive_ttl : save a valid external loookup for, in seconds
+-- * opts.positive_ttl : save a invalid loookup for, in seconds
+-- * opts.actualize_ttl : re-actualize a stale record for, in seconds
+-- * opts.lock_options : set option to lock see : http://github.com/agentzh/lua-resty-lock
+-- for more details.
+-- * opts.locks_shdict : specificy the name of the shdict containing the locks
+-- (useful if you might have locks key collisions)
+-- uses "locks" by default.
+-- * opts.name : if shcache object is named, it will automatically
+-- register itself in ngx.ctx.shcache (useful for logging).
+local function new(self, shdict, callbacks, opts)
+ if not shdict then
+ return nil, "shdict does not exist"
+ end
+
+ -- check that callbacks.external_lookup is set
+ if not callbacks or not callbacks.external_lookup then
+ return nil, "no external_lookup function defined"
+ end
+
+ if not callbacks.encode then
+ callbacks.encode = _identity
+ end
+
+ if not callbacks.decode then
+ callbacks.decode = _identity
+ end
+
+ local opts = opts or {}
+
+ -- merge default lock options with the ones passed to new()
+ local lock_options = _get_default_lock_options()
+ if opts.lock_options then
+ for k, v in pairs(opts.lock_options) do
+ lock_options[k] = v
+ end
+ end
+
+ local name = opts.name
+
+ local obj = {
+ shdict = shdict,
+ callbacks = callbacks,
+
+ positive_ttl = opts.positive_ttl or DEFAULT_POSITIVE_TTL,
+ negative_ttl = opts.negative_ttl or DEFAULT_NEGATIVE_TTL,
+
+ -- ttl to actualize stale data to
+ actualize_ttl = opts.actualize_ttl or DEFAULT_ACTUALIZE_TTL,
+
+ lock_options = lock_options,
+
+ locks_shdict = opts.lock_shdict or "locks",
+
+ -- STATUS --
+
+ from_cache = false,
+ cache_status = 'UNDEF',
+ cache_state = MISS_STATE,
+ lock_status = 'NO_LOCK',
+
+ -- shdict:set() pushed out another value
+ forcible_set = false,
+
+ -- cache hit on second attempt (post lock)
+ hit2 = false,
+
+ name = name,
+ }
+
+ local locks = ngx.shared[obj.locks_shdict]
+
+ -- check for existence, locks is not directly used
+ if not locks then
+ ngx.log(ngx.CRIT, 'shared mem locks is missing.\n',
+ '## add to you lua conf: lua_shared_dict locks 5M; ##')
+ return nil
+ end
+
+ local self = setmetatable(obj, obj_mt)
+
+ -- if the shcache object is named
+ -- keep track of the object in the context
+ -- (useful for gathering stats at log phase)
+ if name then
+ _store_object(self, name)
+ end
+
+ return self
+end
+M.new = new
+
+-- acquire a lock
+local function _get_lock(self)
+ local lock = self.lock
+ if not lock then
+ lock = resty_lock:new(self.locks_shdict, self.lock_options)
+ self.lock = lock
+ end
+ return lock
+end
+
+-- remove the lock if there is any
+local function _unlock(self)
+ local lock = self.lock
+ if lock then
+ local ok, err = lock:unlock()
+ if not ok then
+ ngx.log(ngx.ERR, "failed to unlock :" , err)
+ end
+ self.lock = nil
+ end
+end
+
+local function _return(self, data, flags)
+ -- make sure we remove the locks if any before returning data
+ _unlock(self)
+
+ -- set cache status
+ local cache_status = get_status(self.cache_state)
+
+ if cache_status == 'MISS' and not data then
+ cache_status = 'NO_DATA'
+ end
+
+ self.cache_status = cache_status
+
+ return data, self.from_cache
+end
+
+local function _set(self, ...)
+ if DEBUG then
+ local key, data, ttl, flags = unpack({...})
+ print("saving key: ", key, ", for: ", ttl)
+ end
+
+ local ok, err, forcible = self.shdict:set(...)
+
+ self.forcible_set = forcible
+
+ if not ok then
+ local key, data, ttl, flags = unpack({...})
+ ngx.log(ngx.ERR, 'failed to set key: ', key, ', err: ', err)
+ end
+
+ return ok
+end
+
+-- check if the data returned by :get() is considered empty
+local function _is_empty(data, flags)
+ return flags and band(flags, NEGATIVE_FLAG) and data == EMPTY_DATA
+end
+
+-- save positive, encode the data if needed before :set()
+local function _save_positive(self, key, data)
+ if DEBUG then
+ print("key: ", key, ". save positive, ttl: ", self.positive_ttl)
+ end
+ data = self.callbacks.encode(data)
+ return _set(self, key, data, self.positive_ttl, HIT_POSITIVE_STATE)
+end
+
+-- save negative, no encoding required (no data actually saved)
+local function _save_negative(self, key)
+ if DEBUG then
+ print("key: ", key, ". save negative, ttl: ", self.negative_ttl)
+ end
+ return _set(self, key, EMPTY_DATA, self.negative_ttl, HIT_NEGATIVE_STATE)
+end
+
+-- save actualize, will boost a stale record to a live one
+local function _save_actualize(self, key, data, flags)
+ local new_flags = bor(flags, STALE_FLAG)
+
+ if DEBUG then
+ print("key: ", key, ". save actualize, ttl: ", self.actualize_ttl,
+ ". new state: ", get_status(new_flags))
+ end
+
+ _set(self, key, data, self.actualize_ttl, new_flags)
+ return new_flags
+end
+
+local function _process_cached_data(self, data, flags)
+ if DEBUG then
+ print("data: ", data, st_format(", flags: %x", flags))
+ end
+
+ self.cache_state = flags
+ self.from_cache = true
+
+ if _is_empty(data, flags) then
+ -- empty cached data
+ return nil
+ else
+ return self.callbacks.decode(data)
+ end
+end
+
+-- wrapper to get data from the shdict
+local function _get(self, key)
+ -- always call get_stale() as it does not free element
+ -- like get does on each call
+ local data, flags, stale = self.shdict:get_stale(key)
+
+ if data and stale then
+ if DEBUG then
+ print("found stale data for key : ", key)
+ end
+
+ self.stale_data = { data, flags }
+
+ return nil, nil
+ end
+
+ return data, flags
+end
+
+local function _get_stale(self)
+ local stale_data = self.stale_data
+ if stale_data then
+ return unpack(stale_data)
+ end
+
+ return nil, nil
+end
+
+local function load(self, key)
+ -- start: check for existing cache
+ local data, flags = _get(self, key)
+
+ -- hit: process_cache_hit
+ if data then
+ data = _process_cached_data(self, data, flags)
+ return _return(self, data)
+ end
+
+ -- miss: set lock
+
+ -- lock: set a lock before performing external lookup
+ local lock = _get_lock(self)
+ local elapsed, err = lock:lock(key)
+
+ if not elapsed then
+ -- failed to acquire lock, still proceed normally to external_lookup
+ -- unlock() might fail.
+ ngx.log(ngx.ERR, "failed to acquire the lock: ", err)
+ self.lock_status = 'ERROR'
+ -- _unlock won't try to unlock() without a valid lock
+ self.lock = nil
+ else
+ -- lock acquired successfuly
+
+ if elapsed > 0 then
+
+ -- elapsed > 0 => waited lock (other thread might have :set() the data)
+ -- (more likely to get a HIT on cache_load 2)
+ self.lock_status = 'WAITED'
+
+ else
+
+ -- elapsed == 0 => immediate lock
+ -- it is less likely to get a HIT on cache_load 2
+ -- but still perform it (race condition cases)
+ self.lock_status = 'IMMEDIATE'
+ end
+
+ -- perform cache_load 2
+ data, flags = _get(self, key)
+ if data then
+ -- hit2 : process cache hit
+
+ self.hit2 = true
+
+ -- unlock before de-serializing cached data
+ _unlock(self)
+ data = _process_cached_data(self, data, flags)
+ return _return(self, data)
+ end
+
+ -- continue to external lookup
+ end
+
+ -- perform external lookup
+ data, err = self.callbacks.external_lookup()
+
+ if data then
+ -- succ: save positive and return the data
+
+ _save_positive(self, key, data)
+ return _return(self, data)
+ else
+ ngx.log(ngx.WARN, 'external lookup failed: ', err)
+ end
+
+ -- external lookup failed
+ -- attempt to load stale data
+ data, flags = _get_stale(self)
+ if data and not _is_empty(data, flags) then
+ -- hit_stale + valid (positive) data
+
+ flags = _save_actualize(self, key, data, flags)
+ -- unlock before de-serializing data
+ _unlock(self)
+ data = _process_cached_data(self, data, flags)
+ return _return(self, data)
+ end
+
+ if DEBUG and data then
+ -- there is data, but it failed _is_empty() => stale negative data
+ print('STALE_NEGATIVE data => cache as a new HIT_NEGATIVE')
+ end
+
+ -- nothing has worked, save negative and return empty
+ _save_negative(self, key)
+ return _return(self, nil)
+end
+M.load = load
+
+return M \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-default/msblocations.conf b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-default/msblocations.conf
new file mode 100644
index 0000000..745c290
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-default/msblocations.conf
@@ -0,0 +1,218 @@
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+
+ default_type text/html;
+
+ # the flag identify whether to check doing internal redirect or not
+ set $websocket_internal_redirect "on";
+ set $http_protocol "http";
+
+
+ location = /iui/microservices {
+ try_files $uri @addslash;
+ }
+
+ location @addslash {
+ return 302 $scheme://$http_host$uri/;
+ }
+
+ #error_page 410 = @commonnotfound;
+
+ location @commonnotfound {
+ set $svc_type "custom";
+ set $svc_name "";
+ set $svc_url "";
+ set $backend "defaultbackend";
+
+ #rewrite by the lua file
+ rewrite_by_lua_file luaext/rewrite/customrewrite.lua;
+ access_by_lua_block {
+ msb.access()
+ }
+ header_filter_by_lua_block {
+ msb.header_filter()
+ }
+ #log by the lua file
+ log_by_lua_file luaext/log/logger.lua;
+
+ proxy_pass $http_protocol://$backend;
+ proxy_redirect $http_protocol://$host:$server_port$svc_url $http_protocol://$host:$server_port$svc_name;
+ }
+
+ location @customwebsocket {
+ set $websocket_internal_redirect "off";
+ #set header for websocket
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "Upgrade";
+
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $host:$server_port;
+
+ #rewrite by the lua file
+ rewrite_by_lua_file luaext/rewrite/customrewrite.lua;
+ access_by_lua_block {
+ msb.access()
+ }
+ header_filter_by_lua_block {
+ msb.header_filter()
+ }
+ #log by the lua file
+ log_by_lua_file luaext/log/logger.lua;
+
+ proxy_pass $http_protocol://$backend;
+ }
+
+ location @commonwebsocket {
+ set $websocket_internal_redirect "off";
+ #set header for websocket
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "Upgrade";
+
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header Host $host:$server_port;
+
+ #rewrite by the lua file
+ rewrite_by_lua_file luaext/rewrite/commonrewrite.lua;
+ access_by_lua_block {
+ msb.access()
+ }
+ header_filter_by_lua_block {
+ msb.header_filter()
+ }
+ #log by the lua file
+ log_by_lua_file luaext/log/logger.lua;
+
+ proxy_pass $http_protocol://$backend;
+ }
+
+ location / {
+ set $svc_type "custom";
+ set $svc_name "";
+ set $svc_url "";
+ set $backend "defaultbackend";
+
+ #rewrite by the lua file
+ rewrite_by_lua_file luaext/rewrite/customrewrite.lua;
+ access_by_lua_block {
+ msb.access()
+ }
+ header_filter_by_lua_block {
+ msb.header_filter()
+ }
+ #log by the lua file
+ log_by_lua_file luaext/log/logger.lua;
+
+ proxy_pass $http_protocol://$backend;
+ proxy_redirect $http_protocol://$host:$server_port$svc_url $http_protocol://$host:$server_port$svc_name;
+ }
+
+ location ~ ^/(api|admin|apijson)(/[Vv]\d+(?:\.\d+)*)?/([^/]+)(/[Vv]\d+(?:\.\d+)*)?(.*) {
+ set $svc_type $1;
+ set $svc_name $3;
+ set $svc_version1 $2;
+ set $svc_version2 $4;
+ set $req_res $5;
+ set $backend "defaultbackend";
+
+ #rewrite by the lua file
+ rewrite_by_lua_file luaext/rewrite/commonrewrite.lua;
+ access_by_lua_block {
+ msb.access()
+ }
+ header_filter_by_lua_block {
+ msb.header_filter()
+ }
+ #log by the lua file
+ log_by_lua_file luaext/log/logger.lua;
+
+ proxy_pass $http_protocol://$backend;
+ }
+
+ location ~* ^/iui/([^/]+)(.*)\.(png|jpg|jpeg|gif|ico|bmp|woff)$ {
+ set $svc_type "iui";
+ set $svc_name $1;
+ set $req_res $2.$3;
+ set $backend "defaultbackend";
+
+ #rewrite by the lua file
+ rewrite_by_lua_file luaext/rewrite/commonrewrite.lua;
+ access_by_lua_block {
+ msb.access()
+ }
+ header_filter_by_lua_block {
+ msb.header_filter()
+ }
+ #log by the lua file
+ log_by_lua_file luaext/log/logger.lua;
+
+ proxy_cache nginx_cache;
+ add_header X-Cache-Status $upstream_cache_status;
+ proxy_pass $http_protocol://$backend;
+ }
+
+ location ~ ^/iui/([^/]+)(.*) {
+ set $svc_type "iui";
+ set $svc_name $1;
+ set $req_res $2;
+ set $backend "defaultbackend";
+
+ #rewrite by the lua file
+ rewrite_by_lua_file luaext/rewrite/commonrewrite.lua;
+ access_by_lua_block {
+ msb.access()
+ }
+ header_filter_by_lua_block {
+ msb.header_filter()
+ }
+ #log by the lua file
+ log_by_lua_file luaext/log/logger.lua;
+
+ proxy_pass $http_protocol://$backend;
+ }
+
+ include ../msb-enabled/location-ext/*.conf;
+ include ../msb-enabled/location-ext-mount/*.conf;
+
+ location ~* \.(?:png|jpg|jpeg|gif|ico|bmp|woff)$ {
+ set $svc_type "custom";
+ set $svc_name "";
+ set $svc_url "";
+ set $backend "defaultbackend";
+
+ #rewrite by the lua file
+ rewrite_by_lua_file luaext/rewrite/customrewrite.lua;
+ access_by_lua_block {
+ msb.access()
+ }
+ header_filter_by_lua_block {
+ msb.header_filter()
+ }
+ #log by the lua file
+ log_by_lua_file luaext/log/logger.lua;
+
+ proxy_cache nginx_cache;
+ add_header X-Cache-Status $upstream_cache_status;
+ proxy_pass $http_protocol://$backend;
+ proxy_redirect http://$host:$server_port$svc_url http://$host:$server_port$svc_name;
+ }
+
+ location = /favicon.ico {
+ log_not_found off;
+ } \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext-mount/README.md b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext-mount/README.md
new file mode 100644
index 0000000..ce00b06
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext-mount/README.md
@@ -0,0 +1,4 @@
+README
+===============
+Similar to the location-ext directory,but it's just a placeholder folder.
+The folder may always be empty and you attach an external folder found outside the container or the virtual machine at the directory. \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/README.md b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/README.md
new file mode 100644
index 0000000..58310a7
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/README.md
@@ -0,0 +1,11 @@
+README
+===============
+
+The directory to store configuration files that extends locations of the default listening server(e.g 10080).
+The config file must be a *.conf file. For example:
+#testlocation.conf
+~~~
+location = /test {
+ echo "test ok";
+}
+~~~ \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/cert.conf b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/cert.conf
new file mode 100644
index 0000000..3d84943
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/cert.conf
@@ -0,0 +1,19 @@
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+
+location /cert {
+ root html ;
+} \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/defaultpage.conf b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/defaultpage.conf
new file mode 100644
index 0000000..edd9ed9
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/defaultpage.conf
@@ -0,0 +1,9 @@
+location @defaultpage {
+ content_by_lua_block{
+ local error_page_head = '<html><head><title>502 Bad Gateway</title></head><body bgcolor="white"><center><h1>502 Bad Gateway</h1></center><center>error message:'
+ local error_page_foot = '</center><hr><center>nginx</center></body></html>'
+ ngx.status = ngx.HTTP_BAD_GATEWAY
+ ngx.print(error_page_head.."default homepage undefined"..error_page_foot)
+ return ngx.exit(ngx.status)
+ }
+} \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/homepage.conf b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/homepage.conf
new file mode 100644
index 0000000..543691a
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/homepage.conf
@@ -0,0 +1,20 @@
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+
+location = /msb {
+ #rewrite ^ /iui/microservices/default.html redirect;
+ return 302 $scheme://$http_host/iui/microservices/default.html;
+} \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/msb.conf b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/msb.conf
new file mode 100644
index 0000000..8e854bb
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/msb.conf
@@ -0,0 +1,67 @@
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+
+#the maximum allowed size of the client request body,current 10G
+client_max_body_size 10240m;
+client_body_buffer_size 128k;
+
+#set conf for proxy pass
+proxy_connect_timeout 5s;
+proxy_read_timeout 1200s;
+proxy_send_timeout 1200s;
+proxy_set_header X-Real-IP $remote_addr;
+proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+proxy_set_header Host $host:$server_port;
+proxy_buffers 4 16k;
+proxy_http_version 1.1;
+proxy_set_header Connection "";
+
+#set the nginx_cache parameter
+proxy_cache_path temp/proxy_cache levels=1:2 keys_zone=nginx_cache:100m inactive=1d max_size=1g;
+proxy_cache_key $host$uri$is_args$args;
+proxy_cache_revalidate on;
+proxy_cache_min_uses 3;
+proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
+proxy_cache_lock on;
+
+proxy_next_upstream error timeout;
+proxy_next_upstream_tries 5;
+
+# Lua settings
+lua_package_path "$prefix/../lualib/?.lua;$prefix/luaext/?.lua;;";
+lua_package_cpath "$prefix/../lualib/?.so;;";
+#lua_shared_dict rr_cache 1M;
+#lua_shared_dict rr_locks 100k;
+
+lua_shared_dict svc_cache 5M;
+lua_shared_dict locks 200k;
+
+lua_code_cache on;
+
+# Basic reverse proxy server processor
+upstream defaultbackend {
+ server 0.0.0.1;
+ balancer_by_lua_file luaext/loadbalance/balancer.lua;
+ keepalive 300;
+}
+init_by_lua_block {
+ msb = require('msb')
+ msb.load_plugins()
+}
+server {
+ listen 80;
+ include ../msb-enabled/location-default/msblocations.conf;
+} \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/msbhttps.conf b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/msbhttps.conf
new file mode 100644
index 0000000..430c05d
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/msbhttps.conf
@@ -0,0 +1,22 @@
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+server {
+ listen 443 ssl;
+ ssl_certificate ../ssl/cert/cert.crt;
+ ssl_certificate_key ../ssl/cert/cert.key;
+ ssl_dhparam ../ssl/dh-pubkey/dhparams.pem;
+ include ../msb-enabled/location-default/msblocations.conf;
+} \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled-mount/README.md b/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled-mount/README.md
new file mode 100644
index 0000000..6b443bc
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled-mount/README.md
@@ -0,0 +1,4 @@
+README
+===============
+Similar to the sites-enabled directory,but it's just a placeholder folder.
+The folder may always be empty and you attach an external folder found outside the container or the virtual machine at the directory. \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/README.md b/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/README.md
new file mode 100644
index 0000000..d57d687
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/README.md
@@ -0,0 +1,15 @@
+README
+===============
+
+The directory to store configuration files that configs another server except the default listening server(e.g 10080).
+The config file must be a *.conf file. For example:
+#server1.conf
+~~~
+server {
+ listen 20080;
+
+ location =/info {
+ echo "another server 20080";
+ }
+}
+~~~ \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/addPortTemplate b/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/addPortTemplate
new file mode 100644
index 0000000..b21cefa
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/addPortTemplate
@@ -0,0 +1,21 @@
+#
+# Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+server {
+ listen 10090 ssl;
+ ssl_certificate ../ssl/cert.crt;
+ ssl_certificate_key ../ssl/cert.key;
+ include ../msb-enabled/location-default/msblocations.conf;
+} \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/sampleplugin b/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/sampleplugin
new file mode 100644
index 0000000..956bfa4
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/sampleplugin
@@ -0,0 +1,41 @@
+#
+# Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+server {
+ listen 10088;
+ default_type text/html;
+
+ location = /sampleplugin {
+ set $backend "";
+ access_by_lua_block {
+ msb.access()
+ }
+ proxy_pass http://$backend;
+ }
+}
+server {
+ listen 10089;
+ default_type text/html;
+
+ location = /sayhello {
+ content_by_lua_block {
+ local username = ngx.var.arg_name
+ if(not username) then
+ username = "stranger"
+ end
+ ngx.say("Hello "..username.."!")
+ }
+ }
+} \ No newline at end of file
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/ssl/cert/cert.crt b/openresty-ext/src/assembly/resources/openresty/nginx/ssl/cert/cert.crt
new file mode 100644
index 0000000..e82e66b
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/ssl/cert/cert.crt
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDgzCCAmsCCQD9YEV2Kl0P0zANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMC
+Q04xETAPBgNVBAgMCHNpY2h1YW5nMRAwDgYDVQQHDAdjaGVuZ2R1MQwwCgYDVQQK
+DAN6dGUxDjAMBgNVBAsMBXplbmFwMTgwNgYDVQQDDC9aVEUgT3BlblBhbGV0dGUg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxNzAeFw0xNzAzMTcwMjA4MTRa
+Fw0yNzAzMTUwMjA4MTRaMHwxCzAJBgNVBAYTAkNOMREwDwYDVQQIDAhzaWNodWFu
+ZzEQMA4GA1UEBwwHY2hlbmdkdTEMMAoGA1UECgwDenRlMQ4wDAYDVQQLDAV6ZW5h
+cDEVMBMGA1UEAwwMKi56dGUuY29tLmNuMRMwEQYJKoZIhvcNAQkBFgRudWxsMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxrViVMgvwA9yYBJvGsPtD0GF
+Yv0fCL4Uo7gewitKImP8D8UtV7eRXZrEDtvnB2/jg/SpCeHelzR2OWdnjsWCWLeW
+ERnff6Pm+tccKMQUqJllV477L+n45xlUw2Iv4w8k1M2AyQ+hqWOz9Tp+fp8XICAw
+wiqqKDEclo2/Psgf5SmptZbNmjv4moKUGLy3lkgOTXz/dw9BZcid77cyhhQt0RrI
+BLz/jBigkA0fWSeZIb4nTt/24JeeKLPjMUWeAwYebiS4pckICXkTpLl8/Owsqq3B
+tuf2Qk3Jag0UO5zvNbl09+o9VyQcdDwPHSrbXXVSCvOsFkxbVEqZzAH7VheKnwID
+AQABMA0GCSqGSIb3DQEBCwUAA4IBAQA7lw0gXfP+kfcU9cKkNmg5CtoKV2T7Xpnt
+jw1Tn0YuzxR3xQmFsfcXGCD5S540uQiwINZgk+NE2qzTJylShPnjUW6DvHnzdayy
+oKJmlKasZ8NCpv9lHAu+eggAMCbV1MH1mZVJqiED0gaenQAFGRAjyL7507CW9iCX
+jBEEWOITpBQXQAC8TsOTQB1cHqIHFOi0rmSoDKlnGXjmofD1u3r5PChLaz4PkvGu
+6CSYkOojbNYUcL4ghbFgY+dsDReN9v7nF8TQa2Vgx5cBYqqYHlBXfT1p9PP581Q8
+nWiSumRfQCwZzXdr7iUEKM3521GYKHLXfbs/aRtWAnd1ziHBpCuf
+-----END CERTIFICATE-----
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/ssl/cert/cert.key b/openresty-ext/src/assembly/resources/openresty/nginx/ssl/cert/cert.key
new file mode 100644
index 0000000..5ad935f
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/ssl/cert/cert.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAxrViVMgvwA9yYBJvGsPtD0GFYv0fCL4Uo7gewitKImP8D8Ut
+V7eRXZrEDtvnB2/jg/SpCeHelzR2OWdnjsWCWLeWERnff6Pm+tccKMQUqJllV477
+L+n45xlUw2Iv4w8k1M2AyQ+hqWOz9Tp+fp8XICAwwiqqKDEclo2/Psgf5SmptZbN
+mjv4moKUGLy3lkgOTXz/dw9BZcid77cyhhQt0RrIBLz/jBigkA0fWSeZIb4nTt/2
+4JeeKLPjMUWeAwYebiS4pckICXkTpLl8/Owsqq3Btuf2Qk3Jag0UO5zvNbl09+o9
+VyQcdDwPHSrbXXVSCvOsFkxbVEqZzAH7VheKnwIDAQABAoIBAAFcgsTz7ifRs0Xn
+Om2jg/9Dwqcv9sN3keqhO0y3QTXFG5f8ENh2AH/0rH0xkn6hjJx9056mtoCwslKo
+W7RFtCPpdhS96aMVO2LikGXTGhUhn+keqKfmYXcr3EHObWeP1f/DPKuj+MaRUU1P
+zkgNzPnCXrMl2a6Wz4xUgkfq1RUb1dv9C2cKGqHWYmUVx+mtATfTk4zXM/d47PRG
+gpkJP40fwfUBo0dTuPdU4NxkG4LlcaJQv23bNAqyaz1Jo9E5yu4jKeTOns0bfJCd
+Qvg9C91B3i3kcw1lBhk7qiS4vsdCLUrGRisIsveYC6rLgC3b+DNsRFZtxy0GetzN
+1IYe8oECgYEA+FZyUqrdM8KwdQLiEoKsTSQMKt3gZh608cYKtvwkWSiWe9zoPx0H
+KosyejrDd850XKqY3xOCf888H5benivrX9MmOtCxs5A/sVoooinJ7xTA7SaR3Qx6
+VpUZh6FewaG2QuWYSUmUEIbcSRhFX+qtWAtcG+HNzxU5x/cDjf/m3V8CgYEAzNbu
+F64VZ/Dl8caAj7huM9wEST4ZTOx7xJCbcz7DmAJs3/XjacpK4S1sfsPBHwrnbCIQ
+gO+AXbGUTuNze6QDR3uU/rRMk+qFZsuFHmNfwkJD0LWbsGP3FlHzVaW1oC1o8IgF
+A9d5PV0eDoUV9dOfdhGR/48VS1xXA0YPWETRGsECgYAxzHQEa8sL1CC6dieLerS+
+i1n9Rpz3HXU/fm0roIhRcLgsgnH4JgQH3f3zUNFdtwLSiks5gJoMsyvlUcW2hiwe
+/SKPbMYVsflzwRag3ixmSw0dAT0CzLvDnQaPkiaEQb9gztWo7J5KaiDGb52JzG+S
+VkTUOoWg3yrFFJ2b3hMXlQKBgQCWVT9UPb0UFaaM9OQxlme6w8SZhGvJGt4S+xY7
+VFr0WwNQswN+BqtB67Zuqng3sib6I139YsjQ+p0f8Ko2mb6WXcqRy/1PqZTSRpei
+H8iNp1hh+ocSw6r5xJdTylQsBGe57/nOQfuG36pJeb8ONYwYePivmHFGZ7SsgGSO
+oaLdgQKBgQDerPjMGy0QxLXj/GncsfiK+ailuYsk9xAP6qIK780Nbl4m0UcjPVbf
+vlgjL28HwtPYbWJCMp9rWKFfvavgxYALpgoEBC86UXfq7FHy8daBO69Juv/3smac
+XtZPL1ejc2upq+XVwvOchfNSrxeyna3IhH+R6AugHWBu50ljImPJ7g==
+-----END RSA PRIVATE KEY-----
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/ssl/dh-pubkey/dhparams.pem b/openresty-ext/src/assembly/resources/openresty/nginx/ssl/dh-pubkey/dhparams.pem
new file mode 100644
index 0000000..557c705
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/ssl/dh-pubkey/dhparams.pem
@@ -0,0 +1,8 @@
+-----BEGIN DH PARAMETERS-----
+MIIBCAKCAQEA+pLgK1rPwKegE+3nnIPZktI5d08Hw1N72z7U1srFt0UBgxXLRsss
+7CI8iVQMKp1usoRS/yg+JaHPfaSNnsGzuIbLhyrsYq4qr7D8n6fOY0sgF1sEEVtG
+EGz5OTHc43pEUqWBrXgLjpRpMj/qlyNGi22DEa9gD3Xy+gPWTWlB1yGYY98QFsYI
+KRoQ0b14Czb+04jJzC6IjpLoNC/k7TIG57q1tG9Dfd7a5b4ZMJPXUYCoEyrT76gn
+8uHG/iB+QWJhViohjGg8TXDfDlpyQ0sxhiEaUkxvK/Lb64Cf4xh0uWscVxK3Mcpb
+HpLPy8QEOs3/v18GV7q1ArTJADIU129AkwIBAg==
+-----END DH PARAMETERS-----
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/temp/placeholder.txt b/openresty-ext/src/assembly/resources/openresty/nginx/stream-enabled/placeholder.txt
index e69de29..e69de29 100644
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/temp/placeholder.txt
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/stream-enabled/placeholder.txt
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/temp/placeholder.txt b/openresty-ext/src/assembly/resources/openresty/nginx/temp/placeholder.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/nginx/temp/placeholder.txt
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/reload.sh b/openresty-ext/src/assembly/resources/openresty/reload.sh
index 63e6854..240b4b0 100644
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/reload.sh
+++ b/openresty-ext/src/assembly/resources/openresty/reload.sh
@@ -1,12 +1,12 @@
#!/bin/sh
#
-# Copyright 2016 ZTE Corporation.
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
#
# 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
+# 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,
@@ -14,9 +14,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
DIRNAME=`dirname $0`
HOME=`cd $DIRNAME/nginx; pwd`
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/run.sh b/openresty-ext/src/assembly/resources/openresty/run.sh
index f5226b5..1b64c0d 100644
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/run.sh
+++ b/openresty-ext/src/assembly/resources/openresty/run.sh
@@ -1,12 +1,12 @@
#!/bin/sh
#
-# Copyright 2016 ZTE Corporation.
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
#
# 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
+# 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,
@@ -14,14 +14,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
DIRNAME=`dirname $0`
HOME=`cd $DIRNAME/nginx; pwd`
-LUAJIT_HOME=`cd $DIRNAME/luajit; pwd`
_NGINXCMD="$HOME/sbin/nginx"
+LUAJIT_HOME=`cd $DIRNAME/luajit; pwd`
echo =========== prepare the symbolic links ========================================
ln -s -f $_NGINXCMD $DIRNAME/bin/openresty
ln -s -f $LUAJIT_HOME/bin/luajit2.1.0-beta2 $LUAJIT_HOME/bin/luajit
@@ -30,6 +27,7 @@ ln -s -f $LUAJIT_HOME/lib/libluajit-5.1.so.2.1.0 $LUAJIT_HOME/lib/libluajit-5.1.
echo ================================================================================
echo =========== create symbolic link for libluajit-5.1.so.2 ========================================
+LUAJIT_HOME=`cd $DIRNAME/luajit; pwd`
LUAJIT_FILENAME="$LUAJIT_HOME/lib/libluajit-5.1.so.2"
LN_TARGET_FILE='/lib/libluajit-5.1.so.2'
LN_TARGET_FILE64='/lib64/libluajit-5.1.so.2'
diff --git a/openresty-ext/src/assembly/resources/openresty/run4docker.sh b/openresty-ext/src/assembly/resources/openresty/run4docker.sh
new file mode 100644
index 0000000..329dabc
--- /dev/null
+++ b/openresty-ext/src/assembly/resources/openresty/run4docker.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+DIRNAME=`dirname $0`
+HOME=`cd $DIRNAME/nginx; pwd`
+_NGINXCMD="$HOME/sbin/nginx"
+
+echo =========== create symbolic link for libluajit-5.1.so.2 ========================================
+LUAJIT_HOME=`cd $DIRNAME/luajit; pwd`
+LUAJIT_FILENAME="$LUAJIT_HOME/lib/libluajit-5.1.so.2"
+LN_TARGET_FILE='/lib/libluajit-5.1.so.2'
+LN_TARGET_FILE64='/lib64/libluajit-5.1.so.2'
+ln -s -f $LUAJIT_FILENAME $LN_TARGET_FILE
+ln -s -f $LUAJIT_FILENAME $LN_TARGET_FILE64
+echo ===============================================================================
+
+echo =========== openresty config info =============================================
+echo HOME=$HOME
+echo _NGINXCMD=$_NGINXCMD
+echo ===============================================================================
+cd $HOME; pwd
+
+echo @WORK_DIR@ $HOME
+echo @C_CMD@ $_NGINXCMD -p $HOME/
+$_NGINXCMD -p $HOME/ -g "daemon off;"
+
diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/stop.sh b/openresty-ext/src/assembly/resources/openresty/stop.sh
index 6057d48..343bff4 100644
--- a/msb-core/openresty-ext/src/assembly/resources/openresty/stop.sh
+++ b/openresty-ext/src/assembly/resources/openresty/stop.sh
@@ -1,12 +1,12 @@
#!/bin/bash
#
-# Copyright 2016 ZTE Corporation.
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
#
# 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
+# 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,
@@ -14,10 +14,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-# Author: Zhaoxing Meng
-# email: meng.zhaoxing1@zte.com.cn
-#
-
DIRNAME=`dirname $0`
HOME=`cd $DIRNAME/nginx; pwd`
_NGINXCMD="$HOME/sbin/nginx"
diff --git a/pom.xml b/pom.xml
index f5defc1..8cb38b0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,44 +1,188 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
-
- Copyright 2016 ZTE Corporation.
-
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
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
-
+
+ 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
+
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.onap.msb.apigateway</groupId>
+ <artifactId>msb-apigateway-parent</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <packaging>pom</packaging>
+ <name>onap/msb/msb-apigateway-parent</name>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+
+
+ <openresty.version>1.11.2.2</openresty.version>
+ <openresty-windows.version>1.11.9.1001</openresty-windows.version>
+
+ <redis.version>3.2.6</redis.version>
+ <redis-windows.version>3.2.100</redis-windows.version>
+
+ <classifier.win32>windows_386</classifier.win32>
+ <classifier.win64>windows_amd64</classifier.win64>
+ <classifier.linux64>linux_amd64</classifier.linux64>
+
+ <linux64outputdir>target/assembly/${classifier.linux64}/</linux64outputdir>
+ <win32outputdir>target/assembly/${classifier.win32}/</win32outputdir>
+ <win64outputdir>target/assembly/${classifier.win64}/</win64outputdir>
+
+ <dockerFileDir>src/main/docker</dockerFileDir>
+ <blueprintFileDir>src/main/blueprint</blueprintFileDir>
+ <version.output>target/version</version.output>
+
+ </properties>
+
+ <modules>
+ <module>apiroute</module>
+ <module>openresty-ext</module>
+ <module>redis-ext</module>
+ <module>distributions</module>
+ </modules>
+
+<!-- <distributionManagement>
+ <repository>
+ <id>releases</id>
+ <url>${nexus.repository.release}</url>
+ </repository>
+ <snapshotRepository>
+ <id>snapshots</id>
+ <url>${nexus.repository.snapshot}</url>
+ </snapshotRepository>
+ </distributionManagement> -->
+
+<!-- <profiles>
+ <profile>
+ <id>linux</id>
+ <properties>
+ <env.separator>:</env.separator>
+ </properties>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ </profile>
+ <profile>
+ <id>windows</id>
+ <properties>
+ <env.separator>;</env.separator>
+ </properties>
+ </profile>
+ </profiles> -->
+
+ <build>
+<!-- <extensions>
+ <extension>
+ <groupId>org.apache.maven.wagon</groupId>
+ <artifactId>wagon-ssh</artifactId>
+ <version>2.10</version>
+ </extension>
+ <extension>
+ <groupId>org.apache.maven.wagon</groupId>
+ <artifactId>wagon-ftp</artifactId>
+ <version>2.10</version>
+ </extension>
+ <extension>
+ <groupId>org.apache.maven.wagon</groupId>
+ <artifactId>wagon-webdav-jackrabbit</artifactId>
+ <version>2.10</version>
+ </extension>
+ </extensions> -->
+ <resources>
+ <resource>
+ <filtering>false</filtering>
+ <directory>src/main/resources</directory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ <resource>
+ <filtering>true</filtering>
+ <directory>src/main/filters</directory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ </resources>
+
+ <pluginManagement>
+ <plugins>
+ <!-- Official maven plugins, alpha-sorted by artifactId.
+ We do not need to specify the groupId. -->
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.8</version>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-clean-plugin</artifactId>
+ <version>2.6.1</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-install-plugin</artifactId>
+ <version>2.5.2</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <version>2.8.2</version>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.10</version>
+ </plugin>
+
+
+<!-- <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-plugin-plugin</artifactId>
+ <version>${maven.plugin.version}</version>
+ </plugin> -->
- <modelVersion>4.0.0</modelVersion>
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>2.7</version>
+ </plugin>
- <parent>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>msbparent</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <relativePath>msb-parent/msbparent</relativePath>
- </parent>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <version>1.9.1</version>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>${maven.surefire.version}</version>
+ <configuration>
+ <forkCount>3</forkCount>
+ <reuseForks>true</reuseForks>
+ <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
+ </configuration>
+ </plugin>
+
+ </plugins>
+ </pluginManagement>
+ </build>
+
- <artifactId>msb-core-root</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <name>common-services-microservice-bus</name>
- <packaging>pom</packaging>
+</project>
- <modules>
- <module>msb-parent</module>
- <module>msb-core</module>
- </modules>
- </project>
diff --git a/msb-core/redis-ext/pom.xml b/redis-ext/pom.xml
index 8161cf4..69c4874 100644
--- a/msb-core/redis-ext/pom.xml
+++ b/redis-ext/pom.xml
@@ -1,36 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
-
- Copyright 2016 ZTE Corporation.
-
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
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
-
+
+ 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.
-
- Author: Zhaoxing Meng
- email: meng.zhaoxing1@zte.com.cn
-
+
-->
+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
- <groupId>org.openo.common-services.microservice-bus</groupId>
- <artifactId>msb-core-parent</artifactId>
- <version>1.1.0-SNAPSHOT</version>
+ <groupId>org.onap.msb.apigateway</groupId>
+ <artifactId>msb-apigateway-parent</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
+ <groupId>org.onap.msb.apigateway</groupId>
<artifactId>redis-ext</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <name>common-services-microservice-bus/msb-core/redis-ext</name>
+ <version>0.0.1-SNAPSHOT</version>
+ <name>onap/msb/apigateway/redis-ext</name>
<packaging>pom</packaging>
<properties>
@@ -38,16 +37,27 @@
<packageid>redis-ext</packageid>
</properties>
- <dependencies>
- <dependency>
- <groupId>org.redis.centos.7</groupId>
- <artifactId>redis</artifactId>
- <version>${redis.version}</version>
- <type>tar.gz</type>
- </dependency>
- </dependencies>
- <build>
+
+ <profiles>
+ <profile>
+ <id>linux</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+
+ <dependencies>
+ <!--
+ <dependency>
+ <groupId>org.redis.centos.7</groupId>
+ <artifactId>redis</artifactId>
+ <version>${redis.version}</version>
+ <type>tar.gz</type>
+ </dependency>
+ -->
+ </dependencies>
+ <build>
<plugins>
+ <!--
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
@@ -57,17 +67,16 @@
<goals>
<goal>unpack</goal>
</goals>
- <!--unzip the redis binary package first-->
<phase>generate-resources</phase>
<configuration>
- <artifactItems>
- <artifactItem>
- <groupId>org.redis.centos.7</groupId>
- <artifactId>redis</artifactId>
- <type>tar.gz</type>
- <outputDirectory>${linux64outputdir}</outputDirectory>
- </artifactItem>
- </artifactItems>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.redis.centos.7</groupId>
+ <artifactId>redis</artifactId>
+ <type>tar.gz</type>
+ <outputDirectory>${linux64outputdir}</outputDirectory>
+ </artifactItem>
+ </artifactItems>
<excludes>**/redis-benchmark**,**/*.pdb,**/*.docx</excludes>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
@@ -95,8 +104,8 @@
</execution>
</executions>
</plugin>
-
-
+ -->
+
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
@@ -157,4 +166,6 @@
</plugins>
</build>
+ </profile>
+ </profiles>
</project> \ No newline at end of file
diff --git a/msb-core/redis-ext/src/assembly/resources/linux/redis/BGREWRITEAOF.sh b/redis-ext/src/assembly/resources/linux/redis/BGREWRITEAOF.sh
index e401021..e401021 100644
--- a/msb-core/redis-ext/src/assembly/resources/linux/redis/BGREWRITEAOF.sh
+++ b/redis-ext/src/assembly/resources/linux/redis/BGREWRITEAOF.sh
diff --git a/msb-core/redis-ext/src/assembly/resources/linux/redis/conf/redis.conf b/redis-ext/src/assembly/resources/linux/redis/conf/redis.conf
index 66476ea..a3bdaf8 100644
--- a/msb-core/redis-ext/src/assembly/resources/linux/redis/conf/redis.conf
+++ b/redis-ext/src/assembly/resources/linux/redis/conf/redis.conf
@@ -160,7 +160,7 @@ loglevel notice
# Specify the log file name. Also the empty string can be used to force
# Redis to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
-logfile "../redis-works/redis.log"
+logfile "../redis/logs/redis.log"
# To enable logging to the system logger, just set 'syslog-enabled' to yes,
# and optionally update the other syslog parameters to suit your needs.
@@ -561,7 +561,7 @@ slave-priority 100
#
# Please check http://redis.io/topics/persistence for more information.
-appendonly yes
+appendonly no
# The name of the append only file (default: "appendonly.aof")
diff --git a/redis-ext/src/assembly/resources/linux/redis/logs/placeholder.txt b/redis-ext/src/assembly/resources/linux/redis/logs/placeholder.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/redis-ext/src/assembly/resources/linux/redis/logs/placeholder.txt
diff --git a/msb-core/redis-ext/src/assembly/resources/linux/redis/run.sh b/redis-ext/src/assembly/resources/linux/redis/run.sh
index 2bffa97..4217ca3 100644
--- a/msb-core/redis-ext/src/assembly/resources/linux/redis/run.sh
+++ b/redis-ext/src/assembly/resources/linux/redis/run.sh
@@ -20,7 +20,7 @@ DIRNAME=`dirname $0`
HOME=`cd $DIRNAME/; pwd`
_REDISCMD="$HOME/redis-server"
_REDISCONF="$HOME/conf/redis.conf"
-
+_BGREWRITEAOF="$HOME/BGREWRITEAOF.sh"
REDIS_WORKS=$HOME/../redis-works
if [ ! -d "$REDIS_WORKS" ]; then
@@ -29,6 +29,12 @@ mkdir "$REDIS_WORKS"
fi
+if [ -n "${APIGATEWAY_MODE}" -a -n "${APIGATEWAY_REDIS_PORT}" ]; then
+ sed -i 's/port 6379/port '${APIGATEWAY_REDIS_PORT}'/g' $_REDISCONF
+ sed -i 's/redis_6379/redis_'${APIGATEWAY_REDIS_PORT}'/g' $_REDISCONF
+ sed -i 's/-p 6379/-p '${APIGATEWAY_REDIS_PORT}'/g' $_BGREWRITEAOF
+fi
+
echo =========== Redis config info =============================================
echo Redis_HOME=$HOME
echo config file=$_REDISCONF
@@ -37,4 +43,4 @@ echo ===========================================================================
cd $HOME; pwd
echo @C_CMD@ $_REDISCMD $_REDISCONF
-$_REDISCMD $_REDISCONF
+$_REDISCMD $_REDISCONF \ No newline at end of file
diff --git a/redis-ext/src/assembly/resources/linux/redis/run4docker.sh b/redis-ext/src/assembly/resources/linux/redis/run4docker.sh
new file mode 100644
index 0000000..18fa55f
--- /dev/null
+++ b/redis-ext/src/assembly/resources/linux/redis/run4docker.sh
@@ -0,0 +1,46 @@
+#
+# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# 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.
+#
+
+#!/bin/sh
+
+DIRNAME=`dirname $0`
+HOME=`cd $DIRNAME/; pwd`
+_REDISCMD="$HOME/redis-server"
+_REDISCONF="$HOME/conf/redis.conf"
+_BGREWRITEAOF="$HOME/BGREWRITEAOF.sh"
+REDIS_WORKS=$HOME/../redis-works
+
+if [ ! -d "$REDIS_WORKS" ]; then
+echo there is no $REDIS_WORKS
+mkdir "$REDIS_WORKS"
+fi
+
+
+if [ -n "${APIGATEWAY_MODE}" -a -n "${APIGATEWAY_REDIS_PORT}" ]; then
+ sed -i 's/port 6379/port '${APIGATEWAY_REDIS_PORT}'/g' $_REDISCONF
+ sed -i 's/redis_6379/redis_'${APIGATEWAY_REDIS_PORT}'/g' $_REDISCONF
+ sed -i 's/-p 6379/-p '${APIGATEWAY_REDIS_PORT}'/g' $_BGREWRITEAOF
+fi
+
+echo =========== Redis config info =============================================
+echo Redis_HOME=$HOME
+echo config file=$_REDISCONF
+echo Help:use $_REDISCMD --help for help
+echo ===============================================================================
+cd $HOME; pwd
+
+echo @C_CMD@ $_REDISCMD $_REDISCONF --daemonize no
+$_REDISCMD $_REDISCONF --daemonize no
diff --git a/msb-core/redis-ext/src/assembly/resources/linux/redis/stop.sh b/redis-ext/src/assembly/resources/linux/redis/stop.sh
index 443333b..d266b42 100644
--- a/msb-core/redis-ext/src/assembly/resources/linux/redis/stop.sh
+++ b/redis-ext/src/assembly/resources/linux/redis/stop.sh
@@ -22,9 +22,12 @@ _REDISCLIENT="$HOME/redis-cli"
echo ===================== Redis info =============================================
echo Redis_HOME=$HOME
-echo TIP:This shell script close the Redis instance listening on 6379!
+echo TIP:This shell script close the Redis instance!
echo ===============================================================================
cd $HOME; pwd
-
-echo @C_CMD@ $_REDISCLIENT -p 6379 shutdown
-$_REDISCLIENT -p 6379 shutdown
+_REDIS_PORT="6379"
+if [ -n "${APIGATEWAY_MODE}" -a -n "${APIGATEWAY_REDIS_PORT}" ]; then
+ _REDIS_PORT=${APIGATEWAY_REDIS_PORT}
+fi
+echo @C_CMD@ $_REDISCLIENT -p $_REDIS_PORT shutdown
+$_REDISCLIENT -p $_REDIS_PORT shutdown \ No newline at end of file