You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2015/10/16 14:16:00 UTC

[3/7] karaf-decanter git commit: [KARAF-3904] Add elasticsearch-head feature

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/c4719b9d/elasticsearch-head/src/main/resources/fonts/fontawesome-webfont.ttf
----------------------------------------------------------------------
diff --git a/elasticsearch-head/src/main/resources/fonts/fontawesome-webfont.ttf b/elasticsearch-head/src/main/resources/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..e89738d
Binary files /dev/null and b/elasticsearch-head/src/main/resources/fonts/fontawesome-webfont.ttf differ

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/c4719b9d/elasticsearch-head/src/main/resources/fonts/fontawesome-webfont.woff
----------------------------------------------------------------------
diff --git a/elasticsearch-head/src/main/resources/fonts/fontawesome-webfont.woff b/elasticsearch-head/src/main/resources/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..8c1748a
Binary files /dev/null and b/elasticsearch-head/src/main/resources/fonts/fontawesome-webfont.woff differ

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/c4719b9d/elasticsearch-head/src/main/resources/i18n.js
----------------------------------------------------------------------
diff --git a/elasticsearch-head/src/main/resources/i18n.js b/elasticsearch-head/src/main/resources/i18n.js
new file mode 100644
index 0000000..de0fc51
--- /dev/null
+++ b/elasticsearch-head/src/main/resources/i18n.js
@@ -0,0 +1,93 @@
+(function() {
+	/**
+	 * provides text formatting and i18n key storage features<br>
+	 * implements most of the Sun Java MessageFormat functionality.
+	 * @see <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat.html" target="sun">Sun's Documentation</a>
+	 */
+
+	var keys = {};
+
+	var format = function(message, args) {
+		var substitute = function() {
+			var format = arguments[1].split(',');
+			var substr = escape(args[format.shift()]);
+			if(format.length === 0) {
+				return substr; // simple substitution eg {0}
+			}
+			switch(format.shift()) {
+				case "number" : return (new Number(substr)).toLocaleString();
+				case "date" : return (new Date(+substr)).toLocaleDateString(); // date and time require milliseconds since epoch
+				case "time" : return (new Date(+substr)).toLocaleTimeString(); //  eg i18n.text("Key", +(new Date())); for current time
+			}
+			var styles = format.join("").split("|").map(function(style) {
+				return style.match(/(-?[\.\d]+)(#|<)([^{}]*)/);
+			});
+			var match = styles[0][3];
+			for(var i=0; i<styles.length; i++) {
+				if((styles[i][2] === "#" && (+styles[i][1]) === (+substr)) ||
+						(styles[i][2] === "<" && ((+styles[i][1]) < (+substr)))) {
+					match = styles[i][3];
+				}
+			}
+			return match;
+		};
+
+		return message && message.replace(/'(')|'([^']+)'|([^{']+)|([^']+)/g, function(x, sq, qs, ss, sub) {
+			do {} while(sub && (sub !== (sub = (sub.replace(/\{([^{}]+)\}/, substitute)))));
+			return sq || qs || ss || unescape(sub);
+		});
+	};
+
+	this.i18n = {
+
+		setKeys: function(strings) {
+			for(var key in strings) {
+				keys[key] = strings[key];
+			}
+		},
+
+		text: function() {
+			var args = Array.prototype.slice.call(arguments),
+				key = keys[args.shift()];
+			if(args.length === 0) {
+				return key;
+			}
+			return format(key, args);
+		},
+
+		complex: function() {
+			var args = Array.prototype.slice.call(arguments),
+				key = keys[args.shift()],
+				ret = [],
+				replacer = function(x, pt, sub) { ret.push(pt || args[+sub]); return ""; };
+			do {} while(key && key !== (key = key.replace(/([^{]+)|\{(\d+)\}/, replacer )));
+			return ret;
+		}
+
+	};
+
+})();
+
+(function() {
+	var nav = window.navigator;
+	var userLang = ( nav.languages && nav.languages[0] ) || nav.language || nav.userLanguage;
+	var scripts = document.getElementsByTagName('script');
+	var data = scripts[ scripts.length - 1].dataset;
+	if( ! data["langs"] ) {
+		return;
+	}
+	var langs = data["langs"].split(/\s*,\s*/);
+	var script0 = scripts[0];
+	function install( lang ) {
+		var s = document.createElement("script");
+		s.src = data["basedir"] + "/" + lang + '_strings.js';
+		s.async = false;
+		script0.parentNode.appendChild(s);
+		script0 = s;
+	}
+
+	install( langs.shift() ); // always install primary language
+	userLang && langs
+		.filter( function( lang ) { return userLang.indexOf( lang ) === 0; } )
+		.forEach( install );
+}());

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/c4719b9d/elasticsearch-head/src/main/resources/index.html
----------------------------------------------------------------------
diff --git a/elasticsearch-head/src/main/resources/index.html b/elasticsearch-head/src/main/resources/index.html
new file mode 100644
index 0000000..82e8b5f
--- /dev/null
+++ b/elasticsearch-head/src/main/resources/index.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+
+<html>
+	<head>
+		<meta charset="UTF-8">
+		<title>elasticsearch-head</title>
+		<link rel="stylesheet" href="base/reset.css">
+		<link rel="stylesheet" href="vendor.css">
+		<link rel="stylesheet" href="app.css">
+		<script src="i18n.js" data-baseDir="lang" data-langs="en,fr,pt,zh"></script>
+		<script src="vendor.js"></script>
+		<script src="app.js"></script>
+		<script>
+			window.onload = function() {
+				if(location.href.contains("/_plugin/")) {
+					var base_uri = location.href.replace(/_plugin\/.*/, '');
+				}
+				var args = location.search.substring(1).split("&").reduce(function(r, p) {
+					r[decodeURIComponent(p.split("=")[0])] = decodeURIComponent(p.split("=")[1]); return r;
+				}, {});
+				new app.App("body", {
+					id: "es",
+					base_uri: args["base_uri"] || base_uri,
+					auth_user : args["auth_user"] || "",
+					auth_password : args["auth_password"],
+					dashboard: args["dashboard"]
+				});
+			};
+		</script>
+		<link rel="icon" href="base/favicon.png" type="image/png">
+	</head>
+	<body></body>
+</html>

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/c4719b9d/elasticsearch-head/src/main/resources/lang/en_strings.js
----------------------------------------------------------------------
diff --git a/elasticsearch-head/src/main/resources/lang/en_strings.js b/elasticsearch-head/src/main/resources/lang/en_strings.js
new file mode 100644
index 0000000..a8f3047
--- /dev/null
+++ b/elasticsearch-head/src/main/resources/lang/en_strings.js
@@ -0,0 +1,174 @@
+i18n.setKeys({
+	"General.Elasticsearch": "Elasticsearch",
+	"General.LoadingFacets": "Loading Facets...",
+	"General.Searching": "Searching...",
+	"General.Search": "Search",
+	"General.Help": "Help",
+	"General.HelpGlyph": "?",
+	"General.CloseGlyph": "X",
+	"General.RefreshResults": "Refresh",
+	"General.ManualRefresh": "Manual Refresh",
+	"General.RefreshQuickly": "Refresh quickly",
+	"General.Refresh5seconds": "Refresh every 5 seconds",
+	"General.Refresh1minute": "Refresh every minute",
+	"AliasForm.AliasName": "Alias Name",
+	"AliasForm.NewAliasForIndex": "New Alias for {0}",
+	"AliasForm.DeleteAliasMessage": "type ''{0}'' to delete {1}. There is no undo",
+	"AnyRequest.DisplayOptions" : "Display Options",
+	"AnyRequest.AsGraph" : "Graph Results",
+	"AnyRequest.AsJson" : "Show Raw JSON",
+	"AnyRequest.AsTable" : "Show Search Results Table",
+	"AnyRequest.History" : "History",
+	"AnyRequest.RepeatRequest" : "Repeat Request",
+	"AnyRequest.RepeatRequestSelect" : "Repeat request every ",
+	"AnyRequest.Transformer" : "Result Transformer",
+	"AnyRequest.Pretty": "Pretty",
+	"AnyRequest.Query" : "Query",
+	"AnyRequest.Request": "Request",
+	"AnyRequest.Requesting": "Requesting...",
+	"AnyRequest.ValidateJSON": "Validate JSON",
+	"Browser.Title": "Browser",
+	"Browser.ResultSourcePanelTitle": "Result Source",
+	"Command.DELETE": "DELETE",
+	"Command.SHUTDOWN": "SHUTDOWN",
+	"Command.DeleteAliasMessage": "Delete Alias?",
+	"ClusterOverView.IndexName": "Index Name",
+	"ClusterOverview.NumShards": "Number of Shards",
+	"ClusterOverview.NumReplicas": "Number of Replicas",
+	"ClusterOverview.NewIndex": "New Index",
+	"IndexActionsMenu.Title": "Actions",
+	"IndexActionsMenu.NewAlias": "New Alias...",
+	"IndexActionsMenu.Refresh": "Refresh",
+	"IndexActionsMenu.Flush": "Flush",
+	"IndexActionsMenu.Optimize": "Optimize...",
+	"IndexActionsMenu.Snapshot": "Gateway Snapshot",
+	"IndexActionsMenu.Analyser": "Test Analyser",
+	"IndexActionsMenu.Open": "Open",
+	"IndexActionsMenu.Close": "Close",
+	"IndexActionsMenu.Delete": "Delete...",
+	"IndexInfoMenu.Title": "Info",
+	"IndexInfoMenu.Status": "Index Status",
+	"IndexInfoMenu.Metadata": "Index Metadata",
+	"IndexCommand.TextToAnalyze": "Text to Analyse",
+	"IndexCommand.ShutdownMessage": "type ''{0}'' to shutdown {1}. Node can NOT be restarted from this interface",
+	"IndexOverview.PageTitle": "Indices Overview",
+	"IndexSelector.NameWithDocs": "{0} ({1} docs)",
+	"IndexSelector.SearchIndexForDocs": "Search {0} for documents where:",
+	"FilterBrowser.OutputType": "Output Results: {0}",
+	"FilterBrowser.OutputSize": "Number of Results: {0}",
+	"Header.ClusterHealth": "cluster health: {0} ({1} of {2})",
+	"Header.ClusterNotConnected": "cluster health: not connected",
+	"Header.Connect": "Connect",
+	"Nav.AnyRequest": "Any Request",
+	"Nav.Browser": "Browser",
+	"Nav.ClusterHealth": "Cluster Health",
+	"Nav.ClusterState": "Cluster State",
+	"Nav.ClusterNodes": "Cluster Nodes",
+	"Nav.Info": "Info",
+	"Nav.NodeStats": "Node Stats",
+	"Nav.Overview": "Overview",
+	"Nav.Indices": "Indices",
+	"Nav.Plugins": "Plugins",
+	"Nav.Status": "Status",
+	"Nav.Templates": "Templates",
+	"Nav.StructuredQuery": "Structured Query",
+	"NodeActionsMenu.Title": "Actions",
+	"NodeActionsMenu.Shutdown": "Shutdown...",
+	"NodeInfoMenu.Title": "Info",
+	"NodeInfoMenu.ClusterNodeInfo": "Cluster Node Info",
+	"NodeInfoMenu.NodeStats": "Node Stats",
+	"NodeType.Client": "Client Node",
+	"NodeType.Coord": "Coordinator",
+	"NodeType.Master": "Master Node",
+	"NodeType.Tribe": "Tribe Node",
+	"NodeType.Worker": "Worker Node",
+	"NodeType.Unassigned": "Unassigned",
+	"OptimizeForm.OptimizeIndex": "Optimize {0}",
+	"OptimizeForm.MaxSegments": "Maximum # Of Segments",
+	"OptimizeForm.ExpungeDeletes": "Only Expunge Deletes",
+	"OptimizeForm.FlushAfter": "Flush After Optimize",
+	"OptimizeForm.WaitForMerge": "Wait For Merge",
+	"Overview.PageTitle" : "Cluster Overview",
+	"Output.JSON": "JSON",
+	"Output.Table": "Table",
+	"Output.CSV": "CSV",
+	"Output.ShowSource": "Show query source",
+	"Preference.SortCluster": "Sort Cluster",
+	"Sort.ByName": "By Name",
+	"Sort.ByAddress": "By Address",
+	"Sort.ByType": "By Type",
+	"Preference.ViewAliases": "View Aliases",
+	"ViewAliases.Grouped": "Grouped",
+	"ViewAliases.List": "List",
+	"ViewAliases.None": "None",
+	"Overview.IndexFilter": "Index Filter",
+	"TableResults.Summary": "Searched {0} of {1} shards. {2} hits. {3} seconds",
+	"QueryFilter.AllIndices": "All Indices",
+	"QueryFilter.AnyValue": "any",
+	"QueryFilter-Header-Indices": "Indices",
+	"QueryFilter-Header-Types": "Types",
+	"QueryFilter-Header-Fields": "Fields",
+	"QueryFilter.DateRangeHint.from": "From : {0}",
+	"QueryFilter.DateRangeHint.to": "  To : {0}",
+	"Query.FailAndUndo": "Query Failed. Undoing last changes",
+	"StructuredQuery.ShowRawJson": "Show Raw JSON"
+});
+
+i18n.setKeys({
+	"AnyRequest.TransformerHelp" : "\
+		<p>The Result Transformer can be used to post process the raw json results from a request into a more useful format.</p>\
+		<p>The transformer should contain the body of a javascript function. The return value from the function becomes the new value passed to the json printer</p>\
+		<p>Example:<br>\
+		  <code>return root.hits.hits[0];</code> would traverse a result set to show just the first match<br>\
+		  <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code> would return the total memory used across an entire cluster<br></p>\
+		<p>The following functions are available and can be useful processing arrays and objects<br>\
+		<ul>\
+			<li><i>Object.keys</i>(object) := array</li>\
+			<li>array.<i>forEach</i>(function(prop, index))</li>\
+			<li>array.<i>map</i>(function(prop, index)) := array</li>\
+			<li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\
+		</ul>\
+		<p>When Repeat Request is running, an extra parameter called prev is passed to the transformation function. This allows comparisons, and cumulative graphing</p>\
+		<p>Example:<br>\
+		<code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code> would return the load average on the first cluster node over the last minute\
+		This could be fed into the Graph to produce a load graph for the node\
+		"
+});
+
+i18n.setKeys({
+	"AnyRequest.DisplayOptionsHelp" : "\
+		<p>Raw Json: shows complete results of the query and transformation in raw JSON format </p>\
+		<p>Graph Results: To produce a graph of your results, use the result transformer to produce an array of values</p>\
+		<p>Search Results Table: If your query is a search, you can display the results of the search in a table.</p>\
+		"
+});
+
+i18n.setKeys({
+	"QueryFilter.DateRangeHelp" : "\
+		<p>Date fields accept a natural language query to produce a From and To date that form a range that the results are queried over.</p>\
+		<p>The following formats are supported:</p>\
+		<ul>\
+			<li><b>Keywords / Key Phrases</b><br>\
+				<code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\
+				searches for dates matching the keyword. <code>last year</code> would search all of last year.</li>\
+			<li><b>Ranges</b><br>\
+				<code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (spaces optional, many synonyms for range qualifiers)<br>\
+				Create a search range centered on <code>now</code> extending into the past and future by the amount specified.</li>\
+			<li><b>DateTime and Partial DateTime</b><br>\
+				<code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\
+				these formats specify a specific date range. <code>2011</code> would search the whole of 2011, while <code>2011-01-18 12:32:45</code> would only search for results in that 1 second range</li>\
+			<li><b>Time and Time Partials</b><br>\
+				<code>12<br> 12:32<br> 12:32:45</code><br>\
+				these formats search for a particular time during the current day. <code>12:32</code> would search that minute during today</li>\
+			<li><b>Date Ranges</b><br>\
+				<code>2010 -&gt; 2011<br> last week -&gt; next week<br> 2011-05 -&gt;<br> &lt; now</code><br>\
+				A Date Range is created by specifying two dates in any format (Keyword / DateTime / Time) separated by &lt; or -&gt; (both do the same thing). If either end of the date range is missing, it is the same as having no constraint in that direction.</li>\
+			<li><b>Date Range using Offset</b><br>\
+				<code>2010 -> 1yr<br> 3mins < now</code>\
+				Searches the specified date including the range in the direction specified.</li>\
+			<li><b>Anchored Ranges</b><br>\
+				<code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\
+				Similar to above except the range is extend in both directions from the anchor date</li>\
+		</ul>\
+	"
+});

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/c4719b9d/elasticsearch-head/src/main/resources/lang/fr_strings.js
----------------------------------------------------------------------
diff --git a/elasticsearch-head/src/main/resources/lang/fr_strings.js b/elasticsearch-head/src/main/resources/lang/fr_strings.js
new file mode 100644
index 0000000..b4ebb09
--- /dev/null
+++ b/elasticsearch-head/src/main/resources/lang/fr_strings.js
@@ -0,0 +1,164 @@
+i18n.setKeys({
+//	"General.Elasticsearch": "Elasticsearch",
+	"General.LoadingFacets" : "Chargement des facettes...",
+	"General.Searching": "Recherche en cours...",
+	"General.Search": "Recherche",
+	"General.Help": "Aide",
+//	"General.HelpGlyph": "?",
+//	"General.CloseGlyph": "X",
+	"General.RefreshResults": "Rafraîchir",
+	"General.ManualRefresh": "Rafraîchissement manuel",
+	"General.RefreshQuickly": "Rafraîchissement rapide",
+	"General.Refresh5seconds": "Rafraîchissement toutes les 5 secondes",
+	"General.Refresh1minute": "Rafraîchissement toutes les minutes",
+	"AliasForm.AliasName": "Alias",
+	"AliasForm.NewAliasForIndex": "Nouvel Alias pour {0}",
+	"AliasForm.DeleteAliasMessage": "Entrez ''{0}'' pour effacer {1}. Attention, action irréversible.",
+	"AnyRequest.DisplayOptions" : "Options d'affichage",
+	"AnyRequest.AsGraph" : "En graphe",
+	"AnyRequest.AsJson" : "En JSON brut",
+	"AnyRequest.AsTable" : "En tableau",
+	"AnyRequest.History" : "Historique",
+	"AnyRequest.RepeatRequest" : "Répétition automatique de la requête",
+	"AnyRequest.RepeatRequestSelect" : "Répéter la requête toutes les ",
+	"AnyRequest.Transformer" : "Transformation des résultats",
+//	"AnyRequest.Pretty": "Pretty",
+	"AnyRequest.Query" : "Recherche",
+	"AnyRequest.Request": "Requête",
+	"AnyRequest.Requesting": "Requête en cours...",
+	"AnyRequest.ValidateJSON": "Valider le JSON",
+	"Browser.Title": "Navigateur",
+	"Browser.ResultSourcePanelTitle": "Résultat au format JSON",
+	"Command.DELETE": "SUPPRIMER",
+	"Command.SHUTDOWN": "ETEINDRE",
+	"Command.DeleteAliasMessage": "Supprimer l'Alias?",
+	"ClusterOverView.IndexName": "Index",
+	"ClusterOverview.NumShards": "Nombre de shards",
+	"ClusterOverview.NumReplicas": "Nombre de replica",
+	"ClusterOverview.NewIndex": "Nouvel Index",
+//	"IndexActionsMenu.Title": "Actions",
+	"IndexActionsMenu.NewAlias": "Nouvel Alias...",
+	"IndexActionsMenu.Refresh": "Rafraîchir",
+	"IndexActionsMenu.Flush": "Flusher",
+	"IndexActionsMenu.Optimize": "Optimiser...",
+	"IndexActionsMenu.Snapshot": "Dupliquer l'index (Snapshot)",
+	"IndexActionsMenu.Analyser": "Tester un analyseur",
+	"IndexActionsMenu.Open": "Ouvrir",
+	"IndexActionsMenu.Close": "Fermer",
+	"IndexActionsMenu.Delete": "Effacer...",
+//	"IndexInfoMenu.Title": "Info",
+	"IndexInfoMenu.Status": "Etat de l'Index",
+	"IndexInfoMenu.Metadata": "Métadonnées de l'Index",
+	"IndexCommand.TextToAnalyze": "Texte à analyser",
+	"IndexCommand.ShutdownMessage": "Entrez ''{0}'' pour éteindre {1}. Le noeud NE PEUT PAS être redémarré depuis cette interface.",
+//	"IndexSelector.NameWithDocs": "{0} ({1} docs)",
+	"IndexSelector.SearchIndexForDocs": "Chercher dans {0} les documents correspondant à",
+	"FilterBrowser.OutputType": "Format d'affichage des résultats {0}",
+	"FilterBrowser.OutputSize": "Nombre de Résultats: {0}",
+	"Header.ClusterHealth": "Santé du cluster: {0} ({1} {2})",
+	"Header.ClusterNotConnected": "Santé du cluster: non connecté",
+	"Header.Connect": "Se connecter",
+	"Nav.AnyRequest": "Autres requêtes",
+	"Nav.StructuredQuery": "Requêtes structurées",
+	"Nav.Browser": "Navigateur",
+	"Nav.ClusterHealth": "Santé du cluster",
+	"Nav.ClusterState": "Etat du cluster",
+	"Nav.ClusterNodes": "Noeuds du cluster",
+//	"Nav.Info": "Info",
+	"Nav.NodeStats": "Statistiques sur les noeuds",
+	"Nav.Overview": "Aperçu",
+	"Nav.Indices": "Index",
+	"Nav.Plugins": "Plugins",
+	"Nav.Status": "Etat",
+	"Nav.Templates": "Templates",
+	"Nav.StructuredQuery": "Recherche Structurée",
+//	"NodeActionsMenu.Title": "Actions",
+	"NodeActionsMenu.Shutdown": "Eteindre...",
+//	"NodeInfoMenu.Title": "Info",
+	"NodeInfoMenu.ClusterNodeInfo": "Infos sur le noeud du cluster",
+	"NodeInfoMenu.NodeStats": "Statistiques du noeud",
+	"NodeType.Client": "Noeud Client",
+	"NodeType.Coord": "Coordinateur",
+	"NodeType.Master": "Noeud Master",
+	"NodeType.Tribe": "Noeud Tribe",
+	"NodeType.Worker": "Noeud Worker",
+	"NodeType.Unassigned": "Non assigné",
+	"OptimizeForm.OptimizeIndex": "Optimiser {0}",
+	"OptimizeForm.MaxSegments": "Nombre maximum de segments",
+	"OptimizeForm.ExpungeDeletes": "Seulement purger les suppressions",
+	"OptimizeForm.FlushAfter": "Flusher après l'optimisation",
+	"OptimizeForm.WaitForMerge": "Attendre la fin de la fusion",
+	"Overview.PageTitle" : "Aperçu du cluster",
+//	"Output.JSON": "JSON",
+	"Output.Table": "Tableau",
+	"Output.ShowSource": "Voir la requête source",
+    "TableResults.Summary": "Recherche sur {0} des {1} shards. {2} résultats. {3} secondes",
+	"QueryFilter.AllIndices": "Tous les index",
+	"QueryFilter.AnyValue": "Tout",
+	"QueryFilter-Header-Indices": "Index",
+//	"QueryFilter-Header-Types": "Types",
+	"QueryFilter-Header-Fields": "Champs",
+	"QueryFilter.DateRangeHint.from": "De : {0}",
+	"QueryFilter.DateRangeHint.to": "  A : {0}",
+	"Query.FailAndUndo": "Requête en échec. Annulation des dernières modifications.",
+	"StructuredQuery.ShowRawJson": "Voir le JSON brut"
+});
+
+i18n.setKeys({
+	"AnyRequest.TransformerHelp" : "\
+		<p>Le transformateur de résultats peut être utilisé pour modifier a posteriori les résultats JSON bruts dans un format plus utile.</p>\
+		<p>Le transformateur devrait contenir le corps d'une fonction javascript. La valeur de retour de la fonction devient la nouvelle valeur qui sera passée à l'afficheur des documents JSON.</p>\
+		<p>Exemple:<br>\
+		  <code>return root.hits.hits[0];</code> ne renverra que le premier élément de l'ensemble des résultats.<br>\
+		  <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code> retournera la mémoire totale utilisée dans l'ensemble du cluster.<br></p>\
+		<p>Les fonctions suivantes sont disponibles et peuvent vous être utiles pour travailler sur les tableaux et les objets:<br>\
+		<ul>\
+			<li><i>Object.keys</i>(object) := array</li>\
+			<li>array.<i>forEach</i>(function(prop, index))</li>\
+			<li>array.<i>map</i>(function(prop, index)) := array</li>\
+			<li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\
+		</ul>\
+		<p>Lorsque vous activez la répétition automatique de la requête, un paramètre supplémentaire nommé prev est passé à la fonction de transformation. Cela permet les comparaisons et les graphes cumulatifs.</p>\
+		<p>Exemple:<br>\
+		<code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code> retournera la charge moyenne du premier noeud du cluster pour la dernière minute écoulée.\
+		Cela peut alimenter ensuite le graphe pour produire un graphe de charge du noeud.\
+		"
+});
+
+i18n.setKeys({
+	"AnyRequest.DisplayOptionsHelp" : "\
+		<p>En JSON brut: affiche les résultats complets de la recherche éventuellement transformée au format JSON brut.</p>\
+		<p>En graphe: pour fabriquer un graphe de vos résultats, utilsez la transformation de résultats pour générer un tableau de valeurs.</p>\
+		<p>En tableau: si votre requête est une recherche, vous pouvez alors afficher les résultats dans un tableau.</p>\
+		"
+});
+
+i18n.setKeys({
+	"QueryFilter.DateRangeHelp" : "\
+		<p>Les champs Date acceptent une requête en langage naturel pour produire un écart de date (from/to) correspondant.</p>\
+		<p>Les formats suivants sont acceptés :</p>\
+		<ul>\
+			<li><b>Mots clés</b><br>\
+				<code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\
+				Cherchera pour des dates correspondant au mot clé. <code>last year</code> cherchera sur toute l'année précédente.</li>\
+			<li><b>Ecarts</b><br>\
+				<code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (les espaces sont optionnels et il existe beaucoup de synonymes pour qualifier les écarts)<br>\
+				Créé un écart de date basé sur l'heure courante (maintenant) avec plus ou moins l'écart indiqué.</li>\
+			<li><b>Dates et Dates partielles</b><br>\
+				<code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\
+				Ces formats indiquent un écart de date spécifique. <code>2011</code> cherchera sur toute l'année 2011, alors que <code>2011-01-18 12:32:45</code> ne cherchera que pour la date précise à la seconde près.</li>\
+			<li><b>Heures et heures partielles</b><br>\
+				<code>12<br> 12:32<br> 12:32:45</code><br>\
+				Ces formats indiquent un espace de temps pour la date du jour. <code>12:32</code> cherchera les éléments d'aujourd'hui à cette minute précise.</li>\
+			<li><b>Ecart de Date</b><br>\
+				<code>2010 -&gt; 2011<br> last week -&gt; next week<br> 2011-05 -&gt;<br> &lt; now</code><br>\
+				Un écart de date est créé en spécifiant deux dates dans n'importe lequel des formats précédents (Mot clé / Dates / Heures) séparées par &lt; ou -&gt; (les deux produisent le même effet). Si la date de fin n'est pas indiquée, alors il n'y aura aucune contrainte de fin.</li>\
+			<li><b>Ecart de date avec décalage</b><br>\
+				<code>2010 -> 1yr<br> 3mins < now</code>\
+				Cherche en incluant un décalage de la date dans la direction indiquée.</li>\
+			<li><b>Ecart de date avec bornes</b><br>\
+				<code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\
+				Similaire à ci-dessus excepté que le décalage est appliqué dans les deux sens à partir de la date indiquée.</li>\
+		</ul>\
+	"
+});

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/c4719b9d/elasticsearch-head/src/main/resources/lang/pt_strings.js
----------------------------------------------------------------------
diff --git a/elasticsearch-head/src/main/resources/lang/pt_strings.js b/elasticsearch-head/src/main/resources/lang/pt_strings.js
new file mode 100644
index 0000000..c935ee8
--- /dev/null
+++ b/elasticsearch-head/src/main/resources/lang/pt_strings.js
@@ -0,0 +1,174 @@
+i18n.setKeys({
+	"General.Elasticsearch": "Elasticsearch",
+	"General.LoadingFacets": "Carregando Facetas...",
+	"General.Searching": "Buscando...",
+	"General.Search": "Busca",
+	"General.Help": "Ajuda",
+	"General.HelpGlyph": "?",
+	"General.CloseGlyph": "X",
+	"General.RefreshResults": "Atualizar",
+	"General.ManualRefresh": "Atualização Manual",
+	"General.RefreshQuickly": "Atualização rápida",
+	"General.Refresh5seconds": "Atualização a cada 5 segundos",
+	"General.Refresh1minute": "Atualização a cada minuto",
+	"AliasForm.AliasName": "Apelido",
+	"AliasForm.NewAliasForIndex": "Novo apelido para {0}",
+	"AliasForm.DeleteAliasMessage": "digite ''{0}'' para deletar {1}. Não há como voltar atrás",
+	"AnyRequest.DisplayOptions" : "Mostrar Opções",
+	"AnyRequest.AsGraph" : "Mostrar como gráfico",
+	"AnyRequest.AsJson" : "Mostrar JSON bruto",
+	"AnyRequest.AsTable" : "Mostrar tabela de resultados da consulta",
+	"AnyRequest.History" : "Histórico",
+	"AnyRequest.RepeatRequest" : "Refazer requisição",
+	"AnyRequest.RepeatRequestSelect" : "Repetir requisição a cada ",
+	"AnyRequest.Transformer" : "Transformador de resultado",
+	"AnyRequest.Pretty": "Amigável",
+	"AnyRequest.Query" : "Consulta",
+	"AnyRequest.Request": "Requisição",
+	"AnyRequest.Requesting": "Realizando requisição...",
+	"AnyRequest.ValidateJSON": "Validar JSON",
+	"Browser.Title": "Navegador",
+	"Browser.ResultSourcePanelTitle": "Resultado",
+	"Command.DELETE": "DELETAR",
+	"Command.SHUTDOWN": "DESLIGAR",
+	"Command.DeleteAliasMessage": "Remover apelido?",
+	"ClusterOverView.IndexName": "Nome do índice",
+	"ClusterOverview.NumShards": "Número de Shards",
+	"ClusterOverview.NumReplicas": "Número de Réplicas",
+	"ClusterOverview.NewIndex": "Novo índice",
+	"IndexActionsMenu.Title": "Ações",
+	"IndexActionsMenu.NewAlias": "Novo apelido...",
+	"IndexActionsMenu.Refresh": "Atualizar",
+	"IndexActionsMenu.Flush": "Flush",
+	"IndexActionsMenu.Optimize": "Otimizar...",
+	"IndexActionsMenu.Snapshot": "Snapshot do Gateway",
+	"IndexActionsMenu.Analyser": "Analizador de teste",
+	"IndexActionsMenu.Open": "Abrir",
+	"IndexActionsMenu.Close": "Fechar",
+	"IndexActionsMenu.Delete": "Deletar...",
+	"IndexInfoMenu.Title": "Info",
+	"IndexInfoMenu.Status": "Status do índice",
+	"IndexInfoMenu.Metadata": "Metadados do índice",
+	"IndexCommand.TextToAnalyze": "Texto para analizar",
+	"IndexCommand.ShutdownMessage": "digite ''{0}'' para desligar {1}. Nó NÃO PODE ser reiniciado à partir dessa interface",
+	"IndexOverview.PageTitle": "Visão Geral dos Índices",
+	"IndexSelector.NameWithDocs": "{0} ({1} documentoss)",
+	"IndexSelector.SearchIndexForDocs": "Busca {0} por documentos onde:",
+	"FilterBrowser.OutputType": "Resultados: {0}",
+	"FilterBrowser.OutputSize": "Número de Resultados: {0}",
+	"Header.ClusterHealth": "saúde do cluster: {0} ({1} {2})",
+	"Header.ClusterNotConnected": "saúde do cluster: não conectado",
+	"Header.Connect": "Conectar",
+	"Nav.AnyRequest": "Qualquer requisição",
+	"Nav.Browser": "Navegador",
+	"Nav.ClusterHealth": "Saúde do Cluster",
+	"Nav.ClusterState": "Estado do Cluster",
+	"Nav.ClusterNodes": "Nós do Cluster",
+	"Nav.Info": "Informações",
+	"Nav.NodeStats": "Estatísticas do nó",
+	"Nav.Overview": "Visão Geral",
+	"Nav.Indices": "Índices",
+	"Nav.Plugins": "Plugins",
+	"Nav.Status": "Status",
+	"Nav.Templates": "Modelos",
+	"Nav.StructuredQuery": "Consulta Estruturada",
+	"NodeActionsMenu.Title": "Ações",
+	"NodeActionsMenu.Shutdown": "Desligar...",
+	"NodeInfoMenu.Title": "Informações",
+	"NodeInfoMenu.ClusterNodeInfo": "Informações do Nó do Cluster",
+	"NodeInfoMenu.NodeStats": "Estatísticas do Nó",
+	"NodeType.Client": "Nó Cliente",
+	"NodeType.Coord": "Coordenador",
+	"NodeType.Master": "Nó Mestre",
+	"NodeType.Tribe": "Nó Tribo",
+	"NodeType.Worker": "Nó Trabalhador",
+	"NodeType.Unassigned": "Não Atribuido",
+	"OptimizeForm.OptimizeIndex": "Otimizar {0}",
+	"OptimizeForm.MaxSegments": "Num. Máximo De Segmentos",
+	"OptimizeForm.ExpungeDeletes": "Apenas Expurgar Exclusões",
+	"OptimizeForm.FlushAfter": "Flush após Otimizar",
+	"OptimizeForm.WaitForMerge": "Esperar Por Merge",
+	"Overview.PageTitle": "Visão geral do Cluster",
+	"Output.JSON": "JSON",
+	"Output.Table": "Tabela",
+	"Output.CSV": "CSV",
+	"Output.ShowSource": "Mostrar consulta original",
+	"Preference.SortCluster": "Ordenar Cluster",
+	"Sort.ByName": "Por Nome",
+	"Sort.ByAddress": "Por Endereço",
+	"Sort.ByType": "Por Tipo",
+	"Preference.ViewAliases": "Ver Alias",
+	"ViewAliases.Grouped": "Agrupado",
+	"ViewAliases.List": "Lista",
+	"ViewAliases.None": "Nenhum",
+	"Overview.IndexFilter": "Filtar Índice",
+	"TableResults.Summary": "Buscado {0} de {1} shards. {2} resultados. {3} segundos",
+	"QueryFilter.AllIndices": "Todos os Índices",
+	"QueryFilter.AnyValue": "qualquer",
+	"QueryFilter-Header-Indices": "Índices",
+	"QueryFilter-Header-Types": "Tipos",
+	"QueryFilter-Header-Fields": "Campos",
+	"QueryFilter.DateRangeHint.from": "De : {0}",
+	"QueryFilter.DateRangeHint.to": "  A : {0}",
+	"Query.FailAndUndo": "Consulta falhou. Desfazendo últimas alterações",
+	"StructuredQuery.ShowRawJson": "Mostrar JSON bruto"
+});
+
+	i18n.setKeys({
+		"AnyRequest.TransformerHelp" : "\
+		<p>O Transformador de Resultados pode ser usado para transformar os resultados de uma consulta de json bruto para um formato mais útil.</p>\
+		<p>O transformador deve possuir o corpo de uma função javascript. O retorno da função se torna o novo valor passado para o json printer</p>\
+		<p>Exemplo:<br>\
+		  <code>return root.hits.hits[0];</code> irá alterar a resposta para mostrar apenas o primeiro resultado<br>\
+		  <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code> irá retornar o total de memória utilizada pelo cluster<br></p>\
+		<p>As seguintes funções estão disponíveis e podem ser úteis no processamento de vetores e objetos<br>\
+		<ul>\
+			<li><i>Object.keys</i>(object) := array</li>\
+			<li>array.<i>forEach</i>(function(prop, index))</li>\
+			<li>array.<i>map</i>(function(prop, index)) := array</li>\
+			<li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\
+		</ul>\
+		<p>Durante a execução da opção Refazer Requisição, um parâmetro extra chamado prev é passado para a função de transformação. Isso permite fazer comparações e marcações cumulativas</p>\
+		<p>Exemplo:<br>\
+		<code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code> irá retornar a carga média no primeiro nó do cluster no último minuto\
+		Essa informação pode ser inserida no Gráfico para fazer um gráfico de carga do nó\
+		"
+	});
+
+i18n.setKeys({
+	"AnyRequest.DisplayOptionsHelp" : "\
+		<p>Json Bruto: Exibe o resultado completo da consulta e da transformação no formato de JSON bruto</p>\
+		<p>Gráfico de Resultados: Para gerar um gráfico com seus resultados, utilize o tranformador de resultados para produzir um vetor de valores</p>\
+		<p>Tabela de Resultados da Consulta: Se sua consulta for uma busca, você pode exibir seus resultados no formato de uma tabela.</p>\
+		"
+});
+
+i18n.setKeys({
+	"QueryFilter.DateRangeHelp" : "\
+		<p>Campos do tipo Data aceitam consultas em linguagem natural (em inglês) para produzir um <i>From</i> e um <i>To</i> de modo a formar um intervalo dentro do qual os resultados são filtrados.</p>\
+		<p>Os seguintes formatos são suportados:</p>\
+		<ul>\
+			<li><b>Palavras-chave</b><br>\
+				<code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\
+				buscam por datas de acordo com a palavra-chave. <code>last year</code> irá buscar tudo do último ano.</li>\
+			<li><b>Intervalos</b><br>\
+				<code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (espaços são opcionais, diversos sinônimos para qualificadores de intervalo)<br>\
+				Cria um intervalo de busca a partir de agora (<code>now</code>), extendendo este intervalo no passado e no futuro de acordo com intervalo especificado.</li>\
+			<li><b>Data/Hora (<i>DateTime</i>) e Data/Hora parcial</b><br>\
+				<code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\
+				esses formatos especificam um intervalo especifico. <code>2011</code> irá buscar todo o ano de 2011, enquanto <code>2011-01-18 12:32:45</code> irá buscar apenas por resultados dentro deste intervalo de 1 segundo</li>\
+			<li><b>Tempo (<i>Time</i>) e Tempo parcial</b><br>\
+				<code>12<br> 12:32<br> 12:32:45</code><br>\
+				esses formatos buscam por um horário específico no dia atual. <code>12:32</code> irá buscar este minuto específico do dia</li>\
+			<li><b>Intervalos de Data</b><br>\
+				<code>2010 -&gt; 2011<br> last week -&gt; next week<br> 2011-05 -&gt;<br> &lt; now</code><br>\
+				Um intervalo de data é criado especificando-se duas datas em qualquer formato (Palavras-chave, Data/Hora ou Tempo) separados por &lt; ou -&gt; (ambos fazem a mesma coisa). Se a data de início ou fim do intervalo não for especificada é a mesma coisa que não impor limites na busca nesta direção.</li>\
+			<li><b>Intervalo de Data com Deslocamento</b><br>\
+				<code>2010 -> 1yr<br> 3mins < now</code>\
+				Busca a data especificada incluindo o intervalo na direção determinada pelo deslocamento</li>\
+			<li><b>Intervalos Bidirecionais</b><br>\
+				<code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\
+				Idêntico ao exemplo anterior porém o intervalo é extendido em ambas as direções a partir da data especificada</li>\
+		</ul>\
+	"
+});

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/c4719b9d/elasticsearch-head/src/main/resources/lang/zh_strings.js
----------------------------------------------------------------------
diff --git a/elasticsearch-head/src/main/resources/lang/zh_strings.js b/elasticsearch-head/src/main/resources/lang/zh_strings.js
new file mode 100644
index 0000000..e9569d4
--- /dev/null
+++ b/elasticsearch-head/src/main/resources/lang/zh_strings.js
@@ -0,0 +1,172 @@
+i18n.setKeys({
+	"General.Elasticsearch": "Elasticsearch",
+	"General.LoadingFacets": "加载聚合查询...",
+	"General.Searching": "搜索中...",
+	"General.Search": "搜索",
+	"General.Help": "帮助",
+	"General.HelpGlyph": "?",
+	"General.CloseGlyph": "X",
+	"General.RefreshResults": "刷新",
+	"General.ManualRefresh": "手动刷新",
+	"General.RefreshQuickly": "快速刷新",
+	"General.Refresh5seconds": "每5秒刷新",
+	"General.Refresh1minute": "每1分钟刷新",
+	"AliasForm.AliasName": "别名",
+	"AliasForm.NewAliasForIndex": "为 {0} 创建新别名",
+	"AliasForm.DeleteAliasMessage": "输入 ''{0}''  删除 {1}. 此操作无法恢复",
+	"AnyRequest.DisplayOptions" : "显示选项",
+	"AnyRequest.AsGraph" : "图形视图",
+	"AnyRequest.AsJson" : "原始 JSON",
+	"AnyRequest.AsTable" : "表格视图",
+	"AnyRequest.History" : "历史记录",
+	"AnyRequest.RepeatRequest" : "重复请求",
+	"AnyRequest.RepeatRequestSelect" : "重复周期 ",
+	"AnyRequest.Transformer" : "结果转换器",
+	"AnyRequest.Pretty": "易读",
+	"AnyRequest.Query" : "查询",
+	"AnyRequest.Request": "提交请求",
+	"AnyRequest.Requesting": "请求中...",
+	"AnyRequest.ValidateJSON": "验证 JSON",
+	"Browser.Title": "数据浏览",
+	"Browser.ResultSourcePanelTitle": "原始数据",
+	"Command.DELETE": "删除",
+	"Command.SHUTDOWN": "关闭",
+	"Command.DeleteAliasMessage": "删除别名?",
+	"ClusterOverView.IndexName": "索引名称",
+	"ClusterOverview.NumShards": "分片数",
+	"ClusterOverview.NumReplicas": "副本数",
+	"ClusterOverview.NewIndex": "新建索引",
+	"IndexActionsMenu.Title": "动作",
+	"IndexActionsMenu.NewAlias": "新建别名...",
+	"IndexActionsMenu.Refresh": "刷新",
+	"IndexActionsMenu.Flush": "Flush刷新",
+	"IndexActionsMenu.Optimize": "优化...",
+	"IndexActionsMenu.Snapshot": "网关快照",
+	"IndexActionsMenu.Analyser": "测试分析器",
+	"IndexActionsMenu.Open": "开启",
+	"IndexActionsMenu.Close": "关闭",
+	"IndexActionsMenu.Delete": "删除...",
+	"IndexInfoMenu.Title": "信息",
+	"IndexInfoMenu.Status": "索引状态",
+	"IndexInfoMenu.Metadata": "索引信息",
+	"IndexCommand.TextToAnalyze": "文本分析",
+	"IndexCommand.ShutdownMessage": "输入 ''{0}'' 以关闭 {1} 节点. 关闭的节点无法从此界面重新启动",
+	"IndexOverview.PageTitle": "索引概览",
+	"IndexSelector.NameWithDocs": "{0} ({1} 个文档)",
+	"IndexSelector.SearchIndexForDocs": "搜索 {0} 的文档, 查询条件:",
+	"FilterBrowser.OutputType": "返回格式: {0}",
+	"FilterBrowser.OutputSize": "显示数量: {0}",
+	"Header.ClusterHealth": "集群健康值: {0} ({1} of {2})",
+	"Header.ClusterNotConnected": "集群健康值: 未连接",
+	"Header.Connect": "连接",
+	"Nav.AnyRequest": "复合查询",
+	"Nav.Browser": "数据浏览",
+	"Nav.ClusterHealth": "集群健康值",
+	"Nav.ClusterState": "群集状态",
+	"Nav.ClusterNodes": "集群节点",
+	"Nav.Info": "信息",
+	"Nav.NodeStats": "节点状态",
+	"Nav.Overview": "概览",
+	"Nav.Indices": "索引",
+	"Nav.Plugins": "插件",
+	"Nav.Status": "状态",
+	"Nav.Templates": "模板",
+	"Nav.StructuredQuery": "基本查询",
+	"NodeActionsMenu.Title": "动作",
+	"NodeActionsMenu.Shutdown": "关停...",
+	"NodeInfoMenu.Title": "信息",
+	"NodeInfoMenu.ClusterNodeInfo": "集群节点信息",
+	"NodeInfoMenu.NodeStats": "节点状态",
+	"NodeType.Client": "节点客户端",
+	"NodeType.Coord": "协调器",
+	"NodeType.Master": "主节点",
+	"NodeType.Tribe": "分支结点",
+	"NodeType.Worker": "工作节点",
+	"NodeType.Unassigned": "未分配",
+	"OptimizeForm.OptimizeIndex": "优化 {0}",
+	"OptimizeForm.MaxSegments": "最大索引段数",
+	"OptimizeForm.ExpungeDeletes": "只删除被标记为删除的",
+	"OptimizeForm.FlushAfter": "优化后刷新",
+	"OptimizeForm.WaitForMerge": "等待合并",
+	"Overview.PageTitle" : "集群概览",
+	"Output.JSON": "JSON",
+	"Output.Table": "Table",
+	"Output.CSV": "CSV",
+	"Output.ShowSource": "显示查询语句",
+	"Preference.SortCluster": "集群排序",
+	"Sort.ByName": "按名称",
+	"Sort.ByAddress": "按地址",
+	"Sort.ByType": "按类型",
+	"TableResults.Summary": "查询 {1} 个分片中用的 {0} 个. {2} 命中. 耗时 {3} 秒",
+	"QueryFilter.AllIndices": "所有索引",
+	"QueryFilter.AnyValue": "任意",
+	"QueryFilter-Header-Indices": "索引",
+	"QueryFilter-Header-Types": "类型",
+	"QueryFilter-Header-Fields": "字段",
+	"QueryFilter.DateRangeHint.from": "从 : {0}",
+	"QueryFilter.DateRangeHint.to": "  到 : {0}",
+	"Query.FailAndUndo": "查询失败. 撤消最近的更改",
+	"StructuredQuery.ShowRawJson": "显示原始 JSON"
+});
+
+i18n.setKeys({
+	"AnyRequest.TransformerHelp" : "\
+		<p>结果转换器用于返回结果原始JSON的后续处理, 将结果转换为更有用的格式.</p>\
+		<p>转换器应当包含javascript函数体. 函数的返回值将传递给json分析器</p>\
+		<p>Example:<br>\
+		  <code>return root.hits.hits[0];</code><br>\
+		  遍历结果并只显示第一个元素<br>\
+		  <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code><br>\
+		  将返回整个集群使用的总内存<br></p>\
+		<p>以下函数可以方便的处理数组与对象<br>\
+		<ul>\
+			<li><i>Object.keys</i>(object) := array</li>\
+			<li>array.<i>forEach</i>(function(prop, index))</li>\
+			<li>array.<i>map</i>(function(prop, index)) := array</li>\
+			<li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\
+		</ul>\
+		<p>当启用重复请求时, prev 参数将会传递给转换器函数. 这将用于比较并累加图形</p>\
+		<p>Example:<br>\
+		<code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code><br>\
+		将返回第一个集群节点最近一分钟内的平均负载\
+		将会把结果送人图表以产生一个负载曲线图\
+		"
+});
+
+i18n.setKeys({
+	"AnyRequest.DisplayOptionsHelp" : "\
+		<p>原始 Json: 将完整的查询结果转换为原始JSON格式 </p>\
+		<p>图形视图: 将查询结果图形化, 将查询结果转换为数组值的形式</p>\
+		<p>表格视图: 如果查询是一个搜索, 可以将搜索结果以表格形式显示.</p>\
+		"
+});
+
+i18n.setKeys({
+	"QueryFilter.DateRangeHelp" : "\
+		<p>Date 字段接受日期范围的形式查询.</p>\
+		<p>一下格式被支持:</p>\
+		<ul>\
+			<li><b>关键词 / 关键短语</b><br>\
+				<code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\
+				搜索关键字匹配的日期. <code>last year</code> 将搜索过去全年.</li>\
+			<li><b>范围</b><br>\
+				<code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (空格可选, 同等于多个范围修饰词)<br>\
+				创建一个指定时间范围的搜索, 将围绕<code>现在</code> 并延伸至过去与未来时间段.</li>\
+			<li><b>DateTime 与 DateTime局部</b><br>\
+				<code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\
+				指定一个特定的日期范围. <code>2011</code>会搜索整个 2011年, 而 <code>2011-01-18 12:32:45</code> 将只搜索1秒范围内</li>\
+			<li><b>Time 与 Time局部</b><br>\
+				<code>12<br> 12:32<br> 12:32:45</code><br>\
+				这些格式只搜索当天的特定时间. <code>12:32</code> 将搜索当天的那一分钟</li>\
+			<li><b>日期范围</b><br>\
+				<code>2010 -&gt; 2011<br> last week -&gt; next week<br> 2011-05 -&gt;<br> &lt; now</code><br>\
+				日期范围是将两个日期格式串 (日期关键字 / DateTime / Time) 用  &lt; 或 -&gt; (效果相同) 分隔. 如果缺少任意一端,那么在这个方向上时间将没有限制.</li>\
+			<li><b>偏移日期范围</b><br>\
+				<code>2010 -> 1yr<br> 3mins < now</code>\
+				搜索包括指定方向上偏移的日期.</li>\
+			<li><b>锚定范围</b><br>\
+				<code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\
+				类似于上面的便宜日期,在两个方向上将锚定的日期延长</li>\
+		</ul>\
+	"
+});

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/c4719b9d/elasticsearch-head/src/main/resources/vendor.css
----------------------------------------------------------------------
diff --git a/elasticsearch-head/src/main/resources/vendor.css b/elasticsearch-head/src/main/resources/vendor.css
new file mode 100644
index 0000000..be7e15c
--- /dev/null
+++ b/elasticsearch-head/src/main/resources/vendor.css
@@ -0,0 +1,1338 @@
+/*!
+ *  Font Awesome 4.0.3 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.0.3');
+  src: url('fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'), url('fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+.fa {
+  display: inline-block;
+  font-family: FontAwesome;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+  font-size: 1.3333333333333333em;
+  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.2857142857142858em;
+  text-align: center;
+}
+.fa-ul {
+  padding-left: 0;
+  margin-left: 2.142857142857143em;
+  list-style-type: none;
+}
+.fa-ul > li {
+  position: relative;
+}
+.fa-li {
+  position: absolute;
+  left: -2.142857142857143em;
+  width: 2.142857142857143em;
+  top: 0.14285714285714285em;
+  text-align: center;
+}
+.fa-li.fa-lg {
+  left: -1.8571428571428572em;
+}
+.fa-border {
+  padding: .2em .25em .15em;
+  border: solid 0.08em #eeeeee;
+  border-radius: .1em;
+}
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+.fa.pull-left {
+  margin-right: .3em;
+}
+.fa.pull-right {
+  margin-left: .3em;
+}
+.fa-spin {
+  -webkit-animation: spin 2s infinite linear;
+  -moz-animation: spin 2s infinite linear;
+  -o-animation: spin 2s infinite linear;
+  animation: spin 2s infinite linear;
+}
+@-moz-keyframes spin {
+  0% {
+    -moz-transform: rotate(0deg);
+  }
+  100% {
+    -moz-transform: rotate(359deg);
+  }
+}
+@-webkit-keyframes spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+  }
+}
+@-o-keyframes spin {
+  0% {
+    -o-transform: rotate(0deg);
+  }
+  100% {
+    -o-transform: rotate(359deg);
+  }
+}
+@-ms-keyframes spin {
+  0% {
+    -ms-transform: rotate(0deg);
+  }
+  100% {
+    -ms-transform: rotate(359deg);
+  }
+}
+@keyframes spin {
+  0% {
+    transform: rotate(0deg);
+  }
+  100% {
+    transform: rotate(359deg);
+  }
+}
+.fa-rotate-90 {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+  -webkit-transform: rotate(90deg);
+  -moz-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  -o-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+.fa-rotate-180 {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+  -webkit-transform: rotate(180deg);
+  -moz-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  -o-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+.fa-rotate-270 {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+  -webkit-transform: rotate(270deg);
+  -moz-transform: rotate(270deg);
+  -ms-transform: rotate(270deg);
+  -o-transform: rotate(270deg);
+  transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
+  -webkit-transform: scale(-1, 1);
+  -moz-transform: scale(-1, 1);
+  -ms-transform: scale(-1, 1);
+  -o-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);
+  -moz-transform: scale(1, -1);
+  -ms-transform: scale(1, -1);
+  -o-transform: scale(1, -1);
+  transform: scale(1, -1);
+}
+.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-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-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 {
+  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:before {
+  content: "\f09a";
+}
+.fa-github:before {
+  content: "\f09b";
+}
+.fa-unlock:before {
+  content: "\f09c";
+}
+.fa-credit-card:before {
+  content: "\f09d";
+}
+.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-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-asc:before {
+  content: "\f0dd";
+}
+.fa-sort-up:before,
+.fa-sort-desc: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-reply-all:before {
+  content: "\f122";
+}
+.fa-mail-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 {
+  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";
+}