diff --git a/Bonobo.Git.Server.sln b/Bonobo.Git.Server.sln index bf06ec7ef..79d05f672 100644 --- a/Bonobo.Git.Server.sln +++ b/Bonobo.Git.Server.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2009 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonobo.Git.Server", "Bonobo.Git.Server\Bonobo.Git.Server.csproj", "{6129B3FE-B282-4F6F-8836-8AF66602F8DA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonobo.Git.Server", "Bonobo.Git.Server\Bonobo.Git.Server.csproj", "{6129B3FE-B282-4F6F-8836-8AF66602F8DA}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bonobo.Git.Server.Test", "Bonobo.Git.Server.Test\Bonobo.Git.Server.Test.csproj", "{0B124D88-5C2B-47AD-B660-434B709A0DFF}" EndProject @@ -30,11 +30,12 @@ Global {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Release|Mixed Platforms.Build.0 = Release|Any CPU {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Release|x86.ActiveCfg = Release|Any CPU - {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Test|Any CPU.ActiveCfg = Test|Any CPU - {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Test|Any CPU.Build.0 = Test|Any CPU - {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Test|Mixed Platforms.ActiveCfg = Test|Any CPU - {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Test|Mixed Platforms.Build.0 = Test|Any CPU - {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Test|x86.ActiveCfg = Test|Any CPU + {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Test|Any CPU.ActiveCfg = Release|Any CPU + {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Test|Any CPU.Build.0 = Release|Any CPU + {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Test|Mixed Platforms.ActiveCfg = Release|Any CPU + {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Test|Mixed Platforms.Build.0 = Release|Any CPU + {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Test|x86.ActiveCfg = Release|Any CPU + {6129B3FE-B282-4F6F-8836-8AF66602F8DA}.Test|x86.Build.0 = Release|Any CPU {0B124D88-5C2B-47AD-B660-434B709A0DFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0B124D88-5C2B-47AD-B660-434B709A0DFF}.Debug|Any CPU.Build.0 = Debug|Any CPU {0B124D88-5C2B-47AD-B660-434B709A0DFF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -55,6 +56,7 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {451ECF4B-DC19-4E9A-9D02-DA13796309D7} EnterpriseLibraryConfigurationToolBinariesPath = packages\Unity.2.1.505.2\lib\NET35 EndGlobalSection EndGlobal diff --git a/Bonobo.Git.Server/.bowerrc b/Bonobo.Git.Server/.bowerrc index b18ceec8a..6406626ab 100644 --- a/Bonobo.Git.Server/.bowerrc +++ b/Bonobo.Git.Server/.bowerrc @@ -1,3 +1,3 @@ { - "directory" : "Content/components" -} \ No newline at end of file + "directory": "wwwroot/lib" +} diff --git a/Bonobo.Git.Server/App_Data/Repositories/note.txt b/Bonobo.Git.Server/App_Data/Repositories/note.txt deleted file mode 100644 index 98c8d7064..000000000 --- a/Bonobo.Git.Server/App_Data/Repositories/note.txt +++ /dev/null @@ -1 +0,0 @@ -This is the default for git repositories. \ No newline at end of file diff --git a/Bonobo.Git.Server/App_Data/Web.config b/Bonobo.Git.Server/App_Data/Web.config deleted file mode 100644 index 6291e1800..000000000 --- a/Bonobo.Git.Server/App_Data/Web.config +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/Bonobo.Git.Server/App_GlobalResources/Resources.it-IT.designer.cs b/Bonobo.Git.Server/App_GlobalResources/Resources.it-IT.designer.cs deleted file mode 100644 index e69de29bb..000000000 diff --git a/Bonobo.Git.Server/App_GlobalResources/Resources.resx b/Bonobo.Git.Server/App_GlobalResources/Resources.resx index 4fc18d6f0..b7c6ab32e 100644 --- a/Bonobo.Git.Server/App_GlobalResources/Resources.resx +++ b/Bonobo.Git.Server/App_GlobalResources/Resources.resx @@ -1,4 +1,4 @@ - + - - - - - - - - True - - - - - - - - - - - if not exist "$(TargetDir)NativeBinaries" md "$(TargetDir)NativeBinaries" -if not exist "$(TargetDir)NativeBinaries\x86" md "$(TargetDir)NativeBinaries\x86" -xcopy /s /y /d "$(SolutionDir)packages\LibGit2Sharp.0.21.0.176\lib\net40\NativeBinaries\x86\*.*" "$(TargetDir)NativeBinaries\x86\" -if not exist "$(TargetDir)NativeBinaries\amd64" md "$(TargetDir)NativeBinaries\amd64" -xcopy/s /y /d "$(SolutionDir)packages\LibGit2Sharp.0.21.0.176\lib\net40\NativeBinaries\amd64\*.*" "$(TargetDir)NativeBinaries\amd64\" - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - \ No newline at end of file + + diff --git a/Bonobo.Git.Server/Bonobo.Git.Server.csproj.DotSettings b/Bonobo.Git.Server/Bonobo.Git.Server.csproj.DotSettings deleted file mode 100644 index 73e96563f..000000000 --- a/Bonobo.Git.Server/Bonobo.Git.Server.csproj.DotSettings +++ /dev/null @@ -1,2 +0,0 @@ - - CSharp60 \ No newline at end of file diff --git a/Bonobo.Git.Server/Configuration/ActiveDirectorySettings.cs b/Bonobo.Git.Server/Configuration/ActiveDirectorySettings.cs index 81f473473..00e4824df 100644 --- a/Bonobo.Git.Server/Configuration/ActiveDirectorySettings.cs +++ b/Bonobo.Git.Server/Configuration/ActiveDirectorySettings.cs @@ -1,8 +1,5 @@ using System; using System.Collections.Generic; -using System.Configuration; -using System.Linq; -using System.Web; namespace Bonobo.Git.Server.Configuration { @@ -44,11 +41,12 @@ static ActiveDirectorySettings() public static void LoadSettings() { - MemberGroupName = ConfigurationManager.AppSettings["ActiveDirectoryMemberGroupName"]; - BackendPath = ConfigurationManager.AppSettings["ActiveDirectoryBackendPath"]; + System.Diagnostics.Debugger.Break(); + //MemberGroupName = ConfigurationManager.AppSettings["ActiveDirectoryMemberGroupName"]; + //BackendPath = ConfigurationManager.AppSettings["ActiveDirectoryBackendPath"]; - RoleNameToGroupNameMapping = CreateMapping(ConfigurationManager.AppSettings["ActiveDirectoryRoleMapping"]); - TeamNameToGroupNameMapping = CreateMapping(ConfigurationManager.AppSettings["ActiveDirectoryTeamMapping"]); + //RoleNameToGroupNameMapping = CreateMapping(ConfigurationManager.AppSettings["ActiveDirectoryRoleMapping"]); + //TeamNameToGroupNameMapping = CreateMapping(ConfigurationManager.AppSettings["ActiveDirectoryTeamMapping"]); } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Configuration/AppSettings.cs b/Bonobo.Git.Server/Configuration/AppSettings.cs index b0ab7da4a..fdca7535a 100644 --- a/Bonobo.Git.Server/Configuration/AppSettings.cs +++ b/Bonobo.Git.Server/Configuration/AppSettings.cs @@ -1,19 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Linq; -using System.Web; - -namespace Bonobo.Git.Server.Configuration +namespace Bonobo.Git.Server.Configuration { - public static class AppSettings + public class AppSettings { - public static bool IsPushAuditEnabled - { - get - { - return bool.Parse(ConfigurationManager.AppSettings["IsPushAuditEnabled"] ?? "false"); - } - } + public bool IsPushAuditEnabled { get; set; } + public string LogDirectory { get; set; } + public string RecoveryDataPath { get; set; } + public string GitPath { get; set; } + public string GitHomePath { get; set; } + public string GitServerPath { get; set; } + public bool AllowDBReset { get; set; } + public string DefaultRepositoriesDirectory { get; set; } + public string ActiveDirectoryDefaultDomain { get; set; } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Configuration/AuthenticationSettings.cs b/Bonobo.Git.Server/Configuration/AuthenticationSettings.cs index e20347367..725ce5496 100644 --- a/Bonobo.Git.Server/Configuration/AuthenticationSettings.cs +++ b/Bonobo.Git.Server/Configuration/AuthenticationSettings.cs @@ -1,21 +1,10 @@ -using System; -using System.Configuration; - -namespace Bonobo.Git.Server.Configuration +namespace Bonobo.Git.Server.Configuration { - public static class AuthenticationSettings + public class AuthenticationSettings { - public static string MembershipService { get; private set; } - public static string AuthenticationProvider { get; private set; } - public static bool ImportWindowsAuthUsersAsAdmin { get; private set; } - public static bool DemoModeActive { get; private set; } - - static AuthenticationSettings() - { - MembershipService = ConfigurationManager.AppSettings["MembershipService"]; - AuthenticationProvider = ConfigurationManager.AppSettings["AuthenticationProvider"]; - ImportWindowsAuthUsersAsAdmin = Convert.ToBoolean(ConfigurationManager.AppSettings["ImportWindowsAuthUsersAsAdmin"]); - DemoModeActive = Convert.ToBoolean(ConfigurationManager.AppSettings["demoModeActive"]); - } + public string MembershipService { get; set; } + public string AuthenticationProvider { get; set; } + public bool ImportWindowsAuthUsersAsAdmin { get; set; } + public bool DemoModeActive { get; set; } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Configuration/ConfigurationEntry.cs b/Bonobo.Git.Server/Configuration/ConfigurationEntry.cs index e8843e324..94bf1edc7 100644 --- a/Bonobo.Git.Server/Configuration/ConfigurationEntry.cs +++ b/Bonobo.Git.Server/Configuration/ConfigurationEntry.cs @@ -1,7 +1,4 @@ -using System.Configuration; -using System.IO; -using System.Web; -using System.Web.Hosting; +using System.IO; using System.Xml.Serialization; namespace Bonobo.Git.Server.Configuration @@ -11,10 +8,10 @@ namespace Bonobo.Git.Server.Configuration private static Entry _current = null; private static readonly object _sync = new object(); private static readonly XmlSerializer _serializer = new XmlSerializer(typeof(Entry)); - private static readonly string _configPath = Path.IsPathRooted(ConfigurationManager.AppSettings["UserConfiguration"]) + private static readonly string _configPath = @"E:\Users\kalten\Documents\GitHub\Bonobo-Git-Server\Bonobo.Git.Server\App_Data\config.xml";/* Path.IsPathRooted(ConfigurationManager.AppSettings["UserConfiguration"]) ? ConfigurationManager.AppSettings["UserConfiguration"] : HostingEnvironment.MapPath(ConfigurationManager.AppSettings["UserConfiguration"]); - + */ public static Entry Current { get { return _current ?? Load(); } } diff --git a/Bonobo.Git.Server/Configuration/DiagnosticReporter.cs b/Bonobo.Git.Server/Configuration/DiagnosticReporter.cs index 706d7f8aa..222a6c83f 100644 --- a/Bonobo.Git.Server/Configuration/DiagnosticReporter.cs +++ b/Bonobo.Git.Server/Configuration/DiagnosticReporter.cs @@ -1,12 +1,9 @@ using System; -using System.Configuration; using System.IO; using System.Linq; using System.Net; using System.Text; -using System.Web.Hosting; -using Bonobo.Git.Server.Data; -using Bonobo.Git.Server.Security; +using Microsoft.Extensions.Configuration; namespace Bonobo.Git.Server.Configuration { @@ -20,6 +17,12 @@ public class DiagnosticReporter { private readonly StringBuilder _report = new StringBuilder(); private readonly UserConfiguration _userConfig = UserConfiguration.Current; + private readonly IConfiguration _configuration; + + public DiagnosticReporter(IConfiguration configuration) + { + _configuration = configuration; + } public string GetVerificationReport() { @@ -39,13 +42,13 @@ private void RunReport() ExceptionLog(); } - + private void DumpAppSettings() { _report.AppendLine("Web.Config AppSettings"); - foreach (string key in ConfigurationManager.AppSettings) + foreach (var kv in _configuration.AsEnumerable()) { - QuotedReport("AppSettings."+key, ConfigurationManager.AppSettings[key]); + QuotedReport("AppSettings." + kv.Key, kv.Value); } } @@ -108,27 +111,27 @@ private void CheckADMembership() SafelyReport("Backend folder exists", () => Directory.Exists(MapPath(AppSetting("ActiveDirectoryBackendPath")))); ReportDirectoryStatus("Backend folder", MapPath(AppSetting("ActiveDirectoryBackendPath"))); - var ad = ADBackend.Instance; - SafelyReport("User count", () => ad.Users.Count()); + //var ad = ADBackend.Instance; + //SafelyReport("User count", () => ad.Users.Count()); _report.AppendLine("AD Teams"); - SafelyRun(() => - { - foreach (var item in ad.Teams) - { - var thisTeam = item; - SafelyReport(item.Name, () => thisTeam.Members.Length + " members"); - } - }); + //SafelyRun(() => + //{ + // foreach (var item in ad.Teams) + // { + // var thisTeam = item; + // SafelyReport(item.Name, () => thisTeam.Members.Length + " members"); + // } + //}); _report.AppendLine("AD Roles"); - SafelyRun(() => - { - foreach (var item in ad.Roles) - { - var thisRole = item; - SafelyReport(item.Name, () => thisRole.Members.Length + " members"); - } - }); + //SafelyRun(() => + //{ + // foreach (var item in ad.Roles) + // { + // var thisRole = item; + // SafelyReport(item.Name, () => thisRole.Members.Length + " members"); + // } + //}); } else { @@ -141,7 +144,7 @@ private void ReportDirectoryStatus(string text, string directory) var sb = new StringBuilder(); if (Directory.Exists(directory)) { - sb.AppendFormat("Exists, {0} files, {1} entries, ", + sb.AppendFormat("Exists, {0} files, {1} entries, ", Directory.GetFiles(directory).Length, Directory.GetFileSystemEntries(directory).Length ); @@ -186,7 +189,7 @@ private void CheckInternalMembership() if (AppSetting("MembershipService") == "Internal") { - SafelyReport("User count", () => new EFMembershipService { CreateContext = () => new BonoboGitServerContext() }.GetAllUsers().Count); + //SafelyReport("User count", () => new EFMembershipService { CreateContext = () => new BonoboGitServerContext() }.GetAllUsers().Count); } else { @@ -203,22 +206,23 @@ private void ExceptionLog() _report.AppendLine("Exception Log"); SafelyRun(() => { - var nameFormat = MvcApplication.GetLogFileNameFormat(); - var todayLogFileName = nameFormat.Replace("{Date}", DateTime.Now.ToString("yyyyMMdd")); - SafelyReport("LogFileName: ", () => todayLogFileName); - var chunkSize = 10000; - var length = new FileInfo(todayLogFileName).Length; - Report("Log File total length", length); + throw new NotImplementedException(); + //var nameFormat = MvcApplication.GetLogFileNameFormat(); + //var todayLogFileName = nameFormat.Replace("{Date}", DateTime.Now.ToString("yyyyMMdd")); + //SafelyReport("LogFileName: ", () => todayLogFileName); + //var chunkSize = 10000; + //var length = new FileInfo(todayLogFileName).Length; + //Report("Log File total length", length); - var startingPoint = Math.Max(0, length - chunkSize); - Report("Starting log dump from ", startingPoint); + //var startingPoint = Math.Max(0, length - chunkSize); + //Report("Starting log dump from ", startingPoint); - using (var logText = File.Open(todayLogFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - { - logText.Seek(startingPoint, SeekOrigin.Begin); - var reader = new StreamReader(logText); - _report.AppendLine(reader.ReadToEnd()); - } + //using (var logText = File.Open(todayLogFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + //{ + // logText.Seek(startingPoint, SeekOrigin.Begin); + // var reader = new StreamReader(logText); + // _report.AppendLine(reader.ReadToEnd()); + //} }); } @@ -263,12 +267,13 @@ private void SafelyReport(string tag, Func func) private string MapPath(string path) { - return Path.IsPathRooted(path) ? path : HostingEnvironment.MapPath(path); + return path; + //return Path.IsPathRooted(path) ? path : HostingEnvironment.MapPath(path); } private string AppSetting(string name) { - return ConfigurationManager.AppSettings[name]; + return _configuration.GetSection("AppSettings").GetValue(name); } private static string FormatException(Exception ex) @@ -290,7 +295,7 @@ private void Report(string tag, object value = null) private void QuotedReport(string tag, object value) { - Report(tag, "'"+value+"'"); + Report(tag, "'" + value + "'"); } } } diff --git a/Bonobo.Git.Server/Configuration/FederationSettings.cs b/Bonobo.Git.Server/Configuration/FederationSettings.cs index 4e6413632..eed312d10 100644 --- a/Bonobo.Git.Server/Configuration/FederationSettings.cs +++ b/Bonobo.Git.Server/Configuration/FederationSettings.cs @@ -1,20 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Linq; -using System.Web; - -namespace Bonobo.Git.Server.Configuration +namespace Bonobo.Git.Server.Configuration { public class FederationSettings { - public static string MetadataAddress { get; private set; } - public static string Realm { get; private set; } + public string MetadataAddress { get; private set; } + public string Realm { get; private set; } static FederationSettings() { - MetadataAddress = ConfigurationManager.AppSettings["FederationMetadataAddress"]; - Realm = ConfigurationManager.AppSettings["FederationRealm"]; + //MetadataAddress = ConfigurationManager.AppSettings["FederationMetadataAddress"]; + //Realm = ConfigurationManager.AppSettings["FederationRealm"]; } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Configuration/UserConfiguration.cs b/Bonobo.Git.Server/Configuration/UserConfiguration.cs index f6db21795..913e932d6 100644 --- a/Bonobo.Git.Server/Configuration/UserConfiguration.cs +++ b/Bonobo.Git.Server/Configuration/UserConfiguration.cs @@ -1,13 +1,9 @@ using System; -using System.Configuration; -using System.IO; -using System.Web; using System.Xml.Serialization; namespace Bonobo.Git.Server.Configuration { using Bonobo.Git.Server.App_GlobalResources; - using System.Web.Hosting; [XmlRootAttribute(ElementName = "Configuration", IsNullable = false)] public class UserConfiguration : ConfigurationEntry @@ -31,9 +27,10 @@ public string Repositories { get { - return Path.IsPathRooted(RepositoryPath) - ? RepositoryPath - : HostingEnvironment.MapPath(RepositoryPath); + return RepositoryPath ?? "."; + //return Path.IsPathRooted(RepositoryPath) + // ? RepositoryPath + // : HostingEnvironment.MapPath(RepositoryPath); } } @@ -71,12 +68,13 @@ public string GetSiteTitle() return !string.IsNullOrWhiteSpace(this.SiteTitle) ? this.SiteTitle : Resources.Layout_Title; } - public static void Initialize() + public static void Initialize(AppSettings appSettings) { if (IsInitialized()) return; - Current.RepositoryPath = ConfigurationManager.AppSettings["DefaultRepositoriesDirectory"]; + System.Diagnostics.Debugger.Break(); + Current.RepositoryPath = appSettings.DefaultRepositoriesDirectory; Current.Save(); } diff --git a/Bonobo.Git.Server/Controllers/AccountController.cs b/Bonobo.Git.Server/Controllers/AccountController.cs index d7f3b5b9e..183e7360b 100644 --- a/Bonobo.Git.Server/Controllers/AccountController.cs +++ b/Bonobo.Git.Server/Controllers/AccountController.cs @@ -1,38 +1,38 @@ using System; -using System.Collections.Generic; -using System.Globalization; using System.Linq; using System.Security.Claims; -using System.Web; -using System.Web.Mvc; -using System.Web.Security; - using Bonobo.Git.Server.App_GlobalResources; using Bonobo.Git.Server.Configuration; -using Bonobo.Git.Server.Extensions; +using Bonobo.Git.Server.Helpers; using Bonobo.Git.Server.Models; using Bonobo.Git.Server.Security; - -using Bonobo.Git.Server.Helpers; -using System.DirectoryServices.AccountManagement; - -using Microsoft.Practices.Unity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; using Serilog; -using Microsoft.Owin.Security; namespace Bonobo.Git.Server.Controllers { public class AccountController : Controller { - [Dependency] - public IMembershipService MembershipService { get; set; } + private readonly IOptions _authSettings; - [Dependency] + public IMembershipService MembershipService { get; set; } public IRoleProvider RoleProvider { get; set; } - - [Dependency] public IAuthenticationProvider AuthenticationProvider { get; set; } + public AccountController( + IMembershipService membershipService, + IRoleProvider roleProvider, + IAuthenticationProvider authenticationProvider, + IOptions authSettings + ) + { + MembershipService = membershipService; + RoleProvider = roleProvider; + AuthenticationProvider = authenticationProvider; + _authSettings = authSettings; + } + [WebAuthorize] public ActionResult Detail(Guid id) { @@ -134,7 +134,7 @@ public ActionResult Edit(UserEditModel model) return RedirectToAction("Unauthorized", "Home"); } - if (AuthenticationSettings.DemoModeActive && User.IsInRole(Definitions.Roles.Administrator) && User.Id() == model.Id) + if (_authSettings.Value.DemoModeActive && User.IsInRole(Definitions.Roles.Administrator) && User.Id() == model.Id) { // Don't allow the admin user to be changed in demo mode return RedirectToAction("Unauthorized", "Home"); @@ -180,38 +180,39 @@ public ActionResult Edit(UserEditModel model) return View(model); } - public ActionResult CreateADUser() + public ActionResult CreateADUser([FromServices] ADHelper adHelper) { var efms = MembershipService as EFMembershipService; - - if ((!Request.IsAuthenticated) || efms == null) + + if ((!User.Identity.IsAuthenticated) || efms == null) { - Log.Warning("CreateADUser: can't run IsAuth: {IsAuth}, MemServ {MemServ}", - Request.IsAuthenticated, + Log.Warning("CreateADUser: can't run IsAuth: {IsAuth}, MemServ {MemServ}", + User.Identity.IsAuthenticated, MembershipService.GetType()); return RedirectToAction("Unauthorized", "Home"); } var credentials = User.Username(); - var adUser = ADHelper.GetUserPrincipal(credentials); + var adUser = adHelper.GetUserPrincipal(credentials); if (adUser != null) { var userId = adUser.Guid.GetValueOrDefault(Guid.NewGuid()); if (MembershipService.CreateUser(credentials, Guid.NewGuid().ToString(), adUser.GivenName, adUser.Surname, adUser.EmailAddress, userId)) { // 2 because we just added the user and there is the default admin user. - if (AuthenticationSettings.ImportWindowsAuthUsersAsAdmin || efms.UserCount() == 2) + if (_authSettings.Value.ImportWindowsAuthUsersAsAdmin || efms.UserCount() == 2) { Log.Information("Making AD user {User} into an admin", credentials); var id = MembershipService.GetUserModel(credentials).Id; - RoleProvider.AddUserToRoles(id, new[] {Definitions.Roles.Administrator}); + RoleProvider.AddUserToRoles(id, new[] { Definitions.Roles.Administrator }); // Add the administrator role to the Identity/cookie var Identity = (ClaimsIdentity)User.Identity; Identity.AddClaim(new Claim(ClaimTypes.Role, Definitions.Roles.Administrator)); - var AuthenticationManager = HttpContext.GetOwinContext().Authentication; - AuthenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(new ClaimsPrincipal(Identity), new AuthenticationProperties { IsPersistent = true }); + throw new NotImplementedException(); + //var AuthenticationManager = HttpContext.GetOwinContext().Authentication; + //AuthenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(new ClaimsPrincipal(Identity), new AuthenticationProperties { IsPersistent = true }); } return RedirectToAction("Index", "Repository"); @@ -230,7 +231,8 @@ public ActionResult CreateADUser() public ActionResult Create() { - if ((Request.IsAuthenticated && !User.IsInRole(Definitions.Roles.Administrator)) || (!Request.IsAuthenticated && !UserConfiguration.Current.AllowAnonymousRegistration)) + if ((Request.HttpContext.User.Identity.IsAuthenticated && !User.IsInRole(Definitions.Roles.Administrator)) + || (!Request.HttpContext.User.Identity.IsAuthenticated && !UserConfiguration.Current.AllowAnonymousRegistration)) { return RedirectToAction("Unauthorized", "Home"); } @@ -242,7 +244,8 @@ public ActionResult Create() [ValidateAntiForgeryToken] public ActionResult Create(UserCreateModel model) { - if ((Request.IsAuthenticated && !User.IsInRole(Definitions.Roles.Administrator)) || (!Request.IsAuthenticated && !UserConfiguration.Current.AllowAnonymousRegistration)) + if ((Request.HttpContext.User.Identity.IsAuthenticated && !User.IsInRole(Definitions.Roles.Administrator)) + || (!Request.HttpContext.User.Identity.IsAuthenticated && !UserConfiguration.Current.AllowAnonymousRegistration)) { return RedirectToAction("Unauthorized", "Home"); } @@ -264,7 +267,7 @@ public ActionResult Create(UserCreateModel model) } else { - AuthenticationProvider.SignIn(model.Username, Url.Action("Index", "Home"), false); + AuthenticationProvider.SignIn(this.HttpContext, model.Username, Url.Action("Index", "Home"), false); return new EmptyResult(); } } diff --git a/Bonobo.Git.Server/Controllers/GitController.cs b/Bonobo.Git.Server/Controllers/GitController.cs index 91bd95566..d12532a9b 100644 --- a/Bonobo.Git.Server/Controllers/GitController.cs +++ b/Bonobo.Git.Server/Controllers/GitController.cs @@ -1,37 +1,42 @@ using System; using System.IO; -using System.Net; -using System.Web.Mvc; +using System.IO.Compression; using Bonobo.Git.Server.Configuration; using Bonobo.Git.Server.Data; using Bonobo.Git.Server.Git; using Bonobo.Git.Server.Git.GitService; using Bonobo.Git.Server.Models; using Bonobo.Git.Server.Security; -using Ionic.Zlib; -using Microsoft.Practices.Unity; +using Microsoft.AspNetCore.Mvc; using Serilog; using Repository = LibGit2Sharp.Repository; namespace Bonobo.Git.Server.Controllers { - [GitAuthorize] + [GitAuthorize(AuthenticationSchemes = "Basic", Policy = "Git")] [RepositoryNameNormalizer("repositoryName")] public class GitController : Controller { - [Dependency] public IRepositoryPermissionService RepositoryPermissionService { get; set; } - - [Dependency] public IRepositoryRepository RepositoryRepository { get; set; } - - [Dependency] public IMembershipService MembershipService { get; set; } - - [Dependency] public IGitService GitService { get; set; } - public ActionResult SecureGetInfoRefs(String repositoryName, String service) + public GitController( + IRepositoryPermissionService repositoryPermissionService, + IRepositoryRepository repositoryRepository, + IMembershipService membershipService, + IGitService gitService + ) + { + RepositoryPermissionService = repositoryPermissionService; + RepositoryRepository = repositoryRepository; + MembershipService = membershipService; + GitService = gitService; + } + + [HttpGet("{repositoryName}.git/info/refs", Name = "SecureInfoRefs")] + public IActionResult SecureGetInfoRefs(String repositoryName, String service) { bool isPush = String.Equals("git-receive-pack", service, StringComparison.OrdinalIgnoreCase); @@ -52,7 +57,7 @@ public ActionResult SecureGetInfoRefs(String repositoryName, String service) } else { - return new HttpNotFoundResult(); + return new NotFoundResult(); } } @@ -63,7 +68,7 @@ public ActionResult SecureGetInfoRefs(String repositoryName, String service) } else { - Log.Warning("GitC: SecureGetInfoRefs unauth because User {UserId} doesn't have permission {Permission} on repo {RepositoryName}", + Log.Warning("GitC: SecureGetInfoRefs unauth because User {UserId} doesn't have permission {Permission} on repo {RepositoryName}", User.Id(), requiredLevel, repositoryName); @@ -71,12 +76,12 @@ public ActionResult SecureGetInfoRefs(String repositoryName, String service) } } - [HttpPost] - public ActionResult SecureUploadPack(String repositoryName) + [HttpPost("{repositoryName}.git/git-upload-pack", Name = "SecureUploadPack")] + public IActionResult SecureUploadPack(String repositoryName) { if (!RepositoryIsValid(repositoryName)) { - return new HttpNotFoundResult(); + return new NotFoundResult(); } if (RepositoryPermissionService.HasPermission(User.Id(), repositoryName, RepositoryAccessLevel.Pull)) @@ -89,12 +94,12 @@ public ActionResult SecureUploadPack(String repositoryName) } } - [HttpPost] - public ActionResult SecureReceivePack(String repositoryName) + [HttpPost("{repositoryName}.git/git-receive-pack", Name = "SecureReceivePack")] + public IActionResult SecureReceivePack(String repositoryName) { if (!RepositoryIsValid(repositoryName)) { - return new HttpNotFoundResult(); + return new NotFoundResult(); } if (RepositoryPermissionService.HasPermission(User.Id(), repositoryName, RepositoryAccessLevel.Push)) @@ -127,7 +132,7 @@ private bool TryCreateOnPush(string repositoryName) var user = MembershipService.GetUserModel(User.Id()); repository.Description = "Auto-created by push for " + user.DisplayName; repository.AnonymousAccess = false; - repository.Administrators = new[] {user}; + repository.Administrators = new[] { user }; if (!RepositoryRepository.Create(repository)) { // We can't add this to the repo store @@ -145,12 +150,13 @@ private bool TryCreateOnPush(string repositoryName) /// This is the action invoked if you browse to a .git URL /// We just redirect to the repo details page, which is basically what GitHub does /// - public ActionResult GitUrl(string repositoryName) + [HttpGet("{repositoryName}.git", Name = "GitBaseUrl")] + public IActionResult GitUrl(string repositoryName) { - return RedirectPermanent(Url.Action("Detail", "Repository", new { id = repositoryName})); + return RedirectPermanent(Url.Action("Detail", "Repository", new { id = repositoryName })); } - private ActionResult ExecuteReceivePack(string repositoryName) + private IActionResult ExecuteReceivePack(string repositoryName) { return new GitCmdResult( "application/x-git-receive-pack-result", @@ -164,7 +170,7 @@ private ActionResult ExecuteReceivePack(string repositoryName) }); } - private ActionResult ExecuteUploadPack(string repositoryName) + private IActionResult ExecuteUploadPack(string repositoryName) { return new GitCmdResult( "application/x-git-upload-pack-result", @@ -178,7 +184,7 @@ private ActionResult ExecuteUploadPack(string repositoryName) }); } - private ActionResult GetInfoRefs(String repositoryName, String service) + private IActionResult GetInfoRefs(String repositoryName, String service) { Response.StatusCode = 200; @@ -192,22 +198,22 @@ private ActionResult GetInfoRefs(String repositoryName, String service) { GitService.ExecuteServiceByName( Guid.NewGuid().ToString("N"), - repositoryName, - serviceName, + repositoryName, + serviceName, new ExecutionOptions() { AdvertiseRefs = true }, GetInputStream(), outStream ); - }, + }, advertiseRefsContent); } - private ActionResult UnauthorizedResult() + private IActionResult UnauthorizedResult() { - Response.Clear(); - Response.AddHeader("WWW-Authenticate", "Basic realm=\"Bonobo Git\""); - - return new HttpStatusCodeResult(401); + //Response.Body.Clear(); + Response.Headers.Add("WWW-Authenticate", "Basic realm=\"Bonobo Git\""); + + return new StatusCodeResult(401); } private static String FormatMessage(String input) @@ -240,27 +246,27 @@ private Stream GetInputStream(bool disableBuffer = false) { // For really large uploads we need to get a bufferless input stream and disable the max // request length. - Stream requestStream = disableBuffer ? + Stream requestStream = Request.Body;/* disableBuffer ? Request.GetBufferlessInputStream(disableMaxRequestLength: true) : - Request.GetBufferedInputStream(); + Request.GetBufferedInputStream();*/ return Request.Headers["Content-Encoding"] == "gzip" ? new GZipStream(requestStream, CompressionMode.Decompress) : requestStream; } - protected override void OnException(ExceptionContext filterContext) - { - Exception exception = filterContext.Exception; - Log.Error(exception, "Error caught in GitController"); - filterContext.Result = new ContentResult { Content = exception.ToString() }; + //protected override void OnException(ExceptionContext filterContext) + //{ + // Exception exception = filterContext.Exception; + // Log.Error(exception, "Error caught in GitController"); + // filterContext.Result = new ContentResult { Content = exception.ToString() }; - filterContext.ExceptionHandled = true; + // filterContext.ExceptionHandled = true; - filterContext.HttpContext.Response.Clear(); - filterContext.HttpContext.Response.StatusCode = 500; - filterContext.HttpContext.Response.StatusDescription = "Exception in GitController"; - filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; - } + // filterContext.HttpContext.Response.Clear(); + // filterContext.HttpContext.Response.StatusCode = 500; + // filterContext.HttpContext.Response.StatusDescription = "Exception in GitController"; + // filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; + //} } } diff --git a/Bonobo.Git.Server/Controllers/HomeController.cs b/Bonobo.Git.Server/Controllers/HomeController.cs index 3668cc281..c2c257686 100644 --- a/Bonobo.Git.Server/Controllers/HomeController.cs +++ b/Bonobo.Git.Server/Controllers/HomeController.cs @@ -1,37 +1,38 @@ using System; -using System.Collections.Generic; -using System.Globalization; using System.Linq; -using System.Security.Claims; using System.Text; +using System.Threading.Tasks; using System.Web; -using System.Web.Caching; -using System.Web.Mvc; - using Bonobo.Git.Server.App_GlobalResources; using Bonobo.Git.Server.Configuration; using Bonobo.Git.Server.Data; +using Bonobo.Git.Server.Extensions; using Bonobo.Git.Server.Helpers; using Bonobo.Git.Server.Models; using Bonobo.Git.Server.Security; - -using Microsoft.Owin.Security; -using Microsoft.Owin.Security.Cookies; -using Microsoft.Practices.Unity; -using Bonobo.Git.Server.Owin.Windows; -using System.Configuration; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; namespace Bonobo.Git.Server.Controllers { public class HomeController : Controller { - [Dependency] - public IMembershipService MembershipService { get; set; } + private readonly IOptions _appSettings; - [Dependency] - public IAuthenticationProvider AuthenticationProvider { get; set; } + public HomeController( + IMembershipService membershipService, + IAuthenticationProvider authenticationProvider, + IDatabaseResetManager resetManager, + IOptions appSettings) + { + MembershipService = membershipService; + AuthenticationProvider = authenticationProvider; + ResetManager = resetManager; + _appSettings = appSettings; + } - [Dependency] + public IMembershipService MembershipService { get; set; } + public IAuthenticationProvider AuthenticationProvider { get; set; } public IDatabaseResetManager ResetManager { get; set; } public ActionResult Index() @@ -39,24 +40,24 @@ public ActionResult Index() return RedirectToAction("Index", "Repository"); } - public ActionResult PageNotFound() + public IActionResult PageNotFound() { return View(); } - public ActionResult ServerError() + public IActionResult ServerError() { return View(); } - public ActionResult Error() + public IActionResult Error() { return View(); } private string CheckForPasswordResetUsername(string digest) { - var cacheObj = MvcApplication.Cache[HttpUtility.UrlDecode(digest)]; + object cacheObj = null;// MvcApplication.Cache[HttpUtility.UrlDecode(digest)]; if (cacheObj == null) { return null; @@ -64,19 +65,19 @@ private string CheckForPasswordResetUsername(string digest) return cacheObj.ToString(); } - public ActionResult ResetPassword(string digest) + public ActionResult ResetPassword([FromServices]BonoboGitServerContext db, string digest) { string username = CheckForPasswordResetUsername(digest); - if (username != null ) + if (username != null) { - using (var db = new BonoboGitServerContext()) + //using (var db = new BonoboGitServerContext()) { var user = db.Users.FirstOrDefault(x => x.Username.Equals(username, StringComparison.OrdinalIgnoreCase)); if (user == null) { throw new UnauthorizedAccessException("Unknown user " + username); } - return View(new ResetPasswordModel { Username = username, Digest = digest}); + return View(new ResetPasswordModel { Username = username, Digest = digest }); } } else @@ -88,7 +89,7 @@ public ActionResult ResetPassword(string digest) [HttpPost] [ValidateAntiForgeryToken] - public ActionResult ResetPassword(ResetPasswordModel model) + public ActionResult ResetPassword([FromServices]BonoboGitServerContext db, ResetPasswordModel model) { if (ModelState.IsValid) { @@ -97,13 +98,13 @@ public ActionResult ResetPassword(ResetPasswordModel model) { throw new UnauthorizedAccessException("Invalid password reset form"); } - using (var db = new BonoboGitServerContext()) + //using (var db = new BonoboGitServerContext()) { var user = db.Users.FirstOrDefault(x => x.Username.Equals(model.Username, StringComparison.OrdinalIgnoreCase)); if (user == null) { TempData["ResetSuccess"] = false; - Response.AppendToLog("FAILURE"); + //Response.AppendToLog("FAILURE"); } else { @@ -130,15 +131,15 @@ public ActionResult ForgotPassword(ForgotPasswordModel model) if (user == null) { ModelState.AddModelError("", Resources.Home_ForgotPassword_UserNameFailure); - Response.AppendToLog("FAILURE"); + //Response.AppendToLog("FAILURE"); } else { string token = MembershipService.GenerateResetToken(user.Username); - MvcApplication.Cache.Add(token, model.Username, DateTimeOffset.Now.AddHours(1)); + //MvcApplication.Cache.Add(token, model.Username, DateTimeOffset.Now.AddHours(1)); // Passing Requust.Url.Scheme to Url.Action forces it to generate a full URL - var resetUrl = Url.Action("ResetPassword", "Home", new {digest = HttpUtility.UrlEncode(Encoding.UTF8.GetBytes(token))},Request.Url.Scheme); + var resetUrl = Url.Action("ResetPassword", "Home", new { digest = HttpUtility.UrlEncode(Encoding.UTF8.GetBytes(token)) }, Request.Scheme); TempData["SendSuccess"] = MembershipHelper.SendForgotPasswordEmail(user, resetUrl); } @@ -146,23 +147,23 @@ public ActionResult ForgotPassword(ForgotPasswordModel model) return View(model); } - [AllowAnonymous] - [HttpGet] - public ActionResult WindowsLogin(string returnUrl) - { - if (String.IsNullOrEmpty(User.Identity.Name)) - { - AuthenticationProperties authenticationProperties = new AuthenticationProperties() - { - RedirectUri = returnUrl - }; + //[AllowAnonymous] + //[HttpGet] + //public ActionResult WindowsLogin(string returnUrl) + //{ + // if (String.IsNullOrEmpty(User.Identity.Name)) + // { + // AuthenticationProperties authenticationProperties = new AuthenticationProperties() + // { + // RedirectUri = returnUrl + // }; - Request.GetOwinContext().Authentication.Challenge(authenticationProperties, WindowsAuthenticationDefaults.AuthenticationType); - return new EmptyResult(); - } + // Request.GetOwinContext().Authentication.Challenge(authenticationProperties, WindowsAuthenticationDefaults.AuthenticationType); + // return new EmptyResult(); + // } - return Redirect(returnUrl); - } + // return Redirect(returnUrl); + //} public ActionResult LogOn(string returnUrl) { @@ -176,7 +177,7 @@ public ActionResult LogOnWithResetOption(string returnUrl) [HttpPost] [ValidateAntiForgeryToken] - public ActionResult LogOn(LogOnModel model) + public async Task LogOn(LogOnModel model) { if (ModelState.IsValid) { @@ -184,9 +185,9 @@ public ActionResult LogOn(LogOnModel model) switch (result) { case ValidationResult.Success: - AuthenticationProvider.SignIn(model.Username, Url.IsLocalUrl(model.ReturnUrl) ? model.ReturnUrl : Url.Action("Index", "Home"), model.RememberMe); - Response.AppendToLog("SUCCESS"); - if (Request.IsLocal && model.DatabaseResetCode > 0 && model.Username == "admin" && ConfigurationManager.AppSettings["AllowDBReset"] == "true" ) + await AuthenticationProvider.SignIn(HttpContext, model.Username, Url.IsLocalUrl(model.ReturnUrl) ? model.ReturnUrl : Url.Action("Index", "Home"), model.RememberMe); + //Response.AppendToLog("SUCCESS"); + if (HttpContext.IsLocal() && model.DatabaseResetCode > 0 && model.Username == "admin" && _appSettings.Value.AllowDBReset) { ResetManager.DoReset(model.DatabaseResetCode); } @@ -195,9 +196,9 @@ public ActionResult LogOn(LogOnModel model) return new RedirectResult("~/Home/Unauthorized"); default: ModelState.AddModelError("", Resources.Home_LogOn_UsernamePasswordIncorrect); - Response.AppendToLog("FAILURE"); + //Response.AppendToLog("FAILURE"); break; - } + } } return View(model); @@ -205,26 +206,25 @@ public ActionResult LogOn(LogOnModel model) public ActionResult LogOff() { - AuthenticationProvider.SignOut(); + AuthenticationProvider.SignOut(HttpContext); return RedirectToAction("Index", "Home"); } - public ActionResult Unauthorized() + public new ActionResult Unauthorized() { return View(); } public ActionResult ChangeCulture(string lang, string returnUrl) { - Session["Culture"] = new CultureInfo(lang); + //Session["Culture"] = new CultureInfo(lang); return Redirect(returnUrl); } - public ActionResult Diagnostics() + public ActionResult Diagnostics([FromServices]DiagnosticReporter verifier) { - if (Request.IsLocal) + if (HttpContext.IsLocal()) { - var verifier = new DiagnosticReporter(); return Content(verifier.GetVerificationReport(), "text/plain", Encoding.UTF8); } else diff --git a/Bonobo.Git.Server/Controllers/RepositoryController.cs b/Bonobo.Git.Server/Controllers/RepositoryController.cs index 81c4c61a0..baf96c014 100644 --- a/Bonobo.Git.Server/Controllers/RepositoryController.cs +++ b/Bonobo.Git.Server/Controllers/RepositoryController.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; using System.IO; +using System.IO.Compression; using System.Linq; -using System.Text; +using System.Security.Principal; using System.Text.RegularExpressions; -using System.Web.Mvc; using Bonobo.Git.Server.App_GlobalResources; using Bonobo.Git.Server.Configuration; using Bonobo.Git.Server.Data; @@ -12,30 +12,39 @@ using Bonobo.Git.Server.Helpers; using Bonobo.Git.Server.Models; using Bonobo.Git.Server.Security; -using Ionic.Zip; -using Microsoft.Practices.Unity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; using MimeTypes; -using System.Security.Principal; namespace Bonobo.Git.Server.Controllers { public class RepositoryController : Controller { - [Dependency] - public ITeamRepository TeamRepository { get; set; } + private readonly IOptions _appSettings; - [Dependency] + public ITeamRepository TeamRepository { get; set; } public IRepositoryRepository RepositoryRepository { get; set; } - - [Dependency] public IMembershipService MembershipService { get; set; } - - [Dependency] public IRepositoryPermissionService RepositoryPermissionService { get; set; } - - [Dependency] public IAuthenticationProvider AuthenticationProvider { get; set; } + public RepositoryController( + ITeamRepository teamRepository, + IRepositoryRepository repositoryRepository, + IMembershipService membershipService, + IRepositoryPermissionService repositoryPermissionService, + IAuthenticationProvider authenticationProvider, + IOptions appSettings) + { + TeamRepository = teamRepository; + RepositoryRepository = repositoryRepository; + MembershipService = membershipService; + RepositoryPermissionService = repositoryPermissionService; + AuthenticationProvider = authenticationProvider; + _appSettings = appSettings; + } + public ActionResult Index(string sortGroup = null, string searchString = null) { var unorderedRepositoryDetails = GetIndexModel().ToList(); @@ -51,7 +60,7 @@ public ActionResult Index(string sortGroup = null, string searchString = null) (!string.IsNullOrEmpty(a.Description) && a.Description.ToLower().Contains(search))) .ToList(); } - foreach(var item in unorderedRepositoryDetails) + foreach (var item in unorderedRepositoryDetails) { SetGitUrls(item); } @@ -88,7 +97,7 @@ public ActionResult Edit(RepositoryDetailModel model) { RepositoryRepository.Update(repoModel); } - catch (System.Data.Entity.Infrastructure.DbUpdateException) + catch (DbUpdateException) { MoveRepo(repoModel, existingRepo); } @@ -237,13 +246,9 @@ public ActionResult Detail(Guid id) /// void SetGitUrls(RepositoryDetailModel model) { - string serverAddress = System.Configuration.ConfigurationManager.AppSettings["GitServerPath"] - ?? string.Format("{0}://{1}{2}{3}/", - Request.Url.Scheme, - Request.Url.Host, - (Request.Url.IsDefaultPort ? "" : (":" + Request.Url.Port)), - Request.ApplicationPath == "/" ? "" : Request.ApplicationPath - ); + string serverAddress = _appSettings.Value.GitServerPath + ?? + $"{Request.Scheme}://{Request.Host}{""/*Request.ApplicationPath == "/" ? "" : Request.ApplicationPath*/}/"; model.GitUrl = String.Concat(serverAddress, model.Name, ".git"); if (User.Identity.IsAuthenticated) @@ -256,7 +261,7 @@ void SetGitUrls(RepositoryDetailModel model) [WebAuthorizeRepository(AllowAnonymousAccessWhenRepositoryAllowsIt = true)] public ActionResult Tree(Guid id, string encodedName, string encodedPath) { - bool includeDetails = Request.IsAjaxRequest(); + bool includeDetails = false;// Request.IsAjaxRequest(); ViewBag.ID = id; var name = PathEncoder.Decode(encodedName); @@ -289,7 +294,7 @@ public ActionResult Tree(Guid id, string encodedName, string encodedPath) if (includeDetails) { - return Json(model, JsonRequestBehavior.AllowGet); + return Json(model/*, JsonRequestBehavior.AllowGet*/); } else { @@ -347,7 +352,7 @@ public ActionResult Raw(Guid id, string encodedName, string encodedPath, bool di } } - return HttpNotFound(); + return NotFound(); } [WebAuthorizeRepository] @@ -376,32 +381,26 @@ public ActionResult Download(Guid id, string encodedName, string encodedPath) var name = PathEncoder.Decode(encodedName); var path = PathEncoder.Decode(encodedPath); - Response.BufferOutput = false; - Response.Charset = ""; + //Response.BufferOutput = false; + //Response.Charset = ""; Response.ContentType = "application/zip"; var repo = RepositoryRepository.GetRepository(id); string headerValue = ContentDispositionUtil.GetHeaderValue((name ?? repo.Name) + ".zip"); - Response.AddHeader("Content-Disposition", headerValue); + Response.Headers.Add("Content-Disposition", headerValue); - using (var outputZip = new ZipFile()) + using (var zipArchive = new ZipArchive(new WriteOnlyStreamWrapper(Response.Body), ZipArchiveMode.Create, true)) { - outputZip.UseZip64WhenSaving = Zip64Option.Always; - outputZip.AlternateEncodingUsage = ZipOption.AsNecessary; - outputZip.AlternateEncoding = Encoding.Unicode; - using (var browser = new RepositoryBrowser(Path.Combine(UserConfiguration.Current.Repositories, repo.Name))) { - AddTreeToZip(browser, name, path, outputZip); + AddTreeToZip(browser, name, path, zipArchive); } - - outputZip.Save(Response.OutputStream); - - return new EmptyResult(); } + + return new EmptyResult(); } - private static void AddTreeToZip(RepositoryBrowser browser, string name, string path, ZipFile outputZip) + private static void AddTreeToZip(RepositoryBrowser browser, string name, string path, ZipArchive outputZip) { string referenceName; var treeNode = browser.BrowseTree(name, path, out referenceName); @@ -410,13 +409,16 @@ private static void AddTreeToZip(RepositoryBrowser browser, string name, string { if (item.IsLink) { - outputZip.AddDirectoryByName(Path.Combine(item.TreeName, item.Path)); + var zipEntry = outputZip.CreateEntry(Path.Combine(item.TreeName, item.Path)); } else if (!item.IsTree) { string blobReferenceName; var model = browser.BrowseBlob(item.TreeName, item.Path, out blobReferenceName); - outputZip.AddEntry(Path.Combine(item.TreeName, item.Path), model.Data); + + var zipEntry = outputZip.CreateEntry(Path.Combine(item.TreeName, item.Path)); + using (var zipStream = zipEntry.Open()) + zipStream.Write(model.Data, 0, model.Data.Length); } else { @@ -442,7 +444,8 @@ public ActionResult Tags(Guid id, string encodedName, int page = 1) var commits = browser.GetTags(name, page, 10, out referenceName, out totalCount); PopulateBranchesData(browser, referenceName); ViewBag.TotalCount = totalCount; - return View(new RepositoryCommitsModel { + return View(new RepositoryCommitsModel + { Commits = commits, Name = repo.Name, Logo = new RepositoryLogoDetailModel(repo.Logo) @@ -503,7 +506,8 @@ public ActionResult Commits(Guid id, string encodedName, int? page = null) } commit.Links = links; } - return View(new RepositoryCommitsModel { + return View(new RepositoryCommitsModel + { Commits = commits, Name = repo.Name, Logo = new RepositoryLogoDetailModel(repo.Logo) @@ -572,10 +576,10 @@ public ActionResult Clone(Guid id, RepositoryDetailModel model) string sourceRepositoryPath = Path.Combine(UserConfiguration.Current.Repositories, source_repo.Name); LibGit2Sharp.CloneOptions options = new LibGit2Sharp.CloneOptions() - { - IsBare = true, - Checkout = false - }; + { + IsBare = true, + Checkout = false + }; LibGit2Sharp.Repository.Clone(sourceRepositoryPath, targetRepositoryPath, options); @@ -619,7 +623,8 @@ public ActionResult History(Guid id, string encodedPath, string encodedName) var name = PathEncoder.Decode(encodedName); string referenceName; var commits = browser.GetHistory(path, name, out referenceName); - return View(new RepositoryCommitsModel { + return View(new RepositoryCommitsModel + { Commits = commits, Name = repo.Name, Logo = new RepositoryLogoDetailModel(repo.Logo) @@ -645,7 +650,7 @@ private void PopulateCheckboxListData(ref RepositoryDetailModel model) { model.Administrators = model.PostedSelectedAdministrators.Select(x => MembershipService.GetUserModel(x)).ToArray(); } - model.PostedSelectedAdministrators = new Guid[0]; + model.PostedSelectedAdministrators = new Guid[0]; model.PostedSelectedUsers = new Guid[0]; model.PostedSelectedTeams = new Guid[0]; } @@ -654,9 +659,9 @@ private void PopulateCheckboxListData(ref RepositoryDetailModel model) [WebAuthorize(Roles = Definitions.Roles.Administrator)] // This takes an irrelevant ID, because there isn't a good route // to RepositoryController for anything without an Id which isn't the Index action - public ActionResult Rescan(string id) + public ActionResult Rescan([FromServices]IRepositoryRepository repositoryRepository, string id) { - new RepositorySynchronizer().Run(); + new RepositorySynchronizer(repositoryRepository).Run(); return RedirectToAction("Index"); } diff --git a/Bonobo.Git.Server/Controllers/SettingsController.cs b/Bonobo.Git.Server/Controllers/SettingsController.cs index 54a9b9616..b81b91095 100644 --- a/Bonobo.Git.Server/Controllers/SettingsController.cs +++ b/Bonobo.Git.Server/Controllers/SettingsController.cs @@ -1,20 +1,22 @@ using System; -using System.Collections.Generic; -using System.Configuration; -using System.Globalization; using System.IO; -using System.Linq; -using System.Web; -using System.Web.Configuration; -using System.Web.Mvc; using Bonobo.Git.Server.App_GlobalResources; using Bonobo.Git.Server.Configuration; using Bonobo.Git.Server.Models; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; namespace Bonobo.Git.Server.Controllers { public class SettingsController : Controller { + private readonly IOptions _authSettings; + + public SettingsController(IOptions authSettings) + { + _authSettings = authSettings; + } + [WebAuthorize(Roles = Definitions.Roles.Administrator)] public ActionResult Index() { @@ -41,7 +43,8 @@ public ActionResult Index() [WebAuthorize(Roles = Definitions.Roles.Administrator)] public ActionResult Index(GlobalSettingsModel model) { - if (AuthenticationSettings.DemoModeActive) + + if (_authSettings.Value.DemoModeActive) { return RedirectToAction("Unauthorized", "Home"); } @@ -50,9 +53,9 @@ public ActionResult Index(GlobalSettingsModel model) { try { - if (Directory.Exists(Path.IsPathRooted(model.RepositoryPath) - ? model.RepositoryPath - : HttpContext.Server.MapPath(model.RepositoryPath))) + if (Directory.Exists(/*Path.IsPathRooted(model.RepositoryPath) + ?*/ model.RepositoryPath/* + : HttpContext.Server.MapPath(model.RepositoryPath)*/)) { UserConfiguration.Current.AllowAnonymousPush = model.AllowAnonymousPush; UserConfiguration.Current.RepositoryPath = model.RepositoryPath; @@ -69,7 +72,7 @@ public ActionResult Index(GlobalSettingsModel model) UserConfiguration.Current.LinksUrl = model.LinksUrl; UserConfiguration.Current.Save(); - this.Session["Culture"] = new CultureInfo(model.DefaultLanguage); + //this.Session["Culture"] = new CultureInfo(model.DefaultLanguage); TempData["UpdateSuccess"] = true; return RedirectToAction("Index"); diff --git a/Bonobo.Git.Server/Controllers/TeamController.cs b/Bonobo.Git.Server/Controllers/TeamController.cs index 057303feb..613fce6d8 100644 --- a/Bonobo.Git.Server/Controllers/TeamController.cs +++ b/Bonobo.Git.Server/Controllers/TeamController.cs @@ -1,28 +1,27 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Web.Mvc; - +using Bonobo.Git.Server.App_GlobalResources; using Bonobo.Git.Server.Data; using Bonobo.Git.Server.Models; using Bonobo.Git.Server.Security; -using Bonobo.Git.Server.App_GlobalResources; - -using Microsoft.Practices.Unity; +using Microsoft.AspNetCore.Mvc; namespace Bonobo.Git.Server.Controllers { public class TeamController : Controller { - [Dependency] public IMembershipService MembershipService { get; set; } - - [Dependency] public IRepositoryRepository RepositoryRepository { get; set; } - - [Dependency] public ITeamRepository TeamRepository { get; set; } + public TeamController(IMembershipService membershipService, IRepositoryRepository repositoryRepository, ITeamRepository teamRepository) + { + MembershipService = membershipService; + RepositoryRepository = repositoryRepository; + TeamRepository = teamRepository; + } + [WebAuthorize(Roles = Definitions.Roles.Administrator)] public ActionResult Index() { @@ -40,7 +39,7 @@ public ActionResult Edit(Guid id) [ValidateAntiForgeryToken] [WebAuthorize(Roles = Definitions.Roles.Administrator)] public ActionResult Edit(TeamEditModel model) - { + { if (ModelState.IsValid) { TeamRepository.Update(ConvertTeamDetailModel(model)); @@ -53,7 +52,7 @@ public ActionResult Edit(TeamEditModel model) [WebAuthorize(Roles = Definitions.Roles.Administrator)] public ActionResult Create() { - var model = new TeamEditModel + var model = new TeamEditModel { AllUsers = MembershipService.GetAllUsers().ToArray(), SelectedUsers = new UserModel[] { } @@ -116,7 +115,6 @@ public ActionResult Detail(Guid id) return View(ConvertDetailTeamModel(TeamRepository.GetTeam(id))); } - private TeamDetailModelList ConvertTeamModels(IEnumerable models) { var result = new TeamDetailModelList(); diff --git a/Bonobo.Git.Server/Controllers/ValidationController.cs b/Bonobo.Git.Server/Controllers/ValidationController.cs index 569003fce..68a99a7bb 100644 --- a/Bonobo.Git.Server/Controllers/ValidationController.cs +++ b/Bonobo.Git.Server/Controllers/ValidationController.cs @@ -1,37 +1,37 @@ -using Bonobo.Git.Server.Attributes; +using System; +using System.ComponentModel.DataAnnotations; +using Bonobo.Git.Server.Attributes; using Bonobo.Git.Server.Data; using Bonobo.Git.Server.Security; -using Microsoft.Practices.Unity; -using System; -using System.ComponentModel.DataAnnotations; -using System.Web.Mvc; -using System.Web.UI; +using Microsoft.AspNetCore.Mvc; namespace Bonobo.Git.Server.Controllers { - [OutputCache(Location = OutputCacheLocation.None, NoStore = true)] + //[OutputCache(Location = OutputCacheLocation.None, NoStore = true)] public class ValidationController : Controller { - [Dependency] public IRepositoryRepository RepoRepo { get; set; } - - [Dependency] public IMembershipService MembershipService { get; set; } - - [Dependency] public ITeamRepository TeamRepo { get; set; } + public ValidationController(IRepositoryRepository repoRepo, IMembershipService membershipService, ITeamRepository teamRepo) + { + RepoRepo = repoRepo; + MembershipService = membershipService; + TeamRepo = teamRepo; + } + public ActionResult UniqueNameRepo(string name, Guid? id) { bool isUnique = RepoRepo.NameIsUnique(name, id ?? Guid.Empty); - return Json(isUnique, JsonRequestBehavior.AllowGet); + return Json(isUnique/*, JsonRequestBehavior.AllowGet*/); } public ActionResult UniqueNameUser(string Username, Guid? id) { var possibly_existent_user = MembershipService.GetUserModel(Username); bool exists = (possibly_existent_user != null) && (id != possibly_existent_user.Id); - return Json(!exists, JsonRequestBehavior.AllowGet); + return Json(!exists/*, JsonRequestBehavior.AllowGet*/); } public ActionResult UniqueNameTeam(string name, Guid? id) @@ -39,19 +39,19 @@ public ActionResult UniqueNameTeam(string name, Guid? id) var possibly_existing_team = TeamRepo.GetTeam(name); bool exists = (possibly_existing_team != null) && (id != possibly_existing_team.Id); // false when repo exists! - return Json(!exists, JsonRequestBehavior.AllowGet); + return Json(!exists/*, JsonRequestBehavior.AllowGet*/); } public ActionResult IsValidRegex(string LinksRegex) { - var validationContext = new ValidationContext(Request.RequestContext); + var validationContext = new ValidationContext(Request.HttpContext); var isvalidregexattr = new IsValidRegexAttribute(); var result = isvalidregexattr.GetValidationResult(LinksRegex, validationContext); if (result == System.ComponentModel.DataAnnotations.ValidationResult.Success) { - return Json(true, JsonRequestBehavior.AllowGet); + return Json(true/*, JsonRequestBehavior.AllowGet*/); } - return Json(result.ErrorMessage, JsonRequestBehavior.AllowGet); + return Json(result.ErrorMessage/*, JsonRequestBehavior.AllowGet*/); } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Data/ADBackend.cs b/Bonobo.Git.Server/Data/ADBackend.cs index 74ac59e57..2220fc16b 100644 --- a/Bonobo.Git.Server/Data/ADBackend.cs +++ b/Bonobo.Git.Server/Data/ADBackend.cs @@ -1,46 +1,47 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -using Bonobo.Git.Server.Models; using System.DirectoryServices.AccountManagement; -using System.Threading.Tasks; -using Bonobo.Git.Server.Configuration; -using Bonobo.Git.Server.Security; +using System.Linq; using System.Threading; -using Microsoft.Practices.Unity; +using Bonobo.Git.Server.Configuration; using Bonobo.Git.Server.Helpers; +using Bonobo.Git.Server.Models; +using Bonobo.Git.Server.Security; using Serilog; namespace Bonobo.Git.Server.Data { public sealed class ADBackend { - [Dependency] - public IMembershipService MembershipService { get; set; } + private IMembershipService _membershipService; + private readonly ADHelper _adHelper; + + public ADBackend(IMembershipService membershipService, ADHelper adHelper) + { + _membershipService = membershipService; + _adHelper = adHelper; + } public ADBackendStore Repositories { get { return repositories.Value; } } public ADBackendStore Teams { get { return teams.Value; } } public ADBackendStore Users { get { return users.Value; } } public ADBackendStore Roles { get { return roles.Value; } } - public static ADBackend Instance - { - get - { - if (instance == null) - { - lock (instanceLock) - { - if (instance == null) - { - instance = new ADBackend(true); - } - } - } - return instance; - } - } + //public static ADBackend Instance + //{ + // get + // { + // if (instance == null) + // { + // lock (instanceLock) + // { + // if (instance == null) + // { + // instance = new ADBackend(true); + // } + // } + // } + // return instance; + // } + //} public static void ResetSingletonForTesting() { @@ -107,7 +108,7 @@ private void Update(object state) UpdateRoles(); UpdateRepositories(); } - catch(Exception ex) + catch (Exception ex) { Log.Error(ex, "Failed to update data from AD"); } @@ -146,7 +147,7 @@ private UserModel GetUserModelFromPrincipal(UserPrincipal user) private void UpdateRepositories() { - foreach(RepositoryModel repository in Repositories) + foreach (RepositoryModel repository in Repositories) { UserModel[] usersToRemove = repository.Users.Where(repoUser => !Users.Select(u => u.Id).Contains(repoUser.Id)).ToArray(); TeamModel[] teamsToRemove = repository.Teams.Where(repoTeam => !Teams.Select(team => team.Id).Contains(repoTeam.Id)).ToArray(); @@ -163,16 +164,15 @@ private void UpdateUsers() { try { - GroupPrincipal group; - using (var pc = ADHelper.GetMembersGroup(out group)) + using (var pc = _adHelper.GetMembersGroup(out GroupPrincipal group)) { - foreach (Guid Id in Users.Select(x => x.Id).Where(x => ADHelper.GetUserPrincipal(x) == null)) + foreach (Guid Id in Users.Select(x => x.Id).Where(x => _adHelper.GetUserPrincipal(x) == null)) { Users.Remove(Id); } foreach (string username in group.GetMembers(true).OfType().Select(x => x.UserPrincipalName).Where(x => x != null)) { - using (var principal = ADHelper.GetUserPrincipal(username)) + using (var principal = _adHelper.GetUserPrincipal(username)) { UserModel user = GetUserModelFromPrincipal(principal); if (user != null) @@ -196,8 +196,8 @@ private void UpdateTeams() Teams.Remove(team.Id); } - if(MembershipService == null) - MembershipService = new ADMembershipService(); + //if (_membershipService == null) + // _membershipService = new ADMembershipService(); foreach (string teamName in ActiveDirectorySettings.TeamNameToGroupNameMapping.Keys) { @@ -206,14 +206,14 @@ private void UpdateTeams() Log.Verbose("AD: Updating team {TeamName} (groupName {GroupName})", teamName, groupName); try { - GroupPrincipal group; - using (var pc = ADHelper.GetPrincipalGroup(groupName, out group)) + using (var pc = _adHelper.GetPrincipalGroup(groupName, out GroupPrincipal group)) { - TeamModel teamModel = new TeamModel() { + TeamModel teamModel = new TeamModel() + { Id = group.Guid.Value, Description = group.Description, Name = teamName, - Members = group.GetMembers(true).Select(x => MembershipService.GetUserModel(x.Guid.Value)).Where(o => o != null).ToArray() + Members = group.GetMembers(true).Select(x => _membershipService.GetUserModel(x.Guid.Value)).Where(o => o != null).ToArray() }; Teams.AddOrUpdate(teamModel); Log.Verbose("AD: Updated team {TeamName} OK", teamName); @@ -232,15 +232,14 @@ private void UpdateRoles() { Roles.Remove(role.Id); } - + foreach (string roleName in ActiveDirectorySettings.RoleNameToGroupNameMapping.Keys) { string groupName = ActiveDirectorySettings.RoleNameToGroupNameMapping[roleName]; Log.Verbose("AD: Updating role {RoleName} (groupName {GroupName})", roleName, groupName); try { - GroupPrincipal group; - using (var pc = ADHelper.GetPrincipalGroup(groupName, out group)) + using (var pc = _adHelper.GetPrincipalGroup(groupName, out GroupPrincipal group)) { RoleModel roleModel = new RoleModel { diff --git a/Bonobo.Git.Server/Data/ADBackendStore.cs b/Bonobo.Git.Server/Data/ADBackendStore.cs index d49045a06..626730f50 100644 --- a/Bonobo.Git.Server/Data/ADBackendStore.cs +++ b/Bonobo.Git.Server/Data/ADBackendStore.cs @@ -1,17 +1,10 @@ -using Newtonsoft.Json; -using System; +using System; +using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; -using System.Configuration; using System.IO; -using System.Linq; -using System.Security.Cryptography; -using System.Text; -using System.Web; -using System.Collections; -using System.Web.Hosting; -using Bonobo.Git.Server.Configuration; using Bonobo.Git.Server.Helpers; +using Newtonsoft.Json; using Serilog; namespace Bonobo.Git.Server.Data @@ -104,7 +97,7 @@ private bool Store(T item) File.WriteAllText(itemFilename, JsonConvert.SerializeObject(item)); result = true; } - catch(Exception ex) + catch (Exception ex) { Log.Error(ex, "AD: Store"); } @@ -157,7 +150,7 @@ private ConcurrentDictionary LoadContent() private string GetItemFilename(T item) { - return item.Id+".json"; + return item.Id + ".json"; } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Data/ADRepositoryRepository.cs b/Bonobo.Git.Server/Data/ADRepositoryRepository.cs index 6db4fe31f..c9d7306b6 100644 --- a/Bonobo.Git.Server/Data/ADRepositoryRepository.cs +++ b/Bonobo.Git.Server/Data/ADRepositoryRepository.cs @@ -7,6 +7,12 @@ namespace Bonobo.Git.Server.Data { public class ADRepositoryRepository : IRepositoryRepository { + private readonly ADBackend _adBackend; + + public ADRepositoryRepository(ADBackend adBackend) + { + this._adBackend = adBackend; + } public bool Create(RepositoryModel repository) { // Make sure we don't already have a repo with this name @@ -16,12 +22,12 @@ public bool Create(RepositoryModel repository) } repository.Id = Guid.NewGuid(); - return ADBackend.Instance.Repositories.Add(SanitizeModel(repository)); + return _adBackend.Repositories.Add(SanitizeModel(repository)); } public void Delete(Guid id) { - ADBackend.Instance.Repositories.Remove(id); + _adBackend.Repositories.Remove(id); } public bool NameIsUnique(string newName, Guid ignoreRepoId) @@ -32,19 +38,19 @@ public bool NameIsUnique(string newName, Guid ignoreRepoId) public IList GetAllRepositories() { - return ADBackend.Instance.Repositories.ToList(); + return _adBackend.Repositories.ToList(); } public RepositoryModel GetRepository(string name) { return - ADBackend.Instance.Repositories.FirstOrDefault( + _adBackend.Repositories.FirstOrDefault( repo => repo.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); } - + public RepositoryModel GetRepository(Guid id) { - var result = ADBackend.Instance.Repositories[id]; + var result = _adBackend.Repositories[id]; if (result == null) { // Ensure that we behave the same way as the EF reporepo @@ -64,7 +70,7 @@ public void Update(RepositoryModel repository) // If we're given a null logo, then we need to preserve the existing one repository.Logo = GetRepository(repository.Id).Logo; } - ADBackend.Instance.Repositories.Update(SanitizeModel(repository)); + _adBackend.Repositories.Update(SanitizeModel(repository)); } private static RepositoryModel SanitizeModel(RepositoryModel model) @@ -79,4 +85,4 @@ public IList GetTeamRepositories(Guid[] teamsId) } } } - + diff --git a/Bonobo.Git.Server/Data/ADTeamRepository.cs b/Bonobo.Git.Server/Data/ADTeamRepository.cs index 8b61d8fc1..048fe4d21 100644 --- a/Bonobo.Git.Server/Data/ADTeamRepository.cs +++ b/Bonobo.Git.Server/Data/ADTeamRepository.cs @@ -8,20 +8,26 @@ namespace Bonobo.Git.Server.Data public class ADTeamRepository : ITeamRepository { Dictionary _id_to_name = new Dictionary(); + private readonly ADBackend _adBackend; + + public ADTeamRepository(ADBackend adBackend) + { + _adBackend = adBackend; + } public bool Create(TeamModel team) { - throw new NotImplementedException(); + throw new NotSupportedException(); } public void Delete(Guid name) { - throw new NotImplementedException(); + throw new NotSupportedException(); } public IList GetAllTeams() { - var ret = ADBackend.Instance.Teams.ToList(); + var ret = _adBackend.Teams.ToList(); foreach (var t in ret) { _id_to_name[t.Id] = t.Name; @@ -31,7 +37,7 @@ public IList GetAllTeams() public TeamModel GetTeam(Guid TeamId) { - return ADBackend.Instance.Teams[TeamId]; + return _adBackend.Teams[TeamId]; } public TeamModel GetTeam(string name) @@ -49,17 +55,17 @@ public TeamModel GetTeam(string name) public IList GetTeams(Guid userId) { - return ADBackend.Instance.Teams.Where(x => x.Members.Any(y => y.Id == userId)).ToList(); + return _adBackend.Teams.Where(x => x.Members.Any(y => y.Id == userId)).ToList(); } public void Update(TeamModel team) { - throw new NotImplementedException(); + throw new NotSupportedException(); } public void UpdateUserTeams(Guid userId, List newTeams) { - throw new NotImplementedException(); + throw new NotSupportedException(); } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Data/BonoboGitServerContext.cs b/Bonobo.Git.Server/Data/BonoboGitServerContext.cs index d01e0d8c6..4f9345552 100644 --- a/Bonobo.Git.Server/Data/BonoboGitServerContext.cs +++ b/Bonobo.Git.Server/Data/BonoboGitServerContext.cs @@ -1,7 +1,5 @@ -using System.Data.Common; using Bonobo.Git.Server.Data.Mapping; -using System.Data.Entity; -using Microsoft.Practices.Unity; +using Microsoft.EntityFrameworkCore; namespace Bonobo.Git.Server.Data { @@ -13,32 +11,36 @@ public partial class BonoboGitServerContext : DbContext public DbSet Users { get; set; } - static BonoboGitServerContext() - { - Database.SetInitializer(null); - } + //static BonoboGitServerContext() + //{ + // Database.SetInitializer(null); + //} - public BonoboGitServerContext() - : base("Name=BonoboGitServerContext") + public BonoboGitServerContext(DbContextOptions databaseConnection) : base(databaseConnection) { } - // Don't make this public because it confuses Unity - private BonoboGitServerContext(DbConnection databaseConnection) : base(databaseConnection, false) - { - } + //public static BonoboGitServerContext FromDatabase(DbConnection databaseConnection) + //{ + // return new BonoboGitServerContext(databaseConnection); + //} - public static BonoboGitServerContext FromDatabase(DbConnection databaseConnection) + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { - return new BonoboGitServerContext(databaseConnection); + base.OnConfiguring(optionsBuilder); } - protected override void OnModelCreating(DbModelBuilder modelBuilder) + protected override void OnModelCreating(ModelBuilder modelBuilder) { - modelBuilder.Configurations.Add(new RepositoryMap()); - modelBuilder.Configurations.Add(new RoleMap()); - modelBuilder.Configurations.Add(new TeamMap()); - modelBuilder.Configurations.Add(new UserMap()); + modelBuilder.ApplyConfiguration(new UserTeamMemberMap()); + modelBuilder.ApplyConfiguration(new TeamRepositoryPermissionMap()); + modelBuilder.ApplyConfiguration(new UserRepositoryAdministratorMap()); + modelBuilder.ApplyConfiguration(new UserRepositoryPermissioneMap()); + modelBuilder.ApplyConfiguration(new RepositoryMap()); + modelBuilder.ApplyConfiguration(new RoleMap()); + modelBuilder.ApplyConfiguration(new TeamMap()); + modelBuilder.ApplyConfiguration(new UserMap()); + modelBuilder.ApplyConfiguration(new UserRoleMap()); } } } diff --git a/Bonobo.Git.Server/Data/DatabaseResetManager.cs b/Bonobo.Git.Server/Data/DatabaseResetManager.cs index 3684bc1c9..54cd72ae7 100644 --- a/Bonobo.Git.Server/Data/DatabaseResetManager.cs +++ b/Bonobo.Git.Server/Data/DatabaseResetManager.cs @@ -1,8 +1,8 @@ using System; -using System.Runtime.Remoting.Messaging; +using Bonobo.Git.Server.Configuration; using Bonobo.Git.Server.Security; -using Microsoft.Practices.Unity; -using System.Configuration; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Options; using Serilog; namespace Bonobo.Git.Server.Data @@ -17,22 +17,34 @@ public interface IDatabaseResetManager /// public class DatabaseResetManager : IDatabaseResetManager { - [Dependency] - public IRepositoryRepository Repository { get; set; } + private readonly IConfiguration configuration; + private readonly IOptions _appSettings; - [Dependency] + public IRepositoryRepository Repository { get; set; } public IRoleProvider RoleProvider { get; set; } - - [Dependency] public ITeamRepository TeamRepository { get; set; } - - [Dependency] public IMembershipService Users { get; set; } + public DatabaseResetManager( + IRepositoryRepository Repository, + IRoleProvider RoleProvider, + ITeamRepository TeamRepository, + IMembershipService Users, + IConfiguration configuration, + IOptions appSettings) + { + this.Repository = Repository; + this.RoleProvider = RoleProvider; + this.TeamRepository = TeamRepository; + this.Users = Users; + this.configuration = configuration; + this._appSettings = appSettings; + } + public void DoReset(int mode) { Log.Information("Reset mode {mode}", mode); - Log.Information("AppSettings Allow: {AllowDBReset}", ConfigurationManager.AppSettings["AllowDBReset"]); + Log.Information("AppSettings Allow: {AllowDBReset}", _appSettings.Value.AllowDBReset); switch (mode) { case 1: diff --git a/Bonobo.Git.Server/Data/EFRepositoryRepository.cs b/Bonobo.Git.Server/Data/EFRepositoryRepository.cs index a9ed1ce48..41a439420 100644 --- a/Bonobo.Git.Server/Data/EFRepositoryRepository.cs +++ b/Bonobo.Git.Server/Data/EFRepositoryRepository.cs @@ -1,22 +1,26 @@ using System; using System.Collections.Generic; using System.Linq; +using Bonobo.Git.Server.Data.Mapping; using Bonobo.Git.Server.Models; -using System.Data.Entity.Core; -using System.Data.Entity.Infrastructure; -using Microsoft.Practices.Unity; +using Microsoft.EntityFrameworkCore; using Serilog; namespace Bonobo.Git.Server.Data { public class EFRepositoryRepository : IRepositoryRepository { - [Dependency] - public Func CreateContext { get; set; } + private BonoboGitServerContext _ctx; + public EFRepositoryRepository(BonoboGitServerContext createContext) + { + _ctx = createContext; + } + + public BonoboGitServerContext CreateContext() => _ctx; public IList GetAllRepositories() { - using (var db = CreateContext()) + var db = CreateContext(); { var dbrepos = db.Repositories.Select(repo => new { @@ -40,9 +44,9 @@ public IList GetAllRepositories() Group = repo.Group, Description = repo.Description, AnonymousAccess = repo.AnonymousAccess, - Users = repo.Users.Select(user => user.ToModel()).ToArray(), - Teams = repo.Teams.Select(TeamToTeamModel).ToArray(), - Administrators = repo.Administrators.Select(user => user.ToModel()).ToArray(), + Users = repo.Users.Select(user => user.User.ToModel()).ToArray(), + Teams = repo.Teams.Select(t => TeamToTeamModel(t.Team)).ToArray(), + Administrators = repo.Administrators.Select(user => user.User.ToModel()).ToArray(), AuditPushUser = repo.AuditPushUser, AllowAnonymousPush = repo.AllowAnonPush, Logo = repo.Logo @@ -71,7 +75,7 @@ public RepositoryModel GetRepository(string name) public RepositoryModel GetRepository(Guid id) { - using (var db = CreateContext()) + var db = CreateContext(); { return ConvertToModel(db.Repositories.First(i => i.Id.Equals(id))); } @@ -79,7 +83,7 @@ public RepositoryModel GetRepository(Guid id) public void Delete(Guid id) { - using (var db = CreateContext()) + var db = CreateContext(); { var repo = db.Repositories.FirstOrDefault(i => i.Id == id); if (repo != null) @@ -104,7 +108,7 @@ public bool Create(RepositoryModel model) if (model == null) throw new ArgumentException("model"); if (model.Name == null) throw new ArgumentException("name"); - using (var database = CreateContext()) + var database = CreateContext(); { model.EnsureCollectionsAreValid(); model.Id = Guid.NewGuid(); @@ -120,7 +124,7 @@ public bool Create(RepositoryModel model) AuditPushUser = model.AuditPushUser, LinksUseGlobal = model.LinksUseGlobal, LinksUrl = model.LinksUrl, - LinksRegex = model.LinksRegex + LinksRegex = model.LinksRegex }; database.Repositories.Add(repository); AddMembers(model.Users.Select(x => x.Id), model.Administrators.Select(x => x.Id), model.Teams.Select(x => x.Id), repository, database); @@ -133,10 +137,10 @@ public bool Create(RepositoryModel model) Log.Error(ex, "Failed to create repo {RepoName}", model.Name); return false; } - catch (UpdateException) - { - return false; - } + //catch (UpdateException) + //{ + // return false; + //} return true; } } @@ -146,7 +150,7 @@ public void Update(RepositoryModel model) if (model == null) throw new ArgumentException("model"); if (model.Name == null) throw new ArgumentException("name"); - using (var db = CreateContext()) + var db = CreateContext(); { var repo = db.Repositories.FirstOrDefault(i => i.Id == model.Id); if (repo != null) @@ -187,7 +191,7 @@ private TeamModel TeamToTeamModel(Team t) Id = t.Id, Name = t.Name, Description = t.Description, - Members = t.Users.Select(user => user.ToModel()).ToArray() + Members = t.Users.Select(user => user.User.ToModel()).ToArray() }; } @@ -205,9 +209,9 @@ private RepositoryModel ConvertToModel(Repository item) Group = item.Group, Description = item.Description, AnonymousAccess = item.Anonymous, - Users = item.Users.Select(user => user.ToModel()).ToArray(), - Teams = item.Teams.Select(TeamToTeamModel).ToArray(), - Administrators = item.Administrators.Select(user => user.ToModel()).ToArray(), + Users = item.Users.Select(user => user.User.ToModel()).ToArray(), + Teams = item.Teams.Select(t => TeamToTeamModel(t.Team)).ToArray(), + Administrators = item.Administrators.Select(user => user.User.ToModel()).ToArray(), AuditPushUser = item.AuditPushUser, AllowAnonymousPush = item.AllowAnonymousPush, Logo = item.Logo, @@ -225,7 +229,12 @@ private void AddMembers(IEnumerable users, IEnumerable admins, IEnum var administrators = database.Users.Where(i => admins.Contains(i.Id)); foreach (var item in administrators) { - repo.Administrators.Add(item); + var u = new UserRepositoryAdministrator + { + RepositoryId = repo.Id, + UserId = item.Id, + }; + repo.Administrators.Add(u); } } @@ -234,7 +243,12 @@ private void AddMembers(IEnumerable users, IEnumerable admins, IEnum var permittedUsers = database.Users.Where(i => users.Contains(i.Id)); foreach (var item in permittedUsers) { - repo.Users.Add(item); + var u = new UserRepositoryPermission + { + UserId = item.Id, + RepositoryId = repo.Id, + }; + repo.Users.Add(u); } } @@ -243,7 +257,12 @@ private void AddMembers(IEnumerable users, IEnumerable admins, IEnum var permittedTeams = database.Teams.Where(i => teams.Contains(i.Id)); foreach (var item in permittedTeams) { - repo.Teams.Add(item); + var u = new TeamRepositoryPermission + { + RepositoryId = repo.Id, + TeamId = item.Id, + }; + repo.Teams.Add(u); } } } diff --git a/Bonobo.Git.Server/Data/EFTeamRepository.cs b/Bonobo.Git.Server/Data/EFTeamRepository.cs index b6d0a4852..80dbe2a51 100644 --- a/Bonobo.Git.Server/Data/EFTeamRepository.cs +++ b/Bonobo.Git.Server/Data/EFTeamRepository.cs @@ -1,21 +1,25 @@ using System; using System.Collections.Generic; using System.Linq; +using Bonobo.Git.Server.Data.Mapping; using Bonobo.Git.Server.Models; -using System.Data.Entity.Core; -using System.Data.Entity.Infrastructure; -using Microsoft.Practices.Unity; +using Microsoft.EntityFrameworkCore; namespace Bonobo.Git.Server.Data { public class EFTeamRepository : ITeamRepository { - [Dependency] - public Func CreateContext { get; set; } + private BonoboGitServerContext _ctx; + public EFTeamRepository(BonoboGitServerContext createContext) + { + _ctx = createContext; + } + + public BonoboGitServerContext CreateContext() => _ctx; public IList GetAllTeams() { - using (var db = CreateContext()) + var db = CreateContext(); { var dbTeams = db.Teams.Select(team => new { @@ -23,7 +27,7 @@ public IList GetAllTeams() Name = team.Name, Description = team.Description, Members = team.Users, - Repositories = team.Repositories.Select(m => m.Name), + Repositories = team.Repositories.Select(m => m.Repository.Name), }).ToList(); return dbTeams.Select(item => new TeamModel @@ -31,7 +35,7 @@ public IList GetAllTeams() Id = item.Id, Name = item.Name, Description = item.Description, - Members = item.Members.Select(user => user.ToModel()).ToArray(), + Members = item.Members.Select(user => user.User.ToModel()).ToArray(), }).ToList(); } } @@ -43,18 +47,18 @@ public IList GetTeams(Guid UserId) private TeamModel GetTeamModel(Team team) { - return team == null ? null : new TeamModel - { - Id = team.Id, - Name = team.Name, - Description = team.Description, - Members = team.Users.Select(user => user.ToModel()).ToArray(), - }; + return team == null ? null : new TeamModel + { + Id = team.Id, + Name = team.Name, + Description = team.Description, + Members = team.Users.Select(user => user.User.ToModel()).ToArray(), + }; } public TeamModel GetTeam(Guid id) { - using (var db = CreateContext()) + var db = CreateContext(); { var team = db.Teams.FirstOrDefault(i => i.Id == id); return GetTeamModel(team); @@ -76,7 +80,7 @@ public TeamModel GetTeam(string name) public void Delete(Guid teamId) { - using (var db = CreateContext()) + var db = CreateContext(); { var team = db.Teams.FirstOrDefault(i => i.Id == teamId); if (team != null) @@ -94,7 +98,7 @@ public bool Create(TeamModel model) if (model == null) throw new ArgumentException("team"); if (model.Name == null) throw new ArgumentException("name"); - using (var database = CreateContext()) + var database = CreateContext(); { // Write this into the model so that the caller knows the ID of the new itel model.Id = Guid.NewGuid(); @@ -117,11 +121,11 @@ public bool Create(TeamModel model) { return false; } - catch (UpdateException) - { - // Not sure when this exception happens - DbUpdateException is what you get for adding a duplicate teamname - return false; - } + //catch (UpdateException) + //{ + // // Not sure when this exception happens - DbUpdateException is what you get for adding a duplicate teamname + // return false; + //} } return true; @@ -132,7 +136,7 @@ public void Update(TeamModel model) if (model == null) throw new ArgumentException("team"); if (model.Name == null) throw new ArgumentException("name"); - using (var db = CreateContext()) + var db = CreateContext(); { var team = db.Teams.FirstOrDefault(i => i.Id == model.Id); if (team != null) @@ -154,7 +158,12 @@ private void AddMembers(IEnumerable members, Team team, BonoboGitServerCon var users = database.Users.Where(user => members.Contains(user.Id)); foreach (var item in users) { - team.Users.Add(item); + var userTeamMember = new UserTeamMember() + { + UserId = item.Id, + TeamId = team.Id, + }; + team.Users.Add(userTeamMember); } } @@ -162,7 +171,7 @@ public void UpdateUserTeams(Guid userId, List newTeams) { if (newTeams == null) throw new ArgumentException("newTeams"); - using (var db = CreateContext()) + var db = CreateContext(); { var user = db.Users.FirstOrDefault(u => u.Id == userId); if (user != null) @@ -171,7 +180,12 @@ public void UpdateUserTeams(Guid userId, List newTeams) var teams = db.Teams.Where(t => newTeams.Contains(t.Name)); foreach (var team in teams) { - user.Teams.Add(team); + var userTeamMember = new UserTeamMember + { + TeamId = team.Id, + UserId = user.Id, + }; + user.Teams.Add(userTeamMember); } db.SaveChanges(); } diff --git a/Bonobo.Git.Server/Data/INameProperty.cs b/Bonobo.Git.Server/Data/INameProperty.cs index 827a85c50..989c875f6 100644 --- a/Bonobo.Git.Server/Data/INameProperty.cs +++ b/Bonobo.Git.Server/Data/INameProperty.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; namespace Bonobo.Git.Server.Data { diff --git a/Bonobo.Git.Server/Data/IRepositoryRepository.cs b/Bonobo.Git.Server/Data/IRepositoryRepository.cs index c5d166c97..8a184f778 100644 --- a/Bonobo.Git.Server/Data/IRepositoryRepository.cs +++ b/Bonobo.Git.Server/Data/IRepositoryRepository.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Web; using Bonobo.Git.Server.Models; namespace Bonobo.Git.Server.Data diff --git a/Bonobo.Git.Server/Data/ITeamRepository.cs b/Bonobo.Git.Server/Data/ITeamRepository.cs index 3935c28b8..950d3cf0e 100644 --- a/Bonobo.Git.Server/Data/ITeamRepository.cs +++ b/Bonobo.Git.Server/Data/ITeamRepository.cs @@ -1,6 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Bonobo.Git.Server.Models; -using System; namespace Bonobo.Git.Server.Data { diff --git a/Bonobo.Git.Server/Data/Mapping/RepositoryMap.cs b/Bonobo.Git.Server/Data/Mapping/RepositoryMap.cs index b176cbb8b..065e3e802 100644 --- a/Bonobo.Git.Server/Data/Mapping/RepositoryMap.cs +++ b/Bonobo.Git.Server/Data/Mapping/RepositoryMap.cs @@ -1,79 +1,65 @@ -using System.ComponentModel.DataAnnotations.Schema; -using System.Data.Entity.ModelConfiguration; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Bonobo.Git.Server.Data.Mapping { - public class RepositoryMap : EntityTypeConfiguration + public class RepositoryMap : IEntityTypeConfiguration { - public RepositoryMap() + + public void Configure(EntityTypeBuilder builder) { - SetPrimaryKey(); - SetProperties(); - SetTableAndColumnMappings(); - SetRelationships(); + SetPrimaryKey(builder); + SetProperties(builder); + SetTableAndColumnMappings(builder); + SetRelationships(builder); } - private void SetRelationships() + private void SetRelationships(EntityTypeBuilder builder) { - HasMany(t => t.Teams) - .WithMany(t => t.Repositories) - .Map(m => - { - m.ToTable("TeamRepository_Permission"); - m.MapLeftKey("Repository_Id"); - m.MapRightKey("Team_Id"); - }); + builder.HasMany(t => t.Teams) + .WithOne(r => r.Repository) + .HasForeignKey(x => x.TeamId); - HasMany(t => t.Administrators) - .WithMany(t => t.AdministratedRepositories) - .Map(m => - { - m.ToTable("UserRepository_Administrator"); - m.MapLeftKey("Repository_Id"); - m.MapRightKey("User_Id"); - }); + builder.HasMany(t => t.Administrators) + .WithOne(t => t.Repository) + .HasForeignKey(x => x.UserId); - HasMany(t => t.Users) - .WithMany(t => t.Repositories) - .Map(m => - { - m.ToTable("UserRepository_Permission"); - m.MapLeftKey("Repository_Id"); - m.MapRightKey("User_Id"); - }); + builder.HasMany(t => t.Users) + .WithOne(t => t.Repository) + .HasForeignKey(x => x.UserId); } - private void SetTableAndColumnMappings() + private void SetTableAndColumnMappings(EntityTypeBuilder builder) { - ToTable("Repository"); - Property(t => t.Id).HasColumnName("Id"); - Property(t => t.Name).HasColumnName("Name"); - Property(t => t.Group).HasColumnName("Group"); - Property(t => t.Description).HasColumnName("Description"); - Property(t => t.Anonymous).HasColumnName("Anonymous"); - Property(t => t.AuditPushUser).HasColumnName("AuditPushUser"); - Property(t => t.AllowAnonymousPush).HasColumnName("AllowAnonymousPush"); - Property(t => t.LinksRegex).HasColumnName("LinksRegex"); - Property(t => t.LinksUrl).HasColumnName("LinksUrl"); - Property(t => t.LinksUseGlobal).HasColumnName("LinksUseGlobal"); + builder.ToTable("Repository"); + builder.Property(t => t.Id).HasColumnName("Id"); + builder.Property(t => t.Name).HasColumnName("Name"); + builder.Property(t => t.Group).HasColumnName("Group"); + builder.Property(t => t.Description).HasColumnName("Description"); + builder.Property(t => t.Anonymous).HasColumnName("Anonymous"); + builder.Property(t => t.AuditPushUser).HasColumnName("AuditPushUser"); + builder.Property(t => t.AllowAnonymousPush).HasColumnName("AllowAnonymousPush"); + builder.Property(t => t.LinksRegex).HasColumnName("LinksRegex"); + builder.Property(t => t.LinksUrl).HasColumnName("LinksUrl"); + builder.Property(t => t.LinksUseGlobal).HasColumnName("LinksUseGlobal"); } - private void SetProperties() + private void SetProperties(EntityTypeBuilder builder) { - Property(t => t.Name) + builder.Property(t => t.Name) .IsRequired() .HasMaxLength(255); - Property(t => t.Group) + builder.Property(t => t.Group) .HasMaxLength(255); - Property(t => t.Description) + builder.Property(t => t.Description) .HasMaxLength(255); } - private void SetPrimaryKey() + private void SetPrimaryKey(EntityTypeBuilder builder) { - HasKey(t => t.Id); + builder.HasKey(t => t.Id); } } } diff --git a/Bonobo.Git.Server/Data/Mapping/RoleMap.cs b/Bonobo.Git.Server/Data/Mapping/RoleMap.cs index 29fcd069b..1be3b486c 100644 --- a/Bonobo.Git.Server/Data/Mapping/RoleMap.cs +++ b/Bonobo.Git.Server/Data/Mapping/RoleMap.cs @@ -1,52 +1,47 @@ -using System.ComponentModel.DataAnnotations.Schema; -using System.Data.Entity.ModelConfiguration; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Bonobo.Git.Server.Data.Mapping { - public class RoleMap : EntityTypeConfiguration + public class RoleMap : IEntityTypeConfiguration { - public RoleMap() + public void Configure(EntityTypeBuilder builder) { - SetPrimaryKey(); - SetProperties(); - SetTableAndColumnMappings(); - SetRelationships(); + SetPrimaryKey(builder); + SetProperties(builder); + SetTableAndColumnMappings(builder); + SetRelationships(builder); } - - private void SetRelationships() + private void SetRelationships(EntityTypeBuilder builder) { - HasMany(t => t.Users) - .WithMany(t => t.Roles) - .Map(m => - { - m.ToTable("UserRole_InRole"); - m.MapLeftKey("Role_Id"); - m.MapRightKey("User_Id"); - }); + builder + .HasMany(t => t.Users) + .WithOne(ur => ur.Role) + .HasForeignKey(t => t.RoleId); } - private void SetTableAndColumnMappings() + private void SetTableAndColumnMappings(EntityTypeBuilder builder) { - ToTable("Role"); - Property(t => t.Id).HasColumnName("Id"); - Property(t => t.Name).HasColumnName("Name"); - Property(t => t.Description).HasColumnName("Description"); + builder.ToTable("Role"); + builder.Property(t => t.Id).HasColumnName("Id"); + builder.Property(t => t.Name).HasColumnName("Name"); + builder.Property(t => t.Description).HasColumnName("Description"); } - private void SetProperties() + private void SetProperties(EntityTypeBuilder builder) { - Property(t => t.Name) + builder.Property(t => t.Name) .IsRequired() .HasMaxLength(255); - Property(t => t.Description) + builder.Property(t => t.Description) .HasMaxLength(255); } - private void SetPrimaryKey() + private void SetPrimaryKey(EntityTypeBuilder builder) { - HasKey(t => t.Id); + builder.HasKey(t => t.Id); } } } diff --git a/Bonobo.Git.Server/Data/Mapping/TeamMap.cs b/Bonobo.Git.Server/Data/Mapping/TeamMap.cs index cefdb18ed..47145175d 100644 --- a/Bonobo.Git.Server/Data/Mapping/TeamMap.cs +++ b/Bonobo.Git.Server/Data/Mapping/TeamMap.cs @@ -1,52 +1,50 @@ -using System.ComponentModel.DataAnnotations.Schema; -using System.Data.Entity.ModelConfiguration; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Bonobo.Git.Server.Data.Mapping { - public class TeamMap : EntityTypeConfiguration + public class TeamMap : IEntityTypeConfiguration { - public TeamMap() + public void Configure(EntityTypeBuilder builder) { - SetPrimaryKey(); - SetProperties(); - SetTableAndColumnMappings(); - SetRelationships(); + SetPrimaryKey(builder); + SetProperties(builder); + SetTableAndColumnMappings(builder); + SetRelationships(builder); } - - private void SetRelationships() + private void SetRelationships(EntityTypeBuilder builder) { - HasMany(t => t.Users) - .WithMany(t => t.Teams) - .Map(m => - { - m.ToTable("UserTeam_Member"); - m.MapLeftKey("Team_Id"); - m.MapRightKey("User_Id"); - }); + builder.HasMany(t => t.Users) + .WithOne(t => t.Team) + .HasForeignKey(t => t.TeamId); + + builder.HasMany(t => t.Repositories) + .WithOne(t => t.Team) + .HasForeignKey(t => t.TeamId); } - private void SetTableAndColumnMappings() + private void SetTableAndColumnMappings(EntityTypeBuilder builder) { - ToTable("Team"); - Property(t => t.Id).HasColumnName("Id"); - Property(t => t.Name).HasColumnName("Name"); - Property(t => t.Description).HasColumnName("Description"); + builder.ToTable("Team"); + builder.Property(t => t.Id).HasColumnName("Id"); + builder.Property(t => t.Name).HasColumnName("Name"); + builder.Property(t => t.Description).HasColumnName("Description"); } - private void SetProperties() + private void SetProperties(EntityTypeBuilder builder) { - Property(t => t.Name) + builder.Property(t => t.Name) .IsRequired() .HasMaxLength(255); - Property(t => t.Description) + builder.Property(t => t.Description) .HasMaxLength(255); } - private void SetPrimaryKey() + private void SetPrimaryKey(EntityTypeBuilder builder) { - HasKey(t => t.Id); + builder.HasKey(t => t.Id); } } } diff --git a/Bonobo.Git.Server/Data/Mapping/TeamRepositoryPermission.cs b/Bonobo.Git.Server/Data/Mapping/TeamRepositoryPermission.cs new file mode 100644 index 000000000..ef7c34260 --- /dev/null +++ b/Bonobo.Git.Server/Data/Mapping/TeamRepositoryPermission.cs @@ -0,0 +1,12 @@ +using System; + +namespace Bonobo.Git.Server.Data.Mapping +{ + public class TeamRepositoryPermission + { + public Guid RepositoryId { get; set; } + public Repository Repository { get; set; } + public Guid TeamId { get; set; } + public Team Team { get; set; } + } +} diff --git a/Bonobo.Git.Server/Data/Mapping/TeamRepositoryPermissionMap.cs b/Bonobo.Git.Server/Data/Mapping/TeamRepositoryPermissionMap.cs new file mode 100644 index 000000000..cdcaa0f94 --- /dev/null +++ b/Bonobo.Git.Server/Data/Mapping/TeamRepositoryPermissionMap.cs @@ -0,0 +1,27 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Bonobo.Git.Server.Data.Mapping +{ + public class TeamRepositoryPermissionMap : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("TeamRepository_Permission"); + builder.HasKey(ur => new { ur.RepositoryId, ur.TeamId }); + + builder.Property(t => t.TeamId).HasColumnName("Team_Id").IsRequired(); + builder.Property(t => t.RepositoryId).HasColumnName("Repository_Id").IsRequired(); + + builder + .HasOne(bc => bc.Team) + .WithMany(c => c.Repositories) + .HasForeignKey(bc => bc.TeamId); + + builder + .HasOne(bc => bc.Repository) + .WithMany(b => b.Teams) + .HasForeignKey(bc => bc.RepositoryId); + } + } +} diff --git a/Bonobo.Git.Server/Data/Mapping/UserMap.cs b/Bonobo.Git.Server/Data/Mapping/UserMap.cs index dcd1addb8..a9df4ff1c 100644 --- a/Bonobo.Git.Server/Data/Mapping/UserMap.cs +++ b/Bonobo.Git.Server/Data/Mapping/UserMap.cs @@ -1,56 +1,71 @@ -using System.ComponentModel.DataAnnotations.Schema; -using System.Data.Entity.ModelConfiguration; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Bonobo.Git.Server.Data.Mapping { - public class UserMap : EntityTypeConfiguration + public class UserMap : IEntityTypeConfiguration { - public UserMap() + public void Configure(EntityTypeBuilder builder) { - SetPrimaryKey(); - SetProperties(); - SetTableAndColumnMappings(); + SetPrimaryKey(builder); + SetProperties(builder); + SetTableAndColumnMappings(builder); } - - private void SetTableAndColumnMappings() + private void SetTableAndColumnMappings(EntityTypeBuilder builder) { - ToTable("User"); - Property(t => t.Id).HasColumnName("Id"); - Property(t => t.GivenName).HasColumnName("Name"); - Property(t => t.Surname).HasColumnName("Surname"); - Property(t => t.Username).HasColumnName("Username"); - Property(t => t.Password).HasColumnName("Password"); - Property(t => t.PasswordSalt).HasColumnName("PasswordSalt"); - Property(t => t.Email).HasColumnName("Email"); + builder.ToTable("User"); + builder.Property(t => t.Id).HasColumnName("Id"); + builder.Property(t => t.GivenName).HasColumnName("Name"); + builder.Property(t => t.Surname).HasColumnName("Surname"); + builder.Property(t => t.Username).HasColumnName("Username"); + builder.Property(t => t.Password).HasColumnName("Password"); + builder.Property(t => t.PasswordSalt).HasColumnName("PasswordSalt"); + builder.Property(t => t.Email).HasColumnName("Email"); + + //builder.HasMany(u => u.AdministratedRepositories) + // .WithOne(u => u.User) + // .HasForeignKey(u => u.UserId); + + //builder.HasMany(u => u.Repositories) + // .WithOne(u => u.User) + // .HasForeignKey(u => u.UserId); + + //builder.HasMany(u => u.Teams) + // .WithOne(u => u.User) + // .HasForeignKey(u => u.UserId); + + //builder.HasMany(u => u.AdministratedRepositories) + // .WithOne(u => u.User) + // .HasForeignKey(u => u.UserId); } - private void SetProperties() + private void SetProperties(EntityTypeBuilder builder) { - Property(t => t.GivenName) + builder.Property(t => t.GivenName) .IsRequired() .HasMaxLength(255); - Property(t => t.Surname) + builder.Property(t => t.Surname) .IsRequired() .HasMaxLength(255); - Property(t => t.Username) + builder.Property(t => t.Username) .IsRequired() .HasMaxLength(255); - Property(t => t.Password) + builder.Property(t => t.Password) .IsRequired() .HasMaxLength(255); - Property(t => t.Email) + builder.Property(t => t.Email) .IsRequired() .HasMaxLength(255); } - private void SetPrimaryKey() + private void SetPrimaryKey(EntityTypeBuilder builder) { - HasKey(t => t.Id); + builder.HasKey(t => t.Id); } } } diff --git a/Bonobo.Git.Server/Data/Mapping/UserRepositoryAdministrator.cs b/Bonobo.Git.Server/Data/Mapping/UserRepositoryAdministrator.cs new file mode 100644 index 000000000..0421a3bce --- /dev/null +++ b/Bonobo.Git.Server/Data/Mapping/UserRepositoryAdministrator.cs @@ -0,0 +1,12 @@ +using System; + +namespace Bonobo.Git.Server.Data.Mapping +{ + public class UserRepositoryAdministrator + { + public Guid RepositoryId { get; set; } + public Repository Repository { get; set; } + public Guid UserId { get; set; } + public User User { get; set; } + } +} diff --git a/Bonobo.Git.Server/Data/Mapping/UserRepositoryAdministratorMap.cs b/Bonobo.Git.Server/Data/Mapping/UserRepositoryAdministratorMap.cs new file mode 100644 index 000000000..9e852767f --- /dev/null +++ b/Bonobo.Git.Server/Data/Mapping/UserRepositoryAdministratorMap.cs @@ -0,0 +1,27 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Bonobo.Git.Server.Data.Mapping +{ + public class UserRepositoryAdministratorMap : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("UserRepository_Administrator"); + builder.HasKey(ur => new { ur.UserId, ur.RepositoryId }); + + builder.Property(t => t.UserId).HasColumnName("User_Id").IsRequired(); + builder.Property(t => t.RepositoryId).HasColumnName("Repository_Id").IsRequired(); + + builder + .HasOne(bc => bc.User) + .WithMany(b => b.AdministratedRepositories) + .HasForeignKey(bc => bc.UserId); + + builder + .HasOne(bc => bc.Repository) + .WithMany(c => c.Administrators) + .HasForeignKey(bc => bc.RepositoryId); + } + } +} diff --git a/Bonobo.Git.Server/Data/Mapping/UserRepositoryPermission.cs b/Bonobo.Git.Server/Data/Mapping/UserRepositoryPermission.cs new file mode 100644 index 000000000..c0a89bfd6 --- /dev/null +++ b/Bonobo.Git.Server/Data/Mapping/UserRepositoryPermission.cs @@ -0,0 +1,12 @@ +using System; + +namespace Bonobo.Git.Server.Data.Mapping +{ + public class UserRepositoryPermission + { + public Guid RepositoryId { get; set; } + public Repository Repository { get; set; } + public Guid UserId { get; set; } + public User User { get; set; } + } +} diff --git a/Bonobo.Git.Server/Data/Mapping/UserRepositoryPermissioneMap.cs b/Bonobo.Git.Server/Data/Mapping/UserRepositoryPermissioneMap.cs new file mode 100644 index 000000000..0a1c98b0c --- /dev/null +++ b/Bonobo.Git.Server/Data/Mapping/UserRepositoryPermissioneMap.cs @@ -0,0 +1,27 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Bonobo.Git.Server.Data.Mapping +{ + public class UserRepositoryPermissioneMap : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("UserRepository_Permission"); + builder.HasKey(ur => new { ur.RepositoryId, ur.UserId }); + + builder.Property(t => t.UserId).HasColumnName("User_Id").IsRequired(); + builder.Property(t => t.RepositoryId).HasColumnName("Repository_Id").IsRequired(); + + builder + .HasOne(bc => bc.User) + .WithMany(b => b.Repositories) + .HasForeignKey(bc => bc.UserId); + + builder + .HasOne(bc => bc.Repository) + .WithMany(c => c.Users) + .HasForeignKey(bc => bc.RepositoryId); + } + } +} diff --git a/Bonobo.Git.Server/Data/Mapping/UserRoleMap.cs b/Bonobo.Git.Server/Data/Mapping/UserRoleMap.cs new file mode 100644 index 000000000..ebb2cd76b --- /dev/null +++ b/Bonobo.Git.Server/Data/Mapping/UserRoleMap.cs @@ -0,0 +1,27 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Bonobo.Git.Server.Data.Mapping +{ + public class UserRoleMap : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("UserRole_InRole"); + builder.HasKey(ur => new { ur.UserId, ur.RoleId }); + + builder.Property(t => t.UserId).HasColumnName("User_Id").IsRequired(); + builder.Property(t => t.RoleId).HasColumnName("Role_Id").IsRequired(); + + builder + .HasOne(bc => bc.User) + .WithMany(b => b.Roles) + .HasForeignKey(bc => bc.UserId); + + builder + .HasOne(bc => bc.Role) + .WithMany(c => c.Users) + .HasForeignKey(bc => bc.RoleId); + } + } +} diff --git a/Bonobo.Git.Server/Data/Mapping/UserTeamMember.cs b/Bonobo.Git.Server/Data/Mapping/UserTeamMember.cs new file mode 100644 index 000000000..e1f9f36fc --- /dev/null +++ b/Bonobo.Git.Server/Data/Mapping/UserTeamMember.cs @@ -0,0 +1,12 @@ +using System; + +namespace Bonobo.Git.Server.Data.Mapping +{ + public class UserTeamMember + { + public Guid TeamId { get; set; } + public Team Team { get; set; } + public Guid UserId { get; set; } + public User User { get; set; } + } +} diff --git a/Bonobo.Git.Server/Data/Mapping/UserTeamMemberMap.cs b/Bonobo.Git.Server/Data/Mapping/UserTeamMemberMap.cs new file mode 100644 index 000000000..07b393d23 --- /dev/null +++ b/Bonobo.Git.Server/Data/Mapping/UserTeamMemberMap.cs @@ -0,0 +1,27 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Bonobo.Git.Server.Data.Mapping +{ + public class UserTeamMemberMap : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("UserTeam_Member"); + builder.HasKey(ur => new { ur.UserId, ur.TeamId }); + + builder.Property(t => t.UserId).HasColumnName("User_Id").IsRequired(); + builder.Property(t => t.TeamId).HasColumnName("Team_Id").IsRequired(); + + builder + .HasOne(bc => bc.User) + .WithMany(b => b.Teams) + .HasForeignKey(bc => bc.UserId); + + builder + .HasOne(bc => bc.Team) + .WithMany(c => c.Users) + .HasForeignKey(bc => bc.TeamId); + } + } +} diff --git a/Bonobo.Git.Server/Data/Repository.cs b/Bonobo.Git.Server/Data/Repository.cs index 49b958c80..88e54eb86 100644 --- a/Bonobo.Git.Server/Data/Repository.cs +++ b/Bonobo.Git.Server/Data/Repository.cs @@ -1,8 +1,9 @@ -using Bonobo.Git.Server.App_GlobalResources; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; +using Bonobo.Git.Server.App_GlobalResources; +using Bonobo.Git.Server.Data.Mapping; namespace Bonobo.Git.Server.Data { @@ -18,9 +19,9 @@ public enum RepositoryPushMode public partial class Repository { - private ICollection _teams; - private ICollection _administrators; - private ICollection _users; + private ICollection _teams; + private ICollection _administrators; + private ICollection _users; public Guid Id { get; set; } public string Name { get; set; } @@ -30,11 +31,11 @@ public partial class Repository public byte[] Logo { get; set; } public RepositoryPushMode AllowAnonymousPush { get; set; } - public virtual ICollection Teams + public virtual ICollection Teams { get { - return _teams ?? (_teams = new List()); + return _teams ?? (_teams = new List()); } set { @@ -42,11 +43,11 @@ public virtual ICollection Teams } } - public virtual ICollection Administrators + public virtual ICollection Administrators { get { - return _administrators ?? (_administrators = new List()); + return _administrators ?? (_administrators = new List()); } set { @@ -54,11 +55,11 @@ public virtual ICollection Administrators } } - public virtual ICollection Users + public virtual ICollection Users { get { - return _users ?? (_users = new List()); + return _users ?? (_users = new List()); } set { @@ -66,16 +67,11 @@ public virtual ICollection Users } } - public Repository() - { - LinksUseGlobal = true; - } - public bool AuditPushUser { get; set; } public string LinksRegex { get; set; } public string LinksUrl { get; set; } - public bool LinksUseGlobal { get; set; } + public bool LinksUseGlobal { get; set; } = true; /// @@ -110,6 +106,5 @@ public static string NormalizeRepositoryName(string incomingRepositoryName, IRep // our job to worry about that return incomingRepositoryName; } - } } diff --git a/Bonobo.Git.Server/Data/RepositoryRepositoryBase.cs b/Bonobo.Git.Server/Data/RepositoryRepositoryBase.cs deleted file mode 100644 index 5cf80d203..000000000 --- a/Bonobo.Git.Server/Data/RepositoryRepositoryBase.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Bonobo.Git.Server.Models; - -namespace Bonobo.Git.Server.Data -{ - public abstract class RepositoryRepositoryBase : IRepositoryRepository - { - public IList GetPermittedRepositories(Guid userId, Guid[] userTeamsId) - { - if (userId == Guid.Empty) throw new ArgumentException("Do not pass invalid userId", "userId"); - return GetAllRepositories().Where(repo => - repo.Users.Any(user => user.Id == userId) || - repo.Administrators.Any(admin => admin.Id == userId) || - repo.Teams.Any(team => userTeamsId.Contains(team.Id)) || - repo.AnonymousAccess).ToList(); - } - - public virtual IList GetTeamRepositories(Guid[] teamsId) - { - return GetAllRepositories().Where(repo => repo.Teams.Any(team => teamsId.Contains(team.Id))).ToList(); - } - - public virtual IList GetAdministratedRepositories(Guid userId) - { - return GetAllRepositories().Where(x => x.Administrators.Any(y => y.Id == userId)).ToList(); - } - - public abstract RepositoryModel GetRepository(Guid id); - public abstract RepositoryModel GetRepository(string Name, StringComparison compType = StringComparison.OrdinalIgnoreCase); - public abstract bool Create(RepositoryModel repository); - public abstract void Update(RepositoryModel repository); - public abstract void Delete(Guid id); - public abstract IList GetAllRepositories(); - } -} \ No newline at end of file diff --git a/Bonobo.Git.Server/Data/Role.cs b/Bonobo.Git.Server/Data/Role.cs index e584315e1..a4a1205ff 100644 --- a/Bonobo.Git.Server/Data/Role.cs +++ b/Bonobo.Git.Server/Data/Role.cs @@ -3,23 +3,23 @@ namespace Bonobo.Git.Server.Data { - public partial class Role + public class Role { - private ICollection _users; + private ICollection _userRoles; public Guid Id { get; set; } public string Name { get; set; } public string Description { get; set; } - public virtual ICollection Users + public virtual ICollection Users { get { - return _users ?? (_users = new List()); + return _userRoles ?? (_userRoles = new List()); } set { - _users = value; + _userRoles = value; } } } diff --git a/Bonobo.Git.Server/Data/Team.cs b/Bonobo.Git.Server/Data/Team.cs index 5c0bb3db8..580174cf9 100644 --- a/Bonobo.Git.Server/Data/Team.cs +++ b/Bonobo.Git.Server/Data/Team.cs @@ -1,23 +1,24 @@ using System; using System.Collections.Generic; +using Bonobo.Git.Server.Data.Mapping; namespace Bonobo.Git.Server.Data { public partial class Team { - private ICollection _repositories; - private ICollection _users; + private ICollection _repositories; + private ICollection _userTeamMember; public Guid Id { get; set; } public string Name { get; set; } public string Description { get; set; } - public virtual ICollection Repositories + public virtual ICollection Repositories { get { - return _repositories ?? (_repositories = new List()); + return _repositories ?? (_repositories = new List()); } set { @@ -25,15 +26,15 @@ public virtual ICollection Repositories } } - public virtual ICollection Users + public virtual ICollection Users { get { - return _users ?? (_users = new List()); + return _userTeamMember ?? (_userTeamMember = new List()); } set { - _users = value; + _userTeamMember = value; } } } diff --git a/Bonobo.Git.Server/Data/Update/ADBackend/ADBackendPre6.0.0Models.cs b/Bonobo.Git.Server/Data/Update/ADBackend/ADBackendPre6.0.0Models.cs index b31a86691..8d12d81c4 100644 --- a/Bonobo.Git.Server/Data/Update/ADBackend/ADBackendPre6.0.0Models.cs +++ b/Bonobo.Git.Server/Data/Update/ADBackend/ADBackendPre6.0.0Models.cs @@ -1,8 +1,8 @@  -using Newtonsoft.Json; using System; using System.Collections.Concurrent; using System.IO; +using Newtonsoft.Json; namespace Bonobo.Git.Server.Data.Update.Pre600ADBackend { diff --git a/Bonobo.Git.Server/Data/Update/ADBackend/UpdateADBackend.cs b/Bonobo.Git.Server/Data/Update/ADBackend/UpdateADBackend.cs index c289c121f..46bc963e0 100644 --- a/Bonobo.Git.Server/Data/Update/ADBackend/UpdateADBackend.cs +++ b/Bonobo.Git.Server/Data/Update/ADBackend/UpdateADBackend.cs @@ -1,14 +1,12 @@ -using Bonobo.Git.Server.Data.Update.Pre600ADBackend; -using System.IO; -using Bonobo.Git.Server.Helpers; +using System; using System.Collections.Generic; using System.DirectoryServices.AccountManagement; -using Bonobo.Git.Server.Configuration; -using System; -using System.Threading; +using System.IO; using System.Linq; -using Bonobo.Git.Server.Data; -using Microsoft.VisualBasic.FileIO; +using System.Threading; +using Bonobo.Git.Server.Configuration; +using Bonobo.Git.Server.Data.Update.Pre600ADBackend; +using Bonobo.Git.Server.Helpers; using Newtonsoft.Json; using Serilog; @@ -16,8 +14,17 @@ namespace Bonobo.Git.Server.Data.Update.ADBackendUpdate { public class Pre600UpdateTo600 { + private readonly ADHelper _adHelper; + private readonly ADBackend _adBackend; + + public Pre600UpdateTo600(ADHelper adHelper, ADBackend adBackend) + { + this._adHelper = adHelper; + this._adBackend = adBackend; + } + // Before 6.0.0 the mapping was done via the name property. After that the Guid is used. - public static void UpdateADBackend() + public void UpdateADBackend() { // Make a copy of the current backendfolder if it exists, so we can use the modern models for saving // it all to the correct location directly @@ -98,7 +105,7 @@ private static bool BackendSubDirectoryNeedsUpdating(string backendDirectory, private static void MakeBackupOfBackendDirectory(string backendDirectory, string backupDirectory) { - FileSystem.CopyDirectory(backendDirectory, backupDirectory); + CopyDirectory(backendDirectory, backupDirectory, true); int attemptsRemaining = 5; while (attemptsRemaining-- > 0) { @@ -122,10 +129,48 @@ private static void MakeBackupOfBackendDirectory(string backendDirectory, string } } - private static void UpdateRepos(string dir, Dictionary users, Dictionary teams) + private static void CopyDirectory(string sourceDirName, string destDirName, bool copySubDirs) + { + // Get the subdirectories for the specified directory. + DirectoryInfo dir = new DirectoryInfo(sourceDirName); + + if (!dir.Exists) + { + throw new DirectoryNotFoundException( + "Source directory does not exist or could not be found: " + + sourceDirName); + } + + DirectoryInfo[] dirs = dir.GetDirectories(); + // If the destination directory doesn't exist, create it. + if (!Directory.Exists(destDirName)) + { + Directory.CreateDirectory(destDirName); + } + + // Get the files in the directory and copy them to the new location. + FileInfo[] files = dir.GetFiles(); + foreach (FileInfo file in files) + { + string temppath = Path.Combine(destDirName, file.Name); + file.CopyTo(temppath, false); + } + + // If copying subdirectories, copy them and their contents to new location. + if (copySubDirs) + { + foreach (DirectoryInfo subdir in dirs) + { + string temppath = Path.Combine(destDirName, subdir.Name); + CopyDirectory(subdir.FullName, temppath, copySubDirs); + } + } + } + + private void UpdateRepos(string dir, Dictionary users, Dictionary teams) { var repos = Pre600Functions.LoadContent(dir); - foreach(var repoitem in repos) + foreach (var repoitem in repos) { var repo = repoitem.Value; var newrepo = new Models.RepositoryModel(); @@ -146,27 +191,27 @@ private static void UpdateRepos(string dir, Dictionary newrepo.Users = list.ToArray(); list.Clear(); - foreach(var admins in repo.Administrators) + foreach (var admins in repo.Administrators) { list.Add(users[admins]); } newrepo.Administrators = list.ToArray(); var newteams = new List(); - foreach(var team in repo.Teams) + foreach (var team in repo.Teams) { newteams.Add(teams[team]); } newrepo.Teams = newteams.ToArray(); - ADBackend.Instance.Repositories.Add(newrepo); + _adBackend.Repositories.Add(newrepo); } } private static void UpdateRoles(string dir, Dictionary users) { var roles = Pre600Functions.LoadContent(dir); - foreach(var roleitem in roles) + foreach (var roleitem in roles) { var role = roleitem.Value; var newrole = new Models.RoleModel(); @@ -186,11 +231,11 @@ private static void UpdateRoles(string dir, Dictionary } } - private static Dictionary UpdateTeams(string dir, Dictionary users) + private Dictionary UpdateTeams(string dir, Dictionary users) { var teams = Pre600Functions.LoadContent(dir); var newTeams = new Dictionary(); - + foreach (var teamitem in teams) { var team = teamitem.Value; @@ -202,7 +247,7 @@ private static void UpdateRoles(string dir, Dictionary try { GroupPrincipal group; - using (var pc = ADHelper.GetPrincipalGroup(ActiveDirectorySettings.TeamNameToGroupNameMapping[team.Name], out group)) + using (var pc = _adHelper.GetPrincipalGroup(ActiveDirectorySettings.TeamNameToGroupNameMapping[team.Name], out group)) { newteam.Id = group.Guid.Value; } @@ -212,7 +257,7 @@ private static void UpdateRoles(string dir, Dictionary Log.Error(ex, "Failed to acquire group GUID for teamName {team} - adding new.", team.Name); } - + var members = new List(); foreach (var member in team.Members) { @@ -220,13 +265,13 @@ private static void UpdateRoles(string dir, Dictionary } newteam.Members = members.ToArray(); - ADBackend.Instance.Teams.Add(newteam); + _adBackend.Teams.Add(newteam); newTeams[team.Name] = newteam; } return newTeams; } - private static Dictionary UpdateUsers(string dir) + private Dictionary UpdateUsers(string dir) { var users = Pre600Functions.LoadContent(dir); var domains = new Dictionary(); @@ -241,13 +286,13 @@ private static void UpdateRoles(string dir, Dictionary u.Username = ou.Name; u.Id = Guid.NewGuid(); - var domainuser = ADHelper.GetUserPrincipal(u.Username); + var domainuser = _adHelper.GetUserPrincipal(u.Username); if (domainuser != null && domainuser.Guid.HasValue) { u.Id = domainuser.Guid.Value; } - ADBackend.Instance.Users.Add(u); + _adBackend.Users.Add(u); newUsers[u.Username] = u; } return newUsers; diff --git a/Bonobo.Git.Server/Data/Update/AutomaticUpdater.cs b/Bonobo.Git.Server/Data/Update/AutomaticUpdater.cs index 69de89876..f108ce262 100644 --- a/Bonobo.Git.Server/Data/Update/AutomaticUpdater.cs +++ b/Bonobo.Git.Server/Data/Update/AutomaticUpdater.cs @@ -1,57 +1,58 @@ -using Bonobo.Git.Server.Configuration; +using System; +using Bonobo.Git.Server.Configuration; using Bonobo.Git.Server.Data.Update.ADBackendUpdate; -using System; -using System.Data.Entity.Infrastructure; -using System.Linq; +using Dapper; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; using Serilog; namespace Bonobo.Git.Server.Data.Update { public class AutomaticUpdater { - public void Run() + public void Run(IServiceProvider serviceProvider, BonoboGitServerContext context, AuthenticationSettings authSettings) { - if (AuthenticationSettings.MembershipService.ToLowerInvariant() == "activedirectory") + if (string.Equals(authSettings.MembershipService, "activedirectory", StringComparison.OrdinalIgnoreCase)) { - Pre600UpdateTo600.UpdateADBackend(); + var updater = serviceProvider.GetService(); + updater.UpdateADBackend(); } else { - UpdateDatabase(); + UpdateDatabase(serviceProvider, context); } } - public void RunWithContext(BonoboGitServerContext context) + public void RunWithContext(IServiceProvider serviceProvider, BonoboGitServerContext context) { - DoUpdate(context); + DoUpdate(serviceProvider, context); } - private void UpdateDatabase() + private void UpdateDatabase(IServiceProvider serviceProvider, BonoboGitServerContext ctx) { - using (var ctx = new BonoboGitServerContext()) + //using (var ctx = new BonoboGitServerContext(databaseConnection)) { - DoUpdate(ctx); + DoUpdate(serviceProvider, ctx); } } - private void DoUpdate(BonoboGitServerContext ctx) + private void DoUpdate(IServiceProvider serviceProvider, BonoboGitServerContext ctx) { - IObjectContextAdapter ctxAdapter = ctx; - var connectiontype = ctx.Database.Connection.GetType().Name; + var connectiontype = ctx.Database.ProviderName;//.Connection.GetType().Name; - foreach (var item in UpdateScriptRepository.GetScriptsBySqlProviderName(connectiontype)) + foreach (var item in UpdateScriptRepository.GetScriptsBySqlProviderName(connectiontype, serviceProvider)) { if (!string.IsNullOrEmpty(item.Precondition)) { try { - var preConditionResult = ctxAdapter.ObjectContext.ExecuteStoreQuery(item.Precondition).Single(); + var preConditionResult = ctx.Database.GetDbConnection().ExecuteScalar(item.Precondition); if (preConditionResult == 0) { continue; } } - catch (Exception) + catch (Exception ex) { // consider failures in pre-conditions as an indication that // store ecommand should be executed @@ -62,7 +63,7 @@ private void DoUpdate(BonoboGitServerContext ctx) { try { - ctxAdapter.ObjectContext.ExecuteStoreCommand(item.Command); + ctx.Database.ExecuteSqlCommand(item.Command); } catch (Exception ex) { diff --git a/Bonobo.Git.Server/Data/Update/RepositorySynchronizer.cs b/Bonobo.Git.Server/Data/Update/RepositorySynchronizer.cs index 08fec60f4..cea7c51b5 100644 --- a/Bonobo.Git.Server/Data/Update/RepositorySynchronizer.cs +++ b/Bonobo.Git.Server/Data/Update/RepositorySynchronizer.cs @@ -1,18 +1,19 @@ -using Bonobo.Git.Server.Configuration; -using Bonobo.Git.Server.Models; -using LibGit2Sharp; -using System; +using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Web.Mvc; +using Bonobo.Git.Server.Configuration; +using Bonobo.Git.Server.Models; namespace Bonobo.Git.Server.Data.Update { public class RepositorySynchronizer { - IRepositoryRepository _repositoryRepository = DependencyResolver.Current.GetService(); + IRepositoryRepository _repositoryRepository; + + public RepositorySynchronizer(IRepositoryRepository repositoryRepository) + { + _repositoryRepository = repositoryRepository; + } public virtual void Run() { diff --git a/Bonobo.Git.Server/Data/Update/SqlServer/AddAuditPushUser.cs b/Bonobo.Git.Server/Data/Update/SqlServer/AddAuditPushUser.cs index 18f68c18c..211d558b0 100644 --- a/Bonobo.Git.Server/Data/Update/SqlServer/AddAuditPushUser.cs +++ b/Bonobo.Git.Server/Data/Update/SqlServer/AddAuditPushUser.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace Bonobo.Git.Server.Data.Update.SqlServer +namespace Bonobo.Git.Server.Data.Update.SqlServer { public class AddAuditPushUser : IUpdateScript { diff --git a/Bonobo.Git.Server/Data/Update/SqlServer/AddGroup.cs b/Bonobo.Git.Server/Data/Update/SqlServer/AddGroup.cs index 0ce2b05ce..e6340c0ab 100644 --- a/Bonobo.Git.Server/Data/Update/SqlServer/AddGroup.cs +++ b/Bonobo.Git.Server/Data/Update/SqlServer/AddGroup.cs @@ -1,6 +1,4 @@ -using System; - -namespace Bonobo.Git.Server.Data.Update.SqlServer +namespace Bonobo.Git.Server.Data.Update.SqlServer { public class AddGroup : IUpdateScript { diff --git a/Bonobo.Git.Server/Data/Update/SqlServer/AddGuidColumn.cs b/Bonobo.Git.Server/Data/Update/SqlServer/AddGuidColumn.cs index 36608703a..70afad3d3 100644 --- a/Bonobo.Git.Server/Data/Update/SqlServer/AddGuidColumn.cs +++ b/Bonobo.Git.Server/Data/Update/SqlServer/AddGuidColumn.cs @@ -1,24 +1,25 @@ -using Bonobo.Git.Server.Security; -using System.DirectoryServices.AccountManagement; -using System.Web.Mvc; -using System.Collections.Generic; -using System; -using System.Data.Entity; +using System; using System.Data.SqlClient; using System.Linq; using Bonobo.Git.Server.Helpers; +using Bonobo.Git.Server.Security; +using Dapper; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.Extensions.DependencyInjection; namespace Bonobo.Git.Server.Data.Update.SqlServer { public class AddGuidColumn : IUpdateScript - { private readonly IAuthenticationProvider AuthProvider; - private Database _db; + private readonly ADHelper _adHelper; + private DatabaseFacade _db; - public AddGuidColumn() + public AddGuidColumn(IServiceProvider serviceProvider) { - AuthProvider = DependencyResolver.Current.GetService(); + _adHelper = serviceProvider.GetService(); + this.AuthProvider = serviceProvider.GetService(); } public void CodeAction(BonoboGitServerContext context) @@ -53,13 +54,13 @@ private bool UpgradeHasAlreadyBeenRun() { try { - var result = _db.SqlQuery(@" + //var tran = (_db.CurrentTransaction as Microsoft.EntityFrameworkCore.Storage.RelationalTransaction).GetInfrastructure(); + return _db.GetDbConnection().ExecuteScalar(@" IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'User' AND COLUMN_NAME = 'Id') SELECT 1 ELSE SELECT 0 "); - return result.SingleAsync().GetAwaiter().GetResult() == 1; } catch (SqlException) { @@ -263,13 +264,15 @@ private void CopyData() private void CopyUsers() { - var users = _db.SqlQuery("Select * from oUser;").ToList(); + var tran = (_db.CurrentTransaction as Microsoft.EntityFrameworkCore.Storage.RelationalTransaction).GetInfrastructure(); + var users = _db.GetDbConnection().Query("Select * from oUser;", transaction: tran).ToList(); + //tran.Commit(); foreach (var entry in users) { Guid guid = Guid.NewGuid(); if (AuthProvider is WindowsAuthenticationProvider) { - var user = ADHelper.GetUserPrincipal(entry.Username); + var user = _adHelper.GetUserPrincipal(entry.Username); // if the user no longer exists // it means he cannot login anymore so it is safe to assign // any new guid to him @@ -310,7 +313,9 @@ private void CopyUsers() private void CopyTeams() { - var teams = _db.SqlQuery("Select * from oTeam").ToList(); + + var tran = (_db.CurrentTransaction as Microsoft.EntityFrameworkCore.Storage.RelationalTransaction).GetInfrastructure(); + var teams = _db.GetDbConnection().Query("Select * from oTeam", transaction: tran).ToList(); foreach (var team in teams) { _db.ExecuteSqlCommand("INSERT INTO Team VALUES ({0}, {1}, {2})", @@ -320,7 +325,8 @@ private void CopyTeams() private void CopyRoles() { - var roles = _db.SqlQuery("Select * from oRole").ToList(); + var tran = (_db.CurrentTransaction as Microsoft.EntityFrameworkCore.Storage.RelationalTransaction).GetInfrastructure(); + var roles = _db.GetDbConnection().Query("Select * from oRole", transaction: tran).ToList(); foreach (var role in roles) { _db.ExecuteSqlCommand("INSERT INTO Role VALUES ({0}, {1}, {2})", @@ -332,14 +338,15 @@ private void CopyRoles() private void CopyRepositories() { - var repos = _db.SqlQuery("SELECT * FROM oRepo").ToList(); + var tran = (_db.CurrentTransaction as Microsoft.EntityFrameworkCore.Storage.RelationalTransaction).GetInfrastructure(); + var repos = _db.GetDbConnection().Query("SELECT * FROM oRepo", transaction: tran).ToList(); foreach (var repo in repos) { _db.ExecuteSqlCommand("INSERT INTO Repository VALUES ({0}, {1}, {2}, {3}, {4}, {5}, {6})", Guid.NewGuid(), repo.Name, repo.Description, repo.Anonymous, repo.AuditPushUser, repo.Group, repo.Logo); } } - + private void AddRelations() { // ALTER TABLE UserRepository_Administrator RENAME TO ura; @@ -411,6 +418,6 @@ FROM trp public string Command { get { return null; } } public string Precondition { get { return null; } } - public PrincipalContext ADPricipalContextHelper { get; private set; } + //public PrincipalContext ADPricipalContextHelper { get; private set; } } } diff --git a/Bonobo.Git.Server/Data/Update/SqlServer/AddRepoLinksColumns.cs b/Bonobo.Git.Server/Data/Update/SqlServer/AddRepoLinksColumns.cs index 4c506dde8..34178134a 100644 --- a/Bonobo.Git.Server/Data/Update/SqlServer/AddRepoLinksColumns.cs +++ b/Bonobo.Git.Server/Data/Update/SqlServer/AddRepoLinksColumns.cs @@ -1,6 +1,4 @@ -using System; - -namespace Bonobo.Git.Server.Data.Update.SqlServer +namespace Bonobo.Git.Server.Data.Update.SqlServer { public class AddRepoLinksColumn : IUpdateScript { diff --git a/Bonobo.Git.Server/Data/Update/SqlServer/AddRepoPushColumn.cs b/Bonobo.Git.Server/Data/Update/SqlServer/AddRepoPushColumn.cs index c46cde78f..0f7e454c2 100644 --- a/Bonobo.Git.Server/Data/Update/SqlServer/AddRepoPushColumn.cs +++ b/Bonobo.Git.Server/Data/Update/SqlServer/AddRepoPushColumn.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace Bonobo.Git.Server.Data.Update.SqlServer +namespace Bonobo.Git.Server.Data.Update.SqlServer { public class AddRepoPushColumn : IUpdateScript { diff --git a/Bonobo.Git.Server/Data/Update/SqlServer/AddRepositoryLogo.cs b/Bonobo.Git.Server/Data/Update/SqlServer/AddRepositoryLogo.cs index 3911f02e0..7b921a1df 100644 --- a/Bonobo.Git.Server/Data/Update/SqlServer/AddRepositoryLogo.cs +++ b/Bonobo.Git.Server/Data/Update/SqlServer/AddRepositoryLogo.cs @@ -1,6 +1,4 @@ -using System; - -namespace Bonobo.Git.Server.Data.Update.SqlServer +namespace Bonobo.Git.Server.Data.Update.SqlServer { public class AddRepositoryLogo : IUpdateScript { diff --git a/Bonobo.Git.Server/Data/Update/SqlServer/InitialCreateScript.cs b/Bonobo.Git.Server/Data/Update/SqlServer/InitialCreateScript.cs index a45ce6754..b16206b91 100644 --- a/Bonobo.Git.Server/Data/Update/SqlServer/InitialCreateScript.cs +++ b/Bonobo.Git.Server/Data/Update/SqlServer/InitialCreateScript.cs @@ -1,6 +1,4 @@ -using System; - -namespace Bonobo.Git.Server.Data.Update.SqlServer +namespace Bonobo.Git.Server.Data.Update.SqlServer { public class InitialCreateScript : IUpdateScript { diff --git a/Bonobo.Git.Server/Data/Update/SqlServer/InsertDefaultData.cs b/Bonobo.Git.Server/Data/Update/SqlServer/InsertDefaultData.cs index 2bbc9dce4..34b2801fa 100644 --- a/Bonobo.Git.Server/Data/Update/SqlServer/InsertDefaultData.cs +++ b/Bonobo.Git.Server/Data/Update/SqlServer/InsertDefaultData.cs @@ -12,8 +12,8 @@ public string Command Guid UserId = new Guid("3eb9995e-99e3-425a-b978-1409bdd61fb6"); return @" - INSERT INTO [Role] ([Id], [Name], [Description]) VALUES ('" + roleId +@"','Administrator','System administrator'); - INSERT INTO [User] ([Id], [Name], [Surname], [Username], [Password], [PasswordSalt], [Email]) VALUES ('" +UserId +@"','admin', '', 'admin', '0CC52C6751CC92916C138D8D714F003486BF8516933815DFC11D6C3E36894BFA044F97651E1F3EEBA26CDA928FB32DE0869F6ACFB787D5A33DACBA76D34473A3', 'admin', ''); + INSERT INTO [Role] ([Id], [Name], [Description]) VALUES ('" + roleId + @"','Administrator','System administrator'); + INSERT INTO [User] ([Id], [Name], [Surname], [Username], [Password], [PasswordSalt], [Email]) VALUES ('" + UserId + @"','admin', '', 'admin', '0CC52C6751CC92916C138D8D714F003486BF8516933815DFC11D6C3E36894BFA044F97651E1F3EEBA26CDA928FB32DE0869F6ACFB787D5A33DACBA76D34473A3', 'admin', ''); INSERT INTO [UserRole_InRole] ([User_Id], [Role_Id]) VALUES ('" + UserId + "','" + roleId + @"'); "; } diff --git a/Bonobo.Git.Server/Data/Update/Sqlite/AddAuditPushUser.cs b/Bonobo.Git.Server/Data/Update/Sqlite/AddAuditPushUser.cs index d01055750..86de168bb 100644 --- a/Bonobo.Git.Server/Data/Update/Sqlite/AddAuditPushUser.cs +++ b/Bonobo.Git.Server/Data/Update/Sqlite/AddAuditPushUser.cs @@ -1,6 +1,4 @@ -using System; - -namespace Bonobo.Git.Server.Data.Update.Sqlite +namespace Bonobo.Git.Server.Data.Update.Sqlite { public class AddAuditPushUser : IUpdateScript { @@ -23,7 +21,7 @@ public string Precondition } } - public void CodeAction(BonoboGitServerContext context) {} + public void CodeAction(BonoboGitServerContext context) { } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Data/Update/Sqlite/AddGroup.cs b/Bonobo.Git.Server/Data/Update/Sqlite/AddGroup.cs index 175a53eb2..1d14928bc 100644 --- a/Bonobo.Git.Server/Data/Update/Sqlite/AddGroup.cs +++ b/Bonobo.Git.Server/Data/Update/Sqlite/AddGroup.cs @@ -1,6 +1,4 @@ -using System; - -namespace Bonobo.Git.Server.Data.Update.Sqlite +namespace Bonobo.Git.Server.Data.Update.Sqlite { public class AddGroup : IUpdateScript { diff --git a/Bonobo.Git.Server/Data/Update/Sqlite/AddGuidColumn.cs b/Bonobo.Git.Server/Data/Update/Sqlite/AddGuidColumn.cs index 76f8b4c0e..8e99dbf02 100644 --- a/Bonobo.Git.Server/Data/Update/Sqlite/AddGuidColumn.cs +++ b/Bonobo.Git.Server/Data/Update/Sqlite/AddGuidColumn.cs @@ -1,22 +1,25 @@ -using Bonobo.Git.Server.Security; -using System.DirectoryServices.AccountManagement; -using System.Web.Mvc; -using System.Collections.Generic; -using System; -using System.Data.Entity; -using System.Data.SQLite; +using System; +using System.Linq; using Bonobo.Git.Server.Helpers; +using Bonobo.Git.Server.Security; +using Dapper; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.Extensions.DependencyInjection; namespace Bonobo.Git.Server.Data.Update.Sqlite { public class AddGuidColumn : IUpdateScript { private readonly IAuthenticationProvider AuthProvider; - private Database _db; + private readonly ADHelper _adHelper; + private DatabaseFacade _db; - public AddGuidColumn() + public AddGuidColumn(IServiceProvider serviceProvider) { - AuthProvider = DependencyResolver.Current.GetService(); + _adHelper = serviceProvider.GetService(); + this.AuthProvider = serviceProvider.GetService(); } public void CodeAction(BonoboGitServerContext context) @@ -52,10 +55,10 @@ private bool UpgradeHasAlreadyBeenRun() try { // force evaluation to get an error if column does not exist - _db.ExecuteSqlCommand("SELECT Count([Id]) = -1 FROM User"); + _db.GetDbConnection().Execute("SELECT Count([Id]) = -1 FROM User"); return true; } - catch (SQLiteException) + catch (SqliteException) { // the column does not exist! return false; @@ -258,13 +261,16 @@ private void CopyData() private void CopyUsers() { - var users = _db.SqlQuery("Select * from oUser;"); + var tran = (_db.CurrentTransaction as Microsoft.EntityFrameworkCore.Storage.RelationalTransaction).GetInfrastructure(); + var users = _db.GetDbConnection().Query("Select * from oUser;", transaction: tran).ToList(); + //tran.Commit(); + foreach (var entry in users) { Guid guid = Guid.NewGuid(); if (AuthProvider is WindowsAuthenticationProvider) { - var user = ADHelper.GetUserPrincipal(entry.Username); + var user = _adHelper.GetUserPrincipal(entry.Username); // if the user no longer exists // it means he cannot login anymore so it is safe to assign // any new guid to him @@ -305,7 +311,8 @@ private void CopyUsers() private void CopyTeams() { - var teams = _db.SqlQuery("Select * from oTeam"); + var tran = (_db.CurrentTransaction as Microsoft.EntityFrameworkCore.Storage.RelationalTransaction).GetInfrastructure(); + var teams = _db.GetDbConnection().Query("Select * from oTeam", transaction: tran).ToList(); foreach (var team in teams) { _db.ExecuteSqlCommand("INSERT INTO Team VALUES ({0}, {1}, {2})", @@ -315,7 +322,9 @@ private void CopyTeams() private void CopyRoles() { - var roles = _db.SqlQuery("Select * from oRole"); + var tran = (_db.CurrentTransaction as Microsoft.EntityFrameworkCore.Storage.RelationalTransaction).GetInfrastructure(); + var roles = _db.GetDbConnection().Query("Select * from oRole", transaction: tran).ToList(); + foreach (var role in roles) { _db.ExecuteSqlCommand("INSERT INTO Role VALUES ({0}, {1}, {2})", @@ -327,14 +336,15 @@ private void CopyRoles() private void CopyRepositories() { - var repos = _db.SqlQuery("SELECT * FROM oRepo"); + var tran = (_db.CurrentTransaction as Microsoft.EntityFrameworkCore.Storage.RelationalTransaction).GetInfrastructure(); + var repos = _db.GetDbConnection().Query("SELECT * FROM oRepo", transaction: tran).ToList(); foreach (var repo in repos) { _db.ExecuteSqlCommand("INSERT INTO Repository VALUES ({0}, {1}, {2}, {3}, {4}, {5}, {6})", Guid.NewGuid(), repo.Name, repo.Description, repo.Anonymous, repo.AuditPushUser, repo.Group, repo.Logo); } } - + private void AddRelations() { // ALTER TABLE UserRepository_Administrator RENAME TO ura; diff --git a/Bonobo.Git.Server/Data/Update/Sqlite/AddRepoLinksColumns.cs b/Bonobo.Git.Server/Data/Update/Sqlite/AddRepoLinksColumns.cs index a0b872a86..d83276b80 100644 --- a/Bonobo.Git.Server/Data/Update/Sqlite/AddRepoLinksColumns.cs +++ b/Bonobo.Git.Server/Data/Update/Sqlite/AddRepoLinksColumns.cs @@ -1,6 +1,4 @@ -using System; - -namespace Bonobo.Git.Server.Data.Update.Sqlite +namespace Bonobo.Git.Server.Data.Update.Sqlite { public class AddRepoLinksColumn : IUpdateScript { diff --git a/Bonobo.Git.Server/Data/Update/Sqlite/AddRepoPushColumn.cs b/Bonobo.Git.Server/Data/Update/Sqlite/AddRepoPushColumn.cs index 169c2b235..02b496e19 100644 --- a/Bonobo.Git.Server/Data/Update/Sqlite/AddRepoPushColumn.cs +++ b/Bonobo.Git.Server/Data/Update/Sqlite/AddRepoPushColumn.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace Bonobo.Git.Server.Data.Update.Sqlite +namespace Bonobo.Git.Server.Data.Update.Sqlite { public class AddRepoPushColumn : IUpdateScript { diff --git a/Bonobo.Git.Server/Data/Update/Sqlite/AddRepositoryLogo.cs b/Bonobo.Git.Server/Data/Update/Sqlite/AddRepositoryLogo.cs index 339a122f5..17d6685f2 100644 --- a/Bonobo.Git.Server/Data/Update/Sqlite/AddRepositoryLogo.cs +++ b/Bonobo.Git.Server/Data/Update/Sqlite/AddRepositoryLogo.cs @@ -1,6 +1,4 @@ -using System; - -namespace Bonobo.Git.Server.Data.Update.Sqlite +namespace Bonobo.Git.Server.Data.Update.Sqlite { public class AddRepositoryLogo : IUpdateScript { diff --git a/Bonobo.Git.Server/Data/Update/Sqlite/InitialCreateScript.cs b/Bonobo.Git.Server/Data/Update/Sqlite/InitialCreateScript.cs index 66bd15641..43d5d8f9c 100644 --- a/Bonobo.Git.Server/Data/Update/Sqlite/InitialCreateScript.cs +++ b/Bonobo.Git.Server/Data/Update/Sqlite/InitialCreateScript.cs @@ -1,13 +1,10 @@ - -using System; - -namespace Bonobo.Git.Server.Data.Update.Sqlite +namespace Bonobo.Git.Server.Data.Update.Sqlite { public class InitialCreateScript : IUpdateScript { public string Command { - get + get { // If you modify this scheme make sure to introduce an unit test for the new scheme. return string.Format(@" diff --git a/Bonobo.Git.Server/Data/Update/Sqlite/InsertDefaultData.cs b/Bonobo.Git.Server/Data/Update/Sqlite/InsertDefaultData.cs index 8d281b3a9..d2aa57be6 100644 --- a/Bonobo.Git.Server/Data/Update/Sqlite/InsertDefaultData.cs +++ b/Bonobo.Git.Server/Data/Update/Sqlite/InsertDefaultData.cs @@ -13,7 +13,7 @@ public string Command return @" INSERT INTO [Role] ([Id], [Name], [Description]) VALUES ('" + roleId.ToString() + @"','Administrator','System administrator'); - INSERT INTO [User] ([Id], [Name], [Surname], [Username], [Password], [PasswordSalt], [Email]) VALUES ('"+ UserId.ToString() + @"','admin', '', 'admin', '0CC52C6751CC92916C138D8D714F003486BF8516933815DFC11D6C3E36894BFA044F97651E1F3EEBA26CDA928FB32DE0869F6ACFB787D5A33DACBA76D34473A3', 'admin', ''); + INSERT INTO [User] ([Id], [Name], [Surname], [Username], [Password], [PasswordSalt], [Email]) VALUES ('" + UserId.ToString() + @"','admin', '', 'admin', '0CC52C6751CC92916C138D8D714F003486BF8516933815DFC11D6C3E36894BFA044F97651E1F3EEBA26CDA928FB32DE0869F6ACFB787D5A33DACBA76D34473A3', 'admin', ''); INSERT INTO [UserRole_InRole] ([User_Id], [Role_Id]) VALUES ('" + UserId.ToString() + "','" + roleId.ToString() + @"'); "; diff --git a/Bonobo.Git.Server/Data/Update/UpdateScriptRepository.cs b/Bonobo.Git.Server/Data/Update/UpdateScriptRepository.cs index 49344947b..aebca386d 100644 --- a/Bonobo.Git.Server/Data/Update/UpdateScriptRepository.cs +++ b/Bonobo.Git.Server/Data/Update/UpdateScriptRepository.cs @@ -8,11 +8,11 @@ public static class UpdateScriptRepository /// /// Creates the list of scripts that should be executed on app start. Ordering matters! /// - public static IEnumerable GetScriptsBySqlProviderName(string sqlProvider) + public static IEnumerable GetScriptsBySqlProviderName(string sqlProvider, IServiceProvider serviceProvider) { switch (sqlProvider) { - case "SQLiteConnection": + case "Microsoft.EntityFrameworkCore.Sqlite": return new List { new Sqlite.InitialCreateScript(), @@ -20,12 +20,12 @@ public static IEnumerable GetScriptsBySqlProviderName(string sqlP new Sqlite.AddAuditPushUser(), new Sqlite.AddGroup(), new Sqlite.AddRepositoryLogo(), - new Sqlite.AddGuidColumn(), + new Sqlite.AddGuidColumn(serviceProvider), new Sqlite.AddRepoPushColumn(), new Sqlite.AddRepoLinksColumn(), new Sqlite.InsertDefaultData() }; - case "SqlConnection": + case "Microsoft.EntityFrameworkCore.SqlServer": return new List { new SqlServer.InitialCreateScript(), @@ -33,13 +33,13 @@ public static IEnumerable GetScriptsBySqlProviderName(string sqlP new SqlServer.AddAuditPushUser(), new SqlServer.AddGroup(), new SqlServer.AddRepositoryLogo(), - new SqlServer.AddGuidColumn(), + new SqlServer.AddGuidColumn(serviceProvider), new SqlServer.AddRepoPushColumn(), new SqlServer.AddRepoLinksColumn(), new SqlServer.InsertDefaultData() }; default: - throw new NotImplementedException($"The provider '{sqlProvider}' is not supported yet"); + throw new NotSupportedException($"The provider '{sqlProvider}' is not supported yet"); } } } diff --git a/Bonobo.Git.Server/Data/Update/UsernamesToLower.cs b/Bonobo.Git.Server/Data/Update/UsernamesToLower.cs index 072df7589..f5b86314d 100644 --- a/Bonobo.Git.Server/Data/Update/UsernamesToLower.cs +++ b/Bonobo.Git.Server/Data/Update/UsernamesToLower.cs @@ -1,12 +1,10 @@ -using System; - -namespace Bonobo.Git.Server.Data.Update +namespace Bonobo.Git.Server.Data.Update { public class UsernamesToLower : IUpdateScript { public string Command { - get + get { return @" UPDATE [User] SET Username = lower(Username); diff --git a/Bonobo.Git.Server/Data/User.cs b/Bonobo.Git.Server/Data/User.cs index 2eabb984b..3b1247951 100644 --- a/Bonobo.Git.Server/Data/User.cs +++ b/Bonobo.Git.Server/Data/User.cs @@ -1,15 +1,17 @@ using System; using System.Collections.Generic; +using Bonobo.Git.Server.Data.Mapping; using Bonobo.Git.Server.Models; namespace Bonobo.Git.Server.Data { public partial class User { - private ICollection _administratedRepositories; - private ICollection _repositories; - private ICollection _roles; - private ICollection _teams; + private ICollection _userRepositoryPermissions; + private ICollection _administratedRepositories; + //private ICollection _repositories; + private ICollection _roles; + private ICollection _teams; public Guid Id { get; set; } public string GivenName { get; set; } @@ -19,35 +21,47 @@ public partial class User public string PasswordSalt { get; set; } public string Email { get; set; } - public virtual ICollection AdministratedRepositories + public virtual ICollection Repositories { get { - return _administratedRepositories ?? (_administratedRepositories = new List()); + return _userRepositoryPermissions ?? (_userRepositoryPermissions = new List()); } set { - _administratedRepositories = value; + _userRepositoryPermissions = value; } } - public virtual ICollection Repositories + public virtual ICollection AdministratedRepositories { get { - return _repositories ?? (_repositories = new List()); + return _administratedRepositories ?? (_administratedRepositories = new List()); } set { - _repositories = value; + _administratedRepositories = value; } } - public virtual ICollection Roles + //public virtual ICollection Repositories + //{ + // get + // { + // return _repositories ?? (_repositories = new List()); + // } + // set + // { + // _repositories = value; + // } + //} + + public virtual ICollection Roles { get { - return _roles ?? (_roles = new List()); + return _roles ?? (_roles = new List()); } set { @@ -55,11 +69,11 @@ public virtual ICollection Roles } } - public virtual ICollection Teams + public virtual ICollection Teams { get { - return _teams ?? (_teams = new List()); + return _teams ?? (_teams = new List()); } set { @@ -78,7 +92,5 @@ public UserModel ToModel() Email = Email, }; } - - } } diff --git a/Bonobo.Git.Server/Data/UserRole.cs b/Bonobo.Git.Server/Data/UserRole.cs new file mode 100644 index 000000000..6abeddc65 --- /dev/null +++ b/Bonobo.Git.Server/Data/UserRole.cs @@ -0,0 +1,13 @@ +using System; + +namespace Bonobo.Git.Server.Data +{ + public class UserRole + { + public Guid UserId { get; set; } + public User User { get; set; } + public Guid RoleId { get; set; } + public Role Role { get; set; } + + } +} diff --git a/Bonobo.Git.Server/Definitions.cs b/Bonobo.Git.Server/Definitions.cs index 479b940d8..87a2091fb 100644 --- a/Bonobo.Git.Server/Definitions.cs +++ b/Bonobo.Git.Server/Definitions.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace Bonobo.Git.Server +namespace Bonobo.Git.Server { public static class Definitions { diff --git a/Bonobo.Git.Server/Extensions/HttpRequestExtensions.cs b/Bonobo.Git.Server/Extensions/HttpRequestExtensions.cs new file mode 100644 index 000000000..62cb4c651 --- /dev/null +++ b/Bonobo.Git.Server/Extensions/HttpRequestExtensions.cs @@ -0,0 +1,32 @@ +using System.Net; +using Microsoft.AspNetCore.Http; + +namespace Bonobo.Git.Server.Extensions +{ + public static class HttpRequestExtensions + { + public static bool IsLocal(this HttpContext httpContext) + { + var connection = httpContext.Connection; + if (connection.RemoteIpAddress != null) + { + if (connection.LocalIpAddress != null) + { + return connection.RemoteIpAddress.Equals(connection.LocalIpAddress); + } + else + { + return IPAddress.IsLoopback(connection.RemoteIpAddress); + } + } + + // for in memory TestServer or when dealing with default connection info + if (connection.RemoteIpAddress == null && connection.LocalIpAddress == null) + { + return true; + } + + return false; + } + } +} diff --git a/Bonobo.Git.Server/Extensions/RouteDataExtensions.cs b/Bonobo.Git.Server/Extensions/RouteDataExtensions.cs new file mode 100644 index 000000000..62871b778 --- /dev/null +++ b/Bonobo.Git.Server/Extensions/RouteDataExtensions.cs @@ -0,0 +1,25 @@ +using System; +using Microsoft.AspNetCore.Routing; + +namespace Bonobo.Git.Server.Extensions +{ + public static class RouteDataExtensions + { + public static string GetRequiredString(this RouteData routeData, string valueName) + { + if (routeData == null) + throw new ArgumentNullException(nameof(routeData)); + + object value; + if (routeData.Values.TryGetValue(valueName, out value)) + { + string valueString = value as string; + if (!String.IsNullOrEmpty(valueString)) + { + return valueString; + } + } + throw new InvalidOperationException(string.Format("RouteData_RequiredValue ({0})", valueName)); + } + } +} diff --git a/Bonobo.Git.Server/Extensions/SignatureExtensions.cs b/Bonobo.Git.Server/Extensions/SignatureExtensions.cs index b3ac70682..f42857018 100644 --- a/Bonobo.Git.Server/Extensions/SignatureExtensions.cs +++ b/Bonobo.Git.Server/Extensions/SignatureExtensions.cs @@ -1,10 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using LibGit2Sharp; +using System.Collections.Generic; using System.Security.Cryptography; using System.Text; +using LibGit2Sharp; namespace Bonobo.Git.Server.Extensions { diff --git a/Bonobo.Git.Server/Extensions/TypeExtensions.cs b/Bonobo.Git.Server/Extensions/TypeExtensions.cs index 887d04b70..665804c84 100644 --- a/Bonobo.Git.Server/Extensions/TypeExtensions.cs +++ b/Bonobo.Git.Server/Extensions/TypeExtensions.cs @@ -1,8 +1,6 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; using System.ComponentModel.DataAnnotations; +using System.Linq; namespace Bonobo.Git.Server.Extensions { @@ -13,9 +11,9 @@ public static string GetDisplayValue(this Type type, string propertyName) if (String.IsNullOrEmpty(propertyName)) throw new ArgumentException("propertyName"); var propertyInfo = type.GetProperty(propertyName); - if (propertyInfo == null) + if (propertyInfo == null) throw new InvalidOperationException("Type with this property does not exists"); - + var displayAttribute = propertyInfo.GetCustomAttributes(true).FirstOrDefault(i => i.GetType().IsAssignableFrom(typeof(DisplayAttribute))) as DisplayAttribute; if (displayAttribute != null) diff --git a/Bonobo.Git.Server/Extensions/UserExtensions.cs b/Bonobo.Git.Server/Extensions/UserExtensions.cs index ffb9c419d..3fa00ad19 100644 --- a/Bonobo.Git.Server/Extensions/UserExtensions.cs +++ b/Bonobo.Git.Server/Extensions/UserExtensions.cs @@ -23,7 +23,7 @@ static string GetClaimValue(this IPrincipal user, string claimName) } } } - catch(Exception ex) + catch (Exception ex) { Log.Error(ex, "GetClaimValue exception"); } @@ -33,8 +33,7 @@ static string GetClaimValue(this IPrincipal user, string claimName) public static Guid Id(this IPrincipal user) { string id = user.GetClaimValue(ClaimTypes.NameIdentifier); - Guid result; - if (Guid.TryParse(id, out result)) + if (Guid.TryParse(id, out Guid result)) { // It's a normal string Guid return result; @@ -89,7 +88,7 @@ public static string[] Roles(this IPrincipal user) result = claimsIdentity.FindAll(ClaimTypes.Role).Select(x => x.Value).ToArray(); } } - catch(Exception ex) + catch (Exception ex) { Log.Error(ex, "GetClaim exception"); } @@ -101,8 +100,7 @@ private static ClaimsIdentity GetClaimsIdentity(this IPrincipal user) { ClaimsIdentity result = null; - ClaimsPrincipal claimsPrincipal = user as ClaimsPrincipal; - if (claimsPrincipal != null) + if (user is ClaimsPrincipal claimsPrincipal) { result = claimsPrincipal.Identities.FirstOrDefault(x => x != null); } @@ -174,7 +172,7 @@ public static IEnumerable Step(this IEnumerable source, int step) public static string StringlistToEscapedStringForEnvVar(IEnumerable items, string separator = ",") { - var y = items.Select(x => x.Replace(@"\", @"\\").Replace(separator, @"\"+separator)); + var y = items.Select(x => x.Replace(@"\", @"\\").Replace(separator, @"\" + separator)); return string.Join(separator, y); } } diff --git a/Bonobo.Git.Server/FileActionResult.cs b/Bonobo.Git.Server/FileActionResult.cs deleted file mode 100644 index d4e8fc909..000000000 --- a/Bonobo.Git.Server/FileActionResult.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using System.Web.Mvc; - -namespace Bonobo.Git.Server -{ - public class FileResult : ActionResult - { - private readonly string _data; - private readonly string _name; - - public FileResult(string data, string name) - { - _data = data; - _name = name; - } - - - public override void ExecuteResult(ControllerContext context) - { - if (!String.IsNullOrEmpty(_name)) - { - context.HttpContext.Response.AddHeader("content-disposition", "attachment; filename=" + _name); - } - - context.HttpContext.Response.Write(_data); - } - } -} \ No newline at end of file diff --git a/Bonobo.Git.Server/FileDisplayHandler.cs b/Bonobo.Git.Server/FileDisplayHandler.cs index b70946c5a..7c5c57e32 100644 --- a/Bonobo.Git.Server/FileDisplayHandler.cs +++ b/Bonobo.Git.Server/FileDisplayHandler.cs @@ -1,12 +1,6 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using System.Web.Mvc; -using System.Text; using System.IO; -using System.Xml; -using Ude; +using System.Text; using MimeTypes; namespace Bonobo.Git.Server @@ -22,7 +16,7 @@ public static bool IsImage(string fileName) public static string GetBrush(string fileName) { - if (String.IsNullOrWhiteSpace(fileName)) + if (String.IsNullOrWhiteSpace(fileName)) { throw new ArgumentNullException("fileName"); } @@ -137,30 +131,30 @@ public static string GetText(byte[] data, Encoding encoding) public static bool TryGetEncoding(byte[] data, out Encoding encoding) { - ICharsetDetector cdet = new CharsetDetector(); - cdet.Feed(data, 0, data.Length); - cdet.DataEnd(); - if (cdet.Charset != null) - { - if (cdet.Charset.ToLowerInvariant() == "big-5") - { - encoding = Encoding.GetEncoding("big5"); - return true; - } - else - { - try - { - encoding = Encoding.GetEncoding(cdet.Charset); - return true; - } - catch - { - encoding = Encoding.Default; - return false; - } - } - } + //ICharsetDetector cdet = new CharsetDetector(); + //cdet.Feed(data, 0, data.Length); + //cdet.DataEnd(); + //if (cdet.Charset != null) + //{ + // if (cdet.Charset.ToLowerInvariant() == "big-5") + // { + // encoding = Encoding.GetEncoding("big5"); + // return true; + // } + // else + // { + // try + // { + // encoding = Encoding.GetEncoding(cdet.Charset); + // return true; + // } + // catch + // { + // encoding = Encoding.Default; + // return false; + // } + // } + //} encoding = Encoding.Default; return false; diff --git a/Bonobo.Git.Server/FilterProviders/UnityFilterAttributeFilterProvider.cs b/Bonobo.Git.Server/FilterProviders/UnityFilterAttributeFilterProvider.cs deleted file mode 100644 index 0bec6818f..000000000 --- a/Bonobo.Git.Server/FilterProviders/UnityFilterAttributeFilterProvider.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Web.Mvc; -using Microsoft.Practices.Unity; - -public class UnityFilterAttributeFilterProvider : FilterAttributeFilterProvider -{ - private readonly IUnityContainer _container; - - public UnityFilterAttributeFilterProvider(IUnityContainer container) - { - _container = container; - } - - protected override IEnumerable GetControllerAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor) - { - var attributes = base.GetControllerAttributes(controllerContext, actionDescriptor).ToList(); - foreach (var attribute in attributes) - { - _container.BuildUp(attribute.GetType(), attribute); - } - - return attributes; - } - - protected override IEnumerable GetActionAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor) - { - var attributes = base.GetActionAttributes(controllerContext, actionDescriptor).ToList(); - foreach (var attribute in attributes) - { - _container.BuildUp(attribute.GetType(), attribute); - } - - return attributes; - } -} \ No newline at end of file diff --git a/Bonobo.Git.Server/Git/ConfigurationBasedRepositoryLocator.cs b/Bonobo.Git.Server/Git/ConfigurationBasedRepositoryLocator.cs index c7e3780d2..0683bde01 100644 --- a/Bonobo.Git.Server/Git/ConfigurationBasedRepositoryLocator.cs +++ b/Bonobo.Git.Server/Git/ConfigurationBasedRepositoryLocator.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Web; +using System.IO; namespace Bonobo.Git.Server.Git { diff --git a/Bonobo.Git.Server/Git/GitCmdResult.cs b/Bonobo.Git.Server/Git/GitCmdResult.cs index 1d871be5a..8f7d4392e 100644 --- a/Bonobo.Git.Server/Git/GitCmdResult.cs +++ b/Bonobo.Git.Server/Git/GitCmdResult.cs @@ -1,13 +1,11 @@ using System; using System.IO; -using System.IO.Compression; -using System.Web; -using System.Web.Mvc; -using Bonobo.Git.Server.Configuration; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; namespace Bonobo.Git.Server.Git { - public class GitCmdResult : ActionResult + public class GitCmdResult : IActionResult { private readonly string contentType; private readonly string advertiseRefsContent; @@ -25,28 +23,33 @@ public GitCmdResult(string contentType, Action executeGitCommand, string this.executeGitCommand = executeGitCommand; } - public override void ExecuteResult(ControllerContext context) + public Task ExecuteResultAsync(ActionContext context) { if (context == null) throw new ArgumentNullException("context"); var response = context.HttpContext.Response; + // SetNoCache + response.Headers.Add("Expires", "Fri, 01 Jan 1980 00:00:00 GMT"); + response.Headers.Add("Pragma", "no-cache"); + response.Headers.Add("Cache-Control", "no-cache, max-age=0, must-revalidate"); + + //response.BufferOutput = false; + //response.Charset = ""; + response.ContentType = contentType; + if (advertiseRefsContent != null) { - response.Write(advertiseRefsContent); + var bytes = System.Text.Encoding.ASCII.GetBytes(advertiseRefsContent); + response.Body.Write(bytes, 0, bytes.Length); } - // SetNoCache - response.AddHeader("Expires", "Fri, 01 Jan 1980 00:00:00 GMT"); - response.AddHeader("Pragma", "no-cache"); - response.AddHeader("Cache-Control", "no-cache, max-age=0, must-revalidate"); - response.BufferOutput = false; - response.Charset = ""; - response.ContentType = contentType; - executeGitCommand(response.OutputStream); + executeGitCommand(response.Body); + + return Task.CompletedTask; } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Git/GitService/GitServiceExecutor.cs b/Bonobo.Git.Server/Git/GitService/GitServiceExecutor.cs index 07faaa577..7faf989f2 100644 --- a/Bonobo.Git.Server/Git/GitService/GitServiceExecutor.cs +++ b/Bonobo.Git.Server/Git/GitService/GitServiceExecutor.cs @@ -1,12 +1,5 @@ -using Bonobo.Git.Server.Data; -using Bonobo.Git.Server.Security; +using System.Diagnostics; using System.IO; -using System.Web; -using System.Web.Mvc; -using System.Linq; -using System; -using System.Collections.Generic; -using System.Diagnostics; namespace Bonobo.Git.Server.Git.GitService { @@ -15,9 +8,9 @@ namespace Bonobo.Git.Server.Git.GitService public class GitServiceExecutorParams { public string GitPath { get; set; } - + public string GitHomePath { get; set; } - + public string RepositoriesDirPath { get; set; } } @@ -60,21 +53,23 @@ public void ExecuteServiceByName( SetHomePath(info); - var username = HttpContext.Current.User.Username(); + //var username = HttpContext.Current.User.Username(); + var username = "plop"; var teamsstr = ""; var rolesstr = ""; var displayname = ""; - if(!string.IsNullOrEmpty(username)){ - ITeamRepository tr = DependencyResolver.Current.GetService(); - var userId = HttpContext.Current.User.Id(); - var teams = tr.GetTeams(userId); - teamsstr = UserExtensions.StringlistToEscapedStringForEnvVar(teams.Select(x => x.Name)); + if (!string.IsNullOrEmpty(username)) + { + //ITeamRepository tr = DependencyResolver.Current.GetService(); + //var userId = HttpContext.Current.User.Id(); + //var teams = tr.GetTeams(userId); + //teamsstr = UserExtensions.StringlistToEscapedStringForEnvVar(teams.Select(x => x.Name)); - IRoleProvider rp = DependencyResolver.Current.GetService(); - rolesstr = UserExtensions.StringlistToEscapedStringForEnvVar(rp.GetRolesForUser(userId)); + //IRoleProvider rp = DependencyResolver.Current.GetService(); + //rolesstr = UserExtensions.StringlistToEscapedStringForEnvVar(rp.GetRolesForUser(userId)); - IMembershipService ms = DependencyResolver.Current.GetService(); - displayname = ms.GetUserModel(userId).DisplayName; + //IMembershipService ms = DependencyResolver.Current.GetService(); + //displayname = ms.GetUserModel(userId).DisplayName; } // If anonymous option is set then these will always be empty @@ -88,9 +83,12 @@ public void ExecuteServiceByName( using (var process = Process.Start(info)) { inStream.CopyTo(process.StandardInput.BaseStream); - if (options.endStreamWithClose) { + if (options.endStreamWithClose) + { process.StandardInput.Close(); - } else { + } + else + { process.StandardInput.Write('\0'); } diff --git a/Bonobo.Git.Server/Git/GitService/ReceivePackHook/ReceivePackParser.cs b/Bonobo.Git.Server/Git/GitService/ReceivePackHook/ReceivePackParser.cs index 2ffd894cf..06666a4f8 100644 --- a/Bonobo.Git.Server/Git/GitService/ReceivePackHook/ReceivePackParser.cs +++ b/Bonobo.Git.Server/Git/GitService/ReceivePackHook/ReceivePackParser.cs @@ -1,19 +1,18 @@ -using Ionic.Zlib; -using LibGit2Sharp; -using System; +using System; using System.Collections.Generic; using System.IO; +using System.IO.Compression; using System.Linq; using System.Runtime.CompilerServices; using System.Security.Cryptography; using System.Text; -using System.Web; +//using Ionic.Zlib; namespace Bonobo.Git.Server.Git.GitService.ReceivePackHook { public class ReceivePackParser : IGitService { - private readonly IGitService gitService; + private readonly IGitService gitService; private readonly IHookReceivePack receivePackHandler; private readonly GitServiceResultParser resultParser; @@ -46,7 +45,7 @@ public void ExecuteServiceByName(string correlationId, string repositoryName, st var buff1 = new byte[1]; var buff4 = new byte[4]; var buff20 = new byte[20]; - var buff16K = new byte[1024 * 16]; + var buff16K = new byte[1024 * 16]; while (true) { @@ -139,9 +138,9 @@ public void ExecuteServiceByName(string correlationId, string repositoryName, st } var origPosition = inStream.Position; - long offsetVal = 0; + //long offsetVal = 0; - using (var zlibStream = new ZlibStream(inStream, CompressionMode.Decompress, true)) + using (var zlibStream = GetZlibCompressedStream(inStream, CompressionMode.Decompress, true)) { // read compressed data max 16KB at a time var readRemaining = len; @@ -156,15 +155,16 @@ public void ExecuteServiceByName(string correlationId, string repositoryName, st var parsedCommit = ParseCommitDetails(buff16K, len); packCommits.Add(parsedCommit); } - offsetVal = zlibStream.TotalIn; + //offsetVal = zlibStream.TotalIn; } // move back position a bit because ZLibStream reads more than needed for inflating - inStream.Seek(origPosition + offsetVal, SeekOrigin.Begin); + //inStream.Seek(origPosition + offsetVal, SeekOrigin.Begin); } } // ------------------- - var user = HttpContext.Current.User.Username(); + // var user = HttpContext.Current.User.Username(); + var user = "plop"; receivedPack = new ParsedReceivePack(correlationId, repositoryName, pktLines, user, DateTime.Now, packCommits); inStream.Seek(0, SeekOrigin.Begin); @@ -182,7 +182,7 @@ public void ExecuteServiceByName(string correlationId, string repositoryName, st execResult = resultParser.ParseResult(capturedOutputStream); } - if(receivedPack != null) + if (receivedPack != null) { receivePackHandler.PostPackReceive(receivedPack, execResult); } @@ -211,7 +211,7 @@ public ReceivePackCommit ParseCommitDetails(byte[] buff, long commitMsgLengthLon foreach (var commitLine in commitLines) { commitHeadersEndIndex += 1; - + // Make sure we have safe default values in case the string is empty. var commitHeaderType = ""; var commitHeaderData = ""; @@ -293,13 +293,13 @@ public ReceivePackCommitSignature ParseSignature(string commitHeaderData) // Find the start and end markers of the email address. var emailStart = commitHeaderData.IndexOf('<'); var emailEnd = commitHeaderData.IndexOf('>'); - + // Leave out the trailing space. var nameLength = emailStart - 1; // Leave out the starting bracket. var emailLength = emailEnd - emailStart - 1; - + // Parse the name and email values. var name = commitHeaderData.Substring(0, nameLength); var email = commitHeaderData.Substring(emailStart + 1, emailLength); @@ -324,5 +324,26 @@ public void ReadStream(Stream s, byte[] buff) throw new Exception(string.Format("Expected to read {0} bytes, got {1}", buff.Length, readBytes)); } } + + public static Stream GetZlibCompressedStream(Stream stream, CompressionMode mode, bool leaveOpen) + { + // https://github.com/adamhathcock/sharpcompress/issues/233 + byte[] CMF = new byte[] { 0b0101, 0b1000, 0b10_0_0, 0b0101 }; + byte[] FLG = new byte[] { 0b0111, 0b1000, 0b00_0_0, 0b0001 }; + + switch (mode) + { + case CompressionMode.Compress: + // We need to add a zlib-compatible header, because the C++ zlib.dll requires it and we want to remain compatible. + stream.Write(CMF, 0, CMF.Length); + return new DeflateStream(stream, CompressionMode.Compress, leaveOpen); + case CompressionMode.Decompress: + // we need to seek past zlib's 2-byte magic header, called CMF FLG because Microsoft's DeflateStream doesn't handle them. + stream.Position += CMF.Length; + return new DeflateStream(stream, CompressionMode.Decompress, leaveOpen); + default: + return null; + } + } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Git/IGitRepositoryLocator.cs b/Bonobo.Git.Server/Git/IGitRepositoryLocator.cs index 51a83b730..3f8dbd318 100644 --- a/Bonobo.Git.Server/Git/IGitRepositoryLocator.cs +++ b/Bonobo.Git.Server/Git/IGitRepositoryLocator.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Web; +using System.IO; namespace Bonobo.Git.Server.Git { diff --git a/Bonobo.Git.Server/Global.asax b/Bonobo.Git.Server/Global.asax deleted file mode 100644 index 04dd94369..000000000 --- a/Bonobo.Git.Server/Global.asax +++ /dev/null @@ -1 +0,0 @@ -<%@ Application Codebehind="Global.asax.cs" Inherits="Bonobo.Git.Server.MvcApplication" Language="C#" %> diff --git a/Bonobo.Git.Server/Global.asax.cs b/Bonobo.Git.Server/Global.asax.cs index 025442966..5c041b23a 100644 --- a/Bonobo.Git.Server/Global.asax.cs +++ b/Bonobo.Git.Server/Global.asax.cs @@ -1,313 +1,313 @@ -using System; -using System.Configuration; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Security.Principal; -using System.Threading; -using System.Web; -using System.Web.Mvc; -using System.Web.Optimization; -using System.Web.Routing; -using System.Web.Security; -using Bonobo.Git.Server.App_Start; -using Bonobo.Git.Server.Configuration; -using Bonobo.Git.Server.Controllers; -using Bonobo.Git.Server.Data; -using Bonobo.Git.Server.Data.Update; -using Bonobo.Git.Server.Git; -using Bonobo.Git.Server.Git.GitService; -using Bonobo.Git.Server.Git.GitService.ReceivePackHook; -using Bonobo.Git.Server.Git.GitService.ReceivePackHook.Durability; -using Bonobo.Git.Server.Git.GitService.ReceivePackHook.Hooks; -using Bonobo.Git.Server.Security; -using Microsoft.Practices.Unity; -using System.Runtime.Caching; -using Bonobo.Git.Server.Attributes; -using Microsoft.Practices.Unity.Mvc; -using System.Web.Configuration; -using System.Security.Claims; -using System.Web.Helpers; -using System.Web.Hosting; -using Serilog; - -namespace Bonobo.Git.Server -{ - public class MvcApplication : HttpApplication - { - public static ObjectCache Cache = MemoryCache.Default; - - protected void Application_AcquireRequestState(object sender, EventArgs e) - { - if (HttpContext.Current.Session == null) - { - return; - } - - var culture = (CultureInfo)Session["Culture"]; - if (culture == null) - { - culture = !String.IsNullOrEmpty(UserConfiguration.Current.DefaultLanguage) - ? new CultureInfo(UserConfiguration.Current.DefaultLanguage) - : null; - - if (culture == null) - { - string langName = "en"; - - if (HttpContext.Current.Request.UserLanguages != null && - HttpContext.Current.Request.UserLanguages.Length != 0 && - HttpContext.Current.Request.UserLanguages[0].Length > 2) - { - langName = HttpContext.Current.Request.UserLanguages[0].Substring(0, 2); - } - - culture = new CultureInfo(langName); - Session["Culture"] = culture; - } - } - - Thread.CurrentThread.CurrentUICulture = culture; - Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture.Name); - } - - protected void Application_Start() - { - ConfigureLogging(); - Log.Information("Bonobo starting"); - - AreaRegistration.RegisterAllAreas(); - BundleConfig.RegisterBundles(BundleTable.Bundles); - RouteConfig.RegisterRoutes(RouteTable.Routes); - UserConfiguration.Initialize(); - RegisterDependencyResolver(); - GlobalFilters.Filters.Add((AllViewsFilter)DependencyResolver.Current.GetService()); - - var connectionstring = WebConfigurationManager.ConnectionStrings["BonoboGitServerContext"]; - if (connectionstring.ProviderName.ToLowerInvariant() == "system.data.sqlite") - { - if(!connectionstring.ConnectionString.ToLowerInvariant().Contains("binaryguid=false")) - { - Log.Error("Please ensure that the sqlite connection string contains 'BinaryGUID=false;'."); - throw new ConfigurationErrorsException("Please ensure that the sqlite connection string contains 'BinaryGUID=false;'."); - } - } - - try - { - AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier; - - new AutomaticUpdater().Run(); - new RepositorySynchronizer().Run(); - } - catch (Exception ex) - { - Log.Error(ex, "Startup exception"); - throw; - } - } - - private void ConfigureLogging() - { - Log.Logger = new LoggerConfiguration() - .ReadFrom.AppSettings() - .WriteTo.RollingFile(GetLogFileNameFormat()) - .CreateLogger(); - } - - public static string GetLogFileNameFormat() - { - string logDirectory = ConfigurationManager.AppSettings["LogDirectory"]; - if (string.IsNullOrEmpty(logDirectory)) - { - logDirectory = @"~\App_Data\Logs"; - } - return Path.Combine(HostingEnvironment.MapPath(logDirectory), "log-{Date}.txt"); - } - - private static void RegisterDependencyResolver() - { - var container = new UnityContainer(); - - /* - The UnityDecoratorContainerExtension breaks resolving named type registrations, like: - - container.RegisterType("ActiveDirectory"); - container.RegisterType("Internal"); - IMembershipService membershipService = container.Resolve(AuthenticationSettings.MembershipService); - - Until this issue is resolved, the following two switch hacks will have to do - */ - - switch (AuthenticationSettings.MembershipService.ToLowerInvariant()) - { - case "activedirectory": - container.RegisterType(); - container.RegisterType(); - container.RegisterType(); - container.RegisterType(); - container.RegisterType(); - break; - case "internal": - container.RegisterType(); - container.RegisterType(); - container.RegisterType(); - container.RegisterType(); - container.RegisterType(); - break; - default: - throw new ArgumentException("Missing declaration in web.config", "MembershipService"); - } - - switch (AuthenticationSettings.AuthenticationProvider.ToLowerInvariant()) - { - case "windows": - container.RegisterType(); - break; - case "cookies": - container.RegisterType(); - break; - case "federation": - container.RegisterType(); - break; - default: - throw new ArgumentException("Missing declaration in web.config", "AuthenticationProvider"); - } - - container.RegisterType( - new InjectionFactory((ctr, type, name) => { - return new ConfigurationBasedRepositoryLocator(UserConfiguration.Current.Repositories); - }) - ); - - container.RegisterInstance( - new GitServiceExecutorParams() - { - GitPath = GetRootPath(ConfigurationManager.AppSettings["GitPath"]), - GitHomePath = GetRootPath(ConfigurationManager.AppSettings["GitHomePath"]), - RepositoriesDirPath = UserConfiguration.Current.Repositories, - }); - - container.RegisterType(); - - if (AppSettings.IsPushAuditEnabled) - { - EnablePushAuditAnalysis(container); - } - - container.RegisterType(); - - DependencyResolver.SetResolver(new UnityDependencyResolver(container)); - - var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider); - FilterProviders.Providers.Remove(oldProvider); - - var provider = new UnityFilterAttributeFilterProvider(container); - FilterProviders.Providers.Add(provider); - } - - private static void EnablePushAuditAnalysis(IUnityContainer container) - { - var isReceivePackRecoveryProcessEnabled = !string.IsNullOrEmpty(ConfigurationManager.AppSettings["RecoveryDataPath"]); - - if (isReceivePackRecoveryProcessEnabled) - { - // git service execution durability registrations to enable receive-pack hook execution after failures - container.RegisterType(); - container.RegisterType(); - container.RegisterType(); - container.RegisterType(); - container.RegisterInstance(new NamedArguments.FailedPackWaitTimeBeforeExecution(TimeSpan.FromSeconds(5 * 60))); - - container.RegisterInstance(new NamedArguments.ReceivePackRecoveryDirectory( - Path.IsPathRooted(ConfigurationManager.AppSettings["RecoveryDataPath"]) ? - ConfigurationManager.AppSettings["RecoveryDataPath"] : - HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["RecoveryDataPath"]))); - } - - // base git service executor - container.RegisterType(); - container.RegisterType(); - - // receive pack hooks - container.RegisterType(); - container.RegisterType(); - - // run receive-pack recovery if possible - if (isReceivePackRecoveryProcessEnabled) - { - var recoveryProcess = container.Resolve( - new ParameterOverride( - "failedPackWaitTimeBeforeExecution", - new NamedArguments.FailedPackWaitTimeBeforeExecution(TimeSpan.FromSeconds(0)))); // on start up set time to wait = 0 so that recovery for all waiting packs is attempted - - try - { - recoveryProcess.RecoverAll(); - } - catch - { - // don't let a failed recovery attempt stop start-up process - } - finally - { - if (recoveryProcess != null) - { - container.Teardown(recoveryProcess); - } - } - } - } - - - protected void Application_Error(object sender, EventArgs e) - { - Exception exception = Server.GetLastError(); - if (exception != null) - { - Response.Clear(); - HttpException httpException = exception as HttpException; - - RouteData routeData = new RouteData(); - routeData.Values.Add("controller", "Home"); - if (httpException == null) - { - routeData.Values.Add("action", "Error"); - if (exception != null) - { - Log.Error(exception, "Exception caught in Global.asax1"); - } - } - else - { - switch (httpException.GetHttpCode()) - { - case 404: - routeData.Values.Add("action", "PageNotFound"); - break; - case 500: - routeData.Values.Add("action", "ServerError"); - Log.Error(exception, "500 Exception caught in Global.asax"); - break; - default: - routeData.Values.Add("action", "Error"); - Log.Error(exception, "Exception caught in Global.asax (code {Code})", httpException.GetHttpCode()); - break; - } - } - Server.ClearError(); - Response.TrySkipIisCustomErrors = true; - IController errorController = new HomeController(); - errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); - } - } - - private static string GetRootPath(string path) - { - return Path.IsPathRooted(path) ? - path : - HttpContext.Current.Server.MapPath(path); - } - - } -} +//using System; +//using System.Configuration; +//using System.Globalization; +//using System.IO; +//using System.Linq; +//using System.Security.Principal; +//using System.Threading; +//using System.Web; +//using System.Web.Mvc; +//using System.Web.Optimization; +//using System.Web.Routing; +//using System.Web.Security; +//using Bonobo.Git.Server.App_Start; +//using Bonobo.Git.Server.Configuration; +//using Bonobo.Git.Server.Controllers; +//using Bonobo.Git.Server.Data; +//using Bonobo.Git.Server.Data.Update; +//using Bonobo.Git.Server.Git; +//using Bonobo.Git.Server.Git.GitService; +//using Bonobo.Git.Server.Git.GitService.ReceivePackHook; +//using Bonobo.Git.Server.Git.GitService.ReceivePackHook.Durability; +//using Bonobo.Git.Server.Git.GitService.ReceivePackHook.Hooks; +//using Bonobo.Git.Server.Security; +//using Microsoft.Practices.Unity; +//using System.Runtime.Caching; +//using Bonobo.Git.Server.Attributes; +//using Microsoft.Practices.Unity.Mvc; +//using System.Web.Configuration; +//using System.Security.Claims; +//using System.Web.Helpers; +//using System.Web.Hosting; +//using Serilog; + +//namespace Bonobo.Git.Server +//{ +// public class MvcApplication : HttpApplication +// { +// public static ObjectCache Cache = MemoryCache.Default; + +// protected void Application_AcquireRequestState(object sender, EventArgs e) +// { +// if (HttpContext.Current.Session == null) +// { +// return; +// } + +// var culture = (CultureInfo)Session["Culture"]; +// if (culture == null) +// { +// culture = !String.IsNullOrEmpty(UserConfiguration.Current.DefaultLanguage) +// ? new CultureInfo(UserConfiguration.Current.DefaultLanguage) +// : null; + +// if (culture == null) +// { +// string langName = "en"; + +// if (HttpContext.Current.Request.UserLanguages != null && +// HttpContext.Current.Request.UserLanguages.Length != 0 && +// HttpContext.Current.Request.UserLanguages[0].Length > 2) +// { +// langName = HttpContext.Current.Request.UserLanguages[0].Substring(0, 2); +// } + +// culture = new CultureInfo(langName); +// Session["Culture"] = culture; +// } +// } + +// Thread.CurrentThread.CurrentUICulture = culture; +// Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture.Name); +// } + +// protected void Application_Start() +// { +// ConfigureLogging(); +// Log.Information("Bonobo starting"); + +// AreaRegistration.RegisterAllAreas(); +// BundleConfig.RegisterBundles(BundleTable.Bundles); +// RouteConfig.RegisterRoutes(RouteTable.Routes); +// UserConfiguration.Initialize(); +// RegisterDependencyResolver(); +// GlobalFilters.Filters.Add((AllViewsFilter)DependencyResolver.Current.GetService()); + +// var connectionstring = WebConfigurationManager.ConnectionStrings["BonoboGitServerContext"]; +// if (connectionstring.ProviderName.ToLowerInvariant() == "system.data.sqlite") +// { +// if(!connectionstring.ConnectionString.ToLowerInvariant().Contains("binaryguid=false")) +// { +// Log.Error("Please ensure that the sqlite connection string contains 'BinaryGUID=false;'."); +// throw new ConfigurationErrorsException("Please ensure that the sqlite connection string contains 'BinaryGUID=false;'."); +// } +// } + +// try +// { +// AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier; + +// new AutomaticUpdater().Run(); +// new RepositorySynchronizer().Run(); +// } +// catch (Exception ex) +// { +// Log.Error(ex, "Startup exception"); +// throw; +// } +// } + +// private void ConfigureLogging() +// { +// Log.Logger = new LoggerConfiguration() +// .ReadFrom.AppSettings() +// .WriteTo.RollingFile(GetLogFileNameFormat()) +// .CreateLogger(); +// } + +// public static string GetLogFileNameFormat() +// { +// string logDirectory = ConfigurationManager.AppSettings["LogDirectory"]; +// if (string.IsNullOrEmpty(logDirectory)) +// { +// logDirectory = @"~\App_Data\Logs"; +// } +// return Path.Combine(HostingEnvironment.MapPath(logDirectory), "log-{Date}.txt"); +// } + +// private static void RegisterDependencyResolver() +// { +// var container = new UnityContainer(); + +// /* +// The UnityDecoratorContainerExtension breaks resolving named type registrations, like: + +// container.RegisterType("ActiveDirectory"); +// container.RegisterType("Internal"); +// IMembershipService membershipService = container.Resolve(AuthenticationSettings.MembershipService); + +// Until this issue is resolved, the following two switch hacks will have to do +// */ + +// switch (AuthenticationSettings.MembershipService.ToLowerInvariant()) +// { +// case "activedirectory": +// container.RegisterType(); +// container.RegisterType(); +// container.RegisterType(); +// container.RegisterType(); +// container.RegisterType(); +// break; +// case "internal": +// container.RegisterType(); +// container.RegisterType(); +// container.RegisterType(); +// container.RegisterType(); +// container.RegisterType(); +// break; +// default: +// throw new ArgumentException("Missing declaration in web.config", "MembershipService"); +// } + +// switch (AuthenticationSettings.AuthenticationProvider.ToLowerInvariant()) +// { +// case "windows": +// container.RegisterType(); +// break; +// case "cookies": +// container.RegisterType(); +// break; +// case "federation": +// container.RegisterType(); +// break; +// default: +// throw new ArgumentException("Missing declaration in web.config", "AuthenticationProvider"); +// } + +// container.RegisterType( +// new InjectionFactory((ctr, type, name) => { +// return new ConfigurationBasedRepositoryLocator(UserConfiguration.Current.Repositories); +// }) +// ); + +// container.RegisterInstance( +// new GitServiceExecutorParams() +// { +// GitPath = GetRootPath(ConfigurationManager.AppSettings["GitPath"]), +// GitHomePath = GetRootPath(ConfigurationManager.AppSettings["GitHomePath"]), +// RepositoriesDirPath = UserConfiguration.Current.Repositories, +// }); + +// container.RegisterType(); + +// if (AppSettings.IsPushAuditEnabled) +// { +// EnablePushAuditAnalysis(container); +// } + +// container.RegisterType(); + +// DependencyResolver.SetResolver(new UnityDependencyResolver(container)); + +// var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider); +// FilterProviders.Providers.Remove(oldProvider); + +// var provider = new UnityFilterAttributeFilterProvider(container); +// FilterProviders.Providers.Add(provider); +// } + +// private static void EnablePushAuditAnalysis(IUnityContainer container) +// { +// var isReceivePackRecoveryProcessEnabled = !string.IsNullOrEmpty(ConfigurationManager.AppSettings["RecoveryDataPath"]); + +// if (isReceivePackRecoveryProcessEnabled) +// { +// // git service execution durability registrations to enable receive-pack hook execution after failures +// container.RegisterType(); +// container.RegisterType(); +// container.RegisterType(); +// container.RegisterType(); +// container.RegisterInstance(new NamedArguments.FailedPackWaitTimeBeforeExecution(TimeSpan.FromSeconds(5 * 60))); + +// container.RegisterInstance(new NamedArguments.ReceivePackRecoveryDirectory( +// Path.IsPathRooted(ConfigurationManager.AppSettings["RecoveryDataPath"]) ? +// ConfigurationManager.AppSettings["RecoveryDataPath"] : +// HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["RecoveryDataPath"]))); +// } + +// // base git service executor +// container.RegisterType(); +// container.RegisterType(); + +// // receive pack hooks +// container.RegisterType(); +// container.RegisterType(); + +// // run receive-pack recovery if possible +// if (isReceivePackRecoveryProcessEnabled) +// { +// var recoveryProcess = container.Resolve( +// new ParameterOverride( +// "failedPackWaitTimeBeforeExecution", +// new NamedArguments.FailedPackWaitTimeBeforeExecution(TimeSpan.FromSeconds(0)))); // on start up set time to wait = 0 so that recovery for all waiting packs is attempted + +// try +// { +// recoveryProcess.RecoverAll(); +// } +// catch +// { +// // don't let a failed recovery attempt stop start-up process +// } +// finally +// { +// if (recoveryProcess != null) +// { +// container.Teardown(recoveryProcess); +// } +// } +// } +// } + + +// protected void Application_Error(object sender, EventArgs e) +// { +// Exception exception = Server.GetLastError(); +// if (exception != null) +// { +// Response.Clear(); +// HttpException httpException = exception as HttpException; + +// RouteData routeData = new RouteData(); +// routeData.Values.Add("controller", "Home"); +// if (httpException == null) +// { +// routeData.Values.Add("action", "Error"); +// if (exception != null) +// { +// Log.Error(exception, "Exception caught in Global.asax1"); +// } +// } +// else +// { +// switch (httpException.GetHttpCode()) +// { +// case 404: +// routeData.Values.Add("action", "PageNotFound"); +// break; +// case 500: +// routeData.Values.Add("action", "ServerError"); +// Log.Error(exception, "500 Exception caught in Global.asax"); +// break; +// default: +// routeData.Values.Add("action", "Error"); +// Log.Error(exception, "Exception caught in Global.asax (code {Code})", httpException.GetHttpCode()); +// break; +// } +// } +// Server.ClearError(); +// Response.TrySkipIisCustomErrors = true; +// IController errorController = new HomeController(); +// errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); +// } +// } + +// private static string GetRootPath(string path) +// { +// return Path.IsPathRooted(path) ? +// path : +// HttpContext.Current.Server.MapPath(path); +// } + +// } +//} diff --git a/Bonobo.Git.Server/Helpers/ADHelper.cs b/Bonobo.Git.Server/Helpers/ADHelper.cs index e3280d3dd..8db706511 100644 --- a/Bonobo.Git.Server/Helpers/ADHelper.cs +++ b/Bonobo.Git.Server/Helpers/ADHelper.cs @@ -1,26 +1,33 @@ -using Bonobo.Git.Server.Configuration; -using System; +using System; using System.Collections.Generic; -using System.Configuration; using System.DirectoryServices.AccountManagement; using System.DirectoryServices.ActiveDirectory; +using Bonobo.Git.Server.Configuration; +using Microsoft.Extensions.Options; using Serilog; namespace Bonobo.Git.Server.Helpers { - public static class ADHelper + public class ADHelper { + private readonly AppSettings _appSettings; + + public ADHelper(IOptions appSettings) + { + _appSettings = appSettings.Value; + } + /// /// There are various sources of domains which we need to check /// Try to lazy-enumerate this, so that expensive functions aren't called if they're not necessary /// /// The full user name (not stripped, should contain domain if available) /// An Enumerable of domains which can be tried - private static IEnumerable GetAllDomainPossibilities(string username = "") + private IEnumerable GetAllDomainPossibilities(string username = "") { //Skip checking username if none is supplied. - if(!string.IsNullOrEmpty(username)) - { + if (!string.IsNullOrEmpty(username)) + { // First we try for the domain in the username var parsedDomainName = username.GetDomain(); if (!string.IsNullOrEmpty(parsedDomainName)) @@ -38,7 +45,7 @@ private static IEnumerable GetAllDomainPossibilities(string username = " } // The we try the domain in web.config, if there is one - string defaultDomainName = ConfigurationManager.AppSettings["ActiveDirectoryDefaultDomain"]; + string defaultDomainName = _appSettings.ActiveDirectoryDefaultDomain; if (!string.IsNullOrEmpty(defaultDomainName)) { Log.Verbose("AD: Default domain set as {DomainName}", defaultDomainName); @@ -86,7 +93,7 @@ private static IEnumerable GetAllDomainPossibilities(string username = " /// Username with or without domain /// /// True on successfull validation - public static bool ValidateUser(string username, string password) + public bool ValidateUser(string username, string password) { Log.Information("AD: Validating user {UserName}", username); @@ -138,8 +145,7 @@ private static Domain GetDomain(string parsedDomainName) Domain domain = null; try - { - + { var dc = new DirectoryContext(DirectoryContextType.Domain, parsedDomainName); domain = Domain.GetDomain(dc); @@ -151,17 +157,18 @@ private static Domain GetDomain(string parsedDomainName) return domain; } + /// /// Used to get the UserPrincpal based on username - will try the domain that are part of the username if present /// /// UPN or SamAccountName /// Userprincipal if found else null - public static UserPrincipal GetUserPrincipal(string username) + public UserPrincipal GetUserPrincipal(string username) { var parsedDomainName = username.GetDomain(); string strippedUsername = username.StripDomain(); - Log.Verbose("GetUserPrincipal: username {UserName}, domain {DomainName}, stripped {StrippedUserName}", username, parsedDomainName, strippedUsername); + // Log.Verbose("GetUserPrincipal: username {UserName}, domain {DomainName}, stripped {StrippedUserName}", username, parsedDomainName, strippedUsername); foreach (var domain in GetAllDomainPossibilities(username)) { @@ -205,12 +212,13 @@ private static UserPrincipal GetUserPrincipal(Domain domain, string fullUsername } return null; } + /// /// Used to get the UserPrinpal from a GUID /// /// The GUID of user /// The Userprincipal if found, else null - public static UserPrincipal GetUserPrincipal(Guid id) + public UserPrincipal GetUserPrincipal(Guid id) { foreach (Domain domain in GetAllDomainPossibilities()) { @@ -234,6 +242,7 @@ public static UserPrincipal GetUserPrincipal(Guid id) return null; } + /// /// Used to get the members group defined in web.config /// Returns the principal context to be able to do further processing on the group, ie fetch users etc. @@ -241,10 +250,11 @@ public static UserPrincipal GetUserPrincipal(Guid id) /// /// The AD membergroup /// Principal context on which the membersgroup was found - public static PrincipalContext GetMembersGroup(out GroupPrincipal group) + public PrincipalContext GetMembersGroup(out GroupPrincipal group) { return GetPrincipalGroup(ActiveDirectorySettings.MemberGroupName, out group); } + /// /// Gets a principal group by name /// Returns the principal context to be able to do further processing on the group, ie fetch users etc. @@ -253,7 +263,7 @@ public static PrincipalContext GetMembersGroup(out GroupPrincipal group) /// The group to search for /// The group found /// Principal context on which the group was found. - public static PrincipalContext GetPrincipalGroup(string name, out GroupPrincipal group) + public PrincipalContext GetPrincipalGroup(string name, out GroupPrincipal group) { foreach (Domain domain in GetAllDomainPossibilities()) { diff --git a/Bonobo.Git.Server/Helpers/CssRewriteUrlTransformWrapper.cs b/Bonobo.Git.Server/Helpers/CssRewriteUrlTransformWrapper.cs index f487ab2e1..ac5905efd 100644 --- a/Bonobo.Git.Server/Helpers/CssRewriteUrlTransformWrapper.cs +++ b/Bonobo.Git.Server/Helpers/CssRewriteUrlTransformWrapper.cs @@ -1,15 +1,15 @@ -using System.Web; -using System.Web.Optimization; +//using System.Web; +//using System.Web.Optimization; -namespace Bonobo.Git.Server.Helpers -{ - public class CssRewriteUrlTransformWrapper : IItemTransform - { - public string Process(string includedVirtualPath, string input) - { - return new CssRewriteUrlTransform().Process( - "~" + VirtualPathUtility.ToAbsolute(includedVirtualPath), - input); - } - } -} \ No newline at end of file +//namespace Bonobo.Git.Server.Helpers +//{ +// public class CssRewriteUrlTransformWrapper : IItemTransform +// { +// public string Process(string includedVirtualPath, string input) +// { +// return new CssRewriteUrlTransform().Process( +// "~" + VirtualPathUtility.ToAbsolute(includedVirtualPath), +// input); +// } +// } +//} \ No newline at end of file diff --git a/Bonobo.Git.Server/Helpers/CustomHtmlHelpers.cs b/Bonobo.Git.Server/Helpers/CustomHtmlHelpers.cs index b663bc227..f39cab948 100644 --- a/Bonobo.Git.Server/Helpers/CustomHtmlHelpers.cs +++ b/Bonobo.Git.Server/Helpers/CustomHtmlHelpers.cs @@ -1,31 +1,25 @@ using System; -using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; -using System.Web; -using System.Web.Mvc; -using System.Web.Mvc.Html; using System.Reflection; -using System.Text; -using System.Web.Routing; -using System.Linq.Expressions; -using Bonobo.Git.Server.Models; -using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Html; +using Microsoft.AspNetCore.Mvc.Rendering; namespace Bonobo.Git.Server.Helpers { public static class CustomHtmlHelpers { - public static IHtmlString AssemblyVersion(this HtmlHelper helper) + public static HtmlString AssemblyVersion(this IHtmlHelper helper) { - return MvcHtmlString.Create(Assembly.GetExecutingAssembly().GetName().Version.ToString()); + return new HtmlString(Assembly.GetExecutingAssembly().GetName().Version.ToString()); } - public static IHtmlString MarkdownToHtml(this HtmlHelper helper, string markdownText) + public static HtmlString MarkdownToHtml(this IHtmlHelper helper, string markdownText) { - return MvcHtmlString.Create(CommonMark.CommonMarkConverter.Convert(markdownText)); + return new HtmlString(CommonMark.CommonMarkConverter.Convert(markdownText)); } - public static MvcHtmlString DisplayEnum(this HtmlHelper helper, Enum e) + public static HtmlString DisplayEnum(this IHtmlHelper helper, Enum e) { string result = "[[" + e.ToString() + "]]"; var memberInfo = e.GetType().GetMember(e.ToString()).FirstOrDefault(); @@ -41,7 +35,7 @@ public static MvcHtmlString DisplayEnum(this HtmlHelper helper, Enum e) } } - return MvcHtmlString.Create(result); + return new HtmlString(result); } } } diff --git a/Bonobo.Git.Server/Helpers/MembershipHelper.cs b/Bonobo.Git.Server/Helpers/MembershipHelper.cs index d26aff933..eace2ec19 100644 --- a/Bonobo.Git.Server/Helpers/MembershipHelper.cs +++ b/Bonobo.Git.Server/Helpers/MembershipHelper.cs @@ -1,6 +1,6 @@ -using Bonobo.Git.Server.App_GlobalResources; -using System; +using System; using System.Net.Mail; +using Bonobo.Git.Server.App_GlobalResources; using Bonobo.Git.Server.Models; using Serilog; @@ -18,7 +18,7 @@ public static bool SendForgotPasswordEmail(UserModel user, string passwordResetU //email.From = new MailAddress("admin@domain.com"); email.To.Add(new MailAddress(user.Email)); - email.Subject = Resources.Email_PasswordReset_Title; + email.Subject = Resources.Email_PasswordReset_Title; email.IsBodyHtml = true; email.Body = Resources.Email_PasswordReset_Body + diff --git a/Bonobo.Git.Server/Helpers/PathEncoder.cs b/Bonobo.Git.Server/Helpers/PathEncoder.cs index 91fa0f167..59ce1b9c7 100644 --- a/Bonobo.Git.Server/Helpers/PathEncoder.cs +++ b/Bonobo.Git.Server/Helpers/PathEncoder.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; -using System.IO; using System.Text; -using System.Web.Hosting; namespace Bonobo.Git.Server.Helpers { @@ -120,7 +118,8 @@ public static string Decode(string encodedPath) public static string GetRootPath(string path) { - return Path.IsPathRooted(path) ? path : HostingEnvironment.MapPath(path); + return path; + //return Path.IsPathRooted(path) ? path : HostingEnvironment.MapPath(path); } } } diff --git a/Bonobo.Git.Server/Helpers/RepositoryCommitModelHelpers.cs b/Bonobo.Git.Server/Helpers/RepositoryCommitModelHelpers.cs index 220d55249..a7395107e 100644 --- a/Bonobo.Git.Server/Helpers/RepositoryCommitModelHelpers.cs +++ b/Bonobo.Git.Server/Helpers/RepositoryCommitModelHelpers.cs @@ -1,7 +1,6 @@ -using Bonobo.Git.Server.Models; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Web.Mvc; +using Bonobo.Git.Server.Models; namespace Bonobo.Git.Server.Helpers { diff --git a/Bonobo.Git.Server/Helpers/WriteOnlyStreamWrapper.cs b/Bonobo.Git.Server/Helpers/WriteOnlyStreamWrapper.cs new file mode 100644 index 000000000..4ee7d6e5b --- /dev/null +++ b/Bonobo.Git.Server/Helpers/WriteOnlyStreamWrapper.cs @@ -0,0 +1,104 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Bonobo.Git.Server.Helpers +{ + public class WriteOnlyStreamWrapper : Stream + { + private readonly Stream _stream; + private long _position; + + public WriteOnlyStreamWrapper(Stream stream) + { + _stream = stream; + } + + public override bool CanRead => false; + public override bool CanSeek => false; + public override bool CanWrite => true; + + public override long Position + { + get { return _position; } + set + { + throw new NotSupportedException(); + } + } + public override void Write(byte[] buffer, int offset, int count) + { + _position += count; + _stream.Write(buffer, offset, count); + } + + public override void WriteByte(byte value) + { + _position += 1; + _stream.WriteByte(value); + } + + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + _position += count; + return _stream.WriteAsync(buffer, offset, count, cancellationToken); + } + + + + // Crap that we just have to forward. + + public override bool CanTimeout => _stream.CanTimeout; + public override int ReadTimeout + { + get { return _stream.ReadTimeout; } + set { _stream.ReadTimeout = value; } + } + public override int WriteTimeout + { + get { return _stream.WriteTimeout; } + set { _stream.WriteTimeout = value; } + } + + public override void Flush() => _stream.Flush(); + public override Task FlushAsync(CancellationToken cancellationToken) => _stream.FlushAsync(cancellationToken); + + protected override void Dispose(bool disposing) + { + if (disposing) + _stream.Dispose(); + } + + public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken) + { + return _stream.CopyToAsync(destination, bufferSize, cancellationToken); + } + + + // Unsupported operations. + + public override long Length + { + get + { + throw new NotSupportedException(); + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } + } +} diff --git a/Bonobo.Git.Server/Models/AccountModels.cs b/Bonobo.Git.Server/Models/AccountModels.cs index 86d505443..28e8a658d 100644 --- a/Bonobo.Git.Server/Models/AccountModels.cs +++ b/Bonobo.Git.Server/Models/AccountModels.cs @@ -1,15 +1,9 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.ComponentModel.DataAnnotations; -using System.Globalization; -using System.Linq; -using System.Web; -using System.Web.Mvc; -using System.Web.Security; - using Bonobo.Git.Server.App_GlobalResources; using Bonobo.Git.Server.Data; +using Microsoft.AspNetCore.Mvc; namespace Bonobo.Git.Server.Models { @@ -78,7 +72,7 @@ public class UserEditModel { public Guid Id { get; set; } - [Remote("UniqueNameUser", "Validation", AdditionalFields="Id", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_Duplicate_Name")] + [Remote("UniqueNameUser", "Validation", AdditionalFields = "Id", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_Duplicate_Name")] [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_Required")] [Display(ResourceType = typeof(Resources), Name = "Account_Edit_Username")] public string Username { get; set; } @@ -144,7 +138,7 @@ public class UserDetailModelList : List public class UserCreateModel { - [Remote("UniqueNameUser", "Validation", AdditionalFields="Id", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_Duplicate_Name")] + [Remote("UniqueNameUser", "Validation", AdditionalFields = "Id", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_Duplicate_Name")] [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_Required")] [StringLength(50, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_StringLength")] [Display(ResourceType = typeof(Resources), Name = "Account_Create_Username")] diff --git a/Bonobo.Git.Server/Models/ErrorViewModel.cs b/Bonobo.Git.Server/Models/ErrorViewModel.cs new file mode 100644 index 000000000..208511ca4 --- /dev/null +++ b/Bonobo.Git.Server/Models/ErrorViewModel.cs @@ -0,0 +1,9 @@ +namespace Bonobo.Git.Server.Models +{ + public class ErrorViewModel + { + public string RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + } +} \ No newline at end of file diff --git a/Bonobo.Git.Server/Models/HomeModels.cs b/Bonobo.Git.Server/Models/HomeModels.cs index 9fe456c4d..87d6f3d16 100644 --- a/Bonobo.Git.Server/Models/HomeModels.cs +++ b/Bonobo.Git.Server/Models/HomeModels.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations; using Bonobo.Git.Server.App_GlobalResources; -using System.Web.Mvc; +using Microsoft.AspNetCore.Mvc; namespace Bonobo.Git.Server.Models { diff --git a/Bonobo.Git.Server/Models/RepositoryCommitTitle.cs b/Bonobo.Git.Server/Models/RepositoryCommitTitle.cs index e98d5d237..8ae4bbc96 100644 --- a/Bonobo.Git.Server/Models/RepositoryCommitTitle.cs +++ b/Bonobo.Git.Server/Models/RepositoryCommitTitle.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace Bonobo.Git.Server.Models +namespace Bonobo.Git.Server.Models { public class RepositoryCommitTitleModel { diff --git a/Bonobo.Git.Server/Models/RepositoryModels.cs b/Bonobo.Git.Server/Models/RepositoryModels.cs index ae815bedc..dea7f54ac 100644 --- a/Bonobo.Git.Server/Models/RepositoryModels.cs +++ b/Bonobo.Git.Server/Models/RepositoryModels.cs @@ -1,20 +1,15 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.Drawing; -using System.Drawing.Imaging; -using System.Globalization; using System.IO; using System.Text; using System.Text.RegularExpressions; -using System.Web; - using Bonobo.Git.Server.App_GlobalResources; using Bonobo.Git.Server.Attributes; using Bonobo.Git.Server.Data; - using LibGit2Sharp; -using System.Web.Mvc; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; namespace Bonobo.Git.Server.Models { @@ -93,7 +88,7 @@ public RepositoryDetailModel() public Guid Id { get; set; } - [Remote("UniqueNameRepo", "Validation", AdditionalFields="Id", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_Duplicate_Name")] + [Remote("UniqueNameRepo", "Validation", AdditionalFields = "Id", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_Duplicate_Name")] [UniqueRepoName] [RegularExpression(RepositoryModel.NameValidityRegex, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_FileName_Regex")] [FileName(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_FileName")] @@ -101,12 +96,12 @@ public RepositoryDetailModel() [Display(ResourceType = typeof(Resources), Name = "Repository_Detail_Name")] public string Name { get; set; } - [AllowHtml] + //[AllowHtml] [Display(ResourceType = typeof(Resources), Name = "Repository_Detail_Group")] [StringLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_StringLength")] public string Group { get; set; } - [AllowHtml] + //[AllowHtml] [Display(ResourceType = typeof(Resources), Name = "Repository_Detail_Description")] [StringLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_StringLength")] public string Description { get; set; } @@ -133,7 +128,7 @@ public RepositoryDetailModel() [Display(ResourceType = typeof(Resources), Name = "Repository_Detail_Anonymous")] public bool AllowAnonymous { get; set; } - [EnumDataType(typeof(RepositoryPushMode), ErrorMessageResourceType=typeof(Resources), ErrorMessageResourceName="Repository_Edit_InvalidAnonymousPushMode")] + [EnumDataType(typeof(RepositoryPushMode), ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Repository_Edit_InvalidAnonymousPushMode")] [Display(ResourceType = typeof(Resources), Name = "Repository_Detail_AllowAnonymousPush")] public RepositoryPushMode AllowAnonymousPush { get; set; } @@ -329,7 +324,7 @@ public RepositoryLogoDetailModel(byte[] data) [FileUploadExtensions(Extensions = "PNG,JPG,JPEG,GIF")] [Display(ResourceType = typeof(Resources), Name = "Repository_Detail_Logo_PostedFile")] - public HttpPostedFileWrapper PostedFile { get; set; } + public IFormFile PostedFile { get; set; } [Display(ResourceType = typeof(Resources), Name = "Repository_Detail_RemoveLogo")] public bool RemoveLogo { get; set; } @@ -350,13 +345,14 @@ public byte[] BinaryData { using (MemoryStream ms = new MemoryStream()) { - Image originalImage = Image.FromStream(PostedFile.InputStream, true, true); + PostedFile.CopyTo(ms); + //Image originalImage = Image.FromStream(PostedFile.InputStream, true, true); - int logoWidth = originalImage.Width >= 72 ? 72 : 36; + //int logoWidth = originalImage.Width >= 72 ? 72 : 36; - Image resizedImage = originalImage.GetThumbnailImage(logoWidth, (logoWidth * originalImage.Height) / originalImage.Width, null, IntPtr.Zero); + //Image resizedImage = originalImage.GetThumbnailImage(logoWidth, (logoWidth * originalImage.Height) / originalImage.Width, null, IntPtr.Zero); - resizedImage.Save(ms, ImageFormat.Png); + //resizedImage.Save(ms, ImageFormat.Png); _data = ms.GetBuffer(); } diff --git a/Bonobo.Git.Server/Models/SettingsModels.cs b/Bonobo.Git.Server/Models/SettingsModels.cs index 2a45ee04b..68289f582 100644 --- a/Bonobo.Git.Server/Models/SettingsModels.cs +++ b/Bonobo.Git.Server/Models/SettingsModels.cs @@ -1,11 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations; using Bonobo.Git.Server.App_GlobalResources; using Bonobo.Git.Server.Attributes; -using System.Web.Mvc; +using Microsoft.AspNetCore.Mvc; namespace Bonobo.Git.Server.Models { diff --git a/Bonobo.Git.Server/Models/TeamModels.cs b/Bonobo.Git.Server/Models/TeamModels.cs index 08ebb4b7e..395132a27 100644 --- a/Bonobo.Git.Server/Models/TeamModels.cs +++ b/Bonobo.Git.Server/Models/TeamModels.cs @@ -1,18 +1,13 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Web; using System.ComponentModel.DataAnnotations; - using Bonobo.Git.Server.App_GlobalResources; using Bonobo.Git.Server.Data; +using Microsoft.AspNetCore.Mvc; namespace Bonobo.Git.Server.Models { - using IdName = Tuple; - using System.Web.Mvc; - - public class TeamModel : INameProperty + public class TeamModel : INameProperty { public Guid Id { get; set; } public string Name { get; set; } @@ -31,14 +26,14 @@ public class TeamEditModel { public Guid Id { get; set; } - [Remote("UniqueNameTeam", "Validation", AdditionalFields="Id", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_Duplicate_Name")] - [AllowHtml] + [Remote("UniqueNameTeam", "Validation", AdditionalFields = "Id", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_Duplicate_Name")] + //[AllowHtml] [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_Required")] [StringLength(50, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Validation_StringLength")] [Display(ResourceType = typeof(Resources), Name = "Team_Detail_Name")] public string Name { get; set; } - [AllowHtml] + //[AllowHtml] [Display(ResourceType = typeof(Resources), Name = "Team_Detail_Description")] public string Description { get; set; } diff --git a/Bonobo.Git.Server/Owin/NativeMethods.cs b/Bonobo.Git.Server/Owin/NativeMethods.cs index 0b78ba45d..33c1b2a1c 100644 --- a/Bonobo.Git.Server/Owin/NativeMethods.cs +++ b/Bonobo.Git.Server/Owin/NativeMethods.cs @@ -1,8 +1,5 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Runtime.InteropServices; -using System.Web; namespace Bonobo.Git.Server.Owin.Windows { diff --git a/Bonobo.Git.Server/Owin/WindowsAuthenticationDefaults.cs b/Bonobo.Git.Server/Owin/WindowsAuthenticationDefaults.cs index 355e72532..8b4a4ecd4 100644 --- a/Bonobo.Git.Server/Owin/WindowsAuthenticationDefaults.cs +++ b/Bonobo.Git.Server/Owin/WindowsAuthenticationDefaults.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace Bonobo.Git.Server.Owin.Windows +namespace Bonobo.Git.Server.Owin.Windows { public class WindowsAuthenticationDefaults { diff --git a/Bonobo.Git.Server/Owin/WindowsAuthenticationExtensions.cs b/Bonobo.Git.Server/Owin/WindowsAuthenticationExtensions.cs index dfab18d46..44850509b 100644 --- a/Bonobo.Git.Server/Owin/WindowsAuthenticationExtensions.cs +++ b/Bonobo.Git.Server/Owin/WindowsAuthenticationExtensions.cs @@ -1,18 +1,12 @@ -using Microsoft.Owin.Extensions; -using Owin; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; +//using Microsoft.AspNetCore.Builder; -namespace Bonobo.Git.Server.Owin.Windows -{ - public static class WindowsAuthenticationExtensions - { - public static IAppBuilder UseWindowsAuthentication(this IAppBuilder app, WindowsAuthenticationOptions options) - { - app.Use(typeof(WindowsAuthenticationMiddleware), app, options); - return app.UseStageMarker(PipelineStage.Authenticate); - } - } -} \ No newline at end of file +//namespace Bonobo.Git.Server.Owin.Windows +//{ +// public static class WindowsAuthenticationExtensions +// { +// public static IApplicationBuilder UseWindowsAuthentication(this IApplicationBuilder app, WindowsAuthenticationOptions options) +// { +// return app.UseMiddleware(options); +// } +// } +//} \ No newline at end of file diff --git a/Bonobo.Git.Server/Owin/WindowsAuthenticationHandler.cs b/Bonobo.Git.Server/Owin/WindowsAuthenticationHandler.cs index 0a46f595d..33a68f1e4 100644 --- a/Bonobo.Git.Server/Owin/WindowsAuthenticationHandler.cs +++ b/Bonobo.Git.Server/Owin/WindowsAuthenticationHandler.cs @@ -1,183 +1,183 @@ -using System; -using System.Linq; -using System.Security.Claims; -using System.Threading.Tasks; -using System.Collections.Generic; - -using Microsoft.Owin.Infrastructure; -using Microsoft.Owin.Security; -using Microsoft.Owin.Security.Infrastructure; -using System.Security.Cryptography; -using System.Text; -using System.DirectoryServices.AccountManagement; - -using Bonobo.Git.Server.Security; -using Bonobo.Git.Server.Helpers; -using Serilog; - -namespace Bonobo.Git.Server.Owin.Windows -{ - internal class WindowsAuthenticationHandler : AuthenticationHandler - { - protected override Task AuthenticateCoreAsync() - { - AuthenticationProperties properties = null; - WindowsAuthenticationHandshake handshake = null; - - string handshakeId = Request.Query["id"]; - - if (handshakeId != null && Options.Handshakes.TryGet(handshakeId, out handshake)) - { - WindowsAuthenticationToken token = WindowsAuthenticationToken.Create(Request.Headers["Authorization"]); - - switch (token.AuthorizationStage) - { - case AuthenticationStage.Request: - if (handshake.TryAcquireServerChallenge(token)) - { - Log.Verbose("WinAuth: Obtained challenge token OK"); - - Response.Headers.Add("WWW-Authenticate", new[] { string.Concat("NTLM ", token.Challenge) }); - Response.StatusCode = 401; - return Task.FromResult(new AuthenticationTicket(null, properties)); - } - break; - case AuthenticationStage.Response: - if (handshake.IsClientResponseValid(token)) - { - properties = handshake.AuthenticationProperties; - var uid = handshake.AuthenticatedUsername.ToLowerInvariant(); - var claimdelegate = Options.GetClaimsForUser(uid); - - Log.Verbose("WinAuth: Valid response for uid {UserId}", uid); - - if (claimdelegate == null) - { - string domainName = handshake.AuthenticatedUsername.GetDomain(); - - Log.Verbose("WinAuth: New user - looking-up user {UserName} in domain {DomainName}", - handshake.AuthenticatedUsername, domainName); - - var dc = new PrincipalContext(ContextType.Domain, domainName); - var adUser = UserPrincipal.FindByIdentity(dc, handshake.AuthenticatedUsername); - - if (adUser == null) - { - Log.Error("DC for domain {DomainName} has returned null for username {UserName} - failing auth", domainName, handshake.AuthenticatedUsername); - Response.StatusCode = 401; - return Task.FromResult(new AuthenticationTicket(null, null)); - } - - Log.Verbose("WinAuth: DC returned adUser {ADUser}", adUser.GivenName); - - ClaimsIdentity identity = new ClaimsIdentity(Options.SignInAsAuthenticationType); - List result = new List(); - if (!String.IsNullOrEmpty(adUser.GivenName)) - { - result.Add(new Claim(ClaimTypes.GivenName, adUser.GivenName)); - } - if (!String.IsNullOrEmpty(adUser.Surname)) - { - result.Add(new Claim(ClaimTypes.Surname, adUser.Surname)); - } - result.Add(new Claim(ClaimTypes.NameIdentifier, adUser.Guid.ToString())); - result.Add(new Claim(ClaimTypes.Name, handshake.AuthenticatedUsername)); - if (!String.IsNullOrEmpty(adUser.EmailAddress)) - { - result.Add(new Claim(ClaimTypes.Email, adUser.EmailAddress)); - } - identity.AddClaims(result); - identity.AddClaim(new Claim(ClaimTypes.AuthenticationMethod, WindowsAuthenticationDefaults.AuthenticationType)); - Options.Handshakes.TryRemove(handshakeId); - - Log.Verbose("WinAuth: New user - about to redirect to CreateADUser"); - - // user does not exist! Redirect to create page. - properties.RedirectUri = "/Account/CreateADUser"; - return Task.FromResult(new AuthenticationTicket(identity, properties)); - } - else - { - Claim[] claims = claimdelegate.ToArray(); - Log.Verbose("WinAuth: Found existing uid {UserId}, has {Claims} claims", uid, claims.Length); - if (claims.Length > 0) - { - ClaimsIdentity identity = new ClaimsIdentity(Options.SignInAsAuthenticationType); - identity.AddClaims(claims); - identity.AddClaim(new Claim(ClaimTypes.AuthenticationMethod, WindowsAuthenticationDefaults.AuthenticationType)); - Options.Handshakes.TryRemove(handshakeId); - - Log.Verbose("WinAuth: Returning id auth ticket, claims: {Claims}", claims); - - return Task.FromResult(new AuthenticationTicket(identity, properties)); - } - } - } - break; - } - Response.Headers.Add("WWW-Authenticate", new[] { "NTLM" }); - Response.StatusCode = 401; - } - return Task.FromResult(new AuthenticationTicket(null, properties)); - } - - protected override Task ApplyResponseChallengeAsync() - { - if (Response.StatusCode == 401 && Response.Headers.ContainsKey("WWW-Authenticate") == false) - { - var challenge = Helper.LookupChallenge(Options.AuthenticationType, Options.AuthenticationMode); - - if (challenge != null) - { - AuthenticationProperties challengeProperties = challenge.Properties; - - if (string.IsNullOrEmpty(challengeProperties.RedirectUri)) - { - throw new ArgumentNullException("RedirectUri"); - } - - string protectedProperties = Options.StateDataFormat.Protect(challengeProperties); - string handshakeId = Guid.NewGuid().ToString(); - - WindowsAuthenticationHandshake handshake = new WindowsAuthenticationHandshake() - { - AuthenticationProperties = challengeProperties - }; - - Options.Handshakes.Add(handshakeId, handshake); - Response.Redirect(WebUtilities.AddQueryString(Request.PathBase + Options.CallbackPath.Value, "id", handshakeId)); - } - } - - return Task.Delay(0); - } - - public override async Task InvokeAsync() - { - bool result = false; - - if (Options.CallbackPath.HasValue && Options.CallbackPath == Request.Path) - { - AuthenticationTicket ticket = await AuthenticateAsync(); - if (ticket != null && ticket.Identity != null) - { - - Context.Authentication.SignIn(ticket.Properties, ticket.Identity); - if(!ticket.Properties.RedirectUri.StartsWith(Request.PathBase.Value)) - { - ticket.Properties.RedirectUri = Request.PathBase.Value + ticket.Properties.RedirectUri; - } - Response.Redirect(ticket.Properties.RedirectUri); - result = true; - } - - if (Response.Headers.ContainsKey("WWW-Authenticate")) - { - result = true; - } - } - - return result; - } - } -} +//using System; +//using System.Linq; +//using System.Security.Claims; +//using System.Threading.Tasks; +//using System.Collections.Generic; + +//using Microsoft.Owin.Infrastructure; +//using Microsoft.Owin.Security; +//using Microsoft.Owin.Security.Infrastructure; +//using System.Security.Cryptography; +//using System.Text; +//using System.DirectoryServices.AccountManagement; + +//using Bonobo.Git.Server.Security; +//using Bonobo.Git.Server.Helpers; +//using Serilog; + +//namespace Bonobo.Git.Server.Owin.Windows +//{ +// internal class WindowsAuthenticationHandler : AuthenticationHandler +// { +// protected override Task AuthenticateCoreAsync() +// { +// AuthenticationProperties properties = null; +// WindowsAuthenticationHandshake handshake = null; + +// string handshakeId = Request.Query["id"]; + +// if (handshakeId != null && Options.Handshakes.TryGet(handshakeId, out handshake)) +// { +// WindowsAuthenticationToken token = WindowsAuthenticationToken.Create(Request.Headers["Authorization"]); + +// switch (token.AuthorizationStage) +// { +// case AuthenticationStage.Request: +// if (handshake.TryAcquireServerChallenge(token)) +// { +// Log.Verbose("WinAuth: Obtained challenge token OK"); + +// Response.Headers.Add("WWW-Authenticate", new[] { string.Concat("NTLM ", token.Challenge) }); +// Response.StatusCode = 401; +// return Task.FromResult(new AuthenticationTicket(null, properties)); +// } +// break; +// case AuthenticationStage.Response: +// if (handshake.IsClientResponseValid(token)) +// { +// properties = handshake.AuthenticationProperties; +// var uid = handshake.AuthenticatedUsername.ToLowerInvariant(); +// var claimdelegate = Options.GetClaimsForUser(uid); + +// Log.Verbose("WinAuth: Valid response for uid {UserId}", uid); + +// if (claimdelegate == null) +// { +// string domainName = handshake.AuthenticatedUsername.GetDomain(); + +// Log.Verbose("WinAuth: New user - looking-up user {UserName} in domain {DomainName}", +// handshake.AuthenticatedUsername, domainName); + +// var dc = new PrincipalContext(ContextType.Domain, domainName); +// var adUser = UserPrincipal.FindByIdentity(dc, handshake.AuthenticatedUsername); + +// if (adUser == null) +// { +// Log.Error("DC for domain {DomainName} has returned null for username {UserName} - failing auth", domainName, handshake.AuthenticatedUsername); +// Response.StatusCode = 401; +// return Task.FromResult(new AuthenticationTicket(null, null)); +// } + +// Log.Verbose("WinAuth: DC returned adUser {ADUser}", adUser.GivenName); + +// ClaimsIdentity identity = new ClaimsIdentity(Options.SignInAsAuthenticationType); +// List result = new List(); +// if (!String.IsNullOrEmpty(adUser.GivenName)) +// { +// result.Add(new Claim(ClaimTypes.GivenName, adUser.GivenName)); +// } +// if (!String.IsNullOrEmpty(adUser.Surname)) +// { +// result.Add(new Claim(ClaimTypes.Surname, adUser.Surname)); +// } +// result.Add(new Claim(ClaimTypes.NameIdentifier, adUser.Guid.ToString())); +// result.Add(new Claim(ClaimTypes.Name, handshake.AuthenticatedUsername)); +// if (!String.IsNullOrEmpty(adUser.EmailAddress)) +// { +// result.Add(new Claim(ClaimTypes.Email, adUser.EmailAddress)); +// } +// identity.AddClaims(result); +// identity.AddClaim(new Claim(ClaimTypes.AuthenticationMethod, WindowsAuthenticationDefaults.AuthenticationType)); +// Options.Handshakes.TryRemove(handshakeId); + +// Log.Verbose("WinAuth: New user - about to redirect to CreateADUser"); + +// // user does not exist! Redirect to create page. +// properties.RedirectUri = "/Account/CreateADUser"; +// return Task.FromResult(new AuthenticationTicket(identity, properties)); +// } +// else +// { +// Claim[] claims = claimdelegate.ToArray(); +// Log.Verbose("WinAuth: Found existing uid {UserId}, has {Claims} claims", uid, claims.Length); +// if (claims.Length > 0) +// { +// ClaimsIdentity identity = new ClaimsIdentity(Options.SignInAsAuthenticationType); +// identity.AddClaims(claims); +// identity.AddClaim(new Claim(ClaimTypes.AuthenticationMethod, WindowsAuthenticationDefaults.AuthenticationType)); +// Options.Handshakes.TryRemove(handshakeId); + +// Log.Verbose("WinAuth: Returning id auth ticket, claims: {Claims}", claims); + +// return Task.FromResult(new AuthenticationTicket(identity, properties)); +// } +// } +// } +// break; +// } +// Response.Headers.Add("WWW-Authenticate", new[] { "NTLM" }); +// Response.StatusCode = 401; +// } +// return Task.FromResult(new AuthenticationTicket(null, properties)); +// } + +// protected override Task ApplyResponseChallengeAsync() +// { +// if (Response.StatusCode == 401 && Response.Headers.ContainsKey("WWW-Authenticate") == false) +// { +// var challenge = Helper.LookupChallenge(Options.AuthenticationType, Options.AuthenticationMode); + +// if (challenge != null) +// { +// AuthenticationProperties challengeProperties = challenge.Properties; + +// if (string.IsNullOrEmpty(challengeProperties.RedirectUri)) +// { +// throw new ArgumentNullException("RedirectUri"); +// } + +// string protectedProperties = Options.StateDataFormat.Protect(challengeProperties); +// string handshakeId = Guid.NewGuid().ToString(); + +// WindowsAuthenticationHandshake handshake = new WindowsAuthenticationHandshake() +// { +// AuthenticationProperties = challengeProperties +// }; + +// Options.Handshakes.Add(handshakeId, handshake); +// Response.Redirect(WebUtilities.AddQueryString(Request.PathBase + Options.CallbackPath.Value, "id", handshakeId)); +// } +// } + +// return Task.Delay(0); +// } + +// public override async Task InvokeAsync() +// { +// bool result = false; + +// if (Options.CallbackPath.HasValue && Options.CallbackPath == Request.Path) +// { +// AuthenticationTicket ticket = await AuthenticateAsync(); +// if (ticket != null && ticket.Identity != null) +// { + +// Context.Authentication.SignIn(ticket.Properties, ticket.Identity); +// if(!ticket.Properties.RedirectUri.StartsWith(Request.PathBase.Value)) +// { +// ticket.Properties.RedirectUri = Request.PathBase.Value + ticket.Properties.RedirectUri; +// } +// Response.Redirect(ticket.Properties.RedirectUri); +// result = true; +// } + +// if (Response.Headers.ContainsKey("WWW-Authenticate")) +// { +// result = true; +// } +// } + +// return result; +// } +// } +//} diff --git a/Bonobo.Git.Server/Owin/WindowsAuthenticationHandshake.cs b/Bonobo.Git.Server/Owin/WindowsAuthenticationHandshake.cs index 4b0b5fe4e..9351a423c 100644 --- a/Bonobo.Git.Server/Owin/WindowsAuthenticationHandshake.cs +++ b/Bonobo.Git.Server/Owin/WindowsAuthenticationHandshake.cs @@ -1,9 +1,6 @@ -using Microsoft.Owin.Security; -using System; -using System.Collections.Generic; -using System.Linq; +using System; using System.Security.Principal; -using System.Web; +using Microsoft.AspNetCore.Authentication; namespace Bonobo.Git.Server.Owin.Windows { @@ -36,11 +33,10 @@ public bool TryAcquireServerChallenge(WindowsAuthenticationToken message) try { SecurityInteger lifetime = new SecurityInteger(0); - uint contextAttributes; if (NativeMethods.AcquireCredentialsHandle(null, "NTLM", SecurityCredentialsInbound, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero, ref credentials, ref lifetime) == 0) { - if (NativeMethods.AcceptSecurityContext(ref credentials, IntPtr.Zero, ref clientToken, StandardContextAttributes, SecurityNativeDataRepresentation, out context, out serverToken, out contextAttributes, out lifetime) == IntermediateResult) + if (NativeMethods.AcceptSecurityContext(ref credentials, IntPtr.Zero, ref clientToken, StandardContextAttributes, SecurityNativeDataRepresentation, out context, out serverToken, out uint contextAttributes, out lifetime) == IntermediateResult) { result = true; } @@ -66,15 +62,12 @@ public bool IsClientResponseValid(WindowsAuthenticationToken token) try { - uint contextAttributes; - var lifetime = new SecurityInteger(0); - - if (NativeMethods.AcceptSecurityContext(ref credentials, ref context, ref clientToken, StandardContextAttributes, SecurityNativeDataRepresentation, out context, out serverToken, out contextAttributes, out lifetime) == 0) + if (NativeMethods.AcceptSecurityContext(ref credentials, ref context, ref clientToken, StandardContextAttributes, SecurityNativeDataRepresentation, out context, out serverToken, out uint contextAttributes, out SecurityInteger lifetime) == 0) { if (NativeMethods.QuerySecurityContextToken(ref context, ref securityContextHandle) == 0) { using (WindowsIdentity identity = new WindowsIdentity(securityContextHandle)) - { + { if (identity != null) { AuthenticatedUsername = identity.Name; diff --git a/Bonobo.Git.Server/Owin/WindowsAuthenticationHandshakeCache.cs b/Bonobo.Git.Server/Owin/WindowsAuthenticationHandshakeCache.cs index f4838e795..3ac3d978c 100644 --- a/Bonobo.Git.Server/Owin/WindowsAuthenticationHandshakeCache.cs +++ b/Bonobo.Git.Server/Owin/WindowsAuthenticationHandshakeCache.cs @@ -1,9 +1,6 @@ using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.Caching; -using System.Web; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Options; namespace Bonobo.Git.Server.Owin.Windows { @@ -17,12 +14,11 @@ public bool TryGet(string key, out WindowsAuthenticationHandshake handshake) bool result = false; handshake = null; - if (handshakeCache.Contains(key)) + if (handshakeCache.TryGetValue(key, out object cachedHandshake)) { - object cachedHandshake = handshakeCache[key]; if (cachedHandshake != null) { - handshake = cachedHandshake as WindowsAuthenticationHandshake; + handshake = cachedHandshake as WindowsAuthenticationHandshake; result = true; } } @@ -37,30 +33,33 @@ public void Add(string key, WindowsAuthenticationHandshake handshake) public bool TryRemove(string key) { - return handshakeCache.Remove(key) != null; + handshakeCache.Remove(key); + return true; } - private static CacheItemPolicy GetCacheItemPolicy() + private static MemoryCacheEntryOptions GetCacheItemPolicy() { - var policy = new CacheItemPolicy() + var policy = new MemoryCacheEntryOptions() { - Priority = CacheItemPriority.Default, + Priority = CacheItemPriority.Normal, AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(expirationTimeInMinutes), - RemovedCallback = (handshake) => - { - IDisposable expiredHandshake = handshake.CacheItem as IDisposable; - if (expiredHandshake != null) - { - expiredHandshake.Dispose(); - } - } }; + + policy.RegisterPostEvictionCallback((key, value, reason, state) => + { + IDisposable expiredHandshake = value as IDisposable; + if (expiredHandshake != null) + { + expiredHandshake.Dispose(); + } + }); + return policy; } public WindowsAuthenticationHandshakeCache(string name) { - handshakeCache = new MemoryCache(name); + handshakeCache = new MemoryCache(Options.Create(new MemoryCacheOptions())); } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Owin/WindowsAuthenticationMiddleware.cs b/Bonobo.Git.Server/Owin/WindowsAuthenticationMiddleware.cs index f1b25b564..79118c5e3 100644 --- a/Bonobo.Git.Server/Owin/WindowsAuthenticationMiddleware.cs +++ b/Bonobo.Git.Server/Owin/WindowsAuthenticationMiddleware.cs @@ -1,35 +1,35 @@ -using System; +//using System; -using Microsoft.Owin; -using Microsoft.Owin.Security; -using Microsoft.Owin.Security.DataHandler; -using Microsoft.Owin.Security.DataProtection; -using Microsoft.Owin.Security.Infrastructure; +//using Microsoft.Owin; +//using Microsoft.Owin.Security; +//using Microsoft.Owin.Security.DataHandler; +//using Microsoft.Owin.Security.DataProtection; +//using Microsoft.Owin.Security.Infrastructure; -using Owin; +//using Owin; -namespace Bonobo.Git.Server.Owin.Windows -{ - public class WindowsAuthenticationMiddleware : AuthenticationMiddleware - { - public WindowsAuthenticationMiddleware(OwinMiddleware next, IAppBuilder app, WindowsAuthenticationOptions options) : base(next, options) - { - if (String.IsNullOrEmpty(Options.SignInAsAuthenticationType)) - { - options.SignInAsAuthenticationType = app.GetDefaultSignInAsAuthenticationType(); - } +//namespace Bonobo.Git.Server.Owin.Windows +//{ +// public class WindowsAuthenticationMiddleware : AuthenticationMiddleware +// { +// public WindowsAuthenticationMiddleware(OwinMiddleware next, IAppBuilder app, WindowsAuthenticationOptions options) : base(next, options) +// { +// if (String.IsNullOrEmpty(Options.SignInAsAuthenticationType)) +// { +// options.SignInAsAuthenticationType = app.GetDefaultSignInAsAuthenticationType(); +// } - if (options.StateDataFormat == null) - { - IDataProtector dataProtector = app.CreateDataProtector(typeof(WindowsAuthenticationMiddleware).FullName, options.AuthenticationType); - options.StateDataFormat = new PropertiesDataFormat(dataProtector); - } - } +// if (options.StateDataFormat == null) +// { +// IDataProtector dataProtector = app.CreateDataProtector(typeof(WindowsAuthenticationMiddleware).FullName, options.AuthenticationType); +// options.StateDataFormat = new PropertiesDataFormat(dataProtector); +// } +// } - protected override AuthenticationHandler CreateHandler() - { - return new WindowsAuthenticationHandler(); - } +// protected override AuthenticationHandler CreateHandler() +// { +// return new WindowsAuthenticationHandler(); +// } - } -} +// } +//} diff --git a/Bonobo.Git.Server/Owin/WindowsAuthenticationOptions.cs b/Bonobo.Git.Server/Owin/WindowsAuthenticationOptions.cs index a91bbd8b0..6299dd25c 100644 --- a/Bonobo.Git.Server/Owin/WindowsAuthenticationOptions.cs +++ b/Bonobo.Git.Server/Owin/WindowsAuthenticationOptions.cs @@ -1,10 +1,7 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Security.Claims; - -using Microsoft.Owin; -using Microsoft.Owin.Security; -using System.Collections.Concurrent; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; namespace Bonobo.Git.Server.Owin.Windows { @@ -20,11 +17,9 @@ public class WindowsAuthenticationOptions : AuthenticationOptions public string SignInAsAuthenticationType { get; set; } public ISecureDataFormat StateDataFormat { get; set; } - public WindowsAuthenticationOptions() : base(WindowsAuthenticationDefaults.AuthenticationType) + public WindowsAuthenticationOptions() { - Description.Caption = WindowsAuthenticationDefaults.AuthenticationType; CallbackPath = DefaultRedirectPath; - AuthenticationMode = AuthenticationMode.Passive; Handshakes = new WindowsAuthenticationHandshakeCache("WindowsHandshakeCache"); } } diff --git a/Bonobo.Git.Server/Owin/WindowsAuthenticationToken.cs b/Bonobo.Git.Server/Owin/WindowsAuthenticationToken.cs index 8aa34ebda..4046dcaad 100644 --- a/Bonobo.Git.Server/Owin/WindowsAuthenticationToken.cs +++ b/Bonobo.Git.Server/Owin/WindowsAuthenticationToken.cs @@ -1,8 +1,4 @@ -using Microsoft.Owin.Security; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; +using System; namespace Bonobo.Git.Server.Owin.Windows { diff --git a/Bonobo.Git.Server/Program.cs b/Bonobo.Git.Server/Program.cs new file mode 100644 index 000000000..aa1062708 --- /dev/null +++ b/Bonobo.Git.Server/Program.cs @@ -0,0 +1,18 @@ +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; + +namespace Bonobo.Git.Server.Core +{ + public class Program + { + public static void Main(string[] args) + { + BuildWebHost(args).Run(); + } + + public static IWebHost BuildWebHost(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseStartup() + .Build(); + } +} diff --git a/Bonobo.Git.Server/Properties/AssemblyInfo.cs b/Bonobo.Git.Server/Properties/AssemblyInfo.cs deleted file mode 100644 index b394d83d3..000000000 --- a/Bonobo.Git.Server/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Web; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Bonobo Git Server")] -[assembly: AssemblyDescription("Git server for IIS.")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Jakub Chodounský")] -[assembly: AssemblyProduct("Bonobo Git Server")] -[assembly: AssemblyCopyright("Copyright © Jakub Chodounský 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8e4b4ef1-11ba-490f-94bb-1a000f3f5a03")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("6.2.0.0")] -[assembly: AssemblyFileVersion("6.2.0.0")] diff --git a/Bonobo.Git.Server/Properties/PublishProfiles/Release.pubxml b/Bonobo.Git.Server/Properties/PublishProfiles/Release.pubxml deleted file mode 100644 index fa33f897e..000000000 --- a/Bonobo.Git.Server/Properties/PublishProfiles/Release.pubxml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - FileSystem - Release - Any CPU - - False - True - True - ..\..\Bonobo_install\Bonobo.Git.Server - True - True - False - DonotMerge - - \ No newline at end of file diff --git a/Bonobo.Git.Server/Properties/launchSettings.json b/Bonobo.Git.Server/Properties/launchSettings.json new file mode 100644 index 000000000..f8427015f --- /dev/null +++ b/Bonobo.Git.Server/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:30729/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Bonobo.Git.Server.Core": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:30730/" + } + } +} diff --git a/Bonobo.Git.Server/RepositoryBrowser.cs b/Bonobo.Git.Server/RepositoryBrowser.cs index 813ec8d5c..cce211fbe 100644 --- a/Bonobo.Git.Server/RepositoryBrowser.cs +++ b/Bonobo.Git.Server/RepositoryBrowser.cs @@ -1,14 +1,12 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; -using Bonobo.Git.Server.Models; using Bonobo.Git.Server.Extensions; -using LibGit2Sharp; -using System.IO; using Bonobo.Git.Server.Helpers; -using System.Text.RegularExpressions; -using Bonobo.Git.Server.Configuration; +using Bonobo.Git.Server.Models; +using LibGit2Sharp; using Serilog; namespace Bonobo.Git.Server @@ -61,7 +59,7 @@ public IEnumerable GetCommits(string name, int page, int } - internal IEnumerable GetTags(string name, int page, int p, out string referenceName, out int totalCount) + internal IEnumerable GetTags(string name, int page, int pageSize, out string referenceName, out int totalCount) { var commit = GetCommitByName(name, out referenceName); if (commit == null) @@ -75,17 +73,24 @@ internal IEnumerable GetTags(string name, int page, int p { var c = _repository.Lookup(tag.Target.Id) as Commit; commits.Add(ToModel(c)); + } + totalCount = commits.Count; + + IEnumerable result = commits.OrderByDescending( + x => x, + (x, y) => x.Date.CompareTo(y.Date)); + if (page >= 1 && pageSize >= 1) + { + result = result.Skip((page - 1) * pageSize).Take(pageSize); } - totalCount = commits.Count(); - return commits.OrderByDescending(x => x, (x, y) => x.Date.CompareTo(y.Date)); + return result; } public RepositoryCommitModel GetCommitDetail(string name) { - string referenceName; - var commit = GetCommitByName(name, out referenceName); + var commit = GetCommitByName(name, out string referenceName); return commit == null ? null : ToModel(commit, true); } @@ -161,7 +166,7 @@ public RepositoryTreeDetailModel BrowseBlob(string name, string path, out string } Encoding encoding; - if(FileDisplayHandler.TryGetEncoding(model.Data, out encoding)) + if (FileDisplayHandler.TryGetEncoding(model.Data, out encoding)) { model.Text = FileDisplayHandler.GetText(model.Data, encoding); model.Encoding = encoding; @@ -205,7 +210,7 @@ public RepositoryBlameModel GetBlame(string name, string path, out string refere return new RepositoryBlameModel { Name = commit[path].Name, - TreeName = referenceName, + TreeName = referenceName, Path = path, Hunks = hunks, FileSize = modelBlob.Data.LongLength, diff --git a/Bonobo.Git.Server/Security/ADMembershipService.cs b/Bonobo.Git.Server/Security/ADMembershipService.cs index 6871a8e9f..1af5d6cdd 100644 --- a/Bonobo.Git.Server/Security/ADMembershipService.cs +++ b/Bonobo.Git.Server/Security/ADMembershipService.cs @@ -1,26 +1,25 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Data; -using System.DirectoryServices; using System.DirectoryServices.AccountManagement; -using System.Security.Cryptography; -using System.IO; -using System.Text; -using System.Data.Entity.Core; -using System.Diagnostics; +using System.Linq; using Bonobo.Git.Server.Data; -using Bonobo.Git.Server.Models; -using System.Web.Security; -using System.Security.Principal; -using Bonobo.Git.Server.Configuration; using Bonobo.Git.Server.Helpers; +using Bonobo.Git.Server.Models; using Serilog; namespace Bonobo.Git.Server.Security { public class ADMembershipService : IMembershipService { + private readonly ADHelper _adHelper; + private readonly ADBackend _adBackend; + + public ADMembershipService(ADHelper adHelper, ADBackend adBackend) + { + _adHelper = adHelper; + _adBackend = adBackend; + } + public bool IsReadOnly() { return true; @@ -35,32 +34,30 @@ public ValidationResult ValidateUser(string username, string password) try { - if (ADHelper.ValidateUser(username, password)) + if (_adHelper.ValidateUser(username, password)) { - using (var user = ADHelper.GetUserPrincipal(username)) + using (var user = _adHelper.GetUserPrincipal(username)) + using (var pc = _adHelper.GetMembersGroup(out GroupPrincipal group)) { - GroupPrincipal group; - using (var pc = ADHelper.GetMembersGroup(out group)) - { - if (group == null) - result = ValidationResult.Failure; - - if (user != null) - { - if (!group.GetMembers(true).Contains(user)) - { - result = ValidationResult.NotAuthorized; - } - else - { - result = ValidationResult.Success; - } - } - } + if (group == null) + result = ValidationResult.Failure; + + if (user != null) + { + if (!group.GetMembers(true).Contains(user)) + { + result = ValidationResult.NotAuthorized; + } + else + { + result = ValidationResult.Success; + } + } } + } } - catch(Exception ex) + catch (Exception ex) { Log.Error(ex, "AD.ValidateUser Exception: "); result = ValidationResult.Failure; @@ -81,22 +78,22 @@ public bool CreateUser(string username, string password, string givenName, strin public IList GetAllUsers() { - var users = ADBackend.Instance.Users.ToList(); + var users = _adBackend.Users.ToList(); return users; } public UserModel GetUserModel(string username) { - using (var upc = ADHelper.GetUserPrincipal(username)) + using (var upc = _adHelper.GetUserPrincipal(username)) { - return ADBackend.Instance.Users.FirstOrDefault(n => n.Id == upc.Guid.Value); + return _adBackend.Users.FirstOrDefault(n => n.Id == upc.Guid.Value); } throw new ArgumentException("User was not found with username: " + username); } public UserModel GetUserModel(Guid id) { - return ADBackend.Instance.Users[id]; + return _adBackend.Users[id]; } private static bool UsernameContainsDomain(string username) @@ -106,17 +103,17 @@ private static bool UsernameContainsDomain(string username) public void UpdateUser(Guid id, string username, string givenName, string surname, string email, string password) { - throw new NotImplementedException(); + throw new NotSupportedException(); } public void DeleteUser(Guid id) { - throw new NotImplementedException(); + throw new NotSupportedException(); } public string GenerateResetToken(string username) { - throw new NotImplementedException(); + throw new NotSupportedException(); } } } diff --git a/Bonobo.Git.Server/Security/ADRoleProvider.cs b/Bonobo.Git.Server/Security/ADRoleProvider.cs index 68540de61..9a4bcfe73 100644 --- a/Bonobo.Git.Server/Security/ADRoleProvider.cs +++ b/Bonobo.Git.Server/Security/ADRoleProvider.cs @@ -1,12 +1,18 @@ -using Bonobo.Git.Server.Data; -using System; +using System; using System.Linq; +using Bonobo.Git.Server.Data; using Bonobo.Git.Server.Models; namespace Bonobo.Git.Server.Security { public class ADRoleProvider : IRoleProvider { + private readonly ADBackend _adBackend; + + public ADRoleProvider(ADBackend adBackend) + { + this._adBackend = adBackend; + } public void AddUserToRoles(Guid userId, string[] roleNames) { // Use ADUC to assign groups to users instead @@ -30,18 +36,18 @@ public bool DeleteRole(string roleName, bool throwOnPopulatedRole) public string[] GetAllRoles() { - return ADBackend.Instance.Roles.Select(x => x.Name).ToArray(); + return _adBackend.Roles.Select(x => x.Name).ToArray(); } public string[] GetRolesForUser(Guid userId) { - var user = ADBackend.Instance.Users.FirstOrDefault(x => x.Id == userId); + var user = _adBackend.Users.FirstOrDefault(x => x.Id == userId); if (user == null) { // This is how the EF provider works return new string[0]; } - return ADBackend.Instance.Roles.Where(x => x.Members.Contains(user.Id)).Select(x => x.Name).ToArray(); + return _adBackend.Roles.Where(x => x.Members.Contains(user.Id)).Select(x => x.Name).ToArray(); } public Guid[] GetUsersInRole(string roleName) @@ -51,7 +57,7 @@ public Guid[] GetUsersInRole(string roleName) public bool IsUserInRole(Guid userId, string roleName) { - var user = ADBackend.Instance.Users.First(x => x.Id == userId); + var user = _adBackend.Users.First(x => x.Id == userId); return GetRoleByName(roleName).Members.Contains(user.Id); } @@ -67,12 +73,12 @@ public void RemoveUsersFromRoles(Guid[] userIds, string[] roleNames) public bool RoleExists(string roleName) { - return ADBackend.Instance.Roles.Any(role => role.Name == roleName); + return _adBackend.Roles.Any(role => role.Name == roleName); } - private static RoleModel GetRoleByName(string roleName) + private RoleModel GetRoleByName(string roleName) { - return ADBackend.Instance.Roles.First(role => role.Name == roleName); + return _adBackend.Roles.First(role => role.Name == roleName); } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Security/AuthenticationProvider.cs b/Bonobo.Git.Server/Security/AuthenticationProvider.cs index ca273bc4e..9aa0b399d 100644 --- a/Bonobo.Git.Server/Security/AuthenticationProvider.cs +++ b/Bonobo.Git.Server/Security/AuthenticationProvider.cs @@ -1,27 +1,30 @@ -using System; -using System.Collections.Generic; -using System.Security.Claims; +using System.Collections.Generic; using System.Linq; - +using System.Security.Claims; +using System.Threading.Tasks; using Bonobo.Git.Server.Models; - -using Microsoft.Practices.Unity; - -using Owin; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; namespace Bonobo.Git.Server.Security { public abstract class AuthenticationProvider : IAuthenticationProvider { - [Dependency] + public AuthenticationProvider(IMembershipService membershipService, IRoleProvider roleProvider) + { + MembershipService = membershipService; + RoleProvider = roleProvider; + } + public IMembershipService MembershipService { get; set; } - [Dependency] public IRoleProvider RoleProvider { get; set; } - public abstract void Configure(IAppBuilder app); - public abstract void SignIn(string username, string returnUrl, bool rememberMe); - public abstract void SignOut(); + //public abstract void Configure(IApplicationBuilder app); + public abstract Task SignIn(HttpContext httpContext, string username, string returnUrl, bool rememberMe); + public abstract Task SignOut(HttpContext httpContext); public IEnumerable GetClaimsForUser(string username) { @@ -42,5 +45,29 @@ public IEnumerable GetClaimsForUser(string username) return result; } + + protected static void AddGitAuth(AuthenticationBuilder authenticationBuilder) + { + authenticationBuilder.AddScheme("Basic", o => { }); + + authenticationBuilder.Services.AddAuthorization(options => + { + options.AddPolicy("Git", + policy => + { + //policy.AddRequirements(new GitAuthPolicy()); + policy.RequireClaim(ClaimTypes.NameIdentifier); + policy.RequireClaim(ClaimTypes.Name); + policy.RequireClaim(ClaimTypes.Email); + policy.RequireClaim(ClaimTypes.Role); + //policy.AddRequirements() + //policy.RequireUserName("admin"); + policy.AddAuthenticationSchemes("Basic"); + }); + }); + + + authenticationBuilder.Services.AddSingleton(); + } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Security/BasicAuthenticationHandler.cs b/Bonobo.Git.Server/Security/BasicAuthenticationHandler.cs new file mode 100644 index 000000000..fceb1f45a --- /dev/null +++ b/Bonobo.Git.Server/Security/BasicAuthenticationHandler.cs @@ -0,0 +1,114 @@ +using System; +using System.Security.Claims; +using System.Text; +using System.Text.Encodings.Web; +using System.Threading.Tasks; +using Bonobo.Git.Server.Helpers; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Serilog; + +namespace Bonobo.Git.Server.Security +{ + public class BasicAuthenticationHandler : AuthenticationHandler + { + public BasicAuthenticationHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) + { + } + + protected override Task HandleAuthenticateAsync() + { + return Task.FromResult(HandleAuthenticate()); + } + + private AuthenticateResult HandleAuthenticate() + { + string authHeader = this.Context.Request.Headers["Authorization"]; + + if (string.IsNullOrEmpty(authHeader)) + { + return AuthenticateResult.NoResult(); + } + + byte[] encodedDataAsBytes = Convert.FromBase64String(authHeader.Replace("Basic ", string.Empty)); + string value = Encoding.ASCII.GetString(encodedDataAsBytes); + + int colonPosition = value.IndexOf(':'); + if (colonPosition == -1) + { + Log.Error("GitAuth: AuthHeader doesn't contain colon - failing auth"); + return AuthenticateResult.Fail("GitAuth: AuthHeader doesn't contain colon - failing auth"); + } + string username = value.Substring(0, colonPosition); + string password = value.Substring(colonPosition + 1); + + Log.Verbose("GitAuth: Trying to auth user {username}", username); + + if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password)) + { + var authenticationProvider = this.Context.RequestServices.GetService(); + var membershipService = this.Context.RequestServices.GetService(); + if (authenticationProvider is WindowsAuthenticationProvider && membershipService is EFMembershipService) + { + var adHelper = this.Context.RequestServices.GetService(); + Log.Verbose("GitAuth: Going to windows auth (EF Membership) for user {username}", username); + if (adHelper.ValidateUser(username, password)) + { + throw new NotImplementedException(); + //httpContext.User = new ClaimsPrincipal(new ClaimsIdentity(authenticationProvider.GetClaimsForUser(username))); + //Log.Verbose("GitAuth: User {username} authorised by direct windows auth", username); + //return true; + } + } + else + { + Log.Verbose("GitAuth: Going to membership service for user {username}", username); + if (membershipService.ValidateUser(username, password) == ValidationResult.Success) + { + ClaimsIdentity identity = new ClaimsIdentity(authenticationProvider.GetClaimsForUser(username)); + //identity.IsAuthenticated + var principal = new ClaimsPrincipal(identity); + Log.Verbose("GitAuth: User {username} authorised by membership service", username); + + //var context = new ValidatePrincipalContext(this.Context, this.Scheme, this.Options, null); + return AuthenticateResult.Success(new AuthenticationTicket(principal, "Basic")); + } + Log.Warning("GitAuth: Membership service failed auth for {username}", username); + return AuthenticateResult.Fail($"GitAuth: Membership service failed auth for {username}"); + } + } + else + { + Log.Warning("GitAuth: Blank name or password {username}", username); + return AuthenticateResult.Fail($"GitAuth: Blank name or password {username}"); + } + Log.Warning("GitAuth: User {username} not authorized", username); + return AuthenticateResult.Fail($"GitAuth: User {username} not authorized"); + } + + protected override Task HandleChallengeAsync(AuthenticationProperties properties) + { + bool isAuth = Context.User.Identity.IsAuthenticated; + //var realmHeader = new NameValueHeaderValue("realm", $"\"{this.Options.Realm}\""); + this.Response.StatusCode = StatusCodes.Status401Unauthorized; + //this.Response.Headers.Append(HeaderNames.WWWAuthenticate, $"{Basic} {realmHeader}"); + this.Response.Headers.Add("WWW-Authenticate", "Basic realm=\"Bonobo Git\""); + return Task.CompletedTask; + } + } + + public class BasicAuthenticationOptions : AuthenticationSchemeOptions + { + + } + + public class ValidatePrincipalContext : PrincipalContext + { + public ValidatePrincipalContext(HttpContext context, AuthenticationScheme scheme, BasicAuthenticationOptions options, AuthenticationProperties properties) : base(context, scheme, options, properties) + { + } + } +} diff --git a/Bonobo.Git.Server/Security/CookieAuthenticationProvider.cs b/Bonobo.Git.Server/Security/CookieAuthenticationProvider.cs index 801041612..21c958aae 100644 --- a/Bonobo.Git.Server/Security/CookieAuthenticationProvider.cs +++ b/Bonobo.Git.Server/Security/CookieAuthenticationProvider.cs @@ -1,58 +1,59 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Security.Claims; -using System.Web; - -using Bonobo.Git.Server.Models; - -using Microsoft.Owin; -using Microsoft.Owin.Security; -using Microsoft.Owin.Security.Cookies; -using Microsoft.Practices.Unity; - -using Owin; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; namespace Bonobo.Git.Server.Security { public class CookieAuthenticationProvider : AuthenticationProvider { - public override void Configure(IAppBuilder app) + public CookieAuthenticationProvider( + IMembershipService MembershipService, + IRoleProvider RoleProvider) : base(MembershipService, RoleProvider) { - app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); - app.UseCookieAuthentication(new CookieAuthenticationOptions - { - AuthenticationType = CookieAuthenticationDefaults.AuthenticationType, - LoginPath = new PathString("/Home/LogOn"), - ExpireTimeSpan = TimeSpan.FromDays(3), - SlidingExpiration = true, - Provider = new Microsoft.Owin.Security.Cookies.CookieAuthenticationProvider + } + + public static void Configure(IServiceCollection services) + { + AuthenticationBuilder authenticationBuilder = services + .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) + .AddCookie(configureOptions => { - OnApplyRedirect = context => + configureOptions.Cookie.Name = ".BonoboAuthCore"; + configureOptions.LoginPath = new PathString("/Home/LogOn"); + configureOptions.ExpireTimeSpan = TimeSpan.FromDays(3); + configureOptions.SlidingExpiration = true; + configureOptions.AccessDeniedPath = new PathString("/Home/Unauthorized"); + configureOptions.Events./*OnApplyRedirect*/OnRedirectToLogin = context => { if (!context.Request.Headers.ContainsKey("AuthNoRedirect")) { context.Response.Redirect(context.RedirectUri); } - } - }, - }); + return Task.CompletedTask; + }; + }); + AddGitAuth(authenticationBuilder); } - public override void SignIn(string username, string returnUrl = null, bool rememberMe = false) + public override async Task SignIn(HttpContext httpContext, string username, string returnUrl = null, bool rememberMe = false) { - ClaimsIdentity identity = new ClaimsIdentity(GetClaimsForUser(username), CookieAuthenticationDefaults.AuthenticationType); + ClaimsIdentity identity = new ClaimsIdentity(GetClaimsForUser(username), CookieAuthenticationDefaults.AuthenticationScheme); var authprop = new AuthenticationProperties { IsPersistent = rememberMe, RedirectUri = returnUrl }; - HttpContext.Current.GetOwinContext().Authentication.SignIn(authprop, identity); - if (!String.IsNullOrEmpty(returnUrl)) + var claimsPrincipal = new ClaimsPrincipal(identity); + await httpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, claimsPrincipal, authprop); + if (!string.IsNullOrEmpty(returnUrl)) { - HttpContext.Current.Response.Redirect(returnUrl, false); + httpContext.Response.Redirect(returnUrl, false); } } - public override void SignOut() + public override Task SignOut(HttpContext httpContext) { - HttpContext.Current.GetOwinContext().Authentication.SignOut(CookieAuthenticationDefaults.AuthenticationType); + return httpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); } } } diff --git a/Bonobo.Git.Server/Security/EFMembershipService.cs b/Bonobo.Git.Server/Security/EFMembershipService.cs index 5e197703e..47bd16ec5 100644 --- a/Bonobo.Git.Server/Security/EFMembershipService.cs +++ b/Bonobo.Git.Server/Security/EFMembershipService.cs @@ -1,35 +1,34 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.Cryptography; using Bonobo.Git.Server.Data; using Bonobo.Git.Server.Models; -using System.Security.Cryptography; -using System.Data.Entity.Core; -using Microsoft.Practices.Unity; using Serilog; namespace Bonobo.Git.Server.Security { public class EFMembershipService : IMembershipService { - [Dependency] - public Func CreateContext { get; set; } + private BonoboGitServerContext _ctx; + + public BonoboGitServerContext CreateContext() => _ctx; private readonly IPasswordService _passwordService; - public EFMembershipService() + public EFMembershipService(BonoboGitServerContext createContext) { + _ctx = createContext; // set up dependencies Action updateUserPasswordHook = (username, password) => { - using (var db = CreateContext()) + var db = CreateContext(); + + var user = db.Users.FirstOrDefault(i => i.Username == username); + if (user != null) { - var user = db.Users.FirstOrDefault(i => i.Username == username); - if (user != null) - { - UpdateUser(user.Id, null, null, null, null, password); - } + UpdateUser(user.Id, null, null, null, null, password); } }; _passwordService = new PasswordService(updateUserPasswordHook); @@ -48,7 +47,7 @@ public ValidationResult ValidateUser(string username, string password) Log.Verbose("EF: Validating user {UserName}", username); username = username.ToLowerInvariant(); - using (var database = CreateContext()) + var database = CreateContext(); { var user = database.Users.FirstOrDefault(i => i.Username == username); if (user != null) @@ -82,7 +81,7 @@ public bool CreateUser(string username, string password, string givenName, strin if (id == Guid.Empty) throw new ArgumentException("Id must be a proper Guid", "id"); username = username.ToLowerInvariant(); - using (var database = CreateContext()) + var database = CreateContext(); { var user = new User { @@ -98,7 +97,8 @@ public bool CreateUser(string username, string password, string givenName, strin { database.SaveChanges(); } - catch (UpdateException) + //catch (UpdateException) + catch (Exception) { return false; } @@ -109,9 +109,9 @@ public bool CreateUser(string username, string password, string givenName, strin public IList GetAllUsers() { - using (var db = CreateContext()) + var db = CreateContext(); { - return db.Users.Include("Roles").ToList().Select(item => new UserModel + return db.Users/*.Include("Roles")*/.ToList().Select(item => new UserModel { Id = item.Id, Username = item.Username, @@ -124,7 +124,7 @@ public IList GetAllUsers() public int UserCount() { - using (var db = CreateContext()) + var db = CreateContext(); { return db.Users.Count(); } @@ -139,12 +139,12 @@ private UserModel GetUserModel(User user) GivenName = user.GivenName, Surname = user.Surname, Email = user.Email, - }; + }; } public UserModel GetUserModel(Guid id) { - using (var db = CreateContext()) + var db = CreateContext(); { var user = db.Users.FirstOrDefault(i => i.Id == id); return GetUserModel(user); @@ -153,7 +153,7 @@ public UserModel GetUserModel(Guid id) public UserModel GetUserModel(string username) { - using (var db = CreateContext()) + var db = CreateContext(); { username = username.ToLowerInvariant(); var user = db.Users.FirstOrDefault(i => i.Username == username); @@ -163,7 +163,7 @@ public UserModel GetUserModel(string username) public void UpdateUser(Guid id, string username, string givenName, string surname, string email, string password) { - using (var db = CreateContext()) + var db = CreateContext(); { var user = db.Users.FirstOrDefault(i => i.Id == id); if (user != null) @@ -184,7 +184,7 @@ public void UpdateUser(Guid id, string username, string givenName, string surnam public void DeleteUser(Guid id) { - using (var db = CreateContext()) + var db = CreateContext(); { var user = db.Users.FirstOrDefault(u => u.Id == id); if (user != null) @@ -197,7 +197,7 @@ public void DeleteUser(Guid id) db.SaveChanges(); } } - } + } private void SetPassword(User user, string password) { @@ -226,6 +226,6 @@ public string GenerateResetToken(string username) Buffer.BlockCopy(salt, 0, outputBytes, 1, SaltSize); Buffer.BlockCopy(subkey, 0, outputBytes, 1 + SaltSize, PBKDF2SubkeyLength); return Convert.ToBase64String(outputBytes); - } + } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Security/EFRoleProvider.cs b/Bonobo.Git.Server/Security/EFRoleProvider.cs index 9b0fba330..6c269af96 100644 --- a/Bonobo.Git.Server/Security/EFRoleProvider.cs +++ b/Bonobo.Git.Server/Security/EFRoleProvider.cs @@ -1,14 +1,18 @@ using System; using System.Linq; using Bonobo.Git.Server.Data; -using Microsoft.Practices.Unity; namespace Bonobo.Git.Server.Security { public class EFRoleProvider : IRoleProvider { - [Dependency] - public Func CreateContext { get; set; } + private BonoboGitServerContext _ctx; + public EFRoleProvider(BonoboGitServerContext createContext) + { + _ctx = createContext; + } + + public BonoboGitServerContext CreateContext() => _ctx; public void AddUserToRoles(Guid userId, string[] roleNames) { @@ -17,7 +21,7 @@ public void AddUserToRoles(Guid userId, string[] roleNames) public void AddUsersToRoles(Guid[] userIds, string[] roleNames) { - using (var database = CreateContext()) + var database = CreateContext(); { var roles = database.Roles.Where(i => roleNames.Contains(i.Name)).ToList(); var users = database.Users.Where(i => userIds.Contains(i.Id)).ToList(); @@ -26,7 +30,12 @@ public void AddUsersToRoles(Guid[] userIds, string[] roleNames) { foreach (var user in users) { - role.Users.Add(user); + var userRole = new UserRole + { + RoleId = role.Id, + UserId = user.Id, + }; + role.Users.Add(userRole); } } @@ -37,7 +46,7 @@ public void AddUsersToRoles(Guid[] userIds, string[] roleNames) public void CreateRole(string roleName) { - using (var database = CreateContext()) + var database = CreateContext(); { database.Roles.Add(new Role { @@ -49,7 +58,7 @@ public void CreateRole(string roleName) public bool DeleteRole(string roleName, bool throwOnPopulatedRole) { - using (var database = CreateContext()) + var database = CreateContext(); { var role = database.Roles.FirstOrDefault(i => i.Name == roleName); if (role != null) @@ -73,10 +82,10 @@ public bool DeleteRole(string roleName, bool throwOnPopulatedRole) public string[] FindUsersInRole(string roleName, string usernameToMatch) { - using (var database = CreateContext()) + var database = CreateContext(); { var users = database.Users - .Where(us => us.Username.Contains(usernameToMatch) && us.Roles.Any(role => role.Name == roleName)) + .Where(us => us.Username.Contains(usernameToMatch) && us.Roles.Any(role => role.Role.Name == roleName)) .Select(us => us.Username) .ToArray(); return users; @@ -85,7 +94,7 @@ public string[] FindUsersInRole(string roleName, string usernameToMatch) public string[] GetAllRoles() { - using (var database = CreateContext()) + var database = CreateContext(); { return database.Roles.Select(i => i.Name).ToArray(); } @@ -93,10 +102,10 @@ public string[] GetAllRoles() public string[] GetRolesForUser(Guid userId) { - using (var database = CreateContext()) + var database = CreateContext(); { var roles = database.Roles - .Where(role => role.Users.Any(us => us.Id == userId)) + .Where(role => role.Users.Any(us => us.UserId == userId)) .Select(role => role.Name) .ToArray(); return roles; @@ -105,10 +114,10 @@ public string[] GetRolesForUser(Guid userId) public Guid[] GetUsersInRole(string roleName) { - using (var database = CreateContext()) + var database = CreateContext(); { var users = database.Users - .Where(us => us.Roles.Any(role => role.Name == roleName)) + .Where(us => us.Roles.Any(role => role.Role.Name == roleName)) .Select(us => us.Id) .ToArray(); return users; @@ -117,9 +126,9 @@ public Guid[] GetUsersInRole(string roleName) public bool IsUserInRole(Guid userId, string roleName) { - using (var database = CreateContext()) + var database = CreateContext(); { - return database.Roles.Any(role => role.Name == roleName && role.Users.Any(us => us.Id == userId)); + return database.Roles.Any(role => role.Name == roleName && role.Users.Any(us => us.UserId == userId)); } } @@ -130,7 +139,7 @@ public void RemoveUserFromRoles(Guid userId, string[] roleNames) public void RemoveUsersFromRoles(Guid[] userIds, string[] roleNames) { - using (var database = CreateContext()) + var database = CreateContext(); { var roles = database.Roles.Where(i => roleNames.Contains(i.Name)).ToList(); var users = database.Users.Where(i => userIds.Contains(i.Id)).ToList(); @@ -138,7 +147,12 @@ public void RemoveUsersFromRoles(Guid[] userIds, string[] roleNames) { foreach (var user in users) { - role.Users.Remove(user); + var userRole = new UserRole + { + RoleId = role.Id, + UserId = user.Id, + }; + role.Users.Remove(userRole); } } database.SaveChanges(); @@ -147,7 +161,7 @@ public void RemoveUsersFromRoles(Guid[] userIds, string[] roleNames) public bool RoleExists(string roleName) { - using (var database = CreateContext()) + var database = CreateContext(); { return database.Roles.Any(i => i.Name == roleName); } diff --git a/Bonobo.Git.Server/Security/FederationAuthenticationProvider.cs b/Bonobo.Git.Server/Security/FederationAuthenticationProvider.cs index 99e747e89..684053a0d 100644 --- a/Bonobo.Git.Server/Security/FederationAuthenticationProvider.cs +++ b/Bonobo.Git.Server/Security/FederationAuthenticationProvider.cs @@ -1,69 +1,66 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -using Bonobo.Git.Server.Configuration; - -using Microsoft.Owin.Security; -using Microsoft.Owin.Security.Cookies; -using Microsoft.Owin.Security.WsFederation; - -using Owin; using System.Net; using System.Threading.Tasks; +using Bonobo.Git.Server.Configuration; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.WsFederation; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; namespace Bonobo.Git.Server.Security { public class FederationAuthenticationProvider : AuthenticationProvider { - public override void Configure(IAppBuilder app) + public FederationAuthenticationProvider(IMembershipService membershipService, IRoleProvider roleProvider) : base(membershipService, roleProvider) { - if (String.IsNullOrEmpty(FederationSettings.MetadataAddress)) + } + + public static void Configure(IServiceCollection services, FederationSettings federationSettings) + { + if (String.IsNullOrEmpty(federationSettings.MetadataAddress)) { throw new ArgumentException("Missing federation declaration in config", "FederationMetadataAddress"); } - if (String.IsNullOrEmpty(FederationSettings.Realm)) + if (String.IsNullOrEmpty(federationSettings.Realm)) { throw new ArgumentException("Missing federation declaration in config", "FederationRealm"); } - app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); - app.UseCookieAuthentication(new CookieAuthenticationOptions()); - app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions - { - MetadataAddress = FederationSettings.MetadataAddress, - Wtrealm = FederationSettings.Realm, - Notifications = new WsFederationAuthenticationNotifications() + var authenticationBuilder = services + .AddAuthentication(WsFederationDefaults.AuthenticationScheme) + .AddWsFederation(options => { - RedirectToIdentityProvider = (context) => - { - if (context.OwinContext.Response.StatusCode == (int)HttpStatusCode.Unauthorized && context.Request.Headers.ContainsKey("AuthNoRedirect")) + options.Wtrealm = federationSettings.Realm; + options.MetadataAddress = federationSettings.Realm; + options.Events.OnRedirectToIdentityProvider = (context) => { - context.HandleResponse(); - } + if (context.Response.StatusCode == (int)HttpStatusCode.Unauthorized && context.Request.Headers.ContainsKey("AuthNoRedirect")) + { + context.HandleResponse(); + } + + return Task.FromResult(0); + }; + }); - return Task.FromResult(0); - } - } - }); + AddGitAuth(authenticationBuilder); } - public override void SignIn(string username, string returnUrl, bool rememberMe) + public override async Task SignIn(HttpContext httpContext, string username, string returnUrl, bool rememberMe) { var authprop = new AuthenticationProperties { IsPersistent = rememberMe, RedirectUri = returnUrl }; - HttpContext.Current.GetOwinContext().Authentication.Challenge(authprop, WsFederationAuthenticationDefaults.AuthenticationType); - if (!String.IsNullOrEmpty(returnUrl)) + await httpContext.ChallengeAsync(WsFederationDefaults.AuthenticationScheme, authprop); + if (!string.IsNullOrEmpty(returnUrl)) { - HttpContext.Current.Response.Redirect(returnUrl, false); + httpContext.Response.Redirect(returnUrl, false); } } - public override void SignOut() + public override async Task SignOut(HttpContext httpContext) { - HttpContext.Current.GetOwinContext().Authentication.SignOut(WsFederationAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType); + await httpContext.SignOutAsync(WsFederationDefaults.AuthenticationScheme); } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Security/IAuthenticationProvider.cs b/Bonobo.Git.Server/Security/IAuthenticationProvider.cs index ea89d4151..e74822d8b 100644 --- a/Bonobo.Git.Server/Security/IAuthenticationProvider.cs +++ b/Bonobo.Git.Server/Security/IAuthenticationProvider.cs @@ -1,15 +1,14 @@ using System.Collections.Generic; using System.Security.Claims; - -using Owin; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; namespace Bonobo.Git.Server.Security { public interface IAuthenticationProvider { - void Configure(IAppBuilder app); - void SignIn(string username, string returnUrl, bool rememberMe); - void SignOut(); + Task SignIn(HttpContext httpContext, string username, string returnUrl, bool rememberMe); + Task SignOut(HttpContext httpContext); IEnumerable GetClaimsForUser(string username); } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Security/IMembershipService.cs b/Bonobo.Git.Server/Security/IMembershipService.cs index 2cd3aa6c1..f02ddf368 100644 --- a/Bonobo.Git.Server/Security/IMembershipService.cs +++ b/Bonobo.Git.Server/Security/IMembershipService.cs @@ -1,6 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Bonobo.Git.Server.Models; -using System; namespace Bonobo.Git.Server.Security { diff --git a/Bonobo.Git.Server/Security/IRepositoryPermissionService.cs b/Bonobo.Git.Server/Security/IRepositoryPermissionService.cs index 98bd55dd1..7b8cd729a 100644 --- a/Bonobo.Git.Server/Security/IRepositoryPermissionService.cs +++ b/Bonobo.Git.Server/Security/IRepositoryPermissionService.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Web; using Bonobo.Git.Server.Models; namespace Bonobo.Git.Server.Security diff --git a/Bonobo.Git.Server/Security/PasswordService.cs b/Bonobo.Git.Server/Security/PasswordService.cs index 723466d4a..46c405658 100644 --- a/Bonobo.Git.Server/Security/PasswordService.cs +++ b/Bonobo.Git.Server/Security/PasswordService.cs @@ -1,15 +1,13 @@ using System; -using System.Linq; using System.Security.Cryptography; using System.Text.RegularExpressions; -using Bonobo.Git.Server.Data; namespace Bonobo.Git.Server.Security { public class PasswordService : IPasswordService { private readonly Action _updateUserPasswordHook; - private readonly Func _getCurrentHashProvider; + private readonly Func _getCurrentHashProvider; private readonly Func _getDeprecatedHashProvider; /// @@ -65,13 +63,13 @@ public bool ComparePassword(string password, string username, string salt, strin } return false; } - + private bool IsOfCurrentHashFormat(string hash) { //sha512-hex, md5-hex would be 32 return Regex.IsMatch(hash, "^[0-9A-F]{128}$"); } - + private string GetDeprecatedHash(string password) { return GetHash(password, _getDeprecatedHashProvider); diff --git a/Bonobo.Git.Server/Security/RepositoryPermissionService.cs b/Bonobo.Git.Server/Security/RepositoryPermissionService.cs index 5989708a9..f07c7789b 100644 --- a/Bonobo.Git.Server/Security/RepositoryPermissionService.cs +++ b/Bonobo.Git.Server/Security/RepositoryPermissionService.cs @@ -1,25 +1,29 @@ -using System.Linq; -using Bonobo.Git.Server.Data; -using System; +using System; using System.Collections.Generic; +using System.Linq; using Bonobo.Git.Server.Configuration; +using Bonobo.Git.Server.Data; using Bonobo.Git.Server.Models; -using Microsoft.Practices.Unity; using Serilog; namespace Bonobo.Git.Server.Security { public class RepositoryPermissionService : IRepositoryPermissionService { - [Dependency] public IRepositoryRepository Repository { get; set; } - - [Dependency] public IRoleProvider RoleProvider { get; set; } - - [Dependency] public ITeamRepository TeamRepository { get; set; } - + + public RepositoryPermissionService( + IRepositoryRepository repository, + IRoleProvider roleProvider, + ITeamRepository teamRepository) + { + Repository = repository; + RoleProvider = roleProvider; + TeamRepository = teamRepository; + } + public bool HasPermission(Guid userId, string repositoryName, RepositoryAccessLevel requiredLevel) { var repository = Repository.GetRepository(repositoryName); @@ -109,8 +113,8 @@ private bool CheckNamedUserPermission(Guid userId, IList userTeams, b { case RepositoryAccessLevel.Push: case RepositoryAccessLevel.Pull: - return userIsAnAdministrator || - UserIsARepoUser(userId, repository) || + return userIsAnAdministrator || + UserIsARepoUser(userId, repository) || UserIsATeamMember(userTeams, repository); case RepositoryAccessLevel.Administer: diff --git a/Bonobo.Git.Server/Security/ValidationResult.cs b/Bonobo.Git.Server/Security/ValidationResult.cs index a29a03350..f08a4d837 100644 --- a/Bonobo.Git.Server/Security/ValidationResult.cs +++ b/Bonobo.Git.Server/Security/ValidationResult.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace Bonobo.Git.Server.Security +namespace Bonobo.Git.Server.Security { public enum ValidationResult { diff --git a/Bonobo.Git.Server/Security/WindowsAuthenticationProvider.cs b/Bonobo.Git.Server/Security/WindowsAuthenticationProvider.cs index ec8cc6317..9ffe661fc 100644 --- a/Bonobo.Git.Server/Security/WindowsAuthenticationProvider.cs +++ b/Bonobo.Git.Server/Security/WindowsAuthenticationProvider.cs @@ -1,65 +1,60 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using System.Web; - -using Bonobo.Git.Server.Models; - -using Microsoft.Owin; -using Microsoft.Owin.Security; -using Microsoft.Owin.Security.Cookies; -using Microsoft.Practices.Unity; - -using Owin; -using Bonobo.Git.Server.Owin.Windows; -using Microsoft.Owin.Extensions; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; namespace Bonobo.Git.Server.Security { public class WindowsAuthenticationProvider : AuthenticationProvider { - public override void Configure(IAppBuilder app) + public WindowsAuthenticationProvider(IMembershipService membershipService, IRoleProvider roleProvider) : base(membershipService, roleProvider) + { + } + + public static void Configure(IServiceCollection services) { - app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); - app.UseCookieAuthentication(new CookieAuthenticationOptions() - { - AuthenticationType = CookieAuthenticationDefaults.AuthenticationType, - LoginPath = new PathString("/Home/WindowsLogin"), - Provider = new Microsoft.Owin.Security.Cookies.CookieAuthenticationProvider() - { - OnApplyRedirect = context => - { - if (context.Request.Path != WindowsAuthenticationOptions.DefaultRedirectPath && !context.Request.Headers.ContainsKey("AuthNoRedirect")) - { - context.Response.Redirect(context.RedirectUri); - } - } - } - }); - app.UseWindowsAuthentication(new WindowsAuthenticationOptions - { - GetClaimsForUser = username => - { - return GetClaimsForUser(username); - } - }); + throw new NotImplementedException(); + //app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); + //app.UseCookieAuthentication(new CookieAuthenticationOptions() + //{ + // AuthenticationType = CookieAuthenticationDefaults.AuthenticationType, + // LoginPath = new PathString("/Home/WindowsLogin"), + // Provider = new Microsoft.Owin.Security.Cookies.CookieAuthenticationProvider() + // { + // OnApplyRedirect = context => + // { + // if (context.Request.Path != WindowsAuthenticationOptions.DefaultRedirectPath && !context.Request.Headers.ContainsKey("AuthNoRedirect")) + // { + // context.Response.Redirect(context.RedirectUri); + // } + // } + // } + //}); + //app.UseWindowsAuthentication(new WindowsAuthenticationOptions + //{ + // GetClaimsForUser = username => + // { + // return GetClaimsForUser(username); + // } + //}); } - public override void SignIn(string username, string returnUrl = null, bool rememberMe = false) + public override Task SignIn(HttpContext httpContext, string username, string returnUrl = null, bool rememberMe = false) { - ClaimsIdentity identity = new ClaimsIdentity(GetClaimsForUser(username), WindowsAuthenticationDefaults.AuthenticationType); - var authprop = new AuthenticationProperties { IsPersistent = rememberMe, RedirectUri = returnUrl }; - HttpContext.Current.GetOwinContext().Authentication.SignIn(authprop, identity); - if (!String.IsNullOrEmpty(returnUrl)) - { - HttpContext.Current.Response.Redirect(returnUrl, false); - } + throw new NotImplementedException(); + //ClaimsIdentity identity = new ClaimsIdentity(GetClaimsForUser(username), WindowsAuthenticationDefaults.AuthenticationType); + //var authprop = new AuthenticationProperties { IsPersistent = rememberMe, RedirectUri = returnUrl }; + //await httpContext.SignInAsync(authprop, identity); + //if (!String.IsNullOrEmpty(returnUrl)) + //{ + // httpContext.Response.Redirect(returnUrl, false); + //} } - public override void SignOut() + public override Task SignOut(HttpContext httpContext) { - HttpContext.Current.GetOwinContext().Authentication.SignOut(WindowsAuthenticationDefaults.AuthenticationType); + throw new NotImplementedException(); + //return httpContext.SignOutAsync(WindowsAuthenticationDefaults.AuthenticationScheme); } } } \ No newline at end of file diff --git a/Bonobo.Git.Server/Startup.cs b/Bonobo.Git.Server/Startup.cs index 4f05d7b27..cb32c613a 100644 --- a/Bonobo.Git.Server/Startup.cs +++ b/Bonobo.Git.Server/Startup.cs @@ -1,20 +1,258 @@ using System; -using System.Web.Mvc; - -using Microsoft.Owin; - -using Owin; +using System.Diagnostics; +using Bonobo.Git.Server.Attributes; +using Bonobo.Git.Server.Configuration; +using Bonobo.Git.Server.Data; +using Bonobo.Git.Server.Data.Update; +using Bonobo.Git.Server.Git; +using Bonobo.Git.Server.Git.GitService; +using Bonobo.Git.Server.Git.GitService.ReceivePackHook; +using Bonobo.Git.Server.Git.GitService.ReceivePackHook.Durability; +using Bonobo.Git.Server.Git.GitService.ReceivePackHook.Hooks; using Bonobo.Git.Server.Security; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc.Infrastructure; +using Microsoft.AspNetCore.Mvc.ViewFeatures; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Internal; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Serilog; -[assembly: OwinStartup(typeof(Bonobo.Git.Server.Startup))] - -namespace Bonobo.Git.Server +namespace Bonobo.Git.Server.Core { public class Startup { - public void Configuration(IAppBuilder app) + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + /* + The UnityDecoratorContainerExtension breaks resolving named type registrations, like: + + container.RegisterType("ActiveDirectory"); + container.RegisterType("Internal"); + IMembershipService membershipService = container.Resolve(AuthenticationSettings.MembershipService); + + Until this issue is resolved, the following two switch hacks will have to do + */ + + var authSettings = Configuration.GetSection("AuthenticationSettings").Get(); + var appSettings = Configuration.GetSection("AppSettings").Get(); + + switch (authSettings.MembershipService.ToLowerInvariant()) + { + case "activedirectory": + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + break; + case "internal": + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + break; + default: + throw new ArgumentException("Missing declaration in web.config", "MembershipService"); + } + + switch (authSettings.AuthenticationProvider.ToLowerInvariant()) + { + case "windows": + services.AddTransient(); + WindowsAuthenticationProvider.Configure(services); + break; + case "cookies": + services.AddTransient(); + CookieAuthenticationProvider.Configure(services); + break; + case "federation": + services.AddTransient(); + FederationAuthenticationProvider.Configure(services, new FederationSettings()); + break; + default: + throw new ArgumentException("Missing declaration in web.config", "AuthenticationProvider"); + } + + services.AddTransient(sc => + new ConfigurationBasedRepositoryLocator(UserConfiguration.Current.Repositories)); + + services.AddSingleton( + new GitServiceExecutorParams() + { + GitPath = /* GetRootPath*/(appSettings.GitPath), + GitHomePath = /*GetRootPath*/(appSettings.GitHomePath), + RepositoriesDirPath = UserConfiguration.Current.Repositories, + }); + + services.AddTransient(); + + if (appSettings.IsPushAuditEnabled) + { + EnablePushAuditAnalysis(services, appSettings); + } + + services.AddTransient(); + + services.AddDbContext(options => + { + //options.UseSqlite("Data Source=Bonobo.Git.Server.db"); + options.UseSqlServer("Server=.;Database=bonobogit;Integrated Security=True;"); + }); + + services.Configure(Configuration.GetSection("AuthenticationSettings")); + services.Configure(Configuration.GetSection("AppSettings")); + + services.AddSingleton(); + services.AddSingleton(); + services.AddMvc(options => + { + options.Filters.Add(typeof(AllViewsFilter)); + }); + } + + private static void EnablePushAuditAnalysis(IServiceCollection services, AppSettings appSettings) + { + bool isReceivePackRecoveryProcessEnabled = !string.IsNullOrEmpty(appSettings.RecoveryDataPath); + + if (isReceivePackRecoveryProcessEnabled) + { + // git service execution durability registrations to enable receive-pack hook execution after failures + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddSingleton(new NamedArguments.FailedPackWaitTimeBeforeExecution(TimeSpan.FromSeconds(5 * 60))); + + //services.AddSingleton(new NamedArguments.ReceivePackRecoveryDirectory( + // Path.IsPathRooted(appSettings.RecoveryDataPath) ? + // appSettings.RecoveryDataPath : + // HttpContext.Current.Server.MapPath(appSettings.RecoveryDataPath))); + } + + // base git service executor + services.AddTransient(); + services.AddTransient(); + + // receive pack hooks + services.AddTransient(); + services.AddTransient(); + + //// run receive-pack recovery if possible + //if (isReceivePackRecoveryProcessEnabled) + //{ + // var recoveryProcess = container.Resolve( + // new ParameterOverride( + // "failedPackWaitTimeBeforeExecution", + // new NamedArguments.FailedPackWaitTimeBeforeExecution(TimeSpan.FromSeconds(0)))); // on start up set time to wait = 0 so that recovery for all waiting packs is attempted + + // try + // { + // recoveryProcess.RecoverAll(); + // } + // catch + // { + // // don't let a failed recovery attempt stop start-up process + // } + // finally + // { + // if (recoveryProcess != null) + // { + // container.Teardown(recoveryProcess); + // } + // } + //} + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceScopeFactory scopeFactory, IOptions authSettings) + { + ConfigureLogging(); + + app.UseAuthentication(); + try + { + //AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier; + using (var scope = scopeFactory.CreateScope()) + { + var ctx = scope.ServiceProvider.GetService(); + new AutomaticUpdater().Run(scope.ServiceProvider, ctx, authSettings.Value); + } + using (var scope = scopeFactory.CreateScope()) + { + var ctx = scope.ServiceProvider.GetService(); + var xxx = ctx.Model.ToDebugString(); + var repositoryRepository = scope.ServiceProvider.GetService(); + new RepositorySynchronizer(repositoryRepository).Run(); + } + } + catch (Exception ex) + { + Trace.WriteLine("StartupException " + ex); + Log.Error(ex, "Startup exception"); + throw; + } + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + app.UseBrowserLink(); + } + else + { + app.UseExceptionHandler("/Home/Error"); + } + + app.UseStaticFiles(); + + app.UseMvc(routes => + { + routes.MapRoute( + name: "default", + template: "{controller=Home}/{action=Index}/{id?}"); + }); + + var appSettings = Configuration.GetSection("AppSettings").Get(); + if (appSettings.IsPushAuditEnabled) + { + bool isReceivePackRecoveryProcessEnabled = !string.IsNullOrEmpty(appSettings.RecoveryDataPath); + if (isReceivePackRecoveryProcessEnabled) + { + using (var scope = scopeFactory.CreateScope()) + { + var recoveryProcess = scope.ServiceProvider.GetService(); + try + { + recoveryProcess.RecoverAll(); + } + catch + { + // don't let a failed recovery attempt stop start-up process + } + } + + } + } + } + + private void ConfigureLogging() { - DependencyResolver.Current.GetService().Configure(app); + Log.Logger = new LoggerConfiguration() + //.ReadFrom.AppSettings() + //.WriteTo. //.RollingFile(Path.Combine(HostingEnvironment.MapPath(ConfigurationManager.AppSettings["LogDirectory"]), "log-{Date}.txt")) + .CreateLogger(); } } } diff --git a/Bonobo.Git.Server/Views.New/Home.New/About.cshtml b/Bonobo.Git.Server/Views.New/Home.New/About.cshtml new file mode 100644 index 000000000..3674e37a8 --- /dev/null +++ b/Bonobo.Git.Server/Views.New/Home.New/About.cshtml @@ -0,0 +1,7 @@ +@{ + ViewData["Title"] = "About"; +} +

@ViewData["Title"]

+

@ViewData["Message"]

+ +

Use this area to provide additional information.

diff --git a/Bonobo.Git.Server/Views.New/Home.New/Contact.cshtml b/Bonobo.Git.Server/Views.New/Home.New/Contact.cshtml new file mode 100644 index 000000000..a11a1867c --- /dev/null +++ b/Bonobo.Git.Server/Views.New/Home.New/Contact.cshtml @@ -0,0 +1,17 @@ +@{ + ViewData["Title"] = "Contact"; +} +

@ViewData["Title"]

+

@ViewData["Message"]

+ +
+ One Microsoft Way
+ Redmond, WA 98052-6399
+ P: + 425.555.0100 +
+ +
+ Support: Support@example.com
+ Marketing: Marketing@example.com +
diff --git a/Bonobo.Git.Server/Views.New/Home.New/Index.cshtml b/Bonobo.Git.Server/Views.New/Home.New/Index.cshtml new file mode 100644 index 000000000..00afab6a0 --- /dev/null +++ b/Bonobo.Git.Server/Views.New/Home.New/Index.cshtml @@ -0,0 +1,108 @@ +@{ + ViewData["Title"] = "Home Page"; +} + + + + diff --git a/Bonobo.Git.Server/Views.New/Shared.New/Error.cshtml b/Bonobo.Git.Server/Views.New/Shared.New/Error.cshtml new file mode 100644 index 000000000..ec2ea6bd0 --- /dev/null +++ b/Bonobo.Git.Server/Views.New/Shared.New/Error.cshtml @@ -0,0 +1,22 @@ +@model ErrorViewModel +@{ + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +@if (Model.ShowRequestId) +{ +

+ Request ID: @Model.RequestId +

+} + +

Development Mode

+

+ Swapping to Development environment will display more detailed information about the error that occurred. +

+

+ Development environment should not be enabled in deployed applications, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the ASPNETCORE_ENVIRONMENT environment variable to Development, and restarting the application. +

diff --git a/Bonobo.Git.Server/Views.New/Shared.New/_Layout.cshtml b/Bonobo.Git.Server/Views.New/Shared.New/_Layout.cshtml new file mode 100644 index 000000000..a4e01ebbe --- /dev/null +++ b/Bonobo.Git.Server/Views.New/Shared.New/_Layout.cshtml @@ -0,0 +1,71 @@ + + + + + + @ViewData["Title"] - Bonobo.Git.Server.Core + + + + + + + + + + + + +
+ @RenderBody() +
+
+

© 2017 - Bonobo.Git.Server.Core

+
+
+ + + + + + + + + + + + + @RenderSection("Scripts", required: false) + + diff --git a/Bonobo.Git.Server/Views.New/Shared.New/_ValidationScriptsPartial.cshtml b/Bonobo.Git.Server/Views.New/Shared.New/_ValidationScriptsPartial.cshtml new file mode 100644 index 000000000..a699aafa9 --- /dev/null +++ b/Bonobo.Git.Server/Views.New/Shared.New/_ValidationScriptsPartial.cshtml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/Bonobo.Git.Server/Views.New/_ViewImports.cshtml b/Bonobo.Git.Server/Views.New/_ViewImports.cshtml new file mode 100644 index 000000000..aad360f9e --- /dev/null +++ b/Bonobo.Git.Server/Views.New/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using Bonobo.Git.Server +@using Bonobo.Git.Server.Models +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/Bonobo.Git.Server/Views.New/_ViewStart.cshtml b/Bonobo.Git.Server/Views.New/_ViewStart.cshtml new file mode 100644 index 000000000..a5f10045d --- /dev/null +++ b/Bonobo.Git.Server/Views.New/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} diff --git a/Bonobo.Git.Server/Views/Account/Index.cshtml b/Bonobo.Git.Server/Views/Account/Index.cshtml index 27e7f78cc..fecb2cb55 100644 --- a/Bonobo.Git.Server/Views/Account/Index.cshtml +++ b/Bonobo.Git.Server/Views/Account/Index.cshtml @@ -33,24 +33,46 @@ } else { -
+

@Resources.Account_Delete_DeleteCurrentUser

} } + + + + + + + + + + @foreach (var item in Model) + { + + + + + + + + + } +
@typeof(UserDetailModel).GetDisplayValue("Username")@typeof(UserDetailModel).GetDisplayValue("Name")@typeof(UserDetailModel).GetDisplayValue("Surname")@typeof(UserDetailModel).GetDisplayValue("Email")
@Html.ActionLink(item.Username, "Detail", new { id = item.Id }, new { @class = "detail" })@item.Name@item.Surname@item.Email@(item.IsReadOnly ? Html.Raw(String.Empty) : Html.ActionLink(" ", "Edit", new { id = item.Id }, new { @class = "edit", title = Resources.Grid_Edit }))@(item.IsReadOnly ? Html.Raw(String.Empty) : Html.ActionLink(" ", "Delete", new { id = item.Id }, new { @class = "delete", title = Resources.Grid_Delete }))
+ @{ - var grid = new WebGrid(source: Model, defaultSort: "Username", rowsPerPage: 15); - @grid.GetHtml( - tableStyle: "pure-table users", - columns: grid.Columns( - grid.Column("Username", header: typeof(UserDetailModel).GetDisplayValue("Username"), format: (item) => Html.ActionLink((string)item.Username, "Detail", new { id = item.Id }, new { @class = "detail" })), - grid.Column("Name", typeof(UserDetailModel).GetDisplayValue("Name")), - grid.Column("Surname", typeof(UserDetailModel).GetDisplayValue("Surname")), - grid.Column("Email", typeof(UserDetailModel).GetDisplayValue("Email")), - grid.Column(format: (item) => item.IsReadOnly ? Html.Raw(String.Empty) : Html.ActionLink(" ", "Edit", new { id = item.Id }, new { @class = "edit", title = Resources.Grid_Edit }), style: "action"), - grid.Column(format: (item) => item.IsReadOnly ? Html.Raw(String.Empty) : Html.ActionLink(" ", "Delete", new { id = item.Id }, new { @class = "delete", title = Resources.Grid_Delete }), style: "action") - ) - ) + @*var grid = new WebGrid(source: Model, defaultSort: "Username", rowsPerPage: 15); + @grid.GetHtml( + tableStyle: "pure-table users", + columns: grid.Columns( + grid.Column("Username", header: typeof(UserDetailModel).GetDisplayValue("Username"), format: (item) => Html.ActionLink((string)item.Username, "Detail", new { id = item.Id }, new { @class = "detail" })), + grid.Column("Name", typeof(UserDetailModel).GetDisplayValue("Name")), + grid.Column("Surname", typeof(UserDetailModel).GetDisplayValue("Surname")), + grid.Column("Email", typeof(UserDetailModel).GetDisplayValue("Email")), + grid.Column(format: (item) => item.IsReadOnly ? Html.Raw(String.Empty) : Html.ActionLink(" ", "Edit", new { id = item.Id }, new { @class = "edit", title = Resources.Grid_Edit }), style: "action"), + grid.Column(format: (item) => item.IsReadOnly ? Html.Raw(String.Empty) : Html.ActionLink(" ", "Delete", new { id = item.Id }, new { @class = "delete", title = Resources.Grid_Delete }), style: "action") + ) + )*@ } \ No newline at end of file diff --git a/Bonobo.Git.Server/Views/Home/LogOn.cshtml b/Bonobo.Git.Server/Views/Home/LogOn.cshtml index 1a2e844e8..e48a1fa80 100644 --- a/Bonobo.Git.Server/Views/Home/LogOn.cshtml +++ b/Bonobo.Git.Server/Views/Home/LogOn.cshtml @@ -1,15 +1,14 @@ -@using System.Collections.Concurrent -@model Bonobo.Git.Server.Models.LogOnModel +@model Bonobo.Git.Server.Models.LogOnModel @{ - ViewBag.Title = @Resources.Home_LogOn_Title; + ViewBag.Title = Bonobo.Git.Server.App_GlobalResources.Resources.Home_LogOn_Title; } -

@Resources.Home_LogOn_Title

+

@Bonobo.Git.Server.App_GlobalResources.Resources.Home_LogOn_Title

@using (Html.BeginForm("LogOn", "Home", FormMethod.Post, new { @class = "pure-form pure-form-aligned" })) { @Html.AntiForgeryToken() - @Html.ValidationSummary(false, Resources.Home_LogOn_Failed) + @Html.ValidationSummary(false, Bonobo.Git.Server.App_GlobalResources.Resources.Home_LogOn_Failed)
@@ -33,10 +32,10 @@ @Html.TextBoxFor(m => m.DatabaseResetCode) }
- +
- @Html.ActionLink(Resources.Home_LogOn_ForgotPassword, "ForgotPassword") + @Html.ActionLink(Bonobo.Git.Server.App_GlobalResources.Resources.Home_LogOn_ForgotPassword, "ForgotPassword")
} diff --git a/Bonobo.Git.Server/Views/Home/Unauthorized.cshtml b/Bonobo.Git.Server/Views/Home/Unauthorized.cshtml index 85b33008b..d6a3f0209 100644 --- a/Bonobo.Git.Server/Views/Home/Unauthorized.cshtml +++ b/Bonobo.Git.Server/Views/Home/Unauthorized.cshtml @@ -1,8 +1,8 @@ @{ - ViewBag.Title = Resources.Home_Unauthorized_Title; + ViewBag.Title = Bonobo.Git.Server.App_GlobalResources.Resources.Home_Unauthorized_Title; } -

@Resources.Home_Unauthorized_Title

+

@Bonobo.Git.Server.App_GlobalResources.Resources.Home_Unauthorized_Title

-

@Resources.Home_Unauthorized_Text

+

@Bonobo.Git.Server.App_GlobalResources.Resources.Home_Unauthorized_Text

diff --git a/Bonobo.Git.Server/Views/Repository/Commit.cshtml b/Bonobo.Git.Server/Views/Repository/Commit.cshtml index ae3a2f075..64dbbb3d6 100644 --- a/Bonobo.Git.Server/Views/Repository/Commit.cshtml +++ b/Bonobo.Git.Server/Views/Repository/Commit.cshtml @@ -4,48 +4,7 @@ ViewBag.Title = Resources.Repository_Commit_Detail; Layout = "~/Views/Repository/_RepositoryLayout.cshtml"; } -@helper HeaderForDiff(RepositoryCommitChangeModel item) -{ -
-

- - @if (item.Status == LibGit2Sharp.ChangeKind.Added) - { - - } - else if (item.Status == LibGit2Sharp.ChangeKind.Modified) - { - - } - else if (item.Status == LibGit2Sharp.ChangeKind.Deleted) - { - - } - else if (item.Status == LibGit2Sharp.ChangeKind.Renamed) - { - - } - else if (item.Status == LibGit2Sharp.ChangeKind.Copied) - { - - } - else if (item.Status == LibGit2Sharp.ChangeKind.TypeChanged) - { - - } - @if (item.Status != LibGit2Sharp.ChangeKind.Deleted) - { - @Html.ActionLink(item.Path, "Blob", new { id = ViewBag.ID, encodedPath = PathEncoder.Encode(item.Path, allowSlash: true), encodedName = PathEncoder.Encode(Model.ID) }) - } - else - { - @item.Path - } - @item.LinesChanged(+@item.LinesAdded -@item.LinesDeleted) -

-
-} @if (Model != null) { @@ -56,7 +15,45 @@

@Model.GetType().GetDisplayValue("Changes")

@foreach (var item in Model.Changes) { - @HeaderForDiff(item) +
+

+ + @if (item.Status == LibGit2Sharp.ChangeKind.Added) + { + + } + else if (item.Status == LibGit2Sharp.ChangeKind.Modified) + { + + } + else if (item.Status == LibGit2Sharp.ChangeKind.Deleted) + { + + } + else if (item.Status == LibGit2Sharp.ChangeKind.Renamed) + { + + } + else if (item.Status == LibGit2Sharp.ChangeKind.Copied) + { + + } + else if (item.Status == LibGit2Sharp.ChangeKind.TypeChanged) + { + + } + @if (item.Status != LibGit2Sharp.ChangeKind.Deleted) + { + @Html.ActionLink(item.Path, "Blob", new { id = ViewBag.ID, encodedPath = PathEncoder.Encode(item.Path, allowSlash: true), encodedName = PathEncoder.Encode(Model.ID) }) + } + else + { + @item.Path + } + @item.LinesChanged(+@item.LinesAdded -@item.LinesDeleted) + +

+
}
@@ -66,7 +63,45 @@ {
- @HeaderForDiff(item) +
+

+ + @if (item.Status == LibGit2Sharp.ChangeKind.Added) + { + + } + else if (item.Status == LibGit2Sharp.ChangeKind.Modified) + { + + } + else if (item.Status == LibGit2Sharp.ChangeKind.Deleted) + { + + } + else if (item.Status == LibGit2Sharp.ChangeKind.Renamed) + { + + } + else if (item.Status == LibGit2Sharp.ChangeKind.Copied) + { + + } + else if (item.Status == LibGit2Sharp.ChangeKind.TypeChanged) + { + + } + @if (item.Status != LibGit2Sharp.ChangeKind.Deleted) + { + @Html.ActionLink(item.Path, "Blob", new { id = ViewBag.ID, encodedPath = PathEncoder.Encode(item.Path, allowSlash: true), encodedName = PathEncoder.Encode(Model.ID) }) + } + else + { + @item.Path + } + @item.LinesChanged(+@item.LinesAdded -@item.LinesDeleted) + +

+
@item.Patch
@@ -76,6 +111,6 @@ } @section scripts -{ + { } \ No newline at end of file diff --git a/Bonobo.Git.Server/Views/Repository/Commits.cshtml b/Bonobo.Git.Server/Views/Repository/Commits.cshtml index 5608a4b64..cf3012f56 100644 --- a/Bonobo.Git.Server/Views/Repository/Commits.cshtml +++ b/Bonobo.Git.Server/Views/Repository/Commits.cshtml @@ -10,13 +10,19 @@ @Html.Partial("_BranchSwitcher") @if (Model.Commits != null) { - var grid = new WebGrid(rowsPerPage: 10, canPage:true, canSort:false); - grid.Bind(Model.Commits, null, false, (int)(ViewBag.TotalCount ?? 0)); - @grid.GetHtml(displayHeader: false, mode: WebGridPagerModes.All, + + @foreach (var item in Model.Commits.Reverse()) + { + + + + } +
@Html.Partial("_Commit", item)
+ @*@grid.GetHtml(displayHeader: false, mode: WebGridPagerModes.All, columns: grid.Columns( grid.Column(format: item => Html.Partial("_Commit", (RepositoryCommitModel)item.Value)) ) - ) + )*@ } } diff --git a/Bonobo.Git.Server/Views/Repository/Detail.cshtml b/Bonobo.Git.Server/Views/Repository/Detail.cshtml index bece77225..55d2faa68 100644 --- a/Bonobo.Git.Server/Views/Repository/Detail.cshtml +++ b/Bonobo.Git.Server/Views/Repository/Detail.cshtml @@ -1,4 +1,5 @@ @model Bonobo.Git.Server.Models.RepositoryDetailModel +@inject Microsoft.Extensions.Options.IOptions appSettings @{ Layout = "~/Views/Repository/_RepositoryLayout.cshtml"; ViewBag.Title = Resources.Repository_Detail_Title; @@ -19,7 +20,7 @@ break; case RepositoryDetailStatus.Unknown: default: - (Status Unknown) + (Status Unknown) break; } @@ -29,7 +30,8 @@ @Model.GitUrl - @if (User.Identity.IsAuthenticated) { + @if (User.Identity.IsAuthenticated) + {
@Html.LabelFor(m => m.AllowAnonymousPush) - @Html.DisplayEnum(Model.AllowAnonymousPush) + @Html.DisplayFor(m => m.AllowAnonymousPush)
@Html.LabelFor(m => m.LinksUseGlobal) - @Html.CheckBoxFor(m => m.LinksUseGlobal, new { disabled=""}) + @Html.CheckBoxFor(m => m.LinksUseGlobal, new { disabled = "" })
@Html.LabelFor(m => m.LinksRegex) - @Html.TextBoxFor(m => m.LinksRegex, new { @readonly=""}) + @Html.TextBoxFor(m => m.LinksRegex, new { @readonly = "" })
@Html.LabelFor(m => m.LinksUrl) - @Html.TextBoxFor(m => m.LinksUrl, new { @readonly=""}) + @Html.TextBoxFor(m => m.LinksUrl, new { @readonly = "" })
- @if (AppSettings.IsPushAuditEnabled) { + @if (appSettings.Value.IsPushAuditEnabled) + {
@Html.LabelFor(m => m.AuditPushUser) @if (Model.AuditPushUser) @@ -88,52 +91,52 @@ }
} -
+
@Html.LabelFor(m => m.Users) @for (int i = 0; i < Model.Users.Length; i++) { - @Html.ActionLink(@Model.Users[i].DisplayName, "Detail", "Account", new { id = @Model.Users[i].Id}, new { title = @Model.Users[i].Username }) - if (i + 1 != Model.Users.Length) - { - , - } + @Html.ActionLink(@Model.Users[i].DisplayName, "Detail", "Account", new { id = @Model.Users[i].Id }, new { title = @Model.Users[i].Username }) + if (i + 1 != Model.Users.Length) + { + , } -
-
+ } +
+
@Html.LabelFor(m => m.Administrators) @for (int i = 0; i < Model.Administrators.Length; i++) + { + @Html.ActionLink(@Model.Administrators[i].DisplayName, "Detail", "Account", new { id = @Model.Administrators[i].Id }, new { title = @Model.Administrators[i].Username }) + if (i + 1 != Model.Administrators.Length) { - @Html.ActionLink(@Model.Administrators[i].DisplayName, "Detail", "Account", new { id = @Model.Administrators[i].Id }, new { title = @Model.Administrators[i].Username }) - if (i + 1 != Model.Administrators.Length) - { - , - } + , } -
-
- @Html.LabelFor(m => m.Teams) - @for (int i = 0; i < Model.Teams.Length; i++) - { - @Html.ActionLink(@Model.Teams[i].DisplayName, "Detail", "Team", new { id = @Model.Teams[i].Id }, null) - if (i + 1 != Model.Teams.Length) - { - , - } - } -
-
+ } +
+
+ @Html.LabelFor(m => m.Teams) + @for (int i = 0; i < Model.Teams.Length; i++) + { + @Html.ActionLink(@Model.Teams[i].DisplayName, "Detail", "Team", new { id = @Model.Teams[i].Id }, null) + if (i + 1 != Model.Teams.Length) + { + , + } + } +
+ - +
+ } @section scripts -{ + { } diff --git a/Bonobo.Git.Server/Views/Repository/Edit.cshtml b/Bonobo.Git.Server/Views/Repository/Edit.cshtml index 2c3d32337..6fead069d 100644 --- a/Bonobo.Git.Server/Views/Repository/Edit.cshtml +++ b/Bonobo.Git.Server/Views/Repository/Edit.cshtml @@ -1,5 +1,6 @@ @using Bonobo.Git.Server.Extensions -@using MvcCheckBoxList.Model +@inject Microsoft.Extensions.Options.IOptions appSettings + @model Bonobo.Git.Server.Models.RepositoryDetailModel @{ @@ -13,10 +14,10 @@ else { -

- @Html.Raw(Model.Logo.Exists ? string.Format("", Model.Logo.Base64Image) : "") - @Model.Name -

+

+ @Html.Raw(Model.Logo.Exists ? string.Format("", Model.Logo.Base64Image) : "") + @Model.Name +

@if (ViewBag.UpdateSuccess != null && ViewBag.UpdateSuccess) { @@ -30,7 +31,7 @@ else @Html.AntiForgeryToken() @Html.ValidationSummary(false, Resources.Repository_Edit_Fail) @Html.HiddenFor(m => m.Id) - +
@Html.LabelFor(m => m.Name) @@ -43,7 +44,7 @@ else
@Html.LabelFor(m => m.Description) - @Html.TextAreaFor(m => m.Description, new { @class = "medium" }) + @Html.TextAreaFor(m => m.Description, new { @class = "medium" })
@@ -66,15 +67,16 @@ else @Html.LabelFor(m => m.AllowAnonymousPush) @{ object attribs = new { @id = "AllowAnonymousPush" }; - if (!Model.AllowAnonymous){ - attribs = new { @id = "AllowAnonymousPush", @disabled = "" }; + if (!Model.AllowAnonymous) + { + attribs = new { @id = "AllowAnonymousPush", @disabled = "" }; } } - @Html.EnumDropDownListFor(m => m.AllowAnonymousPush, attribs) + @Html.DropDownListFor(m => m.AllowAnonymousPush, Html.GetEnumSelectList(), attribs)
- @if (AppSettings.IsPushAuditEnabled) + @if (appSettings.Value.IsPushAuditEnabled) {
@Html.LabelFor(m => m.AuditPushUser) @@ -90,7 +92,8 @@ else @Html.LabelFor(m => m.LinksRegex) @{ attribs = new { @class = "medium" }; - if (Model.LinksUseGlobal){ + if (Model.LinksUseGlobal) + { attribs = new { @class = "medium", disabled = "" }; } @Html.TextBoxFor(m => m.LinksRegex, attribs); @@ -105,7 +108,7 @@ else
@Html.LabelFor(m => m.Users) - @Html.CheckBoxListFor(m => m.PostedSelectedUsers, m => m.AllUsers, m => m.Id, m => m.DisplayName, m => m.Users, Position.Vertical) + @*@Html.CheckBoxListFor(m => m.PostedSelectedUsers, m => m.AllUsers, m => m.Id, m => m.DisplayName, m => m.Users, Position.Vertical)*@
@@ -115,7 +118,7 @@ else
@Html.LabelFor(m => m.Administrators) - @Html.CheckBoxListFor(m => m.PostedSelectedAdministrators, m => m.AllAdministrators, m => m.Id, m => m.DisplayName, m => m.Administrators, Position.Vertical) + @*@Html.CheckBoxListFor(m => m.PostedSelectedAdministrators, m => m.AllAdministrators, m => m.Id, m => m.DisplayName, m => m.Administrators, Position.Vertical)*@ @Html.ValidationMessageFor(m => m.Administrators) @@ -124,7 +127,7 @@ else
@Html.LabelFor(m => m.Teams) - @Html.CheckBoxListFor(m => m.PostedSelectedTeams, m => m.AllTeams, mm => mm.Id, mm => mm.DisplayName, mm => mm.Teams, Position.Vertical) + @*@Html.CheckBoxListFor(m => m.PostedSelectedTeams, m => m.AllTeams, mm => mm.Id, mm => mm.DisplayName, mm => mm.Teams, Position.Vertical)*@
@@ -134,6 +137,6 @@ else
- } + }
-} + } diff --git a/Bonobo.Git.Server/Views/Repository/Index.cshtml b/Bonobo.Git.Server/Views/Repository/Index.cshtml index f26273768..7f6961a6b 100644 --- a/Bonobo.Git.Server/Views/Repository/Index.cshtml +++ b/Bonobo.Git.Server/Views/Repository/Index.cshtml @@ -1,7 +1,9 @@ @using Bonobo.Git.Server.Extensions -@using System.Web.Mvc.Html @using Bonobo.Git.Server.Models @using Bonobo.Git.Server.Data +@using Bonobo.Git.Server.App_GlobalResources +@using Bonobo.Git.Server.Configuration +@using Bonobo.Git.Server @model Dictionary @{ @@ -35,7 +37,7 @@
@{ - var sortGroupQuery = Request.QueryString["sortGroup"]; + var sortGroupQuery = this.Context.Request.Query["sortGroup"]; var sortGroup = new { @@ -74,7 +76,7 @@ {

@Resources.Repository_Create_Success

-

@Html.ActionLink(string.Format(@Resources.Repository_Create_Success_Go_To, TempData["SuccessfullyCreatedRepositoryName"].ToString()), "Detail", new { id = TempData["SuccessfullyCreatedRepositoryId"].ToString() })

+

@Html.ActionLink(string.Format(@Resources.Repository_Create_Success_Go_To, TempData["SuccessfullyCreatedRepositoryName"].ToString()), "Detail", new { id = TempData["SuccessfullyCreatedRepositoryId"].ToString() })

} @if (TempData["CloneSuccess"] as bool? == true) @@ -115,41 +117,110 @@ } // https://dusted.codes/making-font-awesome-awesome-using-icons-without-i-tags
- @{ - var permitted = new WebGrid(source: model.Value, defaultSort: "Name", rowsPerPage: 15); - - - var columns = new List(); - columns.Add(permitted.Column( - format: item => Html.Raw(item.Logo.Exists ? string.Format("", item.Logo.Base64Image) : ""), - style: "logo" - )); - columns.Add(permitted.Column("Name", - header: typeof(RepositoryDetailModel).GetDisplayValue("Name"), - format: (item) => Html.ActionLink( - GetNameToDisplay((string)item.Name, (RepositoryDetailStatus)item.Status), - - "Detail", - new { id = item.Id }, - new + + + + + + + + + + + + + @foreach (var item in model.Value) + { + + + + @if (User.IsInRole(Definitions.Roles.Administrator)) + { + var anonColor = item.AllowAnonymous ? "rgba(0, 120, 230, 1)" : "lightblue"; + var anonTitle = Resources.Repository_Detail_Anonymous + ": " + (item.AllowAnonymous ? Resources.Yes : Resources.No); + + var pushSetting = UserConfiguration.Current.AllowAnonymousPush; + if (item.AllowAnonymousPush != RepositoryPushMode.Global) { - @class = "RepositoryName detail" + (item.Logo.Exists ? " customLogo" : ""), - @id = "repo_" + item.Id, + pushSetting = item.AllowAnonymousPush == RepositoryPushMode.Yes; } - ))); - if (User.IsInRole(Definitions.Roles.Administrator)) - { + var pushIcon = item.AllowAnonymousPush == RepositoryPushMode.Global ? "fa-globe" : "fa-sign-in"; + var pushTitle = Resources.Repository_Detail_AllowAnonymousPush + ": " + (pushSetting ? Resources.Yes : Resources.No); + var pushColor = pushSetting ? "rgba(0, 120, 230, 1)" : "lightblue"; + + + } + + + + + + + + } +
@typeof(RepositoryDetailModel).GetDisplayValue("Name")@typeof(RepositoryDetailModel).GetDisplayValue("Description")
@Html.ActionLink( + GetNameToDisplay((string)item.Name, (RepositoryDetailStatus)item.Status), + + "Detail", + new { id = item.Id }, + new + { + @class = "RepositoryName detail" + (item.Logo.Exists ? " customLogo" : ""), + @id = "repo_" + item.Id, + } + ) + + + + + @(((item.Description != null && ((string)item.Description).Length > 100)) ? ((string)item.Description).Substring(0, 100) + " ... " : item.Description)@Html.ActionLink(" ", "Edit", new { id = item.Id }, new { @class = "edit", title = Resources.Grid_Edit })@Html.ActionLink(" ", "Delete", new { id = item.Id }, new { @class = "delete", title = Resources.Grid_Delete })
+ @{ + @*var permitted = new WebGrid(source: model.Value, defaultSort: "Name", rowsPerPage: 15); + + + var columns = new List(); columns.Add(permitted.Column( - format: (item) => - { - var repo = (RepositoryDetailModel)item.Value; - var anonColor = repo.AllowAnonymous ? "rgba(0, 120, 230, 1)" : "lightblue"; - var anonTitle = Resources.Repository_Detail_Anonymous + ": " + (repo.AllowAnonymous ? Resources.Yes : Resources.No); + format: item => Html.Raw(item.Logo.Exists ? string.Format("", item.Logo.Base64Image) : ""), + style: "logo" + )); + columns.Add(permitted.Column("Name", + header: typeof(RepositoryDetailModel).GetDisplayValue("Name"), + format: (item) => Html.ActionLink( + GetNameToDisplay((string)item.Name, (RepositoryDetailStatus)item.Status), - var pushSetting = UserConfiguration.Current.AllowAnonymousPush; - if(repo.AllowAnonymousPush != RepositoryPushMode.Global){ - pushSetting = repo.AllowAnonymousPush == RepositoryPushMode.Yes; + "Detail", + new { id = item.Id }, + new + { + @class = "RepositoryName detail" + (item.Logo.Exists ? " customLogo" : ""), + @id = "repo_" + item.Id, + } + ))); + + if (User.IsInRole(Definitions.Roles.Administrator)) + { + columns.Add(permitted.Column( + format: (item) => + { + var repo = (RepositoryDetailModel)item.Value; + var anonColor = repo.AllowAnonymous ? "rgba(0, 120, 230, 1)" : "lightblue"; + var anonTitle = Resources.Repository_Detail_Anonymous + ": " + (repo.AllowAnonymous ? Resources.Yes : Resources.No); + + var pushSetting = UserConfiguration.Current.AllowAnonymousPush; + if (repo.AllowAnonymousPush != RepositoryPushMode.Global) + { + pushSetting = repo.AllowAnonymousPush == RepositoryPushMode.Yes; + } + + var pushIcon = repo.AllowAnonymousPush == RepositoryPushMode.Global ? "fa-globe" : "fa-sign-in"; + var pushTitle = Resources.Repository_Detail_AllowAnonymousPush + ": " + (pushSetting ? Resources.Yes : Resources.No); + var pushColor = pushSetting ? "rgba(0, 120, 230, 1)" : "lightblue"; + var ret = Html.Raw("").ToHtmlString(); + ret += Html.Raw("
").ToHtmlString(); + ret += Html.Raw("
").ToHtmlString(); + ret += Html.Raw("
").ToHtmlString(); + return Html.Raw(ret); } var pushIcon = repo.AllowAnonymousPush == RepositoryPushMode.Global ? "fa-globe" : "fa-sign-in"; @@ -170,15 +241,15 @@ columns.Add(permitted.Column(format: (item) => ((RepositoryDetailModel)item.Value).IsCurrentUserAdministrator ? Html.ActionLink(" ", "Edit", new { id = item.Id }, new { @class = "edit", title = Resources.Grid_Edit }) : Html.Raw(" "), style: "action")); columns.Add(permitted.Column(format: (item) => ((RepositoryDetailModel)item.Value).IsCurrentUserAdministrator ? Html.ActionLink(" ", "Delete", new { id = item.Id }, new { @class = "delete", title = Resources.Grid_Delete }) : Html.Raw(" "), style: "action")); - permitted.Columns(columns.ToArray()); - @permitted.GetHtml( - tableStyle: "pure-table repositories", - columns: columns, - htmlAttributes: new { @Id = "Repositories" } - ) + permitted.Columns(columns.ToArray()); + @permitted.GetHtml( + tableStyle: "pure-table repositories", + columns: columns, + htmlAttributes: new { @Id = "Repositories" } + )*@ }
- } + } }
diff --git a/Bonobo.Git.Server/Views/Repository/Tags.cshtml b/Bonobo.Git.Server/Views/Repository/Tags.cshtml index e1b27c714..0c5335dbf 100644 --- a/Bonobo.Git.Server/Views/Repository/Tags.cshtml +++ b/Bonobo.Git.Server/Views/Repository/Tags.cshtml @@ -10,13 +10,21 @@ @Html.Partial("_BranchSwitcher") @if (Model.Commits != null) { - var grid = new WebGrid(rowsPerPage: 10, canPage:true, canSort:false); - grid.Bind(Model.Commits, null, false, (int)(ViewBag.TotalCount ?? 0)); - @grid.GetHtml(displayHeader: false, mode: WebGridPagerModes.All, - columns: grid.Columns( - grid.Column(format: item => Html.Partial("_Tag", (RepositoryCommitModel)item.Value)) - ) - ) + + @foreach (var item in Model.Commits) + { + + + + } +
@Html.Partial("_Tag", item)
+ @*var grid = new WebGrid(rowsPerPage: 10, canPage: true, canSort: false); + grid.Bind(Model.Commits, null, false, (int)(ViewBag.TotalCount ?? 0)); + @grid.GetHtml(displayHeader: false, mode: WebGridPagerModes.All, + columns: grid.Columns( + grid.Column(format: item => Html.Partial("_Tag", (RepositoryCommitModel)item.Value)) + ) + )*@ } } diff --git a/Bonobo.Git.Server/Views/Shared/_Layout.cshtml b/Bonobo.Git.Server/Views/Shared/_Layout.cshtml index 3faa30a1d..6a2a4ef09 100644 --- a/Bonobo.Git.Server/Views/Shared/_Layout.cshtml +++ b/Bonobo.Git.Server/Views/Shared/_Layout.cshtml @@ -1,47 +1,57 @@ - +@using Bonobo.Git.Server.App_GlobalResources +@using Bonobo.Git.Server.Configuration +@using Bonobo.Git.Server.Helpers +@using Bonobo.Git.Server + @ViewBag.Title :: @UserConfiguration.Current.GetSiteTitle() - @Styles.Render("~/Content/bundledCss") + + + + + + + @if (UserConfiguration.Current.HasCustomSiteCss) { } @if (UserConfiguration.Current.HasCustomSiteLogo) { - + } - +
- @Scripts.Render("~/bundledJs") + + + + + + + @RenderSection("scripts", required: false) diff --git a/Bonobo.Git.Server/Views/Shared/bb_Layout.cshtml b/Bonobo.Git.Server/Views/Shared/bb_Layout.cshtml new file mode 100644 index 000000000..a4e01ebbe --- /dev/null +++ b/Bonobo.Git.Server/Views/Shared/bb_Layout.cshtml @@ -0,0 +1,71 @@ + + + + + + @ViewData["Title"] - Bonobo.Git.Server.Core + + + + + + + + + + + + +
+ @RenderBody() +
+
+

© 2017 - Bonobo.Git.Server.Core

+
+
+ + + + + + + + + + + + + @RenderSection("Scripts", required: false) + + diff --git a/Bonobo.Git.Server/Views/Team/Index.cshtml b/Bonobo.Git.Server/Views/Team/Index.cshtml index 79bff4ade..249fc2991 100644 --- a/Bonobo.Git.Server/Views/Team/Index.cshtml +++ b/Bonobo.Git.Server/Views/Team/Index.cshtml @@ -11,7 +11,7 @@ @if (!Model.IsReadOnly) { }
@@ -30,17 +30,35 @@ } @{ - var grid = new WebGrid(source: Model, defaultSort: "Name", rowsPerPage: 15); + //var grid = new WebGrid(source: Model, defaultSort: "Name", rowsPerPage: 15); }
- @grid.GetHtml( - tableStyle: "pure-table teams", - columns: grid.Columns( - grid.Column(header: typeof(TeamDetailModel).GetDisplayValue("Name"), format: (item) => Html.ActionLink((string)item.Name, "Detail", new { id = item.Id }, new { @class = "detail" })), - grid.Column("Description", typeof(TeamDetailModel).GetDisplayValue("Description"), format: (item) => item.Description != null && ((string)item.Description).Length > 100 ? ((string)item.Description).Substring(0, 100) + " (...) " : item.Description), - grid.Column(format: (item) => item.IsReadOnly ? Html.Raw(String.Empty) : Html.ActionLink(" ", "Edit", new { id = item.Id }, new { @class = "edit", title = Resources.Grid_Edit }), style: "action"), - grid.Column(format: (item) => item.IsReadOnly ? Html.Raw(String.Empty) : Html.ActionLink(" ", "Delete", new { id = item.Id }, new { @class = "delete", title = Resources.Grid_Delete }), style: "action") - ) - ) + + + + + + + + @foreach (var item in Model) + { + + + + + + + } +
@typeof(TeamDetailModel).GetDisplayValue("Name")@typeof(TeamDetailModel).GetDisplayValue("Description")@typeof(UserDetailModel).GetDisplayValue("Surname")@typeof(UserDetailModel).GetDisplayValue("Email")
@Html.ActionLink((string)item.Name, "Detail", new { id = item.Id }, new { @class = "detail" })@(item.Description != null && ((string)item.Description).Length > 100 ? ((string)item.Description).Substring(0, 100) + " (...) " : item.Description)@(item.IsReadOnly ? Html.Raw(String.Empty) : Html.ActionLink(" ", "Edit", new { id = item.Id }, new { @class = "edit", title = Resources.Grid_Edit }))@(item.IsReadOnly ? Html.Raw(String.Empty) : Html.ActionLink(" ", "Delete", new { id = item.Id }, new { @class = "delete", title = Resources.Grid_Delete }))
+ + @*@grid.GetHtml( + tableStyle: "pure-table teams", + columns: grid.Columns( + grid.Column(header: typeof(TeamDetailModel).GetDisplayValue("Name"), format: (item) => Html.ActionLink((string)item.Name, "Detail", new { id = item.Id }, new { @class = "detail" })), + grid.Column("Description", typeof(TeamDetailModel).GetDisplayValue("Description"), format: (item) => item.Description != null && ((string)item.Description).Length > 100 ? ((string)item.Description).Substring(0, 100) + " (...) " : item.Description), + grid.Column(format: (item) => item.IsReadOnly ? Html.Raw(String.Empty) : Html.ActionLink(" ", "Edit", new { id = item.Id }, new { @class = "edit", title = Resources.Grid_Edit }), style: "action"), + grid.Column(format: (item) => item.IsReadOnly ? Html.Raw(String.Empty) : Html.ActionLink(" ", "Delete", new { id = item.Id }, new { @class = "delete", title = Resources.Grid_Delete }), style: "action") + ) + )*@
diff --git a/Bonobo.Git.Server/Views/_ViewImports.cshtml b/Bonobo.Git.Server/Views/_ViewImports.cshtml new file mode 100644 index 000000000..79e6263b4 --- /dev/null +++ b/Bonobo.Git.Server/Views/_ViewImports.cshtml @@ -0,0 +1,6 @@ +@using Bonobo.Git.Server +@using Bonobo.Git.Server.Models +@using Bonobo.Git.Server.App_GlobalResources +@using Bonobo.Git.Server.Configuration +@using Bonobo.Git.Server.Helpers +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/Bonobo.Git.Server/Views/_ViewStart.cshtml b/Bonobo.Git.Server/Views/_ViewStart.cshtml index efda124b1..a5f10045d 100644 --- a/Bonobo.Git.Server/Views/_ViewStart.cshtml +++ b/Bonobo.Git.Server/Views/_ViewStart.cshtml @@ -1,3 +1,3 @@ @{ - Layout = "~/Views/Shared/_Layout.cshtml"; -} \ No newline at end of file + Layout = "_Layout"; +} diff --git a/Bonobo.Git.Server/Web.Test.config b/Bonobo.Git.Server/Web.Test.config deleted file mode 100644 index 3c8e69ed9..000000000 --- a/Bonobo.Git.Server/Web.Test.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/Bonobo.Git.Server/appsettings.Development.json b/Bonobo.Git.Server/appsettings.Development.json new file mode 100644 index 000000000..fa8ce71a9 --- /dev/null +++ b/Bonobo.Git.Server/appsettings.Development.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "IncludeScopes": false, + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/Bonobo.Git.Server/appsettings.json b/Bonobo.Git.Server/appsettings.json new file mode 100644 index 000000000..9d6b3c3ae --- /dev/null +++ b/Bonobo.Git.Server/appsettings.json @@ -0,0 +1,20 @@ +{ + "Logging": { + "IncludeScopes": false, + "LogLevel": { + "Default": "Warning" + } + }, + "AuthenticationSettings": { + "MembershipService": "internal", + "AuthenticationProvider": "Cookies", + "ImportWindowsAuthUsersAsAdmin": false, + "DemoModeActive": false + }, + "AppSettings": { + "IsPushAuditEnabled": false, + "GitPath": "App_Data/Git/git.exe", + "GitHomePath": "App_Data" + } + +} diff --git a/Bonobo.Git.Server/bower.json b/Bonobo.Git.Server/bower.json index 48c399907..b07e3cc5a 100644 --- a/Bonobo.Git.Server/bower.json +++ b/Bonobo.Git.Server/bower.json @@ -1,7 +1,10 @@ { - "name": "Bonobo Git Server", + "name": "asp.net", + "private": true, "dependencies": { - "pure": "0.4.2", - "font-awesome": "4.3.0" + "bootstrap": "3.3.7", + "jquery": "2.2.0", + "jquery-validation": "1.14.0", + "jquery-validation-unobtrusive": "3.2.6" } } diff --git a/Bonobo.Git.Server/bundleconfig.json b/Bonobo.Git.Server/bundleconfig.json new file mode 100644 index 000000000..6d3f9a57a --- /dev/null +++ b/Bonobo.Git.Server/bundleconfig.json @@ -0,0 +1,24 @@ +// Configure bundling and minification for the project. +// More info at https://go.microsoft.com/fwlink/?LinkId=808241 +[ + { + "outputFileName": "wwwroot/css/site.min.css", + // An array of relative input file paths. Globbing patterns supported + "inputFiles": [ + "wwwroot/css/site.css" + ] + }, + { + "outputFileName": "wwwroot/js/site.min.js", + "inputFiles": [ + "wwwroot/js/site.js" + ], + // Optionally specify minification options + "minify": { + "enabled": true, + "renameLocals": true + }, + // Optionally generate .map file + "sourceMap": false + } +] diff --git a/Bonobo.Git.Server/favicon.ico b/Bonobo.Git.Server/favicon.ico deleted file mode 100644 index da8a38973..000000000 Binary files a/Bonobo.Git.Server/favicon.ico and /dev/null differ diff --git a/Bonobo.Git.Server/packages.config b/Bonobo.Git.Server/packages.config deleted file mode 100644 index 3fb6f6e4b..000000000 --- a/Bonobo.Git.Server/packages.config +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Bonobo.Git.Server/Content/Site.css b/Bonobo.Git.Server/wwwroot/Content/Site.css similarity index 100% rename from Bonobo.Git.Server/Content/Site.css rename to Bonobo.Git.Server/wwwroot/Content/Site.css diff --git a/Bonobo.Git.Server/Content/components/font-awesome/.bower.json b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/.bower.json similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/.bower.json rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/.bower.json diff --git a/Bonobo.Git.Server/Content/components/font-awesome/.gitignore b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/.gitignore similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/.gitignore rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/.gitignore diff --git a/Bonobo.Git.Server/Content/components/font-awesome/.npmignore b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/.npmignore similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/.npmignore rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/.npmignore diff --git a/Bonobo.Git.Server/Content/components/font-awesome/bower.json b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/bower.json similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/bower.json rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/bower.json diff --git a/Bonobo.Git.Server/Content/components/font-awesome/css/font-awesome.css b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/css/font-awesome.css similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/css/font-awesome.css rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/css/font-awesome.css diff --git a/Bonobo.Git.Server/Content/components/font-awesome/css/font-awesome.css.map b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/css/font-awesome.css.map similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/css/font-awesome.css.map rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/css/font-awesome.css.map diff --git a/Bonobo.Git.Server/Content/components/font-awesome/css/font-awesome.min.css b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/css/font-awesome.min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/css/font-awesome.min.css rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/css/font-awesome.min.css diff --git a/Bonobo.Git.Server/Content/components/font-awesome/fonts/FontAwesome.otf b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/fonts/FontAwesome.otf similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/fonts/FontAwesome.otf rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/fonts/FontAwesome.otf diff --git a/Bonobo.Git.Server/Content/components/font-awesome/fonts/fontawesome-webfont.eot b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/fonts/fontawesome-webfont.eot similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/fonts/fontawesome-webfont.eot rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/fonts/fontawesome-webfont.eot diff --git a/Bonobo.Git.Server/Content/components/font-awesome/fonts/fontawesome-webfont.svg b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/fonts/fontawesome-webfont.svg similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/fonts/fontawesome-webfont.svg rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/fonts/fontawesome-webfont.svg diff --git a/Bonobo.Git.Server/Content/components/font-awesome/fonts/fontawesome-webfont.ttf b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/fonts/fontawesome-webfont.ttf similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/fonts/fontawesome-webfont.ttf rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/fonts/fontawesome-webfont.ttf diff --git a/Bonobo.Git.Server/Content/components/font-awesome/fonts/fontawesome-webfont.woff b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/fonts/fontawesome-webfont.woff similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/fonts/fontawesome-webfont.woff rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/fonts/fontawesome-webfont.woff diff --git a/Bonobo.Git.Server/Content/components/font-awesome/fonts/fontawesome-webfont.woff2 b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/fonts/fontawesome-webfont.woff2 similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/fonts/fontawesome-webfont.woff2 rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/fonts/fontawesome-webfont.woff2 diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/animated.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/animated.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/animated.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/animated.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/bordered-pulled.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/bordered-pulled.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/bordered-pulled.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/bordered-pulled.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/core.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/core.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/core.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/core.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/fixed-width.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/fixed-width.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/fixed-width.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/fixed-width.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/font-awesome.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/font-awesome.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/font-awesome.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/font-awesome.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/icons.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/icons.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/icons.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/icons.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/larger.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/larger.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/larger.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/larger.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/list.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/list.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/list.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/list.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/mixins.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/mixins.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/mixins.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/mixins.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/path.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/path.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/path.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/path.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/rotated-flipped.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/rotated-flipped.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/rotated-flipped.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/rotated-flipped.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/stacked.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/stacked.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/stacked.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/stacked.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/less/variables.less b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/variables.less similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/less/variables.less rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/less/variables.less diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/_animated.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_animated.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/_animated.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_animated.scss diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/_bordered-pulled.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_bordered-pulled.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/_bordered-pulled.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_bordered-pulled.scss diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/_core.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_core.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/_core.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_core.scss diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/_fixed-width.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_fixed-width.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/_fixed-width.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_fixed-width.scss diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/_icons.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_icons.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/_icons.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_icons.scss diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/_larger.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_larger.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/_larger.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_larger.scss diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/_list.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_list.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/_list.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_list.scss diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/_mixins.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_mixins.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/_mixins.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_mixins.scss diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/_path.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_path.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/_path.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_path.scss diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/_rotated-flipped.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_rotated-flipped.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/_rotated-flipped.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_rotated-flipped.scss diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/_stacked.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_stacked.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/_stacked.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_stacked.scss diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/_variables.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_variables.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/_variables.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/_variables.scss diff --git a/Bonobo.Git.Server/Content/components/font-awesome/scss/font-awesome.scss b/Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/font-awesome.scss similarity index 100% rename from Bonobo.Git.Server/Content/components/font-awesome/scss/font-awesome.scss rename to Bonobo.Git.Server/wwwroot/Content/components/font-awesome/scss/font-awesome.scss diff --git a/Bonobo.Git.Server/Content/components/highlight/CHANGES.md b/Bonobo.Git.Server/wwwroot/Content/components/highlight/CHANGES.md similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/CHANGES.md rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/CHANGES.md diff --git a/Bonobo.Git.Server/Content/components/highlight/LICENSE b/Bonobo.Git.Server/wwwroot/Content/components/highlight/LICENSE similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/LICENSE rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/LICENSE diff --git a/Bonobo.Git.Server/Content/components/highlight/README.md b/Bonobo.Git.Server/wwwroot/Content/components/highlight/README.md similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/README.md rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/README.md diff --git a/Bonobo.Git.Server/Content/components/highlight/README.ru.md b/Bonobo.Git.Server/wwwroot/Content/components/highlight/README.ru.md similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/README.ru.md rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/README.ru.md diff --git a/Bonobo.Git.Server/Content/components/highlight/highlight.pack.js b/Bonobo.Git.Server/wwwroot/Content/components/highlight/highlight.pack.js similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/highlight.pack.js rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/highlight.pack.js diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/agate.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/agate.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/agate.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/agate.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/androidstudio.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/androidstudio.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/androidstudio.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/androidstudio.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/arduino-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/arduino-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/arduino-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/arduino-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/arta.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/arta.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/arta.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/arta.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/ascetic.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/ascetic.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/ascetic.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/ascetic.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-cave-dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-cave-dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-cave-dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-cave-dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-cave-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-cave-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-cave-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-cave-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-dune-dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-dune-dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-dune-dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-dune-dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-dune-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-dune-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-dune-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-dune-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-estuary-dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-estuary-dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-estuary-dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-estuary-dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-estuary-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-estuary-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-estuary-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-estuary-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-forest-dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-forest-dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-forest-dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-forest-dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-forest-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-forest-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-forest-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-forest-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-heath-dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-heath-dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-heath-dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-heath-dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-heath-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-heath-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-heath-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-heath-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-lakeside-dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-lakeside-dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-lakeside-dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-lakeside-dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-lakeside-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-lakeside-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-lakeside-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-lakeside-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-plateau-dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-plateau-dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-plateau-dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-plateau-dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-plateau-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-plateau-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-plateau-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-plateau-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-savanna-dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-savanna-dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-savanna-dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-savanna-dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-savanna-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-savanna-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-savanna-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-savanna-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-seaside-dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-seaside-dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-seaside-dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-seaside-dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-seaside-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-seaside-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-seaside-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-seaside-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-sulphurpool-dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-sulphurpool-dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-sulphurpool-dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-sulphurpool-dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/atelier-sulphurpool-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-sulphurpool-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/atelier-sulphurpool-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/atelier-sulphurpool-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/brown-paper.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/brown-paper.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/brown-paper.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/brown-paper.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/brown-papersq.png b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/brown-papersq.png similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/brown-papersq.png rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/brown-papersq.png diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/codepen-embed.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/codepen-embed.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/codepen-embed.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/codepen-embed.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/color-brewer.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/color-brewer.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/color-brewer.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/color-brewer.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/darkula.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/darkula.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/darkula.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/darkula.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/default.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/default.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/default.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/default.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/docco.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/docco.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/docco.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/docco.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/far.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/far.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/far.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/far.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/foundation.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/foundation.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/foundation.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/foundation.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/github-gist.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/github-gist.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/github-gist.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/github-gist.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/github.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/github.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/github.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/github.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/googlecode.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/googlecode.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/googlecode.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/googlecode.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/grayscale.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/grayscale.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/grayscale.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/grayscale.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/hopscotch.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/hopscotch.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/hopscotch.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/hopscotch.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/hybrid.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/hybrid.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/hybrid.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/hybrid.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/idea.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/idea.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/idea.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/idea.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/ir-black.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/ir-black.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/ir-black.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/ir-black.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/kimbie.dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/kimbie.dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/kimbie.dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/kimbie.dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/kimbie.light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/kimbie.light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/kimbie.light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/kimbie.light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/magula.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/magula.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/magula.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/magula.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/mono-blue.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/mono-blue.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/mono-blue.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/mono-blue.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/monokai-sublime.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/monokai-sublime.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/monokai-sublime.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/monokai-sublime.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/monokai.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/monokai.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/monokai.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/monokai.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/obsidian.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/obsidian.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/obsidian.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/obsidian.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/paraiso-dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/paraiso-dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/paraiso-dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/paraiso-dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/paraiso-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/paraiso-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/paraiso-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/paraiso-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/pojoaque.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/pojoaque.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/pojoaque.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/pojoaque.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/pojoaque.jpg b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/pojoaque.jpg similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/pojoaque.jpg rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/pojoaque.jpg diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/railscasts.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/railscasts.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/railscasts.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/railscasts.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/rainbow.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/rainbow.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/rainbow.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/rainbow.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/school-book.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/school-book.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/school-book.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/school-book.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/school-book.png b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/school-book.png similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/school-book.png rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/school-book.png diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/solarized-dark.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/solarized-dark.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/solarized-dark.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/solarized-dark.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/solarized-light.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/solarized-light.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/solarized-light.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/solarized-light.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/sunburst.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/sunburst.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/sunburst.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/sunburst.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/tomorrow-night-blue.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/tomorrow-night-blue.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/tomorrow-night-blue.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/tomorrow-night-blue.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/tomorrow-night-bright.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/tomorrow-night-bright.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/tomorrow-night-bright.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/tomorrow-night-bright.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/tomorrow-night-eighties.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/tomorrow-night-eighties.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/tomorrow-night-eighties.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/tomorrow-night-eighties.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/tomorrow-night.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/tomorrow-night.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/tomorrow-night.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/tomorrow-night.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/tomorrow.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/tomorrow.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/tomorrow.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/tomorrow.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/vs.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/vs.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/vs.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/vs.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/xcode.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/xcode.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/xcode.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/xcode.css diff --git a/Bonobo.Git.Server/Content/components/highlight/styles/zenburn.css b/Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/zenburn.css similarity index 100% rename from Bonobo.Git.Server/Content/components/highlight/styles/zenburn.css rename to Bonobo.Git.Server/wwwroot/Content/components/highlight/styles/zenburn.css diff --git a/Bonobo.Git.Server/Content/components/pure/.bower.json b/Bonobo.Git.Server/wwwroot/Content/components/pure/.bower.json similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/.bower.json rename to Bonobo.Git.Server/wwwroot/Content/components/pure/.bower.json diff --git a/Bonobo.Git.Server/Content/components/pure/HISTORY.md b/Bonobo.Git.Server/wwwroot/Content/components/pure/HISTORY.md similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/HISTORY.md rename to Bonobo.Git.Server/wwwroot/Content/components/pure/HISTORY.md diff --git a/Bonobo.Git.Server/Content/components/pure/LICENSE.md b/Bonobo.Git.Server/wwwroot/Content/components/pure/LICENSE.md similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/LICENSE.md rename to Bonobo.Git.Server/wwwroot/Content/components/pure/LICENSE.md diff --git a/Bonobo.Git.Server/Content/components/pure/README.md b/Bonobo.Git.Server/wwwroot/Content/components/pure/README.md similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/README.md rename to Bonobo.Git.Server/wwwroot/Content/components/pure/README.md diff --git a/Bonobo.Git.Server/Content/components/pure/base-context-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/base-context-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/base-context-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/base-context-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/base-context.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/base-context.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/base-context.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/base-context.css diff --git a/Bonobo.Git.Server/Content/components/pure/base-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/base-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/base-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/base-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/base.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/base.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/base.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/base.css diff --git a/Bonobo.Git.Server/Content/components/pure/bower.json b/Bonobo.Git.Server/wwwroot/Content/components/pure/bower.json similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/bower.json rename to Bonobo.Git.Server/wwwroot/Content/components/pure/bower.json diff --git a/Bonobo.Git.Server/Content/components/pure/buttons-core-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/buttons-core-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/buttons-core-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/buttons-core-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/buttons-core.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/buttons-core.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/buttons-core.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/buttons-core.css diff --git a/Bonobo.Git.Server/Content/components/pure/buttons-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/buttons-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/buttons-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/buttons-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/buttons.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/buttons.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/buttons.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/buttons.css diff --git a/Bonobo.Git.Server/Content/components/pure/forms-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/forms-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/forms-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/forms-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/forms-nr-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/forms-nr-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/forms-nr-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/forms-nr-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/forms-nr.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/forms-nr.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/forms-nr.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/forms-nr.css diff --git a/Bonobo.Git.Server/Content/components/pure/forms.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/forms.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/forms.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/forms.css diff --git a/Bonobo.Git.Server/Content/components/pure/grids-core-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/grids-core-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/grids-core-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/grids-core-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/grids-core.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/grids-core.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/grids-core.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/grids-core.css diff --git a/Bonobo.Git.Server/Content/components/pure/grids-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/grids-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/grids-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/grids-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/grids-nr-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/grids-nr-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/grids-nr-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/grids-nr-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/grids-nr.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/grids-nr.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/grids-nr.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/grids-nr.css diff --git a/Bonobo.Git.Server/Content/components/pure/grids-units-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/grids-units-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/grids-units-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/grids-units-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/grids-units.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/grids-units.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/grids-units.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/grids-units.css diff --git a/Bonobo.Git.Server/Content/components/pure/grids.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/grids.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/grids.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/grids.css diff --git a/Bonobo.Git.Server/Content/components/pure/menus-core-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/menus-core-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/menus-core-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/menus-core-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/menus-core.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/menus-core.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/menus-core.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/menus-core.css diff --git a/Bonobo.Git.Server/Content/components/pure/menus-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/menus-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/menus-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/menus-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/menus-nr-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/menus-nr-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/menus-nr-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/menus-nr-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/menus-nr.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/menus-nr.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/menus-nr.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/menus-nr.css diff --git a/Bonobo.Git.Server/Content/components/pure/menus-paginator-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/menus-paginator-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/menus-paginator-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/menus-paginator-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/menus-paginator.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/menus-paginator.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/menus-paginator.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/menus-paginator.css diff --git a/Bonobo.Git.Server/Content/components/pure/menus.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/menus.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/menus.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/menus.css diff --git a/Bonobo.Git.Server/Content/components/pure/pure-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/pure-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/pure-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/pure-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/pure-nr-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/pure-nr-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/pure-nr-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/pure-nr-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/pure-nr.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/pure-nr.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/pure-nr.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/pure-nr.css diff --git a/Bonobo.Git.Server/Content/components/pure/pure.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/pure.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/pure.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/pure.css diff --git a/Bonobo.Git.Server/Content/components/pure/tables-min.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/tables-min.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/tables-min.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/tables-min.css diff --git a/Bonobo.Git.Server/Content/components/pure/tables.css b/Bonobo.Git.Server/wwwroot/Content/components/pure/tables.css similarity index 100% rename from Bonobo.Git.Server/Content/components/pure/tables.css rename to Bonobo.Git.Server/wwwroot/Content/components/pure/tables.css diff --git a/Bonobo.Git.Server/Content/fonts.css b/Bonobo.Git.Server/wwwroot/Content/fonts.css similarity index 100% rename from Bonobo.Git.Server/Content/fonts.css rename to Bonobo.Git.Server/wwwroot/Content/fonts.css diff --git a/Bonobo.Git.Server/Content/fonts/opensans-bold.eot b/Bonobo.Git.Server/wwwroot/Content/fonts/opensans-bold.eot similarity index 100% rename from Bonobo.Git.Server/Content/fonts/opensans-bold.eot rename to Bonobo.Git.Server/wwwroot/Content/fonts/opensans-bold.eot diff --git a/Bonobo.Git.Server/Content/fonts/opensans-bold.svg b/Bonobo.Git.Server/wwwroot/Content/fonts/opensans-bold.svg similarity index 100% rename from Bonobo.Git.Server/Content/fonts/opensans-bold.svg rename to Bonobo.Git.Server/wwwroot/Content/fonts/opensans-bold.svg diff --git a/Bonobo.Git.Server/Content/fonts/opensans-bold.ttf b/Bonobo.Git.Server/wwwroot/Content/fonts/opensans-bold.ttf similarity index 100% rename from Bonobo.Git.Server/Content/fonts/opensans-bold.ttf rename to Bonobo.Git.Server/wwwroot/Content/fonts/opensans-bold.ttf diff --git a/Bonobo.Git.Server/Content/fonts/opensans-bold.woff b/Bonobo.Git.Server/wwwroot/Content/fonts/opensans-bold.woff similarity index 100% rename from Bonobo.Git.Server/Content/fonts/opensans-bold.woff rename to Bonobo.Git.Server/wwwroot/Content/fonts/opensans-bold.woff diff --git a/Bonobo.Git.Server/Content/fonts/opensans-light.eot b/Bonobo.Git.Server/wwwroot/Content/fonts/opensans-light.eot similarity index 100% rename from Bonobo.Git.Server/Content/fonts/opensans-light.eot rename to Bonobo.Git.Server/wwwroot/Content/fonts/opensans-light.eot diff --git a/Bonobo.Git.Server/Content/fonts/opensans-light.svg b/Bonobo.Git.Server/wwwroot/Content/fonts/opensans-light.svg similarity index 100% rename from Bonobo.Git.Server/Content/fonts/opensans-light.svg rename to Bonobo.Git.Server/wwwroot/Content/fonts/opensans-light.svg diff --git a/Bonobo.Git.Server/Content/fonts/opensans-light.ttf b/Bonobo.Git.Server/wwwroot/Content/fonts/opensans-light.ttf similarity index 100% rename from Bonobo.Git.Server/Content/fonts/opensans-light.ttf rename to Bonobo.Git.Server/wwwroot/Content/fonts/opensans-light.ttf diff --git a/Bonobo.Git.Server/Content/fonts/opensans-light.woff b/Bonobo.Git.Server/wwwroot/Content/fonts/opensans-light.woff similarity index 100% rename from Bonobo.Git.Server/Content/fonts/opensans-light.woff rename to Bonobo.Git.Server/wwwroot/Content/fonts/opensans-light.woff diff --git a/Bonobo.Git.Server/Content/fonts/opensans-regular.eot b/Bonobo.Git.Server/wwwroot/Content/fonts/opensans-regular.eot similarity index 100% rename from Bonobo.Git.Server/Content/fonts/opensans-regular.eot rename to Bonobo.Git.Server/wwwroot/Content/fonts/opensans-regular.eot diff --git a/Bonobo.Git.Server/Content/fonts/opensans-regular.svg b/Bonobo.Git.Server/wwwroot/Content/fonts/opensans-regular.svg similarity index 100% rename from Bonobo.Git.Server/Content/fonts/opensans-regular.svg rename to Bonobo.Git.Server/wwwroot/Content/fonts/opensans-regular.svg diff --git a/Bonobo.Git.Server/Content/fonts/opensans-regular.ttf b/Bonobo.Git.Server/wwwroot/Content/fonts/opensans-regular.ttf similarity index 100% rename from Bonobo.Git.Server/Content/fonts/opensans-regular.ttf rename to Bonobo.Git.Server/wwwroot/Content/fonts/opensans-regular.ttf diff --git a/Bonobo.Git.Server/Content/fonts/opensans-regular.woff b/Bonobo.Git.Server/wwwroot/Content/fonts/opensans-regular.woff similarity index 100% rename from Bonobo.Git.Server/Content/fonts/opensans-regular.woff rename to Bonobo.Git.Server/wwwroot/Content/fonts/opensans-regular.woff diff --git a/Bonobo.Git.Server/Content/images/git-logo.png b/Bonobo.Git.Server/wwwroot/Content/images/git-logo.png similarity index 100% rename from Bonobo.Git.Server/Content/images/git-logo.png rename to Bonobo.Git.Server/wwwroot/Content/images/git-logo.png diff --git a/Bonobo.Git.Server/Scripts/MicrosoftAjax.debug.js b/Bonobo.Git.Server/wwwroot/Scripts/MicrosoftAjax.debug.js similarity index 100% rename from Bonobo.Git.Server/Scripts/MicrosoftAjax.debug.js rename to Bonobo.Git.Server/wwwroot/Scripts/MicrosoftAjax.debug.js diff --git a/Bonobo.Git.Server/Scripts/MicrosoftAjax.js b/Bonobo.Git.Server/wwwroot/Scripts/MicrosoftAjax.js similarity index 100% rename from Bonobo.Git.Server/Scripts/MicrosoftAjax.js rename to Bonobo.Git.Server/wwwroot/Scripts/MicrosoftAjax.js diff --git a/Bonobo.Git.Server/Scripts/MicrosoftMvcAjax.debug.js b/Bonobo.Git.Server/wwwroot/Scripts/MicrosoftMvcAjax.debug.js similarity index 100% rename from Bonobo.Git.Server/Scripts/MicrosoftMvcAjax.debug.js rename to Bonobo.Git.Server/wwwroot/Scripts/MicrosoftMvcAjax.debug.js diff --git a/Bonobo.Git.Server/Scripts/MicrosoftMvcAjax.js b/Bonobo.Git.Server/wwwroot/Scripts/MicrosoftMvcAjax.js similarity index 100% rename from Bonobo.Git.Server/Scripts/MicrosoftMvcAjax.js rename to Bonobo.Git.Server/wwwroot/Scripts/MicrosoftMvcAjax.js diff --git a/Bonobo.Git.Server/Scripts/MicrosoftMvcValidation.debug.js b/Bonobo.Git.Server/wwwroot/Scripts/MicrosoftMvcValidation.debug.js similarity index 100% rename from Bonobo.Git.Server/Scripts/MicrosoftMvcValidation.debug.js rename to Bonobo.Git.Server/wwwroot/Scripts/MicrosoftMvcValidation.debug.js diff --git a/Bonobo.Git.Server/Scripts/MicrosoftMvcValidation.js b/Bonobo.Git.Server/wwwroot/Scripts/MicrosoftMvcValidation.js similarity index 100% rename from Bonobo.Git.Server/Scripts/MicrosoftMvcValidation.js rename to Bonobo.Git.Server/wwwroot/Scripts/MicrosoftMvcValidation.js diff --git a/Bonobo.Git.Server/Scripts/RepositoryGroupToggle.js b/Bonobo.Git.Server/wwwroot/Scripts/RepositoryGroupToggle.js similarity index 100% rename from Bonobo.Git.Server/Scripts/RepositoryGroupToggle.js rename to Bonobo.Git.Server/wwwroot/Scripts/RepositoryGroupToggle.js diff --git a/Bonobo.Git.Server/Scripts/clipboard.min.js b/Bonobo.Git.Server/wwwroot/Scripts/clipboard.min.js similarity index 100% rename from Bonobo.Git.Server/Scripts/clipboard.min.js rename to Bonobo.Git.Server/wwwroot/Scripts/clipboard.min.js diff --git a/Bonobo.Git.Server/Scripts/highlight.pack.js b/Bonobo.Git.Server/wwwroot/Scripts/highlight.pack.js similarity index 100% rename from Bonobo.Git.Server/Scripts/highlight.pack.js rename to Bonobo.Git.Server/wwwroot/Scripts/highlight.pack.js diff --git a/Bonobo.Git.Server/Scripts/jquery-1.12.4.js b/Bonobo.Git.Server/wwwroot/Scripts/jquery-1.12.4.js similarity index 100% rename from Bonobo.Git.Server/Scripts/jquery-1.12.4.js rename to Bonobo.Git.Server/wwwroot/Scripts/jquery-1.12.4.js diff --git a/Bonobo.Git.Server/Scripts/jquery-1.12.4.min.js b/Bonobo.Git.Server/wwwroot/Scripts/jquery-1.12.4.min.js similarity index 100% rename from Bonobo.Git.Server/Scripts/jquery-1.12.4.min.js rename to Bonobo.Git.Server/wwwroot/Scripts/jquery-1.12.4.min.js diff --git a/Bonobo.Git.Server/Scripts/jquery-ui.js b/Bonobo.Git.Server/wwwroot/Scripts/jquery-ui.js similarity index 100% rename from Bonobo.Git.Server/Scripts/jquery-ui.js rename to Bonobo.Git.Server/wwwroot/Scripts/jquery-ui.js diff --git a/Bonobo.Git.Server/Scripts/jquery-ui.min.js b/Bonobo.Git.Server/wwwroot/Scripts/jquery-ui.min.js similarity index 100% rename from Bonobo.Git.Server/Scripts/jquery-ui.min.js rename to Bonobo.Git.Server/wwwroot/Scripts/jquery-ui.min.js diff --git a/Bonobo.Git.Server/Scripts/jquery.validate-vsdoc.js b/Bonobo.Git.Server/wwwroot/Scripts/jquery.validate-vsdoc.js similarity index 100% rename from Bonobo.Git.Server/Scripts/jquery.validate-vsdoc.js rename to Bonobo.Git.Server/wwwroot/Scripts/jquery.validate-vsdoc.js diff --git a/Bonobo.Git.Server/Scripts/jquery.validate.js b/Bonobo.Git.Server/wwwroot/Scripts/jquery.validate.js similarity index 100% rename from Bonobo.Git.Server/Scripts/jquery.validate.js rename to Bonobo.Git.Server/wwwroot/Scripts/jquery.validate.js diff --git a/Bonobo.Git.Server/Scripts/jquery.validate.min.js b/Bonobo.Git.Server/wwwroot/Scripts/jquery.validate.min.js similarity index 100% rename from Bonobo.Git.Server/Scripts/jquery.validate.min.js rename to Bonobo.Git.Server/wwwroot/Scripts/jquery.validate.min.js diff --git a/Bonobo.Git.Server/Scripts/jquery.validate.unobtrusive.js b/Bonobo.Git.Server/wwwroot/Scripts/jquery.validate.unobtrusive.js similarity index 100% rename from Bonobo.Git.Server/Scripts/jquery.validate.unobtrusive.js rename to Bonobo.Git.Server/wwwroot/Scripts/jquery.validate.unobtrusive.js diff --git a/Bonobo.Git.Server/Scripts/jquery.validate.unobtrusive.min.js b/Bonobo.Git.Server/wwwroot/Scripts/jquery.validate.unobtrusive.min.js similarity index 100% rename from Bonobo.Git.Server/Scripts/jquery.validate.unobtrusive.min.js rename to Bonobo.Git.Server/wwwroot/Scripts/jquery.validate.unobtrusive.min.js diff --git a/Bonobo.Git.Server/wwwroot/favicon.ico b/Bonobo.Git.Server/wwwroot/favicon.ico new file mode 100644 index 000000000..a3a799985 Binary files /dev/null and b/Bonobo.Git.Server/wwwroot/favicon.ico differ diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/.bower.json b/Bonobo.Git.Server/wwwroot/lib/bootstrap/.bower.json new file mode 100644 index 000000000..af176f90c --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/.bower.json @@ -0,0 +1,44 @@ +{ + "name": "bootstrap", + "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", + "keywords": [ + "css", + "js", + "less", + "mobile-first", + "responsive", + "front-end", + "framework", + "web" + ], + "homepage": "http://getbootstrap.com", + "license": "MIT", + "moduleType": "globals", + "main": [ + "less/bootstrap.less", + "dist/js/bootstrap.js" + ], + "ignore": [ + "/.*", + "_config.yml", + "CNAME", + "composer.json", + "CONTRIBUTING.md", + "docs", + "js/tests", + "test-infra" + ], + "dependencies": { + "jquery": "1.9.1 - 3" + }, + "version": "3.3.7", + "_release": "3.3.7", + "_resolution": { + "type": "version", + "tag": "v3.3.7", + "commit": "0b9c4a4007c44201dce9a6cc1a38407005c26c86" + }, + "_source": "https://github.com/twbs/bootstrap.git", + "_target": "3.3.7", + "_originalSource": "bootstrap" +} \ No newline at end of file diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/CHANGELOG.md b/Bonobo.Git.Server/wwwroot/lib/bootstrap/CHANGELOG.md new file mode 100644 index 000000000..b25f83841 --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/CHANGELOG.md @@ -0,0 +1,5 @@ +Bootstrap uses [GitHub's Releases feature](https://github.com/blog/1547-release-your-software) for its changelogs. + +See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap. + +Release announcement posts on [the official Bootstrap blog](http://blog.getbootstrap.com) contain summaries of the most noteworthy changes made in each release. diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/Gemfile b/Bonobo.Git.Server/wwwroot/lib/bootstrap/Gemfile new file mode 100644 index 000000000..feb162291 --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' + +group :development, :test do + gem 'jekyll', '~> 3.1.2' + gem 'jekyll-sitemap', '~> 0.11.0' +end diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/Gemfile.lock b/Bonobo.Git.Server/wwwroot/lib/bootstrap/Gemfile.lock new file mode 100644 index 000000000..1b5dc3e90 --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/Gemfile.lock @@ -0,0 +1,43 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.4.0) + colorator (0.1) + ffi (1.9.14-x64-mingw32) + jekyll (3.1.6) + colorator (~> 0.1) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 1.1) + kramdown (~> 1.3) + liquid (~> 3.0) + mercenary (~> 0.3.3) + rouge (~> 1.7) + safe_yaml (~> 1.0) + jekyll-sass-converter (1.4.0) + sass (~> 3.4) + jekyll-sitemap (0.11.0) + addressable (~> 2.4.0) + jekyll-watch (1.4.0) + listen (~> 3.0, < 3.1) + kramdown (1.11.1) + liquid (3.0.6) + listen (3.0.8) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + mercenary (0.3.6) + rb-fsevent (0.9.7) + rb-inotify (0.9.7) + ffi (>= 0.5.0) + rouge (1.11.1) + safe_yaml (1.0.4) + sass (3.4.22) + +PLATFORMS + x64-mingw32 + +DEPENDENCIES + jekyll (~> 3.1.2) + jekyll-sitemap (~> 0.11.0) + +BUNDLED WITH + 1.12.5 diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/Gruntfile.js b/Bonobo.Git.Server/wwwroot/lib/bootstrap/Gruntfile.js new file mode 100644 index 000000000..994a50087 --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/Gruntfile.js @@ -0,0 +1,511 @@ +/*! + * Bootstrap's Gruntfile + * http://getbootstrap.com + * Copyright 2013-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +module.exports = function (grunt) { + 'use strict'; + + // Force use of Unix newlines + grunt.util.linefeed = '\n'; + + RegExp.quote = function (string) { + return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&'); + }; + + var fs = require('fs'); + var path = require('path'); + var generateGlyphiconsData = require('./grunt/bs-glyphicons-data-generator.js'); + var BsLessdocParser = require('./grunt/bs-lessdoc-parser.js'); + var getLessVarsData = function () { + var filePath = path.join(__dirname, 'less/variables.less'); + var fileContent = fs.readFileSync(filePath, { encoding: 'utf8' }); + var parser = new BsLessdocParser(fileContent); + return { sections: parser.parseFile() }; + }; + var generateRawFiles = require('./grunt/bs-raw-files-generator.js'); + var generateCommonJSModule = require('./grunt/bs-commonjs-generator.js'); + var configBridge = grunt.file.readJSON('./grunt/configBridge.json', { encoding: 'utf8' }); + + Object.keys(configBridge.paths).forEach(function (key) { + configBridge.paths[key].forEach(function (val, i, arr) { + arr[i] = path.join('./docs/assets', val); + }); + }); + + // Project configuration. + grunt.initConfig({ + + // Metadata. + pkg: grunt.file.readJSON('package.json'), + banner: '/*!\n' + + ' * Bootstrap v<%= pkg.version %> (<%= pkg.homepage %>)\n' + + ' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + + ' * Licensed under the <%= pkg.license %> license\n' + + ' */\n', + jqueryCheck: configBridge.config.jqueryCheck.join('\n'), + jqueryVersionCheck: configBridge.config.jqueryVersionCheck.join('\n'), + + // Task configuration. + clean: { + dist: 'dist', + docs: 'docs/dist' + }, + + jshint: { + options: { + jshintrc: 'js/.jshintrc' + }, + grunt: { + options: { + jshintrc: 'grunt/.jshintrc' + }, + src: ['Gruntfile.js', 'package.js', 'grunt/*.js'] + }, + core: { + src: 'js/*.js' + }, + test: { + options: { + jshintrc: 'js/tests/unit/.jshintrc' + }, + src: 'js/tests/unit/*.js' + }, + assets: { + src: ['docs/assets/js/src/*.js', 'docs/assets/js/*.js', '!docs/assets/js/*.min.js'] + } + }, + + jscs: { + options: { + config: 'js/.jscsrc' + }, + grunt: { + src: '<%= jshint.grunt.src %>' + }, + core: { + src: '<%= jshint.core.src %>' + }, + test: { + src: '<%= jshint.test.src %>' + }, + assets: { + options: { + requireCamelCaseOrUpperCaseIdentifiers: null + }, + src: '<%= jshint.assets.src %>' + } + }, + + concat: { + options: { + banner: '<%= banner %>\n<%= jqueryCheck %>\n<%= jqueryVersionCheck %>', + stripBanners: false + }, + bootstrap: { + src: [ + 'js/transition.js', + 'js/alert.js', + 'js/button.js', + 'js/carousel.js', + 'js/collapse.js', + 'js/dropdown.js', + 'js/modal.js', + 'js/tooltip.js', + 'js/popover.js', + 'js/scrollspy.js', + 'js/tab.js', + 'js/affix.js' + ], + dest: 'dist/js/<%= pkg.name %>.js' + } + }, + + uglify: { + options: { + compress: { + warnings: false + }, + mangle: true, + preserveComments: /^!|@preserve|@license|@cc_on/i + }, + core: { + src: '<%= concat.bootstrap.dest %>', + dest: 'dist/js/<%= pkg.name %>.min.js' + }, + customize: { + src: configBridge.paths.customizerJs, + dest: 'docs/assets/js/customize.min.js' + }, + docsJs: { + src: configBridge.paths.docsJs, + dest: 'docs/assets/js/docs.min.js' + } + }, + + qunit: { + options: { + inject: 'js/tests/unit/phantom.js' + }, + files: 'js/tests/index.html' + }, + + less: { + compileCore: { + options: { + strictMath: true, + sourceMap: true, + outputSourceFiles: true, + sourceMapURL: '<%= pkg.name %>.css.map', + sourceMapFilename: 'dist/css/<%= pkg.name %>.css.map' + }, + src: 'less/bootstrap.less', + dest: 'dist/css/<%= pkg.name %>.css' + }, + compileTheme: { + options: { + strictMath: true, + sourceMap: true, + outputSourceFiles: true, + sourceMapURL: '<%= pkg.name %>-theme.css.map', + sourceMapFilename: 'dist/css/<%= pkg.name %>-theme.css.map' + }, + src: 'less/theme.less', + dest: 'dist/css/<%= pkg.name %>-theme.css' + } + }, + + autoprefixer: { + options: { + browsers: configBridge.config.autoprefixerBrowsers + }, + core: { + options: { + map: true + }, + src: 'dist/css/<%= pkg.name %>.css' + }, + theme: { + options: { + map: true + }, + src: 'dist/css/<%= pkg.name %>-theme.css' + }, + docs: { + src: ['docs/assets/css/src/docs.css'] + }, + examples: { + expand: true, + cwd: 'docs/examples/', + src: ['**/*.css'], + dest: 'docs/examples/' + } + }, + + csslint: { + options: { + csslintrc: 'less/.csslintrc' + }, + dist: [ + 'dist/css/bootstrap.css', + 'dist/css/bootstrap-theme.css' + ], + examples: [ + 'docs/examples/**/*.css' + ], + docs: { + options: { + ids: false, + 'overqualified-elements': false + }, + src: 'docs/assets/css/src/docs.css' + } + }, + + cssmin: { + options: { + // TODO: disable `zeroUnits` optimization once clean-css 3.2 is released + // and then simplify the fix for https://github.com/twbs/bootstrap/issues/14837 accordingly + compatibility: 'ie8', + keepSpecialComments: '*', + sourceMap: true, + sourceMapInlineSources: true, + advanced: false + }, + minifyCore: { + src: 'dist/css/<%= pkg.name %>.css', + dest: 'dist/css/<%= pkg.name %>.min.css' + }, + minifyTheme: { + src: 'dist/css/<%= pkg.name %>-theme.css', + dest: 'dist/css/<%= pkg.name %>-theme.min.css' + }, + docs: { + src: [ + 'docs/assets/css/ie10-viewport-bug-workaround.css', + 'docs/assets/css/src/pygments-manni.css', + 'docs/assets/css/src/docs.css' + ], + dest: 'docs/assets/css/docs.min.css' + } + }, + + csscomb: { + options: { + config: 'less/.csscomb.json' + }, + dist: { + expand: true, + cwd: 'dist/css/', + src: ['*.css', '!*.min.css'], + dest: 'dist/css/' + }, + examples: { + expand: true, + cwd: 'docs/examples/', + src: '**/*.css', + dest: 'docs/examples/' + }, + docs: { + src: 'docs/assets/css/src/docs.css', + dest: 'docs/assets/css/src/docs.css' + } + }, + + copy: { + fonts: { + expand: true, + src: 'fonts/**', + dest: 'dist/' + }, + docs: { + expand: true, + cwd: 'dist/', + src: [ + '**/*' + ], + dest: 'docs/dist/' + } + }, + + connect: { + server: { + options: { + port: 3000, + base: '.' + } + } + }, + + jekyll: { + options: { + bundleExec: true, + config: '_config.yml', + incremental: false + }, + docs: {}, + github: { + options: { + raw: 'github: true' + } + } + }, + + htmlmin: { + dist: { + options: { + collapseBooleanAttributes: true, + collapseWhitespace: true, + conservativeCollapse: true, + decodeEntities: false, + minifyCSS: { + compatibility: 'ie8', + keepSpecialComments: 0 + }, + minifyJS: true, + minifyURLs: false, + processConditionalComments: true, + removeAttributeQuotes: true, + removeComments: true, + removeOptionalAttributes: true, + removeOptionalTags: true, + removeRedundantAttributes: true, + removeScriptTypeAttributes: true, + removeStyleLinkTypeAttributes: true, + removeTagWhitespace: false, + sortAttributes: true, + sortClassName: true + }, + expand: true, + cwd: '_gh_pages', + dest: '_gh_pages', + src: [ + '**/*.html', + '!examples/**/*.html' + ] + } + }, + + pug: { + options: { + pretty: true, + data: getLessVarsData + }, + customizerVars: { + src: 'docs/_pug/customizer-variables.pug', + dest: 'docs/_includes/customizer-variables.html' + }, + customizerNav: { + src: 'docs/_pug/customizer-nav.pug', + dest: 'docs/_includes/nav/customize.html' + } + }, + + htmllint: { + options: { + ignore: [ + 'Attribute "autocomplete" not allowed on element "button" at this point.', + 'Attribute "autocomplete" is only allowed when the input type is "color", "date", "datetime", "datetime-local", "email", "hidden", "month", "number", "password", "range", "search", "tel", "text", "time", "url", or "week".', + 'Element "img" is missing required attribute "src".' + ] + }, + src: '_gh_pages/**/*.html' + }, + + watch: { + src: { + files: '<%= jshint.core.src %>', + tasks: ['jshint:core', 'qunit', 'concat'] + }, + test: { + files: '<%= jshint.test.src %>', + tasks: ['jshint:test', 'qunit'] + }, + less: { + files: 'less/**/*.less', + tasks: 'less' + } + }, + + 'saucelabs-qunit': { + all: { + options: { + build: process.env.TRAVIS_JOB_ID, + throttled: 10, + maxRetries: 3, + maxPollRetries: 4, + urls: ['http://127.0.0.1:3000/js/tests/index.html?hidepassed'], + browsers: grunt.file.readYAML('grunt/sauce_browsers.yml') + } + } + }, + + exec: { + npmUpdate: { + command: 'npm update' + } + }, + + compress: { + main: { + options: { + archive: 'bootstrap-<%= pkg.version %>-dist.zip', + mode: 'zip', + level: 9, + pretty: true + }, + files: [ + { + expand: true, + cwd: 'dist/', + src: ['**'], + dest: 'bootstrap-<%= pkg.version %>-dist' + } + ] + } + } + + }); + + + // These plugins provide necessary tasks. + require('load-grunt-tasks')(grunt, { scope: 'devDependencies' }); + require('time-grunt')(grunt); + + // Docs HTML validation task + grunt.registerTask('validate-html', ['jekyll:docs', 'htmllint']); + + var runSubset = function (subset) { + return !process.env.TWBS_TEST || process.env.TWBS_TEST === subset; + }; + var isUndefOrNonZero = function (val) { + return val === undefined || val !== '0'; + }; + + // Test task. + var testSubtasks = []; + // Skip core tests if running a different subset of the test suite + if (runSubset('core') && + // Skip core tests if this is a Savage build + process.env.TRAVIS_REPO_SLUG !== 'twbs-savage/bootstrap') { + testSubtasks = testSubtasks.concat(['dist-css', 'dist-js', 'csslint:dist', 'test-js', 'docs']); + } + // Skip HTML validation if running a different subset of the test suite + if (runSubset('validate-html') && + // Skip HTML5 validator on Travis when [skip validator] is in the commit message + isUndefOrNonZero(process.env.TWBS_DO_VALIDATOR)) { + testSubtasks.push('validate-html'); + } + // Only run Sauce Labs tests if there's a Sauce access key + if (typeof process.env.SAUCE_ACCESS_KEY !== 'undefined' && + // Skip Sauce if running a different subset of the test suite + runSubset('sauce-js-unit') && + // Skip Sauce on Travis when [skip sauce] is in the commit message + isUndefOrNonZero(process.env.TWBS_DO_SAUCE)) { + testSubtasks.push('connect'); + testSubtasks.push('saucelabs-qunit'); + } + grunt.registerTask('test', testSubtasks); + grunt.registerTask('test-js', ['jshint:core', 'jshint:test', 'jshint:grunt', 'jscs:core', 'jscs:test', 'jscs:grunt', 'qunit']); + + // JS distribution task. + grunt.registerTask('dist-js', ['concat', 'uglify:core', 'commonjs']); + + // CSS distribution task. + grunt.registerTask('less-compile', ['less:compileCore', 'less:compileTheme']); + grunt.registerTask('dist-css', ['less-compile', 'autoprefixer:core', 'autoprefixer:theme', 'csscomb:dist', 'cssmin:minifyCore', 'cssmin:minifyTheme']); + + // Full distribution task. + grunt.registerTask('dist', ['clean:dist', 'dist-css', 'copy:fonts', 'dist-js']); + + // Default task. + grunt.registerTask('default', ['clean:dist', 'copy:fonts', 'test']); + + grunt.registerTask('build-glyphicons-data', function () { generateGlyphiconsData.call(this, grunt); }); + + // task for building customizer + grunt.registerTask('build-customizer', ['build-customizer-html', 'build-raw-files']); + grunt.registerTask('build-customizer-html', 'pug'); + grunt.registerTask('build-raw-files', 'Add scripts/less files to customizer.', function () { + var banner = grunt.template.process('<%= banner %>'); + generateRawFiles(grunt, banner); + }); + + grunt.registerTask('commonjs', 'Generate CommonJS entrypoint module in dist dir.', function () { + var srcFiles = grunt.config.get('concat.bootstrap.src'); + var destFilepath = 'dist/js/npm.js'; + generateCommonJSModule(grunt, srcFiles, destFilepath); + }); + + // Docs task. + grunt.registerTask('docs-css', ['autoprefixer:docs', 'autoprefixer:examples', 'csscomb:docs', 'csscomb:examples', 'cssmin:docs']); + grunt.registerTask('lint-docs-css', ['csslint:docs', 'csslint:examples']); + grunt.registerTask('docs-js', ['uglify:docsJs', 'uglify:customize']); + grunt.registerTask('lint-docs-js', ['jshint:assets', 'jscs:assets']); + grunt.registerTask('docs', ['docs-css', 'lint-docs-css', 'docs-js', 'lint-docs-js', 'clean:docs', 'copy:docs', 'build-glyphicons-data', 'build-customizer']); + grunt.registerTask('docs-github', ['jekyll:github', 'htmlmin']); + + grunt.registerTask('prep-release', ['dist', 'docs', 'docs-github', 'compress']); +}; diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/ISSUE_TEMPLATE.md b/Bonobo.Git.Server/wwwroot/lib/bootstrap/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..66c3a2bb2 --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/ISSUE_TEMPLATE.md @@ -0,0 +1,22 @@ +Before opening an issue: + +- [Search for duplicate or closed issues](https://github.com/twbs/bootstrap/issues?utf8=%E2%9C%93&q=is%3Aissue) +- [Validate](http://validator.w3.org/nu/) and [lint](https://github.com/twbs/bootlint#in-the-browser) any HTML to avoid common problems +- Prepare a [reduced test case](https://css-tricks.com/reduced-test-cases/) for any bugs +- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md) + +When asking general "how to" questions: + +- Please do not open an issue here +- Instead, ask for help on [StackOverflow, IRC, or Slack](https://github.com/twbs/bootstrap/blob/master/README.md#community) + +When reporting a bug, include: + +- Operating system and version (Windows, Mac OS X, Android, iOS, Win10 Mobile) +- Browser and version (Chrome, Firefox, Safari, IE, MS Edge, Opera 15+, Android Browser) +- Reduced test cases and potential fixes using [JS Bin](https://jsbin.com) + +When suggesting a feature, include: + +- As much detail as possible for what we should add and why it's important to Bootstrap +- Relevant links to prior art, screenshots, or live demos whenever possible diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/LICENSE b/Bonobo.Git.Server/wwwroot/lib/bootstrap/LICENSE new file mode 100644 index 000000000..7a300022c --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2011-2016 Twitter, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/README.md b/Bonobo.Git.Server/wwwroot/lib/bootstrap/README.md new file mode 100644 index 000000000..f92150f4f --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/README.md @@ -0,0 +1,142 @@ +# [Bootstrap](http://getbootstrap.com) + +[![Slack](https://bootstrap-slack.herokuapp.com/badge.svg)](https://bootstrap-slack.herokuapp.com) +![Bower version](https://img.shields.io/bower/v/bootstrap.svg) +[![npm version](https://img.shields.io/npm/v/bootstrap.svg)](https://www.npmjs.com/package/bootstrap) +[![Build Status](https://img.shields.io/travis/twbs/bootstrap/master.svg)](https://travis-ci.org/twbs/bootstrap) +[![devDependency Status](https://img.shields.io/david/dev/twbs/bootstrap.svg)](https://david-dm.org/twbs/bootstrap#info=devDependencies) +[![NuGet](https://img.shields.io/nuget/v/bootstrap.svg)](https://www.nuget.org/packages/Bootstrap) +[![Selenium Test Status](https://saucelabs.com/browser-matrix/bootstrap.svg)](https://saucelabs.com/u/bootstrap) + +Bootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created by [Mark Otto](https://twitter.com/mdo) and [Jacob Thornton](https://twitter.com/fat), and maintained by the [core team](https://github.com/orgs/twbs/people) with the massive support and involvement of the community. + +To get started, check out ! + + +## Table of contents + +* [Quick start](#quick-start) +* [Bugs and feature requests](#bugs-and-feature-requests) +* [Documentation](#documentation) +* [Contributing](#contributing) +* [Community](#community) +* [Versioning](#versioning) +* [Creators](#creators) +* [Copyright and license](#copyright-and-license) + + +## Quick start + +Several quick start options are available: + +* [Download the latest release](https://github.com/twbs/bootstrap/archive/v3.3.7.zip). +* Clone the repo: `git clone https://github.com/twbs/bootstrap.git`. +* Install with [Bower](http://bower.io): `bower install bootstrap`. +* Install with [npm](https://www.npmjs.com): `npm install bootstrap@3`. +* Install with [Meteor](https://www.meteor.com): `meteor add twbs:bootstrap`. +* Install with [Composer](https://getcomposer.org): `composer require twbs/bootstrap`. + +Read the [Getting started page](http://getbootstrap.com/getting-started/) for information on the framework contents, templates and examples, and more. + +### What's included + +Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this: + +``` +bootstrap/ +├── css/ +│ ├── bootstrap.css +│ ├── bootstrap.css.map +│ ├── bootstrap.min.css +│ ├── bootstrap.min.css.map +│ ├── bootstrap-theme.css +│ ├── bootstrap-theme.css.map +│ ├── bootstrap-theme.min.css +│ └── bootstrap-theme.min.css.map +├── js/ +│ ├── bootstrap.js +│ └── bootstrap.min.js +└── fonts/ + ├── glyphicons-halflings-regular.eot + ├── glyphicons-halflings-regular.svg + ├── glyphicons-halflings-regular.ttf + ├── glyphicons-halflings-regular.woff + └── glyphicons-halflings-regular.woff2 +``` + +We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). CSS [source maps](https://developer.chrome.com/devtools/docs/css-preprocessors) (`bootstrap.*.map`) are available for use with certain browsers' developer tools. Fonts from Glyphicons are included, as is the optional Bootstrap theme. + + +## Bugs and feature requests + +Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md#using-the-issue-tracker) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/twbs/bootstrap/issues/new). + +Note that **feature requests must target [Bootstrap v4](https://github.com/twbs/bootstrap/tree/v4-dev),** because Bootstrap v3 is now in maintenance mode and is closed off to new features. This is so that we can focus our efforts on Bootstrap v4. + + +## Documentation + +Bootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](http://jekyllrb.com) and publicly hosted on GitHub Pages at . The docs may also be run locally. + +### Running documentation locally + +1. If necessary, [install Jekyll](http://jekyllrb.com/docs/installation) and other Ruby dependencies with `bundle install`. + **Note for Windows users:** Read [this unofficial guide](http://jekyll-windows.juthilo.com/) to get Jekyll up and running without problems. +2. From the root `/bootstrap` directory, run `bundle exec jekyll serve` in the command line. +4. Open `http://localhost:9001` in your browser, and voilà. + +Learn more about using Jekyll by reading its [documentation](http://jekyllrb.com/docs/home/). + +### Documentation for previous releases + +Documentation for v2.3.2 has been made available for the time being at while folks transition to Bootstrap 3. + +[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download. + + +## Contributing + +Please read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development. + +Moreover, if your pull request contains JavaScript patches or features, you must include [relevant unit tests](https://github.com/twbs/bootstrap/tree/master/js/tests). All HTML and CSS should conform to the [Code Guide](https://github.com/mdo/code-guide), maintained by [Mark Otto](https://github.com/mdo). + +**Bootstrap v3 is now closed off to new features.** It has gone into maintenance mode so that we can focus our efforts on [Bootstrap v4](https://github.com/twbs/bootstrap/tree/v4-dev), the future of the framework. Pull requests which add new features (rather than fix bugs) should target [Bootstrap v4 (the `v4-dev` git branch)](https://github.com/twbs/bootstrap/tree/v4-dev) instead. + +Editor preferences are available in the [editor config](https://github.com/twbs/bootstrap/blob/master/.editorconfig) for easy use in common text editors. Read more and download plugins at . + + +## Community + +Get updates on Bootstrap's development and chat with the project maintainers and community members. + +* Follow [@getbootstrap on Twitter](https://twitter.com/getbootstrap). +* Read and subscribe to [The Official Bootstrap Blog](http://blog.getbootstrap.com). +* Join [the official Slack room](https://bootstrap-slack.herokuapp.com). +* Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##bootstrap` channel. +* Implementation help may be found at Stack Overflow (tagged [`twitter-bootstrap-3`](https://stackoverflow.com/questions/tagged/twitter-bootstrap-3)). +* Developers should use the keyword `bootstrap` on packages which modify or add to the functionality of Bootstrap when distributing through [npm](https://www.npmjs.com/browse/keyword/bootstrap) or similar delivery mechanisms for maximum discoverability. + + +## Versioning + +For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](http://semver.org/). Sometimes we screw up, but we'll adhere to those rules whenever possible. + +See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap. Release announcement posts on [the official Bootstrap blog](http://blog.getbootstrap.com) contain summaries of the most noteworthy changes made in each release. + + +## Creators + +**Mark Otto** + +* +* + +**Jacob Thornton** + +* +* + + +## Copyright and license + +Code and documentation copyright 2011-2016 Twitter, Inc. Code released under [the MIT license](https://github.com/twbs/bootstrap/blob/master/LICENSE). Docs released under [Creative Commons](https://github.com/twbs/bootstrap/blob/master/docs/LICENSE). diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/bower.json b/Bonobo.Git.Server/wwwroot/lib/bootstrap/bower.json new file mode 100644 index 000000000..b1b1bc0da --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/bower.json @@ -0,0 +1,34 @@ +{ + "name": "bootstrap", + "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", + "keywords": [ + "css", + "js", + "less", + "mobile-first", + "responsive", + "front-end", + "framework", + "web" + ], + "homepage": "http://getbootstrap.com", + "license": "MIT", + "moduleType": "globals", + "main": [ + "less/bootstrap.less", + "dist/js/bootstrap.js" + ], + "ignore": [ + "/.*", + "_config.yml", + "CNAME", + "composer.json", + "CONTRIBUTING.md", + "docs", + "js/tests", + "test-infra" + ], + "dependencies": { + "jquery": "1.9.1 - 3" + } +} diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css b/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css new file mode 100644 index 000000000..31d888266 --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css @@ -0,0 +1,587 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-default.disabled, +.btn-primary.disabled, +.btn-success.disabled, +.btn-info.disabled, +.btn-warning.disabled, +.btn-danger.disabled, +.btn-default[disabled], +.btn-primary[disabled], +.btn-success[disabled], +.btn-info[disabled], +.btn-warning[disabled], +.btn-danger[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-danger { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e0e0e0; + background-image: none; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #245580; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #265a88; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #265a88; + border-color: #245580; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #265a88; + background-image: none; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #2aabd2; + background-image: none; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #eb9316; + background-image: none; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #2e6da4; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #286090; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + background-repeat: repeat-x; + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map b/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map new file mode 100644 index 000000000..d876f60fb --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css b/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css new file mode 100644 index 000000000..5e3940195 --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} +/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map b/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map new file mode 100644 index 000000000..94813e900 --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.css b/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.css new file mode 100644 index 000000000..6167622ce --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.css @@ -0,0 +1,6757 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map b/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map new file mode 100644 index 000000000..f010c82d1 --- /dev/null +++ b/Bonobo.Git.Server/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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AW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;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ukDH;AexkDC;EACE,oBAAA;Cf0kDH;Ae3kDC;EACE,WAAA;Cf6kDH;Ae9kDC;EACE,oBAAA;CfglDH;AejlDC;EACE,mBAAA;CfmlDH;Ae/kDC;EACE,YAAA;CfilDH;AejmDC;EACE,WAAA;CfmmDH;AepmDC;EACE,mBAAA;CfsmDH;AevmDC;EACE,mBAAA;CfymDH;Ae1mDC;EACE,UAAA;Cf4mDH;Ae7mDC;EACE,mBAAA;Cf+mDH;AehnDC;EACE,mBAAA;CfknDH;AennDC;EACE,UAAA;CfqnDH;AetnDC;EACE,mBAAA;CfwnDH;AeznDC;EACE,mBAAA;Cf2nDH;Ae5nDC;EACE,UAAA;Cf8nDH;Ae/nDC;EACE,mBAAA;CfioDH;AeloDC;EACE,kBAAA;CfooDH;AehoDC;EACE,WAAA;CfkoDH;AepnDC;EACE,kBAAA;CfsnDH;AevnDC;EACE,0BAAA;CfynDH;Ae1nDC;EACE,0BAAA;Cf4nDH;Ae7nDC;EACE,iBAAA;Cf+nDH;AehoDC;EACE,0BAAA;CfkoDH;AenoDC;EACE,0BAAA;CfqoDH;AetoDC;EACE,iBAAA;CfwoDH;AezoDC;EACE,0BAAA;Cf2oDH;Ae5oDC;EACE,0BAAA;Cf8oDH;Ae/oDC;EACE,iBAAA;CfipDH;AelpDC;EACE,0BAAA;CfopDH;AerpDC;EACE,yBAAA;CfupDH;AexpDC;EACE,gBAAA;Cf0pDH;Aa1pDD;EElCI;IACE,YAAA;Gf+rDH;EexrDD;IACE,YAAA;Gf0rDD;Ee3rDD;IACE,oBAAA;Gf6rDD;Ee9rDD;IACE,oBAAA;GfgsDD;EejsDD;IACE,WAAA;GfmsDD;EepsDD;IACE,oBAAA;GfssDD;EevsDD;IACE,oBAAA;GfysDD;Ee1sDD;IACE,WAAA;Gf4sDD;Ee7sDD;IACE,oBAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,WAAA;GfqtDD;EettDD;IACE,oBAAA;GfwtDD;EeztDD;IACE,mBAAA;Gf2tDD;Ee7sDD;IACE,YAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,oBAAA;GfqtDD;EettDD;IACE,WAAA;GfwtDD;EeztDD;IACE,oBAAA;Gf2tDD;Ee5tDD;IACE,oBAAA;Gf8tDD;Ee/tDD;IACE,WAAA;GfiuDD;EeluDD;IACE,oBAAA;GfouDD;EeruDD;IACE,oBAAA;GfuuDD;EexuDD;IACE,WAAA;Gf0uDD;Ee3uDD;IACE,oBAAA;Gf6uDD;Ee9uDD;IACE,mBAAA;GfgvDD;Ee5uDD;IACE,YAAA;Gf8uDD;Ee9vDD;IACE,WAAA;GfgwDD;EejwDD;IACE,mBAAA;GfmwDD;EepwDD;IACE,mBAAA;GfswDD;EevwDD;IACE,UAAA;GfywDD;Ee1wDD;IACE,mBAAA;Gf4wDD;Ee7wDD;IACE,mBAAA;Gf+wDD;EehxDD;IACE,UAAA;GfkxDD;EenxDD;IACE,mBAAA;GfqxDD;EetxDD;IACE,mBAAA;GfwxDD;EezxDD;IACE,UAAA;Gf2xDD;Ee5xDD;IACE,mBAAA;Gf8xDD;Ee/xDD;IACE,kBAAA;GfiyDD;Ee7xDD;IACE,WAAA;Gf+xDD;EejxDD;IACE,kBAAA;GfmxDD;EepxDD;IACE,0BAAA;GfsxDD;EevxDD;IACE,0BAAA;GfyxDD;Ee1xDD;IACE,iBAAA;Gf4xDD;Ee7xDD;IACE,0BAAA;Gf+xDD;EehyDD;IACE,0BAAA;GfkyDD;EenyDD;IACE,iBAAA;GfqyDD;EetyDD;IACE,0BAAA;GfwyDD;EezyDD;IACE,0BAAA;Gf2yDD;Ee5yDD;IACE,iBAAA;Gf8yDD;Ee/yDD;IACE,0BAAA;GfizDD;EelzDD;IACE,yBAAA;GfozDD;EerzDD;IACE,gBAAA;GfuzDD;CACF;Aa/yDD;EE3CI;IACE,YAAA;Gf61DH;Eet1DD;IACE,YAAA;Gfw1DD;Eez1DD;IACE,oBAAA;Gf21DD;Ee51DD;IACE,oBAAA;Gf81DD;Ee/1DD;IACE,WAAA;Gfi2DD;Eel2DD;IACE,oBAAA;Gfo2DD;Eer2DD;IACE,oBAAA;Gfu2DD;Eex2DD;IACE,WAAA;Gf02DD;Ee32DD;IACE,oBAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,WAAA;Gfm3DD;Eep3DD;IACE,oBAAA;Gfs3DD;Eev3DD;IACE,mBAAA;Gfy3DD;Ee32DD;IACE,YAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,oBAAA;Gfm3DD;Eep3DD;IACE,WAAA;Gfs3DD;Eev3DD;IACE,oBAAA;Gfy3DD;Ee13DD;IACE,oBAAA;Gf43DD;Ee73DD;IACE,WAAA;Gf+3DD;Eeh4DD;IACE,oBAAA;Gfk4DD;Een4DD;IACE,oBAAA;Gfq4DD;Eet4DD;IACE,WAAA;Gfw4DD;Eez4DD;IACE,oBAAA;Gf24DD;Ee54DD;IACE,mBAAA;Gf84DD;Ee14DD;IACE,YAAA;Gf44DD;Ee55DD;IACE,WAAA;Gf85DD;Ee/5DD;IACE,mBAAA;Gfi6DD;Eel6DD;IACE,mBAAA;Gfo6DD;Eer6DD;IACE,UAAA;Gfu6DD;Eex6DD;IACE,mBAAA;Gf06DD;Ee36DD;IACE,mBAAA;Gf66DD;Ee96DD;IACE,UAAA;Gfg7DD;Eej7DD;IACE,mBAAA;Gfm7DD;Eep7DD;IACE,mBAAA;Gfs7DD;Eev7DD;IACE,UAAA;Gfy7DD;Ee17DD;IACE,mBAAA;Gf47DD;Ee77DD;IACE,kBAAA;Gf+7DD;Ee37DD;IACE,WAAA;Gf67DD;Ee/6DD;IACE,kBAAA;Gfi7DD;Eel7DD;IACE,0BAAA;Gfo7DD;Eer7DD;IACE,0BAAA;Gfu7DD;Eex7DD;IACE,iBAAA;Gf07DD;Ee37DD;IACE,0BAAA;Gf67DD;Ee97DD;IACE,0BAAA;Gfg8DD;Eej8DD;IACE,iBAAA;Gfm8DD;Eep8DD;IACE,0BAAA;Gfs8DD;Eev8DD;IACE,0BAAA;Gfy8DD;Ee18DD;IACE,iBAAA;Gf48DD;Ee78DD;IACE,0BAAA;Gf+8DD;Eeh9DD;IACE,yBAAA;Gfk9DD;Een9DD;IACE,gBAAA;Gfq9DD;CACF;Aa18DD;EE9CI;IACE,YAAA;Gf2/DH;Eep/DD;IACE,YAAA;Gfs/DD;Eev/DD;IACE,oBAAA;Gfy/DD;Ee1/DD;IACE,oBAAA;Gf4/DD;Ee7/DD;IACE,WAAA;Gf+/DD;EehgED;IACE,oBAAA;GfkgED;EengED;IACE,oBAAA;GfqgED;EetgED;IACE,WAAA;GfwgED;EezgED;IACE,oBAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,WAAA;GfihED;EelhED;IACE,oBAAA;GfohED;EerhED;IACE,mBAAA;GfuhED;EezgED;IACE,YAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,oBAAA;GfihED;EelhED;IACE,WAAA;GfohED;EerhED;IACE,oBAAA;GfuhED;EexhED;IACE,oBAAA;Gf0hED;Ee3hED;IACE,WAAA;Gf6hED;Ee9hED;IACE,oBAAA;GfgiED;EejiED;IACE,oBAAA;GfmiED;EepiED;IACE,WAAA;GfsiED;EeviED;IACE,oBAAA;GfyiED;Ee1iED;IACE,mBAAA;Gf4iED;EexiED;IACE,YAAA;Gf0iED;Ee1jED;IACE,WAAA;Gf4jED;Ee7jED;IACE,mBAAA;Gf+jED;EehkED;IACE,mBAAA;GfkkED;EenkED;IACE,UAAA;GfqkED;EetkED;IACE,mBAAA;GfwkED;EezkED;IACE,mBAAA;Gf2kED;Ee5kED;IACE,UAAA;Gf8kED;Ee/kED;IACE,mBAAA;GfilED;EellED;IACE,mBAAA;GfolED;EerlED;IACE,UAAA;GfulED;EexlED;IACE,mBAAA;Gf0lED;Ee3lED;IACE,kBAAA;Gf6lED;EezlED;IACE,WAAA;Gf2lED;Ee7kED;IACE,kBAAA;Gf+kED;EehlED;IACE,0BAAA;GfklED;EenlED;IACE,0BAAA;GfqlED;EetlED;IACE,iBAAA;GfwlED;EezlED;IACE,0BAAA;Gf2lED;Ee5lED;IACE,0BAAA;Gf8lED;Ee/lED;IACE,iBAAA;GfimED;EelmED;IACE,0BAAA;GfomED;EermED;IACE,0BAAA;GfumED;EexmED;IACE,iBAAA;Gf0mED;Ee3mED;IACE,0BAAA;Gf6mED;Ee9mED;IACE,yBAAA;GfgnED;EejnED;IACE,gBAAA;GfmnED;CACF;AgBvrED;EACE,8BAAA;ChByrED;AgBvrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChByrED;AgBvrED;EACE,iBAAA;ChByrED;AgBnrED;EACE,YAAA;EACA,gBA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","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on