You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by yu...@apache.org on 2017/06/15 02:53:16 UTC
[46/51] [partial] incubator-rocketmq-externals git commit: Release
rocketmq-console 1.0.0 version
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/i18n/en.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/i18n/en.js b/rocketmq-console/src/main/resources/static/src/i18n/en.js
new file mode 100644
index 0000000..651456f
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/i18n/en.js
@@ -0,0 +1,80 @@
+var en = {
+ "TITLE": "RocketMq-Console-Ng",
+ "CLOSE": "Close",
+ "NO": "NO.",
+ "ADDRESS": "Address",
+ "VERSION": "Version",
+ "PRO_MSG_TPS": "Produce Massage TPS",
+ "CUS_MSG_TPS": "Consumer Massage TPS",
+ "YESTERDAY_PRO_COUNT": "Yesterday Produce Count",
+ "YESTERDAY_CUS_COUNT": "Yesterday Consume Count",
+ "TODAY_PRO_COUNT": "Today Produce Count",
+ "TODAY_CUS_COUNT": "Today Consume Count",
+ "INSTANCE": "Instance",
+ "SPLIT": "Broker",
+ "CLUSTER": "Cluster",
+ "CLUSTER_DETAIL": "Cluster Detail",
+ "TOPIC": "Topic",
+ "SUBSCRIPTION_GROUP":"SubscriptionGroup",
+ "PRODUCER_GROUP":"ProducerGroup",
+ "CONSUMER":"Consumer",
+ "PRODUCER":"Producer",
+ "MESSAGE":"Message",
+ "COMMIT": "Commit",
+ "OPERATION": "Operation",
+ "ADD": "Add",
+ "UPDATE": "Update",
+ "STATUS": "Status",
+ "ROUTER": "Router",
+ "MANAGE": "Manage",
+ "CONFIG": "Config",
+ "SEND_MSG": "Send Massage",
+ "RESET_CUS_OFFSET": "Reset Consumer Offset",
+ "DELETE": "Delete",
+ "CHANGE_LANG": "ChangeLanguage",
+ "BROKER": "Broker",
+ "NORMAL": "NORMAL",
+ "RETRY": "RETRY",
+ "DLQ": "DLQ",
+ "QUANTITY":"Quantity",
+ "TYPE":"Type",
+ "MODE":"Mode",
+ "DELAY":"Delay",
+ "DASHBOARD":"Dashboard",
+ "CONSUME_DETAIL":"CONSUME DETAIL",
+ "CLIENT":"CLIENT",
+ "LAST_CONSUME_TIME":"LastConsumeTime",
+ "TIME":"Time",
+ "RESET":"RESET",
+ "DATE":"Date",
+ "NO_DATA":"NO DATA",
+ "SEARCH":"Search",
+ "BEGIN":"Begin",
+ "END":"End",
+ "TOPIC_CHANGE":"Topic Change",
+ "SEND":"Send",
+ "SUBSCRIPTION_CHANGE":"Subscription Change",
+ "QUEUE":"Queue",
+ "MIN_OFFSET":"minOffset",
+ "MAX_OFFSET":"maxOffset",
+ "LAST_UPDATE_TIME_STAMP":"lastUpdateTimeStamp",
+ "QUEUE_DATAS":"queueDatas",
+ "READ_QUEUE_NUMS":"readQueueNums",
+ "WRITE_QUEUE_NUMS":"writeQueueNums",
+ "PERM":"perm",
+ "TAG":"Tag",
+ "KEY":"Key",
+ "MESSAGE_BODY":"Message Body",
+ "TOPIC_NAME":"topicName",
+ "ORDER":"order",
+ "CONSUMER_CLIENT":"consumerClient",
+ "BROKER_OFFSET":"brokerOffset",
+ "CONSUMER_OFFSET":"consumerOffset",
+ "DIFF_TOTAL":"diffTotal",
+ "LAST_TIME_STAMP":"lastTimeStamp",
+ "RESET_OFFSET":"resetOffset",
+ "CLUSTER_NAME":"clusterName",
+ "OPS":"OPS",
+ "AUTO_REFRESH":"AUTO_REFRESH",
+ "REFRESH":"REFRESH"
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/i18n/zh.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/i18n/zh.js b/rocketmq-console/src/main/resources/static/src/i18n/zh.js
new file mode 100644
index 0000000..6cf39f0
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/i18n/zh.js
@@ -0,0 +1,80 @@
+var zh = {
+ "TITLE": "RocketMq控制台",
+ "CLOSE": "关闭",
+ "NO": "编号",
+ "ADDRESS": "地址",
+ "VERSION": "版本",
+ "PRO_MSG_TPS": "生产消息TPS",
+ "CUS_MSG_TPS": "消费消息TPS",
+ "YESTERDAY_PRO_COUNT": "昨日生产总数",
+ "YESTERDAY_CUS_COUNT": "昨日消费总数",
+ "TODAY_PRO_COUNT": "今天生产总数",
+ "TODAY_CUS_COUNT": "今天消费总数",
+ "INSTANCE": "实例",
+ "SPLIT": "分片",
+ "CLUSTER": "集群",
+ "CLUSTER_DETAIL": "集群详情",
+ "COMMIT": "提交",
+ "TOPIC": "主题",
+ "SUBSCRIPTION_GROUP":"订阅组",
+ "PRODUCER_GROUP":"生产组",
+ "CONSUMER":"消费者",
+ "PRODUCER":"生产者",
+ "MESSAGE":"消息",
+ "OPERATION": "操作",
+ "ADD": "新增",
+ "UPDATE": "更新",
+ "STATUS": "状态",
+ "ROUTER": "路由",
+ "MANAGE": "管理",
+ "CONFIG": "配置",
+ "SEND_MSG": "发送消息",
+ "RESET_CUS_OFFSET": "重置消费位点",
+ "DELETE": "删除",
+ "CHANGE_LANG": "更换语言",
+ "BROKER": "Broker",
+ "NORMAL": "普通",
+ "RETRY": "重试",
+ "DLQ": "死信",
+ "QUANTITY":"数量",
+ "TYPE":"类型",
+ "MODE":"模式",
+ "DELAY":"延迟",
+ "DASHBOARD":"驾驶舱",
+ "CONSUME_DETAIL":"消费详情",
+ "CLIENT":"终端",
+ "LAST_CONSUME_TIME":"最后消费时间",
+ "TIME":"时间点",
+ "RESET":"重置",
+ "DATE":"日期",
+ "NO_DATA":"暂无数据",
+ "SEARCH":"搜索",
+ "BEGIN":"开始",
+ "END":"结束",
+ "TOPIC_CHANGE":"修改主题",
+ "SEND":"发送",
+ "SUBSCRIPTION_CHANGE":"修改订阅",
+ "QUEUE":"队列",
+ "MIN_OFFSET":"最小位点",
+ "MAX_OFFSET":"最大位点",
+ "LAST_UPDATE_TIME_STAMP":"上次更新时间",
+ "QUEUE_DATAS":"队列信息",
+ "READ_QUEUE_NUMS":"读队列数量",
+ "WRITE_QUEUE_NUMS":"写队列数量",
+ "PERM":"perm",
+ "TAG":"标签",
+ "KEY":"值",
+ "MESSAGE_BODY":"消息主体",
+ "TOPIC_NAME":"主题名",
+ "ORDER":"顺序",
+ "CONSUMER_CLIENT":"消费者终端",
+ "BROKER_OFFSET":"代理者位点",
+ "CONSUMER_OFFSET":"消费者位点",
+ "DIFF_TOTAL":"差值",
+ "LAST_TIME_STAMP":"上次时间",
+ "RESET_OFFSET":"重置位点",
+ "CLUSTER_NAME":"集群名",
+ "OPS":"运维",
+ "AUTO_REFRESH":"自动刷新",
+ "REFRESH":"刷新"
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/message.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/message.js b/rocketmq-console/src/main/resources/static/src/message.js
new file mode 100644
index 0000000..fca286c
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/message.js
@@ -0,0 +1,200 @@
+/*
+ * 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.
+ */
+
+var module = app;
+
+module.controller('messageController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) {
+ $scope.allTopicList = [];
+ $scope.selectedTopic =[];
+ $scope.key ="";
+ $scope.messageId ="";
+ $scope.queryMessageByTopicResult=[];
+ $scope.queryMessageByTopicAndKeyResult=[];
+ $scope.queryMessageByMessageIdResult={};
+ $http({
+ method: "GET",
+ url: "topic/list.query"
+ }).success(function (resp) {
+ if(resp.status ==0){
+ $scope.allTopicList = resp.data.topicList.sort();
+ console.log($scope.allTopicList);
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+ $scope.timepickerBegin = moment().subtract(1, 'hour').format('YYYY-MM-DD HH:mm');
+ $scope.timepickerEnd = moment().add(1,'hour').format('YYYY-MM-DD HH:mm');
+ $scope.timepickerOptions ={format: 'YYYY-MM-DD HH:mm', showClear: true};
+
+ $scope.paginationConf = {
+ currentPage: 1,
+ totalItems: 0,
+ itemsPerPage: 20,
+ pagesLength: 15,
+ perPageOptions: [10],
+ rememberPerPage: 'perPageItems',
+ onChange: function () {
+ $scope.changeShowMessageList(this.currentPage,this.totalItems);
+ }
+ };
+
+
+ $scope.queryMessageByTopic = function () {
+ console.log($scope.selectedTopic);
+ console.log($scope.timepickerBegin)
+ console.log($scope.timepickerEnd)
+ $http({
+ method: "GET",
+ url: "message/queryMessageByTopic.query",
+ params: {
+ topic: $scope.selectedTopic,
+ begin: $scope.timepickerBegin.valueOf(),
+ end: $scope.timepickerEnd.valueOf()
+
+ }
+ }).success(function (resp) {
+ if (resp.status == 0) {
+ console.log(resp);
+ $scope.queryMessageByTopicResult = resp.data;
+ $scope.changeShowMessageList(1,$scope.queryMessageByTopicResult.length);
+ // todo
+ // console.log($scope.queryMessageByTopicResult);
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+ };
+
+ $scope.queryMessageByTopicAndKey = function () {
+ console.log($scope.selectedTopic);
+ console.log($scope.key);
+ $http({
+ method: "GET",
+ url: "message/queryMessageByTopicAndKey.query",
+ params: {
+ topic: $scope.selectedTopic,
+ key:$scope.key
+ }
+ }).success(function (resp) {
+ if (resp.status == 0) {
+ console.log(resp);
+ $scope.queryMessageByTopicAndKeyResult = resp.data;
+ console.log($scope.queryMessageByTopicAndKeyResult);
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+ };
+
+ $scope.queryMessageByBrokerAndOffset = function (storeHost,commitLogOffset) {
+ $http({
+ method: "GET",
+ url: "message/viewMessageByBrokerAndOffset.query",
+ params: {
+ brokerHost: storeHost.address,
+ port:storeHost.port,
+ offset: commitLogOffset
+ }
+ }).success(function (resp) {
+ if (resp.status == 0) {
+ console.log(resp);
+ ngDialog.open({
+ template: 'messageDetailViewDialog',
+ controller: 'messageDetailViewDialogController',
+ data: resp.data
+ });
+ } else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+ };
+
+ $scope.queryMessageByMessageId = function (messageId,topic) {
+ $http({
+ method: "GET",
+ url: "message/viewMessage.query",
+ params: {
+ msgId: messageId,
+ topic:topic
+ }
+ }).success(function (resp) {
+ if (resp.status == 0) {
+ console.log(resp);
+ ngDialog.open({
+ template: 'messageDetailViewDialog',
+ controller: 'messageDetailViewDialogController',
+ data:resp.data
+ });
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+ };
+
+
+ $scope.changeShowMessageList = function (currentPage,totalItem) {
+ var perPage = $scope.paginationConf.itemsPerPage;
+ var from = (currentPage - 1) * perPage;
+ var to = (from + perPage)>totalItem?totalItem:from + perPage;
+ $scope.messageShowList = $scope.queryMessageByTopicResult.slice(from, to);
+ $scope.paginationConf.totalItems = totalItem ;
+ };
+}]);
+
+module.controller('messageDetailViewDialogController',['$scope', 'ngDialog', '$http','Notification', function ($scope, ngDialog, $http,Notification) {
+
+ $scope.resendMessage = function (msgId,topic,consumerGroup) {
+ $http({
+ method: "POST",
+ url: "message/consumeMessageDirectly.do",
+ params: {
+ msgId: msgId,
+ consumerGroup:consumerGroup,
+ topic:topic
+ }
+ }).success(function (resp) {
+ if (resp.status == 0) {
+ ngDialog.open({
+ template: 'operationResultDialog',
+ data:{
+ result:resp.data
+ }
+ });
+ }
+ else {
+ ngDialog.open({
+ template: 'operationResultDialog',
+ data:{
+ result:resp.errMsg
+ }
+ });
+ }
+ });
+ };
+ $scope.showExceptionDesc = function (errmsg) {
+ if(errmsg == null){
+ errmsg = "Don't have Exception"
+ }
+ ngDialog.open({
+ template: 'operationResultDialog',
+ data:{
+ result:errmsg
+ }
+ });
+ };
+ }]
+);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/ops.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/ops.js b/rocketmq-console/src/main/resources/static/src/ops.js
new file mode 100644
index 0000000..312e41f
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/ops.js
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ */
+
+app.controller('opsController', ['$scope','$location','$http','Notification','remoteApi','tools', function ($scope,$location,$http,Notification,remoteApi,tools) {
+ $scope.namesvrAddrList = [];
+ $scope.useVIPChannel = true;
+ $http({
+ method: "GET",
+ url: "ops/homePage.query"
+ }).success(function (resp) {
+ if (resp.status == 0) {
+ $scope.namesvrAddrList = resp.data.namesvrAddrList;
+ $scope.useVIPChannel = resp.data.useVIPChannel
+ }else{
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+
+ $scope.updateNameSvrAddr = function () {
+ $http({
+ method: "POST",
+ url: "ops/updateNameSvrAddr.do",
+ params:{nameSvrAddrList:$scope.namesvrAddrList.join(";")}
+ }).success(function (resp) {
+ if (resp.status == 0) {
+ Notification.info({message: "SUCCESS", delay: 2000});
+ }else{
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+ };
+ $scope.updateIsVIPChannel = function () {
+ $http({
+ method: "POST",
+ url: "ops/updateIsVIPChannel.do",
+ params:{useVIPChannel:$scope.useVIPChannel}
+ }).success(function (resp) {
+ if (resp.status == 0) {
+ Notification.info({message: "SUCCESS", delay: 2000});
+ }else{
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+ }
+}]);
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/producer.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/producer.js b/rocketmq-console/src/main/resources/static/src/producer.js
new file mode 100644
index 0000000..3c039ad
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/producer.js
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ */
+
+var module = app;
+module.controller('producerController', ['$scope', '$http','Notification',function ($scope, $http,Notification) {
+ $scope.selectedTopic=[];
+ $scope.producerGroup="";
+ $http({
+ method: "GET",
+ url: "topic/list.query"
+ }).success(function (resp) {
+ if(resp.status ==0){
+ $scope.allTopicList = resp.data.topicList.sort();
+ console.log($scope.allTopicList);
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+ $scope.queryClientByTopicAndGroup = function () {
+ $http({
+ method: "GET",
+ url: "producer/producerConnection.query",
+ params:{
+ topic:$scope.selectedTopic,
+ producerGroup:$scope.producerGroup
+ }
+ }).success(function (resp) {
+ if(resp.status ==0){
+ $scope.connectionList = resp.data.connectionSet;
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+ }
+} ]);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/remoteApi/remoteApi.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/remoteApi/remoteApi.js b/rocketmq-console/src/main/resources/static/src/remoteApi/remoteApi.js
new file mode 100644
index 0000000..1189771
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/remoteApi/remoteApi.js
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ */
+app.service('remoteApi', ['$http','tools', function ($http,tools) {
+ var queryTopic = function(callback){
+ $http({
+ method: "GET",
+ url: "topic/list.query"
+ }).success(callback);
+ }
+
+ var queryClusterList = function(callback){
+ $http({
+ method: "GET",
+ url: "cluster/list.query"
+ }).success(callback);
+ }
+
+ var queryBrokerHisData = function(date,callback){
+ var url = 'dashboard/broker.query';
+ var data = {date:date};
+ var setting = {
+ type: "GET",
+ data:data,
+ timeout:15000,//data is too large,so master set time out is long enough
+ success:callback
+ }
+ $.ajax(url,setting)
+ }
+
+ var queryTopicHisData = function(date,topicName,callback){
+ var url = 'dashboard/topic.query';
+ var data = {date:date,topicName:topicName};
+ var setting = {
+ type: "GET",
+ data:data,
+ timeout:15000,//data is too large,so master set time out is long enough
+ success:callback
+ }
+ $.ajax(url,setting)
+ }
+
+ var queryTopicCurrentData = function(callback){
+ var url = 'dashboard/topicCurrent';
+ var setting = {
+ type: "GET",
+ timeout:15000,//data is too large,so master set time out is long enough
+ success:callback
+ }
+ $.ajax(url,setting)
+ }
+
+
+ return {
+ queryTopic:queryTopic,
+ queryClusterList:queryClusterList,
+ queryBrokerHisData:queryBrokerHisData,
+ queryTopicHisData:queryTopicHisData,
+ queryTopicCurrentData:queryTopicCurrentData
+ }
+}])
+
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/tools/tools.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/tools/tools.js b/rocketmq-console/src/main/resources/static/src/tools/tools.js
new file mode 100644
index 0000000..9ab5ae7
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/tools/tools.js
@@ -0,0 +1,85 @@
+/*
+ * 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.
+ */
+
+app.service('tools', ['$http', function ($http) {
+
+ var ctx = "";
+ var dashboardRefreshTime = 5000; // todo improve. when data size is large,request is too slow
+
+ var generateBrokerMap = function (brokerServer, clusterAddrTable, brokerAddrTable) {
+ var map = {};
+ $.each(brokerServer, function (brokerName, brokerStatusList) { // broker
+ $.each(clusterAddrTable, function (clusterName, brokerNameList) { //clusterAddrTable
+ if (angular.isUndefined(map[clusterName])) {
+ map[clusterName] = [];
+ }
+ $.each(brokerNameList, function (listIndex, clusterBrokerName) {
+ if (clusterBrokerName == brokerName) {
+ $.each(brokerStatusList, function (index, brokerStatus) {
+ brokerStatus.split = brokerName;
+ brokerStatus.index = index;
+ brokerStatus.address = brokerAddrTable[clusterBrokerName].brokerAddrs[index];
+ brokerStatus.brokerName = brokerAddrTable[clusterBrokerName].brokerName;
+ map[clusterName].push(brokerStatus);
+ })
+ }
+ })
+ })
+ });
+ return map;
+ };
+
+ var fastSort = function (arrayToSort, propertyToSortWith, sortDirection) {
+ // temporary holder of position and sort-value
+ var map = arrayToSort.map(function (e, i) {
+ if (typeof e[propertyToSortWith] === 'string') {
+ return { index: i, value: e[propertyToSortWith].toLowerCase() };
+ }
+ else {
+ return { index: i, value: e[propertyToSortWith] };
+ }
+
+ })
+
+ // sorting the map containing the reduced values
+ map.sort(function (a, b) {
+ if (sortDirection === "ascending") {
+ return +(a.value > b.value) || +(a.value === b.value) - 1;
+ }
+ else {
+ return +(a.value < b.value) || +(a.value === b.value) - 1;
+ }
+
+ });
+
+ // container for the resulting order
+ var result = map.map(function (e) {
+ return arrayToSort[e.index];
+ });
+ return result;
+ };
+
+ return {
+ generateBrokerMap:generateBrokerMap,
+ fastSort:fastSort,
+ ctx:ctx,
+ dashboardRefreshTime:dashboardRefreshTime
+ }
+}])
+
+
+
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/src/topic.js
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/src/topic.js b/rocketmq-console/src/main/resources/static/src/topic.js
new file mode 100644
index 0000000..047fbe2
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/src/topic.js
@@ -0,0 +1,406 @@
+/**
+ * Created by tcrow on 2017/1/12 0012.
+ */
+var module = app;
+
+module.directive('ngConfirmClick', [
+ function(){
+ return {
+ link: function (scope, element, attr) {
+ var msg = attr.ngConfirmClick || "Are you sure?";
+ var clickAction = attr.confirmedClick;
+ element.bind('click',function (event) {
+ if ( window.confirm(msg) ) {
+ scope.$eval(clickAction)
+ }
+ });
+ }
+ };
+ }]);
+module.controller('topicController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) {
+ $scope.paginationConf = {
+ currentPage: 1,
+ totalItems: 0,
+ itemsPerPage: 10,
+ pagesLength: 15,
+ perPageOptions: [10],
+ rememberPerPage: 'perPageItems',
+ onChange: function () {
+ $scope.showTopicList(this.currentPage,this.totalItems);
+
+ }
+ };
+ $scope.filterNormal = true
+ $scope.filterRetry = false
+ $scope.filterDLQ = false
+ $scope.allTopicList = [];
+ $scope.topicShowList = [];
+ $http({
+ method: "GET",
+ url: "topic/list.query"
+ }).success(function (resp) {
+ if(resp.status ==0){
+ $scope.allTopicList = resp.data.topicList.sort();
+ console.log($scope.allTopicList);
+ console.log(JSON.stringify(resp));
+ $scope.showTopicList(1,$scope.allTopicList.length);
+
+ }else {
+ Notification.error({message: resp.errMsg, delay: 5000});
+ }
+
+ });
+ $scope.filterStr="";
+ $scope.$watch('filterStr', function() {
+ $scope.filterList(1);
+ });
+ $scope.$watch('filterNormal', function() {
+ $scope.filterList(1);
+ });
+ $scope.$watch('filterRetry', function() {
+ $scope.filterList(1);
+ });
+ $scope.$watch('filterDLQ', function() {
+ $scope.filterList(1);
+ });
+ $scope.filterList = function (currentPage) {
+ var lowExceptStr = $scope.filterStr.toLowerCase();
+ var canShowList = [];
+
+ $scope.allTopicList.forEach(function(element) {
+ if($scope.filterByType(element)){
+ if (element.toLowerCase().indexOf(lowExceptStr) != -1){
+ canShowList.push(element);
+ }
+ }
+ });
+ $scope.paginationConf.totalItems =canShowList.length;
+ var perPage = $scope.paginationConf.itemsPerPage;
+ var from = (currentPage - 1) * perPage;
+ var to = (from + perPage)>canShowList.length?canShowList.length:from + perPage;
+ $scope.topicShowList = canShowList.slice(from, to);
+ };
+
+ $scope.filterByType = function(str){
+ if($scope.filterRetry){
+ if(str.startsWith("%R")){
+ return true
+ }
+ }
+ if($scope.filterDLQ){
+ if(str.startsWith("%D")){
+ return true
+ }
+ }
+ if($scope.filterNormal){
+ if(str.startsWith("%") == false){
+ return true
+ }
+ }
+ return false;
+ };
+
+ $scope.showTopicList = function (currentPage,totalItem) {
+ if($scope.filterStr != ""){
+ $scope.filterList(currentPage);
+ return;
+ }
+ var perPage = $scope.paginationConf.itemsPerPage;
+ var from = (currentPage - 1) * perPage;
+ var to = (from + perPage)>totalItem?totalItem:from + perPage;
+ console.log($scope.allTopicList);
+ console.log(from)
+ console.log(to)
+ $scope.topicShowList = $scope.allTopicList.slice(from, to);
+ $scope.paginationConf.totalItems = totalItem ;
+ console.log($scope.topicShowList)
+ console.log($scope.paginationConf.totalItems)
+ $scope.filterList(currentPage);
+ };
+ $scope.deleteTopic= function (topic) {
+ $http({
+ method: "POST",
+ url: "topic/deleteTopic.do",
+ params:{
+ topic:topic
+ }
+ }).success(function (resp) {
+ if(resp.status ==0){
+ Notification.info({message: "delete success!", delay: 2000});
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+ };
+ $scope.statsView = function (topic) {
+ $http({
+ method: "GET",
+ url: "topic/stats.query",
+ params: {topic: topic}
+ }).success(function (resp) {
+ if (resp.status == 0) {
+ console.log(JSON.stringify(resp));
+ ngDialog.open({
+ template: 'statsViewDialog',
+ trapFocus:false,
+ data:{
+ topic:topic,
+ statsData:resp.data
+ }
+ });
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ })
+ };
+ $scope.routerView = function (topic) {
+ $http({
+ method: "GET",
+ url: "topic/route.query",
+ params: {topic: topic}
+ }).success(function (resp) {
+ if (resp.status == 0) {
+ console.log(JSON.stringify(resp));
+ ngDialog.open({
+ template: 'routerViewDialog',
+ controller: 'routerViewDialogController',
+ trapFocus:false,
+ data:{
+ topic:topic,
+ routeData:resp.data
+ }
+ });
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ })
+ };
+
+
+ $scope.consumerView = function (topic) {
+ $http({
+ method: "GET",
+ url: "topic/queryConsumerByTopic.query",
+ params: {topic: topic}
+ }).success(function (resp) {
+ if (resp.status == 0) {
+ console.log(JSON.stringify(resp));
+ ngDialog.open({
+ template: 'consumerViewDialog',
+ data:{
+ topic:topic,
+ consumerData:resp.data,
+ consumerGroupCount:Object.keys(resp.data).length
+ }
+ });
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ })
+ };
+ $scope.openDeleteTopicDialog = function (topic) {
+ ngDialog.open({
+ template: 'deleteTopicDialog',
+ controller: 'deleteTopicDialogController',
+ data:{
+ topic:topic,
+ consumerData:"asd"
+ }
+ });
+ };
+
+ $scope.openConsumerResetOffsetDialog = function (topic) {
+
+ $http({
+ method: "GET",
+ url: "topic/queryTopicConsumerInfo.query",
+ params:{
+ topic:topic
+ }
+ }).success(function (resp) {
+ if(resp.status ==0){
+ if(resp.data.groupList == null){
+ Notification.error({message: "don't have consume group!", delay: 2000});
+ return
+ }
+ ngDialog.open({
+ template: 'consumerResetOffsetDialog',
+ controller: 'consumerResetOffsetDialogController',
+ data:{
+ topic: topic,
+ selectedConsumerGroup:[],
+ allConsumerGroupList:resp.data.groupList
+ }
+ });
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+
+ };
+
+
+ $scope.openSendTopicMessageDialog = function (topic) {
+ ngDialog.open({
+ template: 'sendTopicMessageDialog',
+ controller: 'sendTopicMessageDialogController',
+ data: {
+ topic: topic
+ }
+ });
+ };
+
+ $scope.openUpdateDialog = function (topic) {
+ $http({
+ method: "GET",
+ url: "topic/examineTopicConfig.query",
+ params:{
+ topic:topic
+ }
+ }).success(function (resp) {
+ if(resp.status ==0){
+ $scope.openCreateOrUpdateDialog(resp.data);
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+ };
+
+ $scope.openCreateOrUpdateDialog = function (request) {
+ var bIsUpdate = true;
+
+ if(request == null){
+ request = [{
+ writeQueueNums:16,
+ readQueueNums:16,
+ perm:6,
+ order:false,
+ topicName:"",
+ brokerNameList:[]
+ }];
+ bIsUpdate = false;
+ }
+ $http({
+ method: "GET",
+ url: "cluster/list.query"
+ }).success(function (resp) {
+ if(resp.status ==0){
+ console.log(resp);
+ ngDialog.open({
+ template: 'topicModifyDialog',
+ controller: 'topicModifyDialogController',
+ data:{
+ topicRequestList:request,
+ allClusterNameList:Object.keys(resp.data.clusterInfo.clusterAddrTable),
+ allBrokerNameList:Object.keys(resp.data.brokerServer),
+ bIsUpdate:bIsUpdate
+ }
+ });
+ }
+ });
+ }
+
+ $scope.openAddDialog = function () {
+ $scope.openCreateOrUpdateDialog(null);
+ }
+
+}]);
+
+module.controller('topicModifyDialogController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) {
+ $scope.postTopicRequest = function (topicRequestItem) {
+ console.log(topicRequestItem);
+ var request = JSON.parse(JSON.stringify(topicRequestItem));
+ console.log(request);
+ $http({
+ method: "POST",
+ url: "topic/createOrUpdate.do",
+ data:request
+ }).success(function (resp) {
+ if(resp.status ==0){
+ Notification.info({message: "success!", delay: 2000});
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ });
+ }
+ }]
+);
+module.controller('consumerResetOffsetDialogController',['$scope', 'ngDialog', '$http','Notification', function ($scope, ngDialog, $http,Notification) {
+ $scope.timepicker = {};
+ $scope.timepicker.date = moment().format('YYYY-MM-DD HH:mm');
+ $scope.timepicker.options = {format: 'YYYY-MM-DD HH:mm', showClear: true};
+ $scope.resetOffset = function () {
+ console.log($scope.timepicker.date);
+ console.log($scope.timepicker.date.valueOf());
+ console.log($scope.ngDialogData.selectedConsumerGroup);
+ $http({
+ method: "POST",
+ url: "consumer/resetOffset.do",
+ data: {
+ resetTime: $scope.timepicker.date.valueOf(),
+ consumerGroupList: $scope.ngDialogData.selectedConsumerGroup,
+ topic:$scope.ngDialogData.topic,
+ force:true
+ }
+ }).success(function (resp) {
+ if(resp.status ==0){
+ ngDialog.open({
+ template: 'resetOffsetResultDialog',
+ data:{
+ result:resp.data
+ }
+ });
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ })
+ }
+ }]
+);
+
+module.controller('sendTopicMessageDialogController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) {
+ $scope.sendTopicMessage = {
+ topic: $scope.ngDialogData.topic,
+ key: "key",
+ tag:"tag",
+ messageBody:"messageBody"
+ };
+ $scope.send = function () {
+ $http({
+ method: "POST",
+ url: "topic/sendTopicMessage.do",
+ data: $scope.sendTopicMessage
+ }).success(function (resp) {
+ if(resp.status ==0){
+ ngDialog.open({
+ template: 'sendResultDialog',
+ data:{
+ result:resp.data
+ }
+ });
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ })
+ }
+ }]
+
+);
+
+module.controller('routerViewDialogController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) {
+ $scope.deleteTopicByBroker = function (broker) {
+ $http({
+ method: "POST",
+ url: "topic/deleteTopicByBroker.do",
+ params: {brokerName:broker.brokerName,topic:$scope.ngDialogData.topic}
+ }).success(function (resp) {
+ if(resp.status ==0){
+ Notification.info({message: "delete success", delay: 2000});
+ }else {
+ Notification.error({message: resp.errMsg, delay: 2000});
+ }
+ })
+ };
+ }]
+
+);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/style/animate.css
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/style/animate.css b/rocketmq-console/src/main/resources/static/style/animate.css
new file mode 100644
index 0000000..e3f0d0e
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/style/animate.css
@@ -0,0 +1,32 @@
+.view {
+}
+
+.view .ng-enter {
+ overflow-y: auto;
+}
+
+.view .ng-leave {
+ opacity: 0;
+ -webkit-transition: opacity .2s linear;
+ transition: opacity 0.2s linear;
+}
+
+.ng-hide-add {
+ transform: rotateZ(0);
+ transform-origin: right;
+ transition: all 0.2s ease-in-out;
+}
+
+.ng-hide-add.ng-hide-add-active {
+ transform: rotateZ(-135deg);
+}
+
+.ng-hide-remove {
+ transform: rotateY(90deg);
+ transform-origin: left;
+ transition: all 0.2s ease;
+}
+
+.ng-hide-remove.ng-hide-remove-active {
+ transform: rotateY(0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/style/app.css
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/style/app.css b/rocketmq-console/src/main/resources/static/style/app.css
new file mode 100644
index 0000000..1941c11
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/style/app.css
@@ -0,0 +1,274 @@
+/* Write your styles */
+.scrollTo {
+ position: fixed;
+ right: 50px;
+ bottom: 70px;
+ z-index: 999;
+}
+
+/*.icon_u_c{background:url(/app/img/icon_user_center.png) no-repeat left top;}*/
+.icon {
+ float: left;
+ width: 24px;
+ height: 24px;
+ display: inline-block;
+ margin: 10px 18px 0 5px;
+}
+.icon_alipay {
+ background:url("/style/img/alipay.png") no-repeat left top;
+ height:100px;
+ width: 100px;
+ margin-top: -40px;
+}
+
+.icon_alipay_active {
+ background:url("/style/img/alipay_active.png") no-repeat left top;
+ height:100px;
+ width: 100px;
+ margin-top: -40px;
+}
+
+.icon_weipay {
+ background:url("/style/img/weipay.png") no-repeat left top;
+ height:100px;
+ width: 100px;
+ margin-top: -40px;
+}
+
+.icon_weipay_active {
+ background:url("/style/img/weipay_active.png") no-repeat left top;
+ height:100px;
+ width: 100px;
+ margin-top: -40px;
+}
+
+.round {
+ background:#5bc0de;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius:5px;
+ color: #FFFFFF;
+}
+
+
+/* ANIMATIONS
+============================================================================= */
+
+/* leaving animations ----------------------------------------- */
+/* rotate and fall */
+@keyframes rotateFall {
+ 0% { transform: rotateZ(0deg); }
+ 20% { transform: rotateZ(10deg); animation-timing-function: ease-out; }
+ 40% { transform: rotateZ(17deg); }
+ 60% { transform: rotateZ(16deg); }
+ 100% { transform: translateY(100%) rotateZ(17deg); }
+}
+
+/* slide in from the bottom */
+@keyframes slideOutLeft {
+ to { transform: translateX(-100%); }
+}
+
+/*!* rotate out newspaper *!*/
+@keyframes rotateOutNewspaper {
+ to { transform: translateZ(-3000px) rotateZ(360deg); opacity: 0; }
+}
+
+/* entering animations --------------------------------------- */
+/* scale up */
+@keyframes scaleUp {
+ from { opacity: 0.3; -webkit-transform: scale(0.8); }
+}
+
+/* slide in from the right */
+@keyframes slideInRight {
+ from { transform:translateX(100%); }
+ to { transform: translateX(0); }
+}
+
+/* slide in from the bottom */
+@keyframes slideInUp {
+ from { transform:translateY(100%); }
+ to { transform: translateY(0); }
+}
+
+.ng-enter { animation: scaleUp 0.5s both ease-in; z-index: 8888; }
+.ng-leave { animation: slideOutLeft 0.2s both ease-in; z-index: 9999; }
+
+
+
+
+.managerList {
+ list-style:none;
+ position: relative;
+ width: 100%;
+ margin-left: 20px;
+}
+
+.managerList > li {
+ width: 95%;
+ margin-top:10px;
+}
+
+.managerList ul {
+ list-style-type:none;
+ float:left;
+ padding: 0;
+}
+
+.managerList li {
+ list-style-type:none;
+ float:left;
+ padding: 0;
+}
+
+.managerList .head {
+ width: 90%;
+}
+
+.managerList .footer {
+ width: 90%;
+ margin-top: 10px;
+ margin-left: 50px;
+}
+
+.managerList .checkbox {
+ width: 50px;
+}
+
+.managerList .liCheck {
+ width: 50px;
+}
+
+.managerList .liContent {
+ width: 90%;
+}
+
+.managerList .preview {
+ width: 50%;
+ margin-left: 50px;
+ margin-top: 10px;
+}
+
+.managerList .logo {
+ margin-top: 9px;
+ width: 50px;
+}
+
+.managerList .content{
+ width: 50%;
+}
+
+.managerList .content ul{
+ width: 90%;
+}
+
+.managerList .butt{
+ /*width: 20%;*/
+}
+
+.badgeCustomer {
+ background-color:#f44336;
+ margin-top:23px;
+}
+
+.chatPanel {
+ width: 90%;
+ float: left;
+ border: 1px solid #d4d4d4;
+ border-radius: 2px;
+ padding: 20px;
+ position: relative;
+ -webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.175);
+ box-shadow: 0 1px 6px rgba(0, 0, 0, 0.175);
+ float: right;
+}
+
+.chatPanel:after{
+ position: absolute;
+ top: 27px;
+ right: -14px;
+ display: inline-block;
+ border-top: 14px solid transparent;
+ border-left: 14px solid #fff;
+ border-right: 0 solid #fff;
+ border-bottom: 14px solid transparent;
+ content: " ";
+}
+
+.chatPanel:before{
+ position: absolute;
+ top: 26px;
+ right: -15px;
+ display: inline-block;
+ border-top: 15px solid transparent;
+ border-left: 15px solid #ccc;
+ border-right: 0 solid #ccc;
+ border-bottom: 15px solid transparent;
+ content: " ";
+}
+
+.chatPanel-left {
+ float: left;
+}
+.chatPanel-left:before {
+ border-left-width: 0;
+ border-right-width: 15px;
+ left: -15px;
+ right: auto;
+}
+.chatPanel-left:after {
+ border-left-width: 0;
+ border-right-width: 14px;
+ left: -14px;
+ right: auto;
+}
+
+.xxs-avatar {
+ width: 10px;
+ height: 10px;
+}
+
+
+.xs-avatar {
+ width: 50px;
+ height: 50px;
+}
+
+.md-avatar {
+ width: 70px;
+ height: 70px;
+}
+
+.lg-avatar {
+ width: 100px;
+ height: 100px;
+}
+
+.text-truncate {
+ word-wrap: normal;
+ /* for IE */
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+.text-yellow {
+ color:#FFCC66;
+}
+
+.label-xl{
+ font-size:150%;
+}
+
+.pointer {
+ cursor: pointer;
+}
+
+.limit_height{
+ height: 600px;overflow-y:auto;overflow-x:hidden;
+}
+
+.table.text-middle>tbody>tr>td,.table.text-middle>tbody>tr>th{
+ vertical-align: middle;
+}
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/style/btn.css
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/style/btn.css b/rocketmq-console/src/main/resources/static/style/btn.css
new file mode 100644
index 0000000..29d4186
--- /dev/null
+++ b/rocketmq-console/src/main/resources/static/style/btn.css
@@ -0,0 +1,752 @@
+
+.btn,
+.navbar .navbar-nav > li > a.btn {
+ border: none;
+ border-radius: 3px;
+ position: relative;
+ padding: 12px 30px;
+ margin: 10px 1px;
+ font-size: 12px;
+ font-weight: 400;
+ text-transform: uppercase;
+ letter-spacing: 0;
+ will-change: box-shadow, transform;
+ transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+}
+.btn::-moz-focus-inner,
+.navbar .navbar-nav > li > a.btn::-moz-focus-inner {
+ border: 0;
+}
+.btn, .btn.btn-default,
+.navbar .navbar-nav > li > a.btn,
+.navbar .navbar-nav > li > a.btn.btn-default {
+ box-shadow: 0 2px 2px 0 rgba(153, 153, 153, 0.14), 0 3px 1px -2px rgba(153, 153, 153, 0.2), 0 1px 5px 0 rgba(153, 153, 153, 0.12);
+}
+.btn, .btn:hover, .btn:focus, .btn:active, .btn.active, .btn:active:focus, .btn:active:hover, .btn.active:focus, .btn.active:hover, .open > .btn.dropdown-toggle, .open > .btn.dropdown-toggle:focus, .open > .btn.dropdown-toggle:hover, .btn.btn-default, .btn.btn-default:hover, .btn.btn-default:focus, .btn.btn-default:active, .btn.btn-default.active, .btn.btn-default:active:focus, .btn.btn-default:active:hover, .btn.btn-default.active:focus, .btn.btn-default.active:hover, .open > .btn.btn-default.dropdown-toggle, .open > .btn.btn-default.dropdown-toggle:focus, .open > .btn.btn-default.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn,
+.navbar .navbar-nav > li > a.btn:hover,
+.navbar .navbar-nav > li > a.btn:focus,
+.navbar .navbar-nav > li > a.btn:active,
+.navbar .navbar-nav > li > a.btn.active,
+.navbar .navbar-nav > li > a.btn:active:focus,
+.navbar .navbar-nav > li > a.btn:active:hover,
+.navbar .navbar-nav > li > a.btn.active:focus,
+.navbar .navbar-nav > li > a.btn.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn.btn-default,
+.navbar .navbar-nav > li > a.btn.btn-default:hover,
+.navbar .navbar-nav > li > a.btn.btn-default:focus,
+.navbar .navbar-nav > li > a.btn.btn-default:active,
+.navbar .navbar-nav > li > a.btn.btn-default.active,
+.navbar .navbar-nav > li > a.btn.btn-default:active:focus,
+.navbar .navbar-nav > li > a.btn.btn-default:active:hover,
+.navbar .navbar-nav > li > a.btn.btn-default.active:focus,
+.navbar .navbar-nav > li > a.btn.btn-default.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.btn-default.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.btn-default.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.btn-default.dropdown-toggle:hover {
+ background-color: #999999;
+ color: #FFFFFF;
+}
+.btn:focus, .btn:active, .btn:hover, .btn.btn-default:focus, .btn.btn-default:active, .btn.btn-default:hover,
+.navbar .navbar-nav > li > a.btn:focus,
+.navbar .navbar-nav > li > a.btn:active,
+.navbar .navbar-nav > li > a.btn:hover,
+.navbar .navbar-nav > li > a.btn.btn-default:focus,
+.navbar .navbar-nav > li > a.btn.btn-default:active,
+.navbar .navbar-nav > li > a.btn.btn-default:hover {
+ box-shadow: 0 14px 26px -12px rgba(153, 153, 153, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(153, 153, 153, 0.2);
+}
+.btn.disabled, .btn.disabled:hover, .btn.disabled:focus, .btn.disabled.focus, .btn.disabled:active, .btn.disabled.active, .btn:disabled, .btn:disabled:hover, .btn:disabled:focus, .btn:disabled.focus, .btn:disabled:active, .btn:disabled.active, .btn[disabled], .btn[disabled]:hover, .btn[disabled]:focus, .btn[disabled].focus, .btn[disabled]:active, .btn[disabled].active, fieldset[disabled] .btn, fieldset[disabled] .btn:hover, fieldset[disabled] .btn:focus, fieldset[disabled] .btn.focus, fieldset[disabled] .btn:active, fieldset[disabled] .btn.active, .btn.btn-default.disabled, .btn.btn-default.disabled:hover, .btn.btn-default.disabled:focus, .btn.btn-default.disabled.focus, .btn.btn-default.disabled:active, .btn.btn-default.disabled.active, .btn.btn-default:disabled, .btn.btn-default:disabled:hover, .btn.btn-default:disabled:focus, .btn.btn-default:disabled.focus, .btn.btn-default:disabled:active, .btn.btn-default:disabled.active, .btn.btn-default[disabled], .btn.btn-default[disabled]:
hover, .btn.btn-default[disabled]:focus, .btn.btn-default[disabled].focus, .btn.btn-default[disabled]:active, .btn.btn-default[disabled].active, fieldset[disabled] .btn.btn-default, fieldset[disabled] .btn.btn-default:hover, fieldset[disabled] .btn.btn-default:focus, fieldset[disabled] .btn.btn-default.focus, fieldset[disabled] .btn.btn-default:active, fieldset[disabled] .btn.btn-default.active,
+.navbar .navbar-nav > li > a.btn.disabled,
+.navbar .navbar-nav > li > a.btn.disabled:hover,
+.navbar .navbar-nav > li > a.btn.disabled:focus,
+.navbar .navbar-nav > li > a.btn.disabled.focus,
+.navbar .navbar-nav > li > a.btn.disabled:active,
+.navbar .navbar-nav > li > a.btn.disabled.active,
+.navbar .navbar-nav > li > a.btn:disabled,
+.navbar .navbar-nav > li > a.btn:disabled:hover,
+.navbar .navbar-nav > li > a.btn:disabled:focus,
+.navbar .navbar-nav > li > a.btn:disabled.focus,
+.navbar .navbar-nav > li > a.btn:disabled:active,
+.navbar .navbar-nav > li > a.btn:disabled.active,
+.navbar .navbar-nav > li > a.btn[disabled],
+.navbar .navbar-nav > li > a.btn[disabled]:hover,
+.navbar .navbar-nav > li > a.btn[disabled]:focus,
+.navbar .navbar-nav > li > a.btn[disabled].focus,
+.navbar .navbar-nav > li > a.btn[disabled]:active,
+.navbar .navbar-nav > li > a.btn[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.active,
+.navbar .navbar-nav > li > a.btn.btn-default.disabled,
+.navbar .navbar-nav > li > a.btn.btn-default.disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-default.disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-default.disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-default.disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-default.disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-default:disabled,
+.navbar .navbar-nav > li > a.btn.btn-default:disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-default:disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-default:disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-default:disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-default:disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-default[disabled],
+.navbar .navbar-nav > li > a.btn.btn-default[disabled]:hover,
+.navbar .navbar-nav > li > a.btn.btn-default[disabled]:focus,
+.navbar .navbar-nav > li > a.btn.btn-default[disabled].focus,
+.navbar .navbar-nav > li > a.btn.btn-default[disabled]:active,
+.navbar .navbar-nav > li > a.btn.btn-default[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-default, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-default:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-default:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-default.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-default:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-default.active {
+ box-shadow: none;
+}
+.btn.btn-simple, .btn.btn-default.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-default.btn-simple {
+ background-color: transparent;
+ color: #999999;
+ box-shadow: none;
+}
+.btn.btn-simple:hover, .btn.btn-simple:focus, .btn.btn-simple:active, .btn.btn-default.btn-simple:hover, .btn.btn-default.btn-simple:focus, .btn.btn-default.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-default.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-default.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-default.btn-simple:active {
+ background-color: transparent;
+ color: #999999;
+}
+.btn.btn-primary,
+.navbar .navbar-nav > li > a.btn.btn-primary {
+ box-shadow: 0 2px 2px 0 rgba(156, 39, 176, 0.14), 0 3px 1px -2px rgba(156, 39, 176, 0.2), 0 1px 5px 0 rgba(156, 39, 176, 0.12);
+}
+.btn.btn-primary, .btn.btn-primary:hover, .btn.btn-primary:focus, .btn.btn-primary:active, .btn.btn-primary.active, .btn.btn-primary:active:focus, .btn.btn-primary:active:hover, .btn.btn-primary.active:focus, .btn.btn-primary.active:hover, .open > .btn.btn-primary.dropdown-toggle, .open > .btn.btn-primary.dropdown-toggle:focus, .open > .btn.btn-primary.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary,
+.navbar .navbar-nav > li > a.btn.btn-primary:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary:active,
+.navbar .navbar-nav > li > a.btn.btn-primary.active,
+.navbar .navbar-nav > li > a.btn.btn-primary:active:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary:active:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary.active:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.btn-primary.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.btn-primary.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.btn-primary.dropdown-toggle:hover {
+ background-color: #9c27b0;
+ color: #FFFFFF;
+}
+.btn.btn-primary:focus, .btn.btn-primary:active, .btn.btn-primary:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary:active,
+.navbar .navbar-nav > li > a.btn.btn-primary:hover {
+ box-shadow: 0 14px 26px -12px rgba(156, 39, 176, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(156, 39, 176, 0.2);
+}
+.btn.btn-primary.disabled, .btn.btn-primary.disabled:hover, .btn.btn-primary.disabled:focus, .btn.btn-primary.disabled.focus, .btn.btn-primary.disabled:active, .btn.btn-primary.disabled.active, .btn.btn-primary:disabled, .btn.btn-primary:disabled:hover, .btn.btn-primary:disabled:focus, .btn.btn-primary:disabled.focus, .btn.btn-primary:disabled:active, .btn.btn-primary:disabled.active, .btn.btn-primary[disabled], .btn.btn-primary[disabled]:hover, .btn.btn-primary[disabled]:focus, .btn.btn-primary[disabled].focus, .btn.btn-primary[disabled]:active, .btn.btn-primary[disabled].active, fieldset[disabled] .btn.btn-primary, fieldset[disabled] .btn.btn-primary:hover, fieldset[disabled] .btn.btn-primary:focus, fieldset[disabled] .btn.btn-primary.focus, fieldset[disabled] .btn.btn-primary:active, fieldset[disabled] .btn.btn-primary.active,
+.navbar .navbar-nav > li > a.btn.btn-primary.disabled,
+.navbar .navbar-nav > li > a.btn.btn-primary.disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary.disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary.disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-primary.disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-primary.disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-primary:disabled,
+.navbar .navbar-nav > li > a.btn.btn-primary:disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary:disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary:disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-primary:disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-primary:disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-primary[disabled],
+.navbar .navbar-nav > li > a.btn.btn-primary[disabled]:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary[disabled]:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary[disabled].focus,
+.navbar .navbar-nav > li > a.btn.btn-primary[disabled]:active,
+.navbar .navbar-nav > li > a.btn.btn-primary[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-primary, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-primary:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-primary:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-primary.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-primary:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-primary.active {
+ box-shadow: none;
+}
+.btn.btn-primary.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-primary.btn-simple {
+ background-color: transparent;
+ color: #9c27b0;
+ box-shadow: none;
+}
+.btn.btn-primary.btn-simple:hover, .btn.btn-primary.btn-simple:focus, .btn.btn-primary.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-primary.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-primary.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-primary.btn-simple:active {
+ background-color: transparent;
+ color: #9c27b0;
+}
+.btn.btn-info,
+.navbar .navbar-nav > li > a.btn.btn-info {
+ box-shadow: 0 2px 2px 0 rgba(0, 188, 212, 0.14), 0 3px 1px -2px rgba(0, 188, 212, 0.2), 0 1px 5px 0 rgba(0, 188, 212, 0.12);
+}
+.btn.btn-info, .btn.btn-info:hover, .btn.btn-info:focus, .btn.btn-info:active, .btn.btn-info.active, .btn.btn-info:active:focus, .btn.btn-info:active:hover, .btn.btn-info.active:focus, .btn.btn-info.active:hover, .open > .btn.btn-info.dropdown-toggle, .open > .btn.btn-info.dropdown-toggle:focus, .open > .btn.btn-info.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn.btn-info,
+.navbar .navbar-nav > li > a.btn.btn-info:hover,
+.navbar .navbar-nav > li > a.btn.btn-info:focus,
+.navbar .navbar-nav > li > a.btn.btn-info:active,
+.navbar .navbar-nav > li > a.btn.btn-info.active,
+.navbar .navbar-nav > li > a.btn.btn-info:active:focus,
+.navbar .navbar-nav > li > a.btn.btn-info:active:hover,
+.navbar .navbar-nav > li > a.btn.btn-info.active:focus,
+.navbar .navbar-nav > li > a.btn.btn-info.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.btn-info.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.btn-info.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.btn-info.dropdown-toggle:hover {
+ background-color: #00bcd4;
+ color: #FFFFFF;
+}
+.btn.btn-info:focus, .btn.btn-info:active, .btn.btn-info:hover,
+.navbar .navbar-nav > li > a.btn.btn-info:focus,
+.navbar .navbar-nav > li > a.btn.btn-info:active,
+.navbar .navbar-nav > li > a.btn.btn-info:hover {
+ box-shadow: 0 14px 26px -12px rgba(0, 188, 212, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 188, 212, 0.2);
+}
+.btn.btn-info.disabled, .btn.btn-info.disabled:hover, .btn.btn-info.disabled:focus, .btn.btn-info.disabled.focus, .btn.btn-info.disabled:active, .btn.btn-info.disabled.active, .btn.btn-info:disabled, .btn.btn-info:disabled:hover, .btn.btn-info:disabled:focus, .btn.btn-info:disabled.focus, .btn.btn-info:disabled:active, .btn.btn-info:disabled.active, .btn.btn-info[disabled], .btn.btn-info[disabled]:hover, .btn.btn-info[disabled]:focus, .btn.btn-info[disabled].focus, .btn.btn-info[disabled]:active, .btn.btn-info[disabled].active, fieldset[disabled] .btn.btn-info, fieldset[disabled] .btn.btn-info:hover, fieldset[disabled] .btn.btn-info:focus, fieldset[disabled] .btn.btn-info.focus, fieldset[disabled] .btn.btn-info:active, fieldset[disabled] .btn.btn-info.active,
+.navbar .navbar-nav > li > a.btn.btn-info.disabled,
+.navbar .navbar-nav > li > a.btn.btn-info.disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-info.disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-info.disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-info.disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-info.disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-info:disabled,
+.navbar .navbar-nav > li > a.btn.btn-info:disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-info:disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-info:disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-info:disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-info:disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-info[disabled],
+.navbar .navbar-nav > li > a.btn.btn-info[disabled]:hover,
+.navbar .navbar-nav > li > a.btn.btn-info[disabled]:focus,
+.navbar .navbar-nav > li > a.btn.btn-info[disabled].focus,
+.navbar .navbar-nav > li > a.btn.btn-info[disabled]:active,
+.navbar .navbar-nav > li > a.btn.btn-info[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-info, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-info:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-info:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-info.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-info:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-info.active {
+ box-shadow: none;
+}
+.btn.btn-info.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-info.btn-simple {
+ background-color: transparent;
+ color: #00bcd4;
+ box-shadow: none;
+}
+.btn.btn-info.btn-simple:hover, .btn.btn-info.btn-simple:focus, .btn.btn-info.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-info.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-info.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-info.btn-simple:active {
+ background-color: transparent;
+ color: #00bcd4;
+}
+.btn.btn-success,
+.navbar .navbar-nav > li > a.btn.btn-success {
+ box-shadow: 0 2px 2px 0 rgba(76, 175, 80, 0.14), 0 3px 1px -2px rgba(76, 175, 80, 0.2), 0 1px 5px 0 rgba(76, 175, 80, 0.12);
+}
+.btn.btn-success, .btn.btn-success:hover, .btn.btn-success:focus, .btn.btn-success:active, .btn.btn-success.active, .btn.btn-success:active:focus, .btn.btn-success:active:hover, .btn.btn-success.active:focus, .btn.btn-success.active:hover, .open > .btn.btn-success.dropdown-toggle, .open > .btn.btn-success.dropdown-toggle:focus, .open > .btn.btn-success.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn.btn-success,
+.navbar .navbar-nav > li > a.btn.btn-success:hover,
+.navbar .navbar-nav > li > a.btn.btn-success:focus,
+.navbar .navbar-nav > li > a.btn.btn-success:active,
+.navbar .navbar-nav > li > a.btn.btn-success.active,
+.navbar .navbar-nav > li > a.btn.btn-success:active:focus,
+.navbar .navbar-nav > li > a.btn.btn-success:active:hover,
+.navbar .navbar-nav > li > a.btn.btn-success.active:focus,
+.navbar .navbar-nav > li > a.btn.btn-success.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.btn-success.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.btn-success.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.btn-success.dropdown-toggle:hover {
+ background-color: #4caf50;
+ color: #FFFFFF;
+}
+.btn.btn-success:focus, .btn.btn-success:active, .btn.btn-success:hover,
+.navbar .navbar-nav > li > a.btn.btn-success:focus,
+.navbar .navbar-nav > li > a.btn.btn-success:active,
+.navbar .navbar-nav > li > a.btn.btn-success:hover {
+ box-shadow: 0 14px 26px -12px rgba(76, 175, 80, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(76, 175, 80, 0.2);
+}
+.btn.btn-success.disabled, .btn.btn-success.disabled:hover, .btn.btn-success.disabled:focus, .btn.btn-success.disabled.focus, .btn.btn-success.disabled:active, .btn.btn-success.disabled.active, .btn.btn-success:disabled, .btn.btn-success:disabled:hover, .btn.btn-success:disabled:focus, .btn.btn-success:disabled.focus, .btn.btn-success:disabled:active, .btn.btn-success:disabled.active, .btn.btn-success[disabled], .btn.btn-success[disabled]:hover, .btn.btn-success[disabled]:focus, .btn.btn-success[disabled].focus, .btn.btn-success[disabled]:active, .btn.btn-success[disabled].active, fieldset[disabled] .btn.btn-success, fieldset[disabled] .btn.btn-success:hover, fieldset[disabled] .btn.btn-success:focus, fieldset[disabled] .btn.btn-success.focus, fieldset[disabled] .btn.btn-success:active, fieldset[disabled] .btn.btn-success.active,
+.navbar .navbar-nav > li > a.btn.btn-success.disabled,
+.navbar .navbar-nav > li > a.btn.btn-success.disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-success.disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-success.disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-success.disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-success.disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-success:disabled,
+.navbar .navbar-nav > li > a.btn.btn-success:disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-success:disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-success:disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-success:disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-success:disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-success[disabled],
+.navbar .navbar-nav > li > a.btn.btn-success[disabled]:hover,
+.navbar .navbar-nav > li > a.btn.btn-success[disabled]:focus,
+.navbar .navbar-nav > li > a.btn.btn-success[disabled].focus,
+.navbar .navbar-nav > li > a.btn.btn-success[disabled]:active,
+.navbar .navbar-nav > li > a.btn.btn-success[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-success, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-success:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-success:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-success.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-success:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-success.active {
+ box-shadow: none;
+}
+.btn.btn-success.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-success.btn-simple {
+ background-color: transparent;
+ color: #4caf50;
+ box-shadow: none;
+}
+.btn.btn-success.btn-simple:hover, .btn.btn-success.btn-simple:focus, .btn.btn-success.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-success.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-success.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-success.btn-simple:active {
+ background-color: transparent;
+ color: #4caf50;
+}
+.btn.btn-warning,
+.navbar .navbar-nav > li > a.btn.btn-warning {
+ box-shadow: 0 2px 2px 0 rgba(255, 152, 0, 0.14), 0 3px 1px -2px rgba(255, 152, 0, 0.2), 0 1px 5px 0 rgba(255, 152, 0, 0.12);
+}
+.btn.btn-warning, .btn.btn-warning:hover, .btn.btn-warning:focus, .btn.btn-warning:active, .btn.btn-warning.active, .btn.btn-warning:active:focus, .btn.btn-warning:active:hover, .btn.btn-warning.active:focus, .btn.btn-warning.active:hover, .open > .btn.btn-warning.dropdown-toggle, .open > .btn.btn-warning.dropdown-toggle:focus, .open > .btn.btn-warning.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning,
+.navbar .navbar-nav > li > a.btn.btn-warning:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning:active,
+.navbar .navbar-nav > li > a.btn.btn-warning.active,
+.navbar .navbar-nav > li > a.btn.btn-warning:active:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning:active:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning.active:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.btn-warning.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.btn-warning.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.btn-warning.dropdown-toggle:hover {
+ background-color: #ff9800;
+ color: #FFFFFF;
+}
+.btn.btn-warning:focus, .btn.btn-warning:active, .btn.btn-warning:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning:active,
+.navbar .navbar-nav > li > a.btn.btn-warning:hover {
+ box-shadow: 0 14px 26px -12px rgba(255, 152, 0, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(255, 152, 0, 0.2);
+}
+.btn.btn-warning.disabled, .btn.btn-warning.disabled:hover, .btn.btn-warning.disabled:focus, .btn.btn-warning.disabled.focus, .btn.btn-warning.disabled:active, .btn.btn-warning.disabled.active, .btn.btn-warning:disabled, .btn.btn-warning:disabled:hover, .btn.btn-warning:disabled:focus, .btn.btn-warning:disabled.focus, .btn.btn-warning:disabled:active, .btn.btn-warning:disabled.active, .btn.btn-warning[disabled], .btn.btn-warning[disabled]:hover, .btn.btn-warning[disabled]:focus, .btn.btn-warning[disabled].focus, .btn.btn-warning[disabled]:active, .btn.btn-warning[disabled].active, fieldset[disabled] .btn.btn-warning, fieldset[disabled] .btn.btn-warning:hover, fieldset[disabled] .btn.btn-warning:focus, fieldset[disabled] .btn.btn-warning.focus, fieldset[disabled] .btn.btn-warning:active, fieldset[disabled] .btn.btn-warning.active,
+.navbar .navbar-nav > li > a.btn.btn-warning.disabled,
+.navbar .navbar-nav > li > a.btn.btn-warning.disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning.disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning.disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-warning.disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-warning.disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-warning:disabled,
+.navbar .navbar-nav > li > a.btn.btn-warning:disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning:disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning:disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-warning:disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-warning:disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-warning[disabled],
+.navbar .navbar-nav > li > a.btn.btn-warning[disabled]:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning[disabled]:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning[disabled].focus,
+.navbar .navbar-nav > li > a.btn.btn-warning[disabled]:active,
+.navbar .navbar-nav > li > a.btn.btn-warning[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-warning, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-warning:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-warning:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-warning.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-warning:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-warning.active {
+ box-shadow: none;
+}
+.btn.btn-warning.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-warning.btn-simple {
+ background-color: transparent;
+ color: #ff9800;
+ box-shadow: none;
+}
+.btn.btn-warning.btn-simple:hover, .btn.btn-warning.btn-simple:focus, .btn.btn-warning.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-warning.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-warning.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-warning.btn-simple:active {
+ background-color: transparent;
+ color: #ff9800;
+}
+.btn.btn-danger,
+.navbar .navbar-nav > li > a.btn.btn-danger {
+ box-shadow: 0 2px 2px 0 rgba(244, 67, 54, 0.14), 0 3px 1px -2px rgba(244, 67, 54, 0.2), 0 1px 5px 0 rgba(244, 67, 54, 0.12);
+}
+.btn.btn-danger, .btn.btn-danger:hover, .btn.btn-danger:focus, .btn.btn-danger:active, .btn.btn-danger.active, .btn.btn-danger:active:focus, .btn.btn-danger:active:hover, .btn.btn-danger.active:focus, .btn.btn-danger.active:hover, .open > .btn.btn-danger.dropdown-toggle, .open > .btn.btn-danger.dropdown-toggle:focus, .open > .btn.btn-danger.dropdown-toggle:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger,
+.navbar .navbar-nav > li > a.btn.btn-danger:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger:active,
+.navbar .navbar-nav > li > a.btn.btn-danger.active,
+.navbar .navbar-nav > li > a.btn.btn-danger:active:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger:active:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger.active:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger.active:hover, .open >
+.navbar .navbar-nav > li > a.btn.btn-danger.dropdown-toggle, .open >
+.navbar .navbar-nav > li > a.btn.btn-danger.dropdown-toggle:focus, .open >
+.navbar .navbar-nav > li > a.btn.btn-danger.dropdown-toggle:hover {
+ background-color: #f44336;
+ color: #FFFFFF;
+}
+.btn.btn-danger:focus, .btn.btn-danger:active, .btn.btn-danger:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger:active,
+.navbar .navbar-nav > li > a.btn.btn-danger:hover {
+ box-shadow: 0 14px 26px -12px rgba(244, 67, 54, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(244, 67, 54, 0.2);
+}
+.btn.btn-danger.disabled, .btn.btn-danger.disabled:hover, .btn.btn-danger.disabled:focus, .btn.btn-danger.disabled.focus, .btn.btn-danger.disabled:active, .btn.btn-danger.disabled.active, .btn.btn-danger:disabled, .btn.btn-danger:disabled:hover, .btn.btn-danger:disabled:focus, .btn.btn-danger:disabled.focus, .btn.btn-danger:disabled:active, .btn.btn-danger:disabled.active, .btn.btn-danger[disabled], .btn.btn-danger[disabled]:hover, .btn.btn-danger[disabled]:focus, .btn.btn-danger[disabled].focus, .btn.btn-danger[disabled]:active, .btn.btn-danger[disabled].active, fieldset[disabled] .btn.btn-danger, fieldset[disabled] .btn.btn-danger:hover, fieldset[disabled] .btn.btn-danger:focus, fieldset[disabled] .btn.btn-danger.focus, fieldset[disabled] .btn.btn-danger:active, fieldset[disabled] .btn.btn-danger.active,
+.navbar .navbar-nav > li > a.btn.btn-danger.disabled,
+.navbar .navbar-nav > li > a.btn.btn-danger.disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger.disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger.disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-danger.disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-danger.disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-danger:disabled,
+.navbar .navbar-nav > li > a.btn.btn-danger:disabled:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger:disabled:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger:disabled.focus,
+.navbar .navbar-nav > li > a.btn.btn-danger:disabled:active,
+.navbar .navbar-nav > li > a.btn.btn-danger:disabled.active,
+.navbar .navbar-nav > li > a.btn.btn-danger[disabled],
+.navbar .navbar-nav > li > a.btn.btn-danger[disabled]:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger[disabled]:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger[disabled].focus,
+.navbar .navbar-nav > li > a.btn.btn-danger[disabled]:active,
+.navbar .navbar-nav > li > a.btn.btn-danger[disabled].active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-danger, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-danger:hover, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-danger:focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-danger.focus, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-danger:active, fieldset[disabled]
+.navbar .navbar-nav > li > a.btn.btn-danger.active {
+ box-shadow: none;
+}
+.btn.btn-danger.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-danger.btn-simple {
+ background-color: transparent;
+ color: #f44336;
+ box-shadow: none;
+}
+.btn.btn-danger.btn-simple:hover, .btn.btn-danger.btn-simple:focus, .btn.btn-danger.btn-simple:active,
+.navbar .navbar-nav > li > a.btn.btn-danger.btn-simple:hover,
+.navbar .navbar-nav > li > a.btn.btn-danger.btn-simple:focus,
+.navbar .navbar-nav > li > a.btn.btn-danger.btn-simple:active {
+ background-color: transparent;
+ color: #f44336;
+}
+.btn.btn-white, .btn.btn-white:focus, .btn.btn-white:hover,
+.navbar .navbar-nav > li > a.btn.btn-white,
+.navbar .navbar-nav > li > a.btn.btn-white:focus,
+.navbar .navbar-nav > li > a.btn.btn-white:hover {
+ background-color: #FFFFFF;
+ color: #999999;
+}
+.btn.btn-white.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-white.btn-simple {
+ color: #FFFFFF;
+ background: transparent;
+ box-shadow: none;
+}
+.btn.btn-facebook,
+.navbar .navbar-nav > li > a.btn.btn-facebook {
+ background-color: #3b5998;
+ color: #fff;
+ box-shadow: 0 2px 2px 0 rgba(59, 89, 152, 0.14), 0 3px 1px -2px rgba(59, 89, 152, 0.2), 0 1px 5px 0 rgba(59, 89, 152, 0.12);
+}
+.btn.btn-facebook:focus, .btn.btn-facebook:active, .btn.btn-facebook:hover,
+.navbar .navbar-nav > li > a.btn.btn-facebook:focus,
+.navbar .navbar-nav > li > a.btn.btn-facebook:active,
+.navbar .navbar-nav > li > a.btn.btn-facebook:hover {
+ background-color: #3b5998;
+ color: #fff;
+ box-shadow: 0 14px 26px -12px rgba(59, 89, 152, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(59, 89, 152, 0.2);
+}
+.btn.btn-facebook.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-facebook.btn-simple {
+ color: #3b5998;
+ background-color: transparent;
+ box-shadow: none;
+}
+.btn.btn-twitter,
+.navbar .navbar-nav > li > a.btn.btn-twitter {
+ background-color: #55acee;
+ color: #fff;
+ box-shadow: 0 2px 2px 0 rgba(85, 172, 238, 0.14), 0 3px 1px -2px rgba(85, 172, 238, 0.2), 0 1px 5px 0 rgba(85, 172, 238, 0.12);
+}
+.btn.btn-twitter:focus, .btn.btn-twitter:active, .btn.btn-twitter:hover,
+.navbar .navbar-nav > li > a.btn.btn-twitter:focus,
+.navbar .navbar-nav > li > a.btn.btn-twitter:active,
+.navbar .navbar-nav > li > a.btn.btn-twitter:hover {
+ background-color: #55acee;
+ color: #fff;
+ box-shadow: 0 14px 26px -12px rgba(85, 172, 238, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(85, 172, 238, 0.2);
+}
+.btn.btn-twitter.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-twitter.btn-simple {
+ color: #55acee;
+ background-color: transparent;
+ box-shadow: none;
+}
+.btn.btn-pinterest,
+.navbar .navbar-nav > li > a.btn.btn-pinterest {
+ background-color: #cc2127;
+ color: #fff;
+ box-shadow: 0 2px 2px 0 rgba(204, 33, 39, 0.14), 0 3px 1px -2px rgba(204, 33, 39, 0.2), 0 1px 5px 0 rgba(204, 33, 39, 0.12);
+}
+.btn.btn-pinterest:focus, .btn.btn-pinterest:active, .btn.btn-pinterest:hover,
+.navbar .navbar-nav > li > a.btn.btn-pinterest:focus,
+.navbar .navbar-nav > li > a.btn.btn-pinterest:active,
+.navbar .navbar-nav > li > a.btn.btn-pinterest:hover {
+ background-color: #cc2127;
+ color: #fff;
+ box-shadow: 0 14px 26px -12px rgba(204, 33, 39, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(204, 33, 39, 0.2);
+}
+.btn.btn-pinterest.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-pinterest.btn-simple {
+ color: #cc2127;
+ background-color: transparent;
+ box-shadow: none;
+}
+.btn.btn-google,
+.navbar .navbar-nav > li > a.btn.btn-google {
+ background-color: #dd4b39;
+ color: #fff;
+ box-shadow: 0 2px 2px 0 rgba(221, 75, 57, 0.14), 0 3px 1px -2px rgba(221, 75, 57, 0.2), 0 1px 5px 0 rgba(221, 75, 57, 0.12);
+}
+.btn.btn-google:focus, .btn.btn-google:active, .btn.btn-google:hover,
+.navbar .navbar-nav > li > a.btn.btn-google:focus,
+.navbar .navbar-nav > li > a.btn.btn-google:active,
+.navbar .navbar-nav > li > a.btn.btn-google:hover {
+ background-color: #dd4b39;
+ color: #fff;
+ box-shadow: 0 14px 26px -12px rgba(221, 75, 57, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(221, 75, 57, 0.2);
+}
+.btn.btn-google.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-google.btn-simple {
+ color: #dd4b39;
+ background-color: transparent;
+ box-shadow: none;
+}
+.btn.btn-instagram,
+.navbar .navbar-nav > li > a.btn.btn-instagram {
+ background-color: #125688;
+ color: #fff;
+ box-shadow: 0 2px 2px 0 rgba(18, 86, 136, 0.14), 0 3px 1px -2px rgba(18, 86, 136, 0.2), 0 1px 5px 0 rgba(18, 86, 136, 0.12);
+}
+.btn.btn-instagram:focus, .btn.btn-instagram:active, .btn.btn-instagram:hover,
+.navbar .navbar-nav > li > a.btn.btn-instagram:focus,
+.navbar .navbar-nav > li > a.btn.btn-instagram:active,
+.navbar .navbar-nav > li > a.btn.btn-instagram:hover {
+ background-color: #125688;
+ color: #fff;
+ box-shadow: 0 14px 26px -12px rgba(18, 86, 136, 0.42), 0 4px 23px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(18, 86, 136, 0.2);
+}
+.btn.btn-instagram.btn-simple,
+.navbar .navbar-nav > li > a.btn.btn-instagram.btn-simple {
+ color: #125688;
+ background-color: transparent;
+ box-shadow: none;
+}
+.btn:focus, .btn:active, .btn:active:focus,
+.navbar .navbar-nav > li > a.btn:focus,
+.navbar .navbar-nav > li > a.btn:active,
+.navbar .navbar-nav > li > a.btn:active:focus {
+ outline: 0;
+}
+.btn.btn-round,
+.navbar .navbar-nav > li > a.btn.btn-round {
+ border-radius: 30px;
+}
+.btn:not(.btn-just-icon):not(.btn-fab) .fa,
+.navbar .navbar-nav > li > a.btn:not(.btn-just-icon):not(.btn-fab) .fa {
+ font-size: 18px;
+ margin-top: -2px;
+ position: relative;
+ top: 2px;
+}
+.btn.btn-fab,
+.navbar .navbar-nav > li > a.btn.btn-fab {
+ border-radius: 50%;
+ font-size: 24px;
+ height: 56px;
+ margin: auto;
+ min-width: 56px;
+ width: 56px;
+ padding: 0;
+ overflow: hidden;
+ position: relative;
+ line-height: normal;
+}
+.btn.btn-fab .ripple-container,
+.navbar .navbar-nav > li > a.btn.btn-fab .ripple-container {
+ border-radius: 50%;
+}
+.btn.btn-fab.btn-fab-mini, .btn-group-sm .btn.btn-fab,
+.navbar .navbar-nav > li > a.btn.btn-fab.btn-fab-mini, .btn-group-sm
+.navbar .navbar-nav > li > a.btn.btn-fab {
+ height: 40px;
+ min-width: 40px;
+ width: 40px;
+}
+.btn.btn-fab.btn-fab-mini.material-icons, .btn-group-sm .btn.btn-fab.material-icons,
+.navbar .navbar-nav > li > a.btn.btn-fab.btn-fab-mini.material-icons, .btn-group-sm
+.navbar .navbar-nav > li > a.btn.btn-fab.material-icons {
+ top: -3.5px;
+ left: -3.5px;
+}
+.btn.btn-fab.btn-fab-mini .material-icons, .btn-group-sm .btn.btn-fab .material-icons,
+.navbar .navbar-nav > li > a.btn.btn-fab.btn-fab-mini .material-icons, .btn-group-sm
+.navbar .navbar-nav > li > a.btn.btn-fab .material-icons {
+ font-size: 17px;
+}
+.btn.btn-fab i.material-icons,
+.navbar .navbar-nav > li > a.btn.btn-fab i.material-icons {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-12px, -12px);
+ line-height: 24px;
+ width: 24px;
+ font-size: 24px;
+}
+.btn.btn-lg, .btn-group-lg .btn,
+.navbar .navbar-nav > li > a.btn.btn-lg, .btn-group-lg
+.navbar .navbar-nav > li > a.btn {
+ font-size: 14px;
+ padding: 18px 36px;
+}
+.btn.btn-sm, .btn-group-sm .btn,
+.navbar .navbar-nav > li > a.btn.btn-sm, .btn-group-sm
+.navbar .navbar-nav > li > a.btn {
+ padding: 5px 20px;
+ font-size: 11px;
+}
+.btn.btn-xs, .btn-group-xs .btn,
+.navbar .navbar-nav > li > a.btn.btn-xs, .btn-group-xs
+.navbar .navbar-nav > li > a.btn {
+ padding: 4px 15px;
+ font-size: 10px;
+}
+.btn.btn-just-icon,
+.navbar .navbar-nav > li > a.btn.btn-just-icon {
+ font-size: 20px;
+ padding: 12px 12px;
+ line-height: 1em;
+}
+.btn.btn-just-icon i,
+.navbar .navbar-nav > li > a.btn.btn-just-icon i {
+ width: 20px;
+}
+.btn.btn-just-icon.btn-lg,
+.navbar .navbar-nav > li > a.btn.btn-just-icon.btn-lg {
+ font-size: 22px;
+ padding: 13px 18px;
+}
+
+.btn .material-icons {
+ vertical-align: middle;
+ font-size: 17px;
+ top: -1px;
+ position: relative;
+}
+
+.navbar .navbar-nav > li > a.btn {
+ margin-top: 2px;
+ margin-bottom: 2px;
+}
+.navbar .navbar-nav > li > a.btn.btn-fab {
+ margin: 5px 2px;
+}
+.navbar .navbar-nav > li > a:not(.btn) .material-icons {
+ margin-top: -3px;
+ top: 0px;
+ position: relative;
+ margin-right: 3px;
+}
+.navbar .navbar-nav > li > .profile-photo {
+ margin: 5px 2px;
+}
+
+.navbar-default:not(.navbar-transparent) .navbar-nav > li > a.btn.btn-white.btn-simple {
+ color: #555555;
+}
+
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ margin: 10px 1px;
+}
+.btn-group.open > .dropdown-toggle.btn, .btn-group.open > .dropdown-toggle.btn.btn-default,
+.btn-group-vertical.open > .dropdown-toggle.btn,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-default {
+ background-color: #FFFFFF;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-inverse,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-inverse {
+ background-color: #212121;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-primary,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-primary {
+ background-color: #9c27b0;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-success,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-success {
+ background-color: #4caf50;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-info,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-info {
+ background-color: #00bcd4;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-warning,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-warning {
+ background-color: #ff9800;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-danger,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-danger {
+ background-color: #f44336;
+}
+.btn-group.open > .dropdown-toggle.btn.btn-rose,
+.btn-group-vertical.open > .dropdown-toggle.btn.btn-rose {
+ background-color: #e91e63;
+}
+.btn-group .dropdown-menu,
+.btn-group-vertical .dropdown-menu {
+ border-radius: 0 0 3px 3px;
+}
+.btn-group.btn-group-raised,
+.btn-group-vertical.btn-group-raised {
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
+}
+.btn-group .btn + .btn,
+.btn-group .btn,
+.btn-group .btn:active,
+.btn-group .btn-group,
+.btn-group-vertical .btn + .btn,
+.btn-group-vertical .btn,
+.btn-group-vertical .btn:active,
+.btn-group-vertical .btn-group {
+ margin: 0;
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/e218eef9/rocketmq-console/src/main/resources/static/style/img/alipay.png
----------------------------------------------------------------------
diff --git a/rocketmq-console/src/main/resources/static/style/img/alipay.png b/rocketmq-console/src/main/resources/static/style/img/alipay.png
new file mode 100644
index 0000000..8d72f26
Binary files /dev/null and b/rocketmq-console/src/main/resources/static/style/img/alipay.png differ